Tree View Scrolling
- From: Eric Pastoor <epastoor vt edu>
- To: gtk-app-devel-list gnome org
- Subject: Tree View Scrolling
- Date: Tue, 3 Jun 2008 15:31:07 -0400
I am trying to get a GtkTree to show all of the children if possible
when the user expands the parent. This is my callback routine on the
row-expanded signal. The technique I thought I would use is to first
scroll the tree to the last row. Then scroll it back to the parent.
This would make sure that the parent is always visible and at least
at the top.
The gtk_tree_view_scroll_to_cell has an alignment boolean that seems
to make the change. However, I am getting a repainting effect when no
scrolling movement is necessary because everything is displayed.
Does anyone have a method to do this. When I tried using both of my
scroll for false on the alignment, nothing changed. The second
scroll back to the parent has to be true for any scrolling to take
place, but this is also what causes the screen to flash.
GtkTreeStore* treeStore = ftw->getGtkTreeStore();
GtkTreeModel* treeModel = GTK_TREE_MODEL(treeStore);
GtkTreeView* treeView = GTK_TREE_VIEW(ftw->getGtkTreeView());
GtkTreePath* iterPath =
gtk_tree_model_get_path(treeModel, startIter);
bool isRowExpanded = gtk_tree_view_row_expanded(treeView, iterPath);
gtk_tree_path_free(iterPath);
// This row should have been expanded already.
FATAL_ERROR_IF (NOT isRowExpanded);
bool iterHasChild = gtk_tree_model_iter_has_child(treeModel,
startIter);
if (iterHasChild)
{
int numChildren = gtk_tree_model_iter_n_children(treeModel,
startIter);
FATAL_ERROR_IF (numChildren <= 0);
GtkTreeIter iter;
bool valid =
gtk_tree_model_iter_nth_child(treeModel,
&iter,
startIter,
numChildren-1);
// valid is false when numChildren is too big, or startIter has no
children.
FATAL_ERROR_IF (NOT valid);
// Scroll to the last child to get it visible
iterPath = gtk_tree_model_get_path(treeModel, &iter);
gtk_tree_view_scroll_to_cell(treeView,
iterPath,
NULL,
false, // do not use align
0, // row align is ignored
0); // col align is ignored
gtk_tree_path_free(iterPath);
// Now scroll to the parent where we started. The effect of this is
to try
// to show the last child if possible while being able to see the
parent at
// the top.
iterPath = gtk_tree_model_get_path(treeModel, startIter);
gtk_tree_view_scroll_to_cell(treeView,
iterPath,
NULL,
true, // use align or these 2 scrolls cancel out
0, // row align is ignored
0.0); // col align is ignored
gtk_tree_path_free(iterPath);
}
Thanks for any help.
Eric
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]