From bd3d3bf32c5d9d1a5b7c9f1645171d38677e92f6 Mon Sep 17 00:00:00 2001 From: Thomas Thurman Date: Sun, 30 Aug 2009 17:09:55 -0400 Subject: [PATCH] first pass at many/few distinction --- TODO | 2 ++ belltower.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 100 insertions(+), 13 deletions(-) diff --git a/TODO b/TODO index 35a8dc4..eb775a9 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,6 @@ * Window name on tower pick lists +* Areas of the world with many/few towers * Sharp and flat signs * Add my name to the credits list * Switch names in the buttons in the credits list around ("view..." should be subtext) +* Download Dove automatically diff --git a/belltower.c b/belltower.c index f571278..6787255 100644 --- a/belltower.c +++ b/belltower.c @@ -25,6 +25,13 @@ #define CONFIG_DIRECTORY "/home/user/.config/belltower" #define CONFIG_FILENAME CONFIG_DIRECTORY "/belltower.ini" +/** + * Somewhat arbitrary minimum number of belltowers in + * one country for the country to be considered to have + * "many" belltowers. + */ +#define MANY_BELLTOWERS 10 + GtkWidget *window; LocationGPSDevice *device; GKeyFile *static_content; @@ -361,17 +368,24 @@ get_countries_cb (tower *details, gpointer data) { GHashTable *hash = (GHashTable *)data; + gpointer value; if (details->serial==0) return TRUE; /* header row */ if (!g_hash_table_lookup_extended (hash, - details->fields[FieldCountry], - NULL, NULL)) + details->fields[FieldCountry], + NULL, &value)) { g_hash_table_insert (hash, g_strdup(details->fields[FieldCountry]), - g_strdup (details->fields[FieldCountry])); + GINT_TO_POINTER (0)); + } + else + { + g_hash_table_replace (hash, + g_strdup(details->fields[FieldCountry]), + GINT_TO_POINTER (GPOINTER_TO_INT (value)+1)); } return FILTER_IGNORE; @@ -972,23 +986,73 @@ towers_by_subarea (gchar *area) gtk_widget_destroy (GTK_WIDGET (dialog)); } +/** + * Maps a hash table from country names to counts of belltowers to a + * newly-created hash table mapping country names to display + * names, containing only those countries which have many + * (or few) belltowers. + * + * \param source the source table + * \param want_many true if you want countries with many belltowers; + * false if you want countries with few. + */ +static GHashTable* +get_countries_with_many (GHashTable *source, + gboolean want_many) +{ + GHashTable *result = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + NULL); + GList *countries = g_hash_table_get_keys (source); + GList *cursor = countries; + + while (cursor) + { + gboolean has_many = + GPOINTER_TO_INT (g_hash_table_lookup (source, + cursor->data)) >= MANY_BELLTOWERS; + + if (has_many == want_many) + { + g_hash_table_insert (result, + g_strdup (cursor->data), + g_strdup (cursor->data)); + } + + cursor = cursor->next; + } + + g_list_free (countries); + return result; +} + +#define COUNTRIES_WITH_MANY "Countries with many belltowers" +#define COUNTRIES_WITH_FEW "Countries with few belltowers" + static void -towers_by_area (void) +towers_by_area_with_many (gboolean countries_with_many) { 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); + GHashTable *countries_to_counts = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + NULL); + GHashTable *country_names; GSList *list = NULL, *cursor; gchar *result = NULL; - gtk_window_set_title (GTK_WINDOW (dialog), "Areas of the world"); + gtk_window_set_title (GTK_WINDOW (dialog), + countries_with_many? + COUNTRIES_WITH_MANY : COUNTRIES_WITH_FEW); - parse_dove (get_countries_cb, NULL, hash); + parse_dove (get_countries_cb, NULL, countries_to_counts); - g_hash_table_foreach (hash, + country_names = get_countries_with_many (countries_to_counts, + countries_with_many); + + g_hash_table_foreach (country_names, put_areas_into_list, &list); @@ -998,6 +1062,12 @@ towers_by_area (void) cursor->data); } + if (countries_with_many) + { + hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector), + COUNTRIES_WITH_FEW); + } + hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (dialog), HILDON_TOUCH_SELECTOR (selector)); @@ -1007,16 +1077,31 @@ towers_by_area (void) { result = g_strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector))); } - g_hash_table_unref (hash); + + g_hash_table_unref (countries_to_counts); + g_hash_table_unref (country_names); gtk_widget_destroy (GTK_WIDGET (dialog)); if (result) { - towers_by_subarea (result); + if (strcmp (result, COUNTRIES_WITH_FEW)==0) + towers_by_area_with_many (FALSE); + else + towers_by_subarea (result); + g_free (result); } } +/** + * Shows all the towers in areas with many towers. + */ +static void +towers_by_area (void) +{ + towers_by_area_with_many (TRUE); +} + static void show_bookmarks (void) { -- 1.7.9.5