Permalink
Fetching contributors…
Cannot retrieve contributors at this time
757 lines (635 sloc) 27.1 KB
/* $Id$ */
/*
* Papadimitriou Spiros <spapadim+@cs.cmu.edu>
*
* This code released under the GNU GPL.
* Read the file COPYING for more information.
*
* Main status dialog
*
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <gio/gio.h>
#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE
#include "mateweather.h"
#include "mateweather-applet.h"
#include "mateweather-pref.h"
#include "mateweather-dialog.h"
struct _MateWeatherDialogPrivate {
GtkWidget* cond_location;
GtkWidget* cond_update;
GtkWidget* cond_cond;
GtkWidget* cond_sky;
GtkWidget* cond_temp;
GtkWidget* cond_dew;
GtkWidget* cond_humidity;
GtkWidget* cond_wind;
GtkWidget* cond_pressure;
GtkWidget* cond_vis;
GtkWidget* cond_apparent;
GtkWidget* cond_sunrise;
GtkWidget* cond_sunset;
GtkWidget* cond_image;
GtkWidget* forecast_text;
GtkWidget* radar_image;
MateWeatherApplet* applet;
};
enum {
PROP_0,
PROP_MATEWEATHER_APPLET,
};
G_DEFINE_TYPE(MateWeatherDialog, mateweather_dialog, GTK_TYPE_DIALOG);
#define MATEWEATHER_DIALOG_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE((obj), MATEWEATHER_TYPE_DIALOG, MateWeatherDialogPrivate))
#define MONOSPACE_FONT_SCHEMA "org.mate.interface"
#define MONOSPACE_FONT_KEY "monospace-font-name"
static void mateweather_dialog_save_geometry(MateWeatherDialog* dialog)
{
GSettings* settings;
int w, h;
settings = dialog->priv->applet->settings;
gtk_window_get_size(GTK_WINDOW(dialog), &w, &h);
#if 0
/* FIXME those keys are not in org.mate.weather! */
g_settings_set_int (settings, "dialog-width", w);
g_settings_set_int (settings, "dialog-height", h);
#endif
}
static void mateweather_dialog_load_geometry(MateWeatherDialog* dialog)
{
GSettings* settings;
int w, h;
settings = dialog->priv->applet->settings;
#if 0
/* FIXME those keys are not in org.mate.weather! */
w = g_settings_get_int (settings, "dialog-width");
h = g_settings_get_int (settings, "dialog-height");
if (w > 0 && h > 0)
{
gtk_window_resize(GTK_WINDOW(dialog), w, h);
}
#endif
}
static void response_cb(MateWeatherDialog* dialog, gint id, gpointer data)
{
if (id == GTK_RESPONSE_OK) {
mateweather_update (dialog->priv->applet);
mateweather_dialog_update (dialog);
} else {
gtk_widget_destroy (GTK_WIDGET(dialog));
}
}
static void link_cb(GtkButton* button, gpointer data)
{
#if GTK_CHECK_VERSION (3, 22, 0)
gtk_show_uri_on_window (NULL,
"http://www.weather.com/",
gtk_get_current_event_time (),
NULL);
#else
gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET (button)),
"http://www.weather.com/",
gtk_get_current_event_time (),
NULL);
#endif
}
static gchar* replace_multiple_new_lines(gchar* s)
{
gchar *prev_s = s;
gint count = 0;
gint i;
if (s == NULL) {
return s;
}
for (;*s != '\0';s++) {
count = 0;
if (*s == '\n') {
s++;
while (*s == '\n' || *s == ' ') {
count++;
s++;
}
}
for (i = count; i > 1; i--) {
*(s - i) = ' ';
}
}
return prev_s;
}
static void mateweather_dialog_create(MateWeatherDialog* dialog)
{
MateWeatherDialogPrivate *priv;
MateWeatherApplet *gw_applet;
GtkWidget *weather_vbox;
GtkWidget *weather_notebook;
GtkWidget *cond_hbox;
GtkWidget *cond_grid;
GtkWidget *cond_location_lbl;
GtkWidget *cond_update_lbl;
GtkWidget *cond_temp_lbl;
GtkWidget *cond_cond_lbl;
GtkWidget *cond_sky_lbl;
GtkWidget *cond_wind_lbl;
GtkWidget *cond_humidity_lbl;
GtkWidget *cond_pressure_lbl;
GtkWidget *cond_vis_lbl;
GtkWidget *cond_dew_lbl;
GtkWidget *cond_apparent_lbl;
GtkWidget *cond_sunrise_lbl;
GtkWidget *cond_sunset_lbl;
GtkWidget *cond_frame_alignment;
GtkWidget *current_note_lbl;
GtkWidget *forecast_note_lbl;
GtkWidget *radar_note_lbl;
GtkWidget *radar_vbox;
GtkWidget *radar_link_btn;
GtkWidget *radar_link_alignment;
GtkWidget *forecast_hbox;
GtkWidget *ebox;
GtkWidget *scrolled_window;
GtkWidget *imagescroll_window;
priv = dialog->priv;
gw_applet = priv->applet;
g_object_set (dialog, "destroy-with-parent", TRUE, NULL);
gtk_window_set_title (GTK_WINDOW (dialog), _("Details"));
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
_("_Update"), GTK_RESPONSE_OK,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
NULL);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), 2);
gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
if (gw_applet->mateweather_pref.radar_enabled)
gtk_window_set_default_size (GTK_WINDOW (dialog), 570,440);
else
gtk_window_set_default_size (GTK_WINDOW (dialog), 590, 340);
gtk_window_set_screen (GTK_WINDOW (dialog),
gtk_widget_get_screen (GTK_WIDGET (gw_applet->applet)));
mateweather_dialog_load_geometry (dialog);
/* Must come after load geometry, otherwise it will get reset. */
gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE);
weather_vbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
gtk_widget_show (weather_vbox);
weather_notebook = gtk_notebook_new ();
gtk_container_set_border_width (GTK_CONTAINER (weather_notebook), 5);
gtk_widget_show (weather_notebook);
gtk_box_pack_start (GTK_BOX (weather_vbox), weather_notebook, TRUE, TRUE, 0);
cond_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
gtk_widget_show (cond_hbox);
gtk_container_add (GTK_CONTAINER (weather_notebook), cond_hbox);
gtk_container_set_border_width (GTK_CONTAINER (cond_hbox), 4);
cond_grid = gtk_grid_new ();
gtk_widget_show (cond_grid);
gtk_box_pack_start (GTK_BOX (cond_hbox), cond_grid, TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (cond_grid), 12);
gtk_grid_set_row_spacing (GTK_GRID (cond_grid), 6);
gtk_grid_set_column_spacing (GTK_GRID (cond_grid), 12);
cond_location_lbl = gtk_label_new (_("City:"));
gtk_widget_show (cond_location_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_location_lbl, 0, 0, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_location_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_location_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_location_lbl), 0.0, 0.5);
#endif
cond_update_lbl = gtk_label_new (_("Last update:"));
gtk_widget_show (cond_update_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_update_lbl, 0, 1, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_update_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_update_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_update_lbl), 0.0, 0.5);
#endif
cond_cond_lbl = gtk_label_new (_("Conditions:"));
gtk_widget_show (cond_cond_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_cond_lbl, 0, 2, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_cond_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_cond_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_cond_lbl), 0.0, 0.5);
#endif
cond_sky_lbl = gtk_label_new (_("Sky:"));
gtk_widget_show (cond_sky_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_sky_lbl, 0, 3, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_sky_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_sky_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_sky_lbl), 0.0, 0.5);
#endif
cond_temp_lbl = gtk_label_new (_("Temperature:"));
gtk_widget_show (cond_temp_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_temp_lbl, 0, 4, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_temp_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_temp_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_temp_lbl), 0.0, 0.5);
#endif
cond_apparent_lbl = gtk_label_new (_("Feels like:"));
gtk_widget_show (cond_apparent_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_apparent_lbl, 0, 5, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_apparent_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_apparent_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_apparent_lbl), 0.0, 0.5);
#endif
cond_dew_lbl = gtk_label_new (_("Dew point:"));
gtk_widget_show (cond_dew_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_dew_lbl, 0, 6, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_dew_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_dew_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_dew_lbl), 0.0, 0.5);
#endif
cond_humidity_lbl = gtk_label_new (_("Relative humidity:"));
gtk_widget_show (cond_humidity_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_humidity_lbl, 0, 7, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_humidity_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_humidity_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_humidity_lbl), 0.0, 0.5);
#endif
cond_wind_lbl = gtk_label_new (_("Wind:"));
gtk_widget_show (cond_wind_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_wind_lbl, 0, 8, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_wind_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_wind_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_wind_lbl), 0.0, 0.5);
#endif
cond_pressure_lbl = gtk_label_new (_("Pressure:"));
gtk_widget_show (cond_pressure_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_pressure_lbl, 0, 9, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_pressure_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_pressure_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_pressure_lbl), 0.0, 0.5);
#endif
cond_vis_lbl = gtk_label_new (_("Visibility:"));
gtk_widget_show (cond_vis_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_vis_lbl, 0, 10, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_vis_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_vis_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_vis_lbl), 0.0, 0.5);
#endif
cond_sunrise_lbl = gtk_label_new (_("Sunrise:"));
gtk_widget_show (cond_sunrise_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_sunrise_lbl, 0, 11, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_sunrise_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_sunrise_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_sunrise_lbl), 0.0, 0.5);
#endif
cond_sunset_lbl = gtk_label_new (_("Sunset:"));
gtk_widget_show (cond_sunset_lbl);
gtk_grid_attach (GTK_GRID (cond_grid), cond_sunset_lbl, 0, 12, 1, 1);
gtk_label_set_justify (GTK_LABEL (cond_sunset_lbl), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (cond_sunset_lbl), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (cond_sunset_lbl), 0.0, 0.5);
#endif
priv->cond_location = gtk_label_new ("");
gtk_widget_show (priv->cond_location);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_location, 1, 0, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_location), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_location), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_location), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_location), 0.0, 0.5);
#endif
priv->cond_update = gtk_label_new ("");
gtk_widget_show (priv->cond_update);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_update, 1, 1, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_update), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_update), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_update), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_update), 0.0, 0.5);
#endif
priv->cond_cond = gtk_label_new ("");
gtk_widget_show (priv->cond_cond);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_cond, 1, 2, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_cond), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_cond), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_cond), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_cond), 0.0, 0.5);
#endif
priv->cond_sky = gtk_label_new ("");
gtk_widget_show (priv->cond_sky);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_sky, 1, 3, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_sky), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_sky), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_sky), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_sky), 0.0, 0.5);
#endif
priv->cond_temp = gtk_label_new ("");
gtk_widget_show (priv->cond_temp);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_temp, 1, 4, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_temp), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_temp), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_temp), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_temp), 0.0, 0.5);
#endif
priv->cond_apparent = gtk_label_new ("");
gtk_widget_show (priv->cond_apparent);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_apparent, 1, 5, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_apparent), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_apparent), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_apparent), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_apparent), 0.0, 0.5);
#endif
priv->cond_dew = gtk_label_new ("");
gtk_widget_show (priv->cond_dew);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_dew, 1, 6, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_dew), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_dew), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_dew), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_dew), 0.0, 0.5);
#endif
priv->cond_humidity = gtk_label_new ("");
gtk_widget_show (priv->cond_humidity);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_humidity, 1, 7, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_humidity), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_humidity), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_humidity), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_humidity), 0.0, 0.5);
#endif
priv->cond_wind = gtk_label_new ("");
gtk_widget_show (priv->cond_wind);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_wind, 1, 8, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_wind), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_wind), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_wind), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_wind), 0.0, 0.5);
#endif
priv->cond_pressure = gtk_label_new ("");
gtk_widget_show (priv->cond_pressure);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_pressure, 1, 9, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_pressure), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_pressure), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_pressure), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_pressure), 0.0, 0.5);
#endif
priv->cond_vis = gtk_label_new ("");
gtk_widget_show (priv->cond_vis);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_vis, 1, 10, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_vis), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_vis), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_vis), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_vis), 0.0, 0.5);
#endif
priv->cond_sunrise = gtk_label_new ("");
gtk_widget_show (priv->cond_sunrise);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_sunrise, 1, 11, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_sunrise), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_sunrise), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_sunrise), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_sunrise), 0.0, 0.5);
#endif
priv->cond_sunset = gtk_label_new ("");
gtk_widget_show (priv->cond_sunset);
gtk_grid_attach (GTK_GRID (cond_grid), priv->cond_sunset, 1, 12, 1, 1);
gtk_label_set_selectable (GTK_LABEL (priv->cond_sunset), TRUE);
gtk_label_set_justify (GTK_LABEL (priv->cond_sunset), GTK_JUSTIFY_LEFT);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (priv->cond_sunset), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (priv->cond_sunset), 0.0, 0.5);
#endif
cond_frame_alignment = gtk_alignment_new (0.5, 0, 1, 0);
gtk_widget_show (cond_frame_alignment);
gtk_box_pack_end (GTK_BOX (cond_hbox), cond_frame_alignment, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (cond_frame_alignment), 2);
priv->cond_image = gtk_image_new_from_icon_name ("stock-unknown", GTK_ICON_SIZE_BUTTON);
gtk_widget_show (priv->cond_image);
gtk_container_add (GTK_CONTAINER (cond_frame_alignment), priv->cond_image);
current_note_lbl = gtk_label_new (_("Current Conditions"));
gtk_widget_show (current_note_lbl);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (weather_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (weather_notebook), 0), current_note_lbl);
if (gw_applet->mateweather_pref.location->zone_valid) {
forecast_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_set_border_width (GTK_CONTAINER (forecast_hbox), 12);
gtk_widget_show (forecast_hbox);
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_SHADOW_ETCHED_IN);
priv->forecast_text = gtk_text_view_new ();
set_access_namedesc (priv->forecast_text, _("Forecast Report"), _("See the ForeCast Details"));
gtk_container_add (GTK_CONTAINER (scrolled_window), priv->forecast_text);
gtk_text_view_set_editable (GTK_TEXT_VIEW (priv->forecast_text), FALSE);
gtk_text_view_set_left_margin (GTK_TEXT_VIEW (priv->forecast_text), 6);
gtk_widget_show (priv->forecast_text);
gtk_widget_show (scrolled_window);
gtk_box_pack_start (GTK_BOX (forecast_hbox), scrolled_window, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER (weather_notebook), forecast_hbox);
forecast_note_lbl = gtk_label_new (_("Forecast"));
gtk_widget_show (forecast_note_lbl);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (weather_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (weather_notebook), 1), forecast_note_lbl);
}
if (gw_applet->mateweather_pref.radar_enabled) {
radar_note_lbl = gtk_label_new_with_mnemonic (_("Radar Map"));
gtk_widget_show (radar_note_lbl);
radar_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
gtk_widget_show (radar_vbox);
gtk_notebook_append_page (GTK_NOTEBOOK (weather_notebook), radar_vbox, radar_note_lbl);
gtk_container_set_border_width (GTK_CONTAINER (radar_vbox), 6);
priv->radar_image = gtk_image_new ();
imagescroll_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (imagescroll_window),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (imagescroll_window),
GTK_SHADOW_ETCHED_IN);
ebox = gtk_event_box_new ();
gtk_widget_show (ebox);
gtk_container_add (GTK_CONTAINER (imagescroll_window),ebox);
gtk_box_pack_start (GTK_BOX (radar_vbox), imagescroll_window, TRUE, TRUE, 0);
gtk_widget_show (priv->radar_image);
gtk_widget_show (imagescroll_window);
gtk_container_add (GTK_CONTAINER (ebox), priv->radar_image);
radar_link_alignment = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_widget_show (radar_link_alignment);
gtk_box_pack_start (GTK_BOX (radar_vbox), radar_link_alignment, FALSE, FALSE, 0);
radar_link_btn = gtk_button_new_with_mnemonic (_("_Visit Weather.com"));
set_access_namedesc (radar_link_btn, _("Visit Weather.com"), _("Click to Enter Weather.com"));
gtk_widget_set_size_request (radar_link_btn, 450, -2);
gtk_widget_show (radar_link_btn);
if (!g_settings_get_boolean (gw_applet->settings, "use-custom-radar-url"))
gtk_container_add (GTK_CONTAINER (radar_link_alignment), radar_link_btn);
g_signal_connect (G_OBJECT (radar_link_btn), "clicked",
G_CALLBACK (link_cb), NULL);
}
g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (response_cb), NULL);
}
static PangoFontDescription* get_system_monospace_font(void)
{
PangoFontDescription *desc = NULL;
GSettings *settings;
char *name;
settings = g_settings_new (MONOSPACE_FONT_SCHEMA);
name = g_settings_get_string (settings, MONOSPACE_FONT_KEY);
if (name) {
desc = pango_font_description_from_string (name);
g_free (name);
}
g_object_unref (settings);
return desc;
}
void mateweather_dialog_update(MateWeatherDialog* dialog)
{
MateWeatherDialogPrivate *priv;
MateWeatherApplet *gw_applet;
gchar *forecast;
GtkTextBuffer *buffer;
PangoFontDescription *font_desc;
const gchar *icon_name;
priv = dialog->priv;
gw_applet = priv->applet;
/* Check for parallel network update in progress */
if(gw_applet->mateweather_info == NULL)
return;
/* Update icon */
icon_name = weather_info_get_icon_name (gw_applet->mateweather_info);
gtk_image_set_from_icon_name (GTK_IMAGE (priv->cond_image),
icon_name, GTK_ICON_SIZE_DIALOG);
/* Update current condition fields and forecast */
gtk_label_set_text(GTK_LABEL(priv->cond_location), weather_info_get_location_name(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_update), weather_info_get_update(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_cond), weather_info_get_conditions(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_sky), weather_info_get_sky(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_temp), weather_info_get_temp(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_apparent), weather_info_get_apparent(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_dew), weather_info_get_dew(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_humidity), weather_info_get_humidity(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_wind), weather_info_get_wind(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_pressure), weather_info_get_pressure(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_vis), weather_info_get_visibility(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_sunrise), weather_info_get_sunrise(gw_applet->mateweather_info));
gtk_label_set_text(GTK_LABEL(priv->cond_sunset), weather_info_get_sunset(gw_applet->mateweather_info));
/* Update forecast */
if (gw_applet->mateweather_pref.location->zone_valid) {
font_desc = get_system_monospace_font ();
if (font_desc) {
gtk_widget_override_font (priv->forecast_text, font_desc);
pango_font_description_free (font_desc);
}
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->forecast_text));
forecast = g_strdup(weather_info_get_forecast(gw_applet->mateweather_info));
if (forecast) {
forecast = g_strstrip(replace_multiple_new_lines(forecast));
gtk_text_buffer_set_text(buffer, forecast, -1);
g_free(forecast);
} else {
gtk_text_buffer_set_text(buffer, _("Forecast not currently available for this location."), -1);
}
}
/* Update radar map */
if (gw_applet->mateweather_pref.radar_enabled) {
GdkPixbufAnimation *radar;
radar = weather_info_get_radar (gw_applet->mateweather_info);
if (radar) {
gtk_image_set_from_animation (GTK_IMAGE (priv->radar_image), radar);
}
}
}
static void mateweather_dialog_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec)
{
MateWeatherDialog *dialog = MATEWEATHER_DIALOG (object);
switch (prop_id) {
case PROP_MATEWEATHER_APPLET:
dialog->priv->applet = g_value_get_pointer (value);
break;
}
}
static void mateweather_dialog_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
{
MateWeatherDialog *dialog = MATEWEATHER_DIALOG (object);
switch (prop_id) {
case PROP_MATEWEATHER_APPLET:
g_value_set_pointer (value, dialog->priv->applet);
break;
}
}
static void mateweather_dialog_init(MateWeatherDialog* self)
{
self->priv = MATEWEATHER_DIALOG_GET_PRIVATE (self);
}
static GObject* mateweather_dialog_constructor(GType type, guint n_construct_params, GObjectConstructParam* construct_params)
{
GObject *object;
MateWeatherDialog *self;
object = G_OBJECT_CLASS (mateweather_dialog_parent_class)->
constructor (type, n_construct_params, construct_params);
self = MATEWEATHER_DIALOG (object);
mateweather_dialog_create (self);
mateweather_dialog_update (self);
return object;
}
GtkWidget* mateweather_dialog_new(MateWeatherApplet* applet)
{
return g_object_new(MATEWEATHER_TYPE_DIALOG,
"mateweather-applet", applet,
NULL);
}
static void mateweather_dialog_unrealize(GtkWidget* widget)
{
MateWeatherDialog* self = MATEWEATHER_DIALOG(widget);
mateweather_dialog_save_geometry(self);
GTK_WIDGET_CLASS(mateweather_dialog_parent_class)->unrealize(widget);
}
static void mateweather_dialog_class_init(MateWeatherDialogClass* klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
mateweather_dialog_parent_class = g_type_class_peek_parent (klass);
object_class->set_property = mateweather_dialog_set_property;
object_class->get_property = mateweather_dialog_get_property;
object_class->constructor = mateweather_dialog_constructor;
widget_class->unrealize = mateweather_dialog_unrealize;
/* This becomes an OBJECT property when MateWeatherApplet is redone */
g_object_class_install_property(object_class, PROP_MATEWEATHER_APPLET, g_param_spec_pointer ("mateweather-applet", "MateWeather Applet", "The MateWeather Applet", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_type_class_add_private(klass, sizeof(MateWeatherDialogPrivate));
}