From 505dd37a75e98261394327771ffa764099716a73 Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Tue, 6 Oct 2020 17:18:41 +0900
Subject: [PATCH 01/10] Make SettingsItem conform to IHasCurrentValue

---
 .../ManiaSettingsSubsection.cs                |  4 ++--
 .../UI/OsuSettingsSubsection.cs               |  6 ++---
 osu.Game.Tournament/Components/DateTextBox.cs | 18 +++++++-------
 .../Screens/Editors/RoundEditorScreen.cs      | 12 +++++-----
 .../Screens/Editors/SeedingEditorScreen.cs    | 10 ++++----
 .../Screens/Editors/TeamEditorScreen.cs       | 12 +++++-----
 .../Screens/Gameplay/GameplayScreen.cs        |  4 ++--
 .../Ladder/Components/LadderEditorSettings.cs | 12 +++++-----
 .../Screens/TeamIntro/SeedingScreen.cs        |  2 +-
 .../Configuration/SettingSourceAttribute.cs   | 12 +++++-----
 .../Sections/Audio/AudioDevicesSettings.cs    |  2 +-
 .../Sections/Audio/MainMenuSettings.cs        |  8 +++----
 .../Settings/Sections/Audio/OffsetSettings.cs |  2 +-
 .../Settings/Sections/Audio/VolumeSettings.cs |  8 +++----
 .../Sections/Debug/GeneralSettings.cs         |  4 ++--
 .../Sections/Gameplay/GeneralSettings.cs      | 24 +++++++++----------
 .../Sections/Gameplay/ModsSettings.cs         |  2 +-
 .../Sections/Gameplay/SongSelectSettings.cs   | 10 ++++----
 .../Sections/General/LanguageSettings.cs      |  2 +-
 .../Sections/General/LoginSettings.cs         |  4 ++--
 .../Sections/General/UpdateSettings.cs        |  2 +-
 .../Sections/Graphics/DetailSettings.cs       |  8 +++----
 .../Sections/Graphics/LayoutSettings.cs       | 20 ++++++++--------
 .../Sections/Graphics/RendererSettings.cs     |  6 ++---
 .../Graphics/UserInterfaceSettings.cs         |  6 ++---
 .../Settings/Sections/Input/MouseSettings.cs  | 12 +++++-----
 .../Settings/Sections/Online/WebSettings.cs   |  4 ++--
 .../Overlays/Settings/Sections/SkinSection.cs | 12 +++++-----
 osu.Game/Overlays/Settings/SettingsItem.cs    |  4 ++--
 .../Edit/Timing/SliderWithTextBoxInput.cs     |  8 +++----
 osu.Game/Screens/Edit/Timing/TimingSection.cs | 14 +++++------
 .../Play/PlayerSettings/PlaybackSettings.cs   |  4 ++--
 .../Play/PlayerSettings/VisualSettings.cs     |  4 ++--
 33 files changed, 131 insertions(+), 131 deletions(-)

diff --git a/osu.Game.Rulesets.Mania/ManiaSettingsSubsection.cs b/osu.Game.Rulesets.Mania/ManiaSettingsSubsection.cs
index b470405df2..de77af8306 100644
--- a/osu.Game.Rulesets.Mania/ManiaSettingsSubsection.cs
+++ b/osu.Game.Rulesets.Mania/ManiaSettingsSubsection.cs
@@ -29,12 +29,12 @@ namespace osu.Game.Rulesets.Mania
                 new SettingsEnumDropdown<ManiaScrollingDirection>
                 {
                     LabelText = "Scrolling direction",
-                    Bindable = config.GetBindable<ManiaScrollingDirection>(ManiaRulesetSetting.ScrollDirection)
+                    Current = config.GetBindable<ManiaScrollingDirection>(ManiaRulesetSetting.ScrollDirection)
                 },
                 new SettingsSlider<double, TimeSlider>
                 {
                     LabelText = "Scroll speed",
-                    Bindable = config.GetBindable<double>(ManiaRulesetSetting.ScrollTime),
+                    Current = config.GetBindable<double>(ManiaRulesetSetting.ScrollTime),
                     KeyboardStep = 5
                 },
             };
diff --git a/osu.Game.Rulesets.Osu/UI/OsuSettingsSubsection.cs b/osu.Game.Rulesets.Osu/UI/OsuSettingsSubsection.cs
index 88adf72551..3870f303b4 100644
--- a/osu.Game.Rulesets.Osu/UI/OsuSettingsSubsection.cs
+++ b/osu.Game.Rulesets.Osu/UI/OsuSettingsSubsection.cs
@@ -27,17 +27,17 @@ namespace osu.Game.Rulesets.Osu.UI
                 new SettingsCheckbox
                 {
                     LabelText = "Snaking in sliders",
-                    Bindable = config.GetBindable<bool>(OsuRulesetSetting.SnakingInSliders)
+                    Current = config.GetBindable<bool>(OsuRulesetSetting.SnakingInSliders)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Snaking out sliders",
-                    Bindable = config.GetBindable<bool>(OsuRulesetSetting.SnakingOutSliders)
+                    Current = config.GetBindable<bool>(OsuRulesetSetting.SnakingOutSliders)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Cursor trail",
-                    Bindable = config.GetBindable<bool>(OsuRulesetSetting.ShowCursorTrail)
+                    Current = config.GetBindable<bool>(OsuRulesetSetting.ShowCursorTrail)
                 },
             };
         }
