# 画面設計書 26-Compatibility（互換性設定）

## 概要

本ドキュメントは、Windows Terminal の互換性設定画面（Compatibility）の設計を記述する。接続タイプ、テキスト測定方法、デバッグ機能、アプリケーション状態のリセット、設定のデフォルトリセットなどの互換性・管理機能に関する設定を管理する画面である。

### 本画面の処理概要

**業務上の目的・背景**：ターミナルの互換性に関する詳細設定と管理操作を提供する画面である。ヘッドレスモードの許可、テキスト測定アルゴリズムの選択といった互換性設定に加え、アプリケーション状態のリセットや設定のデフォルト復元といった管理操作も含む。デバッグ機能の有効化もこの画面から行える（Feature Flag が有効な場合のみ）。

**画面へのアクセス方法**：MainPage（設定ナビゲーション）の左側ナビゲーションから「互換性」項目をクリックすることでアクセスする。

**主要な操作・処理内容**：
1. ヘッドレスモードの許可設定（ToggleSwitch）
2. テキスト測定方法の選択（ComboBox）
3. デバッグ機能の有効化設定（ToggleSwitch、条件付き表示）
4. アプリケーション状態のリセット（ボタン + 確認フライアウト）
5. デフォルト設定へのリセット（ボタン + 確認フライアウト）

**画面遷移**：
- 遷移元：MainPage（設定ナビゲーション）
- 遷移先：なし（MainPageのcontentFrame内で表示される設定ページ）

**権限による表示制御**：デバッグ機能設定は DebugFeaturesAvailable プロパティ（Feature_DebugModeUI::IsEnabled()）によって表示が制御される。Feature Flag が無効な場合は非表示。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 82 | 設定の読み込み・保存 | 主機能 | 接続タイプ・互換性オプションの設定を編集 |
| 84 | 設定UI | 主機能 | 互換性設定のUI表示と編集 |

## 画面種別

編集（設定）/ 管理

## URL/ルーティング

UWP/WinUI アプリケーションのためURL/ルーティングは適用されない。MainPage の contentFrame 内に Frame.Navigate で表示される。ナビゲーションパラメータとして CompatibilityViewModel が渡される。

## 入出力項目

| 項目名 | 入出力 | データ型 | 説明 |
|--------|--------|----------|------|
| AllowHeadless | 入出力 | Boolean | ヘッドレスモードの許可 |
| CurrentTextMeasurement | 入出力 | EnumEntry | テキスト測定方法 |
| DebugFeaturesEnabled | 入出力 | Boolean | デバッグ機能の有効化 |
| DebugFeaturesAvailable | 表示制御 | Boolean | デバッグ機能設定の表示可否 |

## 表示項目

| 表示領域 | 項目名 | コントロール種別 | 説明 |
|----------|--------|-----------------|------|
| 互換性設定 | Globals_AllowHeadless | ToggleSwitch | ヘッドレスモード許可 |
| 互換性設定 | Globals_TextMeasurement | ComboBox | テキスト測定方法 |
| 互換性設定 | Globals_DebugFeaturesEnabled | ToggleSwitch | デバッグ機能有効化（条件付き表示） |
| 管理操作 | Settings_ResetApplicationState | Button + Flyout | アプリケーション状態リセット（DeleteButtonStyle、確認フライアウト付き） |
| 管理操作 | Settings_ResetToDefaultSettings | Button + Flyout | デフォルト設定リセット（DeleteButtonStyle、確認フライアウト付き） |

## イベント仕様

### 1-OnNavigatedTo

MainPage からナビゲートされた時に発火する。ナビゲーションパラメータから CompatibilityViewModel を取得する。テレメトリログとして "NavigatedToPage" イベント（PageId="compatibility"）を記録する。

### 2-ResetApplicationStateButton_Click

アプリケーション状態リセットの確認ボタンがクリックされた時に発火する。ViewModel の ResetApplicationState メソッドを呼び出し、確認フライアウトを閉じる。テレメトリログとして "ResetApplicationState" イベントを記録する。内部的には CascadiaSettings.ResetApplicationState() が呼び出される。

### 3-ResetToDefaultSettings

デフォルト設定リセットの確認ボタンがクリックされた時に発火する。ViewModel の ResetToDefaultSettings メソッドが x:Bind で直接バインドされている。テレメトリログとして "ResetToDefaultSettings" イベントを記録する。内部的には CascadiaSettings.ResetToDefaultSettings() が呼び出される。

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 設定変更 | settings.json（ファイル） | UPDATE | MainPage の SaveButton 経由で全設定を一括保存 |
| ResetApplicationState | アプリケーション状態ファイル | DELETE | アプリケーション状態（ウィンドウ位置等）を初期化 |
| ResetToDefaultSettings | settings.json（ファイル） | DELETE/RECREATE | 設定ファイルをデフォルト値で再作成 |

