# 画面設計書 33-AddProfile（プロファイル追加）

## 概要

本ドキュメントは、Windows Terminal の設定画面における「プロファイル追加」画面（AddProfile）の設計仕様を記述する。新規プロファイルを作成するためのウィザード画面であり、空のプロファイルの新規作成と既存プロファイルの複製の2つの方法を提供する。

### 本画面の処理概要

**業務上の目的・背景**：ユーザーが新しいターミナルプロファイルを作成するための入口画面である。プロファイルとは、シェルの種類やコマンドライン、外観設定などをまとめた設定単位であり、ユーザーは用途に応じて複数のプロファイルを作成・管理できる。本画面は、空のプロファイルを一から作成する方法と、既存のプロファイルを複製して雛形にする方法の2つを提供し、プロファイル作成のユーザー体験を簡素化する。

**画面へのアクセス方法**：メイン画面（TerminalPage）から Ctrl+, で設定画面（MainPage）を開き、左側ナビゲーションの「プロファイルを追加」項目を選択して遷移する。

**主要な操作・処理内容**：
1. 「新しい空のプロファイルを追加」ボタンの押下による空プロファイル作成
2. 既存プロファイルをComboBoxで選択し「複製」ボタンの押下によるプロファイル複製
3. プロファイル作成後、自動的に新しいプロファイルの基本設定ページに遷移

**画面遷移**：MainPage（設定ナビゲーション）から遷移して表示される。プロファイル作成後は Profiles_Base（基本設定）ページに遷移する。

**権限による表示制御**：特に権限による表示制御は行われない。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 82 | 設定の読み込み・保存 | 主機能 | 新規プロファイル作成（既存複製または空作成） |
| 84 | 設定UI | 主機能 | プロファイル追加のUI表示 |

## 画面種別

登録（ウィザード形式）

## URL/ルーティング

設定画面内のNavigationViewによるページ遷移。タグ値は `AddProfile`。MainPage の ContentFrame に `AddProfile` ページがナビゲートされる。

## 入出力項目

| No | 項目名 | 型 | 入力/出力 | 必須 | 説明 |
|----|--------|-----|----------|------|------|
| 1 | 新規追加ボタン（AddNewButton） | Button（AccentStyle） | 入力 | - | 空のプロファイルを新規作成する |
| 2 | プロファイル選択（Profiles ComboBox） | ComboBox | 入力 | - | 複製元となるプロファイルを選択する |
| 3 | 複製ボタン（DuplicateButton） | Button（AccentStyle） | 入力 | - | 選択したプロファイルを複製する。プロファイル未選択時は無効 |

## 表示項目

| No | 項目名 | 表示形式 | 説明 |
|----|--------|----------|------|
| 1 | プロファイル一覧 | アイコン + プロファイル名 | ComboBox 内に全プロファイルをアイコン付きで表示 |
| 2 | 新規追加ボタン | アイコン（+）+ テキスト | AccentButton スタイルの追加ボタン |
| 3 | 複製ボタン | アイコン（コピー）+ テキスト | AccentButton スタイルの複製ボタン |

## イベント仕様

### 1-新規空プロファイル作成

AddNewClick イベントハンドラにより、テレメトリ（Type="EmptyProfile"）を送信後、AddProfilePageNavigationState.RequestAddNew() を呼び出す。RequestAddNew() は空の GUID で AddNew イベントを発火し、MainPage がこれを受けて新しい空プロファイルを作成し、そのプロファイルの基本設定ページに遷移する。

### 2-既存プロファイル複製

DuplicateClick イベントハンドラにより、Profiles ComboBox で選択されたプロファイルの GUID を取得し、テレメトリ（Type="Duplicate"）を送信後、AddProfilePageNavigationState.RequestDuplicate(guid) を呼び出す。RequestDuplicate() は指定 GUID で AddNew イベントを発火し、MainPage がこれを受けてプロファイルを複製し、新しいプロファイルの基本設定ページに遷移する。

### 3-プロファイル選択変更

ProfilesSelectionChanged イベントハンドラにより、ComboBox でプロファイルが選択されると IsProfileSelected プロパティが true に設定される。これにより複製ボタンが有効化される（IsEnabled バインド）。

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

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

本画面はデータベースを使用しない。設定は settings.json ファイルに保存される。

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| 新規追加 | settings.json (profiles) | INSERT | 空のプロファイルを追加 |
| 複製 | settings.json (profiles) | INSERT | 既存プロファイルのコピーを追加 |

## メッセージ仕様

| No | メッセージID | 種別 | メッセージ内容 | 表示条件 |
|----|-------------|------|---------------|----------|
| - | - | - | 本画面にメッセージ表示はない | - |

