Skip to content

Commit

Permalink
fix editor can't copy/parse Hold correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
MikiraSora committed Nov 1, 2024
1 parent 334db5c commit 83a8820
Show file tree
Hide file tree
Showing 3 changed files with 758 additions and 710 deletions.
202 changes: 113 additions & 89 deletions OngekiFumenEditor/Base/OngekiObjects/Hold.cs
Original file line number Diff line number Diff line change
@@ -1,96 +1,120 @@
using OngekiFumenEditor.Base.Attributes;
using OngekiFumenEditor.Base.OngekiObjects.Lane.Base;
using System;
using System.Collections.Generic;

namespace OngekiFumenEditor.Base.OngekiObjects
{
public class Hold : OngekiMovableObjectBase, ILaneDockableChangable, ICriticalableObject
{
private HoldEnd holdEnd;

public bool IsWallHold => ReferenceLaneStart?.IsWallLane ?? false;

private bool isCritical = false;
public bool IsCritical
{
get { return isCritical; }
set
{
isCritical = value;
NotifyOfPropertyChange(() => IDShortName);
NotifyOfPropertyChange(() => IsCritical);
}
}

private LaneStartBase referenceLaneStart = default;
public LaneStartBase ReferenceLaneStart
{
get { return referenceLaneStart; }
set
{
referenceLaneStart = value;
NotifyOfPropertyChange(() => ReferenceLaneStart);
NotifyOfPropertyChange(() => ReferenceLaneStrId);
}
}

[ObjectPropertyBrowserShow]
[ObjectPropertyBrowserAlias("RefLaneId")]
public int ReferenceLaneStrId => ReferenceLaneStart?.RecordId ?? -1;

private int? referenceLaneStrIdManualSet = default;
[ObjectPropertyBrowserShow]
[ObjectPropertyBrowserTipText("ObjectLaneGroupId")]
[ObjectPropertyBrowserAlias("SetRefLaneId")]
public int? ReferenceLaneStrIdManualSet
{
get => referenceLaneStrIdManualSet;
set
{
referenceLaneStrIdManualSet = value;
NotifyOfPropertyChange(() => ReferenceLaneStrIdManualSet);
referenceLaneStrIdManualSet = default;
}
}

public HoldEnd HoldEnd => holdEnd;

public TGrid EndTGrid => HoldEnd?.TGrid ?? TGrid;

public override string IDShortName => IsCritical ? "CHD" : "HLD";

public void SetHoldEnd(HoldEnd end)
{
if (holdEnd is not null)
holdEnd.PropertyChanged -= HoldEnd_PropertyChanged;
if (end is not null)
end.PropertyChanged += HoldEnd_PropertyChanged;

holdEnd = end;

if (end is not null)
{
end.RefHold?.SetHoldEnd(null);
end.RefHold = this;
}
}

private void HoldEnd_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(HoldEnd.TGrid):
NotifyOfPropertyChange(nameof(EndTGrid));
break;
default:
break;
}
}

