mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-17 01:41:04 +01:00
LCL: High-DPI ImageList: Gtk2 fixes
git-svn-id: branches/HiDPIImageList@57045 -
This commit is contained in:
parent
9091957623
commit
29f83c361a
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -33,9 +33,9 @@ uses
|
|||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
{ TGtk2WSCustomImageList }
|
{ TGtk2WSCustomImageListResolution }
|
||||||
|
|
||||||
TGtk2WSCustomImageList = class(TWSCustomImageList)
|
TGtk2WSCustomImageListResolution = class(TWSCustomImageListResolution)
|
||||||
private
|
private
|
||||||
protected
|
protected
|
||||||
public
|
public
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user