Skip to content

Commit

Permalink
Support touch scroll in register; remove legacy scroll interactions
Browse files Browse the repository at this point in the history
Just as an experiment, I'd like to compare how standard scrolling
behavior feels in the register view.  I find the current fast and
quantized scroll to be disconcerting, but I recognize that a lot of
thought, and trial and error, have already gone into the existing
custom scroll interactions.

This patch replaces custom scrolling with a ScrolledWindow container
and mostly the default handlers.
  • Loading branch information
adamwight committed Nov 8, 2023
1 parent 0650f56 commit 27d2c5b
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 164 deletions.
96 changes: 19 additions & 77 deletions gnucash/register/register-gnome/gnucash-register.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,47 +317,6 @@ gnucash_register_goto_next_matching_row (GnucashRegister *reg,
gnucash_sheet_goto_virt_loc (sheet, virt_loc);
}

static gboolean
gnucash_register_sheet_resize (GnucashRegister *reg)
{
// Sometimes the space left by the horizontal scrollbar does
// not get filled on load, this makes sure it does
if (!reg->hscrollbar_visible)
gtk_widget_queue_resize (GTK_WIDGET (reg->sheet));

return FALSE;
}

static void
gnucash_register_update_hadjustment (GtkAdjustment *adj,
GnucashRegister *reg)
{
g_return_if_fail (reg != NULL);
g_return_if_fail (GNUCASH_IS_REGISTER(reg));

if (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_lower (adj)
> gtk_adjustment_get_page_size (adj))
{
if (!reg->hscrollbar_visible)
{
gtk_widget_show(reg->hscrollbar);
reg->hscrollbar_visible = TRUE;
}
}
else
{
if (reg->hscrollbar_visible)
{
gtk_widget_hide(reg->hscrollbar);
reg->hscrollbar_visible = FALSE;
// When sheet first loaded and the scrollbar is hidden, the space left
// is not always automatically taken up by the sheet so queue a resize
// when all is idle
g_idle_add ((GSourceFunc) gnucash_register_sheet_resize, reg);
}
}
}

/*************************************************************/


Expand Down Expand Up @@ -521,12 +480,18 @@ gnucash_register_create_widget (Table *table)
GtkWidget *header;
GtkWidget *widget;
GtkWidget *sheet;
GtkWidget *scrollbar;

reg = g_object_new (GNUCASH_TYPE_REGISTER, NULL);
widget = GTK_WIDGET(reg);

sheet = gnucash_sheet_new (table);
GtkWidget* swin = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(swin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);

sheet = gnucash_sheet_new (table,
gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW(swin)),
gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW(swin)));
reg->sheet = sheet;
GNUCASH_SHEET(sheet)->reg = widget;

Expand All @@ -538,40 +503,17 @@ gnucash_register_create_widget (Table *table)
gtk_widget_set_vexpand (header, FALSE);
gtk_widget_set_valign (header, GTK_ALIGN_FILL);
g_object_set (header, "margin", 0, NULL);
gtk_widget_show (header);

gtk_grid_attach (GTK_GRID(widget), sheet, 0, 1, 1, 1);
gtk_widget_set_hexpand (sheet, TRUE);
gtk_widget_set_halign (sheet, GTK_ALIGN_FILL);
gtk_widget_set_vexpand (sheet, TRUE);
gtk_widget_set_valign (sheet, GTK_ALIGN_FILL);
g_object_set (sheet, "margin", 0, NULL);
gtk_widget_show (sheet);

scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, GNUCASH_SHEET(sheet)->vadj);
gtk_grid_attach (GTK_GRID(widget), GTK_WIDGET(scrollbar), 1, 0, 1, 2);
gtk_widget_set_hexpand (GTK_WIDGET(scrollbar), FALSE);
gtk_widget_set_halign (GTK_WIDGET(scrollbar), GTK_ALIGN_FILL);
gtk_widget_set_vexpand (GTK_WIDGET(scrollbar), TRUE);
gtk_widget_set_valign (GTK_WIDGET(scrollbar), GTK_ALIGN_FILL);
g_object_set (GTK_WIDGET(scrollbar), "margin", 0, NULL);
gtk_widget_show (scrollbar);
GNUCASH_SHEET(sheet)->vscrollbar = scrollbar;

scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GNUCASH_SHEET(sheet)->hadj);
gtk_grid_attach (GTK_GRID(widget), GTK_WIDGET(scrollbar), 0, 2, 1, 1);
gtk_widget_set_hexpand (GTK_WIDGET(scrollbar), TRUE);
gtk_widget_set_halign (GTK_WIDGET(scrollbar), GTK_ALIGN_FILL);
gtk_widget_set_vexpand (GTK_WIDGET(scrollbar), FALSE);
gtk_widget_set_valign (GTK_WIDGET(scrollbar), GTK_ALIGN_FILL);
g_object_set (GTK_WIDGET(scrollbar), "margin", 0, NULL);
reg->hscrollbar = scrollbar;
gtk_widget_show (reg->hscrollbar);
reg->hscrollbar_visible = TRUE;
GNUCASH_SHEET(sheet)->hscrollbar = scrollbar;

g_signal_connect (GNUCASH_SHEET(sheet)->hadj, "changed",
G_CALLBACK (gnucash_register_update_hadjustment), reg);

gtk_container_add (GTK_CONTAINER(swin), GTK_WIDGET(sheet));

gtk_grid_attach (GTK_GRID(widget), swin, 0, 1, 1, 1);
gtk_widget_set_hexpand (swin, TRUE);
gtk_widget_set_halign (swin, GTK_ALIGN_FILL);
gtk_widget_set_vexpand (swin, TRUE);
gtk_widget_set_valign (swin, GTK_ALIGN_FILL);
g_object_set (swin, "margin", 0, NULL);

gtk_widget_show_all (widget);

return widget;
}
Expand Down
95 changes: 10 additions & 85 deletions gnucash/register/register-gnome/gnucash-sheet.c
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,6 @@ gnucash_sheet_compute_visible_range (GnucashSheet *sheet)
{
VirtualCellLocation vcell_loc;
GtkAllocation alloc;
GtkAdjustment *adj;
gint height;
gint cy;
gint top_block;
Expand All @@ -527,8 +526,7 @@ gnucash_sheet_compute_visible_range (GnucashSheet *sheet)
gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
height = alloc.height;

adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE(sheet));
cy = gtk_adjustment_get_value (adj);
cy = gtk_adjustment_get_value (sheet->vadj);

top_block = gnucash_sheet_y_pixel_to_block (sheet, cy);

Expand Down Expand Up @@ -561,7 +559,6 @@ gnucash_sheet_show_row (GnucashSheet *sheet, gint virt_row)
VirtualCellLocation vcell_loc = { virt_row, 0 };
SheetBlock *block;
GtkAllocation alloc;
GtkAdjustment *adj;
gint block_height;
gint height;
gint cx, cy;
Expand All @@ -575,10 +572,8 @@ gnucash_sheet_show_row (GnucashSheet *sheet, gint virt_row)
vcell_loc.virt_row = MIN (vcell_loc.virt_row,
sheet->num_virt_rows - 1);

adj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE(sheet));
cx = gtk_adjustment_get_value (adj);
adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE(sheet));
cy = gtk_adjustment_get_value (adj);
cx = gtk_adjustment_get_value (sheet->hadj);
cy = gtk_adjustment_get_value (sheet->vadj);
x = cx;

gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
Expand Down Expand Up @@ -638,7 +633,6 @@ gnucash_sheet_show_range (GnucashSheet *sheet,
SheetBlock *start_block;
SheetBlock *end_block;
GtkAllocation alloc;
GtkAdjustment *adj;
gint block_height;
gint height;
gint cx, cy;
Expand All @@ -655,10 +649,8 @@ gnucash_sheet_show_range (GnucashSheet *sheet,
end_loc.virt_row = MIN(end_loc.virt_row,
sheet->num_virt_rows - 1);

adj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE(sheet));
cx = gtk_adjustment_get_value (adj);
adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE(sheet));
cy = gtk_adjustment_get_value (adj);
cx = gtk_adjustment_get_value (sheet->hadj);
cy = gtk_adjustment_get_value (sheet->vadj);
x = cx;

gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
Expand Down Expand Up @@ -806,7 +798,7 @@ gnucash_sheet_finalize (GObject *object)


static GnucashSheet *
gnucash_sheet_create (Table *table)
gnucash_sheet_create (Table *table, GtkAdjustment *hadj, GtkAdjustment *vadj)
{
GnucashSheet *sheet;

Expand All @@ -815,8 +807,8 @@ gnucash_sheet_create (Table *table)
sheet = g_object_new (GNUCASH_TYPE_SHEET, NULL);
sheet->table = table;
sheet->entry = NULL;
sheet->vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE(sheet));
sheet->hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE(sheet));
sheet->hadj = hadj;
sheet->vadj = vadj;

g_signal_connect (G_OBJECT(sheet->vadj), "value_changed",
G_CALLBACK(gnucash_sheet_vadjustment_value_changed), sheet);
Expand Down Expand Up @@ -1345,72 +1337,6 @@ gnucash_sheet_button_release_event (GtkWidget *widget, GdkEventButton *event)
return TRUE;
}

