@inject IJSRuntime JSRuntime
@implements IDisposable
@code {
private ElementReference CP1Ref;
private ElementReference CP2Ref;
private DotNetObjectReference DotNetObj = null!;
private double X1;
private double Y1;
private double CX1;
private double CY1;
private double CX2;
private double CY2;
private double X2;
private double Y2;
private string EdgeData = "";
private EdgeModel? Model;
private string Visibility = "hidden";
private string ControlPoint2Visibility = "hidden";
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (!firstRender) return;
DotNetObj = DotNetObjectReference.Create(this);
await JSRuntime.InvokeVoidAsync("AddMouseDownEventListener", DotNetObj, CP1Ref, nameof(OnMouseDown1), false);
await JSRuntime.InvokeVoidAsync("AddMouseDownEventListener", DotNetObj, CP2Ref, nameof(OnMouseDown2), false);
}
public void SetControl(EdgeModel? model)
{
if (Model != null)
{
Model.StartNodePositionChanged -= CaculatePath;
Model.EndNodePositionChanged -= CaculatePath;
Model.ControlPoint1PositionChanged -= CaculatePath;
Model.ControlPoint2PositionChanged -= CaculatePath;
}
Model = model;
if (Model != null)
{
Visibility = "visible";
if (Model.TrajectoryDegree == TrajectoryDegree.Three) ControlPoint2Visibility = "visible";
CaculatePath();
Model.StartNodePositionChanged += CaculatePath;
Model.EndNodePositionChanged += CaculatePath;
Model.ControlPoint1PositionChanged += CaculatePath;
Model.ControlPoint2PositionChanged += CaculatePath;
if (Model.TrajectoryDegree == TrajectoryDegree.Three) ControlPoint2Visibility = "visible";
else ControlPoint2Visibility = "hidden";
Visibility = "visible";
}
else
{
Visibility = "hidden";
ControlPoint2Visibility = "hidden";
}
StateHasChanged();
}
private Task CaculatePath()
{
if (Model == null) return Task.CompletedTask;
X1 = Model.X1;
Y1 = Model.Y1;
X2 = Model.X2;
Y2 = Model.Y2;
CX1 = Model.ControlPoint1X;
CY1 = Model.ControlPoint1Y;
CX2 = Model.ControlPoint2X;
CY2 = Model.ControlPoint2Y;
StateHasChanged();
return Task.CompletedTask;
}
[JSInvokable]
public void OnMouseDown1(int button, bool altKey, bool ctrlKey, bool shiftKey)
{
if (Model != null)
{
Model.ActivedControlPoint1 = true;
Model.ActivedControlPoint2 = false;
}
}
[JSInvokable]
public void OnMouseDown2(int button, bool altKey, bool ctrlKey, bool shiftKey)
{
if (Model != null)
{
Model.ActivedControlPoint2 = true;
Model.ActivedControlPoint1 = false;
}
}
public void Dispose()
{
if (Model != null)
{
Model.StartNodePositionChanged -= CaculatePath;
Model.EndNodePositionChanged -= CaculatePath;
Model.ControlPoint1PositionChanged -= CaculatePath;
Model.ControlPoint2PositionChanged -= CaculatePath;
Model = null;
}
GC.SuppressFinalize(this);
}
}