1 #include "wh-video-model.h"
4 G_DEFINE_TYPE (WHVideoModel, wh_video_model, G_TYPE_OBJECT);
6 #define VIDEO_MODEL_PRIVATE(o) \
7 (G_TYPE_INSTANCE_GET_PRIVATE ((o), WH_TYPE_VIDEO_MODEL, WHVideoModelPrivate))
9 typedef struct _WHVideoModelPrivate WHVideoModelPrivate;
20 static guint _model_signals[LAST_SIGNAL] = { 0 };
22 struct _WHVideoModelPrivate
24 WHFilterRowFunc filter;
26 WHCompareRowFunc sort;
32 wh_video_model_get_property (GObject *object, guint property_id,
33 GValue *value, GParamSpec *pspec)
35 switch (property_id) {
37 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
42 wh_video_model_set_property (GObject *object, guint property_id,
43 const GValue *value, GParamSpec *pspec)
45 switch (property_id) {
47 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
52 wh_video_model_dispose (GObject *object)
54 if (G_OBJECT_CLASS (wh_video_model_parent_class)->dispose)
55 G_OBJECT_CLASS (wh_video_model_parent_class)->dispose (object);
59 wh_video_model_finalize (GObject *object)
61 G_OBJECT_CLASS (wh_video_model_parent_class)->finalize (object);
65 wh_video_model_class_init (WHVideoModelClass *klass)
67 GObjectClass *object_class = G_OBJECT_CLASS (klass);
69 g_type_class_add_private (klass, sizeof (WHVideoModelPrivate));
71 object_class->get_property = wh_video_model_get_property;
72 object_class->set_property = wh_video_model_set_property;
73 object_class->dispose = wh_video_model_dispose;
74 object_class->finalize = wh_video_model_finalize;
76 _model_signals[REORDERED] =
77 g_signal_new ("rows-reordered",
78 G_OBJECT_CLASS_TYPE (object_class),
80 G_STRUCT_OFFSET (WHVideoModelClass, reordered),
82 g_cclosure_marshal_VOID__VOID,
85 _model_signals[FILTER] =
86 g_signal_new ("filter-changed",
87 G_OBJECT_CLASS_TYPE (object_class),
89 G_STRUCT_OFFSET (WHVideoModelClass, filter_change),
91 g_cclosure_marshal_VOID__VOID,
94 _model_signals[ROW_CHANGED] =
95 g_signal_new ("row-changed",
96 G_OBJECT_CLASS_TYPE (object_class),
98 G_STRUCT_OFFSET (WHVideoModelClass, row_change),
100 g_cclosure_marshal_VOID__OBJECT,
101 G_TYPE_NONE, 1, WH_TYPE_VIDEO_MODEL_ROW);
103 _model_signals[ROW_ADDED] =
104 g_signal_new ("row-added",
105 G_OBJECT_CLASS_TYPE (object_class),
107 G_STRUCT_OFFSET (WHVideoModelClass, row_added),
109 g_cclosure_marshal_VOID__OBJECT,
110 G_TYPE_NONE, 1, WH_TYPE_VIDEO_MODEL_ROW);
115 wh_video_model_init (WHVideoModel *self)
117 WHVideoModelPrivate *priv = VIDEO_MODEL_PRIVATE(self);
119 priv->rows = egg_sequence_new (NULL);
123 check_filter (WHVideoModel *model, EggSequenceIter *iter)
125 WHVideoModelPrivate *priv = VIDEO_MODEL_PRIVATE(model);
128 if (priv->filter == NULL)
131 res = priv->filter(model,
132 (WHVideoModelRow*)egg_sequence_get (iter),
138 wh_video_model_row_count (WHVideoModel *model)
140 WHVideoModelPrivate *priv = VIDEO_MODEL_PRIVATE(model);
141 EggSequenceIter *iter;
144 if (priv->filter == NULL)
145 return egg_sequence_get_length (priv->rows);
147 iter = egg_sequence_get_begin_iter (priv->rows);
149 while (!egg_sequence_iter_is_end (iter))
151 if (check_filter (model, iter))
153 iter = egg_sequence_iter_next (iter);
160 wh_video_model_get_row (WHVideoModel *model, gint index)
162 WHVideoModelPrivate *priv = VIDEO_MODEL_PRIVATE(model);
163 EggSequenceIter *iter;
166 if (priv->filter == NULL)
167 return (WHVideoModelRow*)egg_sequence_get
168 (egg_sequence_get_iter_at_pos (priv->rows, index));
170 iter = egg_sequence_get_begin_iter (priv->rows);
172 while (!egg_sequence_iter_is_end (iter))
174 if (check_filter (model, iter))
177 return (WHVideoModelRow*)egg_sequence_get (iter);
180 iter = egg_sequence_iter_next (iter);
187 on_row_changed (GObject *obj,
191 WHVideoModel *model = WH_VIDEO_MODEL(data);
192 WHVideoModelPrivate *priv;
194 priv = VIDEO_MODEL_PRIVATE(model);
196 /* thumbnail changing does not effect ordering */
197 if (!strcmp(g_param_spec_get_name(arg1), "thumbnail"))
202 egg_sequence_sort (priv->rows,
203 (GCompareDataFunc)priv->sort, priv->sort_data);
204 g_signal_emit (model, _model_signals[REORDERED], 0);
207 g_signal_emit (model, _model_signals[ROW_CHANGED], 0,
208 WH_VIDEO_MODEL_ROW(obj));
212 wh_video_model_append_row (WHVideoModel *model, WHVideoModelRow *row)
214 WHVideoModelPrivate *priv = VIDEO_MODEL_PRIVATE(model);
215 EggSequenceIter *iter;
217 g_signal_connect (row,
219 G_CALLBACK (on_row_changed),
225 iter = egg_sequence_insert_sorted (priv->rows,
227 (GCompareDataFunc)priv->sort,
230 iter = egg_sequence_append (priv->rows, (gpointer)row);
232 if (check_filter (model, iter))
233 g_signal_emit (model, _model_signals[ROW_ADDED], 0, row);
238 wh_video_model_foreach (WHVideoModel *model,
239 WHForeachRowFunc func,
242 WHVideoModelPrivate *priv = VIDEO_MODEL_PRIVATE(model);
243 EggSequenceIter *iter;
245 iter = egg_sequence_get_begin_iter (priv->rows);
247 while (!egg_sequence_iter_is_end (iter))
249 if (check_filter (model, iter))
251 (WHVideoModelRow*)egg_sequence_get (iter),
255 iter = egg_sequence_iter_next (iter);
260 wh_video_model_set_sort_func (WHVideoModel *model,
261 WHCompareRowFunc func,
264 WHVideoModelPrivate *priv = VIDEO_MODEL_PRIVATE(model);
267 priv->sort_data = userdata;
271 egg_sequence_sort (priv->rows, (GCompareDataFunc)func, userdata);
272 g_signal_emit (model, _model_signals[REORDERED], 0);
277 wh_video_model_set_filter (WHVideoModel *model,
278 WHFilterRowFunc filter,
281 WHVideoModelPrivate *priv = VIDEO_MODEL_PRIVATE(model);
282 WHFilterRowFunc prev_filter;
284 prev_filter = priv->filter;
286 priv->filter = filter;
287 priv->filter_data = data;
289 if (prev_filter != priv->filter)
290 g_signal_emit (model, _model_signals[FILTER], 0);
294 wh_video_model_new ()
296 return g_object_new (WH_TYPE_VIDEO_MODEL, NULL);