Alterator/form

Материал из ALT Linux Wiki

(Различия между версиями)
Перейти к: навигация, поиск
(Модуль (alterator lookout form))
(Модуль (alterator lookout form))
Строка 1: Строка 1:
== Модуль (alterator lookout form) ==
== Модуль (alterator lookout form) ==
 +
'''Адресация виджетов по атрибуту name. Автоматическое заполнение диалога из бакенда и отправка значений в бакенд.'''
 +
В этом модуле сделана попытка упростить работу со стандартными диалогами, практически убрав необходимость адресовать виджеты с помощью document:id.
В этом модуле сделана попытка упростить работу со стандартными диалогами, практически убрав необходимость адресовать виджеты с помощью document:id.
-
Описание относится к '''alterator-lookout-1.3-alt9'''. Интерфейс библиотеки, вероятно, еще не застабилизировался, поэтому массово применять ее пока не рекомендуется.
+
Кроме того, этот модуль используется при работе с эффектами в модуле ((Alterator/lookout/effects (alterator loоkout effects) )).
-
Пусть интересующие нас поля ввода (и подписи к ним) имеют атрибуты "name", значение которых совпадает с названиями соответствующих параметров при общении с бакендом. В этом случае можно использовать следующие функции:
+
Описание относится к '''alterator-lookout-1.4-alt3'''. Интерфейс библиотеки, вероятно, еще не застабилизировался, поэтому массово применять ее пока не рекомендуется.
-
* '''(form-get-elements-by-name name)''' -- получить список виджетов с указанным именем.
+
...
-
* '''(form-get-label-by-name name)''' -- получить первый виджет типа "label" с указанным именем.
+
-
* '''(form-read-names names url . args)''' -- прочитать из бакенда (action read) указанные параметры и заполнить соответствующие поля
+
-
* '''(form-write-names names url . args)''' -- отправить в бакенд (action write) значения полей с указанными именами
+
-
* '''(form-read url . args)''' -- прочитать данные из бакенда (action read) и заполнть все соответствующие поля
+
-
* '''(form-write url . args)''' -- отправить в бакенд (action write) значения всех полей
+
-
* '''(form-get-value name)''' -- получить значение поля с именем name
+
-
* '''(form-set-value! name val)''' -- записать значение в поле с именем name
+
-
* '''(form-apply name . args)''' -- применить args ко всем элементам с именем name и вернуть список результатов.  
+
-
Работа с формами происходит в рамках определенного документа (document:root для /std/base).
+
Пусть в диалоге поля ввода имеют атрибуты "name", значение которых совпадает с названиями соответствующих параметров при общении с бакендом. Также, эти имена могут иметь подписи к этим полям ввода (важно для работы с эффетами и для вывода сообщений об ошибках при несоответствии типов)
-
* '''(form-get-document)''' -- возвращает этот документ
+
-
* '''(form-set-document! d)''' -- переопределяет документ
+
-
Вряд ли нужно использовать эти функции в интерфейсах.
+
-
Кроме того, в /std/base определены обертки, перехватывающие исключения при общении с бакендом и выводящие окно предупреждения:
+
"Поля ввода" -- это виджеты одного из типов (checkbox edit listbox spinbox slider timeedit dateedit combobox listbox textbox radiolistbox multilistbox checklistbox), значения которых мы хотим получать из бакенда и передавать обратно.
 +
 
 +
"Подписи" -- это виджеты типа label.
 +
 
 +
В этом случае можно использовать следующие функции:
 +
 
 +
'''Работа с виджетами'''
 +
 
 +
* '''(form-get-elements-by-name document name)''' -- получить список виджетов с указанным именем
 +
* '''(form-element-apply document name . args)''' -- применить args ко всем виджетам с именем name и вернуть список результатов
 +
 
 +
* '''(form-get-label document name) -- получить первый виджет типа "label" с указанным именем
 +
* '''(form-get-input document name) -- получить поле ввода с указанным именем. Функция вываливается с исключением form-error, если таких полей больше одного.
 +
 
 +
* '''(form-input-get-value document name)''' -- получить значение поля с именем name
 +
* '''(form-input-set-value! document name val)''' -- записать значение в поле с именем name
 +
 
 +
