From 7150253ea59ef6e3688057abc98abe9f9f1daf80 Mon Sep 17 00:00:00 2001 From: David Shea Date: Tue, 26 Nov 2013 16:44:20 -0500 Subject: [PATCH 10/10] Allow the timezone highlight to be manually set separately from the location. Added selected-offset as a property and added get and set functions. Reworked the widget draw handler to allow drawing a highlight with no location. --- src/cc-timezone-map.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/cc-timezone-map.h | 2 ++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/cc-timezone-map.c b/src/cc-timezone-map.c index 1eab640..9d773ec 100644 --- a/src/cc-timezone-map.c +++ b/src/cc-timezone-map.c @@ -60,6 +60,7 @@ struct _CcTimezoneMapPrivate gint olsen_map_rowstride; gdouble selected_offset; + gboolean show_offset; gchar *watermark; @@ -78,6 +79,11 @@ enum LAST_SIGNAL }; +enum { + PROP_0, + PROP_SELECTED_OFFSET, +}; + static guint signals[LAST_SIGNAL]; @@ -513,8 +519,12 @@ cc_timezone_map_get_property (GObject *object, GValue *value, GParamSpec *pspec) { + CcTimezoneMap *map = CC_TIMEZONE_MAP(object); switch (property_id) { + case PROP_SELECTED_OFFSET: + g_value_set_double(value, map->priv->selected_offset); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -526,8 +536,12 @@ cc_timezone_map_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { + CcTimezoneMap *map = CC_TIMEZONE_MAP(object); switch (property_id) { + case PROP_SELECTED_OFFSET: + cc_timezone_map_set_selected_offset(map, g_value_get_double(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -783,7 +797,7 @@ cc_timezone_map_draw (GtkWidget *widget, cairo_stroke(cr); } - if (!priv->location) { + if (!priv->show_offset) { return TRUE; } @@ -814,6 +828,10 @@ cc_timezone_map_draw (GtkWidget *widget, g_object_unref (orig_hilight); } + if (!priv->location) { + return TRUE; + } + /* load pin icon */ pin = gdk_pixbuf_new_from_file (DATADIR "/pin.png", &err); @@ -860,6 +878,14 @@ cc_timezone_map_class_init (CcTimezoneMapClass *klass) widget_class->realize = cc_timezone_map_realize; widget_class->draw = cc_timezone_map_draw; + g_object_class_install_property(G_OBJECT_CLASS(klass), + PROP_SELECTED_OFFSET, + g_param_spec_string ("selected-offset", + "Selected offset", + "The selecect offset from GMT in hours", + "", + G_PARAM_READWRITE)); + signals[LOCATION_CHANGED] = g_signal_new ("location-changed", CC_TYPE_TIMEZONE_MAP, G_SIGNAL_RUN_FIRST, @@ -902,10 +928,12 @@ set_location (CcTimezoneMap *map, info = tz_info_from_location (priv->location); priv->selected_offset = tz_location_get_utc_offset (priv->location) / (60.0*60.0) + ((info->daylight) ? -1.0 : 0.0); + priv->show_offset = TRUE; tz_info_free (info); } else { + priv->show_offset = FALSE; priv->selected_offset = 0.0; } @@ -1099,6 +1127,9 @@ cc_timezone_map_init (CcTimezoneMap *self) priv->olsen_map_pixels = gdk_pixbuf_get_pixels (priv->olsen_map); priv->olsen_map_rowstride = gdk_pixbuf_get_rowstride (priv->olsen_map); + priv->selected_offset = 0.0; + priv->show_offset = FALSE; + priv->tzdb = tz_load_db (); g_signal_connect (self, "button-press-event", G_CALLBACK (button_press_event), @@ -1229,3 +1260,33 @@ cc_timezone_map_clear_location (CcTimezoneMap *map) set_location(map, NULL); gtk_widget_queue_draw (GTK_WIDGET (map)); } + +/** + * cc_timezone_map_get_selected_offset: + * @map: A #CcTimezoneMap + * + * Returns the currently selected offset in hours from GMT. + * + * Returns: The selected offset. + * + */ +gdouble cc_timezone_map_get_selected_offset(CcTimezoneMap *map) +{ + return map->priv->selected_offset; +} + +/** + * cc_timezone_map_set_selected_offset: + * @map: A #CcTimezoneMap + * @offset: The offset from GMT in hours + * + * Set the currently selected offset for the map and redraw the highlighted + * time zone. + */ +void cc_timezone_map_set_selected_offset (CcTimezoneMap *map, gdouble offset) +{ + map->priv->selected_offset = offset; + map->priv->show_offset = TRUE; + g_object_notify(G_OBJECT(map), "selected-offset"); + gtk_widget_queue_draw (GTK_WIDGET (map)); +} diff --git a/src/cc-timezone-map.h b/src/cc-timezone-map.h index 4737c0e..ba6bd37 100644 --- a/src/cc-timezone-map.h +++ b/src/cc-timezone-map.h @@ -83,6 +83,8 @@ const gchar * cc_timezone_map_get_timezone_at_coords (CcTimezoneMap *map, gdouble lon, gdouble lat); CcTimezoneLocation * cc_timezone_map_get_location (CcTimezoneMap *map); void cc_timezone_map_clear_location(CcTimezoneMap *map); +gdouble cc_timezone_map_get_selected_offset(CcTimezoneMap *map); +void cc_timezone_map_set_selected_offset (CcTimezoneMap *map, gdouble offset); G_END_DECLS -- 1.8.4.2