⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treeanimateeditor.pas

📁 第三方控件:PaintGrid.pas 网格型仪表控件源文件 Mymeter.pas 圆型仪表控件源文件 Project1是这两个控件的使用范例。 该
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{**********************************************}
{   TTreeAnimate Editor Dialog                 }
{   Copyright (c) 2001-2002 by David Berneda   }
{**********************************************}
{$I TeeDefs.inc}
unit TreeAnimateEditor;

interface

uses
  {$IFNDEF LINUX}
  Windows, Messages,
  {$ENDIF}
  SysUtils, Classes,
  {$IFDEF CLX}
  QGraphics, QControls, QForms, QDialogs, QExtCtrls, QButtons, QComCtrls,
  QStdCtrls, QGrids,
  {$ELSE}
  Graphics, Controls, Forms, Dialogs, ExtCtrls, Buttons, ComCtrls,
  StdCtrls, Grids,
  {$ENDIF}
  {$IFDEF CLR}
  Variants,
  {$ENDIF}
  TeeProcs, TeeTree, TreeEd, TeCanvas, TreeAnimate, TeeInspector;

type
  TTreeAnimateEditor = class(TForm)
    Panel1: TPanel;
    Panel4: TPanel;
    SBPlay: TSpeedButton;
    SBPause: TSpeedButton;
    SBStop: TSpeedButton;
    SBFrame: TSpeedButton;
    SpeedButton5: TSpeedButton;
    SpeedButton6: TSpeedButton;
    Label3: TLabel;
    TrackBar1: TTrackBar;
    CBLoop: TCheckBox;
    Splitter1: TSplitter;
    TreeMap: TTree;
    Tree1: TTree;
    PanelAnim: TPanel;
    Ruler: TTreeRuler;
    Splitter2: TSplitter;
    Panel2: TPanel;
    UpScale: TUpDown;
    TeeInspector1: TTeeInspector;
    Panel3: TPanel;
    SBClose: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure TreeMapScroll(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure SBPlayClick(Sender: TObject);
    procedure TreeMapAfterDraw(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure SBPauseClick(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure SBStopClick(Sender: TObject);
    procedure CBLoopClick(Sender: TObject);
    procedure SBFrameClick(Sender: TObject);
    procedure TreeMapSelectShape(Sender: TTreeNodeShape);
    procedure Tree1SelectShape(Sender: TTreeNodeShape);
    procedure TreeMapDeletedShapes(Sender: TObject);
    procedure TreeMapDeletingShapes(Sender: TSelectedShapeList;
      var AllowDelete: Boolean);
    procedure TreeMapMovingShape(Sender: TTreeNodeShape; var DeltaX,
      DeltaY: Integer);
    procedure TreeMapResizingShape(Sender: TTreeNodeShape;
      ACorner: TTreeShapeHandle; var DeltaX, DeltaY: Integer);
    procedure SpeedButton6Click(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
    procedure Tree1DeletedShapes(Sender: TObject);
    procedure RulerGetUnit( Sender:TTreeRuler; Pixel:Integer; var Text:String);
    procedure UpScaleClick(Sender: TObject; Button: TUDBtnType);
    procedure TeeInspector1Items2Change(Sender: TObject);
    procedure TeeInspector1Items3Change(Sender: TObject);
    procedure TeeInspector1Items1Change(Sender: TObject);
    procedure TeeInspector1Items0Change(Sender: TObject);
    procedure TeeInspector1Items4Change(Sender: TObject);
    procedure TeeInspector1Items0GetItems(Sender: TInspectorItem;
      Proc: TGetItemProc);
    procedure TeeInspector1Items6Change(Sender: TObject);
    procedure TeeInspector1Items5Change(Sender: TObject);
    procedure TeeInspector1Items7Change(Sender: TObject);
    procedure TeeInspector1Items8Change(Sender: TObject);
    procedure SBCloseClick(Sender: TObject);
    procedure PanelAnimResize(Sender: TObject);
    procedure TeeInspector1Items9GetItems(Sender: TInspectorItem;
      Proc: TGetItemProc);
    procedure TeeInspector1Items9Change(Sender: TObject);
    procedure TeeInspector1Items10GetItems(Sender: TInspectorItem;
      Proc: TGetItemProc);
    procedure TeeInspector1Items10Change(Sender: TObject);
    procedure TeeInspector1Items11GetItems(Sender: TInspectorItem;
      Proc: TGetItemProc);
    procedure TeeInspector1Items11Change(Sender: TObject);
  private
    { Private declarations }
    FAnimate    : TTreeAnimate;
    FOnModified : TNotifyEvent;
    FEvents     : TTreeAnimateEvents;

    Changing    : Boolean;
    IHorizScale : Integer;  // pixels (width) equalling one frame
    IVertScale  : Integer;

    procedure AnimateDeletedShapes(Sender: TObject);
    procedure AnimateClear(Sender: TObject);
    procedure AnimateContinue(Sender: TObject);
    procedure AnimateFrame(Sender: TObject);
    procedure AnimatePause(Sender: TObject);
    procedure AnimatePlay(Sender: TObject);
    procedure AnimateStop(Sender: TObject);
    Procedure FillNodes;
    Function NodeText(ANode:TTreeNodeShape):String;
    procedure TeeModified;
    Function TheAction:TAnimation;
    Function TheActionBar:TTreeNodeShape;
    Procedure SetActionBarColor;
    procedure SetAnimate(const Value: TTreeAnimate);
  public
    { Public declarations }
    property Animate:TTreeAnimate read FAnimate write SetAnimate;
    class Procedure ModalShow(AOwner:TComponent; TreeAnimate:TTreeAnimate);

    property OnModified:TNotifyEvent read FOnModified write FOnModified;
  end;

implementation

uses TreeAnimationGallery, TeeTranslate, TeePenDlg;

{$IFNDEF CLX}
{$R *.DFM}
{$ELSE}
{$R *.xfm}
{$ENDIF}

class Procedure TTreeAnimateEditor.ModalShow(AOwner:TComponent; TreeAnimate:TTreeAnimate);
begin
  with TTreeAnimateEditor.Create(AOwner) do
  try
    FAnimate:=TreeAnimate;
    ShowModal;
  finally
    Free;
  end;
end;

type
  TNodeAnimate=class(TTreeNodeShape)
  protected
    procedure DoDrawHandle( Handle:TTreeShapeHandle;
                            var x,y:Integer; var Draw:Boolean); override;
  public
    Constructor Create(AOwner:TComponent); override;
    Procedure MoveRelative(OfsX,OfsY:Integer; MoveChilds:Boolean); override;
  end;

procedure TNodeAnimate.DoDrawHandle( Handle:TTreeShapeHandle;
                                     var x,y:Integer; var Draw:Boolean);
begin
  with Tree.Canvas do
  begin
    Brush.Style:=bsSolid;
    Brush.Color:=clNavy;
    Pen.Style:=psSolid;
    Pen.Color:=clBlue;
    Pen.Width:=1;
    Pen.Mode:=pmNotXor;
  end;
  Tree.Selected.HandleSize:=3;
  Draw:=(Handle=rcLeft) or (Handle=rcRight);
end;

procedure TTreeAnimateEditor.FormCreate(Sender: TObject);
begin
  Changing:=True;

  // Default settings for map shapes
  with TreeMap.GlobalFormat do
  begin
    NodeClass:=TNodeAnimate;
    ImageIndex:=tiNone;
    Cursor:=crHandPoint;
  end;

  TreeMap.Designing:=True;

  IHorizScale:=12;  // pixels (width) equalling one frame
  IVertScale:=12;  // pixels (height)
end;

procedure TTreeAnimateEditor.RulerGetUnit( Sender:TTreeRuler; Pixel:Integer;
                                           var Text:String);
begin
  Text:=IntToStr(Pixel div IHorizScale);
end;

procedure TTreeAnimateEditor.TreeMapScroll(Sender: TObject);
begin
  // Synchronize trees
  if Assigned(Tree1) and Assigned(TreeMap) then
     Tree1.View3DOptions.VertOffset:=TreeMap.View3DOptions.VertOffset;
end;

{ TNodeAnimate }

constructor TNodeAnimate.Create(AOwner: TComponent);
begin
  inherited;
  Color:=clBlack;
  Border.Color:=clRed;
  ImageIndex:=tiNone;
  Cursor:=crHandPoint;
end;

procedure TNodeAnimate.MoveRelative(OfsX, OfsY: Integer;
  MoveChilds: Boolean);
begin
  OfsY:=0;
  if OfsX<0 then if Left < -OfsX then OfsX:=0;
  inherited;
end;

type TTreeAnimateAccess=class(TTreeAnimate);

procedure TTreeAnimateEditor.FormShow(Sender: TObject);
begin
  if not Assigned(FAnimate) then exit;

  Tree1.AllowPanning:=pmNone;
  Tree1.TextEditor.Enabled:=False;

  TreeMap.AllowPanning:=pmHorizontal;
  TreeMap.TextEditor.Enabled:=False;

  with TreeMap.Page do
  begin
    Border.Visible:=False;
    UsePrinter:=False;
    Width:=IHorizScale*Animate.EndFrame;
    Height:=TreeMap.ClientHeight;
  end;

  TreeMap.Grid.HorizStep:=IHorizScale;
  TreeMap.Grid.VertStep:=IVertScale;

  TTreeAnimateAccess(Animate).OnDeleteShapes:=AnimateDeletedShapes;

  with (Tree1.GlobalFormat.ChildManager as TTreeExplorerAlignChild) do
  begin
    VertMargin:=-3+((IVertScale-10) div 4);
    TopPos:=0;
  end;

  FillNodes;

  CBLoop.Checked:=Animate.Loop;
  TrackBar1.Position:=Animate.Speed;

  // Replace Onxxx events...
  with {$IFNDEF CLR}TTreeAnimateAccess{$ENDIF}(Animate) do
  begin
    SaveEvents(FEvents);
    OnContinue:=AnimateContinue;
    OnFrame:=AnimateFrame;
    OnStop:=AnimateStop;
    OnPause:=AnimatePause;
    OnPlay:=AnimatePlay;
    OnClear:=AnimateClear;
  end;

  SBPlay.Enabled:=Animate.State=asStopped;
  SBPause.Enabled:=Animate.State<>asStopped;
  SBStop.Enabled:=SBPause.Enabled;

  TeeTranslateControl(Self);

  Changing:=False;
end;

Procedure TTreeAnimateEditor.FillNodes;
var t : Integer;
begin
  // Add map shapes
  TreeMap.Clear;
  with Animate do
  for t:=0 to Animations.Count-1 do
  with TreeMap.AddRootObject('',Animations[t]) do
  begin
    X0:=IHorizScale*Animations[t].StartFrame;
    Width:=IHorizScale*Animations[t].Duration;
    Y0:=1+(IVertScale*t);
    Height:=8+((IVertScale-10) div 2);
    if not Animations[t].IsEnabled then Color:=clDkGray;
  end;

  // Add left Tree nodes
  Tree1.Clear;
  with Animate do
  for t:=0 to Animations.Count-1 do
  with Tree1.AddRootObject(Animations[t].Description,Animations[t]) do
  begin
    Border.Visible:=False;
    Font.Size:=7+((IVertScale-10) div 4);
    Y0:=1+(IVertScale*t);
    Transparent:=True;
    ImageIndex:=tiNone;
  end;
end;

// When starting playing:
procedure TTreeAnimateEditor.AnimatePlay(Sender: TObject);
begin
  SBPlay.Enabled:=False;
  SBPause.Enabled:=True;
  SBPause.Down:=False;
  SBStop.Enabled:=True;
end;

// When Paused, disable buttons and repaint map
procedure TTreeAnimateEditor.AnimatePause(Sender: TObject);
begin
  SBPause.Down:=True;
  SBFrame.Enabled:=True;
  TreeMap.Invalidate;
end;

// When animation is stopped:
procedure TTreeAnimateEditor.AnimateStop(Sender: TObject);
begin
  if not (csDestroying in ComponentState) then
  begin
    SBPlay.Enabled:=True;
    SBPause.Enabled:=False;
    SBPause.Down:=False;
    SBStop.Enabled:=False;
    SBFrame.Enabled:=False;

    TreeMap.Invalidate;
  end;
end;

procedure TTreeAnimateEditor.AnimateFrame(Sender: TObject);
var P : TPoint;
begin
  P:=TreeMap.Canvas.Calculate3DPosition(IHorizScale*Animate.CurrentFrame,0,TeeTreeZ);

  // if current frame is outside Tree, scroll Tree
  if P.x>TreeMap.ChartWidth then
  begin
    with TreeMap.View3DOptions do HorizOffset:=HorizOffset-20;
  end
  else
  if P.x<0 then
    with TreeMap.View3DOptions do HorizOffset:=HorizOffset-P.x;

  // Repaint tree
  TreeMap.Invalidate;
end;

procedure TTreeAnimateEditor.SBPlayClick(Sender: TObject);
var t : Integer;
begin
  // Set actions
  for t:=0 to TreeMap.Shapes.Count-1 do
  with TAnimation(TreeMap[t].Data) do
  begin
    StartFrame:=TreeMap[t].Left div IHorizScale;
    Duration:=TreeMap[t].Width div IHorizScale;
  end;
  Animate.Play;
end;

procedure TTreeAnimateEditor.TreeMapAfterDraw(Sender: TObject);
var tmp : Integer;
begin
  // Paint animation markers (start, end and current frame)
  with TreeMap.Canvas do
  begin
    Pen.Color:=clBlack;
    Pen.Style:=psSolid;
    Pen.Width:=1;

    if Animate.EndFrame>0 then
       VertLine3D(1+(Succ(Animate.EndFrame)*IHorizScale),0,TreeMap.Height,TeeTreeZ);

    VertLine3D(-1,0,TreeMap.Height,TeeTreeZ);

    if Animate.State=asPlaying then Pen.Color:=clBlue
    else
    if Animate.State=asPaused then Pen.Color:=clRed
    else
       Exit;

    // Paint CurrentFrame
    tmp:=Animate.CurrentFrame;
    if tmp=-1 then tmp:=Succ(Animate.EndFrame);

    VertLine3D(tmp*IHorizScale,0,TreeMap.Height,TeeTreeZ);
  end;
end;

// Stop the animation and restore old events:
procedure TTreeAnimateEditor.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  with {$IFNDEF CLR}TTreeAnimateAccess{$ENDIF}(Animate) do
  begin
    Stop;
    RestoreEvents(FEvents);
  end;
end;

// Pause or Continue playing:
procedure TTreeAnimateEditor.SBPauseClick(Sender: TObject);
begin
  if SBPause.Down then Animate.Pause
                  else Animate.Continue;
end;

// Change speed:
procedure TTreeAnimateEditor.TrackBar1Change(Sender: TObject);
begin
  if not Changing then
  begin
    Animate.Speed:=TrackBar1.Position;
    TeeModified;
  end;
end;

// Stop animation:
procedure TTreeAnimateEditor.SBStopClick(Sender: TObject);
begin
  Animate.Stop;
end;

// Set Loop:
procedure TTreeAnimateEditor.CBLoopClick(Sender: TObject);
begin
  if not Changing then
  begin
    Animate.Loop:=CBLoop.Checked;
    TeeModified;
  end;
end;

// Next frame:
procedure TTreeAnimateEditor.SBFrameClick(Sender: TObject);
begin
  Animate.NextFrame;
end;

// Select node in Tree when a bar is selected:
procedure TTreeAnimateEditor.TreeMapSelectShape(Sender: TTreeNodeShape);
begin
  Tree1.Selected.Clear;
  Tree1.Roots[TAnimation(Sender.Data).Index].Selected:=True;
end;

// Select a bar in map when a node in Tree is selected:
procedure TTreeAnimateEditor.Tree1SelectShape(Sender: TTreeNodeShape);

  Procedure DoSelection;
  var tmp     : Boolean;
      tmpIsOk : Boolean;
  begin
    TreeMap.OnSelectShape:=nil;
    TreeMap.Selected.Clear;

    tmp:=Assigned(Sender);

    if tmp then
       TreeMap.Roots[TAnimation(Sender.Data).Index].Selected:=True;

    TreeMap.OnSelectShape:=TreeMapSelectShape;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -