mirror of
https://github.com/osukey/osukey.git
synced 2025-08-03 22:56:36 +09:00
Rework filtering
This commit is contained in:
@ -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,
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user