reactive-banana
を使用してマルチモーダルエディタを構築しています。ほとんどの場合、完璧になっています。私のシナリオを拡張するために、エディタはマッピングソフトウェアの一部であるか、非常に単純なベクトルグラフィックスエディタと考えることができます。現在のところ、選択モードとポリゴン作成モードの2つの状態があります。選択モードでは、ユーザーは以前に作成したポリゴンをマウスの右ボタンで選択することができます(理論的には選択モードになります)。または、マウスの左ボタンで新しいポリゴンの作成を開始できます。リアクティブバナナで1つのスイッチを実行
マウスの左ボタンを押すと、選択モードからポリゴン作成モードに切り替わります。このモードでは、マウスの左ボタンは、ユーザーが元の頂点に戻るまで「新しい頂点を追加」を意味します。この時点で、それらはポリゴンを閉じているので、選択モードに戻ります。
私はこれをいくつかの方法で実装しましたが、最近イベントスイッチがこれを非常に優雅にしていることに気付きました。私が持つことができます。
createSectorMode :: Frameworks t
=> HadoomGUI
-> SectorBuilder
-> Point V2 Double
-> Moment t (Behavior t Diagram)
createSectorMode HadoomGUI{..} initialSectorBuilder firstVertex =
do mouseClicked <- registerMouseClicked guiMap
...
これに伴い
defaultMode :: Frameworks t => HadoomGUI -> Moment t (Behavior t Diagram)
defaultMode [email protected]{..} =
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)
確かに動作します - 単一のマウスクリックのために。一度地図をクリックすると、直前の状態からセクタ作成モードに切り替わりますが、を再度にクリックすると、defaultMode
はクリックイベントを受信し、新しいポリゴン作成モードに切り替わり、前の状態。
私がしたいことは、defaultMode
に一度だけ戻ってくる可能性があります。基本的にはBehavior t Diagram
()の「スワップ」をcreateSectorMode
としたいと思います。
私はreactive-banana
が動的イベントのガベージコレクションに問題があることを理解していますが、私は今のところそれに喜んでいます。上記の公式は、今までに書いたものよりもはるかに正確です。たとえば、変数が1つしかなく、その内容に基づいてさまざまなイベントをフィルタリングしています。私がこれを持っている問題は、それが大きすぎるということです。切り替えを行うと、私はできる範囲でイベントを開催できます。
ありがとう、これは私が考慮しなかった興味深いアプローチです。古い「モード」がまだ切り離されることを依頼しても、まだイベントを受信しているという問題があるのに、「一度」必要ですか?私はこれと遊びをして、私が見つけたものを確かめるでしょう。 – ocharles
どちらの場合も、古いモードはイベントを受信しています。破棄して結果を無視し、代わりに新しいモードを作成するだけです。これはおそらく、それぞれのモードが新しいモードに置き換えられることを一度だけ伝えることができるようにするためには、まだ 'once'が必要であることを意味します。 –
これはガベージコレクションが将来対応するのに役立つとは思わないでしょうか? – ocharles