mirror of
https://github.com/ppy/osu.git
synced 2024-12-16 06:52:55 +08:00
Use SearchContainer
instead of manual search implementation
This commit is contained in:
parent
256d8c6559
commit
826b35e031
@ -37,7 +37,7 @@ namespace osu.Game.Overlays.Chat.ChannelList
|
||||
private readonly Dictionary<Channel, ChannelListItem> channelMap = new Dictionary<Channel, ChannelListItem>();
|
||||
|
||||
private OsuScrollContainer scroll = null!;
|
||||
private FillFlowContainer groupFlow = null!;
|
||||
private SearchContainer groupFlow = null!;
|
||||
private ChannelGroup announceChannelGroup = null!;
|
||||
private ChannelGroup publicChannelGroup = null!;
|
||||
private ChannelGroup privateChannelGroup = null!;
|
||||
@ -59,7 +59,7 @@ namespace osu.Game.Overlays.Chat.ChannelList
|
||||
RelativeSizeAxes = Axes.Both,
|
||||
ScrollbarAnchor = Anchor.TopRight,
|
||||
ScrollDistance = 35f,
|
||||
Child = groupFlow = new FillFlowContainer
|
||||
Child = groupFlow = new SearchContainer
|
||||
{
|
||||
Direction = FillDirection.Vertical,
|
||||
RelativeSizeAxes = Axes.X,
|
||||
@ -87,10 +87,7 @@ namespace osu.Game.Overlays.Chat.ChannelList
|
||||
},
|
||||
};
|
||||
|
||||
searchTextBox.OnUpdate += (newText) =>
|
||||
{
|
||||
privateChannelGroup.FilterChannels(searchTextBox.Text);
|
||||
};
|
||||
searchTextBox.Current.BindValueChanged(_ => groupFlow.SearchTerm = searchTextBox.Current.Value, true);
|
||||
|
||||
selector.OnRequestSelect += chan => OnRequestSelect?.Invoke(chan);
|
||||
}
|
||||
@ -188,23 +185,6 @@ namespace osu.Game.Overlays.Chat.ChannelList
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public void FilterChannels(string searchTerm)
|
||||
{
|
||||
foreach (var item in ItemFlow.Children)
|
||||
{
|
||||
if (string.IsNullOrEmpty(searchTerm))
|
||||
{
|
||||
item.Show();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (item.Channel.Name.Contains(searchTerm, StringComparison.OrdinalIgnoreCase))
|
||||
item.Show();
|
||||
else
|
||||
item.Hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
// See the LICENCE file in the repository root for full licence text.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using osu.Framework.Allocation;
|
||||
using osu.Framework.Bindables;
|
||||
@ -9,6 +10,7 @@ using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Framework.Graphics.Shapes;
|
||||
using osu.Framework.Input.Events;
|
||||
using osu.Framework.Localisation;
|
||||
using osu.Game.Graphics;
|
||||
using osu.Game.Graphics.Containers;
|
||||
using osu.Game.Graphics.Sprites;
|
||||
@ -19,7 +21,7 @@ using osuTK;
|
||||
|
||||
namespace osu.Game.Overlays.Chat.ChannelList
|
||||
{
|
||||
public partial class ChannelListItem : OsuClickableContainer
|
||||
public partial class ChannelListItem : OsuClickableContainer, IFilterable
|
||||
{
|
||||
public event Action<Channel>? OnRequestSelect;
|
||||
public event Action<Channel>? OnRequestLeave;
|
||||
@ -186,5 +188,28 @@ namespace osu.Game.Overlays.Chat.ChannelList
|
||||
}
|
||||
|
||||
private bool isSelector => Channel is ChannelListing.ChannelListingChannel;
|
||||
|
||||
#region Filtering support
|
||||
|
||||
public IEnumerable<LocalisableString> FilterTerms => isSelector ? Enumerable.Empty<LocalisableString>() : [Channel.Name];
|
||||
|
||||
private bool matchingFilter = true;
|
||||
|
||||
public bool MatchingFilter
|
||||
{
|
||||
get => matchingFilter;
|
||||
set
|
||||
{
|
||||
if (matchingFilter == value)
|
||||
return;
|
||||
|
||||
matchingFilter = value;
|
||||
Alpha = matchingFilter ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
public bool FilteringActive { get; set; }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user