C++11 syntactic sugar for ImGui with RAII guards
This single header library adds a clean DSL (syntax sugar) to
construct ImGui interfaces in c++11. It manages the stack with transparent
RAII guards.
Just add imgui_sugar.hpp
to your sources and include it when required.
#include <imgui/imgui.h>
#include <imgui_sugar.hpp>
// ...
static int left = 0, right = 0;
ImGui::SetNextWindowPos(ImVec2(30, 50), ImGuiCond_FirstUseEver);
set_StyleColor(ImGuiCol_WindowBg, ImVec4{0.88f, 0.88f, 0.88f, 1.0f});
set_StyleColor(ImGuiCol_Text, 0xff000000);
with_Window("Test Window", nullptr, ImGuiWindowFlags_AlwaysAutoResize) {
ImGui::Text("Hello");
with_Group {
ImGui::Text("Left %d", left);
if (ImGui::Button("Incr Left"))
++left;
}
ImGui::SameLine();
with_Group {
set_StyleColor(ImGuiCol_Text, 0xffff0000);
ImGui::Text("Right %d", right);
if (ImGui::Button("Incr Right"))
++right;
with_Child("##scrolling", ImVec2(200, 80)) {
ImGui::Text("More text ...");
ImGui::Text("More text ...");
ImGui::Text("More text ...");
with_StyleColor(ImGuiCol_Text, ImVec4{ 0, 0.5f, 0, 1.0f })
ImGui::Text("More text ...");
ImGui::Text("More text ...");
with_StyleColor(ImGuiCol_Text, ImVec4{ 0.5f, 0.0f, 0, 1.0f }) {
ImGui::Text("More text ...");
ImGui::Text("More text ...");
}
}
}
ImGui::Text("Bye...");
}
// ...
with_*
do start its own scope and automatically call End/Pop as required. (Yes the case where End/Pop call is unconditionall is respected).
with_Window(...) {
// ....
}
// If the scope contains a single statement, brackets are optional as usual.
with_StyleColor(ImGuiCol_Text, ImVec4{ 0, 0.5f, 0, 1.0f })
ImGui::Text("More text ...");
set_*
do not start its own scope but its state is managed by the surrounding scope.
{
set_StyleColor(...);
// ...
}
Sugar function |Begin Call |End Call |
| —- | —- | —- |
|with_Window(…) { … } |ImGui::Begin, |ImGui::End |
|with_Child(…) { … } |ImGui::BeginChild, |ImGui::EndChild |
|with_ChildFrame(…) { … } |ImGui::BeginChildFrame, |ImGui::EndChildFrame |
|with_Combo(…) { … } |ImGui::BeginCombo, |ImGui::EndCombo |
|with_ListBox(…) { … } |ImGui::BeginListBox, |ImGui::EndListBox |
|with_MenuBar(…) { … } |ImGui::BeginMenuBar, |ImGui::EndMenuBar |
|with_MainMenuBar(…) { … } |ImGui::BeginMainMenuBar, |ImGui::EndMainMenuBar |
|with_Menu(…) { … } |ImGui::BeginMenu, |ImGui::EndMenu |
|with_Popup(…) { … } |ImGui::BeginPopup, |ImGui::EndPopup |
|with_PopupModal(…) { … } |ImGui::BeginPopupModal, |ImGui::EndPopup |
|with_PopupContextItem(…) { … } |ImGui::BeginPopupContextItem, |ImGui::EndPopup |
|with_PopupContextWindow(…) { … } |ImGui::BeginPopupContextWindow, |ImGui::EndPopup |
|with_PopupContextVoid(…) { … } |ImGui::BeginPopupContextVoid, |ImGui::EndPopup |
|with_Table(…) { … } |ImGui::BeginTable, |ImGui::EndTable |
|with_TabBar(…) { … } |ImGui::BeginTabBar, |ImGui::EndTabBar |
|with_TabItem(…) { … } |ImGui::BeginTabItem, |ImGui::EndTabItem |
|with_DragDropSource(…) { … } |ImGui::BeginDragDropSource, |ImGui::EndDragDropSource |
|with_DragDropTarget(…) { … } |ImGui::BeginDragDropTarget, |ImGui::EndDragDropTarget |
|with_Group { … } |ImGui::BeginGroup, |ImGui::EndGroup |
|with_Tooltip { … } |ImGui::BeginTooltip, |ImGui::EndTooltip |
|with_Font(…) { … } |ImGui::PushFont, |ImGui::PopFont |
|with_AllowKeyboardFocus(…) { … } |ImGui::PushAllowKeyboardFocus, |ImGui::PopAllowKeyboardFocus |
|with_ButtonRepeat(…) { … } |ImGui::PushButtonRepeat, |ImGui::PopButtonRepeat |
|with_ItemWidth(…) { … } |ImGui::PushItemWidth, |ImGui::PopItemWidth |
|with_TextWrapPos(…) { … } |ImGui::PushTextWrapPos, |ImGui::PopTextWrapPos |
|with_ID(…) { … } |ImGui::PushID, |ImGui::PopID |
|with_ClipRect(…) { … } |ImGui::PushClipRect, |ImGui::PopClipRect |
|with_TextureID(…) { … } |ImGui::PushTextureID, |ImGui::PopTextureID |
|with_StyleColor(…) { … } |ImGui::PushStyleColor, |ImGui::PopStyleColor |
|with_StyleVar(…) { … } |ImGui::PushStyleVar, |ImGui::PopStyleVar |
|with_TreeNode(…) { … } |ImGui::TreeNode |ImGui::TreePop |
|with_TreeNodeV(…) { … } |ImGui::TreeNodeV |ImGui::TreePop |
|with_TreeNodeEx(…) { … } |ImGui::TreeNodeEx |ImGui::TreePop |
|with_TreeNodeExV(…) { … } |ImGui::TreeNodeExV |ImGui::TreePop |
|with_CollapsingHeader(…) { … } |ImGui::CollapsingHeader | |
|with_Indent(…) { … } |ImGui::Indent |ImGui::Unindent|
Sugar function |Begin Call |End Call |
| —- | —- | —- |
|set_StyleColor(…) |ImGui::PushStyleColor, |ImGui::PopStyleColor |
|set_StyleVar(…) |ImGui::PushStyleVar, |ImGui::PopStyleVar |
Discussions and PRs are welcome :)