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