Files
XCEngine/editor/src/UI/PanelChrome.h

121 lines
3.1 KiB
C++

#pragma once
#include "Core.h"
#include "StyleTokens.h"
#include <imgui.h>
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;
};
}
}
}