pidgin/gtkprefs.c

branch
cpw.qulogic.gtk3
changeset 32375
9ccb07c70f2a
parent 29721
fe9238a801b0
parent 32374
8e8d5cdb6f62
child 32378
bdfcbacbeb2b
equal deleted inserted replaced
29737:0adc09e12a5a 32375:9ccb07c70f2a
180 gtk_widget_show(entry); 180 gtk_widget_show(entry);
181 181
182 return pidgin_add_widget_to_vbox(GTK_BOX(page), title, sg, entry, TRUE, NULL); 182 return pidgin_add_widget_to_vbox(GTK_BOX(page), title, sg, entry, TRUE, NULL);
183 } 183 }
184 184
185 /* TODO: Maybe move this up somewheres... */
186 enum {
187 PREF_DROPDOWN_TEXT,
188 PREF_DROPDOWN_VALUE,
189 PREF_DROPDOWN_COUNT
190 };
185 191
186 static void 192 static void
187 dropdown_set(GObject *w, const char *key) 193 dropdown_set(GObject *w, const char *key)
188 { 194 {
189 const char *str_value; 195 const char *str_value;
190 int int_value; 196 int int_value;
197 gboolean bool_value;
191 PurplePrefType type; 198 PurplePrefType type;
192 199
200 #if GTK_CHECK_VERSION(2,4,0)
201 GtkTreeIter iter;
202 GtkTreeModel *tree_model;
203
204 tree_model = gtk_combo_box_get_model(GTK_COMBO_BOX(w));
205 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(w), &iter);
206
207 type = GPOINTER_TO_INT(g_object_get_data(w, "type"));
208
209 if (type == PURPLE_PREF_INT) {
210 gtk_tree_model_get(tree_model, &iter,
211 PREF_DROPDOWN_VALUE, &int_value,
212 -1);
213
214 purple_prefs_set_int(key, int_value);
215 }
216 else if (type == PURPLE_PREF_STRING) {
217 gtk_tree_model_get(tree_model, &iter,
218 PREF_DROPDOWN_VALUE, &str_value,
219 -1);
220
221 purple_prefs_set_string(key, str_value);
222 }
223 else if (type == PURPLE_PREF_BOOLEAN) {
224 gtk_tree_model_get(tree_model, &iter,
225 PREF_DROPDOWN_VALUE, &bool_value,
226 -1);
227
228 purple_prefs_set_bool(key, bool_value);
229 }
230 #else
193 type = GPOINTER_TO_INT(g_object_get_data(w, "type")); 231 type = GPOINTER_TO_INT(g_object_get_data(w, "type"));
194 232
195 if (type == PURPLE_PREF_INT) { 233 if (type == PURPLE_PREF_INT) {
196 int_value = GPOINTER_TO_INT(g_object_get_data(w, "value")); 234 int_value = GPOINTER_TO_INT(g_object_get_data(w, "value"));
197 235
201 str_value = (const char *)g_object_get_data(w, "value"); 239 str_value = (const char *)g_object_get_data(w, "value");
202 240
203 purple_prefs_set_string(key, str_value); 241 purple_prefs_set_string(key, str_value);
204 } 242 }
205 else if (type == PURPLE_PREF_BOOLEAN) { 243 else if (type == PURPLE_PREF_BOOLEAN) {
206 purple_prefs_set_bool(key, 244 bool_value = (gboolean)GPOINTER_TO_INT(g_object_get_data(w, "value"));
207 GPOINTER_TO_INT(g_object_get_data(w, "value"))); 245 purple_prefs_set_bool(key, bool_value);
208 } 246 }
247 #endif
209 } 248 }
210 249
211 GtkWidget * 250 GtkWidget *
212 pidgin_prefs_dropdown_from_list(GtkWidget *box, const gchar *title, 251 pidgin_prefs_dropdown_from_list(GtkWidget *box, const gchar *title,
213 PurplePrefType type, const char *key, GList *menuitems) 252 PurplePrefType type, const char *key, GList *menuitems)
214 { 253 {
215 GtkWidget *dropdown, *opt, *menu; 254 GtkWidget *dropdown;
216 GtkWidget *label = NULL; 255 GtkWidget *label = NULL;
217 gchar *text; 256 gchar *text;
218 const char *stored_str = NULL; 257 const char *stored_str = NULL;
219 int stored_int = 0; 258 int stored_int = 0;
259 gboolean stored_bool = FALSE;
220 int int_value = 0; 260 int int_value = 0;
221 const char *str_value = NULL; 261 const char *str_value = NULL;
262 gboolean bool_value = FALSE;
263 #if GTK_CHECK_VERSION(2,4,0)
264 GtkListStore *store;
265 GtkTreeIter iter;
266 GtkTreeIter active;
267 GtkCellRenderer *renderer;
268
269 g_return_val_if_fail(menuitems != NULL, NULL);
270
271 if (type == PURPLE_PREF_INT) {
272 store = gtk_list_store_new(PREF_DROPDOWN_COUNT, G_TYPE_STRING, G_TYPE_INT);
273 stored_int = purple_prefs_get_int(key);
274 } else if (type == PURPLE_PREF_STRING) {
275 store = gtk_list_store_new(PREF_DROPDOWN_COUNT, G_TYPE_STRING, G_TYPE_STRING);
276 stored_str = purple_prefs_get_string(key);
277 } else if (type == PURPLE_PREF_BOOLEAN) {
278 store = gtk_list_store_new(PREF_DROPDOWN_COUNT, G_TYPE_STRING, G_TYPE_BOOLEAN);
279 stored_bool = purple_prefs_get_bool(key);
280 }
281
282 dropdown = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
283 g_object_set_data(G_OBJECT(dropdown), "type", GINT_TO_POINTER(type));
284
285 while (menuitems != NULL && (text = (char *)menuitems->data) != NULL) {
286 menuitems = g_list_next(menuitems);
287 g_return_val_if_fail(menuitems != NULL, NULL);
288
289 gtk_list_store_append(store, &iter);
290 gtk_list_store_set(store, &iter,
291 PREF_DROPDOWN_TEXT, text,
292 -1);
293
294 if (type == PURPLE_PREF_INT) {
295 int_value = GPOINTER_TO_INT(menuitems->data);
296 gtk_list_store_set(store, &iter,
297 PREF_DROPDOWN_VALUE, int_value,
298 -1);
299 }
300 else if (type == PURPLE_PREF_STRING) {
301 str_value = (const char *)menuitems->data;
302 gtk_list_store_set(store, &iter,
303 PREF_DROPDOWN_VALUE, str_value,
304 -1);
305 }
306 else if (type == PURPLE_PREF_BOOLEAN) {
307 bool_value = (gboolean)GPOINTER_TO_INT(menuitems->data);
308 gtk_list_store_set(store, &iter,
309 PREF_DROPDOWN_VALUE, bool_value,
310 -1);
311 }
312
313 if ((type == PURPLE_PREF_INT && stored_int == int_value) ||
314 (type == PURPLE_PREF_STRING && stored_str != NULL &&
315 !strcmp(stored_str, str_value)) ||
316 (type == PURPLE_PREF_BOOLEAN &&
317 (stored_bool == bool_value))) {
318
319 active = iter;
320 }
321
322 menuitems = g_list_next(menuitems);
323 }
324
325 renderer = gtk_cell_renderer_text_new();
326 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dropdown), renderer, TRUE);
327 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dropdown), renderer,
328 "text", 0,
329 NULL);
330
331 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(dropdown), &active);
332
333 g_signal_connect(G_OBJECT(dropdown), "changed",
334 G_CALLBACK(dropdown_set), (char *)key);
335
336 #else
337 GtkWidget *opt, *menu;
222 int o = 0; 338 int o = 0;
223 339
224 g_return_val_if_fail(menuitems != NULL, NULL); 340 g_return_val_if_fail(menuitems != NULL, NULL);
225 341
226 dropdown = gtk_option_menu_new(); 342 dropdown = gtk_option_menu_new();
228 344
229 if (type == PURPLE_PREF_INT) 345 if (type == PURPLE_PREF_INT)
230 stored_int = purple_prefs_get_int(key); 346 stored_int = purple_prefs_get_int(key);
231 else if (type == PURPLE_PREF_STRING) 347 else if (type == PURPLE_PREF_STRING)
232 stored_str = purple_prefs_get_string(key); 348 stored_str = purple_prefs_get_string(key);
233 349 else if (type == PURPLE_PREF_BOOLEAN)
234 while (menuitems != NULL && (text = (char *) menuitems->data) != NULL) { 350 stored_bool = purple_prefs_get_bool(key);
351
352 while (menuitems != NULL && (text = (char *)menuitems->data) != NULL) {
235 menuitems = g_list_next(menuitems); 353 menuitems = g_list_next(menuitems);
236 g_return_val_if_fail(menuitems != NULL, NULL); 354 g_return_val_if_fail(menuitems != NULL, NULL);
237 355
238 opt = gtk_menu_item_new_with_label(text); 356 opt = gtk_menu_item_new_with_label(text);
239 357
240 g_object_set_data(G_OBJECT(opt), "type", GINT_TO_POINTER(type)); 358 g_object_set_data(G_OBJECT(opt), "type", GINT_TO_POINTER(type));
241 359 g_object_set_data(G_OBJECT(opt), "value", menuitems->data);
242 if (type == PURPLE_PREF_INT) { 360
361 if (type == PURPLE_PREF_INT)
243 int_value = GPOINTER_TO_INT(menuitems->data); 362 int_value = GPOINTER_TO_INT(menuitems->data);
244 g_object_set_data(G_OBJECT(opt), "value", 363 else if (type == PURPLE_PREF_STRING)
245 GINT_TO_POINTER(int_value));
246 }
247 else if (type == PURPLE_PREF_STRING) {
248 str_value = (const char *)menuitems->data; 364 str_value = (const char *)menuitems->data;
249 365 else if (type == PURPLE_PREF_BOOLEAN)
250 g_object_set_data(G_OBJECT(opt), "value", (char *)str_value); 366 bool_value = (gboolean)GPOINTER_TO_INT(menuitems->data);
251 }
252 else if (type == PURPLE_PREF_BOOLEAN) {
253 g_object_set_data(G_OBJECT(opt), "value",
254 menuitems->data);
255 }
256 367
257 g_signal_connect(G_OBJECT(opt), "activate", 368 g_signal_connect(G_OBJECT(opt), "activate",
258 G_CALLBACK(dropdown_set), (char *)key); 369 G_CALLBACK(dropdown_set), (char *)key);
259 370
260 gtk_widget_show(opt); 371 gtk_widget_show(opt);
262 373
263 if ((type == PURPLE_PREF_INT && stored_int == int_value) || 374 if ((type == PURPLE_PREF_INT && stored_int == int_value) ||
264 (type == PURPLE_PREF_STRING && stored_str != NULL && 375 (type == PURPLE_PREF_STRING && stored_str != NULL &&
265 !strcmp(stored_str, str_value)) || 376 !strcmp(stored_str, str_value)) ||
266 (type == PURPLE_PREF_BOOLEAN && 377 (type == PURPLE_PREF_BOOLEAN &&
267 (purple_prefs_get_bool(key) == GPOINTER_TO_INT(menuitems->data)))) { 378 (stored_bool == bool_value))) {
268 379
269 gtk_menu_set_active(GTK_MENU(menu), o); 380 gtk_menu_set_active(GTK_MENU(menu), o);
270 } 381 }
271 382
272 menuitems = g_list_next(menuitems); 383 menuitems = g_list_next(menuitems);
273 384
274 o++; 385 o++;
275 } 386 }
276 387
277 gtk_option_menu_set_menu(GTK_OPTION_MENU(dropdown), menu); 388 gtk_option_menu_set_menu(GTK_OPTION_MENU(dropdown), menu);
389
390 #endif
278 391
279 pidgin_add_widget_to_vbox(GTK_BOX(box), title, NULL, dropdown, FALSE, &label); 392 pidgin_add_widget_to_vbox(GTK_BOX(box), title, NULL, dropdown, FALSE, &label);
280 393
281 return label; 394 return label;
282 } 395 }

mercurial