[gnome-documents] toolbar: fix size inconsistencies between toolbar modes



commit b6434b1236a21cbb0002e11b7733fce6c7710de1
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Mon Feb 27 20:00:33 2012 -0500

    toolbar: fix size inconsistencies between toolbar modes
    
    Put the three tool items in a vertical size group, and use a margin
    trick to have the symbolic icon buttons get the desired size (i.e. they
    should get the size of a regular LARGE_TOOLBAR button even if they have
    a smaller icon inside).

 src/lib/gd-main-toolbar.c |  121 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 87 insertions(+), 34 deletions(-)
---
diff --git a/src/lib/gd-main-toolbar.c b/src/lib/gd-main-toolbar.c
index 1f70579..ec1adee 100644
--- a/src/lib/gd-main-toolbar.c
+++ b/src/lib/gd-main-toolbar.c
@@ -28,6 +28,7 @@ G_DEFINE_TYPE (GdMainToolbar, gd_main_toolbar, GTK_TYPE_TOOLBAR)
 
 struct _GdMainToolbarPrivate {
   GtkSizeGroup *size_group;
+  GtkSizeGroup *vertical_size_group;
 
   GtkToolItem *left_group;
   GtkToolItem *center_group;
@@ -54,53 +55,110 @@ enum {
 static guint signals[NUM_SIGNALS] = { 0, };
 
 static void
-on_back_button_clicked (GtkButton *b,
-                        gpointer user_data)
-{
-  GdMainToolbar *self = user_data;
-  g_signal_emit (self, signals[GO_BACK_REQUEST], 0);
-}
-
-static void
 gd_main_toolbar_dispose (GObject *obj)
 {
   GdMainToolbar *self = GD_MAIN_TOOLBAR (obj);
 
   g_clear_object (&self->priv->size_group);
+  g_clear_object (&self->priv->vertical_size_group);
 
   G_OBJECT_CLASS (gd_main_toolbar_parent_class)->dispose (obj);
 }
 
+static gint
+get_icon_margin (void)
+{
+  gint toolbar_size, menu_size;
+
+  gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &menu_size, NULL);
+  gtk_icon_size_lookup (GTK_ICON_SIZE_LARGE_TOOLBAR, &toolbar_size, NULL);
+  return (gint) floor ((toolbar_size - menu_size) / 2.0);
+}
+
+static GtkSizeGroup *
+get_vertical_size_group (void)
+{
+  GtkSizeGroup *retval;
+  GtkWidget *w, *dummy;
+  gint icon_margin;
+
+  icon_margin = get_icon_margin ();
+
+  dummy = gtk_toggle_button_new ();
+  w = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
+  g_object_set (w, "margin", icon_margin, NULL);
+  gtk_container_add (GTK_CONTAINER (dummy), w);
+  gtk_widget_show_all (dummy);
+
+  retval = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
+  gtk_size_group_add_widget (retval, dummy);
+
+  return retval;
+}
+
+static GtkWidget *
+get_symbolic_button (const gchar *icon_name)
+{
+  GtkWidget *button, *w;
+
+  button = gtk_button_new ();
+  gtk_style_context_add_class (gtk_widget_get_style_context (button), "raised");
+
+  w = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
+  g_object_set (w, "margin", get_icon_margin (), NULL);
+  gtk_widget_show (w);
+  gtk_container_add (GTK_CONTAINER (button), w);
+
+  return button;
+}
+
+static GtkWidget *
+get_text_button (const gchar *label)
+{
+  GtkWidget *w;
+
+  w = gtk_button_new_with_label (label);
+  gtk_widget_set_vexpand (w, TRUE);
+  gtk_style_context_add_class (gtk_widget_get_style_context (w), "raised");
+
+  return w;
+}
+
+static void
+on_back_button_clicked (GtkButton *b,
+                        gpointer user_data)
+{
+  GdMainToolbar *self = user_data;
+  g_signal_emit (self, signals[GO_BACK_REQUEST], 0);
+}
+
 static void
 gd_main_toolbar_constructed (GObject *obj)
 {
   GdMainToolbar *self = GD_MAIN_TOOLBAR (obj);
   GtkToolbar *tb = GTK_TOOLBAR (obj);
-  GtkWidget *w, *grid;
+  GtkWidget *grid;
 
   G_OBJECT_CLASS (gd_main_toolbar_parent_class)->constructed (obj);
 
+  self->priv->vertical_size_group = get_vertical_size_group ();
+
   /* left section */
   self->priv->left_group = gtk_tool_item_new ();
   gtk_widget_set_margin_right (GTK_WIDGET (self->priv->left_group), 12);
   gtk_toolbar_insert (tb, self->priv->left_group, -1);
+  gtk_size_group_add_widget (self->priv->vertical_size_group,
+                             GTK_WIDGET (self->priv->left_group));
 
   /* left button group */
   self->priv->left_grid = gtk_grid_new ();
   gtk_grid_set_column_spacing (GTK_GRID (self->priv->left_grid), 12);
   gtk_container_add (GTK_CONTAINER (self->priv->left_group), self->priv->left_grid);
 
-  self->priv->back = gtk_button_new ();
-  gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->back), "raised");
+  self->priv->back = get_symbolic_button ("go-previous-symbolic");
   gtk_widget_set_no_show_all (self->priv->back, TRUE);
