]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Minimalist Action Bar (#21352)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Tue, 14 Nov 2023 03:27:14 +0000 (22:27 -0500)
committerGitHub <noreply@github.com>
Tue, 14 Nov 2023 03:27:14 +0000 (22:27 -0500)
12 files changed:
Content.Client/Input/ContentContexts.cs
Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs
Content.Client/UserInterface/Screens/DefaultGameScreen.xaml
Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs
Content.Client/UserInterface/Screens/SeparatedChatGameScreen.xaml.cs
Content.Client/UserInterface/Systems/Actions/ActionUIController.cs
Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs
Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs
Content.Client/UserInterface/Systems/Actions/Widgets/ActionsBar.xaml
Content.Client/UserInterface/Systems/Actions/Widgets/ActionsBar.xaml.cs
Content.Shared/Input/ContentKeyFunctions.cs
Resources/keybinds.yml

index 8efd977b20690d39a1a4141309a3be426b40ed9a..ba8b72788e65a2b0e59d4aa6ad81dc4ff33e8ad8 100644 (file)
@@ -80,11 +80,6 @@ namespace Content.Client.Input
                 common.AddFunction(boundKey);
             }
 
-            foreach (var boundKey in ContentKeyFunctions.GetLoadoutBoundKeys())
-            {
-                common.AddFunction(boundKey);
-            }
-
             var aghost = contexts.New("aghost", "common");
             aghost.AddFunction(EngineKeyFunctions.MoveUp);
             aghost.AddFunction(EngineKeyFunctions.MoveDown);
index c68e7f3af95ee2d1832217fbcc169a7676610b3f..87b1f10352f58529d36736ac41297b882a99ea9e 100644 (file)
@@ -224,10 +224,6 @@ namespace Content.Client.Options.UI.Tabs
             {
                 AddButton(boundKey);
             }
-            foreach (var boundKey in ContentKeyFunctions.GetLoadoutBoundKeys())
-            {
-                AddButton(boundKey);
-            }
 
             AddHeader("ui-options-header-shuttle");
             AddButton(ContentKeyFunctions.ShuttleStrafeUp);
index 8b502515c93b96279e8ba5ee1334cf461ab7d48f..5c09574005b9c0e10e513581bea21fc43f3fab63 100644 (file)
             <Control/>
         </BoxContainer>
         <BoxContainer Name="VoteMenu" Access="Public" Margin="0 10 0 10" Orientation="Vertical"/>
+        <actions:ActionsBar Name="Actions" Access="Protected" />
     </BoxContainer>
     <widgets:GhostGui Name="Ghost" Access="Protected" />
     <hotbar:HotbarGui Name="Hotbar" Access="Protected" />
-    <actions:ActionsBar Name="Actions" Access="Protected" />
     <chat:ResizableChatBox Name="Chat" Access="Protected" />
     <alerts:AlertsUI Name="Alerts" Access="Protected" />
 </screens:DefaultGameScreen>
index c35d831035e01afad29e38bb715b08a3b5e2f617..a8a53e83c786932f8d91eb7d484b3f4fc7308112 100644 (file)
@@ -17,7 +17,6 @@ public sealed partial class DefaultGameScreen : InGameScreen
         SetAnchorPreset(MainViewport, LayoutPreset.Wide);
         SetAnchorPreset(ViewportContainer, LayoutPreset.Wide);
         SetAnchorAndMarginPreset(TopLeft, LayoutPreset.TopLeft, margin: 10);
-        SetAnchorAndMarginPreset(Actions, LayoutPreset.BottomLeft, margin: 10);
         SetAnchorAndMarginPreset(Ghost, LayoutPreset.BottomWide, margin: 80);
         SetAnchorAndMarginPreset(Hotbar, LayoutPreset.BottomWide, margin: 5);
         SetAnchorAndMarginPreset(Chat, LayoutPreset.TopRight, margin: 10);
@@ -25,6 +24,7 @@ public sealed partial class DefaultGameScreen : InGameScreen
 
         Chat.OnResized += ChatOnResized;
         Chat.OnChatResizeFinish += ChatOnResizeFinish;
+        Actions.ActionsContainer.Columns = 1;
     }
 
     private void ChatOnResizeFinish(Vector2 _)
