[gnome-photos] selection-toolbar: Implement the new selection toolbar
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-photos] selection-toolbar: Implement the new selection toolbar
- Date: Thu, 8 Aug 2013 10:14:00 +0000 (UTC)
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]