diff --git a/osu.Game/Rulesets/Edit/HitObjectComposer.cs b/osu.Game/Rulesets/Edit/HitObjectComposer.cs index 8cd26da166..bea638c0fb 100644 --- a/osu.Game/Rulesets/Edit/HitObjectComposer.cs +++ b/osu.Game/Rulesets/Edit/HitObjectComposer.cs @@ -36,10 +36,9 @@ namespace osu.Game.Rulesets.Edit private IPlacementHandler placementHandler { get; set; } private HitObjectMaskLayer maskLayer; - private Container placementContainer; private EditRulesetContainer rulesetContainer; - private HitObjectCompositionTool compositionTool; + private readonly Bindable compositionTool = new Bindable(); protected HitObjectComposer(Ruleset ruleset) { @@ -74,7 +73,7 @@ namespace osu.Game.Rulesets.Edit layerAboveRuleset.Children = new Drawable[] { maskLayer = new HitObjectMaskLayer(), - placementContainer = new Container { RelativeSizeAxes = Axes.Both } + new PlacementContainer(compositionTool), }; layerContainers.Add(layerBelowRuleset); @@ -118,21 +117,14 @@ namespace osu.Game.Rulesets.Edit }; toolboxCollection.Items = - CompositionTools.Select(t => new RadioButton(t.Name, () => setCompositionTool(t))) - .Prepend(new RadioButton("Select", () => setCompositionTool(null))) + CompositionTools.Select(t => new RadioButton(t.Name, () => compositionTool.Value = t)) + .Prepend(new RadioButton("Select", () => compositionTool.Value = null)) .ToList(); toolboxCollection.Items[0].Select(); - placementHandler.PlacementFinished += h => - { - var drawableObject = rulesetContainer.AddHitObject(h); - - maskLayer.AddMask(drawableObject); - - // Re-construct the mask - setCompositionTool(compositionTool); - }; + // Todo: no + placementHandler.PlacementFinished += h => maskLayer.AddMask(rulesetContainer.AddHitObject(h)); } protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) @@ -165,16 +157,6 @@ namespace osu.Game.Rulesets.Edit }); } - private void setCompositionTool(HitObjectCompositionTool tool) - { - compositionTool = tool; - - placementContainer.Clear(true); - - if (tool != null) - placementContainer.Child = tool.CreatePlacementMask(); - } - protected abstract EditRulesetContainer CreateRulesetContainer(Ruleset ruleset, WorkingBeatmap beatmap); protected abstract IReadOnlyList CompositionTools { get; } diff --git a/osu.Game/Screens/Edit/Screens/Compose/Layers/HitObjectMaskLayer.cs b/osu.Game/Screens/Edit/Screens/Compose/Layers/HitObjectMaskLayer.cs index 7a1ad32140..63fcf09d2a 100644 --- a/osu.Game/Screens/Edit/Screens/Compose/Layers/HitObjectMaskLayer.cs +++ b/osu.Game/Screens/Edit/Screens/Compose/Layers/HitObjectMaskLayer.cs @@ -15,6 +15,9 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers private MaskContainer maskContainer; private HitObjectComposer composer; + [Resolved] + private IPlacementHandler placementHandler { get; set; } + public HitObjectMaskLayer() { RelativeSizeAxes = Axes.Both; diff --git a/osu.Game/Screens/Edit/Screens/Compose/Layers/PlacementContainer.cs b/osu.Game/Screens/Edit/Screens/Compose/Layers/PlacementContainer.cs new file mode 100644 index 0000000000..41635565dd --- /dev/null +++ b/osu.Game/Screens/Edit/Screens/Compose/Layers/PlacementContainer.cs @@ -0,0 +1,47 @@ +// Copyright (c) 2007-2018 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using osu.Framework.Allocation; +using osu.Framework.Configuration; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Game.Rulesets.Edit.Tools; +using Container = System.ComponentModel.Container; + +namespace osu.Game.Screens.Edit.Screens.Compose.Layers +{ + public class PlacementContainer : CompositeDrawable + { + private readonly Container maskContainer; + + private readonly IBindable compositionTool = new Bindable(); + + [Resolved] + private IPlacementHandler placementHandler { get; set; } + + public PlacementContainer(IBindable compositionTool) + { + this.compositionTool.BindTo(compositionTool); + + RelativeSizeAxes = Axes.Both; + + this.compositionTool.BindValueChanged(onToolChanged); + } + + [BackgroundDependencyLoader] + private void load() + { + // Refresh the mask after each placement + placementHandler.PlacementFinished += _ => onToolChanged(compositionTool.Value); + } + + private void onToolChanged(HitObjectCompositionTool tool) + { + ClearInternal(); + + var mask = tool?.CreatePlacementMask(); + if (mask != null) + InternalChild = mask; + } + } +}