Add the ability to have register cell tooltips

Add the ability to display tooltips on the register sheet based on type
of cell.
This commit is contained in:
Robert Fewell 2018-06-16 10:31:14 +01:00
parent 554001604a
commit 1b4a2acb45
6 changed files with 159 additions and 3 deletions

View File

@ -497,6 +497,17 @@ gnc_split_register_get_fcredit_label (VirtualLocation virt_loc,
return _("Credit Formula"); return _("Credit Formula");
} }
static char *
gnc_split_register_get_default_tooltip (VirtualLocation virt_loc,
gpointer user_data)
{
SplitRegister *reg = user_data;
const char *tooltip = gnc_table_get_entry(reg->table, virt_loc);
return g_strdup (tooltip);
}
static gnc_numeric static gnc_numeric
get_trans_total_amount (SplitRegister *reg, Transaction *trans) get_trans_total_amount (SplitRegister *reg, Transaction *trans)
{ {
@ -2343,6 +2354,7 @@ gnc_split_register_model_new (void)
model = gnc_table_model_new (); model = gnc_table_model_new ();
// entry handlers
gnc_table_model_set_entry_handler (model, gnc_table_model_set_entry_handler (model,
gnc_split_register_get_date_entry, gnc_split_register_get_date_entry,
DATE_CELL); DATE_CELL);
@ -2443,7 +2455,7 @@ gnc_split_register_model_new (void)
gnc_split_register_get_rbaln_entry, gnc_split_register_get_rbaln_entry,
RBALN_CELL); RBALN_CELL);
// label handlers
gnc_table_model_set_label_handler (model, gnc_table_model_set_label_handler (model,
gnc_split_register_get_date_label, gnc_split_register_get_date_label,
DATE_CELL); DATE_CELL);
@ -2548,7 +2560,13 @@ gnc_split_register_model_new (void)
gnc_split_register_get_tbalance_label, gnc_split_register_get_tbalance_label,
RBALN_CELL); RBALN_CELL);
// tooltip handlers
// gnc_table_model_set_default_tooltip_handler(
// model, gnc_split_register_get_default_tooltip);
// help handlers
gnc_table_model_set_default_help_handler( gnc_table_model_set_default_help_handler(
model, gnc_split_register_get_default_help); model, gnc_split_register_get_default_help);
@ -2612,7 +2630,7 @@ gnc_split_register_model_new (void)
gnc_split_register_get_fdebt_help, gnc_split_register_get_fdebt_help,
FDEBT_CELL); FDEBT_CELL);
// io flag handlers
gnc_table_model_set_io_flags_handler( gnc_table_model_set_io_flags_handler(
model, gnc_split_register_get_standard_io_flags, DATE_CELL); model, gnc_split_register_get_standard_io_flags, DATE_CELL);

View File

