Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add enlarged UI #21853

Merged
merged 5 commits into from
May 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions data/language/en-GB.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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 #
Expand Down
2 changes: 2 additions & 0 deletions distribution/changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions src/openrct2-ui/UiStringIds.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 0 additions & 1 deletion src/openrct2-ui/interface/Dropdown.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
54 changes: 36 additions & 18 deletions src/openrct2-ui/windows/Dropdown.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/

#include <algorithm>
#include <bitset>
#include <iterator>
#include <openrct2-ui/interface/Dropdown.h>
#include <openrct2-ui/interface/Widget.h>
#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>
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
17 changes: 13 additions & 4 deletions src/openrct2-ui/windows/Options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 1 addition & 2 deletions src/openrct2-ui/windows/Ride.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions src/openrct2/config/Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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);
}
}

Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions src/openrct2/config/Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ namespace OpenRCT2::Config
int32_t ScenarioselectLastTab;
bool ListRideVehiclesSeparately;
bool WindowButtonsOnTheLeft;
bool EnlargedUi;
};

struct Sound
Expand Down
Loading