diff --git a/gnucash/register/register-gnome/gnucash-register.c b/gnucash/register/register-gnome/gnucash-register.c index 9a09ae89f4a..131a9bc470d 100644 --- a/gnucash/register/register-gnome/gnucash-register.c +++ b/gnucash/register/register-gnome/gnucash-register.c @@ -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); - } - } -} - /*************************************************************/ @@ -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; @@ -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; } diff --git a/gnucash/register/register-gnome/gnucash-sheet.c b/gnucash/register/register-gnome/gnucash-sheet.c index 3590e909c92..877cafda377 100644 --- a/gnucash/register/register-gnome/gnucash-sheet.c +++ b/gnucash/register/register-gnome/gnucash-sheet.c @@ -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; @@ -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); @@ -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; @@ -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); @@ -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; @@ -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); @@ -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; @@ -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); @@ -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) { @@ -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; } @@ -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; diff --git a/gnucash/register/register-gnome/gnucash-sheet.h b/gnucash/register/register-gnome/gnucash-sheet.h index 2308ba1f4ae..ba9ce4e9c25 100644 --- a/gnucash/register/register-gnome/gnucash-sheet.h +++ b/gnucash/register/register-gnome/gnucash-sheet.h @@ -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); diff --git a/gnucash/register/register-gnome/gnucash-sheetP.h b/gnucash/register/register-gnome/gnucash-sheetP.h index 32027c7051b..73a3d188634 100644 --- a/gnucash/register/register-gnome/gnucash-sheetP.h +++ b/gnucash/register/register-gnome/gnucash-sheetP.h @@ -91,7 +91,6 @@ struct _GnucashSheet guint delete_signal; GtkAdjustment *hadj, *vadj; - GtkWidget *hscrollbar, *vscrollbar; GFunc moved_cb; gpointer moved_cb_data;