С 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 - это коллекция сотен примеров этого.

Другие вопросы по тегам