X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/b23c559baa1f7eeb39c17f91eff6e758928c0eac..14b9e3a4c4f3912bfe5e848e6b0bf8d7620a53a0:/src/vikwindow.c diff --git a/src/vikwindow.c b/src/vikwindow.c index 16eb95b3..51c51ba9 100644 --- a/src/vikwindow.c +++ b/src/vikwindow.c @@ -2,6 +2,7 @@ * viking -- GPS Data and Topo Analyzer, Explorer, and Manager * * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2005-2006, Alex Foobarian * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,6 +35,7 @@ #include "preferences.h" #include "icons/icons.h" #include "vikexttools.h" +#include "garminsymbols.h" #ifdef HAVE_STDLIB_H #include @@ -50,6 +52,7 @@ #include #include #include +#include #define VIKING_WINDOW_WIDTH 1000 #define VIKING_WINDOW_HEIGHT 800 @@ -84,7 +87,7 @@ static void draw_mouse_motion ( VikWindow *vw, GdkEventMotion *event ); static void draw_zoom_cb ( GtkAction *a, VikWindow *vw ); static void draw_goto_cb ( GtkAction *a, VikWindow *vw ); -static void draw_status (); +static void draw_status ( VikWindow *vw ); /* End Drawing Functions */ @@ -147,6 +150,7 @@ struct _VikWindow { GtkActionGroup *action_group; + gboolean pan_move; gint pan_x, pan_y; guint draw_image_width, draw_image_height; @@ -164,12 +168,29 @@ struct _VikWindow { /* half-drawn update */ VikLayer *trigger; VikCoord trigger_center; + + /* Store at this level for highlighted selection drawing since it applies to the viewport and the layers panel */ + /* Only one of these items can be selected at the same time */ + gpointer selected_vtl; /* notionally VikTrwLayer */ + gpointer selected_tracks; /* notionally GList */ + gpointer selected_track; /* notionally VikTrack */ + gpointer selected_waypoints; /* notionally GList */ + gpointer selected_waypoint; /* notionally VikWaypoint */ + /* only use for individual track or waypoint */ + gpointer selected_name; /* notionally gchar */ + ////// NEED TO THINK ABOUT VALIDITY OF THESE ////// + ////// i.e. what happens when stuff is deleted elsewhere ////// + ////// Generally seems alright as can not access them ////// + ////// containing_vtl now seems unecessary ////// + /* For track(s) & waypoint(s) it is the layer they are in - this helps refering to the individual item easier */ + gpointer containing_vtl; /* notionally VikTrwLayer */ }; enum { TOOL_PAN = 0, TOOL_ZOOM, TOOL_RULER, + TOOL_SELECT, TOOL_LAYER, NUMBER_OF_TOOLS }; @@ -182,7 +203,7 @@ enum { static guint window_signals[VW_LAST_SIGNAL] = { 0 }; -static gchar *tool_names[NUMBER_OF_TOOLS] = { N_("Pan"), N_("Zoom"), N_("Ruler") }; +static gchar *tool_names[NUMBER_OF_TOOLS] = { N_("Pan"), N_("Zoom"), N_("Ruler"), N_("Select") }; GType vik_window_get_type (void) { @@ -213,6 +234,19 @@ VikViewport * vik_window_viewport(VikWindow *vw) return(vw->viking_vvp); } +VikLayersPanel * vik_window_layers_panel(VikWindow *vw) +{ + return(vw->viking_vlp); +} + +/** + * Returns the statusbar for the window + */ +VikStatusbar * vik_window_get_statusbar ( VikWindow *vw ) +{ + return vw->viking_vs; +} + void vik_window_selected_layer(VikWindow *vw, VikLayer *vl) { int i, j, tool_count; @@ -275,7 +309,8 @@ static void window_init ( VikWindow *vw ) vw->vt = toolbox_create(vw); window_create_ui(vw); window_set_filename (vw, NULL); - + vw->toolbar = GTK_TOOLBAR(gtk_ui_manager_get_widget (vw->uim, "/MainToolbar")); + toolbox_activate(vw->vt, "Pan"); vw->filename = NULL; @@ -283,7 +318,8 @@ static void window_init ( VikWindow *vw ) vw->modified = FALSE; vw->only_updating_coord_mode_ui = FALSE; - + + vw->pan_move = FALSE; vw->pan_x = vw->pan_y = -1; vw->draw_image_width = DRAW_IMAGE_DEFAULT_WIDTH; vw->draw_image_height = DRAW_IMAGE_DEFAULT_HEIGHT; @@ -293,9 +329,9 @@ static void window_init ( VikWindow *vw ) gtk_container_add (GTK_CONTAINER (vw), main_vbox); gtk_box_pack_start (GTK_BOX(main_vbox), gtk_ui_manager_get_widget (vw->uim, "/MainMenu"), FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX(main_vbox), gtk_ui_manager_get_widget (vw->uim, "/MainToolbar"), FALSE, TRUE, 0); - gtk_toolbar_set_icon_size(GTK_TOOLBAR(gtk_ui_manager_get_widget (vw->uim, "/MainToolbar")), GTK_ICON_SIZE_SMALL_TOOLBAR); - gtk_toolbar_set_style (GTK_TOOLBAR(gtk_ui_manager_get_widget (vw->uim, "/MainToolbar")), GTK_TOOLBAR_ICONS); + gtk_box_pack_start (GTK_BOX(main_vbox), GTK_WIDGET(vw->toolbar), FALSE, TRUE, 0); + gtk_toolbar_set_icon_size (vw->toolbar, GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_toolbar_set_style (vw->toolbar, GTK_TOOLBAR_ICONS); vik_ext_tools_add_menu_items ( vw, vw->uim ); @@ -344,6 +380,26 @@ static gboolean key_press_event( VikWindow *vw, GdkEventKey *event, gpointer dat if ( vl && ltype == vl->type ) return vw->vt->tools[vw->vt->active_tool].ti.key_press(vl, event, vw->vt->tools[vw->vt->active_tool].state); } + + // No layer - but enable window tool keypress processing - these should be able to handle a NULL layer + if ( vw->vt->tools[vw->vt->active_tool].ti.key_press ) { + return vw->vt->tools[vw->vt->active_tool].ti.key_press ( vl, event, vw->vt->tools[vw->vt->active_tool].state ); + } + + /* Restore Main Menu via Escape key if the user has hidden it */ + /* This key is more likely to be used as they may not remember the function key */ + if ( event->keyval == GDK_Escape ) { + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewMainMenu" ); + if ( check_box ) { + gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( !state ) { + gtk_widget_show ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) ); + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), TRUE ); + return TRUE; /* handled keypress */ + } + } + } + return FALSE; /* don't handle the keypress */ } @@ -394,13 +450,23 @@ static void draw_sync ( VikWindow *vw ) static void draw_status ( VikWindow *vw ) { static gchar zoom_level[22]; - g_snprintf ( zoom_level, 22, "%.3f/%.3f %s", vik_viewport_get_xmpp (vw->viking_vvp), vik_viewport_get_ympp(vw->viking_vvp), vik_viewport_get_coord_mode(vw->viking_vvp) == VIK_COORD_UTM ? _("mpp") : _("pixelfact") ); + gdouble xmpp = vik_viewport_get_xmpp (vw->viking_vvp); + gdouble ympp = vik_viewport_get_ympp(vw->viking_vvp); + gchar *unit = vik_viewport_get_coord_mode(vw->viking_vvp) == VIK_COORD_UTM ? _("mpp") : _("pixelfact"); + if (xmpp != ympp) + g_snprintf ( zoom_level, 22, "%.3f/%.3f %s", xmpp, ympp, unit ); + else + if ( (int)xmpp - xmpp < 0.0 ) + g_snprintf ( zoom_level, 22, "%.3f %s", xmpp, unit ); + else + /* xmpp should be a whole number so don't show useless .000 bit */ + g_snprintf ( zoom_level, 22, "%d %s", (int)xmpp, unit ); if ( vw->current_tool == TOOL_LAYER ) - vik_statusbar_set_message ( vw->viking_vs, 0, vik_layer_get_interface(vw->tool_layer_id)->tools[vw->tool_tool_id].name ); + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_TOOL, vik_layer_get_interface(vw->tool_layer_id)->tools[vw->tool_tool_id].name ); else - vik_statusbar_set_message ( vw->viking_vs, 0, _(tool_names[vw->current_tool]) ); + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_TOOL, _(tool_names[vw->current_tool]) ); - vik_statusbar_set_message ( vw->viking_vs, 2, zoom_level ); + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_ZOOM, zoom_level ); } void vik_window_set_redraw_trigger(VikLayer *vl) @@ -421,7 +487,7 @@ static void window_configure_event ( VikWindow *vw ) first = 0; cursor = toolbox_get_cursor(vw->vt, "Pan"); /* We set cursor, even if it is NULL: it resets to default */ - gdk_window_set_cursor ( GTK_WIDGET(vw->viking_vvp)->window, cursor ); + gdk_window_set_cursor ( GTK_WIDGET(vw->viking_vvp)->window, (GdkCursor *)cursor ); } } @@ -435,7 +501,7 @@ static void draw_redraw ( VikWindow *vw ) if ( ! new_trigger ) ; /* do nothing -- have to redraw everything. */ - else if ( (old_trigger != new_trigger) || !vik_coord_equals(&old_center, &vw->trigger_center) ) + else if ( (old_trigger != new_trigger) || !vik_coord_equals(&old_center, &vw->trigger_center) || (new_trigger->type == VIK_LAYER_AGGREGATE) ) vik_viewport_set_trigger ( vw->viking_vvp, new_trigger ); /* todo: set to half_drawn mode if new trigger is above old */ else vik_viewport_set_half_drawn ( vw->viking_vvp, TRUE ); @@ -444,7 +510,9 @@ static void draw_redraw ( VikWindow *vw ) vik_viewport_clear ( vw->viking_vvp); vik_layers_panel_draw_all ( vw->viking_vlp ); vik_viewport_draw_scale ( vw->viking_vvp ); + vik_viewport_draw_copyright ( vw->viking_vvp ); vik_viewport_draw_centermark ( vw->viking_vvp ); + vik_viewport_draw_logo ( vw->viking_vvp ); vik_viewport_set_half_drawn ( vw->viking_vvp, FALSE ); /* just in case. */ } @@ -468,6 +536,7 @@ static gboolean draw_buf(gpointer data) static void vik_window_pan_click (VikWindow *vw, GdkEventButton *event) { /* set panning origin */ + vw->pan_move = FALSE; vw->pan_x = (gint) event->x; vw->pan_y = (gint) event->y; } @@ -490,7 +559,12 @@ static void draw_click (VikWindow *vw, GdkEventButton *event) static void vik_window_pan_move (VikWindow *vw, GdkEventMotion *event) { if ( vw->pan_x != -1 ) { - vik_viewport_pan_sync ( vw->viking_vvp, event->x - vw->pan_x, event->y - vw->pan_y ); + vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)/2 - event->x + vw->pan_x, + vik_viewport_get_height(vw->viking_vvp)/2 - event->y + vw->pan_y ); + vw->pan_move = TRUE; + vw->pan_x = event->x; + vw->pan_y = event->y; + draw_update ( vw ); } } @@ -527,15 +601,19 @@ static void draw_mouse_motion (VikWindow *vw, GdkEventMotion *event) interpol_method = VIK_DEM_INTERPOL_SIMPLE; else interpol_method = VIK_DEM_INTERPOL_BEST; - if ((alt = a_dems_get_elev_by_coord(&coord, interpol_method)) != VIK_DEM_INVALID_ELEVATION) - g_snprintf ( pointer_buf, BUFFER_SIZE, _("%s %s %dm"), lat, lon, alt ); + if ((alt = a_dems_get_elev_by_coord(&coord, interpol_method)) != VIK_DEM_INVALID_ELEVATION) { + if ( a_vik_get_units_height () == VIK_UNITS_HEIGHT_METRES ) + g_snprintf ( pointer_buf, BUFFER_SIZE, _("%s %s %dm"), lat, lon, alt ); + else + g_snprintf ( pointer_buf, BUFFER_SIZE, _("%s %s %dft"), lat, lon, (int)VIK_METERS_TO_FEET(alt) ); + } else g_snprintf ( pointer_buf, BUFFER_SIZE, _("%s %s"), lat, lon ); g_free (lat); lat = NULL; g_free (lon); lon = NULL; - vik_statusbar_set_message ( vw->viking_vs, 4, pointer_buf ); + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_POSITION, pointer_buf ); vik_window_pan_move ( vw, event ); @@ -548,13 +626,14 @@ static void draw_mouse_motion (VikWindow *vw, GdkEventMotion *event) static void vik_window_pan_release ( VikWindow *vw, GdkEventButton *event ) { - if ( ABS(vw->pan_x - event->x) <= 1 && ABS(vw->pan_y - event->y) <= 1 ) + if ( vw->pan_move == FALSE ) vik_viewport_set_center_screen ( vw->viking_vvp, vw->pan_x, vw->pan_y ); else vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)/2 - event->x + vw->pan_x, vik_viewport_get_height(vw->viking_vvp)/2 - event->y + vw->pan_y ); - draw_update ( vw ); + vw->pan_move = FALSE; vw->pan_x = vw->pan_y = -1; + draw_update ( vw ); } static void draw_release ( VikWindow *vw, GdkEventButton *event ) @@ -737,12 +816,12 @@ static void draw_ruler(VikViewport *vvp, GdkDrawable *d, GdkGC *gc, gint x1, gin } break; case VIK_UNITS_DISTANCE_MILES: - if (distance >= 1600 && distance < 160000) { - g_sprintf(str, "%3.2f miles", distance/1600.0); - } else if (distance < 1600) { + if (distance >= VIK_MILES_TO_METERS(1) && distance < VIK_MILES_TO_METERS(100)) { + g_sprintf(str, "%3.2f miles", VIK_METERS_TO_MILES(distance)); + } else if (distance < VIK_MILES_TO_METERS(1)) { g_sprintf(str, "%d yards", (int)(distance*1.0936133)); } else { - g_sprintf(str, "%d miles", (int)distance/1600); + g_sprintf(str, "%d miles", (int)VIK_METERS_TO_MILES(distance)); } break; default: @@ -832,7 +911,7 @@ static VikLayerToolFuncStatus ruler_click (VikLayer *vl, GdkEventButton *event, temp = g_strdup_printf ( "%s %s DIFF %f meters", lat, lon, vik_coord_diff( &coord, &(s->oldcoord) ) ); break; case VIK_UNITS_DISTANCE_MILES: - temp = g_strdup_printf ( "%s %s DIFF %f miles", lat, lon, vik_coord_diff( &coord, &(s->oldcoord) )* 0.000621371192); + temp = g_strdup_printf ( "%s %s DIFF %f miles", lat, lon, VIK_METERS_TO_MILES(vik_coord_diff( &coord, &(s->oldcoord) )) ); break; default: temp = g_strdup_printf ("Just to keep the compiler happy"); @@ -846,7 +925,7 @@ static VikLayerToolFuncStatus ruler_click (VikLayer *vl, GdkEventButton *event, s->has_oldcoord = TRUE; } - vik_statusbar_set_message ( s->vw->viking_vs, 3, temp ); + vik_statusbar_set_message ( s->vw->viking_vs, VIK_STATUSBAR_INFO, temp ); g_free ( temp ); s->oldcoord = coord; @@ -904,13 +983,13 @@ static VikLayerToolFuncStatus ruler_move (VikLayer *vl, GdkEventMotion *event, r temp = g_strdup_printf ( "%s %s DIFF %f meters", lat, lon, vik_coord_diff( &coord, &(s->oldcoord) ) ); break; case VIK_UNITS_DISTANCE_MILES: - temp = g_strdup_printf ( "%s %s DIFF %f miles", lat, lon, vik_coord_diff( &coord, &(s->oldcoord) )* 0.000621371192); + temp = g_strdup_printf ( "%s %s DIFF %f miles", lat, lon, VIK_METERS_TO_MILES (vik_coord_diff( &coord, &(s->oldcoord) )) ); break; default: temp = g_strdup_printf ("Just to keep the compiler happy"); g_critical("Houston, we've had a problem. distance=%d", dist_units); } - vik_statusbar_set_message ( vw->viking_vs, 3, temp ); + vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, temp ); g_free ( temp ); } return VIK_LAYER_TOOL_ACK; @@ -926,6 +1005,16 @@ static void ruler_deactivate (VikLayer *vl, ruler_tool_state_t *s) draw_update ( s->vw ); } +static gboolean ruler_key_press (VikLayer *vl, GdkEventKey *event, ruler_tool_state_t *s) +{ + if (event->keyval == GDK_Escape) { + s->has_oldcoord = FALSE; + ruler_deactivate ( vl, s ); + return TRUE; + } + return FALSE; +} + static VikToolInterface ruler_tool = { "Ruler", (VikToolConstructorFunc) ruler_create, @@ -935,7 +1024,7 @@ static VikToolInterface ruler_tool = (VikToolMouseFunc) ruler_click, (VikToolMouseMoveFunc) ruler_move, (VikToolMouseFunc) ruler_release, - NULL, + (VikToolKeyFunc) ruler_key_press, GDK_CURSOR_IS_PIXMAP, &cursor_ruler_pixbuf }; /*** end ruler code ********************************************************/ @@ -1029,6 +1118,124 @@ static VikToolInterface pan_tool = GDK_FLEUR }; /*** end pan code ********************************************************/ +/******************************************************************************** + ** Select tool code + ********************************************************************************/ +static gpointer selecttool_create (VikWindow *vw, VikViewport *vvp) +{ + tool_ed_t *t = g_new(tool_ed_t, 1); + t->vw = vw; + t->vvp = vvp; + t->vtl = NULL; + t->is_waypoint = FALSE; + return t; +} + +static void selecttool_destroy (tool_ed_t *t) +{ + g_free(t); +} + +typedef struct { + gboolean cont; + VikViewport *vvp; + GdkEventButton *event; + tool_ed_t *tool_edit; +} clicker; + +static void click_layer_selected (VikLayer *vl, clicker *ck) +{ + /* Do nothing when function call returns true; */ + /* i.e. stop on first found item */ + if ( ck->cont ) + if ( vl->visible ) + if ( vik_layer_get_interface(vl->type)->select_click ) + ck->cont = !vik_layer_get_interface(vl->type)->select_click ( vl, ck->event, ck->vvp, ck->tool_edit ); +} + +static VikLayerToolFuncStatus selecttool_click (VikLayer *vl, GdkEventButton *event, tool_ed_t *t) +{ + /* Only allow selection on primary button */ + if ( event->button == 1 ) { + /* Enable click to apply callback to potentially all track/waypoint layers */ + /* Useful as we can find things that aren't necessarily in the currently selected layer */ + GList* gl = vik_layers_panel_get_all_layers_of_type ( t->vw->viking_vlp, VIK_LAYER_TRW, FALSE ); // Don't get invisible layers + clicker ck; + ck.cont = TRUE; + ck.vvp = t->vw->viking_vvp; + ck.event = event; + ck.tool_edit = t; + g_list_foreach ( gl, (GFunc) click_layer_selected, &ck ); + g_list_free ( gl ); + + // If nothing found then deselect & redraw screen if necessary to remove the highlight + if ( ck.cont ) { + GtkTreeIter iter; + VikTreeview *vtv = vik_layers_panel_get_treeview ( t->vw->viking_vlp ); + + if ( vik_treeview_get_selected_iter ( vtv, &iter ) ) { + // Only clear if selected thing is a TrackWaypoint layer or a sublayer + gint type = vik_treeview_item_get_type ( vtv, &iter ); + if ( type == VIK_TREEVIEW_TYPE_SUBLAYER || + VIK_LAYER(vik_treeview_item_get_pointer ( vtv, &iter ))->type == VIK_LAYER_TRW ) { + + vik_treeview_item_unselect ( vtv, &iter ); + if ( vik_window_clear_highlight ( t->vw ) ) + draw_update ( t->vw ); + } + } + } + } + else if ( ( event->button == 3 ) && ( vl && ( vl->type == VIK_LAYER_TRW ) ) ) { + if ( vl->visible ) + /* Act on currently selected item to show menu */ + if ( ( t->vw->selected_track || t->vw->selected_waypoint ) && t->vw->selected_name ) + if ( vik_layer_get_interface(vl->type)->show_viewport_menu ) + vik_layer_get_interface(vl->type)->show_viewport_menu ( vl, event, t->vw->viking_vvp ); + } + + return VIK_LAYER_TOOL_ACK; +} + +static VikLayerToolFuncStatus selecttool_move (VikLayer *vl, GdkEventButton *event, tool_ed_t *t) +{ + /* Only allow selection on primary button */ + if ( event->button == 1 ) { + // Don't care about vl here + if ( t->vtl ) + if ( vik_layer_get_interface(VIK_LAYER_TRW)->select_move ) + vik_layer_get_interface(VIK_LAYER_TRW)->select_move ( vl, event, t->vvp, t ); + } + return VIK_LAYER_TOOL_ACK; +} + +static VikLayerToolFuncStatus selecttool_release (VikLayer *vl, GdkEventButton *event, tool_ed_t *t) +{ + /* Only allow selection on primary button */ + if ( event->button == 1 ) { + // Don't care about vl here + if ( t->vtl ) + if ( vik_layer_get_interface(VIK_LAYER_TRW)->select_release ) + vik_layer_get_interface(VIK_LAYER_TRW)->select_release ( (VikLayer*)t->vtl, event, t->vvp, t ); + } + return VIK_LAYER_TOOL_ACK; +} + +static VikToolInterface select_tool = + { "Select", + (VikToolConstructorFunc) selecttool_create, + (VikToolDestructorFunc) selecttool_destroy, + (VikToolActivationFunc) NULL, + (VikToolActivationFunc) NULL, + (VikToolMouseFunc) selecttool_click, + (VikToolMouseMoveFunc) selecttool_move, + (VikToolMouseFunc) selecttool_release, + (VikToolKeyFunc) NULL, + GDK_LEFT_PTR, + NULL, + NULL }; +/*** end select tool code ********************************************************/ + static void draw_pan_cb ( GtkAction *a, VikWindow *vw ) { if (!strcmp(gtk_action_get_name(a), "PanNorth")) { @@ -1135,15 +1342,14 @@ static void menu_copy_layer_cb ( GtkAction *a, VikWindow *vw ) static void menu_cut_layer_cb ( GtkAction *a, VikWindow *vw ) { - a_clipboard_copy_selected ( vw->viking_vlp ); - menu_delete_layer_cb ( a, vw ); + vik_layers_panel_cut_selected ( vw->viking_vlp ); + vw->modified = TRUE; } static void menu_paste_layer_cb ( GtkAction *a, VikWindow *vw ) { if ( a_clipboard_paste ( vw->viking_vlp ) ) { - draw_update ( vw ); vw->modified = TRUE; } } @@ -1156,12 +1362,16 @@ static void menu_properties_cb ( GtkAction *a, VikWindow *vw ) static void help_help_cb ( GtkAction *a, VikWindow *vw ) { +#ifdef WINDOWS + ShellExecute(NULL, "open", ""PACKAGE".pdf", NULL, NULL, SW_SHOWNORMAL); +#else /* WINDOWS */ #if GTK_CHECK_VERSION (2, 14, 0) gchar *uri; uri = g_strdup_printf("ghelp:%s", PACKAGE); gtk_show_uri(NULL, uri, GDK_CURRENT_TIME, NULL); g_free(uri); #endif +#endif /* WINDOWS */ } static void help_about_cb ( GtkAction *a, VikWindow *vw ) @@ -1182,7 +1392,7 @@ static void menu_delete_layer_cb ( GtkAction *a, VikWindow *vw ) static void view_side_panel_cb ( GtkAction *a, VikWindow *vw ) { - GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/ViewSidePanel" ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewSidePanel" ); g_assert(check_box); gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box)); if ( state ) @@ -1191,6 +1401,42 @@ static void view_side_panel_cb ( GtkAction *a, VikWindow *vw ) gtk_widget_hide(GTK_WIDGET(vw->viking_vlp)); } +static void view_statusbar_cb ( GtkAction *a, VikWindow *vw ) +{ + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewStatusBar" ); + if ( !check_box ) + return; + gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( state ) + gtk_widget_show ( GTK_WIDGET(vw->viking_vs) ); + else + gtk_widget_hide ( GTK_WIDGET(vw->viking_vs) ); +} + +static void view_toolbar_cb ( GtkAction *a, VikWindow *vw ) +{ + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewToolbar" ); + if ( !check_box ) + return; + gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( state ) + gtk_widget_show ( GTK_WIDGET(vw->toolbar) ); + else + gtk_widget_hide ( GTK_WIDGET(vw->toolbar) ); +} + +static void view_main_menu_cb ( GtkAction *a, VikWindow *vw ) +{ + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewMainMenu" ); + if ( !check_box ) + return; + gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) ); + if ( !state ) + gtk_widget_hide ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) ); + else + gtk_widget_show ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) ); +} + /*************************************** ** tool management routines ** @@ -1327,7 +1573,7 @@ static void menu_tool_cb ( GtkAction *old, GtkAction *a, VikWindow *vw ) cursor = toolbox_get_cursor(vw->vt, gtk_action_get_name(a)); /* We set cursor, even if it is NULL: it resets to default */ - gdk_window_set_cursor ( GTK_WIDGET(vw->viking_vvp)->window, cursor ); + gdk_window_set_cursor ( GTK_WIDGET(vw->viking_vvp)->window, (GdkCursor *)cursor ); if (!strcmp(gtk_action_get_name(a), "Pan")) { vw->current_tool = TOOL_PAN; @@ -1338,6 +1584,9 @@ static void menu_tool_cb ( GtkAction *old, GtkAction *a, VikWindow *vw ) else if (!strcmp(gtk_action_get_name(a), "Ruler")) { vw->current_tool = TOOL_RULER; } + else if (!strcmp(gtk_action_get_name(a), "Select")) { + vw->current_tool = TOOL_SELECT; + } else { /* TODO: only enable tools from active layer */ for (layer_id=0; layer_iduim, buttonname ); @@ -1390,6 +1640,23 @@ GtkWidget *vik_window_get_drawmode_button ( VikWindow *vw, VikViewportDrawMode m return mode_button; } +/** + * vik_window_get_pan_move: + * @vw: some VikWindow + * + * Retrieves @vw's pan_move. + * + * Should be removed as soon as possible. + * + * Returns: @vw's pan_move + * + * Since: 0.9.96 + **/ +gboolean vik_window_get_pan_move ( VikWindow *vw ) +{ + return vw->pan_move; +} + static void on_activate_recent_item (GtkRecentChooser *chooser, VikWindow *self) { @@ -1403,12 +1670,15 @@ static void on_activate_recent_item (GtkRecentChooser *chooser, g_object_unref ( file ); if ( self->filename ) { - gchar *filenames[] = { path, NULL }; + GSList *filenames = NULL; + filenames = g_slist_append ( filenames, path ); g_signal_emit ( G_OBJECT(self), window_signals[VW_OPENWINDOW_SIGNAL], 0, filenames ); + // NB: GSList & contents are freed by main.open_window + } + else { + vik_window_open_file ( self, path, TRUE ); + g_free ( path ); } - else - vik_window_open_file ( self, filename, TRUE ); - g_free ( path ); } g_free (filename); @@ -1470,10 +1740,16 @@ void vik_window_open_file ( VikWindow *vw, const gchar *filename, gboolean chang { switch ( a_file_load ( vik_layers_panel_get_top_layer(vw->viking_vlp), vw->viking_vvp, filename ) ) { - case 0: + case LOAD_TYPE_READ_FAILURE: a_dialog_error_msg ( GTK_WINDOW(vw), _("The file you requested could not be opened.") ); break; - case 1: + case LOAD_TYPE_GPSBABEL_FAILURE: + a_dialog_error_msg ( GTK_WINDOW(vw), _("GPSBabel is required to load files of this type or GPSBabel encountered problems.") ); + break; + case LOAD_TYPE_UNSUPPORTED_FAILURE: + a_dialog_error_msg_extra ( GTK_WINDOW(vw), _("Unsupported file type for %s"), filename ); + break; + case LOAD_TYPE_VIK_SUCCESS: { GtkWidget *mode_button; /* Update UI */ @@ -1485,18 +1761,24 @@ void vik_window_open_file ( VikWindow *vw, const gchar *filename, gboolean chang vw->only_updating_coord_mode_ui = FALSE; vik_layers_panel_change_coord_mode ( vw->viking_vlp, vik_viewport_get_coord_mode ( vw->viking_vvp ) ); - - mode_button = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/ShowScale" ); + + mode_button = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowScale" ); g_assert ( mode_button ); gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(mode_button),vik_viewport_get_draw_scale(vw->viking_vvp) ); - mode_button = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/ShowCenterMark" ); + mode_button = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowCenterMark" ); g_assert ( mode_button ); gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(mode_button),vik_viewport_get_draw_centermark(vw->viking_vvp) ); + + mode_button = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowHighlight" ); + g_assert ( mode_button ); + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(mode_button),vik_viewport_get_draw_highlight (vw->viking_vvp) ); } + //case LOAD_TYPE_OTHER_SUCCESS: default: update_recently_used_document(filename); draw_update ( vw ); + break; } } static void load_file ( GtkAction *a, VikWindow *vw ) @@ -1523,6 +1805,42 @@ static void load_file ( GtkAction *a, VikWindow *vw ) GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); + GtkFileFilter *filter; + // NB file filters are listed this way for alphabetical ordering +#ifdef VIK_CONFIG_GEOCACHES + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("Geocaching") ); + gtk_file_filter_add_pattern ( filter, "*.loc" ); // No MIME type available + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter); +#endif + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("Google Earth") ); + gtk_file_filter_add_mime_type ( filter, "application/vnd.google-earth.kml+xml"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("GPX") ); + gtk_file_filter_add_pattern ( filter, "*.gpx" ); // No MIME type available + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("Viking") ); + gtk_file_filter_add_pattern ( filter, "*.vik" ); + gtk_file_filter_add_pattern ( filter, "*.viking" ); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter); + + // NB could have filters for gpspoint (*.gps,*.gpsoint?) + gpsmapper (*.gsm,*.gpsmapper?) + // However assume this are barely used and thus not worthy of inclusion + // as they'll just make the options too many and have no clear file pattern + // one can always use the all option + filter = gtk_file_filter_new (); + gtk_file_filter_set_name( filter, _("All") ); + gtk_file_filter_add_pattern ( filter, "*" ); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter); + // Default to any file - same as before open filters were added + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(vw->open_dia), filter); + gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER(vw->open_dia), TRUE ); gtk_window_set_transient_for ( GTK_WINDOW(vw->open_dia), GTK_WINDOW(vw) ); gtk_window_set_destroy_with_parent ( GTK_WINDOW(vw->open_dia), TRUE ); @@ -1573,7 +1891,7 @@ static gboolean save_file_as ( GtkAction *a, VikWindow *vw ) while ( gtk_dialog_run ( GTK_DIALOG(vw->save_dia) ) == GTK_RESPONSE_ACCEPT ) { fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(vw->save_dia) ); - if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || a_dialog_overwrite ( GTK_WINDOW(vw->save_dia), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) + if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || a_dialog_yes_or_no ( GTK_WINDOW(vw->save_dia), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) { window_set_filename ( vw, fn ); rv = window_save ( vw ); @@ -1612,14 +1930,31 @@ static gboolean save_file ( GtkAction *a, VikWindow *vw ) static void acquire_from_gps ( GtkAction *a, VikWindow *vw ) { + // Via the file menu, acquiring from a GPS makes a new layer + // this has always been the way (not entirely sure if this was the real intention!) + // thus maintain the behaviour ATM. + // Hence explicit setting here (as the value may be changed elsewhere) + vik_datasource_gps_interface.mode = VIK_DATASOURCE_CREATENEWLAYER; a_acquire(vw, vw->viking_vlp, vw->viking_vvp, &vik_datasource_gps_interface ); } +static void acquire_from_file ( GtkAction *a, VikWindow *vw ) +{ + a_acquire(vw, vw->viking_vlp, vw->viking_vvp, &vik_datasource_file_interface ); +} + static void acquire_from_google ( GtkAction *a, VikWindow *vw ) { a_acquire(vw, vw->viking_vlp, vw->viking_vvp, &vik_datasource_google_interface ); } +#ifdef VIK_CONFIG_OPENSTREETMAP +static void acquire_from_osm ( GtkAction *a, VikWindow *vw ) +{ + a_acquire(vw, vw->viking_vlp, vw->viking_vvp, &vik_datasource_osm_interface ); +} +#endif + #ifdef VIK_CONFIG_GEOCACHES static void acquire_from_gc ( GtkAction *a, VikWindow *vw ) { @@ -1627,6 +1962,24 @@ static void acquire_from_gc ( GtkAction *a, VikWindow *vw ) } #endif +#ifdef VIK_CONFIG_GEOTAG +static void acquire_from_geotag ( GtkAction *a, VikWindow *vw ) +{ + vik_datasource_geotag_interface.mode = VIK_DATASOURCE_CREATENEWLAYER; + a_acquire(vw, vw->viking_vlp, vw->viking_vvp, &vik_datasource_geotag_interface ); +} +#endif + +static void goto_default_location( GtkAction *a, VikWindow *vw) +{ + struct LatLon ll; + ll.lat = a_vik_get_default_lat(); + ll.lon = a_vik_get_default_long(); + vik_viewport_set_center_latlon(vw->viking_vvp, &ll); + vik_layers_panel_emit_update(vw->viking_vlp); +} + + static void goto_address( GtkAction *a, VikWindow *vw) { a_vik_goto(vw, vw->viking_vlp, vw->viking_vvp); @@ -1639,10 +1992,54 @@ static void mapcache_flush_cb ( GtkAction *a, VikWindow *vw ) static void preferences_cb ( GtkAction *a, VikWindow *vw ) { + gboolean wp_icon_size = a_vik_get_use_large_waypoint_icons(); + a_preferences_show_window ( GTK_WINDOW(vw) ); + + // Delete icon indexing 'cache' and so automatically regenerates with the new setting when changed + if (wp_icon_size != a_vik_get_use_large_waypoint_icons()) + clear_garmin_icon_syms (); + draw_update ( vw ); } +static void default_location_cb ( GtkAction *a, VikWindow *vw ) +{ + /* Simplistic repeat of preference setting + Only the name & type are important for setting the preference via this 'external' way */ + VikLayerParam pref_lat[] = { + { VIKING_PREFERENCES_NAMESPACE "default_latitude", + VIK_LAYER_PARAM_DOUBLE, + VIK_LOCATION_LAT, + NULL, + VIK_LAYER_WIDGET_SPINBUTTON, + NULL, + NULL }, + }; + VikLayerParam pref_lon[] = { + { VIKING_PREFERENCES_NAMESPACE "default_longitude", + VIK_LAYER_PARAM_DOUBLE, + VIK_LOCATION_LONG, + NULL, + VIK_LAYER_WIDGET_SPINBUTTON, + NULL, + NULL }, + }; + + /* Get current center */ + struct LatLon ll; + vik_coord_to_latlon ( vik_viewport_get_center ( vw->viking_vvp ), &ll ); + + /* Apply to preferences */ + VikLayerParamData vlp_data; + vlp_data.d = ll.lat; + a_preferences_run_setparam (vlp_data, pref_lat); + vlp_data.d = ll.lon; + a_preferences_run_setparam (vlp_data, pref_lon); + /* Remember to save */ + a_preferences_save_to_file(); +} + static void clear_cb ( GtkAction *a, VikWindow *vw ) { vik_layers_panel_clear ( vw->viking_vlp ); @@ -1861,7 +2258,7 @@ static void draw_to_image_file ( VikWindow *vw, const gchar *fn, gboolean one_im zoom_label = gtk_label_new ( _("Zoom (meters per pixel):") ); /* TODO: separate xzoom and yzoom factors */ - zoom_spin = gtk_spin_button_new ( GTK_ADJUSTMENT(gtk_adjustment_new ( vik_viewport_get_xmpp(vw->viking_vvp), VIK_VIEWPORT_MIN_ZOOM, VIK_VIEWPORT_MAX_ZOOM/2.0, 1, 100, 3 )), 16, 3); + zoom_spin = gtk_spin_button_new ( GTK_ADJUSTMENT(gtk_adjustment_new ( vik_viewport_get_xmpp(vw->viking_vvp), VIK_VIEWPORT_MIN_ZOOM, VIK_VIEWPORT_MAX_ZOOM/2.0, 1, 100, 0 )), 16, 0); total_size_label = gtk_label_new ( NULL ); @@ -1917,6 +2314,8 @@ static void draw_to_image_file ( VikWindow *vw, const gchar *fn, gboolean one_im draw_to_image_file_total_area_cb ( NULL, current_window_pass_along ); /* set correct size info now */ + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + gtk_widget_show_all ( GTK_DIALOG(dialog)->vbox ); if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) @@ -1929,16 +2328,14 @@ static void draw_to_image_file ( VikWindow *vw, const gchar *fn, gboolean one_im gtk_spin_button_get_value ( GTK_SPIN_BUTTON(zoom_spin) ), /* do not save this value, default is current zoom */ vw->draw_image_save_as_png = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(png_radio) ) ); else { - if ( vik_viewport_get_coord_mode(vw->viking_vvp) == VIK_COORD_UTM ) - save_image_dir ( vw, fn, + // NB is in UTM mode ATM + save_image_dir ( vw, fn, vw->draw_image_width = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(width_spin) ), vw->draw_image_height = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(height_spin) ), gtk_spin_button_get_value ( GTK_SPIN_BUTTON(zoom_spin) ), /* do not save this value, default is current zoom */ vw->draw_image_save_as_png = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(png_radio) ), gtk_spin_button_get_value ( GTK_SPIN_BUTTON(tiles_width_spin) ), gtk_spin_button_get_value ( GTK_SPIN_BUTTON(tiles_height_spin) ) ); - else - a_dialog_error_msg ( GTK_WINDOW(vw), _("You must be in UTM mode to use this feature") ); } } gtk_widget_destroy ( GTK_WIDGET(dialog) ); @@ -1947,7 +2344,7 @@ static void draw_to_image_file ( VikWindow *vw, const gchar *fn, gboolean one_im static void draw_to_image_file_cb ( GtkAction *a, VikWindow *vw ) { - const gchar *fn; + gchar *fn; if (!vw->save_img_dia) { vw->save_img_dia = gtk_file_chooser_dialog_new (_("Save Image"), GTK_WINDOW(vw), @@ -1962,11 +2359,13 @@ static void draw_to_image_file_cb ( GtkAction *a, VikWindow *vw ) while ( gtk_dialog_run ( GTK_DIALOG(vw->save_img_dia) ) == GTK_RESPONSE_ACCEPT ) { fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(vw->save_img_dia) ); - if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || a_dialog_overwrite ( GTK_WINDOW(vw->save_img_dia), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) + if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || a_dialog_yes_or_no ( GTK_WINDOW(vw->save_img_dia), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) ) { draw_to_image_file ( vw, fn, TRUE ); break; } + g_free(fn); + fn = NULL; } gtk_widget_hide ( vw->save_img_dia ); } @@ -1975,6 +2374,11 @@ static void draw_to_image_dir_cb ( GtkAction *a, VikWindow *vw ) { gchar *fn = NULL; + if ( vik_viewport_get_coord_mode(vw->viking_vvp) != VIK_COORD_UTM ) { + a_dialog_error_msg ( GTK_WINDOW(vw), _("You must be in UTM mode to use this feature") ); + return; + } + if (!vw->save_img_dir_dia) { vw->save_img_dir_dia = gtk_file_chooser_dialog_new (_("Choose a directory to hold images"), GTK_WINDOW(vw), @@ -2014,6 +2418,9 @@ static void window_change_coord_mode_cb ( GtkAction *old_a, GtkAction *a, VikWin if (!strcmp(gtk_action_get_name(a), "ModeUTM")) { drawmode = VIK_VIEWPORT_DRAWMODE_UTM; } + else if (!strcmp(gtk_action_get_name(a), "ModeLatLon")) { + drawmode = VIK_VIEWPORT_DRAWMODE_LATLON; + } else if (!strcmp(gtk_action_get_name(a), "ModeExpedia")) { drawmode = VIK_VIEWPORT_DRAWMODE_EXPEDIA; } @@ -2044,7 +2451,7 @@ static void window_change_coord_mode_cb ( GtkAction *old_a, GtkAction *a, VikWin static void set_draw_scale ( GtkAction *a, VikWindow *vw ) { - GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/ShowScale" ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowScale" ); g_assert(check_box); gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box)); vik_viewport_set_draw_scale ( vw->viking_vvp, state ); @@ -2053,13 +2460,22 @@ static void set_draw_scale ( GtkAction *a, VikWindow *vw ) static void set_draw_centermark ( GtkAction *a, VikWindow *vw ) { - GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/ShowCenterMark" ); + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowCenterMark" ); g_assert(check_box); gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box)); vik_viewport_set_draw_centermark ( vw->viking_vvp, state ); draw_update ( vw ); } +static void set_draw_highlight ( GtkAction *a, VikWindow *vw ) +{ + GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowHighlight" ); + g_assert(check_box); + gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box)); + vik_viewport_set_draw_highlight ( vw->viking_vvp, state ); + draw_update ( vw ); +} + static void set_bg_color ( GtkAction *a, VikWindow *vw ) { GtkWidget *colorsd = gtk_color_selection_dialog_new ( _("Choose a background color") ); @@ -2076,6 +2492,22 @@ static void set_bg_color ( GtkAction *a, VikWindow *vw ) gtk_widget_destroy ( colorsd ); } +static void set_highlight_color ( GtkAction *a, VikWindow *vw ) +{ + GtkWidget *colorsd = gtk_color_selection_dialog_new ( _("Choose a track highlight color") ); + GdkColor *color = vik_viewport_get_highlight_gdkcolor ( vw->viking_vvp ); + gtk_color_selection_set_previous_color ( GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(colorsd)->colorsel), color ); + gtk_color_selection_set_current_color ( GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(colorsd)->colorsel), color ); + if ( gtk_dialog_run ( GTK_DIALOG(colorsd) ) == GTK_RESPONSE_OK ) + { + gtk_color_selection_get_current_color ( GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(colorsd)->colorsel), color ); + vik_viewport_set_highlight_gdkcolor ( vw->viking_vvp, color ); + draw_update ( vw ); + } + g_free ( color ); + gtk_widget_destroy ( colorsd ); +} + /*********************************************************************************************** @@ -2086,6 +2518,7 @@ static GtkActionEntry entries[] = { { "File", NULL, N_("_File"), 0, 0, 0 }, { "Edit", NULL, N_("_Edit"), 0, 0, 0 }, { "View", NULL, N_("_View"), 0, 0, 0 }, + { "SetShow", NULL, N_("_Show"), 0, 0, 0 }, { "SetZoom", NULL, N_("_Zoom"), 0, 0, 0 }, { "SetPan", NULL, N_("_Pan"), 0, 0, 0 }, { "Layers", NULL, N_("_Layers"), 0, 0, 0 }, @@ -2094,19 +2527,26 @@ static GtkActionEntry entries[] = { { "Help", NULL, N_("_Help"), 0, 0, 0 }, { "New", GTK_STOCK_NEW, N_("_New"), "N", N_("New file"), (GCallback)newwindow_cb }, - { "Open", GTK_STOCK_OPEN, N_("_Open"), "O", N_("Open a file"), (GCallback)load_file }, - { "OpenRecentFile", NULL, N_("Open _Recent file"), NULL, NULL, (GCallback)NULL }, - { "Append", GTK_STOCK_ADD, N_("A_ppend File"), NULL, N_("Append data from a different file"), (GCallback)load_file }, - { "Acquire", NULL, N_("A_cquire"), 0, 0, 0 }, - { "AcquireGPS", NULL, N_("From _GPS"), NULL, N_("Transfer data from a GPS device"), (GCallback)acquire_from_gps }, - { "AcquireGoogle", NULL, N_("Google _Directions"), NULL, N_("Get driving directions from Google"), (GCallback)acquire_from_google }, + { "Open", GTK_STOCK_OPEN, N_("_Open..."), "O", N_("Open a file"), (GCallback)load_file }, + { "OpenRecentFile", NULL, N_("Open _Recent File"), NULL, NULL, (GCallback)NULL }, + { "Append", GTK_STOCK_ADD, N_("Append _File..."), NULL, N_("Append data from a different file"), (GCallback)load_file }, + { "Acquire", GTK_STOCK_GO_DOWN, N_("A_cquire"), NULL, NULL, (GCallback)NULL }, + { "AcquireGPS", NULL, N_("From _GPS..."), NULL, N_("Transfer data from a GPS device"), (GCallback)acquire_from_gps }, + { "AcquireGPSBabel", NULL, N_("Import File With GPS_Babel..."), NULL, N_("Import file via GPSBabel converter"), (GCallback)acquire_from_file }, + { "AcquireGoogle", NULL, N_("Google _Directions..."), NULL, N_("Get driving directions from Google"), (GCallback)acquire_from_google }, +#ifdef VIK_CONFIG_OPENSTREETMAP + { "AcquireOSM", NULL, N_("_OSM Traces..."), NULL, N_("Get traces from OpenStreetMap"), (GCallback)acquire_from_osm }, +#endif #ifdef VIK_CONFIG_GEOCACHES - { "AcquireGC", NULL, N_("Geo_caches"), NULL, N_("Get Geocaches from geocaching.com"), (GCallback)acquire_from_gc }, + { "AcquireGC", NULL, N_("Geo_caches..."), NULL, N_("Get Geocaches from geocaching.com"), (GCallback)acquire_from_gc }, +#endif +#ifdef VIK_CONFIG_GEOTAG + { "AcquireGeotag", NULL, N_("From Geotagged _Images..."), NULL, N_("Create waypoints from geotagged images"), (GCallback)acquire_from_geotag }, #endif { "Save", GTK_STOCK_SAVE, N_("_Save"), "S", N_("Save the file"), (GCallback)save_file }, - { "SaveAs", GTK_STOCK_SAVE_AS, N_("Save _As"), NULL, N_("Save the file under different name"), (GCallback)save_file_as }, - { "GenImg", GTK_STOCK_CLEAR, N_("_Generate Image File"), NULL, N_("Save a snapshot of the workspace into a file"), (GCallback)draw_to_image_file_cb }, - { "GenImgDir", GTK_STOCK_DND_MULTIPLE, N_("Generate _Directory of Images"), NULL, N_("FIXME:IMGDIR"), (GCallback)draw_to_image_dir_cb }, + { "SaveAs", GTK_STOCK_SAVE_AS, N_("Save _As..."), NULL, N_("Save the file under different name"), (GCallback)save_file_as }, + { "GenImg", GTK_STOCK_CLEAR, N_("_Generate Image File..."), NULL, N_("Save a snapshot of the workspace into a file"), (GCallback)draw_to_image_file_cb }, + { "GenImgDir", GTK_STOCK_DND_MULTIPLE, N_("Generate _Directory of Images..."), NULL, N_("FIXME:IMGDIR"), (GCallback)draw_to_image_dir_cb }, #if GTK_CHECK_VERSION(2,10,0) { "Print", GTK_STOCK_PRINT, N_("_Print..."), NULL, N_("Print maps"), (GCallback)print_cb }, @@ -2115,13 +2555,15 @@ static GtkActionEntry entries[] = { { "Exit", GTK_STOCK_QUIT, N_("E_xit"), "W", N_("Exit the program"), (GCallback)window_close }, { "SaveExit", GTK_STOCK_QUIT, N_("Save and Exit"), NULL, N_("Save and Exit the program"), (GCallback)save_file_and_exit }, - { "GotoSearch", GTK_STOCK_JUMP_TO, N_("Go To location"), NULL, N_("Go to address/place using text search"), (GCallback)goto_address }, - { "GotoLL", GTK_STOCK_JUMP_TO, N_("_Go to Lat\\/Lon..."), NULL, N_("Go to arbitrary lat\\/lon coordinate"), (GCallback)draw_goto_cb }, + { "GotoDefaultLocation", GTK_STOCK_HOME, N_("Go to the _Default Location"), NULL, N_("Go to the default location"), (GCallback)goto_default_location }, + { "GotoSearch", GTK_STOCK_JUMP_TO, N_("Go to _Location..."), NULL, N_("Go to address/place using text search"), (GCallback)goto_address }, + { "GotoLL", GTK_STOCK_JUMP_TO, N_("_Go to Lat/Lon..."), NULL, N_("Go to arbitrary lat/lon coordinate"), (GCallback)draw_goto_cb }, { "GotoUTM", GTK_STOCK_JUMP_TO, N_("Go to UTM..."), NULL, N_("Go to arbitrary UTM coordinate"), (GCallback)draw_goto_cb }, - { "SetBGColor",GTK_STOCK_SELECT_COLOR, N_("Set Background Color..."), NULL, NULL, (GCallback)set_bg_color }, + { "SetHLColor",GTK_STOCK_SELECT_COLOR, N_("Set _Highlight Color..."), NULL, NULL, (GCallback)set_highlight_color }, + { "SetBGColor",GTK_STOCK_SELECT_COLOR, N_("Set Bac_kground Color..."), NULL, NULL, (GCallback)set_bg_color }, { "ZoomIn", GTK_STOCK_ZOOM_IN, N_("Zoom _In"), "plus", NULL, (GCallback)draw_zoom_cb }, { "ZoomOut", GTK_STOCK_ZOOM_OUT, N_("Zoom _Out"), "minus", NULL, (GCallback)draw_zoom_cb }, - { "ZoomTo", GTK_STOCK_ZOOM_FIT, N_("Zoom _To"), "Z", NULL, (GCallback)zoom_to_cb }, + { "ZoomTo", GTK_STOCK_ZOOM_FIT, N_("Zoom _To..."), "Z", NULL, (GCallback)zoom_to_cb }, { "Zoom0.25", NULL, N_("0.25"), NULL, NULL, (GCallback)draw_zoom_cb }, { "Zoom0.5", NULL, N_("0.5"), NULL, NULL, (GCallback)draw_zoom_cb }, { "Zoom1", NULL, N_("1"), NULL, NULL, (GCallback)draw_zoom_cb }, @@ -2132,10 +2574,18 @@ static GtkActionEntry entries[] = { { "Zoom32", NULL, N_("32"), NULL, NULL, (GCallback)draw_zoom_cb }, { "Zoom64", NULL, N_("64"), NULL, NULL, (GCallback)draw_zoom_cb }, { "Zoom128", NULL, N_("128"), NULL, NULL, (GCallback)draw_zoom_cb }, - { "PanNorth", NULL, N_("Pan North"), "Up", NULL, (GCallback)draw_pan_cb }, - { "PanEast", NULL, N_("Pan East"), "Right", NULL, (GCallback)draw_pan_cb }, - { "PanSouth", NULL, N_("Pan South"), "Down", NULL, (GCallback)draw_pan_cb }, - { "PanWest", NULL, N_("Pan West"), "Left", NULL, (GCallback)draw_pan_cb }, + { "Zoom256", NULL, N_("256"), NULL, NULL, (GCallback)draw_zoom_cb }, + { "Zoom512", NULL, N_("512"), NULL, NULL, (GCallback)draw_zoom_cb }, + { "Zoom1024", NULL, N_("1024"), NULL, NULL, (GCallback)draw_zoom_cb }, + { "Zoom2048", NULL, N_("2048"), NULL, NULL, (GCallback)draw_zoom_cb }, + { "Zoom4096", NULL, N_("4096"), NULL, NULL, (GCallback)draw_zoom_cb }, + { "Zoom8192", NULL, N_("8192"), NULL, NULL, (GCallback)draw_zoom_cb }, + { "Zoom16384", NULL, N_("16384"), NULL, NULL, (GCallback)draw_zoom_cb }, + { "Zoom32768", NULL, N_("32768"), NULL, NULL, (GCallback)draw_zoom_cb }, + { "PanNorth", NULL, N_("Pan _North"), "Up", NULL, (GCallback)draw_pan_cb }, + { "PanEast", NULL, N_("Pan _East"), "Right", NULL, (GCallback)draw_pan_cb }, + { "PanSouth", NULL, N_("Pan _South"), "Down", NULL, (GCallback)draw_pan_cb }, + { "PanWest", NULL, N_("Pan _West"), "Left", NULL, (GCallback)draw_pan_cb }, { "BGJobs", GTK_STOCK_EXECUTE, N_("Background _Jobs"), NULL, NULL, (GCallback)a_background_show_window }, { "Cut", GTK_STOCK_CUT, N_("Cu_t"), NULL, NULL, (GCallback)menu_cut_layer_cb }, @@ -2143,8 +2593,9 @@ static GtkActionEntry entries[] = { { "Paste", GTK_STOCK_PASTE, N_("_Paste"), NULL, NULL, (GCallback)menu_paste_layer_cb }, { "Delete", GTK_STOCK_DELETE, N_("_Delete"), NULL, NULL, (GCallback)menu_delete_layer_cb }, { "DeleteAll", NULL, N_("Delete All"), NULL, NULL, (GCallback)clear_cb }, - { "MapCacheFlush",NULL, N_("Flush Map cache"), NULL, NULL, (GCallback)mapcache_flush_cb }, - { "Preferences",GTK_STOCK_PREFERENCES, N_("_Preferences..."), NULL, NULL, (GCallback)preferences_cb }, + { "MapCacheFlush",NULL, N_("_Flush Map Cache"), NULL, NULL, (GCallback)mapcache_flush_cb }, + { "SetDefaultLocation", GTK_STOCK_GO_FORWARD, N_("_Set the Default Location"), NULL, N_("Set the Default Location to the current position"),(GCallback)default_location_cb }, + { "Preferences",GTK_STOCK_PREFERENCES, N_("_Preferences"), NULL, NULL, (GCallback)preferences_cb }, { "Properties",GTK_STOCK_PROPERTIES, N_("_Properties"), NULL, NULL, (GCallback)menu_properties_cb }, { "HelpEntry", GTK_STOCK_HELP, N_("_Help"), "F1", NULL, (GCallback)help_help_cb }, @@ -2152,23 +2603,30 @@ static GtkActionEntry entries[] = { }; /* Radio items */ +/* FIXME use VIEWPORT_DRAWMODE values */ static GtkRadioActionEntry mode_entries[] = { { "ModeUTM", NULL, N_("_UTM Mode"), "u", NULL, 0 }, { "ModeExpedia", NULL, N_("_Expedia Mode"), "e", NULL, 1 }, - { "ModeMercator", NULL, N_("_Mercator Mode"), "g", NULL, 4 } + { "ModeMercator", NULL, N_("_Mercator Mode"), "m", NULL, 4 }, + { "ModeLatLon", NULL, N_("Lat_/Lon Mode"), "l", NULL, 5 }, }; static GtkRadioActionEntry tool_entries[] = { { "Pan", "vik-icon-pan", N_("_Pan"), "P", N_("Pan Tool"), 0 }, { "Zoom", "vik-icon-zoom", N_("_Zoom"), "Z", N_("Zoom Tool"), 1 }, - { "Ruler", "vik-icon-ruler", N_("_Ruler"), "R", N_("Ruler Tool"), 2 } + { "Ruler", "vik-icon-ruler", N_("_Ruler"), "R", N_("Ruler Tool"), 2 }, + { "Select", "vik-icon-select", N_("_Select"), "S", N_("Select Tool"), 3 } }; static GtkToggleActionEntry toggle_entries[] = { - { "ShowScale", NULL, N_("Show Scale"), NULL, N_("Show Scale"), (GCallback)set_draw_scale, TRUE }, - { "ShowCenterMark", NULL, N_("Show Center Mark"), NULL, N_("Show Center Mark"), (GCallback)set_draw_centermark, TRUE }, - { "FullScreen", GTK_STOCK_FULLSCREEN, N_("Full Screen"), "F11", N_("Activate full screen mode"), (GCallback)full_screen_cb, FALSE }, - { "ViewSidePanel", GTK_STOCK_INDEX, N_("Show Side Panel"), "F9", N_("Show Side Panel"), (GCallback)view_side_panel_cb, TRUE }, + { "ShowScale", NULL, N_("Show _Scale"), "F5", N_("Show Scale"), (GCallback)set_draw_scale, TRUE }, + { "ShowCenterMark", NULL, N_("Show _Center Mark"), "F6", N_("Show Center Mark"), (GCallback)set_draw_centermark, TRUE }, + { "ShowHighlight", GTK_STOCK_UNDERLINE, N_("Show _Highlight"), "F7", N_("Show Highlight"), (GCallback)set_draw_highlight, TRUE }, + { "FullScreen", GTK_STOCK_FULLSCREEN, N_("_Full Screen"), "F11", N_("Activate full screen mode"), (GCallback)full_screen_cb, FALSE }, + { "ViewSidePanel", GTK_STOCK_INDEX, N_("Show Side _Panel"), "F9", N_("Show Side Panel"), (GCallback)view_side_panel_cb, TRUE }, + { "ViewStatusBar", NULL, N_("Show Status_bar"), "F12", N_("Show Statusbar"), (GCallback)view_statusbar_cb, TRUE }, + { "ViewToolbar", NULL, N_("Show _Toolbar"), "F3", N_("Show Toolbar"), (GCallback)view_toolbar_cb, TRUE }, + { "ViewMainMenu", NULL, N_("Show _Menu"), "F4", N_("Show Menu"), (GCallback)view_main_menu_cb, TRUE }, }; #include "menu.xml.h" @@ -2190,6 +2648,7 @@ static void window_create_ui( VikWindow *window ) toolbox_add_tool(window->vt, &ruler_tool, TOOL_LAYER_TYPE_NONE); toolbox_add_tool(window->vt, &zoom_tool, TOOL_LAYER_TYPE_NONE); toolbox_add_tool(window->vt, &pan_tool, TOOL_LAYER_TYPE_NONE); + toolbox_add_tool(window->vt, &select_tool, TOOL_LAYER_TYPE_NONE); error = NULL; if (!(mid = gtk_ui_manager_add_ui_from_string (uim, menu_xml, -1, &error))) { @@ -2295,7 +2754,7 @@ static struct { gchar *stock_id; } stock_icons[] = { { &begintr_18_pixbuf, "Begin Track" }, - { &iscissors_18_pixbuf, "Magic Scissors" }, + { &route_finder_18_pixbuf, "Route Finder" }, { &mover_22_pixbuf, "vik-icon-pan" }, { &demdl_18_pixbuf, "DEM Download/Import" }, { &showpic_18_pixbuf, "Show Picture" }, @@ -2305,10 +2764,10 @@ static struct { { &edwp_18_pixbuf, "Edit Waypoint" }, { &zoom_18_pixbuf, "vik-icon-zoom" }, { &ruler_18_pixbuf, "vik-icon-ruler" }, + { &select_18_pixbuf, "vik-icon-select" }, { &geozoom_18_pixbuf, "Georef Zoom Tool" }, { &geomove_18_pixbuf, "Georef Move Map" }, { &mapdl_18_pixbuf, "Maps Download" }, - { &showpic_18_pixbuf, "Show Picture" }, }; static gint n_stock_icons = G_N_ELEMENTS (stock_icons); @@ -2327,3 +2786,124 @@ register_vik_icons (GtkIconFactory *icon_factory) } } +gpointer vik_window_get_selected_trw_layer ( VikWindow *vw ) +{ + return vw->selected_vtl; +} + +void vik_window_set_selected_trw_layer ( VikWindow *vw, gpointer vtl ) +{ + vw->selected_vtl = vtl; + vw->containing_vtl = vtl; + /* Clear others */ + vw->selected_track = NULL; + vw->selected_tracks = NULL; + vw->selected_waypoint = NULL; + vw->selected_waypoints = NULL; + vw->selected_name = NULL; + // Set highlight thickness + vik_viewport_set_highlight_thickness ( vw->viking_vvp, vik_trw_layer_get_property_tracks_line_thickness (vw->containing_vtl) ); +} + +gpointer vik_window_get_selected_tracks ( VikWindow *vw ) +{ + return vw->selected_tracks; +} + +void vik_window_set_selected_tracks ( VikWindow *vw, gpointer gl, gpointer vtl ) +{ + vw->selected_tracks = gl; + vw->containing_vtl = vtl; + /* Clear others */ + vw->selected_vtl = NULL; + vw->selected_track = NULL; + vw->selected_waypoint = NULL; + vw->selected_waypoints = NULL; + vw->selected_name = NULL; + // Set highlight thickness + vik_viewport_set_highlight_thickness ( vw->viking_vvp, vik_trw_layer_get_property_tracks_line_thickness (vw->containing_vtl) ); +} + +gpointer vik_window_get_selected_track ( VikWindow *vw ) +{ + return vw->selected_track; +} + +void vik_window_set_selected_track ( VikWindow *vw, gpointer *vt, gpointer vtl, gpointer name ) +{ + vw->selected_track = vt; + vw->containing_vtl = vtl; + vw->selected_name = name; + /* Clear others */ + vw->selected_vtl = NULL; + vw->selected_tracks = NULL; + vw->selected_waypoint = NULL; + vw->selected_waypoints = NULL; + // Set highlight thickness + vik_viewport_set_highlight_thickness ( vw->viking_vvp, vik_trw_layer_get_property_tracks_line_thickness (vw->containing_vtl) ); +} + +gpointer vik_window_get_selected_waypoints ( VikWindow *vw ) +{ + return vw->selected_waypoints; +} + +void vik_window_set_selected_waypoints ( VikWindow *vw, gpointer gl, gpointer vtl ) +{ + vw->selected_waypoints = gl; + vw->containing_vtl = vtl; + /* Clear others */ + vw->selected_vtl = NULL; + vw->selected_track = NULL; + vw->selected_tracks = NULL; + vw->selected_waypoint = NULL; + vw->selected_name = NULL; +} + +gpointer vik_window_get_selected_waypoint ( VikWindow *vw ) +{ + return vw->selected_waypoint; +} + +void vik_window_set_selected_waypoint ( VikWindow *vw, gpointer *vwp, gpointer vtl, gpointer name ) +{ + vw->selected_waypoint = vwp; + vw->containing_vtl = vtl; + vw->selected_name = name; + /* Clear others */ + vw->selected_vtl = NULL; + vw->selected_track = NULL; + vw->selected_tracks = NULL; + vw->selected_waypoints = NULL; +} + +gpointer vik_window_get_selected_name ( VikWindow *vw ) +{ + return vw->selected_name; +} + +gboolean vik_window_clear_highlight ( VikWindow *vw ) +{ + gboolean need_redraw = FALSE; + if ( vw->selected_vtl != NULL ) { + vw->selected_vtl = NULL; + need_redraw = TRUE; + } + if ( vw->selected_track != NULL ) { + vw->selected_track = NULL; + need_redraw = TRUE; + } + if ( vw->selected_tracks != NULL ) { + vw->selected_tracks = NULL; + need_redraw = TRUE; + } + if ( vw->selected_waypoint != NULL ) { + vw->selected_waypoint = NULL; + need_redraw = TRUE; + } + if ( vw->selected_waypoints != NULL ) { + vw->selected_waypoints = NULL; + need_redraw = TRUE; + } + return need_redraw; +}