[gnome-photos] Rename ItemModel to ViewModel, and move it to ViewContainer



commit b25922c0db9101f1643c77d738254a65427c8205
Author: Debarshi Ray <debarshir gnome org>
Date:   Tue Nov 13 00:51:08 2012 +0100

    Rename ItemModel to ViewModel, and move it to ViewContainer
    
    There is no need for ItemManager to own the GtkTreeModel. Have the
    view create it, and let it update automatically when the underlying
    manager changes. For this, add a 'clear' signal to the manager.
    
    Original patch from Cosimo Cecchi for gnome-documents.

 src/Makefile.am                                  |    4 +-
 src/photos-base-manager.c                        |   13 +++
 src/photos-base-manager.h                        |    1 +
 src/photos-item-manager.c                        |   21 ----
 src/photos-item-manager.h                        |    2 -
 src/photos-item-model.h                          |   92 ----------------
 src/photos-view-container.c                      |    6 +-
 src/{photos-item-model.c => photos-view-model.c} |  121 ++++++++++++++--------
 src/photos-view-model.h                          |   92 ++++++++++++++++
 9 files changed, 189 insertions(+), 163 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 443656a..71d95f9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -61,8 +61,6 @@ gnome_photos_SOURCES = \
 	photos-filterable.h \
 	photos-item-manager.c \
 	photos-item-manager.h \
-	photos-item-model.c \
-	photos-item-model.h \
 	photos-load-more-button.c \
 	photos-load-more-button.h \
 	photos-local-item.c \
@@ -115,6 +113,8 @@ gnome_photos_SOURCES = \
 	photos-utils.h \
 	photos-view-container.c \
 	photos-view-container.h \
+	photos-view-model.c \
+	photos-view-model.h \
 	photos-main.c \
 	$(NULL)
 
diff --git a/src/photos-base-manager.c b/src/photos-base-manager.c
index b2e33bd..07a0564 100644
--- a/src/photos-base-manager.c
+++ b/src/photos-base-manager.c
@@ -40,6 +40,7 @@ struct _PhotosBaseManagerPrivate
 enum
 {
   ACTIVE_CHANGED,
+  CLEAR,
   OBJECT_ADDED,
   OBJECT_REMOVED,
   LAST_SIGNAL
@@ -161,6 +162,17 @@ photos_base_manager_class_init (PhotosBaseManagerClass *class)
                                           1,
                                           G_TYPE_OBJECT);
 
+  signals[CLEAR] = g_signal_new ("clear",
+                                 G_TYPE_FROM_CLASS (class),
+                                 G_SIGNAL_RUN_LAST,
+                                 G_STRUCT_OFFSET (PhotosBaseManagerClass,
+                                                  clear),
+                                 NULL, /*accumulator */
+                                 NULL, /*accu_data */
+                                 g_cclosure_marshal_VOID__VOID,
+                                 G_TYPE_NONE,
+                                 0);
+
   signals[OBJECT_ADDED] = g_signal_new ("object-added",
                                         G_TYPE_FROM_CLASS (class),
                                         G_SIGNAL_RUN_LAST,
@@ -208,6 +220,7 @@ photos_base_manager_clear (PhotosBaseManager *self)
 
   g_hash_table_remove_all (priv->objects);
   g_clear_object (&priv->active_object);
+  g_signal_emit (self, signals[CLEAR], 0);
 }
 
 
diff --git a/src/photos-base-manager.h b/src/photos-base-manager.h
index 709c30b..d833929 100644
--- a/src/photos-base-manager.h
+++ b/src/photos-base-manager.h
@@ -70,6 +70,7 @@ struct _PhotosBaseManagerClass
 
   /* signals */
   void (*active_changed)   (PhotosBaseManager *self, GObject *object);
+  void (*clear)            (PhotosBaseManager *self);
   void (*object_added)     (PhotosBaseManager *self, GObject *object);
   void (*object_removed)   (PhotosBaseManager *self, GObject *object);
 };
diff --git a/src/photos-item-manager.c b/src/photos-item-manager.c
index 5610998..8a59503 100644
--- a/src/photos-item-manager.c
+++ b/src/photos-item-manager.c
@@ -28,7 +28,6 @@
 #include <glib.h>
 
 #include "photos-item-manager.h"
