355 lines
8.7 KiB
ObjectPascal
355 lines
8.7 KiB
ObjectPascal
unit uRibbon;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Controls, Graphics, BCButton, BCTypes, BGRABitmap, BGRABitmapTypes, LResources;
|
|
|
|
type
|
|
TBCRibbonStyle = (rsTab, rsButton, rsSeparator, rsMenu);
|
|
|
|
|
|
var
|
|
MainColor,TabFntColor,BtnFntColor:TColor;
|
|
BtnNormalColor, BtnHoverColor, BtnClickedColor:TColor;
|
|
TabNormalColor, TabHoverColor, TabClickedColor:TColor;
|
|
ToolNormalColor,ToolHoverColor,ToolClickedColor:TColor;
|
|
|
|
{ StyleButtons }
|
|
|
|
procedure StyleRibbonButtonsSample(AControl: TControl; AStyle: TBCRibbonStyle);
|
|
procedure StyleRibbonBody(AControl: TControl);
|
|
|
|
{ Drawings }
|
|
|
|
procedure DrawTabGradient(ABitmap: TBGRABitmap);
|
|
procedure DrawTitleGradient(ABitmap: TBGRABitmap);
|
|
procedure DrawBodyGradient(ABitmap: TBGRABitmap);
|
|
procedure DrawFormGradient(ABitmap: TBGRABitmap);
|
|
|
|
{ Buttons }
|
|
|
|
procedure RibbonTab(AButton: TBCButton);
|
|
procedure RibbonTool(AButton: TBCButton);
|
|
procedure RibbonButton(AButton: TBCButton);
|
|
procedure RibbonSeparator(AButton: TBCButton);
|
|
procedure RibbonMenu(AButton: TBCButton);
|
|
|
|
implementation
|
|
|
|
{ StyleButtons }
|
|
|
|
procedure StyleButtons(AControl: TControl; AButton: TBCButton);
|
|
var
|
|
i, prevNormalFontHeight, prevHoverFontHeight, prevClickedFontHeight: integer;
|
|
WinControl: TWinControl;
|
|
begin
|
|
if AControl is TBCButton then
|
|
begin
|
|
with TBCButton(AControl) do
|
|
begin
|
|
prevNormalFontHeight := StateNormal.FontEx.Height;
|
|
prevHoverFontHeight := StateHover.FontEx.Height;
|
|
prevClickedFontHeight := StateClicked.FontEx.Height;
|
|
AControl.Assign(AButton);
|
|
StateNormal.FontEx.Height := prevNormalFontHeight;
|
|
StateHover.FontEx.Height := prevHoverFontHeight;
|
|
StateClicked.FontEx.Height := prevClickedFontHeight;
|
|
end;
|
|
end;
|
|
if AControl is TWinControl then
|
|
begin
|
|
WinControl := TWinControl(AControl);
|
|
if WinControl.ControlCount = 0 then
|
|
exit;
|
|
for i := 0 to WinControl.ControlCount - 1 do
|
|
StyleButtons(WinControl.Controls[i], AButton);
|
|
end;
|
|
end;
|
|
|
|
procedure StyleRibbonButtonsSample(AControl: TControl; AStyle: TBCRibbonStyle);
|
|
var
|
|
tempBCButton: TBCButton;
|
|
begin
|
|
tempBCButton := TBCButton.Create(nil);
|
|
case AStyle of
|
|
rsTab: RibbonTab(tempBCButton);
|
|
rsButton: RibbonButton(tempBCButton);
|
|
rsSeparator: RibbonSeparator(tempBCButton);
|
|
rsMenu: RibbonMenu(tempBCButton);
|
|
end;
|
|
StyleButtons(AControl, tempBCButton);
|
|
tempBCButton.Free;
|
|
end;
|
|
|
|
procedure StyleRibbonBody(AControl: TControl);
|
|
var
|
|
i: integer;
|
|
WinControl: TWinControl;
|
|
begin
|
|
if AControl is TWinControl then
|
|
begin
|
|
WinControl := TWinControl(AControl);
|
|
if WinControl.ControlCount = 0 then
|
|
exit;
|
|
for i := 0 to WinControl.ControlCount - 1 do
|
|
begin
|
|
if WinControl.Controls[i] is TBCButton then
|
|
begin
|
|
if WinControl.Controls[i].Caption = '-' then
|
|
begin
|
|
StyleRibbonButtonsSample(WinControl.Controls[i], rsSeparator);
|
|
WinControl.Controls[i].Caption := '';
|
|
end
|
|
else
|
|
StyleRibbonButtonsSample(WinControl.Controls[i], rsButton);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ Drawings }
|
|
|
|
procedure DrawTabGradient(ABitmap: TBGRABitmap);
|
|
var
|
|
r: TLResource;
|
|
bmp: TBGRABitmap;
|
|
begin
|
|
with ABitmap do
|
|
begin
|
|
Fill(MainColor);
|
|
try
|
|
begin
|
|
// bmp := TBGRABitmap.Create('back5.png');
|
|
r:=LazarusResources.Find('ribbon');
|
|
bmp := TBGRABitmap.Create('back5.png');
|
|
ABitmap.PutImage(width-220,1,bmp,dmDrawWithTransparency);
|
|
bmp.Free;
|
|
end;
|
|
except
|
|
end;
|
|
|
|
// DrawHorizLine(0, 0, Width - 1, ColorToBGRA(MainColor));
|
|
DrawHorizLine(1, Height - 1, Width - 2, $00F1F1F1);
|
|
end;
|
|
end;
|
|
|
|
procedure DrawTitleGradient(ABitmap: TBGRABitmap);
|
|
var
|
|
bmp: TBGRABitmap;
|
|
begin
|
|
with ABitmap do
|
|
begin
|
|
Fill(MainColor);
|
|
try
|
|
begin
|
|
bmp := TBGRABitmap.Create('back5.png');
|
|
ABitmap.PutImage(width-300,-68,bmp,dmDrawWithTransparency);
|
|
bmp.Free;
|
|
end;
|
|
except
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure DrawBodyGradient(ABitmap: TBGRABitmap);
|
|
begin
|
|
with ABitmap do
|
|
begin
|
|
{ GradientFill(0, 0, Width, Height, BGRA(247, 251, 255, 255),
|
|
BGRA(220, 231, 245, 255), gtLinear, PointF(0, 0), PointF(0, Height - 3), dmSet);
|
|
Rectangle(0, 0, Width, Height - 2, BGRA(255, 255, 255, 75), BGRAPixelTransparent,
|
|
dmDrawWithTransparency);
|
|
}
|
|
DrawHorizLine(1, Height - 1, Width - 2, $00D2D2D2); //Top
|
|
// DrawVertLine(Width-1, 0, Height-1, ColorToBGRA(MainColor)); //Right
|
|
// DrawVertLine(0, 0, Height-1, ColorToBGRA(MainColor)); //Left
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure DrawFormGradient(ABitmap: TBGRABitmap);
|
|
begin
|
|
with ABitmap do
|
|
begin
|
|
// DrawVertLine(Width-1, 0, Height-1, ColorToBGRA(MainColor)); //Right
|
|
// DrawHorizLine(0, Height - 1, Width - 1, ColorToBGRA(MainColor)); // Bottom
|
|
// DrawVertLine(0, 0, Height-1, ColorToBGRA(MainColor)); //Left
|
|
DrawHorizLine(1, 0, Width - 2, $00E6E6E6); // Top
|
|
// GradientFill(0, 0, Width, Height, BGRA(197, 207, 223, 255),
|
|
// BGRA(220, 229, 242, 255), gtLinear, PointF(0, 0), PointF(0, Height), dmSet);
|
|
end;
|
|
end;
|
|
|
|
{ Buttons }
|
|
|
|
procedure RibbonTab(AButton: TBCButton);
|
|
begin
|
|
with AButton do
|
|
begin
|
|
Rounding.RoundX := 0;
|
|
Rounding.RoundY := 0;
|
|
BorderSpacing.Top := 4;
|
|
with StateNormal do
|
|
begin
|
|
FontEx.Color := clWhite;
|
|
Border.Style := bboNone;
|
|
Background.Color := TabNormalColor;
|
|
Background.Style := bbsColor;
|
|
end;
|
|
with StateHover do
|
|
begin
|
|
FontEx.Color := clWhite;
|
|
Border.Style := bboNone;
|
|
Background.Color := TabHoverColor;
|
|
Background.Style := bbsColor;
|
|
end;
|
|
with StateClicked do
|
|
begin
|
|
FontEx.Color := TabFntColor;
|
|
Border.Style := bboNone;
|
|
Background.Color := TabClickedColor;
|
|
Background.Style := bbsColor;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure RibbonButton(AButton: TBCButton);
|
|
begin
|
|
with AButton do
|
|
begin
|
|
Rounding.RoundX := 0;
|
|
Rounding.RoundY := 0;
|
|
BorderSpacing.Top := 2;
|
|
BorderSpacing.Left := 2;
|
|
BorderSpacing.Right := 0;
|
|
BorderSpacing.Bottom := 16;
|
|
with StateNormal do
|
|
begin
|
|
Border.Style := bboNone;
|
|
Background.Color := BtnNormalColor;
|
|
Background.Style := bbsColor;
|
|
FontEx.Name:='Segoe UI';
|
|
FontEx.Shadow:=FALSE;
|
|
FontEx.Color:=BtnFntColor;
|
|
FontEx.WordBreak:= true;
|
|
FontEx.TextAlignment := bcaCenterTop;
|
|
FontEx.Style:=[];
|
|
end;
|
|
with StateHover do
|
|
begin
|
|
Border.Style := bboNone;
|
|
Background.Color := BtnHoverColor;
|
|
Background.Style := bbsColor;
|
|
FontEx.Name:='Segoe UI';
|
|
FontEx.Shadow:=FALSE;
|
|
FontEx.Color:=BtnFntColor;
|
|
FontEx.WordBreak:= true;
|
|
FontEx.TextAlignment := bcaCenterTop;
|
|
FontEx.Style:=[];
|
|
end;
|
|
with StateClicked do
|
|
begin
|
|
Border.Style := bboNone;
|
|
Background.Color := BtnClickedColor;
|
|
Background.Style := bbsColor;
|
|
FontEx.Name:='Segoe UI';
|
|
FontEx.Shadow:=FALSE;
|
|
FontEx.Color:=BtnFntColor;
|
|
FontEx.WordBreak:= true;
|
|
FontEx.TextAlignment := bcaCenterTop;
|
|
FontEx.Style:=[];
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure RibbonTool(AButton: TBCButton);
|
|
begin
|
|
with AButton do
|
|
begin
|
|
Rounding.RoundX := 0;
|
|
Rounding.RoundY := 0;
|
|
BorderSpacing.Around := 2;
|
|
BorderSpacing.Bottom := 2;
|
|
|
|
with StateNormal do
|
|
begin
|
|
FontEx.Color := clWhite;
|
|
Border.Style := bboNone;
|
|
Background.Color := ToolNormalColor;
|
|
Background.Style := bbsColor;
|
|
end;
|
|
with StateHover do
|
|
begin
|
|
FontEx.Color := clWhite;
|
|
Border.Style := bboNone;
|
|
Background.Color := ToolHoverColor;
|
|
Background.Style := bbsColor;
|
|
end;
|
|
with StateClicked do
|
|
begin
|
|
FontEx.Color := clWhite;
|
|
Border.Style := bboNone;
|
|
Background.Color := ToolClickedColor;
|
|
Background.Style := bbsColor;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure RibbonSeparator(AButton: TBCButton);
|
|
begin
|
|
with AButton do
|
|
begin
|
|
StaticButton := True;
|
|
Color:=clNone;
|
|
BorderSpacing.Top:=2;
|
|
BorderSpacing.Bottom:=2;
|
|
ParentColor:= FALSE;
|
|
with StateNormal do
|
|
begin
|
|
Border.Color := $00D2D0CF;
|
|
Border.ColorOpacity := 255;
|
|
Border.Style:=bboSolid;
|
|
Background.Color := $00d2d2d2;
|
|
Background.Style := bbsColor;
|
|
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure RibbonMenu(AButton: TBCButton);
|
|
begin
|
|
with AButton do
|
|
begin
|
|
Rounding.RoundX := 0;
|
|
Rounding.RoundY := 0;
|
|
BorderSpacing.Top := 4;
|
|
with StateNormal do
|
|
begin
|
|
FontEx.Color := clWhite;
|
|
Border.Style := bboNone;
|
|
Background.Color := TabNormalColor;
|
|
Background.Style := bbsColor;
|
|
end;
|
|
with StateHover do
|
|
begin
|
|
FontEx.Color := clWhite;
|
|
Border.Style := bboNone;
|
|
Background.Color := TabHoverColor;
|
|
Background.Style := bbsColor;
|
|
end;
|
|
with StateClicked do
|
|
begin
|
|
FontEx.Color := $009A572A;
|
|
Border.Style := bboNone;
|
|
Background.Color := TabClickedColor;
|
|
Background.Style := bbsColor;
|
|
end;
|
|
end;
|
|
|
|
end;
|
|
end.
|