Ast editor unit refactoring

This commit is contained in:
Michael Schimmel
2025-11-28 14:03:49 +01:00
parent 833ce8aada
commit 0b4201fe9b
6 changed files with 284 additions and 275 deletions
+35 -27
View File
@@ -13,10 +13,7 @@ uses
FMX.Controls,
FMX.Graphics,
FMX.Objects,
Myc.Ast,
Myc.Ast.Nodes,
Myc.Ast.Scope,
Myc.Ast.Compiler.Binder;
Myc.Ast.Nodes;
const
cDataPinColor = TAlphaColors.Dodgerblue;
@@ -29,7 +26,7 @@ type
constructor Create(AOutputPin, AInputPin: TControl);
end;
TAuraWorkspace = class(TStyledControl)
TAstWorkspace = class(TStyledControl)
private
FConnections: TArray<TPinConnection>;
FPanning: TSizeF;
@@ -91,8 +88,8 @@ implementation
uses
System.Math,
FMX.Platform,
Myc.Fmx.AstEditor.Core,
Myc.Fmx.AstEditor.Visualizer;
Myc.Fmx.AstEditor.Core, // Enthält TAstViewNode Interfaces
Myc.Fmx.AstEditor.Visualizer; // Enthält TAstVisualizer
{ TPinConnection }
@@ -102,37 +99,40 @@ begin
InputPin := AInputPin;
end;
{ TAuraWorkspace }
{ TAstWorkspace }
constructor TAuraWorkspace.Create(AOwner: TComponent);
constructor TAstWorkspace.Create(AOwner: TComponent);
begin
inherited;
FZoom := 1.0;
end;
procedure TAuraWorkspace.Build(const RootNode: IAstNode; const Position: TPointF);
procedure TAstWorkspace.Build(const RootNode: IAstNode; const Position: TPointF);
var
visu: IAstVisualizer;
node: TAstViewNode;
begin
var visu := TAstVisualizer.Create(Self, Self, 0) as IAstVisualizer;
var node := visu.CallAccept(RootNode);
// Erstelle den Visualizer mit diesem Workspace als Kontext
visu := TAstVisualizer.Create(Self, Self, 0);
node := visu.CallAccept(RootNode);
if Assigned(node) then
node.Position.Point := Position;
end;
procedure TAuraWorkspace.DoDeleteChildren;
procedure TAstWorkspace.DoDeleteChildren;
begin
FConnections := nil;
inherited;
end;
function TAuraWorkspace.GetChildrenMatrix(var Matrix: TMatrix; var Simple: Boolean): Boolean;
function TAstWorkspace.GetChildrenMatrix(var Matrix: TMatrix; var Simple: Boolean): Boolean;
begin
Matrix := TMatrix.CreateScaling(FZoom, FZoom) * TMatrix.CreateTranslation(FPanning.cx, FPanning.cy);
Simple := (FZoom = 1.0) and (FPanning.cx = 0) and (FPanning.cy = 0);
Result := True;
end;
procedure TAuraWorkspace.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
procedure TAstWorkspace.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
inherited;
if (Button = TMouseButton.mbLeft) and (ObjectAtPoint(LocalToScreen(TPointF.Create(X, Y))) = Self as IControl) then
@@ -143,7 +143,7 @@ begin
end;
end;
procedure TAuraWorkspace.MouseMove(Shift: TShiftState; X, Y: Single);
procedure TAstWorkspace.MouseMove(Shift: TShiftState; X, Y: Single);
var
delta: TPointF;
begin
@@ -161,7 +161,7 @@ begin
end;
end;
procedure TAuraWorkspace.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
procedure TAstWorkspace.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
inherited;
if (Button = TMouseButton.mbLeft) and (FIsPanning) then
@@ -171,25 +171,27 @@ begin
end;
end;
procedure TAuraWorkspace.MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
procedure TAstWorkspace.MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
begin
inherited;
Handled := Zoom(IfThen(WheelDelta > 0, FZoom * 1.1, FZoom / 1.1));
end;
procedure TAuraWorkspace.DblClick;
procedure TAstWorkspace.DblClick;
begin
inherited;
Zoom(1.0);
end;
procedure TAuraWorkspace.Paint;
procedure TAstWorkspace.Paint;
var
connection: TPinConnection;
startPoint, endPoint, pinCenter: TPointF;
path: TPathData;
controlPoint1, controlPoint2: TPointF;
controlOffset: Single;
absoluteStart, absoluteEnd: TPointF;
str: string;
begin
inherited;
@@ -198,24 +200,29 @@ begin
for connection in FConnections do
begin
// Output Pin Calculation
pinCenter := TPointF.Create(connection.OutputPin.Width / 2, connection.OutputPin.Height / 2);
var absoluteStart := connection.OutputPin.LocalToAbsolute(pinCenter);
absoluteStart := connection.OutputPin.LocalToAbsolute(pinCenter);
// Input Pin Calculation
pinCenter := TPointF.Create(connection.InputPin.Width / 2, connection.InputPin.Height / 2);
var absoluteEnd := connection.InputPin.LocalToAbsolute(pinCenter);
absoluteEnd := connection.InputPin.LocalToAbsolute(pinCenter);
// Convert to Workspace Local Coordinates
startPoint := AbsoluteToLocal(absoluteStart);
endPoint := AbsoluteToLocal(absoluteEnd);
var str := connection.InputPin.TagString;
// Determine Color based on TagString (naive check)
str := connection.InputPin.TagString;
if Pos('data', str) = 0 then
Canvas.Stroke.Color := cExecPinColor
else
Canvas.Stroke.Color := cDataPinColor;
// Draw Curve
path := TPathData.Create;
try
controlOffset := max(25, 0.5 * endPoint.Distance(startPoint));
controlOffset := Max(25, 0.5 * endPoint.Distance(startPoint));
controlPoint1 := TPointF.Create(startPoint.X + controlOffset, startPoint.Y);
controlPoint2 := TPointF.Create(endPoint.X - controlOffset, endPoint.Y);
path.MoveTo(startPoint);
@@ -227,14 +234,15 @@ begin
end;
end;
function TAuraWorkspace.Zoom(Factor: Single): Boolean;
function TAstWorkspace.Zoom(Factor: Single): Boolean;
var
mouseService: IFMXMouseService;
mousePos: TPointF;
begin
Result := TPlatformServices.Current.SupportsPlatformService(IFMXMouseService, mouseService);
if Result then
begin
var mousePos := ScreenToLocal(mouseService.GetMousePos);
mousePos := ScreenToLocal(mouseService.GetMousePos);
Factor := Max(0.2, Min(3.0, Factor));
FPanning.cx := mousePos.X * (1 - Factor / FZoom) + FPanning.cx * (Factor / FZoom);
FPanning.cy := mousePos.Y * (1 - Factor / FZoom) + FPanning.cy * (Factor / FZoom);