# 画面設計書 18-Fullscreen Window

## 概要

本ドキュメントは、Dear ImGuiのサンプルアプリケーション「Fullscreen Window」画面の設計仕様を定義する。本画面は、画面全体を覆うフルスクリーンウィンドウのサンプル実装である。

### 本画面の処理概要

本画面は、ImGuiウィンドウをビューポート全体に表示する方法を実演する。ワークエリア（メニューバー・タスクバーを除く領域）とメインエリア（完全なビューポート）の違いを切り替えて確認できる。

**業務上の目的・背景**：ゲームのメイン画面、ダッシュボード、全画面エディタなど、アプリケーション全体をImGuiで構築する場合、フルスクリーンウィンドウが必要になる。本画面は、GetMainViewport()を使用してビューポートサイズを取得し、ウィンドウをフルスクリーン表示する方法を示す。

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

**主要な操作・処理内容**：
1. ワークエリア/メインエリアの切り替え
2. 各種ウィンドウフラグのトグル（NoBackground, NoDecoration等）
3. フルスクリーン表示の動作確認

**画面遷移**：本画面はDemo Windowの「Examples」メニューから呼び出される。独立したウィンドウとして表示され、「Close this window」ボタンまたはp_open変数を通じてウィンドウを閉じることができる。

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 24 | Begin | 主機能 | フルスクリーンウィンドウの開始処理 |
| 25 | End | 主機能 | フルスクリーンウィンドウの終了処理 |
| 221 | GetMainViewport | 主機能 | メインビューポートの取得 |
| 35 | SetNextWindowPos | 主機能 | ウィンドウ位置の設定 |
| 36 | SetNextWindowSize | 主機能 | ウィンドウサイズの設定 |

## 画面種別

フルスクリーン（全画面表示）

## URL/ルーティング

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

## 入出力項目

| 項目名 | 型 | I/O | 必須 | 説明 |
|--------|-----|-----|------|------|
| p_open | bool* | I/O | No | ウィンドウの表示状態を制御するポインタ |
| use_work_area | bool (static) | I/O | No | ワークエリア使用の有効/無効（デフォルトtrue） |
| flags | ImGuiWindowFlags (static) | I/O | No | ウィンドウフラグ |

## 表示項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ワークエリアチェック | Checkbox | ワークエリア/メインエリア切り替え |
| NoBackgroundチェック | CheckboxFlags | 背景非表示フラグ |
| NoDecorationチェック | CheckboxFlags | デコレーション非表示フラグ |
| NoTitleBarチェック | CheckboxFlags | タイトルバー非表示フラグ（インデント） |
| NoCollapseチェック | CheckboxFlags | 折りたたみ無効フラグ（インデント） |
| NoScrollbarチェック | CheckboxFlags | スクロールバー非表示フラグ（インデント） |
| クローズボタン | Button | ウィンドウを閉じるボタン |

## イベント仕様

### 1-ワークエリア/メインエリア切り替え

「Use work area instead of main area」チェックボックスを切り替えると、ウィンドウの表示領域が変更される：
- ワークエリア（true）: メニューバー・タスクバー等を除いた領域
- メインエリア（false）: ビューポート全体

### 2-ウィンドウフラグの切り替え

各CheckboxFlagsでウィンドウフラグを動的に切り替え可能：
- NoBackground: ウィンドウ背景を非表示
- NoDecoration: タイトルバー・ボーダー・スクロールバー等を非表示
- NoTitleBar: タイトルバーのみ非表示
- NoCollapse: 折りたたみボタン無効
- NoScrollbar: スクロールバー非表示

### 3-ウィンドウを閉じる

「Close this window」ボタンを押下すると、p_openがfalseに設定されウィンドウが閉じる。

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

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

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

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

## メッセージ仕様

| 表示テキスト | 表示場所 | 説明 |
|-------------|---------|------|
| "Main Area = entire viewport,..." | ヘルプマーカー | ワークエリアとメインエリアの説明 |

