Only show distance if we know where we are
[belltower] / belltower.c
index f55cf95..d099154 100644 (file)
 #include <hildon/hildon.h>
 #include <gtk/gtk.h>
 #include <location/location-gps-device.h>
+#include <location/location-distance-utils.h>
 #include <dbus/dbus-glib.h>
 
 #define MAX_FIELDS 50
 
 GtkWidget *window;
 
+LocationGPSDevice *device;
+
 typedef enum {
   /** stop scanning the database */
   FILTER_STOP,
@@ -86,6 +89,7 @@ typedef struct {
  * 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;
 
@@ -324,6 +328,25 @@ get_towers_by_county_cb (tower *details,
 }
 
 static FilterResult
+get_towers_by_search_cb (tower *details,
+                        gpointer data)
+{
+  char *s = (char *) data;
+
+  if (strcasestr(details->fields[FieldCountry], s) ||
+      strcasestr(details->fields[FieldCounty], s) ||
+      strcasestr(details->fields[FieldDedication], s) ||
+      strcasestr(details->fields[FieldPlace], s))
+    {
+      return FILTER_ACCEPT;
+    }
+  else
+    {
+      return FILTER_IGNORE;
+    }
+}
+
+static FilterResult
 single_tower_cb (tower *details,
                 gpointer data)
 {
@@ -449,11 +472,26 @@ found_tower_new (tower *basis)
 
   result->sortkey = g_strdup (basis->fields[FieldPrimaryKey]);
   result->primarykey = g_strdup (basis->fields[FieldPrimaryKey]);
-  result->displayname = g_strdup_printf ("%s, %s (%s, %s)",
-                                        basis->fields[FieldDedication],
-                                        basis->fields[FieldPlace],
-                                        basis->fields[FieldBells],
-                                        basis->fields[FieldPracticeNight]);
+
+  if (gps_working)
+    {
+      gchar *distance = distance_to_tower (basis);
+      result->displayname = g_strdup_printf ("%s, %s (%s, %s) (%s)",
+                                            basis->fields[FieldDedication],
+                                            basis->fields[FieldPlace],
+                                            basis->fields[FieldBells],
+                                            basis->fields[FieldPracticeNight],
+                                            distance);
+      g_free (distance);
+    }
+  else
+    {
+      result->displayname = g_strdup_printf ("%s, %s (%s, %s)",
+                                            basis->fields[FieldDedication],
+                                            basis->fields[FieldPlace],
+                                            basis->fields[FieldBells],
+                                            basis->fields[FieldPracticeNight]);
+    }
 
   return result;
 }
@@ -543,26 +581,11 @@ parse_dove (ParseDoveCallback callback,
 static void
 nearby_towers (void)
 {
-  char buffer[4096];
-  LocationGPSDevice *device;
-  device = g_object_new (LOCATION_TYPE_GPS_DEVICE, NULL);
-
-  sprintf(buffer, "%f %f %x",
-      device->fix->latitude,
-      device->fix->longitude,
-      device->fix->fields);
-  show_message (buffer);
-
-  if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET)
-    {
-      show_message ("I know where you are!");
-    }
-  else
+  if (!gps_working)
     {
       show_message ("I don't know where you are!");
+      return;
     }
-
-  g_object_unref (device);
 }
 
 static void
@@ -591,10 +614,12 @@ show_towers_from_list (GSList *list)
   if (!list->next)
     {
       /* only one; don't bother showing the list */
+      FoundTower* found = (FoundTower*) list->data;
+
       hildon_banner_show_information(window,
                                     NULL,
                                     "One tower found.");
-      show_tower (list->data);
+      show_tower (found->primarykey);
 
       /* FIXME: and free the list */
       return;
@@ -751,27 +776,54 @@ towers_by_area (void)
 static void
 show_bookmarks (void)
 {
-  GSList *test = NULL;
-  show_towers_from_list (test);
 }
 
 static void
 tower_search (void)
 {
-  GSList *test = NULL;
-  test = g_slist_append (test, "NORTON  HE");
+  GtkWidget *terms = gtk_dialog_new_with_buttons ("What are you looking for?",
+                                                 GTK_WINDOW (window),
+                                                 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
+                                                 "Search",
+                                                 GTK_RESPONSE_OK,
+                                                 NULL);
+  GtkWidget *entry = gtk_entry_new ();
+  GSList *matches = NULL;
+
+  gtk_box_pack_end (GTK_BOX (GTK_DIALOG (terms)->vbox),
+                   entry, TRUE, TRUE, 0);
+
+  gtk_widget_show_all (GTK_WIDGET (terms));
+
+  if (gtk_dialog_run (GTK_DIALOG (terms))==GTK_RESPONSE_OK)
+    {
+      GSList *matches = NULL;
+
+      parse_dove (get_towers_by_search_cb,
+                 &matches,
+                 (char*) gtk_entry_get_text (GTK_ENTRY (entry)));
+
+      show_towers_from_list (matches);
+    }
 
-  show_towers_from_list (test);
+  gtk_widget_destroy (GTK_WIDGET (terms));
 }
 
 static void
 recent_towers (void)
 {
-  GSList *test = NULL;
-  test = g_slist_append (test, "BARFORD");
-  test = g_slist_append (test, "BRAUGHING");
+}
+
+static void
+grab_gps (void)
+{
+  gps_working = (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET)!=0;
 
-  show_towers_from_list (test);
+  if (gps_working)
+    {
+      current_lat = device->fix->latitude;
+      current_long = device->fix->longitude;
+    }
 }
 
 int
@@ -783,6 +835,10 @@ main(int argc, char **argv)
   gtk_init (&argc, &argv);
   g_set_application_name ("Belltower");
 
+  device = g_object_new (LOCATION_TYPE_GPS_DEVICE, NULL);
+  grab_gps ();
+  /* FIXME and call that when the location changes, too */
+
   window = hildon_stackable_window_new ();
   gtk_window_set_title (GTK_WINDOW (window), "Belltower");
   g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL);