From 48d5d54b77144cc8c3866c3ed0deb768c5126421 Mon Sep 17 00:00:00 2001 From: loki5512344 Date: Sat, 3 Oct 2026 15:28:03 +0200 Subject: [PATCH] Fractional GUI scale (0.5 step), fit menu to window, fix settings pages - display.gui-scale is now a number: 0 (auto) or 0.5..4 in 0.5 steps - explicit scale is no longer limited by window size (tiled windows); only an open menu page is shrunk to fit the window - snap Batch2D vertices to pixels on fractional scale (fixes dots above text) - pass app to settings_common via options (not visible inside modules) - gui.get_scale() returns a number --- doc/en/scripting/builtins/libgui.md | 8 ++-- doc/ru/scripting/builtins/libgui.md | 8 ++-- res/layouts/pages/settings_audio.xml.lua | 2 +- res/layouts/pages/settings_display.xml.lua | 18 ++++----- res/layouts/pages/settings_graphics.xml.lua | 2 +- res/modules/settings_common.lua | 3 ++ res/texts/ru_RU.txt | 2 +- src/graphics/core/Batch2D.cpp | 11 ++++++ src/graphics/core/Batch2D.hpp | 7 ++++ src/graphics/ui/GUI.cpp | 41 +++++++++++++++------ src/graphics/ui/GUI.hpp | 9 ++--- src/logic/scripting/lua/libs/libgui.cpp | 2 +- src/settings.hpp | 4 +- 13 files changed, 76 insertions(+), 41 deletions(-) diff --git a/doc/en/scripting/builtins/libgui.md b/doc/en/scripting/builtins/libgui.md index e3a97675d..e6febc9db 100644 --- a/doc/en/scripting/builtins/libgui.md +++ b/doc/en/scripting/builtins/libgui.md @@ -16,11 +16,11 @@ gui.str(text: str, context: str) -> str -- Returns size of the main container (window). gui.get_viewport() -> {int, int} --- Returns current GUI scale: window pixels per one UI unit (1..4). --- Set by the display.gui-scale setting and limited by window size. -gui.get_scale() -> int +-- Returns current GUI scale: window pixels per one UI unit (0.5..4). +-- Set by the display.gui-scale setting (auto mode fits the window size). +gui.get_scale() -> number --- Returns maximal GUI scale that fits the current window size. +-- Returns GUI scale used in auto mode (fits the current window size). gui.get_max_scale() -> int -- Returns cursor position in UI units (unlike input.get_mouse_pos, diff --git a/doc/ru/scripting/builtins/libgui.md b/doc/ru/scripting/builtins/libgui.md index b536267fb..0085501c2 100644 --- a/doc/ru/scripting/builtins/libgui.md +++ b/doc/ru/scripting/builtins/libgui.md @@ -31,11 +31,11 @@ gui.str(text: string, context: string) -> string -- Возвращает размер главного контейнера (окна). gui.get_viewport() -> {number, number} --- Возвращает текущий масштаб интерфейса: пикселей окна в одной единице UI (1..4). --- Задаётся настройкой display.gui-scale и ограничивается размером окна. -gui.get_scale() -> int +-- Возвращает текущий масштаб интерфейса: пикселей окна в одной единице UI (0.5..4). +-- Задаётся настройкой display.gui-scale (в режиме Авто подбирается под размер окна). +gui.get_scale() -> number --- Возвращает максимальный масштаб интерфейса, помещающийся в текущее окно. +-- Возвращает масштаб интерфейса, который выбирается в режиме Авто (помещается в текущее окно). gui.get_max_scale() -> int -- Возвращает позицию курсора в единицах UI (в отличие от input.get_mouse_pos, diff --git a/res/layouts/pages/settings_audio.xml.lua b/res/layouts/pages/settings_audio.xml.lua index b2f099eb6..d27c3c4e1 100644 --- a/res/layouts/pages/settings_audio.xml.lua +++ b/res/layouts/pages/settings_audio.xml.lua @@ -1,4 +1,4 @@ -local settings = require "core:settings_common".new(document, {}) +local settings = require "core:settings_common".new(document, {app=app}) -- templates call these functions by name, so they must be global create_trackbar_setting = settings.create_trackbar_setting update_trackbar_label = settings.update_trackbar_label diff --git a/res/layouts/pages/settings_display.xml.lua b/res/layouts/pages/settings_display.xml.lua index 62202e3fa..e7f58f8ef 100644 --- a/res/layouts/pages/settings_display.xml.lua +++ b/res/layouts/pages/settings_display.xml.lua @@ -10,20 +10,18 @@ tostring_overrides["display.framerate"] = function(x) end tostring_overrides["display.gui-scale"] = function(x) - -- scale is limited by the window size, show what is really applied - local effective = gui.get_max_scale() - if x > 0 then - effective = math.min(x, effective) - end if x == 0 then - return string.format("%s (%d)", gui.str("Auto"), effective) - elseif effective < x then - return string.format("%d (%s %d)", x, gui.str("Effective"), effective) + return string.format("%s (%d)", gui.str("Auto"), gui.get_max_scale()) + end + local effective = gui.get_scale() + if effective ~= x then + -- menu is limited by window size + return string.format("%s (%s %s)", tostring(x), gui.str("Effective"), tostring(effective)) end return tostring(x) end -local settings = require "core:settings_common".new(document, {tostring_overrides=tostring_overrides}) +local settings = require "core:settings_common".new(document, {app=app, tostring_overrides=tostring_overrides}) -- templates call these functions by name, so they must be global create_trackbar_setting = settings.create_trackbar_setting update_trackbar_label = settings.update_trackbar_label @@ -32,7 +30,7 @@ create_checkbox = settings.create_checkbox function on_open() create_trackbar_setting("camera.fov", "FOV", 1, "°") create_trackbar_setting("display.framerate", "Framerate", 1, "", "", true) - create_trackbar_setting("display.gui-scale", "GUI Scale", 1, "", "display.gui-scale.tooltip", true) + create_trackbar_setting("display.gui-scale", "GUI Scale", 0.5, "", "display.gui-scale.tooltip", true) document.root:add(string.format( "