# 通知設計書 28-ImGuiWindowFlags_Tooltip

## 概要

本ドキュメントは、ImGuiライブラリにおける`ImGuiWindowFlags_Tooltip`内部フラグの仕様と動作を定義する設計書である。このフラグは、`BeginTooltip()`関数で使用される内部専用フラグであり、ツールチップウィンドウを識別するために使用される。

### 本通知の処理概要

`ImGuiWindowFlags_Tooltip`は、ImGuiの内部システムがツールチップウィンドウを識別・管理するために使用するウィンドウフラグである。このフラグは`BeginTooltip()`および`BeginItemTooltip()`関数が自動的に設定するため、開発者が直接使用することは推奨されない。

**業務上の目的・背景**：ツールチップは、ユーザーがUI要素にマウスをホバーしたときに表示される補助的な情報ウィンドウである。ツールチップは一時的で非侵入的な性質を持ち、フォーカスを奪わず、マウスに追従して表示される。このフラグにより、ツールチップ固有の振る舞い（描画順序、スタイル適用、フォーカス非取得など）が実現される。

**通知の送信タイミング**：`BeginTooltip()`または`BeginItemTooltip()`関数の呼び出し時に、内部的にこのフラグが追加されて`Begin()`に渡される。

**通知の受信者**：ImGuiの内部ウィンドウ管理システムが受信者である。`Begin()`関数内およびその後のウィンドウ処理でこのフラグを参照し、ツールチップ固有の処理を行う。

**通知内容の概要**：ウィンドウがツールチップであることを示すビットフラグ情報を伝達する。値は`1 << 25`。

**期待されるアクション**：ImGui内部システムがツールチップ固有の処理（描画レイヤー設定、WindowRounding適用、フォーカス非取得など）を実行する。開発者はこのフラグを直接使用せず、`BeginTooltip()`系関数を使用する。

## 通知種別

内部ウィンドウフラグ（ビットフラグ）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 高（ウィンドウタイプ決定に影響） |
| リトライ | 無 |

### 送信先決定ロジック

フラグは`BeginTooltip()`系関数内で自動的に設定され、`Begin()`関数に渡される。ユーザーによる直接設定は非推奨。

## 通知テンプレート

### フラグ定義

| 項目 | 内容 |
|-----|------|
| フラグ名 | ImGuiWindowFlags_Tooltip |
| 値 | 1 << 25 (33554432) |
| 定義場所 | imgui.h:1191 |

### 注意事項

```cpp
// 直接使用は非推奨（内部使用専用）
// ImGuiWindowFlags_Tooltip = 1 << 25  // Don't use! For internal use by BeginTooltip()

// 正しい使用方法
if (ImGui::IsItemHovered())
{
    ImGui::BeginTooltip();  // 内部でTooltipフラグが自動設定される
    ImGui::Text("This is a tooltip");
    ImGui::EndTooltip();
}

// またはショートカット
if (ImGui::IsItemHovered())
{
    ImGui::SetTooltip("Simple text tooltip");
}
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| flags | ウィンドウフラグ | 内部自動設定 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| API呼び出し | BeginTooltip() | 常時 | フラグ自動追加 |
| API呼び出し | BeginItemTooltip() | IsItemHovered成立時 | フラグ自動追加 |
| API呼び出し | SetTooltip() | 常時 | 内部でBeginTooltip使用 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| なし | BeginTooltip系関数は常にこのフラグを設定 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[BeginTooltip呼び出し] --> B[ツールチップウィンドウフラグ設定]
    B --> C[ImGuiWindowFlags_Tooltip追加]
    C --> D[Begin関数呼び出し]
    D --> E{フラグ判定}
    E --> F[描画レイヤー1に設定]
    F --> G[WindowRounding適用]
    G --> H[PopupBorderSize適用]
    H --> I[マウス位置に追従]
    I --> J[ウィンドウ描画]
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし（ImGuiはメモリベースの即時モードGUI）

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 直接使用 | ユーザーがフラグを直接指定 | 警告なし（非推奨のため） |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0 |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | なし |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 無制限 |
| 1日あたり上限 | 無制限 |

### 配信時間帯

制限なし（フレームごとに評価）

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

特になし。内部フラグは視覚的な表示と動作制御のみに影響する。

## 備考

- **内部使用専用**：開発者は直接使用しないこと
- ツールチップは`WindowRounding`を使用（`PopupRounding`ではない）
- ツールチップは`PopupBorderSize`を使用
- ツールチップは描画レイヤー1（最前面）に表示される
- ツールチップはフォーカスを奪わない
- マウス位置に追従して表示される
- `ImGuiCol_PopupBg`が背景色として使用される

---

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

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

### 推奨読解順序

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

フラグの定義位置を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | ImGuiWindowFlags_Tooltip定義（1191行目） |

**読解のコツ**: `[Internal]`セクションに定義されており、`Don't use!`コメントが付いている点に注意。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.cpp | `imgui.cpp` | BeginTooltip関数 |
| 2-2 | imgui.cpp | `imgui.cpp` | BeginTooltipEx関数（内部実装） |

**主要処理フロー**:
1. `BeginTooltip()`が呼び出される
2. 内部で`BeginTooltipEx()`を呼び出し
3. ツールチップウィンドウが作成される

#### Step 3: フラグが使用される箇所を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | GetWindowDisplayLayer関数（5778行目） |
| 3-2 | imgui.cpp | `imgui.cpp` | ウィンドウソート処理（5742行目） |
| 3-3 | imgui.cpp | `imgui.cpp` | Begin関数内でのBorderSize決定（7594行目） |

**主要処理フロー**:
- **5778行目**: Tooltipフラグでレイヤー1を返す
- **5742行目**: ソート時のTooltip優先度判定
- **7594行目**: `(Popup | Tooltip) && !Modal`でPopupBorderSize使用

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

```
BeginTooltip()
    |
    +-- BeginTooltipEx(tooltip_flags, extra_window_flags)
           |
           +-- Begin(name, NULL, flags | ImGuiWindowFlags_Tooltip | ...)
                  |
                  +-- ウィンドウタイプ判定
                  |      (flags & ImGuiWindowFlags_Tooltip)
                  |
                  +-- GetWindowDisplayLayer()
                  |      -> return 1 (最前面レイヤー)
                  |
                  +-- WindowRounding = style.WindowRounding
                  |
                  +-- WindowBorderSize = style.PopupBorderSize
                  |
                  +-- マウス位置追従
```

### データフロー図

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

ホバー状態 ──────────> BeginTooltip() ─────────> window flags
                           |
                           v
                    ImGuiWindowFlags_Tooltip追加
                           |
                           v
                      Begin()
                           |
                           v
                    ツールチップ処理適用
                           |
                           v
                    最前面描画 + マウス追従
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダ | ImGuiWindowFlags_Tooltip定義（1191行目） |
| imgui.cpp | `imgui.cpp` | ソース | BeginTooltip実装 |
| imgui.cpp | `imgui.cpp` | ソース | GetWindowDisplayLayer（5778行目） |
| imgui.cpp | `imgui.cpp` | ソース | ウィンドウソート（5742行目） |
