# 画面設計書 22-Launch（起動設定）

## 概要

本ドキュメントは、Windows Terminal の起動設定画面（Launch）の設計を記述する。アプリケーション起動時のデフォルトプロファイル、ウィンドウサイズ、表示位置、起動モード等を設定する画面である。

### 本画面の処理概要

**業務上の目的・背景**：ユーザーがWindows Terminalの起動動作をカスタマイズするために必要な画面である。デフォルトプロファイルの選択、起動時のウィンドウサイズや位置、起動モード（通常/最大化/フルスクリーン等）の設定により、ユーザーごとの作業環境を最適化する。また、デフォルトターミナルアプリケーションの選択や言語設定もここで行う。

**画面へのアクセス方法**：MainPage（設定ナビゲーション）の左側ナビゲーションから「起動」項目をクリックすることでアクセスする。設定画面を開いた際の初期表示ページでもある。

**主要な操作・処理内容**：
1. デフォルトプロファイルの選択（ComboBox でプロファイル一覧から選択）
2. デフォルトターミナルアプリケーションの選択（利用可能な場合のみ表示）
3. 表示言語の選択
4. デフォルト入力スコープの選択
5. ユーザーログイン時の自動起動設定（ToggleSwitch）
6. 最初のウィンドウの動作設定
7. ウィンドウ動作の設定
8. 起動サイズ（列数・行数）の設定（NumberBox）
9. 起動パラメータ（起動モード、起動位置、中央配置）の設定

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

**権限による表示制御**：デフォルトターミナル選択は CascadiaSettings.IsDefaultTerminalAvailable() が true の場合のみ表示される（x:Load="false" で条件付きロード）。ユーザーログイン時の自動起動は StartOnUserLoginAvailable および StartOnUserLoginConfigurable プロパティにより表示・有効状態が制御される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 82 | 設定の読み込み・保存 | 主機能 | デフォルトプロファイル・起動サイズ・位置・動作の設定を編集 |
| 84 | 設定UI | 主機能 | 起動時設定のUI表示と編集 |

## 画面種別

編集（設定）

## URL/ルーティング

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

## 入出力項目

| 項目名 | 入出力 | データ型 | 説明 |
|--------|--------|----------|------|
| DefaultProfile | 入出力 | Profile | デフォルトプロファイルの選択 |
| DefaultTerminal | 入出力 | DefaultTerminal | デフォルトターミナルアプリケーションの選択 |
| CurrentLanguage | 入出力 | String | 表示言語 |
| CurrentDefaultInputScope | 入出力 | EnumEntry | デフォルト入力スコープ |
| StartOnUserLogin | 入出力 | Boolean | ユーザーログイン時の自動起動 |
| CurrentFirstWindowPreference | 入出力 | EnumEntry | 最初のウィンドウ動作 |
| CurrentWindowingBehavior | 入出力 | EnumEntry | ウィンドウ動作 |
| InitialCols | 入出力 | Int32 | 初期列数（最小1、最大999） |
| InitialRows | 入出力 | Int32 | 初期行数（最小1、最大999） |
| CurrentLaunchMode | 入出力 | EnumEntry | 起動モード |
| InitialPosX | 入出力 | Double | 初期X位置（-2147483648〜2147483647） |
| InitialPosY | 入出力 | Double | 初期Y位置（-2147483648〜2147483647） |
| UseDefaultLaunchPosition | 入出力 | Boolean | デフォルト起動位置を使用するか |
| CenterOnLaunch | 入出力 | Boolean | 起動時に中央配置するか |

## 表示項目

