# HG changeset patch # User Sadrul Habib Chowdhury # Date 1197261291 0 # Node ID 0a5dcdbdc89a4aecdff9d333149837980cc5216b # Parent 3265e4619117ee1a7c6a585657ff8701978a0467 Create a 'list' request-field for a 'choice' plugin pref. diff -r 3265e4619117 -r 0a5dcdbdc89a finch/gntplugin.c --- a/finch/gntplugin.c Sun Dec 09 10:08:40 2007 +0000 +++ b/finch/gntplugin.c Mon Dec 10 04:34:51 2007 +0000 @@ -53,6 +53,13 @@ static GntWidget *process_pref_frame(PurplePluginPrefFrame *frame); static void +free_stringlist(GList *list) +{ + g_list_foreach(list, (GFunc)g_free, NULL); + g_list_free(list); +} + +static void decide_conf_button(PurplePlugin *plugin) { if (purple_plugin_is_loaded(plugin) && @@ -426,11 +433,14 @@ PurpleRequestFields *fields; PurpleRequestFieldGroup *group = NULL; GList *prefs; - + GList *stringlist = NULL; + GntWidget *ret = NULL; + fields = purple_request_fields_new(); for (prefs = purple_plugin_pref_frame_get_prefs(frame); prefs; prefs = prefs->next) { PurplePluginPref *pref = prefs->data; + PurplePrefType type; const char *name = purple_plugin_pref_get_name(pref); const char *label = purple_plugin_pref_get_label(pref); if(name == NULL) { @@ -448,20 +458,67 @@ } field = NULL; - switch(purple_prefs_get_type(name)) { - case PURPLE_PREF_BOOLEAN: - field = purple_request_field_bool_new(name, label, purple_prefs_get_bool(name)); - break; - case PURPLE_PREF_INT: - field = purple_request_field_int_new(name, label, purple_prefs_get_int(name)); - break; - case PURPLE_PREF_STRING: - field = purple_request_field_string_new(name, label, purple_prefs_get_string(name), - purple_plugin_pref_get_format_type(pref) & PURPLE_STRING_FORMAT_TYPE_MULTILINE); - break; - default: - break; + type = purple_prefs_get_type(name); + if(purple_plugin_pref_get_type(pref) == PURPLE_PLUGIN_PREF_CHOICE) { + GList *list = purple_plugin_pref_get_choices(pref); + gpointer current_value = NULL; + + switch(type) { + case PURPLE_PREF_BOOLEAN: + current_value = g_strdup_printf("%d", (int)purple_prefs_get_bool(name)); + break; + case PURPLE_PREF_INT: + current_value = g_strdup_printf("%d", (int)purple_prefs_get_int(name)); + break; + case PURPLE_PREF_STRING: + current_value = g_strdup(purple_prefs_get_string(name)); + break; + default: + continue; + } + + field = purple_request_field_list_new(name, label); + purple_request_field_list_set_multi_select(field, FALSE); + while (list && list->next) { + const char *label = list->data; + char *value = NULL; + switch(type) { + case PURPLE_PREF_BOOLEAN: + value = g_strdup_printf("%d", (int)list->next->data); + break; + case PURPLE_PREF_INT: + value = g_strdup_printf("%d", (int)list->next->data); + break; + case PURPLE_PREF_STRING: + value = g_strdup(list->next->data); + break; + default: + break; + } + stringlist = g_list_prepend(stringlist, value); + purple_request_field_list_add(field, label, value); + if (strcmp(value, current_value) == 0) + purple_request_field_list_add_selected(field, label); + list = list->next->next; + } + g_free(current_value); + } else { + switch(type) { + case PURPLE_PREF_BOOLEAN: + field = purple_request_field_bool_new(name, label, purple_prefs_get_bool(name)); + break; + case PURPLE_PREF_INT: + field = purple_request_field_int_new(name, label, purple_prefs_get_int(name)); + break; + case PURPLE_PREF_STRING: + field = purple_request_field_string_new(name, label, purple_prefs_get_string(name), + purple_plugin_pref_get_format_type(pref) & PURPLE_STRING_FORMAT_TYPE_MULTILINE); + break; + default: + break; + } } + if (field) { if (group == NULL) { group = purple_request_field_group_new(_("Preferences")); @@ -471,9 +528,11 @@ } } - return purple_request_fields(NULL, _("Preferences"), NULL, NULL, fields, + ret = purple_request_fields(NULL, _("Preferences"), NULL, NULL, fields, _("Save"), G_CALLBACK(finch_request_save_in_prefs), _("Cancel"), NULL, NULL, NULL, NULL, NULL); + g_signal_connect_swapped(G_OBJECT(ret), "destroy", G_CALLBACK(free_stringlist), stringlist); + return ret; }