view README.ru @ 97:72821bd32e2e

Avoid reflection.
author Mikhail Kryshen <mikhail@kryshen.net>
date Thu, 03 Mar 2011 03:34:55 +0300
parents 1ca7872b889b
children f42e2b9e1ad9
line source
1 Indyvon — многопоточная библиотека графического интерфейса
2 пользователя, написанная на языке Clojure.
4 Особенности:
5 - базовый элемент интерфейса (сцены) не имеет состояния;
6 - параллельная отрисовка;
7 - нет статической сцены: расположение элементов фиксируется для
8 обработки событий при каждой перерисовке и используется до
9 завершения отрисовки следующего кадра;
10 - преобразования элементов с помощью AffineTransform;
11 - произвольная область отсечения (форма элементов), которая
12 учитывается при обработке событий.
14 Базовый элемент пользовательского интерфейса описан протоколом Layer
15 (слой), который содержит всего две функции:
17 render! — отрисовка,
18 layer-size — получение предпочтительного размера элемента.
20 Слой, в отличии от обычных компонентов интерфейса или элементов графов
21 сцены в системах визуализации, не имеет состояния (координаты, размер,
22 элемент-родитель, дочерние элементы) и может быть изображен по-разному
23 на каждой итерации цикла отрисовки.
25 Функции слоя выполняются в контексте слоя (layer context), который
26 представлен набором связанных переменных, в том числе:
28 *graphics* — экземпляр java.awt.Graphics2D для рисования,
29 *width* и *height* — размеры области рисования,
30 *clip* — область отсечения (произвольная, java.awt.geom.Shape),
31 *event-dispatcher* — диспетчер событий.
33 Во время отрисовки можно устанавливать обработчики событий ввода
34 (сейчас поддерживаются только события мыши) для текущего
35 контекста. При установке обработчика контекст сохраняется для
36 обработки событий до завершения следующей перерисовки сцены.
38 Слои могут инициировать перерисовку с помощью механизма
39 уведомлений. Обработчики уведомлений, как и обработчики событий,
40 устанавливаются на время до следующей перерисовки.
42 Таким образом, получать события ввода и вызывать перерисовку могут
43 только те слои, которые в данный момент видны на экране, т. е.
44 участвовали в последней перерисовке.
46 Сцена может строиться во время выполнения отрисовки (как в IMGUI:
47 "сейчас нарисовать здесь кнопку") или описываться путем композиции
48 слоев (предполагая, что реализованы функции border, vbox, label и
49 button, которые создают слои):
51 (border
52 (hbox
53 (label "Comment:")
54 (button (label "Button"))))
56 Отрисовку можно распараллелить с помощью функции async-layer, которая
57 возвращает слой, показывающий результат отрисовки слоя-аргумента. При
58 этом отрисовка слоя-аргумента выполняется в параллельной нити в буфер
59 в памяти. Для избежания блокировок используется тройная
60 буферизация. Слои, помещенные в async-layer, не будут ограничивать
61 частоту кадров и могут обновляться медленнее, чем основная сцена.