| 表示領域 | 項目名 | コントロール種別 | 説明 |
|----------|--------|-----------------|------|
| 基本設定 | Globals_DefaultProfile | ComboBox | デフォルトプロファイル選択（アイコン+名前表示） |
| 基本設定 | Globals_DefaultTerminal | ComboBox | デフォルトターミナル選択（アイコン+名前+作者+バージョン表示、条件付き表示） |
| 基本設定 | Globals_Language | ComboBox | 表示言語選択 |
| 基本設定 | Globals_DefaultInputScope | ComboBox | デフォルト入力スコープ選択 |
| 基本設定 | Globals_StartOnUserLogin | ToggleSwitch | ログイン時自動起動（条件付き表示・有効制御） |
| 基本設定 | Globals_FirstWindowPreference | ComboBox | 最初のウィンドウ動作 |
| 基本設定 | Globals_WindowingBehavior | ComboBox | ウィンドウ動作 |
| 起動サイズ | Globals_LaunchSize | Expander | 起動サイズ設定（展開可能） |
| 起動サイズ | Globals_InitialCols | NumberBox | 初期列数（SmallChange=1, LargeChange=10, Min=1, Max=999） |
| 起動サイズ | Globals_InitialRows | NumberBox | 初期行数（SmallChange=1, LargeChange=10, Min=1, Max=999） |
| 起動パラメータ | Globals_LaunchParameters | Expander | 起動パラメータ設定（展開可能） |
| 起動パラメータ | Globals_LaunchModeSetting | ComboBox | 起動モード（MinWidth=240） |
| 起動パラメータ | Globals_LaunchPosition | NumberBox x 2 | X/Y起動位置（Width=118、UseDefaultLaunchPositionで有効制御） |
| 起動パラメータ | Globals_DefaultLaunchPositionCheckbox | CheckBox | デフォルト位置使用チェック |
| 起動パラメータ | Globals_CenterOnLaunch | ToggleSwitch | 中央配置 |

## イベント仕様

### 1-OnNavigatedTo

MainPage からナビゲートされた時に発火する。ナビゲーションパラメータから LaunchViewModel を取得し、ViewModel プロパティに設定する。また、StartOnUserLogin 設定の準備処理（PrepareStartOnUserLoginSettings）を非同期で実行する。テレメトリログとして "NavigatedToPage" イベント（PageId="startup"）を記録する。

### 2-各設定項目の変更

各設定項目は x:Bind の Mode=TwoWay で ViewModel と双方向バインドされている。ユーザーが値を変更すると即座に ViewModel のプロパティに反映される。保存は MainPage の SaveButton から一括で行われる。

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 設定変更 | settings.json（ファイル） | UPDATE | MainPage の SaveButton 経由で全設定を一括保存 |

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

本画面自体は直接ファイルに書き込まない。MainPage の SaveButton が押下された時に、ViewModel経由で変更された設定値がsettings.jsonに書き出される。

## メッセージ仕様

| 種別 | メッセージID | 表示条件 | 内容 |
|------|-------------|----------|------|
| ヘルプテキスト | StartOnUserLoginStatefulHelpText | 常時 | ユーザーログイン時の自動起動設定の状態に応じたヘルプテキスト |

## 例外処理

- デフォルトターミナルが利用不可の場合: DefaultTerminalDropdown が x:Load="false" のため表示されない（CascadiaSettings.IsDefaultTerminalAvailable() による判定）
- StartOnUserLogin が設定不可の場合: StartOnUserLoginConfigurable が false の場合、ToggleSwitch が無効化される

## 備考

- DefaultTerminalDropdown は x:Load="false" で定義されており、IsDefaultTerminalAvailable() が true の場合のみ FindName で強制ロードされる。
- 起動位置の NumberBox は UseDefaultLaunchPosition チェックボックスの状態に連動して有効/無効が切り替わる（InvertBoolean コンバーター使用）。
- LaunchSizeCurrentValue と LaunchParametersCurrentValue は Expander の CurrentValue に表示される要約テキストである。

---

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

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

### 推奨読解順序

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

