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);
|
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 *header;
|
||||||
GtkWidget *widget;
|
GtkWidget *widget;
|
||||||
GtkWidget *sheet;
|
GtkWidget *sheet;
|
||||||
GtkWidget *scrollbar;
|
|
||||||
|
|
||||||
reg = g_object_new (GNUCASH_TYPE_REGISTER, NULL);
|
reg = g_object_new (GNUCASH_TYPE_REGISTER, NULL);
|
||||||
widget = GTK_WIDGET(reg);
|
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;
|
reg->sheet = sheet;
|
||||||
GNUCASH_SHEET(sheet)->reg = widget;
|
GNUCASH_SHEET(sheet)->reg = widget;
|
||||||
|
|
||||||
@ -538,40 +503,17 @@ gnucash_register_create_widget (Table *table)
|
|||||||
gtk_widget_set_vexpand (header, FALSE);
|
gtk_widget_set_vexpand (header, FALSE);
|
||||||
gtk_widget_set_valign (header, GTK_ALIGN_FILL);
|
gtk_widget_set_valign (header, GTK_ALIGN_FILL);
|
||||||
g_object_set (header, "margin", 0, NULL);
|
g_object_set (header, "margin", 0, NULL);
|
||||||
gtk_widget_show (header);
|
|
||||||
|
|
||||||
gtk_grid_attach (GTK_GRID(widget), sheet, 0, 1, 1, 1);
|
gtk_container_add (GTK_CONTAINER(swin), GTK_WIDGET(sheet));
|
||||||
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), swin, 0, 1, 1, 1);
|
||||||
gtk_grid_attach (GTK_GRID(widget), GTK_WIDGET(scrollbar), 1, 0, 1, 2);
|
gtk_widget_set_hexpand (swin, TRUE);
|
||||||
gtk_widget_set_hexpand (GTK_WIDGET(scrollbar), FALSE);
|
gtk_widget_set_halign (swin, GTK_ALIGN_FILL);
|
||||||
gtk_widget_set_halign (GTK_WIDGET(scrollbar), GTK_ALIGN_FILL);
|
gtk_widget_set_vexpand (swin, TRUE);
|
||||||
gtk_widget_set_vexpand (GTK_WIDGET(scrollbar), TRUE);
|
gtk_widget_set_valign (swin, GTK_ALIGN_FILL);
|
||||||
gtk_widget_set_valign (GTK_WIDGET(scrollbar), GTK_ALIGN_FILL);
|
g_object_set (swin, "margin", 0, NULL);
|
||||||
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_widget_show_all (widget);
|
||||||
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);
|
|
||||||
|
|
||||||
return widget;
|
return widget;
|
||||||
}
|
}
|
||||||
|
@ -516,7 +516,6 @@ gnucash_sheet_compute_visible_range (GnucashSheet *sheet)
|
|||||||
{
|
{
|
||||||
VirtualCellLocation vcell_loc;
|
VirtualCellLocation vcell_loc;
|
||||||
GtkAllocation alloc;
|
GtkAllocation alloc;
|
||||||
GtkAdjustment *adj;
|
|
||||||
gint height;
|
gint height;
|
||||||
gint cy;
|
gint cy;
|
||||||
gint top_block;
|
gint top_block;
|
||||||
@ -527,8 +526,7 @@ gnucash_sheet_compute_visible_range (GnucashSheet *sheet)
|
|||||||
gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
|
gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
|
||||||
height = alloc.height;
|
height = alloc.height;
|
||||||
|
|
||||||
adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE(sheet));
|
cy = gtk_adjustment_get_value (sheet->vadj);
|
||||||
cy = gtk_adjustment_get_value (adj);
|
|
||||||
|
|
||||||
top_block = gnucash_sheet_y_pixel_to_block (sheet, cy);
|
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 };
|
VirtualCellLocation vcell_loc = { virt_row, 0 };
|
||||||
SheetBlock *block;
|
SheetBlock *block;
|
||||||
GtkAllocation alloc;
|
GtkAllocation alloc;
|
||||||
GtkAdjustment *adj;
|
|
||||||
gint block_height;
|
gint block_height;
|
||||||
gint height;
|
gint height;
|
||||||
gint cx, cy;
|
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,
|
vcell_loc.virt_row = MIN (vcell_loc.virt_row,
|
||||||
sheet->num_virt_rows - 1);
|
sheet->num_virt_rows - 1);
|
||||||
|
|
||||||
adj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE(sheet));
|
cx = gtk_adjustment_get_value (sheet->hadj);
|
||||||
cx = gtk_adjustment_get_value (adj);
|
cy = gtk_adjustment_get_value (sheet->vadj);
|
||||||
adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE(sheet));
|
|
||||||
cy = gtk_adjustment_get_value (adj);
|
|
||||||
x = cx;
|
x = cx;
|
||||||
|
|
||||||
gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
|
gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
|
||||||
@ -638,7 +633,6 @@ gnucash_sheet_show_range (GnucashSheet *sheet,
|
|||||||
SheetBlock *start_block;
|
SheetBlock *start_block;
|
||||||
SheetBlock *end_block;
|
SheetBlock *end_block;
|
||||||
GtkAllocation alloc;
|
GtkAllocation alloc;
|
||||||
GtkAdjustment *adj;
|
|
||||||
gint block_height;
|
gint block_height;
|
||||||
gint height;
|
gint height;
|
||||||
gint cx, cy;
|
gint cx, cy;
|
||||||
@ -655,10 +649,8 @@ gnucash_sheet_show_range (GnucashSheet *sheet,
|
|||||||
end_loc.virt_row = MIN(end_loc.virt_row,
|
end_loc.virt_row = MIN(end_loc.virt_row,
|
||||||
sheet->num_virt_rows - 1);
|
sheet->num_virt_rows - 1);
|
||||||
|
|
||||||
adj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE(sheet));
|
cx = gtk_adjustment_get_value (sheet->hadj);
|
||||||
cx = gtk_adjustment_get_value (adj);
|
cy = gtk_adjustment_get_value (sheet->vadj);
|
||||||
adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE(sheet));
|
|
||||||
cy = gtk_adjustment_get_value (adj);
|
|
||||||
x = cx;
|
x = cx;
|
||||||
|
|
||||||
gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
|
gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
|
||||||
@ -806,7 +798,7 @@ gnucash_sheet_finalize (GObject *object)
|
|||||||
|
|
||||||
|
|
||||||
static GnucashSheet *
|
static GnucashSheet *
|
||||||
gnucash_sheet_create (Table *table)
|
gnucash_sheet_create (Table *table, GtkAdjustment *hadj, GtkAdjustment *vadj)
|
||||||
{
|
{
|
||||||
GnucashSheet *sheet;
|
GnucashSheet *sheet;
|
||||||
|
|
||||||
@ -815,8 +807,8 @@ gnucash_sheet_create (Table *table)
|
|||||||
sheet = g_object_new (GNUCASH_TYPE_SHEET, NULL);
|
sheet = g_object_new (GNUCASH_TYPE_SHEET, NULL);
|
||||||
sheet->table = table;
|
sheet->table = table;
|
||||||
sheet->entry = NULL;
|
sheet->entry = NULL;
|
||||||
sheet->vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE(sheet));
|
sheet->hadj = hadj;
|
||||||
sheet->hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE(sheet));
|
sheet->vadj = vadj;
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT(sheet->vadj), "value_changed",
|
g_signal_connect (G_OBJECT(sheet->vadj), "value_changed",
|
||||||
G_CALLBACK(gnucash_sheet_vadjustment_value_changed), sheet);
|
G_CALLBACK(gnucash_sheet_vadjustment_value_changed), sheet);
|
||||||
@ -1347,72 +1339,6 @@ gnucash_sheet_button_release_event (GtkWidget *widget, GdkEventButton *event)
|
|||||||
return TRUE;
|
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
|
static void
|
||||||
gnucash_sheet_check_grab (GnucashSheet *sheet)
|
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->key_release_event = gnucash_sheet_key_release_event;
|
||||||
widget_class->button_press_event = gnucash_sheet_button_press_event;
|
widget_class->button_press_event = gnucash_sheet_button_press_event;
|
||||||
widget_class->button_release_event = gnucash_sheet_button_release_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 *
|
GtkWidget *
|
||||||
gnucash_sheet_new (Table *table)
|
gnucash_sheet_new (Table *table, GtkAdjustment *hadj, GtkAdjustment *vadj)
|
||||||
{
|
{
|
||||||
GnucashSheet *sheet;
|
GnucashSheet *sheet;
|
||||||
|
|
||||||
g_return_val_if_fail (table != NULL, NULL);
|
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 */
|
/* on create, the sheet can grab the focus */
|
||||||
sheet->sheet_has_focus = TRUE;
|
sheet->sheet_has_focus = TRUE;
|
||||||
|
@ -61,7 +61,7 @@ typedef struct
|
|||||||
|
|
||||||
|
|
||||||
GType gnucash_sheet_get_type (void);
|
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);
|
void gnucash_sheet_table_load (GnucashSheet *sheet, gboolean do_scroll);
|
||||||
|
|
||||||
|
@ -91,7 +91,6 @@ struct _GnucashSheet
|
|||||||
guint delete_signal;
|
guint delete_signal;
|
||||||
|
|
||||||
GtkAdjustment *hadj, *vadj;
|
GtkAdjustment *hadj, *vadj;
|
||||||
GtkWidget *hscrollbar, *vscrollbar;
|
|
||||||
|
|
||||||
GFunc moved_cb;
|
GFunc moved_cb;
|
||||||
gpointer moved_cb_data;
|
gpointer moved_cb_data;
|
||||||
|
Loading…
Reference in New Issue
Block a user