Rework filtering

This commit is contained in:
smoogipoo
2018-12-19 16:56:51 +09:00
parent c544a5b9f0
commit 673082445e
5 changed files with 70 additions and 42 deletions

View File

@ -1,45 +1,42 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.ComponentModel;
using osu.Game.Graphics;
using osu.Game.Online.Multiplayer;
using osu.Game.Overlays.SearchableList;
using osuTK.Graphics;
namespace osu.Game.Screens.Multi.Lounge.Components
{
public class FilterControl : SearchableListFilterControl<LoungeTab, LoungeTab>
public class FilterControl : SearchableListFilterControl<PrimaryFilter, SecondaryFilter>
{
protected override Color4 BackgroundColour => OsuColour.FromHex(@"362e42");
protected override LoungeTab DefaultTab => LoungeTab.Public;
protected override PrimaryFilter DefaultTab => PrimaryFilter.Current;
public FilterControl()
{
DisplayStyleControl.Hide();
}
public FilterCriteria CreateCriteria() => new FilterCriteria { Availability = availability };
private RoomAvailability availability
public FilterCriteria CreateCriteria() => new FilterCriteria
{
get
{
switch (Tabs.Current.Value)
{
default:
case LoungeTab.Public:
return RoomAvailability.Public;
case LoungeTab.Private:
return RoomAvailability.FriendsOnly;
}
}
}
SearchString = Search.Current.Value ?? string.Empty,
PrimaryFilter = Tabs.Current,
SecondaryFilter = DisplayStyleControl.Dropdown.Current
};
}
public enum LoungeTab
public enum PrimaryFilter
{
Current,
[Description("Recently Ended")]
RecentlyEnded,
Participated,
}
public enum SecondaryFilter
{
Create,
Public,
Private,
//Private,
}
}

View File

@ -1,12 +1,12 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Game.Online.Multiplayer;
namespace osu.Game.Screens.Multi.Lounge.Components
{
public class FilterCriteria
{
public RoomAvailability Availability;
public string SearchString;
public PrimaryFilter PrimaryFilter;
public SecondaryFilter SecondaryFilter;
}
}

View File

@ -59,7 +59,26 @@ namespace osu.Game.Screens.Multi.Lounge.Components
public void Filter(FilterCriteria criteria)
{
roomFlow.Children.ForEach(r => r.MatchingFilter = criteria == null || r.Room.Availability == criteria.Availability);
roomFlow.Children.ForEach(r =>
{
if (criteria == null)
r.MatchingFilter = true;
else
{
bool matchingFilter = true;
matchingFilter &= r.FilterTerms.Any(term => term.IndexOf(criteria.SearchString, StringComparison.InvariantCultureIgnoreCase) >= 0);
switch (criteria.SecondaryFilter)
{
default:
case SecondaryFilter.Public:
r.MatchingFilter = r.Room.Availability.Value == RoomAvailability.Public;
break;
}
r.MatchingFilter = matchingFilter;
}
});
currentFilter = criteria;
}

View File

@ -19,7 +19,6 @@ namespace osu.Game.Screens.Multi.Lounge
protected readonly FilterControl Filter;
private readonly Container content;
private readonly SearchContainer search;
private readonly RoomsContainer rooms;
private readonly Action<Screen> pushGameplayScreen;
@ -53,11 +52,11 @@ namespace osu.Game.Screens.Multi.Lounge
Vertical = 35 - DrawableRoom.SELECTION_BORDER_WIDTH,
Right = 20 - DrawableRoom.SELECTION_BORDER_WIDTH
},
Child = search = new SearchContainer
Child = new SearchContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Child = rooms = new RoomsContainer { OpenRequested = openRoom }
Child = rooms = new RoomsContainer { OpenRequested = Open }
},
},
inspector = new RoomInspector
@ -121,20 +120,9 @@ namespace osu.Game.Screens.Multi.Lounge
Filter.Search.HoldFocus = false;
}
private void filterRooms()
{
if (Filter.Tabs.Current.Value == LoungeTab.Create)
{
Filter.Tabs.Current.Value = LoungeTab.Public;
openRoom(new Room());
}
private void filterRooms() => rooms.Filter(Filter.CreateCriteria());
search.SearchTerm = Filter.Search.Current.Value ?? string.Empty;
rooms.Filter(Filter.CreateCriteria());
}
private void openRoom(Room room)
public void Open(Room room)
{
// Handles the case where a room is clicked 3 times in quick succession
if (!IsCurrentScreen)

View File

@ -9,9 +9,13 @@ using osu.Framework.Screens;
using osu.Game.Graphics;
using osu.Game.Graphics.Backgrounds;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.Multiplayer;
using osu.Game.Overlays.BeatmapSet.Buttons;
using osu.Game.Screens.Menu;
using osu.Game.Screens.Multi.Lounge;
using osu.Game.Screens.Multi.Match;
using osuTK;
namespace osu.Game.Screens.Multi
{
@ -22,6 +26,8 @@ namespace osu.Game.Screens.Multi
public override bool AllowBeatmapRulesetChange => currentScreen?.AllowBeatmapRulesetChange ?? base.AllowBeatmapRulesetChange;
private readonly OsuButton createButton;
private OsuScreen currentScreen;
public Multiplayer()
@ -60,7 +66,21 @@ namespace osu.Game.Screens.Multi
Padding = new MarginPadding { Top = Header.HEIGHT },
Child = loungeScreen = new LoungeScreen(Push),
},
new Header(loungeScreen)
new Header(loungeScreen),
createButton = new HeaderButton
{
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
RelativeSizeAxes = Axes.None,
Size = new Vector2(150, Header.HEIGHT - 20),
Margin = new MarginPadding
{
Top = 10,
Right = 10,
},
Text = "Create room",
Action = () => loungeScreen.Open(new Room())
}
});
screenAdded(loungeScreen);
@ -126,7 +146,11 @@ namespace osu.Game.Screens.Multi
track.Start();
}
}
createButton.Hide();
}
else
createButton.Show();
}
private void screenAdded(Screen newScreen)