[gnome-photos] Use GActions to represent the next and previous operations



commit bcdc22c208acabce039ec9491cf1aa5f9eeaca85
Author: Debarshi Ray <debarshir gnome org>
Date:   Fri Oct 23 19:00:47 2015 +0200

    Use GActions to represent the next and previous operations
    
    We were exposing too many internal details of classes (eg.,
    photos_embed_get_preview) to hook up the key press event in the
    MainWindow to the actual implementation in PreviewNavButtons. Plus we
    had our own set of signals to propagate the event to the rest of the
    code (eg., PreviewView). We can avoid all this by using GActions. It is
    simply the right thing to do.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=733660

 src/Makefile.am                  |    2 -
 src/photos-application.c         |   12 ++++
 src/photos-embed.c               |    7 --
 src/photos-embed.h               |    2 -
 src/photos-main-window.c         |   11 ++-
 src/photos-preview-nav-buttons.c |  127 +++++++++++++++-----------------------
 src/photos-preview-nav-buttons.h |   16 -----
 src/photos-preview-view.c        |   62 +++++++------------
 src/photos-preview-view.h        |    4 -
 9 files changed, 90 insertions(+), 153 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index d541fd9..aedf3ff 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -396,7 +396,6 @@ stamp-photos-enums.h: photos-enums.h.template
                ( glib-mkenums \
                        --template $(srcdir)/photos-enums.h.template \
                         $(srcdir)/photos-item-manager.h \
-                        $(srcdir)/photos-preview-nav-buttons.h \
                 ) >> xgen-etbh \
                && ( cmp -s xgen-etbh photos-enums.h || cp xgen-etbh photos-enums.h ) \
                && rm -f xgen-etbh \
@@ -408,7 +407,6 @@ photos-enums.c: photos-enums.c.template
                ( glib-mkenums \
                        --template $(srcdir)/photos-enums.c.template \
                         $(srcdir)/photos-item-manager.h \
-                        $(srcdir)/photos-preview-nav-buttons.h \
                 ) >> xgen-etbc \
                && ( cmp -s xgen-etbc photos-enums.c || cp xgen-etbc photos-enums.c ) \
                && rm -f xgen-etbc \
diff --git a/src/photos-application.c b/src/photos-application.c
index a200bf4..353a4ba 100644
--- a/src/photos-application.c
+++ b/src/photos-application.c
@@ -68,6 +68,8 @@ struct _PhotosApplicationPrivate
   GSettings *ss_settings;
   GSimpleAction *fs_action;
   GSimpleAction *gear_action;
+  GSimpleAction *load_next_action;
+  GSimpleAction *load_previous_action;
   GSimpleAction *open_action;
   GSimpleAction *print_action;
   GSimpleAction *properties_action;
@@ -855,6 +857,8 @@ photos_application_window_mode_changed (PhotosApplication *self, PhotosWindowMod
 
   enable = (mode == PHOTOS_WINDOW_MODE_PREVIEW);
   g_simple_action_set_enabled (priv->gear_action, enable);
+  g_simple_action_set_enabled (priv->load_next_action, enable);
+  g_simple_action_set_enabled (priv->load_previous_action, enable);
   g_simple_action_set_enabled (priv->open_action, enable);
   g_simple_action_set_enabled (priv->print_action, enable);
   g_simple_action_set_enabled (priv->properties_action, enable);
@@ -1011,6 +1015,12 @@ photos_application_startup (GApplication *application)
   g_signal_connect (priv->gear_action, "activate", G_CALLBACK (photos_application_action_toggle), self);
   g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (priv->gear_action));
 
+  priv->load_next_action = g_simple_action_new ("load-next", NULL);
+  g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (priv->load_next_action));
+
+  priv->load_previous_action = g_simple_action_new ("load-previous", NULL);
+  g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (priv->load_previous_action));
+
   priv->open_action = g_simple_action_new ("open-current", NULL);
   g_signal_connect_swapped (priv->open_action, "activate", G_CALLBACK (photos_application_open_current), 
self);
   g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (priv->open_action));
