# 画面設計書 10-Console

## 概要

コマンド入力、履歴、補完機能を持つデバッグコンソールのサンプル実装の設計書である。ゲームや開発ツールで一般的なコマンドラインインターフェースの実装例を示す。

### 本画面の処理概要

Consoleは、テキスト入力でコマンドを実行し、出力をスクロール可能な領域に表示するデバッグコンソールのサンプルである。TABキーによるコマンド補完、上下矢印キーによる履歴参照、色付きログ出力、フィルタリング機能を備える。

**業務上の目的・背景**：ゲーム開発やツール開発において、実行時にコマンドを入力してデバッグ操作を行うコンソールは広く使用されている。このサンプルは、ImGuiでそのようなコンソールを実装する方法を示し、InputTextのコールバック機能（補完、履歴）の使い方を学べる。

**画面へのアクセス方法**：
1. Demo WindowのメニューバーからExamples→「Console」を選択
2. コード内で直接`ShowExampleAppConsole(&p_open)`を呼び出す

**主要な操作・処理内容**：
1. 入力フィールドにコマンドを入力してEnterで実行
2. TABキーでコマンド補完
3. 上下矢印キーでコマンド履歴を参照
4. Filterテキストボックスでログをフィルタリング
5. Clear/Copyボタンでログ操作

**画面遷移**：
- 遷移元：Demo Window（Examples Menu）
- 遷移先：なし

**権限による表示制御**：なし

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 24 | Begin | 主機能 | コンソールウィンドウの開始 |
| 25 | End | 主機能 | コンソールウィンドウの終了 |
| 120 | InputText | 主機能 | コマンド入力テキストボックス |
| 26 | BeginChild | 主機能 | スクロール可能なログ領域 |
| 27 | EndChild | 主機能 | 子ウィンドウの終了 |
| 141 | Selectable | 補助機能 | 履歴選択可能アイテム |
| 85 | Text | 補助機能 | ログテキストの表示 |
| 86 | TextColored | 補助機能 | 色付きログテキストの表示 |
| 191 | LogToClipboard | 補助機能 | クリップボードへのログ出力 |
| 168 | BeginPopupContextItem | 補助機能 | コンテキストメニューの表示 |

## 画面種別

入力/デバッグ画面

## URL/ルーティング

N/A（Immediate Mode GUIのため、URLやルーティングの概念は適用されない）

## 入出力項目

| 項目名 | 型 | 入力/出力 | 必須 | 説明 |
|--------|-----|----------|------|------|
| p_open | bool* | 入出力 | 必須 | ウィンドウの表示状態を制御するポインタ |

## 表示項目

| 項目名 | 説明 |
|--------|------|
| 説明テキスト | コンソールの使い方説明 |
| Add Debug Text/Errorボタン | テストログ追加ボタン |
| Clearボタン | ログクリアボタン |
| Copyボタン | ログをクリップボードにコピー |
| Optionsボタン | オプションポップアップを開く |
| Filterテキストボックス | ログフィルタリング用 |
| ログ表示エリア | スクロール可能なログ出力領域 |
| 入力フィールド | コマンド入力用InputText |

## イベント仕様

### 1-コマンド実行

入力フィールドにコマンドを入力してEnterキーを押すと、ExecCommand()が呼ばれコマンドが実行される。コマンドは履歴に追加される。

### 2-コマンド補完（TABキー）

入力中にTABキーを押すと、TextEditCallbackのImGuiInputTextFlags_CallbackCompletionが呼ばれ、入力中の文字列に一致するコマンドが補完される。複数候補がある場合は候補一覧が表示される。

### 3-履歴参照（上下矢印キー）

入力中に上下矢印キーを押すと、TextEditCallbackのImGuiInputTextFlags_CallbackHistoryが呼ばれ、過去に実行したコマンドが入力フィールドに展開される。

### 4-ログフィルタリング

Filterテキストボックスに文字列を入力すると、その文字列を含むログ行のみが表示される。

### 5-ログコピー

Copyボタンをクリックすると、LogToClipboard()により表示中のログがクリップボードにコピーされる。

### 6-コンテキストメニュー

タイトルバーを右クリックするとコンテキストメニューが表示され、「Close Console」でウィンドウを閉じられる。スクロール領域内で右クリックするとClearオプションが表示される。

## データベース更新仕様

N/A（Dear ImGuiはUIライブラリであり、データベース操作は行わない）

## メッセージ仕様

| コマンド | 出力 |
|---------|------|
| HELP | コマンド一覧を表示 |
| HISTORY | コマンド履歴（最新10件）を表示 |
| CLEAR | ログをクリア |
| その他 | "Unknown command: 'xxx'" |

## 例外処理

| 状態 | 処理内容 |
|------|----------|
| 補完候補なし | "No match for \"xxx\"!" を表示 |
| 不明なコマンド | "Unknown command: 'xxx'" を表示 |

## 備考

