Ещё одна gui-либа

Долгое время пытался найти простую GUI-либу для haXe, но:

  • "многословность" aswing отпугивает
  • баганутость haXe-версии minimalcomps и невозможность скинования исключает эту либу из списка(UPDATE: с "баганутая" сильно преувеличил)
  • haxeGUI - это вообще кощунство - писать динамически типизированный интерфейс на языке, имеющем богатые средства статической проверки типов. Глючит даже в демках, а как использовать по-человечи (а не только рисовать кнопочки с окошками) - не понятно
  • fcomponents - проект не развивается уже давно, хотя вроде бы может частично заменить minimalcomps, но API не понравился, не помню почему
  • arctic - это что-то с чем-то. Авторы считали своим долгом нарушить принцип "открытия/закрытия" где можно и нельзя. В итоге абсолютно не расширяемая либа с отмороженным API (ну она, собственно так и называется - arctic)

Вывод: надо сделать менее отмороженную, умеренную либу, с блекджеком и барышнями, и назвать ее temperate :)

Достоинства:

  • Если не требуется особое скинование - сел и поехал (никаких инициализаций, как в AsWing)
  • Если скинование требуется (или еще какие настроки) - рисуй скины в фотошопе, пиши скины для окон - пожалуйста, никто тебя не ограничивает, настраивай компоненты изменением свойств или перегрузкой методов если совсем что-то специфическое нужно
  • Работа с компонентами не сильно отличается от работы с обычными Sprite'ами. Никто не заставляет помещать их в спец контейнеры, чтобы они правильно работали, так же никто не заставляет использовать наследников от CSprite, где можно использовать обычный DisplayObject в самой либе
  • Удобная работа с всплывающими подсказками (с возможностью настраивать задержки, писать свои отображения и свои анимации отображения/скрытия)
  • Подсказка не требует от элемента, над которым надо показать подсказку, никаких реализаций интерфейса - надо над Sprite показать - будет над спрайтом показываться, над TextField - будет над TextField
  • Менеджер курсоров на стеке с приоритетом - позволяет не думать о том, что делают с курсором другие классы, когда занимаешься установкой курсора в конкретной подсистеме приложения.
    В то же время если ты привык менять одно глобальное поле cursor - пожалуйста, никто не мешает - в менеджере оно есть
  • CHBox и СVBox с растягиванием детей по процентам, с отступами на заданный интервал, с выравниванием и т.п.
  • Бонусом идет полностью затипизированный CSignal и проверка типов листенеров нативного EventDispatcher'а через макросы в виде EventDispatcherUtil

Недостатки:

  • нет никаких компонентов для работы со визуальными списками (ComboBox, Menu, скроллирующиеся List-ты, TileBox'ы и т.д.)
    Времени не было, поэтому не реализовано
  • оконная система всё-таки получилась отмороженной, но тем не менее вполне юзабельной и вроде как расширяемой

Установка:
haxelib install temperate

Исходники:
https://github.com/cser/temperate

Простой пример использования:

package ;

import flash.Lib;
import flash.display.Sprite;
import flash.events.MouseEvent;
import temperate.minimal.MButton;
import temperate.minimal.MTooltipFactory;
import temperate.minimal.windows.MAlert;

class Main extends Sprite
{
        public static function main():Void
        {
                Lib.current.addChild(new Main());
        }
       
        public function new()
        {
                super();
               
                var button = new MButton().setText("Show alert");
                button.x = 10;
                button.y = 10;
                button.addEventListener(MouseEvent.CLICK, onShowAlertClick);
                addChild(button);
               
                // Назначаем всплывающую подсказку кнопке
                MTooltipFactory.newText(button, "If you press it, alert will be shown");
        }
       
        private function onShowAlertClick(event:MouseEvent):Void
        {
                MAlert.show(true, "Alert!");
        }
}

Другие, более детальные примеры можно посмотреть здесь:
https://github.com/cser/temperate/tree/develop/examples
И здесь:
https://github.com/cser/temperate/tree/develop/manual-tests-src
Если ни там, ни там ничего нет или непонятно - пример должен быть в виде теста здесь:
https://github.com/cser/temperate/tree/develop/test/src/

Недавно завершил забег по граблям "заставить работать либу на nme".
Заставить, таки, заставил, по-крайней мере под windows работает.
Но желание пользоваться nme отпало напрочь (очень, очень много в нём косяков, а если не в нём, то в hxcpp)
Интересно, хоть кто-нибудь из форумчан смог хоть один боевой проект на нём сделать(не либу)?

Вобщем, буду признателен, если кто-нибудь попробует сие поделие и напишет про ощущения :)

UPDATE:
Картинки вставить не получается, поэтому скрины будут ссылками:
https://github.com/cser/temperate/blob/develop/examples/images/temperate...
https://github.com/cser/temperate/blob/develop/examples/images/temperate...
SWF примеры вперемешку с ручными тестами:
https://github.com/cser/temperate/tree/develop/examples/swf-examples

Вообще вся документация к проекту - это пара readme-файлов. Но любой класс из папки src (собственно либы) обязательно имеет если не ручной
(https://github.com/cser/temperate/tree/develop/manual-tests-src) то автоматический (https://github.com/cser/temperate/tree/develop/test/src/) тест, где можно посмотреть как оно должно работать.

Пару слов о скиновании

Маленький пример скинования кнопки лежит в https://github.com/cser/temperate/tree/develop/examples/button-skinning-...

А вообще - весь пакет temperate.minimal - это один большой пример по скинованию и настройке temperate
(только не надо как там - рисовать BitmapData-скины кодом - это сделано чисто чтобы пользователи никаких swf-ок в параметры компиляции не подписывали - подключил либу - начал работать)

Основные подходы к скинованию:

  • Если используется дефолтный temperate.minimal и не устраивают только цвета - обращаемся на старте приложения к классам в temperate.minimal.graphics и меняем их публичные статические поля, подбирая цвет.
    А в классу MFormatFactory обращаемся, чтобы поменять параметры шрифтов.
  • Если нужно большее, рисуем скины в растре

    Весь пакет temperate.minimal построен на скиновании компонентов растром.

    Классов скинов как таковых в фреймворке нет, за исключением окон - есть настройки компонентов и наследование (это сделано сознательно).

    Например, для кнопки можно настроить подложку в зависимости от состояния, подсветку, параметры шрифта, применение фильтров в зависимости от состояния и т.п.
    Можно настроить или написать свои правила для расположения текста и иконки.

    Чтобы не настраивать её каждый раз, делается статичная фабрика, выдающая уже настроенные компоненты. Или делается наследник, который сам себя настраивает. Например, MButton и MFlatButton наследуется от CButton и различаются только настройками своего предка. Вместо 2-х классов можно было бы просто создать статическую фабрику с 2-мя методами: createButton():CButton и createFlatButton():CButton.

  • Если нужно еще больше - берём напильник в руки и вперёд! - Наследуемся от абстрактного компонента, пишем на базе него свой, или вообще пишем с нуля.