SpkToolbar: Refactor small button painting.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5367 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2016-11-18 21:49:56 +00:00
parent b7e5090cc1
commit bbe5b1e8a3

View File

@ -758,6 +758,7 @@ var
gradientKind: TBackgroundKind;
x: Integer;
y: Integer;
delta: Integer;
cornerRadius: Integer;
imgList: TImageList;
txtHeight: Integer;
@ -774,6 +775,7 @@ begin
if (FRect.Width < 2*LargeButtonRadius) or (FRect.Height < 2*LargeButtonRadius) then
exit;
delta := 40;
case FAppearance.Element.Style of
esRounded:
cornerRadius := LargeButtonRadius;
@ -803,11 +805,11 @@ begin
drawBtn := true;
if (FButtonState in [bsBtnHottrack, bsBtnPressed]) then
begin
frameColor := TColorTools.Brighten(FAppearance.Element.HotTrackFrameColor, 40);
innerLightColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerLightColor, 40);
innerDarkColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerDarkColor, 40);
gradientFromColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientFromColor, 40);
gradientToColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientToColor, 40);
frameColor := TColorTools.Brighten(FAppearance.Element.HotTrackFrameColor, delta);
innerLightColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerLightColor, delta);
innerDarkColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerDarkColor, delta);
gradientFromColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientFromColor, delta);
gradientToColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientToColor, delta);
gradientKind := FAppearance.Element.HotTrackGradientType;
end else
if (FButtonState = bsDropdownHottrack) then
@ -872,11 +874,11 @@ begin
end else
if (FButtonState in [bsDropdownHotTrack, bsDropdownPressed]) then
begin
frameColor := TColorTools.Brighten(FAppearance.Element.HotTrackFrameColor, 40);
innerDarkColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerDarkColor, 40);
innerLightColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerLightColor, 40);
gradientFromColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientFromColor, 40);
gradientToColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientToColor, 40);
frameColor := TColorTools.Brighten(FAppearance.Element.HotTrackFrameColor, delta);
innerDarkColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerDarkColor, delta);
innerLightColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerLightColor, delta);
gradientFromColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientFromColor, delta);
gradientToColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientToColor, delta);
gradientKind := FAppearance.Element.HotTrackGradientType;
end else
drawBtn := false;
@ -1277,14 +1279,17 @@ end;
procedure TSpkSmallButton.Draw(ABuffer: TBitmap; ClipRect: T2DIntRect);
var
fontColor: TColor;
x: Integer;
y: Integer;
frameColor, innerLightColor, innerDarkColor: TColor;
gradientFromColor, gradientToColor: TColor;
gradientKind: TBackgroundKind;
P: T2DIntPoint;
x, y: Integer;
delta: Integer;
cornerRadius: Integer;
imgList: TImageList;
drawBtn: Boolean;
begin
if FToolbarDispatch = nil then
exit;
if FAppearance = nil then
if (FToolbarDispatch = nil) or (FAppearance = nil) then
exit;
if (FRect.Width < 2*SmallButtonRadius) or (FRect.Height < 2*SmallButtonRadius) then
@ -1297,96 +1302,58 @@ begin
cornerRadius := 0;
end;
fontColor := clNone;
case FButtonState of
bsIdle:
fontColor := FAppearance.Element.IdleCaptionColor;
bsBtnHottrack,
bsDropdownHottrack:
fontColor := FAppearance.Element.HotTrackCaptionColor;
bsBtnPressed,
bsDropdownPressed:
fontColor := FAppearance.ELement.ActiveCaptionColor;
end;
if not FEnabled then
fontColor := TColorTools.ColorToGrayscale(fontColor);
// *** Przycisk ***
// T³o i ramka
{$REGION 'Rysowanie przycisku'}
if (FButtonState = bsIdle) and (not(FHideFrameWhenIdle)) then
// Button (Background and frame)
drawBtn := true;
if (FButtonState = bsIdle) and (not FHideFrameWhenIdle) then
begin
with FAppearance.Element do
TButtonTools.DrawButton(
ABuffer,
FButtonRect,
IdleFrameColor,
IdleInnerLightColor,
IdleInnerDarkColor,
IdleGradientFromColor,
IdleGradientToColor,
IdleGradientType,
(FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]),
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) or (FButtonKind = bkButtonDropdown),
false,
false,
cornerRadius,
ClipRect
);
end
else if (FButtonState = bsBtnHottrack) then
begin
with FAppearance.Element do
TButtonTools.DrawButton(
ABuffer,
FButtonRect,
HotTrackFrameColor,
HotTrackInnerLightColor,
HotTrackInnerDarkColor,
HotTrackGradientFromColor,
HotTrackGradientToColor,
HotTrackGradientType,
(FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]),
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) or (FButtonKind = bkButtonDropdown),
false,
false,
cornerRadius,
ClipRect
);
frameColor := FAppearance.Element.IdleFrameColor;
innerLightColor := FAppearance.Element.IdleInnerLightColor;
innerDarkColor := FAppearance.Element.IdleInnerDarkColor;
gradientFromColor := FAppearance.Element.IdleGradientFromColor;
gradientToColor := FAppearance.Element.IdleGradientToColor;
gradientKind := FAppearance.Element.IdleGradientType;
end else
if (FButtonState = bsBtnPressed) then
if FButtonState = bsBtnHottrack then
begin
with FAppearance.Element do
TButtonTools.DrawButton(ABuffer,
FButtonRect,
ActiveFrameColor,
ActiveInnerLightColor,
ActiveInnerDarkColor,
ActiveGradientFromColor,
ActiveGradientToColor,
ActiveGradientType,
(FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]),
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) or (FButtonKind = bkButtonDropdown),
false,
false,
cornerRadius,
ClipRect
);
frameColor := FAppearance.Element.HotTrackFrameColor;
innerLightColor := FAppearance.Element.HotTrackInnerLightColor;
innerDarkColor := FAppearance.Element.HotTrackInnerDarkColor;
gradientFromColor := FAppearance.Element.HotTrackGradientFromColor;
gradientToColor := FAppearance.Element.HotTrackGradientToColor;
gradientKind := FAppearance.Element.HotTrackGradientType;
end else
if FButtonState = bsBtnPressed then
begin
frameColor := FAppearance.Element.ActiveFrameColor;
innerDarkColor := FAppearance.Element.ActiveInnerDarkColor;
innerLightColor := FAppearance.Element.ActiveInnerLightColor;
gradientFromColor := FAppearance.Element.ActiveGradientFromColor;
gradientToColor := FAppearance.Element.ActiveGradientToColor;
gradientKind := FAppearance.Element.ActiveGradientType;
end else
if (FButtonState in [bsDropdownHotTrack, bsDropdownPressed]) then
begin
with FAppearance.Element do
delta := 40;
frameColor := TColorTools.Brighten(FAppearance.Element.HotTrackFrameColor, delta);
innerDarkColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerDarkColor, delta);
innerLightColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerLightColor, delta);
gradientFromColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientFromColor, delta);
gradientToColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientToColor, delta);
gradientKind := FAppearance.Element.HotTrackGradientType;
end else
drawBtn := false;
if drawBtn then
begin
TButtonTools.DrawButton(
ABuffer,
FButtonRect,
TColorTools.Brighten(HotTrackFrameColor, 40),
TColorTools.Brighten(HotTrackInnerLightColor, 40),
TColorTools.Brighten(HotTrackInnerDarkColor, 40),
TColorTools.Brighten(HotTrackGradientFromColor, 40),
TColorTools.Brighten(HotTrackGradientToColor, 40),
HotTrackGradientType,
FButtonRect, // draw button part only
frameColor,
innerLightColor,
innerDarkColor,
gradientFromColor,
gradientToColor,
gradientKind,
(FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]),
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) or (FButtonKind = bkButtonDropdown),
false,
@ -1395,7 +1362,6 @@ begin
ClipRect
);
end;
{$ENDREGION}
// Icon
if not FEnabled and (FDisabledImages <> nil) then
@ -1410,25 +1376,37 @@ begin
else
x := FButtonRect.Left + SmallButtonBorderWidth + SmallButtonPadding;
y := FButtonRect.top + (FButtonRect.height - imgList.Height) div 2;
P := {$IFDEF EnhancedRecordSupport}T2DIntPoint.Create{$ELSE}Create2DIntPoint{$ENDIF}(x, y);
TGUITools.DrawImage(
ABuffer.Canvas,
imgList,
FImageIndex,
{$IFDEF EnhancedRecordSupport}
T2DIntPoint.Create(x,y),
{$ELSE}
Create2DIntPoint(x,y),
{$ENDIF}
P,
ClipRect
);
end;
// Prepare font and chevron color
fontColor := clNone;
case FButtonState of
bsIdle:
fontColor := FAppearance.Element.IdleCaptionColor;
bsBtnHottrack,
bsDropdownHottrack:
fontColor := FAppearance.Element.HotTrackCaptionColor;
bsBtnPressed,
bsDropdownPressed:
fontColor := FAppearance.ELement.ActiveCaptionColor;
end;
if not FEnabled then
fontColor := TColorTools.ColorToGrayscale(fontColor);
// Text
if FShowCaption then
begin
ABuffer.Canvas.Font.Assign(FAppearance.Element.CaptionFont);
ABuffer.Canvas.Font.Color := fontColor;
if (FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]) then
x := FButtonRect.Left + SmallButtonHalfBorderWidth
else
@ -1443,87 +1421,59 @@ begin
TGUITools.DrawText(ABuffer.Canvas, x, y, FCaption, fontColor, ClipRect);
end;
// Dropdown
if FButtonKind = bkButton then
begin
// Nic dodatkowego do rysowania
end else
// Dropdown button
if FButtonKind = bkButtonDropdown then
begin
// T³o i ramka
{$REGION 'Rysowanie dropdowna'}
drawBtn := true;
if (FButtonState = bsIdle) and (not FHideFrameWhenIdle) then
begin
with FAppearance.Element do
TButtonTools.DrawButton(
ABuffer,
FDropdownRect,
IdleFrameColor,
IdleInnerLightColor,
IdleInnerDarkColor,
IdleGradientFromColor,
IdleGradientToColor,
IdleGradientType,
true,
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]),
false,
false,
cornerRadius,
ClipRect
);
frameColor := FAppearance.Element.IdleFrameColor;
innerLightColor := FAppearance.Element.IdleInnerLightColor;
innerDarkColor := FAppearance.Element.IdleInnerDarkColor;
gradientFromColor := FAppearance.Element.IdleGradientFromColor;
gradientToColor := FAppearance.Element.IdleGradientToColor;
gradientKind := FAppearance.Element.IdleGradientType;
end else
if (FButtonState in [bsBtnHotTrack, bsBtnPressed]) then
if (FButtonState in [bsBtnHottrack, bsBtnPressed]) then
begin
with FAppearance.Element do
TButtonTools.DrawButton(
ABuffer,
FDropdownRect,
TColorTools.Brighten(HotTrackFrameColor, 40),
TColorTools.Brighten(HotTrackInnerLightColor, 40),
TColorTools.Brighten(HotTrackInnerDarkColor, 40),
TColorTools.Brighten(HotTrackGradientFromColor, 40),
TColorTools.Brighten(HotTrackGradientToColor, 40),
HotTrackGradientType,
true,
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]),
false,
false,
cornerRadius,
ClipRect
);
delta := 40;
frameColor := TColorTools.Brighten(FAppearance.Element.HotTrackFrameColor, delta);
innerLightColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerLightColor, delta);
innerDarkColor := TColorTools.Brighten(FAppearance.Element.HotTrackInnerDarkColor, delta);
gradientFromColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientFromColor, delta);
gradientToColor := TColorTools.Brighten(FAppearance.Element.HotTrackGradientToColor, delta);
gradientKind := FAppearance.Element.HotTrackGradientType;
end else
if (FButtonState = bsDropdownHottrack) then
begin
with FAppearance.Element do
TButtonTools.DrawButton(
ABuffer,
FDropdownRect,
HotTrackFrameColor,
HotTrackInnerLightColor,
HotTrackInnerDarkColor,
HotTrackGradientFromColor,
HotTrackGradientToColor,
HotTrackGradientType,
true,
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]),
false,
false,
cornerRadius,
ClipRect
);
frameColor := FAppearance.Element.HotTrackFrameColor;
innerLightColor := FAppearance.Element.HotTrackInnerLightColor;
innerDarkColor := FAppearance.Element.HotTrackInnerDarkColor;
gradientFromColor := FAppearance.Element.HotTrackGradientFromColor;
gradientToColor := FAppearance.Element.HotTrackGradientToColor;
gradientKind := FAppearance.Element.HotTrackGradientType;
end else
if (FButtonState = bsDropdownPressed) then
begin
with FAppearance.Element do
frameColor := FAppearance.Element.ActiveFrameColor;
innerlightColor := FAppearance.Element.ActiveInnerLightColor;
innerDarkColor := FAppearance.Element.ActiveInnerDarkColor;
gradientFromColor := FAppearance.Element.ActiveGradientFromColor;
gradientToColor := FAppearance.Element.ActiveGradientToColor;
gradientKind := FAppearance.Element.ActiveGradientType;
end else
drawBtn := false;
if drawBtn then begin
TButtonTools.DrawButton(
ABuffer,
FDropdownRect,
ActiveFrameColor,
ActiveInnerLightColor,
ActiveInnerDarkColor,
ActiveGradientFromColor,
ActiveGradientToColor,
ActiveGradientType,
frameColor,
innerLightColor,
innerDarkColor,
gradientFromColor,
gradientToColor,
gradientKind,
true,
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]),
false,
@ -1532,39 +1482,32 @@ begin
ClipRect
);
end;
end;
// Chevron
// to do: what if font 'Marlett' does not exist?
ABuffer.Canvas.Font.Charset := DEFAULT_CHARSET;
ABuffer.Canvas.Font.Name := 'Marlett';
ABuffer.Canvas.Font.Style := [];
ABuffer.Canvas.Font.Orientation := 0;
if FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup] then
x := FDropdownRect.Right - SmallButtonHalfBorderWidth - (SmallButtonDropdownWidth + ABuffer.Canvas.Textwidth('u')) div 2 + 1
else
x := FDropdownRect.Right - SmallButtonBorderWidth - (SmallButtonDropdownWidth + ABuffer.Canvas.Textwidth('u')) div 2 + 1;
y := FDropdownRect.top + (FDropdownRect.Height - ABuffer.Canvas.Textheight('u')) div 2;
TGUITools.DrawText(ABuffer.Canvas, x, y, 'u', fontColor, ClipRect);
{$ENDREGION}
end else
if FButtonKind = bkDropdown then
begin
// Chevron dropdown
// to do: what if font 'Marlett' does not exist?
ABuffer.Canvas.Font.Charset := DEFAULT_CHARSET;
ABuffer.Canvas.Font.Name := 'Marlett';
ABuffer.Canvas.Font.Style := [];
ABuffer.Canvas.Font.Orientation := 0;
if FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup] then
x := FButtonRect.Right - SmallButtonHalfBorderWidth - (SmallButtonDropdownWidth + ABuffer.Canvas.Textwidth('u')) div 2 + 1
else
x := FButtonRect.Right - SmallButtonBorderWidth - (SmallButtonDropdownWidth + ABuffer.Canvas.Textwidth('u')) div 2 + 1;
y := FButtonRect.top + (FButtonRect.height - ABuffer.Canvas.Textheight('u')) div 2;
TGUITools.DrawText(ABuffer.Canvas, x, y, 'u', fontColor, ClipRect);
end else
if FButtonKind = bkButtonDropdown then
begin
if FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup] then
x := FDropdownRect.Right - SmallButtonHalfBorderWidth - (SmallButtonDropdownWidth + ABuffer.Canvas.Textwidth('u')) div 2 + 1
else
x := FDropdownRect.Right - SmallButtonBorderWidth - (SmallButtonDropdownWidth + ABuffer.Canvas.Textwidth('u')) div 2 + 1;
y := FDropdownRect.top + (FDropdownRect.Height - ABuffer.Canvas.Textheight('u')) div 2;
TGUITools.DrawText(ABuffer.Canvas, x, y, 'u', FontColor, ClipRect);
end;
{$ENDREGION}
end;
function TSpkSmallButton.GetDropdownPoint: T2DIntPoint;