index 41c4a85e7eecdb142d333368dc472541f4d97aaf..e0c66b7a8bb43afa99137decb4ad4af7e21eca5f 100644 (file)
@@ -19,7 +19,7 @@ public sealed partial class SeparatedChatGameScreen : InGameScreen
         SetAnchorPreset(ViewportContainer, LayoutPreset.Wide);
         SetAnchorPreset(MainViewport, LayoutPreset.Wide);
         SetAnchorAndMarginPreset(VoteMenu, LayoutPreset.TopLeft, margin: 10);
-        SetAnchorAndMarginPreset(Actions, LayoutPreset.BottomLeft, margin: 10);
+        SetAnchorAndMarginPreset(Actions, LayoutPreset.TopLeft, margin: 10);
         SetAnchorAndMarginPreset(Ghost, LayoutPreset.BottomWide, margin: 80);
         SetAnchorAndMarginPreset(Hotbar, LayoutPreset.BottomWide, margin: 5);
         SetAnchorAndMarginPreset(Alerts, LayoutPreset.CenterRight, margin: 10);
index 340aa5447ddea6fbc47071c3cea28e0ce699db1a..5a992786a29ba06a08065445c98d38df82e7a5c9 100644 (file)
@@ -1,6 +1,5 @@
 using System.Linq;
 using System.Numerics;
-using System.Runtime.InteropServices;
 using Content.Client.Actions;
 using Content.Client.Construction;
 using Content.Client.Gameplay;
@@ -49,17 +48,14 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
     [UISystemDependency] private readonly TargetOutlineSystem? _targetOutline = default;
     [UISystemDependency] private readonly SpriteSystem _spriteSystem = default!;
 
-    private const int DefaultPageIndex = 0;
     private ActionButtonContainer? _container;
-    private readonly List<ActionPage> _pages = new();
-    private int _currentPageIndex = DefaultPageIndex;
+    private readonly List<EntityUid?> _actions = new();
     private readonly DragDropHelper<ActionButton> _menuDragHelper;
     private readonly TextureRect _dragShadow;
     private ActionsWindow? _window;
 
     private ActionsBar? ActionsBar => UIManager.GetActiveUIWidgetOrNull<ActionsBar>();
     private MenuButton? ActionButton => UIManager.GetActiveUIWidgetOrNull<MenuBar.Widgets.GameTopMenuBar>()?.ActionButton;
-    private ActionPage CurrentPage => _pages[_currentPageIndex];
 
     public bool IsDragging => _menuDragHelper.IsDragging;
 
@@ -79,14 +75,6 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
             SetSize = new Vector2(64, 64),
             MouseFilter = MouseFilterMode.Ignore
         };
-
-        var pageCount = ContentKeyFunctions.GetLoadoutBoundKeys().Length;
-        var buttonCount = ContentKeyFunctions.GetHotbarBoundKeys().Length;
-        for (var i = 0; i < pageCount; i++)
-        {
-            var page = new ActionPage(buttonCount);
-            _pages.Add(page);
-        }
     }
 
     public override void Initialize()
@@ -139,15 +127,6 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
             }, false, true));
         }
 
-        var loadoutKeys = ContentKeyFunctions.GetLoadoutBoundKeys();
-        for (var i = 0; i < loadoutKeys.Length; i++)
-        {
-            var boundId = i; // This is needed, because the lambda captures it.
-            var boundKey = loadoutKeys[i];
-            builder = builder.Bind(boundKey,
-                InputCmdHandler.FromDelegate(_ => ChangePage(boundId)));
-        }
-
         builder
             .Bind(ContentKeyFunctions.OpenActionsMenu,
                 InputCmdHandler.FromDelegate(_ => ToggleWindow()))
@@ -178,7 +157,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         if (!_timing.IsFirstTimePredicted || _actionsSystem == null || SelectingTargetFor is not { } actionId)
             return false;
 
-        if (_playerManager.LocalPlayer?.ControlledEntity is not { } user)
+        if (_playerManager.LocalEntity is not { } user)
             return false;
 
         if (!EntityManager.TryGetComponent(user, out ActionsComponent? comp))
@@ -332,76 +311,16 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
     private void TriggerAction(int index)
     {
         if (_actionsSystem == null ||
-            CurrentPage[index] is not { } actionId ||
+            !_actions.TryGetValue(index, out var actionId) ||
             !_actionsSystem.TryGetActionData(actionId, out var baseAction))
         {
             return;
         }
 
         if (baseAction is BaseTargetActionComponent action)
-            ToggleTargeting(actionId, action);
+            ToggleTargeting(actionId.Value, action);
         else
-            _actionsSystem?.TriggerAction(actionId, baseAction);
-    }
-
-    private void ChangePage(int index)
-    {
-        if (_actionsSystem == null)
-            return;
-
-        var lastPage = _pages.Count - 1;
-        if (index < 0)
-        {
-            index = lastPage;
-        }
-        else if (index > lastPage)
-        {
-            index = 0;
-        }
-
-        _currentPageIndex = index;
-        var page = _pages[_currentPageIndex];
-        _container?.SetActionData(_actionsSystem, page);
-
-        ActionsBar!.PageButtons.Label.Text = $"{_currentPageIndex + 1}";
-    }
-
-    private void OnLeftArrowPressed(ButtonEventArgs args)
-    {
-        ChangePage(_currentPageIndex - 1);
-    }
-
-    private void OnRightArrowPressed(ButtonEventArgs args)
-    {
-        ChangePage(_currentPageIndex + 1);
-    }
-
-    private void AppendAction(EntityUid action)
-    {
-        if (_container == null)
-            return;
-
-        foreach (var button in _container.GetButtons())
-        {
-            if (button.ActionId != null)
-                continue;
-
-            SetAction(button, action);
-            return;
-        }
-
-        foreach (var page in _pages)
-        {
-            for (var i = 0; i < page.Size; i++)
-            {
-                var pageAction = page[i];
-                if (pageAction != null)
-                    continue;
-
-                page[i] = action;
-                return;
-            }
-        }
+            _actionsSystem?.TriggerAction(actionId.Value, baseAction);
     }
 
     private void OnActionAdded(EntityUid actionId)
@@ -416,18 +335,10 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         if (action is BaseTargetActionComponent targetAction && action.Toggled)
             StartTargeting(actionId, targetAction);
 
-        foreach (var page in _pages)
-        {
-            for (var i = 0; i < page.Size; i++)
-            {
-                if (page[i] == actionId)
-                {
-                    return;
-                }
-            }
-        }
+        if (_actions.Contains(actionId))
+            return;
 
-        AppendAction(actionId);
+        _actions.Add(actionId);
     }
 
     private void OnActionRemoved(EntityUid actionId)
@@ -435,40 +346,18 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         if (_container == null)
             return;
 
-        // stop targeting if the action is removed
         if (actionId == SelectingTargetFor)
             StopTargeting();
 
-        foreach (var button in _container.GetButtons())
-        {
-            if (button.ActionId == actionId)
-            {
-                SetAction(button, null);
-            }
-        }
-
-        foreach (var page in _pages)
-        {
-            for (var i = 0; i < page.Size; i++)
-            {
-                if (page[i] == actionId)
-                {
-                    page[i] = null;
-                }
-            }
-        }
+        _actions.RemoveAll(x => x == actionId);
     }
 
     private void OnActionsUpdated()
     {
         QueueWindowUpdate();
-        if (_container == null)
-            return;
 
-        foreach (var button in _container.GetButtons())
-        {
-            button.UpdateIcons();
-        }
+        if (_actionsSystem != null)
+            _container?.SetActionData(_actionsSystem, _actions.ToArray());
     }
 
     private void ActionButtonPressed(ButtonEventArgs args)
@@ -512,8 +401,8 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         return filter switch
         {
             Filters.Enabled => action.Enabled,
-            Filters.Item => action.Container != null && action.Container != _playerManager.LocalPlayer?.ControlledEntity,
-            Filters.Innate => action.Container == null || action.Container == _playerManager.LocalPlayer?.ControlledEntity,
+            Filters.Item => action.Container != null && action.Container != _playerManager.LocalEntity,
+            Filters.Innate => action.Container == null || action.Container == _playerManager.LocalEntity,
             Filters.Instant => action is InstantActionComponent,
             Filters.Targeted => action is BaseTargetActionComponent,
             _ => throw new ArgumentOutOfRangeException(nameof(filter), filter, null)
@@ -580,7 +469,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         if (_actionsSystem == null)
             return;
 
-        if (_playerManager.LocalPlayer?.ControlledEntity is not { } player)
+        if (_playerManager.LocalEntity is not { } player)
             return;
 
         var search = _window.SearchBar.Text;
@@ -615,7 +504,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         PopulateActions(actions);
     }
 
