ImRAD - Trình dựng GUI cho thư viện ImGui
(github.com/tpecholt)- ImRAD là trình dựng GUI cho ImGui, có thể tạo mã C++ dùng trực tiếp trong ứng dụng và phân tích lại mã đó để tiếp tục chỉnh sửa UI đã tạo
- Hỗ trợ data binding, sự kiện và bổ sung mã UI thủ công; mã được tạo được phân tách bằng các dấu chú thích để người dùng vẫn có thể tiếp tục dùng trình thiết kế sau khi chèn mã riêng
- Chạy trên Windows, Linux, MacOS; mã được tạo chạy trên Windows, Linux, MacOS và Android
- Thay vì vị trí tuyệt đối, bố cục dùng
SameLine,Spacing,NextColumnvà box layout, đồng thời giữ quan hệ cha-con và thứ tự giữa các widget - Mã nguồn ImRAD dùng GPL, nhưng mã do công cụ tạo ra và
imrad.hmà mã tạo ra sử dụng được loại trừ khỏi GPL, nên có thể đưa vào dự án mã nguồn mở hoặc thương mại
Vai trò của ImRAD và cách tạo mã
- ImRAD là trình dựng GUI cho thư viện ImGui
- Tạo và phân tích mã C++ có thể dùng trực tiếp trong ứng dụng
- Khác với nhiều công cụ khác, nó hỗ trợ quy trình tiếp tục chỉnh sửa UI đã được tạo
-
Data binding
- Sự kiện
- Bổ sung mã UI thủ công
- Mã được tạo được lưu thành các tệp
.hvà.cpp, đồng thời có thể kiểm tra nhanh bằng phần xem trước mã
-
Nền tảng hỗ trợ và loại cửa sổ
- Bản thân ImRAD chạy trên Windows, Linux, MacOS
- Mã được tạo chạy trên Windows, Linux, MacOS, Android
- Hỗ trợ thiết kế nhiều loại cửa sổ
- Cửa sổ nổi, popup, popup modal
MainWindowbao gồm tích hợp GLFW- ImRAD tạo các lệnh gọi GLFW để đồng bộ cửa sổ ImGui với thanh tiêu đề, cờ cho phép đổi kích thước, tự động đổi kích thước... của cửa sổ hệ điều hành
Activity- Cửa sổ không viền phủ kín toàn bộ vùng viewport
- Mỗi lần chỉ có thể hiển thị một activity
- Chủ yếu dùng cho ứng dụng Android
- Cũng bao gồm các mẫu có sẵn
main.cppthông thường dựa trên GLFWMainActivity.java,AndroidManifest.xml,main.cpp,CMakeLists.txtcho Android
Widget và tính năng bố cục
- Hỗ trợ nhiều widget ImGui
- Các widget cơ bản như
Text,Checkbox,Combo,Button,Slider,ColorEdit - Các widget container như
Child,Table,CollapsingHeader,TreeNode,TabBar - Các widget như
Splitter,DockSpace - Chỉnh sửa
MenuBarvà menu ngữ cảnh CustomWidgetcó thể gọi mã widget bên ngoài
- Các widget cơ bản như
- Bố cục được tạo bằng
SameLine,Spacing,NextColumnthay vì vị trí tuyệt đối- Giúp widget nhất quán với item spacing và frame padding
- Quan hệ cha-con và thứ tự con, vốn quan trọng với các widget container như
Table, được thể hiện rõ ràng - Cũng có thể dùng cách chỉ định vị trí thay thế để giữ khoảng cách tương đối từ góc cha được chọn, phù hợp cho widget overlay
- Hỗ trợ box layout
- Đây là cơ chế bố cục được triển khai trên các tính năng của ImGui
- Có thể kéo giãn widget có thể đổi kích thước theo chiều ngang hoặc dọc
- Có thể chèn spacer để căn chỉnh
- Cũng có thể dùng Table Layout Helper để tạo bố cục ngang bằng
Tableẩn
Binding, sự kiện và mã người dùng
- Vì ImGui là thư viện GUI immediate mode, trạng thái widget như văn bản nhập hay mục của combobox phải được thiết lập trong mã tạo ra tại thời điểm vẽ, và ImRAD xử lý điều này bằng property binding
- Biến lớp có thể được quản lý bằng class wizard đơn giản hoặc trong hộp thoại binding
- Dùng property binding giúp UI được tạo hoạt động động mà vẫn tiếp tục thiết kế được
- Hỗ trợ tạo trình xử lý sự kiện và mã phụ trợ
- Ví dụ, hộp thoại modal sẽ tự động tạo hàm thành viên
OpenPopupcó callback lambda được gọi khi đóng - Trình xử lý sự kiện tách mã xử lý sự kiện của người dùng khỏi phần được tạo ra để trình thiết kế vẫn tiếp tục hoạt động
- Ví dụ, hộp thoại modal sẽ tự động tạo hàm thành viên
- Mã được tạo được phân tách bằng dấu chú thích
- Người dùng có thể thêm mã bổ sung xung quanh mã được tạo
- Có thể dùng cho lời gọi popup phụ thuộc vào draw hoặc cho một số phép tính biến
- Cũng có thể ủy quyền cho callback người dùng bằng
CustomWidget
Cấu hình, style và biến thể runtime
- Window configuration là các biến thể UI có thể kích hoạt khi runtime
- Hữu ích cho các nền tảng khác nhau hoặc khi xoay màn hình
- Style là tập hợp cấu hình gồm màu sắc, biến style và font
- Ngoài style mặc định của ImGui, người dùng có thể định nghĩa style mới
- Style có thể được lưu thành tệp INI trong thư mục
style
- Dialog unit có thể được đặt theo pixel độc lập thiết bị
- Hữu ích cho Android và các ứng dụng nhận biết DPI
- ImRAD theo dõi thay đổi của các tệp đang mở
- Trong khi thiết kế bằng ImRAD, người dùng vẫn có thể chỉnh sửa cùng các tệp đó trong IDE đã chọn
- Các thay đổi style INI cũng được hiển thị ngay lập tức
Phụ thuộc của mã tạo ra và các tùy chọn
- Mã được tạo có thể dùng trực tiếp trong dự án và mặc định chỉ phụ thuộc vào thư viện ImGui cùng header đi kèm
imrad.h - Hiện tại
imrad.hbao gồm cả giao diện lẫn phần triển khai- Để tạo phần triển khai trong
main.cpp, hãy định nghĩaIMRAD_H_IMPLEMENTATIONtrước khi include
- Để tạo phần triển khai trong
- Mã được tạo sử dụng routine định dạng
ImRad::Format- Trên C++20, mặc định nó ủy quyền cho
std::format - Nếu định nghĩa
IMRAD_WITH_FMTthì có thể dùng thư việnfmt - Nếu không có cả hai, sẽ dùng routine định dạng đơn giản bỏ qua các cờ định dạng
- Trên C++20, mặc định nó ủy quyền cho
- Một số tính năng cần thêm phụ thuộc và phải bật tường minh
- Widget
MainWindowhoặcImagecần thêm thư viện như GLFW, STB - Cần định nghĩa
IMRAD_WITH_LOAD_TEXTURE
- Widget
imrad.hcó thể dùng thư viện zlib để nạp asset từ tệp zip- Bật bằng
IMRAD_WITH_MINIZIP
- Bật bằng
- Có thể tạo mã bao gồm chuỗi dịch
- Nếu biên dịch
imrad.hvớiIMRAD_WITH_GETTEXT, có thể dịch bằng gettext/libintl - Cũng có thể dùng libintl-lite không có phụ thuộc
- Nếu biên dịch
Giấy phép và phát hành
- Mã nguồn ImRAD dùng giấy phép GPL
- Mã do công cụ tạo ra được loại trừ khỏi GPL
- Có thể đưa vào dự án mã nguồn mở hoặc thương mại
- Người dùng tự quyết định giấy phép của mã được tạo
imrad.hmà mã được tạo sử dụng cũng được loại trừ khỏi GPL- Phiên bản mới nhất được build bằng CMake sau khi clone kho chứa
- Cần lấy cả các submodule trong thư mục
3rdparty
- Cần lấy cả các submodule trong thư mục
- Một số phiên bản hơi cũ hơn có thể tải từ Releases
- Có thể xem hướng dẫn và tài liệu chi tiết trong wiki
1 bình luận
Ý kiến trên Hacker News
Một trong những phần đáng kinh ngạc nhất của dự án này là nó có một parser tự viết để đọc tập con C++ mà chính nó có thể tạo ra
Tất cả được triển khai trong một header duy nhất, vừa ấn tượng vừa trông như một việc điên rồ
https://github.com/tpecholt/imrad/blob/main/src/cpp_parser.h
Tôi không quen với lập trình, nên chỉ hiểu đại khái là dự án này có thứ gì đó có thể đọc dữ liệu
Mong ai đó giải thích vì sao một công cụ có thể đọc C++ lại đáng nể như vậy
Thực sự rất tuyệt. Có thể là vì nỗi hoài niệm Visual Basic, nhưng với tôi đây giống như lớp trang trí trên chiếc bánh imgui vậy
Sẽ rất tuyệt nếu nó trở thành một ứng dụng wasm HTML5, để có thể nhanh chóng tạo GUI trong trình duyệt rồi sao chép kết quả dán vào editor
Có đoạn nói “tạo và phân tích cú pháp mã C++, và mã này có thể được dùng trực tiếp trong ứng dụng”, nên tôi tự hỏi việc phân tích cú pháp ở đây có phải là để đọc lại chính mã mà nó đã tạo ra không
Có vẻ đúng là để đọc mã do chính nó tạo ra. Parser tự viết này chỉ xử lý một tập con, không phải toàn bộ ngôn ngữ
Ví dụ, nó hard-code việc nhận diện các container STL, và có lẽ chỉ xử lý những thứ có thể xuất hiện trong mã được tạo ra
Ở bước này nó không tạo cây cú pháp trừu tượng (AST). Có vẻ nó thực hiện token hóa và phân tích từ vựng, còn cách tiến “máy trạng thái” phân tích cú pháp ra sao thì caller phải tự hiểu
Việc tạo AST và sinh mã dường như nằm trong file hơn 9000 dòng này: https://github.com/tpecholt/imrad/blob/main/src/node.cpp
Có ghi rằng “ImRAD chạy trên Windows, Linux, MacOS”
Tuyệt vời. Vài năm qua tôi đã làm các ứng dụng ImGui C++, và nếu có cái này thì chắc đã tiết kiệm được rất nhiều thời gian
Nếu người tạo ra dear-imgui đã nói rằng tên là “dear”, thì chẳng phải nên gọi là “for the Dear library” sao?
IMGUI nghĩa là GUI chế độ tức thời, và ocornut từng nói mình lấy cảm hứng từ một IMGUI khác tên là “simgui”
“Khoảng 15 tháng sau tôi đổi tên thành ‘dear imgui’, vì ‘imgui’ đang chiếm trọn cả cụm viết tắt. Tôi vẫn xin lỗi vì đến nay nó còn gây nhầm lẫn.”
https://github.com/ocornut/imgui/issues/7892
Tên namespace cũng là ImGui, và tuyệt đối không chỉ là “Dear”
Có lẽ không nên nhét quá nhiều sudo vào đó. Ngoài chuyện đó thì trông thật sự rất tuyệt
Tôi tự hỏi liệu mã C++ được sinh ra có thể dùng được ở những nơi như Python khi sử dụng binding pyimgui không
Tôi tự hỏi tại sao GUI builder cho ImGui lại không được triển khai bằng chính ImGui
Hay đấy. Tôi đang làm một dự án bằng ImGui và cứ nghĩ mãi rằng giá mà có thứ như thế này. Tôi sẽ thử dùng xem
Steam là một hệ thống đa nền tảng phổ biến, vậy có thể dùng cho cả ứng dụng không phải game không? Thậm chí có dùng được cho ứng dụng doanh nghiệp không?
Chẳng hạn nhiều dòng, phông chữ, và trong một số trường hợp là RTL; ImGUI còn thiếu ở các phần này