# 画面設計書 1-Demo Window

## 概要

Dear ImGuiの全機能をデモンストレーションするメインウィンドウの設計書である。本画面はDear ImGuiライブラリのサンプルコードおよびリファレンスとして機能し、開発者がライブラリの使い方を学習するための包括的なガイドとなる。

### 本画面の処理概要

Demo Windowは、Dear ImGuiライブラリが提供するすべてのウィジェット、レイアウト機能、テーブル、入力処理などを実際に動作するサンプルとして示すウィンドウである。

**業務上の目的・背景**：Dear ImGuiを導入する開発者が、ライブラリの機能を把握し、実際のコードをコピー＆ペーストして自身のプロジェクトに組み込めるようにするため、このデモウィンドウが用意されている。開発者はこのウィンドウを通じて、ウィジェットの使い方、レイアウトの組み方、イベント処理の方法などを学習できる。プロジェクトから削除せずに常に参照可能な状態にしておくことが推奨されている。

**画面へのアクセス方法**：アプリケーションのmain関数またはメインループ内で`ImGui::ShowDemoWindow()`を呼び出すことで表示される。多くのサンプルアプリケーションではデフォルトで呼び出されている。

**主要な操作・処理内容**：
1. メニューバーからExamplesサブメニューを選択し、各種サンプルアプリケーションを開く
2. メニューバーからToolsサブメニューを選択し、デバッグツール（Metrics、Debug Log、Style Editorなど）を開く
3. CollapsingHeaderをクリックして各セクション（Help、Configuration、Widgets、Layout、Popups、Tables、Inputs）を展開・折りたたみする
4. 各ウィジェットを操作してImGuiの動作を確認する

**画面遷移**：
- 遷移元：アプリケーションのメインループから直接呼び出し
- 遷移先：Examples Menu経由でConsole、Log、Simple Layout、Property Editor、Long Text等のサンプルアプリを開く。Tools Menu経由でMetrics/Debugger、Debug Log、ID Stack Tool、Style Editor、About Windowを開く

**権限による表示制御**：なし（デバッグ/開発用途のため権限制御は不要）

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 12 | ShowDemoWindow | 主機能 | Demo Windowの表示・制御を行うメイン関数 |
| 24 | Begin | 主機能 | ウィンドウの開始処理 |
| 25 | End | 主機能 | ウィンドウの終了処理 |
| 150 | BeginMenuBar | 主機能 | メニューバーの開始 |
| 151 | EndMenuBar | 主機能 | メニューバーの終了 |
| 139 | CollapsingHeader | 主機能 | 各セクションの折りたたみヘッダー |
| 135 | TreeNode | 主機能 | ツリーノードによるセクション階層表示 |
| 92 | Button | 補助機能 | 各種ボタンウィジェットの表示 |
| 96 | Checkbox | 補助機能 | 各種チェックボックスの表示 |
| 112 | SliderFloat | 補助機能 | 各種スライダーの表示 |
| 120 | InputText | 補助機能 | テキスト入力ボックスの表示 |
| 20 | ShowUserGuide | 遷移先機能 | ユーザーガイドの表示 |

## 画面種別

デモ/リファレンス画面

## URL/ルーティング

N/A（Immediate Mode GUIのため、URLやルーティングの概念は適用されない。関数呼び出しによる表示制御）

## 入出力項目

| 項目名 | 型 | 入力/出力 | 必須 | 説明 |
|--------|-----|----------|------|------|
| p_open | bool* | 入出力 | 任意 | ウィンドウの表示状態を制御するポインタ。NULLの場合は閉じるボタンが表示されない |

## 表示項目

| 項目名 | 説明 |
|--------|------|
| バージョン情報テキスト | Dear ImGuiのバージョン番号を表示 |
| メニューバー | ExamplesとToolsのサブメニューを含むメニューバー |
| Helpセクション | ライブラリの基本的な使い方とプログラマガイドへのリンク |
| Configurationセクション | io.ConfigFlags等の設定オプション |
| Widgetsセクション | Button, Checkbox, Slider等の各種ウィジェットデモ |
| Layoutセクション | ウィンドウレイアウトのデモ |
| Popupsセクション | ポップアップとモーダルのデモ |
| Tablesセクション | テーブル機能のデモ |
| Inputsセクション | キーボード・マウス入力のデモ |

## イベント仕様

### 1-ウィンドウフラグ変更

ウィンドウフラグ（NoTitleBar、NoScrollbar、NoMenu等）のチェックボックスを操作すると、Demo Window自体のウィンドウフラグが動的に変更され、即座に外観や動作に反映される。

### 2-Examplesメニュー選択

Examplesメニューからサンプルアプリを選択すると、対応するboolフラグがtrueに設定され、次のフレームから該当サンプルアプリのウィンドウが表示される。

### 3-Toolsメニュー選択

Toolsメニューからツールを選択すると、対応するboolフラグがtrueに設定され、デバッグツールウィンドウが表示される。

### 4-セクション展開/折りたたみ

CollapsingHeaderをクリックすると、対応するセクションが展開または折りたたまれる。状態はImGuiの内部ストレージに保存される。

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

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

## メッセージ仕様

N/A（システムメッセージやエラーメッセージは本画面では表示されない）

## 例外処理

| 状態 | 処理内容 |
|------|----------|
| コンテキスト未初期化 | IM_ASSERTでアサーションエラーを発生 |
| ウィンドウ折りたたみ状態 | Begin()がfalseを返し、End()のみ呼び出して早期リターン |

