1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-22 06:23:04 +01:00

Update filter dropdown caption with (number of) active source(s)

This commit is contained in:
Aaron van Geffen
2024-07-28 15:40:44 +02:00
parent 2be82c280d
commit 15944738c7
3 changed files with 51 additions and 28 deletions

View File

@@ -3724,6 +3724,9 @@ STR_6649 :Loading scenario…
STR_6650 :Loading saved game…
STR_6651 :{STRING} ({COMMA32}%)
STR_6652 :Error Window
STR_6653 :All sources shown
STR_6654 :Showing {POP16}{UINT16} sources
STR_6655 :Only {POP16}{STRINGID}
#############
# Scenarios #

View File

@@ -493,6 +493,7 @@ namespace OpenRCT2
STR_OBJECT_SELECTION = 3181,
STR_OBJECT_SELECTION_ADVANCED = 3364,
STR_OBJECT_SELECTION_ADVANCED_TIP = 3365,
STR_OBJECT_SELECTION_ALL_SOURCES_SHOWN = 6653,
STR_OBJECT_SELECTION_COMPAT_OBJECT_DESCRIPTION = 6550,
STR_OBJECT_SELECTION_FALLBACK_IMAGES_WARNING = 6516,
STR_OBJECT_SELECTION_FOOTPATHS = 3189,
@@ -500,6 +501,7 @@ namespace OpenRCT2
STR_OBJECT_SELECTION_FOOTPATH_SURFACES = 6444,
STR_OBJECT_SELECTION_LARGE_SCENERY = 3186,
STR_OBJECT_SELECTION_MUSIC = 6273,
STR_OBJECT_SELECTION_ONLY_STRINGID = 6655,
STR_OBJECT_SELECTION_PATH_EXTRAS = 3190,
STR_OBJECT_SELECTION_PATH_SIGNS = 3188,
STR_OBJECT_SELECTION_RIDE_VEHICLES_ATTRACTIONS = 3184,
@@ -511,6 +513,7 @@ namespace OpenRCT2
STR_OBJECT_SELECTION_TERRAIN_SURFACES = 6270,
STR_OBJECT_SELECTION_WALLS_FENCES = 3187,
STR_OBJECT_SELECTION_WATER = 3193,
STR_OBJECT_SELECTION_SHOWING_N_SOURCES = 6654,
STR_OBJECT_USES_FALLBACK_IMAGES = 6515,
STR_RELOAD_OBJECT_TIP = 6613,
STR_RIDE_OBJECT_SHOP_SELLS = 6452,

View File

