diff --git a/distribution/changelog.txt b/distribution/changelog.txt index c445e31bb5..54d2ced5c7 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -14,6 +14,7 @@ - Change: [#22230] The plugin/script engine is now initialised off the main thread. - Change: [#22251] Hide author info in the scenery window unless debug tools are active. - Change: [#22309] The scenario editor now supports loading landscapes from .sea save files. +- Fix: [#17390] Glitchy animations for the ride type tabs in the object selection window. - Fix: [#19210] The load/save window executes the loading code twice, resulting in a slowdown. - Fix: [#22056] Potential crash upon exiting the game. - Fix: [#22208] Cursor may fail to register hits in some cases (original bug). diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index abdf07e022..5f9a8b8d25 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -225,22 +225,20 @@ static std::vector _window_editor_object_selection_widgets = { #pragma endregion static constexpr int32_t window_editor_object_selection_animation_loops[] = { - 20, // All - 32, // Transport - 10, // Gentle - 72, // Coaster - 24, // Thrill - 28, // Water - 16, // Stall + 20, // Transport + 32, // Gentle + 10, // Coaster + 72, // Thrill + 24, // Water + 28, // Stall }; static constexpr int32_t window_editor_object_selection_animation_divisor[] = { - 4, // All - 8, // Transport - 2, // Gentle - 4, // Coaster + 4, // Transport + 8, // Gentle + 2, // Coaster 4, // Thrill 4, // Water - 2, // Stall + 4, // Stall }; static StringId GetRideTypeStringId(const ObjectRepositoryItem* item); @@ -257,6 +255,7 @@ static std::vector _window_editor_object_selection_widgets = { int32_t _listSortType = RIDE_SORT_TYPE; bool _listSortDescending = false; std::unique_ptr _loadedObject; + uint8_t _selectedSubTab = 0; public: /** @@ -333,18 +332,17 @@ static std::vector _window_editor_object_selection_widgets = { WidgetInvalidate(*this, WIDX_FILTER_TEXT_BOX); } - for (WidgetIndex i = WIDX_FILTER_RIDE_TAB_TRANSPORT; i <= WIDX_FILTER_RIDE_TAB_STALL; i++) - { - if (!IsWidgetPressed(i)) - continue; + if (GetSelectedObjectType() != ObjectType::Ride) + return; - frame_no++; - if (frame_no >= window_editor_object_selection_animation_loops[i - WIDX_FILTER_RIDE_TAB_TRANSPORT]) - frame_no = 0; + if (_selectedSubTab == 0) + return; - WidgetInvalidate(*this, i); - break; - } + frame_no++; + if (frame_no >= window_editor_object_selection_animation_loops[_selectedSubTab - 1]) + frame_no = 0; + + WidgetInvalidate(*this, WIDX_FILTER_RIDE_TAB_ALL + _selectedSubTab); } /** @@ -373,25 +371,22 @@ static std::vector _window_editor_object_selection_widgets = { } break; case WIDX_FILTER_RIDE_TAB_ALL: - _filter_flags |= FILTER_RIDES; - Config::Get().interface.ObjectSelectionFilterFlags = _filter_flags; - Config::Save(); - - FilterUpdateCounts(); - VisibleListRefresh(); - - selected_list_item = -1; - scrolls[0].v_top = 0; - Invalidate(); - break; case WIDX_FILTER_RIDE_TAB_TRANSPORT: case WIDX_FILTER_RIDE_TAB_GENTLE: case WIDX_FILTER_RIDE_TAB_COASTER: case WIDX_FILTER_RIDE_TAB_THRILL: case WIDX_FILTER_RIDE_TAB_WATER: case WIDX_FILTER_RIDE_TAB_STALL: - _filter_flags &= ~FILTER_RIDES; - _filter_flags |= (1 << (widgetIndex - WIDX_FILTER_RIDE_TAB_TRANSPORT + _numSourceGameItems)); + { + _selectedSubTab = widgetIndex - WIDX_FILTER_RIDE_TAB_ALL; + if (widgetIndex != WIDX_FILTER_RIDE_TAB_ALL) + { + _filter_flags &= ~FILTER_RIDES; + _filter_flags |= (1 << (_numSourceGameItems + _selectedSubTab - 1)); + } + else + _filter_flags |= FILTER_RIDES; + Config::Get().interface.ObjectSelectionFilterFlags = _filter_flags; Config::Save(); @@ -403,6 +398,7 @@ static std::vector _window_editor_object_selection_widgets = { frame_no = 0; Invalidate(); break; + } case WIDX_ADVANCED: list_information_type ^= 1; @@ -1024,7 +1020,7 @@ static std::vector _window_editor_object_selection_widgets = { int32_t spriteIndex = ride_tabs[i]; int32_t frame = 0; - if (i != 0 && IsWidgetPressed(WIDX_FILTER_RIDE_TAB_ALL + i)) + if (i != 0 && _selectedSubTab == i) { frame = frame_no / window_editor_object_selection_animation_divisor[i - 1]; } @@ -1145,6 +1141,7 @@ static std::vector _window_editor_object_selection_widgets = { return; selected_tab = _page; + _selectedSubTab = 0; selected_list_item = -1; scrolls[0].v_top = 0; frame_no = 0;