#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,
* 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;
}
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)
{
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,
if (filter_results)
{
*filter_results = g_slist_append (*filter_results,
- g_strdup (result.fields[FieldPrimaryKey]));
+ found_tower_new (&result));
}
}
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
{
GtkWidget *dialog;
GtkWidget *selector;
- gchar *result = NULL;
+ gint result = -1;
GSList *cursor;
+ gchar foo[2048];
if (!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;
}
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),
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,
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
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);