-#include "photos-item-model.h"
 #include "photos-local-item.h"
 #include "photos-query.h"
 #include "photos-single-item-job.h"
@@ -38,7 +37,6 @@
 
 struct _PhotosItemManagerPrivate
 {
-  GtkListStore *model;
   PhotosTrackerChangeMonitor *monitor;
 };
 
@@ -174,7 +172,6 @@ photos_item_manager_dispose (GObject *object)
   PhotosItemManager *self = PHOTOS_ITEM_MANAGER (object);
   PhotosItemManagerPrivate *priv = self->priv;
 
-  g_clear_object (&priv->model);
   g_clear_object (&priv->monitor);
 
   G_OBJECT_CLASS (photos_item_manager_parent_class)->dispose (object);
@@ -189,8 +186,6 @@ photos_item_manager_init (PhotosItemManager *self)
   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, PHOTOS_TYPE_ITEM_MANAGER, PhotosItemManagerPrivate);
   priv = self->priv;
 
-  priv->model = photos_item_model_new ();
-
   priv->monitor = photos_tracker_change_monitor_new ();
   g_signal_connect (priv->monitor, "changes-pending", G_CALLBACK (photos_item_manager_changes_pending), self);
 }
@@ -224,7 +219,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));
-  photos_item_model_item_added (PHOTOS_ITEM_MODEL (self->priv->model), item);
 
   /* TODO: add to collection_manager */
 
@@ -232,23 +226,8 @@ photos_item_manager_add_item (PhotosItemManager *self, TrackerSparqlCursor *curs
 }
 
 
-void
-photos_item_manager_clear (PhotosItemManager *self)
-{
-  photos_base_manager_clear (PHOTOS_BASE_MANAGER (self));
-  gtk_list_store_clear (self->priv->model);
-}
-
-
 PhotosBaseItem *
 photos_item_manager_create_item (PhotosItemManager *self, TrackerSparqlCursor *cursor)
 {
   return photos_local_item_new (cursor);
 }
-
-
-GtkListStore *
-photos_item_manager_get_model (PhotosItemManager *self)
-{
-  return self->priv->model;
-}
diff --git a/src/photos-item-manager.h b/src/photos-item-manager.h
index 44494c7..15ad727 100644
--- a/src/photos-item-manager.h
+++ b/src/photos-item-manager.h
@@ -80,8 +80,6 @@ PhotosBaseItem           *photos_item_manager_add_item           (PhotosItemMana
 PhotosBaseItem           *photos_item_manager_create_item        (PhotosItemManager *self,
                                                                   TrackerSparqlCursor *cursor);
 
-GtkListStore             *photos_item_manager_get_model          (PhotosItemManager *self);
-
 G_END_DECLS
 
 #endif /* PHOTOS_ITEM_MANAGER_H */
diff --git a/src/photos-view-container.c b/src/photos-view-container.c
index d8554fe..6785954 100644
--- a/src/photos-view-container.c
+++ b/src/photos-view-container.c
@@ -34,6 +34,7 @@
 #include "photos-tracker-controller.h"
 #include "photos-utils.h"
 #include "photos-view-container.h"
+#include "photos-view-model.h"
 
 
 struct _PhotosViewContainerPrivate
@@ -167,7 +168,6 @@ photos_view_container_query_status_changed (PhotosTrackerController *trk_cntrlr,
 
   if (!query_status)
     {
-      priv->model = photos_item_manager_get_model (PHOTOS_ITEM_MANAGER (priv->item_mngr));
       gd_main_view_set_model (priv->view, GTK_TREE_MODEL (priv->model));
       photos_selection_controller_freeze_selection (priv->sel_cntrlr, FALSE);
       /* TODO: update selection */
@@ -175,7 +175,6 @@ photos_view_container_query_status_changed (PhotosTrackerController *trk_cntrlr,
   else
     {
       photos_selection_controller_freeze_selection (priv->sel_cntrlr, TRUE);
-      priv->model = NULL;
       gd_main_view_set_model (priv->view, NULL);
     }
 }
@@ -243,6 +242,7 @@ photos_view_container_dispose (GObject *object)
       priv->disposed = TRUE;
     }
 
+  g_clear_object (&priv->model);
   g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->sel_cntrlr);
   g_clear_object (&priv->trk_cntrlr);
@@ -262,6 +262,8 @@ photos_view_container_init (PhotosViewContainer *self)
                                             PhotosViewContainerPrivate);
   priv = self->priv;
 
