This commit is contained in:
Adam Roses Wight 2025-02-10 08:47:33 +08:00 committed by GitHub
commit 7e34ecd4f4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 27 additions and 161 deletions

View File

@ -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);
gtk_container_add (GTK_CONTAINER(swin), GTK_WIDGET(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;
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);
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_widget_show_all (widget);
return widget;
}

View File

@ -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);
@ -1347,72 +1339,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)
{
@ -2337,7 +2263,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;
}
@ -2448,13 +2373,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;

View File

@ -61,7 +61,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);

View File

@ -91,7 +91,6 @@ struct _GnucashSheet
guint delete_signal;
GtkAdjustment *hadj, *vadj;
GtkWidget *hscrollbar, *vscrollbar;
GFunc moved_cb;
gpointer moved_cb_data;