Initial git release
[connectnow-hp] / src / connectnow-settings-dialog.c
1 /*
2  *  connectnow home widget for the maemo desktop.
3  *  Copyright (C) 2010 Nicolai Hess
4  *  
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *  
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *  
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19
20 #include <hildon/hildon.h>
21 #include <hildon/hildon-file-chooser-dialog.h>
22 #include <libintl.h>
23 #include <locale.h>
24 #include "connectnow-settings-dialog.h"
25 #include "connectnow-load-and-store.h"
26
27 void
28 select_and_set_icon(GtkButton* button, custom_icon_data* data)
29 {
30   GtkWidget* dialog;
31   GtkWidget* parent = gtk_widget_get_toplevel(GTK_WIDGET(button));
32   dialog = hildon_file_chooser_dialog_new(GTK_WINDOW(parent),
33                                           GTK_FILE_CHOOSER_ACTION_OPEN);
34   GtkFileFilter* fileFilter = gtk_file_filter_new();
35   gtk_file_filter_add_pixbuf_formats(fileFilter);
36   gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), fileFilter);
37   
38   gtk_widget_show_all(GTK_WIDGET(dialog));
39   int ret = gtk_dialog_run(GTK_DIALOG(dialog));
40   if(ret == GTK_RESPONSE_OK)
41   {
42
43     gchar* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
44     GdkPixbuf* pixbuf;
45     pixbuf = load_image(filename);
46     g_free(data->icon_name);
47     data->icon_name = filename;
48     gtk_button_set_image(GTK_BUTTON(data->icon_button), gtk_image_new_from_pixbuf(pixbuf));
49     g_object_unref(pixbuf);
50   }
51   gtk_widget_destroy(dialog);
52 }
53
54 void
55 connect_now_show_icon_selector(GtkButton* button, icon_data_t* icon_data)
56 {
57   GtkWidget* dialog;
58   GtkWidget* icon_box_1 = gtk_vbox_new(TRUE,0);
59   GtkWidget* icon_box_2 = gtk_vbox_new(TRUE,0);
60   GtkWidget* label_box = gtk_vbox_new(TRUE,0);
61   GtkWidget* pan = hildon_pannable_area_new();
62   GtkWidget* buttons[NUM_PREDEFINED_ICONS+1];
63   GtkWidget* last_button = NULL;
64   GtkWidget* hBox = gtk_hbox_new(FALSE, 3);
65   gboolean predefined_is_selected = FALSE;
66   int i;
67   for(i = 0;i<NUM_PREDEFINED_ICONS;++i)
68   {
69     GtkWidget* connect_image;
70     GtkWidget* disconnect_image;
71     buttons[i] = hildon_gtk_radio_button_new_from_widget(HILDON_SIZE_AUTO,
72                                                          GTK_RADIO_BUTTON(last_button));
73     gtk_button_set_label(GTK_BUTTON(buttons[i]),
74                          g_strdup(_predefined_icons[i][LABEL]));
75     gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(buttons[i]),
76                                FALSE);
77     if(g_strcmp0(icon_data->connect_name, _predefined_icons[i][CONNECT])==0)
78     {
79       gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(buttons[i]),
80                                   TRUE);
81       predefined_is_selected = TRUE;
82     }
83     GdkPixbuf* pixbuf;
84     pixbuf = load_image(_predefined_icons[i][CONNECT]);
85     connect_image = gtk_image_new_from_pixbuf(pixbuf);
86     g_object_unref(pixbuf);
87     pixbuf = load_image(_predefined_icons[i][DISCONNECT]);
88     disconnect_image = gtk_image_new_from_pixbuf(pixbuf);
89     g_object_unref(pixbuf);
90
91     gtk_box_pack_start(GTK_BOX(icon_box_1),
92                        connect_image, TRUE, TRUE, 0);
93     gtk_box_pack_start(GTK_BOX(icon_box_2),
94                        disconnect_image, TRUE, TRUE, 0);
95     gtk_box_pack_start(GTK_BOX(label_box),
96                        buttons[i], TRUE, TRUE, 0);
97     last_button = buttons[i];
98   }
99   buttons[NUM_PREDEFINED_ICONS] = hildon_gtk_radio_button_new_from_widget(HILDON_SIZE_AUTO,
100                                                          GTK_RADIO_BUTTON(last_button));
101   
102   gtk_button_set_label(GTK_BUTTON(buttons[NUM_PREDEFINED_ICONS]),
103                        "Custom");
104   gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(buttons[NUM_PREDEFINED_ICONS]),
105                              FALSE);
106
107   custom_icon_data* connect_icon_data = g_new0(custom_icon_data, 1);
108   custom_icon_data* disconnect_icon_data = g_new0(custom_icon_data, 1);
109   connect_icon_data->icon_name = NULL;
110   disconnect_icon_data->icon_name = NULL;
111   connect_icon_data->icon_button = hildon_button_new(HILDON_SIZE_AUTO,
112                                                 HILDON_BUTTON_ARRANGEMENT_VERTICAL);
113   disconnect_icon_data->icon_button = hildon_button_new(HILDON_SIZE_AUTO,
114                                                 HILDON_BUTTON_ARRANGEMENT_VERTICAL);
115
116   gtk_box_pack_start(GTK_BOX(icon_box_1),
117                      connect_icon_data->icon_button, TRUE, TRUE, 0);
118   gtk_box_pack_start(GTK_BOX(icon_box_2),
119                      disconnect_icon_data->icon_button, TRUE, TRUE, 0);
120   gtk_box_pack_start(GTK_BOX(label_box),
121                      buttons[NUM_PREDEFINED_ICONS], TRUE, TRUE, 0);
122   if(!predefined_is_selected &&
123      icon_data->connect_name!=NULL)
124   {
125     gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(buttons[NUM_PREDEFINED_ICONS]),
126                                 TRUE);
127     
128     GdkPixbuf* pixbuf;
129     pixbuf = load_image(icon_data->connect_name);
130     gtk_button_set_image(GTK_BUTTON(connect_icon_data->icon_button), gtk_image_new_from_pixbuf(pixbuf));
131     g_object_unref(pixbuf);
132     pixbuf = load_image(icon_data->disconnect_name);
133     gtk_button_set_image(GTK_BUTTON(disconnect_icon_data->icon_button), gtk_image_new_from_pixbuf(pixbuf));
134     g_object_unref(pixbuf);
135   }
136   
137   g_signal_connect(connect_icon_data->icon_button, "clicked", G_CALLBACK(select_and_set_icon), connect_icon_data);
138   g_signal_connect(disconnect_icon_data->icon_button, "clicked", G_CALLBACK(select_and_set_icon), disconnect_icon_data);
139   gtk_box_pack_start(GTK_BOX(hBox), icon_box_1, FALSE, FALSE, 3);
140   gtk_box_pack_start(GTK_BOX(hBox), icon_box_2, FALSE, FALSE, 3);
141   gtk_box_pack_start(GTK_BOX(hBox), label_box, TRUE, TRUE, 3);
142   hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(pan),
143                                          hBox);
144   
145   dialog = gtk_dialog_new_with_buttons("Icon",
146                                        NULL,
147                                        0,
148                                        dgettext("hildon-libs", "wdgt_bd_done"),
149                                        GTK_RESPONSE_ACCEPT,
150                                        NULL);
151   gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), pan);
152
153   gtk_window_set_default_size(GTK_WINDOW(dialog), -1, 300);
154   gtk_widget_show_all(dialog);
155   if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
156   {
157     if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(buttons[NUM_PREDEFINED_ICONS])))
158     {
159       if(connect_icon_data->icon_name &&
160          disconnect_icon_data->icon_name)
161       {
162         icon_data->connect_name = g_strdup(connect_icon_data->icon_name);
163         icon_data->disconnect_name = g_strdup(disconnect_icon_data->icon_name);
164       }
165     }
166     else
167     {
168       for(i = 0;i<NUM_PREDEFINED_ICONS;++i)
169       {
170         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(buttons[i])))
171         {
172           icon_data->connect_name = g_strdup(_predefined_icons[i][CONNECT]);
173           icon_data->disconnect_name= g_strdup(_predefined_icons[i][DISCONNECT]);
174           break;
175         }
176       }
177     }
178     GdkPixbuf* pixbuf = load_image(icon_data->connect_name);
179     gtk_image_set_from_pixbuf(GTK_IMAGE(icon_data->connect_icon),
180                               pixbuf);
181     g_object_unref(pixbuf);
182     pixbuf = load_image(icon_data->disconnect_name);
183     gtk_image_set_from_pixbuf(GTK_IMAGE(icon_data->disconnect_icon),
184                               pixbuf);
185     g_object_unref(pixbuf);
186   }
187   g_free(connect_icon_data->icon_name);
188   g_free(disconnect_icon_data->icon_name);
189   g_free(connect_icon_data);
190   g_free(disconnect_icon_data);
191   gtk_widget_destroy (dialog);
192 }