]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktoolbar.c
Moved the gtk_signal_connect of the specified callback into the big
[~andy/gtk] / gtk / gtktoolbar.c
index c9c9977a1d4f67423e915176b481416faab69454..f22f59a2fae6e6a368ab281e9900cb94528d15cb 100644 (file)
@@ -18,6 +18,8 @@
  */
 
 #include "gtkbutton.h"
+#include "gtktogglebutton.h"
+#include "gtkradiobutton.h"
 #include "gtklabel.h"
 #include "gtkvbox.h"
 #include "gtktoolbar.h"
@@ -70,7 +72,7 @@ static void gtk_real_toolbar_style_changed       (GtkToolbar      *toolbar,
 
 static GtkContainerClass *parent_class;
 
-static gint toolbar_signals[LAST_SIGNAL] = { 0 };
+static guint toolbar_signals[LAST_SIGNAL] = { 0 };
 
 
 guint
@@ -181,32 +183,36 @@ static void
 gtk_toolbar_destroy (GtkObject *object)
 {
   GtkToolbar *toolbar;
-  GList      *children;
-  GtkToolbarChild      *child;
+  GList *children;
 
   g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (object));
 
   toolbar = GTK_TOOLBAR (object);
 
-  gtk_tooltips_unref (toolbar->tooltips);
+  gtk_object_unref (GTK_OBJECT (toolbar->tooltips));
+  toolbar->tooltips = NULL;
 
   for (children = toolbar->children; children; children = children->next)
     {
+      GtkToolbarChild *child;
+
       child = children->data;
 
       if (child->type != GTK_TOOLBAR_CHILD_SPACE)
        {
-         child->widget->parent = NULL;
-         gtk_object_unref (GTK_OBJECT (child->widget));
+         gtk_widget_ref (child->widget);
+         gtk_widget_unparent (child->widget);
          gtk_widget_destroy (child->widget);
+         gtk_widget_unref (child->widget);
        }
 
       g_free (child);
     }
 
   g_list_free (toolbar->children);
-
+  toolbar->children = NULL;
+  
   if (GTK_OBJECT_CLASS (parent_class)->destroy)
     (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
 }
@@ -215,8 +221,8 @@ static void
 gtk_toolbar_map (GtkWidget *widget)
 {
   GtkToolbar *toolbar;
-  GList      *children;
-  GtkToolbarChild      *child;
+  GList *children;
+  GtkToolbarChild *child;
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (widget));
@@ -238,8 +244,8 @@ static void
 gtk_toolbar_unmap (GtkWidget *widget)
 {
   GtkToolbar *toolbar;
-  GList      *children;
-  GtkToolbarChild      *child;
+  GList *children;
+  GtkToolbarChild *child;
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (widget));
@@ -261,10 +267,10 @@ static void
 gtk_toolbar_draw (GtkWidget    *widget,
                  GdkRectangle *area)
 {
-  GtkToolbar   *toolbar;
-  GList        *children;
-  GtkToolbarChild        *child;
-  GdkRectangle  child_area;
+  GtkToolbar *toolbar;
+  GList *children;
+  GtkToolbarChild *child;
+  GdkRectangle child_area;
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (widget));
@@ -288,10 +294,10 @@ static gint
 gtk_toolbar_expose (GtkWidget      *widget,
                    GdkEventExpose *event)
 {
-  GtkToolbar     *toolbar;
-  GList          *children;
-  GtkToolbarChild          *child;
-  GdkEventExpose  child_event;
+  GtkToolbar *toolbar;
+  GList *children;
+  GtkToolbarChild *child;
+  GdkEventExpose child_event;
 
   g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_TOOLBAR (widget), FALSE);
@@ -322,11 +328,11 @@ gtk_toolbar_size_request (GtkWidget      *widget,
                          GtkRequisition *requisition)
 {
   GtkToolbar *toolbar;
-  GList      *children;
-  GtkToolbarChild      *child;
-  gint        nbuttons;
-  gint        button_maxw, button_maxh;
-  gint        widget_maxw, widget_maxh;
+  GList *children;
+  GtkToolbarChild *child;
+  gint nbuttons;
+  gint button_maxw, button_maxh;
+  gint widget_maxw, widget_maxh;
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (widget));
@@ -357,6 +363,8 @@ gtk_toolbar_size_request (GtkWidget      *widget,
          break;
 
        case GTK_TOOLBAR_CHILD_BUTTON:
+       case GTK_TOOLBAR_CHILD_RADIOBUTTON:
+       case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
          if (GTK_WIDGET_VISIBLE (child->widget))
            {
              gtk_widget_size_request (child->widget, &child->widget->requisition);
@@ -408,11 +416,11 @@ static void
 gtk_toolbar_size_allocate (GtkWidget     *widget,
                           GtkAllocation *allocation)
 {
-  GtkToolbar     *toolbar;
-  GList          *children;
-  GtkToolbarChild          *child;
-  GtkAllocation   alloc;
-  gint            border_width;
+  GtkToolbar *toolbar;
+  GList *children;
+  GtkToolbarChild *child;
+  GtkAllocation alloc;
+  gint border_width;
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (widget));
@@ -443,6 +451,11 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
          break;
 
        case GTK_TOOLBAR_CHILD_BUTTON:
+       case GTK_TOOLBAR_CHILD_RADIOBUTTON:
+       case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
+         if (!GTK_WIDGET_VISIBLE (child->widget))
+           break;
+
          alloc.width = toolbar->button_maxw;
          alloc.height = toolbar->button_maxh;
 
@@ -461,6 +474,9 @@ gtk_toolbar_size_allocate (GtkWidget     *widget,
          break;
 
        case GTK_TOOLBAR_CHILD_WIDGET:
+         if (!GTK_WIDGET_VISIBLE (child->widget))
+           break;
+
          alloc.width = child->widget->requisition.width;
          alloc.height = child->widget->requisition.height;
 
@@ -492,7 +508,7 @@ gtk_toolbar_add (GtkContainer *container,
   g_return_if_fail (GTK_IS_TOOLBAR (container));
   g_return_if_fail (widget != NULL);
 
-  gtk_toolbar_append_widget (GTK_TOOLBAR (container), widget, NULL);
+  gtk_toolbar_append_widget (GTK_TOOLBAR (container), widget, NULL, NULL);
 }
 
 static void
@@ -500,8 +516,8 @@ gtk_toolbar_remove (GtkContainer *container,
                    GtkWidget    *widget)
 {
   GtkToolbar *toolbar;
-  GList      *children;
-  GtkToolbarChild      *child;
+  GList *children;
+  GtkToolbarChild *child;
 
   g_return_if_fail (container != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (container));
@@ -515,6 +531,9 @@ gtk_toolbar_remove (GtkContainer *container,
 
       if ((child->type != GTK_TOOLBAR_CHILD_SPACE) && (child->widget == widget))
        {
+         gboolean was_visible;
+
+         was_visible = GTK_WIDGET_VISIBLE (widget);
          gtk_widget_unparent (widget);
 
          toolbar->children = g_list_remove_link (toolbar->children, children);
@@ -522,7 +541,7 @@ gtk_toolbar_remove (GtkContainer *container,
          g_list_free (children);
          toolbar->num_children--;
 
-         if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (container))
+         if (was_visible && GTK_WIDGET_VISIBLE (container))
            gtk_widget_queue_resize (GTK_WIDGET (container));
 
          break;
@@ -536,8 +555,8 @@ gtk_toolbar_foreach (GtkContainer *container,
                     gpointer      callback_data)
 {
   GtkToolbar *toolbar;
-  GList      *children;
-  GtkToolbarChild      *child;
+  GList *children;
+  GtkToolbarChild *child;
 
   g_return_if_fail (container != NULL);
   g_return_if_fail (GTK_IS_TOOLBAR (container));
@@ -558,210 +577,266 @@ GtkWidget *
 gtk_toolbar_append_item (GtkToolbar    *toolbar,
                         const char    *text,
                         const char    *tooltip_text,
+                        const char    *tooltip_private_text,
                         GtkWidget     *icon,
                         GtkSignalFunc  callback,
                         gpointer       user_data)
 {
-  return gtk_toolbar_insert_item (toolbar, text, tooltip_text, icon,
-                                 callback, user_data, toolbar->num_children);
+  return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
+                                    NULL, text,
+                                    tooltip_text, tooltip_private_text,
+                                    icon, callback, user_data,
+                                    toolbar->num_children);
 }
 
 GtkWidget *
 gtk_toolbar_prepend_item (GtkToolbar    *toolbar,
                          const char    *text,
                          const char    *tooltip_text,
+                         const char    *tooltip_private_text,
                          GtkWidget     *icon,
                          GtkSignalFunc  callback,
                          gpointer       user_data)
 {
-  return gtk_toolbar_insert_item (toolbar, text, tooltip_text, icon,
-                                 callback, user_data, 0);
+  return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
+                                    NULL, text,
+                                    tooltip_text, tooltip_private_text,
+                                    icon, callback, user_data,
+                                    0);
 }
 
 GtkWidget *
 gtk_toolbar_insert_item (GtkToolbar    *toolbar,
                         const char    *text,
                         const char    *tooltip_text,
+                        const char    *tooltip_private_text,
                         GtkWidget     *icon,
                         GtkSignalFunc  callback,
                         gpointer       user_data,
                         gint           position)
 {
-  GtkToolbarChild     *child;
-  GtkWidget *vbox;
-
-  g_return_val_if_fail (toolbar != NULL, NULL);
-  g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
-
-  child = g_new (GtkToolbarChild, 1);
-
-  child->type = GTK_TOOLBAR_CHILD_BUTTON;
-  child->widget = gtk_button_new ();
-
-  if (callback)
-    gtk_signal_connect (GTK_OBJECT (child->widget), "clicked",
-                       callback, user_data);
-
-  if (tooltip_text)
-    gtk_tooltips_set_tips (toolbar->tooltips, child->widget, tooltip_text);
-
-  if (text)
-    child->label = gtk_label_new (text);
-  else
-    child->label = NULL;
-
-  if (icon)
-    child->icon = GTK_WIDGET (icon);
-  else
-    child->icon = NULL;
-
-  vbox = gtk_vbox_new (FALSE, 0);
-  gtk_container_add (GTK_CONTAINER (child->widget), vbox);
-  gtk_widget_show (vbox);
-
-  if (child->icon)
-    gtk_box_pack_start (GTK_BOX (vbox), child->icon, FALSE, FALSE, 0);
-
-  if (child->label)
-    gtk_box_pack_start (GTK_BOX (vbox), child->label, FALSE, FALSE, 0);
-
-  switch (toolbar->style)
-    {
-    case GTK_TOOLBAR_ICONS:
-      if (child->icon)
-       gtk_widget_show (child->icon);
-      break;
-
-    case GTK_TOOLBAR_TEXT:
-      if (child->label)
-       gtk_widget_show (child->label);
-      break;
-
-    case GTK_TOOLBAR_BOTH:
-      if (child->icon)
-       gtk_widget_show (child->icon);
-
-      if (child->label)
-       gtk_widget_show (child->label);
-
-      break;
-
-    default:
-      g_assert_not_reached ();
-    }
-
-  gtk_widget_show (child->widget);
-
-  toolbar->children = g_list_insert (toolbar->children, child, position);
-  toolbar->num_children++;
-
-  gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
-
-  if (GTK_WIDGET_VISIBLE (toolbar))
-    {
-      if (GTK_WIDGET_REALIZED (toolbar)
-         && !GTK_WIDGET_REALIZED (child->widget))
-       gtk_widget_realize (child->widget);
-
-      if (GTK_WIDGET_MAPPED (toolbar)
-         && !GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_map (child->widget);
-    }
-
-  if (GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_VISIBLE (toolbar))
-    gtk_widget_queue_resize (child->widget);
-
-  return child->widget;
+  return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON,
+                                    NULL, text,
+                                    tooltip_text, tooltip_private_text,
+                                    icon, callback, user_data,
+                                    position);
 }
 
 void
 gtk_toolbar_append_space (GtkToolbar *toolbar)
 {
-  gtk_toolbar_insert_space (toolbar, toolbar->num_children);
+  gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
+                             NULL, NULL,
+                             NULL, NULL,
+                             NULL, NULL, NULL,
+                             toolbar->num_children);
 }
 
 void
 gtk_toolbar_prepend_space (GtkToolbar *toolbar)
 {
-  gtk_toolbar_insert_space (toolbar, 0);
+  gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
+                             NULL, NULL,
+                             NULL, NULL,
+                             NULL, NULL, NULL,
+                             0);
 }
 
 void
 gtk_toolbar_insert_space (GtkToolbar *toolbar,
                          gint        position)
 {
-  GtkToolbarChild *child;
-
-  g_return_if_fail (toolbar != NULL);
-  g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
-
-  child = g_new (GtkToolbarChild, 1);
-  child->type   = GTK_TOOLBAR_CHILD_SPACE;
-  child->widget = NULL;
-  child->icon   = NULL;
-  child->label  = NULL;
-
-  toolbar->children = g_list_insert (toolbar->children, child, position);
-  toolbar->num_children++;
-
-  if (GTK_WIDGET_VISIBLE (toolbar))
-    gtk_widget_queue_resize (GTK_WIDGET (toolbar));
+  gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE,
+                             NULL, NULL,
+                             NULL, NULL,
+                             NULL, NULL, NULL,
+                             position);
 }
 
 void
-gtk_toolbar_append_widget (GtkToolbar *toolbar,
-                          GtkWidget  *widget,
-                          const char *tooltip_text)
+gtk_toolbar_append_widget (GtkToolbar  *toolbar,
+                          GtkWidget   *widget,
+                          const gchar *tooltip_text,
+                          const gchar *tooltip_private_text)
 {
-  gtk_toolbar_insert_widget (toolbar, widget, tooltip_text, toolbar->num_children);
+  gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
+                             widget, NULL,
+                             tooltip_text, tooltip_private_text,
+                             NULL, NULL, NULL,
+                             toolbar->num_children);
 }
 
 void
-gtk_toolbar_prepend_widget (GtkToolbar *toolbar,
-                           GtkWidget  *widget,
-                           const char *tooltip_text)
+gtk_toolbar_prepend_widget (GtkToolbar  *toolbar,
+                           GtkWidget   *widget,
+                           const gchar *tooltip_text,
+                           const gchar *tooltip_private_text)
 {
-  gtk_toolbar_insert_widget (toolbar, widget, tooltip_text, 0);
+  gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
+                             widget, NULL,
+                             tooltip_text, tooltip_private_text,
+                             NULL, NULL, NULL,
+                             toolbar->num_children);
 }
 
 void
 gtk_toolbar_insert_widget (GtkToolbar *toolbar,
                           GtkWidget  *widget,
                           const char *tooltip_text,
+                          const char *tooltip_private_text,
                           gint        position)
+{
+  gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET,
+                             widget, NULL,
+                             tooltip_text, tooltip_private_text,
+                             NULL, NULL, NULL,
+                             position);
+}
+
+GtkWidget *
+gtk_toolbar_append_element (GtkToolbar          *toolbar,
+                           GtkToolbarChildType  type,
+                           GtkWidget           *widget,
+                           const char          *text,
+                           const char          *tooltip_text,
+                           const char          *tooltip_private_text,
+                           GtkWidget           *icon,
+                           GtkSignalFunc        callback,
+                           gpointer             user_data)
+{
+  return gtk_toolbar_insert_element (toolbar, type, widget, text,
+                                    tooltip_text, tooltip_private_text,
+                                    icon, callback, user_data,
+                                    toolbar->num_children);
+}
+
+GtkWidget *
+gtk_toolbar_prepend_element (GtkToolbar          *toolbar,
+                            GtkToolbarChildType  type,
+                            GtkWidget           *widget,
+                            const char          *text,
+                            const char          *tooltip_text,
+                            const char          *tooltip_private_text,
+                            GtkWidget           *icon,
+                            GtkSignalFunc        callback,
+                            gpointer             user_data)
+{
+  return gtk_toolbar_insert_element (toolbar, type, widget, text,
+                                    tooltip_text, tooltip_private_text,
+                                    icon, callback, user_data, 0);
+}
+
+GtkWidget *
+gtk_toolbar_insert_element (GtkToolbar          *toolbar,
+                           GtkToolbarChildType  type,
+                           GtkWidget           *widget,
+                           const char          *text,
+                           const char          *tooltip_text,
+                           const char          *tooltip_private_text,
+                           GtkWidget           *icon,
+                           GtkSignalFunc        callback,
+                           gpointer             user_data,
+                           gint                 position)
 {
   GtkToolbarChild *child;
+  GtkWidget *vbox;
 
-  g_return_if_fail (toolbar != NULL);
-  g_return_if_fail (widget != NULL);
+  g_return_val_if_fail (toolbar != NULL, NULL);
+  g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
+  g_return_val_if_fail ((type != GTK_TOOLBAR_CHILD_WIDGET) || (widget != NULL), NULL);
 
   child = g_new (GtkToolbarChild, 1);
-  child->type   = GTK_TOOLBAR_CHILD_WIDGET;
-  child->widget = widget;
-  child->icon   = NULL;
-  child->label  = NULL;
+  child->type = type;
+  child->icon = NULL;
+  child->label = NULL;
+
+  switch (type)
+    {
+    case GTK_TOOLBAR_CHILD_SPACE:
+      child->widget = NULL;
+      break;
+
+    case GTK_TOOLBAR_CHILD_WIDGET:
+      child->widget = widget;
+      break;
+
+    case GTK_TOOLBAR_CHILD_BUTTON:
+    case GTK_TOOLBAR_CHILD_TOGGLEBUTTON:
+    case GTK_TOOLBAR_CHILD_RADIOBUTTON:
+      if (type == GTK_TOOLBAR_CHILD_BUTTON)
+       child->widget = gtk_button_new ();
+      else if (type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
+       {
+         child->widget = gtk_toggle_button_new ();
+         gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget),
+                                     FALSE);
+       }
+      else
+       {
+         child->widget = gtk_radio_button_new (widget
+                                               ? gtk_radio_button_group (GTK_RADIO_BUTTON (widget))
+                                               : NULL);
+         gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child->widget), FALSE);
+       }
+
+      if (callback)
+       gtk_signal_connect (GTK_OBJECT (child->widget), "clicked",
+                           callback, user_data);
+
+      vbox = gtk_vbox_new (FALSE, 0);
+      gtk_container_add (GTK_CONTAINER (child->widget), vbox);
+      gtk_widget_show (vbox);
 
