]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Airlock painter fixes (#13877)
authorjicksaw <jicksaw@pm.me>
Sun, 5 Feb 2023 20:22:36 +0000 (22:22 +0200)
committerGitHub <noreply@github.com>
Sun, 5 Feb 2023 20:22:36 +0000 (13:22 -0700)
fix undefined

Content.Client/AirlockPainter/UI/AirlockPainterBoundUserInterface.cs
Content.Client/AirlockPainter/UI/AirlockPainterWindow.xaml
Content.Client/AirlockPainter/UI/AirlockPainterWindow.xaml.cs
Content.Shared/AirlockPainter/SharedAirlockPainterSystem.cs

index 12c8de926ea54a795a4dd3a45de35b448317ae14..62ded3ecb328195e95cc5d31805e1ed1b05c73f9 100644 (file)
@@ -1,12 +1,15 @@
 using Content.Shared.AirlockPainter;
 using Robust.Client.GameObjects;
+using Robust.Client.UserInterface.Controls;
 
 namespace Content.Client.AirlockPainter.UI
 {
     public sealed class AirlockPainterBoundUserInterface : BoundUserInterface
     {
         private AirlockPainterWindow? _window;
-        public List<string> Styles = new();
+        private AirlockPainterSystem? _painter;
+
+        [Dependency] private readonly IEntitySystemManager _entitySystems = default!;
 
         public AirlockPainterBoundUserInterface(ClientUserInterfaceComponent owner, Enum uiKey) : base(owner, uiKey)
         {
@@ -17,22 +20,33 @@ namespace Content.Client.AirlockPainter.UI
             base.Open();
 
             _window = new AirlockPainterWindow();
-            if (State != null)
-                UpdateState(State);
 
-            // Add styles
-            var painterSystem = EntitySystem.Get<AirlockPainterSystem>();
-            _window.Populate(painterSystem.Entries);
+            _painter = _entitySystems.GetEntitySystem<AirlockPainterSystem>();
 
             _window.OpenCentered();
-
             _window.OnClose += Close;
-            _window.OnSpritePicked += OnSpritePicked;
+            _window.OnSpritePicked = OnSpritePicked;
+        }
+
+        protected override void UpdateState(BoundUserInterfaceState state)
+        {
+            base.UpdateState(state);
+
+            if (_window == null)
+                return;
+
+            if (_painter == null)
+                return;
+
+            if (state is not AirlockPainterBoundUserInterfaceState stateCast)
+                return;
+
+            _window.Populate(_painter.Entries, stateCast.SelectedStyle);
         }
 
-        private void OnSpritePicked(int index)
+        private void OnSpritePicked(ItemList.ItemListSelectedEventArgs args)
         {
-            SendMessage(new AirlockPainterSpritePickedMessage(index));
+            SendMessage(new AirlockPainterSpritePickedMessage(args.ItemIndex));
         }
     }
 }
index 2989ce9c4b4690c58da89a365faf743b8dbc01f7..564eccb38fcc5d28c33755bd14b1a7916cd5111f 100644 (file)
@@ -1,6 +1,6 @@
 <DefaultWindow xmlns="https://spacestation14.io"
             MinSize="300 300"
-            SetSize="300 300"
+            SetSize="300 500"
             Title="{Loc 'airlock-painter-window-title'}">
     <BoxContainer Orientation="Vertical" SeparationOverride="4" MinWidth="150">
         <Label Name="SelectedSpriteLabel"
index 7ead44ca5a4d440e680832dcf4da94ea453f4c43..403b83e9e57cabd12efdb1333af63957de21e586 100644 (file)
@@ -1,4 +1,5 @@
 using Robust.Client.AutoGenerated;
+using Robust.Client.UserInterface.Controls;
 using Robust.Client.UserInterface.CustomControls;
 using Robust.Client.UserInterface.XAML;
 
@@ -7,22 +8,32 @@ namespace Content.Client.AirlockPainter.UI
     [GenerateTypedNameReferences]
     public sealed partial class AirlockPainterWindow : DefaultWindow
     {
-        public event Action<int>? OnSpritePicked;
+        public Action<ItemList.ItemListSelectedEventArgs>? OnSpritePicked;
+
+        private List<AirlockPainterEntry> CurrentEntries = new List<AirlockPainterEntry>();
 
         public AirlockPainterWindow()
         {
             RobustXamlLoader.Load(this);
-
-            SpriteList.OnItemSelected += e => OnSpritePicked?.Invoke(e.ItemIndex);
         }
 
-        public void Populate(List<AirlockPainterEntry> entries)
+        public void Populate(List<AirlockPainterEntry> entries, int selected)
         {
-            SpriteList.Clear();
-            foreach (var entry in entries)
+            // Only clear if the entries change. Otherwise the list would "jump" after selecting an item
+            if (!CurrentEntries.Equals(entries))
             {
-                SpriteList.AddItem(entry.Name, entry.Icon);
+                CurrentEntries = entries;
+                SpriteList.Clear();
+                foreach (var entry in entries)
+                {
+                    SpriteList.AddItem(entry.Name, entry.Icon);
+                }
             }
+
+            // Disable event so we don't send a new event for pre-selected entry and end up in a loop
+            SpriteList.OnItemSelected -= OnSpritePicked;
+            SpriteList[selected].Selected = true;
+            SpriteList.OnItemSelected += OnSpritePicked;
         }
     }
 }
index 217ef59e04de9cc847a85452c8113867593fda67..0cb8c6e5c080d0e5497cdd588300d91b1492b620 100644 (file)
@@ -15,7 +15,7 @@ namespace Content.Shared.AirlockPainter
         {
             base.Initialize();
 
-            HashSet<string> styles = new();
+            SortedSet<string> styles = new();
             foreach (AirlockGroupPrototype grp in _prototypeManager.EnumeratePrototypes<AirlockGroupPrototype>())
             {
                 Groups.Add(grp);