You've already forked lazarus-ccr
Comba Animation - Initial commit v1.00
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5794 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
BIN
components/Comba_Animation/images/back_400.jpg
Normal file
BIN
components/Comba_Animation/images/back_400.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 78 KiB |
BIN
components/Comba_Animation/images/background_org.png
Normal file
BIN
components/Comba_Animation/images/background_org.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 42 KiB |
BIN
components/Comba_Animation/images/flare2.png
Normal file
BIN
components/Comba_Animation/images/flare2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
BIN
components/Comba_Animation/images/reload_original.png
Normal file
BIN
components/Comba_Animation/images/reload_original.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
231
components/Comba_Animation/output/Contributors.txt
Normal file
231
components/Comba_Animation/output/Contributors.txt
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
#The following people contributed to Lazarus:
|
||||||
|
|
||||||
|
A. J. Venter
|
||||||
|
Алексей Лагунов
|
||||||
|
Alexander Grau
|
||||||
|
Alexander S. Klenin
|
||||||
|
Alexander Shiyan
|
||||||
|
Alexandr Gridnev
|
||||||
|
Alexandre Leclerc
|
||||||
|
Alexandru Alexandrov
|
||||||
|
Alexey Torgashin
|
||||||
|
Andreas Hausladen
|
||||||
|
Andreas Schneider
|
||||||
|
Andrew Haines
|
||||||
|
Andrew Johnson
|
||||||
|
Anton A. Panferov
|
||||||
|
Anton Kavalenka
|
||||||
|
Antônio Galvão
|
||||||
|
Arnold Bosch
|
||||||
|
Attila Tamás - Hungarian translation
|
||||||
|
August Klein
|
||||||
|
Babak Mahmoudabadi
|
||||||
|
Balazs Szekely
|
||||||
|
Bald Zhang
|
||||||
|
Bart Broersma
|
||||||
|
Benito van der Zander
|
||||||
|
Bent Normann Olsen
|
||||||
|
Bernd Engelhardt
|
||||||
|
Bernd Kreuss
|
||||||
|
Bernd Mueller
|
||||||
|
Bob Wingard
|
||||||
|
Bogusław Brandys
|
||||||
|
Boian Mitov
|
||||||
|
Boris Arko
|
||||||
|
Boris Glavin
|
||||||
|
Boris Popov
|
||||||
|
Brad Campbell
|
||||||
|
Bruce Tulloch
|
||||||
|
Chris Rorden
|
||||||
|
Christian Budde
|
||||||
|
Christian Iversen
|
||||||
|
Christian Ulrich
|
||||||
|
Christopher Kirkpatrick
|
||||||
|
Cliff Baeseman
|
||||||
|
Colin Western
|
||||||
|
Curtis White
|
||||||
|
Daniel Oom
|
||||||
|
Daniel Simões de Almeida
|
||||||
|
Darek Mazur
|
||||||
|
Darius Blaszijk
|
||||||
|
Dávid Fehér - Hungarian translation
|
||||||
|
David Guadagnini
|
||||||
|
David Jenkins
|
||||||
|
David Pethes
|
||||||
|
David Zimmer
|
||||||
|
Dean Zobec
|
||||||
|
Denis Golovan
|
||||||
|
Denis Kozlov
|
||||||
|
Denis Volodarsky
|
||||||
|
Derit Agustin
|
||||||
|
Diogo Piçarra
|
||||||
|
Dirk Schiphorst
|
||||||
|
Dmitry Boyarintsev
|
||||||
|
Dominique Louis
|
||||||
|
Ere Maijala
|
||||||
|
Eric Chapman
|
||||||
|
Erivelton Silva
|
||||||
|
Erwin van den Bosch
|
||||||
|
Eugene Kryukov
|
||||||
|
Evgen A. Palamarchuck
|
||||||
|
Ezik Shlomi
|
||||||
|
Fabrizio Fellini
|
||||||
|
Fathony Luthfillah (x2nie)
|
||||||
|
Felipe Monteiro de Carvalho
|
||||||
|
Flávio Etrusco
|
||||||
|
Florian Koeberle
|
||||||
|
Francisco Manuel
|
||||||
|
Gerard Visent
|
||||||
|
Gilles Vasseur - French translation
|
||||||
|
Giuliano Colla
|
||||||
|
Giulio Bernardi
|
||||||
|
GongYu
|
||||||
|
Graeme Geldenhuys
|
||||||
|
Grzegorz Zakrzewski
|
||||||
|
Hakan Kizilhan
|
||||||
|
Hans Luijten
|
||||||
|
Hans-Joachim Ott
|
||||||
|
Hans-Peter Diettrich
|
||||||
|
Haruyuki Fujimaki
|
||||||
|
Henry Vermaak
|
||||||
|
Hwang Weng Sun
|
||||||
|
Ido Kanner
|
||||||
|
Igor Paliychuk
|
||||||
|
Imad Goubaa
|
||||||
|
James Chandler Jr.
|
||||||
|
Jan Adamec
|
||||||
|
Jan Foster
|
||||||
|
Janusz Tomczak
|
||||||
|
Jarto Tarpio
|
||||||
|
Jason King
|
||||||
|
Jeffrey A. Wormsley
|
||||||
|
Jeroen van Idekinge
|
||||||
|
Jesus Reyes
|
||||||
|
JiXian Yang
|
||||||
|
Jörg Braun - German translation
|
||||||
|
Johannes Muller
|
||||||
|
Jonas Maebe
|
||||||
|
Joost van der Sluis
|
||||||
|
Jose Alonso Cardenas M.
|
||||||
|
José Martínez - Spanish translation
|
||||||
|
Jose Mejuto
|
||||||
|
Jouke Rensma
|
||||||
|
Juan Salvador Pérez García
|
||||||
|
Juha Manninen
|
||||||
|
Júnior Gonçalves
|
||||||
|
Justin Smyth
|
||||||
|
Karl Brandt
|
||||||
|
Keith Bowes
|
||||||
|
Khaled Shagrouni
|
||||||
|
Kostas Michalopoulos
|
||||||
|
Krzysztof Dibowski
|
||||||
|
Ladislav Michl
|
||||||
|
Laurent Jacques
|
||||||
|
Leslie Kaye
|
||||||
|
Louis Hoefler
|
||||||
|
Luca Olivetti
|
||||||
|
Lucas Martin
|
||||||
|
Ludo Brands
|
||||||
|
Luis R. Hilario B.
|
||||||
|
Luís Rodrigues
|
||||||
|
Luiz Américo
|
||||||
|
Maciej Izak (hnb)
|
||||||
|
Marc Fokker
|
||||||
|
Marc Geldon
|
||||||
|
Marc Weustink
|
||||||
|
Marcelo Borges de Paula
|
||||||
|
Mario Bonati
|
||||||
|
Mario Ray Mahardhika
|
||||||
|
Marius Ellen
|
||||||
|
Mark Bravington
|
||||||
|
Markus Muller
|
||||||
|
Martin Friebe
|
||||||
|
Martin Patik
|
||||||
|
Martin Smat
|
||||||
|
Márton Papp
|
||||||
|
Martyn Ranyard
|
||||||
|
Massimo Magnano
|
||||||
|
Massimo Soricetti
|
||||||
|
Matthijs Willemstein
|
||||||
|
Mattias Gärtner
|
||||||
|
Mattias Hansson
|
||||||
|
Maxim Ganetsky
|
||||||
|
Mazen Neifer
|
||||||
|
Micha Nelissen
|
||||||
|
Michael A. Hess
|
||||||
|
Michael Fuchs
|
||||||
|
Michael W. Vogel
|
||||||
|
Michal Bukovjan
|
||||||
|
Michal Gawrycki
|
||||||
|
Michalis Kamburelis
|
||||||
|
Mike Sapsard
|
||||||
|
Mike Thompson
|
||||||
|
Nikolay Ermolov
|
||||||
|
Nur Cholif Murtadho
|
||||||
|
Olivier Guilbaud
|
||||||
|
Ondrej Pokorny
|
||||||
|
Patrick Chevalley
|
||||||
|
Paul Ishenin
|
||||||
|
Paul Michell
|
||||||
|
Pawel Trochimczuk
|
||||||
|
Peter Dyson
|
||||||
|
Péter Gábor
|
||||||
|
Petr Kristan
|
||||||
|
Philip J. Hess
|
||||||
|
Philippe Picard
|
||||||
|
Pierre Gillmann
|
||||||
|
Przemyslaw Nagay
|
||||||
|
Radek Cervinka
|
||||||
|
Raul Moratalla
|
||||||
|
Razvan Adrian Bogdan
|
||||||
|
Reimar Grabowski
|
||||||
|
Reinier Olislagers
|
||||||
|
Roozbeh GHolizadeh
|
||||||
|
Rostislav Okulov
|
||||||
|
Salvatore Coppola
|
||||||
|
Samuel Herzog
|
||||||
|
Samuel Liddicott
|
||||||
|
Sandro Cumerlato
|
||||||
|
Sean McIlwain
|
||||||
|
Sebastian Gasiorek
|
||||||
|
Seppo Suutarla - Finnish translation
|
||||||
|
Sérgio Marcelo
|
||||||
|
Shane Miller
|
||||||
|
Sileno Goedicke
|
||||||
|
Silvio Clécio
|
||||||
|
Simon Ameis
|
||||||
|
Slavko Fedorik
|
||||||
|
Stefan Hille
|
||||||
|
Takeda Matsuki
|
||||||
|
Tamás Kálcza - Hungarian translation
|
||||||
|
Taras Boychuk
|
||||||
|
Theo Lustenberger
|
||||||
|
Tim P. Launchbury
|
||||||
|
Tobias Giesen
|
||||||
|
Tom Lisjac
|
||||||
|
Tomáš Gregorovič
|
||||||
|
Tomasz Wieckowski
|
||||||
|
Tony Maro
|
||||||
|
Vaclav Valicek
|
||||||
|
Valdas Jankūnas
|
||||||
|
Valdinilson Lourenço da Cunha
|
||||||
|
Vasily I. Volchenko
|
||||||
|
Vincent Beuselinck
|
||||||
|
Vincent Snijders
|
||||||
|
Vladimir Serotyukov
|
||||||
|
Vladimir Zhirov
|
||||||
|
Vojtech Cihak
|
||||||
|
Wanderlan Santos dos Anjos
|
||||||
|
Werner Pamler
|
||||||
|
Wojciech Malinowski
|
||||||
|
Yauheni Nazimau
|
||||||
|
Yuichiro Takahashi
|
||||||
|
Yuriy Yeroshkin
|
||||||
|
Yury Sidorov
|
||||||
|
Zaenal Mutaqin
|
||||||
|
Zaher Dirkey
|
||||||
|
Zdravko Gabrovski
|
||||||
|
Zeljan Rikalo
|
||||||
|
Žilvinas Ledas
|
||||||
|
|
||||||
|
#and special thanks to the FPC team.
|
140
components/Comba_Animation/samples/contributors/contributors.lpi
Normal file
140
components/Comba_Animation/samples/contributors/contributors.lpi
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<CONFIG>
|
||||||
|
<ProjectOptions>
|
||||||
|
<Version Value="10"/>
|
||||||
|
<PathDelim Value="\"/>
|
||||||
|
<General>
|
||||||
|
<SessionStorage Value="InProjectDir"/>
|
||||||
|
<MainUnit Value="0"/>
|
||||||
|
<Title Value="Lazarus Contributors Animation"/>
|
||||||
|
<ResourceType Value="res"/>
|
||||||
|
<UseXPManifest Value="True"/>
|
||||||
|
<XPManifest>
|
||||||
|
<TextName Value="CompanyName.ProductName.AppName"/>
|
||||||
|
<TextDesc Value="Your application description."/>
|
||||||
|
</XPManifest>
|
||||||
|
</General>
|
||||||
|
<i18n>
|
||||||
|
<EnableI18N LFM="False"/>
|
||||||
|
</i18n>
|
||||||
|
<BuildModes Count="2">
|
||||||
|
<Item1 Name="Debug" Default="True"/>
|
||||||
|
<Item2 Name="Release">
|
||||||
|
<CompilerOptions>
|
||||||
|
<Version Value="11"/>
|
||||||
|
<PathDelim Value="\"/>
|
||||||
|
<Target>
|
||||||
|
<Filename Value="..\..\output\contributors"/>
|
||||||
|
</Target>
|
||||||
|
<SearchPaths>
|
||||||
|
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||||
|
<OtherUnitFiles Value="..\..\src"/>
|
||||||
|
<UnitOutputDirectory Value="..\..\lib\$NameOnly($(ProjFile))\lib\$(TargetCPU)-$(TargetOS)"/>
|
||||||
|
</SearchPaths>
|
||||||
|
<CodeGeneration>
|
||||||
|
<Optimizations>
|
||||||
|
<OptimizationLevel Value="3"/>
|
||||||
|
</Optimizations>
|
||||||
|
</CodeGeneration>
|
||||||
|
<Linking>
|
||||||
|
<Debugging>
|
||||||
|
<GenerateDebugInfo Value="False"/>
|
||||||
|
</Debugging>
|
||||||
|
<Options>
|
||||||
|
<Win32>
|
||||||
|
<GraphicApplication Value="True"/>
|
||||||
|
</Win32>
|
||||||
|
</Options>
|
||||||
|
</Linking>
|
||||||
|
</CompilerOptions>
|
||||||
|
</Item2>
|
||||||
|
</BuildModes>
|
||||||
|
<PublishOptions>
|
||||||
|
<Version Value="2"/>
|
||||||
|
</PublishOptions>
|
||||||
|
<RunParams>
|
||||||
|
<local>
|
||||||
|
<FormatVersion Value="1"/>
|
||||||
|
</local>
|
||||||
|
</RunParams>
|
||||||
|
<RequiredPackages Count="1">
|
||||||
|
<Item1>
|
||||||
|
<PackageName Value="LCL"/>
|
||||||
|
</Item1>
|
||||||
|
</RequiredPackages>
|
||||||
|
<Units Count="5">
|
||||||
|
<Unit0>
|
||||||
|
<Filename Value="contributors.lpr"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
</Unit0>
|
||||||
|
<Unit1>
|
||||||
|
<Filename Value="uanimationcontributors.pas"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
</Unit1>
|
||||||
|
<Unit2>
|
||||||
|
<Filename Value="..\..\src\uanimationbasic.pas"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
</Unit2>
|
||||||
|
<Unit3>
|
||||||
|
<Filename Value="ufrmcontributors.pas"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
<ComponentName Value="frmContributors"/>
|
||||||
|
<HasResources Value="True"/>
|
||||||
|
<ResourceBaseClass Value="Form"/>
|
||||||
|
</Unit3>
|
||||||
|
<Unit4>
|
||||||
|
<Filename Value="..\..\src\uanimationtypes.pas"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
</Unit4>
|
||||||
|
</Units>
|
||||||
|
</ProjectOptions>
|
||||||
|
<CompilerOptions>
|
||||||
|
<Version Value="11"/>
|
||||||
|
<PathDelim Value="\"/>
|
||||||
|
<Target>
|
||||||
|
<Filename Value="..\..\output\contributors"/>
|
||||||
|
</Target>
|
||||||
|
<SearchPaths>
|
||||||
|
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||||
|
<OtherUnitFiles Value="..\..\src"/>
|
||||||
|
<UnitOutputDirectory Value="..\..\lib\$NameOnly($(ProjFile))\lib\$(TargetCPU)-$(TargetOS)"/>
|
||||||
|
</SearchPaths>
|
||||||
|
<Parsing>
|
||||||
|
<SyntaxOptions>
|
||||||
|
<IncludeAssertionCode Value="True"/>
|
||||||
|
</SyntaxOptions>
|
||||||
|
</Parsing>
|
||||||
|
<CodeGeneration>
|
||||||
|
<Checks>
|
||||||
|
<IOChecks Value="True"/>
|
||||||
|
<RangeChecks Value="True"/>
|
||||||
|
<OverflowChecks Value="True"/>
|
||||||
|
<StackChecks Value="True"/>
|
||||||
|
</Checks>
|
||||||
|
<VerifyObjMethodCallValidity Value="True"/>
|
||||||
|
</CodeGeneration>
|
||||||
|
<Linking>
|
||||||
|
<Debugging>
|
||||||
|
<UseHeaptrc Value="True"/>
|
||||||
|
</Debugging>
|
||||||
|
<Options>
|
||||||
|
<Win32>
|
||||||
|
<GraphicApplication Value="True"/>
|
||||||
|
</Win32>
|
||||||
|
</Options>
|
||||||
|
</Linking>
|
||||||
|
</CompilerOptions>
|
||||||
|
<Debugging>
|
||||||
|
<Exceptions Count="3">
|
||||||
|
<Item1>
|
||||||
|
<Name Value="EAbort"/>
|
||||||
|
</Item1>
|
||||||
|
<Item2>
|
||||||
|
<Name Value="ECodetoolError"/>
|
||||||
|
</Item2>
|
||||||
|
<Item3>
|
||||||
|
<Name Value="EFOpenError"/>
|
||||||
|
</Item3>
|
||||||
|
</Exceptions>
|
||||||
|
</Debugging>
|
||||||
|
</CONFIG>
|
@ -0,0 +1,23 @@
|
|||||||
|
program contributors;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
{$IFDEF UNIX}{$IFDEF UseCThreads}
|
||||||
|
cthreads,
|
||||||
|
{$ENDIF}{$ENDIF}
|
||||||
|
Interfaces, // this includes the LCL widgetset
|
||||||
|
Forms, uanimationbasic,
|
||||||
|
uanimationcontributors,
|
||||||
|
ufrmcontributors, uanimationtypes;
|
||||||
|
|
||||||
|
{$R *.res}
|
||||||
|
|
||||||
|
begin
|
||||||
|
Application.Title:='Lazarus Contributors Animation';
|
||||||
|
RequireDerivedFormResource := True;
|
||||||
|
Application.Initialize;
|
||||||
|
Application.CreateForm(TfrmContributors, frmContributors);
|
||||||
|
Application.Run;
|
||||||
|
end.
|
||||||
|
|
@ -0,0 +1,393 @@
|
|||||||
|
unit uanimationcontributors;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, Graphics, Controls, uanimationbasic,LCLIntf;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TAnimationTranslateLinear }
|
||||||
|
|
||||||
|
TAnimationTranslateLinear=class(TAnimationItem)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
public
|
||||||
|
FStartPoint: TPoint;
|
||||||
|
FEndPoint: TPoint;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TTextLineAnimation }
|
||||||
|
|
||||||
|
TTextLineAnimation=class(TAnimationTranslateLinear)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
FText: string;
|
||||||
|
FLXTime: int64;
|
||||||
|
FTextWidth: integer;
|
||||||
|
FHighLight: Boolean;
|
||||||
|
procedure DoPerform; override;
|
||||||
|
public
|
||||||
|
property Text: string read FText write FText;
|
||||||
|
constructor Create(const aOrigin: TPoint; const aTarget: TPoint; const aDuration: int64); reintroduce;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TBackgroundAnimation }
|
||||||
|
|
||||||
|
TBackgroundAnimation=class(TAnimationItem)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
FBackground: TBitmap;
|
||||||
|
procedure DoPerform; override;
|
||||||
|
public
|
||||||
|
constructor Create(const aBitmap: TBitMap);
|
||||||
|
procedure LoadBackgroundFromFile;
|
||||||
|
procedure LoadFromBitmap(const aBitmap: TBitmap);
|
||||||
|
destructor Destroy; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAboutTextZoomAnimation }
|
||||||
|
|
||||||
|
TAboutTextZoomAnimation=class(TAnimationItem)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
FText: string;
|
||||||
|
FFinalXY: TPoint;
|
||||||
|
FHidden: Boolean;
|
||||||
|
procedure DoPerform; override;
|
||||||
|
procedure DoFinalizeAnimation; override;
|
||||||
|
public
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAboutAnimation }
|
||||||
|
|
||||||
|
TAboutAnimation=class (TAnimationQueue)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
FX: integer;
|
||||||
|
FTarget: TBitmap;
|
||||||
|
FPaintBuffer: TBitmap;
|
||||||
|
FRefreshObject: TControl;
|
||||||
|
FTextLines: TStringList;
|
||||||
|
FViewPort: TRect;
|
||||||
|
FAboutZoomEffect: TAboutTextZoomAnimation;
|
||||||
|
FFullAnimationTime: int64;
|
||||||
|
FMousePoint: TPoint;
|
||||||
|
FCalculatedFontSize: integer;
|
||||||
|
//Object to check upper and lower boundary animations
|
||||||
|
FFirstLine: TTextLineAnimation;
|
||||||
|
procedure PrepareLinesObjects;
|
||||||
|
public
|
||||||
|
property PaintBuffer: TBitmap read FPaintBuffer;
|
||||||
|
property RefreshObject: TControl read FRefreshObject write FRefreshObject;
|
||||||
|
property MousePosition: TPoint read FMousePoint write FMousePoint;
|
||||||
|
|
||||||
|
constructor Create(const aTargetImage: TBitmap);
|
||||||
|
destructor Destroy; override;
|
||||||
|
procedure Animate; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
const
|
||||||
|
EACHLINE_HEIGHT=20;
|
||||||
|
EACHLINE_TIME=600; //Milliseconds
|
||||||
|
INITIAL_TEXT_FONT_SIZE=13;
|
||||||
|
TEXT_ZOOM_SIZE=80;
|
||||||
|
COLOR_TEXT=clBlack;
|
||||||
|
COLOR_TEXT_HIGHLIGHT=$FF0000;
|
||||||
|
COLOR_OUTLINE=$E0E0E0;
|
||||||
|
COLOR_ZOOM_TEXT=$C0C0C0;
|
||||||
|
OUTLINE_OFFSET=1;
|
||||||
|
|
||||||
|
{ TAboutTextZoomAnimation }
|
||||||
|
|
||||||
|
procedure TAboutTextZoomAnimation.DoPerform;
|
||||||
|
var
|
||||||
|
Factor: Single;
|
||||||
|
Distance: integer;
|
||||||
|
TheBMP: TBitmap;
|
||||||
|
PreserveSize: integer;
|
||||||
|
begin
|
||||||
|
inherited DoPerform;
|
||||||
|
If FHidden then exit;
|
||||||
|
if FText='' then Exit;
|
||||||
|
Factor:=GetElapsedMilliseconds / Duration;
|
||||||
|
Distance:=TEXT_ZOOM_SIZE-TAboutAnimation(FQueue).FCalculatedFontSize;
|
||||||
|
Distance:=Distance-Trunc(Distance*Factor);
|
||||||
|
TheBmp:=TAboutAnimation(FQueue).PaintBuffer;
|
||||||
|
PreserveSize:=TheBMP.Canvas.Font.Size;
|
||||||
|
TheBMP.Canvas.Font.Size:=Distance+TAboutAnimation(FQueue).FCalculatedFontSize;
|
||||||
|
TheBMP.Canvas.Font.Color:=COLOR_ZOOM_TEXT;
|
||||||
|
TheBMP.Canvas.TextOut(TheBmp.Canvas.Width div 2 - TheBMP.Canvas.TextWidth(FText) div 2,FFinalXY.y-distance*2,FText);
|
||||||
|
TheBMP.Canvas.Font.Size:=PreserveSize;
|
||||||
|
thebmp.Canvas.Font.Color:=clBlack;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAboutTextZoomAnimation.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
inherited DoFinalizeAnimation;
|
||||||
|
FHidden:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TBackgroundAnimation }
|
||||||
|
|
||||||
|
procedure TBackgroundAnimation.LoadBackgroundFromFile;
|
||||||
|
var
|
||||||
|
BackgroundLoad: TPicture;
|
||||||
|
begin
|
||||||
|
TAboutAnimation(FQueue).FTarget.Canvas.Clear;
|
||||||
|
BackgroundLoad:=TPicture.Create;
|
||||||
|
try
|
||||||
|
BackgroundLoad.LoadFromFile('..\images\back_400.jpg');
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
FBackground:=TBitmap.Create;
|
||||||
|
FBackground.Assign(TAboutAnimation(FQueue).FTarget);
|
||||||
|
//R.Left:=0;
|
||||||
|
//R.Top:=0;
|
||||||
|
//R.Right:=FBackground.Width;
|
||||||
|
//R.Bottom:=FBackground.Height;
|
||||||
|
//FBackground.Canvas.AntialiasingMode:=amOn;
|
||||||
|
// Use StretchDraw if target does not matches source dimensions
|
||||||
|
// FBackground.Canvas.StretchDraw(R,BackgroundLoad.Bitmap);
|
||||||
|
FBackground.Canvas.Draw(0,0,BackgroundLoad.Bitmap);
|
||||||
|
BackgroundLoad.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TBackgroundAnimation.LoadFromBitmap(const aBitmap: TBitmap);
|
||||||
|
begin
|
||||||
|
FBackground:=TBitmap.Create;
|
||||||
|
FBackground.SetSize(aBitmap.Width,aBitmap.Height);
|
||||||
|
FBackground.Canvas.Draw(0,0,aBitmap);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TBackgroundAnimation.DoPerform;
|
||||||
|
var
|
||||||
|
TheBMP: TBitmap;
|
||||||
|
begin
|
||||||
|
if not Assigned(FBackground) then begin
|
||||||
|
LoadBackgroundFromFile;
|
||||||
|
end;
|
||||||
|
TheBmp:=TAboutAnimation(FQueue).PaintBuffer;
|
||||||
|
TheBMP.Canvas.Draw(0,0,FBackground);
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TBackgroundAnimation.Create(const aBitmap: TBitMap);
|
||||||
|
begin
|
||||||
|
LoadFromBitmap(aBitmap);
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TBackgroundAnimation.Destroy;
|
||||||
|
begin
|
||||||
|
FreeAndNil(FBackground);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAboutAnimation }
|
||||||
|
|
||||||
|
procedure TAboutAnimation.PrepareLinesObjects;
|
||||||
|
var
|
||||||
|
j: integer;
|
||||||
|
EachLine: TTextLineAnimation;
|
||||||
|
StartOffSet: integer;
|
||||||
|
StartPoint,EndPoint: TPoint;
|
||||||
|
EachLineDuration: int64;
|
||||||
|
BlankZone: int64;
|
||||||
|
begin
|
||||||
|
StartOffSet:=FTarget.Height;
|
||||||
|
BlankZone:=int64(StartOffSet div EACHLINE_HEIGHT)*EACHLINE_TIME;
|
||||||
|
EachLineDuration:=FTextLines.Count*int64(EACHLINE_TIME)+BlankZone;
|
||||||
|
for j := 0 to FTextLines.Count-1 do begin
|
||||||
|
StartPoint.x:=0;
|
||||||
|
StartPoint.y:=j*EACHLINE_HEIGHT+StartOffSet;
|
||||||
|
EndPoint.x:=0;
|
||||||
|
EndPoint.y:=StartPoint.y+(FTextLines.Count*EACHLINE_HEIGHT)+StartOffSet;
|
||||||
|
EachLine:=TTextLineAnimation.Create(StartPoint,EndPoint,EachLineDuration);
|
||||||
|
EachLine.FreeWithQueue:=true;
|
||||||
|
if Length(FTextLines[j])>0 then begin
|
||||||
|
if FTextLines[j][1]='#' then begin
|
||||||
|
EachLine.FHighLight:=true;
|
||||||
|
FTextLines[j]:=copy(FTextLines[j],2,Length(FTextLines[j])-1);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
EachLine.Text:=FTextLines[j];
|
||||||
|
EachLine.FTextWidth:=FPaintBuffer.Canvas.TextWidth(FTextLines[j]);
|
||||||
|
Self.Add(EachLine);
|
||||||
|
if j=0 then begin
|
||||||
|
FFirstLine:=EachLine;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
FFullAnimationTime:=EachLineDuration;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TAboutAnimation.Create(const aTargetImage: TBitmap);
|
||||||
|
var
|
||||||
|
AnimBackground: TBackgroundAnimation;
|
||||||
|
AnimTextZoom: TAboutTextZoomAnimation;
|
||||||
|
TextWidth: integer;
|
||||||
|
begin
|
||||||
|
FTarget:=aTargetImage;
|
||||||
|
FPaintBuffer:=TBitmap.Create;
|
||||||
|
with FPaintBuffer do begin
|
||||||
|
Assign(FTarget);
|
||||||
|
Canvas.Brush.Color:=clWhite;
|
||||||
|
Canvas.Brush.Style:=bsSolid;
|
||||||
|
Canvas.Pen.Color:=clBlack;
|
||||||
|
Canvas.FillRect(0,0,Width,Height);
|
||||||
|
end;
|
||||||
|
inherited Create;
|
||||||
|
|
||||||
|
FTextLines:=TStringList.Create;
|
||||||
|
try
|
||||||
|
FTextLines.LoadFromFile('Contributors.txt');
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
|
||||||
|
if FTextLines.Count=0 then FTextLines.Add('Missing contributors.txt file.');
|
||||||
|
|
||||||
|
FPaintBuffer.Canvas.Font.Size:=INITIAL_TEXT_FONT_SIZE+1;
|
||||||
|
repeat
|
||||||
|
FPaintBuffer.Canvas.Font.Size:=FPaintBuffer.Canvas.Font.Size-1;
|
||||||
|
TextWidth:=FPaintBuffer.Canvas.TextWidth(FTextLines[0]);
|
||||||
|
until TextWidth<FPaintBuffer.Canvas.Width;
|
||||||
|
FCalculatedFontSize:=FPaintBuffer.Canvas.Font.Size;
|
||||||
|
|
||||||
|
AnimBackground:=TBackgroundAnimation.Create(aTargetImage);
|
||||||
|
aTargetImage.Canvas.Clear;
|
||||||
|
AnimBackground.FreeWithQueue:=true;
|
||||||
|
Self.Add(AnimBackground);
|
||||||
|
|
||||||
|
AnimTextZoom:=TAboutTextZoomAnimation.Create;
|
||||||
|
AnimTextZoom.Duration:=EACHLINE_TIME;
|
||||||
|
AnimTextZoom.Repeats:=1;
|
||||||
|
AnimTextZoom.FreeWithQueue:=true;
|
||||||
|
AnimTextZoom.FText:='This is a zooming text cache';
|
||||||
|
Self.Add(AnimTextZoom);
|
||||||
|
Self.FAboutZoomEffect:=AnimTextZoom;
|
||||||
|
|
||||||
|
PrepareLinesObjects;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TAboutAnimation.Destroy;
|
||||||
|
begin
|
||||||
|
FTextLines.Free;
|
||||||
|
FreeAndNil(FPaintBuffer);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAboutAnimation.Animate;
|
||||||
|
var
|
||||||
|
R1: TRect;
|
||||||
|
begin
|
||||||
|
if FState<>eAnimationQueueStarted then exit;
|
||||||
|
if Reversed then begin
|
||||||
|
if FFirstLine.GetElapsedMilliseconds<0 then begin
|
||||||
|
Reverse;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
if FFirstLine.GetElapsedMilliseconds>FFullAnimationTime then begin
|
||||||
|
Start;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
R1.Top:=0;R1.Left:=0;
|
||||||
|
FTarget.GetSize(R1.Right,R1.Bottom);
|
||||||
|
FViewPort:=R1;
|
||||||
|
// Is "Draw" faster than CopyRect ?
|
||||||
|
// FTarget.Canvas.CopyRect(R1,FPaintBuffer.Canvas,R1);
|
||||||
|
FTarget.Canvas.Draw(0,0,FPaintBuffer);
|
||||||
|
if Assigned(FRefreshObject) then begin
|
||||||
|
FRefreshObject.Refresh;
|
||||||
|
end;
|
||||||
|
inherited Animate;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TTextLineAnimation }
|
||||||
|
|
||||||
|
constructor TTextLineAnimation.Create(const aOrigin: TPoint;
|
||||||
|
const aTarget: TPoint; const aDuration: int64);
|
||||||
|
begin
|
||||||
|
Duration:=aDuration;
|
||||||
|
FStartPoint:=aOrigin;
|
||||||
|
FEndPoint:=aTarget;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TTextLineAnimation.DoPerform;
|
||||||
|
var
|
||||||
|
TheBMP: TBitmap;
|
||||||
|
Factor: single;
|
||||||
|
Distance: integer;
|
||||||
|
NP: integer;
|
||||||
|
LX: integer;
|
||||||
|
LT: integer;
|
||||||
|
bInBottonLine: Boolean;
|
||||||
|
bIsMouseOver: Boolean=false;
|
||||||
|
TextRect: TRect;
|
||||||
|
begin
|
||||||
|
Factor:=GetElapsedMilliseconds / Duration;
|
||||||
|
if Factor>1.0 then exit;
|
||||||
|
Distance:=FEndPoint.y-FStartPoint.y;
|
||||||
|
NP:=Trunc(Distance * Factor);
|
||||||
|
NP:=FStartPoint.y-NP;
|
||||||
|
if NP<TAboutAnimation(FQueue).FViewPort.Top-EACHLINE_HEIGHT then exit;
|
||||||
|
if NP>TAboutAnimation(FQueue).FViewPort.Bottom then exit;
|
||||||
|
LT:=(TAboutAnimation(FQueue).FViewPort.Right div 2) - (FTextWidth div 2);
|
||||||
|
if (NP>TAboutAnimation(FQueue).FViewPort.Bottom-EACHLINE_HEIGHT) and (NP<=TAboutAnimation(FQueue).FViewPort.Bottom) then begin
|
||||||
|
bInBottonLine:=true;
|
||||||
|
if TAboutAnimation(FQueue).FAboutZoomEffect.FText<>FText then begin
|
||||||
|
TAboutAnimation(FQueue).FAboutZoomEffect.FText:=FText;
|
||||||
|
TAboutAnimation(FQueue).FAboutZoomEffect.FFinalXY.x:=LT;
|
||||||
|
TAboutAnimation(FQueue).FAboutZoomEffect.FFinalXY.Y:=TAboutAnimation(FQueue).FViewPort.Bottom-EACHLINE_HEIGHT;
|
||||||
|
TAboutAnimation(FQueue).FAboutZoomEffect.Start;
|
||||||
|
end;
|
||||||
|
if FLXTime=0 then FLXTime:=GetElapsedMilliseconds;
|
||||||
|
LX:=TAboutAnimation(FQueue).FViewPort.Right;
|
||||||
|
Distance:=LX-LT+10; // 10 stop pixels...
|
||||||
|
Factor:=(GetElapsedMilliseconds - FLXTime) / EACHLINE_TIME;
|
||||||
|
Factor:=Sin(Factor*pi/2);
|
||||||
|
Distance:=Trunc(Distance * Factor);
|
||||||
|
if Distance>(LX-LT) then Distance:=LX-LT;
|
||||||
|
LX:=LX-Distance;
|
||||||
|
NP:=TAboutAnimation(FQueue).FViewPort.Bottom-EACHLINE_HEIGHT;
|
||||||
|
end else begin
|
||||||
|
bInBottonLine:=false;
|
||||||
|
LX:=LT;
|
||||||
|
end;
|
||||||
|
TextRect:=rect(LX,NP,FTextWidth+LX,NP+EACHLINE_HEIGHT);
|
||||||
|
TheBmp:=TAboutAnimation(FQueue).PaintBuffer;
|
||||||
|
|
||||||
|
TheBMP.Canvas.Brush.Style:=bsClear;
|
||||||
|
if not bInBottonLine then begin
|
||||||
|
TheBMP.Canvas.Font.Color:=COLOR_OUTLINE; //Very light gray
|
||||||
|
TheBMP.Canvas.AntialiasingMode:=amOff;
|
||||||
|
if OUTLINE_OFFSET>0 then begin
|
||||||
|
TheBMP.Canvas.TextOut(LX+OUTLINE_OFFSET,NP+OUTLINE_OFFSET,FText);
|
||||||
|
TheBMP.Canvas.TextOut(LX-OUTLINE_OFFSET,NP+OUTLINE_OFFSET,FText);
|
||||||
|
TheBMP.Canvas.TextOut(LX+OUTLINE_OFFSET,NP-OUTLINE_OFFSET,FText);
|
||||||
|
TheBMP.Canvas.TextOut(LX-OUTLINE_OFFSET,NP-OUTLINE_OFFSET,FText);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if PtInRect(TextRect,(TAboutAnimation(FQueue).MousePosition)) then begin
|
||||||
|
bIsMouseOver:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if FHighLight or bIsMouseOver then begin
|
||||||
|
TheBMP.Canvas.Font.Color:=COLOR_TEXT_HIGHLIGHT;
|
||||||
|
TheBMP.Canvas.Font.Style:=[fsUnderline];
|
||||||
|
end else begin
|
||||||
|
TheBMP.Canvas.Font.Color:=COLOR_TEXT;
|
||||||
|
end;
|
||||||
|
// TheBMP.Canvas.AntialiasingMode:=amOn;
|
||||||
|
if not bInBottonLine then begin
|
||||||
|
TheBMP.Canvas.TextOut(LX,NP,FText);
|
||||||
|
end;
|
||||||
|
if FHighLight or bInBottonLine or bIsMouseOver then begin
|
||||||
|
TheBMP.Canvas.Font.Style:=[];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
2532
components/Comba_Animation/samples/contributors/ufrmcontributors.lfm
Normal file
2532
components/Comba_Animation/samples/contributors/ufrmcontributors.lfm
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,67 @@
|
|||||||
|
unit ufrmcontributors;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls
|
||||||
|
, uanimationbasic, uanimationcontributors;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TfrmContributors }
|
||||||
|
|
||||||
|
TfrmContributors = class(TForm)
|
||||||
|
imgLazarus: TImage;
|
||||||
|
tmrAnimationCadence: TTimer;
|
||||||
|
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
|
||||||
|
procedure FormCreate(Sender: TObject);
|
||||||
|
procedure FormDestroy(Sender: TObject);
|
||||||
|
procedure tmrAnimationCadenceTimer(Sender: TObject);
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
AnimationQueue: TAboutAnimation;
|
||||||
|
public
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmContributors: TfrmContributors;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.lfm}
|
||||||
|
|
||||||
|
{ TfrmContributors }
|
||||||
|
|
||||||
|
procedure TfrmContributors.FormCreate(Sender: TObject);
|
||||||
|
begin
|
||||||
|
imgLazarus.Canvas.Clear;
|
||||||
|
AnimationQueue:=TAboutAnimation.Create(imgLazarus.Picture.Bitmap);
|
||||||
|
|
||||||
|
AnimationQueue.Start(true);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmContributors.FormClose(Sender: TObject;
|
||||||
|
var CloseAction: TCloseAction);
|
||||||
|
begin
|
||||||
|
AnimationQueue.Pause;
|
||||||
|
CloseAction:=caFree;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmContributors.FormDestroy(Sender: TObject);
|
||||||
|
begin
|
||||||
|
FreeAndNil(AnimationQueue);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmContributors.tmrAnimationCadenceTimer(Sender: TObject);
|
||||||
|
begin
|
||||||
|
AnimationQueue.MousePosition:=imgLazarus.ScreenToClient(Mouse.CursorPos);
|
||||||
|
AnimationQueue.Animate;
|
||||||
|
// Self.Repaint;
|
||||||
|
// Self.Caption:=format('FPS: %.2f',[AnimationQueue.AverageFPS]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
@ -0,0 +1,135 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<CONFIG>
|
||||||
|
<ProjectOptions>
|
||||||
|
<Version Value="10"/>
|
||||||
|
<PathDelim Value="\"/>
|
||||||
|
<General>
|
||||||
|
<SessionStorage Value="InProjectDir"/>
|
||||||
|
<MainUnit Value="0"/>
|
||||||
|
<Title Value="Animated Controls Sample"/>
|
||||||
|
<ResourceType Value="res"/>
|
||||||
|
<UseXPManifest Value="True"/>
|
||||||
|
<XPManifest>
|
||||||
|
<TextName Value="CompanyName.ProductName.AppName"/>
|
||||||
|
<TextDesc Value="Your application description."/>
|
||||||
|
</XPManifest>
|
||||||
|
</General>
|
||||||
|
<i18n>
|
||||||
|
<EnableI18N LFM="False"/>
|
||||||
|
</i18n>
|
||||||
|
<BuildModes Count="2">
|
||||||
|
<Item1 Name="Debug" Default="True"/>
|
||||||
|
<Item2 Name="Release">
|
||||||
|
<CompilerOptions>
|
||||||
|
<Version Value="11"/>
|
||||||
|
<PathDelim Value="\"/>
|
||||||
|
<Target>
|
||||||
|
<Filename Value="..\..\output\controlsample"/>
|
||||||
|
</Target>
|
||||||
|
<SearchPaths>
|
||||||
|
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||||
|
<OtherUnitFiles Value="..\..\src"/>
|
||||||
|
<UnitOutputDirectory Value="..\..\lib\$NameOnly($(ProjFile))\lib\$(TargetCPU)-$(TargetOS)"/>
|
||||||
|
</SearchPaths>
|
||||||
|
<CodeGeneration>
|
||||||
|
<Optimizations>
|
||||||
|
<OptimizationLevel Value="3"/>
|
||||||
|
</Optimizations>
|
||||||
|
</CodeGeneration>
|
||||||
|
<Linking>
|
||||||
|
<Debugging>
|
||||||
|
<GenerateDebugInfo Value="False"/>
|
||||||
|
</Debugging>
|
||||||
|
<Options>
|
||||||
|
<Win32>
|
||||||
|
<GraphicApplication Value="True"/>
|
||||||
|
</Win32>
|
||||||
|
</Options>
|
||||||
|
</Linking>
|
||||||
|
</CompilerOptions>
|
||||||
|
</Item2>
|
||||||
|
</BuildModes>
|
||||||
|
<PublishOptions>
|
||||||
|
<Version Value="2"/>
|
||||||
|
</PublishOptions>
|
||||||
|
<RunParams>
|
||||||
|
<local>
|
||||||
|
<FormatVersion Value="1"/>
|
||||||
|
</local>
|
||||||
|
</RunParams>
|
||||||
|
<RequiredPackages Count="1">
|
||||||
|
<Item1>
|
||||||
|
<PackageName Value="LCL"/>
|
||||||
|
</Item1>
|
||||||
|
</RequiredPackages>
|
||||||
|
<Units Count="5">
|
||||||
|
<Unit0>
|
||||||
|
<Filename Value="controlsample.lpr"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
</Unit0>
|
||||||
|
<Unit1>
|
||||||
|
<Filename Value="frmcontrolsample.pas"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
<ComponentName Value="frmAnimationControls"/>
|
||||||
|
<HasResources Value="True"/>
|
||||||
|
<ResourceBaseClass Value="Form"/>
|
||||||
|
</Unit1>
|
||||||
|
<Unit2>
|
||||||
|
<Filename Value="..\..\src\uanimationcontrol.pas"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
</Unit2>
|
||||||
|
<Unit3>
|
||||||
|
<Filename Value="..\..\src\uanimationtypes.pas"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
</Unit3>
|
||||||
|
<Unit4>
|
||||||
|
<Filename Value="..\..\src\uanimationbasic.pas"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
</Unit4>
|
||||||
|
</Units>
|
||||||
|
</ProjectOptions>
|
||||||
|
<CompilerOptions>
|
||||||
|
<Version Value="11"/>
|
||||||
|
<PathDelim Value="\"/>
|
||||||
|
<Target>
|
||||||
|
<Filename Value="..\..\output\controlsample"/>
|
||||||
|
</Target>
|
||||||
|
<SearchPaths>
|
||||||
|
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||||
|
<OtherUnitFiles Value="..\..\src"/>
|
||||||
|
<UnitOutputDirectory Value="..\..\lib\$NameOnly($(ProjFile))\lib\$(TargetCPU)-$(TargetOS)"/>
|
||||||
|
</SearchPaths>
|
||||||
|
<Parsing>
|
||||||
|
<SyntaxOptions>
|
||||||
|
<IncludeAssertionCode Value="True"/>
|
||||||
|
</SyntaxOptions>
|
||||||
|
</Parsing>
|
||||||
|
<CodeGeneration>
|
||||||
|
<Checks>
|
||||||
|
<IOChecks Value="True"/>
|
||||||
|
<RangeChecks Value="True"/>
|
||||||
|
<OverflowChecks Value="True"/>
|
||||||
|
<StackChecks Value="True"/>
|
||||||
|
</Checks>
|
||||||
|
<VerifyObjMethodCallValidity Value="True"/>
|
||||||
|
</CodeGeneration>
|
||||||
|
<Linking>
|
||||||
|
<Debugging>
|
||||||
|
<UseHeaptrc Value="True"/>
|
||||||
|
</Debugging>
|
||||||
|
</Linking>
|
||||||
|
</CompilerOptions>
|
||||||
|
<Debugging>
|
||||||
|
<Exceptions Count="3">
|
||||||
|
<Item1>
|
||||||
|
<Name Value="EAbort"/>
|
||||||
|
</Item1>
|
||||||
|
<Item2>
|
||||||
|
<Name Value="ECodetoolError"/>
|
||||||
|
</Item2>
|
||||||
|
<Item3>
|
||||||
|
<Name Value="EFOpenError"/>
|
||||||
|
</Item3>
|
||||||
|
</Exceptions>
|
||||||
|
</Debugging>
|
||||||
|
</CONFIG>
|
@ -0,0 +1,23 @@
|
|||||||
|
program controlsample;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
{$IFDEF UNIX}{$IFDEF UseCThreads}
|
||||||
|
cthreads,
|
||||||
|
{$ENDIF}{$ENDIF}
|
||||||
|
Interfaces, // this includes the LCL widgetset
|
||||||
|
Forms, frmcontrolsample,
|
||||||
|
uanimationcontrol,
|
||||||
|
uanimationtypes;
|
||||||
|
|
||||||
|
{$R *.res}
|
||||||
|
|
||||||
|
begin
|
||||||
|
Application.Title:='Animated Controls Sample';
|
||||||
|
RequireDerivedFormResource := True;
|
||||||
|
Application.Initialize;
|
||||||
|
Application.CreateForm(TfrmAnimationControls, frmAnimationControls);
|
||||||
|
Application.Run;
|
||||||
|
end.
|
||||||
|
|
@ -0,0 +1,869 @@
|
|||||||
|
object frmAnimationControls: TfrmAnimationControls
|
||||||
|
Left = 497
|
||||||
|
Height = 544
|
||||||
|
Top = 268
|
||||||
|
Width = 514
|
||||||
|
Caption = 'LCL Controls animated'
|
||||||
|
ClientHeight = 544
|
||||||
|
ClientWidth = 514
|
||||||
|
OnCreate = FormCreate
|
||||||
|
OnDestroy = FormDestroy
|
||||||
|
OnResize = FormResize
|
||||||
|
Position = poDesktopCenter
|
||||||
|
LCLVersion = '1.7'
|
||||||
|
object butReverse: TButton
|
||||||
|
AnchorSideRight.Control = Owner
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
Left = 390
|
||||||
|
Height = 30
|
||||||
|
Top = 4
|
||||||
|
Width = 122
|
||||||
|
Anchors = [akTop, akLeft, akRight]
|
||||||
|
BorderSpacing.Right = 2
|
||||||
|
Caption = 'Reverse'
|
||||||
|
OnClick = butReverseClick
|
||||||
|
TabOrder = 2
|
||||||
|
end
|
||||||
|
object butPause: TButton
|
||||||
|
Left = 282
|
||||||
|
Height = 30
|
||||||
|
Top = 4
|
||||||
|
Width = 101
|
||||||
|
Caption = 'Pause'
|
||||||
|
OnClick = butPauseClick
|
||||||
|
TabOrder = 1
|
||||||
|
end
|
||||||
|
object shpSliding: TShape
|
||||||
|
Left = 8
|
||||||
|
Height = 30
|
||||||
|
Top = 4
|
||||||
|
Width = 258
|
||||||
|
end
|
||||||
|
object butSliding: TBitBtn
|
||||||
|
AnchorSideTop.Control = shpSliding
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
AnchorSideBottom.Control = shpSliding
|
||||||
|
AnchorSideBottom.Side = asrBottom
|
||||||
|
Left = 8
|
||||||
|
Height = 30
|
||||||
|
Top = 4
|
||||||
|
Width = 96
|
||||||
|
Anchors = [akTop, akLeft, akBottom]
|
||||||
|
Caption = 'Sliding'
|
||||||
|
OnClick = butSlidingClick
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object pnlCheckbox: TPanel
|
||||||
|
AnchorSideLeft.Control = Owner
|
||||||
|
Left = 2
|
||||||
|
Height = 31
|
||||||
|
Top = 48
|
||||||
|
Width = 117
|
||||||
|
AutoSize = True
|
||||||
|
BorderSpacing.Left = 2
|
||||||
|
BevelOuter = bvNone
|
||||||
|
ClientHeight = 31
|
||||||
|
ClientWidth = 117
|
||||||
|
TabOrder = 3
|
||||||
|
object CheckBox1: TCheckBox
|
||||||
|
Left = 6
|
||||||
|
Height = 19
|
||||||
|
Top = 6
|
||||||
|
Width = 105
|
||||||
|
BorderSpacing.Around = 6
|
||||||
|
Caption = 'Checkbox effect'
|
||||||
|
OnChange = CheckBox1Change
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object pnlText1: TPanel
|
||||||
|
AnchorSideLeft.Control = pnlCheckbox
|
||||||
|
AnchorSideLeft.Side = asrBottom
|
||||||
|
AnchorSideTop.Control = pnlCheckbox
|
||||||
|
AnchorSideRight.Control = Owner
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
Left = 123
|
||||||
|
Height = 56
|
||||||
|
Top = 48
|
||||||
|
Width = 389
|
||||||
|
Anchors = [akTop, akLeft, akRight]
|
||||||
|
BorderSpacing.Left = 4
|
||||||
|
BorderSpacing.Right = 2
|
||||||
|
ClientHeight = 56
|
||||||
|
ClientWidth = 389
|
||||||
|
TabOrder = 4
|
||||||
|
object Label1: TLabel
|
||||||
|
Left = 3
|
||||||
|
Height = 50
|
||||||
|
Top = 3
|
||||||
|
Width = 383
|
||||||
|
Align = alClient
|
||||||
|
AutoSize = False
|
||||||
|
BorderSpacing.Around = 2
|
||||||
|
Caption = 'The checkbox is into a panel (autosize) and with a BorderSpacing to allow the panel color change to be visible around.'
|
||||||
|
ParentColor = False
|
||||||
|
WordWrap = True
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object grpButtons: TGroupBox
|
||||||
|
AnchorSideLeft.Control = Owner
|
||||||
|
AnchorSideTop.Control = pnlText1
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
AnchorSideRight.Control = Owner
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
Left = 4
|
||||||
|
Height = 72
|
||||||
|
Top = 104
|
||||||
|
Width = 506
|
||||||
|
Anchors = [akTop, akLeft, akRight]
|
||||||
|
BorderSpacing.Left = 4
|
||||||
|
BorderSpacing.Right = 4
|
||||||
|
Caption = 'Some buttons effects'
|
||||||
|
ClientHeight = 52
|
||||||
|
ClientWidth = 502
|
||||||
|
TabOrder = 5
|
||||||
|
object butBounceCaption: TButton
|
||||||
|
Left = 8
|
||||||
|
Height = 30
|
||||||
|
Top = 8
|
||||||
|
Width = 120
|
||||||
|
Caption = 'Bounce caption'
|
||||||
|
OnClick = butBounceCaptionClick
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object butZoomTest: TButton
|
||||||
|
Left = 136
|
||||||
|
Height = 30
|
||||||
|
Top = 8
|
||||||
|
Width = 120
|
||||||
|
Caption = 'Click Zoom'
|
||||||
|
OnClick = butZoomTestClick
|
||||||
|
TabOrder = 1
|
||||||
|
end
|
||||||
|
object BitBtn1: TBitBtn
|
||||||
|
Left = 264
|
||||||
|
Height = 30
|
||||||
|
Top = 8
|
||||||
|
Width = 232
|
||||||
|
Caption = 'Button icon animation'
|
||||||
|
Enabled = False
|
||||||
|
Font.Style = [fsStrikeOut]
|
||||||
|
Glyph.Data = {
|
||||||
|
36090000424D3609000000000000360000002800000018000000180000000100
|
||||||
|
2000000000000009000064000000640000000000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
000000000000000000000000000000000003000000080000000D000000120000
|
||||||
|
00170000001B0000001E0000001D0000001A00000017000000120000000D0000
|
||||||
|
0007000000030000000000000000000000000000000000000000000000000000
|
||||||
|
0000000000017B441E52000000130000001B0000002200000029000000300000
|
||||||
|
00350000003A0000003D0F070342331E0C541E0F0743000000320000002C0000
|
||||||
|
00250000001E0000001500000008000000010000000000000000000000000000
|
||||||
|
000000000008874920F76338174D000000220000002B000000340000003C4223
|
||||||
|
106B77411CC3854920F5874A20FC894D25F7874A20FA86491FFA7B441DBE4B2A
|
||||||
|
1255000000260000001D000000140000000A0000000000000000000000000000
|
||||||
|
000000000003864A20FE8A4F27F25530143F130D062768381775864B24DD9A68
|
||||||
|
43F8AB7A57FDB68662FFBA8B66FFB5825BFFB07A50FFA86E42FF975B2FFD884A
|
||||||
|
20F7753F1D80000000160000000E000000060000000000000000000000000000
|
||||||
|
000000000000884920FEBD9578FE884B22EF874C21F1A37351F5C39D81FFBB8D
|
||||||
|
68FFB88862FFB78660FFB48058FFB37F57FFB27D54FFAE764BFFAA6F41FFA264
|
||||||
|
35FF894C21F38547216300000000000000000000000000000000000000000000
|
||||||
|
000000000000874B20FDCFAE95FFBC9374FFC7A286FFC39979FFB5825BFFBF94
|
||||||
|
72FFBB8E6CFFA5714BFB9A643AF290552CF48B4E24FF8B5026FF92572BFF9B5E
|
||||||
|
30FF9F6131FF884B21F280402008000000000000000000000000000000000000
|
||||||
|
000000000000874B1FFDCEAD93FFBF9472FFAF784DFFB98862FFC8A386FFA36E
|
||||||
|
46FC884B21F5874B208886492154894C2136995B2D3AA16232C6A16438FC9053
|
||||||
|
28FF8C4E23FE8B4E23FA89481F63000000000000000000000000000000000000
|
||||||
|
000000000000884B1FFCCDAB91FFA56837FFB78660FFC9A58AFF90562DF6884C
|
||||||
|
21B98446231D00000000000000000000000000000000A467372AA66837ECC48E
|
||||||
|
65BFA1673CEC864A20FF8A4C22C7000000000000000000000000000000000000
|
||||||
|
000000000000884A20FCCCAB90FFA86D3FFFA86C3EFFC8A387FFA16D4BF6874B
|
||||||
|
218C0000000000000000000000000000000000000000A464371CA86B3AB3CE9B
|
||||||
|
7463CC977178965A30DF8B4D22E9000000000000000000000000000000000000
|
||||||
|
000000000000874A21FBC9A489FFCBA98FFFCBA98FFFCBA98FFFC7A285FF9159
|
||||||
|
31F888481E5C0000000000000000000000000000000099663305AA66330FDB92
|
||||||
|
6D07D59F8018A56C4452884A21EC000000000000000000000000000000000000
|
||||||
|
000000000000884B21EB874B20F7874B20F7874B20F7874B20F7874B20F7874B
|
||||||
|
20F7874A21EA884C212F92492407805020108050201080502010805020108050
|
||||||
|
201080502010805020107F4A1F17FF0000010000000000000000000000000000
|
||||||
|
0000000000008040400480800002000000000000000000000000000000000000
|
||||||
|
0000000000000000000085471F19874B1FE5874A20FE894D24F8884C22F8884C
|
||||||
|
22F8884B21F8884B21F8874A20FE805020100000000000000000000000000000
|
||||||
|
000000000000884C20E3A3694075D29F7928D9997314AA633912BF8040040000
|
||||||
|
0000000000000000000000000000884A222D874B21F4B58764FFC59D7EFFC7A1
|
||||||
|
83FFCBA78BFFCEAC91FF884B21F88E471C120000000000000000000000000000
|
||||||
|
000000000000894C21ED96592FE4CA966C86CB977171A96A3AC0A86633230000
|
||||||
|
00000000000000000000000000000000000087491F428B4E26F8BA8F6DFFB07A
|
||||||
|
4FFFA46534FFCBA78BFF874C21F78C4D26140000000000000000000000000000
|
||||||
|
000000000000894B21E6874A20FFAF7449EDC38D62CDA7693AE6A26736340000
|
||||||
|
0000000000000000000000000000854A2030894C21C990552BF4B58764FFBB8C
|
||||||
|
67FFA46534FFC8A184FF8A4F25F68B4623160000000000000000000000000000
|
||||||
|
000000000000884B229F8C4E24FE894C22FEA26538FEAB6F40F7A46736A90000
|
||||||
|
0000874B1E11894C2136894C21A8894C21F5A36B43FEBA8A64FFAF784DFFAE77
|
||||||
|
4BFFBE916EFFC69E80FF8C5127F58A4A20180000000000000000000000000000
|
||||||
|
000000000000864A2037894D23F39C5D2EFF8C4F23FD894C21FF8C4E24FF884B
|
||||||
|
20FE884A1FFA8D5228F09D643AFAB07B51FFB17B51FFAD7448FFB78660FFB484
|
||||||
|
5FFFA6714BFEC49B7BFF8C5028F4894E1D1A0000000000000000000000000000
|
||||||
|
00000000000000000000884B229F8D4F24F4A36433FFA16231FF9E6030FFA467
|
||||||
|
38FFA86D3FFFAC7246FFAE764BFFAF784EFFB17C53FFB07D54FF995E35F6874B
|
||||||
|
21F1884B21D7A16B44F88D532BF38949241C0000000000000000000000000000
|
||||||
|
00000000000000000000FF000001884B229D884C21F595562AFB9E6030FFA263
|
||||||
|
33FFA66939FFA66B3DFFA3683CFF9C6135FC8E5429F0884A21F4894B217D8040
|
||||||
|
2B0C8049240E884B21D9874A20FF884D221E0000000000000000000000000000
|
||||||
|
000000000000000000000000000000000000864A2226884B229C894C21DE884A
|
||||||
|
20F7884B20FC884B21F0884C21DA884B209885481E4399333305000000000000
|
||||||
|
000000000000854E2117874B1FDD844A211F0000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
0000AA5500030000000000000000000000000000000000000000000000000000
|
||||||
|
00000000000000000000874820208E471C120000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
0000000000000000000000000000000000000000000000000000
|
||||||
|
}
|
||||||
|
OnClick = BitBtn1Click
|
||||||
|
ParentFont = False
|
||||||
|
TabOrder = 2
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object pnlDropDown: TPanel
|
||||||
|
AnchorSideLeft.Control = Owner
|
||||||
|
AnchorSideTop.Control = grpButtons
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
AnchorSideRight.Control = Owner
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
Left = 2
|
||||||
|
Height = 142
|
||||||
|
Top = 178
|
||||||
|
Width = 510
|
||||||
|
Anchors = [akTop, akLeft, akRight]
|
||||||
|
BorderSpacing.Left = 2
|
||||||
|
BorderSpacing.Top = 2
|
||||||
|
BorderSpacing.Right = 2
|
||||||
|
ClientHeight = 142
|
||||||
|
ClientWidth = 510
|
||||||
|
TabOrder = 6
|
||||||
|
object pnlDropDownHeader: TPanel
|
||||||
|
Left = 1
|
||||||
|
Height = 24
|
||||||
|
Top = 1
|
||||||
|
Width = 508
|
||||||
|
Align = alTop
|
||||||
|
ClientHeight = 24
|
||||||
|
ClientWidth = 508
|
||||||
|
TabOrder = 0
|
||||||
|
object lblDropDownMessage: TLabel
|
||||||
|
Left = 1
|
||||||
|
Height = 22
|
||||||
|
Top = 1
|
||||||
|
Width = 477
|
||||||
|
Align = alClient
|
||||||
|
Caption = 'Press the button to collapse the panel below.'
|
||||||
|
Color = 39423
|
||||||
|
Layout = tlCenter
|
||||||
|
ParentColor = False
|
||||||
|
Transparent = False
|
||||||
|
end
|
||||||
|
object butDropDown: TButton
|
||||||
|
Left = 478
|
||||||
|
Height = 22
|
||||||
|
Top = 1
|
||||||
|
Width = 29
|
||||||
|
Align = alRight
|
||||||
|
Caption = '^'
|
||||||
|
OnClick = butDropDownClick
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object pnlDropDownContents: TPanel
|
||||||
|
Left = 1
|
||||||
|
Height = 116
|
||||||
|
Top = 25
|
||||||
|
Width = 508
|
||||||
|
Align = alClient
|
||||||
|
ClientHeight = 116
|
||||||
|
ClientWidth = 508
|
||||||
|
TabOrder = 1
|
||||||
|
object Label3: TLabel
|
||||||
|
AnchorSideLeft.Control = pnlDropDownContents
|
||||||
|
AnchorSideTop.Control = pnlDropDownContents
|
||||||
|
Left = 5
|
||||||
|
Height = 15
|
||||||
|
Top = 5
|
||||||
|
Width = 124
|
||||||
|
BorderSpacing.Left = 4
|
||||||
|
BorderSpacing.Top = 4
|
||||||
|
Caption = 'Some sample content...'
|
||||||
|
ParentColor = False
|
||||||
|
end
|
||||||
|
object lbSampleEntries: TListBox
|
||||||
|
AnchorSideLeft.Control = Label3
|
||||||
|
AnchorSideLeft.Side = asrBottom
|
||||||
|
AnchorSideTop.Control = pnlDropDownContents
|
||||||
|
AnchorSideRight.Control = pnlDropDownContents
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
AnchorSideBottom.Control = pnlDropDownContents
|
||||||
|
AnchorSideBottom.Side = asrBottom
|
||||||
|
Left = 133
|
||||||
|
Height = 106
|
||||||
|
Top = 5
|
||||||
|
Width = 370
|
||||||
|
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||||
|
BorderSpacing.Left = 4
|
||||||
|
BorderSpacing.Top = 4
|
||||||
|
BorderSpacing.Right = 4
|
||||||
|
BorderSpacing.Bottom = 4
|
||||||
|
Items.Strings = (
|
||||||
|
'Sample entry 1'
|
||||||
|
'Sample entry 2'
|
||||||
|
'Sample entry 3'
|
||||||
|
'Sample entry 4'
|
||||||
|
'Sample entry 5'
|
||||||
|
'And a final, and a bit larger than previous, entry'
|
||||||
|
)
|
||||||
|
ItemHeight = 15
|
||||||
|
ParentFont = False
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object pnlAttached: TPanel
|
||||||
|
AnchorSideLeft.Control = pnlDropDown
|
||||||
|
AnchorSideTop.Control = pnlDropDown
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
AnchorSideRight.Control = pnlDropDown
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
Left = 2
|
||||||
|
Height = 25
|
||||||
|
Top = 320
|
||||||
|
Width = 510
|
||||||
|
Anchors = [akTop, akLeft, akRight]
|
||||||
|
ClientHeight = 25
|
||||||
|
ClientWidth = 510
|
||||||
|
TabOrder = 7
|
||||||
|
object Label4: TLabel
|
||||||
|
Left = 1
|
||||||
|
Height = 23
|
||||||
|
Top = 1
|
||||||
|
Width = 508
|
||||||
|
Align = alClient
|
||||||
|
Alignment = taCenter
|
||||||
|
Caption = 'This is an attached panel to DropDown content.'
|
||||||
|
Layout = tlCenter
|
||||||
|
ParentColor = False
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object pnlMarquee: TPanel
|
||||||
|
Left = 0
|
||||||
|
Height = 24
|
||||||
|
Top = 520
|
||||||
|
Width = 514
|
||||||
|
Align = alBottom
|
||||||
|
BevelOuter = bvNone
|
||||||
|
ClientHeight = 24
|
||||||
|
ClientWidth = 514
|
||||||
|
Color = clSilver
|
||||||
|
ParentColor = False
|
||||||
|
TabOrder = 10
|
||||||
|
object imgFlareMarquee: TImage
|
||||||
|
Left = 0
|
||||||
|
Height = 24
|
||||||
|
Top = 0
|
||||||
|
Width = 378
|
||||||
|
AutoSize = True
|
||||||
|
Picture.Data = {
|
||||||
|
1754506F727461626C654E6574776F726B477261706869634F28000089504E47
|
||||||
|
0D0A1A0A0000000D494844520000017A000000180806000000F4EB3675000000
|
||||||
|
06624B4744000000000000F943BB7F000000097048597300000B1300000B1301
|
||||||
|
009A9C180000000774494D4507E102180A1C3AD34D4FAE0000000C6954587443
|
||||||
|
6F6D6D656E740000000000BCAEB299000020004944415478DA957DDD8E64C971
|
||||||
|
DE1791A7BAA7A77B6696BB4BD186B15C5994E54B1BB24018346D7A97D41B18BE
|
||||||
|
D02BD84FA07BCA2F20C07E02E925BCBB16281BA02C58BA236142062DCA00C9DD
|
||||||
|
1972667A7ABAAB4E66F8227EF354F5CC6A809AEAAA3A3F79CEC98C8CF8E28B2F
|
||||||
|
0927FEC977BF4BF4C92722BFFFFB84F540A00600041984F7DE173CFD82204220
|
||||||
|
02440810C2E595E0E68600E84B84707E2EB8BBD3DFCFCE05FB3D814000118610
|
||||||
|
CE7682C39E2044200010D21690BDDBB1DA2258573BB69D1742FAB3D8EFDD8E0D
|
||||||
|
02448FD158D0BB1EBFEEC74D30BA9F97C02CE8C3F767DB9FA76BF1766B1BED6F
|
||||||
|
3F1FD8EE1CDBE9F57B0201C2711E8020F6BD8040421062BB76B673B29D53DF89
|
||||||
|
DAE63C9CC714FB1C6D65883008E5773FA6501E9B1A48C87E5B0034081A080DB0
|
||||||
|
976001A4818821D240B41C6D03347023B4C668C4E0C6684DDF9909AD35342630
|
||||||
|
EBF7CDB625662C5CB663062FACEFCC7A4C662C8D7079D5F0E811E3EA11E3F123
|
||||||
|
C6A32BC6E515E1F2B2E1F292F0F092F5FD2183CB7D98EED7F4B7BF5AF9AD0318
|
||||||
|
F7BCE4C4DF82DE075E5D0F5C5F0BAE6F065EBD1AB87935707D3DF0F25AF0F265
|
||||||
|
C7CB9782972F066E6F07C6E8E85D30C6C018036B178C3ED0EDF3289FFB18BA6D
|
||||||
|
1F1843D07B8F773F46EFBA5F1F82B10E805640F43A042B88BA7EA60E4107A103
|
||||||
|
58211800561006446C3B74400640E5BA454034202420FB2CC86D48EC7E50B937
|
||||||
|
710C01D021D07DF33DF7D5E3FA3E0288DF5BE8670844044452EEBD985D38FD59
|
||||||
|
20201180F46FF66D482043403CDCC4E9F9A81E436D0235FD8D6A3B003089EE02
|
||||||
|
B515DCEC5C501BD3163F26A21DEB202C4DB721E86F7E3C40C0A4367159F43A99
|
||||||
|
CB67362B42B97D63C1EBD784070F745F3543FACE24383F177CF1B9DAE8F373C1
|
||||||
|
6FFD96E0073F207CFBDBC2A70C7DD8D977BE02FCEB7F2378EF5D3590C3AE6559
|
||||||
|
80DD4E8DFCB2A8BD10D1776280EDB087BD19B406ECF78CDDCE6CA500BBDD405F
|
||||||
|
A1938800ECF693ED6F9F48EC7EEB7700B3DD70B61B60465A8DA26DBFE843EC83
|
||||||
|
F278A4FB12098610C06A6809C0188CC6DA366201C84CB1CD256CED229A6CB13D
|
||||||
|
38BBD920807C1FD27D88F481D9F7C85DAC23213A801F3FA637DBDFBF2122FBAC
|
||||||
|
E7616F006DFA6E7C5D7EB373881D58CFE99389DD33D4898BA27D7A6E9D287C82
|
||||||
|
8A6DFC1A6DE223BB61FE3DDB75B05F1B9509501F01D8F741DE4BF66334023780
|
||||||
|
1BD0967CE92402B4062C0D581AE5A5CE77F8C477E5C185B1207CB97F126F7D05
|
||||||
|
7ACFD728EFEB2A5857603D08FA5083350641C4A60AD18E2A66A36410446DA9BE
|
||||||
|
0645D344B49F8B68BF07EA760086A471251D2C7135548C0CF26FB28BA04D178A
|
||||||
|
7B644ED430A749864E1FE2271E79E7F4AB7A6DDBB6EA3146DA5C7372FCB8D5D4
|
||||||
|
6ADFF6D3B8B17767CBFF0D3B1FC43B7E5EAE9D4ECF09D1F60C339842763CC973
|
||||||
|
FAB33007D086461C4744C7B2C481DD0609BA685BC86C12289F0D0868369989B5
|
||||||
|
6BD83CD3573D41EF84B33389DBBE76C26E27F12847CFF9D3FB07A0C759BB5ED3
|
||||||
|
CD2B423FE81879FD9A70F54870792938EC813E74EC3D7F8EE56477F606BDF304
|
||||||
|
F8F18F090F1F0277B782972FBD4312D6AE5EFCE14058576DD0D280D6B493FBE0
|
||||||
|
A6AE837EF5C9BA013B33C260C2B08B13212CA40382480700B358C7D063B5A677
|
||||||
|
705974FB66DF0F9F00A05E3CFC1894C3D38F23663C09026A7A1C46DE440C3772
|
||||||
|
C5EA96014693FD241D0C31A8283A900F16A991CAD6F45807221F50543ABC19D2
|
||||||
|
E19DD4A399327427E34573A400A21C506033BEC88844CA64E29DB8DA3F428942
|
||||||
|
CAA4B6B90A9A8CBE1A6EA63A91CDBF473B884A0047D3CB8FBB3460B7A8215F98
|
||||||
|
2C3A2070990038269253861D6FF98E379EA1DCF39A8DBDD0C03A04EB1074516F
|
||||||
|
710C41B70138BA4D04C306AB3B03226A9C453D4E487A6B528C8F1AA58D612D86
|
||||||
|
DF3BABB86189A95972C3DA6EF1EE48277ED389422427048AD6D867F77C3D88DE
|
||||||
|
4C1C82119EF9FC14EC38A41E2E4120347BD3546CB59EC7C79C649FB46B1E2030
|
||||||
|
0DBB3FBA37FB7DF3FE2CF30093F088292CB0140F1E66A4D91DC3B0417ED3440D
|
||||||
|
334BB10F0266A00BD9F5D85D919C4065E8D5F7EE3691726851DA4808D07B4E7C
|
||||||
|
7E31EB9D4617EB5E11873108BDFBF6BACF18405B04B7776A031F3D163CFB82D0
|
||||||
|
5775809B3DAFA7CF70D2A3A74F3F15F9C33F24FCE427847FF23BDAD8B373E0BD
|
||||||
|
F7D3B03F793CC2B85F3C542FB935600C7D273613C4E9C5D7E1C6043416EC1609
|
||||||
|
430010C6D09BDB9A8644D3C32FC66A0C32EF5B8DFC6493A97467F18840C2D3CE
|
||||||
|
68212704A21C06DA6639B20F44C5245827ACCE3D497AE352C242B7A5EED9D374
|
||||||
|
4C8946A7278FE8B13C79F679BC44286432451C03D2072ED9B5A7E7059BF004F3
|
||||||
|
67F79C84789A4CA87AFC9210947BDECC7344229823208F72EAF5C53DAB914C79
|
||||||
|
D7E3125A23F3DAD391589AA031D018061DE18441C63DC67EEBD5D77DE9C4B6C7
|
||||||
|
BFCB208C553DB3EAD5F755B07618BC220AC78CE29185CD92D91336A32643278D
|
||||||
|
3EF274436C1AA8EFE1D10AD274593F2089BEE79382D028DB486988C22A321206
|
||||||
|
4DBFA44C0BE134FB392C2E906244A9B8D2BEDFB0238CFCAE3A4DB2099664507A
|
||||||
|
D8A08041259C108979CC7BA1A30CD94E0588A444116293B1FE36470CD11E774E
|
||||||
|
061492B10336CA063796F0F2FBA0723D82210ABDC850033C86DA30813AC580A0
|
||||||
|
2D238D3909DA22D81F6C3AEC7A8EE1933A09CE16495B2382DD998E976EDEFCF9
|
||||||
|
8541D604DCDD119E7DA1CF6FBF07EE6E757C1083FEF44FE4A4472F1F7F4CF8E1
|
||||||
|
5F2844F33FFE3B9BD74CF8EAFB82EB6BDDE8C50B7BD8068F88102E1E08EEF6DE
|
||||||
|
4309E70F04FD809831F5A2158FDEEDF42299F4E1B6457426F2D0C606D5DA190B
|
||||||
|
FBC3619BDD60BFB9170BF562CD6011340CD31930BD449DB5ADEF39DCE3C793F4
|
||||||
|
307B3FC6E4C3F32EF0858CEABB90FA17430D73853824BC752E183D9B2D2FDF0D
|
||||||
|
4E836AC6D6626848C91960980535DC9D8AF517B173E7EC82616DF3B12CA0D970
|
||||||
|
53F5CC79BA26314C9BA4C22F28300E36D3819E0B11A954379E2D04CF634484B1
|
||||||
|
8557488D7C63F3DE17185CA3DFB3BDB785404C1B3C8D4E60F4F7C137E304EE7B
|
||||||
|
0A17CEBF45046B178828B6DEFD3580DE07568375D68EF068A51C57AAE71D137D
|
||||||
|
C177CD7088CCED9130D68A758B1B6BB750861147C4509C0DF5878719EF0132B8
|
||||||
|
87DCE38618046193032B96CEE1852331613B9690C79F89917B0440DEE6D867BE
|
||||||
|
978E7767B430E3F2147982F977C7E07502331CDEEE2FC1A197C4EBD9612DD627
|
||||||
|
CA6654B99550DF7B06E7F9FB2034DFA70DF4AEFDA51914DB574316EC3CDDE036
|
||||||
|
6E924E221C8590880CDAA2DBB712F59EEDB27F1DF60A871F56A0837076AECFCC
|
||||||
|
21EB8B0BCD855E5C28627775A913D020E07CD16DAE1EA9ED1B03F8E6BF147CF2
|
||||||
|
C9B1472FDFFB2ED1A79F0ADE79025C5CE8971F7C20383F137CFE39A12D3A0134
|
||||||
|
D641FAF0520293DF1F1436383F5758E4B052625C661A1C0BEFAB1A826637C60D
|
||||||
|
AF26268A6717989C7AF762DB71933284FD38894DFAF1BC6DC43A9B7219EB3E3B
|
||||||
|
13A96BCE5CA000DE789E1B9B563DD3F4BCD50B559C59D2630F435ACD4D460C5C
|
||||||
|
71F9925B75AF06A4212AF9E0F08823EC5841613D72F046A51F1A9315C936F14D
|
||||||
|
05324A78275B8D309A6206942A64421B6FDD23172E91DDD6FB377C27EEB3D965
|
||||||
|
87FC2A26BF2C0ADDB01B7826F356D49B676C3DFAFBFEBE0FD29113DBE2C4F79E
|
||||||
|
7C339CF484473F56A00FC1E1A01EBDC23A9BA9C29D1237AA6E22A578B0E908A7
|
||||||
|
072A748C8DD3E47AA4A1A5198A09EFBCE48B8E067F8184BC8F8C094EC2F4A2B4
|
||||||
|
B9EAF4385C221579D17E37C6BC6F84BF28DE758593A6D449F1F48DC821741C7F
|
||||||
|
8900C233942306AF8AB8D76CE3AB40657DB88394FF1A7B1237ED52E451A0061D
|
||||||
|
9074F64A84326C9C6AFF48E74C9107F5C265689F395B060E07E070D06D7767FA
|
||||||
|
795914E31783A1D735DF7767EA50DFDEE9310F2B70BE137CF194B03F20BCFA9F
|
||||||
|
FF12F49FBE2F48B648B95FFFF5136DEE3BEF020F2E32C1B2DB019797C07A205C
|
||||||
|
5E6AD87176AEB3CBF9996067AFB6D3994B0661B7881A6E4BA61D0E6CC654C04D
|
||||||
|
67224FC436B6CF66141633DCCCF38BD8664937FEFE404493BE6CD1054322811B
|
||||||
|
86CF92AD4CFE424C201A7ED50CAB8685151A394A5E9971F20E55E0D364252193
|
||||||
|
8DB33174186A3A651CC793C0152AF104AABE281D9D192D8FC1963D378DB3273C
|
||||||
|
88B149BED27C5D25415613BB84320155A809331B89A8266DA94C8A9409EE6043
|
||||||
|
E9844CC5D366320F3E3C797B593F68ECB83D360CA853100D9D30F2742F067FEC
|
||||||
|
C9CF3FAFE6BD0FC3E6C74863BF0EC5E7FDBB805386C30208FC3D219C927C34AF
|
||||||
|
3630FC62D9A56C1C7870B5302427DB3BC1A672DF75D6278E92D89519662C0E8A
|
||||||
|
9060B843C325E95B92C06ED49D941098BF14024189777CA61150245D27FC5E9C
|
||||||
|
4D733C9D8BC3B2C5F267E450C71322393E06D06894E740310603AB2785911D26
|
||||||
|
1A3DF7A5207DA803209BFC3E517E5F022E8B0008EB81D19A60B7D388ED70B0A4
|
||||||
|
B091590E7BC2E1A013E57EAF98FC61AFCEDABA023737849B1BC28BE784F7DF17
|
||||||
|
BCBC26FCE297849B1BE0D933C8471FD149432FDFF9B7DAC2AF7D15F89D7F2AF8
|
||||||
|
E01F69EBCECE7496F17FBB1D70B6082E1EEAEF8D15636BAD1830F8A09429BFE2
|
||||||
|
2E2CB1C22F306C8B58BD77660B0E0DAF979295EE1DD159DA22C1DE08632A2511
|
||||||
|
4892CC43A1603B50790889EF97C44E61CEB8EB30DB649A92A66ACC4A7269FAEC
|
||||||
|
E166DA16D9B01B026AE1B299940453B5A12C13B325DA42952583085D484E8D76
|
||||||
|
8407E350CAF0F6C48BCBFE693CA54C2875E2AB9E393115164D31B14C47DEA41A
|
||||||
|
008FAE33699B987C35F86AD8D5CB17F02268CB9BD8367F1F7C5EDEE2FDBB33A0
|
||||||
|
035D211B37F062AC1B415F25BF73A6E250E3EE2499C45D291E4D60F51BCF7736
|
||||||
|
4030CFD89E9DB31A69869D64F33791531B6BB23607A46C12B79958C4719E2290
|
||||||
|
2675B6C8DAE286B382EFB2B1C2017D8FF4DC835459D0B23125FE2999360528F2
|
||||||
|
EDA7086360CA790CC97DC72800D398AFB95B563BD2B4C3081ECD93A0347591FA
|
||||||
|
4CC6A0B8954E1219837058955A392C51AB14F51A402B863F8270E1390DED5FFD
|
||||||
|
609101AB33B13BD3C9E6F56B45462E1E8845236AC70E2BF0F419F0F50F07EE6E
|
||||||
|
81DB5BE0F9F3B075CB8CCD7F44680BE4A38F183FFCA13EBC0F3E14FCDDFF35AC
|
||||||
|
D71829CF9F276E7FF5D0F8F3E438B6192E06EEEE3866E8B37389D0C34350C7D7
|
||||||
|
FBCA91D176043066DECE969875EF95267CBE022184CC96F6C1D196C699E01A95
|
||||||
|
9182998F1F494929187BF1A865EB354A31F604C3B37DE6E6D22EB610AC62FE76
|
||||||
|
A841990845E1F283155B971A98E7C04A2E29A6FC4150C6AC1E401C1B375EBD50
|
||||||
|
C96BD8F7284C1DBF762AFBE5EF954533E3E2F5FC847BBC6CC1C4108A73A0E260
|
||||||
|
645C7AE7DE27FF5E0DBEC23764DFD7C96EC6E6B738FDA9C940EEC1E7EF67DF88
|
||||||
|
2887BE576CBE1B36DFD3C877C3F027EAE3188143AB9DDC62F7983C624C98BC1C
|
||||||
|
FDA6587B31E8E1D84BF0D49D876DA3C92018C3E827FAA5B715C5EB36FEBB63E5
|
||||||
|
9489FEB088DE06DB57282D70E5A2C3B8F381F92379E22874D0E4BF8FCC2D88CC
|
||||||
|
D185453CC4F37DA2290211B0F1E6C56A025092D66CAC1B6E256740C978F2E8C7
|
||||||
|
317632588848A1972400E4F97A774879C464BC2C23984A3E39EC96AC1720A843
|
||||||
|
A3CEB3C4775478FBFEAFF2E7070197578A829C9D09BEF882F0FE7BC058816F7F
|
||||||
|
7BA077D01FFD9154DCB5B06D3E137CF5AB7ED07C96CB4E67976527683BC7A88C
|
||||||
|
DA685EFBF903B186AA510FD8C4C6DC7A487AA087E9CB2281890705AF7A8ABCF5
|
||||||
|
FED22BE68DB316383D6B78A330504198FD3C8E274B411BEC9C7A4D3263F0EC8C
|
||||||
|
1D39C6E939C352D9B2CC0BA77E6BE75038E5E0C4F70934991FA69CC6D89CF984
|
||||||
|
5D2A5CE249BF0DAC4434112183AD0656A33FC13525315BE845640558F0E22F49
|
||||||
|
18A672DEE728A3406D86D3548FBFE64E1D46AB3572CCE9C92FAC183D378D1498
|
||||||
|
48BFB3C42CD329CF53EE61D4C809232F5F82A593FF9CDAD62DBAEC03E8626C9B
|
||||||
|
D539F41EAE53899C6403EF25042385591178F70457276CA0CC142B00229A79F2
|
||||||
|
053BA4722F089B22203A91BBF0488E64E3C093D138698E3C44F2CC710D62F31A
|
||||||
|
151E3A928CE04E8A3B84B4497F0783A5DE13C3E3A5708B36CCB5528B34B3E282
|
||||||
|
12AD9EF9187340A3E3B624700B3DB27E861979C7F297569F1B29163F08CC4323
|
||||||
|
3B493AA658F8D1D79C1C9CE5D48752CB074ABD1980BDC13564E41166C1ED6B52
|
||||||
|
6795B49F11EC9D819BD74A9439EC81D7AF759B67BF3AE211CFFFDE7D57DFFFF9
|
||||||
|
3F13BCFB15C18B5F139E3C012E1E00BBC52A65015C3C109CED3C93AC5892881A
|
||||||
|
D9FD5DE2F38D81B35D42285E05D65AC22EA3EBCCC72C3A03921A6AB697189C53
|
||||||
|
8D411467B5348851B430F2C6B3F15C87C1299EC4649609C6C9F1EF138164688C
|
||||||
|
52BD5B3AD9CC2099D9368299533A41305292419283E588D4273433604A1B6758
|
||||||
|
24992E5233CD9B0098A898FC8AADFB81F944D7D8D04CA9241A0A8833C3674471
|
||||||
|
6F625290C4EA3D4260CCB384F3E8DDD0EF96C4E89D53DF76060D91E1F36F8468
|
||||||
|
B6100CDF439BBC6F82D878D62259DDDA951933BA266047DF1650CD18BBD4631A
|
||||||
|
467D44F173230AA30306A5B218F2F0FC6B2442C19E99A19B8D2D0F6AA2F57D3F
|
||||||
|
9755C0CA06F6F1E3311526894DCA3215E295B1C495CC9419DB005EFC9C718ABC
|
||||||
|
41A5167DCE3139BCB429269BB0F9A95C25698995AE586B481C72A14D32B60F9D
|
||||||
|
54FD77C7E6C7AAAC3DA54EDA717B75E80CBA0E8AA5D12C3B05DBA677AD1B5A0D
|
||||||
|
0E12511C7E582E67ED4AC5F4F31C0E6A6FF786DB2F8BE0E6B5B6E7F6B5C23337
|
||||||
|
37C0C30BF5E86FEF80A7CF087FFD5784CF7F11F8FC91A197EF7C87E88FFF58F0
|
||||||
|
7BDF14FCEDDF11AE1EE9C0FAE52F955DB3EC045757FA1A4369406C854CAD213E
|
||||||
|
9F9F9B712E78BD57CFA260E82E47A038AB199C6183DE3C724F7838E6DE582797
|
||||||
|
08D364E6CF4791EA9440B50923B69148CC7A489A5EB475759E0829899B1F9993
|
||||||
|
C2AE41267E1DBEA009DD4E94288C1E49C22251B94A539233D93F251AB1C90747
|
||||||
|
C5491BC36CFF8FC9843166603FA9B255F661A627D6CA56C9B6064349BD6D4F4E
|
||||||
|
F3861FEF137D5EF71C4DD184CF9379F194744ACE6840FB9A9887446FAE62BD17
|
||||||
|
B77F134B474E1E43A454C10E4C18FDBA31F47DA078F209D7A891A0A9BAB5B254
|
||||||
|
501837A34E140517864870C48BDB38D3145112B827B0FB09A51E25BFE5CE82A4
|
||||||
|
81B5D4C1D496A0498E19F28F0A589F181C770F8C7E66B7D48AD38C6668867D4A
|
||||||
|
4EC9A1A888006A2159A421129B0FEC5B12928ADAE0A9EDC9EC81685E71C834B8
|
||||||
|
147E454E7A52271B7BDE9A644D3E7CDB99008471E9BB38C5D39C5D3BF7E14053
|
||||||
|
7EC0D93B6215B2A3136E5F2B5B675D8143D77B74D8139E3E25434DD47EFDEEEF
|
||||||
|
0A9EFD9A70761EB77939D2B7F9DEF708FFEB2F33C900107EE33704CF9E12FA60
|
||||||
|
A08214B5F8A86ADF6C59278ED39F8985249A18A5AA2963C66BD919454D921FDE
|
||||||
|
D784213C0FD03B4F5E1B897E47066F305BE51B9DC0D529CF2785873F888EB07A
|
||||||
|
6C356A24218E48E38AF1E227DE266535A2D0CC5DCFE9C14B9C26AC1EC5D3DF62
|
||||||
|
F493C9AF3982A0E6CDB9805179F25E7E4E9BEDC83078D7C4A19958B94D6452C5
|
||||||
|
D482A540A9F7B36D6754F5164F7F2A6BCF77262A9CF902E10456AF1124F3CCEC
|
||||||
|
39C6E6BF0CF3A6E8AB9C34F2C71EFDE82A6BE005516AF0E5E8E5615A7AB26929
|
||||||
|
0903C3328751DC143C78892A558F2CE3FCC588532D8422E7C91B0FDF71F228C1
|
||||||
|
1FE11849E1CE1F55BE9A760D8904179DB7387E8D4808C9538FECDA5CA0E57792
|
||||||
|
29AF8D51789924364E2A2F1F718D1A89485013A5440644F3A4959F4730798846
|
||||||
|
D1A0B1B6B04CDFB556AB7567BC9D448C51637A36958269E67369230BD79C6544
|
||||||
|
73CDC0B2D4024A0906CEEE4C263C3EE8B2CE482CFA36EEE85EBF223CBAB28942
|
||||||
|
005E048F1F2921E0EB1F0AFEECCF08FFEA5B42DF3F81D1D3279F887CF411E1DD
|
||||||
|
AFE80CF2F0A1E0C30F058F1F6BB295C8920570AC29B1E5F3738571969633B9E3
|
||||||
|
E500B4388052E3219C8FA28BB3ECF28626FF3D43FD56D9269CD85B788D4DE2E1
|
||||||
|
3A5592D82A3839932BAE59563D7AE7D1134BD1BA9971E5402C9C2E29950A6C1C
|
||||||
|
FF09879F934D9BA8F2584A8066F828FC1ADAF00FA23D32315A82EF53316BD9C0
|
||||||
|
3B9C469A8E340DF222A570E6D3E4F024E53073E2932E4924A171431BFD37A692
|
||||||
|
8FE0CC9980D2632752EA646BF38B2D6A548AA5FECDF74237B88759832FC9B839
|
||||||
|
1D21781154502923F14AEAD5073E2F930C9A6CBC73D75F910AE198573A46EAE1
|
||||||
|
24134702C30DF79A64C2E1DD7DA6131314517AFB74448929E8510908B71CFEEA
|
||||||
|
8D8F8052A4545B4B78F434E9DFCC94D009582A709F471154D92D5B5C55E6944B
|
||||||
|
A5334F51845333437B67661205C45B20A8895A6D859464DF8B68FE6FA24EB344
|
||||||
|
B453FD05AD983547598075652C4BCACA7854A7B99D02178D949FA1281AD5DCE6
|
||||||
|
C5850433E7B0AAF44C5F81FD1DB03B57398521C0CFFE1FE17FFF84F08DDF9E8C
|
||||||
|
FC64E8E5E38F893EFB4CF0DEFB2A64F6E001F0AB5F11CECEB4716B273CBC50EE
|
||||||
|
7C5B74225816E0C1B9F1E6A1504D6BAE3889D03C698BF2E661D8AB882621880D
|
||||||
|
9FB7CA338F02FC8634C3EBD9A50E90C685ED388EE3731889A2B3435AC2ACBA3A
|
||||||
|
0270FAC48EDD47386661E8B04449ED0422B3E81615FE7CF8E7A69993066F8E74
|
||||||
|
AA6C8117815571B0519439E5888A59EA00242384F4A42B6843275440E790568E
|
||||||
|
D437E7EA9324B2A5F05BE646AAB8DACCBF0F60A770E9990B4B6783ED23EB6863
|
||||||
|
9085076F74CA25746D28E8952E8D70BFB7FE363EBDFC3DF1F91C84C999D7C1E6
|
||||||
|
B4CAD50AA5BC4236129645E02BE4092676A37ADC131C8214F41A1AEC19322F41
|
||||||
|
11AC70CC313DF2CD40D5917223CDEC8E60B484933257A84EA91D9292B8D45D06
|
||||||
|
667C7EDA76D38C5A5815C263C091068ECF6F91C8AD7223554AC4211A9609261E
|
||||||
|
A12743098B54E1CC30C23451277DF21A36B9F6356B54A4A79335BCA29ED4B376
|
||||||
|
9B5979F48EF93B9434567D35E3E97B21D5DD5EDF0F0775805FDF6A22F6EE0ED8
|
||||||
|
2D8257D784C30ABCBE25BC7C41B8BB4D5B74730DFCCDDF90FCC11FD049434F9F
|
||||||
|
7EAA2DB97A0CFC9F9F121E5EE9601301760D78FC440DE6FE4E8D74EF84FD9D1A
|
||||||
|
ACC35A55254B890E2963E7B057754826E5A62ECDA53FF577F7E8BC2A56202160
|
||||||
|
36CC484BF1B087252C5A9B755E68AE778A86288FDF0DA956F23AE364F62AAD0E
|
||||||
|
A068D7B81E8E6C54225D20AD8AA4614AB26262B54C916160D81991F0942C4544
|
||||||
|
14515854AB4FAB8857D5C5114C8351B6607DCD910047D4517923DC414EC89C12
|
||||||
|
50B54DE04DA5ABB54059563215584505EDA62EA0350A23DF8C271F06BE01BC50
|
||||||
|
F0EBDFCE9E791B6C03BC59BD32BF576CD4E09A5569C28AD94B481E8CD5067297
|
||||||
|
82ABD3E4ED4AA9924570E2694A1C8A1563852ECE481D18FD3B2B69C3599F12BD
|
||||||
|
354C18618A246409E4B86EAA585E3A45B79F18A832313D27965031E62E809803
|
||||||
|
E6FEB4C830A72BEB1572A0256E4F85A6E8798C74627A61C28861E5B512D72783
|
||||||
|
31B6F83A95C4B9C155454C318EBFD2948BF0DFC798F3285A453B478ECB22580F
|
||||||
|
5E7390859A8BEBDD78BB863ECBDD99E6416F6FF5AABD08EFE52BFDBC1E74FCEC
|
||||||
|
F78AD93B21E5EE0E5858F0F39F4F1D3931FA8F3ED601F43F7F98E264AE2C3806
|
||||||
|
E19D278217D77A61D7D759D7CE0675DCDE51CA0BD81DDC5B03A2D4782D5C732F
|
||||||
|
C621A559AE1D45268042A7C6D92EEB9A05426278BC5408A2E8DB50E1C6CBA443
|
||||||
|
8F08A9AA7853C5D4AB96BC141E7B358464DAFC14387DC9178C22C63492AF2F7E
|
||||||
|
2D8342B7C6C58651346DDC0519A163439B42AD13C64B92F3AE7AF476AE49C5B2
|
||||||
|
D60F7086242704CBFC378157AF6666DA8527E25950D1DD91CA8F4FAF5F0CD70F
|
||||||
|
FA289D9E50C8AB618D33BF344EC903F7E8A9E2F3B80797BF4FA06CAB6FF326D5
|
||||||
|
4A4CD8F310F7D68D6D23CE9B575EFD081EFD880428510A874DC7AE1A02635682
|
||||||
|
DCC22D34316C0A27DFF56A64839F6F70EC490C4F2A0F7ECC38893B08542A7069
|
||||||
|
83DF572FDD630B83434936B87F243EC74C1AA639E7A1D780925748368F73FFA5
|
||||||
|
E617A8E0F355E3A6461BE5B8A0AA8209A5400E83862531F1AA7B3300B436D423
|
||||||
|
7738770248A5D4B088924ECABD5D57C3F779A864C19293CD6E41E43E7C32DD19
|
||||||
|
13518C6EEC93C9C5C5307C3E8928D7D73A9E2EAE040FAD68EAF2A1E0A73F257C
|
||||||
|
F081E0377F533006E8FBDF3F0DDDE01FFE03F5522E2F613AC97A594B4BC6C9B2
|
||||||
|
64956265EAB2B35D3867C0D5B46C9645A195EEBA372CC16E7126CDBA261FDAE9
|
||||||
|
975478F463546A5E2212C133F744CD4841B34A69741DFAF00C9C31123736593E
|
||||||
|
69CA2ABF7DC33F09EE7FE19157168B879FD14968C2D3A792EC8D3C2695888433
|
||||||
|
DD1B09673AC90F4F9C273470CAE325C9C2013EF25E79F6E68983377DCCB699E9
|
||||||
|
6454747AA2EA9536183E0A6F7EA321C42136679FC3A063D29B6F9CEFAA7F9339
|
||||||
|
9CFB9527EFA9EC7C233C733F4E9F2C1B9A28947D557ADCEA98FD40E1BC57CDF9
|
||||||
|
B4F1A3307082A72D5B75CB120548DD662E8E4AC38B997943270C35CB0CC84F09
|
||||||
|
CDF95E51D1AD9960A6915EF32821EE36C298E440B677BC449652E8C5EAA86C02
|
||||||
|
50A149E66353363B3D4D325D7FD7D771AD9A896F348B6C668EC4E013F7D24508
|
||||||
|
CD6A3C469FE5707DFB2A69505490A7DA15759A0DC26EB670C96A2C1C52E1B221
|
||||||
|
299D713035CBB1D19F4F390D550B164BA23C7D4A78FE82F0DE7B82AF7F5DF0E7
|
||||||
|
7F4E78FEFCA8FB6665ECBB5F017EFB1B821FFD8870F30AF8DAD704CF9E694875
|
||||||
|
7129B8BBD599657FD0446B5FB5E1875507E7306D1BD7481E9D80D56751170A4A
|
||||||
|
784539A88844C790D45D6E4D2F8C5981B9880A481F64423694D2A0A64EE94FD3
|
||||||
|
F7712C1E5C1C2916D0982958D8243E8F3A11D5CE5972CA21AB20760E9A38EBD8
|
||||||
|
8825D16444535BA18688B52D54543585E858830695E554A991948A9EEEC5D331
|
||||||
|
8D1225593B79F87402E6604BE86EAA5B296025DA144ECD4CA4AAAA9374CBC473
|
||||||
|
A604AC433406D9906BD1DBE7FBF56BE89E6227DA4C0C6F122F3B36FA23F46BA4
|
||||||
|
C0348ACB4F1AF46B615B540F9B8A00162523C7F17C915982B7F2EEA5C081B3DE
|
||||||
|
7CA97A95AA8459FAD391EAD75C309586D5447CE330398138394E660D84D49847
|
||||||
|
EAD55418A9CAF816BEE6F19D36CAB3B34E0495CB598C283652227422A16C2969
|
||||||
|
B244315857372112F4323623D8E184595C0414A635CF54A0361F9B75BC9AC0A0
|
||||||
|
7442A77942F7E7A630B3093EB2B5C12AF5D91CDBFD9EC271DCED04777B36DC3E
|
||||||
|
9D0C112DA45A9A56C23E7FA10E0741F9F4777BC25FFF959EFAD9B3A30E9E1EFD
|
||||||
|
A37774A3F3074AD179754DB87EA9195F74E7C6EBC08310EEF6263F6C6C95B3B3
|
||||||
|
1421F32AD6DDB998F222451894D5FB6AB4B5400A937E4A78F933EE000007B849
|
||||||
|
44415466B9532AC03D415EE6605082E6350BC4774BB256653C9E74D025F8FA3E
|
||||||
|
5332CD3A3D55CC2C269AA2AD3EEB7815D95ECA4E3AA9F47AA73E62F35076A2B2
|
||||||
|
3C582A064CD5484024302BEE2D531155A5B7D50477C0434572408EDC23134F43
|
||||||
|
5D86D03D6F9AD426C1B3979F390599F4F78F78F5441396EF399765C944ACAB55
|
||||||
|
BAEE8D336F96099FA737306CEE9B104E19F7FB8DBD0CE822231DA135AE9A3726
|
||||||
|
70662B4A8D916C19C7611D7B76A6CA18125CE9B1156CB4D2FE49C37E14468EB8
|
||||||
|
2321456AC3A51630C12F292F39026A718135AF6A4549E44EF5B454253E52E307
|
||||||
|
F778E9A82B4A61CB869113DB639A0468B31A15CAAA4F429B15A84AA403C124F0
|
||||||
|
361DDF12D91A81CC9A34359D5D736842AABADB2D5790AB3A953A9C5ABD7B82B4
|
||||||
|
E5F79809580F9C4C9A9223736F7D74D59157B55DCD47DDEDF51A7B51CA1C6B4E
|
||||||
|
38BDE7D05DF7A63A6039D2DFFB17FA544F18FA45BEFB31D1279F0AFEF22F520A
|
||||||
|
D3717930F0EC29E3C913C1F35FCF7A364C84D7B7A6417FB75D435647F3D99926
|
||||||
|
0B5CAA568B0268921F580F9C6BBF5A9217625AD006B5247E9FD69217CD6E8FA2
|
||||||
|
C1A252A9D9C6D1398489AA673D3AA7C44DB4FB583D6FBB749E08923F2F5CBC69
|
||||||
|
144E7D2948AA1EBD246E2E1BDC3DCFCBB19DCA1438B7DFE70F0A4D0E2918BF17
|
||||||
|
3749A90D08CDFBA2779FDA355C34F167ED7D294A93D14EE293DE31153E29A1F4
|
||||||
|
0FF1F56C4BFD80CCDAF022332F9F6883C773EACFA7C157ED1BA237F1E6F92D4C
|
||||||
|
9C8A678F2FC19F1F467BB455A47A52289D79A3544BD5BF91BA665EE1C627BC9E
|
||||||
|
1CF78A55CF2C988A85CF7A38557327F468A8144D5159D569C2EB8D531E1A2B23
|
||||||
|
7465EA2A5013CF9E045BEDF8C4DDC74C8270ED1D190911CD997F54FD7B88C412
|
||||||
|
7CB12EAA0CBB16831F036BAFFB20F6CD95B66CC451E2FE626A5186E998BEFC26
|
||||||
|
B208E5CD11D5EAA32B6443AC86DED93BCE97EFDDBC6FBBBFC9AF2FDA349C7916
|
||||||
|
D7AC57FDFA9C8C199A843DDB153144129CEF4CC8CC174B625D2EF0F202A16A39
|
||||||
|
3AF0DE7B035F7CA190CDF903C137FEB1E070007DF6D938853C32C680FCFB7FA7
|
||||||
|
19E56F7D4B7071613AC9677A81CB2278F54A07CDE543F5BA9A25171A0B6EEFD4
|
||||||
|
A0EF76CE90902863F775625138E8BB25F9F53E5E7D31DCB1DA422694BC566E12
|
||||||
|
587C334903319A52E5D9675529727D589660354C6A8F9CF8714D0157379B3639
|
||||||
|
3C29D4483A418A674A2D1AD0CC71C746AA18A815A1758D5909F960B6BFA70A5F
|
||||||
|
CC8A95BC3D36E7F281952614798852C21449E54DE294362A9588E46BC921142F
|
||||||
|
9D699621A602DC735116054B309E6A84C36525AAA5192DB7AA55B68D547593C2
|
||||||
|
9FFF327A356F8271F0162827BDA8F54006CDCC104EEF30D68D2FAA53356968C2
|
||||||
|
DD93774E31C7CC3CF502E314AC7F523CAD454E75822084B0D8AC4D8F14249319
|
||||||
|
B2A19AEE9D38EE542A4F298AA622E7200E0B1E4B2DD7D71029120EF37C4A9B25
|
||||||
|
3AF36F29089361EC31C68B18A06CE40FCA718645F34328042368C3981B4E53AE
|
||||||
|
95FA8C499658287324EE54A6D89B1555711AF9F0FA81928FD41CA44A2318F572
|
||||||
|
68A4B73435DAAE1936BA2D3862344BAF3DBABCD48A5AD5A957A8D01DBEC39DEA
|
||||||
|
41FDE8C7846507F98FFFE124838CE9B3FFA6DC79418A993D79023C7E0C3CBC04
|
||||||
|
1E3ED481777925D8AF140BD89EED743192C5A48247940EDB606C62A2F88A2BF1
|
||||||
|
46DF4693B43306CE2648E609542E9C5D66D7A1A092C844E8DA7BC23575AF73B1
|
||||||
|
709749D6106A8421142FCC72F69094453A0A65B2ACDA57F07099D822938780B2
|
||||||
|
28C466E9BC714211D3B71F2EA55C4BB25157629A0BAAB26C9E22E94705BFF181
|
||||||
|
3C061F15471588F2A4CDA323E261AEA5EBB8FC2CC140930C316DD60D24D92E2A
|
||||||
|
9E1451C12C47ECEBC4BA91CFA229AFD3781B7DF24D2C9CB7AD097B3A113BA454
|
||||||
|
C45AC18BC336C19FEF32AF1E55FE26B265ECAAA2CCB47E2C26D95D4C85465274
|
||||||
|
70B68F4AE67564E5C47AB1BE6F5D4D89361B4C776EC366A9457D0E7D5059683C
|
||||||
|
163A29C672BAFB32D14A2BEC11EA9A542A46EAC220654D566C16F6DE5E42C226
|
||||||
|
4ECC3806F5B6DD3D248C4D8746CA22477E9C4A81750AF9BAF284F5E7FE4037FD
|
||||||
|
7826DD8E59AFB91B23CF8BEE7C9DDAB5EBD294ABC9201C0E6AAB5EBF561CFEEE
|
||||||
|
16D835454E5E5EABFEFCCB17FA74EEF6C0CFFE96F0FA06F8C10FE8146C133E21
|
||||||
|
FDE7FF22F8E637053FFB19E1EA4A07DBE79F6B8194D8BAB0D72F35CCD0EFD4F3
|
||||||
|
EAA2A1F6DDAD79A4AC419D4B0AB7A6D5B45E4CE537C6133BBEC008468A624D7A
|
||||||
|
F1D53E918488556B1AFAB6C2779552A5EA7CDC79C1619F68BCEAADA82FF80A58
|
||||||
|
3C07FF5321515DDFA176CE09BF2F55BFB461AFD555F57853229D7672CE236C16
|
||||||
|
2909EE8BE51784371D7993F19FEF2701A356B752593E71A64EBA1E3D552AEC86
|
||||||
|
6D33A996140F1E1B2D1B0D53E72A63DF8638A39930E8EC2C9B0ADFF85AB18ECF
|
||||||
|
D35B12A9F7F1E1BFCC2A54B3672F66D0D75E2A1A8BC64D1FE9D927F77DD6980F
|
||||||
|
864D68B69B02E5C4449150A59C5838A1015545CF469131C0AC0B431B6D1BA9CA
|
||||||
|
AB2704CFA4C88B7895E85C41905EF09CF18CF51DA6094A0A8559322AD0252D37
|
||||||
|
4F431006F9449E782AD79DA15594022A1CADBA3542E1D3F320E918A98822E7A2
|
||||||
|
27A528D11742F2BA85DE338FD1DA8810C20BA1D8F4707AB7DCE1482859C4D78A
|
||||||
|
CDF62E8B2D5262DCFD4307CECE46889A79D2F9C1B9AD976DCEE93A08AF6EEC1A
|
||||||
|
BA8ED4274FB4ADFB83CAC6BCBAD1E2AA9FFFE26447FEFF3BD70300455D759800
|
||||||
|
00000049454E44AE426082
|
||||||
|
}
|
||||||
|
Transparent = True
|
||||||
|
end
|
||||||
|
object lblMarqueeText: TLabel
|
||||||
|
Left = 0
|
||||||
|
Height = 24
|
||||||
|
Top = 0
|
||||||
|
Width = 514
|
||||||
|
Align = alClient
|
||||||
|
Alignment = taCenter
|
||||||
|
Caption = 'This is a marquee background effect with transparency.'
|
||||||
|
Font.Style = [fsBold, fsItalic]
|
||||||
|
Layout = tlCenter
|
||||||
|
ParentColor = False
|
||||||
|
ParentFont = False
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object Panel1: TPanel
|
||||||
|
Left = 0
|
||||||
|
Height = 48
|
||||||
|
Top = 472
|
||||||
|
Width = 514
|
||||||
|
Align = alBottom
|
||||||
|
BevelOuter = bvNone
|
||||||
|
ClientHeight = 48
|
||||||
|
ClientWidth = 514
|
||||||
|
TabOrder = 9
|
||||||
|
object shpTri2: TShape
|
||||||
|
AnchorSideTop.Control = Label5
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
AnchorSideBottom.Control = Panel1
|
||||||
|
AnchorSideBottom.Side = asrBottom
|
||||||
|
Left = 256
|
||||||
|
Height = 33
|
||||||
|
Top = 15
|
||||||
|
Width = 81
|
||||||
|
Anchors = [akTop, akLeft, akBottom]
|
||||||
|
Shape = stTriangleRight
|
||||||
|
end
|
||||||
|
object shpTri1: TShape
|
||||||
|
AnchorSideTop.Control = Label5
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
AnchorSideBottom.Control = Panel1
|
||||||
|
AnchorSideBottom.Side = asrBottom
|
||||||
|
Left = 176
|
||||||
|
Height = 33
|
||||||
|
Top = 15
|
||||||
|
Width = 81
|
||||||
|
Anchors = [akTop, akLeft, akBottom]
|
||||||
|
Shape = stTriangleLeft
|
||||||
|
end
|
||||||
|
object Shape1: TShape
|
||||||
|
AnchorSideLeft.Control = Panel1
|
||||||
|
AnchorSideTop.Control = Label5
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
AnchorSideRight.Control = Panel1
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
AnchorSideBottom.Control = Label5
|
||||||
|
AnchorSideBottom.Side = asrBottom
|
||||||
|
Left = 1
|
||||||
|
Height = 1
|
||||||
|
Top = 11
|
||||||
|
Width = 512
|
||||||
|
Anchors = [akLeft, akRight, akBottom]
|
||||||
|
BorderSpacing.Left = 1
|
||||||
|
BorderSpacing.Right = 1
|
||||||
|
BorderSpacing.Bottom = 3
|
||||||
|
Brush.Style = bsClear
|
||||||
|
Pen.Color = clGray
|
||||||
|
end
|
||||||
|
object Label5: TLabel
|
||||||
|
AnchorSideLeft.Control = Panel1
|
||||||
|
AnchorSideTop.Control = Panel1
|
||||||
|
Left = 12
|
||||||
|
Height = 15
|
||||||
|
Top = 0
|
||||||
|
Width = 216
|
||||||
|
BorderSpacing.Left = 12
|
||||||
|
Caption = 'Animated metronome with color change'
|
||||||
|
Color = clBtnFace
|
||||||
|
ParentColor = False
|
||||||
|
ShowAccelChar = False
|
||||||
|
Transparent = False
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object butAlphaBlend: TButton
|
||||||
|
Left = 8
|
||||||
|
Height = 32
|
||||||
|
Top = 360
|
||||||
|
Width = 160
|
||||||
|
Caption = 'Alpha blend form'
|
||||||
|
OnClick = butAlphaBlendClick
|
||||||
|
TabOrder = 8
|
||||||
|
end
|
||||||
|
object chkLabelFlashing: TCheckBox
|
||||||
|
Left = 192
|
||||||
|
Height = 19
|
||||||
|
Top = 360
|
||||||
|
Width = 92
|
||||||
|
Caption = 'Flashing label'
|
||||||
|
OnChange = chkLabelFlashingChange
|
||||||
|
TabOrder = 11
|
||||||
|
end
|
||||||
|
object lblFlashingLabel: TLabel
|
||||||
|
AnchorSideLeft.Control = chkLabelFlashing
|
||||||
|
AnchorSideLeft.Side = asrBottom
|
||||||
|
AnchorSideTop.Control = chkLabelFlashing
|
||||||
|
AnchorSideRight.Control = Owner
|
||||||
|
AnchorSideRight.Side = asrBottom
|
||||||
|
AnchorSideBottom.Control = chkLabelFlashing
|
||||||
|
AnchorSideBottom.Side = asrBottom
|
||||||
|
Left = 288
|
||||||
|
Height = 19
|
||||||
|
Top = 360
|
||||||
|
Width = 222
|
||||||
|
Alignment = taCenter
|
||||||
|
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||||
|
BorderSpacing.Left = 4
|
||||||
|
BorderSpacing.Right = 4
|
||||||
|
Caption = 'Flashing message'
|
||||||
|
Layout = tlCenter
|
||||||
|
ParentColor = False
|
||||||
|
end
|
||||||
|
object lblFPS: TLabel
|
||||||
|
AnchorSideLeft.Control = chkMarquee
|
||||||
|
AnchorSideTop.Control = chkMarquee
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
Left = 192
|
||||||
|
Height = 15
|
||||||
|
Top = 429
|
||||||
|
Width = 31
|
||||||
|
BorderSpacing.Top = 4
|
||||||
|
Caption = 'FPS: 0'
|
||||||
|
ParentColor = False
|
||||||
|
end
|
||||||
|
object chkMetronome: TCheckBox
|
||||||
|
AnchorSideLeft.Control = chkLabelFlashing
|
||||||
|
AnchorSideTop.Control = chkLabelFlashing
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
Left = 192
|
||||||
|
Height = 19
|
||||||
|
Top = 383
|
||||||
|
Width = 138
|
||||||
|
BorderSpacing.Top = 4
|
||||||
|
Caption = 'Animated metronome'
|
||||||
|
OnChange = chkMetronomeChange
|
||||||
|
TabOrder = 12
|
||||||
|
end
|
||||||
|
object chkMarquee: TCheckBox
|
||||||
|
AnchorSideLeft.Control = chkLabelFlashing
|
||||||
|
AnchorSideTop.Control = chkMetronome
|
||||||
|
AnchorSideTop.Side = asrBottom
|
||||||
|
Left = 192
|
||||||
|
Height = 19
|
||||||
|
Top = 406
|
||||||
|
Width = 101
|
||||||
|
BorderSpacing.Top = 4
|
||||||
|
Caption = 'Marquee demo'
|
||||||
|
OnChange = chkMarqueeChange
|
||||||
|
TabOrder = 13
|
||||||
|
end
|
||||||
|
object tmrAnimatedCadence: TTimer
|
||||||
|
Interval = 15
|
||||||
|
OnTimer = tmrAnimatedCadenceTimer
|
||||||
|
Left = 456
|
||||||
|
Top = 128
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,621 @@
|
|||||||
|
unit frmcontrolsample;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
|
||||||
|
StdCtrls, Buttons, uanimationbasic, uanimationcontrol
|
||||||
|
(* Still not working
|
||||||
|
, uanimationbitmap
|
||||||
|
*)
|
||||||
|
;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TfrmAnimationControls }
|
||||||
|
|
||||||
|
TfrmAnimationControls = class(TForm)
|
||||||
|
BitBtn1: TBitBtn;
|
||||||
|
butSliding: TBitBtn;
|
||||||
|
butReverse: TButton;
|
||||||
|
butPause: TButton;
|
||||||
|
butBounceCaption: TButton;
|
||||||
|
butDropDown: TButton;
|
||||||
|
butAlphaBlend: TButton;
|
||||||
|
butZoomTest: TButton;
|
||||||
|
CheckBox1: TCheckBox;
|
||||||
|
chkMetronome: TCheckBox;
|
||||||
|
chkLabelFlashing: TCheckBox;
|
||||||
|
chkMarquee: TCheckBox;
|
||||||
|
grpButtons: TGroupBox;
|
||||||
|
imgFlareMarquee: TImage;
|
||||||
|
Label1: TLabel;
|
||||||
|
lblFPS: TLabel;
|
||||||
|
lblFlashingLabel: TLabel;
|
||||||
|
lblDropDownMessage: TLabel;
|
||||||
|
Label3: TLabel;
|
||||||
|
Label4: TLabel;
|
||||||
|
Label5: TLabel;
|
||||||
|
lblMarqueeText: TLabel;
|
||||||
|
lbSampleEntries: TListBox;
|
||||||
|
Panel1: TPanel;
|
||||||
|
pnlMarquee: TPanel;
|
||||||
|
pnlAttached: TPanel;
|
||||||
|
pnlDropDownContents: TPanel;
|
||||||
|
pnlDropDownHeader: TPanel;
|
||||||
|
pnlDropDown: TPanel;
|
||||||
|
pnlText1: TPanel;
|
||||||
|
pnlCheckbox: TPanel;
|
||||||
|
Shape1: TShape;
|
||||||
|
shpTri1: TShape;
|
||||||
|
shpTri2: TShape;
|
||||||
|
shpSliding: TShape;
|
||||||
|
tmrAnimatedCadence: TTimer;
|
||||||
|
procedure BitBtn1Click(Sender: TObject);
|
||||||
|
procedure butAlphaBlendClick(Sender: TObject);
|
||||||
|
procedure butBounceCaptionClick(Sender: TObject);
|
||||||
|
procedure butDropDownClick(Sender: TObject);
|
||||||
|
procedure butReverseClick(Sender: TObject);
|
||||||
|
procedure butPauseClick(Sender: TObject);
|
||||||
|
procedure butSlidingClick(Sender: TObject);
|
||||||
|
procedure butZoomTestClick(Sender: TObject);
|
||||||
|
procedure CheckBox1Change(Sender: TObject);
|
||||||
|
procedure chkMarqueeChange(Sender: TObject);
|
||||||
|
procedure chkMetronomeChange(Sender: TObject);
|
||||||
|
procedure chkLabelFlashingChange(Sender: TObject);
|
||||||
|
procedure FormCreate(Sender: TObject);
|
||||||
|
procedure FormDestroy(Sender: TObject);
|
||||||
|
procedure FormResize(Sender: TObject);
|
||||||
|
procedure tmrAnimatedCadenceTimer(Sender: TObject);
|
||||||
|
private
|
||||||
|
{ private declarations }
|
||||||
|
AnimationQueue: TAnimationQueue;
|
||||||
|
FDropDownExpandedHeight: Integer;
|
||||||
|
FAnimateTri1: TAnimationControlTranslate;
|
||||||
|
FAnimateTri2: TAnimationControlTranslate;
|
||||||
|
procedure DropPanelEndAnimationCollapse(Sender: TAnimationItem);
|
||||||
|
procedure MetronomeEndAnimation(Sender: TAnimationItem);
|
||||||
|
public
|
||||||
|
{ public declarations }
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationSampleBrushColor }
|
||||||
|
|
||||||
|
TAnimationSampleBrushColor=class(TAnimationCustomControlColor)
|
||||||
|
protected
|
||||||
|
procedure DoChangeColor(const aNewColor: integer); override;
|
||||||
|
public
|
||||||
|
property InitialColor;
|
||||||
|
property FinalColor;
|
||||||
|
property TransitionMode;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
frmAnimationControls: TfrmAnimationControls;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$R *.lfm}
|
||||||
|
|
||||||
|
{ TAnimationSampleBrushColor }
|
||||||
|
|
||||||
|
procedure TAnimationSampleBrushColor.DoChangeColor(const aNewColor: integer);
|
||||||
|
begin
|
||||||
|
// Brush color instead Control.Color
|
||||||
|
(Self.FControl as TShape).Brush.Color:=aNewColor;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TfrmAnimationControls }
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.butBounceCaptionClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
Ef: TAnimationControlCaptionCapital;
|
||||||
|
begin
|
||||||
|
AnimationQueue.RemoveGroupID(butBounceCaption);
|
||||||
|
Ef:=TAnimationControlCaptionCapital.Create(butBounceCaption);
|
||||||
|
{$PUSH}{$HINTS OFF} // Hide hint about use int64
|
||||||
|
Ef.Duration:=50*Length(butBounceCaption.Caption);
|
||||||
|
{$POP}
|
||||||
|
ef.Repeats:=2;
|
||||||
|
ef.AutoReverse:=true;
|
||||||
|
ef.TransitionMode:=eAnimationTransitionBallisticBoth;
|
||||||
|
EF.AnimationOnEndAction:=eAnimationOnEndFree;
|
||||||
|
AnimationQueue.Add(Ef);
|
||||||
|
EF.Start;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.butAlphaBlendClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
lAlphaBlend: TAnimationControlAlphaBlend;
|
||||||
|
begin
|
||||||
|
AnimationQueue.RemoveGroupID(Self);
|
||||||
|
lAlphaBlend:=TAnimationControlAlphaBlend.Create(Self);
|
||||||
|
lAlphaBlend.AnimationOnEndAction:=TAnimationOnEndAction.eAnimationOnEndFree;
|
||||||
|
lAlphaBlend.Duration:=1000;
|
||||||
|
lAlphaBlend.Repeats:=2;
|
||||||
|
lAlphaBlend.AutoReverse:=true;
|
||||||
|
lAlphaBlend.TransitionMode:=TAnimationTransitionMode.eAnimationTransitionLinear;
|
||||||
|
lAlphaBlend.InitialBlend:=255;
|
||||||
|
lAlphaBlend.FinalBlend:=0;
|
||||||
|
lAlphaBlend.FinalizeBehavior:=eAnimationFinalizeBehaviorInitial;
|
||||||
|
AnimationQueue.Add(lAlphaBlend);
|
||||||
|
lAlphaBlend.Start;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.BitBtn1Click(Sender: TObject);
|
||||||
|
(* Still not working
|
||||||
|
var
|
||||||
|
lAnimBitmap: TAnimationControlBitBtnPicture;
|
||||||
|
*)
|
||||||
|
begin
|
||||||
|
(* Still not working
|
||||||
|
AnimationQueue.RemoveGroupID(BitBtn1);
|
||||||
|
lAnimBitmap:=TAnimationControlBitBtnPicture.Create(BitBtn1);
|
||||||
|
lAnimBitmap.AnimationOnEndAction:=TAnimationOnEndAction.eAnimationOnEndFree;
|
||||||
|
lAnimBitmap.Duration:=2000;
|
||||||
|
lAnimBitmap.Repeats:=1;
|
||||||
|
lAnimBitmap.InitialAngle:=0;
|
||||||
|
lAnimBitmap.FinalAngle:=360;
|
||||||
|
|
||||||
|
AnimationQueue.Add(lAnimBitmap);
|
||||||
|
lAnimBitmap.Start;
|
||||||
|
*)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.butDropDownClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
lDropAnimation: TAnimationControlZoom;
|
||||||
|
lDropRotate: TAnimationControlFontRotator;
|
||||||
|
lDropText: TAnimationControlCaptionReplace;
|
||||||
|
lFinalRect: TRect;
|
||||||
|
lList: TFPList;
|
||||||
|
procedure ReverseList(aList: TFPList);
|
||||||
|
var
|
||||||
|
j: integer;
|
||||||
|
begin
|
||||||
|
for j := 0 to Pred(aList.Count) do begin
|
||||||
|
if not TAnimationItem(lList[j]).Reverse then begin
|
||||||
|
//writeln('Can''t reverse now');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
lList:=AnimationQueue.FindGroupID(pnlDropDown);
|
||||||
|
try
|
||||||
|
if lList.Count>0 then begin
|
||||||
|
// Reverse all the related controls
|
||||||
|
ReverseList(lList);
|
||||||
|
lList.Free;
|
||||||
|
lList:=AnimationQueue.FindGroupID(lbSampleEntries);
|
||||||
|
ReverseList(lList);
|
||||||
|
lList.Free;
|
||||||
|
lList:=AnimationQueue.FindGroupID(lblDropDownMessage);
|
||||||
|
ReverseList(lList);
|
||||||
|
end else begin
|
||||||
|
AnimationQueue.RemoveGroupID(pnlDropDown);
|
||||||
|
AnimationQueue.RemoveGroupID(lbSampleEntries);
|
||||||
|
AnimationQueue.RemoveGroupID(lblDropDownMessage);
|
||||||
|
|
||||||
|
lDropAnimation:=TAnimationControlZoom.Create(pnlDropDown);
|
||||||
|
lDropAnimation.AnimationOnEndAction:=TAnimationOnEndAction.eAnimationOnEndFree;
|
||||||
|
lDropAnimation.Duration:=500;
|
||||||
|
lDropAnimation.Repeats:=1;
|
||||||
|
lDropAnimation.TransitionMode:=TAnimationTransitionMode.eAnimationTransitionBallisticBoth;
|
||||||
|
|
||||||
|
lDropRotate:=TAnimationControlFontRotator.Create(lbSampleEntries);
|
||||||
|
lDropRotate.AnimationOnEndAction:=TAnimationOnEndAction.eAnimationOnEndFree;
|
||||||
|
lDropRotate.Duration:=lDropAnimation.Duration;
|
||||||
|
lDropRotate.Repeats:=lDropAnimation.Repeats;
|
||||||
|
lDropRotate.TransitionMode:=TAnimationTransitionMode.eAnimationTransitionLinear;
|
||||||
|
|
||||||
|
lDropText:=TAnimationControlCaptionReplace.Create(lblDropDownMessage);
|
||||||
|
lDropText.AnimationOnEndAction:=TAnimationOnEndAction.eAnimationOnEndFree;
|
||||||
|
lDropText.Duration:=lDropAnimation.Duration;
|
||||||
|
lDropText.Repeats:=lDropAnimation.Repeats;
|
||||||
|
lDropText.TransitionMode:=TAnimationTransitionMode.eAnimationTransitionLinear;
|
||||||
|
|
||||||
|
if butDropDown.Tag=0 then begin
|
||||||
|
//writeln('Collapse');
|
||||||
|
// DropDown panel is expanded
|
||||||
|
// Store current height to recover when expand
|
||||||
|
if FDropDownExpandedHeight=0 then begin
|
||||||
|
FDropDownExpandedHeight:=pnlDropDown.Height;
|
||||||
|
end;
|
||||||
|
butDropDown.Caption:='_';
|
||||||
|
lFinalRect:=pnlDropDown.BoundsRect;
|
||||||
|
lFinalRect.Bottom:=pnlDropDownHeader.Height+pnlDropDown.Top;
|
||||||
|
|
||||||
|
lDropAnimation.SetFinalSize(lFinalRect);
|
||||||
|
lDropAnimation.OnAnimationEnd:=@DropPanelEndAnimationCollapse;
|
||||||
|
|
||||||
|
lDropRotate.InitialAngle:=0;
|
||||||
|
lDropRotate.FinalAngle:=90;
|
||||||
|
|
||||||
|
lDropText.FinalText:='Now press the button again to expand the panel.';
|
||||||
|
|
||||||
|
end else begin
|
||||||
|
//writeln('Expand');
|
||||||
|
butDropDown.Caption:='^';
|
||||||
|
lFinalRect:=pnlDropDown.BoundsRect;
|
||||||
|
lFinalRect.Bottom:=FDropDownExpandedHeight+pnlDropDown.Top;
|
||||||
|
lDropAnimation.SetFinalSize(lFinalRect);
|
||||||
|
lDropAnimation.OnAnimationEnd:=@DropPanelEndAnimationCollapse;
|
||||||
|
|
||||||
|
lDropRotate.InitialAngle:=90;
|
||||||
|
lDropRotate.FinalAngle:=0;
|
||||||
|
|
||||||
|
pnlDropDownContents.Enabled:=true;
|
||||||
|
|
||||||
|
lDropText.FinalText:='Press the button to collapse the panel below.';
|
||||||
|
|
||||||
|
end;
|
||||||
|
AnimationQueue.Add(lDropAnimation);
|
||||||
|
AnimationQueue.Add(lDropRotate);
|
||||||
|
AnimationQueue.Add(lDropText);
|
||||||
|
lDropAnimation.Start;
|
||||||
|
lDropRotate.Start;
|
||||||
|
lDropText.Start;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
lList.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.DropPanelEndAnimationCollapse(
|
||||||
|
Sender: TAnimationItem);
|
||||||
|
begin
|
||||||
|
// Disable contents so controls will not be reached by tabstop even when
|
||||||
|
// its visual size is zero.
|
||||||
|
if Sender.Reversed then begin
|
||||||
|
if butDropDown.Tag=1 then begin
|
||||||
|
// Reversed expansion, disable again
|
||||||
|
//writeln('End reversed expand');
|
||||||
|
pnlDropDownContents.Enabled:=false;
|
||||||
|
end else begin
|
||||||
|
// Reversed collapse, do nothing
|
||||||
|
//writeln('End reversed collapse');
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
if butDropDown.Tag=1 then begin
|
||||||
|
// Finished expansion
|
||||||
|
//writeln('End expand');
|
||||||
|
butDropDown.Tag:=0;
|
||||||
|
end else begin
|
||||||
|
// Finished collapse
|
||||||
|
//writeln('End collapse');
|
||||||
|
butDropDown.Tag:=1;
|
||||||
|
pnlDropDownContents.Enabled:=false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.butReverseClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
AnimationQueue.Reversed:=not AnimationQueue.Reversed;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.butPauseClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
AnimationQueue.Paused:=not AnimationQueue.Paused;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.butSlidingClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
Button: TAnimationControlTranslate;
|
||||||
|
Zoom: TAnimationControlZoom;
|
||||||
|
lList: TFPList;
|
||||||
|
begin
|
||||||
|
lList:=AnimationQueue.FindGroupID(butSliding);
|
||||||
|
try
|
||||||
|
if lList.Count>0 then begin
|
||||||
|
// Do not start new animation until current finish.
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
Button:=TAnimationControlTranslate.Create(butSliding);
|
||||||
|
Button.Duration:=1500;
|
||||||
|
Button.Repeats:=4;
|
||||||
|
Button.AnimationOnEndAction:=eAnimationOnEndFree;
|
||||||
|
Button.AutoReverse:=true;
|
||||||
|
Button.SetFinalPosition(Point(shpSliding.Left+shpSliding.Width-butSliding.Width,butSliding.Top));
|
||||||
|
Button.AnchorLocation:=eAnimationAnchorLocationLeft;
|
||||||
|
Button.FreeWithQueue:=true;
|
||||||
|
Button.TransitionMode:=eAnimationTransitionBallisticBoth;
|
||||||
|
Button.FinalizeBehavior:=eAnimationFinalizeBehaviorInitial;
|
||||||
|
AnimationQueue.Add(Button);
|
||||||
|
|
||||||
|
Zoom:=TAnimationControlZoom.Create(butSliding);
|
||||||
|
Zoom.Duration:=750;
|
||||||
|
Zoom.Repeats:=2;
|
||||||
|
Zoom.AutoReverse:=true;
|
||||||
|
Zoom.AnimationOnEndAction:=eAnimationOnEndFree;
|
||||||
|
Zoom.SetFinalZoom(0.1);
|
||||||
|
Zoom.FreeWithQueue:=true;
|
||||||
|
Zoom.ZoomMode:=eAnimationZoomModeHeightBottom;
|
||||||
|
Zoom.FinalizeBehavior:=eAnimationFinalizeBehaviorInitial;
|
||||||
|
Zoom.RemoveAnchors:=true;
|
||||||
|
Button.AddSyncStartStopAnimation(Zoom); //Synchronize restart/reverse action for Zoom when button restarts.
|
||||||
|
//This can cause problems with Repeats counter
|
||||||
|
AnimationQueue.Add(Zoom);
|
||||||
|
|
||||||
|
Button.Start;
|
||||||
|
Zoom.Start;
|
||||||
|
finally
|
||||||
|
lList.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.butZoomTestClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
butAnim: TAnimationControlZoom;
|
||||||
|
begin
|
||||||
|
// All animation references to butZoomTest must be removed
|
||||||
|
// before as in the creation process we capture the current
|
||||||
|
// dimensions. Removing ID before creation of new animation
|
||||||
|
// first finalizes control and then captures original dimensions.
|
||||||
|
// If not done this way starting butZoomTest dimensions will be
|
||||||
|
// the current Zoom factor which is almost always small.
|
||||||
|
AnimationQueue.RemoveGroupID(butZoomTest);
|
||||||
|
butAnim:=TAnimationControlZoom.Create(butZoomTest);
|
||||||
|
butAnim.SetFinalZoom(0.25);
|
||||||
|
butAnim.ZoomMode:=TAnimationZoomMode.eAnimationZoomModeAll;
|
||||||
|
butAnim.TransitionMode:=TAnimationTransitionMode.eAnimationTransitionLinear;
|
||||||
|
butAnim.AutoReverse:=true;
|
||||||
|
butAnim.Repeats:=2;
|
||||||
|
butAnim.AnimationOnEndAction:=TAnimationOnEndAction.eAnimationOnEndFree;
|
||||||
|
butAnim.Duration:=100;
|
||||||
|
butAnim.GroupID:=butZoomTest;
|
||||||
|
AnimationQueue.Add(butAnim,true);
|
||||||
|
butAnim.Start;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.CheckBox1Change(Sender: TObject);
|
||||||
|
var
|
||||||
|
CheckboxAnim: TAnimationControlZoom;
|
||||||
|
LightAnim: TAnimationControlColor;
|
||||||
|
begin
|
||||||
|
AnimationQueue.RemoveGroupID(CheckBox1);
|
||||||
|
|
||||||
|
CheckboxAnim:=TAnimationControlZoom.Create(CheckBox1);
|
||||||
|
CheckboxAnim.SetFinalZoom(0.25);
|
||||||
|
CheckboxAnim.ZoomMode:=TAnimationZoomMode.eAnimationZoomModeWidthLeft;
|
||||||
|
CheckboxAnim.TransitionMode:=TAnimationTransitionMode.eAnimationTransitionLinear;
|
||||||
|
CheckboxAnim.AutoReverse:=true;
|
||||||
|
CheckboxAnim.Repeats:=2;
|
||||||
|
CheckboxAnim.AnimationOnEndAction:=TAnimationOnEndAction.eAnimationOnEndFree;
|
||||||
|
CheckboxAnim.Duration:=250;
|
||||||
|
AnimationQueue.Add(CheckboxAnim,true);
|
||||||
|
CheckboxAnim.Start;
|
||||||
|
|
||||||
|
|
||||||
|
LightAnim:=TAnimationControlColor.Create(pnlCheckbox);
|
||||||
|
LightAnim.InitialColor:=ColorToRGB(clBtnFace);
|
||||||
|
LightAnim.FinalColor:=$00FF00;
|
||||||
|
LightAnim.TransitionMode:=TAnimationTransitionMode.eAnimationTransitionBallisticOut;
|
||||||
|
LightAnim.AutoReverse:=true;
|
||||||
|
LightAnim.Repeats:=2;
|
||||||
|
LightAnim.AnimationOnEndAction:=TAnimationOnEndAction.eAnimationOnEndFree;
|
||||||
|
LightAnim.Duration:=150;
|
||||||
|
LightAnim.FinalizeBehavior:=eAnimationFinalizeBehaviorInitial;
|
||||||
|
AnimationQueue.Add(LightAnim);
|
||||||
|
LightAnim.Start;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.chkMarqueeChange(Sender: TObject);
|
||||||
|
var
|
||||||
|
lMarqueeBackground: TAnimationControlTranslate;
|
||||||
|
lList: TFPList;
|
||||||
|
begin
|
||||||
|
lList:=AnimationQueue.FindGroupID(imgFlareMarquee);
|
||||||
|
try
|
||||||
|
if lList.Count=0 then exit;
|
||||||
|
lMarqueeBackground:=TObject(lList[0]) as TAnimationControlTranslate;
|
||||||
|
if chkMarquee.Checked then begin
|
||||||
|
if lMarqueeBackground.State=eAnimationStatePaused then begin
|
||||||
|
lMarqueeBackground.Pause;
|
||||||
|
end else begin
|
||||||
|
lMarqueeBackground.Start;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
lMarqueeBackground.Pause;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
lList.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.chkMetronomeChange(Sender: TObject);
|
||||||
|
var
|
||||||
|
TriangleColor1,TriangleColor2: TAnimationSampleBrushColor;
|
||||||
|
begin
|
||||||
|
if not chkMetronome.Checked then begin
|
||||||
|
AnimationQueue.RemoveGroupID(shpTri1);
|
||||||
|
AnimationQueue.RemoveGroupID(shpTri2);
|
||||||
|
end else begin
|
||||||
|
FAnimateTri1:=TAnimationControlTranslate.Create(shpTri1);
|
||||||
|
FAnimateTri1.Duration:=1000;
|
||||||
|
FAnimateTri1.AnimationOnEndAction:=eAnimationOnEndStop;
|
||||||
|
FAnimateTri1.AutoReverse:=true;
|
||||||
|
FAnimateTri1.Repeats:=2;
|
||||||
|
FAnimateTri1.SetInitialPosition(Point((Self.Width div 2)-shpTri1.Width,shpTri1.Top));
|
||||||
|
FAnimateTri1.SetFinalPosition(Point(0,shpTri1.Top));
|
||||||
|
FAnimateTri1.FreeWithQueue:=true;
|
||||||
|
FAnimateTri1.TransitionMode:=eAnimationTransitionBallisticIn;
|
||||||
|
FAnimateTri1.FinalizeBehavior:=eAnimationFinalizeBehaviorInitial;
|
||||||
|
FAnimateTri1.OnAnimationEnd:=@MetronomeEndAnimation;
|
||||||
|
AnimationQueue.Add(FAnimateTri1);
|
||||||
|
|
||||||
|
TriangleColor1:=TAnimationSampleBrushColor.Create(shpTri1);
|
||||||
|
TriangleColor1.Duration:=2000;
|
||||||
|
TriangleColor1.AnimationOnEndAction:=eAnimationOnEndStop;
|
||||||
|
TriangleColor1.AutoReverse:=false;
|
||||||
|
TriangleColor1.Repeats:=1;
|
||||||
|
TriangleColor1.InitialColor:=ColorToRGB(clRed);
|
||||||
|
TriangleColor1.FinalColor:=ColorToRGB(clWhite);
|
||||||
|
TriangleColor1.FreeWithQueue:=true;
|
||||||
|
TriangleColor1.TransitionMode:=eAnimationTransitionBallisticOut;
|
||||||
|
AnimationQueue.Add(TriangleColor1);
|
||||||
|
|
||||||
|
FAnimateTri2:=TAnimationControlTranslate.Create(shpTri2);
|
||||||
|
FAnimateTri2.Duration:=1000;
|
||||||
|
FAnimateTri2.AnimationOnEndAction:=eAnimationOnEndStop;
|
||||||
|
FAnimateTri2.AutoReverse:=true;
|
||||||
|
FAnimateTri2.Repeats:=2;
|
||||||
|
FAnimateTri2.SetInitialPosition(Point((Self.Width div 2),shpTri2.Top));
|
||||||
|
FAnimateTri2.SetFinalPosition(Point(Self.Width-shpTri2.Width,shpTri2.Top));
|
||||||
|
FAnimateTri2.FreeWithQueue:=true;
|
||||||
|
FAnimateTri2.TransitionMode:=eAnimationTransitionBallisticIn;
|
||||||
|
FAnimateTri2.FinalizeBehavior:=eAnimationFinalizeBehaviorInitial;
|
||||||
|
FAnimateTri2.OnAnimationEnd:=@MetronomeEndAnimation;
|
||||||
|
AnimationQueue.Add(FAnimateTri2);
|
||||||
|
|
||||||
|
TriangleColor2:=TAnimationSampleBrushColor.Create(shpTri2);
|
||||||
|
TriangleColor2.Duration:=2000;
|
||||||
|
TriangleColor2.AnimationOnEndAction:=eAnimationOnEndStop;
|
||||||
|
TriangleColor2.AutoReverse:=false;
|
||||||
|
TriangleColor2.Repeats:=1;
|
||||||
|
TriangleColor2.InitialColor:=ColorToRGB(clRed);
|
||||||
|
TriangleColor2.FinalColor:=ColorToRGB(clWhite);
|
||||||
|
TriangleColor2.FreeWithQueue:=true;
|
||||||
|
TriangleColor2.TransitionMode:=eAnimationTransitionBallisticOut;
|
||||||
|
AnimationQueue.Add(TriangleColor2);
|
||||||
|
|
||||||
|
TriangleColor1.Start;
|
||||||
|
FAnimateTri1.Start;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.chkLabelFlashingChange(Sender: TObject);
|
||||||
|
var
|
||||||
|
lFlashing: TAnimationControlColor;
|
||||||
|
lList: TFPList;
|
||||||
|
begin
|
||||||
|
if TCheckBox(Sender).Checked then begin
|
||||||
|
AnimationQueue.RemoveGroupID(lblFlashingLabel);
|
||||||
|
lFlashing:=TAnimationControlColor.Create(lblFlashingLabel);
|
||||||
|
lFlashing.Duration:=1000;
|
||||||
|
lFlashing.InitialColor:=ColorToRGB(clBtnFace);
|
||||||
|
lFlashing.FinalColor:=ColorToRGB(TColor($000000FF));
|
||||||
|
lFlashing.AutoReverse:=true;
|
||||||
|
lFlashing.Repeats:=0; // infinite
|
||||||
|
lFlashing.FinalizeBehavior:=eAnimationFinalizeBehaviorInitial;
|
||||||
|
AnimationQueue.Add(lFlashing);
|
||||||
|
lFlashing.Start;
|
||||||
|
end else begin
|
||||||
|
lList:=AnimationQueue.FindGroupID(lblFlashingLabel);
|
||||||
|
try
|
||||||
|
if lList.Count>0 then begin
|
||||||
|
lFlashing:=TObject(lList[0]) as TAnimationControlColor;
|
||||||
|
lFlashing.FinalizeASAP(true);
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
lList.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.FormCreate(Sender: TObject);
|
||||||
|
var
|
||||||
|
Button: TAnimationControlTranslate;
|
||||||
|
MarqueeBackground: TAnimationControlTranslate;
|
||||||
|
begin
|
||||||
|
AnimationQueue:=TAnimationQueue.Create;
|
||||||
|
|
||||||
|
Button:=TAnimationControlTranslate.Create(butPause);
|
||||||
|
Button.Duration:=2000;
|
||||||
|
Button.AnimationOnEndAction:=eAnimationOnEndFree;
|
||||||
|
Button.AutoReverse:=false;
|
||||||
|
Button.Repeats:=1;
|
||||||
|
Button.SetFinalPosition(Point(0,butPause.Top));
|
||||||
|
Button.AnchorLocation:=eAnimationAnchorLocationCenter;
|
||||||
|
Button.SwapOriginWithFinal;
|
||||||
|
Button.FreeWithQueue:=true;
|
||||||
|
Button.TransitionMode:=eAnimationTransitionBallisticIn;
|
||||||
|
AnimationQueue.Add(Button);
|
||||||
|
|
||||||
|
AnimationQueue.Start(true);
|
||||||
|
|
||||||
|
MarqueeBackground:=TAnimationControlTranslate.Create(imgFlareMarquee);
|
||||||
|
MarqueeBackground.Duration:=Trunc(imgFlareMarquee.Parent.Width*10);
|
||||||
|
MarqueeBackground.AnimationOnEndAction:=eAnimationOnEndFree;
|
||||||
|
MarqueeBackground.AutoReverse:=false;
|
||||||
|
MarqueeBackground.Repeats:=0;
|
||||||
|
MarqueeBackground.SetInitialPosition(Point(imgFlareMarquee.Width*-1,0));
|
||||||
|
MarqueeBackground.SetFinalPosition(Point(imgFlareMarquee.Parent.Width,0));
|
||||||
|
MarqueeBackground.AnchorLocation:=eAnimationAnchorLocationCenter;
|
||||||
|
MarqueeBackground.FreeWithQueue:=true;
|
||||||
|
MarqueeBackground.TransitionMode:=eAnimationTransitionLinear;
|
||||||
|
AnimationQueue.Add(MarqueeBackground);
|
||||||
|
MarqueeBackground.Stop;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.FormDestroy(Sender: TObject);
|
||||||
|
begin
|
||||||
|
FreeAndNil(AnimationQueue);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.FormResize(Sender: TObject);
|
||||||
|
var
|
||||||
|
lAnimations: TFPList;
|
||||||
|
lFlareAnimation: TAnimationControlTranslate;
|
||||||
|
begin
|
||||||
|
// Find the animation related to imgFlareMarquee
|
||||||
|
lAnimations:=AnimationQueue.FindGroupID(imgFlareMarquee);
|
||||||
|
try
|
||||||
|
if lAnimations.Count=0 then begin
|
||||||
|
// Not found ? Exit
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
try
|
||||||
|
lFlareAnimation:=TObject(lAnimations[0]) as TAnimationControlTranslate;
|
||||||
|
// Now readjust final position and animation duration
|
||||||
|
// Changing duration we get a constant speed, but better is constant time in this case.
|
||||||
|
//lFlareAnimation.Duration:=Trunc(lFlareAnimation.Control.Parent.Width*10);
|
||||||
|
lFlareAnimation.SetFinalPosition(Point(lFlareAnimation.Control.Parent.Width,lFlareAnimation.Control.Top));
|
||||||
|
except
|
||||||
|
// Eat exceptions, so program will not break if something
|
||||||
|
// goes really wrong.
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
lAnimations.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.MetronomeEndAnimation(Sender: TAnimationItem);
|
||||||
|
var
|
||||||
|
lList: TFPList=nil;
|
||||||
|
j: integer;
|
||||||
|
A: TAnimationItem;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
if Sender=FAnimateTri1 then begin
|
||||||
|
lList:=AnimationQueue.FindGroupID(shpTri2);
|
||||||
|
end else begin
|
||||||
|
lList:=AnimationQueue.FindGroupID(shpTri1);
|
||||||
|
end;
|
||||||
|
for j := 0 to Pred(lList.Count) do begin
|
||||||
|
A:=TAnimationItem(lList[j]);
|
||||||
|
A.Start;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
lList.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TfrmAnimationControls.tmrAnimatedCadenceTimer(Sender: TObject);
|
||||||
|
begin
|
||||||
|
Self.DisableAlign;
|
||||||
|
AnimationQueue.Animate;
|
||||||
|
Self.EnableAlign;
|
||||||
|
// Adding Self.Invalidate improves smooth animation but can make
|
||||||
|
// the form less responsive in low power machines.
|
||||||
|
// When used removes some animation artifacts in controls translation.
|
||||||
|
//Self.Invalidate;
|
||||||
|
lblFPS.Caption:=format('FPS: %.2f',[AnimationQueue.AverageFPS]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
864
components/Comba_Animation/src/uanimationbasic.pas
Normal file
864
components/Comba_Animation/src/uanimationbasic.pas
Normal file
@ -0,0 +1,864 @@
|
|||||||
|
unit uanimationbasic;
|
||||||
|
|
||||||
|
(*
|
||||||
|
Comba - Animation main module
|
||||||
|
-----------------------------
|
||||||
|
@Licence: (c) 2017 José Mejuto // joshyfun at gmail.com
|
||||||
|
@Licence: LGPL when compiled with FPC (Free Pascal), GNU GPL V3 in other cases.
|
||||||
|
@Links:
|
||||||
|
GPL: https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||||
|
LGPL: https://www.gnu.org/licenses/lgpl-3.0.en.html
|
||||||
|
|
||||||
|
@Description:
|
||||||
|
|
||||||
|
This file implements an animation queue and animation item base class.
|
||||||
|
|
||||||
|
*)
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, Graphics, math;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
TAnimationTransitionMode=(eAnimationTransitionLinear,eAnimationTransitionBallisticIn,eAnimationTransitionBallisticOut,eAnimationTransitionBallisticBoth,eAnimationTransitionBallisticEdge);
|
||||||
|
TAnimationFinalizeBehavior=(eAnimationFinalizeBehaviorCurrent,eAnimationFinalizeBehaviorInitial,eAnimationFinalizeBehaviorFinal);
|
||||||
|
|
||||||
|
TAnimationOnEndAction=(eAnimationOnEndStop,eAnimationOnEndFree);
|
||||||
|
TAnimationState=(eAnimationStateStopped,eAnimationStateStarted,eAnimationStatePaused,eAnimationStateToBeFreed);
|
||||||
|
|
||||||
|
TAnimationItem=class;
|
||||||
|
|
||||||
|
TAnimationOnPerform=procedure (const aElapedMilliseconds: int64) of object;
|
||||||
|
TAnimationOnAnimationEnd=procedure (Sender: TAnimationItem) of object;
|
||||||
|
TAnimationQueue=class;
|
||||||
|
TAnimationException=class(Exception);
|
||||||
|
|
||||||
|
{ TAnimationItem }
|
||||||
|
|
||||||
|
TAnimationItem=class(TObject)
|
||||||
|
private
|
||||||
|
FFinalizeASAPMode: integer;
|
||||||
|
FUserData: Pointer;
|
||||||
|
FOnPerform: TAnimationOnPerform;
|
||||||
|
FOnAnimationEnd: TAnimationOnAnimationEnd;
|
||||||
|
FFreeWithQueue: Boolean;
|
||||||
|
FDuration: int64;
|
||||||
|
FGroupID: pointer;
|
||||||
|
FAnimationOnEndAction: TAnimationOnEndAction;
|
||||||
|
FTransitionMode: TAnimationTransitionMode;
|
||||||
|
FReverse: Boolean;
|
||||||
|
FRepeats: integer;
|
||||||
|
FAutoReverse: Boolean;
|
||||||
|
FFinalizeBehavior: TAnimationFinalizeBehavior;
|
||||||
|
procedure SetReverse(aValue: Boolean);
|
||||||
|
protected
|
||||||
|
FState: TAnimationState;
|
||||||
|
FStartTick: int64;
|
||||||
|
FPauseTick: int64;
|
||||||
|
FQueue: TAnimationQueue;
|
||||||
|
FStartStopSynchAnimationList: TFPList;
|
||||||
|
FRepeated: integer;
|
||||||
|
FFinalizeAnimation: Boolean;
|
||||||
|
(* TransitionMode: (TAnimationTransitionMode) Linear or "curved" transition between animation values
|
||||||
|
eAnimationTransitionLinear: Transition is linear in time.
|
||||||
|
eAnimationTransitionBallisticIn: Fast -> Slow
|
||||||
|
eAnimationTransitionBallisticOut: Slow -> Fast
|
||||||
|
eAnimationTransitionBallisticBoth: Slow -> Fast -> Slow
|
||||||
|
eAnimationTransitionBallisticEdge: Fast -> Slow -> Fast
|
||||||
|
|
||||||
|
Calculations are done in CalculateLinearPosition.
|
||||||
|
|
||||||
|
@Note: This transitions are not fine right now as some transitios
|
||||||
|
are quite difficult to distinguish from others. It will be
|
||||||
|
fixed in the future.
|
||||||
|
*)
|
||||||
|
property TransitionMode: TAnimationTransitionMode read FTransitionMode write FTransitionMode;
|
||||||
|
(* Calculate linear position is the default functions to calculate current
|
||||||
|
animation value based in a source and a target value using the elapsed
|
||||||
|
time. Derived classes can use it or define a new ones with different
|
||||||
|
signatures and names *)
|
||||||
|
function CalculateLinearPosition(const aSource,aTarget: integer; const aElapsedMilliseconds,aDuration: int64): integer; overload;
|
||||||
|
function CalculateLinearPosition(const aSource,aTarget: Single; const aElapsedMilliseconds,aDuration: int64): Single; overload;
|
||||||
|
|
||||||
|
(* Overridable
|
||||||
|
DoInitialize: This method is called when animation starts or restarts.
|
||||||
|
*)
|
||||||
|
procedure DoInitialize; virtual;
|
||||||
|
(* Overridable
|
||||||
|
DoPerform: In this method derived classes must perform the calculations
|
||||||
|
needed for the animation
|
||||||
|
*)
|
||||||
|
procedure DoPerform; virtual;
|
||||||
|
(* Overridable
|
||||||
|
DoFinalizeAnimation: Method called when animation is about to be finished.
|
||||||
|
Useful to set EXACT values for final animation based on
|
||||||
|
TAnimationFinalizeBehavior
|
||||||
|
*)
|
||||||
|
procedure DoFinalizeAnimation; virtual;
|
||||||
|
(* Animate: Do some calcs and call DoPerform *)
|
||||||
|
procedure Animate;
|
||||||
|
(* ProcessAnimationEnd: Adjust some values to end an animation *)
|
||||||
|
procedure ProcessAnimationEnd;
|
||||||
|
(* FinalizeBehavior: (TAnimationFinalizeBehavior) Which value is expected when animation ends ?
|
||||||
|
eAnimationFinalizeBehaviorCurrent: Respects actual values, whichever it be
|
||||||
|
eAnimationFinalizeBehaviorFinal: (default) At end it is the final value
|
||||||
|
eAnimationFinalizeBehaviorInitial: At end the values is initial value.
|
||||||
|
|
||||||
|
This set is quite important when playing animations in with AutoReverse and when
|
||||||
|
reversing animations using Reverse()
|
||||||
|
*)
|
||||||
|
property FinalizeBehavior: TAnimationFinalizeBehavior read FFinalizeBehavior write FFinalizeBehavior;
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
|
(* UserData: carries a pointer to user data *)
|
||||||
|
property UserData: Pointer read FUserData write FUserData;
|
||||||
|
(* OnPerform: This event will be called instead class
|
||||||
|
perform if assigned *)
|
||||||
|
property OnPerform: TAnimationOnPerform read FOnPerform write FOnPerform;
|
||||||
|
(* OnAnimationEnd: This event will be called when animation ends *)
|
||||||
|
property OnAnimationEnd: TAnimationOnAnimationEnd read FOnAnimationEnd write FOnAnimationEnd;
|
||||||
|
(* FreeWithQueue: The TAnimationItem will be freed when the Queue is destroyed *)
|
||||||
|
property FreeWithQueue: Boolean read FFreeWithQueue write FFreeWithQueue;
|
||||||
|
(* Duration: How many milliseconds will the animation take *)
|
||||||
|
property Duration: int64 read FDuration write FDuration;
|
||||||
|
(* Reversed: Is animation being played in reverse time ? *)
|
||||||
|
property Reversed: Boolean read FReverse write SetReverse;
|
||||||
|
(*
|
||||||
|
AnimationOnEndAction: What happends when animation is finished:
|
||||||
|
eAnimationOnEndStop: (Default) The animation just finish
|
||||||
|
eAnimationOnEndFree: The animation finished and then the object is freed
|
||||||
|
*)
|
||||||
|
property AnimationOnEndAction: TAnimationOnEndAction read FAnimationOnEndAction write FAnimationOnEndAction;
|
||||||
|
(* AutoReverse: When animation reaches the end it will be played in reverse
|
||||||
|
order if there are enought Repeats to be played *)
|
||||||
|
property AutoReverse: Boolean read FAutoReverse write FAutoReverse;
|
||||||
|
(* Repeats: How many times the animation should be repeated.
|
||||||
|
0 = means infinite *)
|
||||||
|
property Repeats: integer read FRepeats write FRepeats;
|
||||||
|
(* GroupID: Pointer with an identifier to select a group of animations
|
||||||
|
from the queue. This is useful in example when animating controls
|
||||||
|
as all animations related to a control will share the same GroupID
|
||||||
|
which could be the memory address of the control *)
|
||||||
|
property GroupID: pointer read FGroupID write FGroupID;
|
||||||
|
(*
|
||||||
|
State: The animation play state (TAnimationState)
|
||||||
|
eAnimationStateStopped: Animation in stopped state
|
||||||
|
eanimationStateStarted: Animation is running
|
||||||
|
eAnimationStatePaused: Animation is paused
|
||||||
|
eAnimationStateToBeFreed: Animation is stopped and waiting to be freed
|
||||||
|
*)
|
||||||
|
property State: TAnimationState read FState;
|
||||||
|
(* GetElapsedMilliseconds: Returns the animation elapsed milliseconds *)
|
||||||
|
function GetElapsedMilliseconds: int64;
|
||||||
|
(*
|
||||||
|
FinalizeASAP: Finalizes an animation as soon as possible but waiting the
|
||||||
|
needed time to complete the programmed animation time.
|
||||||
|
@Parameters:
|
||||||
|
aReverseIfNeeded: If True and animation is running in forward mode, it
|
||||||
|
will wait to be run in reverse mode to stop it.
|
||||||
|
*)
|
||||||
|
procedure FinalizeASAP(const aReverseIfNeeded: Boolean=true);
|
||||||
|
(*
|
||||||
|
Reverse: Reverses current animation direction.
|
||||||
|
@Parameters:
|
||||||
|
aReverseFinalBehavior: If True Initial and Final behavior will be interchanged.
|
||||||
|
*)
|
||||||
|
function Reverse(const aReverseFinalBehavior: Boolean=true): Boolean;
|
||||||
|
(* Perform: Just perform the animation *)
|
||||||
|
procedure Perform;
|
||||||
|
(* Start: Starts animation *)
|
||||||
|
procedure Start;
|
||||||
|
(* Pause: Pauses animation *)
|
||||||
|
procedure Pause;
|
||||||
|
(* Stop: Stops animation *)
|
||||||
|
procedure Stop;
|
||||||
|
(* AddSyncStartStopAnimation: When this objects reaches the animation end, in forward
|
||||||
|
or reverse mode, animations added with this function will
|
||||||
|
be reversed or restarted at the same time. This is useful
|
||||||
|
to synchronize some animations for large repeats *)
|
||||||
|
procedure AddSyncStartStopAnimation(const aAnimationItem: TAnimationItem);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationQueue }
|
||||||
|
|
||||||
|
TAnimationQueue=class(TObject)
|
||||||
|
private
|
||||||
|
FTick: int64;
|
||||||
|
function GetAverageFPS: single;
|
||||||
|
function GetPaused: Boolean;
|
||||||
|
procedure SetPaused(AValue: Boolean);
|
||||||
|
procedure SetReverse(aValue: Boolean);
|
||||||
|
protected
|
||||||
|
type
|
||||||
|
TAnimationQueueState=(eAnimationQueueStopped,eAnimationQueueStarted,eAnimationQueuePaused);
|
||||||
|
protected
|
||||||
|
FState: TAnimationQueueState;
|
||||||
|
FFramesCounter: integer;
|
||||||
|
FStartTick: int64;
|
||||||
|
FReverse: Boolean;
|
||||||
|
FPauseElapsed: int64;
|
||||||
|
FAnimationItems: TFPList;
|
||||||
|
function GetAnimationTick: int64;
|
||||||
|
function intfGetTickCount64: int64; inline;
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
|
(* Start: Starts the animation
|
||||||
|
|
||||||
|
@Parameters:
|
||||||
|
aStartQueuedAnimations: If True it starts all animations already in the queue
|
||||||
|
|
||||||
|
@Note: There is no Stop procedure because not calling "Animate" is just a stop. *)
|
||||||
|
procedure Start(const aStartQueuedAnimations: Boolean=false);
|
||||||
|
(* Pause: Pauses animation. It can be unpaused calling it again *)
|
||||||
|
procedure Pause;
|
||||||
|
(* Reverse: Reverses all animations in queue *)
|
||||||
|
procedure Reverse;
|
||||||
|
(* Animate: Animate all objects in the queue. It is the main heartbeat *)
|
||||||
|
procedure Animate; virtual;
|
||||||
|
(* Paint: Animate just only the supplied animation
|
||||||
|
@Parameters:
|
||||||
|
aPerformItem: The animation to be animated :-)
|
||||||
|
*)
|
||||||
|
procedure Paint(const aPerformItem: TAnimationItem);
|
||||||
|
(* Add: Adds one animation to the queue
|
||||||
|
@Parameters:
|
||||||
|
aAnimationItem: The animation to be added
|
||||||
|
aRemoveSameID: Before adding it removes all animations in the queue
|
||||||
|
with the same GroupID, if GroupID is different than nil
|
||||||
|
*)
|
||||||
|
procedure Add(const aAnimationItem: TAnimationItem; const aRemoveSameGroupID: Boolean=false); virtual;
|
||||||
|
(* Remove: Removes one animation from the queue
|
||||||
|
@Parameters:
|
||||||
|
aAnimationItem: The animation to be removed. If animation to be removed
|
||||||
|
has been selected to be freed on stop it will be automatically freed.
|
||||||
|
*)
|
||||||
|
procedure Remove(const aAnimationItem: TAnimationItem); virtual;
|
||||||
|
(* GetAbsoluteAnimationClock: Milliseconds since animation start *)
|
||||||
|
function GetAbsoluteAnimationClock: int64;
|
||||||
|
(* RemoveGroupID: Removes all animations with a given GroupID
|
||||||
|
@Parameters:
|
||||||
|
aClass: It can filter and remove only GroupID animations of the given class
|
||||||
|
*)
|
||||||
|
function RemoveGroupID(const aID: pointer; const aClass: TClass=nil): integer;
|
||||||
|
(* FindGroupID: Returns a TFPList containing all animations of a given GroupID
|
||||||
|
|
||||||
|
@Parameters:
|
||||||
|
aGroupID: The ID of the group to be returned.
|
||||||
|
|
||||||
|
@Note: Programmer must free the TFPList returned
|
||||||
|
*)
|
||||||
|
function FindGroupID(const aGroupID: pointer): TFPList;
|
||||||
|
(* AverageFPS: Returns average animations per second since animation start *)
|
||||||
|
property AverageFPS: single read GetAverageFPS;
|
||||||
|
(* Reversed: Is the animation being played in reverse time ? *)
|
||||||
|
property Reversed: Boolean read FReverse write SetReverse;
|
||||||
|
(* Paused: Is animation in pause state ? *)
|
||||||
|
property Paused: Boolean read GetPaused write SetPaused;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{$IFDEF WINDOWS}
|
||||||
|
Uses windows; //For QueryPerformanceCounter only and it is not a must.
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
resourcestring
|
||||||
|
rs_AnimationInOtherQueue='The animation is already in other queue.';
|
||||||
|
|
||||||
|
const
|
||||||
|
TFINALIZEASAPMODE_NONE=0;
|
||||||
|
TFINALIZEASAPMODE_NOW=1;
|
||||||
|
TFINALIZEASAPMODE_NEXT=2;
|
||||||
|
TFINALIZEASAPMODE_REVERSED=3;
|
||||||
|
|
||||||
|
type
|
||||||
|
TSplinePoint=record
|
||||||
|
x,y: single;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function SplinePoint(x,y: single): TSplinePoint;
|
||||||
|
begin
|
||||||
|
Result.x:=x;
|
||||||
|
Result.y:=y;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function CalculateSpline(const aPoint0, aPoint3, aPoint1, aPoint2: TSplinePoint; t: single ): TSplinePoint;
|
||||||
|
begin
|
||||||
|
Result.x := power(t,3)*(aPoint3.x+3*(aPoint1.x-aPoint2.x)-aPoint0.x)+3*power(t,2)*(aPoint0.x-2*aPoint1.x+aPoint2.x)+3*t*(aPoint1.x-aPoint0.x)+aPoint0.x;
|
||||||
|
Result.y := power(t,3)*(aPoint3.y+3*(aPoint1.y-aPoint2.y)-aPoint0.y)+3*power(t,2)*(aPoint0.y-2*aPoint1.y+aPoint2.y)+3*t*(aPoint1.y-aPoint0.y)+aPoint0.y;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function CalculateElastic(const aFactor: single; const aDistance: integer; const aIntensity: single=1.5): integer;
|
||||||
|
begin
|
||||||
|
Result:=trunc(Power(2,10*(aFactor-1))*cos(20*PI*aIntensity/3*aFactor)*aDistance)
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ TAnimationItem }
|
||||||
|
|
||||||
|
procedure TAnimationItem.SetReverse(aValue: Boolean);
|
||||||
|
begin
|
||||||
|
if FReverse=aValue then Exit;
|
||||||
|
if FDuration=0 then begin
|
||||||
|
FReverse:=aValue;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if Assigned(FQueue) then begin
|
||||||
|
if aValue then begin
|
||||||
|
FStartTick:=FQueue.GetAbsoluteAnimationClock-(FDuration-GetElapsedMilliseconds);
|
||||||
|
end else begin
|
||||||
|
FStartTick:=FQueue.GetAbsoluteAnimationClock-GetElapsedMilliseconds;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
FReverse:=aValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationItem.CalculateLinearPosition(const aSource,
|
||||||
|
aTarget: integer; const aElapsedMilliseconds, aDuration: int64): integer;
|
||||||
|
var
|
||||||
|
Factor: Single;
|
||||||
|
Distance: integer;
|
||||||
|
begin
|
||||||
|
if aDuration=0 then begin
|
||||||
|
Result:=aSource;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
Factor:=aElapsedMilliseconds / aDuration;
|
||||||
|
if Factor>1.0 then Factor:=1.0;
|
||||||
|
if Factor<0.0 then Factor:=0.0;
|
||||||
|
case FTransitionMode of
|
||||||
|
eAnimationTransitionLinear:
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
eAnimationTransitionBallisticIn:
|
||||||
|
begin
|
||||||
|
Factor:=CalculateSpline(SplinePoint(0,0),SplinePoint(1,0),SplinePoint(0.9,1),SplinePoint(0.999,1),Factor).x;
|
||||||
|
end;
|
||||||
|
eAnimationTransitionBallisticOut:
|
||||||
|
begin
|
||||||
|
Factor:=CalculateSpline(SplinePoint(0,0),SplinePoint(1,0),SplinePoint(0.001,1),SplinePoint(0.1,1),Factor).x;
|
||||||
|
end;
|
||||||
|
eAnimationTransitionBallisticBoth:
|
||||||
|
begin
|
||||||
|
Factor:=CalculateSpline(SplinePoint(0,0),SplinePoint(1,0),SplinePoint(0,1),SplinePoint(1,1),Factor).x;
|
||||||
|
end;
|
||||||
|
eAnimationTransitionBallisticEdge:
|
||||||
|
begin
|
||||||
|
Factor:=CalculateSpline(SplinePoint(0,0),SplinePoint(1,0),SplinePoint(1,0),SplinePoint(0,1),Factor).x;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Distance:=aTarget-aSource;
|
||||||
|
Distance:=Round(Distance*Factor);
|
||||||
|
Result:=aSource+Distance;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationItem.CalculateLinearPosition(const aSource, aTarget: Single;
|
||||||
|
const aElapsedMilliseconds, aDuration: int64): Single;
|
||||||
|
var
|
||||||
|
Factor: Single;
|
||||||
|
Distance: Single;
|
||||||
|
begin
|
||||||
|
if aDuration=0 then begin
|
||||||
|
Result:=aSource;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
Factor:=aElapsedMilliseconds / aDuration;
|
||||||
|
if Factor>1.0 then Factor:=1.0;
|
||||||
|
if Factor<0.0 then Factor:=0.0;
|
||||||
|
case FTransitionMode of
|
||||||
|
eAnimationTransitionLinear:
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
eAnimationTransitionBallisticIn:
|
||||||
|
begin
|
||||||
|
Factor:=CalculateSpline(SplinePoint(0,0),SplinePoint(1,0),SplinePoint(0.9,1),SplinePoint(0.9,1),Factor).x;
|
||||||
|
end;
|
||||||
|
eAnimationTransitionBallisticOut:
|
||||||
|
begin
|
||||||
|
Factor:=CalculateSpline(SplinePoint(0,0),SplinePoint(1,0),SplinePoint(0.1,1),SplinePoint(0.1,1),Factor).x;
|
||||||
|
end;
|
||||||
|
eAnimationTransitionBallisticBoth:
|
||||||
|
begin
|
||||||
|
Factor:=CalculateSpline(SplinePoint(0,0),SplinePoint(1,0),SplinePoint(0,1),SplinePoint(1,1),Factor).x;
|
||||||
|
end;
|
||||||
|
eAnimationTransitionBallisticEdge:
|
||||||
|
begin
|
||||||
|
Factor:=CalculateSpline(SplinePoint(0,0),SplinePoint(1,0),SplinePoint(1,0),SplinePoint(0,1),Factor).x;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Distance:=aTarget-aSource;
|
||||||
|
Distance:=Distance*Factor;
|
||||||
|
Result:=aSource+Distance;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationItem.GetElapsedMilliseconds: int64;
|
||||||
|
var
|
||||||
|
LocalReversed: Boolean;
|
||||||
|
begin
|
||||||
|
if FFinalizeAnimation and ((FRepeats-FRepeated)>=0) then begin
|
||||||
|
LocalReversed:=false;
|
||||||
|
if FAutoReverse then begin
|
||||||
|
if (FRepeats-FRepeated) mod 2 = 1 then begin
|
||||||
|
LocalReversed:=false;
|
||||||
|
end else begin
|
||||||
|
LocalReversed:=true;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
FRepeated:=FRepeats;
|
||||||
|
if LocalReversed then begin
|
||||||
|
Result:=0;
|
||||||
|
end else begin
|
||||||
|
Result:=Duration;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
if FReverse then begin
|
||||||
|
Result:=Duration - (FQueue.GetAbsoluteAnimationClock - FStartTick);
|
||||||
|
end else begin
|
||||||
|
Result:=FQueue.GetAbsoluteAnimationClock - FStartTick;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.FinalizeASAP(const aReverseIfNeeded: Boolean);
|
||||||
|
begin
|
||||||
|
if aReverseIfNeeded then begin
|
||||||
|
FFinalizeASAPMode:=TFINALIZEASAPMODE_REVERSED;
|
||||||
|
end else begin
|
||||||
|
FFinalizeASAPMode:=TFINALIZEASAPMODE_NEXT;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.ProcessAnimationEnd;
|
||||||
|
var
|
||||||
|
lShouldRepeat: Boolean=false;
|
||||||
|
procedure Restart;
|
||||||
|
var
|
||||||
|
j: integer;
|
||||||
|
begin
|
||||||
|
Start;
|
||||||
|
if Assigned(FStartStopSynchAnimationList) then begin
|
||||||
|
for j := 0 to FStartStopSynchAnimationList.Count-1 do begin
|
||||||
|
TAnimationItem(FStartStopSynchAnimationList[j]).Start;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
procedure ReverseIt;
|
||||||
|
var
|
||||||
|
j: integer;
|
||||||
|
begin
|
||||||
|
Reversed:=not Reversed;
|
||||||
|
if Assigned(FStartStopSynchAnimationList) then begin
|
||||||
|
for j := 0 to FStartStopSynchAnimationList.Count-1 do begin
|
||||||
|
TAnimationItem(FStartStopSynchAnimationList[j]).ProcessAnimationEnd;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
procedure DoFinalize;
|
||||||
|
begin
|
||||||
|
case FAnimationOnEndAction of
|
||||||
|
eAnimationOnEndStop: FState:=eAnimationStateStopped;
|
||||||
|
eAnimationOnEndFree: FState:=eAnimationStateToBeFreed;
|
||||||
|
end;
|
||||||
|
if Assigned(FOnAnimationEnd) then begin
|
||||||
|
FOnAnimationEnd(Self);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
inc(FRepeated);
|
||||||
|
case FFinalizeASAPMode of
|
||||||
|
TFINALIZEASAPMODE_NOW,
|
||||||
|
TFINALIZEASAPMODE_NEXT:
|
||||||
|
begin
|
||||||
|
DoFinalize;
|
||||||
|
end;
|
||||||
|
TFINALIZEASAPMODE_REVERSED:
|
||||||
|
begin
|
||||||
|
if not Reversed then begin
|
||||||
|
ReverseIt;
|
||||||
|
end else begin
|
||||||
|
DoFinalize;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
TFINALIZEASAPMODE_NONE:
|
||||||
|
begin
|
||||||
|
if FRepeats=0 then begin
|
||||||
|
lShouldRepeat:=true;
|
||||||
|
end else begin
|
||||||
|
if FRepeated<FRepeats then begin
|
||||||
|
lShouldRepeat:=true;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if lShouldRepeat and FAutoReverse then begin
|
||||||
|
ReverseIt;
|
||||||
|
end else if lShouldRepeat then begin
|
||||||
|
Restart;
|
||||||
|
end else begin
|
||||||
|
DoFinalize;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TAnimationItem.Create;
|
||||||
|
begin
|
||||||
|
FFreeWithQueue:=true;
|
||||||
|
FRepeats:=1;
|
||||||
|
FFinalizeBehavior:=eAnimationFinalizeBehaviorFinal;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TAnimationItem.Destroy;
|
||||||
|
begin
|
||||||
|
if Assigned(FStartStopSynchAnimationList) then FreeAndNil(FStartStopSynchAnimationList);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationItem.Reverse(const aReverseFinalBehavior: Boolean): Boolean;
|
||||||
|
begin
|
||||||
|
if FState=eAnimationStateStarted then begin
|
||||||
|
Reversed:=not FReverse;
|
||||||
|
if aReverseFinalBehavior then begin
|
||||||
|
case FFinalizeBehavior of
|
||||||
|
eAnimationFinalizeBehaviorCurrent: ;
|
||||||
|
eAnimationFinalizeBehaviorInitial: FFinalizeBehavior:=eAnimationFinalizeBehaviorFinal;
|
||||||
|
eAnimationFinalizeBehaviorFinal: FFinalizeBehavior:=eAnimationFinalizeBehaviorInitial;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Result:=true;
|
||||||
|
end else begin
|
||||||
|
Result:=false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.Perform;
|
||||||
|
begin
|
||||||
|
if Assigned(FQueue) then begin
|
||||||
|
FQueue.Paint(Self);
|
||||||
|
end else begin
|
||||||
|
if Assigned(FOnPerform) then begin
|
||||||
|
FOnPerform(GetElapsedMilliseconds);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.DoPerform;
|
||||||
|
begin
|
||||||
|
// Nothing, nada.
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.Animate;
|
||||||
|
var
|
||||||
|
lElapsedMilliseconds: int64;
|
||||||
|
begin
|
||||||
|
if FState=eAnimationStateStarted then begin
|
||||||
|
lElapsedMilliseconds:=GetElapsedMilliseconds;
|
||||||
|
if Assigned(FOnPerform) then begin
|
||||||
|
FOnPerform(lElapsedMilliseconds);
|
||||||
|
end else begin
|
||||||
|
DoPerform;
|
||||||
|
end;
|
||||||
|
if FFinalizeASAPMode=TFINALIZEASAPMODE_NOW then begin
|
||||||
|
ProcessAnimationEnd;
|
||||||
|
end else begin
|
||||||
|
if FReverse then begin
|
||||||
|
if lElapsedMilliseconds<=0 then begin
|
||||||
|
ProcessAnimationEnd;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
if lElapsedMilliseconds>=FDuration then begin
|
||||||
|
ProcessAnimationEnd;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
FFinalizeAnimation:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.DoInitialize;
|
||||||
|
begin
|
||||||
|
//Do nothing
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.Start;
|
||||||
|
begin
|
||||||
|
FStartTick:=FQueue.GetAbsoluteAnimationClock;
|
||||||
|
FState:=eAnimationStateStarted;
|
||||||
|
FRepeated:=0;
|
||||||
|
FReverse:=false;
|
||||||
|
FFinalizeAnimation:=false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.Pause;
|
||||||
|
begin
|
||||||
|
if FState=eAnimationStateStarted then begin
|
||||||
|
FState:=eAnimationStatePaused;
|
||||||
|
if Assigned(FQueue) then begin
|
||||||
|
FPauseTick:=GetElapsedMilliseconds;
|
||||||
|
end;
|
||||||
|
end else if FState=eAnimationStatePaused then begin
|
||||||
|
if Assigned(FQueue) then begin
|
||||||
|
FStartTick:=FQueue.GetAbsoluteAnimationClock-FPauseTick;
|
||||||
|
end;
|
||||||
|
FState:=eAnimationStateStarted;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.Stop;
|
||||||
|
begin
|
||||||
|
if (FState=eAnimationStateStarted) or (FState=eAnimationStatePaused) or (FState=eAnimationStateStopped) then begin
|
||||||
|
FState:=eAnimationStateStopped;
|
||||||
|
DoFinalizeAnimation;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationItem.AddSyncStartStopAnimation(
|
||||||
|
const aAnimationItem: TAnimationItem);
|
||||||
|
begin
|
||||||
|
if not Assigned(FStartStopSynchAnimationList) then begin
|
||||||
|
FStartStopSynchAnimationList:=TFPList.Create;
|
||||||
|
end;
|
||||||
|
FStartStopSynchAnimationList.Add(aAnimationItem);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationQueue }
|
||||||
|
|
||||||
|
function TAnimationQueue.GetAbsoluteAnimationClock: int64;
|
||||||
|
begin
|
||||||
|
Result:=GetAnimationTick - FStartTick;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationQueue.RemoveGroupID(const aID: pointer; const aClass: TClass
|
||||||
|
): integer;
|
||||||
|
var
|
||||||
|
j: Integer;
|
||||||
|
A: TAnimationItem;
|
||||||
|
begin
|
||||||
|
Result:=0;
|
||||||
|
for j := Pred(FAnimationItems.Count) downto 0 do begin
|
||||||
|
A:=TAnimationItem(FAnimationItems[j]);
|
||||||
|
if A.GroupID=aID then begin
|
||||||
|
if (Assigned(aClass) and (A is aClass)) or not Assigned(aClass) then begin
|
||||||
|
Remove(A);
|
||||||
|
inc(Result);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationQueue.FindGroupID(const aGroupID: pointer): TFPList;
|
||||||
|
var
|
||||||
|
j: Integer;
|
||||||
|
A: TAnimationItem;
|
||||||
|
begin
|
||||||
|
Result:=TFPList.Create;
|
||||||
|
for j := Pred(FAnimationItems.Count) downto 0 do begin
|
||||||
|
A:=TAnimationItem(FAnimationItems[j]);
|
||||||
|
if A.GroupID=aGroupID then begin
|
||||||
|
Result.Add(A);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationQueue.SetReverse(aValue: Boolean);
|
||||||
|
var
|
||||||
|
j: integer;
|
||||||
|
begin
|
||||||
|
if FReverse=aValue then Exit;
|
||||||
|
for j := 0 to FAnimationItems.Count-1 do begin
|
||||||
|
TAnimationItem(FAnimationItems[j]).Reversed:=not TAnimationItem(FAnimationItems[j]).Reversed;
|
||||||
|
end;
|
||||||
|
FReverse:=aValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationQueue.GetAverageFPS: single;
|
||||||
|
begin
|
||||||
|
if FState=eAnimationQueueStarted then begin
|
||||||
|
if GetAbsoluteAnimationClock>0 then begin
|
||||||
|
Result:=(FFramesCounter * 1000) / GetAbsoluteAnimationClock;
|
||||||
|
end else begin
|
||||||
|
Result:=0;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
Result:=0;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationQueue.GetPaused: Boolean;
|
||||||
|
begin
|
||||||
|
if FState=eAnimationQueuePaused then begin
|
||||||
|
Result:=true;
|
||||||
|
end else begin
|
||||||
|
Result:=false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TAnimationQueue.Create;
|
||||||
|
begin
|
||||||
|
FAnimationItems:=TFPList.Create;
|
||||||
|
FState:=eAnimationQueueStopped;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TAnimationQueue.Destroy;
|
||||||
|
var
|
||||||
|
j: integer;
|
||||||
|
begin
|
||||||
|
for j := Pred(FAnimationItems.Count) downto 0 do begin
|
||||||
|
if TAnimationItem(FAnimationItems[j]).FFreeWithQueue then begin
|
||||||
|
TAnimationItem(FAnimationItems[j]).Free;
|
||||||
|
FAnimationItems.Delete(j);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
FreeAndNil(FAnimationItems);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationQueue.SetPaused(AValue: Boolean);
|
||||||
|
begin
|
||||||
|
If AValue then begin
|
||||||
|
if (FState=eAnimationQueueStarted) then begin
|
||||||
|
FPauseElapsed:=GetAbsoluteAnimationClock;
|
||||||
|
FState:=eAnimationQueuePaused;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
if FState=eAnimationQueuePaused then begin
|
||||||
|
FStartTick:=GetTickCount64-FPauseElapsed;
|
||||||
|
FState:=eAnimationQueueStarted;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationQueue.Start(const aStartQueuedAnimations: Boolean);
|
||||||
|
var
|
||||||
|
j: Integer;
|
||||||
|
begin
|
||||||
|
FTick:=GetTickCount64;
|
||||||
|
if FState=eAnimationQueuePaused then begin
|
||||||
|
SetPaused(false);
|
||||||
|
end else begin
|
||||||
|
FStartTick:=FTick;
|
||||||
|
if aStartQueuedAnimations then begin
|
||||||
|
for j := 0 to FAnimationItems.Count-1 do begin
|
||||||
|
TAnimationItem(FAnimationItems[j]).Start;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
FState:=eAnimationQueueStarted;
|
||||||
|
FFramesCounter:=0;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationQueue.Pause;
|
||||||
|
begin
|
||||||
|
FPauseElapsed:=GetAbsoluteAnimationClock;
|
||||||
|
FState:=eAnimationQueuePaused;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationQueue.Reverse;
|
||||||
|
begin
|
||||||
|
Reversed:=not Reversed;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationQueue.Animate;
|
||||||
|
var
|
||||||
|
j: integer;
|
||||||
|
A: TAnimationItem;
|
||||||
|
begin
|
||||||
|
if FState<>eAnimationQueueStarted then exit;
|
||||||
|
FTick:=GetTickCount64;
|
||||||
|
for j := FAnimationItems.Count-1 downto 0 do begin
|
||||||
|
A:=TAnimationItem(FAnimationItems[j]);
|
||||||
|
if A.FState=eAnimationStateToBeFreed then begin
|
||||||
|
Remove(A);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
for j := 0 to FAnimationItems.Count-1 do begin
|
||||||
|
A:=TAnimationItem(FAnimationItems[j]);
|
||||||
|
if A.FState=eAnimationStateStarted then begin
|
||||||
|
A.Animate;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
inc(FFramesCounter);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationQueue.Paint(const aPerformItem: TAnimationItem);
|
||||||
|
begin
|
||||||
|
aPerformItem.DoPerform;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationQueue.Add(const aAnimationItem: TAnimationItem;
|
||||||
|
const aRemoveSameGroupID: Boolean);
|
||||||
|
begin
|
||||||
|
if Assigned(aAnimationItem.FQueue) then begin
|
||||||
|
Raise TAnimationException.Create(rs_AnimationInOtherQueue);
|
||||||
|
end;
|
||||||
|
if aRemoveSameGroupID and (aAnimationItem.GroupID<>nil) then begin
|
||||||
|
RemoveGroupID(aAnimationItem.GroupID);
|
||||||
|
end;
|
||||||
|
FAnimationItems.Add(aAnimationItem);
|
||||||
|
aAnimationItem.FQueue:=Self;
|
||||||
|
aAnimationItem.DoInitialize;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationQueue.Remove(const aAnimationItem: TAnimationItem);
|
||||||
|
var
|
||||||
|
Index: integer;
|
||||||
|
A: TAnimationItem;
|
||||||
|
j: integer;
|
||||||
|
begin
|
||||||
|
Index:=FAnimationItems.IndexOf(aAnimationItem);
|
||||||
|
if Index<0 then begin
|
||||||
|
Raise TAnimationException.Create('Trying to remove non exist animation');
|
||||||
|
end;
|
||||||
|
FAnimationItems.Delete(Index);
|
||||||
|
aAnimationItem.DoFinalizeAnimation;
|
||||||
|
//Check if object is in the synchronization list of other object
|
||||||
|
for j := 0 to Pred(FAnimationItems.Count) do begin
|
||||||
|
A:=TAnimationItem(FAnimationItems[j]);
|
||||||
|
if Assigned(A.FStartStopSynchAnimationList) then begin
|
||||||
|
Index:=A.FStartStopSynchAnimationList.IndexOf(aAnimationItem);
|
||||||
|
if Index>-1 then begin
|
||||||
|
//Delete it to avoid crash when synch takes place
|
||||||
|
A.FStartStopSynchAnimationList.Delete(Index);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
aAnimationItem.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationQueue.GetAnimationTick: int64;
|
||||||
|
begin
|
||||||
|
Result:=FTick;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationQueue.intfGetTickCount64: int64;
|
||||||
|
{$IFDEF WINDOWS}
|
||||||
|
const
|
||||||
|
lUseHighPrecision: Boolean=true;
|
||||||
|
{$ENDIF}
|
||||||
|
begin
|
||||||
|
{$IFDEF WINDOWS}
|
||||||
|
if lUseHighPrecision then begin
|
||||||
|
Result:=0;
|
||||||
|
if not QueryPerformanceCounter(Result) then begin
|
||||||
|
Result:=GetTickCount64;
|
||||||
|
lUseHighPrecision:=false;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
Result:=GetTickCount64;
|
||||||
|
end;
|
||||||
|
{$ELSE}
|
||||||
|
Result:=GetTickCount64;
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
761
components/Comba_Animation/src/uanimationcontrol.pas
Normal file
761
components/Comba_Animation/src/uanimationcontrol.pas
Normal file
@ -0,0 +1,761 @@
|
|||||||
|
unit uanimationcontrol;
|
||||||
|
|
||||||
|
(*
|
||||||
|
Comba - Animation controls module
|
||||||
|
---------------------------------
|
||||||
|
@Licence: (c) 2017 José Mejuto // joshyfun at gmail.com
|
||||||
|
@Licence: LGPL when compiled with FPC (Free Pascal), GNU GPL V3 in other cases.
|
||||||
|
@Links:
|
||||||
|
GPL: https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||||
|
LGPL: https://www.gnu.org/licenses/lgpl-3.0.en.html
|
||||||
|
|
||||||
|
@Description:
|
||||||
|
|
||||||
|
This file implements an animation base class for LCL visual controls
|
||||||
|
animation and implements some basic animations.
|
||||||
|
|
||||||
|
*)
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, Controls, Graphics, Forms
|
||||||
|
, uanimationbasic
|
||||||
|
, uanimationtypes
|
||||||
|
;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
TAnimationZoomMode=(eAnimationZoomModeAll,eAnimationZoomModeWidthLeft,eAnimationZoomModeWidthRight,eAnimationZoomModeHeightTop,eAnimationZoomModeHeightBottom,eAnimationZoomModeWidth,eAnimationZoomModeHeight);
|
||||||
|
TAnimationAnchorLocation=(eAnimationAnchorLocationLeftTop,eAnimationAnchorLocationLeft,eAnimationAnchorLocationTop,eAnimationAnchorLocationCenter);
|
||||||
|
|
||||||
|
{ TAnimationCustomControl }
|
||||||
|
|
||||||
|
TAnimationCustomControl=class(TAnimationItem)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
FControl: TControl;
|
||||||
|
procedure DoFinalizeAnimation; override;
|
||||||
|
function GetControl: TControl;
|
||||||
|
property Control: TControl read FControl;
|
||||||
|
public
|
||||||
|
constructor Create(const aControl: TControl);
|
||||||
|
end;
|
||||||
|
|
||||||
|
TAnimationControl=class(TAnimationCustomControl)
|
||||||
|
public
|
||||||
|
property Control;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomControlDimensions }
|
||||||
|
|
||||||
|
TAnimationCustomControlDimensions=class(TAnimationControl)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
FInitialRect: TAnimationRect;
|
||||||
|
FFinalRect: TAnimationRect;
|
||||||
|
procedure DoFinalizeAnimation; override;
|
||||||
|
procedure DoMoveControlPosition(const aX,aY: integer); virtual;
|
||||||
|
procedure DoMoveControlAsRect(const aRect: TRect); virtual;
|
||||||
|
public
|
||||||
|
constructor Create(const aControl: TControl);
|
||||||
|
procedure SetInitialPosition(const aInitialPosition: TPoint); virtual;
|
||||||
|
procedure SetFinalPosition(const aFinalPosition: TPoint); virtual;
|
||||||
|
procedure SwapOriginWithFinal; virtual;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlTranslate }
|
||||||
|
|
||||||
|
TAnimationControlTranslate=class(TAnimationCustomControlDimensions)
|
||||||
|
protected
|
||||||
|
FInitialCenter: TPoint;
|
||||||
|
FFinalCenter: TPoint;
|
||||||
|
FAnchorLocation: TAnimationAnchorLocation;
|
||||||
|
FAnchors: TAnchors;
|
||||||
|
FRemoveAnchors: Boolean;
|
||||||
|
procedure DoPerform; override;
|
||||||
|
procedure DoInitialize; override;
|
||||||
|
procedure DoFinalizeAnimation; override;
|
||||||
|
public
|
||||||
|
procedure SetInitialPosition(const aInitialPosition: TPoint); override;
|
||||||
|
procedure SetFinalPosition(const aFinalPosition: TPoint); override;
|
||||||
|
property RemoveAnchors: Boolean read FRemoveAnchors write FRemoveAnchors;
|
||||||
|
property AnchorLocation: TAnimationAnchorLocation read FAnchorLocation write FAnchorLocation;
|
||||||
|
property TransitionMode;
|
||||||
|
property FinalizeBehavior;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlZoom }
|
||||||
|
|
||||||
|
TAnimationControlZoom=class(TAnimationCustomControlDimensions)
|
||||||
|
protected
|
||||||
|
FAutoSized: Boolean;
|
||||||
|
FAnchors: TAnchors;
|
||||||
|
FFinalZoom: single;
|
||||||
|
FZoomMode: TAnimationZoomMode;
|
||||||
|
FZoomByRectangle: Boolean;
|
||||||
|
FRemoveAnchors: Boolean;
|
||||||
|
procedure DoPerform; override;
|
||||||
|
procedure DoInitialize; override;
|
||||||
|
procedure DoFinalizeAnimation; override;
|
||||||
|
public
|
||||||
|
procedure SetFinalZoom(const aFinalZoom: Single);
|
||||||
|
procedure SetFinalSize(const aRect: TRect);
|
||||||
|
property ZoomMode: TAnimationZoomMode read FZoomMode write FZoomMode;
|
||||||
|
property TransitionMode;
|
||||||
|
property FinalizeBehavior;
|
||||||
|
property RemoveAnchors: Boolean read FRemoveAnchors write FRemoveAnchors;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlCaptionCapital }
|
||||||
|
|
||||||
|
TAnimationControlCaptionCapital=class(TAnimationControl)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
FOriginalCaption: string;
|
||||||
|
procedure DoInitialize; override;
|
||||||
|
procedure DoPerform; override;
|
||||||
|
procedure DoFinalizeAnimation; override;
|
||||||
|
public
|
||||||
|
property TransitionMode;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomControlColor }
|
||||||
|
|
||||||
|
TAnimationCustomControlColor=class(TAnimationControl)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
FInitialColor: integer;
|
||||||
|
FFinalColor: integer;
|
||||||
|
procedure DoPerform; override;
|
||||||
|
procedure DoFinalizeAnimation; override;
|
||||||
|
procedure DoChangeColor(const aNewColor: TColor); virtual; abstract;
|
||||||
|
property InitialColor: integer read FInitialColor write FInitialColor;
|
||||||
|
property FinalColor: integer read FFinalColor write FFinalColor;
|
||||||
|
public
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlColor }
|
||||||
|
|
||||||
|
TAnimationControlColor=class(TAnimationCustomControlColor)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
procedure DoChangeColor(const aNewColor: TColor); override;
|
||||||
|
public
|
||||||
|
property InitialColor;
|
||||||
|
property FinalColor;
|
||||||
|
property TransitionMode;
|
||||||
|
property FinalizeBehavior;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomControlRotator }
|
||||||
|
|
||||||
|
TAnimationCustomControlRotator=class(TAnimationControl)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
FInitialAngle: Single;
|
||||||
|
FFinalAngle: Single;
|
||||||
|
procedure DoPerform; override;
|
||||||
|
procedure DoFinalizeAnimation; override;
|
||||||
|
procedure DoRotate(const aAngle: Single); virtual; abstract;
|
||||||
|
property InitialAngle: Single read FInitialAngle write FInitialAngle;
|
||||||
|
property FinalAngle: Single read FFinalAngle write FFinalAngle;
|
||||||
|
public
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlFontRotator }
|
||||||
|
|
||||||
|
TAnimationControlFontRotator=class(TAnimationCustomControlRotator)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
procedure DoRotate(const aAngle: Single); override;
|
||||||
|
public
|
||||||
|
property InitialAngle;
|
||||||
|
property FinalAngle;
|
||||||
|
property TransitionMode;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomControlTextChange }
|
||||||
|
|
||||||
|
TAnimationCustomControlTextChange=class(TAnimationControl)
|
||||||
|
private
|
||||||
|
FSameLenInitialText: string;
|
||||||
|
FSameLenFinalText: string;
|
||||||
|
FMaxLength: integer;
|
||||||
|
protected
|
||||||
|
FInitialText: String;
|
||||||
|
FFinalText: String;
|
||||||
|
FCursorString: string;
|
||||||
|
procedure DoPerform; override;
|
||||||
|
procedure DoInitialize; override;
|
||||||
|
procedure DoFinalizeAnimation; override;
|
||||||
|
procedure DoChangeText(const aNewText: String); virtual; abstract;
|
||||||
|
property InitialText: String read FInitialText write FInitialText;
|
||||||
|
property FinalText: String read FFinalText write FFinalText;
|
||||||
|
property CursorString: String read FCursorString write FCursorString;
|
||||||
|
public
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlCaptionReplace }
|
||||||
|
|
||||||
|
TAnimationControlCaptionReplace=class(TAnimationCustomControlTextChange)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
procedure DoChangeText(const aNewText: String); override;
|
||||||
|
public
|
||||||
|
constructor Create(const aControl: TControl);
|
||||||
|
property InitialText;
|
||||||
|
property FinalText;
|
||||||
|
property CursorString;
|
||||||
|
property TransitionMode;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomControlInteger }
|
||||||
|
|
||||||
|
TAnimationCustomControlInteger=class(TAnimationControl)
|
||||||
|
private
|
||||||
|
protected
|
||||||
|
FInitialInteger: Integer;
|
||||||
|
FFinalInteger: Integer;
|
||||||
|
procedure DoPerform; override;
|
||||||
|
procedure DoFinalizeAnimation; override;
|
||||||
|
procedure DoSetValue(const aValue: Integer); virtual; abstract;
|
||||||
|
property InitialInteger: Integer read FInitialInteger write FInitialInteger;
|
||||||
|
property FinalInteger: Integer read FFinalInteger write FFinalInteger;
|
||||||
|
public
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlAlphaBlend }
|
||||||
|
|
||||||
|
TAnimationControlAlphaBlend=class(TAnimationCustomControlInteger)
|
||||||
|
private
|
||||||
|
function GetFinalBlend: Byte;
|
||||||
|
function GetInitialBlend: Byte;
|
||||||
|
procedure SetFinalBlend(AValue: Byte);
|
||||||
|
procedure SetInitialBlend(AValue: Byte);
|
||||||
|
protected
|
||||||
|
procedure DoSetValue(const aValue: Integer); override;
|
||||||
|
procedure DoInitialize; override;
|
||||||
|
public
|
||||||
|
constructor Create(const aForm: TCustomForm);
|
||||||
|
property InitialBlend: Byte read GetInitialBlend write SetInitialBlend;
|
||||||
|
property FinalBlend: Byte read GetFinalBlend write SetFinalBlend;
|
||||||
|
property TransitionMode;
|
||||||
|
property FinalizeBehavior;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{ TAnimationControlAlphaBlend }
|
||||||
|
|
||||||
|
function TAnimationControlAlphaBlend.GetFinalBlend: Byte;
|
||||||
|
begin
|
||||||
|
Result:=Byte(FFinalInteger);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationControlAlphaBlend.GetInitialBlend: Byte;
|
||||||
|
begin
|
||||||
|
Result:=Byte(FInitialInteger);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlAlphaBlend.SetFinalBlend(AValue: Byte);
|
||||||
|
begin
|
||||||
|
if FFinalInteger=AValue then Exit;
|
||||||
|
FFinalInteger:=AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlAlphaBlend.SetInitialBlend(AValue: Byte);
|
||||||
|
begin
|
||||||
|
if FInitialInteger=AValue then Exit;
|
||||||
|
FInitialInteger:=AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlAlphaBlend.DoSetValue(const aValue: Integer);
|
||||||
|
begin
|
||||||
|
TCustomForm(FControl).AlphaBlendValue:=aValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlAlphaBlend.DoInitialize;
|
||||||
|
begin
|
||||||
|
inherited DoInitialize;
|
||||||
|
TCustomForm(FControl).AlphaBlend:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TAnimationControlAlphaBlend.Create(const aForm: TCustomForm);
|
||||||
|
begin
|
||||||
|
inherited Create(aForm);
|
||||||
|
FInitialInteger:=aForm.AlphaBlendValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomControlInteger }
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlInteger.DoPerform;
|
||||||
|
var
|
||||||
|
NZ: Integer;
|
||||||
|
begin
|
||||||
|
inherited DoPerform;
|
||||||
|
NZ:=CalculateLinearPosition(FInitialInteger,FFinalInteger,GetElapsedMilliseconds,Duration);
|
||||||
|
DoSetValue(NZ);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlInteger.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
inherited DoFinalizeAnimation;
|
||||||
|
case FinalizeBehavior of
|
||||||
|
eAnimationFinalizeBehaviorCurrent:
|
||||||
|
begin
|
||||||
|
// Do nothing
|
||||||
|
end;
|
||||||
|
eAnimationFinalizeBehaviorInitial:
|
||||||
|
begin
|
||||||
|
DoSetValue(FInitialInteger);
|
||||||
|
end;
|
||||||
|
eAnimationFinalizeBehaviorFinal:
|
||||||
|
begin
|
||||||
|
DoSetValue(FFinalInteger);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomControlTextChange }
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlTextChange.DoPerform;
|
||||||
|
var
|
||||||
|
NZ: Integer;
|
||||||
|
begin
|
||||||
|
inherited DoPerform;
|
||||||
|
NZ:=CalculateLinearPosition(1,FMaxLength,GetElapsedMilliseconds,Duration);
|
||||||
|
// This is not UTF8 aware!!!
|
||||||
|
DoChangeText(copy(FSameLenFinalText,1,NZ-1)+CursorString+copy(FSameLenInitialText,NZ));
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlTextChange.DoInitialize;
|
||||||
|
begin
|
||||||
|
inherited DoInitialize;
|
||||||
|
if Length(FInitialText)>Length(FFinalText) then begin
|
||||||
|
FMaxLength:=Length(FInitialText);
|
||||||
|
end else begin
|
||||||
|
FMaxLength:=Length(FFinalText);
|
||||||
|
end;
|
||||||
|
FSameLenInitialText:=FInitialText+StringOfChar(' ',FMaxLength-Length(FInitialText));
|
||||||
|
FSameLenFinalText:=FFinalText+StringOfChar(' ',FMaxLength-Length(FFinalText));
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlTextChange.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
inherited DoFinalizeAnimation;
|
||||||
|
case FinalizeBehavior of
|
||||||
|
eAnimationFinalizeBehaviorCurrent:
|
||||||
|
begin
|
||||||
|
// Do nothing
|
||||||
|
end;
|
||||||
|
eAnimationFinalizeBehaviorInitial:
|
||||||
|
begin
|
||||||
|
DoChangeText(FInitialText);
|
||||||
|
end;
|
||||||
|
eAnimationFinalizeBehaviorFinal:
|
||||||
|
begin
|
||||||
|
DoChangeText(FFinalText);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlCaptionReplace }
|
||||||
|
|
||||||
|
procedure TAnimationControlCaptionReplace.DoChangeText(const aNewText: String);
|
||||||
|
begin
|
||||||
|
FControl.Caption:=aNewText;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TAnimationControlCaptionReplace.Create(const aControl: TControl);
|
||||||
|
begin
|
||||||
|
inherited Create(aControl);
|
||||||
|
FInitialText:=aControl.Caption;
|
||||||
|
FFinalText:=aControl.Caption;
|
||||||
|
// It proceduces a quite good eraser effect (8 spaces).
|
||||||
|
FCursorString:=StringOfChar(' ',8);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlFontRotator }
|
||||||
|
|
||||||
|
procedure TAnimationControlFontRotator.DoRotate(const aAngle: Single);
|
||||||
|
begin
|
||||||
|
FControl.Font.Orientation:=trunc(aAngle*10);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomControlRotator }
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlRotator.DoPerform;
|
||||||
|
var
|
||||||
|
lDistance: Single;
|
||||||
|
begin
|
||||||
|
inherited DoPerform;
|
||||||
|
lDistance:=CalculateLinearPosition(FInitialAngle,FFinalAngle,GetElapsedMilliseconds,Duration);
|
||||||
|
DoRotate(lDistance);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlRotator.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
inherited DoFinalizeAnimation;
|
||||||
|
case FinalizeBehavior of
|
||||||
|
eAnimationFinalizeBehaviorCurrent:
|
||||||
|
begin
|
||||||
|
// Do nothing
|
||||||
|
end;
|
||||||
|
eAnimationFinalizeBehaviorInitial:
|
||||||
|
begin
|
||||||
|
DoRotate(FInitialAngle);
|
||||||
|
end;
|
||||||
|
eAnimationFinalizeBehaviorFinal:
|
||||||
|
begin
|
||||||
|
DoRotate(FFinalAngle);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomColor }
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlColor.DoPerform;
|
||||||
|
var
|
||||||
|
tmpBaseColor: integer;
|
||||||
|
tmpColor1: integer;
|
||||||
|
tmpColor2: integer;
|
||||||
|
NewColor: integer;
|
||||||
|
NZ: Single;
|
||||||
|
j: integer;
|
||||||
|
begin
|
||||||
|
inherited DoPerform;
|
||||||
|
NewColor:=0;
|
||||||
|
NZ:=CalculateLinearPosition(1.0,0,GetElapsedMilliseconds,Duration);
|
||||||
|
// Loop works in the RGB 24 bits colors (0..2)
|
||||||
|
for j := 0 to 2 do begin
|
||||||
|
tmpBaseColor:=(FFinalColor shr (8*j)) and 255;
|
||||||
|
tmpColor2:=(FInitialColor shr (8*j)) and 255;
|
||||||
|
tmpColor1:=trunc((tmpColor2-tmpBaseColor) * NZ);
|
||||||
|
tmpColor1:=tmpBaseColor+tmpColor1;
|
||||||
|
NewColor:=NewColor or (tmpColor1 shl (8*j));
|
||||||
|
end;
|
||||||
|
DoChangeColor(NewColor);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlColor.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
inherited DoFinalizeAnimation;
|
||||||
|
case FinalizeBehavior of
|
||||||
|
eAnimationFinalizeBehaviorCurrent:
|
||||||
|
begin
|
||||||
|
// Do nothing, is current
|
||||||
|
end;
|
||||||
|
eAnimationFinalizeBehaviorInitial:
|
||||||
|
begin
|
||||||
|
DoChangeColor(FInitialColor);
|
||||||
|
end;
|
||||||
|
eAnimationFinalizeBehaviorFinal:
|
||||||
|
begin
|
||||||
|
DoChangeColor(FFinalColor);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomControlDimensions }
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlDimensions.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
inherited DoFinalizeAnimation;
|
||||||
|
case FinalizeBehavior of
|
||||||
|
eAnimationFinalizeBehaviorCurrent:
|
||||||
|
begin
|
||||||
|
// Do nothing, it is current
|
||||||
|
end;
|
||||||
|
eAnimationFinalizeBehaviorInitial:
|
||||||
|
begin
|
||||||
|
DoMoveControlAsRect(FInitialRect.GetAsRect);
|
||||||
|
end;
|
||||||
|
eAnimationFinalizeBehaviorFinal:
|
||||||
|
begin
|
||||||
|
DoMoveControlAsRect(FFinalRect.GetAsRect);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
// When animated positions sometimes the control
|
||||||
|
// ends with some fails in paint, so refresh it.
|
||||||
|
FControl.Repaint;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlDimensions.DoMoveControlPosition(const aX, aY: integer);
|
||||||
|
begin
|
||||||
|
FControl.SetBounds(aX,aY,FControl.Width,FControl.Height);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlDimensions.DoMoveControlAsRect(
|
||||||
|
const aRect: TRect);
|
||||||
|
begin
|
||||||
|
FControl.BoundsRect:=aRect;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TAnimationCustomControlDimensions.Create(const aControl: TControl);
|
||||||
|
begin
|
||||||
|
inherited Create(aControl);
|
||||||
|
FInitialRect.SetFromRect(aControl.BoundsRect);
|
||||||
|
FFinalRect:=FInitialRect;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlDimensions.SetInitialPosition(
|
||||||
|
const aInitialPosition: TPoint);
|
||||||
|
begin
|
||||||
|
FInitialRect.MoveTo(aInitialPosition);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlDimensions.SetFinalPosition(
|
||||||
|
const aFinalPosition: TPoint);
|
||||||
|
begin
|
||||||
|
FFinalRect.MoveTo(aFinalPosition);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationCustomControlDimensions.SwapOriginWithFinal;
|
||||||
|
var
|
||||||
|
Temp: TAnimationRect;
|
||||||
|
begin
|
||||||
|
Temp:=FInitialRect;
|
||||||
|
FInitialRect:=FFinalRect;
|
||||||
|
FFinalRect:=Temp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationCustomControl }
|
||||||
|
|
||||||
|
procedure TAnimationCustomControl.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
inherited DoFinalizeAnimation;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationCustomControl.GetControl: TControl;
|
||||||
|
begin
|
||||||
|
Result:=FControl;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TAnimationCustomControl.Create(const aControl: TControl);
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
FControl:=aControl;
|
||||||
|
GroupID:=aControl;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlCaptionCapital }
|
||||||
|
|
||||||
|
procedure TAnimationControlCaptionCapital.DoInitialize;
|
||||||
|
begin
|
||||||
|
inherited DoInitialize;
|
||||||
|
FOriginalCaption:=FControl.Caption;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlCaptionCapital.DoPerform;
|
||||||
|
var
|
||||||
|
NZ: Integer;
|
||||||
|
begin
|
||||||
|
inherited DoPerform;
|
||||||
|
NZ:=CalculateLinearPosition(integer(1),integer(Length(FOriginalCaption)),GetElapsedMilliseconds,Duration);
|
||||||
|
// This is not UTF8 aware!!!
|
||||||
|
FControl.Caption:=copy(FOriginalCaption,1,NZ-1)+Uppercase(FOriginalCaption[NZ])+copy(FOriginalCaption,NZ+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlCaptionCapital.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
inherited DoFinalizeAnimation;
|
||||||
|
FControl.Caption:=FOriginalCaption;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlCustomTranslate }
|
||||||
|
|
||||||
|
procedure TAnimationControlTranslate.DoPerform;
|
||||||
|
var
|
||||||
|
NX,NY: integer;
|
||||||
|
begin
|
||||||
|
inherited DoPerform;
|
||||||
|
case FAnchorLocation of
|
||||||
|
eAnimationAnchorLocationLeft:
|
||||||
|
begin
|
||||||
|
NX:=CalculateLinearPosition(FInitialRect.Left,FFinalRect.Left,GetElapsedMilliseconds,Duration);
|
||||||
|
DoMoveControlPosition(NX,FControl.Top);
|
||||||
|
end;
|
||||||
|
eAnimationAnchorLocationTop:
|
||||||
|
begin
|
||||||
|
NY:=CalculateLinearPosition(FInitialRect.Top,FFinalRect.Top,GetElapsedMilliseconds,Duration);
|
||||||
|
DoMoveControlPosition(FControl.Left,NY);
|
||||||
|
end;
|
||||||
|
eAnimationAnchorLocationLeftTop:
|
||||||
|
begin
|
||||||
|
NX:=CalculateLinearPosition(FInitialRect.Left,FFinalRect.Left,GetElapsedMilliseconds,Duration);
|
||||||
|
NY:=CalculateLinearPosition(FInitialRect.Top,FFinalRect.Top,GetElapsedMilliseconds,Duration);
|
||||||
|
DoMoveControlPosition(NX,NY);
|
||||||
|
end;
|
||||||
|
eAnimationAnchorLocationCenter:
|
||||||
|
begin
|
||||||
|
NX:=CalculateLinearPosition(FInitialCenter.x,FFinalCenter.x,GetElapsedMilliseconds,Duration);
|
||||||
|
NX:=NX-FControl.Width div 2;
|
||||||
|
NY:=CalculateLinearPosition(FInitialCenter.y,FFinalCenter.y,GetElapsedMilliseconds,Duration);
|
||||||
|
NY:=NY-FControl.Height div 2;
|
||||||
|
DoMoveControlPosition(NX,NY);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlTranslate.DoInitialize;
|
||||||
|
begin
|
||||||
|
inherited DoInitialize;
|
||||||
|
FInitialCenter:=FInitialRect.GetCenter;
|
||||||
|
FFinalCenter:=FFinalRect.GetCenter;
|
||||||
|
//Anchors could be a problem sometimes
|
||||||
|
FAnchors:=FControl.Anchors;
|
||||||
|
if FRemoveAnchors then begin
|
||||||
|
FControl.Anchors:=[];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlTranslate.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
inherited DoFinalizeAnimation;
|
||||||
|
if FRemoveAnchors then begin
|
||||||
|
FControl.Anchors:=FAnchors;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlTranslate.SetInitialPosition(
|
||||||
|
const aInitialPosition: TPoint);
|
||||||
|
begin
|
||||||
|
inherited SetInitialPosition(aInitialPosition);
|
||||||
|
FInitialCenter:=FInitialRect.GetCenter;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlTranslate.SetFinalPosition(
|
||||||
|
const aFinalPosition: TPoint);
|
||||||
|
begin
|
||||||
|
inherited SetFinalPosition(aFinalPosition);
|
||||||
|
FFinalCenter:=FFinalRect.GetCenter;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlZoom }
|
||||||
|
|
||||||
|
procedure TAnimationControlZoom.DoPerform;
|
||||||
|
var
|
||||||
|
NZ: Single;
|
||||||
|
NRect: TAnimationRect;
|
||||||
|
NewBottom: integer;
|
||||||
|
Center: TPoint;
|
||||||
|
AnimRect: TAnimationRect;
|
||||||
|
TR: TAnimationRect;
|
||||||
|
begin
|
||||||
|
inherited DoPerform;
|
||||||
|
if not FZoomByRectangle then begin
|
||||||
|
NZ:=CalculateLinearPosition(1.0,FFinalZoom,GetElapsedMilliseconds,Duration);
|
||||||
|
case FZoomMode of
|
||||||
|
eAnimationZoomModeAll:
|
||||||
|
begin
|
||||||
|
AnimRect.SetFromRect(FControl.BoundsRect);
|
||||||
|
Center:=AnimRect.GetCenter;
|
||||||
|
TR.Left:=Center.x-Round(FInitialRect.Width*NZ) div 2;
|
||||||
|
TR.Right:=TR.Left+Round(FInitialRect.Width*NZ);
|
||||||
|
TR.Top:=Center.y-Round(FInitialRect.Height*NZ) div 2;
|
||||||
|
TR.Bottom:=TR.Top+Round(FInitialRect.Height*NZ);
|
||||||
|
DoMoveControlAsRect(TR.GetAsRect);
|
||||||
|
end;
|
||||||
|
eAnimationZoomModeWidth:
|
||||||
|
begin
|
||||||
|
TR.SetFromRect(FControl.BoundsRect);
|
||||||
|
Center:=TR.GetCenter;
|
||||||
|
TR.Left:=Center.x-Round(FInitialRect.Width*NZ) div 2;
|
||||||
|
TR.Width:=Round(FInitialRect.Width*NZ);
|
||||||
|
DoMoveControlAsRect(TR.GetAsRect);
|
||||||
|
end;
|
||||||
|
eAnimationZoomModeHeight:
|
||||||
|
begin
|
||||||
|
TR.SetFromRect(FControl.BoundsRect);
|
||||||
|
Center:=TR.GetCenter;
|
||||||
|
TR.Top:=Center.y-Round(FInitialRect.Height*NZ) div 2;
|
||||||
|
TR.Height:=Round(FInitialRect.Height*NZ);
|
||||||
|
DoMoveControlAsRect(TR.GetAsRect);
|
||||||
|
end;
|
||||||
|
eAnimationZoomModeWidthLeft:
|
||||||
|
begin
|
||||||
|
TR.SetFromRect(FControl.BoundsRect);
|
||||||
|
TR.Width:=Round(FInitialRect.Width*NZ);
|
||||||
|
DoMoveControlAsRect(TR.GetAsRect);
|
||||||
|
end;
|
||||||
|
eAnimationZoomModeWidthRight:
|
||||||
|
begin
|
||||||
|
TR.SetFromRect(FControl.BoundsRect);
|
||||||
|
TR.Left:=TR.Right-integer(Round(FInitialRect.Width*NZ));
|
||||||
|
TR.Width:=Round(FInitialRect.Width*NZ);
|
||||||
|
DoMoveControlAsRect(TR.GetAsRect);
|
||||||
|
end;
|
||||||
|
eAnimationZoomModeHeightTop:
|
||||||
|
begin
|
||||||
|
TR.SetFromRect(FControl.BoundsRect);
|
||||||
|
TR.Height:=Round(FInitialRect.Height*NZ);
|
||||||
|
DoMoveControlAsRect(TR.GetAsRect);
|
||||||
|
end;
|
||||||
|
eAnimationZoomModeHeightBottom:
|
||||||
|
begin
|
||||||
|
TR.SetFromRect(FControl.BoundsRect);
|
||||||
|
NewBottom:=FControl.Top+FControl.Height;
|
||||||
|
TR.Top:=NewBottom - Round(FInitialRect.Height*NZ);
|
||||||
|
TR.Height:=Round(FInitialRect.Height*NZ);
|
||||||
|
DoMoveControlAsRect(TR.GetAsRect);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
NRect.Left:=CalculateLinearPosition(FInitialRect.Left,FFinalRect.Left,GetElapsedMilliseconds,Duration);
|
||||||
|
NRect.Top:=CalculateLinearPosition(FInitialRect.Top,FFinalRect.Top,GetElapsedMilliseconds,Duration);
|
||||||
|
NRect.Width:=CalculateLinearPosition(FInitialRect.Width,FFinalRect.Width,GetElapsedMilliseconds,Duration);
|
||||||
|
NRect.Height:=CalculateLinearPosition(FInitialRect.Height,FFinalRect.Height,GetElapsedMilliseconds,Duration);
|
||||||
|
DoMoveControlAsRect(NRect.GetAsRect);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlZoom.DoInitialize;
|
||||||
|
begin
|
||||||
|
inherited DoInitialize;
|
||||||
|
if FControl.AutoSize then begin
|
||||||
|
FAutoSized:=true;
|
||||||
|
//Autosize and zoom effect do not work well together ;)
|
||||||
|
FControl.AutoSize:=false;
|
||||||
|
end else begin
|
||||||
|
FAutoSized:=false;
|
||||||
|
end;
|
||||||
|
//Anchors can influence zoom in some cases
|
||||||
|
FAnchors:=FControl.Anchors;
|
||||||
|
if FRemoveAnchors then begin
|
||||||
|
FControl.Anchors:=[];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlZoom.DoFinalizeAnimation;
|
||||||
|
begin
|
||||||
|
inherited DoFinalizeAnimation;
|
||||||
|
if FAutoSized then FControl.AutoSize:=true;
|
||||||
|
if FRemoveAnchors then begin
|
||||||
|
FControl.Anchors:=FAnchors;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlZoom.SetFinalZoom(const aFinalZoom: Single);
|
||||||
|
begin
|
||||||
|
FFinalZoom:=aFinalZoom;
|
||||||
|
FZoomByRectangle:=false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationControlZoom.SetFinalSize(const aRect: TRect);
|
||||||
|
begin
|
||||||
|
FFinalRect.SetFromRect(aRect);
|
||||||
|
FZoomByRectangle:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAnimationControlColor }
|
||||||
|
|
||||||
|
procedure TAnimationControlColor.DoChangeColor(const aNewColor: TColor);
|
||||||
|
begin
|
||||||
|
FControl.Color:=aNewColor;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
101
components/Comba_Animation/src/uanimationtypes.pas
Normal file
101
components/Comba_Animation/src/uanimationtypes.pas
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
unit uanimationtypes;
|
||||||
|
|
||||||
|
(*
|
||||||
|
Comba - Animation controls helper
|
||||||
|
---------------------------------
|
||||||
|
@Licence: (c) 2017 José Mejuto // joshyfun at gmail.com
|
||||||
|
@Licence: LGPL when compiled with FPC (Free Pascal), GNU GPL V3 in other cases.
|
||||||
|
@Links:
|
||||||
|
GPL: https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||||
|
LGPL: https://www.gnu.org/licenses/lgpl-3.0.en.html
|
||||||
|
|
||||||
|
@Description:
|
||||||
|
Helper unit.
|
||||||
|
|
||||||
|
*)
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
{$modeswitch advancedrecords}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TAnimationRect }
|
||||||
|
|
||||||
|
TAnimationRect=record
|
||||||
|
private
|
||||||
|
function GetBottom: integer;
|
||||||
|
function GetRight: integer;
|
||||||
|
procedure SetBottom(aValue: integer);
|
||||||
|
procedure SetRight(aValue: integer);
|
||||||
|
public
|
||||||
|
Left: integer;
|
||||||
|
Top: integer;
|
||||||
|
Width: integer;
|
||||||
|
Height: integer;
|
||||||
|
property Right: integer read GetRight write SetRight;
|
||||||
|
property Bottom: integer read GetBottom write SetBottom;
|
||||||
|
function GetAsRect: TRect;
|
||||||
|
function GetCenter: TPoint;
|
||||||
|
procedure SetFromRect(const aRect: TRect);
|
||||||
|
procedure MoveTo(const aNewLeftTop: TPoint);
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{ TAnimationRect }
|
||||||
|
|
||||||
|
function TAnimationRect.GetBottom: integer;
|
||||||
|
begin
|
||||||
|
Result:=Top+Height;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationRect.GetRight: integer;
|
||||||
|
begin
|
||||||
|
Result:=Left+Width;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationRect.SetBottom(aValue: integer);
|
||||||
|
begin
|
||||||
|
Height:=aValue-Top;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationRect.SetRight(aValue: integer);
|
||||||
|
begin
|
||||||
|
Width:=aValue-Left;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationRect.GetAsRect: TRect;
|
||||||
|
begin
|
||||||
|
Result.Left:=Left;
|
||||||
|
Result.Right:=Left+Width;
|
||||||
|
Result.Top:=Top;
|
||||||
|
Result.Bottom:=Top+Height;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAnimationRect.GetCenter: TPoint;
|
||||||
|
begin
|
||||||
|
Result.x:=Left+(Width div 2);
|
||||||
|
Result.y:=Top+(Height div 2);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationRect.SetFromRect(const aRect: TRect);
|
||||||
|
begin
|
||||||
|
Left:=aRect.Left;
|
||||||
|
Top:=aRect.Top;
|
||||||
|
Width:=aRect.Right-aRect.Left;
|
||||||
|
Height:=aRect.Bottom-aRect.Top;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnimationRect.MoveTo(const aNewLeftTop: TPoint);
|
||||||
|
begin
|
||||||
|
Left:=aNewLeftTop.x;
|
||||||
|
Top:=aNewLeftTop.y;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
Reference in New Issue
Block a user