From 5522b5cb03d11e3c64a7570de504670394bd5db7 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 20 Apr 2024 17:02:39 +0200 Subject: [PATCH 1/5] Add Enlarged UI setting --- data/language/en-GB.txt | 2 ++ src/openrct2-ui/UiStringIds.h | 2 ++ src/openrct2-ui/windows/Options.cpp | 17 +++++++++++++---- src/openrct2/config/Config.cpp | 7 +++++++ src/openrct2/config/Config.h | 1 + 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index ca73b15414d1..1e2ae56bd04d 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3709,6 +3709,8 @@ STR_6634 :Checking track design files… STR_6635 :Checking asset packs… STR_6636 :Checking title sequences… STR_6637 :Loading title sequence… +STR_6638 :Enlarged UI +STR_6639 :Modifies the interface to be more suitable for touch usage ############# # Scenarios # diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index a581588ce95b..0b0bc1350d87 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -1062,6 +1062,8 @@ namespace OpenRCT2 STR_ENABLE_LIGHTING_EFFECTS_TIP = 6002, STR_ENABLE_LIGHTING_VEHICLES = 6361, STR_ENABLE_LIGHTING_VEHICLES_TIP = 6362, + STR_ENLARGED_UI = 6638, + STR_ENLARGED_UI_TIP = 6639, STR_FAHRENHEIT = 2367, STR_FINANCES_BUTTON_ON_TOOLBAR = 5120, STR_FINANCES_BUTTON_ON_TOOLBAR_TIP = 5838, diff --git a/src/openrct2-ui/windows/Options.cpp b/src/openrct2-ui/windows/Options.cpp index bdbf9aca3dbb..715ca99461b1 100644 --- a/src/openrct2-ui/windows/Options.cpp +++ b/src/openrct2-ui/windows/Options.cpp @@ -162,6 +162,7 @@ enum WindowOptionsWidgetIdx { WIDX_INVERT_DRAG, WIDX_ZOOM_TO_CURSOR, WIDX_WINDOW_BUTTONS_ON_THE_LEFT, + WIDX_ENLARGED_UI, WIDX_HOTKEY_DROPDOWN, WIDX_THEMES_GROUP, WIDX_THEMES_LABEL, @@ -320,18 +321,19 @@ static Widget window_options_audio_widgets[] = { }; constexpr int32_t kControlsGroupStart = 53; -constexpr int32_t kThemesGroupStart = 163; -constexpr int32_t kToolbarGroupStart = 215; +constexpr int32_t kThemesGroupStart = 178; +constexpr int32_t kToolbarGroupStart = 230; static Widget window_options_controls_and_interface_widgets[] = { MAIN_OPTIONS_WIDGETS, - MakeWidget({ 5, kControlsGroupStart + 0}, {300,107}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CONTROLS_GROUP ), // Controls group + MakeWidget({ 5, kControlsGroupStart + 0}, {300,122}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_CONTROLS_GROUP ), // Controls group MakeWidget({ 10, kControlsGroupStart + 13}, {290, 14}, WindowWidgetType::Checkbox, WindowColour::Tertiary , STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP ), // Edge scrolling MakeWidget({ 10, kControlsGroupStart + 30}, {290, 12}, WindowWidgetType::Checkbox, WindowColour::Tertiary , STR_TRAP_MOUSE, STR_TRAP_MOUSE_TIP ), // Trap mouse MakeWidget({ 10, kControlsGroupStart + 45}, {290, 12}, WindowWidgetType::Checkbox, WindowColour::Tertiary , STR_INVERT_RIGHT_MOUSE_DRAG, STR_INVERT_RIGHT_MOUSE_DRAG_TIP ), // Invert right mouse dragging MakeWidget({ 10, kControlsGroupStart + 60}, {290, 12}, WindowWidgetType::Checkbox, WindowColour::Tertiary , STR_ZOOM_TO_CURSOR, STR_ZOOM_TO_CURSOR_TIP ), // Zoom to cursor MakeWidget({ 10, kControlsGroupStart + 75}, {290, 12}, WindowWidgetType::Checkbox, WindowColour::Tertiary, STR_WINDOW_BUTTONS_ON_THE_LEFT, STR_WINDOW_BUTTONS_ON_THE_LEFT_TIP), // Window buttons on the left - MakeWidget({155, kControlsGroupStart + 90}, {145, 13}, WindowWidgetType::Button, WindowColour::Secondary, STR_HOTKEY, STR_HOTKEY_TIP ), // Set hotkeys buttons + MakeWidget({ 10, kControlsGroupStart + 90}, {290, 12}, WindowWidgetType::Checkbox, WindowColour::Tertiary, STR_ENLARGED_UI, STR_ENLARGED_UI ), + MakeWidget({155, kControlsGroupStart + 105}, {145, 13}, WindowWidgetType::Button, WindowColour::Secondary, STR_HOTKEY, STR_HOTKEY_TIP ), // Set hotkeys buttons MakeWidget({ 5, kThemesGroupStart + 0}, {300, 48}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_THEMES_GROUP ), // Themes group MakeWidget({ 10, kThemesGroupStart + 14}, {145, 12}, WindowWidgetType::Label, WindowColour::Secondary, STR_THEMES_LABEL_CURRENT_THEME, STR_CURRENT_THEME_TIP ), // Themes @@ -1592,6 +1594,12 @@ static Widget *window_options_page_widgets[] = { Invalidate(); WindowInvalidateAll(); break; + case WIDX_ENLARGED_UI: + Config::Get().interface.EnlargedUi ^= 1; + Config::Save(); + Invalidate(); + WindowInvalidateAll(); + break; case WIDX_INVERT_DRAG: Config::Get().general.InvertViewportDrag ^= 1; Config::Save(); @@ -1658,6 +1666,7 @@ static Widget *window_options_page_widgets[] = { SetCheckboxValue(WIDX_TOOLBAR_SHOW_CHAT, Config::Get().interface.ToolbarShowChat); SetCheckboxValue(WIDX_TOOLBAR_SHOW_ZOOM, Config::Get().interface.ToolbarShowZoom); SetCheckboxValue(WIDX_WINDOW_BUTTONS_ON_THE_LEFT, Config::Get().interface.WindowButtonsOnTheLeft); + SetCheckboxValue(WIDX_ENLARGED_UI, Config::Get().interface.EnlargedUi); size_t activeAvailableThemeIndex = ThemeManagerGetAvailableThemeIndex(); const utf8* activeThemeName = ThemeManagerGetAvailableThemeName(activeAvailableThemeIndex); diff --git a/src/openrct2/config/Config.cpp b/src/openrct2/config/Config.cpp index 06a775aa27c8..e6b741bdc0d0 100644 --- a/src/openrct2/config/Config.cpp +++ b/src/openrct2/config/Config.cpp @@ -43,6 +43,11 @@ static constexpr bool WindowButtonsOnTheLeftDefault = true; #else static constexpr bool WindowButtonsOnTheLeftDefault = false; #endif +#ifdef __ANDROID__ +static constexpr bool kEnlargedUiDefault = true; +#else +static constexpr bool kEnlargedUiDefault = false; +#endif namespace OpenRCT2::Config { @@ -351,6 +356,7 @@ namespace OpenRCT2::Config model->ScenarioselectLastTab = reader->GetInt32("scenarioselect_last_tab", 0); model->ListRideVehiclesSeparately = reader->GetBoolean("list_ride_vehicles_separately", false); model->WindowButtonsOnTheLeft = reader->GetBoolean("window_buttons_on_the_left", WindowButtonsOnTheLeftDefault); + model->EnlargedUi = reader->GetBoolean("enlarged_ui", kEnlargedUiDefault); } } @@ -374,6 +380,7 @@ namespace OpenRCT2::Config writer->WriteInt32("scenarioselect_last_tab", model->ScenarioselectLastTab); writer->WriteBoolean("list_ride_vehicles_separately", model->ListRideVehiclesSeparately); writer->WriteBoolean("window_buttons_on_the_left", model->WindowButtonsOnTheLeft); + writer->WriteBoolean("enlarged_ui", model->EnlargedUi); } static void ReadSound(IIniReader* reader) diff --git a/src/openrct2/config/Config.h b/src/openrct2/config/Config.h index de86f0a7e0c3..41fa7a2f708f 100644 --- a/src/openrct2/config/Config.h +++ b/src/openrct2/config/Config.h @@ -135,6 +135,7 @@ namespace OpenRCT2::Config int32_t ScenarioselectLastTab; bool ListRideVehiclesSeparately; bool WindowButtonsOnTheLeft; + bool EnlargedUi; }; struct Sound From c0d425357e6ffabbf66f1fddf46e1d31e2020972 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 20 Apr 2024 17:02:58 +0200 Subject: [PATCH 2/5] Use more space for dropdowns when using Enlarged UI --- src/openrct2-ui/windows/Dropdown.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/openrct2-ui/windows/Dropdown.cpp b/src/openrct2-ui/windows/Dropdown.cpp index 2c42f4743629..475c2c7e518f 100644 --- a/src/openrct2-ui/windows/Dropdown.cpp +++ b/src/openrct2-ui/windows/Dropdown.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -27,6 +28,7 @@ namespace OpenRCT2::Ui::Windows constexpr int32_t DROPDOWN_TEXT_MAX_ROWS = 32; constexpr int32_t DROPDOWN_ITEM_HEIGHT = 12; + constexpr int32_t DROPDOWN_ITEM_HEIGHT_TOUCH = 24; static constexpr std::array _appropriateImageDropdownItemsPerRow = { 1, 1, 1, 1, 2, 2, 3, 3, 4, 3, // 10 @@ -86,6 +88,16 @@ namespace OpenRCT2::Ui::Windows InputSetState(InputState::DropdownActive); } + static int32_t GetDefaultRowHeight() + { + return gConfigInterface.EnlargedUi ? DROPDOWN_ITEM_HEIGHT_TOUCH : DROPDOWN_ITEM_HEIGHT; + } + + static int32_t GetAdditionalRowPadding() + { + return gConfigInterface.EnlargedUi ? 6 : 0; + } + void OnDraw(DrawPixelInfo& dpi) override { DrawWidgets(dpi); @@ -154,8 +166,9 @@ namespace OpenRCT2::Ui::Windows colour = NOT_TRANSLUCENT(colours[0]) | COLOUR_FLAG_INSET; // Draw item string + auto yOffset = GetAdditionalRowPadding(); Formatter ft(reinterpret_cast(&gDropdownItems[i].Args)); - DrawTextEllipsised(dpi, screenCoords, width - 5, item, ft, { colour }); + DrawTextEllipsised(dpi, { screenCoords.x, screenCoords.y + yOffset }, width - 5, item, ft, { colour }); } } } @@ -167,7 +180,7 @@ namespace OpenRCT2::Ui::Windows { // Set and calculate num items, rows and columns ItemWidth = itemWidth; - ItemHeight = (txtFlags & Dropdown::Flag::CustomHeight) ? customHeight : DROPDOWN_ITEM_HEIGHT; + ItemHeight = (txtFlags & Dropdown::Flag::CustomHeight) ? customHeight : GetDefaultRowHeight(); gDropdownNumItems = static_cast(numItems); // There must always be at least one column to prevent dividing by zero if (gDropdownNumItems == 0) @@ -493,9 +506,10 @@ static constexpr colour_t kColoursDropdownOrder[] = { } // Show dropdown + auto squareSize = DropdownWindow::GetDefaultRowHeight(); WindowDropdownShowImage( w->windowPos.x + widget->left, w->windowPos.y + widget->top, widget->height() + 1, dropdownColour, - Dropdown::Flag::StayOpen, numColours, 12, 12, + Dropdown::Flag::StayOpen, numColours, squareSize, squareSize, DropdownGetAppropriateImageDropdownItemsPerRow(static_cast(numColours))); gDropdownIsColour = true; From 270c6320b91bcb64e95952722a2ac6fdd2f776d0 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 20 Apr 2024 17:10:58 +0200 Subject: [PATCH 3/5] Keep all dropdowns open when using Enlarged UI --- src/openrct2-ui/windows/Dropdown.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openrct2-ui/windows/Dropdown.cpp b/src/openrct2-ui/windows/Dropdown.cpp index 475c2c7e518f..c85fd2ad06e6 100644 --- a/src/openrct2-ui/windows/Dropdown.cpp +++ b/src/openrct2-ui/windows/Dropdown.cpp @@ -343,7 +343,7 @@ namespace OpenRCT2::Ui::Windows int32_t width) { InputSetFlag(static_cast(INPUT_FLAG_DROPDOWN_STAY_OPEN | INPUT_FLAG_DROPDOWN_MOUSE_UP), false); - if (flags & Dropdown::Flag::StayOpen) + if (flags & Dropdown::Flag::StayOpen || gConfigInterface.EnlargedUi) InputSetFlag(INPUT_FLAG_DROPDOWN_STAY_OPEN, true); WindowDropdownClose(); @@ -375,7 +375,7 @@ namespace OpenRCT2::Ui::Windows int32_t itemHeight, int32_t numColumns) { InputSetFlag(static_cast(INPUT_FLAG_DROPDOWN_STAY_OPEN | INPUT_FLAG_DROPDOWN_MOUSE_UP), false); - if (flags & Dropdown::Flag::StayOpen) + if (flags & Dropdown::Flag::StayOpen || gConfigInterface.EnlargedUi) InputSetFlag(INPUT_FLAG_DROPDOWN_STAY_OPEN, true); // Close existing dropdown From 99b99ef0c5dbd7382a6605b5e96ed2e7447202f3 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 18 May 2024 20:43:16 +0200 Subject: [PATCH 4/5] Automatically use multiple dropdown columns --- src/openrct2-ui/interface/Dropdown.h | 1 - src/openrct2-ui/windows/Dropdown.cpp | 38 +++++++++++++++------------- src/openrct2-ui/windows/Ride.cpp | 3 +-- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/openrct2-ui/interface/Dropdown.h b/src/openrct2-ui/interface/Dropdown.h index a4e61fce7662..003417cc4711 100644 --- a/src/openrct2-ui/interface/Dropdown.h +++ b/src/openrct2-ui/interface/Dropdown.h @@ -62,7 +62,6 @@ namespace OpenRCT2::Ui::Windows void WindowDropdownShowColourAvailable( WindowBase* w, Widget* widget, uint8_t dropdownColour, uint8_t selectedColour, uint32_t availableColours); uint32_t DropdownGetAppropriateImageDropdownItemsPerRow(uint32_t numItems); - bool WindowDropDownHasMultipleColumns(size_t numItems); colour_t ColourDropDownIndexToColour(uint8_t ddidx); } // namespace OpenRCT2::Ui::Windows diff --git a/src/openrct2-ui/windows/Dropdown.cpp b/src/openrct2-ui/windows/Dropdown.cpp index c85fd2ad06e6..d29b41749855 100644 --- a/src/openrct2-ui/windows/Dropdown.cpp +++ b/src/openrct2-ui/windows/Dropdown.cpp @@ -7,6 +7,7 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ +#include #include #include #include @@ -24,9 +25,6 @@ namespace OpenRCT2::Ui::Windows { - // The maximum number of rows to list before items overflow into new columns - constexpr int32_t DROPDOWN_TEXT_MAX_ROWS = 32; - constexpr int32_t DROPDOWN_ITEM_HEIGHT = 12; constexpr int32_t DROPDOWN_ITEM_HEIGHT_TOUCH = 24; @@ -90,12 +88,12 @@ namespace OpenRCT2::Ui::Windows static int32_t GetDefaultRowHeight() { - return gConfigInterface.EnlargedUi ? DROPDOWN_ITEM_HEIGHT_TOUCH : DROPDOWN_ITEM_HEIGHT; + return Config::Get().interface.EnlargedUi ? DROPDOWN_ITEM_HEIGHT_TOUCH : DROPDOWN_ITEM_HEIGHT; } static int32_t GetAdditionalRowPadding() { - return gConfigInterface.EnlargedUi ? 6 : 0; + return Config::Get().interface.EnlargedUi ? 6 : 0; } void OnDraw(DrawPixelInfo& dpi) override @@ -174,26 +172,37 @@ namespace OpenRCT2::Ui::Windows } } + static int32_t getSpaceUntilBottom(const ScreenCoordsXY& screenPos, int32_t dropdownButtonHeight) + { + auto* mainWindow = WindowGetMain(); + if (mainWindow == nullptr) + return 400; + + return std::max(1, mainWindow->height - (screenPos.y + dropdownButtonHeight + 5)); + } + void SetTextItems( const ScreenCoordsXY& screenPos, int32_t extraY, uint8_t colour, uint8_t customHeight, uint8_t txtFlags, size_t numItems, int32_t itemWidth) { // Set and calculate num items, rows and columns - ItemWidth = itemWidth; ItemHeight = (txtFlags & Dropdown::Flag::CustomHeight) ? customHeight : GetDefaultRowHeight(); gDropdownNumItems = static_cast(numItems); // There must always be at least one column to prevent dividing by zero - if (gDropdownNumItems == 0) + if (gDropdownNumItems <= 1) { - NumColumns = 1; NumRows = 1; + NumColumns = 1; } else { - NumColumns = (gDropdownNumItems + DROPDOWN_TEXT_MAX_ROWS - 1) / DROPDOWN_TEXT_MAX_ROWS; - NumRows = (gDropdownNumItems + NumColumns - 1) / NumColumns; + const int32_t numAvailableRows = std::max(1, getSpaceUntilBottom(screenPos, extraY) / ItemHeight); + NumRows = std::min(numAvailableRows, gDropdownNumItems); + NumColumns = (gDropdownNumItems + NumRows - 1) / NumRows; } + ItemWidth = itemWidth; + // Text dropdowns are listed horizontally ListVertically = true; @@ -343,7 +352,7 @@ namespace OpenRCT2::Ui::Windows int32_t width) { InputSetFlag(static_cast(INPUT_FLAG_DROPDOWN_STAY_OPEN | INPUT_FLAG_DROPDOWN_MOUSE_UP), false); - if (flags & Dropdown::Flag::StayOpen || gConfigInterface.EnlargedUi) + if (flags & Dropdown::Flag::StayOpen || Config::Get().interface.EnlargedUi) InputSetFlag(INPUT_FLAG_DROPDOWN_STAY_OPEN, true); WindowDropdownClose(); @@ -375,7 +384,7 @@ namespace OpenRCT2::Ui::Windows int32_t itemHeight, int32_t numColumns) { InputSetFlag(static_cast(INPUT_FLAG_DROPDOWN_STAY_OPEN | INPUT_FLAG_DROPDOWN_MOUSE_UP), false); - if (flags & Dropdown::Flag::StayOpen || gConfigInterface.EnlargedUi) + if (flags & Dropdown::Flag::StayOpen || Config::Get().interface.EnlargedUi) InputSetFlag(INPUT_FLAG_DROPDOWN_STAY_OPEN, true); // Close existing dropdown @@ -523,11 +532,6 @@ static constexpr colour_t kColoursDropdownOrder[] = { return _appropriateImageDropdownItemsPerRow[std::min( numItems, static_cast(std::size(_appropriateImageDropdownItemsPerRow) - 1))]; } - - bool WindowDropDownHasMultipleColumns(size_t numItems) - { - return numItems > DROPDOWN_TEXT_MAX_ROWS; - } } // namespace OpenRCT2::Ui::Windows using namespace OpenRCT2::Ui::Windows; diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 974fc0cd89ce..ba6c0c89bec0 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1981,10 +1981,9 @@ static_assert(std::size(RatingNames) == 6); } Widget* dropdownWidget = widget - 1; - auto ddWidth = WindowDropDownHasMultipleColumns(numItems) ? dropdownWidget->width() - 24 : dropdownWidget->width(); WindowDropdownShowTextCustomWidth( { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, - colours[1], 0, Dropdown::Flag::StayOpen, numItems, ddWidth); + colours[1], 0, Dropdown::Flag::StayOpen, numItems, dropdownWidget->width()); // Find the current vehicle type in the ordered list. int32_t pos = 0; From 6c31491bff7615f36d4a23b0050bce2929469ed3 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 18 May 2024 20:49:18 +0200 Subject: [PATCH 5/5] Add changelog entry --- distribution/changelog.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index d7b8eaf4b009..375b2dc85055 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -2,8 +2,10 @@ ------------------------------------------------------------------------ - Feature: [#622] Add option to align the top toolbar buttons horizontally centred (off by default). - Feature: [#21714] [Plugin] Costume assignment is now tailored to each staff type. +- Feature: [#21853] Enlarged UI mode. - Feature: [#21893] On launch, the game now indicates what system is being initialised. - Feature: [#21913] [Plugin] Allow precise and safe control of peep animations. +- Improved: [#21853] Dropdowns now automatically use multiple columns if they are too tall for the screen. - Improved: [#21981] Rendering performance of the map window has been improved considerably. - Improved: [#21981] The map window now defaults to showing as much of the map as fits the screen. - Improved: [#21983] Taking a screenshot now shows a message again, closing when taking another.