# 機能設計書 93-SmallButton

## 概要

本ドキュメントはImGuiのSmallButton機能について、その処理内容、入出力仕様、実装詳細を記述した機能設計書である。

### 本機能の処理概要

SmallButtonは、テキスト内に埋め込み可能な小さいボタンを作成するためのUI機能である。通常のButtonと比較して、縦方向のFramePaddingを0にすることで、テキスト行の高さに収まるコンパクトなボタンを実現する。

**業務上の目的・背景**：GUIアプリケーションにおいて、テキスト行内にボタンを配置したい場合がある。例えば、ログメッセージの横に「コピー」ボタンを配置したり、リスト項目の末尾に「削除」ボタンを追加したりする場合である。通常のButtonでは縦方向のパディングにより行の高さが増加してしまうが、SmallButtonはこれを解消し、テキストフローを乱さないボタン配置を可能にする。

**機能の利用シーン**：テキスト行内に埋め込むボタン、リスト項目の操作ボタン、コンパクトなツールバーのボタン、ヘルプテキストの横に配置するリンクボタンなどで使用される。

**主要な処理内容**：
1. 現在のFramePadding.yを一時的に保存する
2. FramePadding.yを0に設定する
3. ButtonEx関数をAlignTextBaseLineフラグ付きで呼び出す
4. FramePadding.yを元の値に復元する
5. 押下状態（pressed）を戻り値として返す

**関連システム・外部連携**：ImGuiのButton機能を内部で使用し、スタイルシステム（ImGuiStyle.FramePadding）を一時的に変更して動作する。

**権限による制御**：BeginDisabled/EndDisabledで無効化可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | SmallButtonは画面機能マッピングに直接関連付けられていないが、テキスト埋め込み用ボタンとして各所で使用可能 |

## 機能種別

UIウィジェット / ユーザー入力処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| label | const char* | Yes | ボタンに表示するテキスト | NULL終端文字列 |

### 入力データソース

- 呼び出し元からの直接指定
- ImGuiStyleからのスタイル設定値

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| pressed | bool | ボタンが押されたかどうか |

### 出力先

- 戻り値として呼び出し元に返却
- ImDrawList（現在のウィンドウの描画リスト）

## 処理フロー

### 処理シーケンス

```
1. スタイルの一時保存
   └─ backup_padding_y = g.Style.FramePadding.y

2. パディングの変更
   └─ g.Style.FramePadding.y = 0.0f

3. ButtonExの呼び出し
   └─ ButtonEx(label, ImVec2(0, 0), ImGuiButtonFlags_AlignTextBaseLine)

4. スタイルの復元
   └─ g.Style.FramePadding.y = backup_padding_y

5. 結果返却
   └─ pressed状態を返す
```

### フローチャート

```mermaid
flowchart TD
    A[開始: SmallButton] --> B[FramePadding.yを保存]
    B --> C[FramePadding.y = 0]
    C --> D[ButtonEx呼び出し<br/>AlignTextBaseLineフラグ付き]
    D --> E[FramePadding.yを復元]
    E --> F[return pressed]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-93-01 | 縦パディング無効化 | FramePadding.yを0にして呼び出し | 常時 |
| BR-93-02 | ベースライン揃え | AlignTextBaseLineフラグにより、周囲のテキストとベースラインを揃える | 常時 |
| BR-93-03 | サイズ自動計算 | サイズは常に自動計算（size引数はImVec2(0,0)固定） | 常時 |

### 計算ロジック

- ボタン高さ: `label_size.y`（FramePadding.y = 0のため）
- ボタン幅: `label_size.x + FramePadding.x * 2`

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

データベース操作なし（UI描画のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 早期リターン | window->SkipItems == true | falseを返す |
| - | 早期リターン | ItemAdd失敗 | falseを返す |

### リトライ仕様

リトライ不要（フレームごとに再評価）

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

トランザクション管理なし（即時処理）

## パフォーマンス要件

- 通常のButtonと同等のパフォーマンス
- スタイル値の一時変更はオーバーヘッドが極めて小さい

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

- Buttonと同様

## 備考

- SmallButtonは内部でButtonExを呼び出すラッパー関数
- AlignTextBaseLineフラグにより、ボタンの位置が周囲のテキストと揃えられる
- サイズ指定は不可（常に自動計算）

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | 633行目: SmallButton関数のAPI宣言を確認 |
| 1-2 | imgui_internal.h | `imgui_internal.h` | ImGuiButtonFlags_AlignTextBaseLineフラグの定義 |

**読解のコツ**: SmallButtonは通常のButtonとの違いを理解することが重要。FramePadding.yを0にすることで高さを抑え、AlignTextBaseLineフラグでテキストベースラインに揃える。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui_widgets.cpp | `imgui_widgets.cpp` | 821-829行目: SmallButton関数の実装 |

**主要処理フロー**:
1. **823行目**: ImGuiContextを取得
2. **824行目**: 現在のFramePadding.yを保存
3. **825行目**: FramePadding.yを0に設定
4. **826行目**: ButtonExをAlignTextBaseLineフラグ付きで呼び出し
5. **827行目**: FramePadding.yを復元
6. **828行目**: pressed状態を返す

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

```
ImGui::SmallButton(label)
    │
    ├─ g.Style.FramePadding.yを保存・変更
    │
    └─ ButtonEx(label, ImVec2(0, 0), ImGuiButtonFlags_AlignTextBaseLine)
           │
           ├─ GetCurrentWindow()
           │
           ├─ window->GetID(label)
           │
           ├─ CalcTextSize(label)
           │
           ├─ CalcItemSize()
           │      └─ 高さはFramePadding.y=0のため、ラベル高さのみ
           │
           ├─ Y位置調整（AlignTextBaseLineフラグ）
           │      └─ テキストベースラインに揃える
           │
           ├─ ButtonBehavior()
           │
           └─ 描画処理（RenderFrame, RenderTextClipped）
```

### データフロー図

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

label (文字列) ─────────────> ButtonEx ──────────────────────> pressed
                                │
ImGuiStyle.FramePadding ────> 一時的に変更 ─────────────────> 復元
                                │
                            高さ計算（縦パディングなし）
                                │
                            ベースライン揃え
                                │
                            描画処理 ────────────────────────> DrawList
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | SmallButton APIの宣言 |
| imgui_internal.h | `imgui_internal.h` | ヘッダー | ImGuiButtonFlagsの定義 |
| imgui_widgets.cpp | `imgui_widgets.cpp` | ソース | SmallButton/ButtonExの実装 |
