mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-15 03:30:53 +01:00
* hidden tiles * Update TileSpawningUIController.cs * Update TileSpawningUIController.cs * Update ITileDefinition.cs * Update TileSpawningUIController.cs * Move EditorHidden where clause out * Make EditorHidden a DIM So there's no breaking change * Release notes. --------- Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
160 lines
4.5 KiB
C#
160 lines
4.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Robust.Client.Graphics;
|
|
using Robust.Client.Placement;
|
|
using Robust.Client.ResourceManagement;
|
|
using Robust.Client.UserInterface.Controls;
|
|
using Robust.Client.UserInterface.CustomControls;
|
|
using Robust.Shared.Enums;
|
|
using Robust.Shared.Graphics;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Localization;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.Utility;
|
|
using static Robust.Client.UserInterface.Controls.BaseButton;
|
|
|
|
namespace Robust.Client.UserInterface.Controllers.Implementations;
|
|
|
|
public sealed class TileSpawningUIController : UIController
|
|
{
|
|
[Dependency] private readonly IPlacementManager _placement = default!;
|
|
[Dependency] private readonly IResourceCache _resources = default!;
|
|
[Dependency] private readonly ITileDefinitionManager _tiles = default!;
|
|
|
|
private TileSpawnWindow? _window;
|
|
private bool _init;
|
|
|
|
private readonly List<ITileDefinition> _shownTiles = new();
|
|
private bool _clearingTileSelections;
|
|
|
|
public override void Initialize()
|
|
{
|
|
DebugTools.Assert(_init == false);
|
|
_init = true;
|
|
_placement.PlacementChanged += ClearTileSelection;
|
|
}
|
|
|
|
public void ToggleWindow()
|
|
{
|
|
EnsureWindow();
|
|
|
|
if (_window!.IsOpen)
|
|
{
|
|
_window.Close();
|
|
}
|
|
else
|
|
{
|
|
_window.Open();
|
|
}
|
|
}
|
|
|
|
private void EnsureWindow()
|
|
{
|
|
if (_window is { Disposed: false })
|
|
return;
|
|
_window = UIManager.CreateWindow<TileSpawnWindow>();
|
|
LayoutContainer.SetAnchorPreset(_window,LayoutContainer.LayoutPreset.CenterLeft);
|
|
_window.SearchBar.GrabKeyboardFocus();
|
|
_window.ClearButton.OnPressed += OnTileClearPressed;
|
|
_window.SearchBar.OnTextChanged += OnTileSearchChanged;
|
|
_window.TileList.OnItemSelected += OnTileItemSelected;
|
|
_window.TileList.OnItemDeselected += OnTileItemDeselected;
|
|
BuildTileList();
|
|
}
|
|
|
|
public void CloseWindow()
|
|
{
|
|
if (_window == null || _window.Disposed) return;
|
|
|
|
_window?.Close();
|
|
}
|
|
|
|
private void ClearTileSelection(object? sender, EventArgs e)
|
|
{
|
|
if (_window == null || _window.Disposed) return;
|
|
_clearingTileSelections = true;
|
|
_window.TileList.ClearSelected();
|
|
_clearingTileSelections = false;
|
|
}
|
|
|
|
private void OnTileClearPressed(ButtonEventArgs args)
|
|
{
|
|
if (_window == null || _window.Disposed) return;
|
|
|
|
_window.TileList.ClearSelected();
|
|
_placement.Clear();
|
|
_window.SearchBar.Clear();
|
|
BuildTileList(string.Empty);
|
|
_window.ClearButton.Disabled = true;
|
|
}
|
|
|
|
private void OnTileSearchChanged(LineEdit.LineEditEventArgs args)
|
|
{
|
|
if (_window == null || _window.Disposed) return;
|
|
|
|
_window.TileList.ClearSelected();
|
|
_placement.Clear();
|
|
BuildTileList(args.Text);
|
|
_window.ClearButton.Disabled = string.IsNullOrEmpty(args.Text);
|
|
}
|
|
|
|
private void OnTileItemSelected(ItemList.ItemListSelectedEventArgs args)
|
|
{
|
|
var definition = _shownTiles[args.ItemIndex];
|
|
|
|
var newObjInfo = new PlacementInformation
|
|
{
|
|
PlacementOption = "AlignTileAny",
|
|
TileType = definition.TileId,
|
|
Range = 400,
|
|
IsTile = true
|
|
};
|
|
|
|
_placement.BeginPlacing(newObjInfo);
|
|
}
|
|
|
|
private void OnTileItemDeselected(ItemList.ItemListDeselectedEventArgs args)
|
|
{
|
|
if (_clearingTileSelections)
|
|
{
|
|
return;
|
|
}
|
|
|
|
_placement.Clear();
|
|
}
|
|
|
|
private void BuildTileList(string? searchStr = null)
|
|
{
|
|
if (_window == null || _window.Disposed) return;
|
|
|
|
_window.TileList.Clear();
|
|
|
|
IEnumerable<ITileDefinition> tileDefs = _tiles.Where(def => !def.EditorHidden);
|
|
|
|
if (!string.IsNullOrEmpty(searchStr))
|
|
{
|
|
tileDefs = tileDefs.Where(s =>
|
|
Loc.GetString(s.Name).Contains(searchStr, StringComparison.CurrentCultureIgnoreCase) ||
|
|
s.ID.Contains(searchStr, StringComparison.OrdinalIgnoreCase));
|
|
}
|
|
|
|
tileDefs = tileDefs.OrderBy(d => Loc.GetString(d.Name));
|
|
|
|
_shownTiles.Clear();
|
|
_shownTiles.AddRange(tileDefs);
|
|
|
|
foreach (var entry in _shownTiles)
|
|
{
|
|
Texture? texture = null;
|
|
var path = entry.Sprite?.ToString();
|
|
|
|
if (path != null)
|
|
{
|
|
texture = _resources.GetResource<TextureResource>(path);
|
|
}
|
|
_window.TileList.AddItem(Loc.GetString(entry.Name), texture);
|
|
}
|
|
}
|
|
}
|