@@ -7,6 +7,7 @@
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include <bit>
#include <cctype>
#include <openrct2-ui/interface/Dropdown.h>
#include <openrct2-ui/interface/Widget.h>
@@ -67,10 +68,11 @@ namespace OpenRCT2::Ui::Windows
FILTER_SELECTED = (1 << 14),
FILTER_NONSELECTED = (1 << 15),
FILTER_RIDES = FILTER_RIDE_TRANSPORT | FILTER_RIDE_GENTLE | FILTER_RIDE_COASTER | FILTER_RIDE_THRILL | FILTER_RIDE_WATER
| FILTER_RIDE_STALL,
FILTER_ALL = FILTER_RIDES | FILTER_RCT1 | FILTER_AA | FILTER_LL | FILTER_RCT2 | FILTER_WW | FILTER_TT | FILTER_OO
| FILTER_CUSTOM | FILTER_SELECTED | FILTER_NONSELECTED,
FILTER_RIDES_ALL = FILTER_RIDE_TRANSPORT | FILTER_RIDE_GENTLE | FILTER_RIDE_COASTER | FILTER_RIDE_THRILL
| FILTER_RIDE_WATER | FILTER_RIDE_STALL,
FILTER_SOURCES_ALL = FILTER_RCT1 | FILTER_AA | FILTER_LL | FILTER_RCT2 | FILTER_WW | FILTER_TT | FILTER_OO
| FILTER_CUSTOM,
FILTER_ALL = FILTER_RIDES_ALL | FILTER_SOURCES_ALL | FILTER_SELECTED | FILTER_NONSELECTED,
};
enum
@@ -79,7 +81,7 @@ namespace OpenRCT2::Ui::Windows
RIDE_SORT_RIDE
};
enum
enum : uint8_t
{
DDIX_FILTER_RCT1,
DDIX_FILTER_AA,
@@ -116,6 +118,7 @@ namespace OpenRCT2::Ui::Windows
static constexpr StringId WINDOW_TITLE = STR_OBJECT_SELECTION;
static constexpr int32_t WH = 400;
static constexpr int32_t WW = 600;
static constexpr auto kFilterWidth = 150;
static constexpr auto kPreviewSize = 113;
struct ObjectSubTab
@@ -138,7 +141,7 @@ namespace OpenRCT2::Ui::Windows
// clang-format off
static ObjectSubTab kRideObjectSubTabs[] = {
{ STR_OBJECT_FILTER_ALL_RIDES_TIP, ObjectType::Ride, FILTER_RIDES, SPR_G2_INFINITY, 1, 1 },
{ STR_OBJECT_FILTER_ALL_RIDES_TIP, ObjectType::Ride, FILTER_RIDES_ALL, SPR_G2_INFINITY, 1, 1 },
{ STR_TRANSPORT_RIDES_TIP, ObjectType::Ride, FILTER_RIDE_TRANSPORT, SPR_TAB_RIDES_TRANSPORT_0, 20, 4 },
{ STR_GENTLE_RIDES_TIP, ObjectType::Ride, FILTER_RIDE_GENTLE, SPR_TAB_RIDES_GENTLE_0, 32, 8 },
{ STR_ROLLER_COASTERS_TIP, ObjectType::Ride, FILTER_RIDE_COASTER, SPR_TAB_RIDES_ROLLER_COASTERS_0, 10, 2 },
@@ -276,7 +279,7 @@ namespace OpenRCT2::Ui::Windows
widgets[WIDX_FILTER_TEXT_BOX].string = _filter_string;
_filter_flags = FILTER_RIDES | Config::Get().interface.ObjectSelectionFilterFlags;
_filter_flags = FILTER_RIDES_ALL | Config::Get().interface.ObjectSelectionFilterFlags;
std::fill_n(_filter_string, sizeof(_filter_string), 0x00);
WindowInitScrollWidgets(*this);
@@ -393,7 +396,7 @@ namespace OpenRCT2::Ui::Windows
auto& currentPage = ObjectSelectionPages[selected_tab];
auto& subTabDef = currentPage.subTabs[_selectedSubTab];
_filter_flags &= ~FILTER_RIDES;
_filter_flags &= ~FILTER_RIDES_ALL;
_filter_flags |= subTabDef.flagFilter;
Config::Get().interface.ObjectSelectionFilterFlags = _filter_flags;
@@ -484,6 +487,12 @@ namespace OpenRCT2::Ui::Windows
WindowSetResize(*this, WW, WH, 1200, 1000);
}
static constexpr StringId kSourceStringIds[] = {
STR_SCENARIO_CATEGORY_RCT1, STR_SCENARIO_CATEGORY_RCT1_AA, STR_SCENARIO_CATEGORY_RCT1_LL,
STR_ROLLERCOASTER_TYCOON_2_DROPDOWN, STR_OBJECT_FILTER_WW, STR_OBJECT_FILTER_TT,
STR_OBJECT_FILTER_OPENRCT2_OFFICIAL, STR_OBJECT_FILTER_CUSTOM,
};
void OnMouseDown(WidgetIndex widgetIndex) override
{
int32_t numSelectionItems = 0;
@@ -491,24 +500,11 @@ namespace OpenRCT2::Ui::Windows
switch (widgetIndex)
{
case WIDX_FILTER_DROPDOWN_BTN:
gDropdownItems[DDIX_FILTER_RCT1].Format = STR_TOGGLE_OPTION;
gDropdownItems[DDIX_FILTER_AA].Format = STR_TOGGLE_OPTION;
gDropdownItems[DDIX_FILTER_LL].Format = STR_TOGGLE_OPTION;
gDropdownItems[DDIX_FILTER_RCT2].Format = STR_TOGGLE_OPTION;
gDropdownItems[DDIX_FILTER_WW].Format = STR_TOGGLE_OPTION;
gDropdownItems[DDIX_FILTER_TT].Format = STR_TOGGLE_OPTION;
gDropdownItems[DDIX_FILTER_OO].Format = STR_TOGGLE_OPTION;
gDropdownItems[DDIX_FILTER_CUSTOM].Format = STR_TOGGLE_OPTION;
gDropdownItems[DDIX_FILTER_RCT1].Args = STR_SCENARIO_CATEGORY_RCT1;
gDropdownItems[DDIX_FILTER_AA].Args = STR_SCENARIO_CATEGORY_RCT1_AA;
gDropdownItems[DDIX_FILTER_LL].Args = STR_SCENARIO_CATEGORY_RCT1_LL;
gDropdownItems[DDIX_FILTER_RCT2].Args = STR_ROLLERCOASTER_TYCOON_2_DROPDOWN;
gDropdownItems[DDIX_FILTER_WW].Args = STR_OBJECT_FILTER_WW;
gDropdownItems[DDIX_FILTER_TT].Args = STR_OBJECT_FILTER_TT;
gDropdownItems[DDIX_FILTER_OO].Args = STR_OBJECT_FILTER_OPENRCT2_OFFICIAL;
gDropdownItems[DDIX_FILTER_CUSTOM].Args = STR_OBJECT_FILTER_CUSTOM;
for (auto ddIdx = EnumValue(DDIX_FILTER_RCT1); ddIdx <= EnumValue(DDIX_FILTER_CUSTOM); ddIdx++)
{
gDropdownItems[ddIdx].Args = kSourceStringIds[ddIdx];
gDropdownItems[ddIdx].Format = STR_TOGGLE_OPTION;
}
// Track manager cannot select multiple, so only show selection filters if not in track manager
if (!(gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER))
@@ -847,7 +843,7 @@ namespace OpenRCT2::Ui::Windows
widgets[WIDX_LIST].bottom = height - 14;
widgets[WIDX_PREVIEW].left = width - 209;
widgets[WIDX_PREVIEW].right = width - 96;
ResizeDropdown(WIDX_FILTER_DROPDOWN, { width - 130, 22 }, { 122, 14 });
ResizeDropdown(WIDX_FILTER_DROPDOWN, { width - kFilterWidth - 10, 22 }, { kFilterWidth, 14 });
widgets[WIDX_INSTALL_TRACK].left = width - 250;
widgets[WIDX_INSTALL_TRACK].right = width - 137;
widgets[WIDX_RELOAD_OBJECT].left = width - 9 - 24;
@@ -878,6 +874,27 @@ namespace OpenRCT2::Ui::Windows
installTrackWidget.type = WindowWidgetType::Empty;
}
// Set filter dropdown caption
if (!isFilterActive(FILTER_SOURCES_ALL))
{
// Only one source active?
uint32_t sources = _filter_flags & FILTER_SOURCES_ALL;
auto numSourcesActive = std::popcount(sources);
if (numSourcesActive == 1)
{
widgets[WIDX_FILTER_DROPDOWN].text = STR_OBJECT_SELECTION_ONLY_STRINGID;
auto firstActiveSource = UtilBitScanForward(sources);
ft.Add<StringId>(kSourceStringIds[firstActiveSource]);
}
else
{
widgets[WIDX_FILTER_DROPDOWN].text = STR_OBJECT_SELECTION_SHOWING_N_SOURCES;
ft.Add<uint16_t>(numSourcesActive);
}
}
else
widgets[WIDX_FILTER_DROPDOWN].text = STR_OBJECT_SELECTION_ALL_SOURCES_SHOWN;
// Align main tabs
int32_t x = 3;
for (size_t i = 0; i < std::size(ObjectSelectionPages); i++)
@@ -1123,7 +1140,7 @@ namespace OpenRCT2::Ui::Windows
selected_tab = _page;
_selectedSubTab = 0;
_filter_flags |= FILTER_RIDES;
_filter_flags |= FILTER_RIDES_ALL;
selected_list_item = -1;
scrolls[0].v_top = 0;
frame_no = 0;