/// <summary>
        /// Unapplies the filters in the FilterViewController, but saves their current status.
        /// </summary>
        /// <param name="songBrowserFilterSelected">Used only by the SongBrowser mod. Set this to true when another filter (Favorites/Playlist) was selected.</param>
        public void UnapplyFilters(bool songBrowserFilterSelected = false)
        {
            if (_filterViewController != null)
            {
                _filterViewController.UnapplyFilters(false);
            }

            if (!SongBrowserTweaks.ModLoaded)
            {
                FilterButton.SetButtonText(FilterButtonText);
                FilterButton.SetButtonTextSize(3f);

                if ((ClearButton as NoTransitionsButton).selectionState == NoTransitionsButton.SelectionState.Highlighted)
                {
                    ClearButton.SetButtonText(ClearFilterButtonHighlightedText);
                }
                else
                {
                    ClearButton.SetButtonText(ClearFilterButtonText);
                }
            }
            else if (SongBrowserTweaks.Initialized && !songBrowserFilterSelected)
            {
                LevelsViewController.SetData(_lastPack);
            }
        }
        public void SearchButtonPressed()
        {
            if (_searchFlowCoordinator == null)
            {
                _searchFlowCoordinator = new GameObject("EnhancedSearchFlowCoordinator").AddComponent <SearchFlowCoordinator>();
                _searchFlowCoordinator.BackButtonPressed += DismissSearchFlowCoordinator;
                _searchFlowCoordinator.SongSelected      += SelectSongFromSearchResult;
            }

            // TODO?: toggle to search every level pack instead of just the current?
            IBeatmapLevelPack levelPack = LevelsViewController.GetPrivateField <IBeatmapLevelPack>("_levelPack");

            _searchFlowCoordinator.Activate(_freePlayFlowCoordinator, levelPack);

            Logger.log.Debug("'Search' button pressed.");
        }
        private void FilterViewControllerSetFilteredSongs(IPreviewBeatmapLevel[] levels)
        {
            // filter application should be handled by FilterViewController calling stuff in SongBrowserTweaks
            if (SongBrowserTweaks.Initialized)
            {
                return;
            }

            BeatmapLevelPack levelPack = new BeatmapLevelPack("", FilteredSongsPackName, LevelsViewController.levelPack.coverImage, new BeatmapLevelCollection(levels));

            LevelsViewController.SetData(levelPack);

            FilterButton.SetButtonText(FilterButtonAppliedText);
            FilterButton.SetButtonTextSize(2.3f);

            ClearButton.SetButtonText(ClearFilterButtonAppliedText);
        }
        private void SelectSongFromSearchResult(IPreviewBeatmapLevel level)
        {
            Logger.log.Debug($"Level selected from search: {level.songName} - {level.songSubName}");
            DismissSearchFlowCoordinator();

            IPreviewBeatmapLevel[] levels = LevelsViewController.GetPrivateField <IBeatmapLevelPack>("_levelPack").beatmapLevelCollection.beatmapLevels;

            int row = Array.IndexOf(levels, level);

            if (row >= 0)
            {
                if (_levelsTableViewContainer.GetPrivateField <bool>("_showLevelPackHeader"))
                {
                    ++row;
                }

                _levelsTableView.ScrollToCellWithIdx(row, TableViewScroller.ScrollPositionType.Beginning, false);
                _levelsTableView.SelectCellWithIdx(row);
            }

            LevelsViewController.HandleLevelPackLevelsTableViewDidSelectLevel(null, level);
        }