mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-09 19:59:49 +02:00
create array of dock images in TLazDockForm and TLazDockTree and use it in header drawing (it is better than create bitmap on every draw)
git-svn-id: trunk@14091 -
This commit is contained in:
parent
e08cf5abf5
commit
2a41b470fd
@ -62,12 +62,21 @@ type
|
|||||||
IsMouseDown: Boolean;
|
IsMouseDown: Boolean;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
TDockHeaderImageKind =
|
||||||
|
(
|
||||||
|
dhiRestore,
|
||||||
|
dhiClose
|
||||||
|
);
|
||||||
|
|
||||||
|
TDockHeaderImages = array[TDockHeaderImageKind] of TBitmap;
|
||||||
|
|
||||||
{ TLazDockTree }
|
{ TLazDockTree }
|
||||||
|
|
||||||
TLazDockTree = class(TDockTree)
|
TLazDockTree = class(TDockTree)
|
||||||
private
|
private
|
||||||
FAutoFreeDockSite: boolean;
|
FAutoFreeDockSite: boolean;
|
||||||
FMouseState: TDockHeaderMouseState;
|
FMouseState: TDockHeaderMouseState;
|
||||||
|
FDockHeaderImages: TDockHeaderImages;
|
||||||
protected
|
protected
|
||||||
procedure AdjustDockRect(AControl: TControl; var ARect: TRect); override;
|
procedure AdjustDockRect(AControl: TControl; var ARect: TRect); override;
|
||||||
procedure AnchorDockLayout(Zone: TLazDockZone);
|
procedure AnchorDockLayout(Zone: TLazDockZone);
|
||||||
@ -116,6 +125,7 @@ type
|
|||||||
private
|
private
|
||||||
FMainControl: TControl;
|
FMainControl: TControl;
|
||||||
FMouseState: TDockHeaderMouseState;
|
FMouseState: TDockHeaderMouseState;
|
||||||
|
FDockHeaderImages: TDockHeaderImages;
|
||||||
procedure SetMainControl(const AValue: TControl);
|
procedure SetMainControl(const AValue: TControl);
|
||||||
procedure PaintWindow(DC: HDC); override;
|
procedure PaintWindow(DC: HDC); override;
|
||||||
protected
|
protected
|
||||||
@ -130,6 +140,7 @@ type
|
|||||||
procedure TrackMouse(X, Y: Integer);
|
procedure TrackMouse(X, Y: Integer);
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
|
destructor Destroy; override;
|
||||||
procedure UpdateCaption; virtual;
|
procedure UpdateCaption; virtual;
|
||||||
class procedure UpdateMainControlInParents(StartControl: TControl);
|
class procedure UpdateMainControlInParents(StartControl: TControl);
|
||||||
function FindMainControlCandidate: TControl;
|
function FindMainControlCandidate: TControl;
|
||||||
@ -293,19 +304,46 @@ function GetEnclosedControls(const ARect: TAnchorControlsRect): TFPList;
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
const
|
||||||
|
DockHeaderImageNames: array[TDockHeaderImageKind] of String =
|
||||||
|
(
|
||||||
|
{ dhiRestore } 'lcl_dock_restore',
|
||||||
|
{ dhiClose } 'lcl_dock_close'
|
||||||
|
);
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
{ TDockHeader }
|
{ TDockHeader }
|
||||||
|
|
||||||
// maybe once it will be control, so now better to move all related to header things to class
|
// maybe once it will be control, so now better to move all related to header things to class
|
||||||
TDockHeader = class
|
TDockHeader = class
|
||||||
|
class procedure CreateDockHeaderImages(out Images: TDockHeaderImages);
|
||||||
|
class procedure DestroyDockHeaderImages(var Images: TDockHeaderImages);
|
||||||
|
|
||||||
class function GetRectOfPart(AHeaderRect: TRect; AOrientation: TDockOrientation; APart: TLazDockHeaderPart): TRect;
|
class function GetRectOfPart(AHeaderRect: TRect; AOrientation: TDockOrientation; APart: TLazDockHeaderPart): TRect;
|
||||||
class function FindPart(AHeaderRect: TRect; APoint: TPoint; AOrientation: TDockOrientation): TLazDockHeaderPart;
|
class function FindPart(AHeaderRect: TRect; APoint: TPoint; AOrientation: TDockOrientation): TLazDockHeaderPart;
|
||||||
class procedure Draw(ACanvas: TCanvas; ACaption: String; AOrientation: TDockOrientation; const ARect: TRect; const MousePos: TPoint);
|
class procedure Draw(ACanvas: TCanvas; ACaption: String; DockBtnImages: TDockHeaderImages; AOrientation: TDockOrientation; const ARect: TRect; const MousePos: TPoint);
|
||||||
class procedure PerformMouseUp(AControl: TControl; APart: TLazDockHeaderPart);
|
class procedure PerformMouseUp(AControl: TControl; APart: TLazDockHeaderPart);
|
||||||
class procedure PerformMouseDown(AControl: TControl; APart: TLazDockHeaderPart);
|
class procedure PerformMouseDown(AControl: TControl; APart: TLazDockHeaderPart);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
class procedure TDockHeader.CreateDockHeaderImages(out Images: TDockHeaderImages);
|
||||||
|
var
|
||||||
|
ImageKind: TDockHeaderImageKind;
|
||||||
|
begin
|
||||||
|
for ImageKind := Low(TDockHeaderImageKind) to High(TDockHeaderImageKind) do
|
||||||
|
Images[ImageKind] := LoadBitmapFromLazarusResource(DockHeaderImageNames[ImageKind]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
class procedure TDockHeader.DestroyDockHeaderImages(
|
||||||
|
var Images: TDockHeaderImages);
|
||||||
|
var
|
||||||
|
ImageKind: TDockHeaderImageKind;
|
||||||
|
begin
|
||||||
|
for ImageKind := Low(TDockHeaderImageKind) to High(TDockHeaderImageKind) do
|
||||||
|
FreeAndNil(Images[ImageKind]);
|
||||||
|
end;
|
||||||
|
|
||||||
class function TDockHeader.GetRectOfPart(AHeaderRect: TRect; AOrientation: TDockOrientation;
|
class function TDockHeader.GetRectOfPart(AHeaderRect: TRect; AOrientation: TDockOrientation;
|
||||||
APart: TLazDockHeaderPart): TRect;
|
APart: TLazDockHeaderPart): TRect;
|
||||||
var
|
var
|
||||||
@ -368,9 +406,9 @@ begin
|
|||||||
Result := ldhpAll;
|
Result := ldhpAll;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class procedure TDockHeader.Draw(ACanvas: TCanvas; ACaption: String; AOrientation: TDockOrientation; const ARect: TRect; const MousePos: TPoint);
|
class procedure TDockHeader.Draw(ACanvas: TCanvas; ACaption: String; DockBtnImages: TDockHeaderImages; AOrientation: TDockOrientation; const ARect: TRect; const MousePos: TPoint);
|
||||||
|
|
||||||
procedure DrawButton(ARect: TRect; IsMouseDown, IsMouseOver: Boolean; IconName: String); inline;
|
procedure DrawButton(ARect: TRect; IsMouseDown, IsMouseOver: Boolean; ABitmap: TBitmap); inline;
|
||||||
const
|
const
|
||||||
// ------------- Pressed, Hot -----------------------
|
// ------------- Pressed, Hot -----------------------
|
||||||
BtnDetail: array[Boolean, Boolean] of TThemedToolBar =
|
BtnDetail: array[Boolean, Boolean] of TThemedToolBar =
|
||||||
@ -380,17 +418,14 @@ class procedure TDockHeader.Draw(ACanvas: TCanvas; ACaption: String; AOrientatio
|
|||||||
);
|
);
|
||||||
var
|
var
|
||||||
Details: TThemedElementDetails;
|
Details: TThemedElementDetails;
|
||||||
AIcon: TBitmap;
|
|
||||||
dx, dy: integer;
|
dx, dy: integer;
|
||||||
begin
|
begin
|
||||||
Details := ThemeServices.GetElementDetails(BtnDetail[IsMouseDown, IsMouseOver]);
|
Details := ThemeServices.GetElementDetails(BtnDetail[IsMouseDown, IsMouseOver]);
|
||||||
ThemeServices.DrawElement(ACanvas.Handle, Details, ARect);
|
ThemeServices.DrawElement(ACanvas.Handle, Details, ARect);
|
||||||
ARect := ThemeServices.ContentRect(ACanvas.Handle, Details, ARect);
|
ARect := ThemeServices.ContentRect(ACanvas.Handle, Details, ARect);
|
||||||
AIcon := LoadBitmapFromLazarusResource(IconName);
|
dx := (ARect.Right - ARect.Left - ABitmap.Width) div 2;
|
||||||
dx := (ARect.Right - ARect.Left - AIcon.Width) div 2;
|
dy := (ARect.Bottom - ARect.Top - ABitmap.Height) div 2;
|
||||||
dy := (ARect.Bottom - ARect.Top - AIcon.Height) div 2;
|
ACanvas.Draw(ARect.Left + dx, ARect.Top + dy, ABitmap);
|
||||||
ACanvas.Draw(ARect.Left + dx, ARect.Top + dy, AIcon);
|
|
||||||
AIcon.Free;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -418,13 +453,17 @@ begin
|
|||||||
|
|
||||||
IsMouseDown := (GetKeyState(VK_LBUTTON) and $80) <> 0;
|
IsMouseDown := (GetKeyState(VK_LBUTTON) and $80) <> 0;
|
||||||
|
|
||||||
|
// AIcon := LoadBitmapFromLazarusResource(IconName);
|
||||||
|
|
||||||
|
//
|
||||||
// draw close button
|
// draw close button
|
||||||
BtnRect := GetRectOfPart(ARect, AOrientation, ldhpCloseButton);
|
BtnRect := GetRectOfPart(ARect, AOrientation, ldhpCloseButton);
|
||||||
DrawButton(BtnRect, IsMouseDown, PtInRect(BtnRect, MousePos), 'lcl_dock_close');
|
|
||||||
|
DrawButton(BtnRect, IsMouseDown, PtInRect(BtnRect, MousePos), DockBtnImages[dhiClose]);
|
||||||
|
|
||||||
// draw restore button
|
// draw restore button
|
||||||
BtnRect := GetRectOfPart(ARect, AOrientation, ldhpRestoreButton);
|
BtnRect := GetRectOfPart(ARect, AOrientation, ldhpRestoreButton);
|
||||||
DrawButton(BtnRect, IsMouseDown, PtInRect(BtnRect, MousePos), 'lcl_dock_restore');
|
DrawButton(BtnRect, IsMouseDown, PtInRect(BtnRect, MousePos), DockBtnImages[dhiRestore]);
|
||||||
|
|
||||||
// draw caption
|
// draw caption
|
||||||
DrawRect := GetRectOfPart(ARect, AOrientation, ldhpCaption);
|
DrawRect := GetRectOfPart(ARect, AOrientation, ldhpCaption);
|
||||||
@ -885,7 +924,8 @@ var
|
|||||||
begin
|
begin
|
||||||
GetCursorPos(Pt);
|
GetCursorPos(Pt);
|
||||||
Pt := DockSite.ScreenToClient(Pt);
|
Pt := DockSite.ScreenToClient(Pt);
|
||||||
TDockHeader.Draw(ACanvas, DockSite.GetDockCaption(AControl), AControl.DockOrientation, ARect, Pt);
|
TDockHeader.Draw(ACanvas, DockSite.GetDockCaption(AControl), FDockHeaderImages,
|
||||||
|
AControl.DockOrientation, ARect, Pt);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TLazDockTree.CreateDockLayoutHelperControls(Zone: TLazDockZone);
|
procedure TLazDockTree.CreateDockLayoutHelperControls(Zone: TLazDockZone);
|
||||||
@ -1022,6 +1062,7 @@ end;
|
|||||||
constructor TLazDockTree.Create(TheDockSite: TWinControl);
|
constructor TLazDockTree.Create(TheDockSite: TWinControl);
|
||||||
begin
|
begin
|
||||||
FillChar(FMouseState, SizeOf(FMouseState), 0);
|
FillChar(FMouseState, SizeOf(FMouseState), 0);
|
||||||
|
TDockHeader.CreateDockHeaderImages(FDockHeaderImages);
|
||||||
SetDockZoneClass(TLazDockZone);
|
SetDockZoneClass(TLazDockZone);
|
||||||
if TheDockSite = nil then
|
if TheDockSite = nil then
|
||||||
begin
|
begin
|
||||||
@ -1034,12 +1075,14 @@ end;
|
|||||||
|
|
||||||
destructor TLazDockTree.Destroy;
|
destructor TLazDockTree.Destroy;
|
||||||
begin
|
begin
|
||||||
if FAutoFreeDockSite then begin
|
if FAutoFreeDockSite then
|
||||||
if DockSite.DockManager=Self then
|
begin
|
||||||
DockSite.DockManager:=nil;
|
if DockSite.DockManager = Self then
|
||||||
|
DockSite.DockManager := nil;
|
||||||
DockSite.Free;
|
DockSite.Free;
|
||||||
DockSite:=nil;
|
DockSite := nil;
|
||||||
end;
|
end;
|
||||||
|
TDockHeader.DestroyDockHeaderImages(FDockHeaderImages);
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2718,7 +2761,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
GetCursorPos(Pt);
|
GetCursorPos(Pt);
|
||||||
Pt := ScreenToClient(Pt);
|
Pt := ScreenToClient(Pt);
|
||||||
TDockHeader.Draw(ACanvas, Control.Caption, GetTitleOrientation(Control), GetTitleRect(Control), Pt);
|
TDockHeader.Draw(ACanvas, Control.Caption, FDockHeaderImages,
|
||||||
|
GetTitleOrientation(Control), GetTitleRect(Control), Pt);
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
ACanvas.Free;
|
ACanvas.Free;
|
||||||
@ -2855,6 +2899,13 @@ constructor TLazDockForm.Create(AOwner: TComponent);
|
|||||||
begin
|
begin
|
||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
FillChar(FMouseState, SizeOf(FMouseState), 0);
|
FillChar(FMouseState, SizeOf(FMouseState), 0);
|
||||||
|
TDockHeader.CreateDockHeaderImages(FDockHeaderImages);
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TLazDockForm.Destroy;
|
||||||
|
begin
|
||||||
|
TDockHeader.DestroyDockHeaderImages(FDockHeaderImages);
|
||||||
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TLazDockForm.UpdateCaption;
|
procedure TLazDockForm.UpdateCaption;
|
||||||
|
Loading…
Reference in New Issue
Block a user