/* * Copyright (C) 2006, 2007 John Costigan. * * POI and GPS-Info code originally written by Cezary Jackiewicz. * * Default map data provided by http://www.openstreetmap.org/ * * This file is part of Maemo Mapper. * * Maemo Mapper is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Maemo Mapper is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Maemo Mapper. If not, see . */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #define _GNU_SOURCE #include #include #ifndef LEGACY # include # include # include #else # include # include # include # include #endif #include "types.h" #include "data.h" #include "defines.h" #include "display.h" #include "gps.h" #include "aprs.h" #include "aprs_kiss.h" #include "aprs_display.h" #include "gdk-pixbuf-rotate.h" #include "gpx.h" #include "maps.h" #include "menu.h" #include "path.h" #include "poi.h" #include "settings.h" #include "util.h" /**************************************************************************** * BELOW: ROUTE MENU ******************************************************** ****************************************************************************/ static gboolean menu_cb_route_open(GtkMenuItem *item) { gchar *buffer; gint size; printf("%s()\n", __PRETTY_FUNCTION__); if(display_open_file(GTK_WINDOW(_window), &buffer, NULL, &size, &_route_dir_uri, NULL, GTK_FILE_CHOOSER_ACTION_OPEN)) { /* If auto is enabled, append the route, otherwise replace it. */ if(gpx_path_parse(&_route, buffer, size, _autoroute_data.enabled ? 0 : 1)) { path_save_route_to_db(); cancel_autoroute(); /* Find the nearest route point, if we're connected. */ route_find_nearest_point(); map_force_redraw(); MACRO_BANNER_SHOW_INFO(_window, _("Route Opened")); } else popup_error(_window, _("Error parsing GPX file.")); g_free(buffer); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_route_download(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); route_download(NULL); vprintf("%s(): return\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_route_save(GtkMenuItem *item) { GnomeVFSHandle *handle; printf("%s()\n", __PRETTY_FUNCTION__); if(display_open_file(GTK_WINDOW(_window), NULL, &handle, NULL, &_route_dir_uri, NULL, GTK_FILE_CHOOSER_ACTION_SAVE)) { if(gpx_path_write(&_route, handle)) { MACRO_BANNER_SHOW_INFO(_window, _("Route Saved")); } else popup_error(_window, _("Error writing GPX file.")); gnome_vfs_close(handle); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_route_distnext(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); route_show_distance_to_next(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_route_distlast(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); route_show_distance_to_last(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } gboolean menu_cb_route_reset(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); path_reset_route(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_route_clear(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); cancel_autoroute(); MACRO_PATH_FREE(_route); MACRO_PATH_INIT(_route); path_save_route_to_db(); route_find_nearest_point(); map_force_redraw(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: ROUTE MENU ******************************************************** ****************************************************************************/ /**************************************************************************** * BELOW: TRACK MENU ******************************************************** ****************************************************************************/ static gboolean menu_cb_track_open(GtkMenuItem *item) { gchar *buffer; gint size; printf("%s()\n", __PRETTY_FUNCTION__); if(display_open_file(GTK_WINDOW(_window), &buffer, NULL, &size, NULL, &_track_file_uri, GTK_FILE_CHOOSER_ACTION_OPEN)) { if(gpx_path_parse(&_track, buffer, size, -1)) { map_force_redraw(); MACRO_BANNER_SHOW_INFO(_window, _("Track Opened")); } else popup_error(_window, _("Error parsing GPX file.")); g_free(buffer); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_track_save(GtkMenuItem *item) { GnomeVFSHandle *handle; printf("%s()\n", __PRETTY_FUNCTION__); if(display_open_file(GTK_WINDOW(_window), NULL, &handle, NULL, NULL, &_track_file_uri, GTK_FILE_CHOOSER_ACTION_SAVE)) { if(gpx_path_write(&_track, handle)) { MACRO_BANNER_SHOW_INFO(_window, _("Track Saved")); } else popup_error(_window, _("Error writing GPX file.")); gnome_vfs_close(handle); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_track_insert_break(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); track_insert_break(TRUE); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_track_insert_mark(GtkMenuItem *item) { gdouble lat, lon; gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN], *p_latlon; static GtkWidget *dialog = NULL; static GtkWidget *table = NULL; static GtkWidget *label = NULL; static GtkWidget *lbl_latlon = NULL; static GtkWidget *txt_scroll = NULL; static GtkWidget *txt_desc = NULL; printf("%s()\n", __PRETTY_FUNCTION__); if(dialog == NULL) { dialog = gtk_dialog_new_with_buttons(_("Insert Mark"), GTK_WINDOW(_window), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table = gtk_table_new(2, 2, FALSE), TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Lat, Lon:")), 0, 1, 0, 1, GTK_FILL, 0, 2, 4); gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); gtk_table_attach(GTK_TABLE(table), lbl_latlon = gtk_label_new(""), 1, 2, 0, 1, GTK_FILL, 0, 2, 4); gtk_misc_set_alignment(GTK_MISC(lbl_latlon), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Description")), 0, 1, 1, 2, GTK_FILL, 0, 2, 4); gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); txt_scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll), GTK_SHADOW_IN); gtk_table_attach(GTK_TABLE(table), txt_scroll, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); txt_desc = gtk_text_view_new (); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD); gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc); gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 400, 60); } unit2latlon(_pos.unitx, _pos.unity, lat, lon); format_lat_lon(lat, lon, tmp1, tmp2); //lat_format(lat, tmp1); //lon_format(lon, tmp2); p_latlon = g_strdup_printf("%s, %s", tmp1, tmp2); gtk_label_set_text(GTK_LABEL(lbl_latlon), p_latlon); g_free(p_latlon); gtk_text_buffer_set_text( gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt_desc)), "", 0); gtk_widget_show_all(dialog); while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) { GtkTextBuffer *tbuf; GtkTextIter ti1, ti2; gchar *desc; tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt_desc)); gtk_text_buffer_get_iter_at_offset(tbuf, &ti1, 0); gtk_text_buffer_get_end_iter(tbuf, &ti2); desc = gtk_text_buffer_get_text(tbuf, &ti1, &ti2, TRUE); if(*desc) { MACRO_PATH_INCREMENT_WTAIL(_track); _track.wtail->point = _track.tail; _track.wtail->desc = gtk_text_buffer_get_text(tbuf, &ti1, &ti2, TRUE); } else { popup_error(dialog, _("Please provide a description for the mark.")); g_free(desc); continue; } map_render_paths(); MACRO_QUEUE_DRAW_AREA(); break; } gtk_widget_hide(dialog); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_track_distlast(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); track_show_distance_from_last(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_track_distfirst(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); track_show_distance_from_first(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_track_clear(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); track_clear(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_track_enable_tracking(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(!(_enable_tracking = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_track_enable_tracking_item)))) { track_insert_break(FALSE); /* FALSE = not temporary */ MACRO_BANNER_SHOW_INFO(_window, _("Tracking Disabled")); } else { MACRO_BANNER_SHOW_INFO(_window, _("Tracking Enabled")); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: TRACK MENU ******************************************************** ****************************************************************************/ /**************************************************************************** * BELOW: POI MENU ********************************************************** ****************************************************************************/ static gboolean menu_cb_poi_import(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(poi_import_dialog(_center.unitx, _center.unity)) map_force_redraw(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_poi_download(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(poi_download_dialog(0, 0)) /* 0, 0 means no default origin */ map_force_redraw(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_poi_browse(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(poi_browse_dialog(0, 0)) /* 0, 0 means no default origin */ map_force_redraw(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_poi_categories(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(category_list_dialog(_window)) map_force_redraw(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: POI MENU ********************************************************** ****************************************************************************/ /**************************************************************************** * BELOW: MAPS MENU ********************************************************* ****************************************************************************/ static gboolean menu_cb_maps_repoman(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); repoman_dialog(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_maps_repodown(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); repoman_download(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_maps_select(GtkMenuItem *item, gpointer new_repo) { printf("%s()\n", __PRETTY_FUNCTION__); if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))) { repo_set_curr(new_repo); map_refresh_mark(TRUE); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_maps_mapman(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); mapman_dialog(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_maps_auto_download(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if((_auto_download = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_maps_auto_download_item)))) { if(_curr_repo->url == REPOTYPE_NONE) popup_error(_window, _("NOTE: You must set a Map URI in the current repository in " "order to download maps.")); map_refresh_mark(TRUE); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: MAPS MENU ********************************************************* ****************************************************************************/ /**************************************************************************** * BELOW: LAYERS MENU ******************************************************* ****************************************************************************/ static gboolean menu_cb_layers_toggle(GtkCheckMenuItem *item, gpointer layer) { RepoData* rd = (RepoData*)layer; printf("%s()\n", __PRETTY_FUNCTION__); rd->layer_enabled = !rd->layer_enabled; /* refresh if layer is on top of active map */ if (repo_is_layer (_curr_repo, rd)) { /* reset layer's countdown */ rd->layer_refresh_countdown = rd->layer_refresh_interval; map_cache_clean (); map_refresh_mark (TRUE); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: LAYERS MENU ******************************************************* ****************************************************************************/ /**************************************************************************** * BELOW: VIEW/ZOOM MENU **************************************************** ****************************************************************************/ static gboolean menu_cb_view_zoom_in(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(_zoom > MIN_ZOOM) { gchar buffer[80]; snprintf(buffer, sizeof(buffer),"%s %d", _("Zoom to Level"), _next_zoom - 1); MACRO_BANNER_SHOW_INFO(_window, buffer); map_set_zoom(_next_zoom - 1); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_zoom_out(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(_zoom < MAX_ZOOM) { gchar buffer[80]; snprintf(buffer, sizeof(buffer),"%s %d", _("Zoom to Level"), _next_zoom + 1); MACRO_BANNER_SHOW_INFO(_window, buffer); map_set_zoom(_next_zoom + 1); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: VIEW/ZOOM MENU **************************************************** ****************************************************************************/ /**************************************************************************** * BELOW: VIEW/ROTATE MENU ************************************************** ****************************************************************************/ static gboolean menu_cb_view_rotate_clock(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); map_rotate(-ROTATE_DEGREES); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_rotate_counter(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); map_rotate(ROTATE_DEGREES); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_rotate_reset(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); map_rotate(-_next_map_rotate_angle); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_rotate_auto(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_rotate_auto_item))) { _center_rotate = TRUE; if(_center_mode > 0) map_refresh_mark(TRUE); MACRO_BANNER_SHOW_INFO(_window, _("Auto-Rotate Enabled")); } else { _center_rotate = FALSE; MACRO_BANNER_SHOW_INFO(_window, _("Auto-Rotate Disabled")); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: VIEW/ROTATE MENU ************************************************** ****************************************************************************/ /**************************************************************************** * BELOW: VIEW/PAN MENU ***************************************************** ****************************************************************************/ static gboolean menu_cb_view_pan_up(GtkMenuItem *item) { gfloat panx_adj, pany_adj; printf("%s()\n", __PRETTY_FUNCTION__); /* Adjust for rotate angle. */ gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix, 0, -PAN_PIXELS); map_pan(pixel2unit((gint)(panx_adj + 0.5f)), pixel2unit((gint)(pany_adj + 0.5f))); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_pan_down(GtkMenuItem *item) { gfloat panx_adj, pany_adj; printf("%s()\n", __PRETTY_FUNCTION__); /* Adjust for rotate angle. */ gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix, 0, PAN_PIXELS); map_pan(pixel2unit((gint)(panx_adj + 0.5f)), pixel2unit((gint)(pany_adj + 0.5f))); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_pan_left(GtkMenuItem *item) { gfloat panx_adj, pany_adj; printf("%s()\n", __PRETTY_FUNCTION__); /* Adjust for rotate angle. */ gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix, -PAN_PIXELS, 0); map_pan(pixel2unit((gint)(panx_adj + 0.5f)), pixel2unit((gint)(pany_adj + 0.5f))); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_pan_right(GtkMenuItem *item) { gfloat panx_adj, pany_adj; printf("%s()\n", __PRETTY_FUNCTION__); /* Adjust for rotate angle. */ gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix, PAN_PIXELS, 0); map_pan(pixel2unit((gint)(panx_adj + 0.5f)), pixel2unit((gint)(pany_adj + 0.5f))); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_pan_north(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); map_pan(0, -pixel2unit(PAN_PIXELS)); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_pan_south(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); map_pan(0, pixel2unit(PAN_PIXELS)); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_pan_west(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); map_pan(-pixel2unit(PAN_PIXELS), 0); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_pan_east(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); map_pan(pixel2unit(PAN_PIXELS), 0); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: VIEW/PAN MENU ***************************************************** ****************************************************************************/ /**************************************************************************** * BELOW: VIEW/GOTO MENU **************************************************** ****************************************************************************/ static gboolean menu_cb_view_goto_latlon(GtkMenuItem *item) { static GtkWidget *dialog = NULL; static GtkWidget *table = NULL; static GtkWidget *label = NULL; static GtkWidget *txt_lat = NULL; static GtkWidget *txt_lon = NULL; printf("%s()\n", __PRETTY_FUNCTION__); if(dialog == NULL) { dialog = gtk_dialog_new_with_buttons(_("Go to Lat/Lon"), GTK_WINDOW(_window), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table = gtk_table_new(2, 3, FALSE), TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Latitude")), 0, 1, 0, 1, GTK_FILL, 0, 2, 4); gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); gtk_table_attach(GTK_TABLE(table), txt_lat = gtk_entry_new(), 1, 2, 0, 1, GTK_FILL, 0, 2, 4); gtk_entry_set_width_chars(GTK_ENTRY(txt_lat), 16); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); #ifdef MAEMO_CHANGES #ifndef LEGACY g_object_set(G_OBJECT(txt_lat), "hildon-input-mode", HILDON_GTK_INPUT_MODE_FULL, NULL); #else g_object_set(G_OBJECT(txt_lat), HILDON_AUTOCAP, FALSE, NULL); g_object_set(G_OBJECT(txt_lat), HILDON_INPUT_MODE_HINT, HILDON_INPUT_MODE_HINT_ALPHANUMERICSPECIAL, NULL); #endif #endif gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Longitude")), 0, 1, 1, 2, GTK_FILL, 0, 2, 4); gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); gtk_table_attach(GTK_TABLE(table), txt_lon = gtk_entry_new(), 1, 2, 1, 2, GTK_FILL, 0, 2, 4); gtk_entry_set_width_chars(GTK_ENTRY(txt_lon), 16); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); #ifdef MAEMO_CHANGES #ifndef LEGACY g_object_set(G_OBJECT(txt_lon), "hildon-input-mode", HILDON_GTK_INPUT_MODE_FULL, NULL); #else g_object_set(G_OBJECT(txt_lon), HILDON_AUTOCAP, FALSE, NULL); g_object_set(G_OBJECT(txt_lon), HILDON_INPUT_MODE_HINT, HILDON_INPUT_MODE_HINT_ALPHANUMERICSPECIAL, NULL); #endif #endif } /* Initialize with the current center position. */ { gchar buffer1[32]; gchar buffer2[32]; gdouble lat, lon; unit2latlon(_center.unitx, _center.unity, lat, lon); //lat_format(lat, buffer1); //lon_format(lon, buffer2); format_lat_lon(lat, lon, buffer1, buffer2); gtk_entry_set_text(GTK_ENTRY(txt_lat), buffer1); gtk_entry_set_text(GTK_ENTRY(txt_lon), buffer2); } gtk_widget_show_all(dialog); while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) { const gchar *text; gchar *error_check; gdouble lat, lon; Point sel_unit; text = gtk_entry_get_text(GTK_ENTRY(txt_lat)); lat = strdmstod(text, &error_check); if(text == error_check || lat < -90. || lat > 90.) { popup_error(dialog, _("Invalid Latitude")); continue; } text = gtk_entry_get_text(GTK_ENTRY(txt_lon)); lon = strdmstod(text, &error_check); if(text == error_check || lon < -180. || lon > 180.) { popup_error(dialog, _("Invalid Longitude")); continue; } latlon2unit(lat, lon, sel_unit.unitx, sel_unit.unity); if(_center_mode > 0) gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE); map_center_unit(sel_unit); break; } gtk_widget_hide(dialog); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_goto_address(GtkMenuItem *item) { static GtkWidget *dialog = NULL; static GtkWidget *table = NULL; static GtkWidget *label = NULL; static GtkWidget *txt_addr = NULL; printf("%s()\n", __PRETTY_FUNCTION__); if(dialog == NULL) { GtkEntryCompletion *comp; dialog = gtk_dialog_new_with_buttons(_("Go to Address"), GTK_WINDOW(_window), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table = gtk_table_new(2, 3, FALSE), TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Address")), 0, 1, 0, 1, GTK_FILL, 0, 2, 4); gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); gtk_table_attach(GTK_TABLE(table), txt_addr = gtk_entry_new(), 1, 2, 0, 1, GTK_FILL, 0, 2, 4); gtk_entry_set_width_chars(GTK_ENTRY(txt_addr), 25); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); /* Set up auto-completion. */ comp = gtk_entry_completion_new(); gtk_entry_completion_set_model(comp, GTK_TREE_MODEL(_loc_model)); gtk_entry_completion_set_text_column(comp, 0); gtk_entry_set_completion(GTK_ENTRY(txt_addr), comp); } gtk_widget_show_all(dialog); while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) { Point origin = locate_address(dialog, gtk_entry_get_text(GTK_ENTRY(txt_addr))); if(origin.unity) { MACRO_BANNER_SHOW_INFO(_window, _("Address Located")); if(_center_mode > 0) gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE); map_center_unit(origin); /* Success! Get out of the while loop. */ break; } } gtk_widget_hide(dialog); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_goto_gps(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(_center_mode > 0) gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE); map_center_unit(_pos); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } gboolean menu_cb_view_goto_nextway(GtkMenuItem *item) { WayPoint *next_way; printf("%s()\n", __PRETTY_FUNCTION__); next_way = path_get_next_way(); if(next_way && next_way->point->unity) { if(_center_mode > 0) gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE); map_center_unit(*next_way->point); } else { MACRO_BANNER_SHOW_INFO(_window, _("There is no next waypoint.")); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } gboolean menu_cb_view_goto_nearpoi(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(_poi_enabled) { PoiInfo poi; gchar *banner; if((_center_mode > 0 ? get_nearest_poi(_pos.unitx, _pos.unity, &poi) : get_nearest_poi(_center.unitx, _center.unity, &poi) )) { /* Auto-Center is enabled - use the GPS position. */ Point unit; latlon2unit(poi.lat, poi.lon, unit.unitx, unit.unity); banner = g_strdup_printf("%s (%s)", poi.label, poi.clabel); MACRO_BANNER_SHOW_INFO(_window, banner); g_free(banner); g_free(poi.label); g_free(poi.desc); g_free(poi.clabel); if(_center_mode > 0) gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE); map_center_unit(unit); } else { MACRO_BANNER_SHOW_INFO(_window, _("No POIs found.")); /* Auto-Center is disabled - use the view center. */ } } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: VIEW/GOTO MENU **************************************************** ****************************************************************************/ /**************************************************************************** * BELOW: VIEW/SHOW MENU **************************************************** ****************************************************************************/ static gboolean menu_cb_view_show_tracks(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); _show_paths ^= TRACKS_MASK; if(gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_show_tracks_item))) { _show_paths |= TRACKS_MASK; map_render_paths(); MACRO_QUEUE_DRAW_AREA(); MACRO_BANNER_SHOW_INFO(_window, _("Tracks are now shown")); } else { _show_paths &= ~TRACKS_MASK; map_force_redraw(); MACRO_BANNER_SHOW_INFO(_window, _("Tracks are now hidden")); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_show_zoomlevel(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); _show_zoomlevel = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_show_zoomlevel_item)); map_force_redraw(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_show_scale(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); _show_scale = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_show_scale_item)); map_force_redraw(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_show_comprose(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); _show_comprose = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_show_comprose_item)); map_force_redraw(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_show_routes(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_show_routes_item))) { _show_paths |= ROUTES_MASK; map_render_paths(); MACRO_QUEUE_DRAW_AREA(); MACRO_BANNER_SHOW_INFO(_window, _("Routes are now shown")); } else { _show_paths &= ~ROUTES_MASK; map_force_redraw(); MACRO_BANNER_SHOW_INFO(_window, _("Routes are now hidden")); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_show_velvec(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); _show_velvec = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_show_velvec_item)); map_move_mark(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_show_poi(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); _show_poi = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_show_poi_item)); map_force_redraw(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: VIEW/SHOW MENU **************************************************** ****************************************************************************/ /**************************************************************************** * BELOW: VIEW/AUTO-CENTER MENU ********************************************* ****************************************************************************/ static gboolean menu_cb_view_ac_lead(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_lead_item))) { _center_mode = CENTER_LEAD; MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Mode: Lead")); map_refresh_mark(TRUE); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_ac_latlon(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_latlon_item))) { _center_mode = CENTER_LATLON; MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Mode: Lat/Lon")); map_refresh_mark(TRUE); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_view_ac_none(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item))) { _center_mode = -_center_mode; MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Off")); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: VIEW/AUTO-CENTER MENU ********************************************* ****************************************************************************/ static gboolean menu_cb_view_fullscreen(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if((_fullscreen = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_view_fullscreen_item)))) gtk_window_fullscreen(GTK_WINDOW(_window)); else gtk_window_unfullscreen(GTK_WINDOW(_window)); g_idle_add((GSourceFunc)window_present, NULL); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * BELOW: APRS MENU ********************************************************* ****************************************************************************/ #ifdef INCLUDE_APRS static gboolean menu_cb_aprs_settings(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); gboolean aprs_inet_config_changed = FALSE; gboolean aprs_tty_config_changed = FALSE; aprs_settings_dialog(&aprs_inet_config_changed, &aprs_tty_config_changed); if(aprs_inet_config_changed) { gtk_widget_set_sensitive(GTK_WIDGET(_menu_enable_aprs_inet_item), _aprs_enable); gtk_widget_set_sensitive(GTK_WIDGET(_menu_enable_aprs_tty_item), _aprs_enable); gtk_widget_set_sensitive(GTK_WIDGET(_menu_list_aprs_stations_item), _aprs_enable); gtk_widget_set_sensitive(GTK_WIDGET(_menu_list_aprs_messages_item), _aprs_enable); aprs_server_disconnect(); if(_aprs_enable && _aprs_inet_enable) { aprs_server_connect(); } } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_enable_tty_aprs(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(_aprs_enable) { if((_aprs_tty_enable = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_enable_aprs_tty_item)))) aprs_tty_connect(); else aprs_tty_disconnect(); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_enable_inet_aprs(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(_aprs_enable) { if((_aprs_inet_enable = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_enable_aprs_inet_item)))) aprs_server_connect(); else aprs_server_disconnect(); } else { // APRS not enabled } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_list_aprs_messages(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(_aprs_enable) { list_messages(); } else { // APRS not enabled } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_list_aprs_stations(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(_aprs_enable) { list_stations(); } else { // APRS not enabled } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } #endif // INCLUDE_APRS /**************************************************************************** * BELOW: GPS MENU ********************************************************** ****************************************************************************/ static gboolean menu_cb_gps_enable(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if((_enable_gps = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_gps_enable_item)))) rcvr_connect(); else rcvr_disconnect(); map_move_mark(); gps_show_info(); gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_details_item), _enable_gps); gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_reset_item), _enable_gps); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_gps_show_info(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); _gps_info = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(_menu_gps_show_info_item)); gps_show_info(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_gps_details(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); gps_details(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_gps_reset(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); reset_bluetooth(); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } /**************************************************************************** * ABOVE: GPS MENU ********************************************************** ****************************************************************************/ static gboolean menu_cb_settings(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); if(settings_dialog()) { /* Settings have changed - reconnect to receiver. */ if(_enable_gps) { rcvr_disconnect(); rcvr_connect(); } } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_help(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); #ifndef LEGACY hildon_help_show(_osso, HELP_ID_INTRO, 0); #else ossohelp_show(_osso, HELP_ID_INTRO, 0); #endif vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } static gboolean menu_cb_about(GtkMenuItem *item) { printf("%s()\n", __PRETTY_FUNCTION__); #ifndef LEGACY hildon_help_show(_osso, HELP_ID_ABOUT, HILDON_HELP_SHOW_DIALOG); #else ossohelp_show(_osso, HELP_ID_ABOUT, OSSO_HELP_SHOW_DIALOG); #endif vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } void menu_maps_remove_repos() { GList *curr; printf("%s()\n", __PRETTY_FUNCTION__); /* Delete one menu item for each repo. */ for(curr = _repo_list; curr; curr = curr->next) { gtk_widget_destroy(gtk_container_get_children( GTK_CONTAINER(_menu_maps_submenu))->data); } menu_layers_remove_repos (); vprintf("%s(): return\n", __PRETTY_FUNCTION__); } void menu_layers_remove_repos() { GList *child; printf("%s()\n", __PRETTY_FUNCTION__); /* Delete one menu item for each repo. */ while ((child = gtk_container_get_children(GTK_CONTAINER(_menu_layers_submenu)))) gtk_widget_destroy (child->data); vprintf("%s(): return\n", __PRETTY_FUNCTION__); } void menu_maps_add_repos() { GList *curr; GtkWidget *last_repo = NULL; printf("%s()\n", __PRETTY_FUNCTION__); for(curr = g_list_last(_repo_list); curr; curr = curr->prev) { RepoData *rd = (RepoData*)curr->data; GtkWidget *menu_item; if(last_repo) gtk_menu_prepend(_menu_maps_submenu, menu_item = gtk_radio_menu_item_new_with_label_from_widget( GTK_RADIO_MENU_ITEM(last_repo), rd->name)); else { gtk_menu_prepend(_menu_maps_submenu, menu_item = gtk_radio_menu_item_new_with_label(NULL, rd->name)); last_repo = menu_item; } gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(menu_item), rd == _curr_repo); rd->menu_item = menu_item; } /* Add signals (must be after entire menu is built). */ { GList *currmi = gtk_container_get_children( GTK_CONTAINER(_menu_maps_submenu)); for(curr = _repo_list; curr; curr = curr->next, currmi = currmi->next) { g_signal_connect(G_OBJECT(currmi->data), "activate", G_CALLBACK(menu_cb_maps_select), curr->data); } } gtk_widget_show_all(_menu_maps_submenu); menu_layers_add_repos (); vprintf("%s(): return\n", __PRETTY_FUNCTION__); } void menu_layers_add_repos() { GList *curr; printf("%s()\n", __PRETTY_FUNCTION__); for(curr = _repo_list; curr; curr = curr->next) { RepoData* rd = (RepoData*)curr->data; GtkWidget *item, *submenu = NULL, *layer_item; /* if repository doesn't have layers, skip it */ if (!rd->layers) continue; /* if it has only one layer, add just one check menu item */ if (!rd->layers->layers) { gchar *title = g_malloc (strlen (rd->name) + strlen (rd->layers->name) + 3); sprintf (title, "%s[%s]", rd->name, rd->layers->name); rd = rd->layers; gtk_menu_append (_menu_layers_submenu, layer_item = gtk_check_menu_item_new_with_label (title)); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (layer_item), rd->layer_enabled); g_signal_connect (G_OBJECT (layer_item), "toggled", G_CALLBACK (menu_cb_layers_toggle), rd); rd->menu_item = layer_item; } else { /* append main repository menu item */ gtk_menu_append (_menu_layers_submenu, item = gtk_menu_item_new_with_label(rd->name)); rd = rd->layers; while (rd) { if (!submenu) submenu = gtk_menu_new (); gtk_menu_append (submenu, layer_item = gtk_check_menu_item_new_with_label (rd->name)); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (layer_item), rd->layer_enabled); g_signal_connect (G_OBJECT (layer_item), "toggled", G_CALLBACK (menu_cb_layers_toggle), rd); rd->menu_item = layer_item; rd = rd->layers; } if (submenu) gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu); } } gtk_widget_show_all(_menu_layers_submenu); vprintf("%s(): return\n", __PRETTY_FUNCTION__); } /** * Create the menu items needed for the drop down menu. */ void menu_init() { /* Create needed handles. */ GtkMenu *menu; GtkWidget *submenu; GtkWidget *submenu2; GtkWidget *menu_item; printf("%s()\n", __PRETTY_FUNCTION__); /* Get the menu of our view. */ menu = GTK_MENU(gtk_menu_new()); /* Create the menu items. */ /* The "Routes" submenu. */ gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Route"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new()); gtk_menu_append(submenu, _menu_route_open_item = gtk_menu_item_new_with_label(_("Open..."))); gtk_menu_append(submenu, _menu_route_download_item = gtk_menu_item_new_with_label(_("Download..."))); gtk_menu_append(submenu, _menu_route_save_item = gtk_menu_item_new_with_label(_("Save..."))); gtk_menu_append(submenu, _menu_route_distnext_item = gtk_menu_item_new_with_label(_("Show Distance to Next Waypoint"))); gtk_menu_append(submenu, _menu_route_distlast_item = gtk_menu_item_new_with_label(_("Show Distance to End of Route"))); gtk_menu_append(submenu, _menu_route_reset_item = gtk_menu_item_new_with_label(_("Reset"))); gtk_menu_append(submenu, _menu_route_clear_item = gtk_menu_item_new_with_label(_("Clear"))); /* The "Track" submenu. */ gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Track"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new()); gtk_menu_append(submenu, _menu_track_open_item = gtk_menu_item_new_with_label(_("Open..."))); gtk_menu_append(submenu, _menu_track_save_item = gtk_menu_item_new_with_label(_("Save..."))); gtk_menu_append(submenu, _menu_track_insert_break_item = gtk_menu_item_new_with_label(_("Insert Break"))); gtk_menu_append(submenu, _menu_track_insert_mark_item = gtk_menu_item_new_with_label(_("Insert Mark..."))); gtk_menu_append(submenu, _menu_track_distlast_item = gtk_menu_item_new_with_label(_("Show Distance from Last Mark"))); gtk_menu_append(submenu, _menu_track_distfirst_item = gtk_menu_item_new_with_label(_("Show Distance from Beginning"))); gtk_menu_append(submenu, _menu_track_clear_item = gtk_menu_item_new_with_label(_("Clear"))); gtk_menu_append(submenu, _menu_track_enable_tracking_item = gtk_check_menu_item_new_with_label(_("Enable Tracking"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_track_enable_tracking_item), _enable_tracking); /* The "POI" submenu. */ gtk_menu_append(menu, menu_item = _menu_poi_item = gtk_menu_item_new_with_label(_("POI"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new()); gtk_menu_append(submenu, _menu_poi_import_item = gtk_menu_item_new_with_label(_("Import..."))); gtk_menu_append(submenu, _menu_poi_download_item = gtk_menu_item_new_with_label(_("Download..."))); gtk_menu_append(submenu, _menu_poi_browse_item = gtk_menu_item_new_with_label(_("Browse..."))); gtk_menu_append(submenu, _menu_poi_categories_item = gtk_menu_item_new_with_label(_("Categories..."))); _menu_layers_submenu = gtk_menu_new(); /* The "Maps" submenu. */ gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Maps"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), _menu_maps_submenu = gtk_menu_new()); gtk_menu_append(_menu_maps_submenu, gtk_separator_menu_item_new()); gtk_menu_append(_menu_maps_submenu, _menu_maps_mapman_item = gtk_menu_item_new_with_label(_("Manage Maps..."))); gtk_menu_append(_menu_maps_submenu, _menu_maps_auto_download_item = gtk_check_menu_item_new_with_label(_("Auto-Download"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_maps_auto_download_item),_auto_download); gtk_menu_append(_menu_maps_submenu, gtk_separator_menu_item_new()); gtk_menu_append(_menu_maps_submenu, _menu_maps_repoman_item = gtk_menu_item_new_with_label(_("Manage Repositories..."))); gtk_menu_append(_menu_maps_submenu, _menu_maps_repodown_item = gtk_menu_item_new_with_label( _("Download Sample Repositories..."))); menu_maps_add_repos(); gtk_menu_append(menu, gtk_separator_menu_item_new()); /* The "View" submenu. */ gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("View"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new()); /* The View/Layers submenu */ gtk_menu_append(submenu, menu_item = gtk_menu_item_new_with_label(_("Layers"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), _menu_layers_submenu); /* The "View"/"Zoom" submenu. */ gtk_menu_append(submenu, menu_item = gtk_menu_item_new_with_label(_("Zoom"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu2 = gtk_menu_new()); gtk_menu_append(submenu2, _menu_view_zoom_in_item = gtk_menu_item_new_with_label(_("Zoom In"))); gtk_menu_append(submenu2, _menu_view_zoom_out_item = gtk_menu_item_new_with_label(_("Zoom Out"))); /* The "View"/"Rotate" submenu. */ gtk_menu_append(submenu, menu_item = gtk_menu_item_new_with_label(_("Rotate"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu2 = gtk_menu_new()); gtk_menu_append(submenu2, _menu_view_rotate_clock_item = gtk_menu_item_new_with_label(_("Clockwise"))); gtk_menu_append(submenu2, _menu_view_rotate_counter_item = gtk_menu_item_new_with_label(_("Counter"))); gtk_menu_append(submenu2, gtk_separator_menu_item_new()); gtk_menu_append(submenu2, _menu_view_rotate_reset_item = gtk_menu_item_new_with_label(_("Reset"))); gtk_menu_append(submenu2, _menu_view_rotate_auto_item = gtk_check_menu_item_new_with_label(_("Auto-Rotate"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_rotate_auto_item), _center_rotate); /* The "View"/"Pan" submenu. */ gtk_menu_append(submenu, menu_item = gtk_menu_item_new_with_label(_("Pan"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu2 = gtk_menu_new()); gtk_menu_append(submenu2, _menu_view_pan_up_item = gtk_menu_item_new_with_label(_("Up"))); gtk_menu_append(submenu2, _menu_view_pan_down_item = gtk_menu_item_new_with_label(_("Down"))); gtk_menu_append(submenu2, _menu_view_pan_left_item = gtk_menu_item_new_with_label(_("Left"))); gtk_menu_append(submenu2, _menu_view_pan_right_item = gtk_menu_item_new_with_label(_("Right"))); gtk_menu_append(submenu2, gtk_separator_menu_item_new()); gtk_menu_append(submenu2, _menu_view_pan_north_item = gtk_menu_item_new_with_label(_("North"))); gtk_menu_append(submenu2, _menu_view_pan_south_item = gtk_menu_item_new_with_label(_("South"))); gtk_menu_append(submenu2, _menu_view_pan_west_item = gtk_menu_item_new_with_label(_("West"))); gtk_menu_append(submenu2, _menu_view_pan_east_item = gtk_menu_item_new_with_label(_("East"))); /* The "Go to" submenu. */ gtk_menu_append(submenu, menu_item = gtk_menu_item_new_with_label(_("Go to"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu2 = gtk_menu_new()); gtk_menu_append(submenu2, _menu_view_goto_latlon_item = gtk_menu_item_new_with_label(_("Lat/Lon..."))); gtk_menu_append(submenu2, _menu_view_goto_address_item = gtk_menu_item_new_with_label(_("Address..."))); gtk_menu_append(submenu2, _menu_view_goto_gps_item = gtk_menu_item_new_with_label(_("GPS Location"))); gtk_menu_append(submenu2, _menu_view_goto_nextway_item = gtk_menu_item_new_with_label(_("Next Waypoint"))); gtk_menu_append(submenu2, _menu_view_goto_nearpoi_item = gtk_menu_item_new_with_label(_("Nearest POI"))); gtk_menu_append(submenu, gtk_separator_menu_item_new()); /* The "View"/"Show" submenu. */ gtk_menu_append(submenu, menu_item = gtk_menu_item_new_with_label(_("Show"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu2 = gtk_menu_new()); gtk_menu_append(submenu2, _menu_view_show_zoomlevel_item = gtk_check_menu_item_new_with_label(_("Zoom Level"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_show_zoomlevel_item), _show_zoomlevel); gtk_menu_append(submenu2, _menu_view_show_scale_item = gtk_check_menu_item_new_with_label(_("Scale"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_show_scale_item), _show_scale); gtk_menu_append(submenu2, _menu_view_show_comprose_item = gtk_check_menu_item_new_with_label(_("Compass Rose"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_show_comprose_item), _show_comprose); gtk_menu_append(submenu2, _menu_view_show_routes_item = gtk_check_menu_item_new_with_label(_("Route"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_show_routes_item), _show_paths & ROUTES_MASK); gtk_menu_append(submenu2, _menu_view_show_tracks_item = gtk_check_menu_item_new_with_label(_("Track"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_show_tracks_item), _show_paths & TRACKS_MASK); gtk_menu_append(submenu2, _menu_view_show_velvec_item = gtk_check_menu_item_new_with_label(_("Velocity Vector"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_show_velvec_item), _show_velvec); gtk_menu_append(submenu2, _menu_view_show_poi_item = gtk_check_menu_item_new_with_label(_("POI"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_show_poi_item), _show_poi); /* The "View"/"Auto-Center" submenu. */ gtk_menu_append(submenu, menu_item = gtk_menu_item_new_with_label(_("Auto-Center"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu2 = gtk_menu_new()); gtk_menu_append(submenu2, _menu_view_ac_latlon_item = gtk_radio_menu_item_new_with_label(NULL, _("Lat/Lon"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_latlon_item), _center_mode == CENTER_LATLON); gtk_menu_append(submenu2, _menu_view_ac_lead_item = gtk_radio_menu_item_new_with_label_from_widget( GTK_RADIO_MENU_ITEM(_menu_view_ac_latlon_item), _("Lead"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_lead_item), _center_mode == CENTER_LEAD); gtk_menu_append(submenu2, _menu_view_ac_none_item = gtk_radio_menu_item_new_with_label_from_widget( GTK_RADIO_MENU_ITEM(_menu_view_ac_latlon_item), _("None"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), _center_mode < 0); gtk_menu_append(submenu, gtk_separator_menu_item_new()); gtk_menu_append(submenu, _menu_view_fullscreen_item = gtk_check_menu_item_new_with_label(_("Full Screen"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_view_fullscreen_item), _fullscreen); /* The "GPS" submenu. */ gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("GPS"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new()); gtk_menu_append(submenu, _menu_gps_enable_item = gtk_check_menu_item_new_with_label(_("Enable GPS"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_gps_enable_item), _enable_gps); gtk_menu_append(submenu, _menu_gps_show_info_item = gtk_check_menu_item_new_with_label(_("Show Information"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_gps_show_info_item), _gps_info); gtk_menu_append(submenu, _menu_gps_details_item = gtk_menu_item_new_with_label(_("Details..."))); gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_details_item), _enable_gps); gtk_menu_append(submenu, _menu_gps_reset_item = gtk_menu_item_new_with_label(_("Reset Bluetooth"))); gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_reset_item), _enable_gps); gtk_menu_append(menu, gtk_separator_menu_item_new()); #ifdef INCLUDE_APRS /* The "APRS" submenu. */ gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("APRS"))); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new()); gtk_menu_append(submenu, _menu_enable_aprs_inet_item = gtk_check_menu_item_new_with_label(_("Connect to APRS Server"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_enable_aprs_inet_item), _aprs_inet_enable); gtk_widget_set_sensitive(GTK_WIDGET(_menu_enable_aprs_inet_item), _aprs_enable); gtk_menu_append(submenu, _menu_enable_aprs_tty_item = gtk_check_menu_item_new_with_label(_("Connect to TNC"))); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(_menu_enable_aprs_tty_item), _aprs_tty_enable); gtk_widget_set_sensitive(GTK_WIDGET(_menu_enable_aprs_tty_item), _aprs_enable); gtk_menu_append(submenu, _menu_list_aprs_stations_item = gtk_menu_item_new_with_label(_("List Stations..."))); gtk_widget_set_sensitive(GTK_WIDGET(_menu_list_aprs_stations_item), _aprs_enable); gtk_menu_append(submenu, _menu_list_aprs_messages_item = gtk_menu_item_new_with_label(_("List Messages..."))); gtk_widget_set_sensitive(GTK_WIDGET(_menu_list_aprs_messages_item), _aprs_enable); gtk_menu_append(submenu, _menu_aprs_settings_item = gtk_menu_item_new_with_label(_("APRS Settings..."))); gtk_menu_append(menu, gtk_separator_menu_item_new()); #endif // INCLUDE_APRS /* The other menu items. */ gtk_menu_append(menu, _menu_settings_item = gtk_menu_item_new_with_label(_("Settings..."))); gtk_menu_append(menu, gtk_separator_menu_item_new()); gtk_menu_append(menu, _menu_help_item = gtk_menu_item_new_with_label(_("Help..."))); gtk_menu_append(menu, _menu_about_item = gtk_menu_item_new_with_label(_("About..."))); gtk_menu_append(menu, _menu_close_item = gtk_menu_item_new_with_label(_("Close"))); /* We need to show menu items. */ gtk_widget_show_all(GTK_WIDGET(menu)); hildon_window_set_menu(HILDON_WINDOW(_window), menu); /* Connect the "Route" signals. */ g_signal_connect(G_OBJECT(_menu_route_open_item), "activate", G_CALLBACK(menu_cb_route_open), NULL); g_signal_connect(G_OBJECT(_menu_route_download_item), "activate", G_CALLBACK(menu_cb_route_download), NULL); g_signal_connect(G_OBJECT(_menu_route_save_item), "activate", G_CALLBACK(menu_cb_route_save), NULL); g_signal_connect(G_OBJECT(_menu_route_distnext_item), "activate", G_CALLBACK(menu_cb_route_distnext), NULL); g_signal_connect(G_OBJECT(_menu_route_distlast_item), "activate", G_CALLBACK(menu_cb_route_distlast), NULL); g_signal_connect(G_OBJECT(_menu_route_reset_item), "activate", G_CALLBACK(menu_cb_route_reset), NULL); g_signal_connect(G_OBJECT(_menu_route_clear_item), "activate", G_CALLBACK(menu_cb_route_clear), NULL); /* Connect the "Track" signals. */ g_signal_connect(G_OBJECT(_menu_track_open_item), "activate", G_CALLBACK(menu_cb_track_open), NULL); g_signal_connect(G_OBJECT(_menu_track_save_item), "activate", G_CALLBACK(menu_cb_track_save), NULL); g_signal_connect(G_OBJECT(_menu_track_insert_break_item), "activate", G_CALLBACK(menu_cb_track_insert_break), NULL); g_signal_connect(G_OBJECT(_menu_track_insert_mark_item), "activate", G_CALLBACK(menu_cb_track_insert_mark), NULL); g_signal_connect(G_OBJECT(_menu_track_distlast_item), "activate", G_CALLBACK(menu_cb_track_distlast), NULL); g_signal_connect(G_OBJECT(_menu_track_distfirst_item), "activate", G_CALLBACK(menu_cb_track_distfirst), NULL); g_signal_connect(G_OBJECT(_menu_track_clear_item), "activate", G_CALLBACK(menu_cb_track_clear), NULL); g_signal_connect(G_OBJECT(_menu_track_enable_tracking_item), "toggled", G_CALLBACK(menu_cb_track_enable_tracking), NULL); /* Connect the "POI" signals. */ g_signal_connect(G_OBJECT(_menu_poi_import_item), "activate", G_CALLBACK(menu_cb_poi_import), NULL); g_signal_connect(G_OBJECT(_menu_poi_download_item), "activate", G_CALLBACK(menu_cb_poi_download), NULL); g_signal_connect(G_OBJECT(_menu_poi_browse_item), "activate", G_CALLBACK(menu_cb_poi_browse), NULL); g_signal_connect(G_OBJECT(_menu_poi_categories_item), "activate", G_CALLBACK(menu_cb_poi_categories), NULL); /* Connect the "Maps" signals. */ g_signal_connect(G_OBJECT(_menu_maps_repoman_item), "activate", G_CALLBACK(menu_cb_maps_repoman), NULL); g_signal_connect(G_OBJECT(_menu_maps_repodown_item), "activate", G_CALLBACK(menu_cb_maps_repodown), NULL); g_signal_connect(G_OBJECT(_menu_maps_mapman_item), "activate", G_CALLBACK(menu_cb_maps_mapman), NULL); g_signal_connect(G_OBJECT(_menu_maps_auto_download_item), "toggled", G_CALLBACK(menu_cb_maps_auto_download), NULL); /* Connect the "View" signals. */ g_signal_connect(G_OBJECT(_menu_view_zoom_in_item), "activate", G_CALLBACK(menu_cb_view_zoom_in), NULL); g_signal_connect(G_OBJECT(_menu_view_zoom_out_item), "activate", G_CALLBACK(menu_cb_view_zoom_out), NULL); g_signal_connect(G_OBJECT(_menu_view_rotate_clock_item), "activate", G_CALLBACK(menu_cb_view_rotate_clock), NULL); g_signal_connect(G_OBJECT(_menu_view_rotate_counter_item), "activate", G_CALLBACK(menu_cb_view_rotate_counter), NULL); g_signal_connect(G_OBJECT(_menu_view_rotate_reset_item), "activate", G_CALLBACK(menu_cb_view_rotate_reset), NULL); g_signal_connect(G_OBJECT(_menu_view_rotate_auto_item), "toggled", G_CALLBACK(menu_cb_view_rotate_auto), NULL); g_signal_connect(G_OBJECT(_menu_view_pan_up_item), "activate", G_CALLBACK(menu_cb_view_pan_up), NULL); g_signal_connect(G_OBJECT(_menu_view_pan_down_item), "activate", G_CALLBACK(menu_cb_view_pan_down), NULL); g_signal_connect(G_OBJECT(_menu_view_pan_left_item), "activate", G_CALLBACK(menu_cb_view_pan_left), NULL); g_signal_connect(G_OBJECT(_menu_view_pan_right_item), "activate", G_CALLBACK(menu_cb_view_pan_right), NULL); g_signal_connect(G_OBJECT(_menu_view_pan_north_item), "activate", G_CALLBACK(menu_cb_view_pan_north), NULL); g_signal_connect(G_OBJECT(_menu_view_pan_south_item), "activate", G_CALLBACK(menu_cb_view_pan_south), NULL); g_signal_connect(G_OBJECT(_menu_view_pan_west_item), "activate", G_CALLBACK(menu_cb_view_pan_west), NULL); g_signal_connect(G_OBJECT(_menu_view_pan_east_item), "activate", G_CALLBACK(menu_cb_view_pan_east), NULL); g_signal_connect(G_OBJECT(_menu_view_goto_latlon_item), "activate", G_CALLBACK(menu_cb_view_goto_latlon), NULL); g_signal_connect(G_OBJECT(_menu_view_goto_address_item), "activate", G_CALLBACK(menu_cb_view_goto_address), NULL); g_signal_connect(G_OBJECT(_menu_view_goto_gps_item), "activate", G_CALLBACK(menu_cb_view_goto_gps), NULL); g_signal_connect(G_OBJECT(_menu_view_goto_nextway_item), "activate", G_CALLBACK(menu_cb_view_goto_nextway), NULL); g_signal_connect(G_OBJECT(_menu_view_goto_nearpoi_item), "activate", G_CALLBACK(menu_cb_view_goto_nearpoi), NULL); g_signal_connect(G_OBJECT(_menu_view_show_tracks_item), "toggled", G_CALLBACK(menu_cb_view_show_tracks), NULL); g_signal_connect(G_OBJECT(_menu_view_show_zoomlevel_item), "toggled", G_CALLBACK(menu_cb_view_show_zoomlevel), NULL); g_signal_connect(G_OBJECT(_menu_view_show_scale_item), "toggled", G_CALLBACK(menu_cb_view_show_scale), NULL); g_signal_connect(G_OBJECT(_menu_view_show_comprose_item), "toggled", G_CALLBACK(menu_cb_view_show_comprose), NULL); g_signal_connect(G_OBJECT(_menu_view_show_routes_item), "toggled", G_CALLBACK(menu_cb_view_show_routes), NULL); g_signal_connect(G_OBJECT(_menu_view_show_velvec_item), "toggled", G_CALLBACK(menu_cb_view_show_velvec), NULL); g_signal_connect(G_OBJECT(_menu_view_show_poi_item), "toggled", G_CALLBACK(menu_cb_view_show_poi), NULL); g_signal_connect(G_OBJECT(_menu_view_ac_latlon_item), "toggled", G_CALLBACK(menu_cb_view_ac_latlon), NULL); g_signal_connect(G_OBJECT(_menu_view_ac_lead_item), "toggled", G_CALLBACK(menu_cb_view_ac_lead), NULL); g_signal_connect(G_OBJECT(_menu_view_ac_none_item), "toggled", G_CALLBACK(menu_cb_view_ac_none), NULL); g_signal_connect(G_OBJECT(_menu_view_fullscreen_item), "toggled", G_CALLBACK(menu_cb_view_fullscreen), NULL); /* Connect the "GPS" signals. */ g_signal_connect(G_OBJECT(_menu_gps_enable_item), "toggled", G_CALLBACK(menu_cb_gps_enable), NULL); g_signal_connect(G_OBJECT(_menu_gps_show_info_item), "toggled", G_CALLBACK(menu_cb_gps_show_info), NULL); g_signal_connect(G_OBJECT(_menu_gps_details_item), "activate", G_CALLBACK(menu_cb_gps_details), NULL); g_signal_connect(G_OBJECT(_menu_gps_reset_item), "activate", G_CALLBACK(menu_cb_gps_reset), NULL); #ifdef INCLUDE_APRS /* Connect the "APRS" signals. */ g_signal_connect(G_OBJECT(_menu_enable_aprs_inet_item), "toggled", G_CALLBACK(menu_cb_enable_inet_aprs), NULL); g_signal_connect(G_OBJECT(_menu_enable_aprs_tty_item), "toggled", G_CALLBACK(menu_cb_enable_tty_aprs), NULL); g_signal_connect(G_OBJECT(_menu_list_aprs_stations_item), "activate", G_CALLBACK(menu_cb_list_aprs_stations), NULL); g_signal_connect(G_OBJECT(_menu_list_aprs_messages_item), "activate", G_CALLBACK(menu_cb_list_aprs_messages), NULL); g_signal_connect(G_OBJECT(_menu_aprs_settings_item), "activate", G_CALLBACK(menu_cb_aprs_settings), NULL); #endif // INCLUDE_APRS /* Connect the other menu item signals. */ g_signal_connect(G_OBJECT(_menu_settings_item), "activate", G_CALLBACK(menu_cb_settings), NULL); g_signal_connect(G_OBJECT(_menu_help_item), "activate", G_CALLBACK(menu_cb_help), NULL); g_signal_connect(G_OBJECT(_menu_about_item), "activate", G_CALLBACK(menu_cb_about), NULL); g_signal_connect(G_OBJECT(_menu_close_item), "activate", G_CALLBACK(gtk_main_quit), NULL); vprintf("%s(): return\n", __PRETTY_FUNCTION__); }