2019-01-24 16:43:03 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-10-03 14:36:14 +08:00
2018-10-18 15:36:06 +08:00
using System.Linq ;
2019-08-15 17:25:31 +08:00
using osu.Framework.Allocation ;
2018-10-03 14:36:14 +08:00
using osu.Framework.Graphics ;
using osu.Framework.Graphics.Containers ;
using osu.Game.Rulesets.Objects ;
using osu.Game.Rulesets.UI ;
2019-08-29 15:06:40 +08:00
using osu.Game.Screens.Edit ;
2018-10-03 14:36:14 +08:00
namespace osu.Game.Rulesets.Edit
{
2019-08-29 17:20:43 +08:00
/// <summary>
/// A wrapper for a <see cref="DrawableRuleset{TObject}"/>. Handles adding visual representations of <see cref="HitObject"/>s to the underlying <see cref="DrawableRuleset{TObject}"/>.
/// </summary>
internal class DrawableEditRulesetWrapper < TObject > : CompositeDrawable
2018-10-03 14:36:14 +08:00
where TObject : HitObject
{
2019-08-29 17:12:29 +08:00
public Playfield Playfield = > drawableRuleset . Playfield ;
2019-03-31 00:29:37 +08:00
2019-03-20 10:22:34 +08:00
private readonly DrawableRuleset < TObject > drawableRuleset ;
2018-10-17 17:01:38 +08:00
2019-08-29 15:06:40 +08:00
[Resolved]
2019-12-27 18:46:33 +08:00
private EditorBeatmap beatmap { get ; set ; }
2019-08-29 15:06:40 +08:00
2019-08-29 17:20:43 +08:00
public DrawableEditRulesetWrapper ( DrawableRuleset < TObject > drawableRuleset )
2018-10-03 14:36:14 +08:00
{
2019-03-20 10:22:34 +08:00
this . drawableRuleset = drawableRuleset ;
2018-10-17 17:01:38 +08:00
2019-08-29 17:12:29 +08:00
RelativeSizeAxes = Axes . Both ;
2019-03-20 10:22:34 +08:00
InternalChild = drawableRuleset ;
2019-08-15 17:25:31 +08:00
}
2018-10-03 14:36:14 +08:00
2019-08-15 17:25:31 +08:00
[BackgroundDependencyLoader]
private void load ( )
{
drawableRuleset . FrameStablePlayback = false ;
2018-10-17 17:01:38 +08:00
Playfield . DisplayJudgements . Value = false ;
2018-10-03 14:36:14 +08:00
}
2020-10-02 15:21:50 +08:00
[Resolved(canBeNull: true)]
2020-10-02 14:44:37 +08:00
private IEditorChangeHandler changeHandler { get ; set ; }
2019-08-29 15:06:40 +08:00
protected override void LoadComplete ( )
2018-10-03 14:36:14 +08:00
{
2019-08-29 15:06:40 +08:00
base . LoadComplete ( ) ;
2018-10-03 14:36:14 +08:00
2019-08-29 15:06:40 +08:00
beatmap . HitObjectAdded + = addHitObject ;
beatmap . HitObjectRemoved + = removeHitObject ;
2020-10-02 14:44:37 +08:00
2020-10-02 15:21:50 +08:00
if ( changeHandler ! = null )
{
// for now only regenerate replay on a finalised state change, not HitObjectUpdated.
changeHandler . OnStateChange + = updateReplay ;
}
else
{
beatmap . HitObjectUpdated + = _ = > updateReplay ( ) ;
}
2019-08-29 15:06:40 +08:00
}
2018-10-03 14:36:14 +08:00
2020-10-02 14:44:37 +08:00
private void updateReplay ( ) = > drawableRuleset . RegenerateAutoplay ( ) ;
2020-09-28 13:15:54 +08:00
2019-08-29 15:06:40 +08:00
private void addHitObject ( HitObject hitObject )
{
var drawableObject = drawableRuleset . CreateDrawableRepresentation ( ( TObject ) hitObject ) ;
2018-10-03 15:49:59 +08:00
2019-03-20 10:22:34 +08:00
drawableRuleset . Playfield . Add ( drawableObject ) ;
drawableRuleset . Playfield . PostProcess ( ) ;
2018-10-03 14:36:14 +08:00
}
2018-10-18 15:36:06 +08:00
2019-08-29 15:06:40 +08:00
private void removeHitObject ( HitObject hitObject )
2018-10-18 15:36:06 +08:00
{
var drawableObject = Playfield . AllHitObjects . Single ( d = > d . HitObject = = hitObject ) ;
2019-03-20 10:22:34 +08:00
drawableRuleset . Playfield . Remove ( drawableObject ) ;
drawableRuleset . Playfield . PostProcess ( ) ;
2018-10-18 15:36:06 +08:00
}
2019-08-29 15:31:40 +08:00
2019-11-11 12:04:38 +08:00
public override bool PropagatePositionalInputSubTree = > false ;
public override bool PropagateNonPositionalInputSubTree = > false ;
2019-08-29 17:12:29 +08:00
public PlayfieldAdjustmentContainer CreatePlayfieldAdjustmentContainer ( ) = > drawableRuleset . CreatePlayfieldAdjustmentContainer ( ) ;
2019-08-29 15:31:40 +08:00
protected override void Dispose ( bool isDisposing )
{
base . Dispose ( isDisposing ) ;
if ( beatmap ! = null )
{
beatmap . HitObjectAdded - = addHitObject ;
beatmap . HitObjectRemoved - = removeHitObject ;
}
}
2018-10-03 14:36:14 +08:00
}
}