mirror of
https://github.com/ppy/osu.git
synced 2025-02-13 20:33:11 +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 IPlacementHandler placementHandler { get; set; }
|
||||||
|
|
||||||
private HitObjectMaskLayer maskLayer;
|
private HitObjectMaskLayer maskLayer;
|
||||||
private Container placementContainer;
|
|
||||||
private EditRulesetContainer rulesetContainer;
|
private EditRulesetContainer rulesetContainer;
|
||||||
|
|
||||||
private HitObjectCompositionTool compositionTool;
|
private readonly Bindable<HitObjectCompositionTool> compositionTool = new Bindable<HitObjectCompositionTool>();
|
||||||
|
|
||||||
protected HitObjectComposer(Ruleset ruleset)
|
protected HitObjectComposer(Ruleset ruleset)
|
||||||
{
|
{
|
||||||
@ -74,7 +73,7 @@ namespace osu.Game.Rulesets.Edit
|
|||||||
layerAboveRuleset.Children = new Drawable[]
|
layerAboveRuleset.Children = new Drawable[]
|
||||||
{
|
{
|
||||||
maskLayer = new HitObjectMaskLayer(),
|
maskLayer = new HitObjectMaskLayer(),
|
||||||
placementContainer = new Container { RelativeSizeAxes = Axes.Both }
|
new PlacementContainer(compositionTool),
|
||||||
};
|
};
|
||||||
|
|
||||||
layerContainers.Add(layerBelowRuleset);
|
layerContainers.Add(layerBelowRuleset);
|
||||||
@ -118,21 +117,14 @@ namespace osu.Game.Rulesets.Edit
|
|||||||
};
|
};
|
||||||
|
|
||||||
toolboxCollection.Items =
|
toolboxCollection.Items =
|
||||||
CompositionTools.Select(t => new RadioButton(t.Name, () => setCompositionTool(t)))
|
CompositionTools.Select(t => new RadioButton(t.Name, () => compositionTool.Value = t))
|
||||||
.Prepend(new RadioButton("Select", () => setCompositionTool(null)))
|
.Prepend(new RadioButton("Select", () => compositionTool.Value = null))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
toolboxCollection.Items[0].Select();
|
toolboxCollection.Items[0].Select();
|
||||||
|
|
||||||
placementHandler.PlacementFinished += h =>
|
// Todo: no
|
||||||
{
|
placementHandler.PlacementFinished += h => maskLayer.AddMask(rulesetContainer.AddHitObject(h));
|
||||||
var drawableObject = rulesetContainer.AddHitObject(h);
|
|
||||||
|
|
||||||
maskLayer.AddMask(drawableObject);
|
|
||||||
|
|
||||||
// Re-construct the mask
|
|
||||||
setCompositionTool(compositionTool);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
|
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 EditRulesetContainer CreateRulesetContainer(Ruleset ruleset, WorkingBeatmap beatmap);
|
||||||
|
|
||||||
protected abstract IReadOnlyList<HitObjectCompositionTool> CompositionTools { get; }
|
protected abstract IReadOnlyList<HitObjectCompositionTool> CompositionTools { get; }
|
||||||
|
@ -15,6 +15,9 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Layers
|
|||||||
private MaskContainer maskContainer;
|
private MaskContainer maskContainer;
|
||||||
private HitObjectComposer composer;
|
private HitObjectComposer composer;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private IPlacementHandler placementHandler { get; set; }
|
||||||
|
|
||||||
public HitObjectMaskLayer()
|
public HitObjectMaskLayer()
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both;
|
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