-  if (tooltip_text)
-    gtk_tooltips_set_tips (toolbar->tooltips, child->widget, tooltip_text);
+      if (icon)
+       {
+         child->icon = GTK_WIDGET (icon);
+         gtk_box_pack_start (GTK_BOX (vbox), child->icon, FALSE, FALSE, 0);
+         if (toolbar->style != GTK_TOOLBAR_TEXT)
+           gtk_widget_show (child->icon);
+       }
+
+      if (text)
+       {
+         child->label = gtk_label_new (text);
+         gtk_box_pack_start (GTK_BOX (vbox), child->label, FALSE, FALSE, 0);
+         if (toolbar->style != GTK_TOOLBAR_ICONS)
+           gtk_widget_show (child->label);
+       }
+
+      gtk_widget_show (child->widget);
+      break;
+
+    default:
+      g_assert_not_reached ();
+    }
+
+  if ((type != GTK_TOOLBAR_CHILD_SPACE) && tooltip_text)
+    gtk_tooltips_set_tip (toolbar->tooltips, child->widget,
+                         tooltip_text, tooltip_private_text);
 
   toolbar->children = g_list_insert (toolbar->children, child, position);
   toolbar->num_children++;
 
-  gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
+  if (type != GTK_TOOLBAR_CHILD_SPACE)
+    gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
 
