]> err.no Git - mapper/blobdiff - src/search.c
Move some variables around
[mapper] / src / search.c
index 22f71f1e203d059bfb0354d841c675a26216b70b..59ae62dbf3f177bac3418948873b753775ae7dbd 100644 (file)
@@ -24,8 +24,6 @@
 
 #include <config.h>
 
-#define _GNU_SOURCE
-
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include "help.h"
 #include "osm-db.h"
 #include "search.h"
-
-typedef struct _search_query poi_search_query;
-struct _search_query {
-       gdouble lat;
-       gdouble lon;
-       guint cat_id;
-       gchar *query;
-};
+#include "dialogs.h"
 
 typedef struct _search_dialog search_dialog;
 struct _search_dialog {
@@ -69,7 +60,6 @@ struct _search_dialog {
        GtkWidget *cmb_category;
        GtkWidget *list;
        GtkWidget *search_entry;
-       GtkWidget *btn_edit;
        GtkWidget *label;
        GtkListStore *store;
        gdouble lat;
@@ -78,6 +68,7 @@ struct _search_dialog {
 };
 
 static search_dialog sd;
+static GtkListStore *search_model=NULL;
 
 static gboolean
 search_do_cb(GtkWidget *widget, gpointer data)
@@ -95,10 +86,18 @@ if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(s->cmb_category), &iter)==TRUE)
 else
        cid=-1;
 if (s->stype==SEARCH_TYPE_POI && cid==-1 && slen<2) {
+#ifdef WITH_HILDON
+       hildon_banner_show_information(s->dialog, NULL, _("Query string too short. Minimum 2 characters."));
+#else
        popup_error(s->dialog, _("Query string too short. Minimum 2 characters."));
+#endif
        return TRUE;
 } else if (slen<2 && s->stype!=SEARCH_TYPE_POI) {
+#ifdef WITH_HILDON
+       hildon_banner_show_information(s->dialog, NULL, _("Query string too short. Minimum 2 characters."));
+#else
        popup_error(s->dialog, _("Query string too short. Minimum 2 characters."));
+#endif
        return TRUE;
 }
 
@@ -106,14 +105,15 @@ st=g_strdup(gtk_entry_get_text(GTK_ENTRY(s->search_entry)));
 
 switch (s->stype) {
        case SEARCH_TYPE_POI:
+               MACRO_BANNER_SHOW_INFO(s->dialog, _("Searching POIs..."));
                sres=poi_search((cid==-1 && slen>0) ? POI_SEARCH_TEXT : (cid!=-1 && slen==0) ? POI_SEARCH_CAT : POI_SEARCH_TEXT_CAT, s->lat, s->lon, st, cid, &s->store);
        break;
        case SEARCH_TYPE_WAY:
+               MACRO_BANNER_SHOW_INFO(s->dialog, _("Searching streets..."));
                sres=osm_way_search(s->lat, s->lon, st, &s->store);
        break;
        case SEARCH_TYPE_PLACE:
-               popup_error(s->dialog, "Not yet implemented");
-               sres=FALSE;
+               sres=osm_place_search(s->lat, s->lon, st, &s->store);
        break;
 }
 
@@ -165,52 +165,6 @@ gtk_tree_model_get(model, &iter, ITEM_ID, &id, -1);
 return id;
 }
 
