[gnome-photos] preview-view: Show next and previous buttons



commit d1d0e2373f963f24af861be6ba5f046823ba6d0d
Author: Debarshi Ray <debarshir gnome org>
Date:   Thu Aug 1 11:51:21 2013 +0200

    preview-view: Show next and previous buttons
    
    Fixes: https://bugzilla.gnome.org/696794

 src/photos-embed.c          |   77 ++++++++++++++++++++++++++++++++++---------
 src/photos-preview-view.c   |   69 +++++++++++++++++++++++++++++++++++++-
 src/photos-preview-view.h   |    6 +++-
 src/photos-view-container.c |   29 ++++++++++++++++
 src/photos-view-container.h |    4 ++
 5 files changed, 166 insertions(+), 19 deletions(-)
---
diff --git a/src/photos-embed.c b/src/photos-embed.c
index 5e02feb..8554016 100644
--- a/src/photos-embed.c
+++ b/src/photos-embed.c
@@ -91,12 +91,30 @@ photos_embed_clear_load_timer (PhotosEmbed *self)
 
 
 static void
+photos_embed_prepare_for_preview (PhotosEmbed *self)
+{
+  PhotosEmbedPrivate *priv = self->priv;
+
+  /* TODO: SearchController,
+   *       ErrorHandler
+   */
+
+  photos_spinner_box_stop (PHOTOS_SPINNER_BOX (priv->spinner_box));
+  gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "preview");
+}
+
+
+static void
 photos_embed_item_load (GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
   PhotosEmbed *self = PHOTOS_EMBED (user_data);
   PhotosEmbedPrivate *priv = self->priv;
   GeglNode *node;
+  GtkListStore *model;
+  GtkTreePath *current_path;
+  GtkWidget *view_container;
   PhotosBaseItem *item = PHOTOS_BASE_ITEM (source_object);
+  PhotosWindowMode mode;
 
   photos_embed_clear_load_timer (self);
 
@@ -105,11 +123,52 @@ photos_embed_item_load (GObject *source_object, GAsyncResult *res, gpointer user
   if (node == NULL)
     goto out;
 
+  mode = photos_mode_controller_get_window_mode (priv->mode_cntrlr);
+  switch (mode)
+    {
+    case PHOTOS_WINDOW_MODE_COLLECTIONS:
+      view_container = priv->collections;
+      break;
+
+    case PHOTOS_WINDOW_MODE_FAVORITES:
+      view_container = priv->favorites;
+      break;
+
+    case PHOTOS_WINDOW_MODE_OVERVIEW:
+      view_container = priv->overview;
+      break;
+
+    case PHOTOS_WINDOW_MODE_PREVIEW:
+      view_container = NULL;
+      break;
+
+    default:
+      g_assert_not_reached ();
+    }
+
+  /* If we are already in the preview and navigating using the
+   * buttons, then we don't need this.
+   */
+  if (mode != PHOTOS_WINDOW_MODE_PREVIEW)
+    {
+      current_path = photos_view_container_get_current_path (PHOTOS_VIEW_CONTAINER (view_container));
+      model = photos_view_container_get_model (PHOTOS_VIEW_CONTAINER (view_container));
+      photos_preview_view_set_model (PHOTOS_PREVIEW_VIEW (priv->preview), GTK_TREE_MODEL (model), 
current_path);
+    }
+
   photos_preview_view_set_node (PHOTOS_PREVIEW_VIEW (priv->preview), node);
 
   /* TODO: set toolbar model */
 
-  photos_mode_controller_set_window_mode (priv->mode_cntrlr, PHOTOS_WINDOW_MODE_PREVIEW);
+  /* If we are already in the preview and navigating using the
+   * buttons, then the window-mode-changed signal won't be fired. So
+   * we need to prepare it ourselves.
+   */
+  if (mode != PHOTOS_WINDOW_MODE_PREVIEW)
+    photos_mode_controller_set_window_mode (priv->mode_cntrlr, PHOTOS_WINDOW_MODE_PREVIEW);
+  else
+    photos_embed_prepare_for_preview (self);
+
   photos_mode_controller_set_can_fullscreen (priv->mode_cntrlr, TRUE);
 
  out:
@@ -309,20 +368,6 @@ photos_embed_prepare_for_overview (PhotosEmbed *self)
 
 
 static void
-photos_embed_prepare_for_preview (PhotosEmbed *self)
-{
-  PhotosEmbedPrivate *priv = self->priv;
-
-  /* TODO: SearchController,
-   *       ErrorHandler
-   */
-
-  photos_spinner_box_stop (PHOTOS_SPINNER_BOX (priv->spinner_box));
-  gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "preview");
-}
-
-
-static void
 photos_embed_set_error (PhotosEmbed *self, const gchar *primary, const gchar *secondary)
 {
   PhotosEmbedPrivate *priv = self->priv;
@@ -445,7 +490,7 @@ photos_embed_init (PhotosEmbed *self)
   priv->favorites = photos_view_container_new (PHOTOS_WINDOW_MODE_FAVORITES);
   gtk_stack_add_titled (GTK_STACK (priv->stack), priv->favorites, "favorites", _("Favorites"));
 
-  priv->preview = photos_preview_view_new ();
+  priv->preview = photos_preview_view_new (GTK_OVERLAY (priv->stack_overlay));
   gtk_stack_add_named (GTK_STACK (priv->stack), priv->preview, "preview");
 
   priv->spinner_box = photos_spinner_box_new ();
diff --git a/src/photos-preview-view.c b/src/photos-preview-view.c
index 5cbfb90..205b944 100644
--- a/src/photos-preview-view.c
+++ b/src/photos-preview-view.c
@@ -30,13 +30,24 @@
 #include <glib/gi18n.h>
 
 #include "gegl-gtk-view.h"
+#include "photos-mode-controller.h"
+#include "photos-preview-nav-buttons.h"
 #include "photos-preview-view.h"
 
 
 struct _PhotosPreviewViewPrivate
 {
   GeglNode *node;
+  GtkWidget *overlay;
   GtkWidget *view;
+  PhotosModeController *mode_cntrlr;
+  PhotosPreviewNavButtons *nav_buttons;
+};
+
+enum
+{
+  PROP_0,
+  PROP_OVERLAY
 };
 
 
@@ -110,12 +121,21 @@ photos_preview_view_scale_and_align_image (PhotosPreviewView *self)
 
 
 static void
+photos_preview_view_window_mode_changed (PhotosPreviewView *self, PhotosWindowMode mode, PhotosWindowMode 
old_mode)
+{
+  if (mode != PHOTOS_WINDOW_MODE_PREVIEW)
+    photos_preview_nav_buttons_hide (self->priv->nav_buttons);
+}
+
+
+static void
 photos_preview_view_dispose (GObject *object)
 {
   PhotosPreviewView *self = PHOTOS_PREVIEW_VIEW (object);
   PhotosPreviewViewPrivate *priv = self->priv;
 
   g_clear_object (&priv->node);
+  g_clear_object (&priv->mode_cntrlr);
 
   G_OBJECT_CLASS (photos_preview_view_parent_class)->dispose (object);
 }
@@ -134,11 +154,32 @@ photos_preview_view_constructed (GObject *object)
    */
   gtk_container_add (GTK_CONTAINER (self), priv->view);
 
+  priv->nav_buttons = photos_preview_nav_buttons_new (self, GTK_OVERLAY (priv->overlay));
+
   gtk_widget_show_all (GTK_WIDGET (self));
 }
 
 
 static void
+photos_preview_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+  PhotosPreviewView *self = PHOTOS_PREVIEW_VIEW (object);
+  PhotosPreviewViewPrivate *priv = self->priv;
+
+  switch (prop_id)
+    {
+    case PROP_OVERLAY:
+      priv->overlay = GTK_WIDGET (g_value_dup_object (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+
+static void
 photos_preview_view_init (PhotosPreviewView *self)
 {
   PhotosPreviewViewPrivate *priv;
@@ -147,6 +188,12 @@ photos_preview_view_init (PhotosPreviewView *self)
   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, PHOTOS_TYPE_PREVIEW_VIEW, PhotosPreviewViewPrivate);
   priv = self->priv;
 
+  priv->mode_cntrlr = photos_mode_controller_new ();
+  g_signal_connect_swapped (priv->mode_cntrlr,
+                            "window-mode-changed",
+                            G_CALLBACK (photos_preview_view_window_mode_changed),
+                            self);
+
   gtk_widget_set_hexpand (GTK_WIDGET (self), TRUE);
   gtk_widget_set_vexpand (GTK_WIDGET (self), TRUE);
   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (self), GTK_SHADOW_IN);
@@ -175,15 +222,31 @@ photos_preview_view_class_init (PhotosPreviewViewClass *class)
 
   object_class->constructed = photos_preview_view_constructed;
   object_class->dispose = photos_preview_view_dispose;
+  object_class->set_property = photos_preview_view_set_property;
+
+  g_object_class_install_property (object_class,
+                                   PROP_OVERLAY,
+                                   g_param_spec_object ("overlay",
+                                                        "GtkOverlay object",
+                                                        "The stack overlay widget",
+                                                        GTK_TYPE_OVERLAY,
+                                                        G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
 
   g_type_class_add_private (class, sizeof (PhotosPreviewViewPrivate));
 }
 
 
 GtkWidget *
-photos_preview_view_new (void)
+photos_preview_view_new (GtkOverlay *overlay)
 {
-  return g_object_new (PHOTOS_TYPE_PREVIEW_VIEW, NULL);
+  return g_object_new (PHOTOS_TYPE_PREVIEW_VIEW, "overlay", overlay, NULL);
+}
+
+
+void
+photos_preview_view_set_model (PhotosPreviewView *self, GtkTreeModel *model, GtkTreePath *current_path)
+{
+  photos_preview_nav_buttons_set_model (self->priv->nav_buttons, model, current_path);
 }
 
 
@@ -204,4 +267,6 @@ photos_preview_view_set_node (PhotosPreviewView *self, GeglNode *node)
 
   /* Steals the reference to the GeglNode. */
   gegl_gtk_view_set_node (GEGL_GTK_VIEW (priv->view), g_object_ref (priv->node));
+
+  photos_preview_nav_buttons_show (priv->nav_buttons);
 }
diff --git a/src/photos-preview-view.h b/src/photos-preview-view.h
index 656994b..cdcdf3e 100644
--- a/src/photos-preview-view.h
+++ b/src/photos-preview-view.h
@@ -69,7 +69,11 @@ struct _PhotosPreviewViewClass
 
 GType                  photos_preview_view_get_type               (void) G_GNUC_CONST;
 
-GtkWidget             *photos_preview_view_new                    (void);
+GtkWidget             *photos_preview_view_new                    (GtkOverlay *overlay);
+
+void                   photos_preview_view_set_model              (PhotosPreviewView *self,
+                                                                   GtkTreeModel *model,
+                                                                   GtkTreePath *current_path);
 
 void                   photos_preview_view_set_node               (PhotosPreviewView *self, GeglNode *node);
 
diff --git a/src/photos-view-container.c b/src/photos-view-container.c
index 64f9635..72e480f 100644
--- a/src/photos-view-container.c
+++ b/src/photos-view-container.c
@@ -44,6 +44,7 @@ struct _PhotosViewContainerPrivate
 {
   GdMainView *view;
   GtkListStore *model;
+  GtkTreePath *current_path;
   GtkWidget *load_more;
   PhotosBaseManager *item_mngr;
   PhotosModeController *mode_cntrlr;
@@ -153,6 +154,7 @@ photos_view_container_item_activated (GdMainView *main_view,
   PhotosViewContainerPrivate *priv = self->priv;
   GObject *object;
 
+  priv->current_path = gtk_tree_path_copy (path);
   object = photos_base_manager_get_object_by_id (priv->item_mngr, id);
 
   if (!photos_base_item_is_collection (PHOTOS_BASE_ITEM (object)) &&
@@ -353,6 +355,18 @@ photos_view_container_dispose (GObject *object)
 
 
 static void
+photos_view_container_finalize (GObject *object)
+{
+  PhotosViewContainer *self = PHOTOS_VIEW_CONTAINER (object);
+  PhotosViewContainerPrivate *priv = self->priv;
+
+  g_clear_pointer (&priv->current_path, (GDestroyNotify) gtk_tree_path_free);
+
+  G_OBJECT_CLASS (photos_view_container_parent_class)->finalize (object);
+}
+
+
+static void
 photos_view_container_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
 {
   PhotosViewContainer *self = PHOTOS_VIEW_CONTAINER (object);
@@ -386,6 +400,7 @@ photos_view_container_class_init (PhotosViewContainerClass *class)
 
   object_class->constructed = photos_view_container_constructed;
   object_class->dispose = photos_view_container_dispose;
+  object_class->finalize = photos_view_container_finalize;
   object_class->set_property = photos_view_container_set_property;
 
   g_object_class_install_property (object_class,
@@ -406,3 +421,17 @@ photos_view_container_new (PhotosWindowMode mode)
 {
   return g_object_new (PHOTOS_TYPE_VIEW_CONTAINER, "mode", mode, NULL);
 }
+
+
+GtkTreePath *
+photos_view_container_get_current_path (PhotosViewContainer *self)
+{
+  return self->priv->current_path;
+}
+
+
+GtkListStore *
+photos_view_container_get_model (PhotosViewContainer *self)
+{
+  return self->priv->model;
+}
diff --git a/src/photos-view-container.h b/src/photos-view-container.h
index 4cf5e9f..c078b6c 100644
--- a/src/photos-view-container.h
+++ b/src/photos-view-container.h
@@ -72,6 +72,10 @@ GType                  photos_view_container_get_type               (void) G_GNU
 
 GtkWidget             *photos_view_container_new                    (PhotosWindowMode mode);
 
+GtkTreePath           *photos_view_container_get_current_path       (PhotosViewContainer *self);
+
+GtkListStore          *photos_view_container_get_model              (PhotosViewContainer *self);
+
 G_END_DECLS
 
 #endif /* PHOTOS_VIEW_CONTAINER_H */


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