[maemo-commits] [maemo-commits] r16078 - in projects/haf/trunk/gtk+: . gtk

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Wed Sep 10 00:18:43 EEST 2008
Author: kris
Date: 2008-09-10 00:18:39 +0300 (Wed, 10 Sep 2008)
New Revision: 16078

Modified:
   projects/haf/trunk/gtk+/ChangeLog
   projects/haf/trunk/gtk+/gtk/gtktreeview.c
Log:
2008-09-09  Kristian Rietveld  <kris at imendio.com>

	Make the combination of fixed-height-mode with row separator
	and/or row headers work nicely.  This fix also needs to go
	upstream in some form and with missing bits filled out.

	* gtk/gtktreeview.c (determine_row_height): new function,
	(gtk_tree_view_nodes_set_fixed_height): ditto, slower
	variant of _gtk_rbtree_set_fixed_height,
	(initialize_fixed_height_mode): search for first regular row
	to use for measuring the fixed height to use; use the slower
	set_fixed_height variant if a row separator or row header func
	has been set,
	(gtk_tree_view_row_changed),
	(gtk_tree_view_row_inserted): use determine_row_height() for
	getting a row's height if a row separator or row header func
	has been set.



Modified: projects/haf/trunk/gtk+/ChangeLog
===================================================================
--- projects/haf/trunk/gtk+/ChangeLog	2008-09-09 15:48:32 UTC (rev 16077)
+++ projects/haf/trunk/gtk+/ChangeLog	2008-09-09 21:18:39 UTC (rev 16078)
@@ -1,3 +1,21 @@
+2008-09-09  Kristian Rietveld  <kris at imendio.com>
+
+	Make the combination of fixed-height-mode with row separator
+	and/or row headers work nicely.  This fix also needs to go
+	upstream in some form and with missing bits filled out.
+
+	* gtk/gtktreeview.c (determine_row_height): new function,
+	(gtk_tree_view_nodes_set_fixed_height): ditto, slower
+	variant of _gtk_rbtree_set_fixed_height,
+	(initialize_fixed_height_mode): search for first regular row
+	to use for measuring the fixed height to use; use the slower
+	set_fixed_height variant if a row separator or row header func
+	has been set,
+	(gtk_tree_view_row_changed),
+	(gtk_tree_view_row_inserted): use determine_row_height() for
+	getting a row's height if a row separator or row header func
+	has been set.
+
 2008-09-03  Kristian Rietveld  <kris at gtk.org>
 
 	Fixes NB#87436: Enter key is not handled to check/uncheck the

Modified: projects/haf/trunk/gtk+/gtk/gtktreeview.c
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtktreeview.c	2008-09-09 15:48:32 UTC (rev 16077)
+++ projects/haf/trunk/gtk+/gtk/gtktreeview.c	2008-09-09 21:18:39 UTC (rev 16078)
@@ -6855,7 +6855,142 @@
     gtk_widget_queue_draw (GTK_WIDGET (tree_view));
 }
 
+#ifdef MAEMO_CHANGES
+/* You can pass in focus_pad, separator_height to save
+ * calls to gtk_widget_style_get() (especially for
+ * gtk_tree_view_nodes_set_fixed_height).
+ */
+static inline int
+determine_row_height (GtkTreeView *tree_view,
+                      GtkTreeIter *iter,
+                      int          focus_pad,
+                      int          separator_height)
+{
+  int height;
+  gboolean is_separator, is_header;
+
+  /* Determine the correct height for this node.  This is
+   * analogous to what is found in validate_row().
+   */
+  is_separator = row_is_separator (tree_view, iter, &is_header, NULL);
+
+  if (!is_separator)
+    height = tree_view->priv->fixed_height;
+  else if (is_header)
+    height = HILDON_ROW_HEADER_HEIGHT;
+  else
+    {
+      if (focus_pad == -1 || separator_height == -1)
+        gtk_widget_style_get (GTK_WIDGET (tree_view),
+                              "focus-padding", &focus_pad,
+                              "separator-height", &separator_height,
+                              NULL);
+
+      height = separator_height + 2 * focus_pad;
+    }
+
+  return height;
+}
+
+/* This function is basically an extended and non-recursive version of
+ * _gtk_rbtree_set_fixed_height() which also keeps track of the current
+ * iter.  We can then pass this iter in to the row separator and
+ * row header funcs.
+ */
 static void
