weather-summary.c 14.4 KB
Newer Older
1 2
/*  $Id$
 *
Nick Schermer's avatar
Nick Schermer committed
3
 *  Copyright (c) 2003-2007 Xfce Development Team
4
 *
5 6 7
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
8 9 10 11 12
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU Library General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU General Public License
16 17 18 19 20
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
21
#include <config.h>
22 23 24 25
#endif

#include <libxfcegui4/libxfcegui4.h>

Nick Schermer's avatar
Nick Schermer committed
26 27 28
#include "weather-parsers.h"
#include "weather-data.h"
#include "weather.h"
29

Nick Schermer's avatar
Nick Schermer committed
30 31 32
#include "weather-summary.h"
#include "weather-translate.h"
#include "weather-icon.h"
33

34 35


36 37 38 39 40 41 42 43 44 45 46 47
#define BORDER                           8
#define APPEND_BTEXT(text)               gtk_text_buffer_insert_with_tags(GTK_TEXT_BUFFER(buffer),\
                                                                          &iter, text, -1, btag, NULL);
#define APPEND_TEXT_ITEM_REAL(text)      gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), \
                                                                &iter, text, -1);\
                                         g_free (value);
#define APPEND_TEXT_ITEM(text, item)     value = g_strdup_printf("\t%s: %s %s\n",\
                                                                 text,\
                                                                 get_data(data, item),\
                                                                 get_unit(unit, item));\
                                         APPEND_TEXT_ITEM_REAL(value);

48 49


50 51
static GtkTooltips *tooltips = NULL;

52 53


54
static GtkWidget *
55 56
create_summary_tab (xml_weather *data,
                    units        unit)
57
{
58
  GtkTextBuffer *buffer;
59 60 61 62
  GtkTextIter    iter;
  GtkTextTag    *btag;
  gchar         *value, *date, *wind, *sun_val, *vis;
  GtkWidget     *view, *frame, *scrolled;
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82

  view = gtk_text_view_new ();
  gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
  frame = gtk_frame_new (NULL);
  scrolled = gtk_scrolled_window_new (NULL, NULL);

  gtk_container_add (GTK_CONTAINER (scrolled), view);
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

  gtk_container_set_border_width (GTK_CONTAINER (frame), BORDER);
  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
  gtk_container_add (GTK_CONTAINER (frame), scrolled);

  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
  gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (buffer), &iter, 0);
  btag =
    gtk_text_buffer_create_tag (buffer, NULL, "weight", PANGO_WEIGHT_BOLD,
                                NULL);

83 84
  /* head */
  value = g_strdup_printf (_("Weather report for: %s.\n\n"), get_data (data, DNAM));
85 86 87 88
  APPEND_BTEXT (value);
  g_free (value);

  date = translate_lsup (get_data (data, LSUP));
89 90 91
  value = g_strdup_printf (_("Observation station located in %s\nLast update: %s.\n"),
                           get_data (data, OBST), date ? date : get_data (data, LSUP));
  g_free (date);
92 93
  APPEND_TEXT_ITEM_REAL (value);

94
  /* Temperature */
95 96 97 98 99
  APPEND_BTEXT (_("\nTemperature\n"));
  APPEND_TEXT_ITEM (_("Temperature"), TEMP);
  APPEND_TEXT_ITEM (_("Windchill"), FLIK);

  /* special case for TRANS because of translate_desc */
100
  value = g_strdup_printf ("\t%s: %s\n", _("Description"),
101 102 103 104
                           translate_desc (get_data (data, TRANS)));
  APPEND_TEXT_ITEM_REAL (value);
  APPEND_TEXT_ITEM (_("Dew point"), DEWP);

105
  /* Wind */
106 107 108 109
  APPEND_BTEXT (_("\nWind\n"));
  wind = translate_wind_speed (get_data (data, WIND_SPEED), unit);
  value = g_strdup_printf ("\t%s: %s\n", _("Speed"), wind);
  g_free (wind);