'''Работа с бакендом:'''
 +
 
 +
* '''(form-read document url . args)'''  -- прочитать данные из бакенда (action read) и заполнть все соответствующие поля
 +
* '''(form-write document url . args)''' -- отправить в бакенд (action write) значения всех полей
 +
* '''(form-read-names document names url . args)''' -- прочитать из бакенда (action read) указанные параметры и заполнить соответствующие поля
 +
* '''(form-write-names document names url . args)''' -- отправить в бакенд (action write) значения полей с указанными именами
 +
 
 +
Здесь document - документ в рамках которого происходит поиск виджетов. url и args -- аргументы для общения с бакендом...
 +
 
 +
Кроме того, в /std/base определены обертки, устанавливающие document в document:root, а также выводящие окно предупреждения при ошибках в общении с бакендом:
* '''(form-read/message url . args)'''
* '''(form-read/message url . args)'''
Строка 28: Строка 45:
* '''(form-read-names/message names url . args)'''
* '''(form-read-names/message names url . args)'''
* '''(form-write-names/message names url . args)'''
* '''(form-write-names/message names url . args)'''
-
 
-
В процедурах form-read/write параметр names -- список строк, параметры args -- дополнительные аргументы, которые передаются в бакенд.
 
-
 
-
То есть, можно писать, например, так:
 
-
 
-
* '''(form-read "/url")''' -- Чтение информации из бакенда, заполнение всех элементов формы
 
-
* '''(form-read "/url" 'par1 "val1")''' -- то же, но бакенду передается параметр par1=val1
 
-
* '''(form-read-names '("name1" "name2" "name3") "/url")'''
 
-
* '''(form-read-names '("name1" "name2" "name3") "/url" 'par1 "val1")''' -- то же, но заполняются только указанные поля
 
===Пример использования===
===Пример использования===
Строка 108: Строка 116:
</pre>
</pre>
-
=== Неочевидное ===
+
=== Неочевидное + TODO ===
-
 
+
-
* Виджеты интерфейса делятся на интерактивные и неинтерактивные. Удобно (например, для использования эффектов) давать одинаковые имена интерактивному виджету и соответствующему виджету-подписи. Функции '''form-read''', '''form-write''', '''form-read-names''', '''form-write-names''', '''form-get-value''', '''form-set-value!''' работают только с интерактивными виджетами. Функции '''form-get-elements-by-name''', '''form-get-label-by-name''', '''form-apply''' работают со всеми виджетами.
+
* Если хочется заполянить параметр неинтерактивного виджета (например, label) из бакенда - можно, например, сделать скрытый виджет типа edit, заполнять его, а затем вручную переносить значение:  
* Если хочется заполянить параметр неинтерактивного виджета (например, label) из бакенда - можно, например, сделать скрытый виджет типа edit, заполнять его, а затем вручную переносить значение:  
Строка 122: Строка 128:
</pre>
</pre>
-
===TODO===
+
TODO: сделать специальный алиас для label, который бы при общении с бакендом трактовался как поле ввода...
-
 
+
-
* Включить в модуль и в это описание работу с эффектами?
+
-
* Вместо (или дополнительно к) form-apply дать более высокоуровневые функции для работы с аргументами виджетов
+

Версия 12:07, 12 ноября 2008

Модуль (alterator lookout form)

Адресация виджетов по атрибуту name. Автоматическое заполнение диалога из бакенда и отправка значений в бакенд.

В этом модуле сделана попытка упростить работу со стандартными диалогами, практически убрав необходимость адресовать виджеты с помощью document:id.

Кроме того, этот модуль используется при работе с эффектами в модуле ((Alterator/lookout/effects (alterator loоkout effects) )).

Описание относится к alterator-lookout-1.4-alt3. Интерфейс библиотеки, вероятно, еще не застабилизировался, поэтому массово применять ее пока не рекомендуется.

...

Пусть в диалоге поля ввода имеют атрибуты "name", значение которых совпадает с названиями соответствующих параметров при общении с бакендом. Также, эти имена могут иметь подписи к этим полям ввода (важно для работы с эффетами и для вывода сообщений об ошибках при несоответствии типов)

