[list-model] Use an internal iterator for comparisons
In order to carry out various comparisons for e.g. identifying the first iterator in the model we need a ClutterModelIter. This change switches from creating a new iterator each time to reusing an existing iterator.
This commit is contained in:
parent
353187ce49
commit
b2fbc2c95c
@ -81,6 +81,8 @@ typedef struct _ClutterModelIterClass ClutterListModelIterClass;
|
||||
struct _ClutterListModelPrivate
|
||||
{
|
||||
GSequence *sequence;
|
||||
|
||||
ClutterModelIter *temp_iter;
|
||||
};
|
||||
|
||||
struct _ClutterListModelIter
|
||||
@ -225,9 +227,7 @@ clutter_list_model_iter_is_first (ClutterModelIter *iter)
|
||||
begin = g_sequence_get_begin_iter (sequence);
|
||||
end = iter_default->seq_iter;
|
||||
|
||||
temp_iter = g_object_new (CLUTTER_TYPE_LIST_MODEL_ITER,
|
||||
"model", model,
|
||||
NULL);
|
||||
temp_iter = CLUTTER_LIST_MODEL (model)->priv->temp_iter;
|
||||
|
||||
while (!g_sequence_iter_is_begin (begin))
|
||||
{
|
||||
@ -242,8 +242,6 @@ clutter_list_model_iter_is_first (ClutterModelIter *iter)
|
||||
begin = g_sequence_iter_next (begin);
|
||||
}
|
||||
|
||||
g_object_unref (temp_iter);
|
||||
|
||||
/* This is because the 'begin_iter' is always *before* the last valid
|
||||
* iter, otherwise we'd have endless loops
|
||||
*/
|
||||
@ -275,9 +273,7 @@ clutter_list_model_iter_is_last (ClutterModelIter *iter)
|
||||
begin = g_sequence_iter_prev (begin);
|
||||
end = iter_default->seq_iter;
|
||||
|
||||
temp_iter = g_object_new (CLUTTER_TYPE_LIST_MODEL_ITER,
|
||||
"model", model,
|
||||
NULL);
|
||||
temp_iter = CLUTTER_LIST_MODEL (model)->priv->temp_iter;
|
||||
|
||||
while (!g_sequence_iter_is_begin (begin))
|
||||
{
|
||||
@ -292,8 +288,6 @@ clutter_list_model_iter_is_last (ClutterModelIter *iter)
|
||||
begin = g_sequence_iter_prev (begin);
|
||||
}
|
||||
|
||||
g_object_unref (temp_iter);
|
||||
|
||||
/* This is because the 'end_iter' is always *after* the last valid iter.
|
||||
* Otherwise we'd have endless loops
|
||||
*/
|
||||
@ -320,9 +314,7 @@ clutter_list_model_iter_next (ClutterModelIter *iter)
|
||||
filter_next = g_sequence_iter_next (iter_default->seq_iter);
|
||||
g_assert (filter_next != NULL);
|
||||
|
||||
temp_iter = g_object_new (CLUTTER_TYPE_LIST_MODEL_ITER,
|
||||
"model", model,
|
||||
NULL);
|
||||
temp_iter = CLUTTER_LIST_MODEL (model)->priv->temp_iter;
|
||||
|
||||
while (!g_sequence_iter_is_end (filter_next))
|
||||
{
|
||||
@ -337,8 +329,6 @@ clutter_list_model_iter_next (ClutterModelIter *iter)
|
||||
filter_next = g_sequence_iter_next (filter_next);
|
||||
}
|
||||
|
||||
g_object_unref (temp_iter);
|
||||
|
||||
if (g_sequence_iter_is_end (filter_next))
|
||||
row += 1;
|
||||
|
||||
@ -367,9 +357,7 @@ clutter_list_model_iter_prev (ClutterModelIter *iter)
|
||||
filter_prev = g_sequence_iter_prev (iter_default->seq_iter);
|
||||
g_assert (filter_prev != NULL);
|
||||
|
||||
temp_iter = g_object_new (CLUTTER_TYPE_LIST_MODEL_ITER,
|
||||
"model", model,
|
||||
NULL);
|
||||
temp_iter = CLUTTER_LIST_MODEL (model)->priv->temp_iter;
|
||||
|
||||
while (!g_sequence_iter_is_begin (filter_prev))
|
||||
{
|
||||
@ -384,8 +372,6 @@ clutter_list_model_iter_prev (ClutterModelIter *iter)
|
||||
filter_prev = g_sequence_iter_prev (filter_prev);
|
||||
}
|
||||
|
||||
g_object_unref (temp_iter);
|
||||
|
||||
if (g_sequence_iter_is_begin (filter_prev))
|
||||
row -= 1;
|
||||
|
||||
@ -683,6 +669,20 @@ clutter_list_model_finalize (GObject *gobject)
|
||||
G_OBJECT_CLASS (clutter_list_model_parent_class)->finalize (gobject);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_list_model_dispose (GObject *gobject)
|
||||
{
|
||||
ClutterListModel *model = CLUTTER_LIST_MODEL (gobject);
|
||||
|
||||
if (model->priv->temp_iter)
|
||||
{
|
||||
g_object_unref (model->priv->temp_iter);
|
||||
model->priv->temp_iter = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (clutter_list_model_parent_class)->finalize (gobject);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_list_model_class_init (ClutterListModelClass *klass)
|
||||
{
|
||||
@ -692,6 +692,7 @@ clutter_list_model_class_init (ClutterListModelClass *klass)
|
||||
g_type_class_add_private (klass, sizeof (ClutterListModelPrivate));
|
||||
|
||||
gobject_class->finalize = clutter_list_model_finalize;
|
||||
gobject_class->dispose = clutter_list_model_dispose;
|
||||
|
||||
model_class->get_iter_at_row = clutter_list_model_get_iter_at_row;
|
||||
model_class->insert_row = clutter_list_model_insert_row;
|
||||
@ -707,6 +708,10 @@ clutter_list_model_init (ClutterListModel *model)
|
||||
model->priv = CLUTTER_LIST_MODEL_GET_PRIVATE (model);
|
||||
|
||||
model->priv->sequence = g_sequence_new (NULL);
|
||||
model->priv->temp_iter = g_object_new (CLUTTER_TYPE_LIST_MODEL_ITER,
|
||||
"model",
|
||||
model,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user