110
  APPEND_TEXT_ITEM_REAL (value);
111 112

  wind = translate_wind_direction (get_data (data, WIND_DIRECTION));
113 114 115
  value = g_strdup_printf ("\t%s: %s\n", _("Direction"),
                           wind ? wind : get_data (data, WIND_DIRECTION));
  g_free (wind);
116 117 118 119 120
  APPEND_TEXT_ITEM_REAL (value);

  wind = translate_wind_speed (get_data (data, WIND_GUST), unit);
  value = g_strdup_printf ("\t%s: %s\n", _("Gusts"), wind);
  g_free (wind);
121
  APPEND_TEXT_ITEM_REAL (value);
122

123
  /* UV */
124 125
  APPEND_BTEXT (_("\nUV\n"));
  APPEND_TEXT_ITEM (_("Index"), UV_INDEX);
126
  value = g_strdup_printf ("\t%s: %s\n", _("Risk"),
127 128 129
                           translate_risk (get_data (data, UV_TRANS)));
  APPEND_TEXT_ITEM_REAL (value);

130
  /* Atmospheric pressure */
131 132 133
  APPEND_BTEXT (_("\nAtmospheric pressure\n"));
  APPEND_TEXT_ITEM (_("Pressure"), BAR_R);

134
  value = g_strdup_printf ("\t%s: %s\n",  _("State"),
135 136 137
                           translate_bard (get_data (data, BAR_D)));
  APPEND_TEXT_ITEM_REAL (value);

138
  /* Sun */
139 140 141
  APPEND_BTEXT (_("\nSun\n"));
  sun_val = translate_time (get_data (data, SUNR));
  value = g_strdup_printf ("\t%s: %s\n",
142 143
                           _("Rise"), sun_val ? sun_val : get_data (data, SUNR));
  g_free (sun_val);
144 145 146 147
  APPEND_TEXT_ITEM_REAL (value);

  sun_val = translate_time (get_data (data, SUNS));
  value = g_strdup_printf ("\t%s: %s\n",
148 149
                           _("Set"), sun_val ? sun_val : get_data (data, SUNS));
  g_free (sun_val);
150 151
  APPEND_TEXT_ITEM_REAL (value);

152
  /* Other */
153 154 155 156 157
  APPEND_BTEXT (_("\nOther\n"));
  APPEND_TEXT_ITEM (_("Humidity"), HMID);
  vis = translate_visibility (get_data (data, VIS), unit);
  value = g_strdup_printf ("\t%s: %s\n", _("Visibility"), vis);
  g_free (vis);
158
  APPEND_TEXT_ITEM_REAL (value);
159 160

  return frame;
161 162
}

163 164


165
static GtkWidget *
166 167
make_forecast (xml_dayf *weatherdata,
               units     unit)
168
{
169 170
  GtkWidget *item_vbox, *temp_hbox, *icon_hbox,
            *label, *icon_d, *icon_n, *box_d, *box_n;
171
  GdkPixbuf *icon;
172
  gchar     *str, *day, *wind;
173 174 175 176 177 178 179 180 181 182 183

  DBG ("this day %s", weatherdata->day);

  item_vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_set_border_width (GTK_CONTAINER (item_vbox), 6);


  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);

  day = translate_day (get_data_f (weatherdata, WDAY));
184 185
  str = g_strdup_printf ("<b>%s</b>", day ? day : get_data_f (weatherdata, WDAY));
  g_free (day);
186 187 188

  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
189

190 191 192 193
  gtk_box_pack_start (GTK_BOX (item_vbox), label, FALSE, FALSE, 0);

  icon_hbox = gtk_hbox_new (FALSE, 0);

194
  icon = get_icon (get_data_f (weatherdata, ICON_D), 48);
195 196
  icon_d = gtk_image_new_from_pixbuf (icon);
  box_d = gtk_event_box_new ();