## 備考

- Dear ImGuiはImmediate Mode GUIパラダイムを採用しており、毎フレームUI全体を再構築する
- Demo Windowのソースコード（imgui_demo.cpp）は、コピー＆ペースト可能なサンプルコードとして設計されている
- プロジェクトからimgui_demo.cppを削除することは推奨されない
- ウィンドウの表示/非表示はbool変数で制御される

---

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

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

### 推奨読解順序

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

Demo Windowの状態を保持する構造体を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_demo.cpp | `imgui_demo.cpp` | ImGuiDemoWindowData構造体（行306-336）でサンプルアプリとツールの表示状態を管理 |

**読解のコツ**: ImGuiDemoWindowData構造体内のbool変数（ShowMainMenuBar、ShowAppConsole等）は、各サンプルアプリの表示状態を制御する。trueになると対応するウィンドウが表示される。

#### Step 2: エントリーポイントを理解する

ShowDemoWindow関数がDemo Windowの描画処理のエントリーポイント。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui_demo.cpp | `imgui_demo.cpp` | ShowDemoWindow()関数（行341-以降）がメインのエントリーポイント |

**主要処理フロー**:
1. **行343-348**: コンテキスト検証とバージョンチェック
2. **行351**: static変数でImGuiDemoWindowDataを保持
3. **行354-379**: サンプルアプリとツールウィンドウの条件付き表示
4. **行381-405**: ウィンドウフラグの設定
5. **行409-419**: ウィンドウの開始（Begin）と早期リターン処理
6. **行436**: DemoWindowMenuBar呼び出しでメニューバー描画
7. **行441-462**: Helpセクションの描画
8. **行464-**: Configurationセクション以降の描画

#### Step 3: メニューバー処理を理解する

Demo Windowのメニューバーはサンプルアプリとツールへのアクセスを提供する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui_demo.cpp | `imgui_demo.cpp` | DemoWindowMenuBar()関数（行668-以降）でメニュー構築 |

**主要処理フロー**:
- **行668-**: BeginMenuBar()でメニューバー開始
- **行675-**: "Examples"メニューでサンプルアプリの表示切替
- **行718-**: "Tools"メニューでデバッグツールの表示切替

#### Step 4: 各デモセクションを理解する

ウィジェット、レイアウト等の各セクションは専用関数で実装されている。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | imgui_demo.cpp | `imgui_demo.cpp` | DemoWindowWidgets()関数でウィジェットデモを描画 |
| 4-2 | imgui_demo.cpp | `imgui_demo.cpp` | DemoWindowLayout()関数でレイアウトデモを描画 |
| 4-3 | imgui_demo.cpp | `imgui_demo.cpp` | DemoWindowPopups()関数でポップアップデモを描画 |
| 4-4 | imgui_demo.cpp | `imgui_demo.cpp` | DemoWindowTables()関数でテーブルデモを描画 |
| 4-5 | imgui_demo.cpp | `imgui_demo.cpp` | DemoWindowInputs()関数で入力デモを描画 |

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

```
ImGui::ShowDemoWindow(bool* p_open)
    |
    +-- ShowExampleAppMainMenuBar()  [条件付き]
    +-- ShowExampleAppConsole()      [条件付き]
    +-- ShowExampleAppLog()          [条件付き]
    +-- ...その他サンプルアプリ      [条件付き]
    |
    +-- ImGui::ShowMetricsWindow()   [条件付き]
    +-- ImGui::ShowDebugLogWindow()  [条件付き]
    +-- ImGui::ShowIDStackToolWindow() [条件付き]
    +-- ImGui::ShowAboutWindow()     [条件付き]
    +-- ImGui::ShowStyleEditor()     [条件付き]
    |
    +-- ImGui::Begin("Dear ImGui Demo", p_open, window_flags)
    |       |
    |       +-- DemoWindowMenuBar(&demo_data)
    |       |       |
    |       |       +-- ImGui::BeginMenuBar()
    |       |       +-- ImGui::BeginMenu("Examples")
    |       |       +-- ImGui::MenuItem() [複数]
    |       |       +-- ImGui::EndMenuBar()
    |       |
    |       +-- ImGui::CollapsingHeader("Help")
    |       |       +-- ImGui::ShowUserGuide()
    |       |
    |       +-- ImGui::CollapsingHeader("Configuration")
    |       +-- DemoWindowWidgets(&demo_data)
    |       +-- DemoWindowLayout()
    |       +-- DemoWindowPopups()
    |       +-- DemoWindowTables()
    |       +-- DemoWindowInputs()
    |
    +-- ImGui::End()
```

### データフロー図

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

p_open (bool*)  ─────────▶ ShowDemoWindow() ─────────▶  ウィンドウ描画コマンド
                                  |                         (ImDrawList)
ユーザー操作    ─────────▶       |
(マウス/キーボード)              |
                                  |
ImGuiDemoWindowData ◀───▶        |
(内部状態)                        |
                                  ▼
                           サンプルアプリ/ツール
                           の表示状態更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui_demo.cpp | `imgui_demo.cpp` | ソース | Demo Windowの実装本体。全デモコードを含む |
| imgui.h | `imgui.h` | ヘッダー | ShowDemoWindow()等の公開API宣言 |
| imgui.cpp | `imgui.cpp` | ソース | ImGuiコア実装。ShowDemoWindowから呼ばれる各種関数の実装 |
| imgui_internal.h | `imgui_internal.h` | ヘッダー | 内部API宣言（デモコードでは直接使用しない） |
