# 機能設計書 153-EndMainMenuBar

## 概要

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

### 本機能の処理概要

EndMainMenuBarは、BeginMainMenuBar()で開始されたフルスクリーンメニューバーを終了するための関数である。メニューバーの状態をクリーンアップし、内部ウィンドウを閉じ、フォーカス管理を適切に行う。

**業務上の目的・背景**：BeginMainMenuBar()とペアで使用され、アプリケーションのメインメニューバー領域を正しく終了させる。メニューから離れた際のフォーカス復元処理を行い、ユーザーがメニュー操作を終えた後に自然に前のウィンドウへフォーカスが戻るようにする。

**機能の利用シーン**：BeginMainMenuBar()がtrueを返した後、メニュー項目（BeginMenu/MenuItem）を配置した後に呼び出す。Main Menu Bar画面で使用される。

**主要な処理内容**：
1. MenuBarAppending状態のアサーション検証を行う
2. EndMenuBar()を呼び出してメニューバーを終了する
3. NoSavedSettingsフラグを復元する
4. メニューレイヤーから離れた場合、前のウィンドウにフォーカスを復元する
5. End()を呼び出してウィンドウを閉じる

**関連システム・外部連携**：ImGuiのフォーカス管理システムと連携し、メニュー操作後の適切なフォーカス復元を行う。

**権限による制御**：特になし。BeginMainMenuBar()が呼ばれていない状態での呼び出しはアサーションエラーとなる。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 9 | Main Menu Bar | 主機能 | フルスクリーンメニューバーの終了 |

## 機能種別

レイアウト処理 / 状態管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| (なし) | void | - | パラメータなし | - |

### 入力データソース

- ImGuiContext（グローバルコンテキスト）
- ImGuiWindow（現在のウィンドウ）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (なし) | void | 戻り値なし |

### 出力先

- フォーカス状態の更新

## 処理フロー

### 処理シーケンス

```
1. アサーション検証
   └─ MenuBarAppending状態を確認
   └─ falseの場合はユーザーエラーとしてリターン

2. EndMenuBarの呼び出し
   └─ メニューバー領域を終了

3. NoSavedSettingsフラグの復元
   └─ BeginMainMenuBarで解除したフラグを再設定

4. フォーカス復元処理
   └─ メニューレイヤーから離れた場合を検出
   └─ NavWindow == CurrentWindow かつ NavLayer == Main を確認
   └─ NavAnyRequest と ActiveId が0であることを確認
   └─ FocusTopMostWindowUnderOneで前のウィンドウにフォーカス復元

5. ウィンドウの終了
   └─ End()を呼び出し
```

### フローチャート

```mermaid
flowchart TD
    A[開始: EndMainMenuBar] --> B{MenuBarAppending?}
    B -->|No| C[ユーザーエラー<br/>return]
    B -->|Yes| D[EndMenuBar]
    D --> E[NoSavedSettingsフラグ復元]
    E --> F{メニューレイヤーから<br/>離れた?}
    F -->|Yes| G{NavAnyRequest==false<br/>&&ActiveId==0?}
    G -->|Yes| H[FocusTopMostWindowUnderOne<br/>フォーカス復元]
    G -->|No| I[End]
    F -->|No| I
    H --> I
    I --> J[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-153-01 | ペア呼び出し | BeginMainMenuBar()がtrueを返した場合のみ呼び出す | 常時 |
| BR-153-02 | フォーカス復元 | メニュー操作終了後、前のウィンドウにフォーカスを戻す | ナビゲーション要求がない場合 |
| BR-153-03 | フラグ復元 | NoSavedSettingsフラグをBeginMainMenuBar前の状態に戻す | 常時 |

### 計算ロジック

フォーカス復元条件:
- `g.CurrentWindow == g.NavWindow`
- `g.NavLayer == ImGuiNavLayer_Main`
- `!g.NavAnyRequest`
- `g.ActiveId == 0`

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

データベース操作なし（UI状態管理のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ユーザーエラー | MenuBarAppendingがfalse | アサーションメッセージを表示してリターン |

### リトライ仕様

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

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

トランザクション管理なし（即時状態更新）

## パフォーマンス要件

- 単一フレーム内で1回のみ呼び出し
- 状態の復元処理のみのため軽量

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

- 特になし

## 備考

- BeginMainMenuBar()とEndMainMenuBar()は必ずペアで使用する
- BeginMainMenuBar()がfalseを返した場合はEndMainMenuBar()を呼び出してはならない

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | 812行目: EndMainMenuBar API宣言を確認 |
| 1-2 | imgui_internal.h | `imgui_internal.h` | ImGuiNavLayer、FocusRequestFlagsの定義を確認 |

**読解のコツ**: EndMainMenuBarは比較的シンプルな関数だが、フォーカス復元の条件を理解することが重要。

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

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

**主要処理フロー**:
1. **9152-9153行目**: MenuBarAppendingのアサーション検証
2. **9155行目**: EndMenuBar()呼び出し
3. **9156行目**: NoSavedSettingsフラグの復元
4. **9158-9161行目**: フォーカス復元条件の判定と実行
5. **9163行目**: End()呼び出し

#### Step 3: フォーカス復元処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | FocusTopMostWindowUnderOne関数の実装 |

**主要処理フロー**:
- モーダル以下でなければフォーカスを復元
- フォーカスされた子ウィンドウを復元

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

```
ImGui::EndMainMenuBar()
    │
    ├─ IM_ASSERT_USER_ERROR_RET()
    │      └─ MenuBarAppending状態を検証
    │
    ├─ EndMenuBar()
    │      └─ メニューバー領域を終了
    │
    ├─ FocusTopMostWindowUnderOne() [条件付き]
    │      └─ 前のウィンドウにフォーカスを復元
    │
    └─ End()
           └─ メインメニューバーウィンドウを閉じる
```

### データフロー図

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

g.CurrentWindow ──────────> MenuBarAppending検証 ──────────> エラーまたは続行
                                  │
                                  ▼
                           EndMenuBar()
                                  │
                           NoSavedSettings復元
                                  │
g.NavWindow ──────────────> フォーカス復元判定
g.NavLayer                        │
g.NavAnyRequest                   │
g.ActiveId                        │
                                  ▼
                           FocusTopMostWindowUnderOne
                                  │
                                  └──────────────────────────> フォーカス状態更新
                                  │
                           End()
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | EndMainMenuBar APIの宣言 |
| imgui_internal.h | `imgui_internal.h` | ヘッダー | 内部データ構造の定義 |
| imgui_widgets.cpp | `imgui_widgets.cpp` | ソース | EndMainMenuBar実装（9150-9164行目） |
| imgui.cpp | `imgui.cpp` | ソース | End、FocusTopMostWindowUnderOne等のコア関数 |
