#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;
+typedef enum {
+ /** stop scanning the database */
+ FILTER_STOP,
+ /** ignore this one */
+ FILTER_IGNORE,
+ /** add this one to the list */
+ FILTER_ACCEPT
+} FilterResult;
+
/*
FIXME:
We should really do this by looking at the header row of the table.
int n_fields;
} tower;
+/*
+ * we're going to pretend you're in Helsinki
+ * until I get the GPS working
+ */
+double current_lat = 60.161790;
+double current_long = 23.924902;
+
static void
show_message (char *message)
{
gtk_widget_destroy (GTK_WIDGET (note));
}
+static gchar*
+distance_to_tower (tower *details)
+{
+ char *endptr;
+ double tower_lat;
+ double tower_long;
+ double km_distance;
+ const double km_to_miles = 1.609344;
+
+ tower_lat = strtod(details->fields[FieldLat], &endptr);
+ if (*endptr) return g_strdup ("unknown");
+ tower_long = strtod(details->fields[FieldLong], &endptr);
+ if (*endptr) return g_strdup ("unknown");
+
+ km_distance = location_distance_between (current_lat,
+ current_long,
+ tower_lat,
+ tower_long);
+
+ return g_strdup_printf("%dmi", (int) (km_distance / km_to_miles));
+}
+
static void
call_dbus (DBusBusType type,
char *name,
url);
}
-typedef gboolean (*ParseDoveCallback)(tower *details, gpointer data);
+typedef FilterResult (*ParseDoveCallback)(tower *details, gpointer data);
typedef void (*ButtonCallback)(void);
GtkWidget *tower_window, *buttons, *tower_table;
show_browser (peals_list);
}
-static gboolean
+static FilterResult
get_countries_cb (tower *details,
gpointer data)
{
g_strdup (details->fields[FieldCountry]));
}
- return TRUE;
+ return FILTER_IGNORE;
}
typedef struct {
gchar *country_name;
} country_cb_data;
-static gboolean
+typedef struct {
+ char *country;
+ char *county;
+} country_and_county;
+
+static FilterResult
get_counties_cb (tower *details,
gpointer data)
{
country_cb_data *d = (country_cb_data *)data;
if (details->serial==0)
- return TRUE; /* header row */
+ return FILTER_IGNORE; /* header row */
if (strcmp(details->fields[FieldCountry], d->country_name)!=0)
- return TRUE; /* wrong country */
+ return FILTER_IGNORE; /* wrong country */
if (!g_hash_table_lookup_extended (d->hash,
details->fields[FieldCounty],
g_strdup (details->fields[FieldCounty]));
}
- return TRUE;
+ return FILTER_IGNORE;
+}
+
+static FilterResult
+get_towers_by_county_cb (tower *details,
+ gpointer data)
+{
+ country_and_county *cac = (country_and_county *) data;
+
+ if ((!cac->county || strcmp (cac->county, details->fields[FieldCounty])==0) &&
+ (!cac->country || strcmp (cac->country, details->fields[FieldCountry])==0))
+ {
+ return FILTER_ACCEPT;
+ }
+ else
+ {
+ return FILTER_IGNORE;
+ }
}
-static gboolean
+static FilterResult
single_tower_cb (tower *details,
gpointer data)
{
gchar *str;
gint tenor_weight;
gchar *primary_key = (gchar*) data;
+ gchar *miles;
if (strcmp(details->fields[FieldPrimaryKey], primary_key)!=0)
{
/* not this one; keep going */
- return TRUE;
+ return FILTER_IGNORE;
}
tower_window = hildon_stackable_window_new ();
buttons = gtk_vbox_new (TRUE, 0);
menu = HILDON_APP_MENU (hildon_app_menu_new ());
+ miles = distance_to_tower(details);
+
+ add_table_field ("Distance", miles);
add_table_field ("Postcode", details->fields[FieldPostcode]);
add_table_field ("County", details->fields[FieldCounty]);
add_table_field ("Country", details->fields[FieldCountry]);
add_table_field ("Practice night", details->fields[FieldPracticeNight]);
add_table_field ("Bells", details->fields[FieldBells]);
+ g_free (miles);
+
tenor_weight = atoi (details->fields[FieldWt]);
str = g_strdup_printf("%dcwt %dqr %dlb in %s",
tenor_weight/112,
details->fields[FieldLong]);
gtk_widget_show_all (GTK_WIDGET (tower_window));
- return FALSE;
+ 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]);
+ 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,
gpointer data)
{
FILE *dove = fopen("/usr/share/belltower/dove.txt", "r");
result.fields[FieldCountry] = "England";
}
- if (!callback (&result, data))
+ switch (callback (&result, data))
{
+ case FILTER_IGNORE:
+ /* nothing */
+ break;
+
+ case FILTER_STOP:
fclose (dove);
return;
+
+ case FILTER_ACCEPT:
+ if (filter_results)
+ {
+ *filter_results = g_slist_append (*filter_results,
+ found_tower_new (&result));
+ }
}
result.serial++;
static void
show_tower (char *primary_key)
{
- parse_dove (single_tower_cb,
- primary_key);
+ parse_dove (single_tower_cb, NULL, primary_key);
+}
+
+static void
+show_towers_from_list (GSList *list)
+{
+ GtkWidget *dialog;
+ GtkWidget *selector;
+ gint result = -1;
+ GSList *cursor;
+ gchar foo[2048];
+
+ if (!list)
+ {
+ hildon_banner_show_information(window,
+ NULL,
+ "No towers found.");
+ return;
+ }
+
+ if (!list->next)
+ {
+ /* only one; don't bother showing the list */
+ hildon_banner_show_information(window,
+ NULL,
+ "One tower found.");
+ show_tower (list->data);
+
+ /* FIXME: and free the list */
+ return;
+ }
+
+ dialog = hildon_picker_dialog_new (GTK_WINDOW (window));
+ selector = hildon_touch_selector_new_text ();
+
+ for (cursor=list; cursor; cursor=cursor->next)
+ {
+ FoundTower* found = (FoundTower*) cursor->data;
+ hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector),
+ found->displayname);
+ }
+
+ hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (dialog),
+ HILDON_TOUCH_SELECTOR (selector));
+
+ gtk_widget_show_all (GTK_WIDGET (dialog));
+
+ if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK)
+ {
+ 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!=-1)
+ {
+ FoundTower *found = (FoundTower *) g_slist_nth_data (list, result);
+ show_tower (found->primarykey);
+ }
+
+ /* FIXME: and free the list */
}
static gint strcmp_f (gconstpointer a,
towers_by_subarea (gchar *area)
{
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 };
+ country_and_county cac = { area, NULL };
gtk_window_set_title (GTK_WINDOW (dialog), title);
g_free (title);
- parse_dove (get_counties_cb,
- &d);
+ parse_dove (get_counties_cb, NULL, &d);
g_hash_table_foreach (hash,
put_areas_into_list,
if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK)
{
- show_message (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
+ GSList *matches = NULL;
+ cac.county = strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
+
+ parse_dove (get_towers_by_county_cb,
+ &matches,
+ &cac);
+ g_free (cac.county);
+
+ show_towers_from_list (matches);
}
g_hash_table_unref (hash);
gtk_widget_destroy (GTK_WIDGET (dialog));
gtk_window_set_title (GTK_WINDOW (dialog), "Areas of the world");
- parse_dove (get_countries_cb,
- hash);
+ parse_dove (get_countries_cb, NULL, hash);
g_hash_table_foreach (hash,
put_areas_into_list,
static void
show_bookmarks (void)
{
- /* nothing */
}
static void
tower_search (void)
{
- /* nothing */
}
static void
recent_towers (void)
{
- show_tower ("NORTON HE");
}
int