location search works, approximately
authorThomas Thurman <tthurman@gnome.org>
Fri, 28 Aug 2009 17:59:38 +0000 (13:59 -0400)
committerThomas Thurman <tthurman@gnome.org>
Fri, 28 Aug 2009 17:59:38 +0000 (13:59 -0400)
belltower.c

index 0572fd4..b699af2 100644 (file)
@@ -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;