@@ -1145,6 +1155,8 @@ photos_application_dispose (GObject *object)
   g_clear_object (&priv->ss_settings);
   g_clear_object (&priv->fs_action);
   g_clear_object (&priv->gear_action);
+  g_clear_object (&priv->load_next_action);
+  g_clear_object (&priv->load_previous_action);
   g_clear_object (&priv->open_action);
   g_clear_object (&priv->print_action);
   g_clear_object (&priv->properties_action);
diff --git a/src/photos-embed.c b/src/photos-embed.c
index b4250fc..37f3a3a 100644
--- a/src/photos-embed.c
+++ b/src/photos-embed.c
@@ -833,10 +833,3 @@ photos_embed_get_main_toolbar (PhotosEmbed *self)
 {
   return PHOTOS_MAIN_TOOLBAR (self->priv->toolbar);
 }
-
-
-PhotosPreviewView *
-photos_embed_get_preview (PhotosEmbed *self)
-{
-  return PHOTOS_PREVIEW_VIEW (self->priv->preview);
-}
diff --git a/src/photos-embed.h b/src/photos-embed.h
index 9416fde..91ded80 100644
--- a/src/photos-embed.h
+++ b/src/photos-embed.h
@@ -75,8 +75,6 @@ GtkWidget             *photos_embed_new                    (void);
 
 PhotosMainToolbar     *photos_embed_get_main_toolbar       (PhotosEmbed *self);
 
-PhotosPreviewView     *photos_embed_get_preview            (PhotosEmbed *self);
-
 G_END_DECLS
 
 #endif /* PHOTOS_EMBED_H */
