#pragma once #include "Core.h" #include "StyleTokens.h" #include namespace XCEngine { namespace Editor { namespace UI { class PanelWindowScope { public: explicit PanelWindowScope(const char* name, ImGuiWindowFlags flags = ImGuiWindowFlags_None) { ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, PanelWindowPadding()); m_open = ImGui::Begin(name, nullptr, flags); ImGui::PopStyleVar(); m_began = true; } ~PanelWindowScope() { if (m_began) { ImGui::End(); } } PanelWindowScope(const PanelWindowScope&) = delete; PanelWindowScope& operator=(const PanelWindowScope&) = delete; bool IsOpen() const { return m_open; } private: bool m_began = false; bool m_open = false; }; class PanelToolbarScope { public: explicit PanelToolbarScope( const char* id, float height, ImGuiWindowFlags flags = ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse, bool drawBottomBorder = true, ImVec2 padding = ToolbarPadding(), ImVec2 itemSpacing = ToolbarItemSpacing()) : m_drawBottomBorder(drawBottomBorder) { ImGui::PushStyleColor(ImGuiCol_ChildBg, ToolbarBackgroundColor()); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, padding); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, itemSpacing); m_open = ImGui::BeginChild(id, ImVec2(0.0f, height), false, flags); m_began = true; } ~PanelToolbarScope() { if (m_began) { if (m_drawBottomBorder) { DrawCurrentWindowBottomBorder(); } ImGui::EndChild(); ImGui::PopStyleVar(2); ImGui::PopStyleColor(); } } PanelToolbarScope(const PanelToolbarScope&) = delete; PanelToolbarScope& operator=(const PanelToolbarScope&) = delete; bool IsOpen() const { return m_open; } private: bool m_began = false; bool m_open = false; bool m_drawBottomBorder = true; }; class PanelContentScope { public: explicit PanelContentScope( const char* id, ImVec2 padding = DefaultPanelContentPadding(), ImGuiWindowFlags flags = ImGuiWindowFlags_None, bool pushItemSpacing = false, ImVec2 itemSpacing = ImVec2(0.0f, 0.0f)) { ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, padding); m_styleVarCount = 1; if (pushItemSpacing) { ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, itemSpacing); ++m_styleVarCount; } m_open = ImGui::BeginChild(id, ImVec2(0.0f, 0.0f), false, flags); m_began = true; } ~PanelContentScope() { if (m_began) { ImGui::EndChild(); ImGui::PopStyleVar(m_styleVarCount); } } PanelContentScope(const PanelContentScope&) = delete; PanelContentScope& operator=(const PanelContentScope&) = delete; bool IsOpen() const { return m_open; } private: bool m_began = false; bool m_open = false; int m_styleVarCount = 0; }; } } }