-  gtk_widget_set_halign (self->priv->back, GTK_ALIGN_START);
   gtk_container_add (GTK_CONTAINER (self->priv->left_grid), self->priv->back);
 
-  w = gtk_image_new_from_icon_name ("go-previous-symbolic", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (w);
-  gtk_image_set_pixel_size (GTK_IMAGE (w), 16);
-  gtk_container_add (GTK_CONTAINER (self->priv->back), w);
-
   g_signal_connect (self->priv->back, "clicked",
                     G_CALLBACK (on_back_button_clicked), self);
 
@@ -108,6 +166,8 @@ gd_main_toolbar_constructed (GObject *obj)
   self->priv->center_group = gtk_tool_item_new ();
   gtk_tool_item_set_expand (self->priv->center_group, TRUE);
   gtk_toolbar_insert (tb, self->priv->center_group, -1);
+  gtk_size_group_add_widget (self->priv->vertical_size_group,
+                             GTK_WIDGET (self->priv->center_group));
 
   /* centered label group */
   grid = gtk_grid_new ();
@@ -129,6 +189,8 @@ gd_main_toolbar_constructed (GObject *obj)
   self->priv->right_group = gtk_tool_item_new ();
   gtk_widget_set_margin_left (GTK_WIDGET (self->priv->right_group), 12);
   gtk_toolbar_insert (tb, self->priv->right_group, -1);
+  gtk_size_group_add_widget (self->priv->vertical_size_group,
+                             GTK_WIDGET (self->priv->right_group));
 
   self->priv->right_grid = gtk_grid_new ();
   gtk_grid_set_column_spacing (GTK_GRID (self->priv->right_grid), 12);
@@ -179,14 +241,11 @@ gd_main_toolbar_class_init (GdMainToolbarClass *klass)
 }
 
 static void
-on_selection_mode_button_toggled (GtkToggleButton *tb,
+on_selection_mode_button_clicked (GtkButton *b,
                                   gpointer user_data)
 {
   GdMainToolbar *self = user_data;
-  gboolean toggled;
-
-  toggled = gtk_toggle_button_get_active (tb);
-  g_signal_emit (self, signals[SELECTION_MODE_REQUEST], 0, toggled);
+  g_signal_emit (self, signals[SELECTION_MODE_REQUEST], 0, TRUE);
 }
 
 static void
@@ -207,8 +266,7 @@ gd_main_toolbar_populate_for_selection (GdMainToolbar *self)
   gtk_widget_reset_style (GTK_WIDGET (self));
 
   /* right section */
-  w = gtk_button_new_with_label (_("Done"));
-  gtk_style_context_add_class (gtk_widget_get_style_context (w), "raised");
+  w = get_text_button (_("Done"));
   gtk_container_add (GTK_CONTAINER (self->priv->right_grid), w);
 
   g_signal_connect (w, "clicked",
@@ -220,18 +278,14 @@ gd_main_toolbar_populate_for_selection (GdMainToolbar *self)
 static void
 gd_main_toolbar_populate_for_overview (GdMainToolbar *self)
 {
-  GtkWidget *selection_mode_button, *w;
+  GtkWidget *button;
 
   /* right section */
-  selection_mode_button = gtk_toggle_button_new ();
-  w = gtk_image_new_from_icon_name ("emblem-default-symbolic", GTK_ICON_SIZE_MENU);
-  gtk_image_set_pixel_size (GTK_IMAGE (w), 16);
-  gtk_container_add (GTK_CONTAINER (selection_mode_button), w);
-
-  gtk_container_add (GTK_CONTAINER (self->priv->right_grid), selection_mode_button);
+  button = get_symbolic_button ("emblem-default-symbolic");
+  gtk_container_add (GTK_CONTAINER (self->priv->right_grid), button);
 
-  g_signal_connect (selection_mode_button, "toggled",
-                    G_CALLBACK (on_selection_mode_button_toggled), self);
+  g_signal_connect (button, "clicked",
+                    G_CALLBACK (on_selection_mode_button_clicked), self);
 
   gtk_widget_show_all (GTK_WIDGET (self));
 }
@@ -256,7 +310,6 @@ on_left_grid_clear (GtkWidget *w,
 static void
 gd_main_toolbar_clear (GdMainToolbar *self)
 {
-  GtkWidget *w;
   GtkStyleContext *context;
 
   /* reset labels */



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