# 画面設計書 7-設定エラーダイアログ

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータの設定エラーダイアログの設計について記載する。このダイアログは、設定ファイル（config.ghostty）の読み込み時にエラーが発生した場合に表示される。

### 本画面の処理概要

設定エラーダイアログは、設定ファイルの解析エラーをユーザーに通知し、リロードまたは無視の選択肢を提供する。

**業務上の目的・背景**：設定ファイルの構文エラーや無効な値が存在する場合、アプリケーションは起動できるが一部の設定が適用されない。このダイアログにより、ユーザーはエラー内容を確認し、設定ファイルを修正してリロードするか、エラーを無視して続行するかを選択できる。

**画面へのアクセス方法**：
- アプリケーション起動時に設定エラーがある場合に自動表示
- 設定ファイルのリロード時にエラーがある場合に自動表示

**主要な操作・処理内容**：
1. エラー一覧の確認（スクロール可能）
2. 「Reload Configuration」ボタンで設定を再読み込み
3. 「Ignore」ボタンでエラーを無視して続行

**画面遷移**：
- 設定読み込み（エラー発生） → 設定エラーダイアログ表示
- リロード成功 → ダイアログ閉じる → ターミナル画面
- リロード（再度エラー） → エラーリスト更新
- 無視 → ダイアログ閉じる → ターミナル画面

**権限による表示制御**：特になし。すべてのユーザーに同一のダイアログが表示される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 39 | 設定ファイル | 主機能 | 設定ファイルの読み込みエラー表示 |
| 41 | 設定リロード | 補助機能 | リロードボタン押下時の設定再読み込み |

## 画面種別

エラー通知ダイアログ（モーダル）

## URL/ルーティング

N/A（ネイティブデスクトップアプリケーション）

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 必須 | 説明 |
|--------|----------|----------|------|------|
| errors | 入力/出力 | [String] | はい | エラーメッセージの配列 |
| model | 入力 | ConfigurationErrorsViewModel | はい | エラー状態を管理するViewModel |

## 表示項目

| 項目名 | 表示位置 | データ型 | 説明 |
|--------|----------|----------|------|
| 警告アイコン | 左上 | Image | 黄色の三角形警告アイコン（52pt） |
| 説明テキスト | 右上 | Text | エラー件数と対処方法の説明 |
| エラーリスト | 中央 | ScrollView | エラーメッセージ一覧（モノスペースフォント） |
| Ignoreボタン | 下右 | Button | エラーを無視して続行 |
| Reloadボタン | 下右 | Button | 設定を再読み込み |

## イベント仕様

### 1-ダイアログ表示

設定エラーが検出されると、以下の処理が実行される：

1. ConfigurationErrorsViewModelにエラー配列が設定される
2. エラー数が0より大きい場合、ダイアログが表示される
3. エラーメッセージがリスト形式で表示される

### 2-Ignoreボタン押下

「Ignore」ボタンが押下されると、以下の処理が実行される：

1. `model.errors = []`でエラー配列をクリア
2. ダイアログが閉じる
3. エラーのある設定行は無視され、残りの設定が適用される

### 3-Reload Configurationボタン押下

「Reload Configuration」ボタンが押下されると、以下の処理が実行される：

1. `reloadConfig()`が呼び出される
2. AppDelegate.reloadConfig(nil)で設定を再読み込み
3. 成功時: エラー配列がクリアされ、ダイアログが閉じる
4. 再度エラー発生時: エラーリストが更新される

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

N/A（本アプリケーションはデータベースを使用しない）

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| MSG001 | 警告 | "X error(s) were found while loading the configuration. Please review the errors below and reload your configuration or ignore the erroneous lines." | 常に表示（Xはエラー数） |

## 例外処理

| 例外状況 | 処理内容 |
|----------|----------|
| リロード後もエラー | エラーリストを更新して表示継続 |
| AppDelegateが取得できない | リロード処理をスキップ |

## 備考

- macOS版はSwiftUIで実装、GTK版はconfig_errors_dialog.zigで実装
- エラーメッセージはモノスペースフォント（12pt）で表示
- テキスト選択が可能（.textSelection(.enabled)）
- ウィンドウサイズ: minWidth: 480, maxWidth: 960, minHeight: 270
- inflect修飾子で"error(s)"の単数/複数形を自動調整

---

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

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

### 推奨読解順序

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

ViewModelプロトコルを理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | ConfigurationErrorsView.swift | `macos/Sources/Features/Settings/ConfigurationErrorsView.swift` | ConfigurationErrorsViewModelプロトコル（3-5行目） |

**読解のコツ**: ViewModelはObservableObjectを継承し、errorsプロパティを持つ。errorsが空になるとダイアログが閉じる。

#### Step 2: ビュー構造を理解する

SwiftUIビューの実装を理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | ConfigurationErrorsView.swift | `macos/Sources/Features/Settings/ConfigurationErrorsView.swift` | body変数（10-54行目） |

**主要処理フロー**:
1. **12-25行目**: HStackで警告アイコンと説明テキスト
2. **27-44行目**: GeometryReader + ScrollViewでエラーリスト
3. **46-51行目**: ボタン配置

#### Step 3: リロード処理を理解する

設定再読み込みの実装を理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | ConfigurationErrorsView.swift | `macos/Sources/Features/Settings/ConfigurationErrorsView.swift` | reloadConfig()（56-59行目） |

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

```
ConfigurationErrorsView
    │
    ├─ VStack
    │      ├─ HStack
    │      │      ├─ Image (警告アイコン)
    │      │      └─ Text (説明)
    │      │
    │      ├─ GeometryReader
    │      │      └─ ScrollView
    │      │             └─ ForEach (エラーリスト)
    │      │                    └─ Text (各エラー)
    │      │
    │      └─ HStack (ボタン)
    │             ├─ Button ("Ignore")
    │             │      └─ model.errors = []
    │             │
    │             └─ Button ("Reload Configuration")
    │                    └─ reloadConfig()
    │                           └─ AppDelegate.reloadConfig(nil)
```

### データフロー図

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

設定ファイル読み込み ────▶ エラー検出 ─────────────────▶ errors配列更新
                              │
                              ▼
                        ConfigurationErrorsView表示
                              │
                              ▼
ユーザー操作 ───────────────▶ Ignore / Reload
(ボタン押下)                   │
                              ├─ Ignore: errors = []
                              └─ Reload: AppDelegate.reloadConfig()
                                    │
                                    ▼
                              設定再読み込み → エラー更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| ConfigurationErrorsView.swift | `macos/Sources/Features/Settings/ConfigurationErrorsView.swift` | ソース | エラーダイアログのSwiftUIビュー |
| AppDelegate.swift | `macos/Sources/App/AppDelegate.swift` | ソース | reloadConfig実装 |
| config_errors_dialog.zig | `src/apprt/gtk/class/config_errors_dialog.zig` | ソース | GTK版の実装 |