@ -297,6 +297,25 @@ gnc_table_get_entry (Table *table, VirtualLocation virt_loc)
return entry; return entry;
} }
char *
gnc_table_get_tooltip (Table *table, VirtualLocation virt_loc)
{
TableGetTooltipHandler tooltip_handler;
BasicCell *cell;
cell = gnc_table_get_cell (table, virt_loc);
if (!cell || !cell->cell_name)
return NULL;
tooltip_handler = gnc_table_model_get_tooltip_handler (table->model,
cell->cell_name);
if (!tooltip_handler)
return NULL;
return tooltip_handler (virt_loc, table->model->handler_user_data);
}
CellIOFlags CellIOFlags
gnc_table_get_io_flags (Table *table, VirtualLocation virt_loc) gnc_table_get_io_flags (Table *table, VirtualLocation virt_loc)
{ {

View File

@ -238,6 +238,8 @@ VirtualCell * gnc_table_get_virtual_cell (Table *table,
const char * gnc_table_get_entry (Table *table, VirtualLocation virt_loc); const char * gnc_table_get_entry (Table *table, VirtualLocation virt_loc);
char * gnc_table_get_tooltip (Table *table, VirtualLocation virt_loc);
const char * gnc_table_get_label (Table *table, VirtualLocation virt_loc); const char * gnc_table_get_label (Table *table, VirtualLocation virt_loc);
CellIOFlags gnc_table_get_io_flags (Table *table, VirtualLocation virt_loc); CellIOFlags gnc_table_get_io_flags (Table *table, VirtualLocation virt_loc);

View File

@ -133,6 +133,7 @@ gnc_table_model_new (void)
model->entry_handlers = gnc_table_model_handler_hash_new (); model->entry_handlers = gnc_table_model_handler_hash_new ();
model->label_handlers = gnc_table_model_handler_hash_new (); model->label_handlers = gnc_table_model_handler_hash_new ();
model->help_handlers = gnc_table_model_handler_hash_new (); model->help_handlers = gnc_table_model_handler_hash_new ();
model->tooltip_handlers = gnc_table_model_handler_hash_new ();
model->io_flags_handlers = gnc_table_model_handler_hash_new (); model->io_flags_handlers = gnc_table_model_handler_hash_new ();
model->cell_color_handlers = gnc_table_model_handler_hash_new (); model->cell_color_handlers = gnc_table_model_handler_hash_new ();
model->cell_border_handlers = gnc_table_model_handler_hash_new (); model->cell_border_handlers = gnc_table_model_handler_hash_new ();
@ -158,6 +159,9 @@ gnc_table_model_destroy (TableModel *model)
gnc_table_model_handler_hash_destroy (model->label_handlers); gnc_table_model_handler_hash_destroy (model->label_handlers);
model->label_handlers = NULL; model->label_handlers = NULL;
gnc_table_model_handler_hash_destroy (model->tooltip_handlers);
model->tooltip_handlers = NULL;
gnc_table_model_handler_hash_destroy (model->help_handlers); gnc_table_model_handler_hash_destroy (model->help_handlers);
model->help_handlers = NULL; model->help_handlers = NULL;
@ -261,6 +265,39 @@ gnc_table_model_get_label_handler (TableModel *model, const char * cell_name)
cell_name); cell_name);
} }
void
gnc_table_model_set_tooltip_handler (TableModel *model,
TableGetTooltipHandler tooltip_handler,
const char * cell_name)
{
g_return_if_fail (model != NULL);
g_return_if_fail (cell_name != NULL);
gnc_table_model_handler_hash_insert (model->tooltip_handlers,
cell_name,
tooltip_handler);
}
void
gnc_table_model_set_default_tooltip_handler
(TableModel *model, TableGetTooltipHandler tooltip_handler)
{
g_return_if_fail (model != NULL);
gnc_table_model_handler_hash_insert (model->tooltip_handlers,
DEFAULT_HANDLER,
tooltip_handler);
}
TableGetTooltipHandler
gnc_table_model_get_tooltip_handler (TableModel *model, const char * cell_name)
{
g_return_val_if_fail (model != NULL, NULL);
return gnc_table_model_handler_hash_lookup (model->tooltip_handlers,
cell_name);
}
void void
gnc_table_model_set_help_handler (TableModel *model, gnc_table_model_set_help_handler (TableModel *model,
TableGetHelpHandler help_handler, TableGetHelpHandler help_handler,

View File

@ -73,6 +73,9 @@ typedef const char * (*TableGetLabelHandler) (VirtualLocation virt_loc,
typedef char * (*TableGetHelpHandler) (VirtualLocation virt_loc, typedef char * (*TableGetHelpHandler) (VirtualLocation virt_loc,
gpointer user_data); gpointer user_data);
typedef char * (*TableGetTooltipHandler) (VirtualLocation virt_loc,
gpointer user_data);
typedef CellIOFlags (*TableGetCellIOFlagsHandler) (VirtualLocation virt_loc, typedef CellIOFlags (*TableGetCellIOFlagsHandler) (VirtualLocation virt_loc,
gpointer user_data); gpointer user_data);
@ -103,6 +106,7 @@ typedef struct
GHashTable *entry_handlers; GHashTable *entry_handlers;
GHashTable *label_handlers; GHashTable *label_handlers;
GHashTable *help_handlers; GHashTable *help_handlers;
GHashTable *tooltip_handlers;
GHashTable *io_flags_handlers; GHashTable *io_flags_handlers;
GHashTable *cell_color_handlers; GHashTable *cell_color_handlers;
GHashTable *cell_border_handlers; GHashTable *cell_border_handlers;
@ -174,6 +178,17 @@ TableGetHelpHandler gnc_table_model_get_help_handler
(TableModel *model, (TableModel *model,
const char * cell_name); const char * cell_name);
void gnc_table_model_set_tooltip_handler
(TableModel *model,
TableGetTooltipHandler tooltip_handler,
const char * cell_name);
void gnc_table_model_set_default_tooltip_handler
(TableModel *model,
TableGetTooltipHandler tooltip_handler);
TableGetTooltipHandler gnc_table_model_get_tooltip_handler
(TableModel *model,
const char * cell_name);
void gnc_table_model_set_io_flags_handler void gnc_table_model_set_io_flags_handler
(TableModel *model, (TableModel *model,
TableGetCellIOFlagsHandler io_flags_handler, TableGetCellIOFlagsHandler io_flags_handler,

View File

@ -2620,6 +2620,66 @@ gnucash_sheet_get_type (void)
return gnucash_sheet_type; return gnucash_sheet_type;
} }
static gboolean
gnucash_sheet_tooltip (GtkWidget *widget, gint x, gint y,
gboolean keyboard_mode, GtkTooltip *tooltip,
gpointer user_data)
{
GnucashSheet *sheet = GNUCASH_SHEET (widget);
GnucashCursor *cursor = sheet->cursor;
Table *table = sheet->table;
VirtualLocation virt_loc;
gchar *tooltip_text;
gint cx, cy, cw, ch;
GdkRectangle rect;
SheetBlock *block;
gint bx, by;
gint hscroll_val, vscroll_val;
if (keyboard_mode)
return FALSE;
// get the scroll window values
hscroll_val = (gint) gtk_adjustment_get_value (sheet->hadj);
vscroll_val = (gint) gtk_adjustment_get_value (sheet->vadj);
if (!gnucash_sheet_find_loc_by_pixel (sheet, x + hscroll_val, y + vscroll_val, &virt_loc))
return FALSE;
tooltip_text = gnc_table_get_tooltip (table, virt_loc);
// if tooltip_text empty, clear tooltip and return FALSE
if ((tooltip_text == NULL) || (g_strcmp0 (tooltip_text,"") == 0))
{
gtk_tooltip_set_text (tooltip, NULL);
return FALSE;
}
block = gnucash_sheet_get_block (sheet, virt_loc.vcell_loc);
if (block == NULL)
return FALSE;
bx = block->origin_x;
by = block->origin_y;
// get the cell location and dimensions
gnucash_sheet_style_get_cell_pixel_rel_coords (cursor->style,
virt_loc.phys_row_offset, virt_loc.phys_col_offset,
&cx, &cy, &cw, &ch);
rect.x = cx + bx - hscroll_val;
rect.y = cy + by - vscroll_val;
rect.width = cw;
rect.height = ch;
gtk_tooltip_set_tip_area (tooltip, &rect);
gtk_tooltip_set_text (tooltip, tooltip_text);
g_free (tooltip_text);
return TRUE;
}
GtkWidget * GtkWidget *
gnucash_sheet_new (Table *table) gnucash_sheet_new (Table *table)
{ {
@ -2640,6 +2700,11 @@ gnucash_sheet_new (Table *table)
g_int_equal, g_int_equal,
g_free, NULL); g_free, NULL);
/* add tooltips to sheet */
gtk_widget_set_has_tooltip (GTK_WIDGET(sheet), TRUE);
g_signal_connect(G_OBJECT(sheet), "query-tooltip",
G_CALLBACK(gnucash_sheet_tooltip), NULL);
gnucash_sheet_refresh_from_prefs(sheet); gnucash_sheet_refresh_from_prefs(sheet);
return GTK_WIDGET(sheet); return GTK_WIDGET(sheet);