From 29f83c361ab2c8cfafaff7cdfa3622b2ac4248fb Mon Sep 17 00:00:00 2001 From: ondrej Date: Thu, 11 Jan 2018 05:00:50 +0000 Subject: [PATCH] LCL: High-DPI ImageList: Gtk2 fixes git-svn-id: branches/HiDPIImageList@57045 - --- lcl/interfaces/gtk2/gtk2callback.inc | 3 +- lcl/interfaces/gtk2/gtk2proc.inc | 39 +++++----- lcl/interfaces/gtk2/gtk2proc.pp | 1 + lcl/interfaces/gtk2/gtk2wscustomlistview.inc | 79 ++++++++++---------- lcl/interfaces/gtk2/gtk2wsimglist.pp | 4 +- lcl/interfaces/gtk2/gtk2wsmenus.pp | 8 +- 6 files changed, 73 insertions(+), 61 deletions(-) diff --git a/lcl/interfaces/gtk2/gtk2callback.inc b/lcl/interfaces/gtk2/gtk2callback.inc index b9322521d9..aaf976ae94 100644 --- a/lcl/interfaces/gtk2/gtk2callback.inc +++ b/lcl/interfaces/gtk2/gtk2callback.inc @@ -3993,7 +3993,8 @@ begin PageWidget); if TabWidget = nil then exit; {$IFDEF VerboseGtkToDos}{$note reimplement}{$ENDIF} - DrawImageListIconOnWidget(NoteBook.Images, ImageIndex, Widget); + DrawImageListIconOnWidget(NoteBook.Images.ResolutionForImagePPI[NoteBook.ImagesWidth, NoteBook.Font.PixelsPerInch], + ImageIndex, Widget); end; function PageIconWidgetExposeAfter(Widget: PGtkWidget; Event: PGDKEventExpose; diff --git a/lcl/interfaces/gtk2/gtk2proc.inc b/lcl/interfaces/gtk2/gtk2proc.inc index 9d61413f84..c0e83f62ac 100644 --- a/lcl/interfaces/gtk2/gtk2proc.inc +++ b/lcl/interfaces/gtk2/gtk2proc.inc @@ -1183,7 +1183,7 @@ begin end; {$IFDEF VerboseGtkToDos}{$note remove when gtk native imagelist will be ready}{$ENDIF} -procedure DrawImageListIconOnWidget(ImgList: TCustomImageList; +procedure DrawImageListIconOnWidget(ImgList: TCustomImageListResolution; Index: integer; AEffect: TGraphicsDrawEffect; Checked: boolean; DestWidget: PGTKWidget; CenterHorizontally, CenterVertically: boolean; DestLeft, DestTop: integer); @@ -1240,7 +1240,7 @@ begin Bitmap.Free; end; -procedure DrawImageListIconOnWidget(ImgList: TCustomImageList; +procedure DrawImageListIconOnWidget(ImgList: TCustomImageListResolution; Index: integer; DestWidget: PGTKWidget); begin DrawImageListIconOnWidget(ImgList, Index, gdeNormal, false, DestWidget, true, true, 0, 0); @@ -4256,19 +4256,19 @@ var procedure UpdateTabImage; var HasIcon: Boolean; - IconSize: TPoint; + IconSize: Types.TSize; ImageIndex: Integer; begin HasIcon:=false; - IconSize:=Point(0,0); + IconSize:=Size(0,0); ImageIndex := TheNoteBook.GetImageIndex(ThePage.PageIndex); if (TheNoteBook.Images<>nil) and (ImageIndex >= 0) and (ImageIndex < TheNoteBook.Images.Count) then begin // page has valid image - IconSize := Point(TheNoteBook.Images.Width, TheNoteBook.Images.Height); - HasIcon := (IconSize.X>0) and (IconSize.Y>0); + IconSize := TheNoteBook.Images.SizeForImagePPI[TheNoteBook.ImagesWidth, TheNoteBook.Font.PixelsPerInch]; + HasIcon := (IconSize.Width>0) and (IconSize.Height>0); end; if HasIcon then @@ -4278,7 +4278,7 @@ var begin // there is already an icon widget for the image in the tab // -> resize the icon widget - gtk_widget_set_usize(TabImageWidget,IconSize.X,IconSize.Y); + gtk_widget_set_usize(TabImageWidget,IconSize.Width,IconSize.Height); end else begin // there is no pixmap for the image in the tab @@ -4287,7 +4287,7 @@ var g_signal_connect(PgtkObject(TabImageWidget), 'expose_event', TGTKSignalFunc(@PageIconWidgetExposeAfter), ThePage); g_object_set_data(PGObject(TabWidget), 'TabImage', TabImageWidget); - gtk_widget_set_usize(TabImageWidget, IconSize.X, IconSize.Y); + gtk_widget_set_usize(TabImageWidget, IconSize.Width, IconSize.Height); gtk_widget_show(TabImageWidget); gtk_box_pack_start_defaults(PGtkBox(TabWidget), TabImageWidget); gtk_box_reorder_child(PGtkBox(TabWidget), TabImageWidget, 0); @@ -4296,7 +4296,7 @@ var begin // there is already an icon widget for the image in the menu // -> resize the icon widget - gtk_widget_set_usize(MenuImageWidget, IconSize.X, IconSize.Y); + gtk_widget_set_usize(MenuImageWidget, IconSize.Width, IconSize.Height); end else begin // there is no icon widget for the image in the menu @@ -4304,7 +4304,7 @@ var MenuImageWidget:=gtk_label_new(#0); g_signal_connect_after(PgtkObject(MenuImageWidget), 'expose_event', TGTKSignalFunc(@PageIconWidgetExposeAfter), ThePage); - gtk_widget_set_usize(MenuImageWidget,IconSize.X,IconSize.Y); + gtk_widget_set_usize(MenuImageWidget,IconSize.Width,IconSize.Height); g_object_set_data(PGObject(MenuWidget),'TabImage',MenuImageWidget); gtk_widget_show(MenuImageWidget); gtk_box_pack_start_defaults(PGtkBox(MenuWidget),MenuImageWidget); @@ -5747,6 +5747,7 @@ var FreeImageList: Boolean; AImageIndex: Integer; ItemBmp: TBitmap; + DC: HDC; begin if (MenuItem=nil) then exit; @@ -5766,15 +5767,17 @@ begin OldCheckMenuItemDrawProc(MenuItem,Area); exit; end; - IconSize:=LCLMenuItem.GetIconSize; - IconWidth:=IconSize.X; - IconHeight:=IconSize.Y; - // calculate left and top Widget := PGtkWidget(MenuItem); AWindow:=GetControlWindow(Widget); if AWindow = nil then exit; + + DC := Widgetset.GetDC(HWND({%H-}PtrUInt(Widget))); + IconSize:=LCLMenuItem.GetIconSize(DC); + IconWidth:=IconSize.X; + IconHeight:=IconSize.Y; + Container := GTK_CONTAINER (MenuItem); BorderWidth := Container^.flag0 and bm_TGtkContainer_border_width; @@ -5820,7 +5823,7 @@ begin if AImageIndex < AImageList.Count then {$IFDEF VerboseGtkToDos}{$note reimplement}{$ENDIF} - DrawImageListIconOnWidget(AImageList, AImageIndex, AEffect, + DrawImageListIconOnWidget(AImageList.Resolution[IconWidth], AImageIndex, AEffect, LCLMenuItem.Checked, Widget, false, false, ALeft, ATop); if FreeImageList then @@ -5842,6 +5845,7 @@ var CheckMenuItem: PGtkMenuItem; LCLMenuItem: TMenuItem; IconSize: TPoint; + DC: HDC; begin MaxToggleSize:=0; MenuShell:=GTK_MENU_SHELL(widget); @@ -5854,8 +5858,9 @@ begin CurToggleSize:=OldCheckMenuItemToggleSize; LCLMenuItem:=TMenuItem(GetLCLObject(MenuItem)); if LCLMenuItem<>nil then begin - IconSize:=LCLMenuItem.GetIconSize; - {if IconSize.X>100 then + DC := Widgetset.GetDC(HWND({%H-}PtrUInt(widget))); + IconSize:=LCLMenuItem.GetIconSize(DC); + {if IconSize.Width>100 then debugln('MenuSizeRequest LCLMenuItem=',LCLMenuItem.Name,' ',LCLMenuItem.Caption, ' ');} if CurToggleSize 0 then // item is visible begin - ImgList := TImageList.Create(nil); - try - if (TListView(ALV).ViewStyle in [vsSmallIcon, vsReport, vsList]) and - (TListView(ALV).SmallImages <> nil) then - ImgList.Assign(TListView(ALV).SmallImages) - else - if (TListView(ALV).ViewStyle = vsIcon) and - (TListView(ALV).LargeImages <> nil) then - ImgList.Assign(TListView(ALV).LargeImages); + if (TListView(ALV).ViewStyle in [vsSmallIcon, vsReport, vsList]) then + begin + ImgList := TListView(ALV).SmallImages; + ImgListWidth := TListView(ALV).SmallImagesWidth; + end + else + if (TListView(ALV).ViewStyle = vsIcon) then + begin + ImgList := TListView(ALV).LargeImages; + ImgListWidth := TListView(ALV).LargeImagesWidth; + end; - if (ImgList.Count > 0) and (AImageIndex >= 0) then + if Assigned(ImgList) and (ImgList.Count > 0) and (AImageIndex >= 0) then + begin + ImgListRes := ImgList.ResolutionForImagePPI[ImgListWidth, ALV.Font.PixelsPerInch]; + if (ImgList.Count <> Widgets^.Images.Count) then begin - if (ImgList.Count <> Widgets^.Images.Count) then - begin - if (TListView(ALV).ViewStyle in [vsSmallIcon, vsReport, vsList]) then - SetImageList(ALV, lvilSmall, TListView(ALV).SmallImages) - else - SetImageList(ALV, lvilLarge, TListView(ALV).LargeImages); - exit; - end; + if (TListView(ALV).ViewStyle in [vsSmallIcon, vsReport, vsList]) then + SetImageList(ALV, lvilSmall, ImgListRes) + else + SetImageList(ALV, lvilLarge, ImgListRes); + exit; + end; - if (Widgets^.Images <> nil) then - begin - for i := 0 to Widgets^.Images.Count-1 do - if i = AImageIndex then - gdk_pixbuf_unref(PGdkPixBuf(Widgets^.Images.Items[i])); + if (Widgets^.Images <> nil) then + begin + for i := 0 to Widgets^.Images.Count-1 do + if i = AImageIndex then + gdk_pixbuf_unref(PGdkPixBuf(Widgets^.Images.Items[i])); - pixbuf := nil; - BitImage := TBitmap.Create; - try - ImgList.GetBitmap(AImageIndex, BitImage); - Gtk2_PixBufFromBitmap(BitImage,pixbuf); - Widgets^.Images.Items[AImageIndex] := pixbuf; - if GTK_IS_TREE_VIEW(MainView) then - gtk_tree_view_column_queue_resize(gtk_tree_view_get_column(PGtkTreeView(MainView), ASubIndex)); - finally - BitImage.Free; - end; + pixbuf := nil; + BitImage := TBitmap.Create; + try + ImgListRes.GetBitmap(AImageIndex, BitImage); + Gtk2_PixBufFromBitmap(BitImage,pixbuf); + Widgets^.Images.Items[AImageIndex] := pixbuf; + if GTK_IS_TREE_VIEW(MainView) then + gtk_tree_view_column_queue_resize(gtk_tree_view_get_column(PGtkTreeView(MainView), ASubIndex)); + finally + BitImage.Free; end; end; - gtk_widget_queue_draw(MainView); - finally - ImgList.Free; end; + gtk_widget_queue_draw(MainView); end; end; end; diff --git a/lcl/interfaces/gtk2/gtk2wsimglist.pp b/lcl/interfaces/gtk2/gtk2wsimglist.pp index 72ab088319..18b9804de2 100644 --- a/lcl/interfaces/gtk2/gtk2wsimglist.pp +++ b/lcl/interfaces/gtk2/gtk2wsimglist.pp @@ -33,9 +33,9 @@ uses type - { TGtk2WSCustomImageList } + { TGtk2WSCustomImageListResolution } - TGtk2WSCustomImageList = class(TWSCustomImageList) + TGtk2WSCustomImageListResolution = class(TWSCustomImageListResolution) private protected public diff --git a/lcl/interfaces/gtk2/gtk2wsmenus.pp b/lcl/interfaces/gtk2/gtk2wsmenus.pp index 23bccc9095..202878c91a 100644 --- a/lcl/interfaces/gtk2/gtk2wsmenus.pp +++ b/lcl/interfaces/gtk2/gtk2wsmenus.pp @@ -196,10 +196,12 @@ procedure Gtk2MenuItemToggleSizeRequest(AMenuItem: PGtkMenuItem; requisition: Pg var spacing: guint; IconWidth: Integer; + DC: HDC; begin if LCLItem.HasIcon then begin - IconWidth := LCLItem.GetIconSize.X; + DC := Widgetset.GetDC(HWND({%H-}PtrUInt(AMenuItem))); + IconWidth := LCLItem.GetIconSize(DC).X; if IconWidth > 0 then begin gtk_widget_style_get(PGtkWidget(AMenuItem), 'toggle-spacing', [@spacing, nil]); @@ -215,9 +217,11 @@ end; procedure Gtk2MenuItemSizeRequest(AMenuItem: PGtkMenuItem; requisition: PGtkRequisition; LCLItem: TMenuItem); cdecl; var IconHeight: Integer; + DC: HDC; begin GTK_WIDGET_GET_CLASS(AMenuItem)^.size_request(PGtkWidget(AMenuItem), requisition); - IconHeight := LCLItem.GetIconSize.Y; + DC := Widgetset.GetDC(HWND({%H-}PtrUInt(AMenuItem))); + IconHeight := LCLItem.GetIconSize(DC).Y; if requisition^.height < IconHeight then requisition^.height := IconHeight; end;