# 機能設計書 12-ShowDemoWindow

## 概要

本ドキュメントは、Dear ImGuiライブラリにおけるShowDemoWindow関数の機能設計を記載する。この関数はImGuiの機能を網羅的に紹介するデモウィンドウを表示し、ライブラリの学習に最適なリファレンス実装を提供する。

### 本機能の処理概要

ShowDemoWindow関数は、Dear ImGuiが提供するほぼすべてのウィジェットと機能をインタラクティブに体験できるデモウィンドウを作成・表示する。このウィンドウには、基本的なウィジェット、レイアウト、入力処理、テーブル、描画機能など、ImGuiの主要機能がカテゴリ別に整理されて実装されている。開発者はこのデモウィンドウのソースコード（imgui_demo.cpp）を参照することで、各機能の実装方法を学習できる。

**業務上の目的・背景**：GUIライブラリを初めて使用する開発者にとって、各APIの使用方法を理解することは困難な場合がある。ShowDemoWindowは「動作するサンプルコード」として機能し、開発者がImGuiの各機能を視覚的に確認しながら、対応するソースコードを参照できる環境を提供する。これにより、学習コストを大幅に削減し、生産性を向上させる。

**機能の利用シーン**：
- ImGuiを初めて使用する際の学習ツールとして
- 特定のウィジェットの実装方法を調べる際のリファレンスとして
- アプリケーション開発中のデバッグ・検証用として
- ImGuiの設定オプションを対話的に調整する際に

**主要な処理内容**：
1. デモウィンドウのメインフレームを作成
2. メニューバーから各種サンプルアプリケーションやツールへのアクセスを提供
3. CollapsingHeaderで整理された各セクション（Help、Configuration、Window options、Widgets、Layout、Popups等）を表示
4. 内部的にShowMetricsWindow、ShowDebugLogWindow、ShowIDStackToolWindow、ShowAboutWindow等を呼び出し可能
5. 各ウィジェットの動作デモとインタラクティブな設定変更機能を提供

**関連システム・外部連携**：
- ShowMetricsWindow（メトリクス/デバッガウィンドウ）
- ShowDebugLogWindow（デバッグログウィンドウ）
- ShowIDStackToolWindow（IDスタックツールウィンドウ）
- ShowAboutWindow（Aboutウィンドウ）
- ShowStyleEditor（スタイルエディタ）

**権限による制御**：本機能に権限制御はない。ただし、IMGUI_DISABLE_DEMO_WINDOWSが定義されている場合は空の関数となる。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | Demo Window | 主画面 | Demo Windowの表示・制御を行うメイン関数 |
| 2 | Metrics/Debugger Window | 遷移先画面 | Toolsメニューから遷移可能 |
| 3 | Debug Log Window | 遷移先画面 | Toolsメニューから遷移可能 |
| 4 | ID Stack Tool Window | 遷移先画面 | Toolsメニューから遷移可能 |
| 5 | About Window | 遷移先画面 | Toolsメニューから遷移可能 |
| 6 | Style Editor | 遷移先画面 | Toolsメニューから遷移可能 |
| 7 | User Guide | 参照画面 | Helpセクション内で表示 |

## 機能種別

デモ・サンプル表示 / インタラクティブリファレンス

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| p_open | bool* | No | ウィンドウの開閉状態を制御するポインタ。NULLの場合は閉じるボタンなし | NULL許容 |

### 入力データソース

- ImGuiContext（現在のコンテキスト）
- static変数による状態管理（ImGuiDemoWindowData demo_data）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | void | 戻り値なし |
| *p_open | bool | ユーザーがウィンドウを閉じた場合falseに設定 |

### 出力先

- ImGuiウィンドウとして画面に描画
- 関連ウィンドウ（Metrics、DebugLog等）の表示状態を更新

## 処理フロー

### 処理シーケンス

```
1. 前提条件の確認
   └─ コンテキストとバージョン互換性のチェック（IM_ASSERT、IMGUI_CHECKVERSION）
2. 関連ウィンドウの表示
   └─ demo_dataのフラグに基づき、各種サンプルアプリケーションとツールウィンドウを表示
3. ウィンドウフラグの設定
   └─ チェックボックスの状態に基づきImGuiWindowFlagsを構築
4. メインウィンドウの開始
   └─ Begin("Dear ImGui Demo", p_open, window_flags)
5. 各セクションの描画
   └─ CollapsingHeaderで各カテゴリを折りたたみ表示
6. ウィンドウの終了
   └─ End()
```

### フローチャート

