Merge pull request #21853 from Gymnasiast/feature/touch-mode

Add enlarged UI
This commit is contained in:
Michael Steenbeek 2024-05-18 22:22:10 +02:00 committed by GitHub
commit 15d5f75a2b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 64 additions and 25 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -7,6 +7,7 @@
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include <algorithm>
#include <bitset>
#include <iterator>
#include <openrct2-ui/interface/Dropdown.h>
@ -14,6 +15,7 @@
#include <openrct2/Context.h>
#include <openrct2/GameState.h>
#include <openrct2/Input.h>
#include <openrct2/config/Config.h>
#include <openrct2/core/BitSet.hpp>
#include <openrct2/drawing/Drawing.h>
#include <openrct2/localisation/Formatter.h>
@ -23,10 +25,8 @@
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;
static constexpr std::array<uint8_t, 57> _appropriateImageDropdownItemsPerRow = {
1, 1, 1, 1, 2, 2, 3, 3, 4, 3, // 10
@ -86,6 +86,16 @@ namespace OpenRCT2::Ui::Windows
InputSetState(InputState::DropdownActive);
}
static int32_t GetDefaultRowHeight()
{
return Config::Get().interface.EnlargedUi ? DROPDOWN_ITEM_HEIGHT_TOUCH : DROPDOWN_ITEM_HEIGHT;
}
static int32_t GetAdditionalRowPadding()
{
return Config::Get().interface.EnlargedUi ? 6 : 0;
}
void OnDraw(DrawPixelInfo& dpi) override
{
DrawWidgets(dpi);
@ -154,33 +164,45 @@ namespace OpenRCT2::Ui::Windows
colour = NOT_TRANSLUCENT(colours[0]) | COLOUR_FLAG_INSET;
// Draw item string
auto yOffset = GetAdditionalRowPadding();
Formatter ft(reinterpret_cast<uint8_t*>(&gDropdownItems[i].Args));
DrawTextEllipsised(dpi, screenCoords, width - 5, item, ft, { colour });
DrawTextEllipsised(dpi, { screenCoords.x, screenCoords.y + yOffset }, width - 5, item, ft, { colour });
}
}
}
}
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 : DROPDOWN_ITEM_HEIGHT;
ItemHeight = (txtFlags & Dropdown::Flag::CustomHeight) ? customHeight : GetDefaultRowHeight();
gDropdownNumItems = static_cast<int32_t>(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;
@ -330,7 +352,7 @@ namespace OpenRCT2::Ui::Windows
int32_t width)
{
InputSetFlag(static_cast<INPUT_FLAGS>(INPUT_FLAG_DROPDOWN_STAY_OPEN | INPUT_FLAG_DROPDOWN_MOUSE_UP), false);
if (flags & Dropdown::Flag::StayOpen)
if (flags & Dropdown::Flag::StayOpen || Config::Get().interface.EnlargedUi)
InputSetFlag(INPUT_FLAG_DROPDOWN_STAY_OPEN, true);
WindowDropdownClose();
@ -362,7 +384,7 @@ namespace OpenRCT2::Ui::Windows
int32_t itemHeight, int32_t numColumns)
{
InputSetFlag(static_cast<INPUT_FLAGS>(INPUT_FLAG_DROPDOWN_STAY_OPEN | INPUT_FLAG_DROPDOWN_MOUSE_UP), false);
if (flags & Dropdown::Flag::StayOpen)
if (flags & Dropdown::Flag::StayOpen || Config::Get().interface.EnlargedUi)
InputSetFlag(INPUT_FLAG_DROPDOWN_STAY_OPEN, true);
// Close existing dropdown
@ -493,9 +515,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<uint32_t>(numColours)));
gDropdownIsColour = true;
@ -509,11 +532,6 @@ static constexpr colour_t kColoursDropdownOrder[] = {
return _appropriateImageDropdownItemsPerRow[std::min<uint32_t>(
numItems, static_cast<uint32_t>(std::size(_appropriateImageDropdownItemsPerRow) - 1))];
}
bool WindowDropDownHasMultipleColumns(size_t numItems)
{
return numItems > DROPDOWN_TEXT_MAX_ROWS;
}
} // namespace OpenRCT2::Ui::Windows
using namespace OpenRCT2::Ui::Windows;

View File

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

View File

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

View File

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

View File

@ -135,6 +135,7 @@ namespace OpenRCT2::Config
int32_t ScenarioselectLastTab;
bool ListRideVehiclesSeparately;
bool WindowButtonsOnTheLeft;
bool EnlargedUi;
};
struct Sound