fish-station/Content.Client/_Sunrise/UserInterface/Systems/Ghost/Controls/SunriseGhostTargetWindow.Search.cs
ThereDrD 6dd451a5c7
Панель телепорта призрака (#2157)
Co-authored-by: Vigers Ray <60344369+VigersRay@users.noreply.github.com>
2025-05-27 01:34:29 +03:00

85 lines
3.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Numerics;
using Content.Client._Sunrise.UserInterface.Controls;
using Robust.Client.UserInterface.Controls;
namespace Content.Client._Sunrise.UserInterface.Systems.Ghost.Controls;
public sealed partial class SunriseGhostTargetWindow
{
// Введенный в поисковую строку текст, закешированный для удобного доступа
private string _searchText = string.Empty;
private void OnSearchTextChanged(LineEdit.LineEditEventArgs args)
{
_searchText = args.Text;
UpdateVisibleButtons();
Scroll.SetScrollValue(Vector2.Zero); // Устанавливает ползунок в начало
}
/// <summary>
/// Динамически скрывает лишние элементы меню, которые не содержат введенного в поиске текста.
/// Проходится по контейнерам-родителям, в поисках кнопки
/// </summary>
private void UpdateVisibleButtons()
{
foreach (var bigGridCandidate in GhostTeleportContainer.Children)
{
if (bigGridCandidate is not GridContainer bigGrid)
continue;
var anyDepartmentVisible = false;
foreach (var departmentCandidate in bigGrid.Children)
{
if (departmentCandidate is not GridContainer departmentGrid)
continue;
var anyButtonVisible = UpdateButtonsVisibility(departmentGrid);
departmentGrid.Visible = anyButtonVisible;
if (anyButtonVisible)
anyDepartmentVisible = true;
}
bigGrid.Visible = anyDepartmentVisible;
}
}
/// <summary>
/// Динамически скрывает лишние кнопки, которые не содержат введенный в поиске текст
/// Если в найденном контейнере нет ничего возвращает false и весь контейнер скрывается
/// </summary>
/// <param name="departmentGrid">Контейнер, непосредственно содержащий кнопки</param>
/// <returns>Имеет ли переданный контейнер хоть одну кнопку с введенным текстом из поиска</returns>
private bool UpdateButtonsVisibility(GridContainer departmentGrid)
{
var foundVisible = false;
foreach (var child in departmentGrid.Children)
{
if (child is not RichTextButton button)
continue;
var isVisible = ButtonIsVisible(button);
button.Visible = isVisible;
if (isVisible)
foundVisible = true;
}
return foundVisible;
}
/// <summary>
/// Проверяет, содержит ли кнопка введенный в поиске текст
/// </summary>
/// <param name="button">Кнопка для проверки</param>
/// <returns>Содержит ли кнопка введенный текст. Если нет -> кнопка не должна быть видна</returns>
private bool ButtonIsVisible(RichTextButton button)
{
return string.IsNullOrEmpty(_searchText)
|| button.ToolTip == null
|| button.ToolTip.Contains(_searchText, StringComparison.OrdinalIgnoreCase);
}
}