diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h index a2d6d6c80a..fa35a99205 100644 --- a/gtk/gtktreeprivate.h +++ b/gtk/gtktreeprivate.h @@ -142,7 +142,6 @@ void _gtk_tree_view_column_push_padding (GtkTreeViewColumn gint _gtk_tree_view_column_get_requested_width (GtkTreeViewColumn *column); gint _gtk_tree_view_column_get_drag_x (GtkTreeViewColumn *column); GtkCellAreaContext *_gtk_tree_view_column_get_context (GtkTreeViewColumn *column); -void _gtk_tree_view_reset_header_styles (GtkTreeView *tree_view); G_END_DECLS diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index ecac8cf7b0..a9ba64760c 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -294,6 +294,9 @@ struct _GtkTreeViewPrivate GtkPixelCache *pixel_cache; + /* CSS nodes */ + GtkCssNode *column_header_node; + /* Scroll position state keeping */ GtkTreeRowReference *top_row; gint top_row_dy; @@ -588,8 +591,6 @@ static gboolean gtk_tree_view_enter_notify (GtkWidget *widget, GdkEventCrossing *event); static gboolean gtk_tree_view_leave_notify (GtkWidget *widget, GdkEventCrossing *event); -static GtkWidgetPath * gtk_tree_view_get_path_for_child (GtkContainer *container, - GtkWidget *child); static void gtk_tree_view_set_focus_child (GtkContainer *container, GtkWidget *child); @@ -988,7 +989,6 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) container_class->remove = gtk_tree_view_remove; container_class->forall = gtk_tree_view_forall; container_class->set_focus_child = gtk_tree_view_set_focus_child; - container_class->get_path_for_child = gtk_tree_view_get_path_for_child; class->move_cursor = gtk_tree_view_real_move_cursor; class->select_all = gtk_tree_view_real_select_all; @@ -1758,6 +1758,7 @@ static void gtk_tree_view_init (GtkTreeView *tree_view) { GtkTreeViewPrivate *priv; + GtkCssNode *widget_node; priv = tree_view->priv = gtk_tree_view_get_instance_private (tree_view); @@ -1820,6 +1821,13 @@ gtk_tree_view_init (GtkTreeView *tree_view) gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (tree_view)), GTK_STYLE_CLASS_VIEW); + widget_node = gtk_widget_get_css_node (GTK_WIDGET (tree_view)); + priv->column_header_node = gtk_css_node_new (); + gtk_css_node_set_name (priv->column_header_node, g_intern_string ("column-header")); + gtk_css_node_set_parent (priv->column_header_node, widget_node); + gtk_css_node_set_state (priv->column_header_node, gtk_css_node_get_state (widget_node)); + g_object_unref (priv->column_header_node); + priv->multipress_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (tree_view)); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->multipress_gesture), 0); g_signal_connect (priv->multipress_gesture, "pressed", @@ -8716,67 +8724,6 @@ gtk_tree_view_set_focus_child (GtkContainer *container, GTK_CONTAINER_CLASS (gtk_tree_view_parent_class)->set_focus_child (container, child); } -static GtkWidgetPath * -gtk_tree_view_get_path_for_child (GtkContainer *container, - GtkWidget *child) -{ - GtkTreeView *tree_view = GTK_TREE_VIEW (container); - GtkWidgetPath *path; - gboolean rtl; - GList *list, *visible_columns = NULL; - gint n_col = 0; - - path = GTK_CONTAINER_CLASS (gtk_tree_view_parent_class)->get_path_for_child (container, child); - rtl = (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL); - - for (list = tree_view->priv->columns; list; list = list->next) - { - GtkTreeViewColumn *column = list->data; - - if (gtk_tree_view_column_get_visible (column)) - visible_columns = g_list_prepend (visible_columns, column); - else if (gtk_tree_view_column_get_widget (column) == child || - gtk_tree_view_column_get_button (column) == child) -G_GNUC_BEGIN_IGNORE_DEPRECATIONS - gtk_widget_path_iter_add_region (path, gtk_widget_path_length (path) - 2, GTK_STYLE_REGION_COLUMN_HEADER, 0); -G_GNUC_END_IGNORE_DEPRECATIONS - } - - if (!rtl) - visible_columns = g_list_reverse (visible_columns); - - for (list = visible_columns; list != NULL; list = list->next) - { - GtkTreeViewColumn *column = list->data; - GtkRegionFlags flags = 0; - - n_col++; - - if (gtk_tree_view_column_get_widget (column) != child && - gtk_tree_view_column_get_button (column) != child) - continue; - - if ((n_col % 2) == 0) - flags |= GTK_REGION_EVEN; - else - flags |= GTK_REGION_ODD; - - if (n_col == 1) - flags |= GTK_REGION_FIRST; - - if (!list->next) - flags |= GTK_REGION_LAST; - -G_GNUC_BEGIN_IGNORE_DEPRECATIONS - gtk_widget_path_iter_add_region (path, gtk_widget_path_length (path) - 2, GTK_STYLE_REGION_COLUMN_HEADER, flags); -G_GNUC_END_IGNORE_DEPRECATIONS - break; - } - g_list_free (visible_columns); - - return path; -} - static gboolean gtk_tree_view_real_move_cursor (GtkTreeView *tree_view, GtkMovementStep step, @@ -11964,29 +11911,6 @@ gtk_tree_view_append_column (GtkTreeView *tree_view, return gtk_tree_view_insert_column (tree_view, column, -1); } -void -_gtk_tree_view_reset_header_styles (GtkTreeView *tree_view) -{ - GList *columns; - - for (columns = tree_view->priv->columns; columns; columns = columns->next) - { - GtkTreeViewColumn *column = columns->data; - GtkWidget *header_widget; - - if (!gtk_tree_view_column_get_visible (column)) - continue; - - header_widget = gtk_tree_view_column_get_widget (column); - - if (!header_widget) - header_widget = gtk_tree_view_column_get_button (column); - - _gtk_widget_invalidate_style_context (header_widget, GTK_CSS_CHANGE_PARENT_REGION); - } -} - - /** * gtk_tree_view_remove_column: * @tree_view: A #GtkTreeView. @@ -12054,7 +11978,6 @@ gtk_tree_view_remove_column (GtkTreeView *tree_view, gtk_widget_queue_resize (GTK_WIDGET (tree_view)); } - _gtk_tree_view_reset_header_styles (tree_view); _gtk_tree_view_accessible_remove_column (tree_view, column, position); g_object_unref (column); @@ -12063,6 +11986,22 @@ gtk_tree_view_remove_column (GtkTreeView *tree_view, return tree_view->priv->n_columns; } +static void +gtk_tree_view_update_button_position (GtkTreeView *tree_view, + GtkTreeViewColumn *column) +{ + GtkTreeViewPrivate *priv = tree_view->priv; + GList *column_el; + + column_el = g_list_find (priv->columns, column); + g_return_if_fail (column_el != NULL); + + gtk_css_node_insert_after (priv->column_header_node, + gtk_widget_get_css_node (gtk_tree_view_column_get_button (column)), + column_el->prev ? gtk_widget_get_css_node ( + gtk_tree_view_column_get_button (column_el->prev->data)) : NULL); +} + /** * gtk_tree_view_insert_column: * @tree_view: A #GtkTreeView. @@ -12110,6 +12049,8 @@ gtk_tree_view_insert_column (GtkTreeView *tree_view, _gtk_tree_view_column_set_tree_view (column, tree_view); + gtk_tree_view_update_button_position (tree_view, column); + if (gtk_widget_get_realized (GTK_WIDGET (tree_view))) { GList *list; @@ -12125,8 +12066,6 @@ gtk_tree_view_insert_column (GtkTreeView *tree_view, gtk_widget_queue_resize (GTK_WIDGET (tree_view)); } - _gtk_tree_view_reset_header_styles (tree_view); - _gtk_tree_view_accessible_add_column (tree_view, column, position); g_signal_emit (tree_view, tree_view_signals[COLUMNS_CHANGED], 0); @@ -12338,14 +12277,14 @@ gtk_tree_view_move_column_after (GtkTreeView *tree_view, base_el->next = column_list_el; } + gtk_tree_view_update_button_position (tree_view, column); + if (gtk_widget_get_realized (GTK_WIDGET (tree_view))) { gtk_widget_queue_resize (GTK_WIDGET (tree_view)); gtk_tree_view_size_allocate_columns (GTK_WIDGET (tree_view), NULL); } - _gtk_tree_view_reset_header_styles (tree_view); - _gtk_tree_view_accessible_reorder_column (tree_view, column); g_signal_emit (tree_view, tree_view_signals[COLUMNS_CHANGED], 0); diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index b56819d4ca..d5e9ae1109 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -1890,7 +1890,6 @@ gtk_tree_view_column_set_visible (GtkTreeViewColumn *tree_column, if (priv->tree_view) { - _gtk_tree_view_reset_header_styles (GTK_TREE_VIEW (priv->tree_view)); _gtk_tree_view_accessible_toggle_visibility (GTK_TREE_VIEW (priv->tree_view), tree_column); } diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss index d4036a96a4..cdd1cce7e0 100644 --- a/gtk/theme/Adwaita/_common.scss +++ b/gtk/theme/Adwaita/_common.scss @@ -1403,8 +1403,8 @@ column-header { @extend column-header.button.dnd; } } - &:last-child .button, - &:last-child .button:backdrop, // set :backdrop too or the border will be visibile there + & .button:last-child, + & .button:last-child:backdrop, // set :backdrop too or the border will be visibile there &:last-child.button, &:last-child.button:backdrop { //treeview-like derived widgets in Banshee and Evolution border-right-style: none; diff --git a/gtk/theme/Adwaita/gtk-contained-dark.css b/gtk/theme/Adwaita/gtk-contained-dark.css index 5ed13aab28..3807d15eba 100644 --- a/gtk/theme/Adwaita/gtk-contained-dark.css +++ b/gtk/theme/Adwaita/gtk-contained-dark.css @@ -1882,9 +1882,9 @@ column-header .titlebar .button.titlebutton, .titlebar column-header .button.titlebutton:active { color: #eeeeec; transition: none; } -column-header:last-child .button, column-header:last-child .header-bar .button.titlebutton, .header-bar column-header:last-child .button.titlebutton, -column-header:last-child .titlebar .button.titlebutton, -.titlebar column-header:last-child .button.titlebutton, column-header:last-child .button:backdrop, column-header:last-child.button, .header-bar column-header.button.titlebutton:last-child, +column-header .button:last-child, column-header .header-bar .button.titlebutton:last-child, .header-bar column-header .button.titlebutton:last-child, +column-header .titlebar .button.titlebutton:last-child, +.titlebar column-header .button.titlebutton:last-child, column-header .button:last-child:backdrop, column-header:last-child.button, .header-bar column-header.button.titlebutton:last-child, .titlebar column-header.button.titlebutton:last-child, column-header:last-child.button:backdrop { border-right-style: none; } diff --git a/gtk/theme/Adwaita/gtk-contained.css b/gtk/theme/Adwaita/gtk-contained.css index 08dfbb6e25..ef957950f8 100644 --- a/gtk/theme/Adwaita/gtk-contained.css +++ b/gtk/theme/Adwaita/gtk-contained.css @@ -1888,9 +1888,9 @@ column-header .titlebar .button.titlebutton, .titlebar column-header .button.titlebutton:active { color: #2e3436; transition: none; } -column-header:last-child .button, column-header:last-child .header-bar .button.titlebutton, .header-bar column-header:last-child .button.titlebutton, -column-header:last-child .titlebar .button.titlebutton, -.titlebar column-header:last-child .button.titlebutton, column-header:last-child .button:backdrop, column-header:last-child.button, .header-bar column-header.button.titlebutton:last-child, +column-header .button:last-child, column-header .header-bar .button.titlebutton:last-child, .header-bar column-header .button.titlebutton:last-child, +column-header .titlebar .button.titlebutton:last-child, +.titlebar column-header .button.titlebutton:last-child, column-header .button:last-child:backdrop, column-header:last-child.button, .header-bar column-header.button.titlebutton:last-child, .titlebar column-header.button.titlebutton:last-child, column-header:last-child.button:backdrop { border-right-style: none; } diff --git a/gtk/theme/HighContrast/_common.scss b/gtk/theme/HighContrast/_common.scss index 1867dd0ba3..edd9763889 100644 --- a/gtk/theme/HighContrast/_common.scss +++ b/gtk/theme/HighContrast/_common.scss @@ -1072,7 +1072,7 @@ column-header { color: $selected_fg_color; } } - &:last-child .button, + & :last-child.button, &:last-child.button { //treeview-like derived widgets in Banshee and Evolution border-right-style: none; } diff --git a/gtk/theme/HighContrast/gtk.css b/gtk/theme/HighContrast/gtk.css index 733de69696..af2b81a433 100644 --- a/gtk/theme/HighContrast/gtk.css +++ b/gtk/theme/HighContrast/gtk.css @@ -1268,7 +1268,7 @@ column-header .button { box-shadow: none; } column-header .button:active { color: #fff; } -column-header:last-child .button, column-header:last-child.button { +column-header :last-child.button, column-header:last-child.button { border-right-style: none; } column-header .button, column-header .button:hover, column-header .button:active {