[gnome-photos] Merge PhotosCollectionManager into PhotosItemManager



commit 34edc98b448c122d07ead5f7d2af098b59fc0890
Author: Debarshi Ray <debarshir gnome org>
Date:   Fri Sep 19 18:19:14 2014 +0200

    Merge PhotosCollectionManager into PhotosItemManager
    
    Fixes: https://bugzilla.gnome.org/737071

 src/Makefile.am                             |    2 -
 src/photos-application.c                    |   22 ++--
 src/photos-base-manager.c                   |   56 +++++---
 src/photos-base-manager.h                   |    2 +
 src/photos-collection-icon-watcher.c        |    7 +-
 src/photos-collection-manager.c             |   69 ---------
 src/photos-collection-manager.h             |   75 ----------
 src/photos-delete-notification.c            |   10 +-
 src/photos-dlna-renderers-dialog.c          |   10 +-
 src/photos-embed.c                          |   12 +--
 src/photos-fetch-collection-state-job.c     |    7 +-
 src/photos-item-manager.c                   |  209 ++++++++++++++++++++-------
 src/photos-item-manager.h                   |    9 +-
 src/photos-main-toolbar.c                   |   54 ++++----
 src/photos-main-window.c                    |    9 +-
 src/photos-offset-collections-controller.c  |   12 +-
 src/photos-offset-favorites-controller.c    |   12 +-
 src/photos-organize-collection-model.c      |    2 +-
 src/photos-overview-searchbar.c             |   10 +-
 src/photos-preview-model.c                  |   12 ++-
 src/photos-preview-nav-buttons.c            |   10 +-
 src/photos-properties-dialog.c              |   10 +-
 src/photos-query-builder.c                  |   10 +-
 src/photos-search-context.c                 |    8 +-
 src/photos-search-context.h                 |    4 +-
 src/photos-selection-controller.c           |   11 ++-
 src/photos-selection-toolbar.c              |   10 +-
 src/photos-tracker-collections-controller.c |   16 +-
 src/photos-tracker-controller.c             |    2 +-
 src/photos-tracker-favorites-controller.c   |   16 +-
 src/photos-tracker-search-controller.c      |   11 +-
 src/photos-view-container.c                 |    9 +-
 src/photos-view-model.c                     |   13 +-
 33 files changed, 372 insertions(+), 359 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 2f4f09b..3888c5c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -80,8 +80,6 @@ gnome_photos_SOURCES = \
        photos-camera-cache.h \
        photos-collection-icon-watcher.c \
        photos-collection-icon-watcher.h \
-       photos-collection-manager.c \
-       photos-collection-manager.h \
        photos-create-collection-icon-job.c \
        photos-create-collection-icon-job.h \
        photos-create-collection-job.c \
diff --git a/src/photos-application.c b/src/photos-application.c
index 32044ff..bd6c010 100644
--- a/src/photos-application.c
+++ b/src/photos-application.c
@@ -72,7 +72,6 @@ struct _PhotosApplicationPrivate
   GSimpleAction *set_bg_action;
   GSimpleAction *remote_display_action;
   GtkWidget *main_window;
-  PhotosBaseManager *item_mngr;
   PhotosCameraCache *camera_cache;
   PhotosModeController *mode_cntrlr;
   PhotosSearchContextState *state;
@@ -205,7 +204,7 @@ photos_application_activate_item (PhotosApplication *self, GObject *item)
   PhotosApplicationPrivate *priv = self->priv;
 
   photos_application_create_window (self);
-  photos_base_manager_set_active_object (priv->item_mngr, item);
+  photos_base_manager_set_active_object (priv->state->item_mngr, item);
   g_application_activate (G_APPLICATION (self));
 
   /* TODO: Forward the search terms when we exit the preview */
