view: Move weather API to interface GcalView

This allows us to get rid of similar code.
This commit is contained in:
Florian Brosch
2017-12-11 22:09:59 -02:00
committed by Georges Basile Stavracas Neto
parent d13473d3bc
commit d51d1ea2cd
8 changed files with 185 additions and 195 deletions
+93
View File
@@ -56,6 +56,18 @@ gcal_view_default_init (GcalViewInterface *iface)
GCAL_TYPE_MANAGER,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* GcalView::weather-service:
*
* The #GcalWeatherService of the view.
*/
g_object_interface_install_property (iface,
g_param_spec_object ("weather-service",
"The weather service",
"The weather service of the view",
GCAL_TYPE_WEATHER_SERVICE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* GcalView::create-event:
*
@@ -125,6 +137,87 @@ gcal_view_get_manager (GcalView *self)
return manager;
}
/**
* gcal_view_get_weather_service:
* @self: The #GcalView instance.
* @service: (nullable): The weather service to query.
*
* Sets the service to query for weather reports.
*/
GcalWeatherService*
gcal_view_get_weather_service (GcalView *self)
{
GcalWeatherService *service; /* unowned */
g_return_val_if_fail (GCAL_IS_VIEW (self), NULL);
g_object_get (self, "weather-service", &service, NULL);
g_object_unref (service);
return service;
}
/**
* gcal_view_set_weather_service:
* @self: The #GcalView instance.
*
* Returns: (transfer none): The internal weather service object.
*/
void
gcal_view_set_weather_service (GcalView *self,
GcalWeatherService *service)
{
g_return_if_fail (GCAL_IS_VIEW (self));
g_return_if_fail (service == NULL || GCAL_IS_WEATHER_SERVICE (service));
g_object_set (self, "weather-service", &service, NULL);
}
/**
* gcal_view_set_weather_service_impl_helper:
* @old_service: The views weather service field.
* @new_service: (nullable): The new weather service to use.
* @update_func: The function to call after updating weather.
* @weather_changed_cb: The views "weather-changed" handler
* @data: The data to pass to @update_func and @weather_changed_cb
*
* Internal implementation helper for
* gcal_view_set_weather_service().
*/
void
gcal_view_set_weather_service_impl_helper (GcalWeatherService **old_service,
GcalWeatherService *new_service,
GcalWeatherUpdateFunc update_func,
GCallback weather_changed_cb,
GtkWidget *data)
{
g_return_if_fail (old_service != NULL);
g_return_if_fail (*old_service == NULL || GCAL_IS_WEATHER_SERVICE (*old_service));
g_return_if_fail (new_service == NULL || GCAL_IS_WEATHER_SERVICE (new_service));
g_return_if_fail (update_func != NULL);
g_return_if_fail (weather_changed_cb != NULL);
g_return_if_fail (GTK_IS_WIDGET (data));
if (*old_service != new_service)
{
if (*old_service != NULL)
g_signal_handlers_disconnect_by_func (*old_service,
(GCallback) weather_changed_cb,
data);
g_set_object (old_service, new_service);
if (*old_service != NULL)
g_signal_connect (*old_service,
"weather-changed",
(GCallback) weather_changed_cb,
data);
update_func (data);
g_object_notify (G_OBJECT (data), "weather-service");
}
}
/**
* gcal_view_get_date:
* @view: a #GcalView