297 lines
8.9 KiB
ObjectPascal
297 lines
8.9 KiB
ObjectPascal
{ TPoweredby Component
|
|
|
|
Copyright (C)2014 Gordon Bamber minesadorada@charcodelvalle.com
|
|
|
|
This library is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU Library General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or (at your
|
|
option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; if not, write to the Free Software Foundation,
|
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
}
|
|
unit uPoweredby;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, Controls, Dialogs, Forms, Graphics, LResources, SysUtils,
|
|
ExtCtrls, InterfaceBase, LCLType,LCLVersion;
|
|
|
|
const
|
|
C_VERSIONSTRING = '1.0.3.0';
|
|
C_WIDGETSET_GTK = 'GTK widget set';
|
|
C_WIDGETSET_GTK2 = 'GTK 2 widget set';
|
|
C_WIDGETSET_GTK3 = 'GTK 3 widget set';
|
|
C_WIDGETSET_WIN = 'Win32/Win64 widget set';
|
|
C_WIDGETSET_WINCE = 'WinCE widget set';
|
|
C_WIDGETSET_CARBON = 'Carbon widget set';
|
|
C_WIDGETSET_QT = 'QT widget set';
|
|
C_WIDGETSET_fpGUI = 'fpGUI widget set';
|
|
C_WIDGETSET_COCOA = 'Cocoa widget set';
|
|
C_WIDGETSET_CUSTOM = 'Custom drawn widget set';
|
|
C_WIDGETSET_OTHER = 'Other gui';
|
|
|
|
type
|
|
TPoweredby = class(TComponent)
|
|
private
|
|
{ Private declarations }
|
|
fPoweredByForm: TForm;
|
|
fVersionString: string;
|
|
fDelayMilliseconds: integer;
|
|
fFadeInMilliseconds: integer;
|
|
fShowOnlyOnce,fAlreadyShown:Boolean;
|
|
// Used by Timer to close the PoweredBy form
|
|
procedure ClosePoweredByForm(Sender: TObject);
|
|
// Windows only!
|
|
procedure FadeInPoweredBy(Sender: TObject);
|
|
procedure SetDelayMilliSeconds(AValue: integer);
|
|
function GetWidgetSetString: string;
|
|
Function GetFPCTargetInfoString: String;
|
|
Function GetInfoLCLVersion:String;
|
|
Function GetInfoFPCVersion:String;
|
|
protected
|
|
{ Protected declarations }
|
|
public
|
|
{ Public declarations }
|
|
// Call the method 'ShowPoweredByForm' to show the shaped window
|
|
procedure ShowPoweredByForm;
|
|
// Called when component is dropped onto a form
|
|
constructor Create(AOwner: TComponent); override;
|
|
published
|
|
{ Published declarations }
|
|
// Minimum delay=1000msec; Maximum delay=10000msec. Fade-in time is automatically adjusted
|
|
property DelayMilliSecs: integer read fDelayMilliSeconds write SetDelayMilliSeconds default 1000;
|
|
// Call the method 'ShowPoweredByForm' to show the shaped window
|
|
property Version: string read fVersionString;
|
|
// Reports the current WidgetSet
|
|
property InfoWidgetSet: string read GetWidgetSetString;
|
|
// Reports your current Environment
|
|
property InfoFPCTarget:String read GetFPCTargetInfoString;
|
|
// Reports your current Environment
|
|
property InfoFPCVersion:String read GetInfoFPCVersion;
|
|
// Reports your current Environment
|
|
property InfoLCLVersion:String read GetInfoLCLVersion;
|
|
// Useful if you have ShowPoweredByForm in your TForm.Activate() method
|
|
property ShowOnlyOnce:boolean read fShowOnlyOnce write fShowOnlyOnce default false;
|
|
end;
|
|
|
|
procedure Register;
|
|
|
|
implementation
|
|
|
|
procedure Register;
|
|
begin
|
|
{$I upoweredby_icon.lrs}
|
|
RegisterComponents('Additional', [TPoweredby]);
|
|
end;
|
|
|
|
constructor TPoweredby.Create(AOwner: TComponent);
|
|
// Initialise private vars
|
|
begin
|
|
inherited Create(AOwner);
|
|
fVersionString := C_VERSIONSTRING;
|
|
fDelayMilliseconds := 1000;
|
|
fFadeInMilliseconds := 20;
|
|
fAlreadyShown:=False;
|
|
fShowOnlyOnce:=False;
|
|
end;
|
|
Function TPoweredby.GetInfoLCLVersion:String;
|
|
begin
|
|
result:=lcl_version;
|
|
end;
|
|
Function TPoweredby.GetInfoFPCVersion:String;
|
|
begin
|
|
Result:={$I %FPCVERSION%};
|
|
end;
|
|
Function TPoweredby.GetFPCTargetInfoString: String;
|
|
begin
|
|
Result := {$I %FPCTARGETCPU%}+' - '+{$I %FPCTARGETOS%};
|
|
end;
|
|
|
|
function priv_GetWidgetSetString: string;
|
|
// This code cannot be a method of TPoweredBy
|
|
begin
|
|
case WidgetSet.LCLPlatform of
|
|
lpGtk: Result := C_WIDGETSET_GTK;
|
|
lpGtk2: Result := C_WIDGETSET_GTK2;
|
|
lpWin32: Result := C_WIDGETSET_WIN;
|
|
lpWinCE: Result := C_WIDGETSET_WINCE;
|
|
lpCarbon: Result := C_WIDGETSET_CARBON;
|
|
lpCocoa: Result := C_WIDGETSET_COCOA;
|
|
lpQT: Result := C_WIDGETSET_QT;
|
|
lpfpGUI: Result := C_WIDGETSET_fpGUI;
|
|
// When were these first included in InterfaceBase?
|
|
{$IFDEF FPC_FULLVERSION>24200}
|
|
lpGtk3: Result := C_WIDGETSET_GTK3;
|
|
lpCustomDrawn: Result := C_WIDGETSET_CUSTOM;
|
|
{$ENDIF}
|
|
else
|
|
Result := C_WIDGETSET_OTHER;
|
|
end;
|
|
end;
|
|
|
|
function TPoweredby.GetWidgetSetString: string;
|
|
begin
|
|
Result := priv_GetWidgetSetString;
|
|
end;
|
|
|
|
procedure TPoweredby.SetDelayMilliSeconds(AValue: integer);
|
|
begin
|
|
if ((fDelayMilliSeconds <> AValue) and (AValue > 0) and (AValue < 11000)) then
|
|
begin
|
|
fDelayMilliseconds := AValue;
|
|
fFadeInMilliseconds := (AValue div 1000) * 20;
|
|
end;
|
|
|
|
end;
|
|
|
|
procedure TPoweredby.ClosePoweredByForm(Sender: TObject);
|
|
// Called by Timer event in ShowPoweredByForm to close Modal window
|
|
// Also the image OnClick event
|
|
begin
|
|
fPoweredByForm.Close;
|
|
end;
|
|
|
|
procedure TPoweredby.FadeInPoweredBy(Sender: TObject);
|
|
// Use Alphablend property of TForm
|
|
begin
|
|
if (fPoweredByForm.AlphaBlendValue < 245) then
|
|
fPoweredByForm.AlphaBlendValue := fPoweredByForm.AlphaBlendValue + 10;
|
|
end;
|
|
|
|
function CanShowRoundedGraphic: boolean;
|
|
{
|
|
Check the current WidgetSet, and add to the list that can show the rounded graphic
|
|
Choices are:
|
|
lpGtk,
|
|
lpGtk2,
|
|
lpGtk3,
|
|
lpWin32,
|
|
lpWinCE,
|
|
lpCarbon,
|
|
lpQT,
|
|
lpfpGUI,
|
|
lpNoGUI,
|
|
lpCocoa,
|
|
lpCustomDrawn
|
|
}
|
|
begin
|
|
case WidgetSet.LCLPlatform of
|
|
lpWin32, lpQT: Result := True;
|
|
else
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TPoweredby.ShowPoweredByForm;
|
|
|
|
// Graphics are in masks.lrs
|
|
// 1 ) Constructs a new TForm with an image control
|
|
// 2 ) Uses the 'SetShape' method of the form canvas to create a transparent mask
|
|
// 3 ) Paints the Timage over it with a color image
|
|
// 4 ) Sets a timer to fade it in using the Alphablend property
|
|
// 5 ) Sets another timer to close the form
|
|
|
|
// Note: Windows can fade in a shaped transparent screen
|
|
// But some widgetsets (GTK,Carbon) cannot
|
|
var
|
|
img_Background: TImage;
|
|
MyBitmap: TBitMap;
|
|
DelayTimer: TTimer;
|
|
FadeInTimer: TTImer;
|
|
begin
|
|
// Respect the ShowOnlyOnce property setting
|
|
If ((fShowOnlyOnce=TRUE) AND (fAlreadyShown=TRUE)) then Exit;
|
|
|
|
// Try..Finally so we can be sure resources are Freed
|
|
try
|
|
try
|
|
// Create controls
|
|
fPoweredByForm := TForm.Create(nil);
|
|
fPoweredByForm.AlphaBlend := True;
|
|
fPoweredByForm.AlphaBlendValue := 0;
|
|
img_background := TImage.Create(fPoweredByForm);
|
|
// Bitmap mask - Load from resource
|
|
MyBitmap := TBitMap.Create;
|
|
MyBitmap.LoadFromLazarusResource('powered_by_mask');
|
|
// Delay Timer
|
|
Delaytimer := TTimer.Create(fPoweredByForm);
|
|
delaytimer.Interval := fDelayMilliseconds;
|
|
delaytimer.OnTimer := @ClosePoweredByForm;
|
|
|
|
FadeInTimer := TTimer.Create(fPoweredByForm);
|
|
FadeInTimer.Interval := fFadeInMilliseconds;
|
|
FadeInTimer.OnTimer := @FadeInPoweredBy;
|
|
|
|
// BackGround image - load from resource
|
|
with img_background do
|
|
begin
|
|
Align := alClient;
|
|
Stretch := True;
|
|
Parent := fPoweredByForm;
|
|
if CanShowRoundedGraphic then
|
|
Picture.LoadFromLazarusResource('win_powered_by')
|
|
else
|
|
Picture.LoadFromLazarusResource('powered_by');
|
|
OnClick := @ClosePoweredByForm;
|
|
SendToBack;
|
|
end;
|
|
// Set form properties
|
|
with fPoweredByForm do
|
|
begin
|
|
position := poScreenCenter;
|
|
borderstyle := bsnone;
|
|
formstyle := fsSystemStayOnTop;
|
|
OnClick := @ClosePoweredByForm;
|
|
color := clBlack;
|
|
Height := MyBitmap.Height;
|
|
Width := MyBitMap.Width;
|
|
if CanShowRoundedGraphic then
|
|
begin
|
|
MyBitMap.Transparent := True;
|
|
MyBitMap.TransparentColor := clBlack;
|
|
Canvas.Draw(0, 0, MyBitMap);
|
|
// raises Floating Point Error in linux GTK (!??)
|
|
SetShape(MyBitMap);
|
|
end
|
|
else
|
|
begin
|
|
// If square graphic, then adjust form size
|
|
height:=img_background.Picture.Height;
|
|
width:=img_background.picture.width;
|
|
end;
|
|
// Now show the completed form
|
|
delaytimer.Enabled := True;
|
|
FadeInTimer.Enabled := True;
|
|
Application.ProcessMessages;
|
|
ShowModal; // Closed via the Timer event or a user click
|
|
fAlreadyShown:=TRUE;
|
|
end;
|
|
except
|
|
On E: Exception do
|
|
raise Exception.CreateFmt('%s Error: %s', [Name, Exception.ClassName]);
|
|
end;
|
|
finally
|
|
FreeAndNil(img_background);
|
|
FreeAndNil(MyBitMap);
|
|
FreeAndNil(delayTimer);
|
|
FreeAndNil(FadeInTimer);
|
|
FreeAndNil(fPoweredByForm);
|
|
end;
|
|
end;
|
|
|
|
initialization
|
|
// Load graphics as lazarus resources into the component
|
|
{$I graphics.lrs}
|
|
|
|
end.
|