Re: Stock icons in GtkToolbar (bug 50489)



On Fri, 23 Feb 2001, Alexander Larsson wrote:

> New patch.
>
> It doesn't support changing the size of the toolbar icons after they've
> been inserted. Is this something we need?

I decided it was. Here is a new patch.

Index: gtktoolbar.h
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtktoolbar.h,v
retrieving revision 1.22
diff -u -p -r1.22 gtktoolbar.h
--- gtktoolbar.h	2000/08/30 00:33:38	1.22
+++ gtktoolbar.h	2001/02/26 14:57:31
@@ -65,6 +65,13 @@ typedef enum
   GTK_TOOLBAR_SPACE_LINE
 } GtkToolbarSpaceStyle;

+typedef enum
+{
+  GTK_TOOLBAR_ICON_SIZE_SMALL,
+  GTK_TOOLBAR_ICON_SIZE_LARGE
+} GtkToolbarIconSize;
+
+
 typedef struct _GtkToolbarChild      GtkToolbarChild;
 typedef struct _GtkToolbar           GtkToolbar;
 typedef struct _GtkToolbarClass      GtkToolbarClass;
@@ -87,6 +94,7 @@ struct _GtkToolbar
   GtkToolbarStyle  style;
   gint             space_size; /* big optional space between buttons */
   GtkToolbarSpaceStyle space_style;
+  GtkToolbarIconSize   icon_size;

   GtkTooltips     *tooltips;

@@ -133,6 +141,31 @@ GtkWidget* gtk_toolbar_insert_item     (
 					GtkSignalFunc    callback,
 					gpointer         user_data,
 					gint             position);
+
+/* Stock Items */
+void       gtk_toolbar_set_stock_size  (GtkToolbar      *toolbar,
+					GtkToolbarIconSize stock_size);
+GtkWidget* gtk_toolbar_append_stock    (GtkToolbar      *toolbar,
+					const gchar     *stock_id,
+					const char      *tooltip_text,
+					const char      *tooltip_private_text,
+					GtkSignalFunc    callback,
+					gpointer         user_data);
+GtkWidget* gtk_toolbar_prepend_stock   (GtkToolbar      *toolbar,
+					const gchar     *stock_id,
+					const char      *tooltip_text,
+					const char      *tooltip_private_text,
+					GtkSignalFunc    callback,
+					gpointer         user_data);
+GtkWidget* gtk_toolbar_insert_stock    (GtkToolbar      *toolbar,
+					const gchar     *stock_id,
+					const char      *tooltip_text,
+					const char      *tooltip_private_text,
+					GtkSignalFunc    callback,
+					gpointer         user_data,
+					gint             position);
+
+

 /* Space Items */
 void       gtk_toolbar_append_space    (GtkToolbar      *toolbar);
Index: gtktoolbar.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtktoolbar.c,v
retrieving revision 1.45
diff -u -p -r1.45 gtktoolbar.c
--- gtktoolbar.c	2000/12/13 01:34:40	1.45
+++ gtktoolbar.c	2001/02/26 14:57:31
@@ -32,11 +32,16 @@
 #include "gtkvbox.h"
 #include "gtkhbox.h"
 #include "gtktoolbar.h"
+#include "gtkstock.h"
+#include "gtkiconfactory.h"
+#include "gtkimage.h"


 #define DEFAULT_SPACE_SIZE  5
 #define DEFAULT_SPACE_STYLE GTK_TOOLBAR_SPACE_EMPTY

+#define DEFAULT_ICON_SIZE GTK_TOOLBAR_ICON_SIZE_LARGE
+
 #define SPACE_LINE_DIVISION 10
 #define SPACE_LINE_START    3
 #define SPACE_LINE_END      7
@@ -198,6 +203,7 @@ gtk_toolbar_init (GtkToolbar *toolbar)
   toolbar->relief       = GTK_RELIEF_NORMAL;
   toolbar->space_size   = DEFAULT_SPACE_SIZE;
   toolbar->space_style  = DEFAULT_SPACE_STYLE;
