私は自分が取り組んでいるアプリケーションを持っており、基本的にはGUIプログラミングを自己学習しています。私はprogrammers.stackexchangeについてかなり複雑な質問をしました。この質問は、私が試したことのないアイデアの仕組みについてです。
TreeView、TextField、DrawingAreaの3つのウィジェットがあります。3つのウィジェットはそれぞれ、一方のイベントと非常に密接に相互作用し、必然的にもう一方のアクションをトリガーします。これらの3つのウィジェットは、 (これまでのところ)グローバルアプリケーションの状態を含むMVarを読み取ることを除いて、アプリケーションの残りの部分とほとんど相互作用しません。
現在、より大きなアプリケーションがこれら3つのウィジェットのいずれかと直接対話する必要があるケースは考えられません。さらに、その同一のパターンを複製して、同じ形式の他のデータを確認します。したがって、GTKの通常のイベントキューと相互作用できるより大きな複合ウィジェットにこれらの3つのウィジェットを実際にバインドすることは理にかなっているように思われます。だから、例えば
type MyDataViewWidget = (TreeView, TextField, DrawingArea)
data DataUpdatedSignal a = DataUpdatedSignal a
data RedrawEvent a = RedrawEvent a
したがって、ウィジェットはDataUpdatedEventを使用して、MyDataViewWidget内の何かが変更されたことをアプリケーションの残りの部分に示し、RedrawEventは、ソースデータを再描画または再読み取りする必要があることをウィジェットに通知します。
(技術的には、複合ウィジェットのさまざまなアクションが何をするかを意味的に考えていません...ウィジェットがアプリケーションデータの読み取り専用コピーを持ち、RedrawEventで新しい読み取り専用コピーを受信する必要があるかどうかおそらくウィジェットはMVar自体を持ち、MVarのデータを変更できるようになるでしょう...私は今、実際にこれを行う方法に興味があります)
このようなことをした例はありますか?基本的に、新しいウィジェットと2つのシグナルを作成するには、どのインスタンスを実装する必要がありますか?Haskellに固執したいのですが、新しいウィジェットを構築するためにCにドロップすることもできます。