gtk2: apply patch by cobines which improves menu icon positioning (issue #0015565)

git-svn-id: trunk@24004 -
This commit is contained in:
paul 2010-03-15 04:15:11 +00:00
parent 770d3e2d9d
commit b67e10007a
2 changed files with 45 additions and 26 deletions

View File

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

View File

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