2012-09-20 17 views
4

我有一個應用程序,我正在努力,而我基本上是自學GUI編程。我在程序員.stackexchange上詢問了一個相當involved question。這個問題是關於我沒有嘗試過的想法的機制。使用Haskell和Gtk2hs,我將如何創建一個新的窗口小部件和相關的事件?

我有三個小部件: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中的數據,等等......我只是有興趣在此刻如何實際做到這一點)

是否有任何示例做這樣的事情?基本上,我需要實現哪些實例來創建新的Widget和兩個信號?我寧願堅持Haskell,但我可以下降到C,以建立新的小部件。

回答

5

不幸的是,目前沒有純粹的Haskell方法來(正確)實現Widget類型的類。你需要在C中實現你的小部件,然後通過FFI導入它。有很多這樣的例子 - 基本上所有的gtk +/gtk2hs都是數百個這樣做的例子的集合。

+0

不夠公平。這可能是真正涉及到的,但聽起來像我的過程是1)編寫一個實現此接口的新庫,2)編寫一個C應用程序來測試它,一旦工作3)寫入FFI以將其集成到我的Haskell中應用程序。我可能不會立即這樣做,但聽起來很有趣。 –

+0

@Daniel下一個實現是否不正確? http://hpaste.org/74985(它創建'GObject'子類,但是'Widget'我認爲是可能的)任何意見http://stackoverflow.com/questions/12509431/convert-ptr-to- sourcecompletionprovider會很有用。謝謝 – Yuras

相關問題