操作設計と長時間の制作#
判断の基準#
参考資料のNuke/Houdini操作を、そのまま増やすことはしません。目的は、接続を狙い続ける負担を減らし、既存の作業を壊さず探索し、誤操作を確実に取り消せることです。CNLの意味、配置、選択、観測を分け、画面にしか存在しない計算状態を作りません。
Networkはプログラムの接続関係、Node画面はその表示です。Wireの描画曲線と実際の接続も別です。Parameterは値の入力契約、TweeqのNumber/Dropdownなどはその操作形です。選択・ホバー・評価中の状態を同じ色の意味へ混ぜません。上流/下流という接続関係と、Functionの内外という包含関係も区別します。
操作の契約#
各操作は、対象、入力、成立条件、実行前のフィードバック、確定、取消し、Undoを持ちます。
| 操作 | 条件とフィードバック | 確定・取消し | 変わるもの |
|---|---|---|---|
| ソケット→入力 | 型・ロック・循環を検査。密集ソケットは最近傍一つだけを選択 | 左ボタンを放す。Escape/フォーカス喪失は取消し | 接続 |
| ソケット→プロパティ | 対応する入力行だけを明るくする。見た目の下に別の入力を推測しない | 左ボタンを放す | 同じ入力への接続 |
| ソケット→ノード本体 | 定義順に、未接続で互換な入力を選ぶ | 左ボタンを放す。候補なしは無変更 | 接続 |
| ドラッグ中のShift+A検索 | 元ソケットと保留Wireを表示し、互換ノードに絞る。Tabは無効 | Enter/候補クリック。Escapeは作成も接続もしない | ノードと接続 |
| Wireへ挿入 | 前後両側の接続が成立するWireだけを明るくする | 左ボタンを放す。古い接続/ロック/循環は一括拒否 | 接続と配置 |
| Knife | K+左ドラッグ。実際に表示されたカーブとの交差候補を表示 | 左ボタンを放してまとめて切断。Escapeは全取消し | 接続 |
| 中間ノード削除 | 唯一の安全な経路だけを再接続。曖昧な経路を勝手に決めない | Delete。Undoでノード・値・Wireを復元 | プログラム |
| 移動・パン・ズーム・Frame | 型/値/評価結果は変更しない | 移動のEscapeは元位置へ戻す | 表示 |
| Functionへ入る/戻る | 同じCNL定義を開く。Function階層はWireの上流ではない | Enter、Alt+Left/Right | 表示する定義 |
| 既存ノード検索・次/前 | Addと同じ関連度規則で現在の関数だけを検索。タイトル一致部分を半透明表示 | Ctrl+F、F3/Shift+F3。Escapeは無変更 | 選択とカメラ |
| Ctrlホバーの上流表示 | 前面のノードの接続元を表示。Focus Ringや選択には混ぜない | キー解除/フォーカス喪失/別操作で消える | 一時表示 |
| 両方向の接続選択 | 上流・下流・分岐を同じ接続探索で辿る。隠れた初期値は除外 | コマンド。無関係な別コンポーネントは不変 | 選択 |
| 入力/出力の一括切断 | 現在のWireを捕捉。ロック/AE公開/古い接続は全拒否 | コマンド。一つのUndo単位 | 接続 |
| 第一・第二入力の交換 | 二本の交換後の型と結果を同時検証。表示名やソケット契約は不変 | コマンド。不可の場合理由を表示 | 接続 |
| 接続元へ移動 | 入力名で移動先を選ぶ。プロパティに隠れる位置へ移動しない | ノード右クリック。Previous Viewで戻る | 選択とカメラ |
| Preview/Experiment | 正式な評価要求と不変入力を使用。Outputの接続を変えない | 選択した対象/時刻を評価。古い要求は破棄 | 観測 |
| Windowの切り離しと再ドッキング | 全Windowは同じコンテナ契約。Code SubwindowはCode内のみ。浮動先もタブスタック・分割可能 | タブの右クリックまたは名前のドラッグ。候補のないドロップは無変更 | 配置だけ |
| 浮動コンテナの移動・resize | 空のタブ帯で移動、4辺4隅でresize。前面だけが入力を所有し、適切なカーソルを表示 | 左ボタンを放す。Escape/フォーカス喪失は元の矩形へ戻す | 配置だけ |
プログラム編集はホスト側で一つの変更として検証・公開します。失敗時に「ノードだけ作れたが接続は失敗した」という中途半端な変更を公開しません。表示履歴のBack/ForwardはプログラムのUndo/Redoとは別です。実装がまだ分離していない表示Undoを、完成済みとは表示しません。
構造編集の確定と実行可能なプログラムの検証は別の段階です。検証中でも下書きを次へ進められ、型や実行が未完成の下書きは保存できます。完了通知は保存版を再確認し、古い検証結果で新しい編集・配置・入力先を置き換えません。共有入力が何度も現れるグラフでも、編集一回の型更新では同じノードを再帰的に何度も推論せず、次の編集では必ず再検査します。
既存操作を活かす#
- Frame Selection(F)とFrame All(Home)で小さなソケットを探す移動量を減らします。
- 選択の追加/解除、範囲の加算/減算/反転、全解除/反転を一つの選択集合へ統合します。直接の入力/出力選択と、再帰的なUpstream/Downstreamを混同しません。
- ドラッグ中の軸拘束と端での自動パンは、移動・接続・範囲選択を続ける補助です。プロパティへの接続やKnifeを別操作へ奪いません。
- メニューの候補・カテゴリ集計とソケットの一時アニメーションは寿命を限定します。開いている間の同じ候補を毎フレーム再構築せず、削除されたソケットの状態を保持し続けません。
- PreviewのFit/倍率/カーソル中心ズーム/パンを評価から分離します。拡大した画像で操作バーを隠さず、表示操作のために再コンパイルしません。
- 作成検索はAdd専用です。階層ではなく関連度順に候補を出し、入力型から接続先を絞ります。
- 複製は選択内部の接続を保持し、値は独立させます。Extract/Expandは通常のCNL Functionへ対応します。
- パラメータ名・ノード名は表示の名前です。内部識別子を人が読める名前の代用にしません。
- InputPositionは画面の右/下を+X/+Yとします。Sでは左上↔右下に沿って両成分を同量動かします。
- 数値操作に別のValue Ladderを追加せず、Tweeqの縦方向による一時的な感度変更を使います。
- AEの通常再描画は入力を消費しません。Dropdownなどの独立オーバーレイは、選択・Escape・外側クリック・明示的な終了まで維持します。
- ポップアップはWindowより上、Tooltipはカーソルから離した右下に表示します。ホバーの説明は編集やキーボード入力を奪いません。
- 描画の前後関係とポインターの所有権を合わせ、奥のソケットの余白で手前のノードを掴めなくしません。
- 接続関係に沿う選択と整列・等間隔配置をコマンドに集約し、別のドラッグモードを増やしません。
- Frame前の表示位置へ戻る操作は、プログラムのUndoとは分離します。
- Ctrlホバーの上流表示と、Upstream/Downstream/Connectedの選択を分離します。一時表示した枝を誤ってDeleteすることはありません。
- 検索結果は毎回現在のモデルから作り、削除済みノードへの古い移動先を再使用しません。AddとFindで別の類似度を実装しません。
- 一括切断と入力交換は個別接続の連続変更ではなく、コピー上で検証した一つのトランザクションとして公開します。
- 浮動Windowごとに別の入力・保存方式を増やしません。共通Dock forestでスコープ、タブの唯一性、前後関係、分割・スタック、保存を管理します。表示を閉じても所有する下書きを破棄しません。
- 画面の合成は、ドッキング済みWindow、後方から前方の浮動コンテナ、共通Popup、Tooltipの順です。ポップアップの当たり判定も親Windowの切り出しで失わせません。
- Popupの所有Window、Keyboard、native Codeの除外領域は同じ一覧から判断します。Popupの外側クリックで閉じるときも、背面のタブを同時に閉じたり動かしたりしません。設定・検索などのApplication PopupはWindow内のPopupに優先し、TooltipやDocking Guideはfocusを奪いません。
- Window移動・resizeの取消しと確定は、その最終frameまで入力を所有します。同じEscapeやボタンreleaseを背面のNode編集へ渡しません。
- ECPのドラッグ・数値編集中は行の論理位置とnative anchorを固定します。同じ値の通常公開では続行し、他の編集やTimelineの時刻変更では古いdraftを取消します。古いoverlay callbackを新しい操作へ流用しません。
- Dropdown/Drumは一frameにまとめられた長押し回数を保持します。別の段階数やStepへ勝手に変更しません。AltGrのUnicode文字入力と、コピー・貼付などのshortcutも区別します。
今回は追加しないもの#
計算上の型を曖昧にするDot、意味のない専用ノード、Tweeqと重複する値操作、既存ショートカットと衝突するNuke/Houdini固有ジェスチャーは追加しません。Node Ring、別のValue Ladder、タイトルを隠す縮小モードは導入しません。Backdropや新しい上流/下流移動のgestureを、既存の検索・選択・接続元移動と重複する方式で追加しません。Functionへの移動を上流移動の代わりにはしません。
検証と制約#
型に基づく接続、検索からの作成、Knife、挿入、取消し、ロック、密集ソケット、表示変更による非再評価はヘッドレス回帰テストで確認します。AEの通常行と独立オーバーレイは実際のPFイベント入口を使用したモック検証を行います。ただし、これはAE実機でのフォーカス/DPI/複数モニター操作の代わりではありません。