Hook up now playing overlay to collections

This commit is contained in:
smoogipoo 2020-09-11 16:46:11 +09:00
parent a6a76de7a9
commit fcc8683629
6 changed files with 82 additions and 31 deletions

View File

@ -7,13 +7,15 @@ using osu.Framework.Allocation;
using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Effects; using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.UserInterface; using osu.Game.Collections;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
namespace osu.Game.Overlays.Music namespace osu.Game.Overlays.Music
{ {
public class CollectionsDropdown<T> : OsuDropdown<T> /// <summary>
/// A <see cref="CollectionFilterDropdown"/> for use in the <see cref="NowPlayingOverlay"/>.
/// </summary>
public class CollectionDropdown : CollectionFilterDropdown
{ {
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(OsuColour colours) private void load(OsuColour colours)
@ -21,11 +23,11 @@ namespace osu.Game.Overlays.Music
AccentColour = colours.Gray6; AccentColour = colours.Gray6;
} }
protected override DropdownHeader CreateHeader() => new CollectionsHeader(); protected override CollectionDropdownHeader CreateCollectionHeader() => new CollectionsHeader();
protected override DropdownMenu CreateMenu() => new CollectionsMenu(); protected override CollectionDropdownMenu CreateCollectionMenu() => new CollectionsMenu();
private class CollectionsMenu : OsuDropdownMenu private class CollectionsMenu : CollectionDropdownMenu
{ {
public CollectionsMenu() public CollectionsMenu()
{ {
@ -40,7 +42,7 @@ namespace osu.Game.Overlays.Music
} }
} }
private class CollectionsHeader : OsuDropdownHeader private class CollectionsHeader : CollectionDropdownHeader
{ {
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(OsuColour colours) private void load(OsuColour colours)

View File

@ -8,13 +8,15 @@ using osu.Game.Graphics.UserInterface;
using osuTK; using osuTK;
using System; using System;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables;
namespace osu.Game.Overlays.Music namespace osu.Game.Overlays.Music
{ {
public class FilterControl : Container public class FilterControl : Container
{ {
public Action<FilterCriteria> FilterChanged;
public readonly FilterTextBox Search; public readonly FilterTextBox Search;
private readonly CollectionDropdown collectionDropdown;
public FilterControl() public FilterControl()
{ {
@ -32,21 +34,27 @@ namespace osu.Game.Overlays.Music
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
Height = 40, Height = 40,
}, },
new CollectionsDropdown<PlaylistCollection> collectionDropdown = new CollectionDropdown { RelativeSizeAxes = Axes.X }
{
RelativeSizeAxes = Axes.X,
Items = new[] { PlaylistCollection.All },
}
}, },
}, },
}; };
Search.Current.ValueChanged += current_ValueChanged;
} }
private void current_ValueChanged(ValueChangedEvent<string> e) => FilterChanged?.Invoke(e.NewValue); protected override void LoadComplete()
{
base.LoadComplete();
public Action<string> FilterChanged; Search.Current.BindValueChanged(_ => updateCriteria());
collectionDropdown.Current.BindValueChanged(_ => updateCriteria(), true);
}
private void updateCriteria() => FilterChanged?.Invoke(createCriteria());
private FilterCriteria createCriteria() => new FilterCriteria
{
SearchText = Search.Text,
Collection = collectionDropdown.Current.Value?.Collection
};
public class FilterTextBox : SearchTextBox public class FilterTextBox : SearchTextBox
{ {

View File

@ -0,0 +1,22 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using JetBrains.Annotations;
using osu.Game.Collections;
namespace osu.Game.Overlays.Music
{
public class FilterCriteria
{
/// <summary>
/// The search text.
/// </summary>
public string SearchText;
/// <summary>
/// The collection to filter beatmaps from.
/// </summary>
[CanBeNull]
public BeatmapCollection Collection;
}
}

View File

@ -24,7 +24,15 @@ namespace osu.Game.Overlays.Music
set => base.Padding = value; set => base.Padding = value;
} }
public void Filter(string searchTerm) => ((SearchContainer<RearrangeableListItem<BeatmapSetInfo>>)ListContainer).SearchTerm = searchTerm; public void Filter(FilterCriteria criteria)
{
var items = (SearchContainer<RearrangeableListItem<BeatmapSetInfo>>)ListContainer;
foreach (var item in items.OfType<PlaylistItem>())
item.InSelectedCollection = criteria.Collection?.Beatmaps.Any(b => b.BeatmapSet.Equals(item.Model)) ?? true;
items.SearchTerm = criteria.SearchText;
}
public BeatmapSetInfo FirstVisibleSet => Items.FirstOrDefault(i => ((PlaylistItem)ItemMap[i]).MatchingFilter); public BeatmapSetInfo FirstVisibleSet => Items.FirstOrDefault(i => ((PlaylistItem)ItemMap[i]).MatchingFilter);

View File

@ -95,23 +95,40 @@ namespace osu.Game.Overlays.Music
return true; return true;
} }
private bool inSelectedCollection = true;
public bool InSelectedCollection
{
get => inSelectedCollection;
set
{
if (inSelectedCollection == value)
return;
inSelectedCollection = value;
updateFilter();
}
}
public IEnumerable<string> FilterTerms { get; } public IEnumerable<string> FilterTerms { get; }
private bool matching = true; private bool matchingFilter = true;
public bool MatchingFilter public bool MatchingFilter
{ {
get => matching; get => matchingFilter && inSelectedCollection;
set set
{ {
if (matching == value) return; if (matchingFilter == value)
return;
matching = value; matchingFilter = value;
updateFilter();
this.FadeTo(matching ? 1 : 0, 200);
} }
} }
private void updateFilter() => this.FadeTo(MatchingFilter ? 1 : 0, 200);
public bool FilteringActive { get; set; } public bool FilteringActive { get; set; }
} }
} }

View File

@ -68,7 +68,7 @@ namespace osu.Game.Overlays.Music
{ {
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y, AutoSizeAxes = Axes.Y,
FilterChanged = search => list.Filter(search), FilterChanged = criteria => list.Filter(criteria),
Padding = new MarginPadding(10), Padding = new MarginPadding(10),
}, },
}, },
@ -124,10 +124,4 @@ namespace osu.Game.Overlays.Music
beatmap.Value.Track.Restart(); beatmap.Value.Track.Restart();
} }
} }
//todo: placeholder
public enum PlaylistCollection
{
All
}
} }