X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=gtk-gui.c;h=7d0e95c43ecdf5b8885ff44dd4a1693b75b744c6;hb=698892329a3f981ff762300427bb43f34b553baf;hp=41e862eb9ca553a200cdc4c092c788b2280ba930;hpb=0a9e5aa7353476d70c4eb9866aeda979118d04e5;p=ext%2Fsubsurface.git diff --git a/gtk-gui.c b/gtk-gui.c index 41e862e..7d0e95c 100644 --- a/gtk-gui.c +++ b/gtk-gui.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "dive.h" #include "divelist.h" @@ -22,7 +23,6 @@ GtkWidget *error_label; GtkWidget *vpane, *hpane; int error_count; -#define DIVELIST_DEFAULT_FONT "Sans 8" const char *divelist_font; struct units output_units; @@ -107,14 +107,14 @@ static void file_open(GtkWidget *w, gpointer data) gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - GSList *filenames; + GSList *filenames, *fn_glist; char *filename; - filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)); + filenames = fn_glist = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)); GError *error = NULL; while(filenames != NULL) { filename = filenames->data; - parse_xml_file(filename, &error); + parse_file(filename, &error); if (error != NULL) { report_error(error); @@ -125,7 +125,7 @@ static void file_open(GtkWidget *w, gpointer data) g_free(filename); filenames = g_slist_next(filenames); } - g_slist_free(filenames); + g_slist_free(fn_glist); report_dives(FALSE); } gtk_widget_destroy(dialog); @@ -245,7 +245,7 @@ GtkTreeViewColumn *tree_view_column(GtkWidget *tree_view, int index, const char return col; } -static void create_radio(GtkWidget *vbox, const char *name, ...) +static void create_radio(GtkWidget *vbox, const char *w_name, ...) { va_list args; GtkRadioButton *group = NULL; @@ -254,10 +254,10 @@ static void create_radio(GtkWidget *vbox, const char *name, ...) box = gtk_hbox_new(TRUE, 10); gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 0); - label = gtk_label_new(name); + label = gtk_label_new(w_name); gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0); - va_start(args, name); + va_start(args, w_name); for (;;) { int enabled; const char *name; @@ -296,6 +296,8 @@ UNITCALLBACK(set_liter, volume, LITER) UNITCALLBACK(set_cuft, volume, CUFT) UNITCALLBACK(set_celsius, temperature, CELSIUS) UNITCALLBACK(set_fahrenheit, temperature, FAHRENHEIT) +UNITCALLBACK(set_kg, weight, KG) +UNITCALLBACK(set_lbs, weight, LBS) #define OPTIONCALLBACK(name, option) \ static void name(GtkWidget *w, gpointer data) \ @@ -357,6 +359,11 @@ static void preferences_dialog(GtkWidget *w, gpointer data) "Fahrenheit", set_fahrenheit, (output_units.temperature == FAHRENHEIT), NULL); + create_radio(box, "Weight:", + "kg", set_kg, (output_units.weight == KG), + "lbs", set_lbs, (output_units.weight == LBS), + NULL); + frame = gtk_frame_new("Columns"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 5); @@ -409,6 +416,7 @@ static void preferences_dialog(GtkWidget *w, gpointer data) subsurface_set_conf("psi", PREF_BOOL, BOOL_TO_PTR(output_units.pressure == PSI)); subsurface_set_conf("cuft", PREF_BOOL, BOOL_TO_PTR(output_units.volume == CUFT)); subsurface_set_conf("fahrenheit", PREF_BOOL, BOOL_TO_PTR(output_units.temperature == FAHRENHEIT)); + subsurface_set_conf("lbs", PREF_BOOL, BOOL_TO_PTR(output_units.weight == LBS)); subsurface_set_conf("TEMPERATURE", PREF_BOOL, BOOL_TO_PTR(visible_cols.temperature)); subsurface_set_conf("CYLINDER", PREF_BOOL, BOOL_TO_PTR(visible_cols.cylinder)); subsurface_set_conf("NITROX", PREF_BOOL, BOOL_TO_PTR(visible_cols.nitrox)); @@ -523,11 +531,7 @@ static void about_dialog(GtkWidget *w, gpointer data) GdkPixbuf *logo = NULL; if (need_icon) { -#if defined __linux__ || defined __APPLE__ - GtkWidget *image = gtk_image_new_from_file("subsurface.svg"); -#elif defined WIN32 - GtkWidget *image = gtk_image_new_from_file("subsurface.ico"); -#endif + GtkWidget *image = gtk_image_new_from_file(subsurface_icon_name()); if (image) { logo = gtk_image_get_pixbuf(GTK_IMAGE(image)); @@ -577,19 +581,19 @@ static GtkActionEntry menu_items[] = { { "ViewMenuAction", GTK_STOCK_FILE, "View", NULL, NULL, NULL}, { "FilterMenuAction", GTK_STOCK_FILE, "Filter", NULL, NULL, NULL}, { "HelpMenuAction", GTK_STOCK_HELP, "Help", NULL, NULL, NULL}, - { "OpenFile", GTK_STOCK_OPEN, NULL, "O", NULL, G_CALLBACK(file_open) }, - { "SaveFile", GTK_STOCK_SAVE, NULL, "S", NULL, G_CALLBACK(file_save) }, - { "Print", GTK_STOCK_PRINT, NULL, "P", NULL, G_CALLBACK(do_print) }, + { "OpenFile", GTK_STOCK_OPEN, NULL, CTRLCHAR "O", NULL, G_CALLBACK(file_open) }, + { "SaveFile", GTK_STOCK_SAVE, NULL, CTRLCHAR "S", NULL, G_CALLBACK(file_save) }, + { "Print", GTK_STOCK_PRINT, NULL, CTRLCHAR "P", NULL, G_CALLBACK(do_print) }, { "Import", NULL, "Import", NULL, NULL, G_CALLBACK(import_dialog) }, - { "Preferences", NULL, "Preferences", NULL, NULL, G_CALLBACK(preferences_dialog) }, + { "Preferences", NULL, "Preferences", PREFERENCE_ACCEL, NULL, G_CALLBACK(preferences_dialog) }, { "Renumber", NULL, "Renumber", NULL, NULL, G_CALLBACK(renumber_dialog) }, { "SelectEvents", NULL, "SelectEvents", NULL, NULL, G_CALLBACK(selectevents_dialog) }, - { "Quit", GTK_STOCK_QUIT, NULL, "Q", NULL, G_CALLBACK(quit) }, + { "Quit", GTK_STOCK_QUIT, NULL, CTRLCHAR "Q", NULL, G_CALLBACK(quit) }, { "About", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK(about_dialog) }, - { "ViewList", NULL, "List", "1", NULL, G_CALLBACK(view_list) }, - { "ViewProfile", NULL, "Profile", "2", NULL, G_CALLBACK(view_profile) }, - { "ViewInfo", NULL, "Info", "3", NULL, G_CALLBACK(view_info) }, - { "ViewThree", NULL, "Three", "4", NULL, G_CALLBACK(view_three) }, + { "ViewList", NULL, "List", CTRLCHAR "1", NULL, G_CALLBACK(view_list) }, + { "ViewProfile", NULL, "Profile", CTRLCHAR "2", NULL, G_CALLBACK(view_profile) }, + { "ViewInfo", NULL, "Info", CTRLCHAR "3", NULL, G_CALLBACK(view_info) }, + { "ViewThree", NULL, "Three", CTRLCHAR "4", NULL, G_CALLBACK(view_three) }, }; static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); @@ -626,12 +630,11 @@ static const gchar* ui_string = " \ \ "; -static GtkWidget *get_menubar_menu(GtkWidget *window) +static GtkWidget *get_menubar_menu(GtkWidget *window, GtkUIManager *ui_manager) { GtkActionGroup *action_group = gtk_action_group_new("Menu"); gtk_action_group_add_actions(action_group, menu_items, nmenu_items, 0); - GtkUIManager *ui_manager = gtk_ui_manager_new(); gtk_ui_manager_insert_action_group(ui_manager, action_group, 0); GError* error = 0; gtk_ui_manager_add_ui_from_string(GTK_UI_MANAGER(ui_manager), ui_string, -1, &error); @@ -651,15 +654,14 @@ void init_ui(int *argcp, char ***argvp) { GtkWidget *win; GtkWidget *notebook; - GtkWidget *dive_info; + GtkWidget *nb_page; GtkWidget *dive_list; - GtkWidget *equipment; - GtkWidget *stats; GtkWidget *menubar; GtkWidget *vbox; GdkScreen *screen; GtkIconTheme *icon_theme=NULL; GtkSettings *settings; + GtkUIManager *ui_manager; gtk_init(argcp, argvp); settings = gtk_settings_get_default(); @@ -676,6 +678,8 @@ void init_ui(int *argcp, char ***argvp) output_units.volume = CUFT; if (subsurface_get_conf("fahrenheit", PREF_BOOL)) output_units.temperature = FAHRENHEIT; + if (subsurface_get_conf("lbs", PREF_BOOL)) + output_units.weight = LBS; /* an unset key is FALSE - all these are hidden by default */ visible_cols.cylinder = PTR_TO_BOOL(subsurface_get_conf("CYLINDER", PREF_BOOL)); visible_cols.temperature = PTR_TO_BOOL(subsurface_get_conf("TEMPERATURE", PREF_BOOL)); @@ -685,9 +689,6 @@ void init_ui(int *argcp, char ***argvp) divelist_font = subsurface_get_conf("divelist_font", PREF_STRING); - if (!divelist_font) - divelist_font = DIVELIST_DEFAULT_FONT; - error_info_bar = NULL; win = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_set_application_name ("subsurface"); @@ -702,12 +703,11 @@ void init_ui(int *argcp, char ***argvp) gtk_window_set_default_icon_name ("subsurface"); } } - if (need_icon) -#if defined __linux__ || defined __APPLE__ - gtk_window_set_icon_from_file(GTK_WINDOW(win), "subsurface.svg", NULL); -#elif defined WIN32 - gtk_window_set_icon_from_file(GTK_WINDOW(win), "subsurface.ico", NULL); -#endif + if (need_icon) { + const char *icon_name = subsurface_icon_name(); + if (!access(icon_name, R_OK)) + gtk_window_set_icon_from_file(GTK_WINDOW(win), icon_name, NULL); + } g_signal_connect(G_OBJECT(win), "delete-event", G_CALLBACK(on_delete), NULL); g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(on_destroy), NULL); main_window = win; @@ -716,8 +716,10 @@ void init_ui(int *argcp, char ***argvp) gtk_container_add(GTK_CONTAINER(win), vbox); main_vbox = vbox; - menubar = get_menubar_menu(win); - gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); + ui_manager = gtk_ui_manager_new(); + menubar = get_menubar_menu(win, ui_manager); + + subsurface_ui_setup(settings, menubar, vbox, ui_manager); vpane = gtk_vpaned_new(); gtk_box_pack_start(GTK_BOX(vbox), vpane, TRUE, TRUE, 3); @@ -741,16 +743,20 @@ void init_ui(int *argcp, char ***argvp) gtk_paned_add2(GTK_PANED(hpane), dive_profile); /* Frame for extended dive info */ - dive_info = extended_dive_info_widget(); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dive_info, gtk_label_new("Dive Notes")); + nb_page = extended_dive_info_widget(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new("Dive Notes")); /* Frame for dive equipment */ - equipment = equipment_widget(); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), equipment, gtk_label_new("Equipment")); + nb_page = equipment_widget(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new("Equipment")); + + /* Frame for single dive statistics */ + nb_page = single_stats_widget(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new("Dive Info")); - /* Frame for dive statistics */ - stats = stats_widget(); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), stats, gtk_label_new("Info & Stats")); + /* Frame for total dive statistics */ + nb_page = total_stats_widget(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nb_page, gtk_label_new("Stats")); gtk_widget_set_app_paintable(win, TRUE); gtk_widget_show_all(win); @@ -965,7 +971,7 @@ static GtkWidget *xml_file_selector(GtkWidget *vbox, GtkWidget *main_dialog) static void do_import_file(gpointer data, gpointer user_data) { GError *error = NULL; - parse_xml_file(data, &error); + parse_file(data, &error); if (error != NULL) {