1
/* vim: set expandtab ts=8 sw=4: */
3
/* This program is free software; you can redistribute it and/or modify
4
* it under the terms of the GNU General Public License as published by
5
* the Free Software Foundation; either version 2 of the License, or
6
* (at your option) any later version.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU Library General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with this program; if not, write to the Free Software
15
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
#include <libxfcegui4/libxfcegui4.h>
29
#include "config_dialog.h"
30
#include "search_dialog.h"
35
const static labeloption labeloptions[OPTIONS_N] = {
36
{N_("Windchill (F)"), FLIK},
37
{N_("Temperature (T)"), TEMP},
38
{N_("Atmosphere pressure (P)"), BAR_R},
39
{N_("Atmosphere state (P)"), BAR_D},
40
{N_("Wind speed (WS)"), WIND_SPEED},
41
{N_("Wind gust (WG)"), WIND_GUST},
42
{N_("Wind direction (WD)"), WIND_DIRECTION},
43
{N_("Humidity (H)"), HMID},
44
{N_("Visibility (V)"), VIS},
45
{N_("UV Index (UV)"), UV_INDEX},
46
{N_("Dewpoint (DP)"), DEWP},
49
typedef void(*cb_function)(xfceweather_data *);
50
static cb_function cb = NULL;
53
add_mdl_option (GtkListStore *mdl,
58
gtk_list_store_append (mdl, &iter);
59
gtk_list_store_set (mdl, &iter,
60
0, _(labeloptions[opt].name),
61
1, labeloptions[opt].number,
66
cb_addoption (GtkWidget *widget,
69
xfceweather_dialog *dialog = (xfceweather_dialog *) data;
70
gint history = gtk_option_menu_get_history (GTK_OPTION_MENU (dialog->opt_xmloption));
72
add_mdl_option (dialog->mdl_xmloption, history);
78
cb_deloption (GtkWidget *widget,
81
xfceweather_dialog *dialog = (xfceweather_dialog *)data;
83
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->lst_xmloption));
85
if (gtk_tree_selection_get_selected (selection, NULL, &iter))
86
gtk_list_store_remove (GTK_LIST_STORE (dialog->mdl_xmloption), &iter);
92
cb_toggle (GtkWidget *widget,
95
GtkWidget *target = (GtkWidget *)data;
97
gtk_widget_set_sensitive (target,
98
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
104
cb_not_toggle (GtkWidget *widget,
107
GtkWidget *target = (GtkWidget *)data;
109
gtk_widget_set_sensitive (target,
110
!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
116
GtkWidget *make_label (void)
119
GtkWidget *widget, *menu;
121
menu = gtk_menu_new ();
122
widget = gtk_option_menu_new ();
124
for (i = 0; i < 11; i++)
126
labeloption opt = labeloptions[i];
128
gtk_menu_shell_append (GTK_MENU_SHELL (menu),
129
gtk_menu_item_new_with_label (_(opt.name)));
132
gtk_option_menu_set_menu (GTK_OPTION_MENU (widget), menu);
138
apply_options (xfceweather_dialog *dialog)
141
gboolean hasiter = FALSE;
145
xfceweather_data *data = (xfceweather_data *) dialog->wd;
147
history = gtk_option_menu_get_history (GTK_OPTION_MENU (dialog->opt_unit));
150
data->unit = IMPERIAL;
154
if (data->location_code)
155
g_free (data->location_code);
157
data->location_code = g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->txt_loc_code)));
159
/* call labels_clear() here */
160
if (data->labels && data->labels->len > 0)
161
g_array_free (data->labels, TRUE);
163
data->labels = g_array_new (FALSE, TRUE, sizeof(datas));
165
for (hasiter = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (dialog->mdl_xmloption), &iter);
166
hasiter == TRUE; hasiter = gtk_tree_model_iter_next (
167
GTK_TREE_MODEL (dialog->mdl_xmloption), &iter))
170
GValue value = {0, };
172
gtk_tree_model_get_value (GTK_TREE_MODEL(dialog->mdl_xmloption), &iter, 1, &value);
173
option = g_value_get_int (&value);
174
g_array_append_val (data->labels, option);
175
g_value_unset (&value);
178
if (data->proxy_host)
180
g_free (data->proxy_host);
181
data->proxy_host = NULL;
184
if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->chk_proxy_use)))
185
data->proxy_fromenv = FALSE;
186
else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->chk_proxy_fromenv)))
188
data->proxy_fromenv = TRUE;
189
check_envproxy(&data->proxy_host, &data->proxy_port);
191
else /* use provided proxy settings */
193
data->proxy_fromenv = FALSE;
194
text = g_strdup (gtk_entry_get_text (GTK_ENTRY(dialog->txt_proxy_host)));
196
if (strlen (text) == 0)
198
xfce_err(_("Please enter proxy settings"));
199
gtk_widget_grab_focus (dialog->txt_proxy_host);
203
data->proxy_host = g_strdup(text);
204
data->proxy_port = gtk_spin_button_get_value (
205
GTK_SPIN_BUTTON (dialog->txt_proxy_port));
207
if (data->saved_proxy_host)
208
g_free (data->saved_proxy_host);
210
data->saved_proxy_host = g_strdup(text);
211
data->saved_proxy_port = data->proxy_port;
225
for (i = 0; i < OPTIONS_N; i++)
227
if (labeloptions[i].number == opt)
235
cb_findlocation (GtkButton *button,
238
xfceweather_dialog *dialog = (xfceweather_dialog *) user_data;
239
search_dialog *sdialog = create_search_dialog(NULL,
240
dialog->wd->proxy_host, dialog->wd->proxy_port);
242
if (run_search_dialog(sdialog))
243
gtk_entry_set_text (GTK_ENTRY(dialog->txt_loc_code), sdialog->result);
245
free_search_dialog(sdialog);
252
create_config_dialog (xfceweather_data *data,
255
xfceweather_dialog *dialog;
256
GtkWidget *vbox2, *vbox3, *hbox, *hbox2, *label,
258
*button_del, *image, *button, *scroll;
259
GtkSizeGroup *sg = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
260
GtkSizeGroup *sg_buttons = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
261
GtkTreeViewColumn *column;
262
GtkCellRenderer *renderer;
264
dialog = panel_slice_new0 (xfceweather_dialog);
266
dialog->wd = (xfceweather_data *)data;
267
dialog->dialog = gtk_widget_get_toplevel (vbox);
269
label = gtk_label_new (_("Measurement unit:"));
270
gtk_misc_set_alignment (GTK_MISC(label), 0, 0.5);
271
menu = gtk_menu_new ();
272
dialog->opt_unit = gtk_option_menu_new ();
274
gtk_menu_shell_append ((GtkMenuShell *)(GTK_MENU(menu)),
275
(gtk_menu_item_new_with_label (_("Imperial"))));
276
gtk_menu_shell_append ((GtkMenuShell *)(GTK_MENU(menu)),
277
(gtk_menu_item_new_with_label (_("Metric"))));
278
gtk_option_menu_set_menu(GTK_OPTION_MENU(dialog->opt_unit), menu);
280
if (dialog->wd->unit == IMPERIAL)
281
gtk_option_menu_set_history(GTK_OPTION_MENU(dialog->opt_unit), 0);
283
gtk_option_menu_set_history(GTK_OPTION_MENU(dialog->opt_unit), 1);
284
gtk_size_group_add_widget (sg, label);
286
hbox = gtk_hbox_new (FALSE, BORDER);
287
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
288
gtk_box_pack_start (GTK_BOX (hbox), dialog->opt_unit, TRUE, TRUE, 0);
289
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
292
label = gtk_label_new (_("Location code:"));
293
dialog->txt_loc_code = gtk_entry_new ();
295
gtk_misc_set_alignment (GTK_MISC(label), 0, 0.5);
297
if (dialog->wd->location_code != NULL)
298
gtk_entry_set_text (GTK_ENTRY(dialog->txt_loc_code),
299
dialog->wd->location_code);
300
gtk_size_group_add_widget (sg, label);
302
button = gtk_button_new ();
303
image = gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_BUTTON);
304
gtk_container_add(GTK_CONTAINER (button), image);
305
g_signal_connect (button, "clicked", G_CALLBACK (cb_findlocation), dialog);
307
hbox = gtk_hbox_new (FALSE, BORDER);
308
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
309
gtk_box_pack_start (GTK_BOX (hbox), dialog->txt_loc_code, TRUE, TRUE, 0);
310
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
311
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
314
label = gtk_label_new (_("Proxy server:"));
315
dialog->txt_proxy_host = gtk_entry_new ();
316
dialog->chk_proxy_use = gtk_check_button_new_with_label (_("Use proxy server"));
317
dialog->chk_proxy_fromenv =
318
gtk_check_button_new_with_label (_("Auto-detect from environment"));
319
dialog->txt_proxy_port = gtk_spin_button_new_with_range (0, 65536, 1);
321
gtk_misc_set_alignment (GTK_MISC(label), 0, 0);
323
gtk_size_group_add_widget (sg, label);
325
vbox3 = gtk_vbox_new (FALSE, BORDER);
326
gtk_box_pack_start (GTK_BOX (vbox3), dialog->chk_proxy_use, FALSE, FALSE, 0);
327
gtk_box_pack_start (GTK_BOX (vbox3), dialog->chk_proxy_fromenv, FALSE, FALSE, 0);
329
hbox = gtk_hbox_new (FALSE, BORDER);
330
gtk_box_pack_start (GTK_BOX (hbox), dialog->txt_proxy_host, TRUE, TRUE, 0);
331
gtk_box_pack_start (GTK_BOX (hbox), dialog->txt_proxy_port, FALSE, FALSE, 0);
332
gtk_box_pack_start (GTK_BOX (vbox3), hbox, FALSE, FALSE, 0);
335
hbox2 = gtk_hbox_new (FALSE, BORDER);
336
gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
337
gtk_box_pack_start (GTK_BOX (hbox2), vbox3, TRUE, TRUE, 0);
339
gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
341
g_signal_connect (dialog->chk_proxy_use, "toggled", G_CALLBACK (cb_toggle),
342
(gpointer)dialog->txt_proxy_host);
343
g_signal_connect (dialog->chk_proxy_use, "toggled", G_CALLBACK (cb_toggle),
344
(gpointer)dialog->txt_proxy_port);
345
g_signal_connect (dialog->chk_proxy_use, "toggled", G_CALLBACK (cb_toggle),
346
(gpointer)dialog->chk_proxy_fromenv);
348
g_signal_connect (dialog->chk_proxy_fromenv, "toggled", G_CALLBACK (cb_not_toggle),
349
(gpointer)dialog->txt_proxy_host);
350
g_signal_connect (dialog->chk_proxy_fromenv, "toggled", G_CALLBACK (cb_not_toggle),
351
(gpointer)dialog->txt_proxy_port);
353
if (dialog->wd->saved_proxy_host != NULL)
355
gtk_entry_set_text (GTK_ENTRY (dialog->txt_proxy_host),
356
dialog->wd->saved_proxy_host);
358
gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->txt_proxy_port),
359
dialog->wd->saved_proxy_port);
362
if (dialog->wd->proxy_host || dialog->wd->proxy_fromenv)
364
gtk_toggle_button_set_active (
365
GTK_TOGGLE_BUTTON (dialog->chk_proxy_use), TRUE);
367
if (dialog->wd->proxy_fromenv)
368
gtk_toggle_button_set_active (
369
GTK_TOGGLE_BUTTON (dialog->chk_proxy_fromenv), TRUE);
373
gtk_toggle_button_set_active (
374
GTK_TOGGLE_BUTTON (dialog->chk_proxy_use), TRUE);
375
gtk_toggle_button_set_active (
376
GTK_TOGGLE_BUTTON (dialog->chk_proxy_use), FALSE);
382
dialog->opt_xmloption = make_label ();
383
dialog->mdl_xmloption = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
384
dialog->lst_xmloption = gtk_tree_view_new_with_model (GTK_TREE_MODEL(dialog->mdl_xmloption));
386
renderer = gtk_cell_renderer_text_new ();
387
column = gtk_tree_view_column_new_with_attributes (_("Labels to display"), renderer,
389
gtk_tree_view_append_column (GTK_TREE_VIEW(dialog->lst_xmloption), column);
391
button_add = gtk_button_new_from_stock(GTK_STOCK_ADD);
392
gtk_size_group_add_widget (sg_buttons, button_add);
393
hbox = gtk_hbox_new (FALSE, BORDER);
394
gtk_box_pack_start (GTK_BOX (hbox), dialog->opt_xmloption, TRUE, TRUE, 0);
395
gtk_box_pack_start (GTK_BOX (hbox), button_add, FALSE, FALSE, 0);
396
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
398
button_del = gtk_button_new_from_stock(GTK_STOCK_REMOVE);
399
gtk_size_group_add_widget (sg_buttons, button_del);
400
hbox = gtk_hbox_new (FALSE, BORDER);
401
scroll = gtk_scrolled_window_new (NULL, NULL);
402
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_NEVER,
403
GTK_POLICY_AUTOMATIC);
404
gtk_container_add(GTK_CONTAINER(scroll), dialog->lst_xmloption);
405
gtk_box_pack_start (GTK_BOX (hbox), scroll, TRUE, TRUE, 0);
407
vbox2 = gtk_vbox_new (FALSE, 0);
408
gtk_box_pack_start (GTK_BOX (vbox2), button_del, FALSE, FALSE, 0);
409
gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
410
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
411
gtk_widget_set_size_request (dialog->lst_xmloption, -1, 120);
414
if (data->labels->len > 0)
420
for (i = 0; i < data->labels->len; i++)
422
opt = g_array_index (data->labels, datas, i);
424
if ((n = option_i(opt)) != -1)
425
add_mdl_option (dialog->mdl_xmloption, n);
429
g_signal_connect (button_add, "clicked", G_CALLBACK (cb_addoption), dialog);
430
g_signal_connect (button_del, "clicked", G_CALLBACK (cb_deloption), dialog);
432
gtk_widget_show_all (vbox);
438
set_callback_config_dialog (xfceweather_dialog *dialog,