mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 07:19:18 +02:00
cody: lvlgraph: Edge.Highlighted
git-svn-id: trunk@40487 -
This commit is contained in:
parent
1f4912fe0e
commit
3c5dd17522
@ -317,9 +317,11 @@ type
|
|||||||
TLvlGraphEdge = class(TPersistent)
|
TLvlGraphEdge = class(TPersistent)
|
||||||
private
|
private
|
||||||
FBackEdge: boolean;
|
FBackEdge: boolean;
|
||||||
|
FHighlighted: boolean;
|
||||||
FSource: TLvlGraphNode;
|
FSource: TLvlGraphNode;
|
||||||
FTarget: TLvlGraphNode;
|
FTarget: TLvlGraphNode;
|
||||||
FWeight: single;
|
FWeight: single;
|
||||||
|
procedure SetHighlighted(AValue: boolean);
|
||||||
procedure SetWeight(AValue: single);
|
procedure SetWeight(AValue: single);
|
||||||
public
|
public
|
||||||
Data: Pointer; // free for user data
|
Data: Pointer; // free for user data
|
||||||
@ -330,6 +332,7 @@ type
|
|||||||
property Weight: single read FWeight write SetWeight; // >=0
|
property Weight: single read FWeight write SetWeight; // >=0
|
||||||
function IsBackEdge: boolean;
|
function IsBackEdge: boolean;
|
||||||
property BackEdge: boolean read FBackEdge; // edge was disabled to break a cycle
|
property BackEdge: boolean read FBackEdge; // edge was disabled to break a cycle
|
||||||
|
property Highlighted: boolean read FHighlighted write SetHighlighted;
|
||||||
function AsString: string;
|
function AsString: string;
|
||||||
end;
|
end;
|
||||||
TLvlGraphEdgeClass = class of TLvlGraphEdge;
|
TLvlGraphEdgeClass = class of TLvlGraphEdge;
|
||||||
@ -580,6 +583,7 @@ type
|
|||||||
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer
|
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer
|
||||||
); override;
|
); override;
|
||||||
procedure CreateWnd; override;
|
procedure CreateWnd; override;
|
||||||
|
procedure HighlightConnectedEgdes(Node: TLvlGraphNode);
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -1827,35 +1831,10 @@ procedure TCustomLvlGraphControl.SetNodeUnderMouse(AValue: TLvlGraphNode);
|
|||||||
begin
|
begin
|
||||||
if FNodeUnderMouse=AValue then Exit;
|
if FNodeUnderMouse=AValue then Exit;
|
||||||
FNodeUnderMouse:=AValue;
|
FNodeUnderMouse:=AValue;
|
||||||
Invalidate;
|
HighlightConnectedEgdes(NodeUnderMouse);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomLvlGraphControl.DrawEdges(Highlighted: boolean);
|
procedure TCustomLvlGraphControl.DrawEdges(Highlighted: boolean);
|
||||||
|
|
||||||
procedure HighlightNode(Node: TLvlGraphNode; HighlightedElements: TAvgLvlTree;
|
|
||||||
FollowIn, FollowOut: boolean);
|
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
Edge: TLvlGraphEdge;
|
|
||||||
begin
|
|
||||||
if HighlightedElements.Find(Node)<>nil then exit;
|
|
||||||
HighlightedElements.Add(Node);
|
|
||||||
if FollowIn then
|
|
||||||
for i:=0 to Node.InEdgeCount-1 do begin
|
|
||||||
Edge:=Node.InEdges[i];
|
|
||||||
HighlightedElements.Add(Edge);
|
|
||||||
if not Edge.Source.Visible then
|
|
||||||
HighlightNode(Edge.Source,HighlightedElements,true,false);
|
|
||||||
end;
|
|
||||||
if FollowOut then
|
|
||||||
for i:=0 to Node.OutEdgeCount-1 do begin
|
|
||||||
Edge:=Node.OutEdges[i];
|
|
||||||
HighlightedElements.Add(Edge);
|
|
||||||
if not Edge.Target.Visible then
|
|
||||||
HighlightNode(Edge.Target,HighlightedElements,false,true);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
Level: TLvlGraphLevel;
|
Level: TLvlGraphLevel;
|
||||||
@ -1865,13 +1844,7 @@ var
|
|||||||
Edge: TLvlGraphEdge;
|
Edge: TLvlGraphEdge;
|
||||||
TargetNode: TLvlGraphNode;
|
TargetNode: TLvlGraphNode;
|
||||||
x1, y1, x2, y2: Integer;
|
x1, y1, x2, y2: Integer;
|
||||||
HighlightedElements: TAvgLvlTree;
|
|
||||||
EdgeHighlighted: Boolean;
|
|
||||||
begin
|
begin
|
||||||
HighlightedElements:=TAvgLvlTree.Create;
|
|
||||||
try
|
|
||||||
if NodeUnderMouse<>nil then
|
|
||||||
HighlightNode(NodeUnderMouse,HighlightedElements,true,true);
|
|
||||||
for i:=0 to Graph.LevelCount-1 do begin
|
for i:=0 to Graph.LevelCount-1 do begin
|
||||||
Level:=Graph.Levels[i];
|
Level:=Graph.Levels[i];
|
||||||
for j:=0 to Level.Count-1 do begin
|
for j:=0 to Level.Count-1 do begin
|
||||||
@ -1879,8 +1852,7 @@ begin
|
|||||||
for k:=0 to Node.OutEdgeCount-1 do begin
|
for k:=0 to Node.OutEdgeCount-1 do begin
|
||||||
Edge:=Node.OutEdges[k];
|
Edge:=Node.OutEdges[k];
|
||||||
TargetNode:=Edge.Target;
|
TargetNode:=Edge.Target;
|
||||||
EdgeHighlighted:=HighlightedElements.Find(Edge)<>nil;
|
if Edge.Highlighted<>Highlighted then continue;
|
||||||
if EdgeHighlighted<>Highlighted then continue;
|
|
||||||
x1:=Level.DrawPosition-ScrollLeft;
|
x1:=Level.DrawPosition-ScrollLeft;
|
||||||
y1:=Node.DrawCenter-ScrollTop;
|
y1:=Node.DrawCenter-ScrollTop;
|
||||||
x2:=TargetNode.Level.DrawPosition-ScrollLeft;
|
x2:=TargetNode.Level.DrawPosition-ScrollLeft;
|
||||||
@ -1894,7 +1866,7 @@ begin
|
|||||||
x1+=NodeStyle.Width div 2;
|
x1+=NodeStyle.Width div 2;
|
||||||
if not TargetNode.Visible then
|
if not TargetNode.Visible then
|
||||||
x2+=NodeStyle.Width div 2;
|
x2+=NodeStyle.Width div 2;
|
||||||
if EdgeHighlighted then
|
if Edge.Highlighted then
|
||||||
Canvas.Pen.Color:=clGray
|
Canvas.Pen.Color:=clGray
|
||||||
else
|
else
|
||||||
Canvas.Pen.Color:=clSilver;
|
Canvas.Pen.Color:=clSilver;
|
||||||
@ -1914,9 +1886,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
finally
|
|
||||||
HighlightedElements.Free;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomLvlGraphControl.GraphSelectionChanged(Sender: TObject);
|
procedure TCustomLvlGraphControl.GraphSelectionChanged(Sender: TObject);
|
||||||
@ -2274,6 +2243,59 @@ begin
|
|||||||
UpdateScrollBars;
|
UpdateScrollBars;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCustomLvlGraphControl.HighlightConnectedEgdes(Node: TLvlGraphNode);
|
||||||
|
|
||||||
|
procedure HighlightNode(Node: TLvlGraphNode; HighlightedElements: TAvgLvlTree;
|
||||||
|
FollowIn, FollowOut: boolean);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
Edge: TLvlGraphEdge;
|
||||||
|
begin
|
||||||
|
if HighlightedElements.Find(Node)<>nil then exit;
|
||||||
|
HighlightedElements.Add(Node);
|
||||||
|
if FollowIn then
|
||||||
|
for i:=0 to Node.InEdgeCount-1 do begin
|
||||||
|
Edge:=Node.InEdges[i];
|
||||||
|
HighlightedElements.Add(Edge);
|
||||||
|
if not Edge.Source.Visible then
|
||||||
|
HighlightNode(Edge.Source,HighlightedElements,true,false);
|
||||||
|
end;
|
||||||
|
if FollowOut then
|
||||||
|
for i:=0 to Node.OutEdgeCount-1 do begin
|
||||||
|
Edge:=Node.OutEdges[i];
|
||||||
|
HighlightedElements.Add(Edge);
|
||||||
|
if not Edge.Target.Visible then
|
||||||
|
HighlightNode(Edge.Target,HighlightedElements,false,true);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
n: Integer;
|
||||||
|
CurNode: TLvlGraphNode;
|
||||||
|
e: Integer;
|
||||||
|
HighlightedElements: TAvgLvlTree;
|
||||||
|
Edge: TLvlGraphEdge;
|
||||||
|
begin
|
||||||
|
HighlightedElements:=TAvgLvlTree.Create;
|
||||||
|
try
|
||||||
|
BeginUpdate;
|
||||||
|
if Node<>nil then
|
||||||
|
HighlightNode(Node,HighlightedElements,true,true);
|
||||||
|
// unhighlight the rest
|
||||||
|
for n:=0 to Graph.NodeCount-1 do begin
|
||||||
|
CurNode:=Graph.Nodes[n];
|
||||||
|
for e:=0 to CurNode.OutEdgeCount-1 do begin
|
||||||
|
Edge:=CurNode.OutEdges[e];
|
||||||
|
Edge.Highlighted:=HighlightedElements.Find(Edge)<>nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
HighlightedElements.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
EndUpdate;
|
||||||
|
end;
|
||||||
|
|
||||||
constructor TCustomLvlGraphControl.Create(AOwner: TComponent);
|
constructor TCustomLvlGraphControl.Create(AOwner: TComponent);
|
||||||
begin
|
begin
|
||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
@ -3137,6 +3159,13 @@ begin
|
|||||||
Source.Invalidate;
|
Source.Invalidate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TLvlGraphEdge.SetHighlighted(AValue: boolean);
|
||||||
|
begin
|
||||||
|
if FHighlighted=AValue then Exit;
|
||||||
|
FHighlighted:=AValue;
|
||||||
|
Source.Invalidate;
|
||||||
|
end;
|
||||||
|
|
||||||
constructor TLvlGraphEdge.Create(TheSource: TLvlGraphNode;
|
constructor TLvlGraphEdge.Create(TheSource: TLvlGraphNode;
|
||||||
TheTarget: TLvlGraphNode);
|
TheTarget: TLvlGraphNode);
|
||||||
begin
|
begin
|
||||||
|
Loading…
Reference in New Issue
Block a user