From d4f14e552a26c041cf09f61043e2d96ac2e86a1e Mon Sep 17 00:00:00 2001
From: smoogipoo <smoogipoo@smgi.me>
Date: Thu, 13 Feb 2020 18:05:53 +0900
Subject: [PATCH] Improve extensibility of mod display expansion

---
 .../UserInterface/TestSceneModDisplay.cs      | 40 +++++++++++++++++++
 osu.Game/Screens/Play/HUD/ModDisplay.cs       | 28 +++++++++++--
 osu.Game/Screens/Select/FooterButtonMods.cs   |  2 +-
 3 files changed, 66 insertions(+), 4 deletions(-)
 create mode 100644 osu.Game.Tests/Visual/UserInterface/TestSceneModDisplay.cs

diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneModDisplay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModDisplay.cs
new file mode 100644
index 0000000000..8168faa106
--- /dev/null
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModDisplay.cs
@@ -0,0 +1,40 @@
+// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using NUnit.Framework;
+using osu.Framework.Graphics;
+using osu.Game.Rulesets.Mods;
+using osu.Game.Rulesets.Osu.Mods;
+using osu.Game.Screens.Play.HUD;
+
+namespace osu.Game.Tests.Visual.UserInterface
+{
+    public class TestSceneModDisplay : OsuTestScene
+    {
+        [TestCase(ExpansionMode.ExpandOnHover)]
+        [TestCase(ExpansionMode.AlwaysExpanded)]
+        [TestCase(ExpansionMode.AlwaysContracted)]
+        public void TestMode(ExpansionMode mode)
+        {
+            AddStep("create mod display", () =>
+            {
+                Child = new ModDisplay
+                {
+                    Anchor = Anchor.Centre,
+                    Origin = Anchor.Centre,
+                    ExpansionMode = mode,
+                    Current =
+                    {
+                        Value = new Mod[]
+                        {
+                            new OsuModHardRock(),
+                            new OsuModDoubleTime(),
+                            new OsuModDifficultyAdjust(),
+                            new OsuModEasy(),
+                        }
+                    }
+                };
+            });
+        }
+    }
+}
diff --git a/osu.Game/Screens/Play/HUD/ModDisplay.cs b/osu.Game/Screens/Play/HUD/ModDisplay.cs
index 00edd4db99..336b03544f 100644
--- a/osu.Game/Screens/Play/HUD/ModDisplay.cs
+++ b/osu.Game/Screens/Play/HUD/ModDisplay.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Screens.Play.HUD
 
         public bool DisplayUnrankedText = true;
 
-        public bool AllowExpand = true;
+        public ExpansionMode ExpansionMode = ExpansionMode.ExpandOnHover;
 
         private readonly Bindable<IReadOnlyList<Mod>> current = new Bindable<IReadOnlyList<Mod>>();
 
@@ -110,11 +110,15 @@ namespace osu.Game.Screens.Play.HUD
 
         private void expand()
         {
-            if (AllowExpand)
+            if (ExpansionMode != ExpansionMode.AlwaysContracted)
                 IconsContainer.TransformSpacingTo(new Vector2(5, 0), 500, Easing.OutQuint);
         }
 
-        private void contract() => IconsContainer.TransformSpacingTo(new Vector2(-25, 0), 500, Easing.OutQuint);
+        private void contract()
+        {
+            if (ExpansionMode != ExpansionMode.AlwaysExpanded)
+                IconsContainer.TransformSpacingTo(new Vector2(-25, 0), 500, Easing.OutQuint);
+        }
 
         protected override bool OnHover(HoverEvent e)
         {
@@ -128,4 +132,22 @@ namespace osu.Game.Screens.Play.HUD
             base.OnHoverLost(e);
         }
     }
+
+    public enum ExpansionMode
+    {
+        /// <summary>
+        /// The <see cref="ModDisplay"/> will expand only when hovered.
+        /// </summary>
+        ExpandOnHover,
+
+        /// <summary>
+        /// The <see cref="ModDisplay"/> will always be expanded.
+        /// </summary>
+        AlwaysExpanded,
+
+        /// <summary>
+        /// The <see cref="ModDisplay"/> will always be contracted.
+        /// </summary>
+        AlwaysContracted
+    }
 }
diff --git a/osu.Game/Screens/Select/FooterButtonMods.cs b/osu.Game/Screens/Select/FooterButtonMods.cs
index 4f2369847f..2411cf26f9 100644
--- a/osu.Game/Screens/Select/FooterButtonMods.cs
+++ b/osu.Game/Screens/Select/FooterButtonMods.cs
@@ -91,7 +91,7 @@ namespace osu.Game.Screens.Select
 
             public FooterModDisplay()
             {
-                AllowExpand = false;
+                ExpansionMode = ExpansionMode.AlwaysContracted;
                 IconsContainer.Margin = new MarginPadding();
             }
         }