mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-10 16:37:50 +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);
|
||||
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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -33,9 +33,9 @@ uses
|
||||
|
||||
type
|
||||
|
||||
{ TGtk2WSCustomImageList }
|
||||
{ TGtk2WSCustomImageListResolution }
|
||||
|
||||
TGtk2WSCustomImageList = class(TWSCustomImageList)
|
||||
TGtk2WSCustomImageListResolution = class(TWSCustomImageListResolution)
|
||||
private
|
||||
protected
|
||||
public
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user