[gtk+] treeview: Use a cssnode instead of regions
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] treeview: Use a cssnode instead of regions
- Date: Thu, 22 Oct 2015 14:53:59 +0000 (UTC)
commit 983de6f4a0bb76741965ceb683e58e46ccbb757d
Author: Benjamin Otte <otte redhat com>
Date: Sun Sep 6 07:36:57 2015 +0200
treeview: Use a cssnode instead of regions
This makes Treeview headers work again like before region support was
removed.
gtk/gtktreeprivate.h | 1 -
gtk/gtktreeview.c | 123 ++++++++----------------------
gtk/gtktreeviewcolumn.c | 1 -
gtk/theme/Adwaita/_common.scss | 4 +-
gtk/theme/Adwaita/gtk-contained-dark.css | 6 +-
gtk/theme/Adwaita/gtk-contained.css | 6 +-
gtk/theme/HighContrast/_common.scss | 2 +-
gtk/theme/HighContrast/gtk.css | 2 +-
8 files changed, 41 insertions(+), 104 deletions(-)
---
diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h
index a2d6d6c..fa35a99 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 ecac8cf..a9ba647 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 b56819d..d5e9ae1 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 d4036a9..cdd1cce 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 5ed13aa..3807d15 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 08dfbb6..ef95795 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 1867dd0..edd9763 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 733de69..af2b81a 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 {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]