+  priv->model = photos_view_model_new ();
+
   gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
 
   priv->view = gd_main_view_new (GD_MAIN_VIEW_ICON);
diff --git a/src/photos-item-model.c b/src/photos-view-model.c
similarity index 53%
rename from src/photos-item-model.c
rename to src/photos-view-model.c
index f863957..261aba3 100644
--- a/src/photos-item-model.c
+++ b/src/photos-view-model.c
@@ -25,31 +25,38 @@
 
 #include "config.h"
 
-#include "photos-item-model.h"
+#include "photos-item-manager.h"
+#include "photos-view-model.h"
 
 
-G_DEFINE_TYPE (PhotosItemModel, photos_item_model, GTK_TYPE_LIST_STORE);
+struct _PhotosViewModelPrivate
+{
+  PhotosBaseManager *item_mngr;
+};
+
+
+G_DEFINE_TYPE (PhotosViewModel, photos_view_model, GTK_TYPE_LIST_STORE);
 
 
 static void
-photos_item_model_info_set (PhotosItemModel *self, PhotosBaseItem *item, GtkTreeIter *iter)
+photos_view_model_info_set (PhotosViewModel *self, PhotosBaseItem *item, GtkTreeIter *iter)
 {
   gtk_list_store_set (GTK_LIST_STORE (self),
                       iter,
-                      PHOTOS_ITEM_MODEL_URN, photos_base_item_get_id (item),
-                      PHOTOS_ITEM_MODEL_URI, photos_base_item_get_uri (item),
-                      PHOTOS_ITEM_MODEL_NAME, photos_base_item_get_name (item),
-                      PHOTOS_ITEM_MODEL_AUTHOR, photos_base_item_get_author (item),
-                      PHOTOS_ITEM_MODEL_ICON, photos_base_item_get_icon (item),
-                      PHOTOS_ITEM_MODEL_MTIME, photos_base_item_get_mtime (item),
+                      PHOTOS_VIEW_MODEL_URN, photos_base_item_get_id (item),
+                      PHOTOS_VIEW_MODEL_URI, photos_base_item_get_uri (item),
+                      PHOTOS_VIEW_MODEL_NAME, photos_base_item_get_name (item),
+                      PHOTOS_VIEW_MODEL_AUTHOR, photos_base_item_get_author (item),
+                      PHOTOS_VIEW_MODEL_ICON, photos_base_item_get_icon (item),
+                      PHOTOS_VIEW_MODEL_MTIME, photos_base_item_get_mtime (item),
                       -1);
 }
 
 
 static void
-photos_item_model_info_updated (PhotosBaseItem *item, gpointer user_data)
+photos_view_model_info_updated (PhotosBaseItem *item, gpointer user_data)
 {
-  PhotosItemModel *self = PHOTOS_ITEM_MODEL (user_data);
+  PhotosViewModel *self = PHOTOS_VIEW_MODEL (user_data);
   GtkTreeIter iter;
   GtkTreePath *path;
   GtkTreeRowReference *row_ref;
@@ -60,12 +67,12 @@ photos_item_model_info_updated (PhotosBaseItem *item, gpointer user_data)
     return;
 
   gtk_tree_model_get_iter (GTK_TREE_MODEL (self), &iter, path);
-  photos_item_model_info_set (self, item, &iter);
+  photos_view_model_info_set (self, item, &iter);
 }
 
 
 static gboolean