static float
clamp_scrollable_value (float value, GtkAdjustment* adj)
{
float lower = gtk_adjustment_get_lower (adj);
float upper = gtk_adjustment_get_upper (adj);
float size = gtk_adjustment_get_page_size (adj);
return CLAMP(value, lower, upper - size);

}
static gboolean
gnucash_scroll_event (GtkWidget *widget, GdkEventScroll *event)
{
GnucashSheet *sheet;
GtkAdjustment *vadj;
gfloat h_value, v_value;

g_return_val_if_fail (widget != NULL, TRUE);
g_return_val_if_fail (GNUCASH_IS_SHEET(widget), TRUE);
g_return_val_if_fail (event != NULL, TRUE);

sheet = GNUCASH_SHEET(widget);
vadj = sheet->vadj;
v_value = gtk_adjustment_get_value (vadj);

switch (event->direction)
{
case GDK_SCROLL_UP:
v_value -= gtk_adjustment_get_step_increment (vadj);
break;
case GDK_SCROLL_DOWN:
v_value += gtk_adjustment_get_step_increment (vadj);
break;
/* GdkQuartz reserves GDK_SCROLL_SMOOTH for high-resolution touchpad
* scrolling events, and in that case scrolling by line is much too
* fast. Gdk/Wayland and Gdk/Win32 pass GDK_SCROLL_SMOOTH for all
* scroll-wheel events and expect coarse resolution.
*/
case GDK_SCROLL_SMOOTH:
h_value = gtk_adjustment_get_value (sheet->hadj);
h_value += event->delta_x;
h_value = clamp_scrollable_value (h_value, sheet->hadj);
gtk_adjustment_set_value (sheet->hadj, h_value);
#if defined MAC_INTEGRATION
v_value += event->delta_y;
#else
int direction = event->delta_y > 0 ? 1 : event->delta_y < 0 ? -1 : 0;
v_value += gtk_adjustment_get_step_increment (vadj) * direction;
#endif
break;
default:
return FALSE;
}
v_value = clamp_scrollable_value (v_value, vadj);
gtk_adjustment_set_value (vadj, v_value);

if (event->delta_y == 0)
{
/* There are problems with the slider not tracking the value so
when delta_y is 0 hide and showing the scrollbar seems to fix it
observed when using mouse wheel on sheet after a page-up or down */
gtk_widget_hide (GTK_WIDGET(sheet->vscrollbar));
gtk_widget_show (GTK_WIDGET(sheet->vscrollbar));
}
return TRUE;
}

static void
gnucash_sheet_check_grab (GnucashSheet *sheet)
{
Expand Down Expand Up @@ -2341,7 +2267,6 @@ gnucash_sheet_class_init (GnucashSheetClass *klass)
widget_class->key_release_event = gnucash_sheet_key_release_event;
widget_class->button_press_event = gnucash_sheet_button_press_event;
widget_class->button_release_event = gnucash_sheet_button_release_event;
widget_class->scroll_event = gnucash_scroll_event;
}


Expand Down Expand Up @@ -2452,13 +2377,13 @@ gnucash_sheet_tooltip (GtkWidget *widget, gint x, gint y,


GtkWidget *
gnucash_sheet_new (Table *table)
gnucash_sheet_new (Table *table, GtkAdjustment *hadj, GtkAdjustment *vadj)
{
GnucashSheet *sheet;

g_return_val_if_fail (table != NULL, NULL);

sheet = gnucash_sheet_create (table);
sheet = gnucash_sheet_create (table, hadj, vadj);

/* on create, the sheet can grab the focus */
sheet->sheet_has_focus = TRUE;
Expand Down
2 changes: 1 addition & 1 deletion gnucash/register/register-gnome/gnucash-sheet.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ typedef struct


GType gnucash_sheet_get_type (void);
GtkWidget *gnucash_sheet_new (Table *table);
GtkWidget *gnucash_sheet_new (Table *table, GtkAdjustment *hadj, GtkAdjustment *vadj);

void gnucash_sheet_table_load (GnucashSheet *sheet, gboolean do_scroll);

Expand Down
1 change: 0 additions & 1 deletion gnucash/register/register-gnome/gnucash-sheetP.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ struct _GnucashSheet
guint delete_signal;

GtkAdjustment *hadj, *vadj;
GtkWidget *hscrollbar, *vscrollbar;

GFunc moved_cb;
gpointer moved_cb_data;
Expand Down

0 comments on commit 27d2c5b

Please sign in to comment.