# 機能設計書 246-LoadIniSettingsFromDisk

## 概要

本ドキュメントは、Dear ImGuiライブラリにおけるLoadIniSettingsFromDisk関数の機能設計について記述する。この関数はディスク上のINIファイルからImGuiの設定を読み込むためのユーティリティ関数である。

### 本機能の処理概要

LoadIniSettingsFromDisk関数は、指定されたファイルパスからINI形式の設定ファイルを読み込み、ImGuiの状態（ウィンドウ位置、サイズ、折りたたみ状態など）を復元する機能を提供する。通常はNewFrame()から自動的に呼び出されるが、手動での設定読み込みにも使用できる。

**業務上の目的・背景**：アプリケーションの状態永続化は、ユーザー体験の向上に不可欠である。ユーザーがカスタマイズしたウィンドウのレイアウト、サイズ、位置などを次回起動時に復元することで、作業効率の向上と快適な操作環境を提供できる。この関数は、そのような設定の読み込み機能を提供する。

**機能の利用シーン**：アプリケーション起動時の設定復元、カスタム設定ファイルからの読み込み、設定のリセット後に以前の状態に戻す場合、テスト用の特定設定の読み込みなどに使用される。

**主要な処理内容**：
1. 指定されたファイルをメモリに読み込み
2. ファイルデータが存在する場合はLoadIniSettingsFromMemoryを呼び出し
3. 読み込んだメモリを解放

**関連システム・外部連携**：ファイルシステムにアクセスしてINIファイルを読み込む。ImFileLoadToMemory関数を使用してプラットフォーム非依存のファイル読み込みを行う。

**権限による制御**：本機能に権限による制御は存在しない。ただし、OSレベルでファイルアクセス権限が必要となる場合がある。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | 全ウィンドウ | 主機能 | ウィンドウ位置・サイズの復元 |

## 機能種別

読取処理 / ファイル入力 / 設定復元

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| ini_filename | const char* | Yes | 読み込むINIファイルのパス | NULLでないこと |

### 入力データソース

- ディスク上のINIファイル
- デフォルトファイル名は"imgui.ini"（io.IniFilenameで設定）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (なし) | void | 戻り値なし |

### 出力先

- ImGuiContext内の設定データ（ウィンドウ位置、サイズ等）
- g.SettingsWindows等の内部データ構造

## 処理フロー

### 処理シーケンス

```
1. ファイルをメモリに読み込み
   └─ ImFileLoadToMemory(ini_filename, "rb", &file_data_size)
2. 読み込み成功確認
   └─ file_dataがNULLでないか
3. 設定をメモリから読み込み
   └─ LoadIniSettingsFromMemory(file_data, file_data_size)
4. メモリ解放
   └─ IM_FREE(file_data)
```

### フローチャート

