diff --git a/osu.Game/Screens/Edit/EditorChangeHandler.cs b/osu.Game/Screens/Edit/EditorChangeHandler.cs
index 616d0608c0e3..b69e9c4c513f 100644
--- a/osu.Game/Screens/Edit/EditorChangeHandler.cs
+++ b/osu.Game/Screens/Edit/EditorChangeHandler.cs
@@ -81,9 +81,6 @@ public void EndChange()
SaveState();
}
- ///
- /// Saves the current state.
- ///
public void SaveState()
{
if (bulkChangesStarted > 0)
diff --git a/osu.Game/Screens/Edit/IEditorChangeHandler.cs b/osu.Game/Screens/Edit/IEditorChangeHandler.cs
index 1774ec6c049a..0283421b8c19 100644
--- a/osu.Game/Screens/Edit/IEditorChangeHandler.cs
+++ b/osu.Game/Screens/Edit/IEditorChangeHandler.cs
@@ -35,5 +35,11 @@ public interface IEditorChangeHandler
/// This should be invoked as soon as possible after to cause a state change.
///
void EndChange();
+
+ ///
+ /// Immediately saves the current state.
+ /// Note that this will be a no-op if there is a change in progress via .
+ ///
+ void SaveState();
}
}
diff --git a/osu.Game/Screens/Edit/Timing/DifficultySection.cs b/osu.Game/Screens/Edit/Timing/DifficultySection.cs
index 78766d977787..b55d74e3b4bc 100644
--- a/osu.Game/Screens/Edit/Timing/DifficultySection.cs
+++ b/osu.Game/Screens/Edit/Timing/DifficultySection.cs
@@ -28,6 +28,7 @@ protected override void OnControlPointChanged(ValueChangedEvent ChangeHandler?.SaveState());
}
}
diff --git a/osu.Game/Screens/Edit/Timing/EffectSection.cs b/osu.Game/Screens/Edit/Timing/EffectSection.cs
index 71e7f42713a3..2f143108a9a7 100644
--- a/osu.Game/Screens/Edit/Timing/EffectSection.cs
+++ b/osu.Game/Screens/Edit/Timing/EffectSection.cs
@@ -28,7 +28,10 @@ protected override void OnControlPointChanged(ValueChangedEvent ChangeHandler?.SaveState());
+
omitBarLine.Current = point.NewValue.OmitFirstBarLineBindable;
+ omitBarLine.Current.BindValueChanged(_ => ChangeHandler?.SaveState());
}
}
diff --git a/osu.Game/Screens/Edit/Timing/SampleSection.cs b/osu.Game/Screens/Edit/Timing/SampleSection.cs
index de986e28ca6f..280e19c99a7b 100644
--- a/osu.Game/Screens/Edit/Timing/SampleSection.cs
+++ b/osu.Game/Screens/Edit/Timing/SampleSection.cs
@@ -35,7 +35,10 @@ protected override void OnControlPointChanged(ValueChangedEvent ChangeHandler?.SaveState());
+
volume.Current = point.NewValue.SampleVolumeBindable;
+ volume.Current.BindValueChanged(_ => ChangeHandler?.SaveState());
}
}
diff --git a/osu.Game/Screens/Edit/Timing/Section.cs b/osu.Game/Screens/Edit/Timing/Section.cs
index 603fb77f3148..7a81eeb1a45e 100644
--- a/osu.Game/Screens/Edit/Timing/Section.cs
+++ b/osu.Game/Screens/Edit/Timing/Section.cs
@@ -32,6 +32,9 @@ internal abstract class Section : CompositeDrawable
[Resolved]
protected Bindable SelectedGroup { get; private set; }
+ [Resolved(canBeNull: true)]
+ protected IEditorChangeHandler ChangeHandler { get; private set; }
+
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
diff --git a/osu.Game/Screens/Edit/Timing/SliderWithTextBoxInput.cs b/osu.Game/Screens/Edit/Timing/SliderWithTextBoxInput.cs
index 14023b0c3506..d5afc8978d7a 100644
--- a/osu.Game/Screens/Edit/Timing/SliderWithTextBoxInput.cs
+++ b/osu.Game/Screens/Edit/Timing/SliderWithTextBoxInput.cs
@@ -38,6 +38,7 @@ public SliderWithTextBoxInput(string labelText)
},
slider = new SettingsSlider
{
+ TransferValueOnCommit = true,
RelativeSizeAxes = Axes.X,
}
}
diff --git a/osu.Game/Screens/Edit/Timing/TimingScreen.cs b/osu.Game/Screens/Edit/Timing/TimingScreen.cs
index 0a0cfe193da5..3b3ae949c118 100644
--- a/osu.Game/Screens/Edit/Timing/TimingScreen.cs
+++ b/osu.Game/Screens/Edit/Timing/TimingScreen.cs
@@ -87,6 +87,9 @@ public class ControlPointList : CompositeDrawable
[Resolved]
private Bindable selectedGroup { get; set; }
+ [Resolved(canBeNull: true)]
+ private IEditorChangeHandler changeHandler { get; set; }
+
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
@@ -146,6 +149,7 @@ protected override void LoadComplete()
controlGroups.BindCollectionChanged((sender, args) =>
{
table.ControlGroups = controlGroups;
+ changeHandler.SaveState();
}, true);
}
diff --git a/osu.Game/Screens/Edit/Timing/TimingSection.cs b/osu.Game/Screens/Edit/Timing/TimingSection.cs
index 020244153768..2ab8703cc4b4 100644
--- a/osu.Game/Screens/Edit/Timing/TimingSection.cs
+++ b/osu.Game/Screens/Edit/Timing/TimingSection.cs
@@ -37,8 +37,13 @@ protected override void OnControlPointChanged(ValueChangedEvent 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());
}
}
@@ -117,6 +122,8 @@ public BPMSlider()
bpmBindable.BindValueChanged(bpm => beatLengthBindable.Value = beatLengthToBpm(bpm.NewValue));
base.Bindable = bpmBindable;
+
+ TransferValueOnCommit = true;
}
public override Bindable Bindable