# 機能設計書 62-PopItemWidth

## 概要

本ドキュメントは、Dear ImGuiライブラリにおける`PopItemWidth`関数の機能設計を定義する。この関数は、PushItemWidthでプッシュされたアイテム幅設定をスタックからポップし、以前の幅設定を復元する。

### 本機能の処理概要

PopItemWidth関数は、PushItemWidthと対になるスタック操作を行い、アイテム幅設定を以前の状態に復元する。

**業務上の目的・背景**：GUIレイアウトにおいて、一時的にアイテム幅を変更した後、元の設定に戻す必要がある。特にネストされた構造（TreeNode内やグループ内）で異なる幅設定を適用した後、親のレイアウト設定に戻すために使用される。スタック機構により、複数レベルのネストでも確実に設定を復元できる。

**機能の利用シーン**：
- PushItemWidthで設定した幅を解除し、以前の幅に戻したい場合
- TreeNodeやCollapsingHeaderを抜けるタイミングで親レイアウトの幅設定に復帰する場合
- 一時的な幅変更を行うスコープの終了時

**主要な処理内容**：
1. スタックが空でないことを確認（エラーチェック）
2. スタックの最後の要素（以前の幅設定）を現在の幅として復元
3. スタックから最後の要素をポップ

**関連システム・外部連携**：PushItemWidth関数と必ずペアで使用される。内部レイアウトシステムのスタック管理と連携。

**権限による制御**：特になし。任意のウィンドウコンテキスト内で使用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 24 | Layout | 補助機能 | アイテム幅の設定復元 |

## 機能種別

レイアウト制御 / パラメータスタック操作

## 入力仕様

### 入力パラメータ

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

### 入力データソース

- ImGuiWindow::DC.ItemWidthStack（幅設定のバックアップスタック）

## 出力仕様

### 出力データ

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

### 出力先

- ImGuiWindow::DC.ItemWidth（現在のアイテム幅設定 - 復元）
- ImGuiWindow::DC.ItemWidthStack（スタックから要素削除）

## 処理フロー

### 処理シーケンス

```
1. グローバルコンテキストGImGuiを取得
   └─ ImGuiContext& g = *GImGui

2. 現在のウィンドウを取得
   └─ ImGuiWindow* window = g.CurrentWindow

3. スタックサイズチェック
   └─ ItemWidthStack.Size <= 0 の場合はエラー出力して終了

4. スタックの最後の値を現在のItemWidthに復元
   └─ window->DC.ItemWidth = window->DC.ItemWidthStack.back()

5. スタックから最後の要素を削除
   └─ window->DC.ItemWidthStack.pop_back()
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[グローバルコンテキスト取得]
    B --> C[現在のウィンドウ取得]
    C --> D{ItemWidthStack.Size <= 0?}
    D -->|Yes| E[エラーメッセージ出力]
    E --> F[早期リターン]
    D -->|No| G[スタックの最後の値をItemWidthに復元]
    G --> H[スタックからpop_back]
    H --> I[終了]
    F --> I
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-62-01 | スタックペアリング | PushItemWidthの呼び出し回数と同じ回数だけ呼び出す必要がある | 常時 |
| BR-62-02 | スタック空チェック | スタックが空の状態で呼び出すとエラーが発生する | ItemWidthStack.Size <= 0 |
| BR-62-03 | 値の復元 | スタックの最後に保存された値が現在のItemWidthに復元される | 常時 |

### 計算ロジック

特になし（単純なスタック操作のみ）

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

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ユーザーエラー | ItemWidthStackが空の状態でPopを呼び出した | "Calling PopItemWidth() too many times!"というアサーション警告が出力される |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- O(1)の定数時間操作
- スタック操作のみで軽量

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

特になし

## 備考

- PushItemWidth/PopItemWidthのペアリングはフレーム終了時に自動検証される（エラーリカバリー機能）
- ImGuiErrorRecoveryState構造体でスタックサイズが追跡される

---

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

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

### 推奨読解順序

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

まず、スタック構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_internal.h | `imgui_internal.h` | ImGuiWindowTempData構造体内のItemWidthStackの定義（2636行目） |

**読解のコツ**: ItemWidthStackはImVector<float>型で、push_back/pop_backでスタック操作を行う。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.h | `imgui.h` | PopItemWidthの関数宣言（541行目） |

**主要処理フロー**:
1. **541行目**: 関数宣言（パラメータなし、戻り値void）

#### Step 3: 実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | PopItemWidth関数の実装（11497-11508行目） |

**主要処理フロー**:
- **11499-11500行目**: コンテキストとウィンドウの取得
- **11501-11505行目**: スタック空チェックとエラー処理
- **11506行目**: スタックの最後の値を復元
- **11507行目**: スタックからpop_back

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

```
PopItemWidth()
    │
    ├─ IM_ASSERT_USER_ERROR() [スタック空チェック]
    │
    ├─ window->DC.ItemWidthStack.back()
    │      └─ ImVector<float>::back() [最後の値取得]
    │
    └─ window->DC.ItemWidthStack.pop_back()
           └─ ImVector<float>::pop_back() [スタック削除]
```

### データフロー図

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

DC.ItemWidthStack ────▶ PopItemWidth() ────▶ DC.ItemWidth（復元）
      │                       │
      │                       └──▶ DC.ItemWidthStack（pop）
      │
      └─ [back()]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダ | 公開API宣言 |
| imgui.cpp | `imgui.cpp` | ソース | 関数実装 |
| imgui_internal.h | `imgui_internal.h` | ヘッダ | 内部データ構造定義 |