+  toolbar->icon_size    = DEFAULT_ICON_SIZE;
   toolbar->tooltips     = gtk_tooltips_new ();
   toolbar->button_maxw  = 0;
   toolbar->button_maxh  = 0;
@@ -752,6 +758,127 @@ gtk_toolbar_insert_item (GtkToolbar    *
 				     icon, callback, user_data,
 				     position);
 }
+
+
+void
+gtk_toolbar_set_stock_size (GtkToolbar         *toolbar,
+			    GtkToolbarIconSize  stock_size)
+{
+  GList *children;
+  GtkToolbarChild *child;
+  GtkImage *image;
+  gchar *stock_id;
+  gchar *icon_size;
+
+  g_return_if_fail (toolbar != NULL);
+  g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
+
+  if (toolbar->icon_size == stock_size)
+    return;
+
+  toolbar->icon_size = stock_size;
+
+  if (toolbar->icon_size == GTK_TOOLBAR_ICON_SIZE_SMALL)
+    icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR;
+  else
+    icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
+
+  for (children = toolbar->children; children; children = children->next)
+    {
+      child = children->data;
+      if (child->type == GTK_TOOLBAR_CHILD_BUTTON &&
+	  GTK_IS_IMAGE (child->icon))
+	{
+	  image = GTK_IMAGE (child->icon);
+	  if (gtk_image_get_storage_type (image) == GTK_IMAGE_STOCK)
+	    {
+	      gtk_image_get_stock (image, &stock_id, NULL);
+	      stock_id = g_strdup (stock_id);
+	      gtk_image_set_from_stock (image,
+					stock_id,
+					icon_size);
+	      g_free (stock_id);
+	    }
+	}
+    }
+
+  gtk_widget_queue_resize (GTK_WIDGET (toolbar));
+}
+
+GtkWidget*
+gtk_toolbar_append_stock (GtkToolbar      *toolbar,
+			  const gchar     *stock_id,
+			  const char      *tooltip_text,
+			  const char      *tooltip_private_text,
+			  GtkSignalFunc    callback,
+			  gpointer         user_data)
+{
+  return gtk_toolbar_insert_stock (toolbar,
+				   stock_id,
+				   tooltip_text, tooltip_private_text,
+				   callback, user_data,
+				   toolbar->num_children);
+}
+
+GtkWidget*
+gtk_toolbar_prepend_stock (GtkToolbar      *toolbar,
+			   const gchar     *stock_id,
+			   const char      *tooltip_text,
+			   const char      *tooltip_private_text,
+			   GtkSignalFunc    callback,
+			   gpointer         user_data)
+{
+  return gtk_toolbar_insert_stock (toolbar,
+				   stock_id,
+				   tooltip_text, tooltip_private_text,
+				   callback, user_data,
+				   0);
+}
+
+
+GtkWidget*
+gtk_toolbar_insert_stock (GtkToolbar      *toolbar,
+			  const gchar     *stock_id,
+			  const char      *tooltip_text,
+			  const char      *tooltip_private_text,
+			  GtkSignalFunc    callback,
+			  gpointer         user_data,
+			  gint             position)
+{
+  GtkStockItem item;
+  GtkWidget *image;
+  gchar *icon_size;
+
+  if (gtk_stock_lookup (stock_id, &item))
+    {
+      if (toolbar->icon_size == GTK_TOOLBAR_ICON_SIZE_SMALL)
+	icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR;
+      else
+	icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
+
+      image = gtk_image_new_from_stock (stock_id, icon_size);
+
+      return gtk_toolbar_insert_item (toolbar,
+				      item.label,
+				      tooltip_text,
+				      tooltip_private_text,
+				      image,
+				      callback,
+				      user_data,
+				      position);
+    }
+  else
+    return gtk_toolbar_insert_item (toolbar,
+				    stock_id,
+				    tooltip_text,
+				    tooltip_private_text,
+				    NULL,
+				    callback,
+				    user_data,
+				    position);
+}
+
+

 void
 gtk_toolbar_append_space (GtkToolbar *toolbar)






[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]