Only show distance if we know where we are
[belltower] / belltower.c
index b699af2..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)
 {
@@ -433,6 +456,55 @@ single_tower_cb (tower *details,
   return FILTER_STOP;
 }
 
+/**
+ * A tower that was accepted by a filter.
+ */
+typedef struct {
+  char *sortkey;
+  char *primarykey;
+  char *displayname;
+} FoundTower;
+
+static FoundTower *
+found_tower_new (tower *basis)
+{
+  FoundTower* result = g_new (FoundTower, 1);
+
+  result->sortkey = g_strdup (basis->fields[FieldPrimaryKey]);
+  result->primarykey = g_strdup (basis->fields[FieldPrimaryKey]);
+
+  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;
+}
+
+static void
+found_tower_free (FoundTower *tower)
+{
+  g_free (tower->sortkey);
+  g_free (tower->primarykey);
+  g_free (tower->displayname);
+  g_free (tower);
+}
+
 static void
 parse_dove (ParseDoveCallback callback,
            GSList **filter_results,
@@ -496,7 +568,7 @@ parse_dove (ParseDoveCallback callback,
          if (filter_results)
            {
              *filter_results = g_slist_append (*filter_results,
-                                               g_strdup (result.fields[FieldPrimaryKey]));
+                                               found_tower_new (&result));
            }
        }
 
@@ -509,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
@@ -542,8 +599,9 @@ show_towers_from_list (GSList *list)
 {
   GtkWidget *dialog;
   GtkWidget *selector;
-  gchar *result = NULL;
+  gint result = -1;
   GSList *cursor;
+  gchar foo[2048];
 
   if (!list)
     {
@@ -555,11 +613,15 @@ show_towers_from_list (GSList *list)
 
   if (!list->next)
     {
-      /* don't bother showing the list */
+      /* 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;
     }
 
@@ -568,8 +630,9 @@ show_towers_from_list (GSList *list)
 
   for (cursor=list; cursor; cursor=cursor->next)
     {
+      FoundTower* found = (FoundTower*) cursor->data;
       hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector),
-                                        cursor->data);
+                                        found->displayname);
     }
 
   hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (dialog),
@@ -579,16 +642,23 @@ show_towers_from_list (GSList *list)
 
   if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK)
     {
-      result = g_strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
+      GList *rows = hildon_touch_selector_get_selected_rows (HILDON_TOUCH_SELECTOR (selector),
+                                                            0);
+      GtkTreePath *path = (GtkTreePath*) rows->data;
+      gint *indices = gtk_tree_path_get_indices (path);
+
+      result = *indices;
     }
 
   gtk_widget_destroy (GTK_WIDGET (dialog));
 
-  if (result)
+  if (result!=-1)
     {
-      show_tower (result);
-      g_free (result);
+      FoundTower *found = (FoundTower *) g_slist_nth_data (list, result);
+      show_tower (found->primarykey);
     }
+
+  /* FIXME: and free the list */
 }
 
 static gint strcmp_f (gconstpointer a,
@@ -706,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));
 
-  show_towers_from_list (test);
+  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);
+    }
+
+  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
@@ -738,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);