1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-13 12:43:16 +08:00

Add container to handle placement mask

This commit is contained in:
smoogipoo 2018-10-17 16:17:12 +09:00
parent 4ea4ec0d25
commit 62635c5ab8
3 changed files with 56 additions and 24 deletions

View File

@ -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<HitObjectCompositionTool> compositionTool = new Bindable<HitObjectCompositionTool>();
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<HitObjectCompositionTool> CompositionTools { get; }

View File

@ -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;

View File

@ -0,0 +1,47 @@
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// 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<HitObjectCompositionTool> compositionTool = new Bindable<HitObjectCompositionTool>();
[Resolved]
private IPlacementHandler placementHandler { get; set; }
public PlacementContainer(IBindable<HitObjectCompositionTool> 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;
}
}
}