-  if (GTK_WIDGET_VISIBLE (toolbar))
+  if ((type != GTK_TOOLBAR_CHILD_SPACE) && GTK_WIDGET_VISIBLE (toolbar))
     {
       if (GTK_WIDGET_REALIZED (toolbar)
          && !GTK_WIDGET_REALIZED (child->widget))
        gtk_widget_realize (child->widget);
-
+       
       if (GTK_WIDGET_MAPPED (toolbar)
          && !GTK_WIDGET_MAPPED (child->widget))
        gtk_widget_map (child->widget);
     }
 
-  if (GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_VISIBLE (toolbar))
-    gtk_widget_queue_resize (child->widget);
+  if (GTK_WIDGET_VISIBLE (toolbar) &&
+      ((type == GTK_TOOLBAR_CHILD_SPACE) ||
+       GTK_WIDGET_VISIBLE (child->widget)))
+    gtk_widget_queue_resize (GTK_WIDGET (toolbar));
+
+  return child->widget;
 }
 
 void
@@ -850,7 +925,9 @@ gtk_real_toolbar_style_changed (GtkToolbar      *toolbar,
        {
          child = children->data;
 
-         if (child->type == GTK_TOOLBAR_CHILD_BUTTON)
+         if (child->type == GTK_TOOLBAR_CHILD_BUTTON ||
+             child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON ||
+             child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON)
            switch (style)
              {
              case GTK_TOOLBAR_ICONS: