[gnome-photos] selection-toolbar: Implement the new selection toolbar



commit 256061e7e5017732ae08a6266ae89fc1f570ec5a
Author: Debarshi Ray <debarshir gnome org>
Date:   Wed Aug 7 00:20:46 2013 +0200

    selection-toolbar: Implement the new selection toolbar
    
    Changes from the existing toolbar include:
      + It slides up from the bottom instead of being overlaid.
      + The buttons are labelled with strings instead of icons, except the
        one for Favorites.
      + The toolbar is always shown irrespective of content selection. We
        don't hide the buttons either. Instead we insensitize them.
      + Using a GtkHeaderBar simplifies the layout.
    
    Fixes: https://bugzilla.gnome.org/699914

 src/photos-embed.c             |    6 +-
 src/photos-selection-toolbar.c |  213 ++++++++++++++--------------------------
 src/photos-selection-toolbar.h |    2 +-
 3 files changed, 79 insertions(+), 142 deletions(-)
---
diff --git a/src/photos-embed.c b/src/photos-embed.c
index de857d3..4077b8d 100644
--- a/src/photos-embed.c
+++ b/src/photos-embed.c
@@ -462,6 +462,9 @@ photos_embed_init (PhotosEmbed *self)
   gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
   gtk_widget_show (GTK_WIDGET (self));
 
+  priv->selection_toolbar = photos_selection_toolbar_new ();
+  gtk_box_pack_end (GTK_BOX (self), priv->selection_toolbar, FALSE, FALSE, 0);
+
   priv->stack_overlay = gtk_overlay_new ();
   gtk_widget_show (priv->stack_overlay);
   gtk_box_pack_end (GTK_BOX (self), priv->stack_overlay, TRUE, TRUE, 0);
@@ -505,9 +508,6 @@ photos_embed_init (PhotosEmbed *self)
   /* TODO: SearchBar.Dropdown, …
    */
 
-  priv->selection_toolbar = photos_selection_toolbar_new ();
-  gtk_overlay_add_overlay (GTK_OVERLAY (priv->stack_overlay), priv->selection_toolbar);
-
   g_signal_connect_object (priv->stack, "notify::visible-child",
                            G_CALLBACK (photos_embed_notify_visible_child),
                            self, G_CONNECT_SWAPPED);
diff --git a/src/photos-selection-toolbar.c b/src/photos-selection-toolbar.c
index 5629b0f..a259a7f 100644
--- a/src/photos-selection-toolbar.c
+++ b/src/photos-selection-toolbar.c
@@ -27,6 +27,7 @@
 
 #include <glib.h>
 #include <glib/gi18n.h>
+#include <libgd/gd.h>
 
 #include "photos-application.h"
 #include "photos-base-item.h"
@@ -41,11 +42,6 @@
 struct _PhotosSelectionToolbarPrivate
 {
   GHashTable *item_listeners;
-  GtkToolItem *left_group;
-  GtkToolItem *right_group;
-  GtkToolItem *separator;
-  GtkWidget *left_box;
-  GtkWidget *right_box;
   GtkWidget *toolbar_collection;
   GtkWidget *toolbar_favorite;
   GtkWidget *toolbar_open;
@@ -57,7 +53,7 @@ struct _PhotosSelectionToolbarPrivate
   gboolean inside_refresh;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (PhotosSelectionToolbar, photos_selection_toolbar, GTK_TYPE_TOOLBAR);
+G_DEFINE_TYPE_WITH_PRIVATE (PhotosSelectionToolbar, photos_selection_toolbar, GTK_TYPE_REVEALER);
 
 
 enum
@@ -67,28 +63,6 @@ enum
 
 
 static void
-photos_selection_toolbar_fade_in (PhotosSelectionToolbar *self)
-{
-  gtk_widget_show (GTK_WIDGET (self));
-  /* TODO: animate the "opacity" to 1.0 in 300 ms using quadratic
-   *       tweening
-   */
-  gtk_widget_set_opacity (GTK_WIDGET (self), 1.0);
-}
-
-
-static void
-photos_selection_toolbar_fade_out (PhotosSelectionToolbar *self)
-{
-  /* TODO: animate the "opacity" to 0.0 in 300 ms using quadratic
-   *       tweening
-   */
-  gtk_widget_set_opacity (GTK_WIDGET (self), 0.0);
-  gtk_widget_hide (GTK_WIDGET (self));
-}
-
-
-static void
 photos_selection_toolbar_dialog_response (GtkDialog *dialog, gint response_id, gpointer user_data)
 {
   PhotosSelectionToolbar *self = PHOTOS_SELECTION_TOOLBAR (user_data);
@@ -97,7 +71,7 @@ photos_selection_toolbar_dialog_response (GtkDialog *dialog, gint response_id, g
     return;
 
   gtk_widget_destroy (GTK_WIDGET (dialog));
-  photos_selection_toolbar_fade_in (self);
+  gtk_revealer_set_reveal_child (GTK_REVEALER (self), TRUE);
 }
 
 
@@ -114,7 +88,7 @@ photos_selection_toolbar_collection_clicked (GtkButton *button, gpointer user_da
 
   dialog = photos_organize_collection_dialog_new (GTK_WINDOW (toplevel));
   gtk_widget_show_all (dialog);
-  photos_selection_toolbar_fade_out (self);
+  gtk_revealer_set_reveal_child (GTK_REVEALER (self), FALSE);
   g_signal_connect (dialog, "response", G_CALLBACK (photos_selection_toolbar_dialog_response), self);
 }
 
@@ -203,7 +177,7 @@ photos_selection_toolbar_properties_response (GtkDialog *dialog, gint response_i
   PhotosSelectionToolbar *self = PHOTOS_SELECTION_TOOLBAR (user_data);
 
   gtk_widget_destroy (GTK_WIDGET (dialog));
-  photos_selection_toolbar_fade_in (self);
+  gtk_revealer_set_reveal_child (GTK_REVEALER (self), TRUE);
 }
 
 
@@ -226,7 +200,7 @@ photos_selection_toolbar_properties_clicked (GtkButton *button, gpointer user_da
 
   dialog = photos_properties_dialog_new (GTK_WINDOW (windows->data), urn);
   gtk_widget_show_all (dialog);
-  photos_selection_toolbar_fade_out (self);
+  gtk_revealer_set_reveal_child (GTK_REVEALER (self), FALSE);
 
   g_object_unref (app);
 
@@ -241,11 +215,15 @@ photos_selection_toolbar_set_item_visibility (PhotosSelectionToolbar *self)
   GList *apps = NULL;
   GList *l;
   GList *selection;
-  gboolean show_favorite = TRUE;
-  gboolean show_open = TRUE;
-  gboolean show_print = TRUE;
-  gboolean show_properties = TRUE;
-  gboolean show_trash = TRUE;
+  GtkStyleContext *context;
+  gboolean has_selection;
+  gboolean show_collection;
+  gboolean show_favorite;
+  gboolean show_open;
+  gboolean show_print;
+  gboolean show_properties;
+  gboolean show_trash;
+  gchar *favorite_label;
   gchar *open_label;
   guint fav_count = 0;
   guint apps_length;
@@ -254,6 +232,16 @@ photos_selection_toolbar_set_item_visibility (PhotosSelectionToolbar *self)
   priv->inside_refresh = TRUE;
 
   selection = photos_selection_controller_get_selection (priv->sel_cntrlr);
+  sel_length = g_list_length (selection);
+  has_selection = sel_length > 0;
+
+  show_collection = has_selection;
+  show_favorite = has_selection;
+  show_open = has_selection;
+  show_print = has_selection;
+  show_properties = has_selection;
+  show_trash = has_selection;
+
   for (l = selection; l != NULL; l = g_list_next (l))
     {
       PhotosBaseItem *item;
@@ -273,7 +261,6 @@ photos_selection_toolbar_set_item_visibility (PhotosSelectionToolbar *self)
       show_print = show_print && !photos_base_item_is_collection (item);
     }
 
-  sel_length = g_list_length (selection);
   show_favorite = show_favorite && ((fav_count == 0) || (fav_count == sel_length));
 
   apps_length = g_list_length (apps);
@@ -292,40 +279,34 @@ photos_selection_toolbar_set_item_visibility (PhotosSelectionToolbar *self)
     /* Translators: this is the Open action in a context menu */
     open_label = g_strdup (_("Open"));
 
-  gtk_widget_set_tooltip_text (priv->toolbar_open, open_label);
+  gd_header_button_set_label (GD_HEADER_BUTTON (priv->toolbar_open), open_label);
   g_free (open_label);
   g_list_free_full (apps, g_free);
 
-  if (show_favorite)
+  context = gtk_widget_get_style_context (priv->toolbar_favorite);
+  if (show_favorite && fav_count == sel_length)
+    {
+      favorite_label = g_strdup (_("Remove from favorites"));
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->toolbar_favorite), TRUE);
+      gtk_style_context_add_class (context, "documents-favorite");
+    }
+  else
     {
-      GtkStyleContext *context;
-      gchar *favorite_label;
-
-      context = gtk_widget_get_style_context (priv->toolbar_favorite);
-
-      if (fav_count == sel_length)
-        {
-          favorite_label = g_strdup (_("Remove from favorites"));
-          gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->toolbar_favorite), TRUE);
-          gtk_style_context_add_class (context, "documents-favorite");
-        }
-      else
-        {
-          favorite_label = g_strdup (_("Add to favorites"));
-          gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->toolbar_favorite), FALSE);
-          gtk_style_context_remove_class (context, "documents-favorite");
-        }
-
-      gtk_widget_reset_style (priv->toolbar_favorite);
-      gtk_widget_set_tooltip_text (priv->toolbar_favorite, favorite_label);
-      g_free (favorite_label);
+      favorite_label = g_strdup (_("Add to favorites"));
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->toolbar_favorite), FALSE);
+      gtk_style_context_remove_class (context, "documents-favorite");
     }
 
