Я тут подумал над wizardface ...
Всё-таки это всё вполне реально сделать в виде хинтов.
Пусть у нас есть некий абстратный модуль для инсталлятора.
Он по идее знает только что будет вставлен в некую рамку, где будет полоса
для кнопок, а также возможно полоса для вывода собственного title.
Сейчас это всё в alterator реализуется с помощью инфраструктуры frame:*, но
желающие особой неземной красоты могут увидеть это же и в особом виджете
созданном для нас браузером.
Для этого ему надо просто подсказать что делать с теми или иными
элементами.
Например, основное тело должно быть помещено вовнутрь, а две данные кнопки
должны "отразиться" на красочные ,возможно разбросанные по разным углам,
"Forward" и "Backward".
-------------
; с помощью atlas /std/frame может быть отражено на специализированную версию
для wizardface
(document:surround "/std/frame")
;тем самым отмечаем, что хотим видеть всё вставленным в wizardface
;для облегчения жизни браузера кидаем хинт сразу на уровень диалога.
(document:popup-options visuzal-hint "wizardface:body")
;некоторое содержимое которое попадёт внутрь рамки
(label "inside module")
;стандартная "заглушка для инфрастурутуры frame, в данном случае может
быть тождственным отображением"
(frame:buttons-view
(document:id zzz (button "Prev" vizual-hint "wizardface:forward"
(on-click ... какие-нибудь действия ...
(document:id kkk (button "Next" vizual-hint "wizardface:backward"
(on-click ... какие-нибудь действия ...
...))))
-----------------
Как будет действовать браузер интерфейса в красочном случае.
виджет, в данном случае после первичной обработки будет выглядеть примерно так:
--
(dialog
vizual-hint
(vbox
(label ...
(button vizual-hint ...
))
--
Он начинает последовательно принимать команды на создание виджетов и
задание их аттрибутов.
С начала он действует как обычно, но вот он ,достаточно быстро, обнаружил
что dialog (с идентификатором скажем w0) на самом деле является телом
wizard-face, стало быть надо пересмотреть взгляд на жизнь, убрать его,
запустить заготовку wizard-face и её вместилище для модуля назвать точно
также как назывался dialog (то есть w0)
Поехали дальше ... все остальные виджеты вставляются в dialog (который уже стал
wizardface) и автоматом
попадают куда надо. Доехали до кнопок ... обнаружив, что очередной элемент
на самом деле является кнопкой forward, мозг браузера изымаем оною из
расмотрения, запоминая её внутренний идентификатор (пусть это был w5).
Аналогично можно действовать и с остальными компонентами wizardface,
обнаруживая их через хинты и перемещая туда куда требуется.
После того как поступает команда на запуск диалога, наш супер-красивый
wizard стартует.
Когда пользователь работает с внутренними виджетами в рамке, вся обработка
происходит штатным образом. Но вот он нажал на forward, wizard
обнаруживает оный факт, отмечает, что надо на самом деле изобразить как
будто бы щёлкнула кнопка w5 и отсылает соотв. команду.
-----
Чем мне нравится эта схема. Тем что она будет работать при любых браузерах
интерфейса, как с доп. мозгом, так и без оного, в красивых и не красивых.
Кроме того она при желании без лишних обёрток будет работать как в режиме
чистого wizard, так и в режиме acc. Идею хинтов можно распространить и на
другие варианты face, например можно таким образом модифицировать
системное меню браузера и так далее ...
Какие тут грабли? В общем-то основной код не очень сложный, алгоритм как
действовать приведён полностью, но важно не забывать
работать так, чтобы избежать изменения parent виджетов - некоторые системы
это могут не позволять. Приведённый выше алгоритм не делает никаких
reparent - а просто вместо одних виждетов делает подстановки на другие.
Так стоит действовать и дальше.
--
Стас.
_______________________________________________
Devel-conf mailing list
[email protected]
https://lists.altlinux.org/mailman/listinfo/devel-conf