--- trunk/src/goto.c 2009/11/26 10:05:23 214 +++ trunk/src/goto.c 2010/01/21 21:18:33 249 @@ -38,9 +38,84 @@ #define SAT_WIDTH 330 #define SAT_HEIGHT 60 -/* http://www.gtk.org/tutorial1.2/gtk_tut-30.html */ -/* http://developer.gimp.org/api/2.0/gdk/gdk-Drawing-Primitives.html */ +#ifdef ESPEAK +#include +#define ESPEAK_TIMEOUT (15000) // every 15 seconds + +char *espeak_make_string(float dist, gboolean imperial) { + char *retval = NULL; + + if(!imperial) { + /* distance is in kilometers */ + if(dist < 2.0/1000.0) + retval = g_strdup(_("1 meter")); + else if(dist < 1.0) + retval = g_strdup_printf(_("%u meters"), (int)(dist*1000)); + else if(dist < 2.0) + retval = g_strdup(_("1 kilometer")); + else + retval = g_strdup_printf(_("%u kilometers"), (int)dist); + } else { + + /* 1 mil = 1760 yd = 5280 ft ... */ + if(dist < (2.0/5280.0)) + retval = g_strdup(_("1 foot")); + else if(dist < (1.0/1760.0)) + retval = g_strdup_printf(_("%u feet"), (int)(dist*5280)); + else if(dist < (2.0/1760.0)) + retval = g_strdup(_("1 yard")); + else if(dist < 1.0) + retval = g_strdup_printf(_("%u yard"), (int)(dist*1760)); + else if(dist < 2.0) + retval = g_strdup(_("1 mile")); + else + retval = g_strdup_printf(_("%u miles"), (int)dist); + } + return retval; +} + +static gboolean espeak_do(gpointer data) { + cache_context_t *context = (cache_context_t*)data; + + pos_t *pos = gps_get_pos(context->appdata); + if(pos && !isnan(pos->lat) && !isnan(pos->lon) && + !isnan(context->gotoc.pos.lat) && !isnan(context->gotoc.pos.lon)) { + + /* build distance */ + float dist = + gpx_pos_get_distance(*pos, context->gotoc.pos, + context->appdata->imperial); + + char *talk = espeak_make_string(dist, context->appdata->imperial); + + unsigned int unique_identifier=0; + espeak_Synth(talk, strlen(talk)+1, 0, 0, 0, espeakCHARS_AUTO, + &unique_identifier, NULL); + + g_free(talk); + } + + return TRUE; // speak again +} + +static void espeak_enable(cache_context_t *context, gboolean enable) { + if(enable) { + g_assert(!context->gotoc.espeak_handler); + + context->gotoc.espeak_handler = + gtk_timeout_add(ESPEAK_TIMEOUT, espeak_do, context); + + espeak_do(context); + + } else { + if(context->gotoc.espeak_handler) { + gtk_timeout_remove(context->gotoc.espeak_handler); + context->gotoc.espeak_handler = 0; + } + } +} +#endif static float rad2deg(float rad) { return fmodf(360.0 + (180.0/M_PI) * rad, 360.0); @@ -88,7 +163,7 @@ /* draw the locked/unlocked icon */ gdk_draw_pixbuf(context->gotoc.compass_pixmap, widget->style->fg_gc[GTK_STATE_NORMAL], - icon_get(ICON_MISC, context->appdata->compass_locked?1:2), + icon_get(ICON_MISC, context->appdata->compass_locked?0:1), 0, 0, (width-diameter)/2 + diameter/32, (height+diameter)/2 - 16 - diameter/32 , 16, 16, GDK_RGB_DITHER_NONE,0,0); @@ -387,6 +462,10 @@ printf("destroying goto view\n"); +#ifdef ESPEAK + espeak_enable(context, FALSE); +#endif + /* stop timer */ if(context->gotoc.handler_id) gtk_timeout_remove(context->gotoc.handler_id); @@ -452,14 +531,6 @@ return TRUE; // fire again } -#ifdef ENABLE_MAEMO_MAPPER -static void on_mm_button_clicked(GtkButton *button, gpointer data) { - cache_context_t *context = (cache_context_t*)data; - - dbus_mm_set_position(context->appdata, &context->gotoc.pos); -} -#endif - static gboolean compass_clicked_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { cache_context_t *context = (cache_context_t*)user_data; @@ -483,12 +554,26 @@ cache_context_t *context = (cache_context_t*)data; /* extract position from entries */ - context->gotoc.pos.lat = lat_get(context->gotoc.lat_entry); - context->gotoc.pos.lon = lon_get(context->gotoc.lon_entry); + context->gotoc.pos.lat = lat_entry_get(context->gotoc.lat_entry); + context->gotoc.pos.lon = lon_entry_get(context->gotoc.lon_entry); goto_update(context); } +#ifdef ESPEAK +static void espeak_clicked(GtkWidget *widget, gpointer data) { + cache_context_t *context = (cache_context_t*)data; + + GtkWidget *icon = gtk_button_get_image(GTK_BUTTON(widget)); + gtk_widget_destroy(icon); + context->appdata->espeak.enabled = !context->appdata->espeak.enabled; + gtk_button_set_image(GTK_BUTTON(widget), icon_get_widget(ICON_MISC, + context->appdata->espeak.enabled?6:7)); + + espeak_enable(context, context->appdata->espeak.enabled); +} +#endif + GtkWidget *goto_cache(cache_context_t *context) { int i; @@ -498,7 +583,7 @@ context->gotoc.pos = gpx_cache_pos(context->cache); - GtkWidget *hbox = gtk_hbox_new(FALSE, 0); + GtkWidget *hbox = gtk_hbox_new(FALSE, 32); context->gotoc.compass_area = gtk_drawing_area_new(); gtk_drawing_area_size(GTK_DRAWING_AREA(context->gotoc.compass_area), @@ -534,9 +619,11 @@ g_signal_connect(G_OBJECT(context->gotoc.lon_entry), "changed", G_CALLBACK(pos_modified), context); - GtkWidget *popup = coo_popup(context->appdata, - context->gotoc.lat_entry, context->gotoc.lon_entry); - gtk_table_attach_defaults(GTK_TABLE(table), popup, 2,3,0,1); + gtk_table_attach_defaults(GTK_TABLE(table), preset_coordinate_picker(context->appdata, + context->gotoc.lat_entry, context->gotoc.lon_entry), 2,3,0,1); + + gtk_table_attach_defaults(GTK_TABLE(table), goto_coordinate(context->appdata, + context->gotoc.lat_entry, context->gotoc.lon_entry), 2,3,1,2); gtk_table_set_row_spacing(GTK_TABLE(table), 1, 16); gtk_table_set_col_spacing(GTK_TABLE(table), 0, 16); @@ -544,17 +631,17 @@ /* -------------- distance label ------------------------- */ gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Distance:")), 0,1,2,3); gtk_table_attach_defaults(GTK_TABLE(table), - (context->gotoc.distance_label = left_label_new("-----")), 1,2,2,3); + (context->gotoc.distance_label = gtk_label_new("-----")), 1,2,2,3); /* -------------- bearing label ------------------------- */ gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Bearing:")), 0,1,3,4); gtk_table_attach_defaults(GTK_TABLE(table), - (context->gotoc.bearing_label = left_label_new("-----")), 1,2,3,4); + (context->gotoc.bearing_label = gtk_label_new("-----")), 1,2,3,4); /* -------------- error label ------------------------- */ gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Est. error:")), 0,1,4,5); gtk_table_attach_defaults(GTK_TABLE(table), - (context->gotoc.eph_label = left_label_new("-----")), 1,2,4,5); + (context->gotoc.eph_label = gtk_label_new("-----")), 1,2,4,5); gtk_table_set_row_spacing(GTK_TABLE(table), 4, 16); @@ -574,19 +661,29 @@ gtk_box_pack_start(GTK_BOX(ihbox), context->gotoc.sat_area, 1,0,0); -#ifdef ENABLE_MAEMO_MAPPER - GtkWidget *mm_button = gtk_button_new(); - gtk_button_set_image(GTK_BUTTON(mm_button), icon_get_widget(ICON_MISC, 0)); - gtk_signal_connect(GTK_OBJECT(mm_button), "clicked", - (GtkSignalFunc)on_mm_button_clicked, context); - gtk_box_pack_start(GTK_BOX(ihbox), mm_button, 1,0,0); +#ifdef ESPEAK + GtkWidget *ivbox = gtk_vbox_new(FALSE, 0); + GtkWidget *button = button_new(); + gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_MISC, + context->appdata->espeak.enabled?6:7)); + gtk_signal_connect (GTK_OBJECT(button), "clicked", + GTK_SIGNAL_FUNC(espeak_clicked), context); + if(context->appdata->espeak.sample_rate < 0) + gtk_widget_set_sensitive(button, FALSE); + else + if(context->appdata->espeak.enabled) + espeak_enable(context, TRUE); + + gtk_box_pack_start(GTK_BOX(ivbox), button, 1,0,0); + gtk_box_pack_start(GTK_BOX(ihbox), ivbox, 1,0,0); #endif + gtk_table_attach_defaults(GTK_TABLE(table), ihbox, 0,3,5,6); /* ------------------------------------------------------- */ - gtk_box_pack_start(GTK_BOX(vbox), table, 1,0,0); - gtk_box_pack_start(GTK_BOX(hbox), vbox, 1,0,0); + gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); context->gotoc.handler_id = gtk_timeout_add(UPDATE_MS, goto_update, context); @@ -596,7 +693,6 @@ void goto_coordinate_update(cache_context_t *context) { static pos_t pos = { 0.0, 0.0 }; - char str[32]; if(!context->notes.modified) return; @@ -605,9 +701,7 @@ if(pos_differ(&npos, &pos)) { pos = npos; - pos_lat_str(str, sizeof(str)-1, npos.lat); - gtk_entry_set_text(GTK_ENTRY(context->gotoc.lat_entry), str); - pos_lon_str(str, sizeof(str)-1, npos.lon); - gtk_entry_set_text(GTK_ENTRY(context->gotoc.lon_entry), str); + lat_entry_set(context->gotoc.lat_entry, npos.lat); + lon_entry_set(context->gotoc.lon_entry, npos.lon); } }