From 2201535513d45713f16a7c98a2d47048edda0775 Mon Sep 17 00:00:00 2001 From: "Thomas (Aeshus)" Date: Mon, 11 May 2026 19:37:26 -0500 Subject: [PATCH 1/8] Add PressedHover support for buttons Toggle buttons need another state for when they're currently pressed/active, but they're being hovered still. This should be fine as it uses both Pseudoclasses so however they define their style sheet, it should use one or the other reasonable option, if defined. --- Robust.Client/UserInterface/Controls/BaseButton.cs | 9 +++++++-- Robust.Client/UserInterface/Controls/ContainerButton.cs | 4 ++++ Robust.Client/UserInterface/Controls/TextureButton.cs | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Robust.Client/UserInterface/Controls/BaseButton.cs b/Robust.Client/UserInterface/Controls/BaseButton.cs index d590b9619c7..afab565b1ee 100644 --- a/Robust.Client/UserInterface/Controls/BaseButton.cs +++ b/Robust.Client/UserInterface/Controls/BaseButton.cs @@ -186,7 +186,11 @@ public DrawModeEnum DrawMode { return DrawModeEnum.Disabled; } - else if (Pressed || (_attemptingPress > 0 && IsHovered)) + else if ((Pressed || _attemptingPress > 0) && IsHovered) + { + return DrawModeEnum.PressedHover; + } + else if (Pressed) { return DrawModeEnum.Pressed; } @@ -406,7 +410,8 @@ public enum DrawModeEnum : byte Normal = 0, Pressed = 1, Hover = 2, - Disabled = 3 + Disabled = 3, + PressedHover = 4, } [Virtual] diff --git a/Robust.Client/UserInterface/Controls/ContainerButton.cs b/Robust.Client/UserInterface/Controls/ContainerButton.cs index f981e9f766c..0edb7a755b1 100644 --- a/Robust.Client/UserInterface/Controls/ContainerButton.cs +++ b/Robust.Client/UserInterface/Controls/ContainerButton.cs @@ -92,6 +92,10 @@ protected override void DrawModeChanged() case DrawModeEnum.Disabled: SetOnlyStylePseudoClass(StylePseudoClassDisabled); break; + case DrawModeEnum.PressedHover: + SetOnlyStylePseudoClass(StylePseudoClassPressed); + AddStylePseudoClass(StylePseudoClassHover); + break; default: throw new ArgumentOutOfRangeException(); } diff --git a/Robust.Client/UserInterface/Controls/TextureButton.cs b/Robust.Client/UserInterface/Controls/TextureButton.cs index 0d8f83ab791..e7d2fd328f4 100644 --- a/Robust.Client/UserInterface/Controls/TextureButton.cs +++ b/Robust.Client/UserInterface/Controls/TextureButton.cs @@ -79,6 +79,10 @@ protected override void DrawModeChanged() case DrawModeEnum.Disabled: SetOnlyStylePseudoClass(StylePseudoClassDisabled); break; + case DrawModeEnum.PressedHover: + SetOnlyStylePseudoClass(StylePseudoClassPressed); + AddStylePseudoClass(StylePseudoClassHover); + break; default: throw new ArgumentOutOfRangeException(); } From 6471813dcdd313c5eff699651cd3c4fe8a5b8453 Mon Sep 17 00:00:00 2001 From: "Thomas (Aeshus)" Date: Mon, 25 May 2026 15:19:59 -0500 Subject: [PATCH 2/8] Revert "Add PressedHover support for buttons" This reverts commit 2201535513d45713f16a7c98a2d47048edda0775. --- Robust.Client/UserInterface/Controls/BaseButton.cs | 9 ++------- Robust.Client/UserInterface/Controls/ContainerButton.cs | 4 ---- Robust.Client/UserInterface/Controls/TextureButton.cs | 4 ---- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/Robust.Client/UserInterface/Controls/BaseButton.cs b/Robust.Client/UserInterface/Controls/BaseButton.cs index afab565b1ee..d590b9619c7 100644 --- a/Robust.Client/UserInterface/Controls/BaseButton.cs +++ b/Robust.Client/UserInterface/Controls/BaseButton.cs @@ -186,11 +186,7 @@ public DrawModeEnum DrawMode { return DrawModeEnum.Disabled; } - else if ((Pressed || _attemptingPress > 0) && IsHovered) - { - return DrawModeEnum.PressedHover; - } - else if (Pressed) + else if (Pressed || (_attemptingPress > 0 && IsHovered)) { return DrawModeEnum.Pressed; } @@ -410,8 +406,7 @@ public enum DrawModeEnum : byte Normal = 0, Pressed = 1, Hover = 2, - Disabled = 3, - PressedHover = 4, + Disabled = 3 } [Virtual] diff --git a/Robust.Client/UserInterface/Controls/ContainerButton.cs b/Robust.Client/UserInterface/Controls/ContainerButton.cs index 0edb7a755b1..f981e9f766c 100644 --- a/Robust.Client/UserInterface/Controls/ContainerButton.cs +++ b/Robust.Client/UserInterface/Controls/ContainerButton.cs @@ -92,10 +92,6 @@ protected override void DrawModeChanged() case DrawModeEnum.Disabled: SetOnlyStylePseudoClass(StylePseudoClassDisabled); break; - case DrawModeEnum.PressedHover: - SetOnlyStylePseudoClass(StylePseudoClassPressed); - AddStylePseudoClass(StylePseudoClassHover); - break; default: throw new ArgumentOutOfRangeException(); } diff --git a/Robust.Client/UserInterface/Controls/TextureButton.cs b/Robust.Client/UserInterface/Controls/TextureButton.cs index e7d2fd328f4..0d8f83ab791 100644 --- a/Robust.Client/UserInterface/Controls/TextureButton.cs +++ b/Robust.Client/UserInterface/Controls/TextureButton.cs @@ -79,10 +79,6 @@ protected override void DrawModeChanged() case DrawModeEnum.Disabled: SetOnlyStylePseudoClass(StylePseudoClassDisabled); break; - case DrawModeEnum.PressedHover: - SetOnlyStylePseudoClass(StylePseudoClassPressed); - AddStylePseudoClass(StylePseudoClassHover); - break; default: throw new ArgumentOutOfRangeException(); } From 88559168573e2232d6f93852f08b9b5d84668c8e Mon Sep 17 00:00:00 2001 From: "Thomas (Aeshus)" Date: Mon, 25 May 2026 15:27:17 -0500 Subject: [PATCH 3/8] Switch to using the BaseButton's properties directly --- .../UserInterface/Controls/BaseButton.cs | 10 ++++++-- .../UserInterface/Controls/ContainerButton.cs | 24 ++++++------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/Robust.Client/UserInterface/Controls/BaseButton.cs b/Robust.Client/UserInterface/Controls/BaseButton.cs index d590b9619c7..f3dfc4b71ce 100644 --- a/Robust.Client/UserInterface/Controls/BaseButton.cs +++ b/Robust.Client/UserInterface/Controls/BaseButton.cs @@ -174,10 +174,16 @@ public bool ToggleMode [ViewVariables] public bool IsHovered => _beingHovered; + /// + /// If true, this button is currently being pressed down by the mouse. + /// + public bool AttemptingPress => _attemptingPress > 0; + /// /// Draw mode used for styling of buttons. /// [ViewVariables] + [Obsolete("Use BaseButton.{Disabled,Pressed,AttemptingPress,IsHovered} directly instead.")] public DrawModeEnum DrawMode { get @@ -186,11 +192,11 @@ public DrawModeEnum DrawMode { return DrawModeEnum.Disabled; } - else if (Pressed || (_attemptingPress > 0 && IsHovered)) + else if (Pressed || (AttemptingPress && IsHovered)) { return DrawModeEnum.Pressed; } - else if (IsHovered || _attemptingPress > 0) + else if (IsHovered || AttemptingPress) { return DrawModeEnum.Hover; } diff --git a/Robust.Client/UserInterface/Controls/ContainerButton.cs b/Robust.Client/UserInterface/Controls/ContainerButton.cs index f981e9f766c..6da9d49325b 100644 --- a/Robust.Client/UserInterface/Controls/ContainerButton.cs +++ b/Robust.Client/UserInterface/Controls/ContainerButton.cs @@ -78,23 +78,13 @@ protected internal override void Draw(DrawingHandleScreen handle) protected override void DrawModeChanged() { - switch (DrawMode) - { - case DrawModeEnum.Normal: - SetOnlyStylePseudoClass(StylePseudoClassNormal); - break; - case DrawModeEnum.Pressed: - SetOnlyStylePseudoClass(StylePseudoClassPressed); - break; - case DrawModeEnum.Hover: - SetOnlyStylePseudoClass(StylePseudoClassHover); - break; - case DrawModeEnum.Disabled: - SetOnlyStylePseudoClass(StylePseudoClassDisabled); - break; - default: - throw new ArgumentOutOfRangeException(); - } + SetOnlyStylePseudoClass(Pressed ? StylePseudoClassPressed : StylePseudoClassNormal); + + if (Disabled) + AddStyleClass(StylePseudoClassDisabled); + + if (IsHovered) + AddStyleClass(StylePseudoClassHover); } } } From 5337f9881d57b6d5dde6eaf31069f5185808a50e Mon Sep 17 00:00:00 2001 From: "Thomas (Aeshus)" Date: Mon, 25 May 2026 15:27:48 -0500 Subject: [PATCH 4/8] Add new Pressing StylePseudoClass This is for when you're attempting to press but haven't yet committed to toggling it yet. --- Robust.Client/UserInterface/Controls/ContainerButton.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Robust.Client/UserInterface/Controls/ContainerButton.cs b/Robust.Client/UserInterface/Controls/ContainerButton.cs index 6da9d49325b..1339dd5f93c 100644 --- a/Robust.Client/UserInterface/Controls/ContainerButton.cs +++ b/Robust.Client/UserInterface/Controls/ContainerButton.cs @@ -12,6 +12,7 @@ public class ContainerButton : BaseButton public const string StyleClassButton = "button"; public const string StylePseudoClassNormal = "normal"; public const string StylePseudoClassPressed = "pressed"; + public const string StylePseudoClassPressing = "pressing"; public const string StylePseudoClassHover = "hover"; public const string StylePseudoClassDisabled = "disabled"; @@ -85,6 +86,9 @@ protected override void DrawModeChanged() if (IsHovered) AddStyleClass(StylePseudoClassHover); + + if (AttemptingPress) + AddStyleClass(StylePseudoClassPressing); } } } From 5e9fbde5d8bc665ebbac874e0efaf1ee4e40976f Mon Sep 17 00:00:00 2001 From: "Thomas (Aeshus)" Date: Mon, 25 May 2026 15:28:03 -0500 Subject: [PATCH 5/8] Document the PseudoClasses --- .../UserInterface/Controls/ContainerButton.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Robust.Client/UserInterface/Controls/ContainerButton.cs b/Robust.Client/UserInterface/Controls/ContainerButton.cs index 1339dd5f93c..9721c4cb8e7 100644 --- a/Robust.Client/UserInterface/Controls/ContainerButton.cs +++ b/Robust.Client/UserInterface/Controls/ContainerButton.cs @@ -10,10 +10,32 @@ public class ContainerButton : BaseButton { public const string StylePropertyStyleBox = "stylebox"; public const string StyleClassButton = "button"; + + /// + /// The button is toggled off. + /// + /// Mutually exclusive with public const string StylePseudoClassNormal = "normal"; + + /// + /// The button is toggled on. + /// + /// Mutually exclusive with public const string StylePseudoClassPressed = "pressed"; + + /// + /// The mouse is actively attempting to press/toggle the button. + /// public const string StylePseudoClassPressing = "pressing"; + + /// + /// The mouse is hovering over the button. + /// public const string StylePseudoClassHover = "hover"; + + /// + /// The button is not taking any interaction. + /// public const string StylePseudoClassDisabled = "disabled"; public StyleBox? StyleBoxOverride { get; set; } From 8d216ceb6110f8b5ebdb7881e9f9b5f51a095ae3 Mon Sep 17 00:00:00 2001 From: "Thomas (Aeshus)" Date: Mon, 25 May 2026 15:43:30 -0500 Subject: [PATCH 6/8] Fix typo Sighs. --- Robust.Client/UserInterface/Controls/ContainerButton.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Robust.Client/UserInterface/Controls/ContainerButton.cs b/Robust.Client/UserInterface/Controls/ContainerButton.cs index 9721c4cb8e7..6ca7c7350c1 100644 --- a/Robust.Client/UserInterface/Controls/ContainerButton.cs +++ b/Robust.Client/UserInterface/Controls/ContainerButton.cs @@ -104,13 +104,13 @@ protected override void DrawModeChanged() SetOnlyStylePseudoClass(Pressed ? StylePseudoClassPressed : StylePseudoClassNormal); if (Disabled) - AddStyleClass(StylePseudoClassDisabled); + AddStylePseudoClass(StylePseudoClassDisabled); if (IsHovered) - AddStyleClass(StylePseudoClassHover); + AddStylePseudoClass(StylePseudoClassHover); if (AttemptingPress) - AddStyleClass(StylePseudoClassPressing); + AddStylePseudoClass(StylePseudoClassPressing); } } } From 866c5dfbc4e75a20778fdf5e187d82997574abcb Mon Sep 17 00:00:00 2001 From: "Thomas (Aeshus)" Date: Mon, 25 May 2026 15:47:21 -0500 Subject: [PATCH 7/8] Add it to DefaultStylesheet b/c why not --- .../UserInterface/Stylesheets/DefaultStylesheet.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Robust.Client/UserInterface/Stylesheets/DefaultStylesheet.cs b/Robust.Client/UserInterface/Stylesheets/DefaultStylesheet.cs index 72575887cec..ad1d4225dde 100644 --- a/Robust.Client/UserInterface/Stylesheets/DefaultStylesheet.cs +++ b/Robust.Client/UserInterface/Stylesheets/DefaultStylesheet.cs @@ -177,6 +177,20 @@ public DefaultStylesheet(IResourceCache res, IUserInterfaceManager userInterface ContentMarginTopOverride = 3, }), + // Button style pressing (same as pressed) + Element().Class(ContainerButton.StyleClassButton).Pseudo(ContainerButton.StylePseudoClassPressing) + .Prop(ContainerButton.StylePropertyStyleBox, new StyleBoxFlat + { + BackgroundColor = theme.ResolveColorOrSpecified("buttonBackgroundPressed", Color.FromHex("#173717")), + BorderThickness = new Thickness(1), + BorderColor = theme.ResolveColorOrSpecified("buttonBorderPressed", Color.FromHex("#447044")), + Padding = new Thickness(3), + ContentMarginBottomOverride = 3, + ContentMarginLeftOverride = 5, + ContentMarginRightOverride = 5, + ContentMarginTopOverride = 3, + }), + // Button style disabled Element().Class(ContainerButton.StyleClassButton).Pseudo(ContainerButton.StylePseudoClassDisabled) .Prop(ContainerButton.StylePropertyStyleBox, new StyleBoxFlat From f0af1d976f3f87c013417099c5db64a1dbe6bb59 Mon Sep 17 00:00:00 2001 From: "Thomas (Aeshus)" Date: Mon, 25 May 2026 18:02:22 -0500 Subject: [PATCH 8/8] Force test rerun