# 画面設計書 100-Desktop

## 概要

本ドキュメントは、IntegrationTestAppアプリケーションにおけるDesktopPageの画面設計書です。デスクトップ統合機能（トレイアイコン、Dockメニュー）をテストするためのページとして設計されています。

### 本画面の処理概要

**業務上の目的・背景**：本画面は、Avaloniaフレームワークにおけるデスクトップ統合機能の統合テストを目的としています。システムトレイアイコンの表示/非表示制御、トレイアイコンのクリックイベント、トレイメニューの操作、macOSのDockメニュー管理などを検証するためのテストUIを提供します。クロスプラットフォームでのデスクトップ統合機能のテストに使用されます。

**画面へのアクセス方法**：IntegrationTestAppのメインウィンドウ左側のListBoxナビゲーションから「DesktopPage」項目を選択することでアクセスします。

**主要な操作・処理内容**：
1. トレイアイコンのクリック状態を確認（TrayIconClicked）
2. トレイアイコンメニューのクリック状態を確認（TrayIconMenuClicked）
3. 「Toggle TrayIcon Visible」ボタンでトレイアイコンの表示/非表示を切り替え
4. Dockメニューの「Show Main Window」クリック状態を確認（DockMenuShowMainWindow）
5. 「Add Dock Menu Item」ボタンで動的にDockメニュー項目を追加
6. 追加したDockメニュー項目数を表示

**画面遷移**：この画面はIntegrationTestAppのメインウィンドウ内のページとして表示されます。他画面への遷移機能はありません。

**権限による表示制御**：特になし。すべてのユーザーが全機能を利用可能です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 43 | Application | 主機能 | デスクトップのテスト。アプリケーションライフサイクル、トレイアイコン、Dockメニュー管理 |

## 画面種別

テスト・検証画面

## URL/ルーティング

デスクトップアプリケーションのため、URLルーティングはなし。MainWindowのListBoxナビゲーションから「DesktopPage」を選択。

## 入出力項目

| 項目名 | 入出力 | 型 | 必須 | 説明 |
|--------|--------|-----|------|------|
| TrayIconClicked | 出力 | CheckBox (bool) | - | トレイアイコンがクリックされたかを表示 |
| TrayIconMenuClicked | 出力 | CheckBox (bool) | - | トレイメニューがクリックされたかを表示 |
| ToggleTrayIconVisible | 入力 | Button | - | トレイアイコン表示切り替えボタン |
| DockMenuShowMainWindow | 出力 | CheckBox (bool) | - | Dockメニューの「Show Main Window」がクリックされたかを表示 |
| AddDockMenuItem | 入力 | Button | - | Dockメニュー項目追加ボタン |

## 表示項目

| 項目名 | コントロール名 | 説明 |
|--------|--------------|------|
| TrayIconClicked | CheckBox | トレイアイコンクリック状態（App.csのTrayIconCommandで更新） |
| TrayIconMenuClicked | CheckBox | トレイメニュークリック状態（App.csのTrayIconCommandで更新） |
| DockMenuShowMainWindow | CheckBox | Dockメニュークリック状態（App.csのDockMenuCommandで更新） |
| DockMenuItemCount | TextBlock | 追加されたDockメニュー項目数 |

## イベント仕様

### 1-ToggleTrayIconVisible_Click

**トリガー**: 「Toggle TrayIcon Visible」ボタン押下

**処理内容**:
1. TrayIcon.GetIcons(Application.Current!)で現在のトレイアイコンコレクションを取得
2. FirstOrDefault()で最初のトレイアイコンを取得
3. icon.IsVisibleをトグル（反転）

### 2-AddDockMenuItem_Click

**トリガー**: 「Add Dock Menu Item」ボタン押下

**処理内容**:
1. Application.Current!をApp型にキャスト
2. _dockMenuItemCountをインクリメント
3. app.AddDockMenuItem()で「Dynamic Item {count}」という項目を追加
4. app.GetDockMenuItemCount()で現在の項目数を取得
5. DockMenuItemCount.Textを更新

### 3-TrayIconCommand（App.cs）

**トリガー**: トレイアイコンまたはトレイメニューのクリック

**処理内容**:
1. CommandParameterで指定された名前のCheckBoxを検索
2. IsChecked = trueに設定

### 4-DockMenuCommand（App.cs）

**トリガー**: Dockメニュー項目のクリック

**処理内容**:
1. GetLogicalDescendantsでCheckBoxを検索
2. Name一致するCheckBoxのIsChecked = trueに設定

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

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

本画面はUIコントロールのテスト用であり、データベース操作は行いません。

## メッセージ仕様

本画面ではシステムメッセージの表示はありません。

## 例外処理

本画面では例外処理は定義されていません。

## 備考

