# 通知設計書 57-カラースキーム選択

## 概要

本ドキュメントは、InvenTreeアプリにおける「画面方向選択（Orientation Selection）」ダイアログの設計仕様を定義する。ユーザーがアプリの画面方向（システム、縦向き、横向き）を選択するためのダイアログを表示する。

**注記**: 通知一覧.csvでは「カラースキーム選択」と記載されているが、実際のapp_settings.dartの実装では、choiceDialog関数は画面方向（orientation）の選択に使用されている。ダークモード切替はSwitchウィジェットで行われており、選択ダイアログは使用されていない。

### 本通知の処理概要

画面方向選択ダイアログは、ユーザーがアプリの表示方向を柔軟に設定できるようにする機能である。この選択ダイアログは、ユーザーの好みや使用状況に応じて最適な表示方向を選択できるインターフェースを提供する。

**業務上の目的・背景**：在庫管理業務では、タブレットやスマートフォンを様々な状況で使用する。倉庫での棚卸し作業では片手で操作できる縦向きが便利であり、データ入力や閲覧時には横向きが見やすい場合がある。また、デバイスの向きに応じて自動回転させたい場合もある。このため、ユーザーが自身の作業環境に最適な画面方向を選択できる機能を提供している。

**通知の送信タイミング**：ユーザーがアプリ設定画面で「Orientation」項目をタップした時点で、即座に選択ダイアログが表示される。

**通知の受信者**：現在の操作を行っているユーザー自身。すべてのユーザーが画面方向設定を変更可能。

**通知内容の概要**：タイトルとして「Orientation」を表示し、3つの選択肢（System、Portrait、Landscape）を提示する。現在選択されているオプションはアイコン色で視覚的に区別される。

**期待されるアクション**：ユーザーは3つの選択肢の中から1つを選択する。選択を行うと設定が保存され、画面が更新される。キャンセルボタンをタップすると、変更せずにダイアログを閉じる。

## 通知種別

アプリ内選択ダイアログ（AlertDialog with choices）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（ユーザー操作による即時表示） |
| 優先度 | 中（ユーザー操作に対する応答） |
| リトライ | 無（ダイアログ表示の失敗は考慮しない） |

### 送信先決定ロジック

- 現在アプリを操作しているユーザー
- 条件：なし（すべてのユーザーが設定変更可能）

## 通知テンプレート

### ダイアログ構成

| 項目 | 内容 |
|-----|------|
| タイトル | L10().orientation |
| 形式 | AlertDialog with list choices |
| キャンセルボタン | L10().cancel |

### 選択肢一覧

| 選択肢 | アイコン | 説明 | 値 |
|-------|---------|------|-----|
| System | Icons.screen_rotation | システム設定に従う | SCREEN_ORIENTATION_SYSTEM (0) |
| Portrait | Icons.screen_lock_portrait | 縦向きに固定 | SCREEN_ORIENTATION_PORTRAIT (1) |
| Landscape | Icons.screen_lock_landscape | 横向きに固定 | SCREEN_ORIENTATION_LANDSCAPE (2) |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| orientation | ダイアログタイトル | L10()（ローカライズ文字列） | Yes |
| orientationSystem | システム設定オプション | L10()（ローカライズ文字列） | Yes |
| orientationPortrait | 縦向きオプション | L10()（ローカライズ文字列） | Yes |
| orientationLandscape | 横向きオプション | L10()（ローカライズ文字列） | Yes |
| cancel | キャンセルボタンテキスト | L10()（ローカライズ文字列） | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 画面操作 | 画面方向設定項目タップ | なし | アプリ設定画面のOrientation項目をタップ |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| hasContext() == false | アプリコンテキストが利用できない場合（テスト環境等） |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ユーザーがOrientation項目をタップ] --> B[choiceDialog表示]
    B --> C{ユーザーの選択}
    C -->|System| D[idx = 0]
    C -->|Portrait| E[idx = 1]
    C -->|Landscape| F[idx = 2]
    C -->|Cancel| G[ダイアログを閉じる]
    D --> H[InvenTreeSettingsManager.setValue]
    E --> H
    F --> H
    H --> I[setState実行]
    I --> J[画面更新完了]
    G --> K[終了]
    J --> K
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| Settings（ローカルDB） | 現在の画面方向設定 | Sembast NoSQLデータベース |

