case FILE_TYPE_KML:
fclose ( f );
f = NULL;
- return a_babel_convert_to ( vtl, "-o kml", filename, NULL, NULL );
- break;
+ switch ( a_vik_get_kml_export_units () ) {
+ case VIK_KML_EXPORT_UNITS_STATUTE:
+ return a_babel_convert_to ( vtl, "-o kml", filename, NULL, NULL );
+ break;
+ case VIK_KML_EXPORT_UNITS_NAUTICAL:
+ return a_babel_convert_to ( vtl, "-o kml,units=n", filename, NULL, NULL );
+ break;
+ default:
+ // VIK_KML_EXPORT_UNITS_METRIC:
+ return a_babel_convert_to ( vtl, "-o kml,units=m", filename, NULL, NULL );
+ break;
+ }
+ break;
default:
g_critical("Houston, we've had a problem. file_type=%d", file_type);
}
static VikLayerParamScale params_scales_long[] = { {-180.0, 180.0, 0.05, 2} };
static VikLayerParam prefs1[] = {
- { VIKING_PREFERENCES_NAMESPACE "degree_format", VIK_LAYER_PARAM_UINT, VIK_DEGREE_FORMAT_DMS, N_("Degree format:"), VIK_LAYER_WIDGET_COMBOBOX, params_degree_formats, NULL },
+ { VIKING_PREFERENCES_NAMESPACE "degree_format", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Degree format:"), VIK_LAYER_WIDGET_COMBOBOX, params_degree_formats, NULL },
};
static VikLayerParam prefs2[] = {
- { VIKING_PREFERENCES_NAMESPACE "units_distance", VIK_LAYER_PARAM_UINT, VIK_UNITS_DISTANCE_KILOMETRES, N_("Distance units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_distance, NULL },
+ { VIKING_PREFERENCES_NAMESPACE "units_distance", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Distance units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_distance, NULL },
};
static VikLayerParam prefs3[] = {
- { VIKING_PREFERENCES_NAMESPACE "units_speed", VIK_LAYER_PARAM_UINT, VIK_UNITS_SPEED_KILOMETRES_PER_HOUR, N_("Speed units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_speed, NULL },
+ { VIKING_PREFERENCES_NAMESPACE "units_speed", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Speed units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_speed, NULL },
};
static VikLayerParam prefs4[] = {
- { VIKING_PREFERENCES_NAMESPACE "units_height", VIK_LAYER_PARAM_UINT, VIK_UNITS_HEIGHT_METRES, N_("Height units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_height, NULL },
+ { VIKING_PREFERENCES_NAMESPACE "units_height", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Height units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_height, NULL },
};
static VikLayerParam prefs5[] = {
- { VIKING_PREFERENCES_NAMESPACE "use_large_waypoint_icons", VIK_LAYER_PARAM_BOOLEAN, TRUE, N_("Use large waypoint icons:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL },
+ { VIKING_PREFERENCES_NAMESPACE "use_large_waypoint_icons", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Use large waypoint icons:"), VIK_LAYER_WIDGET_CHECKBUTTON, NULL, NULL },
};
static VikLayerParam prefs6[] = {
- { VIKING_PREFERENCES_NAMESPACE "default_latitude", VIK_LAYER_PARAM_DOUBLE, VIK_LOCATION_LAT, N_("Default latitude:"), VIK_LAYER_WIDGET_SPINBUTTON, params_scales_lat, NULL },
+ { VIKING_PREFERENCES_NAMESPACE "default_latitude", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Default latitude:"), VIK_LAYER_WIDGET_SPINBUTTON, params_scales_lat, NULL },
};
static VikLayerParam prefs7[] = {
- { VIKING_PREFERENCES_NAMESPACE "default_longitude", VIK_LAYER_PARAM_DOUBLE, VIK_LOCATION_LONG, N_("Default longitude:"), VIK_LAYER_WIDGET_SPINBUTTON, params_scales_long, NULL },
+ { VIKING_PREFERENCES_NAMESPACE "default_longitude", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Default longitude:"), VIK_LAYER_WIDGET_SPINBUTTON, params_scales_long, NULL },
};
+/* External/Export Options */
+
+static gchar * params_kml_export_units[] = {"Metric", "Statute", "Nautical", NULL};
+
+static VikLayerParam io_prefs[] = {
+ { VIKING_PREFERENCES_IO_NAMESPACE "kml_export_units", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("KML File Export Units:"), VIK_LAYER_WIDGET_COMBOBOX, params_kml_export_units, NULL },
+};
+
+#ifndef WINDOWS
+static VikLayerParam io_prefs_non_windows[] = {
+ { VIKING_PREFERENCES_IO_NAMESPACE "image_viewer", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Image Viewer:"), VIK_LAYER_WIDGET_FILEENTRY, NULL, NULL },
+};
+#endif
+
+/* End of Options static stuff */
+
void a_vik_preferences_init ()
{
+ // Defaults for the options are setup here
a_preferences_register_group ( VIKING_PREFERENCES_GROUP_KEY, _("General") );
VikLayerParamData tmp;
a_preferences_register(prefs6, tmp, VIKING_PREFERENCES_GROUP_KEY);
tmp.d = -74.007130;
a_preferences_register(prefs7, tmp, VIKING_PREFERENCES_GROUP_KEY);
+
+ // New Tab
+ a_preferences_register_group ( VIKING_PREFERENCES_IO_GROUP_KEY, _("Export/External") );
+
+ tmp.u = VIK_KML_EXPORT_UNITS_METRIC;
+ a_preferences_register(&io_prefs[0], tmp, VIKING_PREFERENCES_IO_GROUP_KEY);
+
+#ifndef WINDOWS
+ tmp.s = "xdg-open";
+ a_preferences_register(&io_prefs_non_windows[0], tmp, VIKING_PREFERENCES_IO_GROUP_KEY);
+#endif
}
vik_degree_format_t a_vik_get_degree_format ( )
data = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "default_longitude")->d;
return data;
}
+
+/* External/Export Options */
+
+vik_kml_export_units_t a_vik_get_kml_export_units ( )
+{
+ vik_kml_export_units_t units;
+ units = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "kml_export_units")->u;
+ return units;
+}
+
+#ifndef WINDOWS
+const gchar* a_vik_get_image_viewer ( )
+{
+ return a_preferences_get(VIKING_PREFERENCES_IO_NAMESPACE "image_viewer")->s;
+}
+#endif
gdouble a_vik_get_default_lat ( );
gdouble a_vik_get_default_long ( );
+/* KML export preferences */
+typedef enum {
+ VIK_KML_EXPORT_UNITS_METRIC,
+ VIK_KML_EXPORT_UNITS_STATUTE,
+ VIK_KML_EXPORT_UNITS_NAUTICAL,
+} vik_kml_export_units_t;
+
+vik_kml_export_units_t a_vik_get_kml_export_units ( );
+
+#ifndef WINDOWS
+/* Windows automatically uses the system defined viewer
+ ATM for other systems need to specify the program to use */
+const gchar* a_vik_get_image_viewer ( );
+#endif
+
/* Group for global preferences */
#define VIKING_PREFERENCES_GROUP_KEY "viking.globals"
#define VIKING_PREFERENCES_NAMESPACE "viking.globals."
+/* Another group of global preferences,
+ but in a separate section to try to keep things organized */
+/* AKA Export/External Prefs */
+#define VIKING_PREFERENCES_IO_GROUP_KEY "viking.io"
+#define VIKING_PREFERENCES_IO_NAMESPACE "viking.io."
+
#endif
{
vik_viewport_coord_to_screen ( dp->vp, &(tp->coord), &x, &y );
+ /*
+ * If points are the same in display coordinates, don't draw.
+ */
+ if ( useoldvals && x == oldx && y == oldy )
+ {
+ // Still need to process points to ensure 'stops' are drawn if required
+ if ( drawstops && drawpoints && ! drawing_white_background && list->next &&
+ (VIK_TRACKPOINT(list->next->data)->timestamp - VIK_TRACKPOINT(list->data)->timestamp > dp->vtl->stop_length) )
+ vik_viewport_draw_arc ( dp->vp, g_array_index(dp->vtl->track_gc, GdkGC *, 11), TRUE, x-(3*tp_size), y-(3*tp_size), 6*tp_size, 6*tp_size, 0, 360*64 );
+
+ goto skip;
+ }
+
if ( drawpoints && ! drawing_white_background )
{
if ( list->next ) {
- vik_viewport_draw_rectangle ( dp->vp, main_gc, TRUE, x-tp_size, y-tp_size, 2*tp_size, 2*tp_size );
-
+ /*
+ * The concept of drawing stops is that a trackpoint
+ * that is if the next trackpoint has a timestamp far into
+ * the future, we draw a circle of 6x trackpoint size,
+ * instead of a rectangle of 2x trackpoint size.
+ * This is drawn first so the trackpoint will be drawn on top
+ */
/* stops */
if ( drawstops && VIK_TRACKPOINT(list->next->data)->timestamp - VIK_TRACKPOINT(list->data)->timestamp > dp->vtl->stop_length )
+ /* Stop point. Draw 6x circle. */
vik_viewport_draw_arc ( dp->vp, g_array_index(dp->vtl->track_gc, GdkGC *, 11), TRUE, x-(3*tp_size), y-(3*tp_size), 6*tp_size, 6*tp_size, 0, 360*64 );
+
+ /* Regular point - draw 2x square. */
+ vik_viewport_draw_rectangle ( dp->vp, main_gc, TRUE, x-tp_size, y-tp_size, 2*tp_size, 2*tp_size );
}
else
+ /* Final point - draw 4x circle. */
vik_viewport_draw_arc ( dp->vp, main_gc, TRUE, x-(2*tp_size), y-(2*tp_size), 4*tp_size, 4*tp_size, 0, 360*64 );
}
}
}
+ skip:
oldx = x;
oldy = y;
useoldvals = TRUE;
main_gc = g_array_index(dp->vtl->track_gc, GdkGC *, dp->track_gc_iter);
}
- if ( drawing_white_background )
- vik_viewport_draw_line ( dp->vp, dp->vtl->track_bg_gc, oldx, oldy, x, y);
- else
- vik_viewport_draw_line ( dp->vp, main_gc, oldx, oldy, x, y);
+ /*
+ * If points are the same in display coordinates, don't draw.
+ */
+ if ( x != oldx || y != oldy )
+ {
+ if ( drawing_white_background )
+ vik_viewport_draw_line ( dp->vp, dp->vtl->track_bg_gc, oldx, oldy, x, y);
+ else
+ vik_viewport_draw_line ( dp->vp, main_gc, oldx, oldy, x, y);
+ }
}
else
{
- vik_viewport_coord_to_screen ( dp->vp, &(tp2->coord), &x, &y );
- draw_utm_skip_insignia ( dp->vp, main_gc, x, y );
+ /*
+ * If points are the same in display coordinates, don't draw.
+ */
+ if ( x != oldx && y != oldy )
+ {
+ vik_viewport_coord_to_screen ( dp->vp, &(tp2->coord), &x, &y );
+ draw_utm_skip_insignia ( dp->vp, main_gc, x, y );
+ }
}
}
useoldvals = FALSE;
#else /* WINDOWS */
GError *err = NULL;
gchar *quoted_file = g_shell_quote ( (gchar *) pass_along[5] );
- gchar *cmd = g_strdup_printf ( "eog %s", quoted_file );
+ gchar *cmd = g_strdup_printf ( "%s %s", a_vik_get_image_viewer(), quoted_file );
g_free ( quoted_file );
if ( ! g_spawn_command_line_async ( cmd, &err ) )
{
- a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER( pass_along[0]), _("Could not launch eog to open file.") );
+ a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER( pass_along[0]), _("Could not launch %s to open file."), a_vik_get_image_viewer() );
g_error_free ( err );
}
g_free ( cmd );
// No conversion needed if already in metres
// consider chunk size
- int y_alt = height - ((height * (elev-alt_offset))/(chunksa[cia]*LINES) );
+ int y_alt = height - ((height * elev)/(chunksa[cia]*LINES) );
gdk_draw_rectangle(GDK_DRAWABLE(pix), alt_gc, TRUE, x-2, y_alt-2, 4, 4);
}
}