- ExampleAppConsole構造体でコンソールの状態（入力バッファ、履歴、ログ等）を管理
- InputTextのコールバック機能（CallbackCompletion、CallbackHistory）を使用した実装例
- ログは[error]を含む行は赤色、# で始まる行はオレンジ色で表示
- AutoScrollオプションで自動スクロールの有効/無効を切り替え可能
- IMGUI_DISABLE_DEMO_WINDOWSマクロが定義されている場合、この関数は利用不可

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

ExampleAppConsole構造体がコンソールの状態を保持する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_demo.cpp | `imgui_demo.cpp` | ExampleAppConsole構造体（行8848以降）でコンソール状態を定義 |

**読解のコツ**: ExampleAppConsoleはInputBuf、Items（ログ）、Commands、History、HistoryPos、Filter、AutoScroll等のメンバを持つ。

**主要メンバ**:
- **行8850**: InputBuf[256] - 入力バッファ
- **行8851**: Items - ログアイテムのベクター
- **行8852**: Commands - 登録コマンドのベクター
- **行8853**: History - コマンド履歴のベクター
- **行8854**: HistoryPos - 履歴内の現在位置
- **行8855**: Filter - テキストフィルタ
- **行8856-8857**: AutoScroll, ScrollToBottom - スクロール制御

#### Step 2: 描画処理を理解する

Draw関数がコンソールのUIを描画する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui_demo.cpp | `imgui_demo.cpp` | Draw()関数（行8907以降） |

**主要処理フロー**:
1. **行8909-8914**: ウィンドウ開始とタイトルバーコンテキストメニュー
2. **行8926-8941**: 説明テキストとデバッグボタン
3. **行8944-8957**: オプションとフィルタ
4. **行8961-9023**: ログ表示領域（BeginChild）
5. **行9028-9044**: 入力フィールド（InputText with callback）

#### Step 3: コマンド実行を理解する

ExecCommand関数がコマンドを処理する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui_demo.cpp | `imgui_demo.cpp` | ExecCommand()関数（行9048以降） |

**主要処理フロー**:
1. **行9050-9062**: 履歴への追加（重複削除）
2. **行9064-9084**: コマンド処理（CLEAR、HELP、HISTORY、その他）

#### Step 4: コールバック処理を理解する

TextEditCallback関数が補完と履歴を処理する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | imgui_demo.cpp | `imgui_demo.cpp` | TextEditCallback()関数（行9097以降） |

**主要処理フロー**:
1. **行9102-9166**: CallbackCompletion - TAB補完処理
2. **行9168-9192**: CallbackHistory - 履歴参照処理

### プログラム呼び出し階層図

```
ShowExampleAppConsole(bool* p_open)
    |
    +-- static ExampleAppConsole console
    +-- console.Draw("Example: Console", p_open)
            |
            +-- ImGui::Begin("Example: Console", p_open)
            |       |
            |       +-- BeginPopupContextItem()  [タイトルバー右クリック]
            |       |
            |       +-- TextWrapped() [説明]
            |       +-- SmallButton("Add Debug Text/Error/Clear/Copy")
            |       |
            |       +-- Button("Options")
            |       |       +-- OpenPopup("Options")
            |       +-- Filter.Draw("Filter")
            |       |
            |       +-- BeginChild("ScrollingRegion")
            |       |       +-- BeginPopupContextWindow() [右クリックメニュー]
            |       |       +-- [各ログアイテム表示]
            |       |       |       +-- Filter.PassFilter()
            |       |       |       +-- PushStyleColor() [色付き]
            |       |       |       +-- TextUnformatted()
            |       |       +-- SetScrollHereY() [自動スクロール]
            |       +-- EndChild()
            |       |
            |       +-- InputText("Input", ..., TextEditCallbackStub)
            |               |
            |               +-- TextEditCallback()
            |                       +-- [CallbackCompletion]
            |                       |       +-- 候補検索
            |                       |       +-- DeleteChars/InsertChars
            |                       +-- [CallbackHistory]
            |                               +-- History参照
            |                               +-- DeleteChars/InsertChars
            |
            +-- ImGui::End()
```

### データフロー図

```
[入力]                        [処理]                         [出力]

p_open (bool*)  ─────────▶ ShowExampleAppConsole() ────────▶  ウィンドウ描画
                                  |
コマンド入力    ─────────▶       |
(InputText)                       |
        |                         |
        ▼                         |
TextEditCallback() ◀──────       |
        |                         |
        +── TAB ───▶ 補完処理    |
        |                         |
        +── UP/DOWN ▶ 履歴参照   |
                                  |
ExecCommand() ◀──────────       |  ◀──── Enter押下
        |                         |
        ▼                         |
Items[] (ログ) ◀─────────────    |
        |                         |
        ▼                         |
ログ表示  ──────────────────────▶|
(TextUnformatted)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui_demo.cpp | `imgui_demo.cpp` | ソース | ExampleAppConsole構造体とShowExampleAppConsole()の実装 |
| imgui.h | `imgui.h` | ヘッダー | InputText()、ImGuiInputTextCallbackData等のAPI宣言 |
