 e47c0d46b1
			
		
	
	e47c0d46b1
	
	
	
		
			
			Sat Jun 5 20:05:39 2004 Soeren Sandmann <sandmann@daimi.au.dk> * tests/testmerge.c: Add a checkbox to queue an merge/unmerge. Patch from Matthias Clasen. * gtk/gtktoolbar.c (struct _GtkToolbarPrivate): Add a new flag "need_rebuild" (rebuild_menu): New function that rebuilds the overflow menu and makes sure it doesn't start or end with a separator. (toolbar_content_new_tool_item) (toolbar_content_remove) (toolbar_content_new_compatibility): Set the rebuild_needed flag (gtk_toolbar_size_allocate): Only show the overflow arrow when we have actually overflown an item with a proxy menu item. Also make sure we rebuild the menu if needed. Fix #125504, #142377, #143463 * gtk/gtkseparatortoolitem.c (gtk_separator_tool_item_expose): Obey the "priv->draw" flag. (#143692)
		
			
				
	
	
		
			315 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			315 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* gtkseparatortoolitem.c
 | |
|  *
 | |
|  * Copyright (C) 2002 Anders Carlsson <andersca@gnome.org>
 | |
|  * Copyright (C) 2002 James Henstridge <james@daa.com.au>
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Lesser General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This library is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public
 | |
|  * License along with this library; if not, write to the
 | |
|  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | |
|  * Boston, MA 02111-1307, USA.
 | |
|  */
 | |
| 
 | |
| #undef GTK_DISABLE_DEPRECATED
 | |
| 
 | |
| #include <config.h>
 | |
| #include "gtkseparatormenuitem.h"
 | |
| #include "gtkseparatortoolitem.h"
 | |
| #include "gtkintl.h"
 | |
| #include "gtktoolbar.h"
 | |
| 
 | |
| #define MENU_ID "gtk-separator-tool-item-menu-id"
 | |
| 
 | |
| enum {
 | |
|   PROP_0,
 | |
|   PROP_DRAW
 | |
| };
 | |
| 
 | |
| static void     gtk_separator_tool_item_class_init        (GtkSeparatorToolItemClass *class);
 | |
| static void	gtk_separator_tool_item_init		  (GtkSeparatorToolItem      *separator_item,
 | |
| 							   GtkSeparatorToolItemClass *class);
 | |
| static gboolean gtk_separator_tool_item_create_menu_proxy (GtkToolItem               *item);
 | |
| static void     gtk_separator_tool_item_set_property      (GObject                   *object,
 | |
| 							   guint                      prop_id,
 | |
| 							   const GValue              *value,
 | |
| 							   GParamSpec                *pspec);
 | |
| static void     gtk_separator_tool_item_get_property       (GObject                   *object,
 | |
| 							   guint                      prop_id,
 | |
| 							   GValue                    *value,
 | |
| 							   GParamSpec                *pspec);
 | |
| static void     gtk_separator_tool_item_size_request      (GtkWidget                 *widget,
 | |
| 							   GtkRequisition            *requisition);
 | |
| static gboolean gtk_separator_tool_item_expose            (GtkWidget                 *widget,
 | |
| 							   GdkEventExpose            *event);
 | |
| static void     gtk_separator_tool_item_add               (GtkContainer              *container,
 | |
| 							   GtkWidget                 *child);
 | |
| static gint     get_space_size                            (GtkToolItem               *tool_item);
 | |
| 
 | |
| 
 | |
| 
 | |
| static GObjectClass *parent_class = NULL;
 | |
| 
 | |
| #define GTK_SEPARATOR_TOOL_ITEM_GET_PRIVATE(obj)(G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_SEPARATOR_TOOL_ITEM, GtkSeparatorToolItemPrivate))
 | |
| 
 | |
| struct _GtkSeparatorToolItemPrivate
 | |
| {
 | |
|   guint draw : 1;
 | |
| };
 | |
| 
 | |
| GType
 | |
| gtk_separator_tool_item_get_type (void)
 | |
| {
 | |
|   static GType type = 0;
 | |
|   
 | |
|   if (!type)
 | |
|     {
 | |
|       static const GTypeInfo type_info =
 | |
| 	{
 | |
| 	  sizeof (GtkSeparatorToolItemClass),
 | |
| 	  (GBaseInitFunc) 0,
 | |
| 	  (GBaseFinalizeFunc) 0,
 | |
| 	  (GClassInitFunc) gtk_separator_tool_item_class_init,
 | |
| 	  (GClassFinalizeFunc) 0,
 | |
| 	  NULL,
 | |
| 	  sizeof (GtkSeparatorToolItem),
 | |
| 	  0, /* n_preallocs */
 | |
| 	  (GInstanceInitFunc) gtk_separator_tool_item_init,
 | |
| 	};
 | |
|       
 | |
|       type = g_type_register_static (GTK_TYPE_TOOL_ITEM,
 | |
| 				     "GtkSeparatorToolItem", &type_info, 0);
 | |
|     }
 | |
|   return type;
 | |
| }
 | |