-  gtk_widget_set_visible (priv->toolbar_print, show_print);
-  gtk_widget_set_visible (priv->toolbar_properties, show_properties);
-  gtk_widget_set_visible (priv->toolbar_trash, show_trash);
-  gtk_widget_set_visible (priv->toolbar_open, show_open);
-  gtk_widget_set_visible (priv->toolbar_favorite, show_favorite);
+  gtk_widget_reset_style (priv->toolbar_favorite);
+  gtk_widget_set_tooltip_text (priv->toolbar_favorite, favorite_label);
+  g_free (favorite_label);
+
+  gtk_widget_set_sensitive (priv->toolbar_collection, show_collection);
+  gtk_widget_set_sensitive (priv->toolbar_print, show_print);
+  gtk_widget_set_sensitive (priv->toolbar_properties, show_properties);
+  gtk_widget_set_sensitive (priv->toolbar_trash, show_trash);
+  gtk_widget_set_sensitive (priv->toolbar_open, show_open);
+  gtk_widget_set_sensitive (priv->toolbar_favorite, show_favorite);
 
   priv->inside_refresh = FALSE;
 }
@@ -368,13 +349,8 @@ photos_selection_toolbar_selection_changed (PhotosSelectionController *sel_cntrl
   selection = photos_selection_controller_get_selection (priv->sel_cntrlr);
   photos_selection_toolbar_set_item_listeners (self, selection);
 
-  if (g_list_length (selection) > 0)
-    {
-      photos_selection_toolbar_set_item_visibility (self);
-      photos_selection_toolbar_fade_in (self);
-    }
-  else
-    photos_selection_toolbar_fade_out (self);
+  photos_selection_toolbar_set_item_visibility (self);
+  gtk_revealer_set_reveal_child (GTK_REVEALER (self), TRUE);
 }
 
 
@@ -388,7 +364,7 @@ photos_selection_toolbar_selection_mode_changed (PhotosSelectionController *sel_
   if (mode)
     photos_selection_toolbar_selection_changed (sel_cntrlr, self);
   else
-    photos_selection_toolbar_fade_out (self);
+    gtk_revealer_set_reveal_child (GTK_REVEALER (self), FALSE);
 }
 
 
@@ -435,100 +411,59 @@ static void
 photos_selection_toolbar_init (PhotosSelectionToolbar *self)
 {
   PhotosSelectionToolbarPrivate *priv;
-  GtkWidget *image;
-  GtkStyleContext *context;
+  GtkWidget *toolbar;
 
   self->priv = photos_selection_toolbar_get_instance_private (self);
   priv = self->priv;
 
   priv->item_listeners = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref);
 
