X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcb.c;h=36406cbc0b2d187c7e993db419b406649901cea1;hb=a434e8412bc14d3f7fd5a013a9e8a8b5f215df90;hp=8d7ca1bc61f8c946d5dd592a52cee366d6937c9a;hpb=48ad2777ad395e7991964549e78402fe120ca84e;p=mapper diff --git a/src/cb.c b/src/cb.c index 8d7ca1b..36406cb 100644 --- a/src/cb.c +++ b/src/cb.c @@ -45,11 +45,8 @@ #include "utils.h" #include "poi.h" #include "path.h" -#include "route.h" -#include "track.h" #include "settings.h" #include "gps.h" -#include "map.h" #include "mapper-types.h" #include "ui-common.h" #include "db.h" @@ -64,6 +61,7 @@ #include "help.h" #include "map-repo.h" #include "config-gconf.h" +#include "gtkmap.h" static gboolean path_tree_view_update_store(GtkWidget *tree_view, Path *path) @@ -73,7 +71,7 @@ GtkListStore *store; g_assert(tree_view); g_assert(path); -store=path_generate_store(path); +store=path_get_waypoints_store(path); if (!store) return FALSE; @@ -86,7 +84,7 @@ return TRUE; Route menu callbacks ***********************/ gboolean -menu_cb_route_download(GtkAction * action) +menu_cb_route_download(GtkAction *action) { route_download(_route, NULL); route_menu_set_sensitive(path_tree_view_update_store(route_tree_view, _route)); @@ -102,37 +100,35 @@ return TRUE; } gboolean -menu_cb_route_save(GtkAction * action) +menu_cb_route_save(GtkAction *action) { route_save(_route); return TRUE; } gboolean -menu_cb_route_distnext(GtkAction * action) +menu_cb_route_distnext(GtkAction *action) { -route_show_distance_to_next(_route); +path_show_distance_to_next(_route); return TRUE; } gboolean -menu_cb_route_distlast(GtkAction * action) +menu_cb_route_distlast(GtkAction *action) { -route_show_distance_to_last(_route); +path_show_distance_to_last(_route); return TRUE; } gboolean -menu_cb_route_reset(GtkAction * action) +menu_cb_route_reset(GtkAction *action) { -route_find_nearest_point(_route); -map_render_data(); -MACRO_QUEUE_DRAW_AREA(); +path_find_nearest_point(_route, _gps->data.lat, _gps->data.lon); return TRUE; } gboolean -menu_cb_route_clear(GtkAction * action) +menu_cb_route_clear(GtkAction *action) { if (route_clear(_route)) { gtk_tree_view_set_model(route_tree_view, NULL); @@ -145,7 +141,7 @@ return TRUE; Track menu callbacks ***********************/ gboolean -menu_cb_track_open(GtkAction * action) +menu_cb_track_open(GtkAction *action) { track_open(_track); path_tree_view_update_store(track_tree_view, _track); @@ -153,7 +149,7 @@ return TRUE; } gboolean -menu_cb_track_save(GtkAction * action) +menu_cb_track_save(GtkAction *action) { track_save(_track); path_tree_view_update_store(track_tree_view, _track); @@ -161,7 +157,7 @@ return TRUE; } gboolean -menu_cb_track_insert_break(GtkAction * action) +menu_cb_track_insert_break(GtkAction *action) { path_insert_break(_track); path_tree_view_update_store(track_tree_view, _track); @@ -169,40 +165,38 @@ return TRUE; } gboolean -menu_cb_track_insert_mark(GtkAction * action) +menu_cb_track_insert_mark(GtkAction *action) { -if (track_insert_mark(_track)) { - map_render_paths(); - MACRO_QUEUE_DRAW_AREA(); +if (path_insert_mark(_track)) { path_tree_view_update_store(track_tree_view, _track); } return TRUE; } gboolean -menu_cb_track_distlast(GtkAction * action) +menu_cb_track_distlast(GtkAction *action) { -track_show_distance_from_last(_track); +path_show_distance_from_last(_track); return TRUE; } gboolean -menu_cb_track_distfirst(GtkAction * action) +menu_cb_track_distfirst(GtkAction *action) { -track_show_distance_from_first(_track); +path_show_distance_from_first(_track); return TRUE; } gboolean -menu_cb_track_clear(GtkAction * action) +menu_cb_track_clear(GtkAction *action) { -track_clear(_track); +path_clear(_track); path_tree_view_update_store(track_tree_view, _track); return TRUE; } gboolean -menu_cb_track_filter(GtkAction * action) +menu_cb_track_filter(GtkAction *action) { filter_dialog(_window); return TRUE; @@ -217,59 +211,57 @@ menu_cb_show_tracks(GtkAction *action) _show_tracks ^= TRACKS_MASK; if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action))) { _show_tracks |= TRACKS_MASK; - map_render_paths(); - MACRO_QUEUE_DRAW_AREA(); + gtk_map_set_path_display(_map, _show_tracks); MACRO_BANNER_SHOW_INFO(_window, _("Tracks are now shown")); } else { _show_tracks &= ~TRACKS_MASK; - map_force_redraw(); + gtk_map_set_path_display(_map, _show_tracks); MACRO_BANNER_SHOW_INFO(_window, _("Tracks are now hidden")); } return TRUE; } gboolean -menu_cb_show_scale(GtkAction * action) +menu_cb_show_scale(GtkAction *action) { _show_scale = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)); -MACRO_QUEUE_DRAW_AREA(); +/* XXXXXXXXXXXXXXXXX */ return TRUE; } gboolean -menu_cb_show_routes(GtkAction * action) +menu_cb_show_routes(GtkAction *action) { if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action))) { _show_tracks |= ROUTES_MASK; - map_render_paths(); - MACRO_QUEUE_DRAW_AREA(); + gtk_map_set_path_display(_map, _show_tracks); MACRO_BANNER_SHOW_INFO(_window, _("Routes are now shown")); } else { _show_tracks &= ~ROUTES_MASK; - map_force_redraw(); + gtk_map_set_path_display(_map, _show_tracks); MACRO_BANNER_SHOW_INFO(_window, _("Routes are now hidden")); } return TRUE; } gboolean -menu_cb_show_velvec(GtkAction * action) +menu_cb_show_velvec(GtkAction *action) { _show_velvec = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)); -map_move_mark(); +g_object_set(_map, "show-velvec", _show_velvec, NULL); return TRUE; } gboolean -menu_cb_show_poi(GtkAction * action) +menu_cb_show_poi(GtkAction *action) { _show_poi = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)); -map_force_redraw(); +g_object_set(_map, "show-markers", _show_poi, NULL); return TRUE; } gboolean -menu_cb_gps_show_info(GtkAction * action) +menu_cb_gps_show_info(GtkAction *action) { _gps_info = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)); gps_show_info(_gps); @@ -279,46 +271,42 @@ return TRUE; gboolean menu_cb_autocenter(GtkAction *action, GtkRadioAction *current) { -guint new_center_unitx, new_center_unity; -gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current)); +gint value=gtk_radio_action_get_current_value(GTK_RADIO_ACTION(current)); switch (value) { case CENTER_LEAD: - _center_mode = CENTER_LEAD; + gtk_map_set_center_mode(_map, CENTER_LEAD); MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Mode: Lead")); break; case CENTER_LATLON: - _center_mode = CENTER_LATLON; + gtk_map_set_center_mode(_map, CENTER_LATLON); MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Mode: Lat/Lon")); break; case CENTER_MANUAL: default: - _center_mode = -_center_mode; + gtk_map_set_center_mode(_map, CENTER_MANUAL); MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Off")); - return TRUE; break; } -MACRO_RECALC_CENTER(_gps->data, new_center_unitx, new_center_unity); -map_center_unit(new_center_unitx, new_center_unity); return TRUE; } gboolean -menu_cb_goto_latlon(GtkAction * action) +menu_cb_goto_latlon(GtkAction *action) { -map_dialog_goto_latlon(); +gtk_map_dialog_goto_latlon(); return TRUE; } gboolean menu_cb_goto_home(GtkAction *action) { -if (map_goto_position(_home)==FALSE) { +if (gtk_map_goto_position(_home)==FALSE) { MACRO_BANNER_SHOW_INFO(_window, _("Home not set.")); } else { - if (map_get_zoom()>3) - map_set_zoom(3); + if (gtk_map_get_zoom(_map)>3) + gtk_map_set_zoom(_map, 3); MACRO_BANNER_SHOW_INFO(_window, _("At home location")); } return TRUE; @@ -327,11 +315,12 @@ return TRUE; gboolean menu_cb_goto_destination(GtkAction *action) { -if (map_goto_position(_dest)==FALSE) { - MACRO_BANNER_SHOW_INFO(_window, _("Destination not set.")); +if (gtk_map_goto_position(_dest)==FALSE) { + MACRO_BANNER_SHOW_INFO(_window, _("Destination has not been set.")); } else { - map_set_zoom(3); - MACRO_BANNER_SHOW_INFO(_window, _("At destination")); + if (gtk_map_get_zoom(_map)>3) + gtk_map_set_zoom(_map, 3); + MACRO_BANNER_SHOW_INFO(_window, _("At destination point")); } return TRUE; } @@ -339,23 +328,29 @@ return TRUE; gboolean menu_cb_goto_gps(GtkAction *action) { -_center_mode = CENTER_LATLON; -map_center_unit(_gps->data.unitx, _gps->data.unity); -map_update_location_from_center(); -MACRO_BANNER_SHOW_INFO(_window, _("At GPS coordinates.")); +if (gtk_map_set_center_mode(_map, CENTER_LATLON)) { + MACRO_BANNER_SHOW_INFO(_window, _("At GPS track coordinates.")); +} else { + MACRO_BANNER_SHOW_INFO(_window, _("No active GPS track.")); +} return TRUE; } gboolean -menu_cb_goto_nextway(GtkAction * action) +menu_cb_goto_nextway(GtkAction *action) { +GtkMapCenterMode cm; + g_return_val_if_fail(_route, TRUE); -if (_route->next_way && _route->next_way->point->unity) { - if (_center_mode > 0) +if (_route->next_way && _route->next_way->point && _route->next_way->point->unity && _route->next_way->point->unitx) { + g_object_get(_map, "center-mode", &cm); + if (cm>0) set_action_activate("autocenter_none", TRUE); - map_center_unit(_route->next_way->point->unitx, _route->next_way->point->unity); + gtk_map_set_center(_map, _route->next_way->point->unitx, _route->next_way->point->unity); + if (gtk_map_get_zoom(_map)>3) + gtk_map_set_zoom(_map, 3); } else { MACRO_BANNER_SHOW_INFO(_window, _("There is no next waypoint.")); } @@ -364,38 +359,28 @@ return TRUE; } gboolean -menu_cb_goto_nearpoi(GtkAction * action) +menu_cb_goto_nearpoi(GtkAction *action) { +GtkMapCenterMode cm; gdouble lat, lon; poi_info *p; -if (_center_mode > 0) { - /* Auto-Center is enabled - use the GPS position. */ - lat=_gps->data.lat; - lon=_gps->data.lon; -} else { - /* Auto-Center is disabled - use the view center. */ - unit2latlon(_center.unitx, _center.unity, lat, lon); -} +gtk_map_get_center_latlon(_map, &lat, &lon); p=poi_find_nearest(lat, lon); - if (p) { - guint unitx, unity; gchar *banner; - latlon2unit(p->lat, p->lon, unitx, unity); banner = g_strdup_printf("%s (%s)", p->label, p->cat_label); - g_printf("%s\n", banner); MACRO_BANNER_SHOW_INFO(_window, banner); g_free(banner); poi_free(p); - if (_center_mode > 0) + g_object_get(_map, "center-mode", &cm); + if (cm!=CENTER_MANUAL) set_action_activate("autocenter_none", TRUE); - map_center_unit(unitx, unity); - map_update_location_from_center(); + gtk_map_set_center_latlon(_map, p->lat, p->lon); } else { MACRO_BANNER_SHOW_INFO(_window, _("No POIs found.")); } @@ -404,53 +389,49 @@ return TRUE; } gboolean -menu_cb_maps_repoman(GtkAction * action) +menu_cb_maps_repoman(GtkAction *action) { repoman_dialog(); return TRUE; } gboolean -menu_cb_maps_select(GtkAction * action, gpointer new_repo) +menu_cb_maps_select(GtkAction *action, gpointer new_repo) { -repo_set_curr(new_repo); -map_force_redraw(); +gtk_map_set_repo(_map, new_repo); return TRUE; } gboolean -cb_zoom_auto(GtkAction * action) +cb_zoom_auto(GtkAction *action) { -map_set_autozoom(TRUE, _gps->data.speed); +gtk_map_set_autozoom(_map, TRUE); return TRUE; } gboolean -cb_zoom_base(GtkAction * action) +cb_zoom_base(GtkAction *action) { -map_set_autozoom(FALSE, 0); -map_set_zoom(3); +gtk_map_set_autozoom(_map, FALSE); return TRUE; } gboolean -cb_zoomin(GtkAction * action) +cb_zoomin(GtkAction *action) { -map_set_autozoom(FALSE, 0); -g_idle_add((GSourceFunc)map_zoom_in, NULL); +g_idle_add((GSourceFunc)gtk_map_zoom_in, NULL); return TRUE; } gboolean -cb_zoomout(GtkAction * action) +cb_zoomout(GtkAction *action) { -map_set_autozoom(FALSE, 0); -g_idle_add((GSourceFunc)map_zoom_out, NULL); +g_idle_add((GSourceFunc)gtk_map_zoom_out, NULL); return TRUE; } gboolean -cb_fullscreen(GtkAction * action) +cb_fullscreen(GtkAction *action) { if ((_fullscreen = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)))) { gtk_window_fullscreen(GTK_WINDOW(_window)); @@ -473,7 +454,7 @@ return TRUE; } gboolean -menu_cb_enable_gps(GtkAction * action) +menu_cb_enable_gps(GtkAction *action) { if ((_enable_gps = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)))) { if (_gps->io.address) { @@ -487,7 +468,7 @@ if ((_enable_gps = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)))) { if (_gps->io.conn > RCVR_OFF) gps_conn_set_state(_gps, RCVR_OFF); gps_disconnect(_gps); - track_add(_track, NULL); + path_add_break(_track); _speed_excess=FALSE; } if (_enable_gps==FALSE) @@ -496,21 +477,18 @@ set_action_sensitive("goto_gps", _enable_gps); set_action_sensitive("autocenter_latlon", _enable_gps); set_action_sensitive("autocenter_lead", _enable_gps); -map_move_mark(); gps_show_info(&_gps->data); return TRUE; } gboolean -menu_cb_auto_download(GtkAction * action) +menu_cb_auto_download(GtkAction *action) { if ((_auto_download = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action)) )) { - if (_curr_repo->url == REPOTYPE_NONE) { + 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.")); - /* set_action_activate("", FALSE); */ - } - map_force_redraw(); + gtk_map_refresh(_map); } else { map_download_stop(); } @@ -519,18 +497,16 @@ return TRUE; } gboolean -menu_cb_settings(GtkAction * action) +menu_cb_settings(GtkAction *action) { if (settings_dialog()) { - MACRO_RECALC_FOCUS_BASE(_center_ratio); - MACRO_RECALC_FOCUS_SIZE(_center_ratio); - map_force_redraw(); + gtk_map_refresh(_map); } return TRUE; } gboolean -menu_cb_settings_gps(GtkAction * action) +menu_cb_settings_gps(GtkAction *action) { if (settings_dialog_gps(_gps)) { /* Settings have changed - reconnect to receiver. */ @@ -545,43 +521,42 @@ return TRUE; } gboolean -menu_cb_settings_colors(GtkAction * action) +menu_cb_settings_colors(GtkAction *action) { settings_dialog_colors(); -map_force_redraw(); return TRUE; } gboolean -menu_cb_settings_osm(GtkAction * action) +menu_cb_settings_osm(GtkAction *action) { settings_dialog_osm(); return TRUE; } gboolean -menu_cb_settings_keys(GtkAction * action) +menu_cb_settings_keys(GtkAction *action) { settings_dialog_hardkeys(); return TRUE; } gboolean -menu_cb_import_osm(GtkAction * action) +menu_cb_import_osm(GtkAction *action) { osm_import_dialog(_window); return TRUE; } gboolean -menu_cb_help(GtkAction * action) +menu_cb_help(GtkAction *action) { help_topic_display(HELP_ID_INTRO, 0); return TRUE; } gboolean -menu_cb_about(GtkAction * action) +menu_cb_about(GtkAction *action) { gchar *authors[]={ "Kaj-Michael Lang", @@ -640,6 +615,7 @@ gboolean window_cb_key_press(GtkWidget * widget, GdkEventKey * event) { CustomKey custom_key; +GtkMapCenterMode cm; custom_key=custom_key_get_type(event->keyval); if (custom_key==CUSTOM_KEY_ENUM_COUNT) @@ -647,19 +623,20 @@ if (custom_key==CUSTOM_KEY_ENUM_COUNT) switch (_action[custom_key]) { case CUSTOM_ACTION_PAN_NORTH: - map_pan(0, -PAN_UNITS); + gtk_map_pan(_map, 0, -1); break; case CUSTOM_ACTION_PAN_WEST: - map_pan(-PAN_UNITS, 0); + gtk_map_pan(_map, -1, 0); break; case CUSTOM_ACTION_PAN_SOUTH: - map_pan(0, PAN_UNITS); + gtk_map_pan(_map, 0, 1); break; case CUSTOM_ACTION_PAN_EAST: - map_pan(PAN_UNITS, 0); + gtk_map_pan(_map, 1, 0); break; case CUSTOM_ACTION_TOGGLE_AUTOCENTER: - switch (_center_mode) { + g_object_get(_map, "center-mode", &cm); + switch (cm) { case CENTER_LATLON: case CENTER_WAS_LEAD: set_action_activate("autocenter_lead", TRUE); @@ -674,14 +651,10 @@ switch (_action[custom_key]) { } break; case CUSTOM_ACTION_ZOOM_IN: + gtk_map_zoom_in(_map); + break; case CUSTOM_ACTION_ZOOM_OUT: - if (!_key_zoom_timeout_sid) { - _key_zoom_new = _zoom + (_action[custom_key] == CUSTOM_ACTION_ZOOM_IN ? -_curr_repo->view_zoom_steps : _curr_repo->view_zoom_steps); - /* Remember, _key_zoom_new is unsigned. */ - if (_key_zoom_new < MAX_ZOOM) { - _key_zoom_timeout_sid = g_timeout_add(400, map_key_zoom_timeout, NULL); - } - } + gtk_map_zoom_out(_map); break; case CUSTOM_ACTION_TOGGLE_FULLSCREEN: set_action_activate("view_fullscreen", !_fullscreen); @@ -734,19 +707,19 @@ switch (_action[custom_key]) { } break; case CUSTOM_ACTION_ROUTE_DISTNEXT: - route_show_distance_to_next(_route); + path_show_distance_to_next(_route); break; case CUSTOM_ACTION_ROUTE_DISTLAST: - route_show_distance_to_last(_route); + path_show_distance_to_last(_route); break; case CUSTOM_ACTION_TRACK_BREAK: - path_insert_break(_track); + path_add_break(_track); break; case CUSTOM_ACTION_TRACK_DISTLAST: - track_show_distance_from_last(_track); + path_show_distance_from_last(_track); break; case CUSTOM_ACTION_TRACK_DISTFIRST: - track_show_distance_from_first(_track); + path_show_distance_from_first(_track); break; case CUSTOM_ACTION_TOGGLE_GPS: set_action_activate("gps_enable", !_enable_gps); @@ -768,57 +741,46 @@ window_cb_key_release(GtkWidget * widget, GdkEventKey * event) { switch (event->keyval) { case HILDON_HARDKEY_INCREASE: + gtk_map_zoom_in(_map); + break; case HILDON_HARDKEY_DECREASE: - if (_key_zoom_timeout_sid) { - g_source_remove(_key_zoom_timeout_sid); - _key_zoom_timeout_sid = 0; - map_set_zoom(_key_zoom_new); - } - return TRUE; + gtk_map_zoom_out(_map); break; default: - return FALSE; + break; } +return FALSE; } void -cmenu_show_latlon(guint unitx, guint unity) +cmenu_show_latlon(gdouble lat, gdouble lon) { -gdouble lat, lon; gchar buffer[80], tmp1[16], tmp2[16]; -unit2latlon(unitx, unity, lat, lon); lat_format(_degformat, lat, tmp1); lon_format(_degformat, lon, tmp2); -g_snprintf(buffer, sizeof(buffer), - "%s: %s\n" - "%s: %s", _("Latitude"), tmp1, _("Longitude"), tmp2); - +g_snprintf(buffer, sizeof(buffer), "%s: %s\n%s: %s", _("Latitude"), tmp1, _("Longitude"), tmp2); +/* XXX: Use a dialog under plain Gtk */ MACRO_BANNER_SHOW_INFO(_window, buffer); } void -cmenu_clip_latlon(guint unitx, guint unity) +cmenu_clip_latlon(gdouble lat, gdouble lon) { gchar buffer[80]; -gdouble lat, lon; -unit2latlon(unitx, unity, lat, lon); g_snprintf(buffer, sizeof(buffer), "%.06f,%.06f", lat, lon); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, -1); } void -cmenu_route_to(guint unitx, guint unity) +cmenu_route_to(gdouble lat, gdouble lon) { gchar buffer[80]; gchar strlat[32]; gchar strlon[32]; -gdouble lat, lon; - -unit2latlon(unitx, unity, lat, lon); g_ascii_formatd(strlat, 32, "%.06f", lat); g_ascii_formatd(strlon, 32, "%.06f", lon); @@ -828,31 +790,18 @@ route_download(_route, buffer); } void -cmenu_distance_to(guint unitx, guint unity) +cmenu_distance_to(gdouble lat, gdouble lon) { gchar buffer[80]; -gdouble lat, lon; - -unit2latlon(unitx, unity, lat, lon); g_snprintf(buffer, sizeof(buffer), "%s: %.02lf %s", _("Distance"), calculate_distance(_gps->data.lat, _gps->data.lon, lat, lon) * UNITS_CONVERT[_units], UNITS_TEXT[_units]); MACRO_BANNER_SHOW_INFO(_window, buffer); } -void -cmenu_add_route(guint unitx, guint unity) +void +cmenu_route_add_way(gdouble lat, gdouble lon) { -MACRO_PATH_INCREMENT_TAIL(*_route); -_route->tail->unitx = x2unit(_cmenu_position_x); -_route->tail->unity = y2unit(_cmenu_position_y); -route_find_nearest_point(_route); -map_force_redraw(); -} - -void cmenu_route_add_way(guint unitx, guint unity) -{ -gdouble lat, lon; gchar tmp1[16], tmp2[16], *p_latlon; GtkWidget *dialog; GtkWidget *table; @@ -872,7 +821,6 @@ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table = gtk_table_new(2, 2 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); -unit2latlon(unitx, unity, lat, lon); lat_format(_degformat, lat, tmp1); lon_format(_degformat, lon, tmp2); p_latlon = g_strdup_printf("%s, %s", tmp1, tmp2); @@ -907,107 +855,79 @@ while (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) { gtk_text_buffer_get_end_iter(tbuf, &ti2); desc = gtk_text_buffer_get_text(tbuf, &ti1, &ti2, TRUE); - if (*desc) { - /* There's a description. Add a waypoint. */ - MACRO_PATH_INCREMENT_TAIL(*_route); - _route->tail->unitx = unitx; - _route->tail->unity = unity; - _route->tail->time = 0; - _route->tail->altitude = NAN; - - MACRO_PATH_INCREMENT_WTAIL(*_route); - _route->wtail->point = _route->tail; - _route->wtail->desc = gtk_text_buffer_get_text(tbuf, &ti1, &ti2, TRUE); - } else { - GtkWidget *confirm; - - g_free(desc); - - confirm = hildon_note_new_confirmation(GTK_WINDOW(dialog), - _("Creating a \"waypoint\" with no description actually " - "adds a break point. Is that what you want?")); - - if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) { - /* There's no description. Add a break by adding a (0, 0) - * point (if necessary), and then the ordinary route point. */ - if (_route->tail->unity) { - MACRO_PATH_INCREMENT_TAIL(*_route); - *_route->tail = _point_null; - } - - MACRO_PATH_INCREMENT_TAIL(*_route); - _route->tail->unitx = unitx; - _route->tail->unity = unity; - _route->tail->time = 0; - _route->tail->altitude = NAN; - - gtk_widget_destroy(confirm); - } else { - gtk_widget_destroy(confirm); - continue; - } - } - - route_find_nearest_point(_route); - map_render_paths(); - MACRO_QUEUE_DRAW_AREA(); + path_add_waypoint(_route, lat, lon, desc); break; } gtk_widget_destroy(dialog); } gboolean -cmenu_cb_loc_show_latlon(GtkAction * action) +cmenu_cb_loc_show_latlon(GtkAction *action) { -cmenu_show_latlon(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)); +gdouble lat, lon; + +gtk_map_get_menu_latlon(_map, &lat, &lon); +cmenu_show_latlon(lat, lon); return TRUE; } gboolean -cmenu_cb_loc_clip_latlon(GtkAction * action) +cmenu_cb_loc_clip_latlon(GtkAction *action) { -cmenu_clip_latlon(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)); +gdouble lat, lon; + +gtk_map_get_menu_latlon(_map, &lat, &lon); +cmenu_clip_latlon(lat, lon); return TRUE; } gboolean -cmenu_cb_loc_route_to(GtkAction * action) +cmenu_cb_loc_route_to(GtkAction *action) { -cmenu_route_to(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)); +gdouble lat, lon; + +gtk_map_get_menu_latlon(_map, &lat, &lon); +cmenu_route_to(lat, lon); return TRUE; } gboolean -cmenu_cb_loc_distance_to(GtkAction * action) +cmenu_cb_loc_distance_to(GtkAction *action) { -cmenu_distance_to(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)); +gdouble lat, lon; + +gtk_map_get_menu_latlon(_map, &lat, &lon); +cmenu_distance_to(lat, lon); return TRUE; } gboolean -cmenu_cb_loc_add_route(GtkAction * action) +cmenu_cb_loc_add_route(GtkAction *action) { -cmenu_add_route(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)); +gdouble lat, lon; + +gtk_map_get_menu_latlon(_map, &lat, &lon); +path_add_latlon(_route, lat, lon, time(NULL), 0, 0); return TRUE; } gboolean -cmenu_cb_loc_add_way(GtkAction * action) +cmenu_cb_loc_add_way(GtkAction *action) { -cmenu_route_add_way(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)); +gdouble lat, lon; + +gtk_map_get_menu_latlon(_map, &lat, &lon); +cmenu_route_add_way(lat, lon); return TRUE; } gboolean -cmenu_cb_loc_add_poi(GtkAction * action) +cmenu_cb_loc_add_poi(GtkAction *action) { -guint ux, uy; poi_info *poi; poi=poi_new(); -ux=x2unit(_cmenu_position_x); -uy=y2unit(_cmenu_position_y); -unit2latlon(ux, uy, poi->lat, poi->lon); +gtk_map_get_menu_latlon(_map, &poi->lat, &poi->lon); poi_edit_dialog(ACTION_ADD_POI, poi); return TRUE; @@ -1018,12 +938,14 @@ cb_poi_search(GtkAction *action) { poi_info poi; gdouble lat, lon; +GtkMapCenterMode cm; -if (_center_mode>0) { +g_object_get(_map, "center-mode", &cm); +if (cm!=CENTER_MANUAL) { lat=_gps->data.lat; lon=_gps->data.lon; } else { - unit2latlon(_center.unitx, _center.unity, lat, lon); + gtk_map_get_center_latlon(_map, &lat, &lon); } mapper_search_dialog(SEARCH_TYPE_POI, lat, lon); @@ -1037,11 +959,11 @@ gdouble lat,lon; const gchar *name = gtk_action_get_name(action); poi_info *p; -if (_center_mode>0) { +if (gtk_map_get_center_mode(_map)!=CENTER_MANUAL) { lat=_gps->data.lat; lon=_gps->data.lon; } else { - unit2latlon(_center.unitx, _center.unity, lat, lon); + gtk_map_get_center_latlon(_map, &lat, &lon); } if (strcmp(name, "poi_add")==0) { @@ -1064,135 +986,142 @@ menu_cb_search_address(GtkAction *action) { gdouble lat, lon; -if (_center_mode>0) { +if (gtk_map_get_center_mode(_map)!=CENTER_MANUAL) { lat=_gps->data.lat; lon=_gps->data.lon; } else { - unit2latlon(_center.unitx, _center.unity, lat, lon); + gtk_map_get_center_latlon(_map, &lat, &lon); } mapper_search_dialog(SEARCH_TYPE_WAY, lat, lon); return TRUE; } gboolean -cmenu_cb_loc_set_home(GtkAction * action) +cmenu_cb_loc_set_home(GtkAction *action) { -guint unitx, unity; - -unitx = x2unit(_cmenu_position_x); -unity = y2unit(_cmenu_position_y); -unit2latlon(unitx, unity, _home->lat, _home->lon); +gtk_map_get_menu_latlon(_map, &_home->lat, &_home->lon); _home->valid=TRUE; if (!config_save_position(_home, GCONF_KEY_POSITION_HOME)) popup_error(_window, _("Failed to save home position.")); -map_render_data(); +gtk_map_refresh(_map); return TRUE; } gboolean cmenu_cb_loc_set_destination(GtkAction *action) { -guint unitx, unity; - -unitx = x2unit(_cmenu_position_x); -unity = y2unit(_cmenu_position_y); -unit2latlon(unitx, unity, _dest->lat, _dest->lon); +gtk_map_get_menu_latlon(_map, &_dest->lat, &_dest->lon); _dest->valid=TRUE; + if (!config_save_position(&_dest, GCONF_KEY_POSITION_DEST)) popup_error(_window, _("Failed to save destination.")); +gtk_map_refresh(_map); return TRUE; } gboolean -cmenu_cb_loc_set_gps(GtkAction * action) +cmenu_cb_loc_set_gps(GtkAction *action) { -_gps->data.unitx = x2unit(_cmenu_position_x); -_gps->data.unity = y2unit(_cmenu_position_y); -unit2latlon(_gps->data.unitx, _gps->data.unity, _gps->data.lat, _gps->data.lon); - -/* Move mark to new location. */ -_gps->data.time=time(NULL); -track_add(_track, &_gps->data); -map_refresh_mark(); +gtk_map_get_menu_latlon(_map, &_gps->data.lat, &_gps->data.lon); +path_add_latlon(_track, _gps->data.lat, _gps->data.lon, time(NULL), 0, NAN); return TRUE; } gboolean -cmenu_cb_way_show_latlon(GtkAction * action) +cmenu_cb_way_show_latlon(GtkAction *action) { WayPoint *way; +gdouble lat, lon; -if ((way = route_find_nearest_waypoint(_route, x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)))) - cmenu_show_latlon(way->point->unitx, way->point->unity); +gtk_map_get_menu_latlon(_map, &lat, &lon); + +if ((way = path_find_nearest_waypoint(_route, lat, lon))) + cmenu_show_latlon(lat, lon); return TRUE; } gboolean -cmenu_cb_way_show_desc(GtkAction * action) +cmenu_cb_way_show_desc(GtkAction *action) { WayPoint *way; +gdouble lat, lon; -if ((way = route_find_nearest_waypoint(_route, x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)))) { +gtk_map_get_menu_latlon(_map, &lat, &lon); + +if ((way = path_find_nearest_waypoint(_route, lat, lon))) MACRO_BANNER_SHOW_INFO(_window, way->desc); -} return TRUE; } gboolean -cmenu_cb_way_clip_latlon(GtkAction * action) +cmenu_cb_way_clip_latlon(GtkAction *action) { WayPoint *way; +gdouble lat, lon; -if ((way = route_find_nearest_waypoint(_route, x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)))) +gtk_map_get_menu_latlon(_map, &lat, &lon); +if ((way = path_find_nearest_waypoint(_route, lat, lon))) cmenu_clip_latlon(way->point->unitx, way->point->unity); + return TRUE; } gboolean -cmenu_cb_way_clip_desc(GtkAction * action) +cmenu_cb_way_clip_desc(GtkAction *action) { WayPoint *way; +gdouble lat, lon; -if ((way = route_find_nearest_waypoint(_route, x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)))) +gtk_map_get_menu_latlon(_map, &lat, &lon); +if ((way = path_find_nearest_waypoint(_route, lat, lon))) gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), way->desc, -1); return TRUE; } gboolean -cmenu_cb_way_route_to(GtkAction * action) +cmenu_cb_way_route_to(GtkAction *action) { WayPoint *way; +gdouble lat, lon; + +gtk_map_get_menu_latlon(_map, &lat, &lon); -if ((way = route_find_nearest_waypoint(_route, x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)))) +if ((way = path_find_nearest_waypoint(_route, lat, lon))) cmenu_route_to(way->point->unitx, way->point->unity); return TRUE; } gboolean -cmenu_cb_way_distance_to(GtkAction * action) +cmenu_cb_way_distance_to(GtkAction *action) { WayPoint *way; +gdouble lat, lon; -if ((way = route_find_nearest_waypoint(_route, x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)))) +gtk_map_get_menu_latlon(_map, &lat, &lon); + +if ((way = route_find_nearest_waypoint(_route, lat, lon))) route_show_distance_to(_route, way->point); return TRUE; } gboolean -cmenu_cb_way_delete(GtkAction * action) +cmenu_cb_way_delete(GtkAction *action) { WayPoint *way; +gdouble lat, lon; + +gtk_map_get_menu_latlon(_map, &lat, &lon); -if ((way = route_find_nearest_waypoint(_route, x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)))) { +if ((way = path_find_nearest_waypoint(_route, lat, lon))) { gchar buffer[BUFFER_SIZE]; GtkWidget *confirm; @@ -1214,17 +1143,13 @@ if ((way = route_find_nearest_waypoint(_route, x2unit(_cmenu_position_x), y2unit else pdel_max = way[1].point; - /* Find largest continuous segment around the waypoint, EXCLUDING - * pdel_min and pdel_max. */ - for (pdel_start = way->point - 1; pdel_start->unity - && pdel_start > pdel_min; pdel_start--) { + /* Find largest continuous segment around the waypoint, EXCLUDING pdel_min and pdel_max. */ + for (pdel_start = way->point - 1; pdel_start->unity && pdel_start > pdel_min; pdel_start--) { } - for (pdel_end = way->point + 1; pdel_end->unity - && pdel_end < pdel_max; pdel_end++) { + for (pdel_end = way->point + 1; pdel_end->unity && pdel_end < pdel_max; pdel_end++) { } - /* If pdel_end is set to _route->tail, and if _route->tail is a - * non-zero point, then delete _route->tail. */ + /* If pdel_end is set to _route->tail, and if _route->tail is a non-zero point, then delete _route->tail. */ if (pdel_end == _route->tail && pdel_end->unity) pdel_end++; /* delete _route->tail too */ /* else, if *both* endpoints are zero points, delete one. */ @@ -1244,9 +1169,9 @@ if ((way = route_find_nearest_waypoint(_route, x2unit(_cmenu_position_x), y2unit way[-1].point -= num_del; } _route->wtail--; - - route_find_nearest_point(_route); - map_force_redraw(); +#if 0 + path_find_nearest_point(_route); +#endif } gtk_widget_destroy(confirm); } @@ -1255,82 +1180,82 @@ return TRUE; } gboolean -menu_cb_category(GtkAction * action) +menu_cb_category(GtkAction *action) { if (poi_category_list()) - map_force_redraw(); + gtk_map_refresh(_map); return TRUE; } gboolean -cmenu_cb_way_add_poi(GtkAction * action) +cmenu_cb_way_add_poi(GtkAction *action) { WayPoint *way; +gdouble lat, lon; + +gtk_map_get_menu_latlon(_map, &lat, &lon); -if ((way = route_find_nearest_waypoint(_route, x2unit(_cmenu_position_x), y2unit(_cmenu_position_y)))) { +if ((way = path_find_nearest_waypoint(_route, lat, lon))) { poi_info *p; p=poi_new(); - unit2latlon(way->point->unitx, way->point->unity, p->lat, p->lon); + path_get_waypoint_latlon(way, &p->lat, &p->lon); poi_edit_dialog(ACTION_ADD_POI, p); - /* XXX: free it ? */ } return TRUE; } gboolean -cmenu_cb_poi_route_to(GtkAction * action) +cmenu_cb_poi_route_to(GtkAction *action) { poi_info poi; +gdouble lat, lon; -if (poi_select(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y), 4, &poi)) { - guint unitx, unity; - latlon2unit(poi.lat, poi.lon, unitx, unity); - cmenu_route_to(unitx, unity); -} +gtk_map_get_menu_latlon(_map, &lat, &lon); +if (poi_select(lat, lon, 4, &poi)) + cmenu_route_to(poi.lat, poi.lon); return TRUE; } gboolean -cmenu_cb_poi_distance_to(GtkAction * action) +cmenu_cb_poi_distance_to(GtkAction *action) { poi_info poi; +gdouble lat, lon; -if (poi_select(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y), 4, &poi)) { - guint unitx, unity; - latlon2unit(poi.lat, poi.lon, unitx, unity); - cmenu_distance_to(unitx, unity); -} +gtk_map_get_menu_latlon(_map, &lat, &lon); + +if (poi_select(lat, lon, 4, &poi)) + cmenu_distance_to(poi.lat, poi.lon); return TRUE; } gboolean -cmenu_cb_poi_add_route(GtkAction * action) +cmenu_cb_poi_add_route(GtkAction *action) { poi_info poi; +gdouble lat, lon; -if (poi_select(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y), 4, &poi)) { - guint unitx, unity; - latlon2unit(poi.lat, poi.lon, unitx, unity); - cmenu_add_route(unitx, unity); -} +gtk_map_get_menu_latlon(_map, &lat, &lon); +if (poi_select(lat, lon, 4, &poi)) + path_add_latlon(_route, lat, lon, time(NULL), 0, 0); return TRUE; } gboolean -cmenu_cb_poi_add_way(GtkAction * action) +cmenu_cb_poi_add_way(GtkAction *action) { poi_info poi; +gdouble lat, lon; -if (poi_select(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y), 4, &poi)) { - guint unitx, unity; - latlon2unit(poi.lat, poi.lon, unitx, unity); - cmenu_route_add_way(unitx, unity); -} +gtk_map_get_menu_latlon(_map, &lat, &lon); + +if (poi_select(lat, lon, 4, &poi)) + cmenu_route_add_way(lat, lon); return TRUE; } @@ -1343,12 +1268,12 @@ return TRUE; } gboolean -cmenu_cb_poi_edit_poi(GtkAction * action) +cmenu_cb_poi_edit_poi(GtkAction *action) { poi_info *p; gdouble lat, lon; -unit2latlon(x2unit(_cmenu_position_x), y2unit(_cmenu_position_y), lat, lon); +gtk_map_get_menu_latlon(_map, &lat, &lon); p=poi_find_nearest(lat, lon); if (!p) { popup_error(_window, _("No POI found at location."));