-    private void SetAction(ActionButton button, EntityUid? actionId)
+    private void SetAction(ActionButton button, EntityUid? actionId, bool updateSlots = true)
     {
         if (_actionsSystem == null)
             return;
@@ -627,22 +516,30 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
             button.ClearData();
             if (_container?.TryGetButtonIndex(button, out position) ?? false)
             {
-                CurrentPage[position] = actionId;
+                _actions.RemoveAt(position);
             }
-
-            return;
         }
-
-        if (button.TryReplaceWith(actionId.Value, _actionsSystem) &&
+        else if (button.TryReplaceWith(actionId.Value, _actionsSystem) &&
             _container != null &&
             _container.TryGetButtonIndex(button, out position))
         {
-            CurrentPage[position] = actionId;
+            if (position >= _actions.Count)
+            {
+                _actions.Add(actionId);
+            }
+            else
+            {
+                _actions[position] = actionId;
+            }
         }
+
+        if (updateSlots)
+            _container?.SetActionData(_actionsSystem, _actions.ToArray());
     }
 
     private void DragAction()
     {
+        EntityUid? swapAction = null;
         if (UIManager.CurrentlyHovered is ActionButton button)
         {
             if (!_menuDragHelper.IsDragging || _menuDragHelper.Dragged?.ActionId is not { } type)
@@ -651,14 +548,18 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
                 return;
             }
 
-            SetAction(button, type);
+            swapAction = button.ActionId;
+            SetAction(button, type, false);
         }
 
         if (_menuDragHelper.Dragged is {Parent: ActionButtonContainer} old)
         {
-            SetAction(old, null);
+            SetAction(old, swapAction, false);
         }
 
+        if (_actionsSystem != null)
+            _container?.SetActionData(_actionsSystem, _actions.ToArray());
+
         _menuDragHelper.EndDrag();
     }
 
@@ -737,6 +638,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         if (args.Function != EngineKeyFunctions.UIClick || _actionsSystem == null)
             return;
 
+        //todo: make dragging onto the same spot NOT trigger again
         if (UIManager.CurrentlyHovered == button)
         {
             _menuDragHelper.EndDrag();
@@ -813,9 +715,6 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
             return;
         }
 
-        ActionsBar.PageButtons.LeftArrow.OnPressed -= OnLeftArrowPressed;
-        ActionsBar.PageButtons.RightArrow.OnPressed -= OnRightArrowPressed;
-
         if (_window != null)
         {
             _window.OnOpen -= OnWindowOpened;
@@ -846,9 +745,6 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
             return;
         }
 
-        ActionsBar.PageButtons.LeftArrow.OnPressed += OnLeftArrowPressed;
-        ActionsBar.PageButtons.RightArrow.OnPressed += OnRightArrowPressed;
-
         RegisterActionContainer(ActionsBar.ActionsContainer);
 
         _actionsSystem?.LinkAllActions();
@@ -856,12 +752,6 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
 
     public void RegisterActionContainer(ActionButtonContainer container)
     {
-        if (_container != null)
-        {
-            _container.ActionPressed -= OnActionPressed;
-            _container.ActionUnpressed -= OnActionPressed;
-        }
-
         _container = container;
         _container.ActionPressed += OnActionPressed;
         _container.ActionUnpressed += OnActionUnpressed;
@@ -877,12 +767,12 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         if (_actionsSystem == null)
             return;
 
-        foreach (ref var assignment in CollectionsMarshal.AsSpan(assignments))
+        for (var i = 0; i < assignments.Count; i++)
         {
-            _pages[assignment.Hotbar][assignment.Slot] = assignment.ActionId;
+            _actions[i] = assignments[i].ActionId;
         }
 
-        _container?.SetActionData(_actionsSystem, _pages[_currentPageIndex]);
+        _container?.SetActionData(_actionsSystem, _actions.ToArray());
     }
 
     public void RemoveActionContainer()
@@ -918,8 +808,8 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         if (_actionsSystem == null)
             return;
 
-        LoadDefaultActions(component);
-        _container?.SetActionData(_actionsSystem, _pages[DefaultPageIndex]);
+        LoadDefaultActions();
+        _container?.SetActionData(_actionsSystem, _actions.ToArray());
         QueueWindowUpdate();
     }
 
