two-stage area search
authorThomas Thurman <tthurman@gnome.org>
Thu, 27 Aug 2009 23:15:33 +0000 (19:15 -0400)
committerThomas Thurman <tthurman@gnome.org>
Thu, 27 Aug 2009 23:15:33 +0000 (19:15 -0400)
belltower.c

index 413bcd5..7517bc0 100644 (file)
@@ -17,8 +17,6 @@
 
 #define MAX_FIELDS 50
 
-#define EM_DASH "\xE2\x80\x94"
-
 GtkWidget *window;
 
 /*
@@ -216,8 +214,8 @@ show_peals_list (void)
 }
 
 static gboolean
-get_areas_cb (tower *details,
-             gpointer data)
+get_countries_cb (tower *details,
+                 gpointer data)
 {
   GHashTable *hash = (GHashTable *)data;
 
@@ -225,25 +223,41 @@ get_areas_cb (tower *details,
     return TRUE; /* header row */
 
   if (!g_hash_table_lookup_extended (hash,
-                                   details->fields[FieldCounty],
+                                   details->fields[FieldCountry],
                                     NULL, NULL))
     {
-      char *display_format;
+      g_hash_table_insert (hash,
+                          g_strdup(details->fields[FieldCountry]),
+                          g_strdup (details->fields[FieldCountry]));
+    }
 
-      if (strcmp (details->fields[FieldCounty], "")==0)
-       {
-         display_format = g_strdup (details->fields[FieldCountry]);
-       }
-      else
-       {
-         display_format = g_strdup_printf ("%s " EM_DASH " %s",
-                                           details->fields[FieldCountry],
-                                           details->fields[FieldCounty]);
-       }
+  return TRUE;
+}
 
-      g_hash_table_insert (hash,
+typedef struct {
+  GHashTable *hash;
+  gchar *country_name;
+} country_cb_data;
+
+static gboolean
+get_counties_cb (tower *details,
+                gpointer data)
+{
+  country_cb_data *d = (country_cb_data *)data;
+
+  if (details->serial==0)
+    return TRUE; /* header row */
+
+  if (strcmp(details->fields[FieldCountry], d->country_name)!=0)
+    return TRUE; /* wrong country */
+
+  if (!g_hash_table_lookup_extended (d->hash,
+                                   details->fields[FieldCounty],
+                                    NULL, NULL))
+    {
+      g_hash_table_insert (d->hash,
                           g_strdup(details->fields[FieldCounty]),
-                          display_format);
+                          g_strdup (details->fields[FieldCounty]));
     }
 
   return TRUE;
@@ -463,45 +477,67 @@ put_areas_into_list (gpointer key,
 }
 
 static void
-area_activated (GtkTreeView *treeview,
-               GtkTreePath *path,
-               GtkTreeViewColumn *column,
-               gpointer data)
+towers_by_subarea (gchar *area)
 {
-  GtkTreeModel *model = gtk_tree_view_get_model (treeview);
-  GtkTreeIter iter;
+  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 };
+
+  gtk_window_set_title (GTK_WINDOW (dialog), title);
+  g_free (title);
+
+  parse_dove (get_counties_cb,
+             &d);
 
-  if (gtk_tree_model_get_iter (model, &iter, path))
+  g_hash_table_foreach (hash,
+                       put_areas_into_list,
+                       &list);
+
+  for (cursor=list; cursor; cursor=cursor->next)
     {
-      char *r;
-      gtk_tree_model_get (model, &iter, 0, &r, -1);
-      if (r == NULL)
-        return;
+      hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector),
+                                        cursor->data);
+    }
+
+  hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (dialog),
+                                    HILDON_TOUCH_SELECTOR (selector));
 
-      show_message (r);
+  gtk_widget_show_all (GTK_WIDGET (dialog));
+
+  if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK)
+    {
+      show_message (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
     }
+  g_hash_table_unref (hash);
+  gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
 static void
 towers_by_area (void)
 {
   GtkWidget *dialog = hildon_picker_dialog_new (GTK_WINDOW (window));
-  GtkWidget *vbox = GTK_DIALOG(dialog)->vbox;
-  GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
-  GtkWidget *treeview = hildon_gtk_tree_view_new (HILDON_UI_MODE_NORMAL);
-  GtkWidget *pan = hildon_pannable_area_new ();
-  GtkListStore *list_store = gtk_list_store_new(1, G_TYPE_STRING);
-
   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 *result = NULL;
 
-  GSList *list, *cursor;
+  gtk_window_set_title (GTK_WINDOW (dialog), "Areas of the world");
 
-  parse_dove (get_areas_cb,
+  parse_dove (get_countries_cb,
              hash);
 
   g_hash_table_foreach (hash,
@@ -519,11 +555,18 @@ towers_by_area (void)
 
   gtk_widget_show_all (GTK_WIDGET (dialog));
 
-  gtk_dialog_run (GTK_DIALOG (dialog));
-  show_message (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
+  if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK)
+    {
+      result = g_strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
+    }
+  g_hash_table_unref (hash);
   gtk_widget_destroy (GTK_WIDGET (dialog));
-  /* g_hash_table_unref (hash); */
 
+  if (result)
+    {
+      towers_by_subarea (result);
+      g_free (result);
+    }
 }
 
 static void