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:
parent
4ea4ec0d25
commit
62635c5ab8
@ -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; }
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user