comparison pidgin/gtkprefs.c @ 32696:763d65f3f758

explicit merge of '6ab9f5ff810acde3c06a2add7b8df2bd75cce6e3' and '7a0bb807afc9c1c3f2aaa7143fc5d1e3dc7c6ee8' to branch 'im.pidgin.cpw.qulogic.gtk3'
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Fri, 23 Dec 2011 06:58:52 +0000
parents cad13153ea92 a87cc77c8e6f
children 7df79e0d1150
comparison
equal deleted inserted replaced
32418:466efc330d3d 32696:763d65f3f758
185 gtk_widget_show(entry); 185 gtk_widget_show(entry);
186 186
187 return pidgin_add_widget_to_vbox(GTK_BOX(page), title, sg, entry, TRUE, NULL); 187 return pidgin_add_widget_to_vbox(GTK_BOX(page), title, sg, entry, TRUE, NULL);
188 } 188 }
189 189
190 /* TODO: Maybe move this up somewheres... */
191 enum {
192 PREF_DROPDOWN_TEXT,
193 PREF_DROPDOWN_VALUE,
194 PREF_DROPDOWN_COUNT
195 };
190 196
191 static void 197 static void
192 dropdown_set(GObject *w, const char *key) 198 dropdown_set(GObject *w, const char *key)
193 { 199 {
194 const char *str_value; 200 const char *str_value;
195 int int_value; 201 int int_value;
202 gboolean bool_value;
196 PurplePrefType type; 203 PurplePrefType type;
204 GtkTreeIter iter;
205 GtkTreeModel *tree_model;
206
207 tree_model = gtk_combo_box_get_model(GTK_COMBO_BOX(w));
208 if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(w), &iter))
209 return;
197 210
198 type = GPOINTER_TO_INT(g_object_get_data(w, "type")); 211 type = GPOINTER_TO_INT(g_object_get_data(w, "type"));
199 212
200 if (type == PURPLE_PREF_INT) { 213 if (type == PURPLE_PREF_INT) {
201 int_value = GPOINTER_TO_INT(g_object_get_data(w, "value")); 214 gtk_tree_model_get(tree_model, &iter,
215 PREF_DROPDOWN_VALUE, &int_value,
216 -1);
202 217
203 purple_prefs_set_int(key, int_value); 218 purple_prefs_set_int(key, int_value);
204 } 219 }
205 else if (type == PURPLE_PREF_STRING) { 220 else if (type == PURPLE_PREF_STRING) {
206 str_value = (const char *)g_object_get_data(w, "value"); 221 gtk_tree_model_get(tree_model, &iter,
222 PREF_DROPDOWN_VALUE, &str_value,
223 -1);
207 224
208 purple_prefs_set_string(key, str_value); 225 purple_prefs_set_string(key, str_value);
209 } 226 }
210 else if (type == PURPLE_PREF_BOOLEAN) { 227 else if (type == PURPLE_PREF_BOOLEAN) {
211 purple_prefs_set_bool(key, 228 gtk_tree_model_get(tree_model, &iter,
212 GPOINTER_TO_INT(g_object_get_data(w, "value"))); 229 PREF_DROPDOWN_VALUE, &bool_value,
230 -1);
231
232 purple_prefs_set_bool(key, bool_value);
213 } 233 }
214 } 234 }
215 235
216 GtkWidget * 236 GtkWidget *
217 pidgin_prefs_dropdown_from_list(GtkWidget *box, const gchar *title, 237 pidgin_prefs_dropdown_from_list(GtkWidget *box, const gchar *title,
218 PurplePrefType type, const char *key, GList *menuitems) 238 PurplePrefType type, const char *key, GList *menuitems)
219 { 239 {
220 GtkWidget *dropdown, *opt, *menu; 240 GtkWidget *dropdown;
221 GtkWidget *label = NULL; 241 GtkWidget *label = NULL;
222 gchar *text; 242 gchar *text;
223 const char *stored_str = NULL; 243 const char *stored_str = NULL;
224 int stored_int = 0; 244 int stored_int = 0;
245 gboolean stored_bool = FALSE;
225 int int_value = 0; 246 int int_value = 0;
226 const char *str_value = NULL; 247 const char *str_value = NULL;
227 int o = 0; 248 gboolean bool_value = FALSE;
249 GtkListStore *store = NULL;
250 GtkTreeIter iter;
251 GtkTreeIter active;
252 GtkCellRenderer *renderer;
228 253
229 g_return_val_if_fail(menuitems != NULL, NULL); 254 g_return_val_if_fail(menuitems != NULL, NULL);
230 255
231 dropdown = gtk_option_menu_new(); 256 if (type == PURPLE_PREF_INT) {
232 menu = gtk_menu_new(); 257 store = gtk_list_store_new(PREF_DROPDOWN_COUNT, G_TYPE_STRING, G_TYPE_INT);
233
234 if (type == PURPLE_PREF_INT)
235 stored_int = purple_prefs_get_int(key); 258 stored_int = purple_prefs_get_int(key);
236 else if (type == PURPLE_PREF_STRING) 259 } else if (type == PURPLE_PREF_STRING) {
260 store = gtk_list_store_new(PREF_DROPDOWN_COUNT, G_TYPE_STRING, G_TYPE_STRING);
237 stored_str = purple_prefs_get_string(key); 261 stored_str = purple_prefs_get_string(key);
238 262 } else if (type == PURPLE_PREF_BOOLEAN) {
239 while (menuitems != NULL && (text = (char *) menuitems->data) != NULL) { 263 store = gtk_list_store_new(PREF_DROPDOWN_COUNT, G_TYPE_STRING, G_TYPE_BOOLEAN);
264 stored_bool = purple_prefs_get_bool(key);
265 } else {
266 g_warn_if_reached();
267 return NULL;
268 }
269
270 dropdown = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
271 g_object_set_data(G_OBJECT(dropdown), "type", GINT_TO_POINTER(type));
272
273 while (menuitems != NULL && (text = (char *)menuitems->data) != NULL) {
240 menuitems = g_list_next(menuitems); 274 menuitems = g_list_next(menuitems);
241 g_return_val_if_fail(menuitems != NULL, NULL); 275 g_return_val_if_fail(menuitems != NULL, NULL);
242 276
243 opt = gtk_menu_item_new_with_label(text); 277 gtk_list_store_append(store, &iter);
244 278 gtk_list_store_set(store, &iter,
245 g_object_set_data(G_OBJECT(opt), "type", GINT_TO_POINTER(type)); 279 PREF_DROPDOWN_TEXT, text,
280 -1);
246 281
247 if (type == PURPLE_PREF_INT) { 282 if (type == PURPLE_PREF_INT) {
248 int_value = GPOINTER_TO_INT(menuitems->data); 283 int_value = GPOINTER_TO_INT(menuitems->data);
249 g_object_set_data(G_OBJECT(opt), "value", 284 gtk_list_store_set(store, &iter,
250 GINT_TO_POINTER(int_value)); 285 PREF_DROPDOWN_VALUE, int_value,
286 -1);
251 } 287 }
252 else if (type == PURPLE_PREF_STRING) { 288 else if (type == PURPLE_PREF_STRING) {
253 str_value = (const char *)menuitems->data; 289 str_value = (const char *)menuitems->data;
254 290 gtk_list_store_set(store, &iter,
255 g_object_set_data(G_OBJECT(opt), "value", (char *)str_value); 291 PREF_DROPDOWN_VALUE, str_value,
292 -1);
256 } 293 }
257 else if (type == PURPLE_PREF_BOOLEAN) { 294 else if (type == PURPLE_PREF_BOOLEAN) {
258 g_object_set_data(G_OBJECT(opt), "value", 295 bool_value = (gboolean)GPOINTER_TO_INT(menuitems->data);
259 menuitems->data); 296 gtk_list_store_set(store, &iter,
297 PREF_DROPDOWN_VALUE, bool_value,
298 -1);
260 } 299 }
261
262 g_signal_connect(G_OBJECT(opt), "activate",
263 G_CALLBACK(dropdown_set), (char *)key);
264
265 gtk_widget_show(opt);
266 gtk_menu_shell_append(GTK_MENU_SHELL(menu), opt);
267 300
268 if ((type == PURPLE_PREF_INT && stored_int == int_value) || 301 if ((type == PURPLE_PREF_INT && stored_int == int_value) ||
269 (type == PURPLE_PREF_STRING && stored_str != NULL && 302 (type == PURPLE_PREF_STRING && stored_str != NULL &&
270 !strcmp(stored_str, str_value)) || 303 !strcmp(stored_str, str_value)) ||
271 (type == PURPLE_PREF_BOOLEAN && 304 (type == PURPLE_PREF_BOOLEAN &&
272 (purple_prefs_get_bool(key) == GPOINTER_TO_INT(menuitems->data)))) { 305 (stored_bool == bool_value))) {
273 306
274 gtk_menu_set_active(GTK_MENU(menu), o); 307 active = iter;
275 } 308 }
276 309
277 menuitems = g_list_next(menuitems); 310 menuitems = g_list_next(menuitems);
278 311 }
279 o++; 312
280 } 313 renderer = gtk_cell_renderer_text_new();
281 314 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dropdown), renderer, TRUE);
282 gtk_option_menu_set_menu(GTK_OPTION_MENU(dropdown), menu); 315 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dropdown), renderer,
316 "text", 0,
317 NULL);
318
319 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(dropdown), &active);
320
321 g_signal_connect(G_OBJECT(dropdown), "changed",
322 G_CALLBACK(dropdown_set), (char *)key);
283 323
284 pidgin_add_widget_to_vbox(GTK_BOX(box), title, NULL, dropdown, FALSE, &label); 324 pidgin_add_widget_to_vbox(GTK_BOX(box), title, NULL, dropdown, FALSE, &label);
285 325
286 return label; 326 return label;
287 } 327 }