1#define IMGUI_DEFINE_MATH_OPERATORS
5#include "absl/strings/str_format.h"
11#include "imgui/imgui.h"
12#include "imgui/imgui_internal.h"
23 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4, 2));
24 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(3, 3));
25 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(6, 4));
38 ImGui::PopStyleVar(3);
47 ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.15f, 0.15f, 0.17f, 0.5f));
50 const float button_size = 28.0f;
51 const float padding = 4.0f;
52 const int num_buttons = 2;
53 const float item_spacing = ImGui::GetStyle().ItemSpacing.x;
55 float total_width = (num_buttons * button_size) +
56 ((num_buttons - 1) * item_spacing) +
59 ImGui::BeginChild(
"##ModeGroup", ImVec2(total_width, button_size + padding),
60 ImGuiChildFlags_AlwaysUseWindowPadding,
61 ImGuiWindowFlags_NoScrollbar);
74 bool clicked = ImGui::Button(icon, ImVec2(size, size));
77 ImGui::PopStyleColor();
80 if (tooltip && ImGui::IsItemHovered()) {
81 ImGui::SetTooltip(
"%s", tooltip);
92 ImGui::PopStyleColor();
99 ImGui::SeparatorEx(ImGuiSeparatorFlags_Vertical);
105 absl::StrFormat(
"v%d", version).c_str(),
108 if (on_upgrade && (version == 0xFF || version < 3)) {
109 ImGui::SameLine(0, 2);
113 if (ImGui::IsItemHovered()) {
114 ImGui::SetTooltip(
"Upgrade to ZSCustomOverworld v3");
123 std::function<
void()> on_change) {
124 ImGui::Text(
"%s", icon);
126 ImGui::SetNextItemWidth(55);
129 if (changed && on_change) {
139 std::function<
void()> on_change) {
140 ImGui::Text(
"%s", icon);
142 ImGui::SetNextItemWidth(70);
145 if (changed && on_change) {
154 const char*
const items[],
int count) {
155 ImGui::Text(
"%s", icon);
156 ImGui::SameLine(0, 2);
157 ImGui::SetNextItemWidth(100);
159 bool changed = ImGui::Combo(
"##combo", current, items, count);
172 bool clicked = ImGui::SmallButton(icon);
175 if (ImGui::GetItemID() != 0 && tooltip) {
176 std::string button_path = absl::StrFormat(
"ToolbarAction:%s", tooltip);
178 button_path,
"button", ImGui::GetItemID(), tooltip);
181 if (tooltip && ImGui::IsItemHovered()) {
182 ImGui::SetTooltip(
"%s", tooltip);
191 bool is_open = ImGui::CollapsingHeader(label, ImGuiTreeNodeFlags_None);
192 if (p_open) *p_open = is_open;
202 if (version >= 3 && version != 0xFF) {
205 if (ImGui::SmallButton(
ICON_MD_TUNE " Settings") && on_settings) {
212 ImGui::OpenPopup(
"UpgradeROMVersion");
220 if (tooltip && ImGui::IsItemHovered()) {
221 ImGui::SetTooltip(
"%s", tooltip);
232 : title_(title), icon_(icon ? icon :
""), default_size_(400, 300) {
237 : title_(title), icon_(icon ? icon :
""), default_size_(400, 300) {
257 ImGuiWindowFlags flags = ImGuiWindowFlags_None;
261 flags |= ImGuiWindowFlags_NoTitleBar;
262 flags |= ImGuiWindowFlags_NoCollapse;
267 flags |= ImGuiWindowFlags_NoDocking;
272 float display_width = ImGui::GetIO().DisplaySize.x;
273 float display_height = ImGui::GetIO().DisplaySize.y;
277 ImGui::SetNextWindowPos(ImVec2(display_width -
default_size_.x - 10, 30),
278 ImGuiCond_FirstUseEver);
281 ImGui::SetNextWindowPos(ImVec2(10, 30), ImGuiCond_FirstUseEver);
284 ImGui::SetNextWindowPos(
286 ImGuiCond_FirstUseEver);
290 ImGui::SetNextWindowPos(
292 display_height * 0.3f),
293 ImGuiCond_FirstUseEver);
297 ImGui::SetNextWindowSize(
default_size_, ImGuiCond_FirstUseEver);
305 ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 8.0f);
306 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(10, 10));
307 ImGui::PushStyleColor(ImGuiCol_TitleBg,
GetThemeColor(ImGuiCol_TitleBg));
311 bool* actual_p_open = p_open ? p_open :
p_open_;
314 bool visible = ImGui::Begin(window_title.c_str(),
319 if (ImGui::GetCurrentWindow() && ImGui::GetCurrentWindow()->ID != 0) {
320 std::string card_path = absl::StrFormat(
"EditorCard:%s",
title_.c_str());
322 card_path,
"window", ImGui::GetCurrentWindow()->ID,
323 absl::StrFormat(
"Editor card: %s",
title_.c_str()));
331 focused_ = ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows);
334 ImGui::PopStyleColor(2);
335 ImGui::PopStyleVar(2);
347 ImGui::SetNextWindowSize(ImVec2(50, 50));
349 ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar |
350 ImGuiWindowFlags_NoResize |
351 ImGuiWindowFlags_NoScrollbar |
352 ImGuiWindowFlags_NoCollapse;
354 std::string icon_window_name =
window_name_ +
"##IconCollapsed";
356 if (ImGui::Begin(icon_window_name.c_str(),
nullptr, flags)) {
358 if (ImGui::Button(
icon_.c_str(), ImVec2(40, 40))) {
362 if (ImGui::IsItemHovered()) {
363 ImGui::SetTooltip(
"Expand %s",
title_.c_str());
367 if (ImGui::IsWindowHovered() && ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
368 ImVec2 mouse_delta = ImGui::GetIO().MouseDelta;
392 ImGui::BeginChild(
"##MainCanvas", ImVec2(0, 0),
false);
Draggable, dockable card for editor sub-windows.
bool Begin(bool *p_open=nullptr)
void SetDefaultSize(float width, float height)
void SetPosition(Position pos)
EditorCard(const char *title, const char *icon=nullptr)
void DrawFloatingIconButton()
std::vector< EditorCard * > cards_
void RegisterCard(EditorCard *card)
#define ICON_MD_ANALYTICS
bool ToggleIconButton(const char *icon_on, const char *icon_off, bool *state, const char *tooltip)
bool InputHexWord(const char *label, uint16_t *data, float input_width, bool no_step)
void RomVersionBadge(const char *version, bool is_vanilla)
ImVec4 GetThemeColor(ImGuiCol idx)
bool InputHexByte(const char *label, uint8_t *data, float input_width, bool no_step)
void StatusBadge(const char *text, ButtonType type)
Main namespace for the application.