@@ -930,7 +820,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         StopTargeting();
     }
 
-    private void LoadDefaultActions(ActionsComponent component)
+    private void LoadDefaultActions()
     {
         if (_actionsSystem == null)
             return;
@@ -938,36 +828,11 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         var actions = _actionsSystem.GetClientActions().Where(action => action.Comp.AutoPopulate).ToList();
         actions.Sort(ActionComparer);
 
-        var offset = 0;
-        var totalPages = _pages.Count;
-        var pagesLeft = totalPages;
-        var currentPage = DefaultPageIndex;
-        while (pagesLeft > 0)
+        _actions.Clear();
+        foreach (var (action, _) in actions)
         {
-            var page = _pages[currentPage];
-            var pageSize = page.Size;
-
-            for (var slot = 0; slot < pageSize; slot++)
-            {
-                var actionIndex = slot + offset;
-                if (actionIndex < actions.Count)
-                {
-                    page[slot] = actions[slot + offset].Id;
-                }
-                else
-                {
-                    page[slot] = null;
-                }
-            }
-
-            offset += pageSize;
-            currentPage++;
-            if (currentPage == totalPages)
-            {
-                currentPage = 0;
-            }
-
-            pagesLeft--;
+            if (!_actions.Contains(action))
+                _actions.Add(action);
         }
     }
 
@@ -1078,34 +943,4 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         handOverlay.IconOverride = null;
         handOverlay.EntityOverride = null;
     }
-
-
-    //TODO: Serialize this shit
-    private sealed class ActionPage
-    {
-        private readonly EntityUid?[] _data;
-
-        public ActionPage(int size)
-        {
-            _data = new EntityUid?[size];
-        }
-
-        public EntityUid? this[int index]
-        {
-            get => _data[index];
-            set => _data[index] = value;
-        }
-
-        public static implicit operator EntityUid?[](ActionPage p)
-        {
-            return p._data.ToArray();
-        }
-
-        public void Clear()
-        {
-            Array.Fill(_data, null);
-        }
-
-        public int Size => _data.Length;
-    }
 }
index 31c5a28e520cadf09c5d2fadeaa530d06ac0e700..6b2033e78c0e4ecc76f73d115df1ca297a258a8f 100644 (file)
@@ -49,6 +49,8 @@ public sealed class ActionButton : Control, IEntityControl
     private readonly SpriteView _smallItemSpriteView;
     private readonly SpriteView _bigItemSpriteView;
 
+    private Texture? _buttonBackgroundTexture;
+
     public EntityUid? ActionId { get; private set; }
     private BaseActionComponent? _action;
     public bool Locked { get; set; }
@@ -138,9 +140,9 @@ public sealed class ActionButton : Control, IEntityControl
         });
         Cooldown = new CooldownGraphic {Visible = false};
 
+        AddChild(Button);
         AddChild(_bigActionIcon);
         AddChild(_bigItemSpriteView);
-        AddChild(Button);
         AddChild(HighlightRect);
         AddChild(Label);
         AddChild(Cooldown);
@@ -167,7 +169,7 @@ public sealed class ActionButton : Control, IEntityControl
     protected override void OnThemeUpdated()
     {
         base.OnThemeUpdated();
-        Button.Texture = Theme.ResolveTexture("SlotBackground");
+        _buttonBackgroundTexture = Theme.ResolveTexture("SlotBackground");
         Label.FontColorOverride = Theme.ResolveColorOrSpecified("whiteText");
     }
 
