2 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
4 * Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "thumbnails.h"
24 #include "garminsymbols.h"
25 #include "degrees_converters.h"
31 void a_dialog_msg ( GtkWindow
*parent
, gint type
, const gchar
*info
, const gchar
*extra
)
33 GtkWidget
*msgbox
= gtk_message_dialog_new ( parent
, GTK_DIALOG_DESTROY_WITH_PARENT
, type
, GTK_BUTTONS_OK
, info
, extra
);
34 gtk_dialog_run ( GTK_DIALOG(msgbox
) );
35 gtk_widget_destroy ( msgbox
);
38 gboolean
a_dialog_goto_latlon ( GtkWindow
*parent
, struct LatLon
*ll
, const struct LatLon
*old
)
40 GtkWidget
*dialog
= gtk_dialog_new_with_buttons ("Go to Lat/Lon",
42 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
48 GtkWidget
*latlabel
, *lonlabel
;
50 gchar
*tmp_lat
, *tmp_lon
;
52 latlabel
= gtk_label_new ("Latitude:");
53 lat
= gtk_entry_new ();
54 tmp_lat
= g_strdup_printf ( "%f", old
->lat
);
55 gtk_entry_set_text ( GTK_ENTRY(lat
), tmp_lat
);
58 lonlabel
= gtk_label_new ("Longitude:");
59 lon
= gtk_entry_new ();
60 tmp_lon
= g_strdup_printf ( "%f", old
->lon
);
61 gtk_entry_set_text ( GTK_ENTRY(lon
), tmp_lon
);
64 gtk_widget_show ( latlabel
);
65 gtk_widget_show ( lonlabel
);
66 gtk_widget_show ( lat
);
67 gtk_widget_show ( lon
);
69 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), latlabel
, FALSE
, FALSE
, 0);
70 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lat
, FALSE
, FALSE
, 0);
71 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lonlabel
, FALSE
, FALSE
, 0);
72 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lon
, FALSE
, FALSE
, 0);
74 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
76 ll
->lat
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lat
) ) );
77 ll
->lon
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lon
) ) );
78 gtk_widget_destroy ( dialog
);
82 gtk_widget_destroy ( dialog
);
86 gboolean
a_dialog_goto_utm ( GtkWindow
*parent
, struct UTM
*utm
, const struct UTM
*old
)
88 GtkWidget
*dialog
= gtk_dialog_new_with_buttons ("Go to Lat/Lon",
90 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
96 GtkWidget
*norlabel
, *easlabel
, *nor
, *eas
;
97 GtkWidget
*zonehbox
, *zonespin
, *letterentry
;
98 gchar
*tmp_eas
, *tmp_nor
;
101 norlabel
= gtk_label_new ("Northing:");
102 nor
= gtk_entry_new ();
103 tmp_nor
= g_strdup_printf("%ld", (long) old
->northing
);
104 gtk_entry_set_text ( GTK_ENTRY(nor
), tmp_nor
);
107 easlabel
= gtk_label_new ("Easting:");
108 eas
= gtk_entry_new ();
109 tmp_eas
= g_strdup_printf("%ld", (long) old
->easting
);
110 gtk_entry_set_text ( GTK_ENTRY(eas
), tmp_eas
);
113 zonehbox
= gtk_hbox_new ( FALSE
, 0 );
114 gtk_box_pack_start ( GTK_BOX(zonehbox
), gtk_label_new ( "Zone:" ), FALSE
, FALSE
, 5 );
115 zonespin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( old
->zone
, 1, 60, 1, 5, 5 ), 1, 0 );
116 gtk_box_pack_start ( GTK_BOX(zonehbox
), zonespin
, TRUE
, TRUE
, 5 );
117 gtk_box_pack_start ( GTK_BOX(zonehbox
), gtk_label_new ( "Letter:" ), FALSE
, FALSE
, 5 );
118 letterentry
= gtk_entry_new ();
119 gtk_entry_set_max_length ( GTK_ENTRY(letterentry
), 1 );
120 gtk_entry_set_width_chars ( GTK_ENTRY(letterentry
), 2 );
121 tmp_letter
[0] = old
->letter
;
122 tmp_letter
[1] = '\0';
123 gtk_entry_set_text ( GTK_ENTRY(letterentry
), tmp_letter
);
124 gtk_box_pack_start ( GTK_BOX(zonehbox
), letterentry
, FALSE
, FALSE
, 5 );
126 gtk_widget_show ( norlabel
);
127 gtk_widget_show ( easlabel
);
128 gtk_widget_show ( nor
);
129 gtk_widget_show ( eas
);
131 gtk_widget_show_all ( zonehbox
);
133 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), norlabel
, FALSE
, FALSE
, 0);
134 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), nor
, FALSE
, FALSE
, 0);
135 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), easlabel
, FALSE
, FALSE
, 0);
136 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), eas
, FALSE
, FALSE
, 0);
137 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), zonehbox
, FALSE
, FALSE
, 0);
139 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
142 utm
->northing
= atof ( gtk_entry_get_text ( GTK_ENTRY(nor
) ) );
143 utm
->easting
= atof ( gtk_entry_get_text ( GTK_ENTRY(eas
) ) );
144 utm
->zone
= gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(zonespin
) );
145 letter
= gtk_entry_get_text ( GTK_ENTRY(letterentry
) );
147 utm
->letter
= toupper(*letter
);
148 gtk_widget_destroy ( dialog
);
152 gtk_widget_destroy ( dialog
);
156 void a_dialog_response_accept ( GtkDialog
*dialog
)
158 gtk_dialog_response ( dialog
, GTK_RESPONSE_ACCEPT
);
161 /* todo: less on this side, like add track */
162 gboolean
a_dialog_new_waypoint ( GtkWindow
*parent
, gchar
**dest
, VikWaypoint
*wp
, GHashTable
*waypoints
, VikCoordMode coord_mode
)
164 GtkWidget
*dialog
= gtk_dialog_new_with_buttons ("Create",
166 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
173 GtkWidget
*latlabel
, *lonlabel
, *namelabel
, *latentry
, *lonentry
, *altentry
, *altlabel
, *nameentry
, *commentlabel
,
174 *commententry
, *imagelabel
, *imageentry
, *symbollabel
, *symbolentry
;
180 gchar
*lat
, *lon
, *alt
;
182 vik_coord_to_latlon ( &(wp
->coord
), &ll
);
184 lat
= g_strdup_printf ( "%f", ll
.lat
);
185 lon
= g_strdup_printf ( "%f", ll
.lon
);
186 alt
= g_strdup_printf ( "%f", wp
->altitude
);
190 namelabel
= gtk_label_new ("Name:");
191 nameentry
= gtk_entry_new ();
192 g_signal_connect_swapped ( nameentry
, "activate", G_CALLBACK(a_dialog_response_accept
), GTK_DIALOG(dialog
) );
193 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), namelabel
, FALSE
, FALSE
, 0);
194 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), nameentry
, FALSE
, FALSE
, 0);
197 latlabel
= gtk_label_new ("Latitude:");
198 latentry
= gtk_entry_new ();
199 gtk_entry_set_text ( GTK_ENTRY(latentry
), lat
);
202 lonlabel
= gtk_label_new ("Longitude:");
203 lonentry
= gtk_entry_new ();
204 gtk_entry_set_text ( GTK_ENTRY(lonentry
), lon
);
207 altlabel
= gtk_label_new ("Altitude:");
208 altentry
= gtk_entry_new ();
209 gtk_entry_set_text ( GTK_ENTRY(altentry
), alt
);
212 commentlabel
= gtk_label_new ("Comment:");
213 commententry
= gtk_entry_new ();
215 imagelabel
= gtk_label_new ("Image:");
216 imageentry
= vik_file_entry_new ();
220 symbollabel
= gtk_label_new ("Symbol:");
223 store
= gtk_list_store_new(3, G_TYPE_STRING
, GDK_TYPE_PIXBUF
, G_TYPE_STRING
);
224 symbolentry
= gtk_combo_box_new_with_model(GTK_TREE_MODEL(store
));
225 gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(symbolentry
), 3);
226 gtk_list_store_append (store
, &iter
);
227 gtk_list_store_set (store
, &iter
, 0, NULL
, 1, NULL
, 2, "(none)", -1);
228 a_populate_sym_list(store
);
230 r
= gtk_cell_renderer_pixbuf_new ();
231 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (symbolentry
), r
, FALSE
);
232 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (symbolentry
), r
, "pixbuf", 1, NULL
);
234 r
= gtk_cell_renderer_text_new ();
235 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (symbolentry
), r
, FALSE
);
236 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (symbolentry
), r
, "text", 2, NULL
);
238 if ( dest
== NULL
&& wp
->symbol
) {
241 for (ok
= gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store
), &iter
); ok
; ok
= gtk_tree_model_iter_next ( GTK_TREE_MODEL(store
), &iter
)) {
242 gtk_tree_model_get ( GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
243 if (sym
&& !strcmp(sym
, wp
->symbol
)) {
250 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(symbolentry
), &iter
);
254 if ( dest
== NULL
&& wp
->comment
)
255 gtk_entry_set_text ( GTK_ENTRY(commententry
), wp
->comment
);
257 if ( dest
== NULL
&& wp
->image
)
258 vik_file_entry_set_filename ( VIK_FILE_ENTRY(imageentry
), wp
->image
);
261 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), latlabel
, FALSE
, FALSE
, 0);
262 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), latentry
, FALSE
, FALSE
, 0);
263 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lonlabel
, FALSE
, FALSE
, 0);
264 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), lonentry
, FALSE
, FALSE
, 0);
265 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), altlabel
, FALSE
, FALSE
, 0);
266 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), altentry
, FALSE
, FALSE
, 0);
267 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), commentlabel
, FALSE
, FALSE
, 0);
268 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), commententry
, FALSE
, FALSE
, 0);
269 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), imagelabel
, FALSE
, FALSE
, 0);
270 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), imageentry
, FALSE
, FALSE
, 0);
271 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), symbollabel
, FALSE
, FALSE
, 0);
272 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), GTK_WIDGET(symbolentry
), FALSE
, FALSE
, 0);
274 gtk_widget_show_all ( GTK_DIALOG(dialog
)->vbox
);
276 while ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
280 const gchar
*constname
= gtk_entry_get_text ( GTK_ENTRY(nameentry
) );
281 if ( strlen(constname
) == 0 ) /* TODO: other checks (isalpha or whatever ) */
282 a_dialog_info_msg ( parent
, "Please enter a name for the waypoint." );
285 gchar
*name
= g_strdup ( constname
);
287 for ( i
= strlen ( name
) - 1; i
>= 0; i
-- )
288 name
[i
] = toupper(name
[i
]); /* all caps for stardandization */
290 if ( g_hash_table_lookup ( waypoints
, name
) && !a_dialog_overwrite ( parent
, "The waypoint \"%s\" exists, do you want to overwrite it?", name
) )
296 ll
.lat
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(latentry
) ) );
297 ll
.lon
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lonentry
) ) );
298 vik_coord_load_from_latlon ( &(wp
->coord
), coord_mode
, &ll
);
299 wp
->altitude
= atof ( gtk_entry_get_text ( GTK_ENTRY(altentry
) ) );
300 vik_waypoint_set_comment ( wp
, gtk_entry_get_text ( GTK_ENTRY(commententry
) ) );
301 vik_waypoint_set_image ( wp
, vik_file_entry_get_filename ( VIK_FILE_ENTRY(imageentry
) ) );
302 if ( wp
->image
&& *(wp
->image
) && (!a_thumbnails_exists(wp
->image
)) )
303 a_thumbnails_create ( wp
->image
);
306 GtkTreeIter iter
, first
;
307 gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store
), &first
);
308 if ( !gtk_combo_box_get_active_iter ( GTK_COMBO_BOX(symbolentry
), &iter
) || !memcmp(&iter
, &first
, sizeof(GtkTreeIter
)) ) {
309 vik_waypoint_set_symbol ( wp
, NULL
);
312 gtk_tree_model_get ( GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
313 vik_waypoint_set_symbol ( wp
, sym
);
318 gtk_widget_destroy ( dialog
);
321 } /* else (valid name) */
325 ll
.lat
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(latentry
) ) );
326 ll
.lon
= convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lonentry
) ) );
327 vik_coord_load_from_latlon ( &(wp
->coord
), coord_mode
, &ll
);
328 wp
->altitude
= atof ( gtk_entry_get_text ( GTK_ENTRY(altentry
) ) );
329 if ( (! wp
->comment
) || strcmp ( wp
->comment
, gtk_entry_get_text ( GTK_ENTRY(commententry
) ) ) != 0 )
330 vik_waypoint_set_comment ( wp
, gtk_entry_get_text ( GTK_ENTRY(commententry
) ) );
331 if ( (! wp
->image
) || strcmp ( wp
->image
, vik_file_entry_get_filename ( VIK_FILE_ENTRY ( imageentry
) ) ) != 0 )
333 vik_waypoint_set_image ( wp
, vik_file_entry_get_filename ( VIK_FILE_ENTRY(imageentry
) ) );
334 if ( wp
->image
&& *(wp
->image
) && (!a_thumbnails_exists(wp
->image
)) )
335 a_thumbnails_create ( wp
->image
);
339 GtkTreeIter iter
, first
;
340 gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store
), &first
);
341 if ( !gtk_combo_box_get_active_iter ( GTK_COMBO_BOX(symbolentry
), &iter
) || !memcmp(&iter
, &first
, sizeof(GtkTreeIter
)) ) {
342 vik_waypoint_set_symbol ( wp
, NULL
);
345 gtk_tree_model_get ( GTK_TREE_MODEL(store
), &iter
, 0, (void *)&sym
, -1 );
346 vik_waypoint_set_symbol ( wp
, sym
);
351 gtk_widget_destroy ( dialog
);
356 gtk_widget_destroy ( dialog
);
360 gchar
*a_dialog_new_track ( GtkWindow
*parent
, GHashTable
*tracks
)
362 GtkWidget
*dialog
= gtk_dialog_new_with_buttons ("Add Track",
364 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
370 GtkWidget
*label
= gtk_label_new ( "Track Name:" );
371 GtkWidget
*entry
= gtk_entry_new ();
373 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), label
, FALSE
, FALSE
, 0);
374 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog
)->vbox
), entry
, FALSE
, FALSE
, 0);
376 g_signal_connect_swapped ( entry
, "activate", G_CALLBACK(a_dialog_response_accept
), GTK_DIALOG(dialog
) );
378 gtk_widget_show ( label
);
379 gtk_widget_show ( entry
);
381 while ( gtk_dialog_run (GTK_DIALOG (dialog
)) == GTK_RESPONSE_ACCEPT
)
383 const gchar
*constname
= gtk_entry_get_text ( GTK_ENTRY(entry
) );
384 if ( *constname
== '\0' )
385 a_dialog_info_msg ( parent
, "Please enter a name for the track." );
387 gchar
*name
= g_strdup ( constname
);
390 for ( i
= strlen ( name
) - 1; i
>= 0; i
-- )
391 name
[i
] = toupper(name
[i
]); /* all caps for stardandization */
393 if ( g_hash_table_lookup( tracks
, name
) && !a_dialog_overwrite ( parent
, "The track \"%s\" exists, do you want to overwrite it?", gtk_entry_get_text ( GTK_ENTRY(entry
) ) ) )
399 gtk_widget_destroy ( dialog
);
404 gtk_widget_destroy ( dialog
);
408 /* creates a vbox full of labels */
409 GtkWidget
*a_dialog_create_label_vbox ( gchar
**texts
, int label_count
)
411 GtkWidget
*vbox
, *label
;
413 vbox
= gtk_vbox_new( TRUE
, 3 );
415 for ( i
= 0; i
< label_count
; i
++ )
417 label
= gtk_label_new(NULL
);
418 gtk_label_set_markup ( GTK_LABEL(label
), texts
[i
] );
419 gtk_box_pack_start ( GTK_BOX(vbox
), label
, FALSE
, TRUE
, 5 );
424 gboolean
a_dialog_overwrite ( GtkWindow
*parent
, const gchar
*message
, const gchar
*extra
)
427 dia
= gtk_message_dialog_new ( parent
,
428 GTK_DIALOG_DESTROY_WITH_PARENT
,
429 GTK_MESSAGE_QUESTION
,
433 if ( gtk_dialog_run ( GTK_DIALOG(dia
) ) == GTK_RESPONSE_YES
)
435 gtk_widget_destroy ( dia
);
440 gtk_widget_destroy ( dia
);
445 static void zoom_spin_changed ( GtkSpinButton
*spin
, GtkWidget
*pass_along
[3] )
447 if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(pass_along
[2]) ) )
448 gtk_spin_button_set_value (
449 GTK_SPIN_BUTTON(pass_along
[GTK_WIDGET(spin
) == pass_along
[0] ? 1 : 0]),
450 gtk_spin_button_get_value ( spin
) );
453 gboolean
a_dialog_custom_zoom ( GtkWindow
*parent
, gdouble
*xmpp
, gdouble
*ympp
)
455 GtkWidget
*dialog
= gtk_dialog_new_with_buttons ("Zoom Factors...",
457 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
463 GtkWidget
*table
, *label
, *xlabel
, *xspin
, *ylabel
, *yspin
, *samecheck
;
464 GtkWidget
*pass_along
[3];
466 table
= gtk_table_new ( 4, 2, FALSE
);
467 gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog
)->vbox
), table
, TRUE
, TRUE
, 0 );
469 label
= gtk_label_new ( "Zoom factor (in meters per pixel:" );
470 xlabel
= gtk_label_new ( "X (easting): ");
471 ylabel
= gtk_label_new ( "Y (northing): ");
473 pass_along
[0] = xspin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( *xmpp
, VIK_VIEWPORT_MIN_ZOOM
, VIK_VIEWPORT_MAX_ZOOM
, 1, 5, 5 ), 1, 8 );
474 pass_along
[1] = yspin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( *ympp
, VIK_VIEWPORT_MIN_ZOOM
, VIK_VIEWPORT_MAX_ZOOM
, 1, 5, 5 ), 1, 8 );
476 pass_along
[2] = samecheck
= gtk_check_button_new_with_label ( "X and Y zoom factors must be equal" );
477 /* TODO -- same factor */
478 /* samecheck = gtk_check_button_new_with_label ( "Same x/y zoom factor" ); */
480 if ( *xmpp
== *ympp
)
481 gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(samecheck
), TRUE
);
483 gtk_table_attach_defaults ( GTK_TABLE(table
), label
, 0, 2, 0, 1 );
484 gtk_table_attach_defaults ( GTK_TABLE(table
), xlabel
, 0, 1, 1, 2 );
485 gtk_table_attach_defaults ( GTK_TABLE(table
), xspin
, 1, 2, 1, 2 );
486 gtk_table_attach_defaults ( GTK_TABLE(table
), ylabel
, 0, 1, 2, 3 );
487 gtk_table_attach_defaults ( GTK_TABLE(table
), yspin
, 1, 2, 2, 3 );
488 gtk_table_attach_defaults ( GTK_TABLE(table
), samecheck
, 0, 2, 3, 4 );
490 gtk_widget_show_all ( table
);
492 g_signal_connect ( G_OBJECT(xspin
), "value-changed", G_CALLBACK(zoom_spin_changed
), pass_along
);
493 g_signal_connect ( G_OBJECT(yspin
), "value-changed", G_CALLBACK(zoom_spin_changed
), pass_along
);
495 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
497 *xmpp
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(xspin
) );
498 *ympp
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(yspin
) );
499 gtk_widget_destroy ( dialog
);
502 gtk_widget_destroy ( dialog
);
506 static void split_spin_focused ( GtkSpinButton
*spin
, GtkWidget
*pass_along
[1] )
508 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(pass_along
[0]), 1);
511 gboolean
a_dialog_time_threshold ( GtkWindow
*parent
, gchar
*title_text
, gchar
*label_text
, guint
*thr
)
513 GtkWidget
*dialog
= gtk_dialog_new_with_buttons (title_text
,
515 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
521 GtkWidget
*table
, *t1
, *t2
, *t3
, *t4
, *spin
, *label
;
522 GtkWidget
*pass_along
[1];
524 table
= gtk_table_new ( 4, 2, FALSE
);
525 gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog
)->vbox
), table
, TRUE
, TRUE
, 0 );
527 label
= gtk_label_new (label_text
);
529 t1
= gtk_radio_button_new_with_label ( NULL
, "1 min" );
530 t2
= gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t1
), "1 hour" );
531 t3
= gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t2
), "1 day" );
532 t4
= gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(t3
), "Custom (in minutes):" );
536 spin
= gtk_spin_button_new ( (GtkAdjustment
*) gtk_adjustment_new ( *thr
, 0, 65536, 1, 5, 5 ), 1, 0 );
538 gtk_table_attach_defaults ( GTK_TABLE(table
), label
, 0, 2, 0, 1 );
539 gtk_table_attach_defaults ( GTK_TABLE(table
), t1
, 0, 1, 1, 2 );
540 gtk_table_attach_defaults ( GTK_TABLE(table
), t2
, 0, 1, 2, 3 );
541 gtk_table_attach_defaults ( GTK_TABLE(table
), t3
, 0, 1, 3, 4 );
542 gtk_table_attach_defaults ( GTK_TABLE(table
), t4
, 0, 1, 4, 5 );
543 gtk_table_attach_defaults ( GTK_TABLE(table
), spin
, 1, 2, 4, 5 );
545 gtk_widget_show_all ( table
);
547 g_signal_connect ( G_OBJECT(spin
), "grab-focus", G_CALLBACK(split_spin_focused
), pass_along
);
549 if ( gtk_dialog_run ( GTK_DIALOG(dialog
) ) == GTK_RESPONSE_ACCEPT
)
551 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t1
))) {
553 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t2
))) {
555 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t3
))) {
557 } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(t4
))) {
558 *thr
= gtk_spin_button_get_value ( GTK_SPIN_BUTTON(spin
) );
560 gtk_widget_destroy ( dialog
);
563 gtk_widget_destroy ( dialog
);
568 void a_dialog_about ( GtkWindow
*parent
)
571 char *msg
= g_markup_printf_escaped (
572 "<span font_desc='20' weight='bold'>Viking %s</span>\n\n"
573 "GPS Data and Topo Analyzer, Explorer, and Manager.\n\n"
574 "<small>(C) 2003-2007, Evan Battaglia</small>\n\n"
575 "<small>Web site: %s</small>",
576 VIKING_VERSION
, VIKING_URL
);
577 GtkWidget
*msgbox
= gtk_message_dialog_new_with_markup ( parent
,
578 GTK_DIALOG_DESTROY_WITH_PARENT
,
583 gtk_dialog_add_buttons (GTK_DIALOG(msgbox
), "Credits", 1, "License", 2, "Close", 3, NULL
, NULL
);
585 while ((re
= gtk_dialog_run ( GTK_DIALOG(msgbox
))) != 3) {
588 a_dialog_info_msg(parent
,
590 " Evan Battaglia <gtoevan@gmx.net>\n\n"
592 " Alex Foobarian <foobarian@gmail.com>\n"
593 " Guilhem Bonnefille <guilhem.bonnefille@gmail.com>\n"
594 " Jocelyn Jaubert <jocelyn.jaubert@gmail.com>\n"
595 " Quy Tonthat <qtonthat@gmail.com>\n"
596 " Reid Priedhorsky <reid@reidster.net>\n"
600 a_dialog_info_msg(parent
, "\n\n"
601 "This program is free software; you can redistribute it and/or modify "
602 "it under the terms of the GNU General Public License as published by "
603 "the Free Software Foundation; either version 2 of the License, or "
604 "(at your option) any later version."
606 "This program is distributed in the hope that it will be useful, "
607 "but WITHOUT ANY WARRANTY; without even the implied warranty of "
608 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "
609 "GNU General Public License for more details."
611 "You should have received a copy of the GNU General Public License "
612 "along with this program; if not, write to the Free Software "
613 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA");
616 gtk_widget_destroy ( msgbox
);