-  gtk_widget_set_halign (GTK_WIDGET (self), GTK_ALIGN_CENTER);
-  gtk_widget_set_valign (GTK_WIDGET (self), GTK_ALIGN_END);
-  gtk_widget_set_margin_bottom (GTK_WIDGET (self), 40);
-  gtk_widget_set_opacity (GTK_WIDGET (self), 0.0);
-  gtk_toolbar_set_show_arrow (GTK_TOOLBAR (self), FALSE);
-  gtk_toolbar_set_icon_size (GTK_TOOLBAR (self), GTK_ICON_SIZE_LARGE_TOOLBAR);
-  context = gtk_widget_get_style_context (GTK_WIDGET (self));
-  gtk_style_context_add_class (context, "osd");
-  gtk_widget_set_size_request (GTK_WIDGET (self), SELECTION_TOOLBAR_DEFAULT_WIDTH, -1);
-
-  priv->left_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-  priv->left_group = gtk_tool_item_new ();
-  gtk_container_add (GTK_CONTAINER (priv->left_group), priv->left_box);
-  gtk_toolbar_insert (GTK_TOOLBAR (self), priv->left_group, -1);
-
-  priv->toolbar_favorite = gtk_toggle_button_new ();
-  image = gtk_image_new_from_icon_name ("emblem-favorite-symbolic", GTK_ICON_SIZE_INVALID);
-  gtk_image_set_pixel_size (GTK_IMAGE (image), 16);
-  gtk_container_add (GTK_CONTAINER (priv->toolbar_favorite), image);
-  gtk_container_add (GTK_CONTAINER (priv->left_box), priv->toolbar_favorite);
+  toolbar = gtk_header_bar_new ();
+  gtk_container_add (GTK_CONTAINER (self), toolbar);
+
+  priv->toolbar_favorite = gd_header_toggle_button_new ();
+  gd_header_button_set_symbolic_icon_name (GD_HEADER_BUTTON (priv->toolbar_favorite), 
"emblem-favorite-symbolic");
+  gtk_header_bar_pack_start (GTK_HEADER_BAR (toolbar), priv->toolbar_favorite);
   g_signal_connect (priv->toolbar_favorite,
                     "clicked",
                     G_CALLBACK (photos_selection_toolbar_favorite_clicked),
                     self);
 
-  priv->toolbar_open = gtk_button_new ();
-  image = gtk_image_new_from_icon_name ("folder-symbolic", GTK_ICON_SIZE_INVALID);
-  gtk_image_set_pixel_size (GTK_IMAGE (image), 16);
-  gtk_container_add (GTK_CONTAINER (priv->toolbar_open), image);
-  gtk_container_add (GTK_CONTAINER (priv->left_box), priv->toolbar_open);
+  priv->toolbar_open = gd_header_simple_button_new ();
+  gd_header_button_set_label (GD_HEADER_BUTTON (priv->toolbar_open), _("Open"));
+  gtk_header_bar_pack_start (GTK_HEADER_BAR (toolbar), priv->toolbar_open);
   g_signal_connect (priv->toolbar_open,
                     "clicked",
                     G_CALLBACK (photos_selection_toolbar_open_clicked),
                     self);
 
-  priv->toolbar_print = gtk_button_new ();
-  image = gtk_image_new_from_icon_name ("printer-symbolic", GTK_ICON_SIZE_INVALID);
-  gtk_image_set_pixel_size (GTK_IMAGE (image), 16);
-  gtk_container_add (GTK_CONTAINER (priv->toolbar_print), image);
-  gtk_widget_set_tooltip_text (GTK_WIDGET (priv->toolbar_print), _("Print"));
-  gtk_container_add (GTK_CONTAINER (priv->left_box), priv->toolbar_print);
+  priv->toolbar_print = gd_header_simple_button_new ();
+  gd_header_button_set_label (GD_HEADER_BUTTON (priv->toolbar_print), _("Print"));
+  gtk_header_bar_pack_start (GTK_HEADER_BAR (toolbar), priv->toolbar_print);
   g_signal_connect (priv->toolbar_print,
                     "clicked",
                     G_CALLBACK (photos_selection_toolbar_print_clicked),
                     self);
 
