# 画面設計書 15-Auto Resize

## 概要

本ドキュメントは、Dear ImGuiのサンプルアプリケーション「Auto Resize」画面の設計仕様を定義する。本画面は、コンテンツに合わせて自動的にサイズを調整するウィンドウのサンプル実装である。

### 本画面の処理概要

本画面は、ImGuiWindowFlags_AlwaysAutoResizeフラグを使用して、ウィンドウがコンテンツのサイズに合わせて毎フレーム自動的にリサイズする動作を実演する。表示する行数をスライダーで動的に変更し、ウィンドウサイズがリアルタイムで追従する様子を確認できる。

**業務上の目的・背景**：ツールチップ、ポップアップ、動的なダイアログなど、コンテンツ量が変動するUIでは、ウィンドウサイズを内容に合わせて自動調整したい場合がある。本画面は、ImGuiWindowFlags_AlwaysAutoResizeフラグの使用方法と、その動作特性を示す。ただし、ウィンドウサイズを参照してコンテンツを出力するとフィードバックループが発生する点に注意が必要。

**画面へのアクセス方法**：Demo Windowのメニューバーから「Examples」メニューを選択し、「Auto Resize」を選択することで表示される。または、アプリケーションコード内で`ShowExampleAppAutoResize(&show_app_auto_resize)`を呼び出すことで直接表示可能。

**主要な操作・処理内容**：
1. スライダーで表示行数（1-20）を調整
2. ウィンドウが行数に応じて自動リサイズされる様子を観察
3. 各行のインデント量が増加し、ウィンドウ幅も自動調整される

**画面遷移**：本画面はDemo Windowの「Examples」メニューから呼び出される。独立したウィンドウとして表示され、他の画面への直接的な遷移機能は持たない。

**権限による表示制御**：本画面は権限による表示制御を持たない。すべてのユーザーが同一の機能にアクセス可能である。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 24 | Begin | 主機能 | ウィンドウの開始処理（AlwaysAutoResizeフラグ使用） |
| 25 | End | 主機能 | ウィンドウの終了処理 |
| 85 | Text | 主機能 | 動的テキストの表示 |
| 112 | SliderFloat | 補助機能 | 行数調整スライダー（SliderInt使用） |

## 画面種別

デモ（ウィンドウ動作サンプル）

## URL/ルーティング

N/A（ImGuiはURLベースのルーティングを持たない。`ShowExampleAppAutoResize()`関数呼び出しによりウィンドウを表示）

## 入出力項目

| 項目名 | 型 | I/O | 必須 | 説明 |
|--------|-----|-----|------|------|
| p_open | bool* | I/O | No | ウィンドウの表示状態を制御するポインタ |
| lines | int (static) | I/O | No | 表示する行数（1-20、デフォルト10） |

## 表示項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 説明テキスト | TextUnformatted | ウィンドウの動作説明（3行） |
| 行数スライダー | SliderInt | 表示行数を調整するスライダー |
| 動的テキスト行 | Text | "This is line N"（インデント付き） |

## イベント仕様

### 1-行数スライダー操作

SliderIntで行数（lines）を1から20の範囲で変更すると、即座にforループで生成されるテキスト行の数が変わり、ウィンドウがコンテンツに合わせて自動的にリサイズされる。

### 2-ウィンドウの自動リサイズ

ImGuiWindowFlags_AlwaysAutoResizeフラグにより、毎フレームウィンドウサイズがコンテンツに合わせて計算される。行数が増えると高さが増加し、各行のインデント量（i * 4スペース）が増えるとウィンドウ幅も増加する。

## データベース更新仕様

本画面はデータベースを使用しない。

### 操作別データベース影響一覧

N/A（データベースアクセスなし）

## メッセージ仕様

| 表示テキスト | 表示場所 | 説明 |
|-------------|---------|------|
| "Window will resize every-frame to the size of its content." | ウィンドウ上部 | 動作説明（1行目） |
| "Note that you probably don't want to query the window size to" | ウィンドウ上部 | 注意事項（2行目） |
| "output your content because that would create a feedback loop." | ウィンドウ上部 | 注意事項（3行目） |
| "This is line %d" | ウィンドウ下部 | 動的に生成される行（インデント付き） |

## 例外処理

| 状態 | 処理内容 |
|------|----------|
| ウィンドウ非表示時 | Begin()がfalseを返した場合、End()を呼び出して即座にリターン |
| lines範囲外 | SliderIntが1-20に制限するため発生しない |

## 備考

- ImGuiWindowFlags_AlwaysAutoResizeはウィンドウの手動リサイズを無効化
- 各行はi * 4個のスペースでインデントされ、ウィンドウ幅の自動調整をデモ
- Text()のフォーマット文字列で"%*s"を使用し、可変長のスペースを挿入
- フィードバックループの警告：ウィンドウサイズを参照してコンテンツを決定すると、サイズが安定しない

---

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

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

### 推奨読解順序

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

本画面は非常にシンプルで、static変数1つのみを使用する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_demo.cpp | `imgui_demo.cpp` | 9664行のstatic int lines = 10 |

**読解のコツ**: ImGuiのImmediate Modeでは、状態変数を最小限に保つことが推奨される。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui_demo.cpp | `imgui_demo.cpp` | ShowExampleAppAutoResize()関数（9655-9673行）全体を確認 |

**主要処理フロー**:
1. **9657行**: Begin()でImGuiWindowFlags_AlwaysAutoResizeフラグ付きでウィンドウを開始
2. **9658-9661行**: ウィンドウ非表示時の早期リターン
3. **9665-9668行**: TextUnformatted()で説明文を表示
4. **9669行**: SliderInt()で行数を調整
5. **9670-9671行**: forループで動的なテキスト行を生成

#### Step 3: 動的テキスト生成を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui_demo.cpp | `imgui_demo.cpp` | 9670-9671行のforループ |

**主要処理フロー**:
- **9671行**: Text()で"%*s"フォーマットを使用し、i*4個のスペースでインデント
- 行番号0から始まり、インデント量が段階的に増加

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

```
ShowExampleAppAutoResize(bool* p_open)
    |
    +-- ImGui::Begin("Example: Auto-resizing window", p_open,
    |                 ImGuiWindowFlags_AlwaysAutoResize)
    |
    +-- ImGui::TextUnformatted(...)  // 説明文3行
    |
    +-- ImGui::SliderInt("Number of lines", &lines, 1, 20)
    |
    +-- for (i = 0; i < lines; i++)
    |       +-- ImGui::Text("%*sThis is line %d", i * 4, "", i)
    |
    +-- ImGui::End()
```

### データフロー図

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

スライダー操作 ---------> lines変数更新
                          |
                          +-> forループ回数変更 --------> テキスト行数変化
                                                          |
                                                          v
                                                    ウィンドウ高さ自動調整

インデント増加 ---------> Text("%*s...")
                          |
                          +-> 行幅の増加 --------------> ウィンドウ幅自動調整
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui_demo.cpp | `imgui_demo.cpp` | ソース | ShowExampleAppAutoResize()関数のデモ実装 |
| imgui.h | `imgui.h` | ヘッダー | ImGuiWindowFlags_AlwaysAutoResize、Begin/Endの宣言 |
| imgui.cpp | `imgui.cpp` | ソース | Begin/End、ウィンドウサイズ自動計算の実装 |
| imgui_widgets.cpp | `imgui_widgets.cpp` | ソース | SliderInt、Textの実装 |
