【发布时间】:2012-09-20 17:56:13
【问题描述】:
我有一个正在开发的应用程序,我基本上是在自学 GUI 编程。我在programmers.stackexchange上问了一个相当involved question。这个问题是关于我没有尝试过的想法的机制。
我有三个小部件: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 来构建新的小部件。
【问题讨论】: