# 画面設計書 11-ホーム画面設定

## 概要

本ドキュメントは、InvenTree Flutterアプリケーションの「ホーム画面設定」画面について、その機能・動作・実装を詳細に記述した設計書です。

### 本画面の処理概要

ホーム画面設定は、アプリケーションのホーム画面に表示する項目をカスタマイズするための設定画面です。ユーザーは購入注文、販売注文、出荷、サプライヤー、顧客などの各種タイルの表示/非表示を切り替えることができます。

**業務上の目的・背景**：ホーム画面は在庫管理業務の起点となる重要な画面であり、ユーザーの役割や業務内容によって必要な情報は異なります。例えば、購買担当者は購入注文を重視し、営業担当者は販売注文や顧客情報を重視します。この画面では、ユーザーが自身の業務に最適化されたホーム画面を構成できるようにすることで、業務効率の向上を図ります。

**画面へのアクセス方法**：ドロワーメニューから「設定」を選択し、設定画面から「ホーム画面」設定を選択することでアクセスできます。

**主要な操作・処理内容**：
1. 購読パーツの表示設定 - ホーム画面に購読中のパーツタイルを表示するかどうかを設定
2. 購入注文の表示設定 - 購入注文タイルの表示/非表示を切り替え
3. 販売注文の表示設定 - 販売注文タイルの表示/非表示を切り替え
4. 出荷の表示設定 - 出荷タイルの表示/非表示を切り替え
5. サプライヤーの表示設定 - サプライヤータイルの表示/非表示を切り替え
6. 顧客の表示設定 - 顧客タイルの表示/非表示を切り替え

**画面遷移**：
- 遷移元：設定画面（`lib/settings/settings.dart`）
- 遷移先：なし（設定変更後は戻る操作のみ）

**権限による表示制御**：この画面自体への権限制御はありません。ただし、設定した項目がホーム画面に反映される際には、サーバー側の権限設定により一部タイルが表示されない場合があります。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 58 | ホーム画面設定 | 主機能 | ホーム画面に表示する項目の設定変更 |

## 画面種別

設定

## URL/ルーティング

Flutter Navigator経由でのプッシュ遷移（MaterialPageRoute）

## 入出力項目

| 項目名 | 入出力 | データ型 | 必須 | 説明 |
|--------|--------|---------|------|------|
| homeShowSubscribed | 入出力 | bool | - | 購読パーツの表示フラグ |
| homeShowPo | 入出力 | bool | - | 購入注文の表示フラグ |
| homeShowSo | 入出力 | bool | - | 販売注文の表示フラグ |
| homeShowShipments | 入出力 | bool | - | 出荷の表示フラグ |
| homeShowSuppliers | 入出力 | bool | - | サプライヤーの表示フラグ |
| homeShowCustomers | 入出力 | bool | - | 顧客の表示フラグ |

## 表示項目

| No | 項目名 | 表示形式 | 説明 |
|----|--------|---------|------|
| 1 | AppBar | テキスト | 「ホーム画面」タイトル表示 |
| 2 | 購読パーツ表示設定 | ListTile + Switch | タイトル、説明、ベルアイコン、スイッチ |
| 3 | 購入注文表示設定 | ListTile + Switch | タイトル、説明、ショッピングカートアイコン、スイッチ |
| 4 | 販売注文表示設定 | ListTile + Switch | タイトル、説明、トラックアイコン、スイッチ |
| 5 | 出荷表示設定 | ListTile + Switch | タイトル、説明、キューブ送信アイコン、スイッチ |
| 6 | サプライヤー表示設定 | ListTile + Switch | タイトル、説明、ビルディングアイコン、スイッチ |
| 7 | 顧客表示設定 | ListTile + Switch | タイトル、説明、ユーザーアイコン、スイッチ |

## イベント仕様

### 1-画面初期化時

1. `initState()`で`loadSettings()`を呼び出し
2. `InvenTreeSettingsManager()`から各設定値を非同期で取得
3. 取得した値で画面の状態変数を更新し、`setState()`で再描画

### 2-各スイッチ変更時

1. スイッチの`onChanged`コールバックが発火
2. `InvenTreeSettingsManager().setValue()`で設定値を永続化
3. `setState()`で即座にUI状態を更新

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 設定変更 | InvenTreeSettings.db (settings store) | UPDATE | 設定値の永続化 |

