]>
Commit | Line | Data |
---|---|---|
50a14534 EB |
1 | /* |
2 | * viking -- GPS Data and Topo Analyzer, Explorer, and Manager | |
3 | * | |
4 | * Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net> | |
bc996077 | 5 | * Copyright (C) 2015, Rob Norris <rw_norris@hotmail.com> |
50a14534 EB |
6 | * |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License as published by | |
9 | * the Free Software Foundation; either version 2 of the License, or | |
10 | * (at your option) any later version. | |
11 | * | |
12 | * This program is distributed in the hope that it will be useful, | |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | * GNU General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU General Public License | |
18 | * along with this program; if not, write to the Free Software | |
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
20 | * | |
21 | */ | |
22 | ||
4c77d5e0 GB |
23 | #ifdef HAVE_CONFIG_H |
24 | #include "config.h" | |
25 | #endif | |
26 | ||
50a14534 | 27 | #include <gtk/gtk.h> |
4c77d5e0 | 28 | #include <glib/gi18n.h> |
50a14534 | 29 | #include <time.h> |
86f7d733 | 30 | #include <math.h> |
50a14534 EB |
31 | |
32 | #include "coords.h" | |
33 | #include "vikcoord.h" | |
34 | #include "viktrack.h" | |
35 | #include "viktrwlayer_tpwin.h" | |
36 | #include "vikwaypoint.h" | |
8ada46de | 37 | #include "vikutils.h" |
50a14534 | 38 | #include "dialog.h" |
6f9336aa | 39 | #include "globals.h" |
93cfbc21 | 40 | #include "vikdatetime_edit_dialog.h" |
063d6324 | 41 | #include "ui_util.h" |
50a14534 | 42 | |
50a14534 EB |
43 | struct _VikTrwLayerTpwin { |
44 | GtkDialog parent; | |
0243b089 | 45 | GtkSpinButton *lat, *lon, *alt, *ts; |
b45865b4 | 46 | GtkWidget *trkpt_name; |
8ada46de | 47 | GtkWidget *time; |
93cfbc21 | 48 | GtkLabel *course, *diff_dist, *diff_time, *diff_speed, *speed, *hdop, *vdop, *pdop, *sat; |
2cada010 RN |
49 | // Previously these buttons were in a glist, however I think the ordering behaviour is implicit |
50 | // thus control manually to ensure operating on the correct button | |
51 | GtkWidget *button_close; | |
52 | GtkWidget *button_delete; | |
53 | GtkWidget *button_insert; | |
54 | GtkWidget *button_split; | |
55 | GtkWidget *button_back; | |
56 | GtkWidget *button_forward; | |
50a14534 | 57 | VikTrackpoint *cur_tp; |
50a14534 EB |
58 | gboolean sync_to_tp_block; |
59 | }; | |
60 | ||
61 | GType vik_trw_layer_tpwin_get_type (void) | |
62 | { | |
63 | static GType tpwin_type = 0; | |
64 | ||
65 | if (!tpwin_type) | |
66 | { | |
67 | static const GTypeInfo tpwin_info = | |
68 | { | |
69 | sizeof (VikTrwLayerTpwinClass), | |
70 | NULL, /* base_init */ | |
71 | NULL, /* base_finalize */ | |
72 | NULL, /* class init */ | |
73 | NULL, /* class_finalize */ | |
74 | NULL, /* class_data */ | |
75 | sizeof (VikTrwLayerTpwin), | |
76 | 0, | |
77 | NULL /* instance init */ | |
78 | }; | |
79 | tpwin_type = g_type_register_static ( GTK_TYPE_DIALOG, "VikTrwLayerTpwin", &tpwin_info, 0 ); | |
80 | } | |
81 | ||
82 | return tpwin_type; | |
83 | } | |
84 | ||
0243b089 RN |
85 | /** |
86 | * Just update the display for the time fields | |
87 | */ | |
88 | static void tpwin_update_times ( VikTrwLayerTpwin *tpwin, VikTrackpoint *tp ) | |
89 | { | |
0243b089 RN |
90 | if ( tp->has_timestamp ) { |
91 | gtk_spin_button_set_value ( tpwin->ts, tp->timestamp ); | |
8ada46de RN |
92 | gchar *msg = vu_get_time_string ( &(tp->timestamp), "%c", &(tp->coord), NULL ); |
93 | gtk_button_set_label ( GTK_BUTTON(tpwin->time), msg ); | |
94 | g_free ( msg ); | |
0243b089 RN |
95 | } |
96 | else { | |
97 | gtk_spin_button_set_value ( tpwin->ts, 0 ); | |
8ada46de | 98 | gtk_button_set_label ( GTK_BUTTON(tpwin->time), "" ); |
0243b089 RN |
99 | } |
100 | } | |
101 | ||
50a14534 EB |
102 | static void tpwin_sync_ll_to_tp ( VikTrwLayerTpwin *tpwin ) |
103 | { | |
104 | if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) | |
105 | { | |
106 | struct LatLon ll; | |
107 | VikCoord coord; | |
108 | ll.lat = gtk_spin_button_get_value ( tpwin->lat ); | |
109 | ll.lon = gtk_spin_button_get_value ( tpwin->lon ); | |
110 | vik_coord_load_from_latlon ( &coord, tpwin->cur_tp->coord.mode, &ll ); | |
111 | ||
112 | /* don't redraw unless we really have to */ | |
113 | if ( vik_coord_diff(&(tpwin->cur_tp->coord), &coord) > 0.05 ) /* may not be exact due to rounding */ | |
114 | { | |
115 | tpwin->cur_tp->coord = coord; | |
116 | gtk_dialog_response ( GTK_DIALOG(tpwin), VIK_TRW_LAYER_TPWIN_DATA_CHANGED ); | |
117 | } | |
118 | } | |
119 | } | |
120 | ||
121 | static void tpwin_sync_alt_to_tp ( VikTrwLayerTpwin *tpwin ) | |
122 | { | |
6027a9c5 RN |
123 | if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) { |
124 | // Always store internally in metres | |
125 | vik_units_height_t height_units = a_vik_get_units_height (); | |
126 | switch (height_units) { | |
127 | case VIK_UNITS_HEIGHT_METRES: | |
128 | tpwin->cur_tp->altitude = gtk_spin_button_get_value ( tpwin->alt ); | |
129 | break; | |
130 | case VIK_UNITS_HEIGHT_FEET: | |
ab1e0693 | 131 | tpwin->cur_tp->altitude = VIK_FEET_TO_METERS(gtk_spin_button_get_value ( tpwin->alt )); |
6027a9c5 RN |
132 | break; |
133 | default: | |
134 | tpwin->cur_tp->altitude = gtk_spin_button_get_value ( tpwin->alt ); | |
135 | g_critical("Houston, we've had a problem. height=%d", height_units); | |
136 | } | |
137 | } | |
50a14534 EB |
138 | } |
139 | ||
0243b089 RN |
140 | /** |
141 | * | |
142 | */ | |
143 | static void tpwin_sync_ts_to_tp ( VikTrwLayerTpwin *tpwin ) | |
144 | { | |
145 | if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) { | |
146 | tpwin->cur_tp->timestamp = gtk_spin_button_get_value_as_int ( tpwin->ts ); | |
147 | ||
148 | tpwin_update_times ( tpwin, tpwin->cur_tp ); | |
149 | } | |
150 | } | |
151 | ||
2d4b00e1 RN |
152 | static time_t last_edit_time = 0; |
153 | ||
93cfbc21 RN |
154 | /** |
155 | * tpwin_sync_time_to_tp: | |
156 | * | |
157 | */ | |
bc996077 | 158 | static void tpwin_sync_time_to_tp ( GtkWidget* widget, GdkEventButton *event, VikTrwLayerTpwin *tpwin ) |
93cfbc21 | 159 | { |
bc996077 RN |
160 | if ( !tpwin->cur_tp || tpwin->sync_to_tp_block ) |
161 | return; | |
162 | ||
163 | if ( event->button == 3 ) { | |
164 | // On right click and when a time is available, allow a method to copy the displayed time as text | |
165 | if ( !gtk_button_get_image ( GTK_BUTTON(widget) ) ) { | |
166 | vu_copy_label_menu ( widget, event->button ); | |
167 | } | |
168 | return; | |
169 | } | |
170 | else if ( event->button == 2 ) { | |
171 | return; | |
172 | } | |
173 | ||
93cfbc21 RN |
174 | if ( !tpwin->cur_tp || tpwin->sync_to_tp_block ) |
175 | return; | |
2d4b00e1 RN |
176 | |
177 | if ( tpwin->cur_tp->has_timestamp ) | |
178 | last_edit_time = tpwin->cur_tp->timestamp; | |
179 | else if ( last_edit_time == 0 ) | |
180 | time ( &last_edit_time ); | |
93cfbc21 RN |
181 | |
182 | GTimeZone *gtz = g_time_zone_new_local (); | |
2d4b00e1 RN |
183 | time_t mytime = vik_datetime_edit_dialog ( GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(&tpwin->parent))), |
184 | _("Date/Time Edit"), | |
185 | last_edit_time, | |
186 | gtz ); | |
93cfbc21 RN |
187 | g_time_zone_unref ( gtz ); |
188 | ||
189 | // Was the dialog cancelled? | |
190 | if ( mytime == 0 ) | |
191 | return; | |
192 | ||
193 | // Otherwise use the new value | |
194 | tpwin->cur_tp->timestamp = mytime; | |
2d4b00e1 | 195 | tpwin->cur_tp->has_timestamp = TRUE; |
93cfbc21 RN |
196 | // TODO: consider warning about unsorted times? |
197 | ||
2d4b00e1 | 198 | // Clear the previous 'Add' image as now a time is set |
8ada46de RN |
199 | if ( gtk_button_get_image ( GTK_BUTTON(tpwin->time) ) ) |
200 | gtk_button_set_image ( GTK_BUTTON(tpwin->time), NULL ); | |
2d4b00e1 | 201 | |
93cfbc21 RN |
202 | tpwin_update_times ( tpwin, tpwin->cur_tp ); |
203 | } | |
204 | ||
f629b00b | 205 | static gboolean tpwin_set_name ( VikTrwLayerTpwin *tpwin ) |
b45865b4 RN |
206 | { |
207 | if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) { | |
208 | vik_trackpoint_set_name ( tpwin->cur_tp, gtk_entry_get_text(GTK_ENTRY(tpwin->trkpt_name)) ); | |
209 | } | |
f629b00b | 210 | return FALSE; |
b45865b4 RN |
211 | } |
212 | ||
50a14534 EB |
213 | VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow *parent ) |
214 | { | |
b45865b4 | 215 | static gchar *left_label_texts[] = { N_("<b>Name:</b>"), |
86f7d733 | 216 | N_("<b>Latitude:</b>"), |
4c77d5e0 | 217 | N_("<b>Longitude:</b>"), |
86f7d733 RN |
218 | N_("<b>Altitude:</b>"), |
219 | N_("<b>Course:</b>"), | |
220 | N_("<b>Timestamp:</b>"), | |
221 | N_("<b>Time:</b>") }; | |
4c77d5e0 GB |
222 | static gchar *right_label_texts[] = { N_("<b>Distance Difference:</b>"), |
223 | N_("<b>Time Difference:</b>"), | |
86f7d733 RN |
224 | N_("<b>\"Speed\" Between:</b>"), |
225 | N_("<b>Speed:</b>"), | |
226 | N_("<b>VDOP:</b>"), | |
227 | N_("<b>HDOP:</b>"), | |
228 | N_("<b>PDOP:</b>"), | |
229 | N_("<b>SAT/FIX:</b>") }; | |
50a14534 EB |
230 | |
231 | VikTrwLayerTpwin *tpwin = VIK_TRW_LAYER_TPWIN ( g_object_new ( VIK_TRW_LAYER_TPWIN_TYPE, NULL ) ); | |
232 | GtkWidget *main_hbox, *left_vbox, *right_vbox; | |
233 | GtkWidget *diff_left_vbox, *diff_right_vbox; | |
50a14534 EB |
234 | |
235 | gtk_window_set_transient_for ( GTK_WINDOW(tpwin), parent ); | |
4c77d5e0 | 236 | gtk_window_set_title ( GTK_WINDOW(tpwin), _("Trackpoint") ); |
50a14534 | 237 | |
2cada010 RN |
238 | tpwin->button_close = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_CLOSE, VIK_TRW_LAYER_TPWIN_CLOSE); |
239 | tpwin->button_insert = gtk_dialog_add_button ( GTK_DIALOG(tpwin), _("_Insert After"), VIK_TRW_LAYER_TPWIN_INSERT); | |
240 | tpwin->button_delete = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_DELETE, VIK_TRW_LAYER_TPWIN_DELETE); | |
241 | tpwin->button_split = gtk_dialog_add_button ( GTK_DIALOG(tpwin), _("Split Here"), VIK_TRW_LAYER_TPWIN_SPLIT); | |
242 | tpwin->button_back = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_GO_BACK, VIK_TRW_LAYER_TPWIN_BACK); | |
243 | tpwin->button_forward = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_GO_FORWARD, VIK_TRW_LAYER_TPWIN_FORWARD); | |
244 | ||
245 | /* | |
50a14534 EB |
246 | gtk_dialog_add_buttons ( GTK_DIALOG(tpwin), |
247 | GTK_STOCK_CLOSE, VIK_TRW_LAYER_TPWIN_CLOSE, | |
2880a1de | 248 | _("_Insert After"), VIK_TRW_LAYER_TPWIN_INSERT, |
50a14534 | 249 | GTK_STOCK_DELETE, VIK_TRW_LAYER_TPWIN_DELETE, |
4c77d5e0 | 250 | _("Split Here"), VIK_TRW_LAYER_TPWIN_SPLIT, |
50a14534 EB |
251 | GTK_STOCK_GO_BACK, VIK_TRW_LAYER_TPWIN_BACK, |
252 | GTK_STOCK_GO_FORWARD, VIK_TRW_LAYER_TPWIN_FORWARD, | |
253 | NULL ); | |
254 | tpwin->buttons = gtk_container_get_children(GTK_CONTAINER(GTK_DIALOG(tpwin)->action_area)); | |
2cada010 | 255 | */ |
50a14534 EB |
256 | |
257 | /* main track info */ | |
86f7d733 | 258 | left_vbox = a_dialog_create_label_vbox ( left_label_texts, G_N_ELEMENTS(left_label_texts), 1, 3 ); |
50a14534 | 259 | |
b45865b4 RN |
260 | tpwin->trkpt_name = gtk_entry_new(); |
261 | g_signal_connect_swapped ( G_OBJECT(tpwin->trkpt_name), "focus-out-event", G_CALLBACK(tpwin_set_name), tpwin ); | |
262 | ||
063d6324 | 263 | tpwin->course = GTK_LABEL(ui_label_new_selectable(NULL)); |
8ada46de RN |
264 | tpwin->time = gtk_button_new(); |
265 | gtk_button_set_relief ( GTK_BUTTON(tpwin->time), GTK_RELIEF_NONE ); | |
bc996077 | 266 | g_signal_connect ( G_OBJECT(tpwin->time), "button-release-event", G_CALLBACK(tpwin_sync_time_to_tp), tpwin ); |
50a14534 EB |
267 | |
268 | tpwin->lat = GTK_SPIN_BUTTON(gtk_spin_button_new( GTK_ADJUSTMENT(gtk_adjustment_new ( | |
269 | 0, -90, 90, 0.00005, 0.01, 0 )), 0.00005, 6)); | |
270 | tpwin->lon = GTK_SPIN_BUTTON(gtk_spin_button_new( GTK_ADJUSTMENT(gtk_adjustment_new ( | |
271 | 0, -180, 180, 0.00005, 0.01, 0 )), 0.00005, 6)); | |
272 | ||
273 | g_signal_connect_swapped ( G_OBJECT(tpwin->lat), "value-changed", G_CALLBACK(tpwin_sync_ll_to_tp), tpwin ); | |
274 | g_signal_connect_swapped ( G_OBJECT(tpwin->lon), "value-changed", G_CALLBACK(tpwin_sync_ll_to_tp), tpwin ); | |
275 | ||
276 | tpwin->alt = GTK_SPIN_BUTTON(gtk_spin_button_new( GTK_ADJUSTMENT(gtk_adjustment_new ( | |
277 | 0, -1000, 25000, 10, 100, 0 )), 10, 2)); | |
278 | ||
279 | g_signal_connect_swapped ( G_OBJECT(tpwin->alt), "value-changed", G_CALLBACK(tpwin_sync_alt_to_tp), tpwin ); | |
280 | ||
0243b089 RN |
281 | tpwin->ts = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(0,2147483647,1)); //pow(2,31)-1 limit input to ~2038 for now |
282 | g_signal_connect_swapped ( G_OBJECT(tpwin->ts), "value-changed", G_CALLBACK(tpwin_sync_ts_to_tp), tpwin ); | |
283 | gtk_spin_button_set_digits ( tpwin->ts, 0 ); | |
284 | ||
86f7d733 | 285 | right_vbox = gtk_vbox_new ( TRUE, 1 ); |
b45865b4 | 286 | gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->trkpt_name), FALSE, FALSE, 3 ); |
86f7d733 RN |
287 | gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->lat), FALSE, FALSE, 3 ); |
288 | gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->lon), FALSE, FALSE, 3 ); | |
289 | gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->alt), FALSE, FALSE, 3 ); | |
290 | gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->course), FALSE, FALSE, 3 ); | |
291 | gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->ts), FALSE, FALSE, 3 ); | |
8ada46de | 292 | gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->time), FALSE, FALSE, 3 ); |
50a14534 EB |
293 | |
294 | /* diff info */ | |
86f7d733 | 295 | diff_left_vbox = a_dialog_create_label_vbox ( right_label_texts, G_N_ELEMENTS(right_label_texts), 1, 3 ); |
50a14534 | 296 | |
063d6324 RN |
297 | tpwin->diff_dist = GTK_LABEL(ui_label_new_selectable(NULL)); |
298 | tpwin->diff_time = GTK_LABEL(ui_label_new_selectable(NULL)); | |
299 | tpwin->diff_speed = GTK_LABEL(ui_label_new_selectable(NULL)); | |
300 | tpwin->speed = GTK_LABEL(ui_label_new_selectable(NULL)); | |
50a14534 | 301 | |
063d6324 RN |
302 | tpwin->vdop = GTK_LABEL(ui_label_new_selectable(NULL)); |
303 | tpwin->hdop = GTK_LABEL(ui_label_new_selectable(NULL)); | |
304 | tpwin->pdop = GTK_LABEL(ui_label_new_selectable(NULL)); | |
305 | tpwin->sat = GTK_LABEL(ui_label_new_selectable(NULL)); | |
4a42b254 | 306 | |
86f7d733 RN |
307 | diff_right_vbox = gtk_vbox_new ( TRUE, 1 ); |
308 | gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_dist), FALSE, FALSE, 3 ); | |
309 | gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_time), FALSE, FALSE, 3 ); | |
310 | gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_speed), FALSE, FALSE, 3 ); | |
311 | gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->speed), FALSE, FALSE, 3 ); | |
50a14534 | 312 | |
86f7d733 RN |
313 | gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->vdop), FALSE, FALSE, 3 ); |
314 | gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->hdop), FALSE, FALSE, 3 ); | |
315 | gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->pdop), FALSE, FALSE, 3 ); | |
316 | gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->sat), FALSE, FALSE, 3 ); | |
4a42b254 | 317 | |
bc748ef1 | 318 | main_hbox = gtk_hbox_new( FALSE, 0 ); |
8f9150b6 | 319 | gtk_box_pack_start ( GTK_BOX(main_hbox), left_vbox, TRUE, TRUE, 3 ); |
50a14534 EB |
320 | gtk_box_pack_start ( GTK_BOX(main_hbox), right_vbox, TRUE, TRUE, 0 ); |
321 | gtk_box_pack_start ( GTK_BOX(main_hbox), diff_left_vbox, TRUE, TRUE, 0 ); | |
322 | gtk_box_pack_start ( GTK_BOX(main_hbox), diff_right_vbox, TRUE, TRUE, 0 ); | |
323 | ||
9b082b39 | 324 | gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(tpwin))), main_hbox, FALSE, FALSE, 0 ); |
50a14534 EB |
325 | |
326 | tpwin->cur_tp = NULL; | |
327 | ||
b45865b4 RN |
328 | GtkWidget *response_w = NULL; |
329 | #if GTK_CHECK_VERSION (2, 20, 0) | |
330 | response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(tpwin), VIK_TRW_LAYER_TPWIN_CLOSE ); | |
331 | #endif | |
332 | if ( response_w ) | |
333 | gtk_widget_grab_focus ( response_w ); | |
334 | ||
50a14534 EB |
335 | return tpwin; |
336 | } | |
337 | ||
338 | void vik_trw_layer_tpwin_set_empty ( VikTrwLayerTpwin *tpwin ) | |
339 | { | |
b45865b4 RN |
340 | gtk_editable_delete_text ( GTK_EDITABLE(tpwin->trkpt_name), 0, -1 ); |
341 | gtk_widget_set_sensitive ( tpwin->trkpt_name, FALSE ); | |
342 | ||
8ada46de | 343 | gtk_button_set_label ( GTK_BUTTON(tpwin->time), "" ); |
86f7d733 | 344 | gtk_label_set_text ( tpwin->course, NULL ); |
50a14534 EB |
345 | |
346 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lat), FALSE ); | |
347 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lon), FALSE ); | |
348 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->alt), FALSE ); | |
0243b089 | 349 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->ts), FALSE ); |
8ada46de | 350 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->time), FALSE ); |
50a14534 | 351 | |
2cada010 RN |
352 | // Only keep close button enabled |
353 | gtk_widget_set_sensitive ( tpwin->button_insert, FALSE ); | |
354 | gtk_widget_set_sensitive ( tpwin->button_split, FALSE ); | |
355 | gtk_widget_set_sensitive ( tpwin->button_delete, FALSE ); | |
356 | gtk_widget_set_sensitive ( tpwin->button_back, FALSE ); | |
357 | gtk_widget_set_sensitive ( tpwin->button_forward, FALSE ); | |
358 | ||
50a14534 EB |
359 | gtk_label_set_text ( tpwin->diff_dist, NULL ); |
360 | gtk_label_set_text ( tpwin->diff_time, NULL ); | |
361 | gtk_label_set_text ( tpwin->diff_speed, NULL ); | |
86f7d733 | 362 | gtk_label_set_text ( tpwin->speed, NULL ); |
4a42b254 T |
363 | gtk_label_set_text ( tpwin->vdop, NULL ); |
364 | gtk_label_set_text ( tpwin->hdop, NULL ); | |
365 | gtk_label_set_text ( tpwin->pdop, NULL ); | |
366 | gtk_label_set_text ( tpwin->sat, NULL ); | |
b45865b4 RN |
367 | |
368 | gtk_window_set_title ( GTK_WINDOW(tpwin), _("Trackpoint") ); | |
50a14534 EB |
369 | } |
370 | ||
2d4b00e1 RN |
371 | /** |
372 | * vik_trw_layer_tpwin_set_tp: | |
373 | * @tpwin: The Trackpoint Edit Window | |
374 | * @tpl: The #Glist of trackpoints pointing at the current trackpoint | |
375 | * @track_name: The name of the track in which the trackpoint belongs | |
376 | * @is_route: Is the track of the trackpoint actually a route? | |
377 | * | |
378 | * Sets the Trackpoint Edit Window to the values of the current trackpoint given in @tpl. | |
379 | * | |
380 | */ | |
381 | void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, const gchar *track_name, gboolean is_route ) | |
50a14534 | 382 | { |
fff4e5e3 | 383 | static char tmp_str[64]; |
50a14534 EB |
384 | static struct LatLon ll; |
385 | VikTrackpoint *tp = VIK_TRACKPOINT(tpl->data); | |
386 | ||
b45865b4 RN |
387 | if ( tp->name ) |
388 | gtk_entry_set_text ( GTK_ENTRY(tpwin->trkpt_name), tp->name ); | |
389 | else | |
390 | gtk_editable_delete_text ( GTK_EDITABLE(tpwin->trkpt_name), 0, -1 ); | |
391 | gtk_widget_set_sensitive ( tpwin->trkpt_name, TRUE ); | |
392 | ||
2880a1de | 393 | /* Only can insert if not at the end (otherwise use extend track) */ |
2cada010 RN |
394 | gtk_widget_set_sensitive ( tpwin->button_insert, (gboolean) GPOINTER_TO_INT (tpl->next) ); |
395 | gtk_widget_set_sensitive ( tpwin->button_delete, TRUE ); | |
50a14534 EB |
396 | |
397 | /* We can only split up a track if it's not an endpoint. Makes sense to me. */ | |
2cada010 | 398 | gtk_widget_set_sensitive ( tpwin->button_split, tpl->next && tpl->prev ); |
50a14534 | 399 | |
2cada010 RN |
400 | gtk_widget_set_sensitive ( tpwin->button_forward, (gboolean) GPOINTER_TO_INT (tpl->next) ); |
401 | gtk_widget_set_sensitive ( tpwin->button_back, (gboolean) GPOINTER_TO_INT (tpl->prev) ); | |
50a14534 | 402 | |
50a14534 EB |
403 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lat), TRUE ); |
404 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lon), TRUE ); | |
21a4eb5f | 405 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->alt), TRUE ); |
0243b089 | 406 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->ts), tp->has_timestamp ); |
8ada46de | 407 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->time), tp->has_timestamp ); |
2d4b00e1 RN |
408 | // Enable adding timestamps - but not on routepoints |
409 | if ( !tp->has_timestamp && !is_route ) { | |
8ada46de | 410 | gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->time), TRUE ); |
2d4b00e1 | 411 | GtkWidget *img = gtk_image_new_from_stock ( GTK_STOCK_ADD, GTK_ICON_SIZE_MENU ); |
8ada46de | 412 | gtk_button_set_image ( GTK_BUTTON(tpwin->time), img ); |
2d4b00e1 RN |
413 | } |
414 | else | |
50a14534 | 415 | |
b45865b4 | 416 | vik_trw_layer_tpwin_set_track_name ( tpwin, track_name ); |
50a14534 EB |
417 | |
418 | tpwin->sync_to_tp_block = TRUE; /* don't update while setting data. */ | |
419 | ||
420 | vik_coord_to_latlon ( &(tp->coord), &ll ); | |
421 | gtk_spin_button_set_value ( tpwin->lat, ll.lat ); | |
422 | gtk_spin_button_set_value ( tpwin->lon, ll.lon ); | |
6027a9c5 RN |
423 | vik_units_height_t height_units = a_vik_get_units_height (); |
424 | switch (height_units) { | |
425 | case VIK_UNITS_HEIGHT_METRES: | |
426 | gtk_spin_button_set_value ( tpwin->alt, tp->altitude ); | |
427 | break; | |
428 | case VIK_UNITS_HEIGHT_FEET: | |
6c20e59a | 429 | gtk_spin_button_set_value ( tpwin->alt, VIK_METERS_TO_FEET(tp->altitude) ); |
6027a9c5 RN |
430 | break; |
431 | default: | |
432 | gtk_spin_button_set_value ( tpwin->alt, tp->altitude ); | |
433 | g_critical("Houston, we've had a problem. height=%d", height_units); | |
434 | } | |
435 | ||
0243b089 | 436 | tpwin_update_times ( tpwin, tp ); |
50a14534 | 437 | |
0243b089 | 438 | tpwin->sync_to_tp_block = FALSE; // don't update while setting data. |
50a14534 | 439 | |
86f7d733 | 440 | vik_units_speed_t speed_units = a_vik_get_units_speed (); |
6f9336aa | 441 | vik_units_distance_t dist_units = a_vik_get_units_distance (); |
50a14534 EB |
442 | if ( tpwin->cur_tp ) |
443 | { | |
6f9336aa RN |
444 | switch (dist_units) { |
445 | case VIK_UNITS_DISTANCE_KILOMETRES: | |
446 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord))); | |
447 | break; | |
448 | case VIK_UNITS_DISTANCE_MILES: | |
b22233bd | 449 | case VIK_UNITS_DISTANCE_NAUTICAL_MILES: |
6f9336aa RN |
450 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f yards", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord))*1.0936133); |
451 | break; | |
452 | default: | |
453 | g_critical("Houston, we've had a problem. distance=%d", dist_units); | |
454 | } | |
455 | ||
50a14534 EB |
456 | gtk_label_set_text ( tpwin->diff_dist, tmp_str ); |
457 | if ( tp->has_timestamp && tpwin->cur_tp->has_timestamp ) | |
458 | { | |
459 | g_snprintf ( tmp_str, sizeof(tmp_str), "%ld s", tp->timestamp - tpwin->cur_tp->timestamp); | |
460 | gtk_label_set_text ( tpwin->diff_time, tmp_str ); | |
461 | if ( tp->timestamp == tpwin->cur_tp->timestamp ) | |
462 | gtk_label_set_text ( tpwin->diff_speed, "--" ); | |
463 | else | |
464 | { | |
13bdea80 RN |
465 | switch (speed_units) { |
466 | case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: | |
ab1e0693 | 467 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f km/h", VIK_MPS_TO_KPH(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) ); |
13bdea80 RN |
468 | break; |
469 | case VIK_UNITS_SPEED_MILES_PER_HOUR: | |
ab1e0693 | 470 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f mph", VIK_MPS_TO_MPH(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) ); |
13bdea80 RN |
471 | break; |
472 | case VIK_UNITS_SPEED_METRES_PER_SECOND: | |
473 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m/s", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / ABS(tp->timestamp - tpwin->cur_tp->timestamp) ); | |
474 | break; | |
a4c92313 | 475 | case VIK_UNITS_SPEED_KNOTS: |
ab1e0693 | 476 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f knots", VIK_MPS_TO_KNOTS(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) ); |
a4c92313 | 477 | break; |
13bdea80 RN |
478 | default: |
479 | g_snprintf ( tmp_str, sizeof(tmp_str), "--" ); | |
480 | g_critical("Houston, we've had a problem. speed=%d", speed_units); | |
481 | } | |
50a14534 EB |
482 | gtk_label_set_text ( tpwin->diff_speed, tmp_str ); |
483 | } | |
484 | } | |
485 | else | |
486 | { | |
487 | gtk_label_set_text ( tpwin->diff_time, NULL ); | |
488 | gtk_label_set_text ( tpwin->diff_speed, NULL ); | |
489 | } | |
490 | } | |
491 | ||
86f7d733 RN |
492 | if ( isnan(tp->course) ) |
493 | g_snprintf ( tmp_str, sizeof(tmp_str), "--" ); | |
494 | else | |
495 | g_snprintf ( tmp_str, sizeof(tmp_str), "%05.1f\302\260", tp->course ); | |
496 | gtk_label_set_text ( tpwin->course, tmp_str ); | |
497 | ||
498 | if ( isnan(tp->speed) ) | |
499 | g_snprintf ( tmp_str, sizeof(tmp_str), "--" ); | |
500 | else { | |
501 | switch (speed_units) { | |
502 | case VIK_UNITS_SPEED_MILES_PER_HOUR: | |
503 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f mph", VIK_MPS_TO_MPH(tp->speed) ); | |
504 | break; | |
505 | case VIK_UNITS_SPEED_METRES_PER_SECOND: | |
506 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m/s", tp->speed ); | |
507 | break; | |
508 | case VIK_UNITS_SPEED_KNOTS: | |
509 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f knots", VIK_MPS_TO_KNOTS(tp->speed) ); | |
510 | break; | |
511 | default: | |
512 | // VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: | |
513 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f km/h", VIK_MPS_TO_KPH(tp->speed) ); | |
514 | break; | |
515 | } | |
516 | } | |
517 | gtk_label_set_text ( tpwin->speed, tmp_str ); | |
518 | ||
6f9336aa RN |
519 | switch (dist_units) { |
520 | case VIK_UNITS_DISTANCE_KILOMETRES: | |
521 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->hdop ); | |
522 | gtk_label_set_text ( tpwin->hdop, tmp_str ); | |
523 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->pdop ); | |
524 | gtk_label_set_text ( tpwin->pdop, tmp_str ); | |
525 | break; | |
53d7cdd6 | 526 | case VIK_UNITS_DISTANCE_NAUTICAL_MILES: |
6f9336aa RN |
527 | case VIK_UNITS_DISTANCE_MILES: |
528 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f yards", tp->hdop*1.0936133 ); | |
529 | gtk_label_set_text ( tpwin->hdop, tmp_str ); | |
530 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f yards", tp->pdop*1.0936133 ); | |
531 | gtk_label_set_text ( tpwin->pdop, tmp_str ); | |
532 | break; | |
533 | default: | |
534 | g_critical("Houston, we've had a problem. distance=%d", dist_units); | |
535 | } | |
6027a9c5 RN |
536 | |
537 | switch (height_units) { | |
538 | case VIK_UNITS_HEIGHT_METRES: | |
539 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->vdop ); | |
540 | break; | |
541 | case VIK_UNITS_HEIGHT_FEET: | |
6c20e59a | 542 | g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f feet", VIK_METERS_TO_FEET(tp->vdop) ); |
6027a9c5 RN |
543 | break; |
544 | default: | |
545 | g_snprintf ( tmp_str, sizeof(tmp_str), "--" ); | |
546 | g_critical("Houston, we've had a problem. height=%d", height_units); | |
547 | } | |
b24a25f4 | 548 | gtk_label_set_text ( tpwin->vdop, tmp_str ); |
6027a9c5 | 549 | |
b24a25f4 T |
550 | g_snprintf ( tmp_str, sizeof(tmp_str), "%d / %d", tp->nsats, tp->fix_mode ); |
551 | gtk_label_set_text ( tpwin->sat, tmp_str ); | |
eb790888 RN |
552 | |
553 | tpwin->cur_tp = tp; | |
50a14534 EB |
554 | } |
555 | ||
556 | void vik_trw_layer_tpwin_set_track_name ( VikTrwLayerTpwin *tpwin, const gchar *track_name ) | |
557 | { | |
b45865b4 RN |
558 | gchar *tmp_name = g_strdup_printf ( "%s: %s", track_name, _("Trackpoint") ); |
559 | gtk_window_set_title ( GTK_WINDOW(tpwin), tmp_name ); | |
560 | g_free ( tmp_name ); | |
561 | //gtk_label_set_text ( tpwin->track_name, track_name ); | |
50a14534 | 562 | } |