--- trunk/src/misc.c 2009/12/06 19:36:35 230 +++ trunk/src/misc.c 2009/12/07 16:14:50 231 @@ -29,6 +29,10 @@ #include "gpxview.h" +#ifdef ENABLE_OSM_GPS_MAP +#include "osm-gps-map.h" +#endif + #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR >= 5) #include #include @@ -1168,6 +1172,14 @@ } #endif +#ifdef ENABLE_MAEMO_MAPPER +static void cb_mm(GtkWidget *item, gpointer data) { + appdata_t *appdata = (appdata_t*)data; + + pos_set(item, appdata->mmpos.lat, appdata->mpos.lon); +} +#endif + static void cb_cache(GtkWidget *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; @@ -1235,7 +1247,7 @@ gint id = 2; while(location) { if(pos_valid(&location->pos)) - menu_add(menu, appdata, icon_get_widget(ICON_POS, 21), + menu_add(menu, appdata, icon_get_widget(ICON_POS, 17), location->name, cb_gps, id, lon_entry, lat_entry); id++; @@ -1252,6 +1264,13 @@ cb_map, 0, lon_entry, lat_entry); #endif +#ifdef ENABLE_MAEMO_MAPPER + if(appdata->mmpos_valid) { + menu_add(menu, appdata, icon_get_widget(ICON_POS, 24), + _("Maemo mapper position"), cb_mm, 0, lon_entry, lat_entry); + } +#endif + if(appdata->cur_cache) { cache_t *cache = appdata->cur_cache; @@ -1419,7 +1438,7 @@ gint id = 2; while(location) { if(pos_valid(&location->pos)) - preset_picker_add(store, appdata, icon_get(ICON_POS, 21), + preset_picker_add(store, appdata, icon_get(ICON_POS, 17), location->name, cb_gps, id); id++; @@ -1429,12 +1448,20 @@ if(pos_valid(&appdata->geomath)) preset_picker_add(store, appdata, icon_get(ICON_POS, 19), _("Geomath projection"), cb_geomath, 0); + #ifdef ENABLE_OSM_GPS_MAP if(pos_valid(&appdata->map.pos)) preset_picker_add(store, appdata, icon_get(ICON_POS, 20), _("Map position"), cb_map, 0); #endif +#ifdef ENABLE_MAEMO_MAPPER + if(appdata->mmpos_valid) { + preset_picker_add(menu, appdata, icon_get(ICON_POS, 24), + _("Maemo mapper position"), cb_mm, 0); + } +#endif + if(appdata->cur_cache) { cache_t *cache = appdata->cur_cache; @@ -1527,7 +1554,7 @@ GtkWidget *button = gtk_button_new(); - gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_POS, 17)); + gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_POS, 22)); gtk_widget_set_tooltip_text(button, _("Preset coordinates")); @@ -1540,9 +1567,6 @@ gtk_signal_connect(GTK_OBJECT(button), "destroy", (GtkSignalFunc)on_popup_destroy, appdata); - - g_object_set_data(G_OBJECT(button), "menu", - popup_menu_create(appdata, lat_entry, lon_entry)); #else #ifdef FREMANTLE hildon_gtk_widget_set_theme_size(button, @@ -1556,6 +1580,219 @@ return button; } +#if defined(ENABLE_MAEMO_MAPPER) || defined(ENABLE_OSM_GPS_MAP) +static pos_t goto_pos_get(GtkWidget *item) { + pos_t pos; + + GtkWidget *lat_entry = g_object_get_data(G_OBJECT(item), "lat_entry"); + pos.lat = lat_entry_get(lat_entry); + + GtkWidget *lon_entry = g_object_get_data(G_OBJECT(item), "lon_entry"); + pos.lon = lon_entry_get(lon_entry); + + return pos; +} + +#ifdef ENABLE_MAEMO_MAPPER +static void cb_mm_set(GtkWidget *item, gpointer data) { + appdata_t *appdata = (appdata_t*)data; + + pos_t pos = goto_pos_get(item); + if(!isnan(pos.lat) && !isnan(pos.lon)) + dbus_mm_set_position(appdata, &pos); +} +#endif + +static void cb_map_set(GtkWidget *item, gpointer data) { + appdata_t *appdata = (appdata_t*)data; + + pos_t pos = goto_pos_get(item); + if(!isnan(pos.lat) && !isnan(pos.lon)) { + map(appdata); + osm_gps_map_set_center(OSM_GPS_MAP(appdata->map.context->widget), + pos.lat, pos.lon); + } +} + +#ifndef PRESET_PICKER_DIALOG +static GtkWidget *goto_popup_menu_create(appdata_t *appdata, + GtkWidget *lat_entry, GtkWidget *lon_entry) { + GtkWidget *menu = gtk_menu_new(); + +#if defined(ENABLE_OSM_GPS_MAP) + menu_add(menu, appdata, icon_get_widget(ICON_POS, 20), + _("Map position"), cb_map_set, 0, lon_entry, lat_entry); +#endif + +#if defined(ENABLE_MAEMO_MAPPER) + menu_add(menu, appdata, icon_get_widget(ICON_POS, 24), + _("Maemo mapper position"), cb_mm_set, 0, lon_entry, lat_entry); +#endif + + gtk_widget_show_all(menu); + + return menu; +} +#else +static GtkWidget *goto_picker_create(appdata_t *appdata, + GtkWidget *lat_entry, GtkWidget *lon_entry) { + GtkCellRenderer *renderer; + GtkListStore *store; + + GtkWidget *view = gtk_tree_view_new(); + + g_object_set_data(G_OBJECT(view), "lat_entry", (gpointer)lat_entry); + g_object_set_data(G_OBJECT(view), "lon_entry", (gpointer)lon_entry); + + /* --- "Icon" column --- */ + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), + -1, "Icon", renderer, "pixbuf", PRESET_PICKER_COL_ICON, NULL); + + /* --- "Name" column --- */ + renderer = gtk_cell_renderer_text_new(); + g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL ); + GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes( + "Name", renderer, "text", PRESET_PICKER_COL_NAME, NULL); + gtk_tree_view_column_set_expand(column, TRUE); + gtk_tree_view_insert_column(GTK_TREE_VIEW(view), column, -1); + + store = gtk_list_store_new(PRESET_PICKER_NUM_COLS, + GDK_TYPE_PIXBUF, + G_TYPE_STRING, + G_TYPE_INT, + G_TYPE_POINTER); + +#if defined(ENABLE_OSM_GPS_MAP) + preset_picker_add(store, appdata, icon_get(ICON_POS, 20), + _("Map position"), cb_map_set, 0); +#endif + +#if defined(ENABLE_MAEMO_MAPPER) + preset_picker_add(store, appdata, icon_get(ICON_POS, 24), + _("Maemo mapper position"), cb_mm_set, 0); +#endif + + gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); + g_object_unref(store); + + /* make list react on clicks */ + g_signal_connect(view, "row-activated", + (GCallback)on_preset_picker_activated, appdata); + + /* put this inside a scrolled view */ +#ifndef USE_PANNABLE_AREA + GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(scrolled_window), view); + return scrolled_window; +#else + GtkWidget *pannable_area = hildon_pannable_area_new(); + gtk_container_add(GTK_CONTAINER(pannable_area), view); + return pannable_area; +#endif +} +#endif + +static gint on_goto_button_press(GtkWidget *button, + GdkEventButton *event, gpointer data) { + appdata_t *appdata = (appdata_t*)data; + + if(event->type == GDK_BUTTON_PRESS) { + +#if defined(ENABLE_MAEMO_MAPPER) && !defined(ENABLE_OSM_GPS_MAP) + /* only maemo mapper is being used */ + pos_t pos = goto_pos_get(button); + if(!isnan(pos.lat) && !isnan(pos.lon)) { + dbus_mm_set_position(appdata, &pos); +#elif !defined(ENABLE_MAEMO_MAPPER) && defined(ENABLE_OSM_GPS_MAP) + /* only internal map is being used */ + pos_t pos = goto_pos_get(button); + if(!isnan(pos.lat) && !isnan(pos.lon)) { + map(appdata); + osm_gps_map_set_center(OSM_GPS_MAP(appdata->map.context->widget), + pos.lat, pos.lon); + } +#else + + gpointer lat_entry = g_object_get_data(G_OBJECT(button), "lat_entry"); + g_assert(lat_entry); + gpointer lon_entry = g_object_get_data(G_OBJECT(button), "lon_entry"); + g_assert(lon_entry); + +#ifndef PRESET_PICKER_DIALOG + GtkWidget *menu = g_object_get_data(G_OBJECT(button), "menu"); + if(!menu) { + menu = goto_popup_menu_create(appdata, lat_entry, lon_entry); + g_object_set_data(G_OBJECT(button), "menu", (gpointer)menu); + } + + /* draw a popup menu */ + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, + event->button, event->time); +#else + GtkWidget *dialog = + gtk_dialog_new_with_buttons(_("Map coordinates"), + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))), + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + NULL); + + gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 210); + + gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), + goto_picker_create(appdata, lat_entry, lon_entry)); + + gtk_widget_show_all(dialog); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); +#endif + +#endif + + return TRUE; + } + return FALSE; +} + +/* a button which makes the map/maemo mapper go to the associated */ +/* position */ +GtkWidget *goto_coordinate(appdata_t *appdata, + GtkWidget *lat_entry, GtkWidget *lon_entry) { + + GtkWidget *button = gtk_button_new(); + + gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_POS, 23)); + + gtk_widget_set_tooltip_text(button, _("Goto coordinates")); + + g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry); + g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry); + + gtk_signal_connect(GTK_OBJECT(button), "button-press-event", + (GtkSignalFunc)on_goto_button_press, appdata); + +#ifndef PRESET_PICKER_DIALOG + gtk_signal_connect(GTK_OBJECT(button), "destroy", + (GtkSignalFunc)on_popup_destroy, appdata); +#else +#ifdef FREMANTLE + hildon_gtk_widget_set_theme_size(button, + (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH)); +#endif +#endif + + return button; +} +#else +/* no map installed */ +GtkWidget *goto_coordinate(appdata_t *appdata, + GtkWidget *lat_entry, GtkWidget *lon_entry) { + return gtk_label_new(""); +} +#endif + GtkWidget *entry_new(void) { #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5) return gtk_entry_new();