# 画面設計書 8-タイトル変更ダイアログ

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータのタイトル変更ダイアログの設計について記載する。このダイアログは、ターミナルまたはタブのタイトルを変更するための入力インターフェースを提供する。

### 本画面の処理概要

タイトル変更ダイアログは、ユーザーがターミナルウィンドウまたはタブのタイトルをカスタマイズできる機能を提供する。

**業務上の目的・背景**：複数のターミナルウィンドウやタブを使用する際、自動的に設定されるタイトル（カレントディレクトリやプロセス名）だけでは識別が困難な場合がある。ユーザーが任意のタイトルを設定することで、作業内容に応じた分かりやすい名前を付けることができる。

**画面へのアクセス方法**：
- メニューバーから「Window > Change Tab Title」を選択
- タブバーのタブを右クリック → 「Change Title」を選択
- （GTK版）コマンドまたはキーバインドで呼び出し

**主要な操作・処理内容**：
1. 現在のタイトルの表示（初期値として）
2. 新しいタイトルの入力
3. OKボタンで変更を適用
4. キャンセルボタンで変更を破棄

**画面遷移**：
- ターミナル/タブ → タイトル変更ダイアログ表示
- OK/キャンセル → ダイアログ閉じる → ターミナル/タブ

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 92 | タブタイトル変更 | 主機能 | ターミナルまたはタブのタイトル変更入力 |

## 画面種別

入力ダイアログ（モーダル）

## URL/ルーティング

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

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 必須 | 説明 |
|--------|----------|----------|------|------|
| target | 入力 | Target | はい | 変更対象（surface/tab） |
| initial_value | 入力 | String? | - | 初期表示するタイトル |
| new_title | 出力 | String | - | 入力された新しいタイトル |

## 表示項目

| 項目名 | 表示位置 | データ型 | 説明 |
|--------|----------|----------|------|
| ダイアログタイトル | 上部 | Text | "Change Terminal Title"または"Change Tab Title" |
| テキスト入力フィールド | 中央 | Entry | タイトル入力欄 |
| キャンセルボタン | 下部 | Button | 変更をキャンセル |
| OKボタン | 下部 | Button | 変更を適用 |

## イベント仕様

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

タイトル変更が要求されると、以下の処理が実行される（GTK版）：

1. `TitleDialog.new(target, initial_value)`でダイアログを作成
2. `present(parent)`で親ウィンドウにアタッチして表示
3. 初期値がある場合、テキストフィールドに設定
4. ターゲットに応じてダイアログタイトルを設定

### 2-OKボタン押下

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

1. `alertDialogReady`コールバックが呼び出される
2. レスポンスが"ok"かどうかを確認
3. テキストフィールドから新しいタイトルを取得
4. `set`シグナルを発行して新しいタイトルを通知

### 3-キャンセル

キャンセルボタンまたはダイアログを閉じると、以下の処理が実行される：

1. `alertDialogReady`コールバックが呼び出される
2. レスポンスが"ok"でないため何もしない
3. ダイアログが閉じる

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

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

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| MSG001 | タイトル | "Change Terminal Title" | target = surface |
| MSG002 | タイトル | "Change Tab Title" | target = tab |

## 例外処理

| 例外状況 | 処理内容 |
|----------|----------|
| 空のタイトル入力 | 空文字列としてそのまま設定（デフォルトタイトルに戻る場合あり） |

## 備考

- GTK専用機能（macOSはシステム標準のNSAlertを使用）
- adw.AlertDialogを継承したカスタムダイアログ
- Blueprintテンプレート（title-dialog.blp）でUI定義
- ターゲットはsurface（単一ターミナル）またはtab
- i18n対応（_()マクロで国際化）

---

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

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

### 推奨読解順序

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

Target enumとプロパティを理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | title_dialog.zig | `src/apprt/gtk/class/title_dialog.zig` | Target enum（220-234行目） |
| 1-2 | title_dialog.zig | 同上 | properties構造体（28-61行目） |

**読解のコツ**: TargetはsurfaceとtabのGObjectenum。title()メソッドでダイアログタイトルを返す。

#### Step 2: ダイアログ構造を理解する

TitleDialog externストラクト構造を理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | title_dialog.zig | `src/apprt/gtk/class/title_dialog.zig` | TitleDialog構造体（16-27行目） |
| 2-2 | title_dialog.zig | 同上 | Private構造体（77-86行目） |

**主要処理フロー**:
1. **92-94行目**: new - インスタンス作成
2. **96-128行目**: present - ダイアログ表示
3. **130-149行目**: alertDialogReady - 結果処理

#### Step 3: シグナルを理解する

setシグナルによるタイトル変更通知を理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | title_dialog.zig | `src/apprt/gtk/class/title_dialog.zig` | signals構造体（63-75行目） |

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

```
TitleDialog (GObject Class)
    │
    ├─ extends adw.AlertDialog
    │
    ├─ properties
    │      ├─ target: Target (surface/tab)
    │      └─ initial-value: ?[:0]const u8
    │
    ├─ signals
    │      └─ set: (title: [*:0]const u8) -> void
    │
    ├─ new(target, initial_value) -> *TitleDialog
    │
    ├─ present(parent: *gtk.Widget)
    │      ├─ setHeading(target.title())
    │      ├─ entry.getBuffer().setText(initial_value)
    │      └─ choose(parent, alertDialogReady)
    │
    └─ alertDialogReady (コールバック)
           │
           └─ (response == "ok") → signals.set.emit(title)
```

### データフロー図

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

タイトル変更要求 ────────▶ TitleDialog.new() ───────────▶ ダイアログ表示
                              │
                              ▼
                        TitleDialog.present()
                              │
                              ▼
ユーザー入力 ────────────▶ entry.getBuffer().getText()
(新しいタイトル)               │
                              ▼
OKボタン押下 ─────────────▶ alertDialogReady()
                              │
                              ▼
                        signals.set.emit(title) ────────▶ 呼び出し元で処理
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| title_dialog.zig | `src/apprt/gtk/class/title_dialog.zig` | ソース | GTK版タイトル変更ダイアログ |
| title-dialog.blp | `src/apprt/gtk/ui/title-dialog.blp` | UI定義 | Blueprintテンプレート |
| BaseTerminalController.swift | `macos/Sources/Features/Terminal/BaseTerminalController.swift` | ソース | macOS版promptTabTitle（359-387行目） |
