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 + -
显示快捷键?