From cbd9e802c88f455959e34f8dd384280ac72a0319 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sat, 27 Sep 2025 17:59:56 +0300 Subject: [PATCH] Added automatically scaling GUI --- src/DrawingProgram/DrawingProgram.cpp | 1 - src/Toolbar.cpp | 23 ++++++++++++++++++++--- src/Toolbar.hpp | 4 ++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index c2f4330..b4b2b97 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -199,7 +199,6 @@ void DrawingProgram::toolbar_gui() { if(t.gui.svg_icon_button("LassoSelect Toolbar Button", "data/icons/lassoselect.svg", drawTool->get_type() == DrawingProgramToolType::LASSOSELECT)) { switch_to_tool(DrawingProgramToolType::LASSOSELECT); } if(t.gui.svg_icon_button("Edit Toolbar Button", "data/icons/cursor.svg", drawTool->get_type() == DrawingProgramToolType::EDIT)) { switch_to_tool(DrawingProgramToolType::EDIT); } if(t.gui.svg_icon_button("Eyedropper Toolbar Button", "data/icons/eyedropper.svg", drawTool->get_type() == DrawingProgramToolType::EYEDROPPER)) { switch_to_tool(DrawingProgramToolType::EYEDROPPER); } - if(t.gui.svg_icon_button("Screenshot Toolbar Button", "data/icons/camera.svg", drawTool->get_type() == DrawingProgramToolType::SCREENSHOT)) { switch_to_tool(DrawingProgramToolType::SCREENSHOT); } CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { if(t.gui.color_button("Foreground Color", &controls.foregroundColor, &controls.foregroundColor == t.colorLeft)) { t.color_selector_left(&controls.foregroundColor == t.colorLeft ? nullptr : &controls.foregroundColor); diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index 56e22f1..9d17be9 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -1,4 +1,6 @@ #include "Toolbar.hpp" +#include "DrawingProgram/DrawingProgramToolBase.hpp" +#include "DrawingProgram/ScreenshotTool.hpp" #include "Helpers/ConvertVec.hpp" #include "Helpers/Networking/NetLibrary.hpp" #include "MainProgram.hpp" @@ -295,7 +297,7 @@ void Toolbar::update() { if(main.drawGui) { CLAY({ .layout = { - .sizing = {.width = CLAY_SIZING_FIXED(gui.windowSize.x()), .height = CLAY_SIZING_FIXED(gui.windowSize.y())}, + .sizing = {.width = CLAY_SIZING_FIT(gui.windowSize.x()), .height = CLAY_SIZING_FIT(gui.windowSize.y())}, .padding = CLAY_PADDING_ALL(io->theme->padding1), .childGap = io->theme->childGap1, .childAlignment = { .x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_TOP}, @@ -327,11 +329,14 @@ void Toolbar::update() { paintPopupLocation = std::nullopt; end_gui(); + justAssignedColorLeft = false; justAssignedColorRight = false; if(!optionsMenuOpen || generalSettingsOptions != GSETTINGS_KEYBINDS) keybindWaiting = std::nullopt; + + calculate_final_gui_scale(); } void Toolbar::save_func() { @@ -453,6 +458,8 @@ void Toolbar::top_toolbar() { save_as_func(); if(gui.text_button_wide("open file", "Open")) open_world_file(World::CONNECTIONTYPE_LOCAL, "", ""); + if(gui.text_button_wide("screenshot", "Take Screenshot")) + main.world->drawProg.switch_to_tool(DrawingProgramToolType::SCREENSHOT); if(gui.text_button_wide("add image or file to canvas", "Add Image/File to Canvas")) { #ifdef __EMSCRIPTEN__ emscripten_browser_file::upload("*", [](std::string const& fileName, std::string const& mimeType, std::string_view buffer, void* callbackData) { @@ -1285,7 +1292,7 @@ void Toolbar::options_menu() { } case GSETTINGS_APPEARANCE: { gui.push_id("appearance settings"); - gui.input_scalar_field("GUI Scale", "GUI Scale", &guiScale, 0.5f, 3.0f, 1); + gui.input_scalar_field("Max GUI Scale", "Max GUI Scale", &guiScale, 0.5f, 3.0f, 1); gui.input_scalar_field("GUI Font Size", "GUI Font Size", &io->fontSize, 10, 30); gui.text_label("Note: Changing font size may break UI in some cases."); gui.pop_id(); @@ -1803,7 +1810,7 @@ void Toolbar::start_gui() { io->clipboard.textOut = std::nullopt; gui.windowPos = Vector2f{0.0f, 0.0f}; - gui.windowSize = main.window.size.cast() / (guiScale * main.window.scale); + gui.windowSize = main.window.size.cast() / final_gui_scale(); io->hoverObstructed = false; io->acceptingTextInput = false; gui.io = io; @@ -1812,6 +1819,16 @@ void Toolbar::start_gui() { } float Toolbar::final_gui_scale() { + return finalCalculatedGuiScale; +} + +void Toolbar::calculate_final_gui_scale() { + Vector2f maxWindowSizeBeforeForcedFit = final_gui_scale_not_fit() * Vector2f{800.0f, 800.0f}; + Vector2f fitRatio = {main.window.size.x() / maxWindowSizeBeforeForcedFit.x(), main.window.size.y() / maxWindowSizeBeforeForcedFit.y()}; + finalCalculatedGuiScale = final_gui_scale_not_fit() * std::min(std::min(fitRatio.x(), fitRatio.y()), 1.0f); +} + +float Toolbar::final_gui_scale_not_fit() { return guiScale * main.window.scale; } diff --git a/src/Toolbar.hpp b/src/Toolbar.hpp index be4833c..3c0add3 100644 --- a/src/Toolbar.hpp +++ b/src/Toolbar.hpp @@ -80,6 +80,9 @@ class Toolbar { float final_gui_scale(); private: + void calculate_final_gui_scale(); + float final_gui_scale_not_fit(); + static void sdl_open_file_dialog_callback(void* userData, const char * const * fileList, int filter); void reload_theme_list(); @@ -139,6 +142,7 @@ class Toolbar { bool playerMenuOpen = false; float guiScale = 1.0f; + float finalCalculatedGuiScale = 1.0f; enum { CHATBOXSTATE_OPEN,