|
Модератор
|
||||||
Делаю GUI на Haskell01.04.2017, 00:07. Показов 8056. Ответов 77
Метки нет (Все метки)
Предпосылки
Нормального, кроссплатформенного, графического интерфейса в настоящий момент для Haskell нет. Имеющиеся обёртки к сишным либам (GTK+, WxWidgets) оставляют желать лучшего, мягко говоря. С каждой новой версией и сишной библиотеки, и обёртки вылезают баги их совместимости. Особенно это заметно под Windows, т.к. под этой ОС авторы обёрток не привыкли их проверять. Проблемы кросс-языковой совместимости, в принципе, это проблемы человеческого фактора. Но они реально достают.
Выбор
И так, я стал выбирать как можно более низкоуровневую кроссплатформенную библиотеку с тем, что бы она наименее мешалась, а практический весь GUI реализовать на Haskell. Такой подход, как я предполагаю, максимально снизит «обёрточные» проблемы, или, если угодно, они будут сосредоточены в одном Haskell пакете (или нескольких взаимосвязанных) где фиксить их будет куда проще. Кроме того, разработка новых компонент GUI-я, так же будет происходить в рамках одного языка, что, очевидно, удобнее.
Из рассматриваемых кандидатов я отклонил OpenGL как очень избыточную для целей обычного (2D) интерфейса. К тому же она медленна под Windows. От использования браузера через JavaScript я отказался на основании некоторых, накладываемых на такой интерфейс ограничений. Выбор я остановил на библиотеке SDL2. И, хотя это мультимедийная библиотека, якобы заточенная под геймдев, мне в ней понравился простой API для работы с окнами, мышью и клавиатурой. Под винду она использует DirectX (хотя может и OpenGL), под другие ОС только OpenGL. Допускается создание любого числа окон операционной системы, получение сообщений от устройств ввода через очередь сообщений. Возможность создавать свои сообщения (нужны для обновления интерфейса из потоков), возможность работать с весьма ограниченным набором примитивов и текстурами. Рендеринг текста и загрузка изображений из многих графических форматов реализована сопутствующими сишными библиотеками SDL_ttf и SDL2_image. В принципе, возможно подключить более «навороченную» библиотеку cairo в качестве дополнения, Haskell обёртки к которой есть, при чём даже специально к SDL, но я пока cairo в сам проектируемый GUI не заложил. Для GUI хватает и графических примитивов SDL2. Упрощённо иерархия выглядит так. Нудное описание
Базовый слой GUI поддерживает дерево Widget-ов общего назначения. Алгоритмы последовательности их отрисовки, доставку событий (в виде вызовов функций Widget-а) от мыши и клавиатуры, учёт наложений, скроллирования, взаимодействия между окнами приложения и прочие «общие» моменты. Базовый Widget представляет собой фиксированную запись с полями – свойствами Widget-а и набором полей – функций, создаваемых, предположительно, только при (даже перед) созданием самого виджета. Набор функций напоминает набор обработчиков событий в распространённых, ООП-ешных GUI. Конкретные виджеты (виджеты компоновок – layout-ы, надписи, кнопки и пр. представляют собой (на уровне данных) объединение в одном типе типа базового виджета и типа уникального для конкретного виджета. Т.е. данные описывающие более высокоуровневые виджеты имеют в качестве одного из полей запись виджета более низкоуровневого. Базовый виджет всегда хранится по ссылке (IORef). Так же, через
IORef он доступен в дереве виджетов базового слоя. В известном чате мне советовали использовать FRP, но если посмотреть исходники FRP пакетов, то внутри там IORef-ы и есть. Пока воздержусь от использования в GUI. Может потом поумнею? Про исходники (нет, я не копира...)
Исходники, к сожалению, я пока не готов выложить по следующим причинам:
- Ещё мало чего можно показать. Не хотелось бы что бы скачали, посмотрели и сказали «фи, опять какая то недоделка». Да, пока весьма недоделка, даже на базовом уровне по которой надо ходить опасно. Вторая причина – нет комментариев. Да, надо бы их сразу писать, я знаю. Но я себе установил для начального этапа некоторые сроки, а дело двигается медленно, и времени нет, и редизайнил уже много раз. Так что, как только хоть что то будет – так сразу. Ну и зачем?
Зачем я это делаю? Ну, во первых «Мужик что бык: втемяшится В башку какая блажь — Колом ее оттудова
Не выбьешь» (с) Н. А. Некрасов. Потом, это, потенциально бесконечная работа. Если (а что крайне врят ли) кто не подключится, она меня переживёт. Чем то этот момент меня привлекает. (Видимо, тоже весеннее обострение. Кодить начал, аккурат 1 марта, хотя задумывался об этом давно). Что бы было хоть ну на что то посмотреть приведу код (без import-ов) которым создаётся верхняя картинка.
И наконец. Радужные перспективы.
Сделать более менее нормальный GUI со своей изюминкой, полностью типобезопасный, а потом, на нём сотворить, наконец, нормальное IDE для Haskell.
7
|
||||||
| 01.04.2017, 00:07 | |
|
Ответы с готовыми решениями:
77
Место ФП и Haskell в компьютерной индустрии (Для чего он нужен, этот Haskell?)
|
|
Модератор
|
||
| 07.04.2017, 10:52 [ТС] | ||
|
Добавлено через 1 минуту Добавлено через 21 минуту Бегло посмотрел про попытку порта в Haskell. Не, у меня, в отличии от Simon Peyton Jones-а , другой подход. Я за однотредовый GUI (который, конечно, можно будить из тредов). Да и старьё это. В ссылках только 90-ые годы.
0
|
||
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
|||
| 07.04.2017, 10:58 | |||
0
|
|||
|
Модератор
|
||
| 07.04.2017, 11:16 [ТС] | ||
|
1
|
||
| 07.04.2017, 13:47 | |
|
0
|
|
|
Модератор
|
||||||
| 01.05.2017, 01:04 [ТС] | ||||||
|
И так, начался новый месяц. Отчитываюсь.
Не сколько сделано, сколько несколько раз редизайнил. Сейчас приступил к реализации прокручиваемых областей со скроллбарами. Делая их у меня даже возник вопрос . Кнопки со стрелками я, конечно, опционально объединю со скроллбаром (и, они могут быть с рамкой что вверху слева, а не с такими как на картинке, чёрными). GUI настраивается через Скин - запись со множеством полей задающая цвета, кой какие размеры, и где брать картинки, например , те что на кнопках. Шрифты, картинки, курсоры (пока только набор системных курсоров) кешируется. Т.е. их можно запросить один раз, и в следующий они бертся из кеша по текстовому ключу (для картинки, к примеру, ключ - имя файла). Для работы программы с таким GUI предусматривается каталог с подкаталогами для картинок и пр. в положенном по XDG Base Directory Specification месте. Т.е. всё кроссплатформенно. Хотя, для Windows я бы мог это всё в ресурсы запихать, но будет не кросс... По картинке. Собрал всякие последнии достижения из нескольких тестовых окошек. Трекбар, в действительности не такой попугайский - я его специально выделил. Теперь все виджеты при создании принимают первым параметром специфичную для типа виджета запись с настройками. Получается однотипненько, компактно (большая часть настроек по дефолту, т.е. из скина и не видна), и, в дальнейшем, может быть это поможет с сериализацией и взаимодействию с конструктором интерфейса. Исходники пока не выкладываю. Не-а. Много редизайнил, сыро, сыро ... . А сейчас мне предстоит скроллы сделать. Для меня это сложно. Подразумевается, что в скроллируемой области могут быть те же элементы интерфейса, в том числе и другие скролл-области. Т.е. всё по взрослому. Не получится с наскока, полезу читать как это делается. А пока посмотрите как выглядит построение вышеприведённого окошка в коде. Обратите внимание на обработку событий. Вполне можно справится без FRP, хотя я и не гарантирую что потом его не прикручу. Кликните здесь для просмотра всего текста
4
|
||||||
|
Антикодер
1889 / 871 / 48
Регистрация: 15.09.2012
Сообщений: 3,092
|
|
| 12.05.2017, 00:49 | |
|
Может библиотеку для GUI лучше делать поверх reflex на принципах FRP?
Я просто переосмыслил доклад: Фронтенд на Haskell с reflex-dom. Антон Гуща
1
|
|
|
Модератор
|
||
| 12.05.2017, 03:21 [ТС] | ||
|
Но, повторяю, я пока не въехал в ФРП. За ссылку спасибо. Посмотрел доклад. Про собственно ФРП нового не узнал (или не заметил). А reflex-dom опять же про Web-интерфейс. Я делаю НЕ web интерфейс приложения. Web-GUI-ёв для Haskell море и они строятся по другому принципиально.
3
|
||
|
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
|
|
| 15.05.2017, 19:58 | |
|
KolodeznyDiver, а вашу библиотеку где-нибудь взять можно? Я понимаю что она сырая, но всё же?
0
|
|
|
Модератор
|
||
| 15.05.2017, 20:20 [ТС] | ||
|
p.s. Там ещё надо хотя бы правильно описания по английски написать, ридми. Вот, планирую, отдельной темой выложить как устанавливать SDL. Будет перекликаться с вашей установкой gtk, т.к. там тоже через pacman. Буду "чистую" машину мучить. Но это не сегодня-завтра. У меня ещё и основная работа есть.
1
|
||
|
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
|
|
| 15.05.2017, 20:26 | |
|
Мне нужен минимум функционала
ввод текста не работает? Ну... и ладно, сделаю по нажатию кнопки ввод из файла. P.S. Заодно может я что-то полезное от себя допилю.
0
|
|
|
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
|
|
| 15.05.2017, 20:38 | |
|
Очень, очень жаль :-( Видимо придётся мне от дипломной программы GUI отпиливать совсем, чтобы она под винду хотя-бы собралась
Хотя не хотелось бы. Крайне не хотелось бы.
0
|
|
|
Модератор
|
||
| 15.05.2017, 20:52 [ТС] | ||
|
Ну, или, весьма простую, и правда, http://wiki.haskell.org/Threepenny-gui , которую в этом трэде уже упоминали. Только тогда в браузере интерфейс. Ну, почему бы и нет? Я если я делаю desktop-ый gui, то это не значит что браузерные неприемлемы нигде.
1
|
||
|
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
|
|
| 15.05.2017, 20:56 | |
|
А вот это наверно вариант, я уже когда-то об этом думал... что же. Благодарю за совет. Это конечно не идеально, но за неимением гербовой...
Добавлено через 48 секунд Я заканчиваю не сам МГУ, всего лишь его филиал.
0
|
|
| 15.05.2017, 21:03 [ТС] | |
|
Не по теме: Araneo, у вас ещё кто ни будь диплом на Haskell делает? Или стоит говорить в процентном отношении сколько делают?
0
|
|
| 15.05.2017, 21:07 | |
|
Не по теме: В нашей группе один я такой. За предыдущий год тоже никого больше :( печально всё это. Если искать других таких же, то это надо в самом МГУ на кафедру АЯ при ВМК идти. Там есть сколько-то хаскелистов (на третьем курсе весной его учат). Но не могу сказать сколько.
0
|
|
| 16.05.2017, 23:48 | |
|
Не по теме: Раньше мечтал о таком GUI на OpenGL - ну чтобы был интерфейс как в хороших играх
0
|
|
| 16.05.2017, 23:58 [ТС] | |
|
0
|
|
|
Модератор
|
|
| 18.05.2017, 08:03 [ТС] | |
|
Выложил. https://github.com/KolodeznyDiver/GUI-SDL2
Многого не ожидайте. Оно в процессе. Нет ещё основных виджетов, типа ввод текста или чекбоксов. Я делаю по плану, как мне удобно делать, а не стараюсь выдать на гора уже что то удобное. В перспективе будет. Так же практически нет комментариев, уж не говоря про спецкомментарии haddock для автогенерации HTML и прочих справок. Да, сознаю что это плохо, нужно бы сразу с комментариями писать. Всё понимаю, но, если бы я с комментариями писал, да по английски все, вы бы не скоро даже в таком объёме увидели бы хоть что то. p.s. Я там кратко описал в ридми как ставить, но крайне желательно читать Правильная установка Haskell. Утилита Stack и Установка SDL и её Haskell- обёрток.
2
|
|
|
Модератор
|
|||||||||||
| 01.06.2017, 04:13 [ТС] | |||||||||||
|
Снова первое число месяца. И так, что сделано (кроме ловли багов).
Добавлен универсальный декоративный элемент border. В зависимости от настроек, он может быть и линией на форме (опционально с надписью) и прямоугольником и рамкой с вставленным туда другим виджетом (или даже несколькими, перекрывающими друг друга). Добавлена возможность передавать сообщения из трэдов к GUI.
Ранее был только намёк (задел) на это. Теперь можно создать Pipe (я назвал pipe, как pipes у Gabriel Gonzalez, хотя его пайпы в GUI не используются) указав функцию получающую сообщение, а тред может сообщения к этой функции посылать. Вполне типобезопасно, хотя и не без ограничений. По каждой трубе передаётся один аргумент типа Storable a => V.Vector a . Труб этих может быть любое разумное количество, допустимо с разными типами вместо а. Если захочется передавать что то другое, то придётся написать свой instance к классу GuiPipe, при этом поорудовать с указателями (Ptr) , т.к. данные передаётся через очередь сообщений SDL, т.е. там нужно уметь пользоваться FFI (ничего сложного).
Пример использования трубы.
Так же, добавлены Action-ы и меню.
Идея Action-ов не нова, многие, наверно знают по другим GUI, хотя бы Delphi взять. Для одного действия задаётся обработчик (функция), текст, картинка, горячая клавиша и пр.
Action-ы используются для назначения горячих клавиш, на них ссылаются пункты меню, в будущем кнопки панелей инструментов. В общем, получаем единообразие действий. В этом GUI Action-ы с особенностями. Во-первых, ссылаются на них по текстовым ключам: имя группы и имя в группе. Это для упрощения будущей возможной кастомизации. В смысле, что бы приложение можно было настроить без изменения исходного кода, например, сменить горячие клавиши. Расход на поиск в HashMap невелик, да и выполняется только при создании меню и пр. При движениях мыши, конечно, Action-ы по текстовым строкам не перебираются.
4
|
|||||||||||
| 01.06.2017, 04:13 | |
|
[ubuntu] Как запустить qt-gui программу без gui-интерфейся из консоли? Как запустить GUI приложение (например, notepad.exe) без отображения GUI? LWJGL+ GUI - Выход из рендерного цикла для работы в GUI без потери окна LWJGL и GUI - Выход из рендерного цикла для роботы в GUI без потери окна Как лучше и быстрее из SQL в QVector и в GUI или сразу из SQL в GUI Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|