197
  gtk_event_box_set_visible_window (GTK_EVENT_BOX (box_d), FALSE);
198 199
  gtk_container_add (GTK_CONTAINER (box_d), icon_d);

200 201 202
  if (G_LIKELY (icon))
    g_object_unref (G_OBJECT (icon));

203
  icon = get_icon (get_data_f (weatherdata, ICON_N), 48);
204 205
  icon_n = gtk_image_new_from_pixbuf (icon);
  box_n = gtk_event_box_new ();
206
  gtk_event_box_set_visible_window (GTK_EVENT_BOX (box_n), FALSE);
207 208
  gtk_container_add (GTK_CONTAINER (box_n), icon_n);

209 210 211
  if (G_LIKELY (icon))
    g_object_unref (G_OBJECT (icon));

212 213 214
  if (G_UNLIKELY (!tooltips))
    tooltips = gtk_tooltips_new ();

215 216
  str = g_strdup_printf (_("Day: %s"),
                         translate_desc (get_data_f (weatherdata, TRANS_D)));
217 218
  gtk_tooltips_set_tip (tooltips, box_d, str, NULL);
  g_free (str);
219 220 221

  str = g_strdup_printf (_("Night: %s"),
                         translate_desc (get_data_f (weatherdata, TRANS_N)));
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
  gtk_tooltips_set_tip (tooltips, box_n, str, NULL);
  g_free (str);

  gtk_box_pack_start (GTK_BOX (icon_hbox), box_d, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (icon_hbox), box_n, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (item_vbox), icon_hbox, FALSE, FALSE, 0);

  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  gtk_label_set_markup (GTK_LABEL (label), _("<b>Precipitation</b>"));
  gtk_box_pack_start (GTK_BOX (item_vbox), label, FALSE, FALSE, 0);

  temp_hbox = gtk_hbox_new (FALSE, 0);
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("%s %%", get_data_f (weatherdata, PPCP_D));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
241

242 243 244 245 246
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("%s %%", get_data_f (weatherdata, PPCP_N));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
247

248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (item_vbox), temp_hbox, FALSE, FALSE, 0);

  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  gtk_label_set_markup (GTK_LABEL (label), _("<b>Temperature</b>"));
  gtk_box_pack_start (GTK_BOX (item_vbox), label, FALSE, FALSE, 0);

  temp_hbox = gtk_hbox_new (FALSE, 0);
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("<span foreground=\"red\">%s</span> %s",
                         get_data_f (weatherdata, TEMP_MAX), get_unit (unit,
                                                                       TEMP));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("<span foreground=\"blue\">%s</span> %s",
                         get_data_f (weatherdata, TEMP_MIN), get_unit (unit,
                                                                       TEMP));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (item_vbox), temp_hbox, FALSE, FALSE, 0);

  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  gtk_label_set_markup (GTK_LABEL (label), _("<b>Wind</b>"));
  gtk_box_pack_start (GTK_BOX (item_vbox), label, FALSE, FALSE, 0);

  temp_hbox = gtk_hbox_new (FALSE, 0);
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);

  wind = translate_wind_direction (get_data_f (weatherdata, W_DIRECTION_D));
  gtk_label_set_markup (GTK_LABEL (label),
                        wind ? wind : get_data_f (weatherdata,
                                                  W_DIRECTION_D));
288
  g_free (wind);
289 290 291 292 293 294 295 296 297 298

  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);

  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);

  wind = translate_wind_direction (get_data_f (weatherdata, W_DIRECTION_N));
  gtk_label_set_markup (GTK_LABEL (label),
                        wind ? wind : get_data_f (weatherdata,
                                                  W_DIRECTION_N));
299 300
  g_free (wind);