@@ -223,10 +222,10 @@ photos_application_activate_query_executed (TrackerSparqlCursor *cursor, gpointe
   if (cursor == NULL)
     goto out;
 
-  photos_item_manager_add_item (PHOTOS_ITEM_MANAGER (priv->item_mngr), cursor);
+  photos_item_manager_add_item (PHOTOS_ITEM_MANAGER (priv->state->item_mngr), cursor);
 
   identifier = tracker_sparql_cursor_get_string (cursor, PHOTOS_QUERY_COLUMNS_URN, NULL);
-  item = photos_base_manager_get_object_by_id (priv->item_mngr, identifier);
+  item = photos_base_manager_get_object_by_id (priv->state->item_mngr, identifier);
 
   photos_application_activate_item (self, item);
 
@@ -246,7 +245,7 @@ photos_application_activate_result (PhotosApplication *self,
 
   priv->activation_timestamp = timestamp;
 
-  item = photos_base_manager_get_object_by_id (priv->item_mngr, identifier);
+  item = photos_base_manager_get_object_by_id (priv->state->item_mngr, identifier);
   if (item != NULL)
     photos_application_activate_item (self, item);
   else
@@ -337,7 +336,7 @@ photos_application_open_current (PhotosApplication *self)
   PhotosBaseItem *item;
   guint32 time;
 
-  item = PHOTOS_BASE_ITEM (photos_base_manager_get_active_object (priv->item_mngr));
+  item = PHOTOS_BASE_ITEM (photos_base_manager_get_active_object (priv->state->item_mngr));
   if (item == NULL)
     return;
 
@@ -353,7 +352,7 @@ photos_application_print_current (PhotosApplication *self)
   PhotosApplicationPrivate *priv = self->priv;
   PhotosBaseItem *item;
 
-  item = PHOTOS_BASE_ITEM (photos_base_manager_get_active_object (priv->item_mngr));
+  item = PHOTOS_BASE_ITEM (photos_base_manager_get_active_object (priv->state->item_mngr));
   if (item == NULL)
     return;
 
@@ -369,7 +368,7 @@ photos_application_properties (PhotosApplication *self)
   GtkWidget *dialog;
   const gchar *id;
 
-  item = photos_base_manager_get_active_object (priv->item_mngr);
+  item = photos_base_manager_get_active_object (priv->state->item_mngr);
   if (item == NULL)
     return;
 
@@ -470,7 +469,7 @@ photos_application_remote_display_current (PhotosApplication *self)
   GtkWidget *dialog;
   const gchar *urn;
 
-  item = photos_base_manager_get_active_object (priv->item_mngr);
+  item = photos_base_manager_get_active_object (priv->state->item_mngr);
   if (item == NULL)
     return;
 
@@ -526,7 +525,7 @@ photos_application_set_bg (PhotosApplication *self)
 {
   PhotosBaseItem *item;
 
-  item = PHOTOS_BASE_ITEM (photos_base_manager_get_active_object (self->priv->item_mngr));
+  item = PHOTOS_BASE_ITEM (photos_base_manager_get_active_object (self->priv->state->item_mngr));
   if (item == NULL)
     return;
 
@@ -861,8 +860,6 @@ photos_application_startup (GApplication *application)
                                               photos_application_tracker_extract_priority,
                                               g_object_ref (self));
 
-  priv->item_mngr = photos_item_manager_dup_singleton ();
-
   /* A dummy reference to keep it alive during the lifetime of the
    * application.
    */
@@ -994,7 +991,6 @@ photos_application_dispose (GObject *object)
   g_clear_object (&priv->sel_all_action);
   g_clear_object (&priv->sel_none_action);
   g_clear_object (&priv->set_bg_action);
-  g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->camera_cache);
   g_clear_object (&priv->mode_cntrlr);
   g_clear_object (&priv->extract_priority);
diff --git a/src/photos-base-manager.c b/src/photos-base-manager.c
index 9c88898..b1f0328 100644
--- a/src/photos-base-manager.c
+++ b/src/photos-base-manager.c
@@ -59,6 +59,22 @@ static guint signals[LAST_SIGNAL] = { 0 };
 G_DEFINE_TYPE_WITH_PRIVATE (PhotosBaseManager, photos_base_manager, G_TYPE_OBJECT);
 
 
+static void
+photos_base_manager_default_add_object (PhotosBaseManager *self, GObject *object)
+{
+  GObject *old_object;
+  const gchar *id;
+
+  id = photos_filterable_get_id (PHOTOS_FILTERABLE (object));
+  old_object = photos_base_manager_get_object_by_id (self, id);
+  if (old_object != NULL)
+    return;
+
+  g_hash_table_insert (self->priv->objects, g_strdup (id), g_object_ref (object));
+  g_signal_emit (self, signals[OBJECT_ADDED], 0, object);
+}
+
+
 static gchar *
 photos_base_manager_default_get_filter (PhotosBaseManager *self, gint flags)
 {
@@ -73,6 +89,22 @@ photos_base_manager_default_get_where (PhotosBaseManager *self, gint flags)
 }
 
 
+static void
+photos_base_manager_default_remove_object_by_id (PhotosBaseManager *self, const gchar *id)
+{
+  GObject *object;
+
+  object = photos_base_manager_get_object_by_id (self, id);
+  if (object == NULL)
+    return;
+
+  g_object_ref (object);
+  g_hash_table_remove (self->priv->objects, id);
+  g_signal_emit (self, signals[OBJECT_REMOVED], 0, object);
+  g_object_unref (object);
+}
+
+
 static gboolean
 photos_base_manager_default_set_active_object (PhotosBaseManager *self, GObject *object)
 {
@@ -159,8 +191,10 @@ photos_base_manager_class_init (PhotosBaseManagerClass *class)
   object_class->dispose = photos_base_manager_dispose;
   object_class->finalize = photos_base_manager_finalize;
   object_class->set_property = photos_base_manager_set_property;
+  class->add_object = photos_base_manager_default_add_object;
   class->get_filter = photos_base_manager_default_get_filter;
   class->get_where = photos_base_manager_default_get_where;
+  class->remove_object_by_id = photos_base_manager_default_remove_object_by_id;
   class->set_active_object = photos_base_manager_default_set_active_object;
 
   g_object_class_install_property (object_class,
@@ -223,16 +257,7 @@ photos_base_manager_class_init (PhotosBaseManagerClass *class)
 void
 photos_base_manager_add_object (PhotosBaseManager *self, GObject *object)
 {
-  GObject *old_object;
-  const gchar *id;
-
-  id = photos_filterable_get_id (PHOTOS_FILTERABLE (object));
-  old_object = photos_base_manager_get_object_by_id (self, id);
-  if (old_object != NULL)
-    return;
-
-  g_hash_table_insert (self->priv->objects, g_strdup (id), g_object_ref (object));
-  g_signal_emit (self, signals[OBJECT_ADDED], 0, object);
+  PHOTOS_BASE_MANAGER_GET_CLASS (self)->add_object (self, object);
 }
 
 
@@ -418,16 +443,7 @@ photos_base_manager_remove_object (PhotosBaseManager *self, GObject *object)
 void
 photos_base_manager_remove_object_by_id (PhotosBaseManager *self, const gchar *id)
 {
-  GObject *object;
-
-  object = photos_base_manager_get_object_by_id (self, id);
-  if (object == NULL)
-    return;
-
-  g_object_ref (object);
-  g_hash_table_remove (self->priv->objects, id);
-  g_signal_emit (self, signals[OBJECT_REMOVED], 0, object);
-  g_object_unref (object);
+  PHOTOS_BASE_MANAGER_GET_CLASS (self)->remove_object_by_id (self, id);
 }
 
 
diff --git a/src/photos-base-manager.h b/src/photos-base-manager.h
index 21b696d..1a28cb2 100644
--- a/src/photos-base-manager.h
+++ b/src/photos-base-manager.h
@@ -66,8 +66,10 @@ struct _PhotosBaseManagerClass
   GObjectClass parent_class;
 
   /* virtual methods */
+  void (*add_object)      (PhotosBaseManager *self, GObject *object);
   gchar *(*get_filter)    (PhotosBaseManager *self, gint flags);
   gchar *(*get_where)    (PhotosBaseManager *self, gint flags);
+  void (*remove_object_by_id) (PhotosBaseManager *self, const gchar *id);
   gboolean (*set_active_object)    (PhotosBaseManager *self, GObject *object);
 
   /* signals */
diff --git a/src/photos-collection-icon-watcher.c b/src/photos-collection-icon-watcher.c
index d13e778..a9f358f 100644
--- a/src/photos-collection-icon-watcher.c
+++ b/src/photos-collection-icon-watcher.c
@@ -406,12 +406,17 @@ static void
 photos_collection_icon_watcher_init (PhotosCollectionIconWatcher *self)
 {
   PhotosCollectionIconWatcherPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_collection_icon_watcher_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->item_connections = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref);
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
   priv->queue = photos_tracker_queue_dup_singleton (NULL, NULL);
 }
 
diff --git a/src/photos-delete-notification.c b/src/photos-delete-notification.c
index e10d9a8..f79f5ba 100644
--- a/src/photos-delete-notification.c
+++ b/src/photos-delete-notification.c
@@ -23,10 +23,11 @@
 #include <glib/gi18n.h>
 
 #include "photos-base-item.h"
+#include "photos-base-manager.h"
 #include "photos-delete-notification.h"
 #include "photos-icons.h"
 #include "photos-notification-manager.h"
-#include "photos-item-manager.h"
+#include "photos-search-context.h"
 
 
 struct _PhotosDeleteNotificationPrivate
@@ -212,12 +213,17 @@ static void
 photos_delete_notification_init (PhotosDeleteNotification *self)
 {
   PhotosDeleteNotificationPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_delete_notification_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->ntfctn_mngr = g_object_ref_sink (photos_notification_manager_dup_singleton ());
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
 }
 
 
diff --git a/src/photos-dlna-renderers-dialog.c b/src/photos-dlna-renderers-dialog.c
index d1f077c..767332c 100644
--- a/src/photos-dlna-renderers-dialog.c
+++ b/src/photos-dlna-renderers-dialog.c
@@ -27,15 +27,16 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 
+#include "photos-base-manager.h"
 #include "photos-dleyna-renderer-device.h"
 #include "photos-dleyna-renderer-push-host.h"
 #include "photos-dlna-renderer.h"
 #include "photos-dlna-renderers-manager.h"
 #include "photos-icons.h"
-#include "photos-item-manager.h"
 #include "photos-local-item.h"
 #include "photos-mode-controller.h"
 #include "photos-remote-display-manager.h"
+#include "photos-search-context.h"
 
 
 struct _PhotosDlnaRenderersDialogPrivate
@@ -219,12 +220,17 @@ static void
 photos_dlna_renderers_dialog_init (PhotosDlnaRenderersDialog *self)
 {
   PhotosDlnaRenderersDialogPrivate *priv;
+  GApplication *app;
   GList *renderers;
+  PhotosSearchContextState *state;
 
   self->priv = photos_dlna_renderers_dialog_get_instance_private (self);
   priv = self->priv;
 
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  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->renderers_mngr = photos_dlna_renderers_manager_dup_singleton ();
   priv->remote_mngr = photos_remote_display_manager_dup_singleton ();
   priv->mode_cntrlr = photos_mode_controller_dup_singleton ();
diff --git a/src/photos-embed.c b/src/photos-embed.c
index d74452b..27e138b 100644
--- a/src/photos-embed.c
+++ b/src/photos-embed.c
@@ -32,7 +32,6 @@
 #include <gio/gio.h>
 #include <glib/gi18n.h>
 
-#include "photos-collection-manager.h"
 #include "photos-embed.h"
 #include "photos-filterable.h"
 #include "photos-item-manager.h"
@@ -77,7 +76,6 @@ struct _PhotosEmbedPrivate
   GtkWidget *stack;
   GtkWidget *stack_overlay;
   GtkWidget *toolbar;
-  PhotosBaseManager *col_mngr;
   PhotosBaseManager *item_mngr;
   PhotosBaseManager *src_mngr;
   PhotosBaseManager *srch_mngr;
@@ -331,8 +329,8 @@ photos_embed_active_changed (PhotosBaseManager *manager, GObject *object, gpoint
 {
   PhotosEmbed *self = PHOTOS_EMBED (user_data);
   PhotosEmbedPrivate *priv = self->priv;
+  PhotosBaseItem *active_collection;
   PhotosWindowMode mode;
-  GObject *active_collection;
   GObject *active_item;
   GVariant *state;
   gboolean show_search;
@@ -341,7 +339,7 @@ photos_embed_active_changed (PhotosBaseManager *manager, GObject *object, gpoint
    * preview or collection viewin. Restore it when we are back.
    */
 
-  active_collection = photos_base_manager_get_active_object (priv->col_mngr);
+  active_collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
   active_item = photos_base_manager_get_active_object (priv->item_mngr);
   mode = photos_mode_controller_get_window_mode (priv->mode_cntrlr);
   show_search = (mode == PHOTOS_WINDOW_MODE_PREVIEW && active_item == NULL && active_collection == NULL)
@@ -650,7 +648,6 @@ photos_embed_dispose (GObject *object)
 
   g_clear_object (&priv->ntfctn_mngr);
   g_clear_object (&priv->loader_cancellable);
-  g_clear_object (&priv->col_mngr);
   g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->src_mngr);
   g_clear_object (&priv->srch_mngr);
@@ -775,10 +772,7 @@ photos_embed_init (PhotosEmbed *self)
                             G_CALLBACK (photos_embed_query_status_changed),
                             self);
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
-  g_signal_connect (priv->col_mngr, "active-changed", G_CALLBACK (photos_embed_active_changed), self);
-
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
   g_signal_connect (priv->item_mngr, "active-changed", G_CALLBACK (photos_embed_active_changed), self);
 
   priv->src_mngr = g_object_ref (state->src_mngr);
diff --git a/src/photos-fetch-collection-state-job.c b/src/photos-fetch-collection-state-job.c
index a4d98e4..bb6270a 100644
--- a/src/photos-fetch-collection-state-job.c
+++ b/src/photos-fetch-collection-state-job.c
@@ -41,7 +41,6 @@
 struct _PhotosFetchCollectionStateJobPrivate
 {
   GHashTable *collections_for_items;
-  PhotosBaseManager *col_mngr;
   PhotosBaseManager *item_mngr;
   PhotosSelectionController *sel_cntrlr;
   PhotosFetchCollectionStateJobCallback callback;
@@ -94,7 +93,7 @@ photos_fetch_collection_state_job_emit_callback (PhotosFetchCollectionStateJob *
   const gchar *coll_idx;
 
   collection_state = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
-  collections = photos_base_manager_get_objects (priv->col_mngr);
+  collections = photos_item_manager_get_collections (PHOTOS_ITEM_MANAGER (priv->item_mngr));
 
   /* For all the registered collections… */
   g_hash_table_iter_init (&iter1, collections);
@@ -196,7 +195,6 @@ photos_fetch_collection_state_job_dispose (GObject *object)
   PhotosFetchCollectionStateJob *self = PHOTOS_FETCH_COLLECTION_STATE_JOB (object);
   PhotosFetchCollectionStateJobPrivate *priv = self->priv;
 
-  g_clear_object (&priv->col_mngr);
   g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->sel_cntrlr);
 
@@ -233,8 +231,7 @@ photos_fetch_collection_state_job_init (PhotosFetchCollectionStateJob *self)
                                                        g_free,
                                                        photos_fetch_collection_state_job_value_destroy_func);
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
   priv->sel_cntrlr = photos_selection_controller_dup_singleton ();
 }
 
diff --git a/src/photos-item-manager.c b/src/photos-item-manager.c
index 8615188..3e062a4 100644
--- a/src/photos-item-manager.c
+++ b/src/photos-item-manager.c
@@ -28,6 +28,7 @@
 #include <glib.h>
 #include <tracker-sparql.h>
 
+#include "photos-filterable.h"
 #include "photos-item-manager.h"
 #include "photos-local-item.h"
 #include "photos-query.h"
@@ -40,17 +41,57 @@
 
 struct _PhotosItemManagerPrivate
 {
+  GHashTable *collections;
   GIOExtensionPoint *extension_point;
   GQueue *collection_path;
-  PhotosBaseManager *col_mngr;
+  PhotosBaseItem *active_collection;
   PhotosTrackerChangeMonitor *monitor;
 };
 
+enum
+{
+  ACTIVE_COLLECTION_CHANGED,
+  LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
 
 G_DEFINE_TYPE_WITH_PRIVATE (PhotosItemManager, photos_item_manager, PHOTOS_TYPE_BASE_MANAGER);
 
 
 static void
+photos_item_manager_add_object (PhotosBaseManager *mngr, GObject *object)
+{
+  PhotosItemManager *self = PHOTOS_ITEM_MANAGER (mngr);
+  PhotosItemManagerPrivate *priv = self->priv;
+  PhotosBaseItem *item;
+  const gchar *id;
+  gpointer *old_collection;
+
+  g_return_if_fail (PHOTOS_IS_BASE_ITEM (object));
+
+  item = PHOTOS_BASE_ITEM (object);
+
+  if (!photos_base_item_is_collection (item))
+    goto end;
+
+  id = photos_filterable_get_id (PHOTOS_FILTERABLE (item));
+  if (id == NULL)
+    goto end;
+
+  old_collection = g_hash_table_lookup (priv->collections, id);
+  if (old_collection != NULL)
+    goto end;
+
+  g_hash_table_insert (priv->collections, g_strdup (id), g_object_ref (item));
+
+ end:
+  PHOTOS_BASE_MANAGER_CLASS (photos_item_manager_parent_class)->add_object (mngr, object);
+}
+
+
+static void
 photos_item_manager_item_created_executed (TrackerSparqlCursor *cursor, gpointer user_data)
 {
   PhotosItemManager *self = PHOTOS_ITEM_MANAGER (user_data);
@@ -89,7 +130,6 @@ static void
 photos_item_manager_changes_pending_foreach (gpointer key, gpointer value, gpointer user_data)
 {
   PhotosItemManager *self = PHOTOS_ITEM_MANAGER (user_data);
-  PhotosItemManagerPrivate *priv = self->priv;
   PhotosTrackerChangeEvent *change_event = (PhotosTrackerChangeEvent *) value;
   PhotosTrackerChangeEventType change_type;
   const gchar *change_urn;
@@ -117,8 +157,6 @@ photos_item_manager_changes_pending_foreach (gpointer key, gpointer value, gpoin
       if (object != NULL)
         {
           photos_base_item_destroy (PHOTOS_BASE_ITEM (object));
-          if (photos_base_item_is_collection (PHOTOS_BASE_ITEM (object)))
-            photos_base_manager_remove_object_by_id (priv->col_mngr, change_urn);
           photos_base_manager_remove_object_by_id (PHOTOS_BASE_MANAGER (self), change_urn);
         }
     }
@@ -139,64 +177,102 @@ photos_item_manager_collection_path_free_foreach (gpointer data, gpointer user_d
 }
 
 
+static gchar *
+photos_item_manager_get_where (PhotosBaseManager *mngr, gint flags)
+{
+  PhotosItemManager *self = PHOTOS_ITEM_MANAGER (mngr);
+  PhotosItemManagerPrivate *priv = self->priv;
+
+  if (priv->active_collection == NULL)
+    return g_strdup ("");
+
+  return photos_base_item_get_where (priv->active_collection);
+}
+
+
+static void
+photos_item_manager_remove_object_by_id (PhotosBaseManager *mngr, const gchar *id)
+{
+  PhotosItemManager *self = PHOTOS_ITEM_MANAGER (mngr);
+  PhotosItemManagerPrivate *priv = self->priv;
+  gpointer *collection;
+
+  if (id == NULL)
+    goto end;
+
+  collection = g_hash_table_lookup (priv->collections, id);
+  if (collection == NULL)
+    goto end;
+
+  g_hash_table_remove (priv->collections, id);
+
+ end:
+  PHOTOS_BASE_MANAGER_CLASS (photos_item_manager_parent_class)->remove_object_by_id (mngr, id);
+}
+
+
 static gboolean
 photos_item_manager_set_active_object (PhotosBaseManager *manager, GObject *object)
 {
   PhotosItemManager *self = PHOTOS_ITEM_MANAGER (manager);
   PhotosItemManagerPrivate *priv = self->priv;
+  GObject *active_item;
   GtkRecentManager *recent;
-  gboolean ret_val;
+  gboolean active_collection_changed = FALSE;
+  gboolean ret_val = FALSE;
   const gchar *uri;
 
   g_return_val_if_fail (PHOTOS_IS_BASE_ITEM (object) || object == NULL, FALSE);
 
-  ret_val = PHOTOS_BASE_MANAGER_CLASS (photos_item_manager_parent_class)->set_active_object (manager, 
object);
+  active_item = photos_base_manager_get_active_object (manager);
 
-  if (!ret_val)
-    goto out;
+  /* Passing NULL is a way to go back to the current collection or
+   * overview from the preview. However, you can't do that when you
+   * are looking at a collection.
+   */
+  if (object == NULL)
+    {
+      if (active_item != (GObject *) priv->active_collection)
+        object = (GObject *) priv->active_collection;
+      else
+        goto out;
+    }
 
+  /* This is when we are going back to the overview from the preview. */
   if (object == NULL)
-    goto out;
+    goto end;
 
   if (photos_base_item_is_collection (PHOTOS_BASE_ITEM (object)))
     {
-      GObject *collection;
-
-      collection = photos_base_manager_get_active_object (priv->col_mngr);
-      g_queue_push_head (priv->collection_path, (collection != NULL) ? g_object_ref (collection) : NULL);
-      photos_base_manager_set_active_object (priv->col_mngr, object);
-      goto out;
+      /* This is when we are going back to the collection from the
+       * preview.
+       */
+      if (object == (GObject *) priv->active_collection)
+        goto end;
+
+      g_queue_push_head (priv->collection_path,
+                         (priv->active_collection != NULL) ? g_object_ref (priv->active_collection) : NULL);
+
+      g_clear_object (&priv->active_collection);
+      priv->active_collection = g_object_ref (object);
+      active_collection_changed = TRUE;
+      goto end;
     }
 
   recent = gtk_recent_manager_get_default ();
   uri = photos_base_item_get_uri (PHOTOS_BASE_ITEM (object));
   gtk_recent_manager_add_item (recent, uri);
 
+ end:
+  ret_val = PHOTOS_BASE_MANAGER_CLASS (photos_item_manager_parent_class)->set_active_object (manager, 
object);
+  if (active_collection_changed)
+    g_signal_emit (self, signals[ACTIVE_COLLECTION_CHANGED], 0, priv->active_collection);
+
  out:
   return ret_val;
 }
 
 
-static GObject *
-photos_item_manager_constructor (GType                  type,
-                                 guint                  n_construct_params,
-                                 GObjectConstructParam *construct_params)
-{
-  static GObject *self = NULL;
-
-  if (self == NULL)
-    {
-      self = G_OBJECT_CLASS (photos_item_manager_parent_class)->constructor (type,
-                                                                             n_construct_params,
-                                                                             construct_params);
-      g_object_add_weak_pointer (self, (gpointer) &self);
-      return self;
-    }
-
-  return g_object_ref (self);
-}
-
-
 static void
 photos_item_manager_dispose (GObject *object)
 {
@@ -210,7 +286,8 @@ photos_item_manager_dispose (GObject *object)
       priv->collection_path = NULL;
     }
 
-  g_clear_object (&priv->col_mngr);
+  g_clear_pointer (&priv->collections, (GDestroyNotify) g_hash_table_unref);
+  g_clear_object (&priv->active_collection);
   g_clear_object (&priv->monitor);
 
   G_OBJECT_CLASS (photos_item_manager_parent_class)->dispose (object);
@@ -221,18 +298,13 @@ static void
 photos_item_manager_init (PhotosItemManager *self)
 {
   PhotosItemManagerPrivate *priv = self->priv;
-  GApplication *app;
-  PhotosSearchContextState *state;
 
   self->priv = photos_item_manager_get_instance_private (self);
   priv = self->priv;
 
-  app = g_application_get_default ();
-  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
-
+  priv->collections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
   priv->extension_point = g_io_extension_point_lookup (PHOTOS_BASE_ITEM_EXTENSION_POINT_NAME);
   priv->collection_path = g_queue_new ();
-  priv->col_mngr = g_object_ref (state->col_mngr);
 
   priv->monitor = photos_tracker_change_monitor_dup_singleton (NULL, NULL);
   if (G_LIKELY (priv->monitor != NULL))
@@ -249,14 +321,28 @@ photos_item_manager_class_init (PhotosItemManagerClass *class)
   GObjectClass *object_class = G_OBJECT_CLASS (class);
   PhotosBaseManagerClass *base_manager_class = PHOTOS_BASE_MANAGER_CLASS (class);
 
-  object_class->constructor = photos_item_manager_constructor;
   object_class->dispose = photos_item_manager_dispose;
+  base_manager_class->add_object = photos_item_manager_add_object;
+  base_manager_class->get_where = photos_item_manager_get_where;
   base_manager_class->set_active_object = photos_item_manager_set_active_object;
+  base_manager_class->remove_object_by_id = photos_item_manager_remove_object_by_id;
+
+  signals[ACTIVE_COLLECTION_CHANGED] = g_signal_new ("active-collection-changed",
+                                                     G_TYPE_FROM_CLASS (class),
+                                                     G_SIGNAL_RUN_LAST,
+                                                     G_STRUCT_OFFSET (PhotosItemManagerClass,
+                                                                      active_collection_changed),
+                                                     NULL, /*accumulator */
+                                                     NULL, /*accu_data */
+                                                     g_cclosure_marshal_VOID__OBJECT,
+                                                     G_TYPE_NONE,
+                                                     1,
+                                                     PHOTOS_TYPE_BASE_ITEM);
 }
 
 
 PhotosBaseManager *
-photos_item_manager_dup_singleton (void)
+photos_item_manager_new (void)
 {
   return g_object_new (PHOTOS_TYPE_ITEM_MANAGER, NULL);
 }
@@ -266,13 +352,21 @@ void
 photos_item_manager_activate_previous_collection (PhotosItemManager *self)
 {
   PhotosItemManagerPrivate *priv = self->priv;
-  GObject *collection;
+  gpointer *collection;
 
-  collection = G_OBJECT (g_queue_pop_head (priv->collection_path));
-  photos_base_manager_set_active_object (priv->col_mngr, collection);
+  collection = g_queue_pop_head (priv->collection_path);
+  g_assert (collection == NULL || PHOTOS_IS_BASE_ITEM (collection));
 
-  if (collection == NULL)
-    photos_base_manager_set_active_object (PHOTOS_BASE_MANAGER (self), NULL);
+  g_clear_object (&priv->active_collection);
+
+  if (collection != NULL)
+    g_object_ref (collection);
+  priv->active_collection = PHOTOS_BASE_ITEM (collection);
+
+  PHOTOS_BASE_MANAGER_CLASS (photos_item_manager_parent_class)
+    ->set_active_object (PHOTOS_BASE_MANAGER (self), (GObject *) collection);
+
+  g_signal_emit (self, signals[ACTIVE_COLLECTION_CHANGED], 0, priv->active_collection);
 
   g_clear_object (&collection);
 }
@@ -296,9 +390,6 @@ photos_item_manager_add_item (PhotosItemManager *self, TrackerSparqlCursor *curs
   item = photos_item_manager_create_item (self, cursor);
   photos_base_manager_add_object (PHOTOS_BASE_MANAGER (self), G_OBJECT (item));
 
-  if (photos_base_item_is_collection (item))
-    photos_base_manager_add_object (self->priv->col_mngr, G_OBJECT (item));
-
  out:
   g_clear_object (&item);
 }
@@ -351,3 +442,17 @@ photos_item_manager_create_item (PhotosItemManager *self, TrackerSparqlCursor *c
   g_free (identifier);
   return ret_val;
 }
+
+
+PhotosBaseItem *
+photos_item_manager_get_active_collection (PhotosItemManager *self)
+{
+  return self->priv->active_collection;
+}
+
+
+GHashTable *
+photos_item_manager_get_collections (PhotosItemManager *self)
+{
+  return self->priv->collections;
+}
diff --git a/src/photos-item-manager.h b/src/photos-item-manager.h
index e2d3e93..d176c51 100644
--- a/src/photos-item-manager.h
+++ b/src/photos-item-manager.h
@@ -68,11 +68,14 @@ struct _PhotosItemManager
 struct _PhotosItemManagerClass
 {
   PhotosBaseManagerClass parent_class;
+
+  /* signals */
+  void (*active_collection_changed) (PhotosItemManager *self, PhotosBaseItem *collection);
 };
 
 GType                     photos_item_manager_get_type           (void) G_GNUC_CONST;
 
-PhotosBaseManager        *photos_item_manager_dup_singleton      (void);
+PhotosBaseManager        *photos_item_manager_new                (void);
 
 void                      photos_item_manager_activate_previous_collection (PhotosItemManager *self);
 
@@ -82,6 +85,10 @@ void                      photos_item_manager_add_item           (PhotosItemMana
 PhotosBaseItem           *photos_item_manager_create_item        (PhotosItemManager *self,
                                                                   TrackerSparqlCursor *cursor);
 
+PhotosBaseItem           *photos_item_manager_get_active_collection (PhotosItemManager *self);
+
+GHashTable               *photos_item_manager_get_collections       (PhotosItemManager *self);
+
 G_END_DECLS
 
 #endif /* PHOTOS_ITEM_MANAGER_H */
diff --git a/src/photos-main-toolbar.c b/src/photos-main-toolbar.c
index 71ab74c..edbbd5e 100644
--- a/src/photos-main-toolbar.c
+++ b/src/photos-main-toolbar.c
@@ -30,7 +30,6 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 
-#include "photos-collection-manager.h"
 #include "photos-dlna-renderers-manager.h"
 #include "photos-dropdown.h"
 #include "photos-header-bar.h"
@@ -56,7 +55,6 @@ struct _PhotosMainToolbarPrivate
   GtkWidget *selection_button;
   GtkWidget *selection_menu;
   GtkWidget *toolbar;
-  PhotosBaseManager *col_mngr;
   PhotosBaseManager *item_mngr;
   PhotosModeController *mode_cntrlr;
   PhotosRemoteDisplayManager *remote_mngr;
@@ -80,12 +78,12 @@ static void
 photos_main_toolbar_set_toolbar_title (PhotosMainToolbar *self)
 {
   PhotosMainToolbarPrivate *priv = self->priv;
-  GObject *active_collection;
+  PhotosBaseItem *active_collection;
   PhotosWindowMode window_mode;
   gboolean selection_mode;
   gchar *primary = NULL;
 
-  active_collection = photos_base_manager_get_active_object (priv->col_mngr);
+  active_collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
   selection_mode = photos_selection_controller_get_selection_mode (priv->sel_cntrlr);
   window_mode = photos_mode_controller_get_window_mode (priv->mode_cntrlr);
 
@@ -97,7 +95,7 @@ photos_main_toolbar_set_toolbar_title (PhotosMainToolbar *self)
       if (!selection_mode)
         {
           if (active_collection != NULL)
-            primary = g_markup_printf_escaped ("%s", photos_base_item_get_name (PHOTOS_BASE_ITEM 
(active_collection)));
+            primary = g_markup_printf_escaped ("%s", photos_base_item_get_name (active_collection));
         }
       else
         {
@@ -115,7 +113,7 @@ photos_main_toolbar_set_toolbar_title (PhotosMainToolbar *self)
           if (active_collection != NULL)
             {
               primary =  g_markup_printf_escaped ("<b>%s</b> (%s)",
-                                                  photos_base_item_get_name (PHOTOS_BASE_ITEM 
(active_collection)),
+                                                  photos_base_item_get_name (active_collection),
                                                   label);
             }
           else
@@ -175,12 +173,12 @@ photos_main_toolbar_coll_back_button_clicked (PhotosMainToolbar *self)
 
 
 static void
-photos_main_toolbar_col_active_changed (PhotosMainToolbar *self, GObject *object)
+photos_main_toolbar_col_active_changed (PhotosMainToolbar *self, PhotosBaseItem *collection)
 {
   PhotosMainToolbarPrivate *priv = self->priv;
   PhotosHeaderBarMode mode;
 
-  if (object != NULL)
+  if (collection != NULL)
     {
       mode = PHOTOS_HEADER_BAR_MODE_STANDALONE;
       if (priv->coll_back_button == NULL)
@@ -309,8 +307,8 @@ photos_main_toolbar_add_selection_button (PhotosMainToolbar *self)
                             G_CALLBACK (photos_main_toolbar_select_button_clicked),
                             self);
 
-  g_signal_connect_object (priv->col_mngr,
-                           "active-changed",
+  g_signal_connect_object (priv->item_mngr,
+                           "active-collection-changed",
                            G_CALLBACK (photos_main_toolbar_col_active_changed),
                            self,
                            G_CONNECT_SWAPPED);
@@ -363,11 +361,11 @@ photos_main_toolbar_clear_state_data (PhotosMainToolbar *self)
       g_variant_unref (state);
     }
 
-  if (priv->col_mngr != NULL)
-    g_signal_handlers_disconnect_by_func (priv->col_mngr, photos_main_toolbar_col_active_changed, self);
-
   if (priv->item_mngr != NULL)
-    g_signal_handlers_disconnect_by_func (priv->item_mngr, photos_main_toolbar_item_active_changed, self);
+    {
+      g_signal_handlers_disconnect_by_func (priv->item_mngr, photos_main_toolbar_col_active_changed, self);
+      g_signal_handlers_disconnect_by_func (priv->item_mngr, photos_main_toolbar_item_active_changed, self);
+    }
 
   if (priv->sel_cntrlr != NULL)
     g_signal_handlers_disconnect_by_func (priv->sel_cntrlr, photos_main_toolbar_set_toolbar_title, self);
@@ -490,7 +488,7 @@ static void
 photos_main_toolbar_populate_for_collections (PhotosMainToolbar *self)
 {
   PhotosMainToolbarPrivate *priv = self->priv;
-  GObject *object;
+  PhotosBaseItem *collection;
 
   gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (priv->toolbar), TRUE);
   photos_header_bar_set_mode (PHOTOS_HEADER_BAR (priv->toolbar), PHOTOS_HEADER_BAR_MODE_NORMAL);
@@ -500,8 +498,8 @@ photos_main_toolbar_populate_for_collections (PhotosMainToolbar *self)
   if (gtk_widget_get_parent (priv->searchbar) == NULL)
     gtk_container_add (GTK_CONTAINER (self), priv->searchbar);
 
-  object = photos_base_manager_get_active_object (priv->col_mngr);
-  photos_main_toolbar_col_active_changed (self, object);
+  collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
+  photos_main_toolbar_col_active_changed (self, collection);
 }
 
 
@@ -527,7 +525,7 @@ static void
 photos_main_toolbar_populate_for_favorites (PhotosMainToolbar *self)
 {
   PhotosMainToolbarPrivate *priv = self->priv;
-  GObject *object;
+  PhotosBaseItem *collection;
 
   gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (priv->toolbar), TRUE);
   photos_header_bar_set_mode (PHOTOS_HEADER_BAR (priv->toolbar), PHOTOS_HEADER_BAR_MODE_NORMAL);
@@ -537,8 +535,8 @@ photos_main_toolbar_populate_for_favorites (PhotosMainToolbar *self)
   if (gtk_widget_get_parent (priv->searchbar) == NULL)
     gtk_container_add (GTK_CONTAINER (self), priv->searchbar);
 
-  object = photos_base_manager_get_active_object (priv->col_mngr);
-  photos_main_toolbar_col_active_changed (self, object);
+  collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
+  photos_main_toolbar_col_active_changed (self, collection);
 }
 
 
@@ -546,7 +544,7 @@ static void
 photos_main_toolbar_populate_for_overview (PhotosMainToolbar *self)
 {
   PhotosMainToolbarPrivate *priv = self->priv;
-  GObject *object;
+  PhotosBaseItem *collection;
 
   gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (priv->toolbar), TRUE);
   photos_header_bar_set_mode (PHOTOS_HEADER_BAR (priv->toolbar), PHOTOS_HEADER_BAR_MODE_NORMAL);
@@ -556,8 +554,8 @@ photos_main_toolbar_populate_for_overview (PhotosMainToolbar *self)
   if (gtk_widget_get_parent (priv->searchbar) == NULL)
     gtk_container_add (GTK_CONTAINER (self), priv->searchbar);
 
-  object = photos_base_manager_get_active_object (priv->col_mngr);
-  photos_main_toolbar_col_active_changed (self, object);
+  collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
+  photos_main_toolbar_col_active_changed (self, collection);
 }
 
 
@@ -623,7 +621,7 @@ static void
 photos_main_toolbar_populate_for_search (PhotosMainToolbar *self)
 {
   PhotosMainToolbarPrivate *priv = self->priv;
-  GObject *object;
+  PhotosBaseItem *collection;
 
   gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (priv->toolbar), TRUE);
   photos_header_bar_set_mode (PHOTOS_HEADER_BAR (priv->toolbar), PHOTOS_HEADER_BAR_MODE_NORMAL);
@@ -633,8 +631,8 @@ photos_main_toolbar_populate_for_search (PhotosMainToolbar *self)
   if (gtk_widget_get_parent (priv->searchbar) == NULL)
     gtk_container_add (GTK_CONTAINER (self), priv->searchbar);
 
-  object = photos_base_manager_get_active_object (priv->col_mngr);
-  photos_main_toolbar_col_active_changed (self, object);
+  collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
+  photos_main_toolbar_col_active_changed (self, collection);
 }
 
 
@@ -690,7 +688,6 @@ photos_main_toolbar_dispose (GObject *object)
   photos_main_toolbar_clear_state_data (self);
 
   g_clear_object (&priv->searchbar);
-  g_clear_object (&priv->col_mngr);
   g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->mode_cntrlr);
   g_clear_object (&priv->remote_mngr);
@@ -776,8 +773,7 @@ photos_main_toolbar_init (PhotosMainToolbar *self)
 
   photos_header_bar_set_selection_menu (PHOTOS_HEADER_BAR (priv->toolbar), GTK_BUTTON 
(priv->selection_menu));
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
 
   priv->mode_cntrlr = photos_mode_controller_dup_singleton ();
 
diff --git a/src/photos-main-window.c b/src/photos-main-window.c
index a2dfbf1..fcfb397 100644
--- a/src/photos-main-window.c
+++ b/src/photos-main-window.c
@@ -44,7 +44,6 @@ struct _PhotosMainWindowPrivate
 {
   GtkWidget *embed;
   GSettings *settings;
-  PhotosBaseManager *col_mngr;
   PhotosBaseManager *item_mngr;
   PhotosModeController *mode_cntrlr;
   PhotosSelectionController *sel_cntrlr;
@@ -154,12 +153,12 @@ static gboolean
 photos_main_window_go_back (PhotosMainWindow *self)
 {
   PhotosMainWindowPrivate *priv = self->priv;
+  PhotosBaseItem *active_collection;
   PhotosWindowMode mode;
-  GObject *active_collection;
   gboolean handled = TRUE;
 
   mode = photos_mode_controller_get_window_mode (priv->mode_cntrlr);
-  active_collection = photos_base_manager_get_active_object (priv->col_mngr);
+  active_collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
 
   switch (mode)
     {
@@ -363,7 +362,6 @@ photos_main_window_dispose (GObject *object)
   PhotosMainWindowPrivate *priv = self->priv;
 
   g_clear_object (&priv->settings);
-  g_clear_object (&priv->col_mngr);
   g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->mode_cntrlr);
   g_clear_object (&priv->sel_cntrlr);
@@ -414,8 +412,7 @@ photos_main_window_init (PhotosMainWindow *self)
   if (maximized)
     gtk_window_maximize (GTK_WINDOW (self));
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
 
   priv->mode_cntrlr = photos_mode_controller_dup_singleton ();
   g_signal_connect_swapped (priv->mode_cntrlr,
diff --git a/src/photos-offset-collections-controller.c b/src/photos-offset-collections-controller.c
index cc2af7a..69e63c3 100644
--- a/src/photos-offset-collections-controller.c
+++ b/src/photos-offset-collections-controller.c
@@ -27,7 +27,7 @@
 
 #include <gio/gio.h>
 
-#include "photos-base-manager.h"
+#include "photos-item-manager.h"
 #include "photos-query-builder.h"
 #include "photos-offset-collections-controller.h"
 #include "photos-search-context.h"
@@ -35,7 +35,7 @@
 
 struct _PhotosOffsetCollectionsControllerPrivate
 {
-  PhotosBaseManager *col_mngr;
+  PhotosBaseManager *item_mngr;
 };
 
 
@@ -49,11 +49,11 @@ photos_offset_collections_controller_get_query (PhotosOffsetController *offset_c
 {
   PhotosOffsetCollectionsController *self = PHOTOS_OFFSET_COLLECTIONS_CONTROLLER (offset_cntrlr);
   GApplication *app;
-  GObject *collection;
+  PhotosBaseItem *collection;
   PhotosSearchContextState *state;
   gint flags;
 
-  collection = photos_base_manager_get_active_object (self->priv->col_mngr);
+  collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (self->priv->item_mngr));
   if (collection != NULL)
     flags = PHOTOS_QUERY_FLAGS_NONE;
   else
@@ -91,7 +91,7 @@ photos_offset_collections_controller_dispose (GObject *object)
 {
   PhotosOffsetCollectionsController *self = PHOTOS_OFFSET_COLLECTIONS_CONTROLLER (object);
 
-  g_clear_object (&self->priv->col_mngr);
+  g_clear_object (&self->priv->item_mngr);
 
   G_OBJECT_CLASS (photos_offset_collections_controller_parent_class)->dispose (object);
 }
@@ -110,7 +110,7 @@ photos_offset_collections_controller_init (PhotosOffsetCollectionsController *se
   app = g_application_get_default ();
   state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
+  priv->item_mngr = g_object_ref (state->item_mngr);
 }
 
 
diff --git a/src/photos-offset-favorites-controller.c b/src/photos-offset-favorites-controller.c
index d1a097e..fd8539f 100644
--- a/src/photos-offset-favorites-controller.c
+++ b/src/photos-offset-favorites-controller.c
@@ -27,7 +27,7 @@
 
 #include <gio/gio.h>
 
-#include "photos-base-manager.h"
+#include "photos-item-manager.h"
 #include "photos-query-builder.h"
 #include "photos-offset-favorites-controller.h"
 #include "photos-search-context.h"
@@ -35,7 +35,7 @@
 
 struct _PhotosOffsetFavoritesControllerPrivate
 {
-  PhotosBaseManager *col_mngr;
+  PhotosBaseManager *item_mngr;
 };
 
 
@@ -49,11 +49,11 @@ photos_offset_favorites_controller_get_query (PhotosOffsetController *offset_cnt
 {
   PhotosOffsetFavoritesController *self = PHOTOS_OFFSET_FAVORITES_CONTROLLER (offset_cntrlr);
   GApplication *app;
-  GObject *collection;
+  PhotosBaseItem *collection;
   PhotosSearchContextState *state;
   gint flags;
 
-  collection = photos_base_manager_get_active_object (self->priv->col_mngr);
+  collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (self->priv->item_mngr));
   if (collection != NULL)
     flags = PHOTOS_QUERY_FLAGS_NONE;
   else
@@ -91,7 +91,7 @@ photos_offset_favorites_controller_dispose (GObject *object)
 {
   PhotosOffsetFavoritesController *self = PHOTOS_OFFSET_FAVORITES_CONTROLLER (object);
 
-  g_clear_object (&self->priv->col_mngr);
+  g_clear_object (&self->priv->item_mngr);
 
   G_OBJECT_CLASS (photos_offset_favorites_controller_parent_class)->dispose (object);
 }
@@ -110,7 +110,7 @@ photos_offset_favorites_controller_init (PhotosOffsetFavoritesController *self)
   app = g_application_get_default ();
   state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
+  priv->item_mngr = g_object_ref (state->item_mngr);
 }
 
 
diff --git a/src/photos-organize-collection-model.c b/src/photos-organize-collection-model.c
index dcb9533..1cfeb04 100644
--- a/src/photos-organize-collection-model.c
+++ b/src/photos-organize-collection-model.c
@@ -212,7 +212,7 @@ photos_organize_collection_model_init (PhotosOrganizeCollectionModel *self)
 
   gtk_list_store_set_column_types (GTK_LIST_STORE (self), sizeof (columns) / sizeof (columns[0]), columns);
 
-  priv->manager = g_object_ref (state->col_mngr);
+  priv->manager = g_object_ref (state->item_mngr);
 
   g_signal_connect_object (priv->manager,
                            "object-added",
diff --git a/src/photos-overview-searchbar.c b/src/photos-overview-searchbar.c
index 61b3dc1..a9c915e 100644
--- a/src/photos-overview-searchbar.c
+++ b/src/photos-overview-searchbar.c
@@ -47,7 +47,7 @@ struct _PhotosOverviewSearchbarPrivate
   GtkWidget *dropdown;
   GtkWidget *dropdown_button;
   GtkWidget *search_container;
-  PhotosBaseManager *col_mngr;
+  PhotosBaseManager *item_mngr;
   PhotosBaseManager *src_mngr;
   PhotosBaseManager *srch_mtch_mngr;
   PhotosBaseManager *srch_typ_mngr;
@@ -315,7 +315,7 @@ photos_overview_searchbar_dispose (GObject *object)
   PhotosOverviewSearchbar *self = PHOTOS_OVERVIEW_SEARCHBAR (object);
   PhotosOverviewSearchbarPrivate *priv = self->priv;
 
-  g_clear_object (&priv->col_mngr);
+  g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->src_mngr);
   g_clear_object (&priv->srch_mtch_mngr);
   g_clear_object (&priv->srch_typ_mngr);
@@ -379,9 +379,9 @@ photos_overview_searchbar_init (PhotosOverviewSearchbar *self)
                            self,
                            G_CONNECT_SWAPPED);
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
-  g_signal_connect_object (priv->col_mngr,
-                           "active-changed",
+  priv->item_mngr = g_object_ref (state->item_mngr);
+  g_signal_connect_object (priv->item_mngr,
+                           "active-collection-changed",
                            G_CALLBACK (photos_overview_searchbar_collection_active_changed),
                            self,
                            G_CONNECT_SWAPPED);
diff --git a/src/photos-preview-model.c b/src/photos-preview-model.c
index bd5ffa0..aedfe60 100644
--- a/src/photos-preview-model.c
+++ b/src/photos-preview-model.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -24,9 +24,10 @@
 #include <glib.h>
 
 #include "photos-base-item.h"
-#include "photos-item-manager.h"
+#include "photos-base-manager.h"
 #include "photos-preview-model.h"
 #include "photos-query.h"
+#include "photos-search-context.h"
 #include "photos-view-model.h"
 
 
@@ -80,11 +81,16 @@ static void
 photos_preview_model_init (PhotosPreviewModel *self)
 {
   PhotosPreviewModelPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_preview_model_get_instance_private (self);
   priv = self->priv;
 
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->item_mngr = g_object_ref (state->item_mngr);
   gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (self), photos_preview_model_visible, self, 
NULL);
 }
 
diff --git a/src/photos-preview-nav-buttons.c b/src/photos-preview-nav-buttons.c
index 1fc9307..e10b9d7 100644
--- a/src/photos-preview-nav-buttons.c
+++ b/src/photos-preview-nav-buttons.c
@@ -28,11 +28,12 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 
+#include "photos-base-manager.h"
 #include "photos-enums.h"
 #include "photos-icons.h"
-#include "photos-item-manager.h"
 #include "photos-preview-model.h"
 #include "photos-preview-nav-buttons.h"
+#include "photos-search-context.h"
 #include "photos-view-model.h"
 
 
@@ -435,11 +436,16 @@ static void
 photos_preview_nav_buttons_init (PhotosPreviewNavButtons *self)
 {
   PhotosPreviewNavButtonsPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_preview_nav_buttons_get_instance_private (self);
   priv = self->priv;
 
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  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->action = PHOTOS_PREVIEW_ACTION_NONE;
 
diff --git a/src/photos-properties-dialog.c b/src/photos-properties-dialog.c
index dd298f0..3b3854c 100644
--- a/src/photos-properties-dialog.c
+++ b/src/photos-properties-dialog.c
@@ -29,10 +29,11 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 
+#include "photos-base-manager.h"
 #include "photos-camera-cache.h"
-#include "photos-item-manager.h"
 #include "photos-local-item.h"
 #include "photos-properties-dialog.h"
+#include "photos-search-context.h"
 #include "photos-utils.h"
 
 
@@ -553,12 +554,17 @@ static void
 photos_properties_dialog_init (PhotosPropertiesDialog *self)
 {
   PhotosPropertiesDialogPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_properties_dialog_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->cancellable = g_cancellable_new ();
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
   priv->camera_cache = photos_camera_cache_dup_singleton ();
 }
 
diff --git a/src/photos-query-builder.c b/src/photos-query-builder.c
index f1bd1b6..6bce288 100644
--- a/src/photos-query-builder.c
+++ b/src/photos-query-builder.c
@@ -27,7 +27,7 @@
 
 #include <gio/gio.h>
 
-#include "photos-collection-manager.h"
+#include "photos-base-manager.h"
 #include "photos-query-builder.h"
 #include "photos-search-type.h"
 #include "photos-source-manager.h"
@@ -92,7 +92,7 @@ photos_query_builder_optional (void)
 static gchar *
 photos_query_builder_inner_where (PhotosSearchContextState *state, gboolean global, gint flags)
 {
-  gchar *col_mngr_where = NULL;
+  gchar *item_mngr_where = NULL;
   gchar *sparql;
   gchar *srch_typ_mngr_where = NULL;
 
@@ -104,15 +104,15 @@ photos_query_builder_inner_where (PhotosSearchContextState *state, gboolean glob
         {
           /* TODO: SearchCategoryManager */
 
-          col_mngr_where = photos_base_manager_get_where (state->col_mngr, flags);
+          item_mngr_where = photos_base_manager_get_where (state->item_mngr, flags);
         }
     }
 
   sparql = g_strdup_printf ("WHERE { %s %s }",
                             srch_typ_mngr_where,
-                            (col_mngr_where != NULL) ? col_mngr_where : "");
+                            (item_mngr_where != NULL) ? item_mngr_where : "");
 
-  g_free (col_mngr_where);
+  g_free (item_mngr_where);
   g_free (srch_typ_mngr_where);
 
   return sparql;
diff --git a/src/photos-search-context.c b/src/photos-search-context.c
index b6b5214..864227d 100644
--- a/src/photos-search-context.c
+++ b/src/photos-search-context.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -27,7 +27,7 @@
 
 #include <glib.h>
 
-#include "photos-collection-manager.h"
+#include "photos-item-manager.h"
 #include "photos-search-context.h"
 #include "photos-search-controller.h"
 #include "photos-search-match-manager.h"
@@ -50,7 +50,7 @@ photos_search_context_state_new (PhotosSearchContext *self)
   PhotosSearchContextState *state;
 
   state = g_slice_new0 (PhotosSearchContextState);
-  state->col_mngr = photos_collection_manager_new ();
+  state->item_mngr = photos_item_manager_new ();
   state->src_mngr = photos_source_manager_new ();
   state->srch_cntrlr = photos_search_controller_new ();
   state->srch_mtch_mngr = photos_search_match_manager_new (state->srch_cntrlr);
@@ -63,7 +63,7 @@ photos_search_context_state_new (PhotosSearchContext *self)
 void
 photos_search_context_state_free (PhotosSearchContextState *state)
 {
-  g_object_unref (state->col_mngr);
+  g_object_unref (state->item_mngr);
   g_object_unref (state->src_mngr);
   g_object_unref (state->srch_mtch_mngr);
   g_object_unref (state->srch_typ_mngr);
diff --git a/src/photos-search-context.h b/src/photos-search-context.h
index 95303c1..7b6e4fa 100644
--- a/src/photos-search-context.h
+++ b/src/photos-search-context.h
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -50,7 +50,7 @@ typedef struct _PhotosSearchContextInterface PhotosSearchContextInterface;
 
 struct _PhotosSearchContextState
 {
-  gpointer col_mngr;
+  gpointer item_mngr;
   gpointer src_mngr;
   gpointer srch_mtch_mngr;
   gpointer srch_typ_mngr;
diff --git a/src/photos-selection-controller.c b/src/photos-selection-controller.c
index 6fd9f82..5864aa3 100644
--- a/src/photos-selection-controller.c
+++ b/src/photos-selection-controller.c
@@ -25,10 +25,12 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
 #include <glib.h>
 
+#include "photos-base-manager.h"
 #include "photos-filterable.h"
-#include "photos-item-manager.h"
+#include "photos-search-context.h"
 #include "photos-selection-controller.h"
 
 
@@ -125,11 +127,16 @@ static void
 photos_selection_controller_init (PhotosSelectionController *self)
 {
   PhotosSelectionControllerPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_selection_controller_get_instance_private (self);
   priv = self->priv;
 
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->item_mngr = g_object_ref (state->item_mngr);
   g_signal_connect (priv->item_mngr,
                     "object-removed",
                     G_CALLBACK (photos_selection_controller_object_removed),
diff --git a/src/photos-selection-toolbar.c b/src/photos-selection-toolbar.c
index daea869..4bdb277 100644
--- a/src/photos-selection-toolbar.c
+++ b/src/photos-selection-toolbar.c
@@ -30,11 +30,12 @@
 #include <glib/gi18n.h>
 
 #include "photos-base-item.h"
+#include "photos-base-manager.h"
 #include "photos-delete-notification.h"
 #include "photos-icons.h"
-#include "photos-item-manager.h"
 #include "photos-organize-collection-dialog.h"
 #include "photos-properties-dialog.h"
+#include "photos-search-context.h"
 #include "photos-selection-controller.h"
 #include "photos-selection-toolbar.h"
 #include "photos-utils.h"
@@ -428,12 +429,17 @@ static void
 photos_selection_toolbar_init (PhotosSelectionToolbar *self)
 {
   PhotosSelectionToolbarPrivate *priv;
+  GApplication *app;
   GtkWidget *image;
   GtkWidget *toolbar;
+  PhotosSearchContextState *state;
 
   self->priv = photos_selection_toolbar_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->item_listeners = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref);
 
   toolbar = gtk_action_bar_new ();
@@ -485,7 +491,7 @@ photos_selection_toolbar_init (PhotosSelectionToolbar *self)
 
   gtk_widget_show_all (GTK_WIDGET (self));
 
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
 
   priv->sel_cntrlr = photos_selection_controller_dup_singleton ();
   g_signal_connect (priv->sel_cntrlr,
diff --git a/src/photos-tracker-collections-controller.c b/src/photos-tracker-collections-controller.c
index 2776501..310a092 100644
--- a/src/photos-tracker-collections-controller.c
+++ b/src/photos-tracker-collections-controller.c
@@ -23,7 +23,7 @@
 
 #include <gio/gio.h>
 
-#include "photos-base-manager.h"
+#include "photos-item-manager.h"
 #include "photos-mode-controller.h"
 #include "photos-offset-collections-controller.h"
 #include "photos-query-builder.h"
@@ -33,7 +33,7 @@
 
 struct _PhotosTrackerCollectionsControllerPrivate
 {
-  PhotosBaseManager *col_mngr;
+  PhotosBaseManager *item_mngr;
   PhotosModeController *mode_cntrlr;
   PhotosOffsetController *offset_cntrlr;
 };
@@ -71,11 +71,11 @@ photos_tracker_collections_controller_get_query (PhotosTrackerController *trk_cn
   PhotosTrackerCollectionsController *self = PHOTOS_TRACKER_COLLECTIONS_CONTROLLER (trk_cntrlr);
   PhotosTrackerCollectionsControllerPrivate *priv = self->priv;
   GApplication *app;
-  GObject *collection;
+  PhotosBaseItem *collection;
   PhotosSearchContextState *state;
   gint flags;
 
-  collection = photos_base_manager_get_active_object (priv->col_mngr);
+  collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
   if (collection != NULL)
     flags = PHOTOS_QUERY_FLAGS_NONE;
   else
@@ -114,7 +114,7 @@ photos_tracker_collections_controller_dispose (GObject *object)
   PhotosTrackerCollectionsController *self = PHOTOS_TRACKER_COLLECTIONS_CONTROLLER (object);
   PhotosTrackerCollectionsControllerPrivate *priv = self->priv;
 
-  g_clear_object (&priv->col_mngr);
+  g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->mode_cntrlr);
   g_clear_object (&priv->offset_cntrlr);
 
@@ -135,9 +135,9 @@ photos_tracker_collections_controller_init (PhotosTrackerCollectionsController *
   app = g_application_get_default ();
   state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
-  g_signal_connect_swapped (priv->col_mngr,
-                            "active-changed",
+  priv->item_mngr = g_object_ref (state->item_mngr);
+  g_signal_connect_swapped (priv->item_mngr,
+                            "active-collection-changed",
                             G_CALLBACK (photos_tracker_collections_controller_col_active_changed),
                             self);
 
diff --git a/src/photos-tracker-controller.c b/src/photos-tracker-controller.c
index ced4a70..4952c8d 100644
--- a/src/photos-tracker-controller.c
+++ b/src/photos-tracker-controller.c
@@ -384,7 +384,7 @@ photos_tracker_controller_init (PhotosTrackerController *self)
   state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
 
   priv->cancellable = g_cancellable_new ();
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
 
   priv->src_mngr = g_object_ref (state->src_mngr);
   g_signal_connect_swapped (priv->src_mngr,
diff --git a/src/photos-tracker-favorites-controller.c b/src/photos-tracker-favorites-controller.c
index a3a86cc..3ec845f 100644
--- a/src/photos-tracker-favorites-controller.c
+++ b/src/photos-tracker-favorites-controller.c
@@ -23,7 +23,7 @@
 
 #include <gio/gio.h>
 
-#include "photos-base-manager.h"
+#include "photos-item-manager.h"
 #include "photos-mode-controller.h"
 #include "photos-offset-favorites-controller.h"
 #include "photos-query-builder.h"
@@ -33,7 +33,7 @@
 
 struct _PhotosTrackerFavoritesControllerPrivate
 {
-  PhotosBaseManager *col_mngr;
+  PhotosBaseManager *item_mngr;
   PhotosModeController *mode_cntrlr;
   PhotosOffsetController *offset_cntrlr;
 };
@@ -71,11 +71,11 @@ photos_tracker_favorites_controller_get_query (PhotosTrackerController *trk_cntr
   PhotosTrackerFavoritesController *self = PHOTOS_TRACKER_FAVORITES_CONTROLLER (trk_cntrlr);
   PhotosTrackerFavoritesControllerPrivate *priv = self->priv;
   GApplication *app;
-  GObject *collection;
+  PhotosBaseItem *collection;
   PhotosSearchContextState *state;
   gint flags;
 
-  collection = photos_base_manager_get_active_object (priv->col_mngr);
+  collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
   if (collection != NULL)
     flags = PHOTOS_QUERY_FLAGS_NONE;
   else
@@ -114,7 +114,7 @@ photos_tracker_favorites_controller_dispose (GObject *object)
   PhotosTrackerFavoritesController *self = PHOTOS_TRACKER_FAVORITES_CONTROLLER (object);
   PhotosTrackerFavoritesControllerPrivate *priv = self->priv;
 
-  g_clear_object (&priv->col_mngr);
+  g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->mode_cntrlr);
   g_clear_object (&priv->offset_cntrlr);
 
@@ -135,9 +135,9 @@ photos_tracker_favorites_controller_init (PhotosTrackerFavoritesController *self
   app = g_application_get_default ();
   state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
-  g_signal_connect_swapped (priv->col_mngr,
-                            "active-changed",
+  priv->item_mngr = g_object_ref (state->item_mngr);
+  g_signal_connect_swapped (priv->item_mngr,
+                            "active-collection-changed",
                             G_CALLBACK (photos_tracker_favorites_controller_col_active_changed),
                             self);
 
diff --git a/src/photos-tracker-search-controller.c b/src/photos-tracker-search-controller.c
index eaa4498..b248350 100644
--- a/src/photos-tracker-search-controller.c
+++ b/src/photos-tracker-search-controller.c
@@ -28,6 +28,7 @@
 #include <gio/gio.h>
 
 #include "photos-base-manager.h"
+#include "photos-item-manager.h"
 #include "photos-mode-controller.h"
 #include "photos-offset-search-controller.h"
 #include "photos-query-builder.h"
@@ -38,7 +39,7 @@
 
 struct _PhotosTrackerSearchControllerPrivate
 {
-  PhotosBaseManager *col_mngr;
+  PhotosBaseManager *item_mngr;
   PhotosBaseManager *src_mngr;
   PhotosBaseManager *srch_mtch_mngr;
   PhotosBaseManager *srch_typ_mngr;
@@ -127,7 +128,7 @@ photos_tracker_search_controller_dispose (GObject *object)
   PhotosTrackerSearchController *self = PHOTOS_TRACKER_SEARCH_CONTROLLER (object);
   PhotosTrackerSearchControllerPrivate *priv = self->priv;
 
-  g_clear_object (&priv->col_mngr);
+  g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->src_mngr);
   g_clear_object (&priv->srch_mtch_mngr);
   g_clear_object (&priv->srch_typ_mngr);
@@ -152,9 +153,9 @@ photos_tracker_search_controller_init (PhotosTrackerSearchController *self)
   app = g_application_get_default ();
   state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
-  g_signal_connect_swapped (priv->col_mngr,
-                            "active-changed",
+  priv->item_mngr = g_object_ref (state->item_mngr);
+  g_signal_connect_swapped (priv->item_mngr,
+                            "active-collection-changed",
                             G_CALLBACK (photos_tracker_search_controller_col_active_changed),
                             self);
 
diff --git a/src/photos-view-container.c b/src/photos-view-container.c
index ee5232a..186debb 100644
--- a/src/photos-view-container.c
+++ b/src/photos-view-container.c
@@ -36,6 +36,7 @@
 #include "photos-offset-overview-controller.h"
 #include "photos-offset-search-controller.h"
 #include "photos-remote-display-manager.h"
+#include "photos-search-context.h"
 #include "photos-selection-controller.h"
 #include "photos-tracker-collections-controller.h"
 #include "photos-tracker-favorites-controller.h"
@@ -288,11 +289,15 @@ photos_view_container_constructed (GObject *object)
   GApplication *app;
   GtkWidget *generic_view;
   GtkWidget *grid;
+  PhotosSearchContextState *state;
   gboolean status;
   gint size;
 
   G_OBJECT_CLASS (photos_view_container_parent_class)->constructed (object);
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   accessible = gtk_widget_get_accessible (GTK_WIDGET (self));
   if (accessible != NULL)
     atk_object_set_name (accessible, priv->name);
@@ -332,7 +337,7 @@ photos_view_container_constructed (GObject *object)
                     G_CALLBACK (photos_view_container_view_selection_changed),
                     self);
 
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
 
   priv->sel_cntrlr = photos_selection_controller_dup_singleton ();
   g_signal_connect (priv->sel_cntrlr,
@@ -378,8 +383,6 @@ photos_view_container_constructed (GObject *object)
       break;
     }
 
-  app = g_application_get_default ();
-
   action = g_action_map_lookup_action (G_ACTION_MAP (app), "select-all");
   g_signal_connect_swapped (action, "activate", G_CALLBACK (gd_main_view_select_all), priv->view);
 
diff --git a/src/photos-view-model.c b/src/photos-view-model.c
index e5ad665..a51f769 100644
--- a/src/photos-view-model.c
+++ b/src/photos-view-model.c
@@ -47,7 +47,6 @@
 
 struct _PhotosViewModelPrivate
 {
-  PhotosBaseManager *col_mngr;
   PhotosBaseManager *item_mngr;
   PhotosModeController *mode_cntrlr;
   PhotosOffsetController *offset_cntrlr;
@@ -237,12 +236,12 @@ photos_view_model_info_updated (PhotosBaseItem *item, gpointer user_data)
 {
   PhotosViewModel *self = PHOTOS_VIEW_MODEL (user_data);
   PhotosViewModelPrivate *priv = self->priv;
-  GObject *active_collection;
   GtkTreeIter iter;
   GtkTreePath *path;
   GtkTreeRowReference *row_ref;
+  PhotosBaseItem *active_collection;
 
-  active_collection = photos_base_manager_get_active_object (priv->col_mngr);
+  active_collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
   row_ref = (GtkTreeRowReference *) g_object_get_data (G_OBJECT (item), priv->row_ref_key);
 
   if (priv->mode == PHOTOS_WINDOW_MODE_COLLECTIONS)
@@ -294,8 +293,8 @@ photos_view_model_object_added (PhotosViewModel *self, GObject *object)
 {
   PhotosBaseItem *item = PHOTOS_BASE_ITEM (object);
   PhotosViewModelPrivate *priv = self->priv;
+  PhotosBaseItem *active_collection;
   PhotosWindowMode mode;
-  GObject *active_collection;
   GtkTreeRowReference *row_ref;
   gboolean is_collection;
   gboolean is_favorite;
@@ -304,7 +303,7 @@ photos_view_model_object_added (PhotosViewModel *self, GObject *object)
   if (row_ref != NULL)
     return;
 
-  active_collection = photos_base_manager_get_active_object (priv->col_mngr);
+  active_collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
   is_collection = photos_base_item_is_collection (item);
   is_favorite = photos_base_item_is_favorite (item);
   mode = photos_mode_controller_get_window_mode (priv->mode_cntrlr);
@@ -391,7 +390,6 @@ photos_view_model_dispose (GObject *object)
       priv->reset_count_id = 0;
     }
 
-  g_clear_object (&priv->col_mngr);
   g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->mode_cntrlr);
   g_clear_object (&priv->offset_cntrlr);
@@ -456,8 +454,7 @@ photos_view_model_init (PhotosViewModel *self)
   gtk_list_store_set_column_types (GTK_LIST_STORE (self), sizeof (columns) / sizeof (columns[0]), columns);
   gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (self), PHOTOS_VIEW_MODEL_MTIME, 
GTK_SORT_DESCENDING);
 
-  priv->col_mngr = g_object_ref (state->col_mngr);
-  priv->item_mngr = photos_item_manager_dup_singleton ();
+  priv->item_mngr = g_object_ref (state->item_mngr);
   priv->mode_cntrlr = photos_mode_controller_dup_singleton ();
 
   priv->oldest_mtime = G_MAXINT64;


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