# 機能設計書 18-ShowStyleSelector

## 概要

本ドキュメントは、Dear ImGuiライブラリにおけるShowStyleSelector関数の機能設計を記載する。この関数はデフォルトスタイルを選択するためのコンボボックスを提供する。

### 本機能の処理概要

ShowStyleSelector関数は、Dear ImGuiが提供する3つのデフォルトスタイル（Dark、Light、Classic）から1つを選択するためのコンボボックスを追加する。この関数自体はウィンドウを作成しないため、呼び出し側でウィンドウまたは他のコンテナ内で使用する必要がある。スタイルを選択すると、対応するStyleColorsXXX関数が自動的に呼び出され、UIの外観が即座に変更される。

**業務上の目的・背景**：アプリケーションのスタイルを切り替えることは、ユーザーの好みや使用環境（明るい場所/暗い場所）に対応するために重要である。ShowStyleSelectorは、シンプルなコンボボックスで3つの標準スタイルを切り替える機能を提供し、開発者が最小限のコードでスタイル切り替え機能を実装できるようにする。

**機能の利用シーン**：
- アプリケーションの設定画面でスタイルを選択する際
- ShowStyleEditor内でスタイルの基本形を選択する際
- デモやプロトタイプでスタイル比較を行う際

**主要な処理内容**：
1. 現在選択されているスタイルを表示するコンボボックスの作成
2. Dark、Light、Classicの3つの選択肢の提供
3. 選択時に対応するStyleColorsXXX関数を呼び出し
4. 選択が変更された場合にtrueを返却

**関連システム・外部連携**：
- StyleColorsDark（ダークスタイルの適用）
- StyleColorsLight（ライトスタイルの適用）
- StyleColorsClassic（クラシックスタイルの適用）
- ShowStyleEditor（スタイルエディタ内で使用）

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | Style Editor | 使用箇所 | Generalセクションで使用 |

## 機能種別

UI部品 / セレクタ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| label | const char* | Yes | コンボボックスのラベル文字列 | NULL不可 |

### 入力データソース

- static変数（style_idx）による選択状態の保持

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | bool | スタイルが変更された場合true、それ以外はfalse |

### 出力先

- ImGuiウィジェットとして描画（コンボボックス）
- ImGuiStyle（スタイル変更時）

## 処理フロー

### 処理シーケンス

```
1. コンボボックスの表示
   └─ BeginCombo(label, 現在のスタイル名)
2. 各スタイルの選択肢を表示
   └─ Selectable("Dark") / "Light" / "Classic"
3. 選択時の処理
   └─ StyleColorsDark() / StyleColorsLight() / StyleColorsClassic()
4. 結果の返却
   └─ 選択変更時にtrueを返却
```

### フローチャート

```mermaid
flowchart TD
    A[ShowStyleSelector呼び出し] --> B[BeginCombo]
    B --> C{コンボ展開?}
    C -->|No| D[falseを返却]
    C -->|Yes| E[スタイル選択肢を表示]
    E --> F{選択された?}
    F -->|No| G[EndCombo]
    F -->|Yes| H{どのスタイル?}
    H -->|Dark| I[StyleColorsDark]
    H -->|Light| J[StyleColorsLight]
    H -->|Classic| K[StyleColorsClassic]
    I --> L[ret = true]
    J --> L
    K --> L
    L --> G
    G --> M[結果を返却]
    D --> N[終了]
    M --> N
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | ブロック形式 | この関数はウィンドウを作成しない | 常時 |
| BR-02 | 状態保持 | 選択状態はstatic変数で保持される | 常時 |
| BR-03 | 即時適用 | 選択と同時にスタイルが適用される | 選択時 |
| BR-04 | SelectOnNav | ナビゲーションで選択しても即座に適用 | キーボードナビゲーション時 |

### 計算ロジック

該当なし（単純な選択処理）

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | - | エラーなし |

### リトライ仕様

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

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

該当なし

## パフォーマンス要件

- コンボボックスの展開時のみ選択肢を処理

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

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

## 備考

- IMGUI_DISABLE_DEMO_WINDOWSが定義されている場合、空の関数となりfalseを返す
- スタイル関数は名前を登録しないため、アクティブなスタイルを追跡するのは難しい（コメントより）
- ImGuiSelectableFlags_SelectOnNavを使用してナビゲーション時も即座に適用

---

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

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

### 推奨読解順序

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

スタイル切り替えに関連するデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | ImGuiStyle構造体 |
| 1-2 | imgui.h | `imgui.h` | StyleColorsDark/Light/Classic関数宣言（418-421行目） |

**読解のコツ**: StyleColorsXXX関数はImGuiStyleのColors配列を初期化する。ShowStyleSelectorはこれらの関数を呼び出す単純なラッパー。

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

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

**主要処理フロー**:
1. **8315行目**: static int style_idx = -1（選択状態の保持）
2. **8316行目**: style_names配列の定義
3. **8318行目**: BeginCombo呼び出し
4. **8320-8335行目**: 各スタイルのSelectable処理
5. **8338行目**: 結果の返却

#### Step 3: スタイル適用関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | StyleColorsDark関数の実装 |
| 3-2 | imgui.cpp | `imgui.cpp` | StyleColorsLight関数の実装 |
| 3-3 | imgui.cpp | `imgui.cpp` | StyleColorsClassic関数の実装 |

**主要処理フロー**:
- 各関数はColors配列の各要素を設定

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

```
ShowStyleSelector(label)
    │
    ├─ BeginCombo(label, 現在のスタイル名)
    │
    ├─ for each スタイル名
    │      │
    │      └─ Selectable(style_names[n], selected, SelectOnNav)
    │             │
    │             └─ [選択時] switch(style_idx)
    │                    ├─ case 0: StyleColorsDark()
    │                    ├─ case 1: StyleColorsLight()
    │                    └─ case 2: StyleColorsClassic()
    │
    └─ EndCombo()
```

### データフロー図

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

label (文字列)       ShowStyleSelector()            bool (変更有無)
    │                      │                              │
    │                      ├─ BeginCombo                  │
    │                      │                              │
static style_idx           ├─ Selectable                  │
    │                      │                              │
    └─ 現在の選択 ─────────┴─ 選択時にStyleColorsXXX() ───▶ ImGuiStyle
                                                          Colors[]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | ShowStyleSelector宣言（413行目） |
| imgui_demo.cpp | `imgui_demo.cpp` | ソース | ShowStyleSelector実装（8311-8339行目） |
| imgui.cpp | `imgui.cpp` | ソース | StyleColorsDark/Light/Classic実装 |