public override IEnumerable<IDisplayableObject> GetDisplayableObjects()
{
yield return this;
yield return HoldEnd;
}
}
public class Hold : OngekiMovableObjectBase, ILaneDockableChangable, ICriticalableObject
{
private HoldEnd holdEnd;

public bool IsWallHold => ReferenceLaneStart?.IsWallLane ?? false;

private bool isCritical = false;
public bool IsCritical
{
get { return isCritical; }
set
{
isCritical = value;
NotifyOfPropertyChange(() => IDShortName);
NotifyOfPropertyChange(() => IsCritical);
}
}

private LaneStartBase referenceLaneStart = default;
public LaneStartBase ReferenceLaneStart
{
get { return referenceLaneStart; }
set
{
referenceLaneStart = value;
NotifyOfPropertyChange(() => ReferenceLaneStart);
NotifyOfPropertyChange(() => ReferenceLaneStrId);

HoldEnd?.RedockXGrid();
}
}

[ObjectPropertyBrowserShow]
[ObjectPropertyBrowserAlias("RefLaneId")]
public int ReferenceLaneStrId => ReferenceLaneStart?.RecordId ?? -1;

private int? referenceLaneStrIdManualSet = default;
[ObjectPropertyBrowserShow]
[ObjectPropertyBrowserTipText("ObjectLaneGroupId")]
[ObjectPropertyBrowserAlias("SetRefLaneId")]
public int? ReferenceLaneStrIdManualSet
{
get => referenceLaneStrIdManualSet;
set
{
referenceLaneStrIdManualSet = value;
NotifyOfPropertyChange(() => ReferenceLaneStrIdManualSet);
referenceLaneStrIdManualSet = default;
}
}

public HoldEnd HoldEnd => holdEnd;

public TGrid EndTGrid => HoldEnd?.TGrid ?? TGrid;

public override string IDShortName => IsCritical ? "CHD" : "HLD";

public void SetHoldEnd(HoldEnd end)
{
if (holdEnd is not null)
holdEnd.PropertyChanged -= HoldEnd_PropertyChanged;
if (end is not null)
end.PropertyChanged += HoldEnd_PropertyChanged;

holdEnd = end;

if (end is not null)
{
end.RefHold?.SetHoldEnd(null);
end.RefHold = this;

end.RedockXGrid();
}
}

private void HoldEnd_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(HoldEnd.TGrid):
NotifyOfPropertyChange(nameof(EndTGrid));
break;
default:
break;
}
}

public override IEnumerable<IDisplayableObject> GetDisplayableObjects()
{
yield return this;
yield return HoldEnd;
}

public void CopyEntire(Hold from)
{
//包括End一起复制了
Copy(from);

if (from.HoldEnd != null)
{
//create
if (holdEnd is null)
SetHoldEnd(new HoldEnd());
holdEnd.Copy(from.HoldEnd);
}
else
{
//delete
SetHoldEnd(default);
}
}
}
}
50 changes: 31 additions & 19 deletions OngekiFumenEditor/Base/OngekiObjects/HoldEnd.cs
Original file line number Diff line number Diff line change
@@ -1,29 +1,41 @@
using OngekiFumenEditor.Base.Attributes;
using OngekiFumenEditor.Base.OngekiObjects.ConnectableObject;
using OngekiFumenEditor.Base.OngekiObjects.Lane.Base;
using OngekiFumenEditor.Utils;
using System;

namespace OngekiFumenEditor.Base.OngekiObjects
{
public class HoldEnd : OngekiMovableObjectBase, ILaneDockable
{
public override string IDShortName => "[HoldEnd]";
public class HoldEnd : OngekiMovableObjectBase, ILaneDockable
{
public override string IDShortName => "[HoldEnd]";

private Hold refHold;
public Hold RefHold
{
get => refHold;
internal set => Set(ref refHold, value);
}
private Hold refHold;
public Hold RefHold
{
get => refHold;
internal set => Set(ref refHold, value);
}

[ObjectPropertyBrowserHide]
public LaneStartBase ReferenceLaneStart
{
get => RefHold?.ReferenceLaneStart;
set { }
}
[ObjectPropertyBrowserHide]
public LaneStartBase ReferenceLaneStart
{
get => RefHold?.ReferenceLaneStart;
set { }
}

[ObjectPropertyBrowserHide]
public int ReferenceLaneStrId => ReferenceLaneStart?.RecordId ?? -1;
[ObjectPropertyBrowserHide]
public int ReferenceLaneStrId => ReferenceLaneStart?.RecordId ?? -1;

internal int? CacheRecoveryHoldObjectID { get; set; } = null;
}
internal int? CacheRecoveryHoldObjectID { get; set; } = null;

public void RedockXGrid()
{
if (ReferenceLaneStart is LaneStartBase refLane)
{
if (refLane.CalulateXGrid(TGrid) is XGrid xGrid)
XGrid = xGrid;
}
}
}
}
Loading

0 comments on commit 83a8820

Please sign in to comment.