-photos_item_model_item_removed_foreach (GtkTreeModel *model,
+photos_view_model_item_removed_foreach (GtkTreeModel *model,
                                         GtkTreePath *path,
                                         GtkTreeIter *iter,
                                         gpointer user_data)
@@ -76,7 +83,7 @@ photos_item_model_item_removed_foreach (GtkTreeModel *model,
   gchar *value;
 
   id = photos_base_item_get_id (item);
-  gtk_tree_model_get (model, iter, PHOTOS_ITEM_MODEL_URN, &value, -1);
+  gtk_tree_model_get (model, iter, PHOTOS_VIEW_MODEL_URN, &value, -1);
 
   if (g_strcmp0 (id, value) == 0)
     {
@@ -90,56 +97,82 @@ photos_item_model_item_removed_foreach (GtkTreeModel *model,
 
 
 static void
-photos_item_model_init (PhotosItemModel *self)
+photos_view_model_object_added (PhotosViewModel *self, GObject *object)
 {
-  PhotosItemModelPrivate *priv;
-  GType columns[] = {G_TYPE_STRING,    /* URN */
-                     G_TYPE_STRING,    /* URI */
-                     G_TYPE_STRING,    /* NAME */
-                     G_TYPE_STRING,    /* AUTHOR */
-                     GDK_TYPE_PIXBUF,  /* ICON */
-                     G_TYPE_INT64,     /* MTIME */
-                     G_TYPE_BOOLEAN};  /* STATE */
+  GtkTreeIter iter;
+  GtkTreePath *path;
+  GtkTreeRowReference *row_ref;
+  PhotosBaseItem *item = PHOTOS_BASE_ITEM (object);
 
-  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_ITEM_MODEL_MTIME, GTK_SORT_DESCENDING);
+  gtk_list_store_append (GTK_LIST_STORE (self), &iter);
+  photos_view_model_info_set (self, item, &iter);
+
+  path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), &iter);
+  row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (self), path);
+  gtk_tree_path_free (path);
+
+  g_object_set_data_full (G_OBJECT (item), "row-ref", row_ref, (GDestroyNotify) gtk_tree_row_reference_free);
+  g_signal_connect (item, "info-updated", G_CALLBACK (photos_view_model_info_updated), self);
 }
 
 
 static void
-photos_item_model_class_init (PhotosItemModelClass *class)
+photos_view_model_object_removed (PhotosViewModel *self, GObject *object)
 {
+  PhotosBaseItem *item = PHOTOS_BASE_ITEM (object);
+  gtk_tree_model_foreach (GTK_TREE_MODEL (self), photos_view_model_item_removed_foreach, item);
 }
 
 
-GtkListStore *
-photos_item_model_new (void)
+static void
+photos_view_model_dispose (GObject *object)
 {
-  return g_object_new (PHOTOS_TYPE_ITEM_MODEL, NULL);
+  PhotosViewModel *self = PHOTOS_VIEW_MODEL (object);
+
+  g_clear_object (&self->priv->item_mngr);
+
+  G_OBJECT_CLASS (photos_view_model_parent_class)->dispose (object);
 }
 
 
-void
-photos_item_model_item_added (PhotosItemModel *self, PhotosBaseItem *item)
+static void
+photos_view_model_init (PhotosViewModel *self)
 {
-  GtkTreeIter iter;
-  GtkTreePath *path;
-  GtkTreeRowReference *row_ref;
+  PhotosViewModelPrivate *priv;
+  GType columns[] = {G_TYPE_STRING,    /* URN */
+                     G_TYPE_STRING,    /* URI */
+                     G_TYPE_STRING,    /* NAME */
+                     G_TYPE_STRING,    /* AUTHOR */
+                     GDK_TYPE_PIXBUF,  /* ICON */
+                     G_TYPE_INT64,     /* MTIME */
+                     G_TYPE_BOOLEAN};  /* STATE */
 
-  gtk_list_store_append (GTK_LIST_STORE (self), &iter);
-  photos_item_model_info_set (self, item, &iter);
+  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, PHOTOS_TYPE_VIEW_MODEL, PhotosViewModelPrivate);
+  priv = self->priv;
 
-  path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), &iter);
-  row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (self), path);
-  gtk_tree_path_free (path);
+  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);
 
