Пример #1
0
void
nemo_list_model_file_changed (NemoListModel *model, NemoFile *file,
				  NemoDirectory *directory)
{
	FileEntry *parent_file_entry;
	GtkTreeIter iter;
	GtkTreePath *path, *parent_path;
	GSequenceIter *ptr;
	int pos_before, pos_after, length, i, old;
	int *new_order;
	gboolean has_iter;
	GSequence *files;

	ptr = lookup_file (model, file, directory);
	if (!ptr) {
		return;
	}

	
	pos_before = g_sequence_iter_get_position (ptr);
		
	g_sequence_sort_changed (ptr, nemo_list_model_file_entry_compare_func, model);

	pos_after = g_sequence_iter_get_position (ptr);

	if (pos_before != pos_after) {
		/* The file moved, we need to send rows_reordered */
		
		parent_file_entry = ((FileEntry *)g_sequence_get (ptr))->parent;

		if (parent_file_entry == NULL) {
			has_iter = FALSE;
			parent_path = gtk_tree_path_new ();
			files = model->details->files;
		} else {
			has_iter = TRUE;
			nemo_list_model_ptr_to_iter (model, parent_file_entry->ptr, &iter);
			parent_path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
			files = parent_file_entry->files;
		}

		length = g_sequence_get_length (files);
		new_order = g_new (int, length);
		/* Note: new_order[newpos] = oldpos */
		for (i = 0, old = 0; i < length; ++i) {
			if (i == pos_after) {
				new_order[i] = pos_before;
			} else {
				if (old == pos_before)
					old++;
				new_order[i] = old++;
			}
		}

		gtk_tree_model_rows_reordered (GTK_TREE_MODEL (model),
					       parent_path, has_iter ? &iter : NULL, new_order);

		gtk_tree_path_free (parent_path);
		g_free (new_order);
	}
Пример #2
0
void fm_folder_model_set_show_hidden(FmFolderModel* model, gboolean show_hidden)
{
    FmFolderItem* item;
    GList *l, *next;
    GSequenceIter *items_it;
    g_return_if_fail(model != NULL);
    if( model->show_hidden == show_hidden )
        return;

    model->show_hidden = show_hidden;
    if( show_hidden ) /* add previously hidden items back to the list */
    {
        GSequenceIter *hidden_it = g_sequence_get_begin_iter(model->hidden);
        while( !g_sequence_iter_is_end(hidden_it) )
        {
            GtkTreeIter it;
            GSequenceIter *next_hidden_it;
            GSequenceIter *insert_item_it = g_sequence_search(model->items, g_sequence_get(hidden_it),
                                                              fm_folder_model_compare, model);
            next_hidden_it = g_sequence_iter_next(hidden_it);
            item = (FmFolderItem*)g_sequence_get(hidden_it);
            it.stamp = model->stamp;
            it.user_data  = hidden_it;
            g_sequence_move(hidden_it, insert_item_it);
            GtkTreePath *path = gtk_tree_path_new_from_indices(g_sequence_iter_get_position(hidden_it), -1);
            gtk_tree_model_row_inserted(GTK_TREE_MODEL(model), path, &it);
            gtk_tree_path_free(path);
            hidden_it = next_hidden_it;
        }
    }
    else /* move invisible items to hidden list */
    {
        GSequenceIter *items_it = g_sequence_get_begin_iter(model->items);
        while( !g_sequence_iter_is_end(items_it) )
        {
            GtkTreePath* tp;
            GSequenceIter *next_item_it = g_sequence_iter_next(items_it);
            item = (FmFolderItem*)g_sequence_get(items_it);
            if( fm_file_info_is_hidden(item->inf) )
            {
                gint delete_pos = g_sequence_iter_get_position(items_it);
                g_sequence_move( items_it, g_sequence_get_begin_iter(model->hidden) );
                tp = gtk_tree_path_new_from_indices(delete_pos, -1);
                /* tell everybody that we removed an item */
                gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), tp);
                gtk_tree_path_free(tp);
            }
            items_it = next_item_it;
        }
    }
}
Пример #3
0
void fm_folder_model_file_deleted(FmFolderModel* model, FmFileInfo* file)
{
    GSequenceIter *seq_it;
    /* not required for hidden files */
    gboolean update_view;
#if 0
    /* If there is no file info, that means the dir itself was deleted. */
    if( G_UNLIKELY(!file) )
    {
        /* Clear the whole list */
        GSequenceIter *items_it = g_sequence_get_begin_iter(model->items);
        path = gtk_tree_path_new_from_indices(0, -1);
        while( !g_sequence_iter_is_end(items_it) )
        {
            gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), path);
            file  = (VFSFileInfo*)g_sequence_get(items_it);
            items_it = g_sequence_iter_next(it);
            vfs_file_info_unref(file);
        }
        for( l = model->items; l; l = model->items )
        {
            gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), path);
            file = (VFSFileInfo*)l->data;
            model->items = g_list_delete_link(model->items, l);
            vfs_file_info_unref(file);
        }
        g_sequence_remove_range( g_sequence_get_begin_iter(model->items), g_sequence_get_end_iter(model->items) );
        gtk_tree_path_free(path);
        return;
    }