301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (item_vbox), temp_hbox, FALSE, FALSE, 0);

  /* speed */
  temp_hbox = gtk_hbox_new (FALSE, 2);
  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("%s %s", get_data_f (weatherdata, W_SPEED_D),
                         get_unit (unit, WIND_SPEED));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);

  label = gtk_label_new (NULL);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  str = g_strdup_printf ("%s %s", get_data_f (weatherdata, W_SPEED_N),
                         get_unit (unit, WIND_SPEED));
  gtk_label_set_markup (GTK_LABEL (label), str);
  g_free (str);
  gtk_box_pack_start (GTK_BOX (temp_hbox), label, TRUE, TRUE, 0);
  gtk_box_pack_start (GTK_BOX (item_vbox), temp_hbox, FALSE, FALSE, 0);

  DBG ("Done");

  return item_vbox;
326 327
}

328 329


330
static GtkWidget *
331 332
create_forecast_tab (xml_weather *data,
                     units        unit)
333
{
334
  GtkWidget *widg = gtk_hbox_new (FALSE, 0);
335
  guint      i;
336

337
  gtk_container_set_border_width (GTK_CONTAINER (widg), 6);
338

339
  if (data && data->dayf)
Nick Schermer's avatar
Nick Schermer committed
340
    {
341
      for (i = 0; i < XML_WEATHER_DAYF_N - 1; i++)
342
        {
343 344
          if (!data->dayf[i])
            break;
Nick Schermer's avatar
Nick Schermer committed
345

346
          DBG ("%s", data->dayf[i]->day);
Nick Schermer's avatar
Nick Schermer committed
347

348 349 350 351 352
          gtk_box_pack_start (GTK_BOX (widg),
                              make_forecast (data->dayf[i], unit), FALSE,
                              FALSE, 0);
          gtk_box_pack_start (GTK_BOX (widg), gtk_vseparator_new (), TRUE,
                              TRUE, 0);
353
        }
Nick Schermer's avatar
Nick Schermer committed
354

355 356 357 358
      if (data->dayf[i])
        gtk_box_pack_start (GTK_BOX (widg),
                            make_forecast (data->dayf[i], unit), FALSE, FALSE,
                            0);
Nick Schermer's avatar
Nick Schermer committed
359
    }
360

361
  return widg;
362
}
363

364 365


366
GtkWidget *
367 368
create_summary_window (xml_weather *data,
                       units        unit)
369
{
370
  GtkWidget *window, *notebook, *vbox;
371
  gchar     *title;
372
  GdkPixbuf *icon;
373

374 375 376 377 378
  window = xfce_titled_dialog_new_with_buttons (_("Weather Update"),
                                                NULL,
                                                GTK_DIALOG_NO_SEPARATOR,
                                                GTK_STOCK_OK,
                                                GTK_RESPONSE_ACCEPT, NULL);
379

380
  title = g_strdup_printf (_("Weather report for: %s"), get_data (data, DNAM));
Nick Schermer's avatar
Nick Schermer committed
381

382 383
  xfce_titled_dialog_set_subtitle (XFCE_TITLED_DIALOG (window), title);
  g_free (title);
384

385 386 387
  vbox = gtk_vbox_new (FALSE, 0);
  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE,
                      0);
388

389
  icon = get_icon (get_data (data, WICON), 48);
390

391
  if (!icon)
392
    icon = get_icon ("99", 48);
393

394
  gtk_window_set_icon (GTK_WINDOW (window), icon);
395 396 397

  if (G_LIKELY (icon))
    g_object_unref (G_OBJECT (icon));
398

399 400 401 402 403 404 405 406
  notebook = gtk_notebook_new ();
  gtk_container_set_border_width (GTK_CONTAINER (notebook), BORDER);
  gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
                            create_summary_tab (data, unit),
                            gtk_label_new (_("Summary")));
  gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
                            create_forecast_tab (data, unit),
                            gtk_label_new (_("Forecast")));
407

408
  gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
409

410
  g_signal_connect (G_OBJECT (window), "response",
411
                    G_CALLBACK (gtk_widget_destroy), window);
412

413
  gtk_window_set_default_size (GTK_WINDOW (window), 500, 400);
414

415
  return window;
416
}