On Friday 28 January 2005 12:19, Stefan Kost wrote:

Hi Stefan,

> This drives me mad. I use a TreeModelFilter to hide rows (to show only
> every, every 2nd, every 4th,...). When the user presses a key I'd like to
> change the content of the model (the real one). I use the code below. The
> problem is that when I hide nothing it works, but when e.g. hing every
> second row and entering something in the shown 2nd row (which is really the
> 4th row), the change ends up in the sencond row too.
>
> Is that a bug or am I missing something. It happens on gtk 2.4.9 and 2.6.1.

> GtkTreeModelFilter *filtered_store;
> GtkTreeModel *store;
> GtkTreePath *path;
> GtkTreeViewColumn *column;
> GtkTreeIter iter;
>
> filtered_store = GTK_TREE_MODEL_FILTER (gtk_tree_view_get_model (treeview));
> store = gtk_tree_model_filter_get_model (filtered_store);
>
> gtk_tree_view_get_cursor (treeview, &path, &column);
>
> if (path && column && gtk_tree_model_get_iter (store, &iter, path)) 
> { 
>   glong  track = get_track_from_somewhere();
>   glong  row;

>   gtk_tree_model_get (store, &iter, SEQUENCE_TABLE_POS, &row, -1);
>   // cursor is at track, row
>   gtk_list_store_set (GTK_LIST_STORE (store), &iter,
>     SEQUENCE_TABLE_PRE_CT+track,str, -1);
> }

It looks like a "thinko" on your part.

The tree view doesn't know that whatever it displays is a filter model that 
has another child model. For the treeview, there is only one model, and that 
is the filter model. That means that all tree paths you get from the tree 
view refer to a position (tree path) in the _filter model_. If the tree view 
says 'the cursor is in the second row', it means 'in the second row of the 
filter model'. It doesn't know that the second row of the filter model is in 
reality the 4th row of your underlying list store, nor does it need to know.

The problem starts here:

  gtk_tree_model_get_iter (store, &iter, path)

The tree view gives you a path that refers to the row layout in the filter 
model, but you get an iter from the underlying list store using that path.

What you need to do is something like:

   GtkTreeModel *filtermodel;
   GtkTreeIter  filter_iter, iter;

   filtermodel = GTK_TREE_MODEL (filtered_store);
   if (gtk_tree_model_get_iter (filtermodel, &filter_iter, path))
   {
       if (gtk_tree_model_convert_iter_to_child_iter (filtermodel, &iter, 
&filter_iter))
       {
           gtk_tree_model_get (store, &iter, ...., -1);
           gtk_list_store_set (GTK_LIST_STORE (store), &iter, ... -1);
       }
   }

Cheers
 -Tim
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to