Вход:  Пароль:  
FreeSource: AltLinux/Sisyphus/Alterator/evolution ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |
Это старая версия AltLinux/Sisyphus/Alterator/evolution за 2006-06-02 16:38:19..

Простейший язык описания интерфейсов

(всё описанное касается alterator версии 2.9 и старше)


Документ – основной кирпичик в построении интерфейса. Каждый документ есть виджет, и наоборот, каждый виджет есть некоторый документ. Простейшие документы представляют простейшие виджеты, например, кнопку, метку и так далее. Документы сложнее, композиция простейших, представляет комплексные виджеты – самостоятельные части диалога с пользователем. Кроме того каждый документ можно рассматривать ещё как некоторую программу на простом подмножестве языка программирования Scheme. Ну обо всём по порядку.

1. Документ как файл


Документ прежде всего текстовый файл, размещающийся где-то на файловой системе.
Документы адресуются любым распространённым способом: через указание полного пути, через URI по правилам RFC-3986, через URI по правилам alterator.

2. Документ как программа


Во вторую, как не странно, очередь документ это программа на подмножестве языка программирования Scheme.
Прежде чем мы увидим графическое воплощение документа, он загружается и исполняется интерпретатором.
Как в каждом языке программирования, часть документа можно скрывать от интерпретатора – делать комментарии.
Остаток строки после символа “;" интерпретатором не рассматривается. В дальнейшем изложении мы будем пользоваться комментарием для добавления пояснений в текст примеров.


C этой точки зрения документ представлен как множество вложенных друг в друга окружений. Каждое окружение не что иное как область видимости локальных переменных. Окружения отдельных документов не пересекаются и соответственно вы не можете использовать в одном документе вспомогательные функции, определённые в другом документе.


Для удобства управления окружениями предоставлено несколько базовых конструкций:
1. (document:insert <идентификатор>)
В результате происходит вставка «окружения» внутрь существующего, <идентификатор> – это идентификатор документа как файла, определённый одним из перечисленных выше способов.


Пример:


2. (document:envelop keyword), (document:end-envelop keyword) – для создания вложенного окружения вовсе не обязательно создавать отдельные файлы, достаточно окружить его инструкциями document:envelop и document:end-envelop.
Последняя конструкция не обязательна если вы хотите распространить вложенное окружение до конца файла.


Пример:



3. (document:surround <идентификатор>) – иногда бывает полезно добавить не вложенное окружение, а наоборот, охватить данный документ каким-то окружением из другого файла.


Пример:


О том какие бывают окружения мы познакомимся в следующем разделе

3. Документ как виджет


У любого виджета есть аттрибуты: текст у кнопки, длина у списка.
Чтобы с аттрибутами можно было работать – их надо создать. Для этого существует стандартное окружение with-attributes.
В качестве дополнительных параметров в инструкцию document:envelop передаётся список имён аттрибутов, которые мы хотим определить.


Пример:


Информация об этих аттрибутах сообщается графическому представлению виджета после того как он будет создан, то есть это есть не что иное как рычаги управления графическим представлением виджета.


Однако некоторые параметры надо знать прямо при создании представления, как минимум надо знать тип создаваемого представления (кнопка или список), а также родительский виджет, в который нужно вставить данный.


Поэтому существует особая разновидность аттрибутов – аттрибуты инициализации, которые создаются в окружении
with-init-attributes.


Пример:


В alterator существует заранеее подготовленный документ со списком распространённых аттрибутов – /std/attributes, который можно включать в качестве охватывающего окружения.


Пример:


После того как аттрибуты созданы, их можно задавать. Принцип простой:
«имя значение» или "(имя значение значение)"


Пример:


На самом деле во втором случае скобки можно опустить ибо аттрибут layout-policy знает, что ему требуется обязательно не одно, а два значения, аттрибуту сообщается количество обязательных аргументов прямо при его создании.
Вместо простого указания имени, имя и количество параметров заключаются в круглые скобки



Поэтому предыдущий пример можно переписать следующим образом



Вообще общее правило такое, скобки вокруг аттрибутов стоит употреблять только для повышения читаемости или для передачи аргументов в количестве большем чем обязательное:



Примитивным виджетам – примитивные документы. Так для того чтобы создать кнопку – достаточно документа, в котором будет указан её тип:


Аналогично и для списков, меню, и прочих компонент стандартного конструктора GUI.


А как же из готовых примитивов строить сложные виджеты? Переходим на следующий уровень игры:

4. Документ как контейнер


Каждый виджет ни что иное как контейнер свойств: аттрибутов, callback'ов и других вложенных виджетов.
Каждый контейнер имеет минимум два предопределённых аттрибута: тип ( со значением по-умолчанию “root”) и указатель на родительский контейнер. Те самые type и parent.


Чтобы отличать вложенные окружения от полноценных виджетов, которые вставляются в данный существует особая конструкция – (document:subdocument <идентификатор>).


Пример:


Если мы хотим удобно использовать какой-либо документ, его стоит оформить как контейнер.
Делается это при помощи окружения with-container-presentations.
В качестве параметров перечисляются:
1. Имя контейнера, которым будем в дальнейшем пользоваться
2. Идентификатор документа, в котором содержится описание контейнера.
3. Аттрибуты по-умолчанию.


Первый параметр – имя функции на языке scheme, которая будет обеспечивать удобную работу с виджетом, а третий – небольшое упрощение жизни. Например, кнопка всегда создаётся с каким-то текстом, поэтому гораздо удобнее писать
(button “some-name”) вместо (button text “some-name”)


Пример:

В результате получаем документ заданной ширины и высоты с вставленными в него кнопкой и меткой.
Существует документ с предопределёнными традиционными аттрибутами и контейнерами – «/std/base». Поэтому предыдущий пример сокращается до:



 
Файлов нет. [Показать файлы/форму]
Один комментарий. [Показать комментарии/форму]