2
* Photos - access, organize and share your photos on GNOME
3
* Copyright Ā© 2012, 2013 Red Hat, Inc.
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation; either version 2
8
* of the License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21
/* Based on code from:
28
#include "photos-collection-manager.h"
29
#include "photos-enums.h"
30
#include "photos-item-manager.h"
31
#include "photos-view-model.h"
34
struct _PhotosViewModelPrivate
36
PhotosBaseManager *col_mngr;
37
PhotosBaseManager *item_mngr;
38
PhotosWindowMode mode;
49
G_DEFINE_TYPE_WITH_PRIVATE (PhotosViewModel, photos_view_model, GTK_TYPE_LIST_STORE);
53
photos_view_model_info_set (PhotosViewModel *self, PhotosBaseItem *item, GtkTreeIter *iter)
55
gtk_list_store_set (GTK_LIST_STORE (self),
57
PHOTOS_VIEW_MODEL_URN, photos_base_item_get_id (item),
58
PHOTOS_VIEW_MODEL_URI, photos_base_item_get_uri (item),
59
PHOTOS_VIEW_MODEL_NAME, photos_base_item_get_name (item),
60
PHOTOS_VIEW_MODEL_AUTHOR, photos_base_item_get_author (item),
61
PHOTOS_VIEW_MODEL_ICON, photos_base_item_get_icon (item),
62
PHOTOS_VIEW_MODEL_MTIME, photos_base_item_get_mtime (item),
68
photos_view_model_add_item (PhotosViewModel *self, PhotosBaseItem *item)
72
GtkTreeRowReference *row_ref;
74
gtk_list_store_append (GTK_LIST_STORE (self), &iter);
75
photos_view_model_info_set (self, item, &iter);
77
path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), &iter);
78
row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (self), path);
79
gtk_tree_path_free (path);
81
g_object_set_data_full (G_OBJECT (item),
82
self->priv->row_ref_key,
84
(GDestroyNotify) gtk_tree_row_reference_free);
89
photos_view_model_item_removed_foreach (GtkTreeModel *model,
94
PhotosBaseItem *item = PHOTOS_BASE_ITEM (user_data);
95
gboolean ret_val = FALSE;
99
id = photos_base_item_get_id (item);
100
gtk_tree_model_get (model, iter, PHOTOS_VIEW_MODEL_URN, &value, -1);
102
if (g_strcmp0 (id, value) == 0)
104
gtk_list_store_remove (GTK_LIST_STORE (model), iter);
114
photos_view_model_object_removed (PhotosViewModel *self, GObject *object)
116
PhotosBaseItem *item = PHOTOS_BASE_ITEM (object);
118
gtk_tree_model_foreach (GTK_TREE_MODEL (self), photos_view_model_item_removed_foreach, item);
119
g_object_set_data (object, self->priv->row_ref_key, NULL);
124
photos_view_model_info_updated (PhotosBaseItem *item, gpointer user_data)
126
PhotosViewModel *self = PHOTOS_VIEW_MODEL (user_data);
127
PhotosViewModelPrivate *priv = self->priv;
131
GtkTreeRowReference *row_ref;
133
collection = photos_base_manager_get_active_object (priv->col_mngr);
134
row_ref = (GtkTreeRowReference *) g_object_get_data (G_OBJECT (item), priv->row_ref_key);
136
if (priv->mode == PHOTOS_WINDOW_MODE_COLLECTIONS)
138
gboolean is_collection;
140
is_collection = photos_base_item_is_collection (item);
141
if (!is_collection && row_ref != NULL && collection == NULL)
142
photos_view_model_object_removed (self, G_OBJECT (item));
143
else if (is_collection && row_ref == NULL)
144
photos_view_model_add_item (self, item);
146
else if (priv->mode == PHOTOS_WINDOW_MODE_FAVORITES)
148
gboolean is_favorite;
150
is_favorite = photos_base_item_is_favorite (item);
151
if (!is_favorite && row_ref != NULL && collection == NULL)
152
photos_view_model_object_removed (self, G_OBJECT (item));
153
else if (is_favorite && row_ref == NULL && collection == NULL)
154
photos_view_model_add_item (self, item);
157
row_ref = (GtkTreeRowReference *) g_object_get_data (G_OBJECT (item), priv->row_ref_key);
160
path = gtk_tree_row_reference_get_path (row_ref);
164
gtk_tree_model_get_iter (GTK_TREE_MODEL (self), &iter, path);
165
photos_view_model_info_set (self, item, &iter);
171
photos_view_model_object_added (PhotosViewModel *self, GObject *object)
173
PhotosBaseItem *item = PHOTOS_BASE_ITEM (object);
174
PhotosViewModelPrivate *priv = self->priv;
177
collection = photos_base_manager_get_active_object (priv->col_mngr);
179
if (collection == NULL)
181
if ((priv->mode == PHOTOS_WINDOW_MODE_COLLECTIONS && !photos_base_item_is_collection (item))
182
|| (priv->mode == PHOTOS_WINDOW_MODE_FAVORITES && !photos_base_item_is_favorite (item)))
186
photos_view_model_add_item (self, item);
189
g_signal_connect (item, "info-updated", G_CALLBACK (photos_view_model_info_updated), self);
194
photos_view_model_dispose (GObject *object)
196
PhotosViewModel *self = PHOTOS_VIEW_MODEL (object);
197
PhotosViewModelPrivate *priv = self->priv;
199
g_clear_object (&priv->col_mngr);
200
g_clear_object (&priv->item_mngr);
202
G_OBJECT_CLASS (photos_view_model_parent_class)->dispose (object);
207
photos_view_model_finalize (GObject *object)
209
PhotosViewModel *self = PHOTOS_VIEW_MODEL (object);
211
g_free (self->priv->row_ref_key);
213
G_OBJECT_CLASS (photos_view_model_parent_class)->finalize (object);
218
photos_view_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
220
PhotosViewModel *self = PHOTOS_VIEW_MODEL (object);
221
PhotosViewModelPrivate *priv = self->priv;
226
priv->mode = (PhotosWindowMode) g_value_get_enum (value);
227
priv->row_ref_key = g_strdup_printf ("row-ref-%d", priv->mode);
231
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
238
photos_view_model_init (PhotosViewModel *self)
240
PhotosViewModelPrivate *priv;
241
GType columns[] = {G_TYPE_STRING, /* URN */
242
G_TYPE_STRING, /* URI */
243
G_TYPE_STRING, /* NAME */
244
G_TYPE_STRING, /* AUTHOR */
245
GDK_TYPE_PIXBUF, /* ICON */
246
G_TYPE_INT64, /* MTIME */
247
G_TYPE_BOOLEAN}; /* STATE */
249
self->priv = photos_view_model_get_instance_private (self);
252
gtk_list_store_set_column_types (GTK_LIST_STORE (self), sizeof (columns) / sizeof (columns[0]), columns);
253
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (self), PHOTOS_VIEW_MODEL_MTIME, GTK_SORT_DESCENDING);
255
priv->col_mngr = photos_collection_manager_dup_singleton ();
257
priv->item_mngr = photos_item_manager_dup_singleton ();
258
g_signal_connect_swapped (priv->item_mngr, "object-added", G_CALLBACK (photos_view_model_object_added), self);
259
g_signal_connect_swapped (priv->item_mngr, "object-removed", G_CALLBACK (photos_view_model_object_removed), self);
260
g_signal_connect_swapped (priv->item_mngr, "clear", G_CALLBACK (gtk_list_store_clear), self);
265
photos_view_model_class_init (PhotosViewModelClass *class)
267
GObjectClass *object_class = G_OBJECT_CLASS (class);
269
object_class->dispose = photos_view_model_dispose;
270
object_class->finalize = photos_view_model_finalize;
271
object_class->set_property = photos_view_model_set_property;
273
g_object_class_install_property (object_class,
275
g_param_spec_enum ("mode",
276
"PhotosWindowMode enum",
277
"The mode for which the model holds the data",
278
PHOTOS_TYPE_WINDOW_MODE,
279
PHOTOS_WINDOW_MODE_NONE,
280
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
285
photos_view_model_new (PhotosWindowMode mode)
287
return g_object_new (PHOTOS_TYPE_VIEW_MODEL, "mode", mode, NULL);