using Content.Client.Stylesheets;
using Content.Client.UserInterface.Controls;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Utility;
namespace Content.Client.Instruments.UI;
[GenerateTypedNameReferences]
public sealed partial class InstrumentMenu : FancyWindow
{
private InstrumentMidiSourceBase? _currentMode;
public InstrumentMenu()
{
RobustXamlLoader.Load(this);
var styleBox = new StyleBoxFlat
{
BorderThickness = new Thickness(0),
Padding = new Thickness(10),
};
MainTabContainer.PanelStyleBoxOverride = styleBox;
MainTabContainer.SetTabTitle(0, Loc.GetString("instruments-component-menu-play-tab-title"));
MainTabContainer.SetTabTitle(1, Loc.GetString("instruments-component-menu-config-tab-title"));
}
protected override void ExitedTree()
{
base.ExitedTree();
_currentMode?.Disable();
}
///
/// Registers the passed midi source controls as children of this instrument menu and creates a button
/// for each one on the left hand side of the menu.
///
/// The sources to be registered
public void SetupSources(params InstrumentMidiSourceBase[] sources)
{
var group = new ButtonGroup();
for (var i = 0; i < sources.Length; i++)
{
var source = sources[i];
var button = new Button();
button.Text = source.ButtonName;
button.Group = group;
button.OnPressed += _ => { SwitchMode(source); };
MidiSourceButtonsBoxContainer.Children.Add(button);
MidiSourcesContainer.Children.Add(source);
source.VerticalExpand = true;
source.HorizontalExpand = true;
source.Visible = false;
// Set nicer style classes depending on button position.
if (i == 0)
{
button.Pressed = true;
button.StyleClasses.Add("OpenLeft");
}
else if (i == sources.Length - 1)
{
button.StyleClasses.Add("OpenRight");
}
else
{
button.StyleClasses.Add("OpenBoth");
}
}
}
///
/// Takes the given control and registers it as an option for the configuration tab control.
///
/// The string to display on the tab header for this configuration.
/// The control used for this configuration.
/// The new control.
public MidiConfigurationControl AddConfigurationControl(string name, Control ctrl)
{
var formatted = new FormattedMessage();
var cfgCtrl = new MidiConfigurationControl();
ctrl.VerticalExpand = true;
ctrl.Margin = new Thickness(5);
formatted.AddMarkupOrThrow($"[bold]{name}[/bold]");
cfgCtrl.Header.SetMessage(formatted, Color.FromHex("#A88B5E"));
cfgCtrl.Panel.AddChild(ctrl);
ConfigurationItemsContainer.AddChild(cfgCtrl);
return cfgCtrl;
}
///
/// Disables & hides the currently active source control, then enables & shows the given one.
///
/// The source control to enable.
/// The given source must be registered first using the function.
public void SwitchMode(InstrumentMidiSourceBase source)
{
_currentMode?.Disable();
_currentMode = source;
_currentMode.Enable();
}
///
/// When true, overlays the menu with a notice that MIDI is currently not available.
///
/// Set to true when MIDI is available.
/// This should be set to false when MIDI playback is not available on the system.
public void SetMidiAvailability(bool available)
{
UnavailableOverlay.Visible = !available;
}
///
/// Takes an entity with an and displays its sprite on the left hand side.
///
/// The entity to display.
public void SetInstrument(Entity entity)
{
InstrumentSpriteView.SetEntity(entity);
}
}