summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2016-04-19 17:12:00 +0200
committerMatthias Clasen <mclasen@redhat.com>2016-05-05 15:03:58 -0400
commit0e002cbef0b662120ab69ebec375c113b187048e (patch)
treef48ecc7ab2afecffd8410a47d80914533e26aa1d
parent107b5d7397c2e7c64b3f0e4a54248eade03eb25e (diff)
downloadgtk+-0e002cbef0b662120ab69ebec375c113b187048e.tar.gz
listbox: Make sure page down/up move at least one row
When the current cursor_row is taller than the page_size we get from the GtkAdjustment, the previous code would not actually cause any scrolling, so make sure we just take the row after or before the cursor_row in that case. https://bugzilla.gnome.org/show_bug.cgi?id=765261
-rw-r--r--gtk/gtklistbox.c53
1 files changed, 17 insertions, 36 deletions
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index 2ffa76802f..25be5931e3 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -2990,12 +2990,11 @@ gtk_list_box_move_cursor (GtkListBox *box,
gboolean modify;
gboolean extend;
GtkListBoxRow *row;
- GtkListBoxRow *prev;
- GtkListBoxRow *next;
gint page_size;
GSequenceIter *iter;
gint start_y;
gint end_y;
+ int height;
row = NULL;
switch (step)
@@ -3036,47 +3035,29 @@ gtk_list_box_move_cursor (GtkListBox *box,
if (priv->cursor_row != NULL)
{
start_y = ROW_PRIV (priv->cursor_row)->y;
- end_y = start_y;
- iter = ROW_PRIV (priv->cursor_row)->iter;
+ height = gtk_widget_get_allocated_height (GTK_WIDGET (box));
+ end_y = CLAMP (start_y + page_size * count, 0, height - 1);
+ row = gtk_list_box_get_row_at_y (box, end_y);
+ iter = ROW_PRIV (row)->iter;
- row = priv->cursor_row;
- if (count < 0)
+ if (row == priv->cursor_row)
{
- /* Up */
- while (iter != NULL && !g_sequence_iter_is_begin (iter))
- {
- iter = gtk_list_box_get_previous_visible (box, iter);
- if (iter == NULL)
- break;
-
- prev = g_sequence_get (iter);
- if (ROW_PRIV (prev)->y < start_y - page_size)
- break;
+ /* Move at least one row. This is important when the cursor_row's height is
+ * greater than page_size */
+ if (count < 0)
+ iter = g_sequence_iter_prev (iter);
+ else
+ iter = g_sequence_iter_next (iter);
- row = prev;
- }
- }
- else
- {
- /* Down */
- while (iter != NULL && !g_sequence_iter_is_end (iter))
+ if (!g_sequence_iter_is_begin (iter) && !g_sequence_iter_is_end (iter))
{
- iter = gtk_list_box_get_next_visible (box, iter);
- if (g_sequence_iter_is_end (iter))
- break;
-
- next = g_sequence_get (iter);
- if (ROW_PRIV (next)->y > start_y + page_size)
- break;
-
- row = next;
+ row = g_sequence_get (iter);
+ end_y = ROW_PRIV (row)->y;
}
}
- end_y = ROW_PRIV (row)->y;
+
if (end_y != start_y && priv->adjustment != NULL)
- gtk_adjustment_animate_to_value (priv->adjustment,
- gtk_adjustment_get_value (priv->adjustment) +
- end_y - start_y);
+ gtk_adjustment_animate_to_value (priv->adjustment, end_y);
}
break;
default: