aboutsummaryrefslogtreecommitdiffstats
path: root/modules/cal-config-weather/evolution-cal-config-weather.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/cal-config-weather/evolution-cal-config-weather.c')
-rw-r--r--modules/cal-config-weather/evolution-cal-config-weather.c85
1 files changed, 21 insertions, 64 deletions
diff --git a/modules/cal-config-weather/evolution-cal-config-weather.c b/modules/cal-config-weather/evolution-cal-config-weather.c
index 587be55f15..5387fe16c4 100644
--- a/modules/cal-config-weather/evolution-cal-config-weather.c
+++ b/modules/cal-config-weather/evolution-cal-config-weather.c
@@ -41,7 +41,6 @@ typedef struct _Context Context;
struct _Context {
GtkWidget *location_entry;
- GtkWidget *units_combo;
};
/* Forward Declarations */
@@ -56,7 +55,6 @@ static void
cal_config_weather_context_free (Context *context)
{
g_object_unref (context->location_entry);
- g_object_unref (context->units_combo);
g_slice_free (Context, context);
}
@@ -70,7 +68,7 @@ cal_config_weather_location_to_string (GBinding *binding,
GWeatherLocation *location;
gchar *string = NULL;
- location = g_value_get_pointer (source_value);
+ location = g_value_get_boxed (source_value);
if (location != NULL) {
const gchar *code;
@@ -87,29 +85,20 @@ cal_config_weather_location_to_string (GBinding *binding,
return TRUE;
}
-/* XXX This is a private libgweather constant.
- * The value may change at any time. */
-#define GWEATHER_LOCATION_ENTRY_COL_LOCATION 1
-
static gboolean
cal_config_weather_string_to_location (GBinding *binding,
const GValue *source_value,
GValue *target_value,
gpointer user_data)
{
- GObject *target;
- GWeatherLocation *match = NULL;
- GtkEntryCompletion *completion;
- GtkTreeModel *model;
- GtkTreeIter iter;
+ GWeatherLocation *world;
+ GWeatherLocation *match, *start;
const gchar *string;
const gchar *city_name;
const gchar *code;
gchar **tokens;
- /* XXX This is a bit convoluted because libgweather lacks a
- * GWeatherLocation lookup function. The algorithm is
- * copied from gweather_location_entry_set_city(). */
+ world = user_data;
string = g_value_get_string (source_value);
@@ -127,42 +116,28 @@ cal_config_weather_string_to_location (GBinding *binding,
code = tokens[0];
city_name = tokens[1];
- target = g_binding_get_target (binding);
- completion = gtk_entry_get_completion (GTK_ENTRY (target));
- model = gtk_entry_completion_get_model (completion);
-
- gtk_tree_model_get_iter_first (model, &iter);
-
- do {
- GWeatherLocation *location;
- const gchar *cmp_code;
- gchar *cmp_city_name;
-
- gtk_tree_model_get (
- model, &iter,
- GWEATHER_LOCATION_ENTRY_COL_LOCATION,
- &location, -1);
-
- /* Does the station code match? */
- cmp_code = gweather_location_get_code (location);
- if (g_strcmp0 (code, cmp_code) != 0)
- continue;
+ match = start = gweather_location_find_by_station_code (world, code);
+ while (match) {
+ char *cmp_city_name;
/* Does the city name match? */
- cmp_city_name = gweather_location_get_city_name (location);
- if (g_strcmp0 (city_name, cmp_city_name) != 0) {
+ cmp_city_name = gweather_location_get_city_name (match);
+ if (g_strcmp0 (city_name, cmp_city_name) == 0) {
g_free (cmp_city_name);
- continue;
+ break;
}
g_free (cmp_city_name);
- /* We found a match! */
- match = location;
- break;
+ /* No match, try parent */
+ match = gweather_location_get_parent (match);
+ }
- } while (gtk_tree_model_iter_next (model, &iter));
+ if (match == NULL) {
+ /* No exact match, use start instead */
+ match = start;
+ }
- g_value_set_pointer (target_value, match);
+ g_value_set_boxed (target_value, match);
g_strfreev (tokens);
@@ -217,23 +192,8 @@ cal_config_weather_insert_widgets (ESourceConfigBackend *backend,
context->location_entry = g_object_ref (widget);
gtk_widget_show (widget);
- /* This must follow the order of ESourceWeatherUnits. */
- widget = gtk_combo_box_text_new ();
- gtk_combo_box_text_append_text (
- GTK_COMBO_BOX_TEXT (widget),
- _("Metric (Celsius, cm, etc)"));
- gtk_combo_box_text_append_text (
- GTK_COMBO_BOX_TEXT (widget),
- _("Imperial (Fahrenheit, inches, etc)"));
- e_source_config_insert_widget (
- config, scratch_source, _("Units:"), widget);
- context->units_combo = g_object_ref (widget);
- gtk_widget_show (widget);
-
e_source_config_add_refresh_interval (config, scratch_source);
- gweather_location_unref (world);
-
extension_name = E_SOURCE_EXTENSION_WEATHER_BACKEND;
extension = e_source_get_extension (scratch_source, extension_name);
@@ -244,13 +204,10 @@ cal_config_weather_insert_widgets (ESourceConfigBackend *backend,
G_BINDING_SYNC_CREATE,
cal_config_weather_string_to_location,
cal_config_weather_location_to_string,
- NULL, (GDestroyNotify) NULL);
+ gweather_location_ref (world),
+ (GDestroyNotify) gweather_location_unref);
- g_object_bind_property (
- extension, "units",
- context->units_combo, "active",
- G_BINDING_BIDIRECTIONAL |
- G_BINDING_SYNC_CREATE);
+ gweather_location_unref (world);
}
static gboolean