# 機能設計書 57-PushStyleVar

## 概要

本ドキュメントは、ImGuiライブラリのPushStyleVar関数の設計仕様を定義する。PushStyleVarはスタイル変数（サイズ、スペーシング、丸み等）を一時的に変更し、スタイル変数スタックにプッシュするための機能である。

### 本機能の処理概要

PushStyleVar関数は、指定されたスタイル変数（ImGuiStyleVar）を新しい値で一時的に変更する。変更前の値はスタイル変数スタックに保存され、PopStyleVarで復元できる。float型とImVec2型の2つのオーバーロードが存在し、変数の型に応じて使い分ける。

**業務上の目的・背景**：GUIアプリケーションでは、特定のUIセクションでスタイルパラメータ（パディング、角の丸み、ボーダーサイズ等）を一時的に変更したい場合がある。例えば、特定のボタンを大きくしたり、ウィンドウのパディングを調整したりする。PushStyleVar/PopStyleVarのスタック機構により、一時的なスタイル変更を安全に管理でき、元の状態への復元が保証される。

**機能の利用シーン**：
- ウィンドウのパディングを変更する場合
- ボタンやフレームの角の丸みを調整する場合
- アイテム間のスペーシングを変更する場合
- 特定のUI領域でスタイルをカスタマイズする場合

**主要な処理内容**：
1. スタイル変数情報（GStyleVarsInfo）から型とオフセットを取得
2. 現在の値をバックアップ構造体に保存
3. バックアップをスタイル変数スタックにプッシュ
4. 新しい値をスタイルに適用

**関連システム・外部連携**：ImGuiStyleシステムと連携し、すべてのウィジェットのレイアウトと外観に影響する。

**権限による制御**：特になし。すべてのコンテキストで利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | Style Editor | 補助機能 | スタイル値の調整スライダー |

## 機能種別

スタック操作 / スタイル変更

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| idx | ImGuiStyleVar | Yes | 変更するスタイル変数のインデックス | 0 <= idx < ImGuiStyleVar_COUNT |
| val | float / ImVec2 | Yes | 新しい値（変数の型に応じて選択） | 変数の型と一致すること |

### 入力データソース

- ImGuiStyleVar列挙型（30以上のスタイル変数定義）
- float値またはImVec2値

## 出力仕様

### 出力データ

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

### 出力先

- ImGuiContext.StyleVarStack（スタイル変数スタック）
- ImGuiStyle内の対応する変数

## 処理フロー

### 処理シーケンス