@@ -263,6 +265,7 @@ public sealed class ActionButton : Control, IEntityControl
     public void UpdateIcons()
     {
         UpdateItemIcon();
+        UpdateBackground();
 
         if (_action == null)
         {
@@ -278,6 +281,18 @@ public sealed class ActionButton : Control, IEntityControl
             SetActionIcon(_action.Icon != null ? _spriteSys.Frame0(_action.Icon) : null);
     }
 
+    public void UpdateBackground()
+    {
+        if (_action == null)
+        {
+            Button.Texture = null;
+        }
+        else
+        {
+            Button.Texture = _buttonBackgroundTexture;
+        }
+    }
+
     public bool TryReplaceWith(EntityUid actionId, ActionsSystem system)
     {
         if (Locked)
@@ -363,7 +378,8 @@ public sealed class ActionButton : Control, IEntityControl
 
     public void DrawModeChanged()
     {
-        HighlightRect.Visible = _beingHovered;
+        _controller ??= UserInterfaceManager.GetUIController<ActionUIController>();
+        HighlightRect.Visible = _beingHovered && (_action != null || _controller.IsDragging);
 
         // always show the normal empty button style if no action in this slot
         if (_action == null)
@@ -373,8 +389,7 @@ public sealed class ActionButton : Control, IEntityControl
         }
 
         // show a hover only if the action is usable or another action is being dragged on top of this
-        _controller ??= UserInterfaceManager.GetUIController<ActionUIController>();
-        if (_beingHovered && (_controller.IsDragging || _action.Enabled))
+        if (_beingHovered && (_controller.IsDragging || _action!.Enabled))
         {
             SetOnlyStylePseudoClass(ContainerButton.StylePseudoClassHover);
         }
index 9986c61ad6367776631042a8c8e5848c6cc591e2..5e26c192d7c06d9835141cfb2249c125a7fa76cb 100644 (file)
@@ -1,12 +1,19 @@
+using System.Linq;
 using Content.Client.Actions;
+using Content.Shared.Input;
+using Robust.Client.Input;
 using Robust.Client.UserInterface;
 using Robust.Client.UserInterface.Controls;
+using Robust.Shared.Utility;
 
 namespace Content.Client.UserInterface.Systems.Actions.Controls;
 
 [Virtual]
 public class ActionButtonContainer : GridContainer
 {
+    [Dependency] private readonly IEntityManager _entity = default!;
+    [Dependency] private readonly IInputManager _input = default!;
+
     public event Action<GUIBoundKeyEventArgs, ActionButton>? ActionPressed;
     public event Action<GUIBoundKeyEventArgs, ActionButton>? ActionUnpressed;
     public event Action<ActionButton>? ActionFocusExited;
@@ -14,7 +21,6 @@ public class ActionButtonContainer : GridContainer
     public ActionButtonContainer()
     {
         IoCManager.InjectDependencies(this);
-        UserInterfaceManager.GetUIController<ActionUIController>().RegisterActionContainer(this);
     }
 
     public ActionButton this[int index]
@@ -22,17 +28,42 @@ public class ActionButtonContainer : GridContainer
         get => (ActionButton) GetChild(index);
     }
 
-    public void SetActionData(ActionsSystem system, params EntityUid?[] actionTypes)
+    private void BuildActionButtons(int count)
     {
-        ClearActionData();
+        var keys = ContentKeyFunctions.GetHotbarBoundKeys();
 
-        for (var i = 0; i < actionTypes.Length; i++)
+        Children.Clear();
+        for (var index = 0; index < count; index++)
         {
-            var action = actionTypes[i];
-            if (action == null)
-                continue;
+            Children.Add(MakeButton(index));
+        }
+
+        ActionButton MakeButton(int index)
+        {
+            var button = new ActionButton(_entity);
+
+            if (keys.TryGetValue(index, out var boundKey))
+            {
+                button.KeyBind = boundKey;
+
+                var binding = _input.GetKeyBinding(boundKey);
+                button.Label.Text = binding.GetKeyString();
+            }
 
-            ((ActionButton) GetChild(i)).UpdateData(action.Value, system);
+            return button;
+        }
+    }
+
+    public void SetActionData(ActionsSystem system, params EntityUid?[] actionTypes)
+    {
+        var uniqueCount = Math.Min(system.GetClientActions().Count(), actionTypes.Length + 1);
+        BuildActionButtons(uniqueCount);
+
+        for (var i = 0; i < uniqueCount; i++)
+        {
+            if (!actionTypes.TryGetValue(i, out var action))
+                action = null;
+            ((ActionButton) GetChild(i)).UpdateData(action, system);
         }
     }
 
index 7e4d60a0571ea6fb0bdef7354906940a19bff998..1d317f6155d506bd98ed55ef6fe529834162ebae 100644 (file)
@@ -13,7 +13,7 @@
             VerticalAlignment="Center"
             MaxSize="64 9999"
             Name="ActionsContainer"
-            Access="Public"/>
-        <controls:ActionPageButtons Name="PageButtons" Access="Public"/>
+            Access="Public"
+            Rows="1"/>
     </BoxContainer>
 </widgets:ActionsBar>
index ff3c32cc0e6beefdefcd0c21a36e8d5289abd207..8e95992ff646a7efabf45233da567b6a98b8f18e 100644 (file)
@@ -1,6 +1,4 @@
-using Content.Client.UserInterface.Systems.Actions.Controls;
-using Content.Shared.Input;
-using Robust.Client.AutoGenerated;
+using Robust.Client.AutoGenerated;
 using Robust.Client.UserInterface.Controls;
 using Robust.Client.UserInterface.XAML;
 
@@ -9,28 +7,9 @@ namespace Content.Client.UserInterface.Systems.Actions.Widgets;
 [GenerateTypedNameReferences]
 public sealed partial class ActionsBar : UIWidget
 {
-    [Dependency] private readonly IEntityManager _entity = default!;
-
     public ActionsBar()
     {
         RobustXamlLoader.Load(this);
-        IoCManager.InjectDependencies(this);
-
-        var keys = ContentKeyFunctions.GetHotbarBoundKeys();
-        for (var index = 1; index < keys.Length; index++)
-        {
-            ActionsContainer.Children.Add(MakeButton(index));
-        }
-        ActionsContainer.Children.Add(MakeButton(0));
-
-        ActionButton MakeButton(int index)
-        {
-            var boundKey = keys[index];
-            var button = new ActionButton(_entity);
-            button.KeyBind = boundKey;
-            button.Label.Text = index.ToString();
-            return button;
-        }
     }
 }
 
index 840320b0d3b89f1ac8c6b00cc2693b86b027ff09..f4307cd058c5d5bac4892168dca8f9a48ec37aca 100644 (file)
@@ -84,23 +84,6 @@ namespace Content.Shared.Input
                 Hotbar1, Hotbar2, Hotbar3, Hotbar4, Hotbar5, Hotbar6, Hotbar7, Hotbar8, Hotbar9, Hotbar0
             };
 
-        public static readonly BoundKeyFunction Loadout0 = "Loadout0";
-        public static readonly BoundKeyFunction Loadout1 = "Loadout1";
-        public static readonly BoundKeyFunction Loadout2 = "Loadout2";
-        public static readonly BoundKeyFunction Loadout3 = "Loadout3";
-        public static readonly BoundKeyFunction Loadout4 = "Loadout4";
-        public static readonly BoundKeyFunction Loadout5 = "Loadout5";
-        public static readonly BoundKeyFunction Loadout6 = "Loadout6";
-        public static readonly BoundKeyFunction Loadout7 = "Loadout7";
-        public static readonly BoundKeyFunction Loadout8 = "Loadout8";
-        public static readonly BoundKeyFunction Loadout9 = "Loadout9";
-
-        public static BoundKeyFunction[] GetLoadoutBoundKeys() =>
-            new[]
-            {
-                Loadout1, Loadout2, Loadout3, Loadout4, Loadout5, Loadout6, Loadout7, Loadout8, Loadout9, Loadout0
-            };
-
         public static readonly BoundKeyFunction Vote0 = "Vote0";
         public static readonly BoundKeyFunction Vote1 = "Vote1";
         public static readonly BoundKeyFunction Vote2 = "Vote2";
index 1b82435861aa65a1247ea7c029084696b439a5f9..b3ba05def2628eebfcf42c0a802b28d3f4fc8221 100644 (file)
@@ -510,43 +510,3 @@ binds:
 - function: Hotbar9
   type: State
   key: Num9
-- function: Loadout0
-  type: State
-  key: Num0
-  mod1: Shift
-- function: Loadout1
-  type: State
-  key: Num1
-  mod1: Shift
-- function: Loadout2
-  type: State
-  key: Num2
-  mod1: Shift
-- function: Loadout3
-  type: State
-  key: Num3
-  mod1: Shift
-- function: Loadout4
-  type: State
-  key: Num4
-  mod1: Shift
-- function: Loadout5
-  type: State
-  key: Num5
-  mod1: Shift
-- function: Loadout6
-  type: State
-  key: Num6
-  mod1: Shift
-- function: Loadout7
-  type: State
-  key: Num7
-  mod1: Shift
-- function: Loadout8
-  type: State
-  key: Num8
-  mod1: Shift
-- function: Loadout9
-  type: State
-  key: Num9
-  mod1: Shift