LaunchViewModel が本画面のすべてのデータを管理する。各設定項目のプロパティとEnumリストの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | LaunchViewModel.idl | `src/cascadia/TerminalSettingsEditor/LaunchViewModel.idl` | DefaultProfiles, LaunchModeList, InitialRows/Cols 等のプロパティ定義と PERMANENT_OBSERVABLE_PROJECTED_SETTING マクロの使い方を理解する |
| 1-2 | LaunchViewModel.h | `src/cascadia/TerminalSettingsEditor/LaunchViewModel.h` | ViewModel クラスのメンバ変数と初期化ロジックを確認する |

**読解のコツ**: PERMANENT_OBSERVABLE_PROJECTED_SETTING マクロは GlobalAppSettings の対応プロパティへの双方向バインドを自動生成する。

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

Launch.cpp のコンストラクタと OnNavigatedTo が初期化処理。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Launch.cpp | `src/cascadia/TerminalSettingsEditor/Launch.cpp` | コンストラクタ（行17-37）でDefaultTerminalDropdownの条件付きロードとAutomationPropertiesの設定を確認。OnNavigatedTo（行39-52）でViewModelの取得とテレメトリ記録を確認 |

**主要処理フロー**:
1. **行17-19**: InitializeComponent でXAMLコンポーネントを初期化
2. **行25-28**: IsDefaultTerminalAvailable チェックと条件付き FindName
3. **行30-36**: 各コントロールの AutomationProperties（アクセシビリティ）設定
4. **行39-52**: OnNavigatedTo で ViewModel 取得、StartOnUserLogin 準備、テレメトリ記録

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Launch.xaml | `src/cascadia/TerminalSettingsEditor/Launch.xaml` | SettingContainer でラップされた各設定項目、ExpanderSettingContainerStyle による展開可能なグループ（LaunchSize, LaunchParameters）を理解する |

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

```
MainPage._Navigate("Launch_Nav")
    |
    +-- contentFrame.Navigate(typeof(Launch), LaunchViewModel)
            |
            +-- Launch::OnNavigatedTo
            |       |
            |       +-- LaunchViewModel 取得
            |       +-- PrepareStartOnUserLoginSettings (非同期)
            |       +-- TraceLogging (テレメトリ)
            |
            +-- Launch::Launch (コンストラクタ)
                    |
                    +-- InitializeComponent
                    +-- IsDefaultTerminalAvailable チェック
                    +-- FindName("DefaultTerminalDropdown") (条件付き)
                    +-- AutomationProperties 設定
```

### データフロー図

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

LaunchViewModel ----------> Launch Page              -----> 各設定コントロール（表示）
(設定データ)                  |                               |
                              +-- x:Bind TwoWay バインド      +-- ViewModel プロパティ更新
                              |                               |
GlobalAppSettings ---------> LaunchViewModel          -----> settings.json (MainPage経由)
(永続化設定)                   |
                              +-- PROJECTED_SETTING で
                                  双方向マッピング
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Launch.xaml | `src/cascadia/TerminalSettingsEditor/Launch.xaml` | テンプレート | UI レイアウト定義 |
| Launch.h | `src/cascadia/TerminalSettingsEditor/Launch.h` | ソース | ページクラス定義 |
| Launch.cpp | `src/cascadia/TerminalSettingsEditor/Launch.cpp` | ソース | 初期化・ナビゲーション処理 |
| LaunchViewModel.idl | `src/cascadia/TerminalSettingsEditor/LaunchViewModel.idl` | IDL | ViewModel インターフェース定義 |
| LaunchViewModel.h | `src/cascadia/TerminalSettingsEditor/LaunchViewModel.h` | ソース | ViewModel クラス定義 |
| LaunchViewModel.cpp | `src/cascadia/TerminalSettingsEditor/LaunchViewModel.cpp` | ソース | ViewModel 実装 |
| CommonResources.xaml | `src/cascadia/TerminalSettingsEditor/CommonResources.xaml` | リソース | 共通スタイル定義 |
| EnumEntry.h | `src/cascadia/TerminalSettingsEditor/EnumEntry.h` | ソース | Enum選択肢のラッパークラス |
