/// <summary> /// Transfer the game-wide ruleset to the local decoupled ruleset. /// Will immediately run filter operations if required. /// </summary> /// <returns>Whether a transfer occurred.</returns> private bool transferRulesetValue() { if (decoupledRuleset.Value?.Equals(Ruleset.Value) == true) { return(false); } Logger.Log($"decoupled ruleset transferred (\"{decoupledRuleset.Value}\" -> \"{Ruleset.Value}\""); rulesetNoDebounce = decoupledRuleset.Value = Ruleset.Value; // if we have a pending filter operation, we want to run it now. // it could change selection (ie. if the ruleset has been changed). Carousel?.FlushPendingFilterOperations(); return(true); }
/// <summary> /// Call to make a selection and perform the default action for this SongSelect. /// </summary> /// <param name="beatmap">An optional beatmap to override the current carousel selection.</param> /// <param name="ruleset">An optional ruleset to override the current carousel selection.</param> /// <param name="customStartAction">An optional custom action to perform instead of <see cref="OnStart"/>.</param> public void FinaliseSelection(BeatmapInfo beatmap = null, RulesetInfo ruleset = null, Action customStartAction = null) { // This is very important as we have not yet bound to screen-level bindables before the carousel load is completed. if (!Carousel.BeatmapSetsLoaded) { return; } if (ruleset != null) { Ruleset.Value = ruleset; } transferRulesetValue(); // while transferRulesetValue will flush, it only does so if the ruleset changes. // the user could have changed a filter, and we want to ensure we are 100% up-to-date and consistent here. Carousel.FlushPendingFilterOperations(); // avoid attempting to continue before a selection has been obtained. // this could happen via a user interaction while the carousel is still in a loading state. if (Carousel.SelectedBeatmap == null) { return; } if (beatmap != null) { Carousel.SelectBeatmap(beatmap); } if (selectionChangedDebounce?.Completed == false) { selectionChangedDebounce.RunTask(); selectionChangedDebounce?.Cancel(); // cancel the already scheduled task. selectionChangedDebounce = null; } if (customStartAction != null) { customStartAction(); Carousel.AllowSelection = false; } else if (OnStart()) { Carousel.AllowSelection = false; } }
/// <summary> /// Call to make a selection and perform the default action for this SongSelect. /// </summary> /// <param name="beatmap">An optional beatmap to override the current carousel selection.</param> /// <param name="performStartAction">Whether to trigger <see cref="OnStart"/>.</param> public void FinaliseSelection(BeatmapInfo beatmap = null, bool performStartAction = true) { // This is very important as we have not yet bound to screen-level bindables before the carousel load is completed. if (!Carousel.BeatmapSetsLoaded) { return; } // if we have a pending filter operation, we want to run it now. // it could change selection (ie. if the ruleset has been changed). Carousel.FlushPendingFilterOperations(); // avoid attempting to continue before a selection has been obtained. // this could happen via a user interaction while the carousel is still in a loading state. if (Carousel.SelectedBeatmap == null) { return; } if (beatmap != null) { Carousel.SelectBeatmap(beatmap); } if (selectionChangedDebounce?.Completed == false) { selectionChangedDebounce.RunTask(); selectionChangedDebounce.Cancel(); // cancel the already scheduled task. selectionChangedDebounce = null; } if (performStartAction) { OnStart(); } }