понедельник, 12 марта 2012 г.

Анализ / Краткий тест-драйв AlternativaGUI

Три месяца назад AlternativaPlatform зарелизила AlternativaGUI, с тех пор вышло много обновлений, судя по всему проект активно развивается. В блоге утверждается, что AlternativaGUI - это простой способ создать комплексный интерфейс. Памятуя это, решил использовать библиотеку в своем следующем проекте для прототипирования GUI.

Требовался достаточно стандартный набор компонент: кнопки, поля редактирования текста, область со скрол-барами, деревом с нодами и панель с таб-баром. И конечно хотелось иметь гибкий интерфейс с Resize-ом контента.

Исходя из примера, AlternativaGUI обладала всем необходимым. И даже большим.


Примечание

Все, что написал далее, протестировал на AlternativaGUI 5.20.0.

Однако проблемы начались почти сразу же


Layout Manager, а именно его DefaultLayoutManager - работает с компонентами, либо как с DispalyObject - width, height, либо как с GUIObject, используя метод resize(). Почему не воспользоваться для этого интерфейсом и тем самым уменьшить зависимость от остальных классов, не ясно (wiki). Поэтому, если надо будет работать со сторонними компонентами, почти наверняка придется переписывать LayoutManager под использование интерфейса. Также нет возможности задать min, max, optimal размеры компонент. Как в том же MigLayout-е.

Есть еще много других багов и недочетов.

Вот некоторые из них

TabPanel


Если добавить на сцену alternativa.gui.container.tabPanel.TabPanel без табов, вылетит внутренняя ошибка.

В TabPanel нельзя получить информацию о добавленных TabData, или удалить их (форум).

LayoutManager

Если назначить
LayoutManager.minStageHeight = 1;
LayoutManager.minStageWidth = 1;
перед
LayoutManager.init(stage, [objectContainer, hintContainer])
то сцена реагирует только после ресайза.

Если добавить объект реализующий IStageSizeListener в objectContainer раньше LayoutManager.init(stage, [objectContainer, hintContainer]) , он не подхватится LayoutManager-ом.

Поэтому для срабатывания нужно передернуть все добавленные объекты:

//layout hack
objectContainer.removeChild(uiObject);
objectContainer.addChild(uiObject);

Вообще, изменение последовательности всевозможных инициализаций часто приводит к плачевному результату. Программа вылетает с ошибкой.

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".

ScrollPanel

ScrollPanel обладает только одним вертикальным ScrollBar-ом. Если же хочется использовать еще горизонтальный, придется использовать ScrollArea, но этот компонент в отличии от ScrollPane не занимается размещением подвластных ScrollBar-ов, т.е. по сути, придется писать свое расширение компоненте ScrollArea с аранжировкой ScrollBar-ов внутри (форум).

GUI

Невозможно создать рабочий GUI без hintContainer. Опять же - ошибка #1009.

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

и т.д.

Итог

Конечно, не все так плохо и есть положительные моменты - лодирование интерфейса, богатый набор всевозможных компонент, наличие лайаутов. Да и на форуме разработчиков всегда можно получить ответ на вопросы.

Лодирование (LOD). (*) Взято из вики AlternativaPlatform.

Но к сожалению, библиотека еще очень сырая, и использовать ее не в учебных целях (!), чревато потерей большого времени на латание недочетов GUI, или расширении базовой функциональности даже для ординарных компонент.

Если все таки решитесь использовать библиотеку в вашем проекте, настоятельно рекомендую ознакомиться с wiki документацией и почитать, что пишут на форуме, потому что ASDoc крайне скуп и его точно не хватит для создания хоть сколько-нибудь стоящего интерфейса.

PS

Создал на Github проект AlternativaGUI Extension с необходимыми улучшениями для TabPanel:
https://github.com/Hyzhak/AlternativaGUI-Extension



В расширении добавляются методы, удаления Tab-ов (removeTabAt, removeTabData, removeTabByContent), получения Tab-ов из панели (get numTabs() : intgetTabContentAt(index : int) : DisplayObject, getTabDataAt(index : int) : TabData и др.), а также изменения подписи Tab-а.

К сожалению, в компоненте есть визуальные проблемы с размером фона и панели для кнопок, - их пока не успел пофиксил.

Комментариев нет:

Отправить комментарий

Press Any Key...