## 例外処理

- プロファイルが選択されていない状態では、複製ボタンが無効化される（IsEnabled="{x:Bind IsProfileSelected}"）
- ComboBox の初期選択インデックスは 0 に設定されているが、IsProfileSelected の初期値は false/nullptr であるため、一度選択変更操作が行われるまで複製ボタンは無効

## 備考

- AddProfilePageNavigationState は AddProfile.h 内にインラインで定義されており、CascadiaSettings の参照と AddNew イベントを保持する
- AddNew イベントは AddNewArgs（= TypedEventHandler<guid>）型であり、空の GUID（新規作成）または既存プロファイルの GUID（複製）が渡される
- テレメトリでは、複製時にソースプロファイルが動的プロファイル（Source が空でない）かどうかも記録される
- ComboBox の ItemsSource は State.Settings.AllProfiles にバインドされており、すべてのプロファイルが複製元として選択可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | AddProfile.h | `src/cascadia/TerminalSettingsEditor/AddProfile.h` | 26-45行目: AddProfilePageNavigationState の定義。RequestAddNew() と RequestDuplicate() が AddNew イベントを発火する仕組みを確認する |
| 1-2 | AddProfile.idl | `src/cascadia/TerminalSettingsEditor/AddProfile.idl` | ページとナビゲーションステートのインターフェース定義 |

**読解のコツ**: AddNew イベントの引数が空 GUID（新規）か既存 GUID（複製）かで処理が分岐する。MainPage 側でこのイベントを受け取る処理を確認すること。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | MainPage.cpp | `src/cascadia/TerminalSettingsEditor/MainPage.cpp` | 50行目: addProfileTag 定数定義 |
| 2-2 | AddProfile.cpp | `src/cascadia/TerminalSettingsEditor/AddProfile.cpp` | 19-25行目: コンストラクタでボタンのアクセシビリティ名設定。27-38行目: OnNavigatedTo でナビゲーションステートを受け取る |

**主要処理フロー**:
1. **19-25行目**: InitializeComponent() と AutomationProperties 設定
2. **27-38行目**: OnNavigatedTo で State を受け取り、テレメトリ送信
3. **40-52行目**: AddNewClick で空プロファイル作成
4. **54-71行目**: DuplicateClick でプロファイル複製

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | AddProfile.xaml | `src/cascadia/TerminalSettingsEditor/AddProfile.xaml` | 24-90行目: 2つのセクション（新規追加ボタンと複製セクション）のレイアウト |

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

```
MainPage (設定ナビゲーション)
    |
    +-- AddProfile (ページ)
    |       |
    |       +-- AddProfilePageNavigationState
    |       |       |
    |       |       +-- RequestAddNew()
    |       |       |       +-- AddNew.raise(winrt::guid{})  [空GUID = 新規]
    |       |       |
    |       |       +-- RequestDuplicate(profile)
    |       |               +-- AddNew.raise(profile)  [既存GUID = 複製]
    |       |
    |       +-- AddNewClick --> RequestAddNew()
    |       +-- DuplicateClick --> RequestDuplicate()
    |
    +-- MainPage (AddNew イベント受信)
            +-- プロファイル作成
            +-- Profiles_Base に遷移
```

### データフロー図

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

「新規追加」ボタン ----> AddNewClick() ------> RequestAddNew()
                                                    |
                                             AddNew event (空GUID)
                                                    |
                                             MainPage で新規プロファイル作成
                                                    |
                                             Profiles_Base へ遷移

ComboBox 選択 -------> DuplicateClick() --> RequestDuplicate(GUID)
                                                    |
                                             AddNew event (既存GUID)
                                                    |
                                             MainPage でプロファイル複製
                                                    |
                                             Profiles_Base へ遷移
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| AddProfile.xaml | `src/cascadia/TerminalSettingsEditor/AddProfile.xaml` | ソース | ページのXAMLレイアウト定義 |
| AddProfile.cpp | `src/cascadia/TerminalSettingsEditor/AddProfile.cpp` | ソース | ページのコードビハインド |
| AddProfile.h | `src/cascadia/TerminalSettingsEditor/AddProfile.h` | ソース | ヘッダー定義（NavigationState含む） |
| AddProfile.idl | `src/cascadia/TerminalSettingsEditor/AddProfile.idl` | ソース | WinRT インターフェース定義 |
| MainPage.cpp | `src/cascadia/TerminalSettingsEditor/MainPage.cpp` | ソース | 設定画面のメインページ（AddNewイベント処理） |
| CommonResources.xaml | `src/cascadia/TerminalSettingsEditor/CommonResources.xaml` | リソース | 共通スタイル・テンプレートリソース |
