aboutsummaryrefslogtreecommitdiffstats
path: root/shell/e-shell-view.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2013-07-04 23:04:51 +0800
committerMatthew Barnes <mbarnes@redhat.com>2013-07-06 04:40:48 +0800
commit31b5261fdbe2c98e7f4f71e908e5d9b58609de94 (patch)
treee9157fa12b3978c68492b04c10137c74eee21b17 /shell/e-shell-view.c
parent7d6027be1a9989549c80fdbe6dcf8317c54a6a6a (diff)
downloadgsoc2013-evolution-31b5261fdbe2c98e7f4f71e908e5d9b58609de94.tar
gsoc2013-evolution-31b5261fdbe2c98e7f4f71e908e5d9b58609de94.tar.gz
gsoc2013-evolution-31b5261fdbe2c98e7f4f71e908e5d9b58609de94.tar.bz2
gsoc2013-evolution-31b5261fdbe2c98e7f4f71e908e5d9b58609de94.tar.lz
gsoc2013-evolution-31b5261fdbe2c98e7f4f71e908e5d9b58609de94.tar.xz
gsoc2013-evolution-31b5261fdbe2c98e7f4f71e908e5d9b58609de94.tar.zst
gsoc2013-evolution-31b5261fdbe2c98e7f4f71e908e5d9b58609de94.zip
EShellView: Add a "view-instance" property.
EShellView now holds a reference to the active GalViewInstance. Where applicable, the EShellView subclass is responsible for keeping this up to date when the sidebar selection changes. Holding a reference allows EShellView to implement common actions like "Save Current View" directly instead pushing it on to subclasses. New functions: e_shell_view_get_view_instance e_shell_view_set_view_instance
Diffstat (limited to 'shell/e-shell-view.c')
-rw-r--r--shell/e-shell-view.c188
1 files changed, 151 insertions, 37 deletions
diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c
index 1f979e6ccb..efdebc8b8c 100644
--- a/shell/e-shell-view.c
+++ b/shell/e-shell-view.c
@@ -53,6 +53,10 @@ struct _EShellViewPrivate {
gpointer state_save_activity; /* weak pointer */
guint state_save_timeout_id;
+ GalViewInstance *view_instance;
+ gulong view_instance_changed_handler_id;
+ gulong view_instance_loaded_handler_id;
+
gchar *title;
gchar *view_id;
gint page_num;
@@ -85,7 +89,8 @@ enum {
PROP_SHELL_WINDOW,
PROP_STATE_KEY_FILE,
PROP_TITLE,
- PROP_VIEW_ID
+ PROP_VIEW_ID,
+ PROP_VIEW_INSTANCE
};
enum {
@@ -404,6 +409,12 @@ shell_view_set_property (GObject *object,
E_SHELL_VIEW (object),
g_value_get_string (value));
return;
+
+ case PROP_VIEW_INSTANCE:
+ e_shell_view_set_view_instance (
+ E_SHELL_VIEW (object),
+ g_value_get_object (value));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -486,6 +497,12 @@ shell_view_get_property (GObject *object,
value, e_shell_view_get_view_id (
E_SHELL_VIEW (object)));
return;
+
+ case PROP_VIEW_INSTANCE:
+ g_value_set_object (
+ value, e_shell_view_get_view_instance (
+ E_SHELL_VIEW (object)));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -513,6 +530,20 @@ shell_view_dispose (GObject *object)
priv->state_save_activity = NULL;
}
+ if (priv->view_instance_changed_handler_id > 0) {
+ g_signal_handler_disconnect (
+ priv->view_instance,
+ priv->view_instance_changed_handler_id);
+ priv->view_instance_changed_handler_id = 0;
+ }
+
+ if (priv->view_instance_loaded_handler_id > 0) {
+ g_signal_handler_disconnect (
+ priv->view_instance,
+ priv->view_instance_loaded_handler_id);
+ priv->view_instance_loaded_handler_id = 0;
+ }
+
if (priv->preferences_window != NULL) {
g_signal_handler_disconnect (
priv->preferences_window,
@@ -526,6 +557,7 @@ shell_view_dispose (GObject *object)
priv->shell_window = NULL;
}
+ g_clear_object (&priv->view_instance);
g_clear_object (&priv->shell_content);
g_clear_object (&priv->shell_sidebar);
g_clear_object (&priv->shell_taskbar);
@@ -923,6 +955,21 @@ e_shell_view_class_init (EShellViewClass *class)
G_PARAM_STATIC_STRINGS));
/**
+ * EShellView:view-instance:
+ *
+ * The current #GalViewInstance.
+ **/
+ g_object_class_install_property (
+ object_class,
+ PROP_VIEW_INSTANCE,
+ g_param_spec_object (
+ "view-instance",
+ "View Instance",
+ "The current view instance",
+ GAL_TYPE_VIEW_INSTANCE,
+ G_PARAM_READWRITE));
+
+ /**
* EShellView::toggled
* @shell_view: the #EShellView which emitted the signal
*
@@ -1214,6 +1261,109 @@ e_shell_view_set_view_id (EShellView *shell_view,
}
/**
+ * e_shell_view_new_view_instance:
+ * @shell_view: an #EShellView
+ * @instance_id: a name for the #GalViewInstance
+ *
+ * Convenience function creates a new #GalViewInstance from the
+ * #GalViewCollection in @shell_view's #EShellViewClass.
+ *
+ * Returns: a new #GalViewInstance
+ **/
+GalViewInstance *
+e_shell_view_new_view_instance (EShellView *shell_view,
+ const gchar *instance_id)
+{
+ EShellViewClass *class;
+ GalViewCollection *view_collection;
+
+ g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
+
+ class = E_SHELL_VIEW_GET_CLASS (shell_view);
+
+ view_collection = class->view_collection;
+
+ return gal_view_instance_new (view_collection, instance_id);
+}
+
+/**
+ * e_shell_view_get_view_instance:
+ * @shell_view: an #EShellView
+ *
+ * Returns the current #GalViewInstance for @shell_view.
+ *
+ * #EShellView subclasses are responsible for creating and configuring a
+ * #GalViewInstance and handing it off so the @shell_view can monitor it
+ * and perform common actions on it.
+ *
+ * Returns: a #GalViewInstance, or %NULL
+ **/
+GalViewInstance *
+e_shell_view_get_view_instance (EShellView *shell_view)
+{
+ g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
+
+ return shell_view->priv->view_instance;
+}
+
+/**
+ * e_shell_view_set_view_instance:
+ * @shell_view: an #EShellView
+ * @view_instance: a #GalViewInstance, or %NULL
+ *
+ * Sets the current #GalViewInstance for @shell_view.
+ *
+ * #EShellView subclasses are responsible for creating and configuring a
+ * #GalViewInstance and handing it off so the @shell_view can monitor it
+ * and perform common actions on it.
+ **/
+void
+e_shell_view_set_view_instance (EShellView *shell_view,
+ GalViewInstance *view_instance)
+{
+ g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
+
+ if (view_instance != NULL) {
+ g_return_if_fail (GAL_IS_VIEW_INSTANCE (view_instance));
+ g_object_ref (view_instance);
+ }
+
+ if (shell_view->priv->view_instance_changed_handler_id > 0) {
+ g_signal_handler_disconnect (
+ shell_view->priv->view_instance,
+ shell_view->priv->view_instance_changed_handler_id);
+ shell_view->priv->view_instance_changed_handler_id = 0;
+ }
+
+ if (shell_view->priv->view_instance_loaded_handler_id > 0) {
+ g_signal_handler_disconnect (
+ shell_view->priv->view_instance,
+ shell_view->priv->view_instance_loaded_handler_id);
+ shell_view->priv->view_instance_loaded_handler_id = 0;
+ }
+
+ g_clear_object (&shell_view->priv->view_instance);
+
+ shell_view->priv->view_instance = view_instance;
+
+ if (view_instance != NULL) {
+ gulong handler_id;
+
+ handler_id = g_signal_connect_swapped (
+ view_instance, "changed",
+ G_CALLBACK (shell_view_update_view_id), shell_view);
+ shell_view->priv->view_instance_changed_handler_id = handler_id;
+
+ handler_id = g_signal_connect_swapped (
+ view_instance, "loaded",
+ G_CALLBACK (shell_view_update_view_id), shell_view);
+ shell_view->priv->view_instance_loaded_handler_id = handler_id;
+ }
+
+ g_object_notify (G_OBJECT (shell_view), "view-instance");
+}
+
+/**
* e_shell_view_get_shell_window:
* @shell_view: an #EShellView
*
@@ -1734,42 +1884,6 @@ e_shell_view_show_popup_menu (EShellView *shell_view,
}
/**
- * e_shell_view_new_view_instance:
- * @shell_view: an #EShellView
- * @instance_id: a name for the #GalViewInstance
- *
- * Creates a new #GalViewInstance and configures it to keep
- * @shell_view<!-- -->'s #EShellView:view-id property up-to-date.
- *
- * Returns: a new #GalViewInstance
- **/
-GalViewInstance *
-e_shell_view_new_view_instance (EShellView *shell_view,
- const gchar *instance_id)
-{
- EShellViewClass *class;
- GalViewCollection *view_collection;
- GalViewInstance *view_instance;
-
- g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
-
- class = E_SHELL_VIEW_GET_CLASS (shell_view);
-
- view_collection = class->view_collection;
- view_instance = gal_view_instance_new (view_collection, instance_id);
-
- g_signal_connect_swapped (
- view_instance, "changed",
- G_CALLBACK (shell_view_update_view_id), shell_view);
-
- g_signal_connect_swapped (
- view_instance, "loaded",
- G_CALLBACK (shell_view_update_view_id), shell_view);
-
- return view_instance;
-}
-
-/**
* e_shell_view_write_source:
* @shell_view: an #EShellView
* @source: an #ESource