Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support touch scroll in register; remove legacy scroll interactions #1822

Draft
wants to merge 1 commit into
base: stable
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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