# 画面設計書 14-QuitDialog（終了確認）

## 概要

本ドキュメントは、Windows Terminal の QuitDialog（終了確認）画面の設計仕様を記述する。QuitDialog は、アプリケーション終了（全ウィンドウを閉じる）の確認をユーザーに求めるダイアログである。

### 本画面の処理概要

QuitDialog は、ユーザーが全ウィンドウを閉じてアプリケーションを終了しようとする際に表示される確認ダイアログである。誤操作による意図しない終了を防止する目的で設けられている。

**業務上の目的・背景**：ターミナルアプリケーションでは、複数のウィンドウで作業が並行して行われることがある。全ウィンドウを一括で閉じる操作は破壊的であり、進行中のシェルセッションや未保存の作業が失われる可能性がある。QuitDialog はこの操作の前に確認を求めることで、データ損失を防止する。

**画面へのアクセス方法**：TerminalPage 上で Quit アクション（`_HandleQuit`）が発動されるか、`RequestQuit` メソッドが呼び出された際に表示される。具体的にはキーバインドに割り当てられた終了操作で発動する。

**主要な操作・処理内容**：
1. 確認メッセージの表示：「全ウィンドウを閉じますか？」というメッセージをユーザーに提示する
2. 全ウィンドウ閉じ（Primary ボタン）：ユーザーが承認すると `QuitRequested` イベントが発火され、全ウィンドウが閉じられる
3. キャンセル（Close ボタン）：ユーザーがキャンセルすると、ダイアログが閉じて操作が中断される

**画面遷移**：TerminalPage の Quit アクションからダイアログが表示される。Primary ボタンでアプリケーション終了、Close ボタンで TerminalPage に戻る。

**権限による表示制御**：特になし。全ユーザーが利用可能。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 72 | アプリケーション終了 | 主機能 | アプリケーション終了の確認（RequestQuit から呼び出し） |

## 画面種別

ダイアログ（ContentDialog - インライン定義）

## URL/ルーティング

該当なし（TerminalPage.xaml 内にインライン定義される ContentDialog）

## 入出力項目

| 項目名 | 入出力 | 型 | 必須 | 説明 |
|--------|--------|-----|------|------|
| ContentDialogResult | 出力 | ContentDialogResult | Yes | ユーザーの選択結果（Primary = 終了 / None = キャンセル） |

## 表示項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| Title | テキスト | "Do you want to close all windows?" |
| PrimaryButtonText | ボタンラベル | "Close all" |
| CloseButtonText | ボタンラベル | "Cancel" |

## イベント仕様

### 1-ダイアログ表示（RequestQuit）

TerminalPage::RequestQuit（TerminalPage.cpp 行2205-2228）が呼び出されると、`_displayingCloseDialog` フラグで重複表示を防止した上で `_ShowQuitDialog()` を呼び出す。`_ShowQuitDialog` は `_ShowDialogHelper(L"QuitDialog")` を呼び出し、x:Load による遅延読み込みとダイアログ表示を行う（TerminalPage.cpp 行893-896）。

### 2-Primary ボタン（Close all）

ユーザーが「Close all」ボタンをクリックすると、ContentDialogResult::Primary が返される。RequestQuit コルーチン内で結果を判定し、Primary の場合は `QuitRequested` イベントを発火してアプリケーション終了処理を開始する（TerminalPage.cpp 行2221-2226）。

### 3-Close ボタン（Cancel）

ユーザーが「Cancel」ボタンをクリックすると、ContentDialogResult::None が返される。RequestQuit コルーチン内で早期リターンし、操作が中断される（TerminalPage.cpp 行2221-2224）。

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

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

該当なし。本画面はデータベースを操作しない。

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|----------|---------------|
| QuitDialog.Title | タイトル | 常時 | "Do you want to close all windows?" |
| QuitDialog.PrimaryButtonText | ボタンラベル | 常時 | "Close all" |
| QuitDialog.CloseButtonText | ボタンラベル | 常時 | "Cancel" |

## 例外処理

- ダイアログ表示中に WeakRef が無効になった場合：`weak.get()` の null チェックで早期リターンする（TerminalPage.cpp 行2213-2217）
- 既にダイアログが表示されている場合：`_displayingCloseDialog` フラグにより重複表示を防止する（TerminalPage.cpp 行2207）

## 備考

- DefaultButton は Primary に設定されている（TerminalPage.xaml 行93）
- x:Load="False" により遅延読み込みされる（TerminalPage.xaml 行92）
- Content（本文テキスト）は設定されておらず、Title のみで確認メッセージを表示する
- `_displayingCloseDialog` フラグはダイアログの表示/非表示に連動して管理される

---

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

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

### 推奨読解順序

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

QuitDialog は標準の ContentDialog を使用するため、独自のデータ構造はない。ContentDialogResult の戻り値のみが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TerminalPage.xaml | `src/cascadia/TerminalApp/TerminalPage.xaml` | QuitDialog の XAML 定義（行89-93）。x:Uid="QuitDialog" によるリソース文字列バインディング、DefaultButton="Primary" の設定を確認 |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | `RequestQuit` メソッド（行2205-2228）が全体のフロー。_displayingCloseDialog による重複防止、_ShowQuitDialog の呼び出し、結果に応じた QuitRequested イベントの発火を確認 |
| 2-2 | TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | `_ShowQuitDialog` メソッド（行893-896）と `_ShowDialogHelper` メソッド（行878-885）。FindName + DialogPresenter による表示メカニズムを理解 |

**主要処理フロー**:
1. **行2207**: `_displayingCloseDialog` フラグチェック（重複表示防止）
2. **行2212**: `_ShowQuitDialog()` を co_await で非同期呼び出し
3. **行2221-2226**: 結果が Primary の場合のみ `QuitRequested.raise()` を発火

#### Step 3: リソース文字列を確認する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Resources.resw | `src/cascadia/TerminalApp/Resources/en-US/Resources.resw` | QuitDialog.Title（行505-506）、QuitDialog.PrimaryButtonText（行502-503）、QuitDialog.CloseButtonText（行499-500）の文字列を確認 |

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

```
TerminalPage::RequestQuit (TerminalPage.cpp:2205)
    |
    +-- _displayingCloseDialog フラグチェック
    |
    +-- _ShowQuitDialog (TerminalPage.cpp:893)
    |       |
    |       +-- _ShowDialogHelper("QuitDialog") (TerminalPage.cpp:878)
    |               |
    |               +-- FindName("QuitDialog") --> ContentDialog 遅延読み込み
    |               +-- DialogPresenter::ShowDialog
    |
    +-- [結果判定]
            |
            +-- Primary --> QuitRequested.raise()
            +-- None --> co_return（キャンセル）
```

### データフロー図

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

Quit アクション      --> RequestQuit                   --> QuitDialog 表示
                         |                                 |
ユーザー選択         --> ContentDialogResult 判定       --> QuitRequested イベント
  Primary               (Primary?)                        (アプリ終了開始)
  None                   |                                 |
                         +-- None --> 操作中断         --> TerminalPage に戻る
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TerminalPage.xaml | `src/cascadia/TerminalApp/TerminalPage.xaml` | ソース（XAML） | QuitDialog のインライン定義（行89-93） |
| TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | ソース（実装） | RequestQuit / _ShowQuitDialog / _ShowDialogHelper の実装 |
| Resources.resw | `src/cascadia/TerminalApp/Resources/en-US/Resources.resw` | リソース | ダイアログテキストの文字列リソース（行499-506） |