"Поля ввода" -- это виджеты одного из типов (checkbox edit listbox spinbox slider timeedit dateedit combobox listbox textbox radiolistbox multilistbox checklistbox), значения которых мы хотим получать из бакенда и передавать обратно.

"Подписи" -- это виджеты типа label.

В этом случае можно использовать следующие функции:

Работа с виджетами

  • (form-get-elements-by-name document name) -- получить список виджетов с указанным именем
  • (form-element-apply document name . args) -- применить args ко всем виджетам с именем name и вернуть список результатов
  • (form-get-label document name) -- получить первый виджет типа "label" с указанным именем
  • (form-get-input document name) -- получить поле ввода с указанным именем. Функция вываливается с исключением form-error, если таких полей больше одного.
  • (form-input-get-value document name) -- получить значение поля с именем name
  • (form-input-set-value! document name val) -- записать значение в поле с именем name

Работа с бакендом:

  • (form-read document url . args) -- прочитать данные из бакенда (action read) и заполнть все соответствующие поля
  • (form-write document url . args) -- отправить в бакенд (action write) значения всех полей
  • (form-read-names document names url . args) -- прочитать из бакенда (action read) указанные параметры и заполнить соответствующие поля
  • (form-write-names document names url . args) -- отправить в бакенд (action write) значения полей с указанными именами

Здесь document - документ в рамках которого происходит поиск виджетов. url и args -- аргументы для общения с бакендом...

Кроме того, в /std/base определены обертки, устанавливающие document в document:root, а также выводящие окно предупреждения при ошибках в общении с бакендом:

  • (form-read/message url . args)
  • (form-write/message url . args)
  • (form-read-names/message names url . args)
  • (form-write-names/message names url . args)

Пример использования

Было:

(document:surround "/std/base")
 
(define (write-to-backend) 
  (catch/message (lambda() 
    (woo-write "/test" 
      'par1 (mypar1-id value) 
      'par2 (mypar2-id value) 
      'par3 (mypar3-id value) 
      'par4 (mypar4-id value) )))) 
 
(define (read-from-backend) 
  (catch/message (lambda() 
    (let ((data (woo-read-first "/test"))) 
      (mypar1-id value (woo-get-option data 'par1)) 
      (mypar2-id value (woo-get-option data 'par2)) 
      (mypar3-id value (woo-get-option data 'par3)) 
      (mypar4-id value (woo-get-option data 'par4)) )))) 

(gridbox columns "0;100"
  (spacer)
  (document:id mypar1-id (checkbox text (_ "my parameter - 1")))

  (label text (_ "my parameter - 2:") align "right")
  (document:id mypar2-id (edit))

  (label text (_ "m.p. - 3:") align "right")
  (document:id mypar3-id (edit))

  (label text (_ "m.p. - 4:") align "right")
  (document:id mypar4-id (combobox enumref "/test/par4values"))

  (spacer)
  (gridbox columns "0;100"
    (button text (_ "Apply") (when clicked (write-to-backend)))
    (button text (_ "Reset") (when clicked (read-from-backend))) )
)

(document:root (when loaded (read-from-backend)))

Стало:

(document:surround "/std/base")

(gridbox columns "0;100"
  (spacer)
  (checkbox text (_ "my parameter - 1") name "par1"))

  (label text (_ "my parameter - 2:") align "right")
  (edit name "par2")

  (label text (_ "m.p. - 3:") align "right")
  (edit name "par3")

  (label text (_ "m.p. - 4:") align "right")
  (combobox enumref "/test/par4values" name "par4")

  (spacer)
  (gridbox columns "0;100"
    (button text (_ "Apply") (when clicked (form-write/message "/test")))
    (button text (_ "Reset") (when clicked (form-read/message "/test"))) )
)

(document:root (when loaded (read-from-backend)))

Неочевидное + TODO

  • Если хочется заполянить параметр неинтерактивного виджета (например, label) из бакенда - можно, например, сделать скрытый виджет типа edit, заполнять его, а затем вручную переносить значение:
(label name "lable-name")
(edit name "label"
...
(form-read "/url")
(form-apply "label-name" (form-get "label")

TODO: сделать специальный алиас для label, который бы при общении с бакендом трактовался как поле ввода...

 
Личные инструменты