#endif

    if( !model->show_hidden && fm_file_info_is_hidden(file) ) /* if this is a hidden file */
    {
        update_view = FALSE;
        seq_it = g_sequence_get_begin_iter(model->hidden);
    }
    else
    {
        update_view = TRUE;
        seq_it = g_sequence_get_begin_iter(model->items);
    }

    while( !g_sequence_iter_is_end(seq_it) )
    {
        FmFolderItem* item = (FmFolderItem*)g_sequence_get(seq_it);
        if( item->inf == file )
            break;
        seq_it = g_sequence_iter_next(seq_it);
    }

    if( update_view )
    {
        GtkTreePath* path = gtk_tree_path_new_from_indices(g_sequence_iter_get_position(seq_it), -1);
        gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), path);
        gtk_tree_path_free(path);
    }
    model->iter_age++;
    g_sequence_remove(seq_it);
}
Пример #4
0
static void
on_sequence_pattern_usage_changed (BtSequence * sequence, BtPattern * pattern,
    gpointer user_data)
{
  BtPatternListModel *model = BT_PATTERN_LIST_MODEL (user_data);
  BtMachine *machine;

  g_object_get (pattern, "machine", &machine, NULL);
  if (machine) {
    if (machine == model->priv->machine) {
      GSequence *seq = model->priv->seq;
      GtkTreeIter iter;
      GtkTreePath *path;

      // find the item by pattern
      iter.stamp = model->priv->stamp;
      iter.user_data = g_sequence_lookup (seq, pattern, model_item_cmp, NULL);
      path = gtk_tree_path_new ();
      gtk_tree_path_append_index (path,
          g_sequence_iter_get_position (iter.user_data));
      gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter);
      gtk_tree_path_free (path);
    }
    g_object_unref (machine);
  }
}
Пример #5
0
gboolean
egg_sorted_hash_insert (EggSortedHash    *hash,
                        gpointer          key,
                        gpointer          value,
                        guint            *position)
{
  GSequenceIter *it;

  if (g_hash_table_contains (hash->iters, key))
    {
      if (hash->key_free_func)
        hash->key_free_func (key);
      if (hash->value_free_func)
        hash->value_free_func (value);
      return FALSE;
    }

  if (hash->sort_func)
    it = g_sequence_insert_sorted (hash->items, value, hash->sort_func, hash->sort_func_data);
  else
    it = g_sequence_append (hash->items, value);

  g_hash_table_insert (hash->iters, key, it);

  if (position)
    *position = g_sequence_iter_get_position (it);

  return TRUE;
}
Пример #6
0
static void
nemo_list_model_sort_file_entries (NemoListModel *model, GSequence *files, GtkTreePath *path)
{
	GSequenceIter **old_order;
	GtkTreeIter iter;
	int *new_order;
	int length;
	int i;
	FileEntry *file_entry;
	gboolean has_iter;

	length = g_sequence_get_length (files);

	if (length <= 1) {
		return;
	}
	
	/* generate old order of GSequenceIter's */
	old_order = g_new (GSequenceIter *, length);
	for (i = 0; i < length; ++i) {
		GSequenceIter *ptr = g_sequence_get_iter_at_pos (files, i);
		
		file_entry = g_sequence_get (ptr);
		if (file_entry->files != NULL) {
			gtk_tree_path_append_index (path, i);
			nemo_list_model_sort_file_entries (model, file_entry->files, path);
			gtk_tree_path_up (path);
		}

		old_order[i] = ptr;
	}

	/* sort */
	g_sequence_sort (files, nemo_list_model_file_entry_compare_func, model);

	/* generate new order */
	new_order = g_new (int, length);
	/* Note: new_order[newpos] = oldpos */
	for (i = 0; i < length; ++i) {
		new_order[g_sequence_iter_get_position (old_order[i])] = i;
	}

	/* Let the world know about our new order */

	g_assert (new_order != NULL);

	has_iter = FALSE;
	if (gtk_tree_path_get_depth (path) != 0) {
		gboolean get_iter_result;
		has_iter = TRUE;
		get_iter_result = gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, path);
		g_assert (get_iter_result);
	}

	gtk_tree_model_rows_reordered (GTK_TREE_MODEL (model),
				       path, has_iter ? &iter : NULL, new_order);

	g_free (old_order);
	g_free (new_order);
}
Пример #7
0
static void
photos_base_manager_default_add_object (PhotosBaseManager *self, GObject *object)
{
  PhotosBaseManagerPrivate *priv;
  GObject *old_object;
  GSequenceIter *iter;
  PhotosBaseManagerObjectData *object_data;
  const gchar *id;
  guint position;

  priv = photos_base_manager_get_instance_private (self);

  id = photos_filterable_get_id (PHOTOS_FILTERABLE (object));
  old_object = photos_base_manager_get_object_by_id (self, id);
  if (old_object != NULL)
    return;

  if (priv->sort_func == NULL)
    {
      position = photos_base_manager_get_objects_count (self);
      iter = g_sequence_append (priv->sequence, g_object_ref (object));
    }
  else
    {
      iter = g_sequence_insert_sorted (priv->sequence, g_object_ref (object), priv->sort_func, priv->sort_data);
      position = g_sequence_iter_get_position (iter);
    }

  object_data = photos_base_manager_object_data_new (object, iter);
  g_hash_table_insert (priv->objects, g_strdup (id), object_data);

  photos_base_manager_objects_changed (self, position, 0, 1);
  g_signal_emit (self, signals[OBJECT_ADDED], 0, object);
}
Пример #8
0
static GtkTreePath *
nemo_list_model_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter)
{
	GtkTreePath *path;
	NemoListModel *model;
	GSequenceIter *ptr;
	FileEntry *file_entry;


	model = (NemoListModel *)tree_model;
	
	g_return_val_if_fail (iter->stamp == model->details->stamp, NULL);

	if (g_sequence_iter_is_end (iter->user_data)) {
		/* FIXME is this right? */
		return NULL;
	}
	
	path = gtk_tree_path_new ();
	ptr = iter->user_data;
	while (ptr != NULL) {
		gtk_tree_path_prepend_index (path, g_sequence_iter_get_position (ptr));
		file_entry = g_sequence_get (ptr);
		if (file_entry->parent != NULL) {
			ptr = file_entry->parent->ptr;
		} else {
			ptr = NULL;
		}
	}

	return path;
}
Пример #9
0
static void
photos_base_manager_default_remove_object_by_id (PhotosBaseManager *self, const gchar *id)
{
  PhotosBaseManagerPrivate *priv;
  GObject *object;
  PhotosBaseManagerObjectData *object_data;
  guint position;

  priv = photos_base_manager_get_instance_private (self);

  object_data = g_hash_table_lookup (priv->objects, id);
  if (object_data == NULL)
    return;

  position = g_sequence_iter_get_position (object_data->iter);
  g_sequence_remove (object_data->iter);

  object = g_object_ref (object_data->object);
  g_hash_table_remove (priv->objects, id);

  photos_base_manager_objects_changed (self, position, 1, 0);
  g_signal_emit (self, signals[OBJECT_REMOVED], 0, object);

  g_object_unref (object);
}
Пример #10
0
static void
bt_pattern_list_model_add (BtPatternListModel * model, BtCmdPattern * pattern)
{
  GSequence *seq = model->priv->seq;
  GtkTreePath *path;
  GtkTreeIter iter;
  gint position;

  // check if pattern is internal
  if (model->priv->skip_internal) {
    if (!BT_IS_PATTERN (pattern)) {
      GST_INFO ("not adding internal pattern to model");
      return;
    }
  }

  GST_INFO ("add pattern to model");

  // insert new entry
  iter.stamp = model->priv->stamp;
  iter.user_data =
      g_sequence_insert_sorted (seq, pattern, model_item_cmp, NULL);
  position = g_sequence_iter_get_position (iter.user_data);

  g_signal_connect_object (pattern, "notify::name",
      G_CALLBACK (on_pattern_name_changed), (gpointer) model, 0);

  // signal to the view/app
  path = gtk_tree_path_new ();
  gtk_tree_path_append_index (path, position);
  gtk_tree_model_row_inserted (GTK_TREE_MODEL (model), path, &iter);
  gtk_tree_path_free (path);
  GST_DEBUG ("inserted pattern %p at position %d", pattern, position);
}
Пример #11
0
static void
ide_recent_projects_added (IdeRecentProjects *self,
                           IdeProjectInfo    *project_info)
{
  g_autofree gchar *uri = NULL;
  GFile *file;

  g_assert (IDE_IS_RECENT_PROJECTS (self));
  g_assert (IDE_IS_PROJECT_INFO (project_info));

  file = ide_project_info_get_file (project_info);
  uri = g_file_get_uri (file);

  if (!g_hash_table_contains (self->recent_uris, uri))
    {
      GSequenceIter *iter;
      gint position;

      iter = g_sequence_insert_sorted (self->projects,
                                       g_object_ref (project_info),
                                       (GCompareDataFunc)ide_project_info_compare,
                                       NULL);
      position = g_sequence_iter_get_position (iter);
      g_list_model_items_changed (G_LIST_MODEL (self), position, 0, 1);
    }
}
Пример #12
0
static GtkTreePath *_is_store_get_path(GtkTreeModel *tree_model,
				       GtkTreeIter *iter)
{
	IsStore *self;
	IsStorePrivate *priv;
	GtkTreePath *path;
	GSequenceIter *entry_iter;

	g_return_val_if_fail(IS_IS_STORE(tree_model), NULL);
	g_return_val_if_fail(iter != NULL, NULL);

	self = IS_STORE(tree_model);
	priv = self->priv;

	g_return_val_if_fail(iter->stamp == priv->stamp, NULL);
	g_assert(iter->user_data);

	path = gtk_tree_path_new();
	entry_iter = (GSequenceIter *)iter->user_data;

	while (entry_iter != NULL) {
		IsStoreEntry *entry;

		gtk_tree_path_prepend_index(path,
					    g_sequence_iter_get_position(entry_iter));
		entry = (IsStoreEntry *)g_sequence_get(entry_iter);
		entry_iter = entry->parent;
	}

	return path;
}
Пример #13
0
static void
bt_pattern_list_model_tree_model_get_value (GtkTreeModel * tree_model,
    GtkTreeIter * iter, gint column, GValue * value)
{
  BtPatternListModel *model = BT_PATTERN_LIST_MODEL (tree_model);
  BtPattern *pattern;

  g_return_if_fail (column < N_COLUMNS);

  g_value_init (value, model->priv->param_types[column]);

  if ((pattern = g_sequence_get (iter->user_data))) {

    switch (column) {
      case BT_PATTERN_LIST_MODEL_LABEL:
        g_object_get_property ((GObject *) pattern, "name", value);
        break;
      case BT_PATTERN_LIST_MODEL_IS_USED:{
        gboolean is_used = FALSE;

        if (!model->priv->skip_internal) {
          /* treat internal patterns as always used */
          is_used = !BT_IS_PATTERN (pattern);
        }
        if (!is_used && model->priv->sequence) {
          is_used =
              bt_sequence_is_pattern_used (model->priv->sequence, pattern);
        }
        g_value_set_boolean (value, is_used);
        break;
      }
      case BT_PATTERN_LIST_MODEL_IS_UNUSED:{
        gboolean is_used = FALSE;

        if (!model->priv->skip_internal) {
          /* treat internal patterns as always used */
          is_used = !BT_IS_PATTERN (pattern);
        }
        if (!is_used && model->priv->sequence) {
          is_used =
              bt_sequence_is_pattern_used (model->priv->sequence, pattern);
        }
        g_value_set_boolean (value, !is_used);
        break;
      }
      case BT_PATTERN_LIST_MODEL_SHORTCUT:{
        gchar key[2] = { 0, };
        gint index;

        index = g_sequence_iter_get_position (iter->user_data);
        key[0] = (index < 64) ? model->priv->pattern_keys[index] : ' ';
        g_value_set_string (value, key);
        break;
      }
    }
  }
}
Пример #14
0
void fm_folder_model_sort(FmFolderModel* model)
{
    GHashTable* old_order;
    gint *new_order;
    GSequenceIter *items_it;
    GtkTreePath *path;

    /* if there is only one item */
    if( model->items == NULL || g_sequence_get_length(model->items) <= 1 )
        return;

    old_order = g_hash_table_new(g_direct_hash, g_direct_equal);
    /* save old order */
    items_it = g_sequence_get_begin_iter(model->items);
    while( !g_sequence_iter_is_end(items_it) )
    {
        int i = g_sequence_iter_get_position(items_it);
        g_hash_table_insert( old_order, items_it, GINT_TO_POINTER(i) );
        items_it = g_sequence_iter_next(items_it);
    }

    /* sort the list */
    g_sequence_sort(model->items, fm_folder_model_compare, model);

    /* save new order */
    new_order = g_new( int, g_sequence_get_length(model->items) );
    items_it = g_sequence_get_begin_iter(model->items);
    while( !g_sequence_iter_is_end(items_it) )
    {
        int i = g_sequence_iter_get_position(items_it);
        new_order[i] = (guint)g_hash_table_lookup(old_order, items_it);
        items_it = g_sequence_iter_next(items_it);
    }
    g_hash_table_destroy(old_order);
    path = gtk_tree_path_new();
    gtk_tree_model_rows_reordered(GTK_TREE_MODEL(model),
                                  path, NULL, new_order);
    gtk_tree_path_free(path);
    g_free(new_order);
}
Пример #15
0
GtkTreePath *fm_folder_model_get_path(GtkTreeModel *tree_model,
                                      GtkTreeIter *iter)
{
    GtkTreePath* path;
    GSequenceIter* items_it;
    FmFolderModel* model = FM_FOLDER_MODEL(tree_model);

    g_return_val_if_fail(model, NULL);
    g_return_val_if_fail(iter->stamp == model->stamp, NULL);
    g_return_val_if_fail(iter != NULL, NULL);
    g_return_val_if_fail(iter->user_data != NULL, NULL);

    items_it = (GSequenceIter*)iter->user_data;
    path = gtk_tree_path_new();
    gtk_tree_path_append_index( path, g_sequence_iter_get_position(items_it) );
    return path;
}
Пример #16
0
static GtkTreePath *
bt_pattern_list_model_tree_model_get_path (GtkTreeModel * tree_model,
    GtkTreeIter * iter)
{
  BtPatternListModel *model = BT_PATTERN_LIST_MODEL (tree_model);
  GtkTreePath *path;

  g_return_val_if_fail (iter->stamp == model->priv->stamp, NULL);

  if (g_sequence_iter_is_end (iter->user_data))
    return NULL;

  path = gtk_tree_path_new ();
  gtk_tree_path_append_index (path,
      g_sequence_iter_get_position (iter->user_data));

  return path;
}
Пример #17
0
static void
on_pattern_name_changed (BtPattern * pattern, GParamSpec * arg,
    gpointer user_data)
{
  BtPatternListModel *model = BT_PATTERN_LIST_MODEL (user_data);
  GSequence *seq = model->priv->seq;
  GtkTreePath *path;
  GtkTreeIter iter;
  gint pos1, pos2 = -1, len;

  // find the item by pattern (cannot use model_item_cmp, as id has changed)
  iter.stamp = model->priv->stamp;
  len = g_sequence_get_length (seq);
  for (pos1 = 0; pos1 < len; pos1++) {
    iter.user_data = g_sequence_get_iter_at_pos (seq, pos1);
    if (g_sequence_get (iter.user_data) == pattern) {
      g_sequence_sort_changed (iter.user_data, model_item_cmp, NULL);
      pos2 = g_sequence_iter_get_position (iter.user_data);
      break;
    }
  }
  if (G_UNLIKELY (pos2 == -1))
    return;

  GST_DEBUG ("pos %d -> %d", pos1, pos2);

  // signal updates
  if (pos1 != pos2) {
    path = gtk_tree_path_new ();
    gtk_tree_path_append_index (path, pos1);
    gtk_tree_model_row_deleted (GTK_TREE_MODEL (model), path);
    gtk_tree_path_free (path);
    path = gtk_tree_path_new ();
    gtk_tree_path_append_index (path, pos2);
    gtk_tree_model_row_inserted (GTK_TREE_MODEL (model), path, &iter);
    gtk_tree_path_free (path);
  } else {
    path = gtk_tree_path_new ();
    gtk_tree_path_append_index (path, pos2);
    gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter);
    gtk_tree_path_free (path);
  }
}
Пример #18
0
gboolean
egg_sorted_hash_remove (EggSortedHash *hash,
                        gpointer       key,
                        guint         *position)
{
  GSequenceIter *it;

  it = g_hash_table_lookup (hash->iters, key);
  if (it)
    {
      if (position)
        *position = g_sequence_iter_get_position (it);

      g_sequence_remove (it);
      g_hash_table_remove (hash->iters, key);

      return TRUE;
    }

  return FALSE;
}
Пример #19
0
void _fm_folder_model_insert_item(FmFolder* dir,
                                  FmFolderItem* new_item,
                                  FmFolderModel* model)
{
    GList* l;
    GtkTreeIter it;
    GtkTreePath* path;
    FmFolderItem* item;
    FmFileInfo* file = new_item->inf;

    GSequenceIter *item_it = g_sequence_insert_sorted(model->items, new_item, fm_folder_model_compare, model);
    new_item->iter = item_it;
    new_item->iter_age = model->iter_age;

    it.stamp = model->stamp;
    it.user_data  = item_it;

    path = gtk_tree_path_new_from_indices(g_sequence_iter_get_position(item_it), -1);
    gtk_tree_model_row_inserted(GTK_TREE_MODEL(model), path, &it);
    gtk_tree_path_free(path);
}
Пример #20
0
static void
bt_pattern_list_model_rem (BtPatternListModel * model, BtPattern * pattern)
{
  GSequence *seq = model->priv->seq;
  GtkTreePath *path;
  GSequenceIter *iter;
  gint position;

  GST_INFO ("removing pattern from model");

  // remove entry
  iter = g_sequence_lookup (seq, pattern, model_item_cmp, NULL);
  position = g_sequence_iter_get_position (iter);
  g_sequence_remove (iter);

  // signal to the view/app
  path = gtk_tree_path_new ();
  gtk_tree_path_append_index (path, position);
  gtk_tree_model_row_deleted (GTK_TREE_MODEL (model), path);
  gtk_tree_path_free (path);

  GST_INFO ("removed pattern from model at pos %d ", position);
}
Пример #21
0
void fm_folder_model_file_changed(FmFolderModel* model, FmFileInfo* file)
{
    FmFolderItem* item;
    GSequenceIter* items_it;
    GtkTreeIter it;
    GtkTreePath* path;

    if( !model->show_hidden && fm_file_info_is_hidden(file) )
        return;

    items_it = g_sequence_get_begin_iter(model->items);
    /* FIXME: write a  GCompareDataFunc for this */
    while( !g_sequence_iter_is_end(items_it) )
    {
        item = (FmFolderItem*)g_sequence_get(items_it);
        if( item->inf == file )
            break;
        items_it = g_sequence_iter_next(items_it);
    }

    if( items_it == g_sequence_get_end_iter(model->items) )
        return;

    /* update the icon */
    if( item->icon )
    {
        g_object_unref(item->icon);
        item->icon = NULL;
    }
    it.stamp = model->stamp;
    it.user_data  = items_it;

    path = gtk_tree_path_new_from_indices(g_sequence_iter_get_position(items_it), -1);
    gtk_tree_model_row_changed(GTK_TREE_MODEL(model), path, &it);
    gtk_tree_path_free(path);
}