# 機能設計書 19-ShowFontSelector

## 概要

本ドキュメントは、Dear ImGuiライブラリにおけるShowFontSelector関数の機能設計を記載する。この関数はロードされているフォントを選択するためのコンボボックスを提供する。

### 本機能の処理概要

ShowFontSelector関数は、ImGuiにロードされているフォントの一覧をコンボボックスで表示し、デフォルトフォントを選択できるようにする。この関数自体はウィンドウを作成しないため、呼び出し側でウィンドウまたは他のコンテナ内で使用する必要がある。フォントを選択すると、io.FontDefaultが更新され、以降のウィジェットで使用されるデフォルトフォントが変更される。

**業務上の目的・背景**：多言語対応やアクセシビリティの観点から、アプリケーションで複数のフォントを使用することは一般的である。ShowFontSelectorは、ロードされているすべてのフォントを簡単に切り替える機能を提供し、開発者がフォント選択機能を最小限のコードで実装できるようにする。

**機能の利用シーン**：
- アプリケーションの設定画面でフォントを選択する際
- ShowStyleEditor内でフォントの確認・選択を行う際
- 複数言語対応時に適切なフォントを選択する際
- フォントサイズやスタイルの比較を行う際

**主要な処理内容**：
1. 現在選択されているフォント名を表示するコンボボックスの作成
2. io.Fonts->Fontsに登録されているすべてのフォントを選択肢として表示
3. 選択時にio.FontDefaultを更新
4. ヘルプマーカーでフォント追加方法を案内

**関連システム・外部連携**：
- ImFontAtlas（フォントアトラス）
- ImFont（フォントオブジェクト）
- io.FontDefault（デフォルトフォント設定）
- ShowStyleEditor（スタイルエディタ内で使用）

**権限による制御**：本機能に権限制御はない。ただし、IMGUI_DISABLE_DEMO_WINDOWSおよびIMGUI_DISABLE_DEBUG_TOOLSが両方定義されている場合は無効。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | Style Editor | 使用箇所 | Generalセクションで使用 |
| 8 | Font Atlas | 関連画面 | フォント情報の詳細表示 |

## 機能種別

UI部品 / セレクタ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| label | const char* | Yes | コンボボックスのラベル文字列 | NULL不可 |

### 入力データソース

- ImGuiIO::Fonts（フォントアトラス）
- ImFontAtlas::Fonts（フォントリスト）
- 現在のフォント（GetFont()）

## 出力仕様

### 出力データ

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

### 出力先

- ImGuiウィジェットとして描画（コンボボックス）
- ImGuiIO::FontDefault（フォント選択時）

## 処理フロー

### 処理シーケンス

```
1. 現在のフォント情報を取得
   └─ GetIO()、GetFont()
2. コンボボックスの表示
   └─ BeginCombo(label, font_current->GetDebugName())
3. 各フォントの選択肢を表示
   └─ for each font in io.Fonts->Fonts
4. 選択時の処理
   └─ io.FontDefault = font
5. ヘルプマーカーの表示
   └─ MetricsHelpMarker（フォント追加方法の案内）
```

### フローチャート

```mermaid
flowchart TD
    A[ShowFontSelector呼び出し] --> B[GetIO / GetFont]
    B --> C[BeginCombo]
    C --> D{コンボ展開?}
    D -->|No| E[ヘルプマーカー表示]
    D -->|Yes| F[for each font]
    F --> G[PushID]
    G --> H[Selectable]
    H --> I{選択された?}
    I -->|Yes| J[io.FontDefault = font]
    I -->|No| K{現在のフォント?}
    K -->|Yes| L[SetItemDefaultFocus]
    K -->|No| M[次のフォント]
    J --> M
    L --> M
    M --> N[PopID]
    N --> O{残りフォントあり?}
    O -->|Yes| F
    O -->|No| P[EndCombo]
    P --> E
    E --> Q[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | ブロック形式 | この関数はウィンドウを作成しない | 常時 |
| BR-02 | フォント識別 | 各フォントはポインタでIDを付与（PushID((void*)font)） | 常時 |
| BR-03 | デフォルトフォーカス | 現在選択中のフォントにデフォルトフォーカスを設定 | 常時 |
| BR-04 | ヘルプ分岐 | RendererHasTexturesの有無でヘルプメッセージが異なる | 常時 |

### 計算ロジック

該当なし（単純な選択処理）

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

該当なし（インメモリ動作）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | - | エラーなし |

### リトライ仕様

該当なし（毎フレーム呼び出し）

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

該当なし

## パフォーマンス要件

- コンボボックスの展開時のみフォントリストを処理

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

該当なし（ローカルUI表示のみ）

## 備考

- IMGUI_DISABLE_DEMO_WINDOWSおよびIMGUI_DISABLE_DEBUG_TOOLSが両方定義されている場合は無効
- フォント名はGetDebugName()で取得
- RendererHasTexturesフラグによりヘルプメッセージが変わる（動的フォント読み込みの注意事項）

---

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

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

### 推奨読解順序

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

フォント管理に関連するデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | ImFont構造体 |
| 1-2 | imgui.h | `imgui.h` | ImFontAtlas構造体（Fontsベクター） |
| 1-3 | imgui.h | `imgui.h` | ImGuiIO::FontDefault |

**読解のコツ**: ImFontAtlas::Fontsはロードされたすべてのフォントを保持。io.FontDefaultで次フレーム以降のデフォルトフォントを設定。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.h | `imgui.h` | ShowFontSelector関数の宣言（414行目） |
| 2-2 | imgui.cpp | `imgui.cpp` | ShowFontSelector関数の実装（18142行目〜） |

**主要処理フロー**:
1. **18144行目**: ImGuiIO& io = GetIO()
2. **18145行目**: ImFont* font_current = GetFont()
3. **18146行目**: BeginCombo呼び出し
4. **18148-18156行目**: フォントリストのループ処理
5. **18159-18169行目**: ヘルプマーカー（RendererHasTexturesで分岐）

#### Step 3: フォント情報取得を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | GetFont関数 |
| 3-2 | imgui.h | `imgui.h` | ImFont::GetDebugName関数 |

**主要処理フロー**:
- GetDebugNameはフォントのデバッグ用名前を返す

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

```
ShowFontSelector(label)
    │
    ├─ GetIO()
    │      └─ io.Fonts->Fonts（フォントリスト）
    │
    ├─ GetFont()
    │      └─ 現在のフォント
    │
    ├─ BeginCombo(label, font_current->GetDebugName())
    │
    ├─ for each font in io.Fonts->Fonts
    │      │
    │      ├─ PushID((void*)font)
    │      │
    │      ├─ Selectable(font->GetDebugName(), selected, SelectOnNav)
    │      │      └─ [選択時] io.FontDefault = font
    │      │
    │      ├─ [現在フォント時] SetItemDefaultFocus()
    │      │
    │      └─ PopID()
    │
    ├─ EndCombo()
    │
    └─ MetricsHelpMarker()
           └─ RendererHasTexturesで分岐
```

### データフロー図

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

label (文字列)       ShowFontSelector()             void
    │                      │
    │                      ├─ BeginCombo
    │                      │
io.Fonts->Fonts            ├─ Selectable
    │                      │
    └─ フォントリスト ─────┴─ 選択時に io.FontDefault設定 ─▶ io.FontDefault
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | ShowFontSelector宣言（414行目） |
| imgui.cpp | `imgui.cpp` | ソース | ShowFontSelector実装（18142-18170行目） |