diff --git a/osu.Game.Tournament/Components/DateTextBox.cs b/osu.Game.Tournament/Components/DateTextBox.cs
index a1b5ac38ea..5782301a65 100644
--- a/osu.Game.Tournament/Components/DateTextBox.cs
+++ b/osu.Game.Tournament/Components/DateTextBox.cs
@@ -10,34 +10,34 @@ namespace osu.Game.Tournament.Components
 {
     public class DateTextBox : SettingsTextBox
     {
-        public new Bindable<DateTimeOffset> Bindable
+        public new Bindable<DateTimeOffset> Current
         {
-            get => bindable;
+            get => current;
             set
             {
-                bindable = value.GetBoundCopy();
-                bindable.BindValueChanged(dto =>
-                    base.Bindable.Value = dto.NewValue.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"), true);
+                current = value.GetBoundCopy();
+                current.BindValueChanged(dto =>
+                    base.Current.Value = dto.NewValue.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"), true);
             }
         }
 
         // hold a reference to the provided bindable so we don't have to in every settings section.
-        private Bindable<DateTimeOffset> bindable = new Bindable<DateTimeOffset>();
+        private Bindable<DateTimeOffset> current = new Bindable<DateTimeOffset>();
 
         public DateTextBox()
         {
-            base.Bindable = new Bindable<string>();
+            base.Current = new Bindable<string>();
 
             ((OsuTextBox)Control).OnCommit += (sender, newText) =>
             {
                 try
                 {
-                    bindable.Value = DateTimeOffset.Parse(sender.Text);
+                    current.Value = DateTimeOffset.Parse(sender.Text);
                 }
                 catch
                 {
                     // reset textbox content to its last valid state on a parse failure.
-                    bindable.TriggerChange();
+                    current.TriggerChange();
                 }
             };
         }
diff --git a/osu.Game.Tournament/Screens/Editors/RoundEditorScreen.cs b/osu.Game.Tournament/Screens/Editors/RoundEditorScreen.cs
index 8b8078e119..069ddfa4db 100644
--- a/osu.Game.Tournament/Screens/Editors/RoundEditorScreen.cs
+++ b/osu.Game.Tournament/Screens/Editors/RoundEditorScreen.cs
@@ -63,25 +63,25 @@ namespace osu.Game.Tournament.Screens.Editors
                             {
                                 LabelText = "Name",
                                 Width = 0.33f,
-                                Bindable = Model.Name
+                                Current = Model.Name
                             },
                             new SettingsTextBox
                             {
                                 LabelText = "Description",
                                 Width = 0.33f,
-                                Bindable = Model.Description
+                                Current = Model.Description
                             },
                             new DateTextBox
                             {
                                 LabelText = "Start Time",
                                 Width = 0.33f,
-                                Bindable = Model.StartDate
+                                Current = Model.StartDate
                             },
                             new SettingsSlider<int>
                             {
                                 LabelText = "Best of",
                                 Width = 0.33f,
-                                Bindable = Model.BestOf
+                                Current = Model.BestOf
                             },
                             new SettingsButton
                             {
@@ -186,14 +186,14 @@ namespace osu.Game.Tournament.Screens.Editors
                                         LabelText = "Beatmap ID",
                                         RelativeSizeAxes = Axes.None,
                                         Width = 200,
-                                        Bindable = beatmapId,
+                                        Current = beatmapId,
                                     },
                                     new SettingsTextBox
                                     {
                                         LabelText = "Mods",
                                         RelativeSizeAxes = Axes.None,
                                         Width = 200,
-                                        Bindable = mods,
+                                        Current = mods,
                                     },
                                     drawableContainer = new Container
                                     {
diff --git a/osu.Game.Tournament/Screens/Editors/SeedingEditorScreen.cs b/osu.Game.Tournament/Screens/Editors/SeedingEditorScreen.cs
index 0973a7dc75..7bd8d3f6a0 100644
--- a/osu.Game.Tournament/Screens/Editors/SeedingEditorScreen.cs
+++ b/osu.Game.Tournament/Screens/Editors/SeedingEditorScreen.cs
@@ -74,13 +74,13 @@ namespace osu.Game.Tournament.Screens.Editors
                             {
                                 LabelText = "Mod",
                                 Width = 0.33f,
-                                Bindable = Model.Mod
+                                Current = Model.Mod
                             },
                             new SettingsSlider<int>
                             {
                                 LabelText = "Seed",
                                 Width = 0.33f,
-                                Bindable = Model.Seed
+                                Current = Model.Seed
                             },
                             new SettingsButton
                             {
@@ -187,21 +187,21 @@ namespace osu.Game.Tournament.Screens.Editors
                                         LabelText = "Beatmap ID",
                                         RelativeSizeAxes = Axes.None,
                                         Width = 200,
-                                        Bindable = beatmapId,
+                                        Current = beatmapId,
                                     },
                                     new SettingsSlider<int>
                                     {
                                         LabelText = "Seed",
                                         RelativeSizeAxes = Axes.None,
                                         Width = 200,
-                                        Bindable = beatmap.Seed
+                                        Current = beatmap.Seed
                                     },
                                     new SettingsTextBox
                                     {
                                         LabelText = "Score",
                                         RelativeSizeAxes = Axes.None,
                                         Width = 200,
-                                        Bindable = score,
+                                        Current = score,
                                     },
                                     drawableContainer = new Container
                                     {
diff --git a/osu.Game.Tournament/Screens/Editors/TeamEditorScreen.cs b/osu.Game.Tournament/Screens/Editors/TeamEditorScreen.cs
index dbfcfe4225..7196f47bd6 100644
--- a/osu.Game.Tournament/Screens/Editors/TeamEditorScreen.cs
+++ b/osu.Game.Tournament/Screens/Editors/TeamEditorScreen.cs
@@ -102,31 +102,31 @@ namespace osu.Game.Tournament.Screens.Editors
                             {
                                 LabelText = "Name",
                                 Width = 0.2f,
-                                Bindable = Model.FullName
+                                Current = Model.FullName
                             },
                             new SettingsTextBox
                             {
                                 LabelText = "Acronym",
                                 Width = 0.2f,
-                                Bindable = Model.Acronym
+                                Current = Model.Acronym
                             },
                             new SettingsTextBox
                             {
                                 LabelText = "Flag",
                                 Width = 0.2f,
-                                Bindable = Model.FlagName
+                                Current = Model.FlagName
                             },
                             new SettingsTextBox
                             {
                                 LabelText = "Seed",
                                 Width = 0.2f,
-                                Bindable = Model.Seed
+                                Current = Model.Seed
                             },
                             new SettingsSlider<int>
                             {
                                 LabelText = "Last Year Placement",
                                 Width = 0.33f,
-                                Bindable = Model.LastYearPlacing
+                                Current = Model.LastYearPlacing
                             },
                             new SettingsButton
                             {
@@ -247,7 +247,7 @@ namespace osu.Game.Tournament.Screens.Editors
                                         LabelText = "User ID",
                                         RelativeSizeAxes = Axes.None,
                                         Width = 200,
-                                        Bindable = userId,
+                                        Current = userId,
                                     },
                                     drawableContainer = new Container
                                     {
diff --git a/osu.Game.Tournament/Screens/Gameplay/GameplayScreen.cs b/osu.Game.Tournament/Screens/Gameplay/GameplayScreen.cs
index e4e3842369..e4ec45c00e 100644
--- a/osu.Game.Tournament/Screens/Gameplay/GameplayScreen.cs
+++ b/osu.Game.Tournament/Screens/Gameplay/GameplayScreen.cs
@@ -113,13 +113,13 @@ namespace osu.Game.Tournament.Screens.Gameplay
                         new SettingsSlider<int>
                         {
                             LabelText = "Chroma width",
-                            Bindable = LadderInfo.ChromaKeyWidth,
+                            Current = LadderInfo.ChromaKeyWidth,
                             KeyboardStep = 1,
                         },
                         new SettingsSlider<int>
                         {
                             LabelText = "Players per team",
-                            Bindable = LadderInfo.PlayersPerTeam,
+                            Current = LadderInfo.PlayersPerTeam,
                             KeyboardStep = 1,
                         }
                     }
diff --git a/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs b/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs
index b60eb814e5..cf4466a2e3 100644
--- a/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs
+++ b/osu.Game.Tournament/Screens/Ladder/Components/LadderEditorSettings.cs
@@ -51,15 +51,15 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
 
             editorInfo.Selected.ValueChanged += selection =>
             {
-                roundDropdown.Bindable = selection.NewValue?.Round;
+                roundDropdown.Current = selection.NewValue?.Round;
                 losersCheckbox.Current = selection.NewValue?.Losers;
-                dateTimeBox.Bindable = selection.NewValue?.Date;
+                dateTimeBox.Current = selection.NewValue?.Date;
 
-                team1Dropdown.Bindable = selection.NewValue?.Team1;
-                team2Dropdown.Bindable = selection.NewValue?.Team2;
+                team1Dropdown.Current = selection.NewValue?.Team1;
+                team2Dropdown.Current = selection.NewValue?.Team2;
             };
 
-            roundDropdown.Bindable.ValueChanged += round =>
+            roundDropdown.Current.ValueChanged += round =>
             {
                 if (editorInfo.Selected.Value?.Date.Value < round.NewValue?.StartDate.Value)
                 {
@@ -88,7 +88,7 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
         {
             public SettingsRoundDropdown(BindableList<TournamentRound> rounds)
             {
-                Bindable = new Bindable<TournamentRound>();
+                Current = new Bindable<TournamentRound>();
 
                 foreach (var r in rounds.Prepend(new TournamentRound()))
                     add(r);
diff --git a/osu.Game.Tournament/Screens/TeamIntro/SeedingScreen.cs b/osu.Game.Tournament/Screens/TeamIntro/SeedingScreen.cs
index eed3cac9f0..b343608e69 100644
--- a/osu.Game.Tournament/Screens/TeamIntro/SeedingScreen.cs
+++ b/osu.Game.Tournament/Screens/TeamIntro/SeedingScreen.cs
@@ -61,7 +61,7 @@ namespace osu.Game.Tournament.Screens.TeamIntro
                         new SettingsTeamDropdown(LadderInfo.Teams)
                         {
                             LabelText = "Show specific team",
-                            Bindable = currentTeam,
+                            Current = currentTeam,
                         }
                     }
                 }
diff --git a/osu.Game/Configuration/SettingSourceAttribute.cs b/osu.Game/Configuration/SettingSourceAttribute.cs
index fe487cb1d0..50069be4b2 100644
--- a/osu.Game/Configuration/SettingSourceAttribute.cs
+++ b/osu.Game/Configuration/SettingSourceAttribute.cs
@@ -57,7 +57,7 @@ namespace osu.Game.Configuration
                         yield return new SettingsSlider<float>
                         {
                             LabelText = attr.Label,
-                            Bindable = bNumber,
+                            Current = bNumber,
                             KeyboardStep = 0.1f,
                         };
 
@@ -67,7 +67,7 @@ namespace osu.Game.Configuration
                         yield return new SettingsSlider<double>
                         {
                             LabelText = attr.Label,
-                            Bindable = bNumber,
+                            Current = bNumber,
                             KeyboardStep = 0.1f,
                         };
 
@@ -77,7 +77,7 @@ namespace osu.Game.Configuration
                         yield return new SettingsSlider<int>
                         {
                             LabelText = attr.Label,
-                            Bindable = bNumber
+                            Current = bNumber
                         };
 
                         break;
@@ -86,7 +86,7 @@ namespace osu.Game.Configuration
                         yield return new SettingsCheckbox
                         {
                             LabelText = attr.Label,
-                            Bindable = bBool
+                            Current = bBool
                         };
 
                         break;
@@ -95,7 +95,7 @@ namespace osu.Game.Configuration
                         yield return new SettingsTextBox
                         {
                             LabelText = attr.Label,
-                            Bindable = bString
+                            Current = bString
                         };
 
                         break;
@@ -105,7 +105,7 @@ namespace osu.Game.Configuration
                         var dropdown = (Drawable)Activator.CreateInstance(dropdownType);
 
                         dropdownType.GetProperty(nameof(SettingsDropdown<object>.LabelText))?.SetValue(dropdown, attr.Label);
-                        dropdownType.GetProperty(nameof(SettingsDropdown<object>.Bindable))?.SetValue(dropdown, bindable);
+                        dropdownType.GetProperty(nameof(SettingsDropdown<object>.Current))?.SetValue(dropdown, bindable);
 
                         yield return dropdown;
 
diff --git a/osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs
index 3da64e0de4..bed74542c9 100644
--- a/osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Audio/AudioDevicesSettings.cs
@@ -64,7 +64,7 @@ namespace osu.Game.Overlays.Settings.Sections.Audio
 
             updateItems();
 
-            dropdown.Bindable = audio.AudioDevice;
+            dropdown.Current = audio.AudioDevice;
 
             audio.OnNewDevice += onDeviceChanged;
             audio.OnLostDevice += onDeviceChanged;
diff --git a/osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs
index a303f93b34..d5de32ed05 100644
--- a/osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Audio/MainMenuSettings.cs
@@ -21,23 +21,23 @@ namespace osu.Game.Overlays.Settings.Sections.Audio
                 new SettingsCheckbox
                 {
                     LabelText = "Interface voices",
-                    Bindable = config.GetBindable<bool>(OsuSetting.MenuVoice)
+                    Current = config.GetBindable<bool>(OsuSetting.MenuVoice)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "osu! music theme",
-                    Bindable = config.GetBindable<bool>(OsuSetting.MenuMusic)
+                    Current = config.GetBindable<bool>(OsuSetting.MenuMusic)
                 },
                 new SettingsDropdown<IntroSequence>
                 {
                     LabelText = "Intro sequence",
-                    Bindable = config.GetBindable<IntroSequence>(OsuSetting.IntroSequence),
+                    Current = config.GetBindable<IntroSequence>(OsuSetting.IntroSequence),
                     Items = Enum.GetValues(typeof(IntroSequence)).Cast<IntroSequence>()
                 },
                 new SettingsDropdown<BackgroundSource>
                 {
                     LabelText = "Background source",
-                    Bindable = config.GetBindable<BackgroundSource>(OsuSetting.MenuBackgroundSource),
+                    Current = config.GetBindable<BackgroundSource>(OsuSetting.MenuBackgroundSource),
                     Items = Enum.GetValues(typeof(BackgroundSource)).Cast<BackgroundSource>()
                 }
             };
diff --git a/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs
index aaa4302553..c9a81b955b 100644
--- a/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Audio/OffsetSettings.cs
@@ -20,7 +20,7 @@ namespace osu.Game.Overlays.Settings.Sections.Audio
                 new SettingsSlider<double, OffsetSlider>
                 {
                     LabelText = "Audio offset",
-                    Bindable = config.GetBindable<double>(OsuSetting.AudioOffset),
+                    Current = config.GetBindable<double>(OsuSetting.AudioOffset),
                     KeyboardStep = 1f
                 },
                 new SettingsButton
diff --git a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs
index bda677ecd6..c172a76ab9 100644
--- a/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Audio/VolumeSettings.cs
@@ -20,28 +20,28 @@ namespace osu.Game.Overlays.Settings.Sections.Audio
                 new SettingsSlider<double>
                 {
                     LabelText = "Master",
-                    Bindable = audio.Volume,
+                    Current = audio.Volume,
                     KeyboardStep = 0.01f,
                     DisplayAsPercentage = true
                 },
                 new SettingsSlider<double>
                 {
                     LabelText = "Master (window inactive)",
-                    Bindable = config.GetBindable<double>(OsuSetting.VolumeInactive),
+                    Current = config.GetBindable<double>(OsuSetting.VolumeInactive),
                     KeyboardStep = 0.01f,
                     DisplayAsPercentage = true
                 },
                 new SettingsSlider<double>
                 {
                     LabelText = "Effect",
-                    Bindable = audio.VolumeSample,
+                    Current = audio.VolumeSample,
                     KeyboardStep = 0.01f,
                     DisplayAsPercentage = true
                 },
                 new SettingsSlider<double>
                 {
                     LabelText = "Music",
-                    Bindable = audio.VolumeTrack,
+                    Current = audio.VolumeTrack,
                     KeyboardStep = 0.01f,
                     DisplayAsPercentage = true
                 },
diff --git a/osu.Game/Overlays/Settings/Sections/Debug/GeneralSettings.cs b/osu.Game/Overlays/Settings/Sections/Debug/GeneralSettings.cs
index 9edb18e065..f05b876d8f 100644
--- a/osu.Game/Overlays/Settings/Sections/Debug/GeneralSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Debug/GeneralSettings.cs
@@ -19,12 +19,12 @@ namespace osu.Game.Overlays.Settings.Sections.Debug
                 new SettingsCheckbox
                 {
                     LabelText = "Show log overlay",
-                    Bindable = frameworkConfig.GetBindable<bool>(FrameworkSetting.ShowLogOverlay)
+                    Current = frameworkConfig.GetBindable<bool>(FrameworkSetting.ShowLogOverlay)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Bypass front-to-back render pass",
-                    Bindable = config.GetBindable<bool>(DebugSetting.BypassFrontToBackPass)
+                    Current = config.GetBindable<bool>(DebugSetting.BypassFrontToBackPass)
                 }
             };
         }
diff --git a/osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs b/osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs
index 0149e6c3a6..73968761e2 100644
--- a/osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Gameplay/GeneralSettings.cs
@@ -21,62 +21,62 @@ namespace osu.Game.Overlays.Settings.Sections.Gameplay
                 new SettingsSlider<double>
                 {
                     LabelText = "Background dim",
-                    Bindable = config.GetBindable<double>(OsuSetting.DimLevel),
+                    Current = config.GetBindable<double>(OsuSetting.DimLevel),
                     KeyboardStep = 0.01f,
                     DisplayAsPercentage = true
                 },
                 new SettingsSlider<double>
                 {
                     LabelText = "Background blur",
-                    Bindable = config.GetBindable<double>(OsuSetting.BlurLevel),
+                    Current = config.GetBindable<double>(OsuSetting.BlurLevel),
                     KeyboardStep = 0.01f,
                     DisplayAsPercentage = true
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Lighten playfield during breaks",
-                    Bindable = config.GetBindable<bool>(OsuSetting.LightenDuringBreaks)
+                    Current = config.GetBindable<bool>(OsuSetting.LightenDuringBreaks)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Show score overlay",
-                    Bindable = config.GetBindable<bool>(OsuSetting.ShowInterface)
+                    Current = config.GetBindable<bool>(OsuSetting.ShowInterface)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Show difficulty graph on progress bar",
-                    Bindable = config.GetBindable<bool>(OsuSetting.ShowProgressGraph)
+                    Current = config.GetBindable<bool>(OsuSetting.ShowProgressGraph)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Show health display even when you can't fail",
-                    Bindable = config.GetBindable<bool>(OsuSetting.ShowHealthDisplayWhenCantFail),
+                    Current = config.GetBindable<bool>(OsuSetting.ShowHealthDisplayWhenCantFail),
                     Keywords = new[] { "hp", "bar" }
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Fade playfield to red when health is low",
-                    Bindable = config.GetBindable<bool>(OsuSetting.FadePlayfieldWhenHealthLow),
+                    Current = config.GetBindable<bool>(OsuSetting.FadePlayfieldWhenHealthLow),
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Always show key overlay",
-                    Bindable = config.GetBindable<bool>(OsuSetting.KeyOverlay)
+                    Current = config.GetBindable<bool>(OsuSetting.KeyOverlay)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Positional hitsounds",
-                    Bindable = config.GetBindable<bool>(OsuSetting.PositionalHitSounds)
+                    Current = config.GetBindable<bool>(OsuSetting.PositionalHitSounds)
                 },
                 new SettingsEnumDropdown<ScoreMeterType>
                 {
                     LabelText = "Score meter type",
-                    Bindable = config.GetBindable<ScoreMeterType>(OsuSetting.ScoreMeter)
+                    Current = config.GetBindable<ScoreMeterType>(OsuSetting.ScoreMeter)
                 },
                 new SettingsEnumDropdown<ScoringMode>
                 {
                     LabelText = "Score display mode",
-                    Bindable = config.GetBindable<ScoringMode>(OsuSetting.ScoreDisplayMode)
+                    Current = config.GetBindable<ScoringMode>(OsuSetting.ScoreDisplayMode)
                 }
             };
 
@@ -85,7 +85,7 @@ namespace osu.Game.Overlays.Settings.Sections.Gameplay
                 Add(new SettingsCheckbox
                 {
                     LabelText = "Disable Windows key during gameplay",
-                    Bindable = config.GetBindable<bool>(OsuSetting.GameplayDisableWinKey)
+                    Current = config.GetBindable<bool>(OsuSetting.GameplayDisableWinKey)
                 });
             }
         }
diff --git a/osu.Game/Overlays/Settings/Sections/Gameplay/ModsSettings.cs b/osu.Game/Overlays/Settings/Sections/Gameplay/ModsSettings.cs
index 0babb98066..2b2fb9cef7 100644
--- a/osu.Game/Overlays/Settings/Sections/Gameplay/ModsSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Gameplay/ModsSettings.cs
@@ -22,7 +22,7 @@ namespace osu.Game.Overlays.Settings.Sections.Gameplay
                 new SettingsCheckbox
                 {
                     LabelText = "Increase visibility of first object when visual impairment mods are enabled",
-                    Bindable = config.GetBindable<bool>(OsuSetting.IncreaseFirstObjectVisibility),
+                    Current = config.GetBindable<bool>(OsuSetting.IncreaseFirstObjectVisibility),
                 },
             };
         }