### テーブル別更新項目詳細

#### settings.json / アプリケーション状態

| 操作 | 項目 | 更新値・取得条件 | 備考 |
|-----|------|-----------------|------|
| DELETE | アプリケーション状態 | 全状態をクリア | ResetApplicationState 時 |
| DELETE/RECREATE | 設定ファイル全体 | デフォルト値で再構築 | ResetToDefaultSettings 時 |

## メッセージ仕様

| 種別 | メッセージID | 表示条件 | 内容 |
|------|-------------|----------|------|
| 確認 | Settings_ResetApplicationStateConfirmationMessageHeader | リセットボタン押下時（Flyout内） | アプリケーション状態リセットの確認ヘッダー |
| 確認 | Settings_ResetApplicationStateConfirmationMessageBody | リセットボタン押下時（Flyout内） | アプリケーション状態リセットの確認本文 |
| 確認 | Settings_ResetToDefaultSettingsConfirmationMessageHeader | リセットボタン押下時（Flyout内） | デフォルト設定リセットの確認ヘッダー |
| 確認 | Settings_ResetToDefaultSettingsConfirmationMessageBody | リセットボタン押下時（Flyout内） | デフォルト設定リセットの確認本文 |

## 例外処理

- ResetApplicationState / ResetToDefaultSettings はいずれも確認フライアウトを経由するため、誤操作を防止している。

## 備考

- リセット系のボタンには DeleteButtonStyle が適用されており、赤色の警告的な外観になっている。
- リセット操作は確認フライアウト（Flyout + CustomFlyoutPresenterStyle）を経由する2段階操作。
- DebugFeaturesEnabled は Feature_DebugModeUI::IsEnabled() が true の場合のみ表示される。

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Compatibility.cpp | `src/cascadia/TerminalSettingsEditor/Compatibility.cpp` | CompatibilityViewModel クラス（行15-48）の ResetApplicationState, ResetToDefaultSettings, DebugFeaturesAvailable メソッドを確認する |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Compatibility.cpp | `src/cascadia/TerminalSettingsEditor/Compatibility.cpp` | Compatibility コンストラクタ（行50-53）、OnNavigatedTo（行55-66）、ResetApplicationStateButton_Click（行68-73）を確認 |

**主要処理フロー**:
1. **行50-53**: InitializeComponent で XAML コンポーネント初期化
2. **行55-57**: OnNavigatedTo で CompatibilityViewModel 取得
3. **行68-73**: ResetApplicationStateButton_Click で状態リセットとフライアウト閉じ

#### Step 3: XAML レイアウトを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Compatibility.xaml | `src/cascadia/TerminalSettingsEditor/Compatibility.xaml` | 5つの SettingContainer（設定3項目 + リセット2項目）の構造、Flyout による確認 UI を確認する |

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

```
MainPage._Navigate("Compatibility_Nav")
    |
    +-- contentFrame.Navigate(typeof(Compatibility), CompatibilityViewModel)
            |
            +-- Compatibility::OnNavigatedTo
            |       +-- CompatibilityViewModel 取得
            |       +-- TraceLogging
            |
            +-- ResetApplicationStateButton_Click
            |       +-- ViewModel.ResetApplicationState()
            |       |       +-- CascadiaSettings.ResetApplicationState()
            |       +-- ResetCacheFlyout.Hide()
            |
            +-- ViewModel.ResetToDefaultSettings (x:Bind)
                    +-- CascadiaSettings.ResetToDefaultSettings()
```

### データフロー図

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

CompatibilityViewModel --------> Compatibility Page       -----> ToggleSwitch / ComboBox / Button
(設定データ)                       |                               |
                                   +-- x:Bind TwoWay               +-- ViewModel プロパティ更新
                                   |                               |
                                   +-- Reset ボタン操作             +-- CascadiaSettings.Reset*()
                                                                      (状態/設定ファイル初期化)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Compatibility.xaml | `src/cascadia/TerminalSettingsEditor/Compatibility.xaml` | テンプレート | UI レイアウト定義 |
| Compatibility.cpp | `src/cascadia/TerminalSettingsEditor/Compatibility.cpp` | ソース | ViewModel 定義 + ページ実装 |
| CommonResources.xaml | `src/cascadia/TerminalSettingsEditor/CommonResources.xaml` | リソース | 共通スタイル定義 |
