Index: src/poi.c =================================================================== --- src/poi.c (revision 2) +++ src/poi.c (revision 3) @@ -367,21 +367,33 @@ return result; } +static void +write_selected_poi(PoiInfo *poi, gint *id, + GtkTreeModel *model, GtkTreeIter *iter) +{ + gtk_tree_model_get(model, iter, + POI_POIID, &(poi->poi_id), + POI_CATID, &(poi->cat_id), + POI_LAT, &(poi->lat), + POI_LON, &(poi->lon), + POI_LABEL, &(poi->label), + POI_DESC, &(poi->desc), + POI_CLABEL, &(poi->clabel), + -1); + *id = poi->poi_id; +} + gboolean select_poi(gint unitx, gint unity, PoiInfo *poi, gboolean quick) { + static gint selected_poi_id = -1; + GtkTreeIter *selected_poi = NULL; gint x, y; gdouble lat1, lon1, lat2, lon2; - static GtkWidget *dialog = NULL; - static GtkWidget *list = NULL; - static GtkWidget *sw = NULL; - static GtkTreeViewColumn *column = NULL; - static GtkCellRenderer *renderer = NULL; - GtkListStore *store = NULL; - GtkTreeIter iter; + GtkListStore *store; gboolean selected = FALSE; gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN]; - gint num_cats = 0; + gint num_pois = 0; printf("%s()\n", __PRETTY_FUNCTION__); x = unitx - pixel2unit(3 * _draw_width); @@ -417,16 +429,19 @@ while(SQLITE_ROW == sqlite3_step(_stmt_select_poi)) { + GtkTreeIter iter; gdouble lat, lon; + gint poi_id; lat = sqlite3_column_double(_stmt_select_poi, 0); lon = sqlite3_column_double(_stmt_select_poi, 1); + poi_id = sqlite3_column_int(_stmt_select_poi, 2); format_lat_lon(lat, lon, tmp1, tmp2); //lat_format(lat, tmp1); //lon_format(lon, tmp2); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, - POI_POIID, sqlite3_column_int(_stmt_select_poi, 2), + POI_POIID, poi_id, POI_CATID, sqlite3_column_int(_stmt_select_poi, 5), POI_LAT, lat, POI_LON, lon, @@ -435,46 +450,50 @@ POI_DESC, sqlite3_column_text(_stmt_select_poi, 4), POI_CLABEL, sqlite3_column_text(_stmt_select_poi, 6), -1); - num_cats++; + + /* get previously selected POI or the first one on the list */ + if(poi_id == selected_poi_id || num_pois == 0) + { + if(selected_poi) + gtk_tree_iter_free(selected_poi); + selected_poi = gtk_tree_iter_copy(&iter); + } + + num_pois++; } sqlite3_reset(_stmt_select_poi); - switch(num_cats) + /* nothing found */ + if(num_pois == 0) { - case 0: - g_object_unref(G_OBJECT(store)); - if(!quick) - { - MACRO_BANNER_SHOW_INFO(_window, _("No POIs found.")); - } - return FALSE; - break; - case 1: - /* iter is still set to the most-recently added POI. */ - gtk_tree_model_get(GTK_TREE_MODEL(store), - &iter, - POI_POIID, &(poi->poi_id), - POI_CATID, &(poi->cat_id), - POI_LAT, &(poi->lat), - POI_LON, &(poi->lon), - POI_LABEL, &(poi->label), - POI_DESC, &(poi->desc), - POI_CLABEL, &(poi->clabel), - -1); - g_object_unref(G_OBJECT(store)); - return TRUE; - break; - default: - if(quick) - { - g_object_unref(G_OBJECT(store)); - return get_nearest_poi(unitx, unity, poi); - } + if(!quick) + MACRO_BANNER_SHOW_INFO(_window, _("No POIs found.")); + selected_poi_id = -1; + selected = FALSE; } + /* one match */ + else if(num_pois == 1) + { + write_selected_poi(poi, &selected_poi_id, + GTK_TREE_MODEL(store), selected_poi); + selected = TRUE; + } + /* two or more -- picking the nearest */ + else if(quick) + { + selected = get_nearest_poi(unitx, unity, poi); + if (selected) + selected_poi_id = poi->poi_id; + } + /* multiple matches -- let user decide */ + else + { + GtkWidget *dialog; + GtkWidget *list; + GtkWidget *sw; + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; - /* There are at least 2 matching POI's - let the user select one. */ - if(dialog == NULL) - { dialog = gtk_dialog_new_with_buttons(_("Select POI"), GTK_WINDOW(_window), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, @@ -514,39 +533,44 @@ column = gtk_tree_view_column_new_with_attributes( _("Category"), renderer, "text", POI_CLABEL, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(list), column); - } - gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store)); - g_object_unref(G_OBJECT(store)); + gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store)); - gtk_widget_show_all(dialog); + gtk_tree_selection_select_iter( + gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), + selected_poi); - while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) - { - if(gtk_tree_selection_get_selected( - gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), - NULL, &iter)) + gtk_widget_show_all(dialog); + + while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) { - gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, - POI_POIID, &(poi->poi_id), - POI_CATID, &(poi->cat_id), - POI_LAT, &(poi->lat), - POI_LON, &(poi->lon), - POI_LABEL, &(poi->label), - POI_DESC, &(poi->desc), - POI_CLABEL, &(poi->clabel), - -1); - selected = TRUE; - break; + GtkTreeIter iter; + if(gtk_tree_selection_get_selected( + gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), + NULL, &iter)) + { + gtk_tree_iter_free(selected_poi); + selected_poi = gtk_tree_iter_copy(&iter); + selected = TRUE; + break; + } + else + popup_error(dialog, _("Select one POI from the list.")); } - else - popup_error(dialog, _("Select one POI from the list.")); + + map_force_redraw(); + + if (selected) + write_selected_poi(poi, &selected_poi_id, + GTK_TREE_MODEL(store), selected_poi); + + gtk_widget_destroy(dialog); } - map_force_redraw(); + if (selected_poi) + gtk_tree_iter_free(selected_poi); + g_object_unref(G_OBJECT(store)); - gtk_widget_hide(dialog); - vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, selected); return selected; }