mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-11 20:39:15 +02:00
gtk2: apply patch by cobines which improves menu icon positioning (issue #0015565)
git-svn-id: trunk@24004 -
This commit is contained in:
parent
770d3e2d9d
commit
b67e10007a
@ -5865,6 +5865,9 @@ var
|
||||
AWindow: PGdkWindow;
|
||||
IconWidth, IconHeight: integer;
|
||||
IconSize: TPoint;
|
||||
{$IFDEF Gtk2}
|
||||
HorizPadding, ToggleSpacing: Integer;
|
||||
{$ENDIF}
|
||||
|
||||
AEffect: TGraphicsDrawEffect;
|
||||
AImageList: TCustomImageList;
|
||||
@ -5901,8 +5904,21 @@ begin
|
||||
exit;
|
||||
Container := GTK_CONTAINER (MenuItem);
|
||||
BorderWidth := Container^.flag0 and bm_TGtkContainer_border_width;
|
||||
|
||||
{$IFDEF Gtk2}
|
||||
gtk_widget_style_get(PGtkWidget(MenuItem),
|
||||
'horizontal-padding', @HorizPadding,
|
||||
'toggle-spacing', @ToggleSpacing,
|
||||
nil);
|
||||
|
||||
ALeft := BorderWidth +
|
||||
gtk_widget_get_xthickness(gtk_widget_get_style(Widget)) +
|
||||
HorizPadding +
|
||||
((PGtkMenuItem(MenuItem)^.toggle_size-ToggleSpacing-IconWidth) div 2);
|
||||
{$ELSE}
|
||||
ALeft := (BorderWidth + gtk_widget_get_xthickness(gtk_widget_get_style(Widget)) + 2)
|
||||
+((PGtkMenuItem(MenuItem)^.toggle_size-IconWidth) div 2);
|
||||
{$ENDIF}
|
||||
|
||||
ATop := (Widget^.Allocation.Height - IconHeight) div 2;
|
||||
|
||||
@ -6074,21 +6090,25 @@ var
|
||||
|
||||
procedure CreateIcon;
|
||||
var
|
||||
{$IFNDEF Gtk2}
|
||||
IconWidth, IconHeight: integer;
|
||||
MinHeightWidget: PGtkWidget;
|
||||
IconSize: TPoint;
|
||||
{$ENDIF}
|
||||
MinHeightWidget: PGtkWidget;
|
||||
begin
|
||||
// the icon will be painted instead of the toggle
|
||||
// of a normal gtkcheckmenuitem
|
||||
|
||||
if LCLMenuItem.HasIcon then
|
||||
begin
|
||||
{$IFNDEF Gtk2}
|
||||
IconSize := LCLMenuItem.GetIconSize;
|
||||
IconWidth := IconSize.X;
|
||||
IconHeight := IconSize.Y;
|
||||
// set the toggle width
|
||||
GTK_MENU_ITEM(MenuItemWidget)^.toggle_size := guint16(IconWidth);
|
||||
|
||||
{$ENDIF}
|
||||
|
||||
GTK_MENU_ITEM(MenuItemWidget)^.flag0:=
|
||||
PGtkMenuItem(MenuItemWidget)^.flag0 or
|
||||
{$IFDEF Gtk2}
|
||||
@ -6102,11 +6122,13 @@ var
|
||||
OldCheckMenuItemDrawProc := CHECK_MENU_ITEM_CLASS(MenuItemWidget)^.draw_indicator;
|
||||
CHECK_MENU_ITEM_CLASS(MenuItemWidget)^.draw_indicator := @DrawMenuItemIcon;
|
||||
|
||||
{$IFNDEF Gtk2}
|
||||
// add a dummy widget for the icon height
|
||||
MinHeightWidget := gtk_label_new('');
|
||||
gtk_widget_show(MinHeightWidget);
|
||||
gtk_widget_set_usize(MinHeightWidget, 1, IconHeight);
|
||||
gtk_box_pack_start(GTK_BOX(HBoxWidget), MinHeightWidget, False, False, 0);
|
||||
{$ENDIF}
|
||||
end
|
||||
else
|
||||
MinHeightWidget := nil;
|
||||
|
@ -129,16 +129,33 @@ end;
|
||||
procedure Gtk2MenuItemToggleSizeRequest(AMenuItem: PGtkMenuItem; requisition: Pgint; LCLItem: TMenuItem); cdecl;
|
||||
var
|
||||
spacing: guint;
|
||||
IconWidth: Integer;
|
||||
begin
|
||||
if LCLItem.HasIcon then
|
||||
begin
|
||||
gtk_widget_style_get(PGtkWidget(AMenuItem), 'toggle-spacing', [@spacing, nil]);
|
||||
requisition^ := AMenuItem^.toggle_size + spacing;
|
||||
IconWidth := LCLItem.GetIconSize.X;
|
||||
if IconWidth > 0 then
|
||||
begin
|
||||
gtk_widget_style_get(PGtkWidget(AMenuItem), 'toggle-spacing', [@spacing, nil]);
|
||||
requisition^ := IconWidth + spacing;
|
||||
end
|
||||
else
|
||||
requisition^ := 0;
|
||||
end
|
||||
else
|
||||
GTK_MENU_ITEM_GET_CLASS(AMenuItem)^.toggle_size_request(AMenuItem, requisition);
|
||||
end;
|
||||
|
||||
procedure Gtk2MenuItemSizeRequest(AMenuItem: PGtkMenuItem; requisition: PGtkRequisition; LCLItem: TMenuItem); cdecl;
|
||||
var
|
||||
IconHeight: Integer;
|
||||
begin
|
||||
GTK_WIDGET_GET_CLASS(AMenuItem)^.size_request(PGtkWidget(AMenuItem), requisition);
|
||||
IconHeight := LCLItem.GetIconSize.Y;
|
||||
if requisition^.height < IconHeight then
|
||||
requisition^.height := IconHeight;
|
||||
end;
|
||||
|
||||
function Gtk2MenuItemDeselect(item: Pointer; AMenuItem: TMenuItem): GBoolean; cdecl;
|
||||
begin
|
||||
Application.Hint := '';
|
||||
@ -159,6 +176,8 @@ begin
|
||||
TGTKSignalFunc(@Gtk2MenuItemDeselect), AWidgetInfo^.LCLObject);
|
||||
g_signal_connect(PGTKObject(AGtkWidget), 'toggle-size-request',
|
||||
TGTKSignalFunc(@Gtk2MenuItemToggleSizeRequest), AWidgetInfo^.LCLObject);
|
||||
g_signal_connect(PGTKObject(AGtkWidget), 'size-request',
|
||||
TGTKSignalFunc(@Gtk2MenuItemSizeRequest), AWidgetInfo^.LCLObject);
|
||||
end;
|
||||
|
||||
class procedure TGtk2WSMenuItem.AttachMenu(const AMenuItem: TMenuItem);
|
||||
@ -166,19 +185,6 @@ var
|
||||
//AccelKey: Integer;
|
||||
//AccelGroup: PGTKAccelGroup;
|
||||
MenuItem, ParentMenuWidget, ContainerMenu: PGtkWidget;
|
||||
|
||||
procedure SetContainerMenuToggleSize;
|
||||
var MenuClass: PGtkWidgetClass;
|
||||
begin
|
||||
if GtkWidgetIsA(ContainerMenu,GTK_TYPE_MENU) then begin
|
||||
MenuClass:=GTK_WIDGET_CLASS(gtk_object_get_class(ContainerMenu));
|
||||
if OldMenuSizeRequestProc=nil then begin
|
||||
OldMenuSizeRequestProc:=MenuClass^.size_request;
|
||||
end;
|
||||
MenuClass^.size_request:=@MenuSizeRequest;
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
//DebugLn('TGtkWidgetSet.AttachMenu START ',AMenuItem.Name,':',AMenuItem.ClassName,' Parent=',AMenuItem.Parent.Name,':',AMenuItem.Parent.ClassName);
|
||||
with AMenuItem do
|
||||
@ -223,8 +229,6 @@ begin
|
||||
gtk_menu_insert(ContainerMenu, MenuItem, AMenuItem.MenuVisibleIndex);
|
||||
end;
|
||||
|
||||
SetContainerMenuToggleSize;
|
||||
|
||||
if GtkWidgetIsA(MenuItem, GTK_TYPE_RADIO_MENU_ITEM) then
|
||||
TGtkWidgetSet(WidgetSet).RegroupMenuItem(HMENU(PtrUInt(MenuItem)), GroupIndex);
|
||||
end;
|
||||
@ -261,13 +265,6 @@ begin
|
||||
gtk_check_menu_item_set_active(PGtkCheckMenuItem(Widget),
|
||||
AMenuItem.Checked);
|
||||
|
||||
if (OldCheckMenuItemToggleSize=0) then
|
||||
begin
|
||||
gtk_menu_item_toggle_size_request(GTK_MENU_ITEM(Widget),
|
||||
@OldCheckMenuItemToggleSize);
|
||||
OldCheckMenuItemToggleSize := GTK_MENU_ITEM(Widget)^.toggle_size;
|
||||
end;
|
||||
|
||||
g_signal_connect_after(PGTKObject(Widget), 'toggled',
|
||||
TGTKSignalFunc(@Gtk2MenuItemToggled), Pointer(AMenuItem));
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user