С Haskell и Gtk2hs, как мне создать новый виджет и связанные события?
У меня есть приложение, над которым я работаю, и я в основном программирую GUI с самообучением. Я задал довольно сложный вопрос на сайте programmers.stackexchange. Этот вопрос о механике идеи, которую я не пробовал.
У меня есть три виджета: TreeView, TextField и DrawingArea. Каждый из трех виджетов очень тесно взаимодействует с событиями на одном, обязательно вызывая действия на другом. Эти три виджета в основном не взаимодействуют с остальной частью приложения, за исключением (пока) чтения MVar, содержащего глобальное состояние приложения.
В настоящее время я не могу представить ни одного случая, когда более крупное приложение могло бы взаимодействовать напрямую с любым из этих трех виджетов. Кроме того, этот идентичный шаблон будет реплицирован для просмотра других данных, имеющих такую же форму. Таким образом, мне кажется, что было бы разумно связать эти три виджета вместе в более крупный составной виджет, который может взаимодействовать с обычной очередью событий GTK. Так, например
type MyDataViewWidget = (TreeView, TextField, DrawingArea)
data DataUpdatedSignal a = DataUpdatedSignal a
data RedrawEvent a = RedrawEvent a
Таким образом, виджет будет использовать DataUpdatedEvent, чтобы указать остальной части приложения, что что-то внутри MyDataViewWidget изменилось, а RedrawEvent сообщит виджету, что ему нужно перерисовать или перечитать исходные данные.
(технически я не продумал семантически, что будут делать различные действия в составном виджете... будут ли у виджетов только копии данных приложения, доступные только для чтения, и им нужно будет получать новые копии только для чтения с RedrawEvent или возможно, виджеты будут иметь сам MVar, и ему будет позволено изменять данные в MVar и т. д. Я сейчас просто заинтересован в том, как на самом деле это сделать)
Есть ли примеры, как сделать что-то подобное? В основном, какие экземпляры мне нужно реализовать для создания нового виджета и двух сигналов? Я бы предпочел придерживаться Haskell, но я мог бы перейти к C, чтобы создать новый виджет.
1 ответ
К сожалению, в настоящее время не существует чистого способа Haskell (правильно) реализовать Widget
тип класс. Вам нужно будет реализовать свой виджет в C, а затем импортировать его через FFI. Есть множество примеров этого - в основном все gtk+/gtk2hs - это коллекция сотен примеров этого.