コンテンツにスキップ

キーバインドのしくみ

Control Deck のショートカットキータブ。100 を超えるアクションがグループごとに並び、各行にアクション名・現在のキー割当表示・HotkeyRecorderControl(クリック→キー押下で記録)・個別リセットボタン、画面下部に「エクスポート」「インポート」ボタン

この節の要旨 全 100 アクションを KeyBindingService(App.KeyBindings)で一元管理。割り当ての保存先は WindowSettings.CustomKeyBindings(List<KeyBindingDto>?)。割り当てはショートカットキータブで入力します(クリック → キー押下で記録。2 打鍵にも対応)。変更時に BindingsChanged イベントが発火し、RebuildInputBindings() と UpdateShortcutTooltips() が全ウィンドウで再適用されます。マクロのショートカットも Macro.<id> として同じ表に載るため、重複や「2 打鍵の起点に割り当ててしまった」といった問題が検出されます。

  • キー判定の一元化: アプリ内のキー処理は KeyBindings.Matches(actionId, key, modifiers) を通して判定するので、割り当てを変えたキーはどこでも効きます。ダイアログの Esc / Enter や標準的な移動など「固定でよいもの」だけは直接判定しており、割り当ては変えられません。
  • エクスポート / インポート: Control Deck → ショートカットキー → エクスポートボタンで現在のバインドを JSON 化。JSON 構造は [{ "ActionId": "Rename", "Key": "F2", "Modifiers": "None" }, ...]。インポートボタンで同形式を読み込み、既存バインドに上書き適用。
  • 個別リセット: 各アクション行の「リセット」で既定値に戻す(該当行のみ CustomKeyBindings から除外)。
  • ツールチップ併記: 各コマンドボタンのツールチップは自動的に現在のキー(例: 名前の変更 (F2))に更新されます。バインドが変更されると UpdateShortcutTooltips() で全ツールチップが再描画。
  • アクション定義: KeyBindingService.RegisterDefaults() の登録が正。新アクション追加時は同メソッドに Register(...) を足し、lang/*.json のキーを 10 言語分追加する。
  • キーの体系(プリセット): data/keymaps/*.json を 1 ファイル置くとプリセットが 1 つ増える。{ "actionId", "key", "modifiers", "key2", "modifiers2" } の形で、key2 を省けば単打鍵、書けば 2 打鍵になる。
  • キーが届かない操作を作らない: 画面から実行できるのにキーで届かない操作は、キーを割り当てないアクションとして登録し、コマンドパレット(Ctrl+Shift+P)から名前で呼べるようにする。