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);
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;

View File

@ -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<IconSize.X then

View File

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

View File

@ -1411,8 +1411,9 @@ var
ItemRect: TGdkRectangle;
BitImage: TBitmap;
pixbuf: PGDKPixBuf;
i: Integer;
ImgList: TImageList;
i, ImgListWidth: Integer;
ImgList: TCustomImageList;
ImgListRes: TCustomImageListResolution;
begin
if not WSCheckHandleAllocated(ALV, 'ItemSetImage')
@ -1433,50 +1434,50 @@ begin
gtk_tree_path_free(Path);
if ItemRect.height <> 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;

View File

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

View File

@ -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;