-  priv->toolbar_trash = gtk_button_new ();
-  image = gtk_image_new_from_icon_name ("user-trash-symbolic", GTK_ICON_SIZE_INVALID);
-  gtk_image_set_pixel_size (GTK_IMAGE (image), 16);
-  gtk_container_add (GTK_CONTAINER (priv->toolbar_trash), image);
-  gtk_widget_set_tooltip_text (GTK_WIDGET (priv->toolbar_trash), _("Delete"));
-  gtk_container_add (GTK_CONTAINER (priv->left_box), priv->toolbar_trash);
+  priv->toolbar_trash = gd_header_simple_button_new ();
+  gd_header_button_set_label (GD_HEADER_BUTTON (priv->toolbar_trash), _("Delete"));
+  gtk_header_bar_pack_start (GTK_HEADER_BAR (toolbar), priv->toolbar_trash);
   g_signal_connect (priv->toolbar_trash,
                     "clicked",
                     G_CALLBACK (photos_selection_toolbar_trash_clicked),
                     self);
 
-  priv->separator = gtk_separator_tool_item_new ();
-  gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (priv->separator), FALSE);
-  gtk_widget_set_visible (GTK_WIDGET (priv->separator), TRUE);
-  gtk_tool_item_set_expand (priv->separator, TRUE);
-  gtk_toolbar_insert (GTK_TOOLBAR (self), priv->separator, -1);
-
-  priv->right_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-  priv->right_group = gtk_tool_item_new ();
-  gtk_container_add (GTK_CONTAINER (priv->right_group), priv->right_box);
-  gtk_toolbar_insert (GTK_TOOLBAR (self), priv->right_group, -1);
-
-  priv->toolbar_collection = gtk_button_new ();
-  image = gtk_image_new_from_icon_name ("list-add-symbolic", GTK_ICON_SIZE_INVALID);
-  gtk_image_set_pixel_size (GTK_IMAGE (image), 16);
-  gtk_container_add (GTK_CONTAINER (priv->toolbar_collection), image);
-  /* Translators: "Organize" refers to photos in this context */
-  gtk_widget_set_tooltip_text (GTK_WIDGET (priv->toolbar_collection), C_("Toolbar button tooltip", 
"Organize"));
-  gtk_container_add (GTK_CONTAINER (priv->right_box), priv->toolbar_collection);
+  priv->toolbar_collection = gd_header_simple_button_new ();
+  gd_header_button_set_label (GD_HEADER_BUTTON (priv->toolbar_collection), _("Add to Album"));
+  gtk_header_bar_pack_end (GTK_HEADER_BAR (toolbar), priv->toolbar_collection);
   g_signal_connect (priv->toolbar_collection,
                     "clicked",
                     G_CALLBACK (photos_selection_toolbar_collection_clicked),
                     self);
 
-  priv->toolbar_properties = gtk_button_new ();
-  image = gtk_image_new_from_icon_name ("document-properties-symbolic", GTK_ICON_SIZE_INVALID);
-  gtk_image_set_pixel_size (GTK_IMAGE (image), 16);
-  gtk_container_add (GTK_CONTAINER (priv->toolbar_properties), image);
-  gtk_widget_set_tooltip_text (GTK_WIDGET (priv->toolbar_properties), _("Properties"));
-  gtk_container_add (GTK_CONTAINER (priv->right_box), priv->toolbar_properties);
+  priv->toolbar_properties = gd_header_simple_button_new ();
+  gd_header_button_set_label (GD_HEADER_BUTTON (priv->toolbar_properties), _("Properties"));
+  gtk_header_bar_pack_end (GTK_HEADER_BAR (toolbar), priv->toolbar_properties);
   g_signal_connect (priv->toolbar_properties,
                     "clicked",
                     G_CALLBACK (photos_selection_toolbar_properties_clicked),
@@ -562,5 +497,7 @@ photos_selection_toolbar_class_init (PhotosSelectionToolbarClass *class)
 GtkWidget *
 photos_selection_toolbar_new (void)
 {
-  return g_object_new (PHOTOS_TYPE_SELECTION_TOOLBAR, NULL);
+  return g_object_new (PHOTOS_TYPE_SELECTION_TOOLBAR,
+                       "transition-type", GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP,
+                       NULL);
 }
diff --git a/src/photos-selection-toolbar.h b/src/photos-selection-toolbar.h
index 601a0e0..91f8fc9 100644
--- a/src/photos-selection-toolbar.h
+++ b/src/photos-selection-toolbar.h
@@ -57,7 +57,7 @@ typedef struct _PhotosSelectionToolbarPrivate PhotosSelectionToolbarPrivate;
 
 struct _PhotosSelectionToolbar
 {
-  GtkToolbar parent_instance;
+  GtkRevealer parent_instance;
   PhotosSelectionToolbarPrivate *priv;
 };
 


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