Процесс создания собственных декларативных GTK+ виджетов
Процесс создания собственных декларативных виджетов в библиотеке gi-gtk-declarative
не так уж и сложен. Его можно
разбить на следующие шаги:
- Измышление механики будущего виджета, понимание нижележащих GTK-виджетов, его составляющих
- Описание типа меняемых пользователем параметров (properties) виджета - для установления чистой функциональной зависимости от структуры пользователя.
- Описание типа всех событий (events), которые будет генерировать виджет (например, в ответ на срабатывания сигналов внутренних GTK-виджетов или достижения определённых состояний автомата логики)
- Описание внутреннего стэйта нашего виджета (например, поддерживание набора составляющих низкоуровневых GTK-виджетов для доступа к их состояниям)
- Создание пяти функций, необходимых для конструирования значения типа
CustomWidget widget customData event
(что в свою очередь даст нам искомыйWidget event
):
data CustomWidget widget customData event =
CustomWidget
{ customWidget :: Gtk.ManagedPtr widget -> widget
, customCreate :: customData -> IO SomeState
, customPatch :: SomeState -> customData -> customData -> CustomPatch widget customData
, customSubscribe :: customData -> widget -> (event -> IO ()) -> IO Subscription
, customData :: customData
} deriving (Functor)
i. customWidget
содержит конструктор настоящего top-level GTK-виджета нашего виджета
ii. customCreate
описывает процесс изначального создания виджета: создание всех составляющих GTK-виджетов,
помещения в GTK-контейнеры и т.д. GTK StyleContext и начальный внутренний стэйт также задаются как результат
этой функции.
iii. customPatch
вычисляет низкоуровневый патч к GTK+ из новых (данных сейчас) параметров и текущих
(уже отрисованных) параметров и внутреннего стэйта виджета
iv. customSubscribe
создаёт подписку на события (events) нашего виджета (т.е. описывает то, каким образом и на
каком основании виджет генерит свои события)
v. customData
всегда содержит текущие параметры виджета
- Создание функции из параметров нашего виджета в тип
Widget widget
, которая собственно и будет применяться пользователем для встраивания декларативного виджета в другие виджеты. Это и есть чистая функциональная (декларативная) зависимость виджета от структуры данных – смысл библиотекиgi-gtk-declarative
. Уравнение данной функции тривиально, когда мы имеем всё вышеперечисленное в пунктах 1-4. - Создание константы с готовыми параметрами виджета по-умолчанию (для удобства использования).
Такова теория. Насколько я успел познакомиться с библиотекой.