+gtk_tree_view_nodes_set_fixed_height (GtkTreeView *tree_view)
+{
+  int focus_pad;
+  int separator_height;
+  GtkRBTree *tree;
+  GtkRBNode *node;
+  GtkTreeIter iter;
+
+  tree = tree_view->priv->tree;
+
+  if (tree == NULL)
+    return;
+
+  node = tree->root;
+  g_assert (node);
+
+  /* Rewind tree, we start at the first node */
+  while (node->left != tree->nil)
+    node = node->left;
+
+  gtk_tree_model_get_iter_first (tree_view->priv->model, &iter);
+
+  gtk_widget_style_get (GTK_WIDGET (tree_view),
+                        "focus-padding", &focus_pad,
+                        "separator-height", &separator_height,
+                        NULL);
+
+  /* This loop is equivalent to the one in bin_expose, but with
+   * the extra assertions removed.
+   */
+  do
+    {
+      if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID))
+        {
+          int height;
+
+          height = determine_row_height (tree_view, &iter,
+                                         focus_pad, separator_height);
+
+          _gtk_rbtree_node_set_height (tree, node, height);
+          _gtk_rbtree_node_mark_valid (tree, node);
+        }
+
+      if (node->children)
+        {
+          GtkTreeIter parent = iter;
+
+          tree = node->children;
+          node = tree->root;
+
+          g_assert (node != tree->nil);
+
+          while (node->left != tree->nil)
+            node = node->left;
+
+          gtk_tree_model_iter_children (tree_view->priv->model,
+                                        &iter, &parent);
+        }
+      else
+        {
+          gboolean done = FALSE;
+
+          do
+            {
+              node = _gtk_rbtree_next (tree, node);
+              if (node != NULL)
+                {
+                  gtk_tree_model_iter_next (tree_view->priv->model, &iter);
+                  done = TRUE;
+                }
+              else
+                {
+                  GtkTreeIter parent_iter = iter;
+
+                  node = tree->parent_node;
+                  tree = tree->parent_tree;
+
+                  if (!tree)
+                    /* We are done */
+                    return;
+
+                  gtk_tree_model_iter_parent (tree_view->priv->model,
+                                              &iter, &parent_iter);
+                }
+            }
+          while (!done);
+        }
+    }
+  while (TRUE);
+}
+#endif /* MAEMO_CHANGES */
+
+static void
 initialize_fixed_height_mode (GtkTreeView *tree_view)
 {
   if (!tree_view->priv->tree)
@@ -6873,6 +7008,31 @@
       node = tree->root;
 
       path = _gtk_tree_view_find_path (tree_view, tree, node);
+
+#ifdef MAEMO_CHANGES
+      /* Search for the first regular row */
+      while (node)
+        {
+          gboolean is_header, is_separator;
+
+          is_separator = row_is_separator (tree_view, NULL, &is_header, path);
+          if (!is_separator && !is_header)
+            break;
+
+          _gtk_rbtree_next_full (tree, node, &tree, &node);
+
+          gtk_tree_path_free (path);
+
+          if (node)
+            path = _gtk_tree_view_find_path (tree_view, tree, node);
+          else
+            path = NULL;
+        }
+
+      if  (!path)
+        return;
+#endif /* MAEMO_CHANGES */
+
       gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
 
       validate_row (tree_view, tree, node, &iter, path);
@@ -6882,6 +7042,16 @@
       tree_view->priv->fixed_height = ROW_HEIGHT (tree_view, GTK_RBNODE_GET_HEIGHT (node));
     }
 
+#ifdef MAEMO_CHANGES
+  /* If a separator or row header func has been set, we cannot
+   * uniformly set the same height on all rows.  We fall back to
+   * a slower alternative.
+   */
+  if (tree_view->priv->row_separator_func
+      || tree_view->priv->row_header_func)
+    gtk_tree_view_nodes_set_fixed_height (tree_view);
+  else
+#endif /* MAEMO_CHANGES */
    _gtk_rbtree_set_fixed_height (tree_view->priv->tree,
                                  tree_view->priv->fixed_height, TRUE);
 }
@@ -9105,6 +9275,17 @@
   if (tree_view->priv->fixed_height_mode
       && tree_view->priv->fixed_height >= 0)
     {
+#ifdef MAEMO_CHANGES
+      if (tree_view->priv->row_separator_func
+          || tree_view->priv->row_header_func)
+        {
+          int height;
+
+          height = determine_row_height (tree_view, iter, -1, -1);
+          _gtk_rbtree_node_set_height (tree, node, height);
+        }
+      else
+#endif /* !MAEMO_CHANGES */
       _gtk_rbtree_node_set_height (tree, node, tree_view->priv->fixed_height);
       if (GTK_WIDGET_REALIZED (tree_view))
 	gtk_tree_view_node_queue_redraw (tree_view, tree, node);
@@ -9157,7 +9338,17 @@
 
   if (tree_view->priv->fixed_height_mode
       && tree_view->priv->fixed_height >= 0)
+#ifdef MAEMO_CHANGES
+    {
+      if (tree_view->priv->row_separator_func
+          || tree_view->priv->row_header_func)
+        height = determine_row_height (tree_view, iter, -1, -1);
+      else
+        height = tree_view->priv->fixed_height;
+    }
+#else /* !MAEMO_CHANGES */
     height = tree_view->priv->fixed_height;
+#endif /* !MAEMO_CHANGES */
   else
     height = 0;
 


More information about the maemo-commits mailing list