Added automatically scaling GUI

This commit is contained in:
Yousef Khadadeh 2025-09-27 17:59:56 +03:00
parent 4327a73c62
commit cbd9e802c8
3 changed files with 24 additions and 4 deletions

View file

@ -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);

View file

@ -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<uint16_t>("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<float>() / (guiScale * main.window.scale);
gui.windowSize = main.window.size.cast<float>() / 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;
}

View file

@ -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,