# 機能設計書 104-EndCombo

## 概要

本ドキュメントは、ImGuiライブラリにおける`EndCombo`関数の機能設計を記載する。

### 本機能の処理概要

`EndCombo`関数は、`BeginCombo`で開始されたコンボボックスウィジェットを終了する関数である。ポップアップウィンドウのクローズ処理とネスト管理のクリーンアップを行い、BeginCombo/EndComboペアの整合性を維持する。

**業務上の目的・背景**：ImGuiのスタック型アーキテクチャでは、Begin系関数とEnd系関数のペアで状態管理を行う。EndComboはBeginComboと対になる関数として、コンボボックスのポップアップウィンドウを正しく終了させ、内部状態をクリーンアップする役割を担う。BeginComboがtrueを返した場合は必ずEndComboを呼び出す必要があり、呼び出しを忘れるとスタック不整合やリソースリークの原因となる。

**機能の利用シーン**：
- BeginComboがtrueを返した後の必須呼び出し
- コンボボックスのアイテム選択処理後
- カスタムドロップダウンメニューの終了時

**主要な処理内容**：
1. BeginComboDepthをデクリメント
2. 現在のウィンドウ名が期待値と一致するか検証
3. EndPopupを呼び出してポップアップを終了

**関連システム・外部連携**：
- ポップアップシステム: EndPopup
- ウィンドウシステム: CurrentWindow
- デバッグシステム: IM_ASSERT_USER_ERROR_RET

**権限による制御**：特になし（GUI描画機能のため）

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | Style Editor | 補助機能 | コンボボックスの終了 |
| 16 | Constrained Resize | 補助機能 | コンボボックスの終了 |
| 23 | Widgets | 主機能 | コンボボックスのデモ |

## 機能種別

ウィジェット終了処理 / ポップアップ制御

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | パラメータなし | - |

### 入力データソース

- ImGuiContext（BeginComboDepth、CurrentWindow）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | void | なし |

### 出力先

- ImGuiContext（BeginComboDepthのデクリメント）
- ポップアップスタック（EndPopupによるクローズ）

## 処理フロー

### 処理シーケンス

```
1. BeginComboDepthをデクリメント
   └─ g.BeginComboDepth--
2. ウィンドウ名検証
   └─ "##Combo_XX"形式の名前を生成
   └─ 現在のウィンドウ名と比較
3. 検証結果処理
   └─ 不一致の場合: IM_ASSERT_USER_ERROR_RETでエラー
4. ポップアップ終了
   └─ EndPopup()を呼び出し
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[BeginComboDepth--]
    B --> C[ウィンドウ名生成]
    C --> D{名前が一致?}
    D -->|No| E[ASSERT_USER_ERROR]
    E --> F[return]
    D -->|Yes| G[EndPopup]
    G --> H[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-104-1 | 呼び出し条件 | BeginComboがtrueを返した場合のみ呼び出す | 常時 |
| BR-104-2 | ウィンドウ名検証 | 現在のウィンドウが##Combo_XX形式であることを確認 | 常時 |
| BR-104-3 | ネスト整合性 | BeginComboDepthはBeginComboと対で管理 | 常時 |

### 計算ロジック

ウィンドウ名生成:
```cpp
char name[16];
ImFormatString(name, IM_COUNTOF(name), "##Combo_%02d", g.BeginComboDepth);
```

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

該当なし（GUI描画機能のためデータベース操作は行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ユーザーエラー | 不正なウィンドウでEndCombo呼び出し | アサートで警告、処理中断 |

### リトライ仕様

リトライなし（フレーム単位の描画処理のため）

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

該当なし

## パフォーマンス要件

- EndPopupの呼び出しオーバーヘッドのみ
- 文字列比較はデバッグ用途

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

- 特になし（GUI描画機能のため）

## 備考

- BeginComboがfalseを返した場合はEndComboを呼び出してはならない
- ウィンドウ名検証はデバッグモードでのみ意味を持つ
- BeginComboDepthは最大16段のネストをサポート

---

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

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

### 推奨読解順序

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

まず、コンボボックスのネスト管理に関する構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_internal.h | `imgui_internal.h` | ImGuiContext構造体のBeginComboDepthメンバ |

**読解のコツ**: BeginComboDepthはコンボボックスのネスト階層を管理し、ウィンドウ名の生成に使用される。

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

処理の起点となる関数を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.h | `imgui.h` | 660行目: EndCombo関数の宣言とコメント |
| 2-2 | imgui_widgets.cpp | `imgui_widgets.cpp` | 2049-2058行目: EndCombo関数の実装 |

**主要処理フロー**:
1. **2052行目**: BeginComboDepthをデクリメント
2. **2053-2054行目**: ウィンドウ名を生成
3. **2055-2056行目**: 現在のウィンドウ名と比較、不一致でアサート
4. **2057行目**: EndPopupを呼び出し

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

```
ImGui::EndCombo()
    │
    ├─ g.BeginComboDepth--
    │
    ├─ ImFormatString()
    │      └─ "##Combo_%02d"形式で名前生成
    │
    ├─ strcmp()
    │      └─ 現在のウィンドウ名と比較
    │
    ├─ IM_ASSERT_USER_ERROR_RET() ... 不一致時
    │
    └─ EndPopup()
           └─ ポップアップウィンドウを終了
```

### データフロー図

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

なし        ────────▶ EndCombo()
                         │
g.BeginComboDepth ─────▶│───────▶ BeginComboDepth--
                         │
g.CurrentWindow ───────▶│───────▶ ウィンドウ名検証
                         │
                         ▼
                    EndPopup()  ────▶ ポップアップクローズ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | 関数宣言 |
| imgui_widgets.cpp | `imgui_widgets.cpp` | ソース | EndCombo実装 |
| imgui_internal.h | `imgui_internal.h` | ヘッダー | ImGuiContext, BeginComboDepth |