- x:FieldModifier="public"によりCheckBoxがpublicフィールドとして生成され、App.csからアクセス可能
- TrayIcon.GetIcons()でアプリケーションに登録されたすべてのトレイアイコンを取得
- NativeDock.GetMenu()でmacOSのDockメニューを取得（他プラットフォームではnull）
- トレイアイコンはApp.axamlでTrayIcon.Iconsとして定義
- Dockメニューの初期項目はApp.axamlでNativeDock.Menuとして定義

---

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

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

### 推奨読解順序

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

まず、TrayIconとNativeDockの構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TrayIcon.cs | `src/Avalonia.Controls/TrayIcon.cs` | TrayIconクラス、IsVisible、GetIcons()スタティックメソッド |
| 1-2 | NativeDock.cs | `src/Avalonia.Controls/NativeDock.cs` | NativeDockクラス、GetMenu()添付プロパティ |

**読解のコツ**: TrayIconはApplicationに関連付けられ、GetIcons()でアプリケーション全体のトレイアイコンを取得できます。

#### Step 2: アプリケーション定義を理解する

App.axamlでのトレイアイコンとDockメニューの定義を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | App.axaml | `samples/IntegrationTestApp/App.axaml` | TrayIcon.Icons、NativeDock.Menuの定義 |
| 2-2 | App.axaml.cs | `samples/IntegrationTestApp/App.axaml.cs` | TrayIconCommand、DockMenuCommand、AddDockMenuItem()の実装 |

**主要処理フロー**:
1. **行10-16 (App.axaml)**: NativeDock.Menuの定義
2. **行17-32 (App.axaml)**: TrayIcon.Iconsの定義
3. **行19-29 (App.axaml.cs)**: コマンドの定義とCheckBox操作

#### Step 3: ページ処理を理解する

DesktopPageのイベントハンドラを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | DesktopPage.axaml | `samples/IntegrationTestApp/Pages/DesktopPage.axaml` | UI構造、x:FieldModifier="public"の使用 |
| 3-2 | DesktopPage.axaml.cs | `samples/IntegrationTestApp/Pages/DesktopPage.axaml.cs` | イベントハンドラの実装 |

**主要処理フロー**:
- **行16-19 (axaml.cs)**: ToggleTrayIconVisible_Clickの実装
- **行22-28 (axaml.cs)**: AddDockMenuItem_Clickの実装

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

```
DesktopPage
    │
    ├─ ToggleTrayIconVisible_Click
    │      ├─ TrayIcon.GetIcons(Application.Current!)
    │      └─ icon.IsVisible = !icon.IsVisible
    │
    └─ AddDockMenuItem_Click
           ├─ (App)Application.Current!
           ├─ _dockMenuItemCount++
           ├─ app.AddDockMenuItem($"Dynamic Item {count}")
           │      └─ NativeDock.GetMenu(this)?.Items.Insert(...)
           └─ DockMenuItemCount.Text = app.GetDockMenuItemCount()

App
    ├─ TrayIconCommand
    │      └─ _mainWindow.Get<CheckBox>(name).IsChecked = true
    │
    └─ DockMenuCommand
           └─ GetLogicalDescendants().OfType<CheckBox>()
                  .FirstOrDefault(x => x.Name == name)
                  .IsChecked = true
```

### データフロー図

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

Toggle TrayIcon   ───▶  icon.IsVisible反転       ───▶  トレイアイコン表示/非表示
ボタン押下

Add Dock Menu     ───▶  AddDockMenuItem()        ───▶  Dockメニュー項目追加
ボタン押下               │
                        └─ GetDockMenuItemCount() ───▶  DockMenuItemCount更新

トレイアイコン    ───▶  TrayIconCommand          ───▶  TrayIconClicked.IsChecked
クリック                                                = true

トレイメニュー    ───▶  TrayIconCommand          ───▶  TrayIconMenuClicked.IsChecked
クリック                                                = true

Dockメニュー      ───▶  DockMenuCommand          ───▶  DockMenuShowMainWindow.IsChecked
クリック                                                = true
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| DesktopPage.axaml | `samples/IntegrationTestApp/Pages/DesktopPage.axaml` | ソース | ページのUI定義 |
| DesktopPage.axaml.cs | `samples/IntegrationTestApp/Pages/DesktopPage.axaml.cs` | ソース | ページのコードビハインド |
| App.axaml | `samples/IntegrationTestApp/App.axaml` | ソース | TrayIcon、Dockメニュー定義 |
| App.axaml.cs | `samples/IntegrationTestApp/App.axaml.cs` | ソース | コマンド実装、AddDockMenuItem |
| MainWindow.axaml | `samples/IntegrationTestApp/MainWindow.axaml` | ソース | メインウィンドウとナビゲーション |
| MainWindow.axaml.cs | `samples/IntegrationTestApp/MainWindow.axaml.cs` | ソース | ページ生成ファクトリ（行84） |