## 例外処理

| 状態 | 処理内容 |
|------|----------|
| Begin()失敗 | End()を呼び出すが、内部コンテンツは描画しない |
| p_openがNULL | クローズボタンは表示されるが動作しない |

## 備考

- 初期フラグはNoDecoration | NoMove | NoSavedSettings
- GetMainViewport()でビューポート情報を取得
- use_work_areaがtrueの場合はWorkPos/WorkSize、falseの場合はPos/Sizeを使用
- NoDecorationの子フラグ（NoTitleBar等）はIndent()でインデント表示
- HelpMarker()でワークエリアの説明を表示

---

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

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

### 推奨読解順序

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

本画面は2つのstatic変数を使用する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_demo.cpp | `imgui_demo.cpp` | 9837-9838行のstatic変数（use_work_area, flags） |

**読解のコツ**: ImGuiWindowFlagsはビットフラグで、OR演算で組み合わせる。CheckboxFlags()で個別に操作可能。

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

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

**主要処理フロー**:
1. **9842行**: GetMainViewport()でビューポート取得
2. **9843-9844行**: use_work_areaに応じて位置・サイズを設定
3. **9846行**: Begin()でフルスクリーンウィンドウを開始
4. **9848-9858行**: チェックボックス群の表示
5. **9860-9861行**: クローズボタンの処理

#### Step 3: ビューポート情報を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui_demo.cpp | `imgui_demo.cpp` | 9842-9844行のビューポート情報使用 |

**主要処理フロー**:
- **9842行**: GetMainViewport()でImGuiViewportポインタを取得
- **9843行**: use_work_areaに応じてWorkPosまたはPosを選択
- **9844行**: use_work_areaに応じてWorkSizeまたはSizeを選択

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

```
ShowExampleAppFullscreen(bool* p_open)
    |
    +-- ImGui::GetMainViewport()
    |       +-> viewport->WorkPos / viewport->Pos
    |       +-> viewport->WorkSize / viewport->Size
    |
    +-- ImGui::SetNextWindowPos(pos)
    |
    +-- ImGui::SetNextWindowSize(size)
    |
    +-- ImGui::Begin("Example: Fullscreen window", p_open, flags)
            |
            +-- ImGui::Checkbox("Use work area instead of main area")
            |       +-- HelpMarker("Main Area = ...")
            |
            +-- ImGui::CheckboxFlags("ImGuiWindowFlags_NoBackground")
            +-- ImGui::CheckboxFlags("ImGuiWindowFlags_NoDecoration")
            |
            +-- ImGui::Indent()
            |       +-- ImGui::CheckboxFlags("ImGuiWindowFlags_NoTitleBar")
            |       +-- ImGui::CheckboxFlags("ImGuiWindowFlags_NoCollapse")
            |       +-- ImGui::CheckboxFlags("ImGuiWindowFlags_NoScrollbar")
            +-- ImGui::Unindent()
            |
            +-- ImGui::Button("Close this window")
                    +-> *p_open = false
```

### データフロー図

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

use_work_area ---------> 位置・サイズ選択
                          |
                          +-> SetNextWindowPos/Size -----> ウィンドウ配置

flags変数 -------------> CheckboxFlags操作
                          |
                          +-> Begin(flags) --------------> ウィンドウ表示変更

CloseボタンClick ------> *p_open = false
                          |
                          +-> 次フレームで非表示 --------> ウィンドウクローズ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui_demo.cpp | `imgui_demo.cpp` | ソース | ShowExampleAppFullscreen()関数のデモ実装 |
| imgui.h | `imgui.h` | ヘッダー | GetMainViewport, ImGuiViewport, ImGuiWindowFlagsの宣言 |
| imgui.cpp | `imgui.cpp` | ソース | Begin/End、SetNextWindowPos/Sizeの実装 |
| imgui_widgets.cpp | `imgui_widgets.cpp` | ソース | Checkbox, CheckboxFlags, Buttonの実装 |