```
1. コンテキストの取得
   └─ グローバルコンテキストGImGuiを参照
2. スタイル変数情報の取得
   └─ GetStyleVarInfo(idx)でGStyleVarsInfoから情報取得
3. 型チェック
   └─ 呼び出したオーバーロードと変数の型が一致するか確認
4. 変数ポインタの取得
   └─ var_info->GetVarPtr(&g.Style)で対象アドレス取得
5. 現在の値をスタックにプッシュ
   └─ ImGuiStyleMod構造体を作成してpush_back
6. 新しい値を適用
   └─ 変数のアドレスに新しい値を書き込み
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[GetStyleVarInfo idx]
    B --> C{型チェック OK?}
    C -->|No| D[ASSERT: 型不一致エラー]
    C -->|Yes| E[GetVarPtrで変数アドレス取得]
    D --> Z[終了 リターン]
    E --> F[StyleVarStack.push_back 現在値]
    F --> G[変数に新しい値を設定]
    G --> Z
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-57-01 | Push/Popペアリング | PushStyleVarは必ずPopStyleVarとペアで使用する | 常時 |
| BR-57-02 | NewFrame後使用 | NewFrame()の後でスタイルを変更する場合はこの関数を使用 | フレーム中 |
| BR-57-03 | 型一致 | 変数の型（float/ImVec2）に合ったオーバーロードを使用 | 常時 |

### 計算ロジック

スタイル変数のオフセット計算：
```
変数アドレス = (char*)&g.Style + var_info->Offset
```

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

該当なし（メモリ内操作のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| IM_ASSERT_USER_ERROR | アサーション | 型不一致（float関数でImVec2変数を指定等） | 正しいオーバーロードを使用 |

### リトライ仕様

該当なし

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

該当なし（メモリ内操作のみ）

## パフォーマンス要件

- スタック操作のため、O(1)の時間計算量
- フレームごとに複数回呼び出されることを想定した軽量実装

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

特になし

## 備考

- 4つのバリアント：PushStyleVar(float), PushStyleVar(ImVec2), PushStyleVarX, PushStyleVarY
- PushStyleVarX/Yは ImVec2 変数の X/Y 成分のみを変更
- ImGuiStyleVar_COUNTは約35の変数を定義

---

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

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

### 推奨読解順序

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

スタイル変数管理に使用されるデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | ImGuiStyleVar_列挙型（1814-1858行目） |
| 1-2 | imgui_internal.h | `imgui_internal.h` | ImGuiStyleMod構造体（922-929行目） |
| 1-3 | imgui_internal.h | `imgui_internal.h` | ImGuiStyleVarInfo構造体（906-912行目） |
| 1-4 | imgui.h | `imgui.h` | PushStyleVar関数シグネチャ（531-535行目） |

**読解のコツ**: ImGuiStyleMod は union を使って float[2] または ImVec2 のバックアップを保持。ImGuiStyleVarInfo は変数の型（Count/DataType）とオフセットを管理。

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

PushStyleVar関数の実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.cpp | `imgui.cpp` | GStyleVarsInfo配列（3595-3644行目） |
| 2-2 | imgui.cpp | `imgui.cpp` | PushStyleVar(float)実装（3646-3654行目） |
| 2-3 | imgui.cpp | `imgui.cpp` | PushStyleVar(ImVec2)実装（3676-3684行目） |

**主要処理フロー**:
1. **3649行目**: GetStyleVarInfo(idx)で変数情報取得
2. **3650行目**: 型チェック（DataType と Count の確認）
3. **3651行目**: GetVarPtr で変数アドレス取得
4. **3652行目**: StyleVarStack にバックアップをプッシュ
5. **3653行目**: 新しい値を設定

#### Step 3: 関連関数を理解する

PopStyleVar関数とX/Yバリアントを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | PopStyleVar実装（3686-3705行目） |
| 3-2 | imgui.cpp | `imgui.cpp` | PushStyleVarX/Y実装（3656-3674行目） |

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

```
ImGui::PushStyleVar(ImGuiStyleVar idx, float val)
    │
    ├─ GetStyleVarInfo(idx)        // 変数情報取得
    │      └─ GStyleVarsInfo[idx]
    │
    ├─ IM_ASSERT_USER_ERROR_RET   // 型チェック
    │
    ├─ var_info->GetVarPtr(&g.Style)  // アドレス取得
    │
    ├─ g.StyleVarStack.push_back(ImGuiStyleMod(...))  // バックアップ
    │
    └─ *pvar = val                 // 値設定
```

### データフロー図

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

ImGuiStyleVar idx ───▶ GStyleVarsInfo[idx]参照      ───▶ 変数情報
                              │
                       型・オフセット取得
                              │
float/ImVec2 val  ───▶ アドレス計算                ───▶ 変数ポインタ
                              │
現在の変数値      ───▶ StyleMod作成・プッシュ       ───▶ StyleVarStack
                              │
新しい値          ───▶ 変数に設定                  ───▶ Style内変数
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | PushStyleVar関数の宣言（531-535行目） |
| imgui.h | `imgui.h` | ヘッダー | ImGuiStyleVar_列挙型（1814-1858行目） |
| imgui.cpp | `imgui.cpp` | ソース | PushStyleVar関数の実装（3646-3684行目） |
| imgui.cpp | `imgui.cpp` | ソース | GStyleVarsInfo配列（3595-3644行目） |
| imgui_internal.h | `imgui_internal.h` | ヘッダー | ImGuiStyleMod/ImGuiStyleVarInfo構造体（906-929行目） |
