256 lines
7.2 KiB
ObjectPascal
256 lines
7.2 KiB
ObjectPascal
// SPDX-License-Identifier: LGPL-3.0-linking-exception
|
|
{
|
|
Part of BGRA Controls. Made by third party.
|
|
For detailed information see readme.txt
|
|
|
|
Site: https://sourceforge.net/p/bgra-controls/
|
|
Wiki: http://wiki.lazarus.freepascal.org/BGRAControls
|
|
Forum: http://forum.lazarus.freepascal.org/index.php/board,46.0.html
|
|
|
|
}
|
|
{******************************* CONTRIBUTOR(S) ******************************
|
|
- Edivando S. Santos Brasil | mailedivando@gmail.com
|
|
(Compatibility with delphi VCL 11/2018)
|
|
|
|
***************************** END CONTRIBUTOR(S) *****************************}
|
|
unit dtthemedgauge;
|
|
|
|
{$I bgracontrols.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Graphics, {$IFDEF FPC}LResources,{$ELSE} BGRAGraphics, {$ENDIF} Forms, Controls, Dialogs, DTAnalogCommon,
|
|
BGRABitmap, BGRABitmapTypes;
|
|
|
|
type
|
|
|
|
{ TDTCustomThemedGauge }
|
|
|
|
TDTCustomThemedGauge = class(TDTBaseAnalogDevice)
|
|
private
|
|
FPointerCapSettings: TDTPointerCapSettings;
|
|
FPointerSettings: TDTPointerSettings;
|
|
FScaleBitmap: TBGRABitmap;
|
|
FPointerBitmap: TBGRABitmap;
|
|
FPosition: integer;
|
|
procedure SetPointerCapSettings(AValue: TDTPointerCapSettings);
|
|
procedure SetPointerSettings(AValue: TDTPointerSettings);
|
|
procedure SetPosition(AValue: integer);
|
|
{ Private declarations }
|
|
protected
|
|
{ Protected declarations }
|
|
property PointerSettings: TDTPointerSettings read FPointerSettings write SetPointerSettings;
|
|
property PointerCapSettings: TDTPointerCapSettings read FPointerCapSettings write SetPointerCapSettings;
|
|
property Position: integer read FPosition write SetPosition;
|
|
public
|
|
{ Public declarations }
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Paint; override;
|
|
procedure DrawScale;
|
|
procedure DrawPointer;
|
|
end;
|
|
|
|
{ TDTThemedGauge }
|
|
|
|
TDTThemedGauge = class(TDTCustomThemedGauge)
|
|
private
|
|
{ Private declarations }
|
|
protected
|
|
{ Protected declarations }
|
|
public
|
|
{ Public declarations }
|
|
published
|
|
{ Published declarations }
|
|
property FaceSettings;
|
|
property ScaleSettings;
|
|
property PointerSettings;
|
|
property PointerCapSettings;
|
|
property Position;
|
|
end;
|
|
|
|
{$IFDEF FPC}procedure Register;{$ENDIF}
|
|
|
|
implementation
|
|
|
|
{$IFDEF FPC}
|
|
procedure Register;
|
|
begin
|
|
RegisterComponents('BGRA Controls', [TDTThemedGauge]);
|
|
end;
|
|
{$ENDIF}
|
|
|
|
{ TDTCustomThemedGauge }
|
|
|
|
//procedure TDTCustomThemedGauge.SetNeedleSettings(AValue: TDTNeedleSettings);
|
|
//begin
|
|
// if FNeedleSettings = AValue then
|
|
// Exit;
|
|
// FNeedleSettings := AValue;
|
|
//
|
|
// DoChange(self);
|
|
//end;
|
|
//
|
|
procedure TDTCustomThemedGauge.SetPointerCapSettings(AValue: TDTPointerCapSettings);
|
|
begin
|
|
if FPointerCapSettings = AValue then
|
|
Exit;
|
|
FPointerCapSettings := AValue;
|
|
|
|
DoChange(self);
|
|
end;
|
|
|
|
procedure TDTCustomThemedGauge.SetPointerSettings(AValue: TDTPointerSettings);
|
|
begin
|
|
if FPointerSettings = AValue then
|
|
Exit;
|
|
FPointerSettings := AValue;
|
|
|
|
DoChange(self);
|
|
end;
|
|
|
|
|
|
procedure TDTCustomThemedGauge.SetPosition(AValue: integer);
|
|
begin
|
|
if FPosition = AValue then
|
|
Exit;
|
|
FPosition := AValue;
|
|
|
|
DoChange(self);
|
|
end;
|
|
|
|
constructor TDTCustomThemedGauge.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
|
|
FPointerSettings := TDTPointerSettings.Create;
|
|
FPointerSettings.OnChange := DoChange;
|
|
FPointerSettings.Color := BGRA(255, 81, 81);
|
|
|
|
FPointerCapSettings := TDTPointerCapSettings.Create;
|
|
FPointerCapSettings.OnChange := DoChange;
|
|
|
|
FScaleBitmap := TBGRABitmap.Create;
|
|
FPointerBitmap := TBGRABitmap.Create;
|
|
|
|
end;
|
|
|
|
destructor TDTCustomThemedGauge.Destroy;
|
|
begin
|
|
FPointerCapSettings.OnChange:=nil;
|
|
FPointerCapSettings.Free;
|
|
FPointerSettings.OnChange:=nil;
|
|
FPointerSettings.Free;
|
|
|
|
FScaleBitmap.Free;
|
|
FPointerBitmap.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TDTCustomThemedGauge.Paint;
|
|
begin
|
|
inherited Paint;
|
|
DrawScale;
|
|
DrawPointer;
|
|
|
|
FGaugeBitmap.BlendImage(0, 0, FScaleBitmap, boLinearBlend);
|
|
FGaugeBitmap.BlendImage(0, 0, FPointerBitmap, boLinearBlend);
|
|
|
|
FGaugeBitmap.Draw(Canvas, 0, 0, False);
|
|
|
|
end;
|
|
|
|
procedure TDTCustomThemedGauge.DrawScale;
|
|
var
|
|
Origin: TDTOrigin;
|
|
r, i, n, x, y, xt, yt: integer;
|
|
j: single;
|
|
begin
|
|
|
|
Origin := Initializebitmap(FScaleBitmap, Width, Height);
|
|
|
|
r := round(Origin.Radius * 0.85);
|
|
|
|
//j := (180 - ScaleSettings.Angle) / 2;
|
|
j := (180 - 270) / 2;
|
|
|
|
// Draw SubTicks
|
|
if ScaleSettings.EnableSubTicks then
|
|
begin
|
|
|
|
n := ScaleSettings.MainTickCount * ScaleSettings.SubTickCount;
|
|
|
|
for i := 0 to n do
|
|
begin
|
|
// Calculate draw from point
|
|
X := Origin.CenterPoint.x - Round(r * cos((j + i * 270 / n) * Pi / 180));
|
|
Y := Origin.CenterPoint.y - Round(r * sin((j + i * 270 / n) * Pi / 180));
|
|
|
|
// Calculate draw to point
|
|
Xt := Origin.CenterPoint.x - Round((r - ScaleSettings.LengthSubTick) * cos((j + i * 270 / n) * Pi / 180));
|
|
Yt := Origin.CenterPoint.y - Round((r - ScaleSettings.LengthSubTick) * sin((j + i * 270 / n) * Pi / 180));
|
|
|
|
FScaleBitmap.DrawLineAntialias(x, y, xt, yt, ScaleSettings.TickColor, ScaleSettings.ThicknessSubTick);
|
|
|
|
end;
|
|
end;
|
|
|
|
if ScaleSettings.EnableMainTicks then
|
|
begin
|
|
|
|
FScaleBitmap.FontName := ScaleSettings.TextFont;
|
|
FScaleBitmap.FontHeight := ScaleSettings.TextSize;
|
|
FScaleBitmap.FontQuality := fqFineAntialiasing;
|
|
|
|
n := ScaleSettings.MainTickCount;
|
|
|
|
for i := 0 to n do
|
|
begin
|
|
// Draw main ticks
|
|
// Calculate draw from point
|
|
X := Origin.CenterPoint.x - Round(r * cos((j + i * 270 / n) * Pi / 180));
|
|
Y := Origin.CenterPoint.y - Round(r * sin((j + i * 270 / n) * Pi / 180));
|
|
|
|
// Calculate draw to point
|
|
Xt := Origin.CenterPoint.x - Round((r - ScaleSettings.LengthMainTick) * cos((j + i * 270 / n) * Pi / 180));
|
|
Yt := Origin.CenterPoint.y - Round((r - ScaleSettings.LengthMainTick) * sin((j + i * 270 / n) * Pi / 180));
|
|
|
|
FScaleBitmap.DrawLineAntialias(x, y, xt, yt, ScaleSettings.TickColor, ScaleSettings.ThicknessMainTick);
|
|
|
|
if ScaleSettings.EnableScaleText then
|
|
begin
|
|
// Draw text for main ticks
|
|
Xt := Origin.CenterPoint.x - Round(ScaleSettings.TextRadius * cos((j + i * 270 / n) * Pi / 180));
|
|
Yt := Origin.CenterPoint.y - Round(ScaleSettings.TextRadius * sin((j + i * 270 / n) * Pi / 180));
|
|
|
|
FScaleBitmap.TextOut(Xt, Yt - (FScaleBitmap.FontHeight / 1.7), IntToStr(i * ScaleSettings.Maximum div ScaleSettings.MainTickCount), ScaleSettings.TextColor, taCenter);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TDTCustomThemedGauge.DrawPointer;
|
|
var
|
|
Origin: TDTOrigin;
|
|
{%H-}r, x, y: integer;
|
|
j: single;
|
|
begin
|
|
|
|
Origin := Initializebitmap(FPointerBitmap, Width, Height);
|
|
|
|
r := round(Origin.Radius * 0.85);
|
|
|
|
j := (180 - 270) / 2;
|
|
|
|
X := origin.CenterPoint.x - Round(PointerSettings.Length * cos((j + Position * 270 / ScaleSettings.Maximum) * Pi / 180));
|
|
Y := origin.CenterPoint.y - Round(PointerSettings.Length * sin((j + Position * 270 / ScaleSettings.Maximum) * Pi / 180));
|
|
|
|
FPointerBitmap.DrawLineAntialias(origin.CenterPoint.y, origin.CenterPoint.y, x, y, PointerSettings.Color, PointerSettings.Thickness);
|
|
|
|
// Draw cap over needle
|
|
FPointerBitmap.EllipseAntialias(origin.CenterPoint.x, origin.CenterPoint.y, PointerCapSettings.Radius, PointerCapSettings.Radius, PointerCapSettings.EdgeColor, 2, ColorToBGRA(PointerCapSettings.FillColor));
|
|
end;
|
|
|
|
end.
|