ImRAD - ImGui लाइब्रेरी के लिए GUI बिल्डर
(github.com/tpecholt)- ImRAD ImGui के लिए एक GUI बिल्डर है, जो ऐप्लिकेशन में सीधे इस्तेमाल किया जा सकने वाला C++ code जनरेट करता है और उसे फिर से parse करके जनरेट की गई UI में लगातार बदलाव करने देता है
- यह data binding, events और manual UI code जोड़ने को support करता है; generated code को comment markers से अलग किया जाता है, ताकि user अपना code जोड़ने के बाद भी designer का इस्तेमाल जारी रख सके
- यह Windows, Linux, MacOS पर चलता है, और generated code Windows, Linux, MacOS, Android पर काम करता है
- Layout absolute positioning के बजाय
SameLine,Spacing,NextColumnऔर box layout का इस्तेमाल करता है, और widgets के बीच parent-child संबंध और क्रम को बनाए रखता है - ImRAD source GPL है, लेकिन tool द्वारा generated code और generated code द्वारा इस्तेमाल किया जाने वाला
imrad.hGPL से बाहर हैं, इसलिए इन्हें open source और commercial projects में शामिल किया जा सकता है
ImRAD की भूमिका और code generation का तरीका
- ImRAD ImGui library के लिए GUI builder है
- यह ऐप्लिकेशन में सीधे इस्तेमाल हो सकने वाला C++ code generate और parse करता है
- अन्य tools के विपरीत, यह generated UI को लगातार edit करने वाले workflow को support करता है
-
Data binding
- Events
- Manual UI code जोड़ना
- Generated code
.hऔर.cppfiles के रूप में save होता है, और code preview से जल्दी देखा जा सकता है
-
Supported platforms और window types
- ImRAD खुद Windows, Linux, MacOS पर चलता है
- Generated code Windows, Linux, MacOS, Android पर चलता है
- यह कई तरह के window design को support करता है
- Floating windows, popups, modal popups
- GLFW integration सहित
MainWindow- ImRAD GLFW calls generate करता है, जिससे ImGui window और OS window के title bar, resize flags, auto size आदि synchronize होते हैं
Activity- पूरे viewport area को भरने वाली undecorated window
- एक समय में केवल एक activity दिखाई जा सकती है
- मुख्य रूप से Android apps में उपयोग होती है
- Templates भी शामिल हैं
- GLFW-based general
main.cpp - Android के लिए
MainActivity.java,AndroidManifest.xml,main.cpp,CMakeLists.txt
- GLFW-based general
Widgets और layout features
- ImGui widgets की व्यापक range support करता है
Text,Checkbox,Combo,Button,Slider,ColorEditजैसे basic widgetsChild,Table,CollapsingHeader,TreeNode,TabBarजैसे container widgetsSplitter,DockSpaceजैसे widgetsMenuBarऔर context menu editing- बाहरी widget code को call करने वाला
CustomWidget
- Layout absolute positioning के बजाय
SameLine,Spacing,NextColumnका इस्तेमाल करके generate होता है- Widgets को item spacing और frame padding का consistent पालन करने देता है
Tableजैसे container widgets के लिए महत्वपूर्ण parent-child संबंध और child order स्पष्ट रहते हैं- चुने गए parent corner से relative distance बनाए रखने वाला वैकल्पिक positioning भी संभव है, जिसे overlay widgets के लिए इस्तेमाल किया जा सकता है
- Box layout support करता है
- ImGui features के ऊपर implemented layout mechanism
- Resizable widgets को horizontal या vertical direction में stretch किया जा सकता है
- Alignment बनाने के लिए spacer डाला जा सकता है
- अदृश्य
Tableका उपयोग करके horizontal layout generate करने वाला Table Layout Helper भी इस्तेमाल किया जा सकता है
Binding, events, user code
- ImGui एक immediate mode GUI library है, इसलिए input text या combo box items जैसे widget states को draw करते समय generated code के भीतर set करना होता है; ImRAD इसे property binding से handle करता है
- Class variables को simple class wizard या binding dialog में manage किया जा सकता है
- Property binding का उपयोग करने पर generated UI dynamic तरीके से काम करता है, फिर भी design योग्य बना रहता है
- Event handlers और support code generation को support करता है
- उदाहरण के लिए, modal dialog के लिए बंद होने पर call होने वाले lambda callback वाला
OpenPopupmember function automatically generate होता है - Event handlers user event handling code और generated हिस्से को अलग रखते हैं, ताकि designer चलता रहे
- उदाहरण के लिए, modal dialog के लिए बंद होने पर call होने वाले lambda callback वाला
- Generated code comment markers से अलग किया जाता है
- User generated code के आसपास extra code डाल सकता है
- Draw पर निर्भर popup calls या कुछ variable calculations में इसका उपयोग किया जा सकता है
CustomWidgetका इस्तेमाल करके user callback को delegate भी किया जा सकता है
Settings, styles, runtime variants
- Window configuration runtime पर activate की जा सकने वाली UI variant है
- अलग-अलग platforms या screen rotation आदि के लिए उपयोगी है
- Style रंगों, style variables और fonts को grouping करने वाली setting है
- ImGui default style के अलावा user नया style define कर सकता है
- Styles को
stylefolder के नीचे INI files के रूप में save किया जा सकता है
- Dialog unit को device-independent pixels के रूप में set किया जा सकता है
- Android और DPI-aware apps के लिए उपयोगी है
- ImRAD open files में changes track करता है
- ImRAD में design करते समय user अपनी चुनी हुई IDE में भी वही files edit कर सकता है
- INI style changes भी तुरंत दिखाई देते हैं
Generated code dependencies और options
- Generated code project में सीधे इस्तेमाल किया जा सकता है, और default रूप से केवल ImGui library और companion header
imrad.hपर निर्भर करता है - वर्तमान में
imrad.hमें interface और implementation दोनों शामिल हैंmain.cppमें implementation बनाने के लिए include से पहलेIMRAD_H_IMPLEMENTATIONdefine करें
- Generated code
ImRad::Formatformatting routine का उपयोग करता है- C++20 में यह default रूप से
std::formatको delegate करता है IMRAD_WITH_FMTdefine करने परfmtlibrary का इस्तेमाल किया जा सकता है- अगर दोनों नहीं हैं, तो formatting flags को skip करने वाला simple formatting routine इस्तेमाल होता है
- C++20 में यह default रूप से
- कुछ features के लिए additional dependencies और explicit activation चाहिए
MainWindowयाImagewidget के लिए GLFW, STB जैसी additional libraries चाहिएIMRAD_WITH_LOAD_TEXTUREdefine करना आवश्यक है
imrad.hzlib library का उपयोग करके zip files से assets load कर सकता है- इसे
IMRAD_WITH_MINIZIPसे activate किया जाता है
- इसे
- Translation strings सहित code generate किया जा सकता है
IMRAD_WITH_GETTEXTसेimrad.hcompile करने पर gettext/libintl से translation संभव है- बिना dependency वाला libintl-lite भी इस्तेमाल किया जा सकता है
License और distribution
- ImRAD source code GPL license के तहत है
- Tool द्वारा generated code GPL से बाहर है
- इसे open source या commercial projects में शामिल किया जा सकता है
- Generated code का license user तय करता है
- Generated code द्वारा इस्तेमाल किया जाने वाला
imrad.hभी GPL से बाहर है - Latest version repository clone करने के बाद CMake से build करें
3rdpartydirectory के submodules भी लाने होंगे
- कुछ पुराने versions Releases से download किए जा सकते हैं
- Tutorials और विस्तृत documentation wiki पर देखे जा सकते हैं
1 टिप्पणियां
Hacker News की राय
इस प्रोजेक्ट की सबसे हैरान करने वाली चीज़ों में से एक यह है कि इसके पास अपने द्वारा generate किए जा सकने वाले C++ subset को पढ़ने के लिए एक हाथ से बनाया गया parser है
पूरा का पूरा single header में implement किया गया है, और यह प्रभावशाली होने के साथ-साथ थोड़ा पागलपन जैसा भी लगता है
https://github.com/tpecholt/imrad/blob/main/src/cpp_parser.h
मैं programming में बहुत familiar नहीं हूँ, इसलिए बस इतना समझा कि इस project में data पढ़ सकने वाली कोई चीज़ है
अगर कोई समझा सके कि C++ पढ़ सकने वाला tool क्यों बड़ी बात है, तो अच्छा होगा
वाकई शानदार। शायद Visual Basic nostalgia की वजह से हो, लेकिन मेरे लिए यह imgui केक पर icing जैसा project है
अगर यह browser में GUI जल्दी बनाने और result को editor में copy-paste करने के लिए wasm HTML5 app के रूप में आ जाए, तो बढ़िया होगा
इसमें लिखा है, “C++ code generate और parse करता है, और यह code application में सीधे इस्तेमाल किया जा सकता है”; यहाँ parsing से मतलब क्या अपने ही generated code को दोबारा पढ़ने से है, यह जानना चाहता हूँ
लगता है कि यह अपने generated code को पढ़ने के लिए ही है। हाथ से बना parser पूरी भाषा नहीं, सिर्फ़ subset handle करता है
उदाहरण के लिए STL containers को पहचानना hardcode किया गया है, और शायद केवल वही चीज़ें handle करता है जो generated code में आ सकती हैं
इस stage पर यह Abstract Syntax Tree (AST) नहीं बनाता। यह tokenization और lexical analysis करता है, और parsing “state machine” को कैसे आगे बढ़ाना है यह caller को समझना पड़ता है—ऐसा structure लगता है
AST बनाना और code generation शायद 9000+ lines वाली इस file में होता है: https://github.com/tpecholt/imrad/blob/main/src/node.cpp
लिखा है, “ImRAD Windows, Linux, MacOS पर चलता है”
बेहतरीन। पिछले कुछ वर्षों से ImGui C++ apps बना रहा था; अगर यह होता तो लगता है बहुत समय बच जाता
अगर dear-imgui के creator ने बताया है कि नाम “dear” है, तो क्या “for the Dear library” नहीं कहना चाहिए?
IMGUI का मतलब immediate mode GUI है, और ocornut ने कहा था कि वह “simgui” नाम के एक दूसरे IMGUI से inspired थे
“लगभग 15 महीने बाद नाम बदलकर ‘dear imgui’ किया। क्योंकि ‘imgui’ पूरे acronym पर कब्ज़ा कर रहा था। आज तक confusion पैदा करने के लिए माफ़ी।”
https://github.com/ocornut/imgui/issues/7892
namespace का नाम भी ImGui है, और यह कभी भी केवल “Dear” नहीं है
उसमें sudo बहुत ज़्यादा नहीं होना चाहिए, ऐसा लगता है। बाकी सच में बहुत अच्छा दिखता है
generated C++ code को pyimgui bindings इस्तेमाल करते समय Python जैसी जगहों में भी use किया जा सकता है या नहीं, यह जानना चाहता हूँ
ImGui के लिए GUI builder ImGui itself में implement क्यों नहीं किया गया, यह जानना चाहता हूँ
बढ़िया। मैं ImGui से project बना रहा हूँ और लगातार सोचता रहा कि काश ऐसा कुछ होता। इसे try करूँगा
Steam एक popular cross-platform system है; क्या इसे non-game applications के लिए भी इस्तेमाल किया जा सकता है? यहाँ तक कि enterprise applications के लिए भी?
multiple lines, fonts, और कुछ मामलों में RTL जैसी features चाहिए होते हैं, लेकिन ImGUI में ये हिस्से कमज़ोर हैं