#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;
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;
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);
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));
{
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)
{