Виртуальный GUI на Scala
Рассмотрим создание приложения с графическим интерфейсом, которое может работать на рабочем столе, в браузере и под Android без изменения кода Live Demo c с моего сайта.
Естественно, нам понадобятся библиотеки-фасады, которые инкапсулируют разницу между библиотеками контролов этих систем (JavaFX, Android, DOM)
Для создания таких фасадов прекрасно подходят implicit классы. Например:
implicit class TextFieldExt(txt: Text) { def text=txt.getText def text_=(a: Any) = txt.setText(a.toString) }Так мы сможем создать GUI не только на методах, но и на свойствах:
btHello.text=”Hello”
Но не в DOM, не в Android нет готового контрола Table. Доработка существующих уже там виджетов на implicit классах невозможна,необходимо сохранять состояние. Поэтому Table – это обычный класс. Кроме этого в Android для табличных данных необходим
ещё класс адаптера. Среди стандартных адаптеров нет такого,что умеет работать с Array, ArrayList ,ArrayBuffer в которых сохраняются классы данных. Пришлось написать свой ItemAdapter.
Для обработки структур данных в которых виджет это поле,в котором могут быть различные классы виджетов:
val card=Array(new Card{id=txtName, prop=TEXT,....},new Card{id=cbCat, prop=INDEX...},....)
нас выручит мощный механизм сопоставления с образцом :
for(c<-card :text="" c.id="" case="" match="" text="">text.text=... case combo: Combo => combo.index=... …..... } }-card>Ещё одной проблемой есть то,что в каждой из трёх систем свой механизм инициализации графического интерфейса.
Возможно стабилизация API макросов и моё свободное время решат эту проблему в будущем. А пока что так))
Посмотреть код для Android:
Посмотреть код для браузера:
Посмотреть код для рабочего стола:
Ссылка на GHub:s https://github.com/anatoly62/scala-gui
Виртуальный GUI - это хорошо. Какие мысли о инкапсуляции синхронности/ асинхронности?
ОтветитьУдалитьЕсть не мысли, есть реализация в рабочем проекте. Future c функцией onComplete разной для Java и JavaScript. Напишу про это статью в начале июля.
ОтветитьУдалить