### テーブル別参照項目詳細

#### Settings

| 参照項目（キー） | 用途 | デフォルト値 |
|----------------|------|------------|
| INV_SCREEN_ORIENTATION | 現在の画面方向設定 | SCREEN_ORIENTATION_SYSTEM (0) |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| Settings（ローカルDB） | UPDATE | 画面方向設定の更新 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 設定保存失敗 | データベース操作失敗 | エラーは暗黙的に処理される |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0回（ダイアログ表示はリトライなし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（ユーザー操作による即時表示）

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

- 画面方向設定はローカルのみで完結し、サーバーには影響しない
- 個人情報は含まれない

## 備考

- 選択成功後、画面が即座に更新される（setState呼び出し）
- 現在選択中のオプションはCOLOR_ACTIONカラーで強調表示される
- ローカライズ対応により多言語での表示が可能
- 通知一覧.csvでは「カラースキーム選択」だが、実装は画面方向選択である

---

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

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

### 推奨読解順序

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

設定値の定義と、ダイアログで使用される定数を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | preferences.dart | `lib/preferences.dart` | INV_SCREEN_ORIENTATION, SCREEN_ORIENTATION_* 定数の定義 |
| 1-2 | dialogs.dart | `lib/widget/dialogs.dart` | choiceDialog関数のパラメータと動作 |

**読解のコツ**: 画面方向の3つの定数値（SYSTEM=0, PORTRAIT=1, LANDSCAPE=2）を覚えておくと良い。

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

ユーザーが設定変更を開始する起点となるコードを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | app_settings.dart | `lib/settings/app_settings.dart` | build()メソッドでのListTile生成、choiceDialog呼び出し |

**主要処理フロー**:
1. **200-251行目**: GestureDetector内のListTileとchoiceDialog呼び出し
2. **208-238行目**: choiceDialogの選択肢リスト構成
3. **239-248行目**: onSelectedコールバックでの設定保存

#### Step 3: ダイアログ表示処理を理解する

選択ダイアログの表示ロジックを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | dialogs.dart | `lib/widget/dialogs.dart` | choiceDialog()関数（15-56行目）の実装詳細 |

**主要処理フロー**:
- **15-19行目**: 関数シグネチャとパラメータ
- **21-34行目**: GestureDetectorによる選択肢の構成
- **40-55行目**: AlertDialogの表示

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

```
InvenTreeAppSettingsWidget (app_settings.dart)
    |
    +-- build() [143-350行目]
    |       |
    |       +-- GestureDetector.onTap [206-250行目]
    |               |
    |               +-- choiceDialog() [dialogs.dart:15-56行目]
    |               |       |
    |               |       +-- OneContext().showDialog()
    |               |       |
    |               |       +-- onSelected callback [239-248行目]
    |               |               |
    |               |               +-- InvenTreeSettingsManager.setValue()
    |               |               |
    |               |               +-- setState()
```

### データフロー図

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

Orientation項目タップ ──> choiceDialog表示 ─────────> 選択肢一覧
                                                              |
                                                              v
                                                    ユーザー選択待ち
                                                              |
                    +------------+------------+---------------+
                    |            |            |               |
                    v            v            v               v
                [System]    [Portrait]  [Landscape]      [Cancel]
                    |            |            |               |
                    v            v            v               v
                idx=0        idx=1        idx=2        ダイアログ閉じる
                    |            |            |
                    +------------+------------+
                              |
                              v
                      設定値をローカルDBに保存
                              |
                              v
                         setState()実行
                              |
                              v
                        画面更新完了
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| app_settings.dart | `lib/settings/app_settings.dart` | ソース | アプリ設定画面、画面方向選択の起点 |
| dialogs.dart | `lib/widget/dialogs.dart` | ソース | choiceDialog関数の実装 |
| preferences.dart | `lib/preferences.dart` | ソース | INV_SCREEN_ORIENTATION定数、InvenTreeSettingsManager |
| app_colors.dart | `lib/app_colors.dart` | ソース | COLOR_ACTION定義（選択中オプションの強調色） |
| l10.dart | `lib/l10.dart` | ソース | ローカライズヘルパー関数 |
