using System;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.IoC;
using Robust.Shared.Localization;
#nullable enable
namespace Content.Client.Construction.UI
{
///
/// This is the interface for a UI View of the construction window. The point of it is to abstract away the actual
/// UI controls and just provide higher level operations on the entire window. This View is completely passive and
/// just raises events to the outside world. This class is controlled by the .
///
public interface IConstructionMenuView : IDisposable
{
// It isn't optimal to expose UI controls like this, but the UI control design is
// questionable so it can't be helped.
string[] Categories { get; set; }
OptionButton CategoryButton { get; }
bool EraseButtonPressed { get; set; }
bool BuildButtonPressed { get; set; }
ItemList Recipes { get; }
ItemList RecipeStepList { get; }
event EventHandler<(string search, string catagory)> PopulateRecipes;
event EventHandler RecipeSelected;
event EventHandler BuildButtonToggled;
event EventHandler EraseButtonToggled;
event EventHandler ClearAllGhosts;
void ClearRecipeInfo();
void SetRecipeInfo(string name, string description, Texture iconTexture, bool isItem);
void ResetPlacement();
#region Window Control
event Action? OnClose;
bool IsOpen { get; }
void OpenCentered();
void MoveToFront();
bool IsAtFront();
void Close();
#endregion
}
[GenerateTypedNameReferences]
public partial class ConstructionMenu : SS14Window, IConstructionMenuView
{
public bool BuildButtonPressed
{
get => BuildButton.Pressed;
set => BuildButton.Pressed = value;
}
public string[] Categories { get; set; } = Array.Empty();
public OptionButton CategoryButton => Category;
public bool EraseButtonPressed
{
get => EraseButton.Pressed;
set => EraseButton.Pressed = value;
}
///
public ItemList Recipes => RecipesList;
public ItemList RecipeStepList => StepList;
public ConstructionMenu()
{
SetSize = MinSize = (720, 320);
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this);
Title = Loc.GetString("Construction");
BuildButton.Text = Loc.GetString("Place construction ghost");
RecipesList.OnItemSelected += obj => RecipeSelected?.Invoke(this, obj.ItemList[obj.ItemIndex]);
RecipesList.OnItemDeselected += _ => RecipeSelected?.Invoke(this, null);
SearchBar.OnTextChanged += _ => PopulateRecipes?.Invoke(this, (SearchBar.Text, Categories[Category.SelectedId]));
Category.OnItemSelected += obj =>
{
Category.SelectId(obj.Id);
PopulateRecipes?.Invoke(this, (SearchBar.Text, Categories[obj.Id]));
};
BuildButton.Text = Loc.GetString("Place construction ghost");
BuildButton.OnToggled += args => BuildButtonToggled?.Invoke(this, args.Pressed);
ClearButton.Text = Loc.GetString("Clear All");
ClearButton.OnPressed += _ => ClearAllGhosts?.Invoke(this, EventArgs.Empty);
EraseButton.Text = Loc.GetString("Eraser Mode");
EraseButton.OnToggled += args => EraseButtonToggled?.Invoke(this, args.Pressed);
}
public event EventHandler? ClearAllGhosts;
public event EventHandler<(string search, string catagory)>? PopulateRecipes;
public event EventHandler? RecipeSelected;
public event EventHandler? BuildButtonToggled;
public event EventHandler? EraseButtonToggled;
public void ResetPlacement()
{
BuildButton.Pressed = false;
EraseButton.Pressed = false;
}
public void SetRecipeInfo(string name, string description, Texture iconTexture, bool isItem)
{
BuildButton.Disabled = false;
BuildButton.Text = Loc.GetString(isItem ? "Place construction ghost" : "Craft");
TargetName.SetMessage(name);
TargetDesc.SetMessage(description);
TargetTexture.Texture = iconTexture;
}
public void ClearRecipeInfo()
{
BuildButton.Disabled = true;
TargetName.SetMessage(string.Empty);
TargetDesc.SetMessage(string.Empty);
TargetTexture.Texture = null;
StepList.Clear();
}
}
}