| 
 | |
| static gint
 | |
| get_space_size (GtkToolItem *tool_item)
 | |
| {
 | |
|   gint space_size = _gtk_toolbar_get_default_space_size();
 | |
|   GtkWidget *parent = GTK_WIDGET (tool_item)->parent;
 | |
|   
 | |
|   if (GTK_IS_TOOLBAR (parent))
 | |
|     {
 | |
|       gtk_widget_style_get (parent,
 | |
| 			    "space_size", &space_size,
 | |
| 			    NULL);
 | |
|     }
 | |
|   
 | |
|   return space_size;
 | |
| }
 | |
| 
 | |
| static void
 | |
| gtk_separator_tool_item_class_init (GtkSeparatorToolItemClass *class)
 | |
| {
 | |
|   GObjectClass *object_class;
 | |
|   GtkContainerClass *container_class;
 | |
|   GtkToolItemClass *toolitem_class;
 | |
|   GtkWidgetClass *widget_class;
 | |
|   
 | |
|   parent_class = g_type_class_peek_parent (class);
 | |
|   object_class = (GObjectClass *)class;
 | |
|   container_class = (GtkContainerClass *)class;
 | |
|   toolitem_class = (GtkToolItemClass *)class;
 | |
|   widget_class = (GtkWidgetClass *)class;
 | |
| 
 | |
|   object_class->set_property = gtk_separator_tool_item_set_property;
 | |
|   object_class->get_property = gtk_separator_tool_item_get_property;
 | |
|   widget_class->size_request = gtk_separator_tool_item_size_request;
 | |
|   widget_class->expose_event = gtk_separator_tool_item_expose;
 | |
|   toolitem_class->create_menu_proxy = gtk_separator_tool_item_create_menu_proxy;
 | |
|   
 | |
|   container_class->add = gtk_separator_tool_item_add;
 | |
|   
 | |
|   g_object_class_install_property (object_class,
 | |
| 				   PROP_DRAW,
 | |
| 				   g_param_spec_boolean ("draw",
 | |
| 							 P_("Draw"),
 | |
| 							 P_("Whether the separator is drawn, or just blank"),
 | |
| 							 TRUE,
 | |
| 							 G_PARAM_READWRITE));
 | |
|   
 | |
|   g_type_class_add_private (object_class, sizeof (GtkSeparatorToolItemPrivate));
 | |
| }
 | |
| 
 | |
| static void
 | |
| gtk_separator_tool_item_init (GtkSeparatorToolItem      *separator_item,
 | |
| 			      GtkSeparatorToolItemClass *class)
 | |
| {
 | |
|   separator_item->priv = GTK_SEPARATOR_TOOL_ITEM_GET_PRIVATE (separator_item);
 | |
|   separator_item->priv->draw = TRUE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| gtk_separator_tool_item_add (GtkContainer *container,
 | |
| 			     GtkWidget    *child)
 | |
| {
 | |
|   g_warning ("attempt to add a child to an GtkSeparatorToolItem");
 | |
| }
 | |
| 
 | |
| static gboolean
 | |
| gtk_separator_tool_item_create_menu_proxy (GtkToolItem *item)
 | |
| {
 | |
|   GtkWidget *menu_item = NULL;
 | |
|   
 | |
|   menu_item = gtk_separator_menu_item_new();
 | |
|   
 | |
|   gtk_tool_item_set_proxy_menu_item (item, MENU_ID, menu_item);
 | |
|   
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| gtk_separator_tool_item_set_property (GObject      *object,
 | |
| 				      guint         prop_id,
 | |
| 				      const GValue *value,
 | |
| 				      GParamSpec   *pspec)
 | |
| {
 | |
|   GtkSeparatorToolItem *item = GTK_SEPARATOR_TOOL_ITEM (object);
 | |
|   
 | |
|   switch (prop_id)
 | |
|     {
 | |
|     case PROP_DRAW:
 | |
|       gtk_separator_tool_item_set_draw (item, g_value_get_boolean (value));
 | |
|       break;
 | |
|     default:
 | |
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | |
|       break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| gtk_separator_tool_item_get_property (GObject      *object,
 | |
| 				      guint         prop_id,
 | |
| 				      GValue       *value,
 | |
| 				      GParamSpec   *pspec)
 | |
| {
 | |
|   GtkSeparatorToolItem *item = GTK_SEPARATOR_TOOL_ITEM (object);
 | |
|   
 | |
|   switch (prop_id)
 | |
|     {
 | |
|     case PROP_DRAW:
 | |
|       g_value_set_boolean (value, gtk_separator_tool_item_get_draw (item));
 | |
|       break;
 | |
|     default:
 | |
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | |
|       break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| gtk_separator_tool_item_size_request (GtkWidget      *widget,
 | |
| 				      GtkRequisition *requisition)
 | |
| {
 | |
|   GtkToolItem *item = GTK_TOOL_ITEM (widget);
 | |
|   GtkOrientation orientation = gtk_tool_item_get_orientation (item);
 | |
|   
 | |
|   if (orientation == GTK_ORIENTATION_HORIZONTAL)
 | |
|     {
 | |
|       requisition->width = get_space_size (item);
 | |
|       requisition->height = 1;
 | |
|     }
 | |
|   else
 | |
|     {
 | |
|       requisition->height = get_space_size (item);
 | |
|       requisition->width = 1;
 | |
|     }
 | |
| }
 | |
| 
 | |
| static gboolean
 | |
| gtk_separator_tool_item_expose (GtkWidget      *widget,
 | |
| 				GdkEventExpose *event)
 | |
| {
 | |
|   GtkToolbar *toolbar = NULL;
 | |
|   GtkSeparatorToolItemPrivate *priv =
 | |
|       GTK_SEPARATOR_TOOL_ITEM_GET_PRIVATE (widget);
 | |
| 
 | |
|   if (priv->draw)
 | |
|     {
 | |
|       if (widget->parent && GTK_IS_TOOLBAR (widget->parent))
 | |
| 	toolbar = GTK_TOOLBAR (widget->parent);
 | |
| 
 | |
|       _gtk_toolbar_paint_space_line (widget, toolbar,
 | |
| 				     &(event->area), &widget->allocation);
 | |
|     }
 | |
|   
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * gtk_separator_tool_item_new:
 | |
|  * 
 | |
|  * Create a new #GtkSeparatorToolItem
 | |
|  * 
 | |
|  * Return value: the new #GtkSeparatorToolItem
 | |
|  * 
 | |
|  * Since: 2.4
 | |
|  **/
 | |
| GtkToolItem *
 | |
| gtk_separator_tool_item_new (void)
 | |
| {
 | |
|   GtkToolItem *self;
 | |
|   
 | |
|   self = g_object_new (GTK_TYPE_SEPARATOR_TOOL_ITEM,
 | |
| 		       NULL);
 | |
|   
 | |
|   return self;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * gtk_separator_tool_item_get_draw:
 | |
|  * @item: a #GtkSeparatorToolItem 
 | |
|  * 
 | |
|  * Returns whether @separator_tool_item is drawn as a
 | |
|  * line, or just blank. See gtk_separator_tool_item_set_draw().
 | |
|  * 
 | |
|  * Return value: #TRUE if @separator_tool_item is drawn as a line, or just blank.
 | |
|  * 
 | |
|  * Since: 2.4
 | |
|  **/
 | |
| gboolean
 | |
| gtk_separator_tool_item_get_draw (GtkSeparatorToolItem *item)
 | |
| {
 | |
|   g_return_val_if_fail (GTK_IS_SEPARATOR_TOOL_ITEM (item), FALSE);
 | |
|   
 | |
|   return item->priv->draw;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * gtk_separator_tool_item_set_draw:
 | |
|  * @item: a #GtkSeparatorToolItem
 | |
|  * @draw: whether @separator_tool_item is drawn as a vertical iln
 | |
|  * 
 | |
|  * When @separator_tool_items is drawn as a vertical line, or just blank.
 | |
|  * Setting this #FALSE along with gtk_tool_item_set_expand() is useful
 | |
|  * to create an item that forces following items to the end of the toolbar.
 | |
|  * 
 | |
|  * Since: 2.4
 | |
|  **/
 | |
| void
 | |
| gtk_separator_tool_item_set_draw (GtkSeparatorToolItem *item,
 | |
| 				  gboolean              draw)
 | |
| {
 | |
|   g_return_if_fail (GTK_IS_SEPARATOR_TOOL_ITEM (item));
 | |
| 
 | |
|   draw = draw != FALSE;
 | |
| 
 | |
|   if (draw != item->priv->draw)
 | |
|     {
 | |
|       item->priv->draw = draw;
 | |
| 
 | |
|       gtk_widget_queue_draw (GTK_WIDGET (item));
 | |
| 
 | |
|       g_object_notify (G_OBJECT (item), "draw");
 | |
|     }
 | |
| }
 | |
| 
 |