layers.pas
来自「FlexGraphics是一套创建矢量图形的VCL组件」· PAS 代码 · 共 184 行
PAS
184 行
unit Layers;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ImgList, FlexBase, ComCtrls, ToolWin, Menus;
type
TfmLayers = class(TForm)
tvLayers: TTreeView;
imgStates: TImageList;
sbMain: TStatusBar;
pmLayers: TPopupMenu;
miInvisible: TMenuItem;
miVisible: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure tvLayersMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure tvLayersEdited(Sender: TObject; Node: TTreeNode;
var S: String);
procedure miInvisibleClick(Sender: TObject);
procedure miVisibleClick(Sender: TObject);
procedure pmLayersPopup(Sender: TObject);
procedure tvLayersMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
FActiveFlex: TFlexPanel;
FPopupNode: TTreeNode;
procedure SetActiveFlex(const Value: TFlexPanel);
function GetIconIndex(Layer: TFlexLayer): integer;
public
{ Public declarations }
property ActiveFlex: TFlexPanel read FActiveFlex write SetActiveFlex;
procedure UpdateData(Layer: TFlexLayer = Nil);
end;
var
fmLayers: TfmLayers;
implementation
{$R *.DFM}
uses
Main;
// TfmLayers //////////////////////////////////////////////////////////////////
procedure TfmLayers.FormCreate(Sender: TObject);
begin
ActiveFlex := fmMain.fpMain;
UpdateData;
end;
procedure TfmLayers.SetActiveFlex(const Value: TFlexPanel);
begin
if Value = FActiveFlex then exit;
FActiveFlex := Value;
UpdateData;
end;
procedure TfmLayers.UpdateData(Layer: TFlexLayer = Nil);
var i, IconIdx, Count: integer;
SelNode: TTreeNode;
Sel: TFlexLayer;
begin
Count := 0;
tvLayers.Items.BeginUpdate;
try
if not Assigned(FActiveFlex) then begin
tvLayers.Items.Clear;
exit;
end;
if tvLayers.Items.Count <> FActiveFlex.Layers.Count then begin
while tvLayers.Items.Count > FActiveFlex.Layers.Count do
tvLayers.Items.Delete(tvLayers.Items[tvLayers.Items.Count-1]);
while tvLayers.Items.Count < FActiveFlex.Layers.Count do
tvLayers.Items.Add(Nil, '');
end;
if Assigned(tvLayers.Selected)
then Sel := TFlexLayer(tvLayers.Selected.Data)
else Sel := Nil;
SelNode := Nil;
Count := FActiveFlex.Layers.Count;
for i:=0 to Count-1 do with tvLayers.Items[i] do begin
Text := FActiveFlex.Layers[i].Name;
Data := FActiveFlex.Layers[i];
IconIdx := GetIconIndex(FActiveFlex.Layers[i]);
ImageIndex := IconIdx;
SelectedIndex := IconIdx;
StateIndex := IconIdx;
if FActiveFlex.Layers[i] = Sel then SelNode := tvLayers.Items[i];
end;
tvLayers.Selected := SelNode;
finally
tvLayers.Items.EndUpdate;
if Count = 0
then sbMain.SimpleText := ''
else sbMain.SimpleText := ' '+IntToStr(Count)+' Layer(s)';
end;
end;
function TfmLayers.GetIconIndex(Layer: TFlexLayer): integer;
begin
if Assigned(Layer)
then Result := byte(not Layer.Visible)
else Result := -1;
end;
procedure TfmLayers.tvLayersMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var Node: TTreeNode;
begin
if Button = mbRight then begin
Node := tvLayers.GetNodeAt(X, Y);
if Assigned(Node) then tvLayers.Selected := Node;
end;
if {(Button <> mbLeft) or }not Assigned(FActiveFlex) then exit;
if X < imgStates.Width then begin
Node := tvLayers.GetNodeAt(X, Y);
if not Assigned(Node) then exit;
// Click on layer state image
if X < imgStates.Width then begin
// Visible property
with TFlexLayer(Node.Data) do Visible := not Visible;
UpdateData(TFlexLayer(Node.Data));
end;
//if Assigned(Node) then FActiveFlex.ActiveLayer := TFlexLayer(Node.Data);
end;
end;
procedure TfmLayers.tvLayersEdited(Sender: TObject; Node: TTreeNode;
var S: String);
begin
TFlexLayer(Node.Data).Name := s;
s := TFlexLayer(Node.Data).Name;
end;
procedure TfmLayers.miInvisibleClick(Sender: TObject);
begin
if Assigned(FPopupNode) then begin
TFlexLayer(FPopupNode.Data).Visible := False;
UpdateData(TFlexLayer(FPopupNode.Data));
FPopupNode := Nil;
end;
end;
procedure TfmLayers.miVisibleClick(Sender: TObject);
begin
if Assigned(FPopupNode) then begin
TFlexLayer(FPopupNode.Data).Visible := True;
UpdateData(TFlexLayer(FPopupNode.Data));
FPopupNode := Nil;
end;
end;
procedure TfmLayers.pmLayersPopup(Sender: TObject);
begin
if Assigned(tvLayers.Selected) then begin
FPopupNode := tvLayers.Selected;
miInVisible.Enabled := TFlexLayer(FPopupNode.Data).Visible;
miVisible.Enabled := not miInvisible.Enabled;
end else begin
miVisible.Enabled := False;
miInvisible.Enabled := False;
FPopupNode := Nil;
end;
end;
procedure TfmLayers.tvLayersMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var Node: TTreeNode;
begin
Node := tvLayers.GetNodeAt(X, Y);
if Assigned(Node) and (X < imgStates.Width)
then tvLayers.Cursor := crHandPoint
else tvLayers.Cursor := crDefault;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?