mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-05 08:37:58 +02:00
203 lines
5.4 KiB
PHP
203 lines
5.4 KiB
PHP
{%MainUnit ../dialogs.pp}
|
|
|
|
{******************************************************************************
|
|
TColorButton
|
|
******************************************************************************
|
|
|
|
*****************************************************************************
|
|
This file is part of the Lazarus Component Library (LCL)
|
|
|
|
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
|
for details about the license.
|
|
*****************************************************************************
|
|
}
|
|
|
|
{ TColorButton }
|
|
|
|
constructor TColorButton.Create(AnOwner: TComponent);
|
|
begin
|
|
Inherited Create(AnOwner);
|
|
FButtonColorSize := 16;
|
|
FBorderWidth := 2;
|
|
FButtonColorAutoSize := True;
|
|
FDisabledPattern := nil;
|
|
with GetControlClassDefaultSize do
|
|
SetInitialBounds(0, 0, CX, CY);
|
|
end;
|
|
|
|
destructor TColorButton.Destroy;
|
|
begin
|
|
FreeAndNil(FDisabledPattern);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TColorButton.SetButtonColor(const AValue: TColor);
|
|
begin
|
|
if AValue = FButtonColor then Exit;
|
|
FButtonColor := AValue;
|
|
if Assigned(FOnColorChanged) and (not (csLoading in ComponentState)) then
|
|
FOnColorChanged(Self);
|
|
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TColorButton.SetBorderWidth(const AValue: Integer);
|
|
begin
|
|
if FBorderWidth = AValue then Exit;
|
|
FBorderWidth := AValue;
|
|
|
|
if FButtonColorAutoSize then Invalidate;
|
|
end;
|
|
|
|
function TColorButton.IsButtonColorAutoSizeStored: boolean;
|
|
begin
|
|
Result := FButtonColorAutoSize = False;
|
|
end;
|
|
|
|
procedure TColorButton.SetButtonColorAutoSize(const AValue: Boolean);
|
|
begin
|
|
if FButtonColorAutoSize = AValue then Exit;
|
|
FButtonColorAutoSize := AValue;
|
|
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TColorButton.ShowColorDialog;
|
|
var
|
|
NewColor: TColor;
|
|
FreeDialog: Boolean;
|
|
begin
|
|
if not Enabled then Exit;
|
|
|
|
FreeDialog := FColorDialog = nil;
|
|
if FColorDialog = nil then FColorDialog := TColorDialog.Create(GetTopParent);
|
|
try
|
|
NewColor := ButtonColor;
|
|
FColorDialog.Color := ButtonColor;
|
|
if FColorDialog.Execute then
|
|
NewColor := FColorDialog.Color;
|
|
finally
|
|
if FreeDialog then FreeAndNil(FColorDialog);
|
|
end;
|
|
ButtonColor := NewColor;
|
|
end;
|
|
|
|
function TColorButton.GetGlyphSize(Drawing: boolean; PaintRect: TRect): TSize;
|
|
var
|
|
T: TSize;
|
|
S: Integer;
|
|
M: LongInt;
|
|
begin
|
|
if ButtonColorAutoSize and Drawing then
|
|
begin
|
|
T := GetTextSize(Drawing, PaintRect); // ToDo: wordbreak
|
|
//debugln(['TColorButton.GetGlyphSize ',DbgSName(Self),' Caption=',dbgstr(Caption),' T=',dbgs(T),' BorderWidth=',BorderWidth]);
|
|
if (T.cx = 0) or (T.cy=0) then S := 0
|
|
else S := Spacing;
|
|
M:=BorderWidth;
|
|
if Margin>=0 then
|
|
M:=Margin;
|
|
|
|
if Layout in [blGlyphLeft, blGlyphRight] then
|
|
begin
|
|
Result.CX := PaintRect.Right - PaintRect.Left - 2 * M - S - T.CX;
|
|
Result.CY := PaintRect.Bottom - PaintRect.Top - 2 * M;
|
|
end
|
|
else
|
|
begin
|
|
Result.CX := PaintRect.Right - PaintRect.Left - 2 * M;
|
|
Result.CY := PaintRect.Bottom - PaintRect.Top - 2 * M - S - T.CY;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
Result.CX := ButtonColorSize;
|
|
Result.CY := ButtonColorSize;
|
|
end;
|
|
//debugln(['TColorButton.GetGlyphSize ',DbgSName(Self),' Drawing=',Drawing,' PaintRect=',dbgs(PaintRect),' Result=',dbgs(Result),' BoundsRect=',dbgs(BoundsRect),' Spacing=',Spacing,' Margin=',Margin]);
|
|
end;
|
|
|
|
procedure TColorButton.DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy;
|
|
const AXProportion, AYProportion: Double);
|
|
begin
|
|
inherited;
|
|
if AMode in [lapAutoAdjustWithoutHorizontalScrolling, lapAutoAdjustForDPI] then
|
|
begin
|
|
FButtonColorSize := round(FButtonColorSize * AXProportion);
|
|
FBorderWidth := round(FBorderWidth * AXProportion);
|
|
end;
|
|
end;
|
|
|
|
function TColorButton.DrawGlyph(ACanvas: TCanvas; const AClient: TRect;
|
|
const AOffset: TPoint; AState: TButtonState; ATransparent: Boolean;
|
|
BiDiFlags: Longint): TRect;
|
|
var
|
|
Size: TSize;
|
|
begin
|
|
//debugln(['TColorButton.DrawGlyph ',DbgSName(Self),' AClient=',dbgs(AClient),' Offset=',dbgs(AOffset),' ']);
|
|
Canvas.Pen.Color := clBlack;
|
|
if AState = bsDisabled then
|
|
begin
|
|
Canvas.Brush.Color := Color;
|
|
Canvas.Brush.Bitmap := GetDisabledPattern;
|
|
end
|
|
else
|
|
begin
|
|
Canvas.Brush.Bitmap := nil;
|
|
Canvas.Brush.Color := ButtonColor;
|
|
end;
|
|
Size := GetGlyphSize(true,AClient);
|
|
|
|
Result := Bounds(AClient.Left + AOffset.X, AClient.Top + AOffset.Y,
|
|
Size.CX - 1, Size.CY - 1);
|
|
Canvas.Rectangle(Result);
|
|
end;
|
|
|
|
class function TColorButton.GetControlClassDefaultSize: TSize;
|
|
begin
|
|
Result.CX := 75;
|
|
Result.CY := 25;
|
|
end;
|
|
|
|
procedure TColorButton.Notification(AComponent: TComponent; Operation: TOperation);
|
|
begin
|
|
inherited Notification(AComponent, Operation);
|
|
if (Operation = opRemove) and (AComponent = FColorDialog) then
|
|
FColorDialog := nil;
|
|
end;
|
|
|
|
procedure TColorButton.SetButtonColorSize(const AValue: Integer);
|
|
begin
|
|
if FButtonColorSize = AValue then Exit;
|
|
FButtonColorSize := AValue;
|
|
|
|
Invalidate;
|
|
end;
|
|
|
|
class procedure TColorButton.WSRegisterClass;
|
|
begin
|
|
inherited WSRegisterClass;
|
|
RegisterColorButton;
|
|
end;
|
|
|
|
function TColorButton.GetDisabledPattern: TBitmap;
|
|
const
|
|
LineBitsDotted: array[0..7] of Word = ($55, $AA, $55, $AA, $55, $AA, $55, $AA);
|
|
begin
|
|
if FDisabledPattern = nil then
|
|
begin
|
|
FDisabledPattern := TBitmap.Create;
|
|
FDisabledPattern.SetHandles(CreateBitmap(8, 8, 1, 1, @LineBitsDotted), 0);
|
|
end;
|
|
Result := FDisabledPattern;
|
|
end;
|
|
|
|
procedure TColorButton.Click;
|
|
begin
|
|
inherited Click;
|
|
ShowColorDialog;
|
|
end;
|
|
|
|
|
|
// included by buttons.pp
|