From: Thomas Thurman Date: Fri, 28 Aug 2009 17:59:38 +0000 (-0400) Subject: location search works, approximately X-Git-Url: http://vcs.maemo.org/git/?p=belltower;a=commitdiff_plain;h=91fc466fc74e242273db359a2508f9cc56f115e5 location search works, approximately --- diff --git a/belltower.c b/belltower.c index 0572fd4..b699af2 100644 --- a/belltower.c +++ b/belltower.c @@ -23,7 +23,7 @@ typedef enum { /** stop scanning the database */ FILTER_STOP, /** ignore this one */ - FILTER_PASS, + FILTER_IGNORE, /** add this one to the list */ FILTER_ACCEPT } FilterResult; @@ -168,7 +168,7 @@ show_browser (gchar *url) url); } -typedef gboolean (*ParseDoveCallback)(tower *details, gpointer data); +typedef FilterResult (*ParseDoveCallback)(tower *details, gpointer data); typedef void (*ButtonCallback)(void); GtkWidget *tower_window, *buttons, *tower_table; @@ -251,7 +251,7 @@ show_peals_list (void) show_browser (peals_list); } -static gboolean +static FilterResult get_countries_cb (tower *details, gpointer data) { @@ -269,7 +269,7 @@ get_countries_cb (tower *details, g_strdup (details->fields[FieldCountry])); } - return FILTER_PASS; + return FILTER_IGNORE; } typedef struct { @@ -277,17 +277,22 @@ typedef struct { gchar *country_name; } country_cb_data; -static gboolean +typedef struct { + char *country; + char *county; +} country_and_county; + +static FilterResult get_counties_cb (tower *details, gpointer data) { country_cb_data *d = (country_cb_data *)data; if (details->serial==0) - return FILTER_PASS; /* header row */ + return FILTER_IGNORE; /* header row */ if (strcmp(details->fields[FieldCountry], d->country_name)!=0) - return FILTER_PASS; /* wrong country */ + return FILTER_IGNORE; /* wrong country */ if (!g_hash_table_lookup_extended (d->hash, details->fields[FieldCounty], @@ -298,10 +303,27 @@ get_counties_cb (tower *details, g_strdup (details->fields[FieldCounty])); } - return FILTER_PASS; + return FILTER_IGNORE; +} + +static FilterResult +get_towers_by_county_cb (tower *details, + gpointer data) +{ + country_and_county *cac = (country_and_county *) data; + + if ((!cac->county || strcmp (cac->county, details->fields[FieldCounty])==0) && + (!cac->country || strcmp (cac->country, details->fields[FieldCountry])==0)) + { + return FILTER_ACCEPT; + } + else + { + return FILTER_IGNORE; + } } -static gboolean +static FilterResult single_tower_cb (tower *details, gpointer data) { @@ -315,7 +337,7 @@ single_tower_cb (tower *details, if (strcmp(details->fields[FieldPrimaryKey], primary_key)!=0) { /* not this one; keep going */ - return FILTER_PASS; + return FILTER_IGNORE; } tower_window = hildon_stackable_window_new (); @@ -462,7 +484,7 @@ parse_dove (ParseDoveCallback callback, switch (callback (&result, data)) { - case FILTER_PASS: + case FILTER_IGNORE: /* nothing */ break; @@ -474,7 +496,7 @@ parse_dove (ParseDoveCallback callback, if (filter_results) { *filter_results = g_slist_append (*filter_results, - result.fields[FieldPrimaryKey]); + g_strdup (result.fields[FieldPrimaryKey])); } } @@ -515,6 +537,60 @@ show_tower (char *primary_key) parse_dove (single_tower_cb, NULL, primary_key); } +static void +show_towers_from_list (GSList *list) +{ + GtkWidget *dialog; + GtkWidget *selector; + gchar *result = NULL; + GSList *cursor; + + if (!list) + { + hildon_banner_show_information(window, + NULL, + "No towers found."); + return; + } + + if (!list->next) + { + /* don't bother showing the list */ + hildon_banner_show_information(window, + NULL, + "One tower found."); + show_tower (list->data); + return; + } + + dialog = hildon_picker_dialog_new (GTK_WINDOW (window)); + selector = hildon_touch_selector_new_text (); + + for (cursor=list; cursor; cursor=cursor->next) + { + hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector), + cursor->data); + } + + hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (dialog), + HILDON_TOUCH_SELECTOR (selector)); + + gtk_widget_show_all (GTK_WIDGET (dialog)); + + if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK) + { + result = g_strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector))); + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); + + if (result) + { + show_tower (result); + g_free (result); + } +} + static gint strcmp_f (gconstpointer a, gconstpointer b) { @@ -536,19 +612,15 @@ static void towers_by_subarea (gchar *area) { GtkWidget *dialog = hildon_picker_dialog_new (GTK_WINDOW (window)); - GtkWidget *selector = hildon_touch_selector_new_text (); - GHashTable *hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - GSList *list=NULL, *cursor; - gchar *title = g_strdup_printf ("Areas of %s", area); - country_cb_data d = { hash, area }; + country_and_county cac = { area, NULL }; gtk_window_set_title (GTK_WINDOW (dialog), title); g_free (title); @@ -572,7 +644,15 @@ towers_by_subarea (gchar *area) if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK) { - show_message (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector))); + GSList *matches = NULL; + cac.county = strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector))); + + parse_dove (get_towers_by_county_cb, + &matches, + &cac); + g_free (cac.county); + + show_towers_from_list (matches); } g_hash_table_unref (hash); gtk_widget_destroy (GTK_WIDGET (dialog)); @@ -624,60 +704,6 @@ towers_by_area (void) } static void -show_towers_from_list (GSList *list) -{ - GtkWidget *dialog; - GtkWidget *selector; - gchar *result = NULL; - GSList *cursor; - - if (!list) - { - hildon_banner_show_information(window, - NULL, - "No towers found."); - return; - } - - if (!list->next) - { - /* don't bother showing the list */ - hildon_banner_show_information(window, - NULL, - "One tower found."); - show_tower (list->data); - return; - } - - dialog = hildon_picker_dialog_new (GTK_WINDOW (window)); - selector = hildon_touch_selector_new_text (); - - for (cursor=list; cursor; cursor=cursor->next) - { - hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector), - cursor->data); - } - - hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (dialog), - HILDON_TOUCH_SELECTOR (selector)); - - gtk_widget_show_all (GTK_WIDGET (dialog)); - - if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK) - { - result = g_strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector))); - } - - gtk_widget_destroy (GTK_WIDGET (dialog)); - - if (result) - { - show_tower (result); - g_free (result); - } -} - -static void show_bookmarks (void) { GSList *test = NULL;