// SPDX-License-Identifier: LGPL-3.0-linking-exception {******************************* CONTRIBUTOR(S) ****************************** - Edivando S. Santos Brasil | mailedivando@gmail.com (Compatibility with delphi VCL 11/2018) ***************************** END CONTRIBUTOR(S) *****************************} unit BCRadialProgressBar; {$I bgracontrols.inc} interface uses Classes, SysUtils, {$IFDEF FPC}LResources,{$ENDIF} Forms, Controls, Graphics, Dialogs, BCBaseCtrls, {$IFNDEF FPC}Types, BGRAGraphics, GraphType, FPImage, {$ENDIF} BGRABitmap, BGRABitmapTypes, BGRATextFX; type { TBCRadialProgressBar } TBCRadialProgressBar = class(TBCGraphicControl) private FDrawText: boolean; { Private declarations } FMaxValue: integer; FMinValue: integer; FRotation: single; FValue: integer; FBitmap: TBGRABitmap; FLineColor: TColor; FLineBkgColor: TColor; FFontShadowColor: TColor; FFontShadowOffsetX: integer; FFontShadowOffsetY: integer; FFontShadowRadius: integer; FLineWidth: single; procedure SetDrawText(AValue: boolean); procedure SetFFontShadowColor(AValue: TColor); procedure SetFFontShadowOffsetX(AValue: integer); procedure SetFFontShadowOffsetY(AValue: integer); procedure SetFFontShadowRadius(AValue: integer); procedure SetFLineBkgColor(AValue: TColor); procedure SetFLineColor(AValue: TColor); procedure SetMaxValue(AValue: integer); procedure SetMinValue(AValue: integer); procedure SetRotation(AValue: single); procedure SetValue(AValue: integer); procedure SetLineWidth(AValue: single); protected { Protected declarations } procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; {%H-}WithThemeSpace: boolean); override; procedure DrawControl; override; procedure RenderControl; override; procedure SetColor(Value: TColor); override; public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Rotation: single read FRotation write SetRotation default 0; property DrawText: boolean read FDrawText write SetDrawText default true; published { Published declarations } property Align; property Anchors; property MinValue: integer read FMinValue write SetMinValue default 0; property MaxValue: integer read FMaxValue write SetMaxValue default 100; property Value: integer read FValue write SetValue default 0; property OnClick; property OnMouseDown; property OnMouseEnter; property OnMouseLeave; property OnMouseMove; property OnMouseUp; property OnMouseWheel; property OnMouseWheelUp; property OnMouseWheelDown; property Color default clWhite; property LineColor: TColor read FLineColor write SetFLineColor default clBlack; property LineBkgColor: TColor read FLineBkgColor write SetFLineBkgColor default clSilver; property LineWidth: single read FLineWidth write SetLineWidth {$IFDEF FPC}default 4{$ENDIF}; property FontShadowColor: TColor read FFontShadowColor write SetFFontShadowColor default clBlack; property FontShadowOffsetX: integer read FFontShadowOffsetX write SetFFontShadowOffsetX default 2; property FontShadowOffsetY: integer read FFontShadowOffsetY write SetFFontShadowOffsetY default 2; property FontShadowRadius: integer read FFontSHadowRadius write SetFFontShadowRadius default 4; property Font; end; {$IFDEF FPC}procedure Register;{$ENDIF} implementation {$IFDEF FPC} procedure Register; begin {$IFDEF FPC} {$I icons\bcradialprogressbar_icon.lrs} {$ENDIF} RegisterComponents('BGRA Controls', [TBCRadialProgressBar]); end; {$ENDIF} { TBCRadialProgressBar } procedure TBCRadialProgressBar.SetMaxValue(AValue: integer); begin if FMaxValue = AValue then exit; FMaxValue := AValue; if FValue > FMaxValue then FValue := FMaxValue; if FMinValue > FMaxValue then FMinValue := FMaxValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetFLineBkgColor(AValue: TColor); begin if FLineBkgColor = AValue then Exit; FLineBkgColor := AValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetFFontShadowColor(AValue: TColor); begin if FFontShadowColor = AValue then Exit; FFontShadowColor := AValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetDrawText(AValue: boolean); begin if FDrawText=AValue then Exit; FDrawText:=AValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetFFontShadowOffsetX(AValue: integer); begin if FFontShadowOffsetX = AValue then Exit; FFontShadowOffsetX := AValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetFFontShadowOffsetY(AValue: integer); begin if FFontShadowOffsetY = AValue then Exit; FFontShadowOffsetY := AValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetFFontShadowRadius(AValue: integer); begin if FFontSHadowRadius = AValue then Exit; FFontSHadowRadius := AValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetFLineColor(AValue: TColor); begin if FLineColor = AValue then Exit; FLineColor := AValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetMinValue(AValue: integer); begin if FMinValue = AValue then exit; FMinValue := AValue; if FValue < FMinValue then FValue := FMinValue; if FMaxValue < FMinValue then FMaxValue := FMinValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetRotation(AValue: single); begin if FRotation=AValue then Exit; FRotation:=AValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetValue(AValue: integer); begin if FValue = AValue then exit; FValue := AValue; if FValue < FMinValue then FValue := FMinValue; if FValue > FMaxValue then FValue := FMaxValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.SetLineWidth(AValue: single); begin if (FLineWidth = AValue) then exit; FLineWidth := AValue; RenderControl; Invalidate; end; procedure TBCRadialProgressBar.CalculatePreferredSize( var PreferredWidth, PreferredHeight: integer; WithThemeSpace: boolean); begin PreferredWidth := 200; PreferredHeight := 200; end; procedure TBCRadialProgressBar.DrawControl; begin {$IFNDEF FPC}//# //@ IN DELPHI RenderControl NEDD. IF NO RenderControl BE BLACK AFTER INVALIDATE. RenderControl; {$ENDIF} FBitmap.Draw(Canvas, 0, 0, False); end; procedure TBCRadialProgressBar.RenderControl; var textBmp: TBGRABitmap; textStr: string; EffectiveLineWidth:single; begin FreeAndNil(FBitmap); FBitmap := TBGRABitmap.Create(Width, Height); FBitmap.Canvas2D.resetTransform; FBitmap.Canvas2D.translate(FBitmap.Width/2, FBitmap.Height/2); FBitmap.Canvas2D.rotate(FRotation*Pi/180); FBitmap.Canvas2D.beginPath; FBitmap.Canvas2D.arc(0, 0, Height / 2.5, 0, pi * 2, False); FBitmap.Canvas2D.fillStyle(Color); FBitmap.Canvas2D.fill; if LineWidth=0 then EffectiveLineWidth:=Height / 50 else EffectiveLineWidth:=LineWidth; FBitmap.Canvas2D.lineWidth := EffectiveLineWidth; FBitmap.Canvas2D.strokeStyle(LineBkgColor); FBitmap.Canvas2D.stroke; FBitmap.Canvas2D.beginPath; if Value <> MinValue then FBitmap.Canvas2D.arc(0, 0, Height / 2.5, pi * 1.5, (pi * 1.5) + ((pi * 2) * Value / MaxValue), False); FBitmap.Canvas2D.fillStyle(BGRAPixelTransparent); FBitmap.Canvas2D.fill; FBitmap.Canvas2D.lineWidth := EffectiveLineWidth; FBitmap.Canvas2D.strokeStyle(LineColor); FBitmap.Canvas2D.stroke; if MaxValue = 0 then textStr := '0%' else textStr := FloatToStr(Round((Value / MaxValue) * 100)) + '%'; if DrawText then begin textBmp := TextShadow(Width, Height, textStr, Font.Height, Font.Color, FontShadowColor, FontShadowOFfsetX, FontShadowOffsetY, FontSHadowRadius, Font.Style, Font.Name) as TBGRABitmap; FBitmap.PutImage(0, 0, textBmp, dmDrawWithTransparency); textBmp.Free; end; end; procedure TBCRadialProgressBar.SetColor(Value: TColor); begin inherited SetColor(Value); RenderControl; Invalidate; end; constructor TBCRadialProgressBar.Create(AOwner: TComponent); begin inherited Create(AOwner); with GetControlClassDefaultSize do SetInitialBounds(0, 0, 200, 200); FMaxValue := 100; FMinValue := 0; FValue := 0; FLineColor := clBlack; FLineBkgColor := clSilver; FLineWidth:=0; FFontShadowColor := clBlack; FFontShadowOffsetX := 2; FFontShadowOffsetY := 2; FFontShadowRadius := 4; Font.Color := clBlack; Font.Height := 20; Color := clWhite; FRotation := 0; FDrawText := True; end; destructor TBCRadialProgressBar.Destroy; begin FreeAndNil(FBitmap); inherited Destroy; end; end.