mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Merge 27d2c5b1f2
into 5ce3a9dd1d
This commit is contained in:
commit
7e34ecd4f4
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -91,7 +91,6 @@ struct _GnucashSheet
|
||||
guint delete_signal;
|
||||
|
||||
GtkAdjustment *hadj, *vadj;
|
||||
GtkWidget *hscrollbar, *vscrollbar;
|
||||
|
||||
GFunc moved_cb;
|
||||
gpointer moved_cb_data;
|
||||
|
Loading…
Reference in New Issue
Block a user