[gtk+] toolbar: Switch from get_path_for_child() to css node managing



commit 8e87988179defdc7fd056300fb418d2a5f4c44a7
Author: Benjamin Otte <otte redhat com>
Date:   Sun Jul 12 23:11:24 2015 +0200

    toolbar: Switch from get_path_for_child() to css node managing

 gtk/gtktoolbar.c |  158 +++++-------------------------------------------------
 1 files changed, 13 insertions(+), 145 deletions(-)
---
diff --git a/gtk/gtktoolbar.c b/gtk/gtktoolbar.c
index 295a0a7..4c8674f 100644
--- a/gtk/gtktoolbar.c
+++ b/gtk/gtktoolbar.c
@@ -39,6 +39,7 @@
 #include "gtkbindings.h"
 #include "gtkbox.h"
 #include "gtkcontainerprivate.h"
+#include "gtkcssnodeprivate.h"
 #include "gtkimage.h"
 #include "gtkintl.h"
 #include "gtklabel.h"
@@ -227,10 +228,6 @@ static void       gtk_toolbar_forall               (GtkContainer        *contain
                                                    GtkCallback          callback,
                                                    gpointer             callback_data);
 static GType      gtk_toolbar_child_type           (GtkContainer        *container);
-static GtkWidgetPath * gtk_toolbar_get_path_for_child
-                                                  (GtkContainer        *container,
-                                                   GtkWidget           *child);
-static void       gtk_toolbar_invalidate_order    (GtkToolbar           *toolbar);
 
 static void       gtk_toolbar_direction_changed    (GtkWidget           *widget,
                                                     GtkTextDirection     previous_direction);
@@ -406,7 +403,6 @@ gtk_toolbar_class_init (GtkToolbarClass *klass)
   container_class->child_type = gtk_toolbar_child_type;
   container_class->get_child_property = gtk_toolbar_get_child_property;
   container_class->set_child_property = gtk_toolbar_set_child_property;
-  container_class->get_path_for_child = gtk_toolbar_get_path_for_child;
 
   klass->orientation_changed = gtk_toolbar_orientation_changed;
   klass->style_changed = gtk_toolbar_real_style_changed;
@@ -3185,16 +3181,6 @@ struct _ToolbarContent
   guint          has_menu : 2;
 };
 
