hajimu_gui — 日本語 GUI フレームワークJapanese GUI Framework
はじむ言語のパッケージ hajimu_gui を使って、日本語でデスクトップ GUI アプリケーションを開発できます。
外部ライブラリ不要、OS 標準 API のみで動作するクロスプラットフォーム対応の GUI フレームワークです。
1,101 関数
ウィジェット、宣言的UI、フレームスケジューラ、ホットリロード、DevTools など網羅的な機能
外部依存なし
macOS (Cocoa)、Linux (X11)、Windows (Win32) の OS 標準 API のみ使用
自製レンダラー
hjp_render.c による高品質な 2D 描画。アンチエイリアス対応
すべて日本語
関数名からパラメータまで、すべて日本語で記述可能
インストール
パッケージマネージャ(推奨)
はじむ内蔵のパッケージマネージャを使うと、コンパイル不要で一行でインストールできます。
hajimu パッケージ 追加 ReoShiozawa/hajimu_gui
既存プロジェクトの依存関係を一括インストールする場合:
hajimu パッケージ インストール
ソースからビルド
手動でビルドする場合。外部ライブラリは不要です。
git clone https://github.com/ReoShiozawa/hajimu_gui.git cd hajimu_gui make make install
Hello World
最小限の GUI プログラム:
取り込む "hajimu_gui" として GUI
変数 アプリ = GUI.アプリ作成("はじめてのGUI", 400, 300)
GUI.描画ループ(アプリ, 関数():
GUI.ラベル("こんにちは、世界!")
終わり)
GUI.アプリ終了(アプリ)
hajimu hello_gui.jp
基本的な仕組み
hajimu_gui は即時モードの GUI フレームワークです。描画ループの中で毎フレーム、ウィジェット関数を呼び出します。
取り込む "hajimu_gui" として GUI
変数 アプリ = GUI.アプリ作成("タイトル", 800, 600)
// 状態変数は描画ループの外で宣言
変数 回数 = 0
変数 名前 = ""
GUI.描画ループ(アプリ, 関数():
// ボタン — クリックされると「真」を返す
もし GUI.ボタン("カウントアップ") なら
回数 = 回数 + 1
終わり
// テキスト入力 — 更新後の値を返す
名前 = GUI.テキスト入力("名前", 名前)
// ラベル — テキストを表示
GUI.ラベル("回数: " + 回数)
GUI.ラベル("入力: " + 名前)
終わり)
GUI.アプリ終了(アプリ)
主要機能
ウィジェット
| 関数 | 説明 | 例 |
|---|---|---|
ボタン(ラベル) | クリックボタン | もし GUI.ボタン("OK") なら ... |
テキスト入力(ラベル, 値) | テキスト入力欄 | 名前 = GUI.テキスト入力("名前", 名前) |
チェックボックス(ラベル, 値) | チェックボックス | 有効 = GUI.チェックボックス("通知", 有効) |
スライダー(ラベル, 値, 最小, 最大) | スライダー | 音量 = GUI.スライダー("音量", 音量, 0, 100) |
コンボボックス(ラベル, 選択肢, 値) | ドロップダウン | 色 = GUI.コンボボックス("色", 色一覧, 色) |
リスト(ラベル, 配列, 選択, 行数) | リストボックス | 選択 = GUI.リスト("果物", 配列, 選択, 5) |
数値入力(ラベル, 値, 最小, 最大) | 数値入力 | 年齢 = GUI.数値入力("年齢", 年齢, 0, 120) |
テキストエリア(ラベル, 値, 行数) | 複数行テキスト | 文 = GUI.テキストエリア("内容", 文, 10) |
レイアウト
| 関数 | 説明 |
|---|---|
パネル開始(名前) / パネル終了() | 枠線付きグループ |
横並び開始() / 横並び終了() | 水平レイアウト |
グリッド開始(列数) / グリッド終了() | グリッドレイアウト |
タブバー(タブ配列, 値) / タブ内容(値, N) | タブ切替 |
スクロール領域開始(名前, 高さ) / スクロール領域終了() | スクロール領域 |
折りたたみ開始(ラベル) / 折りたたみ終了() | 折りたたみセクション |
描画
| 関数 | 説明 |
|---|---|
四角塗り(x, y, w, h, 色) | 塗りつぶし四角形 |
円塗り(x, y, r, 色) | 塗りつぶし円 |
線描画(x1, y1, x2, y2, 色, 太さ) | 直線 |
テキスト描画(テキスト, x, y, 色) | 任意位置にテキスト |
画像描画(パス, x, y, w, h) | 画像表示 |
グラデーション四角(x, y, w, h, 色1, 色2) | グラデーション |
データ表示
| 関数 | 説明 |
|---|---|
テーブル作成(列配列) / テーブル表示(T) | 表形式データ |
ツリー作成() / ツリー表示(T) | ツリービュー |
棒グラフ(タイトル, ラベル, データ, 高さ) | 棒グラフ |
折れ線グラフ(タイトル, ラベル, データ, 高さ) | 折れ線グラフ |
円グラフ(タイトル, ラベル, データ, サイズ) | 円グラフ |
実践例:TODO アプリ
複数のウィジェットを組み合わせた実用例です。
取り込む "hajimu_gui" として GUI
変数 アプリ = GUI.アプリ作成("TODOアプリ", 500, 600)
変数 タスク一覧 = []
変数 完了一覧 = []
変数 新規タスク = ""
GUI.描画ループ(アプリ, 関数():
GUI.見出し("📝 TODO リスト")
// 新規タスク入力
GUI.横並び開始()
新規タスク = GUI.テキスト入力("新しいタスク", 新規タスク)
もし GUI.ボタン("追加") なら
もし 新規タスク != "" なら
タスク一覧 = タスク一覧 + [新規タスク]
完了一覧 = 完了一覧 + [偽]
新規タスク = ""
終わり
終わり
GUI.横並び終了()
GUI.区切り線()
// タスク一覧
GUI.スクロール領域開始("タスク", 400)
繰り返す 変数 i = 0 から タスク一覧の長さ - 1 まで
GUI.横並び開始()
完了一覧[i] = GUI.チェックボックス("##" + i, 完了一覧[i])
もし 完了一覧[i] なら
GUI.色付きラベル("✅ " + タスク一覧[i], "#888888")
でなければ
GUI.ラベル("⬜ " + タスク一覧[i])
終わり
GUI.横並び終了()
終わり
GUI.スクロール領域終了()
// ステータスバー
GUI.区切り線()
変数 完了数 = 0
繰り返す 変数 j = 0 から 完了一覧の長さ - 1 まで
もし 完了一覧[j] == 真 なら
完了数 = 完了数 + 1
終わり
終わり
GUI.プログレスバー("進捗", 完了数 / タスク一覧の長さ)
終わり)
GUI.アプリ終了(アプリ)
Phase 1〜134 — 機能の全体像
hajimu_gui は 134 フェーズにわたって段階的に開発されました。主な機能カテゴリ:
| カテゴリ | Phase | 機能例 |
|---|---|---|
| 基本ウィジェット | 1〜4 | ボタン、テキスト入力、チェックボックス、スライダー |
| 描画・図形 | 5〜6 | 四角、円、線、画像、グラデーション |
| データ構造 | 7〜8 | テーブル、ツリー、ドラッグ&ドロップ |
| テーマ・スタイル | 10〜11 | ダーク/ライトテーマ、アニメーション |
| 高度な描画 | 12〜13 | パス描画、ベジェ曲線、SVG |
| メニュー・ツールバー | 14〜16 | メニューバー、コンテキストメニュー、ステータスバー |
| ドック・ウィザード | 17〜19 | ドック可能パネル、ウィザード、スプリッター |
| リッチテキスト | 20〜21 | リッチテキスト編集、構文ハイライト |
| カレンダー・日付 | 22〜23 | カレンダー、日付選択、タイムライン |
| チャート | 25〜27 | 棒グラフ、折れ線、円グラフ、レーダーチャート |
| マップ・地理 | 50〜51 | マップ表示、マーカー、ルート |
| 音声・動画 | 53〜55 | 音声再生、録音、動画プレイヤー |
| 3D描画 | 60〜63 | 3D初期化、立方体、回転、照明 |
| アクセシビリティ | 70〜73 | スクリーンリーダー、ハイコントラスト |
| 国際化 | 80〜81 | 多言語対応、RTL |
| テスト | 90〜93 | UIテスト、スクリーンショット比較 |
| マテリアル | 100〜103 | マテリアルデザインウィジェット |
| Cupertino | 110〜113 | iOS風デザインウィジェット |
| 最新 (Phase 121–130) | 121〜130 | カスタムペインター、Sliver、Hero、セマンティクス |
| 宣言的UI / 仮想ノードツリー | 131 | VUI.開始 / VUI.ボックス / VUI.ボタン、Flexboxレイアウト、差分レンダリング |
| フレームスケジューラ | 132 | VSync / FPS制御 / 描画コールキュー / アダプティブスロットリング |
| ホットリロード | 133 | stat mtime ポーリング、最大32ブァイル監視、UIステート保全 |
| DevTools オーバーレイ | 134 | FPSグラフ / ウィジェットインスペクタ / ログコンソール / パフォーマンス表示 |
さらに詳しく
技術スタック
| コンポーネント | 技術 |
|---|---|
| 実装言語 | C 言語(単一ファイル 23,000 行) |
| macOS | Cocoa (AppKit / NSWindow / NSOpenGLView) |
| Linux | X11 + GLX |
| Windows | Win32 API (CreateWindow / wglCreateContext) |
| レンダラー | 自作 hjp_render.c |
| フォント | 自作フォント処理(hjp_platform 経由 — CoreText / FreeType) |
| 画像 | 自作画像読み込み(hjp_platform 経由 — ImageIO / system) |
| 日本語フォント | Noto Sans CJK JP(同梱) |