| 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 } |