-  g_object_set_data_full (G_OBJECT (item), "row-ref", row_ref, (GDestroyNotify) gtk_tree_row_reference_free);
-  g_signal_connect (item, "info-updated", G_CALLBACK (photos_item_model_info_updated), self);
+  priv->item_mngr = photos_item_manager_new ();
+  g_signal_connect_swapped (priv->item_mngr, "object-added", G_CALLBACK (photos_view_model_object_added), self);
+  g_signal_connect_swapped (priv->item_mngr, "object-removed", G_CALLBACK (photos_view_model_object_removed), self);
+  g_signal_connect_swapped (priv->item_mngr, "clear", G_CALLBACK (gtk_list_store_clear), self);
+}
+
+
+static void
+photos_view_model_class_init (PhotosViewModelClass *class)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+  object_class->dispose = photos_view_model_dispose;
+
+  g_type_class_add_private (class, sizeof (PhotosViewModelPrivate));
 }
 
 
-void
-photos_item_model_item_removed (PhotosItemModel *self, PhotosBaseItem *item)
+GtkListStore *
+photos_view_model_new (void)
 {
-  gtk_tree_model_foreach (GTK_TREE_MODEL (self), photos_item_model_item_removed_foreach, item);
+  return g_object_new (PHOTOS_TYPE_VIEW_MODEL, NULL);
 }
diff --git a/src/photos-view-model.h b/src/photos-view-model.h
new file mode 100644
index 0000000..cbdc1ff
--- /dev/null
+++ b/src/photos-view-model.h
@@ -0,0 +1,92 @@
+/*
+ * Photos - access, organize and share your photos on GNOME
+ * Copyright  2012 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
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+/* Based on code from:
+ *   + Documents
+ */
+
+#ifndef PHOTOS_VIEW_MODEL_H
+#define PHOTOS_VIEW_MODEL_H
+
+#include <gtk/gtk.h>
+
+#include "photos-base-item.h"
+
+G_BEGIN_DECLS
+
+#define PHOTOS_TYPE_VIEW_MODEL (photos_view_model_get_type ())
+
+#define PHOTOS_VIEW_MODEL(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+   PHOTOS_TYPE_VIEW_MODEL, PhotosViewModel))
+
+#define PHOTOS_VIEW_MODEL_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), \
+   PHOTOS_TYPE_VIEW_MODEL, PhotosViewModelClass))
+
+#define PHOTOS_IS_VIEW_MODEL(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+   PHOTOS_TYPE_VIEW_MODEL))
+
+#define PHOTOS_IS_VIEW_MODEL_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+   PHOTOS_TYPE_VIEW_MODEL))
+
+#define PHOTOS_VIEW_MODEL_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+   PHOTOS_TYPE_VIEW_MODEL, PhotosViewModelClass))
+
+typedef enum
+{
+  PHOTOS_VIEW_MODEL_URN,
+  PHOTOS_VIEW_MODEL_URI,
+  PHOTOS_VIEW_MODEL_NAME,
+  PHOTOS_VIEW_MODEL_AUTHOR,
+  PHOTOS_VIEW_MODEL_ICON,
+  PHOTOS_VIEW_MODEL_MTIME,
+  PHOTOS_VIEW_MODEL_SELECTED
+} PhotosViewModelColumns;
+
+typedef struct _PhotosViewModel        PhotosViewModel;
+typedef struct _PhotosViewModelClass   PhotosViewModelClass;
+typedef struct _PhotosViewModelPrivate PhotosViewModelPrivate;
+
+struct _PhotosViewModel
+{
+  GtkListStore parent_instance;
+  PhotosViewModelPrivate *priv;
+};
+
+struct _PhotosViewModelClass
+{
+  GtkListStoreClass parent_class;
+};
+
+GType             photos_view_model_get_type               (void) G_GNUC_CONST;
+
+GtkListStore     *photos_view_model_new                    (void);
+
+void              photos_view_model_item_added             (PhotosViewModel *self, PhotosBaseItem *item);
+
+void              photos_view_model_item_removed           (PhotosViewModel *self, PhotosBaseItem *item);
+
+G_END_DECLS
+
+#endif /* PHOTOS_VIEW_MODEL_H */



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