- ImRADはImGui向けのGUIビルダーで、アプリケーションでそのまま使えるC++コードを生成し、再パースして生成済みUIを継続的に修正できる
- データバインディング、イベント、手動でのUIコード追加をサポートし、生成コードはコメントマーカーで区切られるため、ユーザーがコードを挿入してもデザイナーの利用を継続できる
- Windows、Linux、MacOSで動作し、生成されたコードはWindows、Linux、MacOS、Androidで動作する
- レイアウトは絶対配置ではなく
SameLine、Spacing、NextColumnとボックスレイアウトを用い、ウィジェット間の親子関係と順序を維持する
- ImRADのソースはGPLだが、ツールが生成したコードと生成コードが利用する
imrad.hはGPLの対象外であり、オープンソース・商用プロジェクトに組み込める
ImRADの役割とコード生成方式
- ImRADはImGuiライブラリ向けのGUIビルダー
- アプリケーションで直接利用できるC++コードを生成・解析する
- 他のツールと異なり、生成されたUIを継続して修正するワークフローをサポートする
-
データバインディング
- イベント
- 手動でのUIコード追加
- 生成されたコードは
.hおよび.cppファイルとして保存され、コードプレビューですばやく確認できる
対応プラットフォームとウィンドウ種類
- ImRAD自体はWindows、Linux、MacOSで動作する
- 生成されたコードはWindows、Linux、MacOS、Androidで動作する
- さまざまなウィンドウ設計をサポートする
- フローティングウィンドウ、ポップアップ、モーダルポップアップ
- GLFW統合を含む
MainWindow
- ImRADがGLFW呼び出しを生成し、ImGuiウィンドウとOSウィンドウのタイトルバー、リサイズフラグ、自動サイズなどを同期する
Activity
- ビューポート全体を埋める装飾なしのウィンドウ
- 一度に1つのactivityのみ表示可能
- 主にAndroidアプリで利用される
- テンプレートも含まれる
- GLFWベースの一般的な
main.cpp
- Android向けの
MainActivity.java、AndroidManifest.xml、main.cpp、CMakeLists.txt
ウィジェットとレイアウト機能
- 幅広いImGuiウィジェットをサポートする
Text、Checkbox、Combo、Button、Slider、ColorEditなどの基本ウィジェット
Child、Table、CollapsingHeader、TreeNode、TabBarなどのコンテナウィジェット
Splitter、DockSpaceなどのウィジェット
MenuBarとコンテキストメニューの編集
- 外部ウィジェットコードを呼び出せる
CustomWidget
- レイアウトは絶対配置ではなく
SameLine、Spacing、NextColumnを使って生成される
- ウィジェットがitem spacingとframe paddingに一貫して従うようにする
Tableのようなコンテナウィジェットで重要な親子関係と子要素の順序が明確になる
- 選択した親コーナーからの相対距離を維持する代替配置指定も可能で、オーバーレイウィジェットに利用できる
- ボックスレイアウトをサポートする
- ImGui機能の上に実装されたレイアウト機構
- リサイズ可能なウィジェットを横方向または縦方向に伸ばせる
- spacerを挿入して整列を作れる
- 不可視の
Tableを使って横レイアウトを生成するTable Layout Helperも利用できる
バインディング、イベント、ユーザーコード
- ImGuiは即時モードGUIライブラリであるため、入力テキストやコンボボックス項目のようなウィジェット状態は描画時点で生成コード内に設定する必要があり、ImRADはこれをプロパティバインディングで処理する
- クラス変数はシンプルなclass wizardまたはバインディングダイアログで管理できる
- プロパティバインディングを使うことで、生成UIを動的に動作させつつ継続してデザインできる
- イベントハンドラーと補助コードの生成をサポートする
- たとえばモーダルダイアログでは、閉じる際に呼び出されるラムダコールバックを持つ
OpenPopupメンバー関数を自動生成する
- イベントハンドラーはユーザーのイベント処理コードと生成部分を分離し、デザイナーを継続利用できるようにする
- 生成コードはコメントマーカーで区切られる
- ユーザーは生成コードの周囲に追加コードを挿入できる
- drawに依存するポップアップ呼び出しや一部の変数計算に利用できる
CustomWidgetを使ってユーザーコールバックへ委譲することもできる
設定、スタイル、ランタイム変種
- Window configurationはランタイムで有効化できるUIバリエーション
- スタイルは色、スタイル変数、フォントをまとめた設定
- ImGuiのデフォルトスタイル以外に、ユーザーが新しいスタイルを定義できる
- スタイルは
styleフォルダー配下のINIファイルとして保存可能
- dialog unitはデバイス非依存ピクセルに設定できる
- ImRADは開いているファイルの変更を追跡する
- ImRADでデザインしながら、ユーザーは選択したIDEでも同じファイルを編集できる
- INIスタイルの変更も即座に反映される
生成コードの依存関係とオプション
- 生成コードはプロジェクトでそのまま使用でき、基本的にはImGuiライブラリと付属ヘッダー**
imrad.h**のみに依存する
- 現在の
imrad.hはインターフェースと実装の両方を含む
main.cppで実装を生成するには、includeの前にIMRAD_H_IMPLEMENTATIONを定義する
- 生成コードは
ImRad::Formatフォーマットルーチンを使用する
- C++20ではデフォルトで
std::formatに委譲する
IMRAD_WITH_FMTを定義するとfmtライブラリを使用できる
- どちらもない場合は、フォーマットフラグを飛ばす単純なフォーマットルーチンを使う
- 一部機能には追加の依存関係と明示的な有効化が必要
MainWindowまたはImageウィジェットには、GLFW、STBなどの追加ライブラリが必要
IMRAD_WITH_LOAD_TEXTUREの定義が必要
imrad.hはzlibライブラリを使用してzipファイルからアセットを読み込める
- 翻訳文字列を含むコードを生成できる
IMRAD_WITH_GETTEXTでimrad.hをコンパイルするとgettext/libintlで翻訳可能になる
- 依存関係のないlibintl-liteも利用できる
ライセンスと配布
- ImRADのソースコードはGPLライセンス
- ツールが生成したコードはGPLの対象外
- オープンソースまたは商用プロジェクトに含められる
- 生成コードのライセンスはユーザーが決定する
- 生成コードが利用する
imrad.hもGPLの対象外
- 最新版はリポジトリをcloneした後、CMakeでビルドする
3rdpartyディレクトリのサブモジュールも取得する必要がある
- やや古いバージョンはReleasesからダウンロードできる
- チュートリアルと詳細なドキュメントはwikiで確認できる
1件のコメント
Hacker News のコメント
このプロジェクトで最も驚く点の一つは、自分が生成できる C++ のサブセットを読むための手製パーサを持っていること
すべて単一ヘッダーで実装されていて、印象的でもあり、狂気の沙汰のようにも見える
https://github.com/tpecholt/imrad/blob/main/src/cpp_parser.h
プログラミングには詳しくないので、このプロジェクトにデータを読める何かがある、という程度にしか理解できていない
C++ を読めるツールがなぜすごいのか説明してくれるとうれしい
本当にすばらしい。Visual Basic への郷愁のせいかもしれないが、自分にとっては imgui ケーキの上の飾りのようなプロジェクトだ
ブラウザで GUI を素早く作り、結果をエディタにコピー&ペーストできるように、wasm HTML5 アプリとして入ると良さそう
「C++ コードを生成してパースし、このコードはアプリケーションでそのまま使用できる」とあるが、ここでのパースは自分が生成したコードを再び読むためなのか気になる
自分が生成したコードを読むためのものに見える。手製パーサは言語全体ではなくサブセットだけを扱う
たとえば STL コンテナの認識をハードコードしており、おそらく生成コードに出てき得るものだけを処理しているようだ
この段階では抽象構文木(AST) は作らない。トークン化と字句解析を行い、パースの「状態機械」をどう進めるかは呼び出し側が理解する必要がある構造に見える
AST の生成とコード生成は、9000 行を超えるこのファイルで行っているようだ: https://github.com/tpecholt/imrad/blob/main/src/node.cpp
「ImRAD は Windows、Linux、MacOS で動作する」と書かれている
すばらしい。ここ数年 ImGui C++ アプリを作っていたが、これがあれば多くの時間を節約できただろう
dear-imgui の作者が名前は「dear」だと明かしたのなら、「for the Dear library」と言うべきではないのか?
IMGUI は即時モード GUI を意味し、ocornut は「simgui」という別の IMGUI から着想を得たと言っていた
「約15か月後に『dear imgui』へ改名した。『imgui』が略語全体を独占していたためだ。今でも混乱を招いていることは申し訳ない」
https://github.com/ocornut/imgui/issues/7892
名前空間名も ImGui であり、単に「Dear」だけでは決してない
そこに sudo があまり入りすぎないほうがよさそう。それ以外は本当に良さそうに見える
生成された C++ コードを、pyimgui バインディングを使うときに Python などでも使えるのか気になる
ImGui 用の GUI ビルダーがなぜ ImGui 自体で実装されていないのか気になる
すばらしい。ImGui でプロジェクトを作っていて、ずっとこういうものがあればいいと思っていた。試してみるつもり
Steam は人気のあるクロスプラットフォームシステムだが、ゲームではないアプリケーションにも使えるのだろうか? エンタープライズアプリケーションにさえ可能だろうか?
複数行、フォント、場合によっては RTL のような機能だが、ImGUI にはこうした部分が不足している