を使用してマルチモーダルエディターを構築していますreactive-banana
-そして、ほとんどの場合、それは完璧です。私のシナリオを拡張すると、エディターは何らかのマッピング ソフトウェアであるか、非常に単純なベクター グラフィック エディターと考えることができます。現在、選択モードとポリゴン作成モードの 2 つの状態があります。選択モードでは、ユーザーはマウスの右ボタンで以前に作成したポリゴンを選択することができます (理論的には、新しい選択モードに移動します)。または、マウスの左ボタンで新しいポリゴンの作成を開始できます。
意図は、マウスの左ボタンが押されたときに、選択モードからポリゴン作成モードに切り替えることです。このモードでは、マウスの左ボタンは、ユーザーが元の頂点に戻るまで、「新しい頂点を追加する」ことを意味します。この時点でポリゴンは閉じているので、選択モードに戻ります。
私はこれをいくつかの異なる方法で実装しましたが、最近、イベント スイッチがこれを非常にエレガントにすることに気付きました。私は持てます:
defaultMode :: Frameworks t => HadoomGUI -> Moment t (Behavior t Diagram)
defaultMode gui@HadoomGUI{..} =
do mouseMoved <- registerMotionNotify guiMap
mouseClicked <- registerMouseClicked guiMap
let lmbClicked = ...
gridCoords = ...
diagram = ...
switchToCreateSector <- execute ((\m ->
FrameworksMoment
(=<< trimB =<< createSectorMode gui emptySectorBuilder m)) <$>
(gridCoords <@ lmbClicked))
return (switchB diagram switchToCreateSector)
一緒に
createSectorMode :: Frameworks t
=> HadoomGUI
-> SectorBuilder
-> Point V2 Double
-> Moment t (Behavior t Diagram)
createSectorMode HadoomGUI{..} initialSectorBuilder firstVertex =
do mouseClicked <- registerMouseClicked guiMap
...
これは確かに機能します - マウスを 1 回クリックするだけです。マップを 1 回クリックすると、直前の状態からセクター作成モードに切り替わります。しかし、もう一度クリックすると、defaultMode
はクリック イベントを受け取り、新しいポリゴン作成モードに切り替わり、以前の状態は破棄されます。
私がやりたいことは、defaultMode
一度切り替えて、二度と戻る可能性がないことです. Behavior t Diagram
本質的に、によって生成されたdefaultMode
を の結果と「交換」したいと考えていcreateSectorMode
ます。
reactive-banana
動的イベントのガベージ コレクションに問題があることは理解していますが、今のところ問題はありません。上記の定式化は、これまでに書いたものよりもはるかに正確です。単一のCurrentState
変数を持ち、その内容に基づいてさまざまなイベントをフィルタリングするなどです。私がこれに抱えている問題は、それが大きすぎて、物事を台無しにする余地が多すぎることです. 切り替えることで、私ができるイベントだけをスコープに入れます。