# 画面設計書 34-Profiles_Base（基本設定）

## 概要

本ドキュメントは、Windows Terminal の設定画面における「プロファイル基本設定」画面（Profiles_Base）の設計仕様を記述する。個別プロファイルの名前、コマンドライン、起動ディレクトリ、アイコンなど基本的な設定項目を編集するページである。

### 本画面の処理概要

**業務上の目的・背景**：プロファイルとは、ターミナルで使用するシェルの種類やコマンドライン、起動ディレクトリ、アイコンなどの設定をまとめた単位である。本画面は、プロファイルの最も基本的な設定項目を編集するためのメインページであり、プロファイル設定の入り口となる。ここから外観設定（Profiles_Appearance）、ターミナル設定（Profiles_Terminal）、詳細設定（Profiles_Advanced）の各サブページに遷移できる。また、プロファイルのデフォルト設定（profile.defaults）の編集にも使用される。

**画面へのアクセス方法**：メイン画面（TerminalPage）から Ctrl+, で設定画面（MainPage）を開き、左側ナビゲーションでプロファイルを選択して遷移する。AddProfile ページでプロファイルを新規作成した場合もこのページに遷移する。

**主要な操作・処理内容**：
1. プロファイル名の編集（TextBox）
2. コマンドラインの編集（TextBox + ファイルブラウズ）
3. 起動ディレクトリの編集（TextBox + フォルダブラウズ + 親プロセスディレクトリ使用チェック）
4. アイコンの設定（種類選択: ビルトイン/画像/絵文字 + 入力/ブラウズ）
5. タブタイトルの編集
6. タブ色の設定（NullableColorPicker）
7. 管理者権限での起動設定（Elevate トグル）
8. プロファイルの非表示設定（Hidden トグル）
9. サブページ（外観/ターミナル/詳細）への遷移
10. プロファイルの削除（確認フライアウト付き）

**画面遷移**：MainPage（設定ナビゲーション）からプロファイル選択で遷移する。サブページとして Profiles_Appearance、Profiles_Terminal、Profiles_Advanced への遷移ボタンを持つ。

**権限による表示制御**：IsBaseLayer（デフォルトプロファイル）の場合、「名前」「コマンドライン」「非表示」の設定項目は非表示となる。また、CanDeleteProfile が false のプロファイルでは削除ボタンが非表示となる。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 82 | 設定の読み込み・保存 | 主機能 | プロファイルの名前・コマンドライン・起動ディレクトリ・アイコンの設定 |
| 84 | 設定UI | 主機能 | プロファイル基本設定のUI表示 |

## 画面種別

編集

## URL/ルーティング

設定画面内のNavigationViewによるページ遷移。MainPage の ContentFrame に `Profiles_Base` ページがナビゲートされる。NavigateToProfileArgs（Profile + WindowRoot）がパラメータとして渡される。

## 入出力項目

| No | 項目名 | 型 | 入力/出力 | 必須 | 説明 |
|----|--------|-----|----------|------|------|
| 1 | 名前（Profile_Name） | TextBox | 入力 | はい | プロファイルの表示名。TwoWay バインド。BaseLayer 時は非表示 |
| 2 | コマンドライン（Profile_Commandline） | TextBox + BrowseButton | 入力 | - | 実行するコマンドライン。参照ボタンで exe/cmd/bat ファイルを選択可能。BaseLayer 時は非表示 |
| 3 | 起動ディレクトリ（Profile_StartingDirectory） | TextBox + BrowseButton + CheckBox | 入力 | - | プロファイルの起動ディレクトリ。「親プロセスのディレクトリを使用」チェックボックスで無効化可能 |
| 4 | アイコン種類（Profile_IconType） | ComboBox | 入力 | - | ビルトインアイコン / 画像ファイル / 絵文字 の選択 |
| 5 | ビルトインアイコン（Profile_BuiltInIcon） | AutoSuggestBox | 入力 | - | ビルトインアイコンの検索と選択。UsingBuiltInIcon 時のみ表示 |
| 6 | アイコンパス（Profile_IconBox） | TextBox + BrowseButton | 入力 | - | 画像ファイルのパス。UsingImageIcon 時のみ表示 |
| 7 | 絵文字アイコン（Profile_IconEmojiBox） | TextBox | 入力 | - | 絵文字の入力。UsingEmojiIcon 時のみ表示 |
| 8 | タブタイトル（Profile_TabTitle） | TextBox | 入力 | - | タブに表示するタイトル |
| 9 | タブ色（Profile_TabColor） | NullableColorPicker | 入力 | - | タブの色設定。カラースキームのプレビュー付き |
| 10 | 管理者権限（Profile_Elevate） | ToggleSwitch | 入力 | - | 管理者権限での起動有無 |
| 11 | 非表示（Profile_Hidden） | ToggleSwitch | 入力 | - | プロファイルの非表示設定。BaseLayer 時は非表示 |
| 12 | 外観ナビゲーター | Button | 入力 | - | 外観設定サブページへの遷移 |
| 13 | ターミナルナビゲーター | Button | 入力 | - | ターミナル設定サブページへの遷移 |
| 14 | 詳細ナビゲーター | Button | 入力 | - | 詳細設定サブページへの遷移 |
| 15 | 削除ボタン | Button + Flyout | 入力 | - | プロファイルの削除（確認付き）。CanDeleteProfile が false の場合は非表示 |

