# 機能設計書 146-EndListBox

## 概要

本ドキュメントは、Dear ImGuiライブラリにおけるEndListBox関数の機能設計を記述する。EndListBoxはBeginListBoxで開始されたリストボックス領域を終了する関数である。

### 本機能の処理概要

EndListBox関数は、BeginListBoxで開始されたリストボックススコープを終了し、内部的に作成された子ウィンドウとグループをクローズする。非常にシンプルな関数で、EndChildとEndGroupを順に呼び出す。

**業務上の目的・背景**：BeginListBoxで開始されたリストボックス領域を正しく終了し、レイアウトスタックを適切に維持する。グループの終了により、リストボックス全体に対してIsItemXXXクエリを行うことが可能になる。

**機能の利用シーン**：
- BeginListBoxがtrueを返した後の終了処理
- リストボックス内のアイテム追加完了後
- レイアウトスタックの整合性維持

**主要な処理内容**：
1. 子ウィンドウフラグの検証（アサーション）
2. EndChildの呼び出し
3. EndGroupの呼び出し

**関連システム・外部連携**：BeginListBoxとペアで使用する必要がある。

**権限による制御**：特になし。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 23 | Widgets | 補助機能 | リストボックスのデモ |

## 機能種別

スコープ終了 / クリーンアップ

## 入力仕様

### 入力パラメータ

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

### 入力データソース

- グローバルコンテキスト（g.CurrentWindow）からの現在のウィンドウ状態

## 出力仕様

### 出力データ

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

### 出力先

- 内部状態のクリーンアップ（子ウィンドウとグループの終了）

## 処理フロー

### 処理シーケンス

```
1. 状態検証
   └─ 現在のウィンドウが子ウィンドウであることを確認（アサーション）

2. EndChildの呼び出し
   └─ BeginListBoxで作成された子ウィンドウを終了

3. EndGroupの呼び出し
   └─ BeginListBoxで開始されたグループを終了
   └─ これによりリストボックス全体でIsItemXXXクエリが可能に
```

### フローチャート

```mermaid
flowchart TD
    A[EndListBox開始] --> B[子ウィンドウフラグ確認]
    B --> C[EndChild]
    C --> D[EndGroup]
    D --> E[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-146-01 | ペア呼び出し | BeginListBoxがtrueを返した場合のみ呼び出す | 常時 |
| BR-146-02 | IsItemXXX対応 | EndGroup後、リストボックス全体にIsItemXXXクエリ可能 | 常時 |

### 計算ロジック

特になし（単純なスコープ終了処理）

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

該当なし（ImGuiはインメモリUIライブラリ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | アサーション | 子ウィンドウ内でない場合 | BeginListBox/EndListBoxのペアリングを確認 |

### リトライ仕様

該当なし

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

BeginListBoxで開始されたスコープを終了し、レイアウトスタックを復元する。

## パフォーマンス要件

- 非常に軽量な操作（2つの関数呼び出しのみ）

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

特になし。

## 備考

- BeginListBoxがfalseを返した場合はEndListBoxを呼び出してはならない
- EndGroupにより、リストボックス全体に対するIsItemHovered等のクエリが可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | EndListBox関数宣言（786行目）とコメント確認 |
| 1-2 | imgui_widgets.cpp | `imgui_widgets.cpp` | EndListBox実装（8671-8680行目） |

**主要処理フロー**:
1. **8675行目**: 子ウィンドウフラグの検証（アサーション）
2. **8678行目**: EndChildの呼び出し
3. **8679行目**: EndGroupの呼び出し（IsItemXXX対応のコメントあり）

**読解のコツ**: アサーションメッセージ「Mismatched BeginListBox/EndListBox calls」が問題発生時の診断に役立つ。

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

```
EndListBox()
    │
    ├─ [assertion] window->Flags & ImGuiWindowFlags_ChildWindow
    │
    ├─ EndChild()
    │
    └─ EndGroup()  // IsItemXXX query対応
```

### データフロー図

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

g.CurrentWindow ───────────────▶ EndListBox() ──────────────▶ なし
                                        │
                                        ├──▶ 子ウィンドウ終了
                                        │
                                        └──▶ グループ終了
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | 公開API宣言 |
| imgui_widgets.cpp | `imgui_widgets.cpp` | ソース | EndListBox実装 |
