mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-27 20:13:50 +02:00
225 lines
7.1 KiB
ObjectPascal
225 lines
7.1 KiB
ObjectPascal
unit customdrawn_extra1;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
// RTL
|
|
Classes, SysUtils, Types,
|
|
// LCL -> Use only TForm, TWinControl, TCanvas and TLazIntfImage
|
|
Graphics, Controls, LCLType,
|
|
//
|
|
customdrawndrawers, customdrawn_common;
|
|
|
|
type
|
|
|
|
{ TCDDrawerExtra1 }
|
|
|
|
TCDDrawerExtra1 = class(TCDDrawerCommon)
|
|
public
|
|
function GetMeasures(AMeasureID: Integer): Integer; override;
|
|
// ===================================
|
|
// Common Controls Tab
|
|
// ===================================
|
|
procedure DrawTrackBar(ADest: TCanvas; ASize: TSize;
|
|
AState: TCDControlState; AStateEx: TCDPositionedCStateEx); override;
|
|
end;
|
|
{ TCDButtonDrawerGrad = class(TCDButtonDrawer)
|
|
public
|
|
procedure DrawToIntfImage(ADest: TFPImageCanvas; CDButton: TCDButton); override;
|
|
procedure DrawToCanvas(ADest: TCanvas; CDButton: TCDButton); override;
|
|
end;
|
|
|
|
TCDTrackBarDrawerGraph = class(TCDTrackBarDrawer)
|
|
public
|
|
procedure DrawToIntfImage(ADest: TFPImageCanvas; FPImg: TLazIntfImage;
|
|
CDTrackBar: TCDTrackBar); override;
|
|
procedure GetGeometry(var ALeftBorder, ARightBorder: Integer); override;
|
|
end;}
|
|
|
|
implementation
|
|
|
|
{procedure TCDButtonDrawerGrad.DrawToIntfImage(ADest: TFPImageCanvas;
|
|
CDButton: TCDButton);
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure TCDButtonDrawerGrad.DrawToCanvas(ADest: TCanvas; CDButton: TCDButton);
|
|
var
|
|
TmpB: TBitmap;
|
|
Str: string;
|
|
begin
|
|
// Button shape -> This crashes in Gtk2
|
|
TmpB := TBitmap.Create;
|
|
TmpB.Width := CDButton.Width;
|
|
TmpB.Height := CDButton.Height;
|
|
TmpB.Canvas.Brush.Color := CDButton.Color;
|
|
TmpB.Canvas.Brush.Style := bsSolid;
|
|
TmpB.Canvas.RoundRect(0, 0, TmpB.Width, TmpB.Height, 8, 8);
|
|
// CDButton.SetShape(TmpB);
|
|
|
|
with TmpB.Canvas do
|
|
begin
|
|
Brush.Style := bsSolid;
|
|
Brush.Color := CDButton.Parent.Color;
|
|
Pen.Color := Brush.Color;
|
|
Rectangle(0, 0, Width, Height);
|
|
FillRect(0, 0, Width, Height);
|
|
Brush.Color := GetAColor(CDButton.Color, 90);
|
|
end;
|
|
|
|
// Button image
|
|
if CDButton.IsDown then
|
|
DrawCDButtonDown(TmpB.Canvas, CDButton.GetRGBBackgroundColor)
|
|
else if CDButton.Focused then
|
|
//GradientFill(GetUColor(CDButton.Color, 50), GetAColor(CDButton.Color, 60), TmpB.Canvas);
|
|
GradientFill(clWhite, GetAColor(CDButton.Color, 96), TmpB.Canvas)
|
|
else
|
|
//GradientFill(GetUColor(CDButton.Color, 10), GetAColor(CDButton.Color, 20), TmpB.Canvas);
|
|
GradientFill(clWhite, CDButton.Color, TmpB.Canvas);
|
|
|
|
ADest.Draw(0, 0, TmpB);
|
|
|
|
TmpB.Free;
|
|
|
|
// Button text
|
|
ADest.Font.Assign(CDButton.Font);
|
|
ADest.Brush.Style := bsClear;
|
|
ADest.Pen.Style := psSolid;
|
|
Str := CDButton.Caption;
|
|
ADest.TextOut((CDButton.Width - ADest.TextWidth(Str)) div 2,
|
|
(CDButton.Height - ADest.TextHeight(Str)) div 2, Str);
|
|
end;
|
|
|
|
{ TCDTrackBarDrawer }
|
|
|
|
procedure TCDTrackBarDrawerGraph.DrawToIntfImage(ADest: TFPImageCanvas;
|
|
FPImg: TLazIntfImage; CDTrackBar: TCDTrackBar);
|
|
|
|
procedure TCDTrackBarDrawerGraph.GetGeometry(var ALeftBorder,
|
|
ARightBorder: Integer);
|
|
begin
|
|
ALeftBorder := 9;
|
|
ARightBorder := 9;
|
|
end;
|
|
|
|
RegisterTrackBarDrawer(TCDTrackBarDrawerGraph.Create, dsExtra1);}
|
|
|
|
{ TCDDrawerExtra1 }
|
|
|
|
function TCDDrawerExtra1.GetMeasures(AMeasureID: Integer): Integer;
|
|
begin
|
|
case AMeasureId of
|
|
TCDTRACKBAR_LEFT_SPACING: Result := 9;
|
|
TCDTRACKBAR_RIGHT_SPACING: Result := 9;
|
|
else
|
|
Result:=inherited GetMeasures(AMeasureID);
|
|
end;
|
|
end;
|
|
|
|
procedure TCDDrawerExtra1.DrawTrackBar(ADest: TCanvas;
|
|
ASize: TSize; AState: TCDControlState; AStateEx: TCDPositionedCStateEx);
|
|
var
|
|
lDrawingBottom, StepsCount, i: Integer;
|
|
pStart, pEnd: integer; // for drawing the decorative bars
|
|
dRect: TRect;
|
|
pStepWidth, pHalfStepWidth: Integer;
|
|
CDBarEdge: Integer;
|
|
begin
|
|
CDBarEdge := GetMeasures(TCDTRACKBAR_LEFT_SPACING)
|
|
+ GetMeasures(TCDTRACKBAR_RIGHT_SPACING);
|
|
|
|
// Preparations
|
|
StepsCount := AStateEx.PosCount;
|
|
pStepWidth := (ASize.cx - CDBarEdge) div StepsCount;
|
|
pHalfStepWidth := (ASize.cx - CDBarEdge) div (StepsCount * 2);
|
|
|
|
// The bottom part of the drawing
|
|
lDrawingBottom := ASize.cy - 10;
|
|
|
|
// Background
|
|
|
|
ADest.Brush.Color := AStateEx.ParentRGBColor;
|
|
ADest.Brush.Style := bsSolid;
|
|
ADest.Pen.Style := psSolid;
|
|
ADest.Pen.Color := AStateEx.ParentRGBColor;
|
|
ADest.Rectangle(0, 0, ASize.cx, ASize.cy);
|
|
|
|
// Draws the double-sided arrow in the center of the slider
|
|
|
|
ADest.Brush.Color := ColorToRGB($006BB6E6);
|
|
ADest.Pen.Style := psSolid;
|
|
ADest.Pen.Color := ColorToRGB($006BB6E6);
|
|
ADest.Line(0, lDrawingBottom, ASize.cx, lDrawingBottom);
|
|
ADest.Line(3, lDrawingBottom - 1, 6, lDrawingBottom - 1);
|
|
ADest.Line(5, lDrawingBottom - 2, 6, lDrawingBottom - 2);
|
|
ADest.Line(3, lDrawingBottom + 1, 6, lDrawingBottom + 1);
|
|
ADest.Line(5, lDrawingBottom + 2, 6, lDrawingBottom + 2);
|
|
ADest.Line(ASize.cx - 1 - 3, lDrawingBottom - 1, ASize.cx - 1 - 6, lDrawingBottom - 1);
|
|
ADest.Line(ASize.cx - 1 - 5, lDrawingBottom - 2, ASize.cx - 1 - 6, lDrawingBottom - 2);
|
|
ADest.Line(ASize.cx - 1 - 3, lDrawingBottom + 1, ASize.cx - 1 - 6, lDrawingBottom + 1);
|
|
ADest.Line(ASize.cx - 1 - 5, lDrawingBottom + 2, ASize.cx - 1 - 6, lDrawingBottom + 2);
|
|
ADest.Pen.Color := ColorToRGB(clGray);
|
|
ADest.Brush.Color := ColorToRGB($00F0F0F0);
|
|
|
|
// Draws the decorative bars and also the slider button
|
|
|
|
pStart := 10 - 1;
|
|
for i := 0 to StepsCount - 1 do
|
|
begin
|
|
// Draw the decorative bars
|
|
dRect := Bounds(
|
|
pStart + pHalfStepWidth,
|
|
lDrawingBottom - 5 - i,
|
|
Round(pStepWidth)-3,
|
|
4 + i);
|
|
|
|
ADest.Brush.Style := bsSolid;
|
|
ADest.Pen.Style := psSolid;
|
|
ADest.Pen.Color := clBlack;
|
|
if i <= AStateEx.Position then
|
|
ADest.Brush.Color := clDkGray
|
|
else
|
|
ADest.Brush.Color := clWhite;
|
|
|
|
ADest.Rectangle(dRect);
|
|
|
|
// Draw the slider
|
|
|
|
if i = AStateEx.Position then
|
|
begin
|
|
ADest.Brush.FPColor := TColorToFPColor(ColorToRGB($006BB6E6));
|
|
ADest.Brush.Style := bsSolid;
|
|
ADest.Rectangle(pStart, lDrawingBottom + 1, pStart + 10, lDrawingBottom + 6);
|
|
ADest.Pen.Color := ColorToRGB($005BA6C6);
|
|
ADest.RecTangle(pStart, lDrawingBottom + 2, pStart + 10, lDrawingBottom + 7);
|
|
ADest.Pen.Color := ColorToRGB($006BB6E6);
|
|
ADest.RecTangle(pStart, lDrawingBottom, pStart + 10, lDrawingBottom + 2);
|
|
end;
|
|
pStart := pStart + pStepWidth;
|
|
end;
|
|
|
|
ADest.Pen.Color := ColorToRGB($007BC6F6);
|
|
ADest.Line(7, lDrawingBottom - 1, ASize.cx - 8, lDrawingBottom - 1);
|
|
ADest.Line(7, lDrawingBottom + 1, ASize.cx - 8, lDrawingBottom + 1);
|
|
ADest.Pixels[2, lDrawingBottom - 1] := ADest.Pen.Color;
|
|
ADest.Pixels[4, lDrawingBottom - 2] := ADest.Pen.Color;
|
|
ADest.Pixels[2, lDrawingBottom + 1] := ADest.Pen.Color;
|
|
ADest.Pixels[4, lDrawingBottom + 2] := ADest.Pen.Color;
|
|
ADest.Pixels[6, lDrawingBottom - 3] := ADest.Pen.Color;
|
|
ADest.Pixels[6, lDrawingBottom + 3] := ADest.Pen.Color;
|
|
ADest.Pixels[ASize.cx - 1 - 2, lDrawingBottom - 1] := ADest.Pen.Color;
|
|
ADest.Pixels[ASize.cx - 1 - 4, lDrawingBottom - 2] := ADest.Pen.Color;
|
|
ADest.Pixels[ASize.cx - 1 - 2, lDrawingBottom + 1] := ADest.Pen.Color;
|
|
ADest.Pixels[ASize.cx - 1 - 4, lDrawingBottom + 2] := ADest.Pen.Color;
|
|
ADest.Pixels[ASize.cx - 1 - 6, lDrawingBottom - 3] := ADest.Pen.Color;
|
|
ADest.Pixels[ASize.cx - 1 - 6, lDrawingBottom + 3] := ADest.Pen.Color;
|
|
end;
|
|
|
|
initialization
|
|
RegisterDrawer(TCDDrawerExtra1.Create, dsExtra1);
|
|
end.
|
|
|