mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #21853 from Gymnasiast/feature/touch-mode
Add enlarged UI
This commit is contained in:
commit
15d5f75a2b
|
@ -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 #
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -135,6 +135,7 @@ namespace OpenRCT2::Config
|
|||
int32_t ScenarioselectLastTab;
|
||||
bool ListRideVehiclesSeparately;
|
||||
bool WindowButtonsOnTheLeft;
|
||||
bool EnlargedUi;
|
||||
};
|
||||
|
||||
struct Sound
|
||||
|
|
Loading…
Reference in New Issue