-static void
-toolbar_item_visiblity_notify_cb (GObject *obj,
-                                  GParamSpec *pspec,
-                                  gpointer user_data)
-{
-  GtkToolbar *toolbar = user_data;
-
-  gtk_toolbar_invalidate_order (toolbar);
-}
-
 static ToolbarContent *
 toolbar_content_new_tool_item (GtkToolbar  *toolbar,
                               GtkToolItem *item,
@@ -3202,7 +3188,7 @@ toolbar_content_new_tool_item (GtkToolbar  *toolbar,
                               gint         pos)
 {
   GtkToolbarPrivate *priv = toolbar->priv;
-  ToolbarContent *content;
+  ToolbarContent *content, *previous;
 
   content = g_slice_new0 (ToolbarContent);
   
@@ -3210,13 +3196,19 @@ toolbar_content_new_tool_item (GtkToolbar  *toolbar,
   content->item = item;
   content->is_placeholder = is_placeholder;
 
+  previous = pos > 0 ? g_list_nth_data (priv->content, -1) : NULL;
   priv->content = g_list_insert (priv->content, content, pos);
 
-  gtk_widget_set_parent (GTK_WIDGET (item), GTK_WIDGET (toolbar));
-  gtk_toolbar_invalidate_order (toolbar);
+  if (gtk_widget_get_direction (GTK_WIDGET (toolbar)) == GTK_TEXT_DIR_RTL)
+    gtk_css_node_insert_after (gtk_widget_get_css_node (GTK_WIDGET (toolbar)),
+                               gtk_widget_get_css_node (GTK_WIDGET (item)),
+                               previous ? gtk_widget_get_css_node (GTK_WIDGET (previous->item)) : NULL);
+  else
+    gtk_css_node_insert_before (gtk_widget_get_css_node (GTK_WIDGET (toolbar)),
+                                gtk_widget_get_css_node (GTK_WIDGET (item)),
+                                previous ? gtk_widget_get_css_node (GTK_WIDGET (previous->item)) : NULL);
 
-  g_signal_connect (content->item, "notify::visible",
-                    G_CALLBACK (toolbar_item_visiblity_notify_cb), toolbar);
+  gtk_widget_set_parent (GTK_WIDGET (item), GTK_WIDGET (toolbar));
 
   if (!is_placeholder)
     {
@@ -3237,13 +3229,8 @@ toolbar_content_remove (ToolbarContent *content,
 {
   GtkToolbarPrivate *priv = toolbar->priv;
 
-  gtk_toolbar_invalidate_order (toolbar);
   gtk_widget_unparent (GTK_WIDGET (content->item));
 
-  g_signal_handlers_disconnect_by_func (content->item,
-                                        toolbar_item_visiblity_notify_cb,
-                                        toolbar);
-
   priv->content = g_list_remove (priv->content, content);
 
   if (!toolbar_content_is_placeholder (content))
@@ -3759,131 +3746,12 @@ toolbar_rebuild_menu (GtkToolShell *shell)
   gtk_widget_queue_resize (GTK_WIDGET (shell));
 }
 
-typedef struct _CountingData CountingData;
-struct _CountingData {
-  GtkWidget *widget;
-  gboolean found;
-  guint before;
-  guint after;
-};
-
-static void
-count_widget_position (GtkWidget *widget,
-                       gpointer   data)
-{
-  CountingData *count = data;
-
-  if (!gtk_widget_get_visible (widget))
-    return;
-
-  if (count->widget == widget)
-    count->found = TRUE;
-  else if (count->found)
-    count->after++;
-  else
-    count->before++;
-}
-
-static guint
-gtk_toolbar_get_visible_position (GtkToolbar *toolbar,
-                                  GtkWidget  *child)
-{
-  CountingData count = { child, FALSE, 0, 0 };
-
-  if (child == (GtkWidget*)toolbar->priv->highlight_tool_item)
-    return 0;
-
-  /* foreach iterates in visible order */
-  gtk_container_forall (GTK_CONTAINER (toolbar),
-                        count_widget_position,
-                        &count);
-
-  g_assert (count.found);
-
-  if (toolbar->priv->orientation == GTK_ORIENTATION_HORIZONTAL &&
-      gtk_widget_get_direction (GTK_WIDGET (toolbar)) == GTK_TEXT_DIR_RTL)
-    return count.after;
-
-  return count.before;
-}
-
-static void
-add_widget_to_path (gpointer data,
-                    gpointer user_data)
-{
-  GtkWidget *widget = data;
-  GtkWidgetPath *path = user_data;
-
-  if (gtk_widget_get_visible (widget))
-    gtk_widget_path_append_for_widget (path, widget);
-}
-
-static GtkWidgetPath *
-gtk_toolbar_get_path_for_child (GtkContainer *container,
-                                GtkWidget    *child)
-{
-  GtkWidgetPath *path;
-  GtkToolbar *toolbar;
-  GtkToolbarPrivate *priv;
-  GtkWidgetPath *sibling_path;
-  gint vis_index;
-  GList *children;
-
-  toolbar = GTK_TOOLBAR (container);
-  priv = toolbar->priv;
-
-  /* build a path for all the visible children;
-   * get_children works in visible order
-   */
-  sibling_path = gtk_widget_path_new ();
-  children = _gtk_container_get_all_children (container);
-
-  if (priv->orientation != GTK_ORIENTATION_HORIZONTAL ||
-      gtk_widget_get_direction (GTK_WIDGET (toolbar)) != GTK_TEXT_DIR_RTL)
-    children = g_list_reverse (children);
-
-  g_list_foreach (children, add_widget_to_path, sibling_path);
-  g_list_free (children);
-
-  path = _gtk_widget_create_path (GTK_WIDGET (container));
-  if (gtk_widget_get_visible (child))
-    {
-      vis_index = gtk_toolbar_get_visible_position (toolbar, child);
-
-      if (vis_index < gtk_widget_path_length (sibling_path))
-        gtk_widget_path_append_with_siblings (path,
-                                              sibling_path,
-                                              vis_index);
-      else
-        gtk_widget_path_append_for_widget (path, child);
-    }
-  else
-    gtk_widget_path_append_for_widget (path, child);
-
-  gtk_widget_path_unref (sibling_path);
-  return path;
-}
-
-static void
-gtk_toolbar_invalidate_order_foreach (GtkWidget *widget)
-{
-  _gtk_widget_invalidate_style_context (widget, GTK_CSS_CHANGE_POSITION | GTK_CSS_CHANGE_SIBLING_POSITION);
-}
-
-static void
-gtk_toolbar_invalidate_order (GtkToolbar *toolbar)
-{
-  gtk_container_forall (GTK_CONTAINER (toolbar),
-                        (GtkCallback) gtk_toolbar_invalidate_order_foreach,
-                        NULL);
-}
-
 static void
 gtk_toolbar_direction_changed (GtkWidget        *widget,
                                GtkTextDirection  previous_direction)
 {
   GTK_WIDGET_CLASS (gtk_toolbar_parent_class)->direction_changed (widget, previous_direction);
 
-  gtk_toolbar_invalidate_order (GTK_TOOLBAR (widget));
+  gtk_css_node_reverse_children (gtk_widget_get_css_node (widget));
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]