mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-20 02:10:12 +00:00
Bug 480065 - wrong tree collapsed (or expanded) after having scrolled
Commit again after revert. Store (x, y) of last motion event. From gtk_tree_view_adjustment_changed(), call prelight_or_select() so that the prelight is recalculated. We do the same from gtk_tree_view_size_allocate() for the case that clicking on an expander shows new rows that resize the column(s) left of the expander. This means that the expander is moved horizontally, in such a case the prelight also has to be reconsidered.
This commit is contained in:
parent
00ec5fcd7a
commit
0cbf76ed47
@ -142,6 +142,9 @@ struct _GtkTreeViewPrivate
|
||||
gint press_start_x;
|
||||
gint press_start_y;
|
||||
|
||||
gint event_last_x;
|
||||
gint event_last_y;
|
||||
|
||||
guint last_button_time;
|
||||
gint last_button_x;
|
||||
gint last_button_y;
|
||||
|
@ -391,6 +391,9 @@ static void remove_expand_collapse_timeout (GtkTreeView
|
||||
static void cancel_arrow_animation (GtkTreeView *tree_view);
|
||||
static gboolean do_expand_collapse (GtkTreeView *tree_view);
|
||||
static void gtk_tree_view_stop_rubber_band (GtkTreeView *tree_view);
|
||||
static void update_prelight (GtkTreeView *tree_view,
|
||||
int x,
|
||||
int y);
|
||||
|
||||
/* interactive search */
|
||||
static void gtk_tree_view_ensure_interactive_directory (GtkTreeView *tree_view);
|
||||
@ -2473,6 +2476,11 @@ gtk_tree_view_size_allocate (GtkWidget *widget,
|
||||
/* This little hack only works if we have an LTR locale, and no column has the */
|
||||
if (width_changed)
|
||||
{
|
||||
if (tree_view->priv->tree)
|
||||
update_prelight (tree_view,
|
||||
tree_view->priv->event_last_x,
|
||||
tree_view->priv->event_last_y);
|
||||
|
||||
if (gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_LTR &&
|
||||
! has_expand_column)
|
||||
invalidate_last_column (tree_view);
|
||||
@ -3291,6 +3299,26 @@ prelight_or_select (GtkTreeView *tree_view,
|
||||
do_prelight (tree_view, tree, node, x, y);
|
||||
}
|
||||
|
||||
static void
|
||||
update_prelight (GtkTreeView *tree_view,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
int new_y;
|
||||
GtkRBTree *tree;
|
||||
GtkRBNode *node;
|
||||
|
||||
new_y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, y);
|
||||
if (new_y < 0)
|
||||
new_y = 0;
|
||||
|
||||
_gtk_rbtree_find_offset (tree_view->priv->tree,
|
||||
new_y, &tree, &node);
|
||||
|
||||
if (node)
|
||||
prelight_or_select (tree_view, tree, node, x, y);
|
||||
}
|
||||
|
||||
static void
|
||||
ensure_unprelighted (GtkTreeView *tree_view)
|
||||
{
|
||||
@ -4102,6 +4130,9 @@ gtk_tree_view_motion_bin_window (GtkWidget *widget,
|
||||
(tree_view->priv->button_pressed_node != node))
|
||||
node = NULL;
|
||||
|
||||
tree_view->priv->event_last_x = event->x;
|
||||
tree_view->priv->event_last_y = event->y;
|
||||
|
||||
prelight_or_select (tree_view, tree, node, event->x, event->y);
|
||||
|
||||
return TRUE;
|
||||
@ -10538,9 +10569,15 @@ gtk_tree_view_adjustment_changed (GtkAdjustment *adjustment,
|
||||
- tree_view->priv->hadjustment->value,
|
||||
0);
|
||||
dy = tree_view->priv->dy - (int) tree_view->priv->vadjustment->value;
|
||||
if (dy && tree_view->priv->edited_column)
|
||||
if (dy)
|
||||
{
|
||||
if (GTK_IS_WIDGET (tree_view->priv->edited_column->editable_widget))
|
||||
if (tree_view->priv->tree)
|
||||
update_prelight (tree_view,
|
||||
tree_view->priv->event_last_x,
|
||||
tree_view->priv->event_last_y - dy);
|
||||
|
||||
if (tree_view->priv->edited_column &&
|
||||
GTK_IS_WIDGET (tree_view->priv->edited_column->editable_widget))
|
||||
{
|
||||
GList *list;
|
||||
GtkWidget *widget;
|
||||
|
Loading…
Reference in New Issue
Block a user