[gnome-photos] preview-view: Show next and previous buttons
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-photos] preview-view: Show next and previous buttons
- Date: Fri, 2 Aug 2013 16:24:55 +0000 (UTC)
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]