```mermaid
flowchart TD
    A[LoadIniSettingsFromDisk呼び出し] --> B[ファイルをメモリに読み込み]
    B --> C{file_data != NULL?}
    C -->|No| D[return - 何もしない]
    C -->|Yes| E{file_data_size > 0?}
    E -->|No| F[メモリ解放]
    E -->|Yes| G[LoadIniSettingsFromMemory呼び出し]
    G --> F
    F --> H[終了]
    D --> H
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-246-1 | 自動読み込み | io.IniFilename != NULLの場合、NewFrame()から自動呼び出しされる | 初回NewFrame()時 |
| BR-246-2 | 呼び出しタイミング | CreateContext()後、最初のNewFrame()前に呼び出す | 手動読み込み時 |
| BR-246-3 | ファイル不在時 | ファイルが存在しない場合は何もせずに復帰 | ファイル未存在時 |
| BR-246-4 | 相対パス注意 | デフォルト"imgui.ini"は現在の作業ディレクトリ相対 | パス指定時 |

### 計算ロジック

特別な計算処理は行わない。ファイル読み込みと設定パース処理を実行する。

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ファイル読み込み失敗 | ファイルが存在しない、またはアクセス権限がない | 何もせずに復帰（エラーは報告されない） |
| - | コンテキスト未初期化 | GImGuiがNULL | CreateContext()を先に呼び出す |

### リトライ仕様

リトライ処理は不要。ファイルが存在しない場合は無視される。

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

本機能はトランザクション処理を行わない。

## パフォーマンス要件

- 処理時間: ファイルサイズとディスクI/O性能に依存
- メモリ使用: ファイル全体をメモリに一時的に読み込む
- 呼び出し頻度: 通常はアプリケーション起動時に1回

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

- INIファイルにはユーザーのウィンドウレイアウト情報が含まれる
- 信頼できないソースからのINIファイル読み込みには注意が必要
- ファイルパスの検証は呼び出し元の責任

## 備考

- 絶対パスの使用が推奨される（デフォルトの"imgui.ini"は相対パス）
- io.IniFilenameをNULLに設定することで自動読み込みを無効化できる
- 手動でINI設定を管理する場合はLoadIniSettingsFromMemoryの使用を検討

---

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

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

### 推奨読解順序

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

INI設定がどのように格納されるかを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_internal.h | `imgui_internal.h` | ImGuiWindowSettings構造体 - ウィンドウ設定の格納構造 |
| 1-2 | imgui_internal.h | `imgui_internal.h` | ImGuiSettingsHandler構造体 - 設定ハンドラの定義 |
| 1-3 | imgui_internal.h | `imgui_internal.h` | ImGuiContext::SettingsWindows - 設定格納場所 |

**読解のコツ**: ImGuiの設定システムは拡張可能で、ImGuiSettingsHandlerを登録することでカスタム設定を保存/読み込みできる。

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

関数の実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.cpp | `imgui.cpp` | LoadIniSettingsFromDisk関数の実装（15388-15397行目） |

**主要処理フロー**:
1. **15390行目**: ファイルサイズ変数の初期化
2. **15391行目**: ImFileLoadToMemoryでファイル全体をメモリに読み込み
3. **15392-15393行目**: ファイルが読み込めなかった場合は早期リターン
4. **15394-15395行目**: ファイルサイズが0より大きい場合はLoadIniSettingsFromMemory呼び出し
5. **15396行目**: 読み込んだメモリを解放

#### Step 3: 呼び出される関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | LoadIniSettingsFromMemory関数（15401-15468行目）- 実際のパース処理 |
| 3-2 | imgui.cpp | `imgui.cpp` | ImFileLoadToMemory関数 - ファイル読み込みユーティリティ |

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

```
LoadIniSettingsFromDisk(ini_filename)
    │
    ├─ ImFileLoadToMemory(ini_filename, "rb", &file_data_size)
    │      └─ ファイル読み込み（プラットフォーム非依存）
    │
    └─ LoadIniSettingsFromMemory(file_data, file_data_size)
           │
           ├─ SettingsHandlers[].ReadInitFn() - 初期化コールバック
           │
           ├─ INIデータのパース
           │      ├─ [Window]セクション
           │      └─ カスタムセクション
           │
           └─ SettingsHandlers[].ReadLineFn() - 行読み込みコールバック

    └─ IM_FREE(file_data)
```

### データフロー図

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

INIファイル                 LoadIniSettingsFromDisk()      ImGuiContext
(imgui.ini)                      │                            │
    │                            │                            │
    └── ファイル読み込み ──────▶ │                            │
                                 │ LoadIniSettingsFromMemory()│
                                 │         │                  │
                                 │         ▼                  │
                                 │ INIパース処理              │
                                 │         │                  │
                                 └─────────┴─────────────────▶ SettingsWindows更新
                                                               ウィンドウ状態復元
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | 関数宣言 |
| imgui.cpp | `imgui.cpp` | ソース | LoadIniSettingsFromDisk/FromMemory実装 |
| imgui_internal.h | `imgui_internal.h` | ヘッダー | ImGuiWindowSettings, ImGuiSettingsHandler定義 |
| imgui.ini | `imgui.ini` | 設定ファイル | デフォルトの設定ファイル |
