[gnome-photos] Use GActions to represent the next and previous operations
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-photos] Use GActions to represent the next and previous operations
- Date: Mon, 26 Oct 2015 14:19:09 +0000 (UTC)
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]