diff --git a/osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs b/osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs
index 0c42247993..b26876556e 100644
--- a/osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Gameplay/SongSelectSettings.cs
@@ -31,31 +31,31 @@ namespace osu.Game.Overlays.Settings.Sections.Gameplay
                 new SettingsCheckbox
                 {
                     LabelText = "Right mouse drag to absolute scroll",
-                    Bindable = config.GetBindable<bool>(OsuSetting.SongSelectRightMouseScroll),
+                    Current = config.GetBindable<bool>(OsuSetting.SongSelectRightMouseScroll),
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Show converted beatmaps",
-                    Bindable = config.GetBindable<bool>(OsuSetting.ShowConvertedBeatmaps),
+                    Current = config.GetBindable<bool>(OsuSetting.ShowConvertedBeatmaps),
                 },
                 new SettingsSlider<double, StarsSlider>
                 {
                     LabelText = "Display beatmaps from",
-                    Bindable = config.GetBindable<double>(OsuSetting.DisplayStarsMinimum),
+                    Current = config.GetBindable<double>(OsuSetting.DisplayStarsMinimum),
                     KeyboardStep = 0.1f,
                     Keywords = new[] { "minimum", "maximum", "star", "difficulty" }
                 },
                 new SettingsSlider<double, MaximumStarsSlider>
                 {
                     LabelText = "up to",
-                    Bindable = config.GetBindable<double>(OsuSetting.DisplayStarsMaximum),
+                    Current = config.GetBindable<double>(OsuSetting.DisplayStarsMaximum),
                     KeyboardStep = 0.1f,
                     Keywords = new[] { "minimum", "maximum", "star", "difficulty" }
                 },
                 new SettingsEnumDropdown<RandomSelectAlgorithm>
                 {
                     LabelText = "Random selection algorithm",
-                    Bindable = config.GetBindable<RandomSelectAlgorithm>(OsuSetting.RandomSelectAlgorithm),
+                    Current = config.GetBindable<RandomSelectAlgorithm>(OsuSetting.RandomSelectAlgorithm),
                 }
             };
         }
diff --git a/osu.Game/Overlays/Settings/Sections/General/LanguageSettings.cs b/osu.Game/Overlays/Settings/Sections/General/LanguageSettings.cs
index 236bfbecc3..44e42ecbfe 100644
--- a/osu.Game/Overlays/Settings/Sections/General/LanguageSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/General/LanguageSettings.cs
@@ -19,7 +19,7 @@ namespace osu.Game.Overlays.Settings.Sections.General
                 new SettingsCheckbox
                 {
                     LabelText = "Prefer metadata in original language",
-                    Bindable = frameworkConfig.GetBindable<bool>(FrameworkSetting.ShowUnicode)
+                    Current = frameworkConfig.GetBindable<bool>(FrameworkSetting.ShowUnicode)
                 },
             };
         }
diff --git a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
index f96e204f62..9e358d0cf5 100644
--- a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs
@@ -240,12 +240,12 @@ namespace osu.Game.Overlays.Settings.Sections.General
                     new SettingsCheckbox
                     {
                         LabelText = "Remember username",
-                        Bindable = config.GetBindable<bool>(OsuSetting.SaveUsername),
+                        Current = config.GetBindable<bool>(OsuSetting.SaveUsername),
                     },
                     new SettingsCheckbox
                     {
                         LabelText = "Stay signed in",
-                        Bindable = config.GetBindable<bool>(OsuSetting.SavePassword),
+                        Current = config.GetBindable<bool>(OsuSetting.SavePassword),
                     },
                     new Container
                     {
diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs
index 9c7d0b0be4..a59a6b00b9 100644
--- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs
@@ -27,7 +27,7 @@ namespace osu.Game.Overlays.Settings.Sections.General
             Add(new SettingsEnumDropdown<ReleaseStream>
             {
                 LabelText = "Release stream",
-                Bindable = config.GetBindable<ReleaseStream>(OsuSetting.ReleaseStream),
+                Current = config.GetBindable<ReleaseStream>(OsuSetting.ReleaseStream),
             });
 
             if (updateManager?.CanCheckForUpdate == true)
diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/DetailSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/DetailSettings.cs
index 3089040f96..30caa45995 100644
--- a/osu.Game/Overlays/Settings/Sections/Graphics/DetailSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Graphics/DetailSettings.cs
@@ -19,22 +19,22 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
                 new SettingsCheckbox
                 {
                     LabelText = "Storyboard / Video",
-                    Bindable = config.GetBindable<bool>(OsuSetting.ShowStoryboard)
+                    Current = config.GetBindable<bool>(OsuSetting.ShowStoryboard)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Hit Lighting",
-                    Bindable = config.GetBindable<bool>(OsuSetting.HitLighting)
+                    Current = config.GetBindable<bool>(OsuSetting.HitLighting)
                 },
                 new SettingsEnumDropdown<ScreenshotFormat>
                 {
                     LabelText = "Screenshot format",
-                    Bindable = config.GetBindable<ScreenshotFormat>(OsuSetting.ScreenshotFormat)
+                    Current = config.GetBindable<ScreenshotFormat>(OsuSetting.ScreenshotFormat)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Show menu cursor in screenshots",
-                    Bindable = config.GetBindable<bool>(OsuSetting.ScreenshotCaptureMenuCursor)
+                    Current = config.GetBindable<bool>(OsuSetting.ScreenshotCaptureMenuCursor)
                 }
             };
         }
diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
index 4312b319c0..14b8dbfac0 100644
--- a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
@@ -62,7 +62,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
                 windowModeDropdown = new SettingsDropdown<WindowMode>
                 {
                     LabelText = "Screen mode",
-                    Bindable = config.GetBindable<WindowMode>(FrameworkSetting.WindowMode),
+                    Current = config.GetBindable<WindowMode>(FrameworkSetting.WindowMode),
                     ItemSource = windowModes,
                 },
                 resolutionSettingsContainer = new Container
@@ -74,14 +74,14 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
                 {
                     LabelText = "UI Scaling",
                     TransferValueOnCommit = true,
-                    Bindable = osuConfig.GetBindable<float>(OsuSetting.UIScale),
+                    Current = osuConfig.GetBindable<float>(OsuSetting.UIScale),
                     KeyboardStep = 0.01f,
                     Keywords = new[] { "scale", "letterbox" },
                 },
                 new SettingsEnumDropdown<ScalingMode>
                 {
                     LabelText = "Screen Scaling",
-                    Bindable = osuConfig.GetBindable<ScalingMode>(OsuSetting.Scaling),
+                    Current = osuConfig.GetBindable<ScalingMode>(OsuSetting.Scaling),
                     Keywords = new[] { "scale", "letterbox" },
                 },
                 scalingSettings = new FillFlowContainer<SettingsSlider<float>>
@@ -97,28 +97,28 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
                         new SettingsSlider<float>
                         {
                             LabelText = "Horizontal position",
-                            Bindable = scalingPositionX,
+                            Current = scalingPositionX,
                             KeyboardStep = 0.01f,
                             DisplayAsPercentage = true
                         },
                         new SettingsSlider<float>
                         {
                             LabelText = "Vertical position",
-                            Bindable = scalingPositionY,
+                            Current = scalingPositionY,
                             KeyboardStep = 0.01f,
                             DisplayAsPercentage = true
                         },
                         new SettingsSlider<float>
                         {
                             LabelText = "Horizontal scale",
-                            Bindable = scalingSizeX,
+                            Current = scalingSizeX,
                             KeyboardStep = 0.01f,
                             DisplayAsPercentage = true
                         },
                         new SettingsSlider<float>
                         {
                             LabelText = "Vertical scale",
-                            Bindable = scalingSizeY,
+                            Current = scalingSizeY,
                             KeyboardStep = 0.01f,
                             DisplayAsPercentage = true
                         },
@@ -126,7 +126,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
                 },
             };
 
-            scalingSettings.ForEach(s => bindPreviewEvent(s.Bindable));
+            scalingSettings.ForEach(s => bindPreviewEvent(s.Current));
 
             var resolutions = getResolutions();
 
@@ -137,10 +137,10 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
                     LabelText = "Resolution",
                     ShowsDefaultIndicator = false,
                     Items = resolutions,
-                    Bindable = sizeFullscreen
+                    Current = sizeFullscreen
                 };
 
-                windowModeDropdown.Bindable.BindValueChanged(mode =>
+                windowModeDropdown.Current.BindValueChanged(mode =>
                 {
                     if (mode.NewValue == WindowMode.Fullscreen)
                     {
diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs
index 69ff9b43e5..8773e6763c 100644
--- a/osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Graphics/RendererSettings.cs
@@ -23,17 +23,17 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
                 new SettingsEnumDropdown<FrameSync>
                 {
                     LabelText = "Frame limiter",
-                    Bindable = config.GetBindable<FrameSync>(FrameworkSetting.FrameSync)
+                    Current = config.GetBindable<FrameSync>(FrameworkSetting.FrameSync)
                 },
                 new SettingsEnumDropdown<ExecutionMode>
                 {
                     LabelText = "Threading mode",
-                    Bindable = config.GetBindable<ExecutionMode>(FrameworkSetting.ExecutionMode)
+                    Current = config.GetBindable<ExecutionMode>(FrameworkSetting.ExecutionMode)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Show FPS",
-                    Bindable = osuConfig.GetBindable<bool>(OsuSetting.ShowFpsDisplay)
+                    Current = osuConfig.GetBindable<bool>(OsuSetting.ShowFpsDisplay)
                 },
             };
         }
diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/UserInterfaceSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/UserInterfaceSettings.cs
index a8953ac3a2..38c30ddd64 100644
--- a/osu.Game/Overlays/Settings/Sections/Graphics/UserInterfaceSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Graphics/UserInterfaceSettings.cs
@@ -20,17 +20,17 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
                 new SettingsCheckbox
                 {
                     LabelText = "Rotate cursor when dragging",
-                    Bindable = config.GetBindable<bool>(OsuSetting.CursorRotation)
+                    Current = config.GetBindable<bool>(OsuSetting.CursorRotation)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Parallax",
-                    Bindable = config.GetBindable<bool>(OsuSetting.MenuParallax)
+                    Current = config.GetBindable<bool>(OsuSetting.MenuParallax)
                 },
                 new SettingsSlider<float, TimeSlider>
                 {
                     LabelText = "Hold-to-confirm activation time",
-                    Bindable = config.GetBindable<float>(OsuSetting.UIHoldActivationDelay),
+                    Current = config.GetBindable<float>(OsuSetting.UIHoldActivationDelay),
                     KeyboardStep = 50
                 },
             };
diff --git a/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs b/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs
index d27ab63fb7..5227e328ec 100644
--- a/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs
@@ -35,32 +35,32 @@ namespace osu.Game.Overlays.Settings.Sections.Input
                 new SettingsCheckbox
                 {
                     LabelText = "Raw input",
-                    Bindable = rawInputToggle
+                    Current = rawInputToggle
                 },
                 new SensitivitySetting
                 {
                     LabelText = "Cursor sensitivity",
-                    Bindable = sensitivityBindable
+                    Current = sensitivityBindable
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Map absolute input to window",
-                    Bindable = config.GetBindable<bool>(FrameworkSetting.MapAbsoluteInputToWindow)
+                    Current = config.GetBindable<bool>(FrameworkSetting.MapAbsoluteInputToWindow)
                 },
                 new SettingsEnumDropdown<ConfineMouseMode>
                 {
                     LabelText = "Confine mouse cursor to window",
-                    Bindable = config.GetBindable<ConfineMouseMode>(FrameworkSetting.ConfineMouseMode),
+                    Current = config.GetBindable<ConfineMouseMode>(FrameworkSetting.ConfineMouseMode),
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Disable mouse wheel during gameplay",
-                    Bindable = osuConfig.GetBindable<bool>(OsuSetting.MouseDisableWheel)
+                    Current = osuConfig.GetBindable<bool>(OsuSetting.MouseDisableWheel)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Disable mouse buttons during gameplay",
-                    Bindable = osuConfig.GetBindable<bool>(OsuSetting.MouseDisableButtons)
+                    Current = osuConfig.GetBindable<bool>(OsuSetting.MouseDisableButtons)
                 },
             };
 
diff --git a/osu.Game/Overlays/Settings/Sections/Online/WebSettings.cs b/osu.Game/Overlays/Settings/Sections/Online/WebSettings.cs
index 23513eade8..6461bd7b93 100644
--- a/osu.Game/Overlays/Settings/Sections/Online/WebSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Online/WebSettings.cs
@@ -19,13 +19,13 @@ namespace osu.Game.Overlays.Settings.Sections.Online
                 new SettingsCheckbox
                 {
                     LabelText = "Warn about opening external links",
-                    Bindable = config.GetBindable<bool>(OsuSetting.ExternalLinkWarning)
+                    Current = config.GetBindable<bool>(OsuSetting.ExternalLinkWarning)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Prefer downloads without video",
                     Keywords = new[] { "no-video" },
-                    Bindable = config.GetBindable<bool>(OsuSetting.PreferNoVideo)
+                    Current = config.GetBindable<bool>(OsuSetting.PreferNoVideo)
                 },
             };
         }
diff --git a/osu.Game/Overlays/Settings/Sections/SkinSection.cs b/osu.Game/Overlays/Settings/Sections/SkinSection.cs
index 596d3a9801..1ade4befdc 100644
--- a/osu.Game/Overlays/Settings/Sections/SkinSection.cs
+++ b/osu.Game/Overlays/Settings/Sections/SkinSection.cs
@@ -47,29 +47,29 @@ namespace osu.Game.Overlays.Settings.Sections
                 new SettingsSlider<float, SizeSlider>
                 {
                     LabelText = "Menu cursor size",
-                    Bindable = config.GetBindable<float>(OsuSetting.MenuCursorSize),
+                    Current = config.GetBindable<float>(OsuSetting.MenuCursorSize),
                     KeyboardStep = 0.01f
                 },
                 new SettingsSlider<float, SizeSlider>
                 {
                     LabelText = "Gameplay cursor size",
-                    Bindable = config.GetBindable<float>(OsuSetting.GameplayCursorSize),
+                    Current = config.GetBindable<float>(OsuSetting.GameplayCursorSize),
                     KeyboardStep = 0.01f
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Adjust gameplay cursor size based on current beatmap",
-                    Bindable = config.GetBindable<bool>(OsuSetting.AutoCursorSize)
+                    Current = config.GetBindable<bool>(OsuSetting.AutoCursorSize)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Beatmap skins",
-                    Bindable = config.GetBindable<bool>(OsuSetting.BeatmapSkins)
+                    Current = config.GetBindable<bool>(OsuSetting.BeatmapSkins)
                 },
                 new SettingsCheckbox
                 {
                     LabelText = "Beatmap hitsounds",
-                    Bindable = config.GetBindable<bool>(OsuSetting.BeatmapHitsounds)
+                    Current = config.GetBindable<bool>(OsuSetting.BeatmapHitsounds)
                 },
             };
 
@@ -81,7 +81,7 @@ namespace osu.Game.Overlays.Settings.Sections
 
             config.BindWith(OsuSetting.Skin, configBindable);
 
-            skinDropdown.Bindable = dropdownBindable;
+            skinDropdown.Current = dropdownBindable;
             skinDropdown.Items = skins.GetAllUsableSkins().ToArray();
 
             // Todo: This should not be necessary when OsuConfigManager is databased
diff --git a/osu.Game/Overlays/Settings/SettingsItem.cs b/osu.Game/Overlays/Settings/SettingsItem.cs
index c2dd40d2a6..ad6aaafd9d 100644
--- a/osu.Game/Overlays/Settings/SettingsItem.cs
+++ b/osu.Game/Overlays/Settings/SettingsItem.cs
@@ -21,7 +21,7 @@ using osuTK;
 
 namespace osu.Game.Overlays.Settings
 {
-    public abstract class SettingsItem<T> : Container, IFilterable, ISettingsItem
+    public abstract class SettingsItem<T> : Container, IFilterable, ISettingsItem, IHasCurrentValue<T>
     {
         protected abstract Drawable CreateControl();
 
@@ -54,7 +54,7 @@ namespace osu.Game.Overlays.Settings
             }
         }
 
-        public virtual Bindable<T> Bindable
+        public virtual Bindable<T> Current
         {
             get => controlWithCurrent.Current;
             set => controlWithCurrent.Current = value;
diff --git a/osu.Game/Screens/Edit/Timing/SliderWithTextBoxInput.cs b/osu.Game/Screens/Edit/Timing/SliderWithTextBoxInput.cs
index d5afc8978d..f2f9f76143 100644
--- a/osu.Game/Screens/Edit/Timing/SliderWithTextBoxInput.cs
+++ b/osu.Game/Screens/Edit/Timing/SliderWithTextBoxInput.cs
@@ -11,7 +11,7 @@ using osu.Game.Overlays.Settings;
 
 namespace osu.Game.Screens.Edit.Timing
 {
-    internal class SliderWithTextBoxInput<T> : CompositeDrawable, IHasCurrentValue<T>
+    public class SliderWithTextBoxInput<T> : CompositeDrawable, IHasCurrentValue<T>
         where T : struct, IEquatable<T>, IComparable<T>, IConvertible
     {
         private readonly SettingsSlider<T> slider;
@@ -51,7 +51,7 @@ namespace osu.Game.Screens.Edit.Timing
 
                 try
                 {
-                    slider.Bindable.Parse(t.Text);
+                    slider.Current.Parse(t.Text);
                 }
                 catch
                 {
@@ -71,8 +71,8 @@ namespace osu.Game.Screens.Edit.Timing
 
         public Bindable<T> Current
         {
-            get => slider.Bindable;
-            set => slider.Bindable = value;
+            get => slider.Current;
+            set => slider.Current = value;
         }
     }
 }
diff --git a/osu.Game/Screens/Edit/Timing/TimingSection.cs b/osu.Game/Screens/Edit/Timing/TimingSection.cs
index 2ab8703cc4..1ae2a86885 100644
--- a/osu.Game/Screens/Edit/Timing/TimingSection.cs
+++ b/osu.Game/Screens/Edit/Timing/TimingSection.cs
@@ -36,14 +36,14 @@ namespace osu.Game.Screens.Edit.Timing
         {
             if (point.NewValue != null)
             {
-                bpmSlider.Bindable = point.NewValue.BeatLengthBindable;
-                bpmSlider.Bindable.BindValueChanged(_ => ChangeHandler?.SaveState());
+                bpmSlider.Current = point.NewValue.BeatLengthBindable;
+                bpmSlider.Current.BindValueChanged(_ => ChangeHandler?.SaveState());
 
                 bpmTextEntry.Bindable = point.NewValue.BeatLengthBindable;
                 // no need to hook change handler here as it's the same bindable as above
 
-                timeSignature.Bindable = point.NewValue.TimeSignatureBindable;
-                timeSignature.Bindable.BindValueChanged(_ => ChangeHandler?.SaveState());
+                timeSignature.Current = point.NewValue.TimeSignatureBindable;
+                timeSignature.Current.BindValueChanged(_ => ChangeHandler?.SaveState());
             }
         }
 
@@ -121,14 +121,14 @@ namespace osu.Game.Screens.Edit.Timing
                 beatLengthBindable.BindValueChanged(beatLength => updateCurrent(beatLengthToBpm(beatLength.NewValue)), true);
                 bpmBindable.BindValueChanged(bpm => beatLengthBindable.Value = beatLengthToBpm(bpm.NewValue));
 
-                base.Bindable = bpmBindable;
+                base.Current = bpmBindable;
 
                 TransferValueOnCommit = true;
             }
 
-            public override Bindable<double> Bindable
+            public override Bindable<double> Current
             {
-                get => base.Bindable;
+                get => base.Current;
                 set
                 {
                     // incoming will be beat length, not bpm
diff --git a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs
index 24ddc277cd..16e29ac3c8 100644
--- a/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs
+++ b/osu.Game/Screens/Play/PlayerSettings/PlaybackSettings.cs
@@ -51,14 +51,14 @@ namespace osu.Game.Screens.Play.PlayerSettings
                         }
                     },
                 },