-static gboolean
-search_goto_cb(GtkWidget *widget, gpointer data)
-{
-gdouble lat, lon;
-search_dialog *s=(search_dialog *)data;
-
-if (search_get_list_item_latlon(s->list, &lat, &lon)==FALSE) {
-       popup_error(s->dialog, _("Select a location from the list."));
-       return TRUE;
-}
-
-map_center_latlon(lat, lon);
-map_update_location_from_center();
-return TRUE;
-}
-
-static gboolean
-search_route_to_cb(GtkWidget *widget, gpointer data)
-{
-search_dialog *s=(search_dialog *)data;
-
-if (search_get_list_item_latlon(s->list, &_dest.lat, &_dest.lon)==FALSE) {
-       popup_error(s->dialog, _("Select a location from the list."));
-       return TRUE;
-}
-
-_dest.valid=TRUE;
-map_update_location_from_center();
-
-return TRUE;
-}
-
-static gboolean
-search_edit_cb(GtkWidget *widget, gpointer data)
-{
-search_dialog *s=(search_dialog *)data;
-
-switch (s->stype) {
-       case SEARCH_TYPE_POI:
-       break;
-       default:
-       break;
-}
-return TRUE;
-}
-
 static void
 search_set_dialog_mode(search_dialog *s)
 {
@@ -218,12 +172,10 @@ s->stype=gtk_combo_box_get_active(GTK_COMBO_BOX(s->cmb_type));
 switch (s->stype) {
        case SEARCH_TYPE_POI:
                gtk_widget_show(s->cmb_category);
-               gtk_widget_set_sensitive(s->btn_edit, TRUE);
        break;
        case SEARCH_TYPE_WAY:
        case SEARCH_TYPE_PLACE:
                gtk_widget_hide(s->cmb_category);
-               gtk_widget_set_sensitive(s->btn_edit, FALSE);
        break;
        default:
                g_assert_not_reached();
@@ -246,18 +198,36 @@ return TRUE;
 static void
 search_item_activated_cb(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data)
 {
-#if 0
 search_dialog *s=(search_dialog *)data;
-gtk_widget_destroy(sd.dialog);
+gdouble lat, lon;
+GtkTreeIter iter;
+GtkTreeModel *model;
+
+if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)), NULL, &iter))
+       return;
+
+model=gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view)); 
+if (!model)
+       return;
+
+gtk_tree_model_get(model, &iter, ITEM_LAT, &lat, -1);
+gtk_tree_model_get(model, &iter, ITEM_LON, &lon, -1);
+
+map_center_latlon(lat, lon);
+g_idle_add_full(G_PRIORITY_HIGH_IDLE,(GSourceFunc)map_update_location_from_center, NULL, NULL);
+#if 0
+gtk_widget_destroy(s->dialog);
 #endif
 }
 
 gboolean
 mapper_search_dialog(mapper_search_type stype, gdouble lat, gdouble lon)
 {
-GtkWidget *sw, *hbox, *label, *btn_search, *btn_goto, *btn_route_to;
+GtkWidget *sw, *hbox, *label, *btn_search;
 GtkTreeViewColumn *column;
 GtkCellRenderer *renderer;
+GtkEntryCompletion *search_comp;
+gint res;
 
 sd.store=NULL;
 sd.lat=lat;
@@ -266,14 +236,15 @@ sd.stype=stype;
 
 sd.dialog = gtk_dialog_new_with_buttons(_("Search"),
                        GTK_WINDOW(_window),
-                       GTK_DIALOG_MODAL, 
-                       GTK_STOCK_CANCEL,
-                       GTK_RESPONSE_REJECT, 
+                       GTK_DIALOG_MODAL,
+                       _("Goto"), 1,
+                       _("Route to"), 2,
+                       _("Edit"), 3,
+                       GTK_STOCK_CLOSE, GTK_RESPONSE_REJECT, 
                        NULL);
 
-gtk_container_add(GTK_CONTAINER(GTK_DIALOG(sd.dialog)->action_area), btn_goto = gtk_button_new_with_label(_("Go to")));
-gtk_container_add(GTK_CONTAINER(GTK_DIALOG(sd.dialog)->action_area), btn_route_to = gtk_button_new_with_label(_("Route to")));
-gtk_container_add(GTK_CONTAINER(GTK_DIALOG(sd.dialog)->action_area), sd.btn_edit = gtk_button_new_with_label(_("Edit")));
+if (search_model==NULL)
+       search_model=gtk_list_store_new(1, G_TYPE_STRING);
 
 gtk_window_set_default_size(GTK_WINDOW(sd.dialog), 500, 300);
 
@@ -294,6 +265,10 @@ gtk_box_pack_start(GTK_BOX(hbox), sd.cmb_category, FALSE, FALSE, 0);
 poi_category_combo_populate(sd.cmb_category, 0, TRUE);
 
 sd.search_entry=gtk_entry_new();
+search_comp=gtk_entry_completion_new();
+gtk_entry_completion_set_model(search_comp, GTK_TREE_MODEL(search_model));
+gtk_entry_completion_set_text_column(search_comp, 0);
+gtk_entry_set_completion(GTK_ENTRY(sd.search_entry), search_comp);
 gtk_box_pack_start(GTK_BOX(hbox), sd.search_entry, TRUE, TRUE, 0);
 
 btn_search=gtk_button_new_with_label(_("Search"));
@@ -335,9 +310,6 @@ sd.label=gtk_label_new("");
 gtk_box_pack_start(GTK_BOX(hbox), sd.label, FALSE, FALSE, 0);
 
 g_signal_connect(G_OBJECT(btn_search), "clicked", G_CALLBACK(search_do_cb), &sd);
-g_signal_connect(G_OBJECT(btn_goto), "clicked", G_CALLBACK(search_goto_cb), &sd);
-g_signal_connect(G_OBJECT(btn_route_to), "clicked", G_CALLBACK(search_route_to_cb), &sd);
-g_signal_connect(G_OBJECT(sd.btn_edit), "clicked", G_CALLBACK(search_edit_cb), &sd);
 g_signal_connect(G_OBJECT(sd.cmb_type), "changed", G_CALLBACK(search_type_changed_cb), &sd);
 g_signal_connect(G_OBJECT(sd.list), "row-activated", G_CALLBACK(search_item_activated_cb), &sd);
 
@@ -345,7 +317,58 @@ gtk_widget_show_all(sd.dialog);
 gtk_combo_box_set_active(GTK_COMBO_BOX(sd.cmb_type), sd.stype);
 search_set_dialog_mode(&sd);
 
-gtk_dialog_run(GTK_DIALOG(sd.dialog));
+while ((res=gtk_dialog_run(GTK_DIALOG(sd.dialog)))!=GTK_RESPONSE_REJECT) {
+       gdouble lat, lon;
+
+       switch (res) {
+       case 1:
+               if (search_get_list_item_latlon(sd.list, &lat, &lon)==FALSE) {
+                       popup_error(sd.dialog, _("Select a location from the list."));
+               } else {
+                       map_center_latlon(lat, lon);
+                       g_idle_add_full(G_PRIORITY_HIGH_IDLE,(GSourceFunc)map_update_location_from_center, NULL, NULL);
+               }
+               continue;
+       break;
+       case 2:
+               if (search_get_list_item_latlon(sd.list, &_dest.lat, &_dest.lon)==FALSE) {
+                       popup_error(sd.dialog, _("Select a location from the list."));
+               } else {
+                       _dest.valid=TRUE;
+                       g_idle_add_full(G_PRIORITY_HIGH_IDLE,(GSourceFunc)map_update_location_from_center, NULL, NULL);
+               }
+               continue;
+       break;
+       case 3:
+               switch (sd.stype) {
+                       case SEARCH_TYPE_POI: {
+                               poi_info *p=NULL;
+                               guint id;
+               
+                               id=search_get_list_item_id(sd.list);
+                               if (id>0) {
+                                       p=poi_get_by_id(id);
+                                       if (p) {
+                                               gtk_widget_destroy(sd.dialog);
+                                               poi_edit_dialog(ACTION_EDIT_POI, p);
+                                               return TRUE; /* XXX: for now, this is not nice.. */
+                                       } else {
+                                               popup_error(sd.dialog, _("Failed to fetch POI for editing."));
+                                       }
+                               }
+                       }
+                       break;
+                       default:
+                               popup_error(sd.dialog, _("Only POIs can be modified."));
+                       break;
+               }
+               continue;
+       break;
+       default:
+               break;
+       break;
+       }
+}
 
 gtk_widget_destroy(sd.dialog);
 return TRUE;