## 表示項目

| No | 項目名 | 表示形式 | 説明 |
|----|--------|----------|------|
| 1 | BaseLayer 免責事項 | DisclaimerStyle テキスト | デフォルトプロファイル編集時に表示される注意書き |
| 2 | アイコンプレビュー | 16x16 IconSourceElement | 現在設定されているアイコンのプレビュー |
| 3 | タブ色プレビュー | ColorPreviewTemplate | 設定されたタブ色のプレビュー |
| 4 | 設定オーバーライドソース | テキスト | 設定が他のソース（拡張機能等）でオーバーライドされている場合のソース表示 |

## イベント仕様

### 1-コマンドライン参照

Commandline_Click イベントハンドラにより、ファイルピッカー（OpenFilePicker）を表示する。フィルタは exe/cmd/bat ファイル。選択したファイルのパスが Profile.Commandline に設定される。

### 2-起動ディレクトリ参照

StartingDirectory_Click イベントハンドラにより、フォルダピッカー（OpenFilePicker with FOS_PICKFOLDERS）を表示する。選択したフォルダのパスが Profile.StartingDirectory に設定される。

### 3-アイコン参照

Icon_Click イベントハンドラにより、画像ファイルピッカー（OpenImagePicker）を表示する。選択したファイルのパスが Profile.IconPath に設定される。

### 4-ビルトインアイコン選択

BuiltInIconPicker_GotFocus でアイコンフィルタをリセットしサジェストリストを表示。BuiltInIconPicker_TextChanged でユーザー入力に基づくフィルタリング。BuiltInIconPicker_QuerySubmitted で選択されたアイコンを Profile.CurrentBuiltInIcon に設定する。

### 5-サブページ遷移

Appearance_Click、Terminal_Click、Advanced_Click の各イベントハンドラにより、Profile.CurrentPage を ProfileSubPage.Appearance / Terminal / Advanced に設定する。MainPage がこの変更を検知して対応するサブページをナビゲートする。

### 6-プロファイル削除

DeleteConfirmation_Click イベントハンドラにより、テレメトリを送信後、ProfileViewModel.DeleteProfile() を呼び出す。確認はボタンのFlyout内で行われる。

### 7-レイアウト更新後フォーカス

LayoutUpdated イベントにより、Profile.FocusDeleteButton が true の場合に DeleteButton にプログラムフォーカスを設定する（新規プロファイル作成直後の UX 向上のため）。

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

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

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

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| 各設定変更 | settings.json (profiles) | UPDATE | プロファイル設定の更新 |
| プロファイル削除 | settings.json (profiles) | DELETE | プロファイルの削除 |

## メッセージ仕様

| No | メッセージID | 種別 | メッセージ内容 | 表示条件 |
|----|-------------|------|---------------|----------|
| 1 | Profile_BaseLayerDisclaimer | 情報 | デフォルトプロファイル編集の注意書き | IsBaseLayer が true の場合 |
| 2 | Profile_DeleteConfirmationMessage | 確認 | プロファイル削除の確認メッセージ | 削除ボタンの Flyout 内 |

## 例外処理

- ファイルピッカーでキャンセルした場合、パスは更新されない（空文字チェック後の条件分岐）
- 起動ディレクトリが空の場合、「親プロセスのディレクトリを使用」チェックボックスが自動的にチェックされる
- CanDeleteProfile が false のプロファイル（デフォルトプロファイル等）では削除ボタンが非表示

## 備考

- 各設定項目は SettingContainer コントロールでラップされており、HasSettingValue / ClearSettingValue / SettingOverrideSource プロパティによりリセットボタンとオーバーライド表示が制御される
- アイコン設定は3種類（BuiltIn / Image / Emoji）から選択でき、Profile.CurrentIconType によって表示される入力コントロールが切り替わる
- ビルトインアイコンの AutoSuggestBox はフィルタリング機能付きで、入力テキストに基づいて候補が絞り込まれる
- サブページ遷移は Profile.CurrentPage プロパティの変更により MainPage 側で検知・処理される

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Profiles_Base.idl | `src/cascadia/TerminalSettingsEditor/Profiles_Base.idl` | ページクラスのインターフェース定義 |
| 1-2 | Profiles_Base.h | `src/cascadia/TerminalSettingsEditor/Profiles_Base.h` | ページの構造体定義。Profile プロパティと各イベントハンドラ |

