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) {
252 if (p_open && !*p_open) {
264 ImGuiWindowFlags flags = ImGuiWindowFlags_None;
268 flags |= ImGuiWindowFlags_NoTitleBar;
269 flags |= ImGuiWindowFlags_NoCollapse;
274 flags |= ImGuiWindowFlags_NoDocking;
279 float display_width = ImGui::GetIO().DisplaySize.x;
280 float display_height = ImGui::GetIO().DisplaySize.y;
284 ImGui::SetNextWindowPos(ImVec2(display_width -
default_size_.x - 10, 30),
285 ImGuiCond_FirstUseEver);
288 ImGui::SetNextWindowPos(ImVec2(10, 30), ImGuiCond_FirstUseEver);
291 ImGui::SetNextWindowPos(
293 ImGuiCond_FirstUseEver);
297 ImGui::SetNextWindowPos(
299 display_height * 0.3f),
300 ImGuiCond_FirstUseEver);
304 ImGui::SetNextWindowSize(
default_size_, ImGuiCond_FirstUseEver);
312 ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 8.0f);
313 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(10, 10));
314 ImGui::PushStyleColor(ImGuiCol_TitleBg,
GetThemeColor(ImGuiCol_TitleBg));
318 bool* actual_p_open = p_open ? p_open :
p_open_;
321 bool visible = ImGui::Begin(window_title.c_str(),
329 if (ImGui::GetCurrentWindow() && ImGui::GetCurrentWindow()->ID != 0) {
330 std::string card_path = absl::StrFormat(
"EditorCard:%s",
title_.c_str());
332 card_path,
"window", ImGui::GetCurrentWindow()->ID,
333 absl::StrFormat(
"Editor card: %s",
title_.c_str()));
343 focused_ = ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows);
346 ImGui::PopStyleColor(2);
347 ImGui::PopStyleVar(2);
361 ImGui::SetNextWindowSize(ImVec2(50, 50));
363 ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar |
364 ImGuiWindowFlags_NoResize |
365 ImGuiWindowFlags_NoScrollbar |
366 ImGuiWindowFlags_NoCollapse;
368 std::string icon_window_name =
window_name_ +
"##IconCollapsed";
370 if (ImGui::Begin(icon_window_name.c_str(),
nullptr, flags)) {
372 if (ImGui::Button(
icon_.c_str(), ImVec2(40, 40))) {
376 if (ImGui::IsItemHovered()) {
377 ImGui::SetTooltip(
"Expand %s",
title_.c_str());
381 if (ImGui::IsWindowHovered() && ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
382 ImVec2 mouse_delta = ImGui::GetIO().MouseDelta;
406 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)
bool InputHexByte(const char *label, uint8_t *data, float input_width, bool no_step)
Color GetThemeColor(const std::string &color_name)
void StatusBadge(const char *text, ButtonType type)
Main namespace for the application.