diff --git a/components/customdrawn/examples/controls/cdcontrolstest.lpi b/components/customdrawn/examples/controls/cdcontrolstest.lpi
index 1068c6de8d..211b6bc675 100644
--- a/components/customdrawn/examples/controls/cdcontrolstest.lpi
+++ b/components/customdrawn/examples/controls/cdcontrolstest.lpi
@@ -36,12 +36,12 @@
-
+
@@ -49,6 +49,7 @@
+
diff --git a/components/customdrawn/examples/controls/toolbartest.pas b/components/customdrawn/examples/controls/toolbartest.pas
index f304cc23a2..d9ec899a04 100644
--- a/components/customdrawn/examples/controls/toolbartest.pas
+++ b/components/customdrawn/examples/controls/toolbartest.pas
@@ -47,16 +47,25 @@ var
lBmp: TBitmap;
lItem: TCDToolBarItem;
begin
- lBmp := TBitmap.Create;
lToolBar := TCDToolBar.Create(Self);
lToolBar.Parent := Self;
+
+ lBmp := TBitmap.Create;
lBmp.LoadFromFile('/usr/share/magnifier/lupa.bmp');
lItem := lToolBar.AddItem(tikButton);
lItem.Image := lBmp;
lItem.Caption := 'Btn 1';
- lToolBar.Parent := Self;
- lToolBar.Parent := Self;
+
+ lItem := lToolBar.AddItem(tikSeparator);
+
+ lBmp := TBitmap.Create;
+ lBmp.LoadFromFile('/usr/share/magnifier/usplegal.bmp');
+ lItem := lToolBar.AddItem(tikCheckButton);
+ lItem.Image := lBmp;
+ lItem.Caption := 'Btn 2';
+
+ lItem := lToolBar.AddItem(tikDivider);
end;
procedure TFormToolBar.FormShow(Sender: TObject);
diff --git a/lcl/customdrawn_common.pas b/lcl/customdrawn_common.pas
index 064f2b28b0..741e64665a 100644
--- a/lcl/customdrawn_common.pas
+++ b/lcl/customdrawn_common.pas
@@ -1626,6 +1626,7 @@ var
lItemSize: TSize;
i: Integer;
lCurItem: TCDToolBarItem;
+ lItemState: TCDControlState = [];
begin
// Background
ADest.Pen.Style := psSolid;
@@ -1642,20 +1643,58 @@ begin
begin
lCurItem := TCDToolBarItem(AStateEx.Items[i]);
lItemSize.CX := lCurItem.Width;
- DrawToolBarItem(ADest, lItemSize, lCurItem, lX, lY, AState, AStateEx);
+ DrawToolBarItem(ADest, lItemSize, lCurItem, lX, lY, lCurItem.State, AStateEx);
lX := lX + lCurItem.Width;
end;
end;
procedure TCDDrawerCommon.DrawToolBarItem(ADest: TCanvas; ASize: TSize;
ACurItem: TCDToolBarItem; AX, AY: Integer; AState: TCDControlState; AStateEx: TCDToolBarStateEx);
+var
+ lX, lY1, lY2: Integer;
+
+ procedure DrawToolBarItemBorder();
+ begin
+ ADest.Pen.Style := psSolid;
+ ADest.Pen.Color := $AFAFAF;
+ ADest.Brush.Style := bsClear;
+ ADest.Rectangle(Bounds(AX, AY, ASize.cx, ASize.cy));
+ end;
+
begin
- // Background
- ADest.Pen.Style := psSolid;
- ADest.Pen.Color := AStateEx.ParentRGBColor;
- ADest.Brush.Style := bsSolid;
- ADest.Brush.Color := clWhite;
- ADest.Rectangle(AX, AY, ASize.cx, ASize.cy);
+ // tikDivider is centralized, tikSeparator is left-aligned
+ if ACurItem.Kind in [tikSeparator, tikDivider] then
+ begin
+ lX := AX;
+ if ACurItem.Kind = tikDivider then
+ lX := AX + ASize.CX div 2 - 1;
+
+ lY1 := AY;
+ lY2 := AY+ASize.CY;
+
+ ADest.Pen.Style := psSolid;
+ ADest.Pen.Color := $DCDEE1;
+ ADest.Line(lX+1, lY1, lX+1, lY2);
+ ADest.Line(lX+3, lY1, lX+3, lY2);
+ ADest.Pen.Style := psSolid;
+ ADest.Pen.Color := $93979E;
+ ADest.Line(lX+2, lY1, lX+2, lY2);
+ end
+ else
+ begin
+ if csfSunken in AState then
+ begin
+ ADest.GradientFill(Bounds(AX, AY, ASize.CX, ASize.CY),
+ $C4C4C4, $DBDBDB, gdVertical);
+ DrawToolBarItemBorder();
+ end
+ else if csfMouseOver in AState then
+ begin
+ ADest.GradientFill(Bounds(AX, AY, ASize.CX, ASize.CY),
+ $E3E3E3, $F7F7F7, gdVertical);
+ DrawToolBarItemBorder();
+ end;
+ end;
end;
procedure TCDDrawerCommon.DrawCTabControl(ADest: TCanvas;
diff --git a/lcl/customdrawncontrols.pas b/lcl/customdrawncontrols.pas
index 29b67be880..5721b5105c 100644
--- a/lcl/customdrawncontrols.pas
+++ b/lcl/customdrawncontrols.pas
@@ -616,6 +616,12 @@ type
function GetControlId: TCDControlID; override;
procedure CreateControlStateEx; override;
procedure PrepareControlStateEx; override;
+ // mouse
+ procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
+ procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
+ X, Y: integer); override;
+ procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override;
+ procedure MouseLeave; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
@@ -623,6 +629,9 @@ type
function AddItem(AKind: TCDToolbarItemKind): TCDToolBarItem;
procedure DeleteItem(AIndex: Integer);
function GetItem(AIndex: Integer): TCDToolBarItem;
+ function GetItemCount(): Integer;
+ function GetItemWithMousePos(APosInControl: TPoint): TCDToolBarItem;
+ function IsPosInButton(APosInControl: TPoint; AItem: TCDToolBarItem; AItemX: Integer): Boolean;
published
property ShowCaptions: Boolean read FShowCaptions write SetShowCaptions;
property DrawStyle;
@@ -2889,11 +2898,87 @@ begin
end;
procedure TCDToolBar.PrepareControlStateEx;
+var
+ i, lX: Integer;
+ lCursorPos: TPoint;
+ lCurItem: TCDToolBarItem;
begin
inherited PrepareControlStateEx;
FTBState.ShowCaptions := FShowCaptions;
FTBState.Items := FItems;
FTBState.ToolBarHeight := Height;
+
+ // Handle mouse over items
+ lCursorPos := Mouse.CursorPos;
+ lCursorPos := ScreenToClient(lCursorPos);
+ lX := 0;
+ for i := 0 to GetItemCount()-1 do
+ begin
+ lCurItem := GetItem(i);
+ lCurItem.State := lCurItem.State - [csfMouseOver];
+ if IsPosInButton(lCursorPos, lCurItem, lX) then
+ lCurItem.State := lCurItem.State + [csfMouseOver];
+ if lCurItem.Down then
+ lCurItem.State := lCurItem.State + [csfSunken];
+ lX := lX + lCurItem.Width;
+ end;
+end;
+
+procedure TCDToolBar.MouseMove(Shift: TShiftState; X, Y: integer);
+begin
+ inherited MouseMove(Shift, X, Y);
+ Invalidate;
+end;
+
+procedure TCDToolBar.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: integer);
+var
+ lCurItem: TCDToolBarItem;
+begin
+ inherited MouseDown(Button, Shift, X, Y);
+ lCurItem := GetItemWithMousePos(Point(X, Y));
+ if lCurItem = nil then Exit;
+ if lCurItem.Kind in [tikButton, tikCheckButton] then
+ begin
+ lCurItem.State := lCurItem.State + [csfSunken];
+ Invalidate();
+ end;
+end;
+
+procedure TCDToolBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer);
+var
+ i: Integer;
+ lCurItem: TCDToolBarItem;
+ DoInvalidate: Boolean = False;
+begin
+ inherited MouseUp(Button, Shift, X, Y);
+ lCurItem := GetItemWithMousePos(Point(X, Y));
+ if lCurItem = nil then Exit;
+
+ // click the selected checkbutton if applicable
+ if lCurItem.Kind in [tikCheckButton] then
+ begin
+ lCurItem.Down := not lCurItem.Down;
+ DoInvalidate := True;
+ end;
+
+ // up all buttons
+ for i := 0 to GetItemCount()-1 do
+ begin
+ lCurItem := GetItem(i);
+ if lCurItem.Kind in [tikButton, tikCheckButton] then
+ begin
+ lCurItem.State := lCurItem.State - [csfSunken];
+ DoInvalidate := True;
+ end;
+ end;
+
+ if DoInvalidate then Invalidate;
+end;
+
+procedure TCDToolBar.MouseLeave;
+begin
+ inherited MouseLeave;
+ Invalidate;
end;
constructor TCDToolBar.Create(AOwner: TComponent);
@@ -2942,6 +3027,38 @@ begin
Result := TCDToolBarItem(FItems.Items[AIndex]);
end;
+function TCDToolBar.GetItemCount: Integer;
+begin
+ Result := FItems.Count;
+end;
+
+function TCDToolBar.GetItemWithMousePos(APosInControl: TPoint): TCDToolBarItem;
+var
+ i, lX: Integer;
+ lCurItem: TCDToolBarItem;
+begin
+ Result := nil;
+ lX := 0;
+ for i := 0 to FItems.Count-1 do
+ begin
+ lCurItem := GetItem(i);
+ if IsPosInButton(APosInControl, lCurItem, lX) then
+ Exit(lCurItem);
+ lX := lX + lCurItem.Width;
+ end;
+end;
+
+function TCDToolBar.IsPosInButton(APosInControl: TPoint; AItem: TCDToolBarItem;
+ AItemX: Integer): Boolean;
+var
+ lSize: TSize;
+begin
+ lSize.CY := Height;
+ lSize.CX := AItem.Width;
+ Result := (APosInControl.X > AItemX) and (APosInControl.X < AItemX + lSize.CX) and
+ (APosInControl.Y > 0) and (APosInControl.Y < lSize.CY);
+end;
+
{ TCDTabSheet }
procedure TCDTabSheet.RealSetText(const Value: TCaption);
diff --git a/lcl/customdrawndrawers.pas b/lcl/customdrawndrawers.pas
index bf18d6638f..47bf3a0f2f 100644
--- a/lcl/customdrawndrawers.pas
+++ b/lcl/customdrawndrawers.pas
@@ -221,6 +221,9 @@ type
Image: TBitmap;
Caption: string;
Width: Integer;
+ Down: Boolean;
+ // filled for drawing
+ State: TCDControlState;
end;
TCDToolBarStateEx = class(TCDControlStateEx)