X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=gtk-gui.c;h=cecfb7259107eb329e0390aa322fc01b47f4743f;hb=d6c2236b8a9e20d22d78de7432f7017a18235619;hp=8ae67ecaa6bcf3ad445b2a52be889a9dfd7716a3;hpb=8d82c57e4674cacc42e66e2af903142cf80607c6;p=ext%2Fsubsurface.git diff --git a/gtk-gui.c b/gtk-gui.c index 8ae67ec..cecfb72 100644 --- a/gtk-gui.c +++ b/gtk-gui.c @@ -103,6 +103,8 @@ static void file_open(GtkWidget *w, gpointer data) filter = gtk_file_filter_new(); gtk_file_filter_add_pattern(filter, "*.xml"); gtk_file_filter_add_pattern(filter, "*.XML"); + gtk_file_filter_add_pattern(filter, "*.sda"); + gtk_file_filter_add_pattern(filter, "*.SDA"); gtk_file_filter_add_mime_type(filter, "text/xml"); gtk_file_filter_set_name(filter, "XML file"); gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); @@ -128,7 +130,6 @@ static void file_open(GtkWidget *w, gpointer data) } g_slist_free(filenames); report_dives(); - dive_list_update_dives(); } gtk_widget_destroy(dialog); } @@ -586,11 +587,14 @@ void init_ui(int argc, char **argv) GtkWidget *equipment; GtkWidget *menubar; GtkWidget *vbox; + GtkSettings *settings; static const GtkTargetEntry notebook_target = { "GTK_NOTEBOOK_TAB", GTK_TARGET_SAME_APP, 0 }; gtk_init(&argc, &argv); + settings = gtk_settings_get_default(); + gtk_settings_set_long_property(settings, "gtk_tooltip_timeout", 10, "subsurface setting"); g_type_init(); gconf = gconf_client_get_default(); @@ -668,62 +672,75 @@ void run_ui(void) gtk_main(); } -/* get the filenames the user selects and call the parsing function - * on them - * return 0 if the user cancelled the dialog - */ -int open_import_file_dialog(char *filterpattern, char *filtertext, - void(* parse_function)(char *)) -{ - int ret=0; +typedef struct { + cairo_rectangle_int_t rect; + const char *text; +} tooltip_record_t; - GtkWidget *dialog; - GtkFileFilter *filter = gtk_file_filter_new (); - gtk_file_filter_add_pattern (filter, filterpattern); - gtk_file_filter_set_name(filter, filtertext); - dialog = gtk_file_chooser_dialog_new("Open File", - GTK_WINDOW(main_window), - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); - gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter); +static tooltip_record_t *tooltip_rects; +static int tooltips; - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - GSList *filenames; - char *filename; - filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)); - while(filenames != NULL) { - filename = (char *)filenames->data; - parse_function(filename); - g_free(filename); - filenames = g_slist_next(filenames); +void attach_tooltip(int x, int y, int w, int h, const char *text) +{ + cairo_rectangle_int_t *rect; + tooltip_rects = realloc(tooltip_rects, (tooltips + 1) * sizeof(tooltip_record_t)); + rect = &tooltip_rects[tooltips].rect; + rect->x = x; + rect->y = y; + rect->width = w; + rect->height = h; + tooltip_rects[tooltips].text = text; + tooltips++; +} + +#define INSIDE_RECT(_r,_x,_y) ((_r.x <= _x) && (_r.x + _r.width >= _x) && \ + (_r.y <= _y) && (_r.y + _r.height >= _y)) + +static gboolean profile_tooltip (GtkWidget *widget, gint x, gint y, + gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data) +{ + int i; + cairo_rectangle_int_t *drawing_area = user_data; + gint tx = x - drawing_area->x; /* get transformed coordinates */ + gint ty = y - drawing_area->y; + + /* are we over an event marker ? */ + for (i = 0; i < tooltips; i++) { + if (INSIDE_RECT(tooltip_rects[i].rect, tx, ty)) { + gtk_tooltip_set_text(tooltip,tooltip_rects[i].text); + return TRUE; /* show tooltip */ } - g_slist_free(filenames); - ret = 1; } - gtk_widget_destroy(dialog); - - return ret; + return FALSE; /* don't show tooltip */ } static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data) { struct dive *dive = current_dive; struct graphics_context gc = { .printer = 0 }; - int w,h; + static cairo_rectangle_int_t drawing_area; - w = widget->allocation.width; - h = widget->allocation.height; + /* the drawing area gives TOTAL width * height - x,y is used as the topx/topy offset + * so effective drawing area is width-2x * height-2y */ + drawing_area.width = widget->allocation.width; + drawing_area.height = widget->allocation.height; + drawing_area.x = drawing_area.width / 20.0; + drawing_area.y = drawing_area.height / 20.0; gc.cr = gdk_cairo_create(widget->window); + g_object_set(widget, "has-tooltip", TRUE, NULL); + g_signal_connect(widget, "query-tooltip", G_CALLBACK(profile_tooltip), &drawing_area); set_source_rgb(&gc, 0, 0, 0); cairo_paint(gc.cr); - if (dive) - plot(&gc, w, h, dive); - + if (dive) { + if (tooltip_rects) { + free(tooltip_rects); + tooltip_rects = NULL; + } + tooltips = 0; + plot(&gc, &drawing_area, dive); + } cairo_destroy(gc.cr); return FALSE; @@ -863,7 +880,6 @@ void import_dialog(GtkWidget *w, gpointer data) gtk_widget_destroy(dialog); report_dives(); - dive_list_update_dives(); } void update_progressbar(progressbar_t *progress, double value)