### テーブル別更新項目詳細

#### settings store (Sembast NoSQL)

| 操作 | 項目（キー） | 更新値・取得条件 | 備考 |
|-----|------------|-----------------|------|
| UPDATE | homeShowSubscribed | true/false | 購読パーツ表示設定 |
| UPDATE | homeShowPo | true/false | 購入注文表示設定 |
| UPDATE | homeShowSo | true/false | 販売注文表示設定 |
| UPDATE | homeShowShipments | true/false | 出荷表示設定 |
| UPDATE | homeShowSuppliers | true/false | サプライヤー表示設定 |
| UPDATE | homeShowCustomers | true/false | 顧客表示設定 |

## メッセージ仕様

| No | メッセージ種別 | メッセージ内容 | 表示条件 |
|----|--------------|--------------|---------|
| - | - | - | この画面では特別なメッセージ表示はありません |

## 例外処理

| No | 例外条件 | 処理内容 |
|----|---------|---------|
| 1 | 設定値読み込み失敗 | デフォルト値（true）を使用 |

## 備考

- `homeShowManufacturers`（製造業者）の設定はコード内でコメントアウトされており、将来の機能改善時に追加予定
- 設定値はSembast NoSQLデータベースにローカル保存され、サーバーには同期されない

---

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

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

### 推奨読解順序

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

まず、設定キーとデータ永続化の仕組みを理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | preferences.dart | `lib/preferences.dart` | 設定キー定数の定義（INV_HOME_SHOW_*）と`InvenTreeSettingsManager`クラスの実装 |

**読解のコツ**:
- 10-16行目で`INV_HOME_SHOW_*`定数が定義されています
- 110-185行目の`InvenTreeSettingsManager`クラスで設定値の読み書きを行います
- Sembast NoSQLを使用しており、キー・バリュー形式でデータを保存しています

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

処理の起点となるウィジェットクラスを特定します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | home_settings.dart | `lib/settings/home_settings.dart` | `HomeScreenSettingsWidget`クラスとStateクラスの構造 |

**主要処理フロー**:
1. **8-11行目**: `HomeScreenSettingsWidget` StatefulWidgetの定義
2. **13-69行目**: `_HomeScreenSettingsState`クラス - 状態変数と初期化処理
3. **29-33行目**: `initState()`で`loadSettings()`を呼び出し
4. **35-69行目**: `loadSettings()`で非同期に設定値を読み込み

#### Step 3: UI構築処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | home_settings.dart | `lib/settings/home_settings.dart` | `build()`メソッドでのUI構築 |

**主要処理フロー**:
- **72-200行目**: `build()`メソッド
- **73-78行目**: `Scaffold`と`AppBar`の構築
- **79-196行目**: `ListView`内の各`ListTile`でスイッチ項目を生成
- **82-98行目**: 購読パーツ設定の例 - `Switch`ウィジェットの`onChanged`で設定を保存

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

```
HomeScreenSettingsWidget
    │
    └─ _HomeScreenSettingsState
           │
           ├─ initState()
           │      └─ loadSettings()
           │             └─ InvenTreeSettingsManager().getValue()
           │
           └─ build()
                  └─ ListView > ListTile > Switch
                         └─ onChanged
                                └─ InvenTreeSettingsManager().setValue()
```

### データフロー図

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

ユーザー操作              設定処理                        永続化
(Switch切替)  ───▶  setState() + setValue()  ───▶  Sembast DB
                          │
                          ▼
                    UI即時更新
```

```
[初期化時]

Sembast DB  ───▶  getValue()  ───▶  状態変数  ───▶  UI表示
(settings)         (async)        (bool)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| home_settings.dart | `lib/settings/home_settings.dart` | ソース | 画面本体のウィジェット実装 |
| preferences.dart | `lib/preferences.dart` | ソース | 設定キー定数と設定マネージャー |
| l10.dart | `lib/l10.dart` | ソース | 多言語対応テキスト定義 |
| app_colors.dart | `lib/app_colors.dart` | ソース | アプリカラー定数（COLOR_APP_BAR等） |
| settings.dart | `lib/settings/settings.dart` | ソース | 設定画面（遷移元） |
