diff --git a/ChangeLog b/ChangeLog index 3fc97b952..dc49a99be 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-03-19 Emmanuele Bassi + + * clutter/clutter-model.[ch]: Add a ::copy() virtual function + for copying iterators. + + * clutter/clutter-list-model.c: + (clutter_list_model_iter_copy), + (clutter_list_model_iter_class_init): Implement the ::copy() + function inside the ListModel iterator subclass. + 2008-03-19 Emmanuele Bassi * clutter/clutter-group.c: diff --git a/clutter/clutter-list-model.c b/clutter/clutter-list-model.c index bbd4a5716..6cca26c24 100644 --- a/clutter/clutter-list-model.c +++ b/clutter/clutter-list-model.c @@ -418,6 +418,33 @@ clutter_list_model_iter_prev (ClutterModelIter *iter) return CLUTTER_MODEL_ITER (iter_default); } + +static ClutterModelIter * +clutter_list_model_iter_copy (ClutterModelIter *iter) +{ + ClutterListModelIter *iter_default; + ClutterListModelIter *iter_copy; + ClutterModel *model; + guint row; + + iter_default = CLUTTER_LIST_MODEL_ITER (iter); + + model = clutter_model_iter_get_model (iter); + row = clutter_model_iter_get_row (iter) - 1; + + iter_copy = g_object_new (CLUTTER_TYPE_LIST_MODEL_ITER, + "model", model, + "row", row, + NULL); + + /* this is safe, because the seq_iter pointer on the passed + * iterator will be always be overwritten in ::next or ::prev + */ + iter_copy->seq_iter = iter_default->seq_iter; + + return CLUTTER_MODEL_ITER (iter_copy); +} + static void clutter_list_model_iter_class_init (ClutterListModelIterClass *klass) { @@ -429,6 +456,7 @@ clutter_list_model_iter_class_init (ClutterListModelIterClass *klass) iter_class->is_last = clutter_list_model_iter_is_last; iter_class->next = clutter_list_model_iter_next; iter_class->prev = clutter_list_model_iter_prev; + iter_class->copy = clutter_list_model_iter_copy; } static void diff --git a/clutter/clutter-model.c b/clutter/clutter-model.c index 2bd165ddf..568e840b9 100644 --- a/clutter/clutter-model.c +++ b/clutter/clutter-model.c @@ -1473,6 +1473,16 @@ clutter_model_iter_prev_unimplemented (ClutterModelIter *iter) return NULL; } +static ClutterModelIter * +clutter_model_iter_copy_unimplemented (ClutterModelIter *iter) +{ + g_warning ("%s: Iterator of type `%s' does not implement the " + "ClutterModelIter::copy() virtual function", + G_STRLOC, + g_type_name (G_OBJECT_TYPE (iter))); + return NULL; +} + static void clutter_model_iter_get_property (GObject *object, guint prop_id, @@ -1535,6 +1545,7 @@ clutter_model_iter_class_init (ClutterModelIterClass *klass) klass->prev = clutter_model_iter_prev_unimplemented; klass->get_value = clutter_model_iter_get_value_unimplemented; klass->set_value = clutter_model_iter_set_value_unimplemented; + klass->copy = clutter_model_iter_copy_unimplemented; /* Properties */ @@ -1989,3 +2000,27 @@ clutter_model_iter_get_row (ClutterModelIter *iter) return 0; } + +/** + * clutter_model_iter_copy: + * @iter: a #ClutterModelIter + * + * Copies the passed iterator. + * + * Return value: a copy of the iterator, or %NULL + * + * Since: 0.8 + */ +ClutterModelIter * +clutter_model_iter_copy (ClutterModelIter *iter) +{ + ClutterModelIterClass *klass; + + g_return_val_if_fail (CLUTTER_IS_MODEL_ITER (iter), NULL); + + klass = CLUTTER_MODEL_ITER_GET_CLASS (iter); + if (klass->copy) + return klass->copy (iter); + + return NULL; +} diff --git a/clutter/clutter-model.h b/clutter/clutter-model.h index f39900175..cfe128d34 100644 --- a/clutter/clutter-model.h +++ b/clutter/clutter-model.h @@ -325,9 +325,11 @@ struct _ClutterModelIterClass ClutterModelIter *(* next) (ClutterModelIter *iter); ClutterModelIter *(* prev) (ClutterModelIter *iter); - ClutterModel* (* get_model) (ClutterModelIter *iter); + ClutterModel * (* get_model) (ClutterModelIter *iter); guint (* get_row) (ClutterModelIter *iter); + ClutterModelIter *(* copy) (ClutterModelIter *iter); + /*< private >*/ /* padding for future */ void (*_clutter_model_iter_1) (void); @@ -361,6 +363,7 @@ ClutterModelIter *clutter_model_iter_prev (ClutterModelIter *iter); ClutterModel * clutter_model_iter_get_model (ClutterModelIter *iter); guint clutter_model_iter_get_row (ClutterModelIter *iter); +ClutterModelIter *clutter_model_iter_copy (ClutterModelIter *iter); G_END_DECLS