CatStation/Content.Client/Instruments/UI/InstrumentMidiSourceBase.xaml.cs
Ataman 0c5b250f03
Instrument UI overhaul (#41604)
* Added base type for UI panels of MIDI input sources.

* Renamed BandMenu into BandMidiSource.

* Implemented the UI overhaul, skipping channels dialog functionality for now.

* Refactored for conventions and reordered type members.
Got rid of SetInstrument/ClearInstrument again.

* Decreased background opacity for UnavailableOverlay to improve readability.

* Localization

* Added text to InputMidiSource so players know what it does.

* Changed window MinSize to SetSize. Allows players to reduce window size if desired.

* Improved button looks by adding style classes.

* cleanup

* leftover cleanup

* Reverted fetching InstrumentSystem via IoCManager (crashes it, woops).

* added filter bar to file list

* refactored almost all system/manager interaction into instrument BUI

* text changed for instruments-component-menu-input-notice-label

* fixed InstrumentBoundUserInterface.Dispose not unsubscribing from everything

* minor cleanup

* finished configuration menu & cleanup

* Comments and fixes for InstrumentMidiSourceBase

* Fixed RA0051

* Removed unncecessary null check

* Added methods for accessing the selected track.

* Limited depth of search for instrument master to prevent deadlock.

* Cached system access

* Storing midis asynchronously

* Actual MIDI data now only loaded before playback.

* async removed from InstrumentBoundUserInterface.LoadStoredUserMidis

* Replaced GetComponent calls with TryGetComponent

* Localized MIDI playback track timer

* Searching for next track using raw index now

* Fixed CS0168

* XML comments, minor fixes and disabled MIDI library management while a track is playing.

* removed timers with simple watchdog and switched to MidiFileCollectionManager

* Missed one (timer)

* Changed access for MidiFileCollectionManager.UserMidiDirectory field to public.

* Added instrument config control for MIDI collection utilities.

* redesigned instrument config menu

* Removed rename function, updated adding implementation

* more redesigns

* fixed _isMidiFileDialogueWindowOpen not resetting correctly in certain cases.

* file scoped namespaces

* replaced EntityUid with Entity<InstrumentComponent>

* if spaces

* returning Tooltip instead of Control

* replaced SetEntity with public field

* readonly system fields

* InstrumentMenu MinSize

* xml comment for InstrumentMidiSourceBase

* small refactor

* more cleanup

* TryGetComponent to GetComponent on Open()

* more formatting issues

* switched to [Dependency] for systems

* playback improvements

* disable playback button if no file selected and playing

* activating shuffle now selects track if none is selected

* rearranged playback buttons

* channels overhauled

* Play/Stop label to Play only

* Removed all channel on/off

* Program now default channel name display selection

* improved RemoveButton.Disable behavior

* channels now toggable by clicking anywhere

* Shuffle no longer selects already selected track.

* Loop & Shuffle no longer both selectable at once

* minor improvements to channel item visuals

* minor channel toggle fixes

* xml docs & code cleanup

* `RefreshBandRequest` now sent automatically when band source becomes visible

* converted 5 items tuple to MidiChannelInfo record

* added markup support to instrument menu configuration header

* added note to midi channels config header explaining update behavior.
2026-07-26 16:50:28 +00:00

51 lines
1.6 KiB
C#

using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client.Instruments.UI;
/// <summary>
/// A type of <see cref="BoxContainer" /> to be added to the <see cref="InstrumentMenu" /> for displaying and handling
/// all necessary controls regarding a certain type of MIDI input (i.e.: Files, Bands, Hardware input).
/// Must be initialized and registered to the menu inside <see cref="InstrumentBoundUserInterface" />.
/// </summary>
[GenerateTypedNameReferences]
public abstract partial class InstrumentMidiSourceBase : BoxContainer
{
/// <summary>
/// The string to display for the button on the left side of the instrument UI.
/// </summary>
public virtual string ButtonName { get; } = Loc.GetString("instruments-component-menu-unknown-midi-source-button");
/// <summary>
/// Returns true if this source is currently the active one.
/// </summary>
protected bool Enabled { get; private set; }
protected InstrumentMidiSourceBase()
{
RobustXamlLoader.Load(this);
}
/// <summary>
/// Override if the source requires additional handling to become enabled.
/// i.e.: Opening MIDI-Input.
/// </summary>
[MustCallBase]
public virtual void Enable()
{
Visible = true;
Enabled = true;
}
/// <summary>
/// Override if the source requires additional handling on being disabled.
/// i.e.: Closing MIDI-Input.
/// </summary>
[MustCallBase]
public virtual void Disable()
{
Enabled = false;
Visible = false;
}
}