1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-19 04:22:55 +08:00

Merge pull request #30330 from jhk2601/mod_acronym_search_fix

Prioritize selecting exact searched acronym with select keybind
This commit is contained in:
Bartłomiej Dach 2024-10-22 11:20:06 +02:00 committed by GitHub
commit 84e08d96ca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 51 additions and 4 deletions

View File

@ -6,6 +6,7 @@ using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Effects;
using osu.Framework.Localisation;
using osu.Game.Graphics;
using osu.Game.Rulesets.Mods;
@ -58,6 +59,21 @@ namespace osu.Game.Overlays.Mods
modState.ValidForSelection.BindValueChanged(_ => updateFilterState());
modState.MatchingTextFilter.BindValueChanged(_ => updateFilterState(), true);
modState.Preselected.BindValueChanged(b =>
{
if (b.NewValue)
{
Content.EdgeEffect = new EdgeEffectParameters
{
Type = EdgeEffectType.Glow,
Colour = AccentColour,
Hollow = true,
Radius = 2,
};
}
else
Content.EdgeEffect = default;
}, true);
}
protected override void Select()

View File

@ -243,6 +243,9 @@ namespace osu.Game.Overlays.Mods
{
foreach (var column in columnFlow.Columns)
column.SearchTerm = query.NewValue;
if (SearchTextBox.HasFocus)
preselectMod();
}, true);
// Start scrolling from the end, to give the user a sense that
@ -254,6 +257,26 @@ namespace osu.Game.Overlays.Mods
});
}
private void preselectMod()
{
var visibleMods = columnFlow.Columns.OfType<ModColumn>().Where(c => c.IsPresent).SelectMany(c => c.AvailableMods.Where(m => m.Visible));
// Search for an exact acronym or name match, or otherwise default to the first visible mod.
ModState? matchingMod =
visibleMods.FirstOrDefault(m => m.Mod.Acronym.Equals(SearchTerm, StringComparison.OrdinalIgnoreCase) || m.Mod.Name.Equals(SearchTerm, StringComparison.OrdinalIgnoreCase))
?? visibleMods.FirstOrDefault();
var preselectedMod = matchingMod;
foreach (var mod in AllAvailableMods)
mod.Preselected.Value = mod == preselectedMod && SearchTextBox.Current.Value.Length > 0;
}
private void clearPreselection()
{
foreach (var mod in AllAvailableMods)
mod.Preselected.Value = false;
}
public new ModSelectFooterContent? DisplayedFooterContent => base.DisplayedFooterContent as ModSelectFooterContent;
public override VisibilityContainer CreateFooterContent() => new ModSelectFooterContent(this)
@ -383,7 +406,7 @@ namespace osu.Game.Overlays.Mods
{
columnScroll.FadeColour(OsuColour.Gray(0.5f), 400, Easing.OutQuint);
SearchTextBox.FadeColour(OsuColour.Gray(0.5f), 400, Easing.OutQuint);
SearchTextBox.KillFocus();
setTextBoxFocus(false);
}
else
{
@ -590,11 +613,11 @@ namespace osu.Game.Overlays.Mods
return true;
}
ModState? firstMod = columnFlow.Columns.OfType<ModColumn>().FirstOrDefault(m => m.IsPresent)?.AvailableMods.FirstOrDefault(x => x.Visible);
var matchingMod = AllAvailableMods.SingleOrDefault(m => m.Preselected.Value);
if (firstMod is not null)
if (matchingMod is not null)
{
firstMod.Active.Value = !firstMod.Active.Value;
matchingMod.Active.Value = !matchingMod.Active.Value;
SearchTextBox.SelectAll();
}
@ -648,9 +671,15 @@ namespace osu.Game.Overlays.Mods
private void setTextBoxFocus(bool focus)
{
if (focus)
{
SearchTextBox.TakeFocus();
preselectMod();
}
else
{
SearchTextBox.KillFocus();
clearPreselection();
}
}
#endregion

View File

@ -22,6 +22,8 @@ namespace osu.Game.Overlays.Mods
/// </summary>
public BindableBool Active { get; } = new BindableBool();
public BindableBool Preselected { get; } = new BindableBool();
/// <summary>
/// Whether the mod requires further customisation.
/// This flag is read by the <see cref="ModSelectOverlay"/> to determine if the customisation panel should be opened after a mod change