diff --git a/src/photos-main-window.c b/src/photos-main-window.c
index e865f40..075de5e 100644
--- a/src/photos-main-window.c
+++ b/src/photos-main-window.c
@@ -41,6 +41,8 @@
 
 struct _PhotosMainWindowPrivate
 {
+  GAction *load_next;
+  GAction *load_previous;
   GtkWidget *embed;
   GSettings *settings;
   PhotosBaseManager *item_mngr;
@@ -229,11 +231,9 @@ static gboolean
 photos_main_window_handle_key_preview (PhotosMainWindow *self, GdkEventKey *event)
 {
   PhotosMainWindowPrivate *priv = self->priv;
-  PhotosPreviewView *preview;
   gboolean fullscreen;
   gboolean handled = FALSE;
 
-  preview = photos_embed_get_preview (PHOTOS_EMBED (priv->embed));
   fullscreen = photos_mode_controller_get_fullscreen (priv->mode_cntrlr);
 
   switch (event->keyval)
@@ -244,12 +244,12 @@ photos_main_window_handle_key_preview (PhotosMainWindow *self, GdkEventKey *even
       break;
 
     case GDK_KEY_Left:
-      photos_preview_view_load_previous (preview);
+      g_action_activate (priv->load_previous, NULL);
       handled = TRUE;
       break;
 
     case GDK_KEY_Right:
-      photos_preview_view_load_next (preview);
+      g_action_activate (priv->load_next, NULL);
       handled = TRUE;
       break;
 
@@ -360,6 +360,9 @@ photos_main_window_constructed (GObject *object)
   app = g_application_get_default ();
   gtk_application_add_window (GTK_APPLICATION (app), GTK_WINDOW (self));
 
+  priv->load_next = g_action_map_lookup_action (G_ACTION_MAP (app), "load-next");
+  priv->load_previous = g_action_map_lookup_action (G_ACTION_MAP (app), "load-previous");
+
   priv->embed = photos_embed_new ();
   gtk_container_add (GTK_CONTAINER (self), priv->embed);
 }
diff --git a/src/photos-preview-nav-buttons.c b/src/photos-preview-nav-buttons.c
index ae40dd4..46f4600 100644
--- a/src/photos-preview-nav-buttons.c
+++ b/src/photos-preview-nav-buttons.c
@@ -29,7 +29,6 @@
 #include <glib/gi18n.h>
 
 #include "photos-base-manager.h"
-#include "photos-enums.h"
 #include "photos-icons.h"
 #include "photos-preview-model.h"
 #include "photos-preview-nav-buttons.h"
@@ -39,6 +38,8 @@
 
 struct _PhotosPreviewNavButtonsPrivate
 {
+  GAction *load_next;
+  GAction *load_previous;
   GtkGesture *tap_gesture;
   GtkTreeModel *model;
   GtkTreePath *current_path;
@@ -47,7 +48,6 @@ struct _PhotosPreviewNavButtonsPrivate
   GtkWidget *prev_widget;
   GtkWidget *preview_view;
   PhotosBaseManager *item_mngr;
-  PhotosPreviewAction action;
   gboolean enable_next;
   gboolean enable_prev;
   gboolean visible;
@@ -63,14 +63,6 @@ enum
   PROP_PREVIEW_VIEW
 };
 
-enum
-{
-  ACTIVATED,
-  LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
 
 G_DEFINE_TYPE_WITH_PRIVATE (PhotosPreviewNavButtons, photos_preview_nav_buttons, G_TYPE_OBJECT);
 
@@ -146,6 +138,9 @@ photos_preview_nav_buttons_update_visibility (PhotosPreviewNavButtons *self)
     photos_preview_nav_buttons_fade_in_button (self, priv->prev_widget);
   else
     photos_preview_nav_buttons_fade_out_button (self, priv->prev_widget);
+
+  g_simple_action_set_enabled (G_SIMPLE_ACTION (priv->load_next), priv->enable_next);
+  g_simple_action_set_enabled (G_SIMPLE_ACTION (priv->load_previous), priv->enable_prev);
 }
 
 
@@ -284,6 +279,34 @@ photos_preview_nav_buttons_set_active_path (PhotosPreviewNavButtons *self)
 
 
 static void
+photos_preview_nav_buttons_next (PhotosPreviewNavButtons *self)
+{
+  PhotosPreviewNavButtonsPrivate *priv = self->priv;
+
+  if (!priv->enable_next)
+    return;
+
+  gtk_tree_path_next (priv->current_path);
+  photos_preview_nav_buttons_set_active_path (self);
+  photos_preview_nav_buttons_update_visibility (self);
+}
+
+
+static void
+photos_preview_nav_buttons_previous (PhotosPreviewNavButtons *self)
+{
+  PhotosPreviewNavButtonsPrivate *priv = self->priv;
+
+  if (!priv->enable_prev)
+    return;
+
+  gtk_tree_path_prev (priv->current_path);
+  photos_preview_nav_buttons_set_active_path (self);
+  photos_preview_nav_buttons_update_visibility (self);
+}
+
+
+static void
 photos_preview_nav_buttons_dispose (GObject *object)
 {
   PhotosPreviewNavButtons *self = PHOTOS_PREVIEW_NAV_BUTTONS (object);
@@ -335,14 +358,11 @@ photos_preview_nav_buttons_constructed (GObject *object)
 
   button = gtk_button_new ();
   gtk_button_set_image (GTK_BUTTON (button), image);
+  gtk_actionable_set_action_name (GTK_ACTIONABLE (button), "app.load-previous");
   context = gtk_widget_get_style_context (button);
   gtk_style_context_add_class (context, "osd");
   gtk_container_add (GTK_CONTAINER (priv->prev_widget), button);
   g_signal_connect_swapped (button,
-                            "clicked",
-                            G_CALLBACK (photos_preview_nav_buttons_previous),
-                            self);
-  g_signal_connect_swapped (button,
                             "enter-notify-event",
                             G_CALLBACK (photos_preview_nav_buttons_enter_notify),
                             self);
@@ -364,14 +384,11 @@ photos_preview_nav_buttons_constructed (GObject *object)
 
   button = gtk_button_new ();
   gtk_button_set_image (GTK_BUTTON (button), image);
+  gtk_actionable_set_action_name (GTK_ACTIONABLE (button), "app.load-next");
   context = gtk_widget_get_style_context (button);
   gtk_style_context_add_class (context, "osd");
   gtk_container_add (GTK_CONTAINER (priv->next_widget), button);
   g_signal_connect_swapped (button,
-                            "clicked",
-                            G_CALLBACK (photos_preview_nav_buttons_next),
-                            self);
-  g_signal_connect_swapped (button,
                             "enter-notify-event",
                             G_CALLBACK (photos_preview_nav_buttons_enter_notify),
                             self);
@@ -434,9 +451,21 @@ photos_preview_nav_buttons_init (PhotosPreviewNavButtons *self)
   app = g_application_get_default ();
   state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
 
-  priv->item_mngr = g_object_ref (state->item_mngr);
+  priv->load_next = g_action_map_lookup_action (G_ACTION_MAP (app), "load-next");
+  g_signal_connect_object (priv->load_next,
+                           "activate",
+                           G_CALLBACK (photos_preview_nav_buttons_next),
+                           self,
+                           G_CONNECT_SWAPPED);
 
-  priv->action = PHOTOS_PREVIEW_ACTION_NONE;
+  priv->load_previous = g_action_map_lookup_action (G_ACTION_MAP (app), "load-previous");
+  g_signal_connect_object (priv->load_previous,
+                           "activate",
+                           G_CALLBACK (photos_preview_nav_buttons_previous),
+                           self,
+                           G_CONNECT_SWAPPED);
+
+  priv->item_mngr = g_object_ref (state->item_mngr);
 }
 
 
@@ -465,17 +494,6 @@ photos_preview_nav_buttons_class_init (PhotosPreviewNavButtonsClass *class)
                                                         "The widget used for showing the preview",
                                                         PHOTOS_TYPE_PREVIEW_VIEW,
                                                         G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
-
-  signals[ACTIVATED] = g_signal_new ("activated",
-                                     G_TYPE_FROM_CLASS (class),
-                                     G_SIGNAL_RUN_LAST,
-                                     G_STRUCT_OFFSET (PhotosPreviewNavButtonsClass, activated),
-                                     NULL, /*accumulator */
-                                     NULL, /*accu_data */
-                                     g_cclosure_marshal_generic,
-                                     G_TYPE_NONE,
-                                     1,
-                                     PHOTOS_TYPE_PREVIEW_ACTION);
 }
 
 
@@ -486,58 +504,14 @@ photos_preview_nav_buttons_new (PhotosPreviewView *preview_view, GtkOverlay *ove
 }
 
 
-PhotosPreviewAction
-photos_preview_nav_buttons_get_action (PhotosPreviewNavButtons *self)
-{
-  return self->priv->action;
-}
-
-
 void
 photos_preview_nav_buttons_hide (PhotosPreviewNavButtons *self)
 {
   PhotosPreviewNavButtonsPrivate *priv = self->priv;
 
-  priv->action = PHOTOS_PREVIEW_ACTION_NONE;
   priv->visible = FALSE;
   priv->visible_internal = FALSE;
   photos_preview_nav_buttons_update_visibility (self);
-
-  g_signal_emit (self, signals[ACTIVATED], 0, priv->action);
-}
-
-
-void
-photos_preview_nav_buttons_next (PhotosPreviewNavButtons *self)
-{
-  PhotosPreviewNavButtonsPrivate *priv = self->priv;
-
-  if (!priv->enable_next)
-    return;
-
-  priv->action = PHOTOS_PREVIEW_ACTION_NEXT;
-  gtk_tree_path_next (priv->current_path);
-  photos_preview_nav_buttons_set_active_path (self);
-  photos_preview_nav_buttons_update_visibility (self);
-
-  g_signal_emit (self, signals[ACTIVATED], 0, priv->action);
-}
-
-
-void
-photos_preview_nav_buttons_previous (PhotosPreviewNavButtons *self)
-{
-  PhotosPreviewNavButtonsPrivate *priv = self->priv;
-
-  if (!priv->enable_prev)
-    return;
-
-  priv->action = PHOTOS_PREVIEW_ACTION_PREVIOUS;
-  gtk_tree_path_prev (priv->current_path);
-  photos_preview_nav_buttons_set_active_path (self);
-  photos_preview_nav_buttons_update_visibility (self);
-
-  g_signal_emit (self, signals[ACTIVATED], 0, priv->action);
 }
 
 
@@ -564,11 +538,8 @@ photos_preview_nav_buttons_show (PhotosPreviewNavButtons *self)
 {
   PhotosPreviewNavButtonsPrivate *priv = self->priv;
 
-  priv->action = PHOTOS_PREVIEW_ACTION_NONE;
   priv->visible = TRUE;
   priv->visible_internal = TRUE;
   photos_preview_nav_buttons_update_visibility (self);
   photos_preview_nav_buttons_queue_auto_hide (self);
-
-  g_signal_emit (self, signals[ACTIVATED], 0, priv->action);
 }
diff --git a/src/photos-preview-nav-buttons.h b/src/photos-preview-nav-buttons.h
index fbc2a8d..5fe5ce6 100644
--- a/src/photos-preview-nav-buttons.h
+++ b/src/photos-preview-nav-buttons.h
@@ -54,13 +54,6 @@ G_BEGIN_DECLS
   (G_TYPE_INSTANCE_GET_CLASS ((obj), \
    PHOTOS_TYPE_PREVIEW_VIEW, PhotosPreviewNavButtonsClass))
 
-typedef enum
-{
-  PHOTOS_PREVIEW_ACTION_NONE,
-  PHOTOS_PREVIEW_ACTION_NEXT,
-  PHOTOS_PREVIEW_ACTION_PREVIOUS
-} PhotosPreviewAction;
-
 typedef struct _PhotosPreviewNavButtons        PhotosPreviewNavButtons;
 typedef struct _PhotosPreviewNavButtonsClass   PhotosPreviewNavButtonsClass;
 typedef struct _PhotosPreviewNavButtonsPrivate PhotosPreviewNavButtonsPrivate;
@@ -74,9 +67,6 @@ struct _PhotosPreviewNavButtons
 struct _PhotosPreviewNavButtonsClass
 {
   GObjectClass parent_class;
-
-  /* signals */
-  void (*activated) (PhotosPreviewNavButtons *self, PhotosPreviewAction action);
 };
 
 GType                       photos_preview_nav_buttons_get_type           (void) G_GNUC_CONST;
@@ -84,14 +74,8 @@ GType                       photos_preview_nav_buttons_get_type           (void)
 PhotosPreviewNavButtons    *photos_preview_nav_buttons_new                (PhotosPreviewView *preview_view,
                                                                            GtkOverlay *overlay);
 
-PhotosPreviewAction         photos_preview_nav_buttons_get_action         (PhotosPreviewNavButtons *self);
-
 void                        photos_preview_nav_buttons_hide               (PhotosPreviewNavButtons *self);
 
-void                        photos_preview_nav_buttons_next               (PhotosPreviewNavButtons *self);
-
-void                        photos_preview_nav_buttons_previous           (PhotosPreviewNavButtons *self);
-
 void                        photos_preview_nav_buttons_set_model          (PhotosPreviewNavButtons *self,
                                                                            GtkTreeModel *model,
                                                                            GtkTreePath *current_path);
diff --git a/src/photos-preview-view.c b/src/photos-preview-view.c
index 5edaab8..8431a3f 100644
--- a/src/photos-preview-view.c
+++ b/src/photos-preview-view.c
@@ -103,32 +103,12 @@ photos_preview_view_get_invisible_view (PhotosPreviewView *self)
 
 
 static void
-photos_preview_view_nav_buttons_activated (PhotosPreviewView *self, PhotosPreviewAction action)
+photos_preview_view_navigate (PhotosPreviewView *self, gint position)
 {
   PhotosPreviewViewPrivate *priv = self->priv;
   GtkWidget *current_view;
   GtkWidget *new_view;
   GtkWidget *next_view;
-  gint position;
-
-  if (action == PHOTOS_PREVIEW_ACTION_NONE)
-    return;
-
-  switch (action)
-    {
-    case PHOTOS_PREVIEW_ACTION_NEXT:
-      position = 0;
-      break;
-
-    case PHOTOS_PREVIEW_ACTION_PREVIOUS:
-      position = -1;
-      break;
-
-    case PHOTOS_PREVIEW_ACTION_NONE:
-    default:
-      g_assert_not_reached ();
-      break;
-    }
 
   current_view = gtk_stack_get_visible_child (GTK_STACK (priv->stack));
   gtk_container_child_set (GTK_CONTAINER (priv->stack), current_view, "position", position, NULL);
@@ -143,6 +123,20 @@ photos_preview_view_nav_buttons_activated (PhotosPreviewView *self, PhotosPrevie
 }
 
 
+static void
+photos_preview_view_navigate_next (PhotosPreviewView *self)
+{
+  photos_preview_view_navigate (self, 0);
+}
+
+
+static void
+photos_preview_view_navigate_previous (PhotosPreviewView *self)
+{
+  photos_preview_view_navigate (self, -1);
+}
+
+
 static GtkWidget *
 photos_preview_view_create_view (PhotosPreviewView *self)
 {
@@ -213,11 +207,6 @@ photos_preview_view_constructed (GObject *object)
   gtk_container_add (GTK_CONTAINER (self), priv->stack);
 
   priv->nav_buttons = photos_preview_nav_buttons_new (self, GTK_OVERLAY (priv->overlay));
-  g_signal_connect_swapped (priv->nav_buttons,
-                            "activated",
-                            G_CALLBACK (photos_preview_view_nav_buttons_activated),
-                            self);
-
   gtk_widget_show_all (GTK_WIDGET (self));
 }
 
@@ -245,6 +234,7 @@ static void
 photos_preview_view_init (PhotosPreviewView *self)
 {
   PhotosPreviewViewPrivate *priv;
+  GAction *action;
   GApplication *app;
   GtkStyleContext *context;
   GtkWidget *view;
@@ -277,6 +267,12 @@ photos_preview_view_init (PhotosPreviewView *self)
 
   view = photos_preview_view_create_view (self);
   gtk_container_add (GTK_CONTAINER (priv->stack), view);
+
+  action = g_action_map_lookup_action (G_ACTION_MAP (app), "load-next");
+  g_signal_connect_swapped (action, "activate", G_CALLBACK (photos_preview_view_navigate_next), self);
+
+  action = g_action_map_lookup_action (G_ACTION_MAP (app), "load-previous");
+  g_signal_connect_swapped (action, "activate", G_CALLBACK (photos_preview_view_navigate_previous), self);
 }
 
 
@@ -307,20 +303,6 @@ photos_preview_view_new (GtkOverlay *overlay)
 
 
 void
-photos_preview_view_load_next (PhotosPreviewView *self)
-{
-  photos_preview_nav_buttons_next (self->priv->nav_buttons);
-}
-
-
-void
-photos_preview_view_load_previous (PhotosPreviewView *self)
-{
-  photos_preview_nav_buttons_previous (self->priv->nav_buttons);
-}
-
-
-void
 photos_preview_view_set_model (PhotosPreviewView *self, GtkTreeModel *model, GtkTreePath *current_path)
 {
   PhotosPreviewViewPrivate *priv = self->priv;
diff --git a/src/photos-preview-view.h b/src/photos-preview-view.h
index 65257cb..cdcdf3e 100644
--- a/src/photos-preview-view.h
+++ b/src/photos-preview-view.h
@@ -71,10 +71,6 @@ GType                  photos_preview_view_get_type               (void) G_GNUC_
 
 GtkWidget             *photos_preview_view_new                    (GtkOverlay *overlay);
 
-void                   photos_preview_view_load_next              (PhotosPreviewView *self);
-
-void                   photos_preview_view_load_previous          (PhotosPreviewView *self);
-
 void                   photos_preview_view_set_model              (PhotosPreviewView *self,
                                                                    GtkTreeModel *model,
                                                                    GtkTreePath *current_path);


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