Hide mod columns if all mods within are filtered out

This commit is contained in:
Bartłomiej Dach 2022-05-08 14:44:54 +02:00
parent 569b73cf69
commit 92ccec20d7
No known key found for this signature in database
GPG Key ID: BCECCD4FA41F6497
2 changed files with 47 additions and 11 deletions

View File

@ -55,8 +55,18 @@ namespace osu.Game.Overlays.Mods
} }
} }
/// <summary>
/// Determines whether this column should accept user input.
/// </summary>
public Bindable<bool> Active = new BindableBool(true); public Bindable<bool> Active = new BindableBool(true);
private readonly Bindable<bool> allFiltered = new BindableBool();
/// <summary>
/// True if all of the panels in this column have been filtered out by the current <see cref="Filter"/>.
/// </summary>
public IBindable<bool> AllFiltered => allFiltered;
/// <summary> /// <summary>
/// List of mods marked as selected in this column. /// List of mods marked as selected in this column.
/// </summary> /// </summary>
@ -339,6 +349,9 @@ namespace osu.Game.Overlays.Mods
panel.ApplyFilter(Filter); panel.ApplyFilter(Filter);
} }
allFiltered.Value = panelFlow.All(panel => panel.Filtered.Value);
Alpha = allFiltered.Value ? 0 : 1;
if (toggleAllCheckbox != null && !SelectionAnimationRunning) if (toggleAllCheckbox != null && !SelectionAnimationRunning)
{ {
toggleAllCheckbox.Alpha = panelFlow.Any(panel => !panel.Filtered.Value) ? 1 : 0; toggleAllCheckbox.Alpha = panelFlow.Any(panel => !panel.Filtered.Value) ? 1 : 0;

View File

@ -237,11 +237,11 @@ namespace osu.Game.Overlays.Mods
} }
private ColumnDimContainer createModColumnContent(ModType modType, Key[]? toggleKeys = null) private ColumnDimContainer createModColumnContent(ModType modType, Key[]? toggleKeys = null)
=> new ColumnDimContainer(CreateModColumn(modType, toggleKeys)) => new ColumnDimContainer(CreateModColumn(modType, toggleKeys).With(column => column.Filter = IsValidMod))
{ {
AutoSizeAxes = Axes.X, AutoSizeAxes = Axes.X,
RelativeSizeAxes = Axes.Y, RelativeSizeAxes = Axes.Y,
RequestScroll = column => columnScroll.ScrollIntoView(column, extraScroll: 140) RequestScroll = column => columnScroll.ScrollIntoView(column, extraScroll: 140),
}; };
private ShearedButton[] createDefaultFooterButtons() private ShearedButton[] createDefaultFooterButtons()
@ -351,6 +351,8 @@ namespace osu.Game.Overlays.Mods
#region Transition handling #region Transition handling
private const float distance = 700;
protected override void PopIn() protected override void PopIn()
{ {
const double fade_in_duration = 400; const double fade_in_duration = 400;
@ -362,13 +364,26 @@ namespace osu.Game.Overlays.Mods
.FadeIn(fade_in_duration / 2, Easing.OutQuint) .FadeIn(fade_in_duration / 2, Easing.OutQuint)
.ScaleTo(1, fade_in_duration, Easing.OutElastic); .ScaleTo(1, fade_in_duration, Easing.OutElastic);
int nonFilteredColumnCount = 0;
for (int i = 0; i < columnFlow.Count; i++) for (int i = 0; i < columnFlow.Count; i++)
{ {
columnFlow[i].Column var column = columnFlow[i].Column;
.TopLevelContent
.Delay(i * 30) double delay = column.AllFiltered.Value ? 0 : nonFilteredColumnCount * 30;
.MoveToY(0, fade_in_duration, Easing.OutQuint) double duration = column.AllFiltered.Value ? 0 : fade_in_duration;
.FadeIn(fade_in_duration, Easing.OutQuint); float startingYPosition = 0;
if (!column.AllFiltered.Value)
startingYPosition = nonFilteredColumnCount % 2 == 0 ? -distance : distance;
column.TopLevelContent
.MoveToY(startingYPosition)
.Delay(delay)
.MoveToY(0, duration, Easing.OutQuint)
.FadeIn(duration, Easing.OutQuint);
if (!column.AllFiltered.Value)
nonFilteredColumnCount += 1;
} }
} }
@ -382,16 +397,24 @@ namespace osu.Game.Overlays.Mods
.FadeOut(fade_out_duration / 2, Easing.OutQuint) .FadeOut(fade_out_duration / 2, Easing.OutQuint)
.ScaleTo(0.75f, fade_out_duration, Easing.OutQuint); .ScaleTo(0.75f, fade_out_duration, Easing.OutQuint);
int nonFilteredColumnCount = 0;
for (int i = 0; i < columnFlow.Count; i++) for (int i = 0; i < columnFlow.Count; i++)
{ {
const float distance = 700;
var column = columnFlow[i].Column; var column = columnFlow[i].Column;
double duration = column.AllFiltered.Value ? 0 : fade_out_duration;
float newYPosition = 0;
if (!column.AllFiltered.Value)
newYPosition = nonFilteredColumnCount % 2 == 0 ? -distance : distance;
column.FlushPendingSelections(); column.FlushPendingSelections();
column.TopLevelContent column.TopLevelContent
.MoveToY(i % 2 == 0 ? -distance : distance, fade_out_duration, Easing.OutQuint) .MoveToY(newYPosition, duration, Easing.OutQuint)
.FadeOut(fade_out_duration, Easing.OutQuint); .FadeOut(duration, Easing.OutQuint);
if (!column.AllFiltered.Value)
nonFilteredColumnCount += 1;
} }
} }