# 機能設計書 187-TabItemButton

## 概要

本ドキュメントは、ImGuiライブラリのTabItemButton関数の機能設計を記述する。この関数はタブバー内にボタンとして動作するタブアイテムを作成するためのAPIである。

### 本機能の処理概要

TabItemButton関数は、タブバー内にボタンとして動作する特殊なタブアイテムを作成する。通常のタブアイテムとは異なり、このタブはクリック時にコンテンツを表示するのではなく、ボタンとして押下イベントを返す。選択状態にはならず、並び替えも無効化される。

**業務上の目的・背景**：タブバー内に特殊な操作ボタンを配置するニーズがある。例えば、「+」ボタンで新しいタブを追加したり、「?」ボタンでヘルプメニューを表示したりするなど、タブの選択以外のアクションをタブバー内で提供する用途に使用される。

**機能の利用シーン**：
- 新規タブ追加ボタン（「+」ボタン）
- ヘルプ/メニューボタン（「?」ボタン）
- タブバーに統合された操作ボタン
- Leading/Trailingフラグと組み合わせた端配置ボタン

**主要な処理内容**：
1. タブバーコンテキストの検証
2. ボタンフラグとNoReorderフラグの自動付与
3. TabItemEx内部関数の呼び出し
4. クリック状態の返却（選択状態は返却しない）

**関連システム・外部連携**：
- BeginTabBar/EndTabBarとの連携（タブバーコンテキスト）
- OpenPopupとの連携（ポップアップメニュー表示）
- Leadingフラグ/Trailingフラグとの連携（配置制御）

**権限による制御**：本機能に権限制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 21 | Documents | 補助機能 | タブボタンの作成 |

## 機能種別

UI入力処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| label | const char* | Yes | ボタンのラベルテキスト | 空文字列可 |
| flags | ImGuiTabItemFlags | No | タブアイテムの動作フラグ（デフォルト: 0） | 有効なフラグ値 |

### 使用可能なImGuiTabItemFlags

| フラグ | 説明 |
|--------|------|
| ImGuiTabItemFlags_None | デフォルト |
| ImGuiTabItemFlags_NoTooltip | ツールチップを無効化 |
| ImGuiTabItemFlags_Leading | タブバーの左端に配置 |
| ImGuiTabItemFlags_Trailing | タブバーの右端に配置 |

### 自動付与されるフラグ

| フラグ | 説明 |
|--------|------|
| ImGuiTabItemFlags_Button | ボタンとして動作（内部フラグ） |
| ImGuiTabItemFlags_NoReorder | 並び替えを無効化 |

### 入力データソース

- 現在のタブバーコンテキスト（g.CurrentTabBar）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | bool | ボタンがクリックされたかどうか |

### 出力先

- 呼び出し元へのクリック状態返却

## 処理フロー

### 処理シーケンス

```
1. ウィンドウのスキップ状態チェック
   └─ SkipItemsの場合はfalseを返却
2. タブバーコンテキストの検証
   └─ g.CurrentTabBarがNULLの場合はアサーション
3. フラグの自動付与
   └─ Button | NoReorderを追加
4. TabItemEx内部関数の呼び出し
5. クリック状態（pressed）を返却
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{window->SkipItems?}
    B -->|Yes| C[return false]
    B -->|No| D{CurrentTabBar != NULL?}
    D -->|No| E[アサーション失敗]
    D -->|Yes| F[flags |= Button | NoReorder]
    F --> G[TabItemEx呼び出し]
    G --> H[return pressed]
    C --> I[終了]
    H --> I
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-187-01 | 選択不可 | ボタンタブは選択状態にならない | 常時 |
| BR-187-02 | 並び替え不可 | ボタンタブはドラッグで並び替えできない | 常時 |
| BR-187-03 | EndTabItem不要 | BeginTabItemと異なりEndTabItemは呼び出さない | 常時 |
| BR-187-04 | タブバー必須 | BeginTabBar/EndTabBarの間で呼び出す | 常時 |

### 計算ロジック

特になし

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

該当なし（ImGuiはUIライブラリであり、データベース操作は行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | アサーション | タブバーコンテキストなし | IM_ASSERT_USER_ERROR_RETV |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- 通常のボタンと同程度のパフォーマンスで動作すること

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

該当なし

## 備考

- TabItemButtonはBeginTabItem/EndTabItemとは異なり、EndTabItemを呼び出す必要がない
- 戻り値はクリックされた瞬間のみtrueとなる（選択状態ではない）
- Leading/Trailingフラグと組み合わせることで、タブバーの端に固定配置できる
- タブバーがスクロール可能な場合でも、Leading/Trailing位置のボタンはスクロールしない

---

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

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

### 推奨読解順序

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

まず、ボタンタブに関連する内部フラグを理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_internal.h | `imgui_internal.h` | ImGuiTabItemFlagsPrivate_（2783-2791行目）、特にImGuiTabItemFlags_Button |

**読解のコツ**: ImGuiTabItemFlags_Buttonは内部フラグで、ユーザーAPIには公開されていない。TabItemButton関数がこのフラグを自動付与する。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui_widgets.cpp | `imgui_widgets.cpp` | TabItemButton関数（10384-10394行目） |

**主要処理フロー**:
1. **10386-10389行目**: SkipItemsチェック
2. **10391-10392行目**: タブバーコンテキストの検証
3. **10393行目**: TabItemExの呼び出し（Button | NoReorderフラグ付き）

#### Step 3: 内部実装でのボタン処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui_widgets.cpp | `imgui_widgets.cpp` | TabItemEx内のボタン処理（10470行目、10650-10652行目） |

**主要処理フロー**:
- **10470行目**: is_tab_buttonフラグの設定
- **10650-10652行目**: ボタンの場合はpressedを返却

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

```
ImGui::TabItemButton(label, flags)
    │
    ├─ (検証: SkipItems, CurrentTabBar)
    │
    └─ TabItemEx(tab_bar, label, NULL, flags | Button | NoReorder, NULL)
           │
           ├─ is_tab_button = true
           ├─ タブの描画
           └─ return pressed (ボタンの場合)
```

### データフロー図

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

label ──────────▶ TabItemButton() ────▶ bool (クリック状態)
flags                    │
                         │
                         ├─ フラグ付与
                         └─ TabItemEx呼び出し
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | API宣言 |
| imgui_widgets.cpp | `imgui_widgets.cpp` | ソース | TabItemButton実装 |
| imgui_internal.h | `imgui_internal.h` | 内部ヘッダー | ImGuiTabItemFlags_Button定義 |
| imgui_demo.cpp | `imgui_demo.cpp` | デモ | 使用例（TabItemButton & Leading/Trailing flags） |
