# 機能設計書 90-タブ移動

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータにおけるタブ移動機能の設計仕様を記載する。

### 本機能の処理概要

タブ移動機能は、現在アクティブなタブの位置をタブバー内で左右に移動させる機能である。タブの並び順を変更することで、ワークフローに合わせたタブ整理が可能になる。

**業務上の目的・背景**：
多数のタブを開いて作業する場合、関連するタブを近くに配置することで作業効率が向上する。タブを閉じて再度開くことなく、位置を変更できる機能を提供する。

**機能の利用シーン**：
- 関連するタブをまとめて配置したい場合
- 重要なタブを先頭や末尾に移動したい場合
- キーボードショートカットでタブの順序を素早く変更

**主要な処理内容**：
1. キーバインドアクション`move_tab`を受け取る（オフセット値付き）
2. 現在のタブ位置を取得
3. 新しい位置を計算（境界を超えた場合は循環）
4. タブを新しい位置に移動

**関連システム・外部連携**：
- タブ管理システム
- ウィンドウ管理

**権限による制御**：
特に権限による制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | メインターミナルウィンドウ | 主画面 | タブの移動操作 |

## 機能種別

ユーザー操作 / UI操作

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| offset | isize | Yes | 移動オフセット（正: 右、負: 左） | 整数 |

### 入力データソース

- キーバインドアクション

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| タブ位置変更 | UI更新 | タブバーでの位置が変更される |

### 出力先

タブバーUI

## 処理フロー

### 処理シーケンス

```
1. アクション受信
   └─ move_tab(offset)アクション
2. 現在位置取得
   └─ 現在のタブのインデックスを取得
3. 新位置計算
   └─ (現在位置 + offset) を循環処理
4. タブ移動実行
   └─ apprのmove_tabアクションを実行
5. UI更新
   └─ タブバーを再描画
```

### フローチャート

```mermaid
flowchart TD
    A[move_tab(offset)] --> B[現在のタブ位置取得]
    B --> C[新位置計算]
    C --> D{境界外?}
    D -->|Yes| E[循環処理で位置補正]
    D -->|No| F[新位置をそのまま使用]
    E --> G[performAction]
    F --> G
    G --> H[タブ移動実行]
    H --> I[タブバーUI更新]
    I --> J[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-90-01 | 循環移動 | 境界を超えた場合はタブリストの反対側に循環 | 常時 |
| BR-90-02 | 正負オフセット | 正の値で右移動、負の値で左移動 | 常時 |
| BR-90-03 | 単独タブ | タブが1つしかない場合は移動なし | タブ数=1 |

### 計算ロジック

新位置計算（循環あり）:
- `new_pos = (current_pos + offset) % tab_count`
- 負の場合: `new_pos = (current_pos + offset + tab_count) % tab_count`

例:
- タブ数5、現在位置4（最後）、offset=1 → 新位置0（先頭に循環）
- タブ数5、現在位置0（先頭）、offset=-1 → 新位置4（最後に循環）

## データベース操作仕様

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 無視 | タブが存在しない | 何もしない |
| - | 無視 | タブが1つのみ | 何もしない |

### リトライ仕様

リトライは行わない。

## トランザクション仕様

該当なし。

## パフォーマンス要件

特になし。タブ移動は即座に反映される。

## セキュリティ考慮事項

特になし。

## 備考

- コマンドパレットからは「Move Tab Left」「Move Tab Right」として利用可能
- デフォルトではoffset=-1（左）とoffset=1（右）のコマンドが定義されている

---

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

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

### 推奨読解順序

#### Step 1: アクション定義を理解する

まず、アクションの定義を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Binding.zig | `src/input/Binding.zig` | move_tab アクション定義（552-563行目） |
| 1-2 | action.zig | `src/apprt/action.zig` | move_tab アクション定義（128-133行目） |

**読解のコツ**: `move_tab`は`isize`型のオフセットを取り、正の値で右移動、負の値で左移動を表す。

**主要処理フロー**:
- **Binding.zig 552-563行目**: アクションのドキュメント（循環処理の説明含む）

#### Step 2: コマンド定義を理解する

コマンドパレット用のコマンド定義。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | command.zig | `src/input/command.zig` | move_tabコマンド定義（422-433行目） |

**主要処理フロー**:
- **422-433行目**: Move Tab Left（offset=-1）とMove Tab Right（offset=1）のコマンド定義

#### Step 3: Surface.zigでのアクション処理を理解する

アクションがSurfaceでどのように処理されるか。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Surface.zig | `src/Surface.zig` | move_tabのperformAction呼び出し |

#### Step 4: GTK実装を理解する

GTK環境でのタブ移動実装。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | window.zig | `src/apprt/gtk/class/window.zig` | GTKウィンドウでのタブ移動処理 |

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

```
キーバインドアクション
    │
    └─ move_tab(offset)
           │
           ▼
    Surface.zig
           │
           └─ performAction(.move_tab, offset)
                  │
                  ▼
           apprt (GTK/macOS)
                  │
                  ├─ [GTK]
                  │      └─ window.zig
                  │             └─ タブ位置変更
                  │
                  └─ [macOS]
                         └─ Swift実装
                                └─ タブ位置変更
```

### データフロー図

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

キーバインド ───▶ move_tab(offset)
                      │
                      ▼
              現在タブ位置取得
                      │
                      ▼
              新位置計算（循環あり）
                      │
                      ▼
              performAction
                      │
                      ▼
              タブ位置変更
                      │
                      ▼
              タブバーUI更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Binding.zig | `src/input/Binding.zig` | ソース | move_tabアクション定義 |
| action.zig | `src/apprt/action.zig` | ソース | apprレベルのmove_tabアクション定義 |
| command.zig | `src/input/command.zig` | ソース | コマンドパレット用コマンド定義 |
| Surface.zig | `src/Surface.zig` | ソース | アクション処理のディスパッチ |
| window.zig | `src/apprt/gtk/class/window.zig` | ソース | GTKウィンドウでのタブ管理 |
| application.zig | `src/apprt/gtk/class/application.zig` | ソース | GTKアプリケーションレベルの処理 |
