# 画面設計書 38-Profiles_Base_Orphaned（孤立プロファイル）

## 概要

本ドキュメントは、Windows Terminal の設定画面における「孤立プロファイル」画面（Profiles_Base_Orphaned）の設計仕様を記述する。動的プロファイルソース（拡張機能やジェネレータ）が削除されたにもかかわらず settings.json にプロファイル設定が残っている「孤立した」プロファイルを表示し、削除操作を提供する最小限のページである。

### 本画面の処理概要

**業務上の目的・背景**：Windows Terminal は動的プロファイルジェネレータや拡張機能（フラグメント）によりプロファイルが自動的に追加される。これらのソースがアンインストールされた場合、対応するプロファイルの設定データは settings.json に残るが、ソースが見つからないため「孤立」状態となる。本画面は、このような孤立プロファイルの情報（名前・ソース）を表示し、ユーザーが不要な設定を削除できるようにする。孤立プロファイルは通常のプロファイル編集機能を持たず、削除のみが可能な簡素なページとなっている。

**画面へのアクセス方法**：メイン画面（TerminalPage）から Ctrl+, で設定画面（MainPage）を開き、左側ナビゲーションで孤立プロファイルを選択して遷移する。孤立プロファイルは通常のプロファイルとは異なるアイコンや表示で区別される。

**主要な操作・処理内容**：
1. 孤立プロファイルの名前の表示（読み取り専用）
2. 孤立プロファイルのソース（元の動的プロファイルソース）の表示（読み取り専用）
3. 孤立プロファイルの削除

**画面遷移**：MainPage（設定ナビゲーション）から孤立プロファイル選択で遷移する。削除後は MainPage に戻る。

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 82 | 設定の読み込み・保存 | 主機能 | 削除されたプロファイルの編集 |
| 84 | 設定UI | 主機能 | 孤立プロファイル設定のUI表示 |

## 画面種別

詳細（読み取り専用 + 削除操作）

## URL/ルーティング

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

## 入出力項目

| No | 項目名 | 型 | 入力/出力 | 必須 | 説明 |
|----|--------|-----|----------|------|------|
| 1 | 削除ボタン（Profile_Delete_Orphaned） | Button（DeleteStyle） | 入力 | - | 孤立プロファイルを削除する。確認ダイアログなし |
| 2 | 名前（Profile_Name） | TextBlock | 出力 | - | プロファイルの表示名（読み取り専用） |
| 3 | ソース（Profile_Source_Orphaned） | TextBlock | 出力 | - | 元の動的プロファイルソース名（読み取り専用） |

## 表示項目

| No | 項目名 | 表示形式 | 説明 |
|----|--------|----------|------|
| 1 | プロファイル名 | TextBlock（SettingsPageItemDescriptionStyle） | Segoe UI / Segoe Fluent Icons フォントで表示 |
| 2 | ソース名 | TextBlock（SettingsPageItemDescriptionStyle） | 元のプロファイルソース識別子を表示 |
| 3 | 削除ボタン | DeleteButtonStyle のボタン（アイコン + テキスト） | ゴミ箱アイコン付き |

## イベント仕様

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

DeleteConfirmation_Click イベントハンドラにより、ProfileViewModel.DeleteProfile() を直接呼び出す。通常の Profiles_Base と異なり、確認フライアウトなしで即時削除される。削除後は MainPage 側の処理によりナビゲーションが更新される。

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

LayoutUpdated イベントにより、Profile.FocusDeleteButton が true の場合に DeleteButton にプログラムフォーカスを設定する。Profiles_Base と同様の UX 改善処理。

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

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

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

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

## メッセージ仕様

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

## 例外処理

- 孤立プロファイルの名前やソースが空の場合でも、TextBlock は空文字で表示される（クラッシュしない）

## 備考

- Profiles_Base と比較して非常にシンプルな構成。編集不可の情報表示と削除ボタンのみ
- 削除時に確認フライアウトが表示されない点が Profiles_Base と異なる
- テレメトリでは PageId="profileOrphaned" として記録される
- Profile.Name と Profile.Source は OneTime バインドであり、ページ表示中は更新されない
- SettingContainer で各情報をラップしているが、SettingContainer のリセットボタンやオーバーライド表示は使用されない
- 通常のプロファイルでは TraceLogging に Orphaned=false が記録されるが、本画面からの削除では TraceLogging が省略されている

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Profiles_Base_Orphaned.idl | `src/cascadia/TerminalSettingsEditor/Profiles_Base_Orphaned.idl` | ページクラスのインターフェース定義 |
| 1-2 | Profiles_Base_Orphaned.h | `src/cascadia/TerminalSettingsEditor/Profiles_Base_Orphaned.h` | 12-24行目: ページの構造体定義。ProfileViewModel プロパティと LayoutUpdated_revoker |

**読解のコツ**: 非常にシンプルな構造体で、Profile プロパティと DeleteConfirmation_Click のみを持つ。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Profiles_Base_Orphaned.cpp | `src/cascadia/TerminalSettingsEditor/Profiles_Base_Orphaned.cpp` | 17-20行目: コンストラクタで削除ボタンのアクセシビリティ名設定。23-53行目: OnNavigatedTo で NavigateToProfileArgs を受け取り、フォーカス処理とテレメトリ送信 |

**主要処理フロー**:
1. **17-20行目**: InitializeComponent() と DeleteButton のアクセシビリティ名設定
2. **23-26行目**: OnNavigatedTo で Profile を取得
3. **28-42行目**: LayoutUpdated でフォーカス処理
4. **44-52行目**: テレメトリ送信（PageId="profileOrphaned"）
5. **55-58行目**: DeleteConfirmation_Click で即時削除

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Profiles_Base_Orphaned.xaml | `src/cascadia/TerminalSettingsEditor/Profiles_Base_Orphaned.xaml` | 24-58行目: 3つの SettingContainer（削除ボタン、名前表示、ソース表示）のシンプルなレイアウト |

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

```
MainPage (設定ナビゲーション)
    |
    +-- Profiles_Base_Orphaned (ページ)
            |
            +-- ProfileViewModel
            |       +-- Name (読み取り専用表示)
            |       +-- Source (読み取り専用表示)
            |       +-- FocusDeleteButton (フォーカス制御)
            |       +-- DeleteProfile() (削除実行)
            |
            +-- DeleteConfirmation_Click --> DeleteProfile()
```

### データフロー図

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

削除ボタン押下 ------> DeleteConfirmation_Click ------> ProfileViewModel.DeleteProfile()
                                                            |
                                                        settings.json からプロファイル削除
                                                            |
                                                        MainPage でナビゲーション更新
```

### 関連ファイル一覧

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