**読解のコツ**: ProfileViewModel は別ファイル（ProfileViewModel.h/cpp）に定義されており、プロファイルの全設定項目のプロパティとロジックを持つ。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Profiles_Base.cpp | `src/cascadia/TerminalSettingsEditor/Profiles_Base.cpp` | 17-28行目: コンストラクタでアクセシビリティ名とナビゲーターボタンのコンテンツ設定。30-68行目: OnNavigatedTo でプロファイル受け取り、親ディレクトリチェック、フォーカス処理 |

**主要処理フロー**:
1. **17-28行目**: コンストラクタで UI 初期化
2. **30-33行目**: OnNavigatedTo で NavigateToProfileArgs からプロファイルとウィンドウルートを取得
3. **37-39行目**: 起動ディレクトリが空の場合にチェックボックスを自動チェック
4. **42-56行目**: LayoutUpdated で削除ボタンへのフォーカス処理
5. **58-68行目**: テレメトリ送信

#### Step 3: ファイルピッカー処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Profiles_Base.cpp | `src/cascadia/TerminalSettingsEditor/Profiles_Base.cpp` | 106-134行目: Commandline_Click（exe/cmd/bat フィルタ付きファイルピッカー）。136-146行目: Icon_Click（画像ファイルピッカー）。148-171行目: StartingDirectory_Click（フォルダピッカー） |

#### Step 4: ビルトインアイコンピッカーを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Profiles_Base.cpp | `src/cascadia/TerminalSettingsEditor/Profiles_Base.cpp` | 178-244行目: BuiltInIconPicker のフォーカス、テキスト変更、クエリ送信、フィルタリングロジック |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | Profiles_Base.xaml | `src/cascadia/TerminalSettingsEditor/Profiles_Base.xaml` | 25-288行目: 各設定項目の SettingContainer レイアウト。251-259行目: サブページナビゲーターボタン |

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

```
MainPage (設定ナビゲーション)
    |
    +-- Profiles_Base (ページ)
            |
            +-- ProfileViewModel (プロファイル設定全般)
            |       |
            |       +-- Name, Commandline, StartingDirectory, Icon, ...
            |       +-- CurrentPage (サブページ遷移制御)
            |       +-- DeleteProfile()
            |       +-- IconTypes / CurrentIconType (アイコン種別)
            |       +-- CurrentBuiltInIcon (ビルトインアイコン)
            |
            +-- Commandline_Click --> OpenFilePicker (exe/cmd/bat)
            +-- StartingDirectory_Click --> OpenFilePicker (folders)
            +-- Icon_Click --> OpenImagePicker
            +-- BuiltInIconPicker --> AutoSuggestBox フィルタリング
            +-- Appearance_Click --> CurrentPage = Appearance
            +-- Terminal_Click --> CurrentPage = Terminal
            +-- Advanced_Click --> CurrentPage = Advanced
            +-- DeleteConfirmation_Click --> ProfileViewModel.DeleteProfile()
```

### データフロー図

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

TextBox/Toggle入力 -----> XAML TwoWay バインド ----------> ProfileViewModel プロパティ更新
ファイルブラウズ --------> OpenFilePicker() ------------> Profile.Commandline/IconPath/StartingDirectory
ビルトインアイコン -----> AutoSuggestBox フィルタ ------> Profile.CurrentBuiltInIcon
サブページボタン -------> CurrentPage 設定 -------------> MainPage がサブページにナビゲート
削除ボタン ------------> DeleteProfile() --------------> settings.json から削除
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Profiles_Base.xaml | `src/cascadia/TerminalSettingsEditor/Profiles_Base.xaml` | ソース | ページのXAMLレイアウト定義 |
| Profiles_Base.cpp | `src/cascadia/TerminalSettingsEditor/Profiles_Base.cpp` | ソース | ページのコードビハインド |
| Profiles_Base.h | `src/cascadia/TerminalSettingsEditor/Profiles_Base.h` | ソース | ヘッダー定義 |
| Profiles_Base.idl | `src/cascadia/TerminalSettingsEditor/Profiles_Base.idl` | ソース | WinRT インターフェース定義 |
| ProfileViewModel.h | `src/cascadia/TerminalSettingsEditor/ProfileViewModel.h` | ソース | プロファイル ViewModel の定義 |
| ProfileViewModel.cpp | `src/cascadia/TerminalSettingsEditor/ProfileViewModel.cpp` | ソース | プロファイル ViewModel の実装 |
| MainPage.cpp | `src/cascadia/TerminalSettingsEditor/MainPage.cpp` | ソース | 設定画面のメインページ |
| CommonResources.xaml | `src/cascadia/TerminalSettingsEditor/CommonResources.xaml` | リソース | 共通スタイル・テンプレートリソース |
