Виртуальный GUI на Clojure
Рассмотрим создание приложения с графическим интерфейсом, который бы работал на рабочем столе и в браузере без изменения кода Live Demo с моего сайта
Для рабочего стола будем использовать библиотеку SWT, для браузера будем манипулировать DOM.
Будем считать что графический виджет это структура данных ключ- значение в Clojure это Maps. Такая абстракция дасть возможность манипулировать виджетами с помощью только двух функций (widget w :key value) для получения данных с виджета и (widget w/[w1...wn] :key/{:key1 val1 …:keyn valn} v/[v1...vn]) для смены данных.
Например:
прочитать текст из текстового поля — (widget! txtHello :text)
записать текст в текстовое поле - (widget! txtHello :text “hello”)
очистить несколько текстовых полей (widget! [txtName txtAge txtTel] :text “”)
установить обработчиков событий на несколько виджетов (widget! [btHello cbHello] :on-select [btClick cbChange])
заполнить combo и установить обработчик событий (widget! CbHello {:on-select cbChange :fill [“man” “women”]})
Показать код функции widget для рабочего стола
Показать код функции widget! для рабочего стола
Для браузера эта функция будет несколько сложнее из-за необходимости вызвать внутреннии функции для манипуляции DOM. Строить графический интерфейс для рабочего стола мы будем в дизайнере Eclipse используя WindowBuilder. Это даст нам java-class с построенным графическим интерфейсом. Получение виджетов из этого класса выглядит так:
(def btHello (.btHello shell))
….....
(def txtHello (.txtHello shell))
А если виджетов десятки? К тому же для браузера это будет просто:
(def btHello “btHello”)
….......
(def txtHello “txtHello”)
Просятся макросы:
Показать код макроса defc для робочего стола
Показать код макроса defc для браузера
теперь всё будет просто (defc shell btHello … txtHello) Особенностью SWT есть то что необходимо написать свою оконную процедуру
Показать код функции loop-gui для робочего стола
Показать код функции loop-gui для браузера
Ну и ещё нам понадобится функция вывода сообщений
Показать код функции message для рабочего стола
Показать код функции message для браузера
Ну и теперь код простого приложения. Инициализацию shell тоже можно сделать макросом.
Показать код приложения
Комментарии
Отправить комментарий