```mermaid
flowchart TD
    A[ShowDemoWindow呼び出し] --> B[コンテキスト・バージョン確認]
    B --> C[関連ウィンドウの表示判定]
    C --> D[ShowMetricsWindow等の呼び出し]
    D --> E[ウィンドウフラグの構築]
    E --> F[Begin - メインウィンドウ開始]
    F --> G{ウィンドウ可視?}
    G -->|No| H[End - 早期リターン]
    G -->|Yes| I[メニューバー描画]
    I --> J[Helpセクション]
    J --> K[Configurationセクション]
    K --> L[その他セクション...]
    L --> M[End]
    H --> N[終了]
    M --> N
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | コンテキスト必須 | ImGuiコンテキストが存在しない場合はassert | 常時 |
| BR-02 | バージョン互換性 | 呼び出し側とリンク側のバージョンが一致すること | 常時 |
| BR-03 | 折りたたみ時の最適化 | ウィンドウが折りたたまれている場合は内部処理をスキップ | Begin戻り値false時 |
| BR-04 | p_open制御 | no_closeフラグがtrueの場合、p_openにNULLを渡す | チェックボックス設定時 |

### 計算ロジック

該当なし（UI表示のみ）

## データベース操作仕様

該当なし（インメモリ動作）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| IM_ASSERT | コンテキストなし | ImGui::CreateContext()が呼ばれていない | コンテキストを作成後に呼び出す |
| IMGUI_CHECKVERSION | バージョン不一致 | ヘッダーとライブラリのバージョン不一致 | 同一バージョンで再ビルド |

### リトライ仕様

該当なし（毎フレーム呼び出し）

## トランザクション仕様

該当なし

## パフォーマンス要件

- ウィンドウが折りたたまれている場合は早期リターンで処理を最適化
- 各セクションはCollapsingHeaderで遅延描画

## セキュリティ考慮事項

該当なし（ローカルUI表示のみ）

## 備考

- IMGUI_DISABLE_DEMO_WINDOWSが定義されている場合、空の関数となる
- imgui_demo.cppは約10,000行以上のソースコードであり、ImGuiの使用例の宝庫
- IMGUI_DEMO_MARKERマクロでコード内の位置を識別可能

---

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

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

### 推奨読解順序

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

デモウィンドウの状態を管理するImGuiDemoWindowData構造体を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_demo.cpp | `imgui_demo.cpp` | ImGuiDemoWindowData構造体（ファイル先頭付近） |

**読解のコツ**: demo_dataは各サンプルアプリケーションやツールウィンドウの表示状態を管理するstatic変数。ShowXXXフラグで各ウィンドウの表示・非表示を制御。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.h | `imgui.h` | ShowDemoWindow関数の宣言（407行目） |
| 2-2 | imgui_demo.cpp | `imgui_demo.cpp` | ShowDemoWindow関数の実装（341行目〜） |

**主要処理フロー**:
1. **343-348行目**: コンテキストとバージョンの確認
2. **351行目**: static ImGuiDemoWindowData demo_dataの宣言
3. **354-379行目**: 関連ウィンドウの条件付き表示
4. **394-404行目**: ウィンドウフラグの構築
5. **414-419行目**: Begin呼び出しと早期リターン処理
6. **436行目**: メニューバーの描画（DemoWindowMenuBar）
7. **441-462行目**: Helpセクション（ShowUserGuide呼び出し含む）

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui_demo.cpp | `imgui_demo.cpp` | DemoWindowMenuBar関数（約200行目付近） |

**主要処理フロー**:
- Examplesメニュー: 各種サンプルアプリケーションへのアクセス
- Toolsメニュー: Metrics、DebugLog、IDStackTool、About、StyleEditorへのアクセス

#### Step 4: 各セクションの構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | imgui_demo.cpp | `imgui_demo.cpp` | Widgetsセクション |
| 4-2 | imgui_demo.cpp | `imgui_demo.cpp` | Layoutセクション |
| 4-3 | imgui_demo.cpp | `imgui_demo.cpp` | Tablesセクション |

**読解のコツ**: 各セクションはCollapsingHeaderで囲まれており、IMGUI_DEMO_MARKERマクロでコード位置を示している。このマーカーはTest Engine連携に使用される。

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

```
ShowDemoWindow()
    │
    ├─ IMGUI_CHECKVERSION()
    │
    ├─ [条件付き] ShowMetricsWindow()
    ├─ [条件付き] ShowDebugLogWindow()
    ├─ [条件付き] ShowIDStackToolWindow()
    ├─ [条件付き] ShowAboutWindow()
    ├─ [条件付き] ShowStyleEditor()
    │
    ├─ Begin("Dear ImGui Demo")
    │      │
    │      ├─ DemoWindowMenuBar()
    │      │      ├─ BeginMenuBar()
    │      │      ├─ BeginMenu("Examples")
    │      │      ├─ BeginMenu("Tools")
    │      │      └─ EndMenuBar()
    │      │
    │      ├─ CollapsingHeader("Help")
    │      │      └─ ShowUserGuide()
    │      │
    │      ├─ CollapsingHeader("Configuration")
    │      ├─ CollapsingHeader("Window options")
    │      ├─ CollapsingHeader("Widgets")
    │      ├─ CollapsingHeader("Layout")
    │      ├─ CollapsingHeader("Tables")
    │      └─ ...その他セクション
    │
    └─ End()
```

### データフロー図

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

p_open (bool*)       ShowDemoWindow()               Demo Window描画
    │                      │                              │
    │                      ├─ ウィンドウフラグ構築         │
    │                      ├─ 各セクション描画            │
    │                      └─ ユーザー操作処理            │
    │                                                     │
    └──────────────────────────────────────────────────────┘
                         閉じるボタン押下時
                         *p_open = false
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | ShowDemoWindow宣言（407行目） |
| imgui_demo.cpp | `imgui_demo.cpp` | ソース | ShowDemoWindow実装（341-10935行目） |
| imgui.cpp | `imgui.cpp` | ソース | ShowMetricsWindow等の実装 |
| examples/example_glfw_opengl3/main.cpp | `examples/example_glfw_opengl3/main.cpp` | サンプル | ShowDemoWindowの呼び出し例 |
