fix 'nearby' button
authorThomas Thurman <tthurman@gnome.org>
Fri, 28 Aug 2009 21:53:21 +0000 (17:53 -0400)
committerThomas Thurman <tthurman@gnome.org>
Fri, 28 Aug 2009 21:53:21 +0000 (17:53 -0400)
belltower.c

index d099154..b0e581d 100644 (file)
@@ -85,13 +85,9 @@ typedef struct {
   int n_fields;
 } tower;
 
-/*
- * we're going to pretend you're in Helsinki
- * until I get the GPS working
- */
 gboolean gps_working = FALSE;
-double current_lat = 60.161790;
-double current_long = 23.924902;
+double current_lat = 40.2452778;
+double current_long = -75.65;;
 
 static void
 show_message (char *message)
@@ -104,7 +100,7 @@ show_message (char *message)
   gtk_widget_destroy (GTK_WIDGET (note));
 }
 
-static gchar*
+static gint
 distance_to_tower (tower *details)
 {
   char *endptr;
@@ -114,16 +110,31 @@ distance_to_tower (tower *details)
   const double km_to_miles = 1.609344;
 
   tower_lat = strtod(details->fields[FieldLat], &endptr);
-  if (*endptr) return g_strdup ("unknown");
+  if (*endptr) return -1;
   tower_long = strtod(details->fields[FieldLong], &endptr);
-  if (*endptr) return g_strdup ("unknown");
+  if (*endptr) return -1;
 
   km_distance = location_distance_between (current_lat,
                                           current_long,
                                           tower_lat,
                                           tower_long);
 
-  return g_strdup_printf("%dmi", (int) (km_distance / km_to_miles));
+  return (int) (km_distance / km_to_miles);
+}
+
+static gchar*
+distance_to_tower_str (tower *details)
+{
+  int miles = distance_to_tower (details);
+
+  if (miles==-1)
+    {
+      return g_strdup ("unknown");
+    }
+  else
+    {
+      return g_strdup_printf("%dmi", (int) miles);
+    }
 }
 
 static void
@@ -311,6 +322,23 @@ get_counties_cb (tower *details,
 }
 
 static FilterResult
+get_nearby_towers_cb (tower *details,
+                     gpointer data)
+{
+  if (details->serial==0)
+    return FILTER_IGNORE; /* header row */
+
+  if (distance_to_tower (details) < 50)
+    {
+      return FILTER_ACCEPT;
+    }
+  else
+    {
+      return FILTER_IGNORE;
+    }
+}
+
+static FilterResult
 get_towers_by_county_cb (tower *details,
                         gpointer data)
 {
@@ -400,7 +428,7 @@ single_tower_cb (tower *details,
   buttons = gtk_vbox_new (TRUE, 0);
   menu = HILDON_APP_MENU (hildon_app_menu_new ());
 
-  miles = distance_to_tower(details);
+  miles = distance_to_tower_str(details);
 
   add_table_field ("Distance", miles);
   add_table_field ("Postcode", details->fields[FieldPostcode]);
@@ -475,7 +503,7 @@ found_tower_new (tower *basis)
 
   if (gps_working)
     {
-      gchar *distance = distance_to_tower (basis);
+      gchar *distance = distance_to_tower_str (basis);
       result->displayname = g_strdup_printf ("%s, %s (%s, %s) (%s)",
                                             basis->fields[FieldDedication],
                                             basis->fields[FieldPlace],
@@ -579,16 +607,6 @@ parse_dove (ParseDoveCallback callback,
 }
 
 static void
-nearby_towers (void)
-{
-  if (!gps_working)
-    {
-      show_message ("I don't know where you are!");
-      return;
-    }
-}
-
-static void
 show_tower (char *primary_key)
 {
   parse_dove (single_tower_cb, NULL, primary_key);
@@ -679,6 +697,24 @@ put_areas_into_list (gpointer key,
 }
 
 static void
+nearby_towers (void)
+{
+  GSList *matches = NULL;
+
+  if (!gps_working)
+    {
+      show_message ("I don't know where you are!");
+      return;
+    }
+
+  parse_dove (get_nearby_towers_cb,
+             &matches,
+             NULL);
+
+  show_towers_from_list (matches);
+}
+
+static void
 towers_by_subarea (gchar *area)
 {
   GtkWidget *dialog = hildon_picker_dialog_new (GTK_WINDOW (window));