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);
gtk_main_quit();
}
+GtkTreeViewColumn *tree_view_column(GtkWidget *tree_view, int index, const char *title,
+ data_func_t data_func, PangoAlignment align, gboolean visible)
+{
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *col;
+ double xalign = 0.0; /* left as default */
+
+ renderer = gtk_cell_renderer_text_new();
+ col = gtk_tree_view_column_new();
+
+ gtk_tree_view_column_set_title(col, title);
+ gtk_tree_view_column_set_sort_column_id(col, index);
+ gtk_tree_view_column_set_resizable(col, TRUE);
+ gtk_tree_view_column_pack_start(col, renderer, TRUE);
+ if (data_func)
+ gtk_tree_view_column_set_cell_data_func(col, renderer, data_func, (void *)(long)index, NULL);
+ else
+ gtk_tree_view_column_add_attribute(col, renderer, "text", index);
+ gtk_object_set(GTK_OBJECT(renderer), "alignment", align, NULL);
+ switch (align) {
+ case PANGO_ALIGN_LEFT:
+ xalign = 0.0;
+ break;
+ case PANGO_ALIGN_CENTER:
+ xalign = 0.5;
+ break;
+ case PANGO_ALIGN_RIGHT:
+ xalign = 1.0;
+ break;
+ }
+ gtk_cell_renderer_set_alignment(GTK_CELL_RENDERER(renderer), xalign, 0.5);
+ gtk_tree_view_column_set_visible(col, visible);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), col);
+ return col;
+}
+
static void create_radio(GtkWidget *vbox, const char *name, ...)
{
va_list args;
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();
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 *))
+typedef struct {
+ cairo_rectangle_int_t rect;
+ const char *text;
+} tooltip_record_t;
+
+static tooltip_record_t *tooltip_rects;
+static int tooltips;
+
+void attach_tooltip(int x, int y, int w, int h, const char *text)
{
- int ret=0;
+ 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++;
+}
- 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);
+#define INSIDE_RECT(_r,_x,_y) ((_r.x <= _x) && (_r.x + _r.width >= _x) && \
+ (_r.y <= _y) && (_r.y + _r.height >= _y))
- 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);
+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;