UI入力を特定の操作にマッピングするロジックを専用オブジェクトに分離することをお勧めします。それらをSensorオブジェクトと呼ぶことができます。あなたの実装言語を知らないので、私はこれで一般的になるでしょうが、あなたはその考えを得るべきです。
OperationSensor
+ OnKeyDown
+ OnKeyPress
+ OnKeyUp
+ OnLeftMouseDown
+ OnLeftMouseUp
+ OnNodeSelect
+ OnNodeDeselect
+ OnDragStart
+ OnDragStop
のは、あなたがすべてのさまざまなUIの入力、UiInputManager
を集約する中央のクラスがあるとしましょう。言語固有のメカニズムを使用してキーボードとマウスの入力を待ち受けます。また、マウスが押されて動かされた場合、つまり論理的に「ドラッグ」していることを検出するなどの基本的な操作を検出します。
UiInputManager
// event listeners
+ keyboard_keydownHandler
+ keyboard_keyupHandler
+ mouse_leftdownHandler
+ mouse_rightdownHandler
// active sensor list, can be added to or removed from
+ Sensors
UiInputManagerは、入力の原因となっている操作を知っている責任はありません。言語固有の方法でセンサーに通知するだけです。
foreach sensor in Sensors
sensor.OnDragStarted
や、センサーは、あなたが今持っている何UiInputManager
RaiseEvent DragStarted
によって発行された論理的なイベントをリッスン場合OperationSensorサブクラスへのルートを入力する配管です。各OperationSensorは、1回の操作に関係するロジックを備えています。操作の基準が満たされたことを検出すると、適切なCommandオブジェクトを作成し、それをバックアップします。
// Ctrl + zooms in, Ctrl - zooms out
ZoomSensor : OperationSensor
override OnKeyDown
{
if keyDown.Char = '+' && keyDown.IsCtrlDepressed
base.IssueCommand(new ZoomCommand(changeZoomBy:=10)
elseif keyDown.Char = '-' && keyDown.IsCtrlDepressed
base.IssueCommand(new ZoomCommand(changeZoomBy:=-10)
}
コマンドオブジェクトをセンサーからUiInputManagerに渡すことをお勧めします。マネージャはコマンド処理サブシステムにそれらを渡すことができます。これにより、マネージャは、操作が完了したことをSensorに通知し、必要に応じて内部状態をリセットすることができます。
複数ステップ操作は、2つの異なる方法で処理できます。 SensorOperation内にインナーステートマシンを実装することも、「ステップ1」センサーを作成して「ステップ2」センサーを作成してアクティブセンサーリストに追加することもできます。 「ステップ2」が完了すると、「ステップ1」センサーを再追加して自分自身を取り除くことができます。
それで彼は質問に述べたようにパイプラインを使うべきだと言っていますか? – jgauffin
私は新しいことを提案していました。 (私は思うが)彼は、イベントをキャプチャしてファンネルするためにパイプラインを使いたいとしていると述べ、イベントを最後まで扱うまで、後続のイベントハンドラに連鎖することにした。私は、それらを引き起こすイベントではなく、実行されているオペレーションに焦点を当てました。 OPが彼のpipleineのアイデアを明らかにしたら、私はもう少し比較/比較することができた。私は彼がそれを取るのを見るためにOPの返事を楽しみにしています。 – tcarvin
アドバイスと説明のために+1 – jgauffin