mirror of https://github.com/OpenRCT2/OpenRCT2.git
Filter Object Selection by "Selected only" and "Non-selected only"
This commit is contained in:
parent
dcf0a9dad1
commit
b66129db7b
|
@ -4188,6 +4188,8 @@ STR_5876 :{SMALLFONT}{BLACK}The engine to use for drawing the game.
|
||||||
STR_5877 :Software
|
STR_5877 :Software
|
||||||
STR_5878 :Software (hardware display)
|
STR_5878 :Software (hardware display)
|
||||||
STR_5879 :OpenGL
|
STR_5879 :OpenGL
|
||||||
|
STR_5880 :Selected Only
|
||||||
|
STR_5881 :Non-Selected Only
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# Scenarios #
|
# Scenarios #
|
||||||
|
|
|
@ -565,7 +565,7 @@ static bool editor_check_object_group_at_least_one_selected(int objectType)
|
||||||
rct_object_entry *entry = gInstalledObjects;
|
rct_object_entry *entry = gInstalledObjects;
|
||||||
uint8 *objectFlag = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
|
uint8 *objectFlag = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
|
||||||
for (uint32 i = 0; i < numObjects; i++) {
|
for (uint32 i = 0; i < numObjects; i++) {
|
||||||
if ((entry->flags & 0x0F) == objectType && (*objectFlag & 1)) {
|
if ((entry->flags & 0x0F) == objectType && (*objectFlag & OBJECT_SELECTION_FLAG_SELECTED)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
entry = object_get_next(entry);
|
entry = object_get_next(entry);
|
||||||
|
|
|
@ -2656,6 +2656,8 @@ enum {
|
||||||
STR_DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY = 5878,
|
STR_DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY = 5878,
|
||||||
STR_DRAWING_ENGINE_OPENGL = 5879,
|
STR_DRAWING_ENGINE_OPENGL = 5879,
|
||||||
|
|
||||||
|
STR_SELECTED_ONLY = 5880,
|
||||||
|
STR_NON_SELECTED_ONLY = 5881,
|
||||||
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
|
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
|
||||||
STR_COUNT = 32768
|
STR_COUNT = 32768
|
||||||
};
|
};
|
||||||
|
|
|
@ -56,6 +56,9 @@ enum {
|
||||||
FILTER_ALL = 0x7EF,
|
FILTER_ALL = 0x7EF,
|
||||||
} FILTER_FLAGS;
|
} FILTER_FLAGS;
|
||||||
|
|
||||||
|
bool _filter_selected = false;
|
||||||
|
bool _filter_nonselected = false;
|
||||||
|
|
||||||
uint32 _filter_flags;
|
uint32 _filter_flags;
|
||||||
uint16 _filter_object_counts[11];
|
uint16 _filter_object_counts[11];
|
||||||
uint8 _filter_ride_tab;
|
uint8 _filter_ride_tab;
|
||||||
|
@ -219,6 +222,7 @@ static int window_editor_object_selection_select_object(uint8 bh, int flags, rct
|
||||||
static int get_object_from_object_selection(uint8 object_type, int y, uint8 *object_selection_flags, rct_object_entry **installed_entry);
|
static int get_object_from_object_selection(uint8 object_type, int y, uint8 *object_selection_flags, rct_object_entry **installed_entry);
|
||||||
static void window_editor_object_selection_manage_tracks();
|
static void window_editor_object_selection_manage_tracks();
|
||||||
static void editor_load_selected_objects();
|
static void editor_load_selected_objects();
|
||||||
|
static bool filter_selected(uint8* objectFlags);
|
||||||
static bool filter_string(rct_object_entry *entry, rct_object_filters *filter);
|
static bool filter_string(rct_object_entry *entry, rct_object_filters *filter);
|
||||||
static bool filter_source(rct_object_entry *entry);
|
static bool filter_source(rct_object_entry *entry);
|
||||||
static bool filter_chunks(rct_object_entry *entry, rct_object_filters *filter);
|
static bool filter_chunks(rct_object_entry *entry, rct_object_filters *filter);
|
||||||
|
@ -333,7 +337,7 @@ static void visible_list_refresh(rct_window *w)
|
||||||
for (int i = 0; i < numObjects; i++) {
|
for (int i = 0; i < numObjects; i++) {
|
||||||
rct_object_filters *filter = get_object_filter(i);
|
rct_object_filters *filter = get_object_filter(i);
|
||||||
int type = entry->flags & 0x0F;
|
int type = entry->flags & 0x0F;
|
||||||
if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry, filter) && filter_chunks(entry, filter)) {
|
if (type == w->selected_tab && !(*itemFlags & OBJECT_SELECTION_FLAG_6) && filter_source(entry) && filter_string(entry, filter) && filter_chunks(entry, filter) && filter_selected(itemFlags)) {
|
||||||
currentListItem->entry = entry;
|
currentListItem->entry = entry;
|
||||||
currentListItem->filter = filter;
|
currentListItem->filter = filter;
|
||||||
currentListItem->flags = itemFlags;
|
currentListItem->flags = itemFlags;
|
||||||
|
@ -912,15 +916,19 @@ void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct
|
||||||
switch (widgetIndex) {
|
switch (widgetIndex) {
|
||||||
case WIDX_FILTER_DROPDOWN:
|
case WIDX_FILTER_DROPDOWN:
|
||||||
|
|
||||||
num_items = 4;
|
num_items = 6;
|
||||||
gDropdownItemsFormat[0] = 1156;
|
gDropdownItemsFormat[0] = 1156;
|
||||||
gDropdownItemsFormat[1] = 1156;
|
gDropdownItemsFormat[1] = 1156;
|
||||||
gDropdownItemsFormat[2] = 1156;
|
gDropdownItemsFormat[2] = 1156;
|
||||||
gDropdownItemsFormat[3] = 1156;
|
gDropdownItemsFormat[3] = 1156;
|
||||||
|
gDropdownItemsFormat[4] = 1156;
|
||||||
|
gDropdownItemsFormat[5] = 1156;
|
||||||
gDropdownItemsArgs[0] = STR_ROLLERCOASTER_TYCOON_2_DROPDOWN;
|
gDropdownItemsArgs[0] = STR_ROLLERCOASTER_TYCOON_2_DROPDOWN;
|
||||||
gDropdownItemsArgs[1] = STR_OBJECT_FILTER_WW;
|
gDropdownItemsArgs[1] = STR_OBJECT_FILTER_WW;
|
||||||
gDropdownItemsArgs[2] = STR_OBJECT_FILTER_TT;
|
gDropdownItemsArgs[2] = STR_OBJECT_FILTER_TT;
|
||||||
gDropdownItemsArgs[3] = STR_OBJECT_FILTER_CUSTOM;
|
gDropdownItemsArgs[3] = STR_OBJECT_FILTER_CUSTOM;
|
||||||
|
gDropdownItemsArgs[4] = STR_SELECTED_ONLY;
|
||||||
|
gDropdownItemsArgs[5] = STR_NON_SELECTED_ONLY;
|
||||||
|
|
||||||
window_dropdown_show_text(
|
window_dropdown_show_text(
|
||||||
w->x + widget->left,
|
w->x + widget->left,
|
||||||
|
@ -932,6 +940,9 @@ void window_editor_object_selection_mousedown(int widgetIndex, rct_window*w, rct
|
||||||
);
|
);
|
||||||
|
|
||||||
gDropdownItemsChecked = _filter_flags & 0xF;
|
gDropdownItemsChecked = _filter_flags & 0xF;
|
||||||
|
dropdown_set_checked(4, _filter_selected);
|
||||||
|
dropdown_set_checked(5, _filter_nonselected);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -944,8 +955,22 @@ static void window_editor_object_selection_dropdown(rct_window *w, int widgetInd
|
||||||
|
|
||||||
switch (widgetIndex) {
|
switch (widgetIndex) {
|
||||||
case WIDX_FILTER_DROPDOWN:
|
case WIDX_FILTER_DROPDOWN:
|
||||||
_filter_flags ^= (1 << dropdownIndex);
|
if (dropdownIndex == 4) {
|
||||||
gConfigInterface.object_selection_filter_flags = _filter_flags;
|
_filter_selected = !_filter_selected;
|
||||||
|
if (_filter_selected && _filter_nonselected) {
|
||||||
|
_filter_nonselected = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (dropdownIndex == 5) {
|
||||||
|
_filter_nonselected = !_filter_nonselected;
|
||||||
|
if (_filter_nonselected && _filter_selected) {
|
||||||
|
_filter_selected = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_filter_flags ^= (1 << dropdownIndex);
|
||||||
|
gConfigInterface.object_selection_filter_flags = _filter_flags;
|
||||||
|
}
|
||||||
config_save_default();
|
config_save_default();
|
||||||
|
|
||||||
filter_update_counts();
|
filter_update_counts();
|
||||||
|
@ -1015,6 +1040,12 @@ static void window_editor_object_selection_scroll_mousedown(rct_window *w, int s
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_filter_selected != _filter_nonselected) {
|
||||||
|
filter_update_counts();
|
||||||
|
visible_list_refresh(w);
|
||||||
|
window_invalidate(w);
|
||||||
|
}
|
||||||
|
|
||||||
if (!RCT2_GLOBAL(0xF43411, uint8) & 1)
|
if (!RCT2_GLOBAL(0xF43411, uint8) & 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -2052,6 +2083,21 @@ static void window_editor_object_selection_textinput(rct_window *w, int widgetIn
|
||||||
window_invalidate(w);
|
window_invalidate(w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool filter_selected(uint8* objectFlag) {
|
||||||
|
if (_filter_selected == _filter_nonselected) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (_filter_selected && *objectFlag & OBJECT_SELECTION_FLAG_SELECTED) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (_filter_nonselected && !(*objectFlag & OBJECT_SELECTION_FLAG_SELECTED)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool filter_string(rct_object_entry *entry, rct_object_filters *filter)
|
static bool filter_string(rct_object_entry *entry, rct_object_filters *filter)
|
||||||
{
|
{
|
||||||
// Nothing to search for
|
// Nothing to search for
|
||||||
|
@ -2116,19 +2162,22 @@ static bool filter_chunks(rct_object_entry *entry, rct_object_filters *filter)
|
||||||
static void filter_update_counts()
|
static void filter_update_counts()
|
||||||
{
|
{
|
||||||
if (!_FILTER_ALL || strlen(_filter_string) > 0) {
|
if (!_FILTER_ALL || strlen(_filter_string) > 0) {
|
||||||
|
int numObjects = gInstalledObjectsCount;
|
||||||
rct_object_entry *installed_entry = gInstalledObjects;
|
rct_object_entry *installed_entry = gInstalledObjects;
|
||||||
rct_object_filters *filter;
|
rct_object_filters *filter;
|
||||||
|
uint8 *objectFlag = RCT2_GLOBAL(RCT2_ADDRESS_EDITOR_OBJECT_FLAGS_LIST, uint8*);
|
||||||
uint8 type;
|
uint8 type;
|
||||||
for (int i = 0; i < 11; i++) {
|
for (int i = 0; i < 11; i++) {
|
||||||
_filter_object_counts[i] = 0;
|
_filter_object_counts[i] = 0;
|
||||||
}
|
}
|
||||||
for (int i = gInstalledObjectsCount; i > 0; --i) {
|
for (int i = 0; i < numObjects; i++) {
|
||||||
filter = get_object_filter(gInstalledObjectsCount - i);
|
filter = get_object_filter(i);
|
||||||
type = installed_entry->flags & 0xF;
|
type = installed_entry->flags & 0xF;
|
||||||
if (filter_source(installed_entry) && filter_string(installed_entry, filter) && filter_chunks(installed_entry, filter)) {
|
if (filter_source(installed_entry) && filter_string(installed_entry, filter) && filter_chunks(installed_entry, filter) && filter_selected(objectFlag)) {
|
||||||
_filter_object_counts[type]++;
|
_filter_object_counts[type]++;
|
||||||
}
|
}
|
||||||
installed_entry = object_get_next(installed_entry);
|
installed_entry = object_get_next(installed_entry);
|
||||||
|
objectFlag++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue