LCL: High-DPI ImageList: Gtk2 fixes

git-svn-id: branches/HiDPIImageList@57045 -
This commit is contained in:
ondrej 2018-01-11 05:00:50 +00:00
parent 9091957623
commit 29f83c361a
6 changed files with 73 additions and 61 deletions

View File

@ -3993,7 +3993,8 @@ begin
PageWidget); PageWidget);
if TabWidget = nil then exit; if TabWidget = nil then exit;
{$IFDEF VerboseGtkToDos}{$note reimplement}{$ENDIF} {$IFDEF VerboseGtkToDos}{$note reimplement}{$ENDIF}
DrawImageListIconOnWidget(NoteBook.Images, ImageIndex, Widget); DrawImageListIconOnWidget(NoteBook.Images.ResolutionForImagePPI[NoteBook.ImagesWidth, NoteBook.Font.PixelsPerInch],
ImageIndex, Widget);
end; end;
function PageIconWidgetExposeAfter(Widget: PGtkWidget; Event: PGDKEventExpose; function PageIconWidgetExposeAfter(Widget: PGtkWidget; Event: PGDKEventExpose;

View File

@ -1183,7 +1183,7 @@ begin
end; end;
{$IFDEF VerboseGtkToDos}{$note remove when gtk native imagelist will be ready}{$ENDIF} {$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; Index: integer; AEffect: TGraphicsDrawEffect; Checked: boolean; DestWidget: PGTKWidget;
CenterHorizontally, CenterVertically: boolean; CenterHorizontally, CenterVertically: boolean;
DestLeft, DestTop: integer); DestLeft, DestTop: integer);
@ -1240,7 +1240,7 @@ begin
Bitmap.Free; Bitmap.Free;
end; end;
procedure DrawImageListIconOnWidget(ImgList: TCustomImageList; procedure DrawImageListIconOnWidget(ImgList: TCustomImageListResolution;
Index: integer; DestWidget: PGTKWidget); Index: integer; DestWidget: PGTKWidget);
begin begin
DrawImageListIconOnWidget(ImgList, Index, gdeNormal, false, DestWidget, true, true, 0, 0); DrawImageListIconOnWidget(ImgList, Index, gdeNormal, false, DestWidget, true, true, 0, 0);
@ -4256,19 +4256,19 @@ var
procedure UpdateTabImage; procedure UpdateTabImage;
var var
HasIcon: Boolean; HasIcon: Boolean;
IconSize: TPoint; IconSize: Types.TSize;
ImageIndex: Integer; ImageIndex: Integer;
begin begin
HasIcon:=false; HasIcon:=false;
IconSize:=Point(0,0); IconSize:=Size(0,0);
ImageIndex := TheNoteBook.GetImageIndex(ThePage.PageIndex); ImageIndex := TheNoteBook.GetImageIndex(ThePage.PageIndex);
if (TheNoteBook.Images<>nil) if (TheNoteBook.Images<>nil)
and (ImageIndex >= 0) and (ImageIndex >= 0)
and (ImageIndex < TheNoteBook.Images.Count) then and (ImageIndex < TheNoteBook.Images.Count) then
begin begin
// page has valid image // page has valid image
IconSize := Point(TheNoteBook.Images.Width, TheNoteBook.Images.Height); IconSize := TheNoteBook.Images.SizeForImagePPI[TheNoteBook.ImagesWidth, TheNoteBook.Font.PixelsPerInch];
HasIcon := (IconSize.X>0) and (IconSize.Y>0); HasIcon := (IconSize.Width>0) and (IconSize.Height>0);
end; end;
if HasIcon then if HasIcon then
@ -4278,7 +4278,7 @@ var
begin begin
// there is already an icon widget for the image in the tab // there is already an icon widget for the image in the tab
// -> resize the icon widget // -> resize the icon widget
gtk_widget_set_usize(TabImageWidget,IconSize.X,IconSize.Y); gtk_widget_set_usize(TabImageWidget,IconSize.Width,IconSize.Height);
end else end else
begin begin
// there is no pixmap for the image in the tab // there is no pixmap for the image in the tab
@ -4287,7 +4287,7 @@ var
g_signal_connect(PgtkObject(TabImageWidget), 'expose_event', g_signal_connect(PgtkObject(TabImageWidget), 'expose_event',
TGTKSignalFunc(@PageIconWidgetExposeAfter), ThePage); TGTKSignalFunc(@PageIconWidgetExposeAfter), ThePage);
g_object_set_data(PGObject(TabWidget), 'TabImage', TabImageWidget); 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_widget_show(TabImageWidget);
gtk_box_pack_start_defaults(PGtkBox(TabWidget), TabImageWidget); gtk_box_pack_start_defaults(PGtkBox(TabWidget), TabImageWidget);
gtk_box_reorder_child(PGtkBox(TabWidget), TabImageWidget, 0); gtk_box_reorder_child(PGtkBox(TabWidget), TabImageWidget, 0);
@ -4296,7 +4296,7 @@ var
begin begin
// there is already an icon widget for the image in the menu // there is already an icon widget for the image in the menu
// -> resize the icon widget // -> resize the icon widget
gtk_widget_set_usize(MenuImageWidget, IconSize.X, IconSize.Y); gtk_widget_set_usize(MenuImageWidget, IconSize.Width, IconSize.Height);
end else end else
begin begin
// there is no icon widget for the image in the menu // there is no icon widget for the image in the menu
@ -4304,7 +4304,7 @@ var
MenuImageWidget:=gtk_label_new(#0); MenuImageWidget:=gtk_label_new(#0);
g_signal_connect_after(PgtkObject(MenuImageWidget), 'expose_event', g_signal_connect_after(PgtkObject(MenuImageWidget), 'expose_event',
TGTKSignalFunc(@PageIconWidgetExposeAfter), ThePage); 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); g_object_set_data(PGObject(MenuWidget),'TabImage',MenuImageWidget);
gtk_widget_show(MenuImageWidget); gtk_widget_show(MenuImageWidget);
gtk_box_pack_start_defaults(PGtkBox(MenuWidget),MenuImageWidget); gtk_box_pack_start_defaults(PGtkBox(MenuWidget),MenuImageWidget);
@ -5747,6 +5747,7 @@ var
FreeImageList: Boolean; FreeImageList: Boolean;
AImageIndex: Integer; AImageIndex: Integer;
ItemBmp: TBitmap; ItemBmp: TBitmap;
DC: HDC;
begin begin
if (MenuItem=nil) then if (MenuItem=nil) then
exit; exit;
@ -5766,15 +5767,17 @@ begin
OldCheckMenuItemDrawProc(MenuItem,Area); OldCheckMenuItemDrawProc(MenuItem,Area);
exit; exit;
end; end;
IconSize:=LCLMenuItem.GetIconSize;
IconWidth:=IconSize.X;
IconHeight:=IconSize.Y;
// calculate left and top // calculate left and top
Widget := PGtkWidget(MenuItem); Widget := PGtkWidget(MenuItem);
AWindow:=GetControlWindow(Widget); AWindow:=GetControlWindow(Widget);
if AWindow = nil then if AWindow = nil then
exit; exit;
DC := Widgetset.GetDC(HWND({%H-}PtrUInt(Widget)));
IconSize:=LCLMenuItem.GetIconSize(DC);
IconWidth:=IconSize.X;
IconHeight:=IconSize.Y;
Container := GTK_CONTAINER (MenuItem); Container := GTK_CONTAINER (MenuItem);
BorderWidth := Container^.flag0 and bm_TGtkContainer_border_width; BorderWidth := Container^.flag0 and bm_TGtkContainer_border_width;
@ -5820,7 +5823,7 @@ begin
if AImageIndex < AImageList.Count then if AImageIndex < AImageList.Count then
{$IFDEF VerboseGtkToDos}{$note reimplement}{$ENDIF} {$IFDEF VerboseGtkToDos}{$note reimplement}{$ENDIF}
DrawImageListIconOnWidget(AImageList, AImageIndex, AEffect, DrawImageListIconOnWidget(AImageList.Resolution[IconWidth], AImageIndex, AEffect,
LCLMenuItem.Checked, Widget, false, false, ALeft, ATop); LCLMenuItem.Checked, Widget, false, false, ALeft, ATop);
if FreeImageList then if FreeImageList then
@ -5842,6 +5845,7 @@ var
CheckMenuItem: PGtkMenuItem; CheckMenuItem: PGtkMenuItem;
LCLMenuItem: TMenuItem; LCLMenuItem: TMenuItem;
IconSize: TPoint; IconSize: TPoint;
DC: HDC;
begin begin
MaxToggleSize:=0; MaxToggleSize:=0;
MenuShell:=GTK_MENU_SHELL(widget); MenuShell:=GTK_MENU_SHELL(widget);
@ -5854,8 +5858,9 @@ begin
CurToggleSize:=OldCheckMenuItemToggleSize; CurToggleSize:=OldCheckMenuItemToggleSize;
LCLMenuItem:=TMenuItem(GetLCLObject(MenuItem)); LCLMenuItem:=TMenuItem(GetLCLObject(MenuItem));
if LCLMenuItem<>nil then begin if LCLMenuItem<>nil then begin
IconSize:=LCLMenuItem.GetIconSize; DC := Widgetset.GetDC(HWND({%H-}PtrUInt(widget)));
{if IconSize.X>100 then IconSize:=LCLMenuItem.GetIconSize(DC);
{if IconSize.Width>100 then
debugln('MenuSizeRequest LCLMenuItem=',LCLMenuItem.Name,' ',LCLMenuItem.Caption, debugln('MenuSizeRequest LCLMenuItem=',LCLMenuItem.Name,' ',LCLMenuItem.Caption,
' ');} ' ');}
if CurToggleSize<IconSize.X then if CurToggleSize<IconSize.X then

View File

@ -43,6 +43,7 @@ uses
{$endif} {$endif}
// Other units // Other units
Math, // Math after gtk to get the correct Float type Math, // Math after gtk to get the correct Float type
Types,
// LCL // LCL
LMessages, LCLProc, LCLIntf, LCLType, GraphType, Graphics, LMessages, LCLProc, LCLIntf, LCLType, GraphType, Graphics,
LResources, Controls, Forms, Buttons, Menus, StdCtrls, ComCtrls, ExtCtrls, LResources, Controls, Forms, Buttons, Menus, StdCtrls, ComCtrls, ExtCtrls,

View File

@ -1411,8 +1411,9 @@ var
ItemRect: TGdkRectangle; ItemRect: TGdkRectangle;
BitImage: TBitmap; BitImage: TBitmap;
pixbuf: PGDKPixBuf; pixbuf: PGDKPixBuf;
i: Integer; i, ImgListWidth: Integer;
ImgList: TImageList; ImgList: TCustomImageList;
ImgListRes: TCustomImageListResolution;
begin begin
if not WSCheckHandleAllocated(ALV, 'ItemSetImage') if not WSCheckHandleAllocated(ALV, 'ItemSetImage')
@ -1433,24 +1434,27 @@ begin
gtk_tree_path_free(Path); gtk_tree_path_free(Path);
if ItemRect.height <> 0 then // item is visible if ItemRect.height <> 0 then // item is visible
begin begin
ImgList := TImageList.Create(nil); if (TListView(ALV).ViewStyle in [vsSmallIcon, vsReport, vsList]) then
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 (ImgList.Count > 0) and (AImageIndex >= 0) then
begin 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 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 if (ImgList.Count <> Widgets^.Images.Count) then
begin begin
if (TListView(ALV).ViewStyle in [vsSmallIcon, vsReport, vsList]) then if (TListView(ALV).ViewStyle in [vsSmallIcon, vsReport, vsList]) then
SetImageList(ALV, lvilSmall, TListView(ALV).SmallImages) SetImageList(ALV, lvilSmall, ImgListRes)
else else
SetImageList(ALV, lvilLarge, TListView(ALV).LargeImages); SetImageList(ALV, lvilLarge, ImgListRes);
exit; exit;
end; end;
@ -1463,7 +1467,7 @@ begin
pixbuf := nil; pixbuf := nil;
BitImage := TBitmap.Create; BitImage := TBitmap.Create;
try try
ImgList.GetBitmap(AImageIndex, BitImage); ImgListRes.GetBitmap(AImageIndex, BitImage);
Gtk2_PixBufFromBitmap(BitImage,pixbuf); Gtk2_PixBufFromBitmap(BitImage,pixbuf);
Widgets^.Images.Items[AImageIndex] := pixbuf; Widgets^.Images.Items[AImageIndex] := pixbuf;
if GTK_IS_TREE_VIEW(MainView) then if GTK_IS_TREE_VIEW(MainView) then
@ -1474,9 +1478,6 @@ begin
end; end;
end; end;
gtk_widget_queue_draw(MainView); gtk_widget_queue_draw(MainView);
finally
ImgList.Free;
end;
end; end;
end; end;
end; end;

View File

@ -33,9 +33,9 @@ uses
type type
{ TGtk2WSCustomImageList } { TGtk2WSCustomImageListResolution }
TGtk2WSCustomImageList = class(TWSCustomImageList) TGtk2WSCustomImageListResolution = class(TWSCustomImageListResolution)
private private
protected protected
public public

View File

@ -196,10 +196,12 @@ procedure Gtk2MenuItemToggleSizeRequest(AMenuItem: PGtkMenuItem; requisition: Pg
var var
spacing: guint; spacing: guint;
IconWidth: Integer; IconWidth: Integer;
DC: HDC;
begin begin
if LCLItem.HasIcon then if LCLItem.HasIcon then
begin begin
IconWidth := LCLItem.GetIconSize.X; DC := Widgetset.GetDC(HWND({%H-}PtrUInt(AMenuItem)));
IconWidth := LCLItem.GetIconSize(DC).X;
if IconWidth > 0 then if IconWidth > 0 then
begin begin
gtk_widget_style_get(PGtkWidget(AMenuItem), 'toggle-spacing', [@spacing, nil]); gtk_widget_style_get(PGtkWidget(AMenuItem), 'toggle-spacing', [@spacing, nil]);
@ -215,9 +217,11 @@ end;
procedure Gtk2MenuItemSizeRequest(AMenuItem: PGtkMenuItem; requisition: PGtkRequisition; LCLItem: TMenuItem); cdecl; procedure Gtk2MenuItemSizeRequest(AMenuItem: PGtkMenuItem; requisition: PGtkRequisition; LCLItem: TMenuItem); cdecl;
var var
IconHeight: Integer; IconHeight: Integer;
DC: HDC;
begin begin
GTK_WIDGET_GET_CLASS(AMenuItem)^.size_request(PGtkWidget(AMenuItem), requisition); 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 if requisition^.height < IconHeight then
requisition^.height := IconHeight; requisition^.height := IconHeight;
end; end;