-                rateSlider = new PlayerSliderBar<double> { Bindable = UserPlaybackRate }
+                rateSlider = new PlayerSliderBar<double> { Current = UserPlaybackRate }
             };
         }
 
         protected override void LoadComplete()
         {
             base.LoadComplete();
-            rateSlider.Bindable.BindValueChanged(multiplier => multiplierText.Text = $"{multiplier.NewValue:0.0}x", true);
+            rateSlider.Current.BindValueChanged(multiplier => multiplierText.Text = $"{multiplier.NewValue:0.0}x", true);
         }
     }
 }
diff --git a/osu.Game/Screens/Play/PlayerSettings/VisualSettings.cs b/osu.Game/Screens/Play/PlayerSettings/VisualSettings.cs
index e06cf5c6d5..8f29fe7893 100644
--- a/osu.Game/Screens/Play/PlayerSettings/VisualSettings.cs
+++ b/osu.Game/Screens/Play/PlayerSettings/VisualSettings.cs
@@ -50,8 +50,8 @@ namespace osu.Game.Screens.Play.PlayerSettings
         [BackgroundDependencyLoader]
         private void load(OsuConfigManager config)
         {
-            dimSliderBar.Bindable = config.GetBindable<double>(OsuSetting.DimLevel);
-            blurSliderBar.Bindable = config.GetBindable<double>(OsuSetting.BlurLevel);
+            dimSliderBar.Current = config.GetBindable<double>(OsuSetting.DimLevel);
+            blurSliderBar.Current = config.GetBindable<double>(OsuSetting.BlurLevel);
             showStoryboardToggle.Current = config.GetBindable<bool>(OsuSetting.ShowStoryboard);
             beatmapSkinsToggle.Current = config.GetBindable<bool>(OsuSetting.BeatmapSkins);
             beatmapHitsoundsToggle.Current = config.GetBindable<bool>(OsuSetting.BeatmapHitsounds);

From e1a6f47d90b226ed0525d4e113cdac3b59e05afb Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Tue, 6 Oct 2020 16:40:47 +0900
Subject: [PATCH 02/10] Add the most basic implementation of LabelledSliderBar
 feasible

---
 .../TestSceneLabelledSliderBar.cs             | 46 +++++++++++++++++++
 .../UserInterfaceV2/LabelledSliderBar.cs      | 24 ++++++++++
 2 files changed, 70 insertions(+)
 create mode 100644 osu.Game.Tests/Visual/UserInterface/TestSceneLabelledSliderBar.cs
 create mode 100644 osu.Game/Graphics/UserInterfaceV2/LabelledSliderBar.cs

diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneLabelledSliderBar.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneLabelledSliderBar.cs
new file mode 100644
index 0000000000..393420e700
--- /dev/null
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneLabelledSliderBar.cs
@@ -0,0 +1,46 @@
+// 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.Bindables;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Graphics.UserInterfaceV2;
+
+namespace osu.Game.Tests.Visual.UserInterface
+{
+    public class TestSceneLabelledSliderBar : OsuTestScene
+    {
+        [TestCase(false)]
+        [TestCase(true)]
+        public void TestSliderBar(bool hasDescription) => createSliderBar(hasDescription);
+
+        private void createSliderBar(bool hasDescription = false)
+        {
+            AddStep("create component", () =>
+            {
+                LabelledSliderBar<double> component;
+
+                Child = new Container
+                {
+                    Anchor = Anchor.Centre,
+                    Origin = Anchor.Centre,
+                    Width = 500,
+                    AutoSizeAxes = Axes.Y,
+                    Child = component = new LabelledSliderBar<double>
+                    {
+                        Current = new BindableDouble(5)
+                        {
+                            MinValue = 0,
+                            MaxValue = 10,
+                            Precision = 1,
+                        }
+                    }
+                };
+
+                component.Label = "a sample component";
+                component.Description = hasDescription ? "this text describes the component" : string.Empty;
+            });
+        }
+    }
+}
diff --git a/osu.Game/Graphics/UserInterfaceV2/LabelledSliderBar.cs b/osu.Game/Graphics/UserInterfaceV2/LabelledSliderBar.cs
new file mode 100644
index 0000000000..cba94e314b
--- /dev/null
+++ b/osu.Game/Graphics/UserInterfaceV2/LabelledSliderBar.cs
@@ -0,0 +1,24 @@
+// 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 System;
+using osu.Framework.Graphics;
+using osu.Game.Overlays.Settings;
+
+namespace osu.Game.Graphics.UserInterfaceV2
+{
+    public class LabelledSliderBar<TNumber> : LabelledComponent<SettingsSlider<TNumber>, TNumber>
+        where TNumber : struct, IEquatable<TNumber>, IComparable<TNumber>, IConvertible
+    {
+        public LabelledSliderBar()
+            : base(true)
+        {
+        }
+
+        protected override SettingsSlider<TNumber> CreateComponent() => new SettingsSlider<TNumber>
+        {
+            TransferValueOnCommit = true,
+            RelativeSizeAxes = Axes.X,
+        };
+    }
+}

From 13b67b93a5ba3ff79a78b3a92a7ae1c60f6d0f7c Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Tue, 6 Oct 2020 15:51:40 +0900
Subject: [PATCH 03/10] Add difficulty section

---
 .../Screens/Edit/Setup/DifficultySection.cs   | 25 +++++++++++++++++++
 osu.Game/Screens/Edit/Setup/SetupScreen.cs    |  1 +
 2 files changed, 26 insertions(+)
 create mode 100644 osu.Game/Screens/Edit/Setup/DifficultySection.cs

diff --git a/osu.Game/Screens/Edit/Setup/DifficultySection.cs b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
new file mode 100644
index 0000000000..952ce90273
--- /dev/null
+++ b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
@@ -0,0 +1,25 @@
+// 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 osu.Framework.Allocation;
+using osu.Framework.Graphics;
+using osu.Game.Graphics.Sprites;
+
+namespace osu.Game.Screens.Edit.Setup
+{
+    internal class DifficultySection : SetupSection
+    {
+        [BackgroundDependencyLoader]
+        private void load()
+        {
+            Flow.Children = new Drawable[]
+            {
+                new OsuSpriteText
+                {
+                    Text = "Difficulty settings"
+                },
+                new LabelledSlider()
+            };
+        }
+    }
+}
diff --git a/osu.Game/Screens/Edit/Setup/SetupScreen.cs b/osu.Game/Screens/Edit/Setup/SetupScreen.cs
index cd4f6733c0..1c3cbb7206 100644
--- a/osu.Game/Screens/Edit/Setup/SetupScreen.cs
+++ b/osu.Game/Screens/Edit/Setup/SetupScreen.cs
@@ -52,6 +52,7 @@ namespace osu.Game.Screens.Edit.Setup
                             {
                                 new ResourcesSection(),
                                 new MetadataSection(),
+                                new DifficultySection(),
                             }
                         },
                     }

From 6d7f12ad4bc68c1573a71b8811e8b0a4adebc09e Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Tue, 6 Oct 2020 17:01:50 +0900
Subject: [PATCH 04/10] Add basic difficulty setting sliders

---
 .../Screens/Edit/Setup/DifficultySection.cs   | 63 ++++++++++++++++++-
 1 file changed, 62 insertions(+), 1 deletion(-)

diff --git a/osu.Game/Screens/Edit/Setup/DifficultySection.cs b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
index 952ce90273..0434c1cf1f 100644
--- a/osu.Game/Screens/Edit/Setup/DifficultySection.cs
+++ b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
@@ -1,14 +1,23 @@
 // 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 System.Linq;
 using osu.Framework.Allocation;
+using osu.Framework.Bindables;
 using osu.Framework.Graphics;
+using osu.Game.Beatmaps;
 using osu.Game.Graphics.Sprites;
