From 45880ce30cbd2dbdb85befd29d662c32018d2ebb Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Mon, 26 Jun 2023 09:36:47 +0000 Subject: [PATCH] NiceSideBar: Fix crash when an image list used several times in the component is deleted in the form designer. Beginning to support high-dpi. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8856 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/nicesidebar/Demo1/common/Unit1.lfm | 4 +- components/nicesidebar/source/NiceSideBar.pas | 78 +++++++++++++++---- 2 files changed, 64 insertions(+), 18 deletions(-) diff --git a/components/nicesidebar/Demo1/common/Unit1.lfm b/components/nicesidebar/Demo1/common/Unit1.lfm index bc7253476..6523e921d 100644 --- a/components/nicesidebar/Demo1/common/Unit1.lfm +++ b/components/nicesidebar/Demo1/common/Unit1.lfm @@ -9,7 +9,7 @@ object Form1: TForm1 ClientWidth = 623 Color = clWhite Position = poDesktopCenter - LCLVersion = '2.3.0.0' + LCLVersion = '3.99.0.0' object Shape1: TShape Left = 0 Height = 113 @@ -271,6 +271,7 @@ object Form1: TForm1 TabOrder = 8 end object ImageList1: TImageList + Scaled = True Left = 240 Top = 136 Bitmap = { @@ -297,6 +298,7 @@ object Form1: TForm1 } end object ImageList2: TImageList + Scaled = True Left = 320 Top = 136 Bitmap = { diff --git a/components/nicesidebar/source/NiceSideBar.pas b/components/nicesidebar/source/NiceSideBar.pas index ef9069663..effa35caa 100644 --- a/components/nicesidebar/source/NiceSideBar.pas +++ b/components/nicesidebar/source/NiceSideBar.pas @@ -39,7 +39,7 @@ interface uses {$IFDEF FPC} - LCLIntf, LCLType, LMessages, + LCLIntf, LCLType, LMessages, LazLoggerBase, {$ELSE} Windows, Messages, {$ENDIF} @@ -322,11 +322,19 @@ type procedure DrawNonItem(ACanvas: TCanvas; Rc: TRect); virtual; procedure DrawScroller(ACanvas: TCanvas; Rc: TRect; Up: Boolean; Hover: Boolean); virtual; procedure KeyDown(var Key: Word; Shift: TShiftState); override; + {$IFDEF FPC} + procedure DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy; const AXProportion, AYProportion: Double); override; + {$ENDIF} public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure BeginUpdate; procedure EndUpdate; + {$IFDEF FPC} + procedure FixDesignFontsPPI(const ADesignTimePPI: Integer); override; + procedure ScaleFontsPPI(const AToPPI: Integer; const AProportion: Double); override; + {$ENDIF} + published property ItemStyle: TSideBarItemStyle read FItemStyle write SetItemStyle; property SubItemStyle: TSideBarItemStyle read FSubItemStyle write SetSubItemStyle; @@ -701,6 +709,53 @@ begin inherited Destroy; end; +{$IFDEF FPC} +// Handle Lazarus' High-DPI scaling +procedure TNiceSidebar.DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy; + const AXProportion, AYProportion: Double); +begin + inherited; + if AMode in [lapAutoAdjustWithoutHorizontalScrolling, lapAutoAdjustForDPI] then + begin + FItemHeight := round(FItemHeight * AYProportion); + FSubItemHeight := round(FSubItemHeight * AYProportion); + FMargin := round(FMargin * AXProportion); + FIndent := round(FIndent * AXProportion); + FGroupSeparator := round(FGroupSeparator * AYProportion); + end; +end; + +procedure TNiceSidebar.FixDesignFontsPPI(const ADesignTimePPI: Integer); +begin + inherited; + + DoFixDesignFontPPI(FItemStyle.NormalFont, ADesignTimePPI); + DoFixDesignFontPPI(FItemStyle.HoverFont, ADesignTimePPI); + DoFixDesignFontPPI(FItemStyle.SelectedFont, ADesignTimePPI); + DoFixDesignFontPPI(FItemStyle.DisabledFont, ADesignTimePPI); + + DoFixDesignFontPPI(FSubItemStyle.NormalFont, ADesignTimePPI); + DoFixDesignFontPPI(FSubItemStyle.HoverFont, ADesignTimePPI); + DoFixDesignFontPPI(FSubItemStyle.SelectedFont, ADesignTimePPI); + DoFixDesignFontPPI(FSubItemStyle.DisabledFont, ADesignTimePPI); +end; + +procedure TNiceSidebar.ScaleFontsPPI(const AToPPI: Integer; const AProportion: Double); +begin + inherited; + + DoScaleFontPPI(FItemStyle.NormalFont, AToPPI, AProportion); + DoScaleFontPPI(FItemStyle.HoverFont, AToPPI, AProportion); + DoScaleFontPPI(FItemStyle.SelectedFont, AToPPI, AProportion); + DoScaleFontPPI(FItemStyle.DisabledFont, AToPPI, AProportion); + + DoScaleFontPPI(FSubItemStyle.NormalFont, AToPPI, AProportion); + DoScaleFontPPI(FSubItemStyle.HoverFont, AToPPI, AProportion); + DoScaleFontPPI(FSubItemStyle.SelectedFont, AToPPI, AProportion); + DoScaleFontPPI(FSubItemStyle.DisabledFont, AToPPI, AProportion); +end; +{$ENDIF} + procedure TNiceSidebar.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var @@ -708,9 +763,7 @@ var P: PSBInfo; Str: string; Changed: Boolean; - begin - {$IFDEF FPC} LCLIntf.SetFocus(Handle); {$ELSE} @@ -1466,33 +1519,24 @@ procedure TNiceSideBar.Notification(AComponent: TComponent; Operation: TOperation); begin inherited; - if (AComponent = FImages) then + if (Operation = opRemove) then begin - if (Operation = opRemove) then + if (AComponent = FImages) then begin FImages := nil; Invalidate; end; - end else - if (AComponent = FHoverImages) then - begin - if (Operation = opRemove) then + if (AComponent = FHoverImages) then begin FHoverImages := nil; Invalidate; end; - end else - if (AComponent = FSelectedImages) then - begin - if (Operation = opRemove) then + if (AComponent = FSelectedImages) then begin FSelectedImages := nil; Invalidate; end; - end else - if (AComponent = FDisabledImages) then - begin - if (Operation = opRemove) then + if (AComponent = FDisabledImages) then begin FDisabledImages := nil; Invalidate;