📄 treeanimateeditor.pas
字号:
{**********************************************}
{ 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 + -