+using osu.Game.Graphics.UserInterfaceV2;
 
 namespace osu.Game.Screens.Edit.Setup
 {
     internal class DifficultySection : SetupSection
     {
+        private LabelledSliderBar<float> circleSizeSlider;
+        private LabelledSliderBar<float> healthDrainSlider;
+        private LabelledSliderBar<float> approachRateSlider;
+        private LabelledSliderBar<float> overallDifficultySlider;
+
         [BackgroundDependencyLoader]
         private void load()
         {
@@ -18,8 +27,60 @@ namespace osu.Game.Screens.Edit.Setup
                 {
                     Text = "Difficulty settings"
                 },
-                new LabelledSlider()
+                circleSizeSlider = new LabelledSliderBar<float>
+                {
+                    Label = "Circle Size",
+                    Current = new BindableFloat(Beatmap.Value.BeatmapInfo.BaseDifficulty.CircleSize)
+                    {
+                        Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
+                        MinValue = 2,
+                        MaxValue = 7
+                    }
+                },
+                healthDrainSlider = new LabelledSliderBar<float>
+                {
+                    Label = "Health Drain",
+                    Current = new BindableFloat(Beatmap.Value.BeatmapInfo.BaseDifficulty.DrainRate)
+                    {
+                        Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
+                        MinValue = 0,
+                        MaxValue = 10
+                    }
+                },
+                approachRateSlider = new LabelledSliderBar<float>
+                {
+                    Label = "Approach Rate",
+                    Current = new BindableFloat(Beatmap.Value.BeatmapInfo.BaseDifficulty.ApproachRate)
+                    {
+                        Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
+                        MinValue = 0,
+                        MaxValue = 10
+                    }
+                },
+                overallDifficultySlider = new LabelledSliderBar<float>
+                {
+                    Label = "Overall Difficulty",
+                    Current = new BindableFloat(Beatmap.Value.BeatmapInfo.BaseDifficulty.OverallDifficulty)
+                    {
+                        Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
+                        MinValue = 0,
+                        MaxValue = 10
+                    }
+                },
             };
+
+            foreach (var item in Flow.OfType<LabelledSliderBar<float>>())
+                item.Current.ValueChanged += onValueChanged;
+        }
+
+        private void onValueChanged(ValueChangedEvent<float> args)
+        {
+            // for now, update these on commit rather than making BeatmapMetadata bindables.
+            // after switching database engines we can reconsider if switching to bindables is a good direction.
+            Beatmap.Value.BeatmapInfo.BaseDifficulty.CircleSize = circleSizeSlider.Current.Value;
+            Beatmap.Value.BeatmapInfo.BaseDifficulty.DrainRate = healthDrainSlider.Current.Value;
+            Beatmap.Value.BeatmapInfo.BaseDifficulty.ApproachRate = approachRateSlider.Current.Value;
+            Beatmap.Value.BeatmapInfo.BaseDifficulty.OverallDifficulty = overallDifficultySlider.Current.Value;
         }
     }
 }

From 7a20a34aff82cbf491a21da19c18ae156d346378 Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Tue, 6 Oct 2020 17:12:19 +0900
Subject: [PATCH 05/10] Add support to EditorBeatmap to update all hitobjects

---
 osu.Game/Screens/Edit/EditorBeatmap.cs           | 9 +++++++++
 osu.Game/Screens/Edit/Setup/DifficultySection.cs | 5 +++++
 2 files changed, 14 insertions(+)

diff --git a/osu.Game/Screens/Edit/EditorBeatmap.cs b/osu.Game/Screens/Edit/EditorBeatmap.cs
index 3248c5b8be..d37b7dd2b5 100644
--- a/osu.Game/Screens/Edit/EditorBeatmap.cs
+++ b/osu.Game/Screens/Edit/EditorBeatmap.cs
@@ -258,5 +258,14 @@ namespace osu.Game.Screens.Edit
         public double GetBeatLengthAtTime(double referenceTime) => ControlPointInfo.TimingPointAt(referenceTime).BeatLength / BeatDivisor;
 
         public int BeatDivisor => beatDivisor?.Value ?? 1;
+
+        /// <summary>
+        /// Update all hit objects with potentially changed difficulty or control point data.
+        /// </summary>
+        public void UpdateBeatmap()
+        {
+            foreach (var h in HitObjects)
+                pendingUpdates.Add(h);
+        }
     }
 }
diff --git a/osu.Game/Screens/Edit/Setup/DifficultySection.cs b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
index 0434c1cf1f..ce6f617f37 100644
--- a/osu.Game/Screens/Edit/Setup/DifficultySection.cs
+++ b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
@@ -13,6 +13,9 @@ namespace osu.Game.Screens.Edit.Setup
 {
     internal class DifficultySection : SetupSection
     {
+        [Resolved]
+        private EditorBeatmap editorBeatmap { get; set; }
+
         private LabelledSliderBar<float> circleSizeSlider;
         private LabelledSliderBar<float> healthDrainSlider;
         private LabelledSliderBar<float> approachRateSlider;
@@ -81,6 +84,8 @@ namespace osu.Game.Screens.Edit.Setup
             Beatmap.Value.BeatmapInfo.BaseDifficulty.DrainRate = healthDrainSlider.Current.Value;
             Beatmap.Value.BeatmapInfo.BaseDifficulty.ApproachRate = approachRateSlider.Current.Value;
             Beatmap.Value.BeatmapInfo.BaseDifficulty.OverallDifficulty = overallDifficultySlider.Current.Value;
+
+            editorBeatmap.UpdateBeatmap();
         }
     }
 }

From 7e8ab1cb9587913ba6c50ec362c871e7b4240e73 Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Tue, 6 Oct 2020 17:17:03 +0900
Subject: [PATCH 06/10] Add description text

---
 osu.Game/Screens/Edit/Setup/DifficultySection.cs | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/osu.Game/Screens/Edit/Setup/DifficultySection.cs b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
index ce6f617f37..4ed8d0164b 100644
--- a/osu.Game/Screens/Edit/Setup/DifficultySection.cs
+++ b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
@@ -32,7 +32,8 @@ namespace osu.Game.Screens.Edit.Setup
                 },
                 circleSizeSlider = new LabelledSliderBar<float>
                 {
-                    Label = "Circle Size",
+                    Label = "Object Size",
+                    Description = "The size of all hit objects",
                     Current = new BindableFloat(Beatmap.Value.BeatmapInfo.BaseDifficulty.CircleSize)
                     {
                         Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
@@ -43,6 +44,7 @@ namespace osu.Game.Screens.Edit.Setup
                 healthDrainSlider = new LabelledSliderBar<float>
                 {
                     Label = "Health Drain",
+                    Description = "The rate of passive health drain throughout playable time",
                     Current = new BindableFloat(Beatmap.Value.BeatmapInfo.BaseDifficulty.DrainRate)
                     {
                         Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
@@ -53,6 +55,7 @@ namespace osu.Game.Screens.Edit.Setup
                 approachRateSlider = new LabelledSliderBar<float>
                 {
                     Label = "Approach Rate",
+                    Description = "The speed at which objects are presented to the player",
                     Current = new BindableFloat(Beatmap.Value.BeatmapInfo.BaseDifficulty.ApproachRate)
                     {
                         Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
@@ -63,6 +66,7 @@ namespace osu.Game.Screens.Edit.Setup
                 overallDifficultySlider = new LabelledSliderBar<float>
                 {
                     Label = "Overall Difficulty",
+                    Description = "The harshness of hit windows and difficulty of special objects (ie. spinners)",
                     Current = new BindableFloat(Beatmap.Value.BeatmapInfo.BaseDifficulty.OverallDifficulty)
                     {
                         Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,

From 461be02e6f9ff563ebe458603f9ecaaf6fd9aa26 Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Tue, 6 Oct 2020 19:34:21 +0900
Subject: [PATCH 07/10] Update with underlying changes

---
 osu.Game/Screens/Edit/Setup/DifficultySection.cs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/osu.Game/Screens/Edit/Setup/DifficultySection.cs b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
index 4ed8d0164b..f23bc0f3b2 100644
--- a/osu.Game/Screens/Edit/Setup/DifficultySection.cs
+++ b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
@@ -24,7 +24,7 @@ namespace osu.Game.Screens.Edit.Setup
         [BackgroundDependencyLoader]
         private void load()
         {
-            Flow.Children = new Drawable[]
+            Children = new Drawable[]
             {
                 new OsuSpriteText
                 {
@@ -76,7 +76,7 @@ namespace osu.Game.Screens.Edit.Setup
                 },
             };
 
-            foreach (var item in Flow.OfType<LabelledSliderBar<float>>())
+            foreach (var item in Children.OfType<LabelledSliderBar<float>>())
                 item.Current.ValueChanged += onValueChanged;
         }
 

From afe3d3989a08a4e6aa0e8d88cc01d7cff78e40ee Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Tue, 6 Oct 2020 19:04:50 +0900
Subject: [PATCH 08/10] Force first hitobject to be a NewCombo in
 BeatmapProcessor preprocessing step

---
 osu.Game/Beatmaps/BeatmapProcessor.cs | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/osu.Game/Beatmaps/BeatmapProcessor.cs b/osu.Game/Beatmaps/BeatmapProcessor.cs
index 250cc49ad4..b7b5adc52e 100644
--- a/osu.Game/Beatmaps/BeatmapProcessor.cs
+++ b/osu.Game/Beatmaps/BeatmapProcessor.cs
@@ -22,8 +22,18 @@ namespace osu.Game.Beatmaps
         {
             IHasComboInformation lastObj = null;
 
+            bool isFirst = true;
+
             foreach (var obj in Beatmap.HitObjects.OfType<IHasComboInformation>())
             {
+                if (isFirst)
+                {
+                    obj.NewCombo = true;
+
+                    // first hitobject should always be marked as a new combo for sanity.
+                    isFirst = false;
+                }
+
                 if (obj.NewCombo)
                 {
                     obj.IndexInCurrentCombo = 0;

From 1f2dd13b49ccaeb572150b159bac8420c22f2dd4 Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Tue, 6 Oct 2020 19:04:58 +0900
Subject: [PATCH 09/10] Update tests

---
 .../Editing/LegacyEditorBeatmapPatcherTest.cs | 45 ++++++++++---------
 1 file changed, 24 insertions(+), 21 deletions(-)

diff --git a/osu.Game.Tests/Editing/LegacyEditorBeatmapPatcherTest.cs b/osu.Game.Tests/Editing/LegacyEditorBeatmapPatcherTest.cs
index b491157627..afaaafdd26 100644
--- a/osu.Game.Tests/Editing/LegacyEditorBeatmapPatcherTest.cs
+++ b/osu.Game.Tests/Editing/LegacyEditorBeatmapPatcherTest.cs
@@ -44,7 +44,7 @@ namespace osu.Game.Tests.Editing
             {
                 HitObjects =
                 {
-                    new HitCircle { StartTime = 1000 }
+                    new HitCircle { StartTime = 1000, NewCombo = true }
                 }
             };
 
@@ -56,7 +56,7 @@ namespace osu.Game.Tests.Editing
         {
             current.AddRange(new[]
             {
-                new HitCircle { StartTime = 1000 },
+                new HitCircle { StartTime = 1000, NewCombo = true },
                 new HitCircle { StartTime = 3000 },
             });
 
@@ -78,7 +78,7 @@ namespace osu.Game.Tests.Editing
         {
             current.AddRange(new[]
             {
-                new HitCircle { StartTime = 1000 },
+                new HitCircle { StartTime = 1000, NewCombo = true },
                 new HitCircle { StartTime = 2000 },
                 new HitCircle { StartTime = 3000 },
             });
@@ -100,7 +100,7 @@ namespace osu.Game.Tests.Editing
         {
             current.AddRange(new[]
             {
-                new HitCircle { StartTime = 1000 },
+                new HitCircle { StartTime = 1000, NewCombo = true },
                 new HitCircle { StartTime = 2000 },
                 new HitCircle { StartTime = 3000 },
             });
@@ -109,7 +109,7 @@ namespace osu.Game.Tests.Editing
             {
                 HitObjects =
                 {
-                    new HitCircle { StartTime = 500 },
+                    new HitCircle { StartTime = 500, NewCombo = true },
                     (OsuHitObject)current.HitObjects[1],
                     (OsuHitObject)current.HitObjects[2],
                 }
@@ -123,7 +123,7 @@ namespace osu.Game.Tests.Editing
         {
             current.AddRange(new[]
             {
-                new HitCircle { StartTime = 1000 },
+                new HitCircle { StartTime = 1000, NewCombo = true },
                 new HitCircle { StartTime = 2000 },
                 new HitCircle { StartTime = 3000 },
             });
@@ -146,7 +146,7 @@ namespace osu.Game.Tests.Editing
         {
             current.AddRange(new OsuHitObject[]
             {
-                new HitCircle { StartTime = 1000 },
+                new HitCircle { StartTime = 1000, NewCombo = true },
                 new Slider
                 {
                     StartTime = 2000,
@@ -188,7 +188,7 @@ namespace osu.Game.Tests.Editing
         {
             current.AddRange(new[]
             {
-                new HitCircle { StartTime = 1000 },
+                new HitCircle { StartTime = 1000, NewCombo = true },
                 new HitCircle { StartTime = 2000 },
                 new HitCircle { StartTime = 3000 },
             });
@@ -197,7 +197,7 @@ namespace osu.Game.Tests.Editing
             {
                 HitObjects =
                 {
-                    new HitCircle { StartTime = 500 },
+                    new HitCircle { StartTime = 500, NewCombo = true },
                     (OsuHitObject)current.HitObjects[0],
                     new HitCircle { StartTime = 1500 },
                     (OsuHitObject)current.HitObjects[1],
@@ -216,7 +216,7 @@ namespace osu.Game.Tests.Editing
         {
             current.AddRange(new[]
             {
-                new HitCircle { StartTime = 500 },
+                new HitCircle { StartTime = 500, NewCombo = true },
                 new HitCircle { StartTime = 1000 },
                 new HitCircle { StartTime = 1500 },
                 new HitCircle { StartTime = 2000 },
@@ -226,6 +226,9 @@ namespace osu.Game.Tests.Editing
                 new HitCircle { StartTime = 3500 },
             });
 
+            var patchedFirst = (HitCircle)current.HitObjects[1];
+            patchedFirst.NewCombo = true;
+
             var patch = new OsuBeatmap
             {
                 HitObjects =
@@ -244,7 +247,7 @@ namespace osu.Game.Tests.Editing
         {
             current.AddRange(new[]
             {
-                new HitCircle { StartTime = 500 },
+                new HitCircle { StartTime = 500, NewCombo = true },
                 new HitCircle { StartTime = 1000 },
                 new HitCircle { StartTime = 1500 },
                 new HitCircle { StartTime = 2000 },
@@ -277,7 +280,7 @@ namespace osu.Game.Tests.Editing
         {
             current.AddRange(new[]
             {
-                new HitCircle { StartTime = 500 },
+                new HitCircle { StartTime = 500, NewCombo = true },
                 new HitCircle { StartTime = 1000 },
                 new HitCircle { StartTime = 1500 },
                 new HitCircle { StartTime = 2000 },
@@ -291,7 +294,7 @@ namespace osu.Game.Tests.Editing
             {
                 HitObjects =
                 {
-                    new HitCircle { StartTime = 750 },
+                    new HitCircle { StartTime = 750, NewCombo = true },
                     (OsuHitObject)current.HitObjects[1],
                     (OsuHitObject)current.HitObjects[4],
                     (OsuHitObject)current.HitObjects[5],
@@ -309,20 +312,20 @@ namespace osu.Game.Tests.Editing
         {
             current.AddRange(new[]
             {
-                new HitCircle { StartTime = 500, Position = new Vector2(50) },
-                new HitCircle { StartTime = 500, Position = new Vector2(100) },
-                new HitCircle { StartTime = 500, Position = new Vector2(150) },
-                new HitCircle { StartTime = 500, Position = new Vector2(200) },
+                new HitCircle { StartTime = 500, Position = new Vector2(50), NewCombo = true },
+                new HitCircle { StartTime = 500, Position = new Vector2(100), NewCombo = true },
+                new HitCircle { StartTime = 500, Position = new Vector2(150), NewCombo = true },
+                new HitCircle { StartTime = 500, Position = new Vector2(200), NewCombo = true },
             });
 
             var patch = new OsuBeatmap
             {
                 HitObjects =
                 {
-                    new HitCircle { StartTime = 500, Position = new Vector2(150) },
-                    new HitCircle { StartTime = 500, Position = new Vector2(100) },
-                    new HitCircle { StartTime = 500, Position = new Vector2(50) },
-                    new HitCircle { StartTime = 500, Position = new Vector2(200) },
+                    new HitCircle { StartTime = 500, Position = new Vector2(150), NewCombo = true },
+                    new HitCircle { StartTime = 500, Position = new Vector2(100), NewCombo = true },
+                    new HitCircle { StartTime = 500, Position = new Vector2(50), NewCombo = true },
+                    new HitCircle { StartTime = 500, Position = new Vector2(200), NewCombo = true },
                 }
             };
 

From a6d1484ad5af2f5eb921133a283477b235da0d56 Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Wed, 7 Oct 2020 14:26:01 +0900
Subject: [PATCH 10/10] Add arbirary precision specification for now

---
 osu.Game/Screens/Edit/Setup/DifficultySection.cs | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/osu.Game/Screens/Edit/Setup/DifficultySection.cs b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
index f23bc0f3b2..2d8031c3c8 100644
--- a/osu.Game/Screens/Edit/Setup/DifficultySection.cs
+++ b/osu.Game/Screens/Edit/Setup/DifficultySection.cs
@@ -38,7 +38,8 @@ namespace osu.Game.Screens.Edit.Setup
                     {
                         Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
                         MinValue = 2,
-                        MaxValue = 7
+                        MaxValue = 7,
+                        Precision = 0.1f,
                     }
                 },
                 healthDrainSlider = new LabelledSliderBar<float>
@@ -49,7 +50,8 @@ namespace osu.Game.Screens.Edit.Setup
                     {
                         Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
                         MinValue = 0,
-                        MaxValue = 10
+                        MaxValue = 10,
+                        Precision = 0.1f,
                     }
                 },
                 approachRateSlider = new LabelledSliderBar<float>
@@ -60,7 +62,8 @@ namespace osu.Game.Screens.Edit.Setup
                     {
                         Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
                         MinValue = 0,
-                        MaxValue = 10
+                        MaxValue = 10,
+                        Precision = 0.1f,
                     }
                 },
                 overallDifficultySlider = new LabelledSliderBar<float>
@@ -71,7 +74,8 @@ namespace osu.Game.Screens.Edit.Setup
                     {
                         Default = BeatmapDifficulty.DEFAULT_DIFFICULTY,
                         MinValue = 0,
-                        MaxValue = 10
+                        MaxValue = 10,
+                        Precision = 0.1f,
                     }
                 },
             };