設計ノート: ViewContainer のビュー切替(Chat / History スタブ / Settings)
This content is not available in your language yet.
- 日付: 2026-07-31 / ステータス: 採用済み
- 関連: ARCHITECTURE.md Phase 3、R05 6.1(ヘッダーのタブ行成長構想)
Phase 1-2 の AgentPanelWindow は ViewContainer に ChatView を直接 1 個だけ埋め込んでいた。Phase 3 では Settings ビュー(本ラウンド)と History ビュー(次段、今回はスタブ)を追加し、ヘッダーの ⚙ から Settings へ、Settings/History から Chat へ戻れるようにする必要がある。
制約:
- Chat から離れても CLI クライアントを再起動しない・トランスクリプトを再構築しない(タスク要件)。
- 本ラウンドの並列作業ではファイル所有権が明確に分離されており、
HeaderView.cs/StatusBarView.csは両エンジニアとも今回は触らない(次段で Engineer H が担当)。ところが R05 6.1 は「⚙ = Settings への遷移」を v1 の時点でヘッダーに置く前提で書かれており、両者に矛盾がある。
検討した選択肢
Section titled “検討した選択肢”| 案 | 内容 | 判定 | 根拠 |
|---|---|---|---|
| A | HeaderView.cs の既存(無効化済み)⚙ボタンを有効化して直接配線 | 棄却 | 明示的なファイル所有権違反。次段の Engineer H の作業と衝突する |
| B | ViewContainer 内に独自の「切替ストリップ」(⚙ / ‹ Chat)を追加し、AgentPanelWindow.cs(自分の所有物)だけで完結させる | 採用 | ファイル所有権を守りつつ、今すぐ動く UI を提供できる。AgentPanelWindow.ShowSettings()/ShowChat() という public 静的 API も用意し、次段で HeaderView の⚙がこれを呼ぶだけで済むようにした |
| C | 今回は Settings への導線を一切 UI に出さず、テストと配線だけ用意する | 棄却 | 機能が完成しても誰も触れられず、受け入れ確認ができない |
PanelViewKind(Chat/History/Settings)をIAgentPanelView.csに追加。AgentPanelWindowは 3 ビューの root を CreateGUI で 1 回だけ構築し、ViewContainerに全部 Add した上でstyle.displayの Flex/None だけを切り替える。破棄・再構築は一切しない。- 表示中でないビューは
OnDeactivate()(購読解除・リフレッシュループ停止)されるだけで、裏側のAgentHub/ChatSession/CLI クライアントは一切触らない(そもそもChatView.OnActivate/OnDeactivateは元々 UI 購読の付け外しのみで、セッション状態は static なAgentHub側に生きている)。切り替えて戻るとOnActivate()が_dirty=trueにして即座に最新状態を再描画するので、滞在中に届いたメッセージも消えない(再描画が遅延されるだけ)。 - 切替導線は
ViewContainer内の薄いストリップ(⚙ / ‹ Chat)としてAgentPanelWindow.cs内に実装。HeaderView.csは無変更。 - 副作用として気づいたエッジケース: Settings/History 表示中に can_use_tool 許可待ちが発生すると、ChatView 自身のリフレッシュループが止まっているため許可カードの自動ウィンドウ化判定が走らない。バッジ(タブアイコン)は
AgentPanelWindow自身のループが動き続けるので出るが、カード自体は見えないままになり得る。対策として「待機状態に 新規遷移 した瞬間、Chat 以外のビューにいたら自動で Chat に戻す」エッジトリガー処理を追加した(既存のバッジ用_badgeShown遷移検知を再利用)。
AgentPanelWindow.ReapplyContentRootStyling()という新しい共有ヘルパーが、CJK フォントとフォントサイズの両方を「開いている全パネル/許可ウィンドウ」に即座に再適用する経路として追加された(Settings のトグル/スライダーから呼ばれる)。- History は本ラウンドでは
BuildHistoryStub()が返す静的なVisualElementのみ(IAgentPanelViewは実装しない)。次段でHistoryView : IAgentPanelViewに差し替える際はAgentPanelWindow.RootForView/ActivateView/DeactivateViewのPanelViewKind.History分岐を実装で埋めるだけでよい。