void purple_request_field_list_set_selected(PurpleRequestField *field, GList *items) { GList *l; g_return_if_fail(field != NULL); g_return_if_fail(items != NULL); g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST); purple_request_field_list_clear_selected(field); if (!purple_request_field_list_get_multi_select(field) && items && items->next) { purple_debug_warning("request", "More than one item added to non-multi-select " "field %s\n", purple_request_field_get_id(field)); return; } for (l = items; l != NULL; l = l->next) { field->u.list.selected = g_list_append(field->u.list.selected, g_strdup(l->data)); g_hash_table_insert(field->u.list.selected_table, g_strdup((char *)l->data), NULL); } }
static GntWidget* create_list_field(PurpleRequestField *field) { GntWidget *ret = NULL; GList *list; gboolean multi = purple_request_field_list_get_multi_select(field); if (multi) { GntWidget *tree = gnt_tree_new(); list = purple_request_field_list_get_items(field); for (; list; list = list->next) { const char *text = list->data; gpointer key = purple_request_field_list_get_data(field, text); gnt_tree_add_choice(GNT_TREE(tree), key, gnt_tree_create_row(GNT_TREE(tree), text), NULL, NULL); if (purple_request_field_list_is_selected(field, text)) gnt_tree_set_choice(GNT_TREE(tree), key, TRUE); } ret = tree; } else { GntWidget *combo = gnt_combo_box_new(); list = purple_request_field_list_get_items(field); for (; list; list = list->next) { const char *text = list->data; gpointer key = purple_request_field_list_get_data(field, text); gnt_combo_box_add_data(GNT_COMBO_BOX(combo), key, text); if (purple_request_field_list_is_selected(field, text)) gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), key); } ret = combo; } return ret; }
void purple_request_field_list_add_selected(PurpleRequestField *field, const char *item) { g_return_if_fail(field != NULL); g_return_if_fail(item != NULL); g_return_if_fail(field->type == PURPLE_REQUEST_FIELD_LIST); if (!purple_request_field_list_get_multi_select(field) && field->u.list.selected != NULL) { purple_debug_warning("request", "More than one item added to non-multi-select " "field %s\n", purple_request_field_get_id(field)); return; } field->u.list.selected = g_list_append(field->u.list.selected, g_strdup(item)); g_hash_table_insert(field->u.list.selected_table, g_strdup(item), NULL); }
static void request_fields_cb(GntWidget *button, PurpleRequestFields *fields) { PurpleRequestFieldsCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); GList *list; /* Update the data of the fields. Pidgin does this differently. Instead of * updating the fields at the end like here, it updates the appropriate field * instantly whenever a change is made. That allows it to make sure the * 'required' fields are entered before the user can hit OK. It's not the case * here, althought it can be done. */ for (list = purple_request_fields_get_groups(fields); list; list = list->next) { PurpleRequestFieldGroup *group = list->data; GList *fields = purple_request_field_group_get_fields(group); for (; fields ; fields = fields->next) { PurpleRequestField *field = fields->data; PurpleRequestFieldType type = purple_request_field_get_type(field); if (type == PURPLE_REQUEST_FIELD_BOOLEAN) { GntWidget *check = FINCH_GET_DATA(field); gboolean value = gnt_check_box_get_checked(GNT_CHECK_BOX(check)); purple_request_field_bool_set_value(field, value); } else if (type == PURPLE_REQUEST_FIELD_STRING) { GntWidget *entry = FINCH_GET_DATA(field); const char *text = gnt_entry_get_text(GNT_ENTRY(entry)); purple_request_field_string_set_value(field, (text && *text) ? text : NULL); } else if (type == PURPLE_REQUEST_FIELD_INTEGER) { GntWidget *entry = FINCH_GET_DATA(field); const char *text = gnt_entry_get_text(GNT_ENTRY(entry)); int value = (text && *text) ? atoi(text) : 0; purple_request_field_int_set_value(field, value); } else if (type == PURPLE_REQUEST_FIELD_CHOICE) { GntWidget *combo = FINCH_GET_DATA(field); int id; id = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo))); purple_request_field_choice_set_value(field, id); } else if (type == PURPLE_REQUEST_FIELD_LIST) { GList *list = NULL; if (purple_request_field_list_get_multi_select(field)) { GList *iter; GntWidget *tree = FINCH_GET_DATA(field); iter = purple_request_field_list_get_items(field); for (; iter; iter = iter->next) { const char *text = iter->data; gpointer key = purple_request_field_list_get_data(field, text); if (gnt_tree_get_choice(GNT_TREE(tree), key)) list = g_list_prepend(list, key); } } else { GntWidget *combo = FINCH_GET_DATA(field); gpointer data = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)); list = g_list_append(list, data); } purple_request_field_list_set_selected(field, list); g_list_free(list); } else if (type == PURPLE_REQUEST_FIELD_ACCOUNT) { GntWidget *combo = FINCH_GET_DATA(field); PurpleAccount *acc = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)); purple_request_field_account_set_value(field, acc); } } } purple_notify_close_with_handle(button); if (!g_object_get_data(G_OBJECT(button), "cancellation-function") && !purple_request_fields_all_required_filled(fields)) { purple_notify_error(button, _("Error"), _("You must fill all the required fields."), _("The required fields are underlined.")); return; } if (callback) callback(data, fields); while (button->parent) button = button->parent; purple_request_close(PURPLE_REQUEST_FIELDS, button); }
Request::FieldsDialog::FieldsDialog(const char *title, const char *primary, const char *secondary, PurpleRequestFields *request_fields, const char *ok_text, GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, void *user_data) : RequestDialog(title, primary, secondary, ok_text, ok_cb, cancel_text, cancel_cb, user_data), fields(request_fields) { tree = new CppConsUI::TreeView(AUTOSIZE, AUTOSIZE); lbox->AppendWidget(*tree); bool grouping = true; GList *groups = purple_request_fields_get_groups(fields); if (!groups) return; if (!purple_request_field_group_get_title( reinterpret_cast<PurpleRequestFieldGroup*>(groups->data)) && !groups->next) grouping = false; for (; groups; groups = groups->next) { PurpleRequestFieldGroup *group = reinterpret_cast<PurpleRequestFieldGroup*>(groups->data); CppConsUI::TreeView::NodeReference parent = tree->GetRootNode(); if (grouping) { const char *title = purple_request_field_group_get_title(group); if (!title) title = _("Settings group"); CppConsUI::TreeView::ToggleCollapseButton *button = new CppConsUI::TreeView::ToggleCollapseButton(title); parent = tree->AppendNode(tree->GetRootNode(), *button); } for (GList *gfields = purple_request_field_group_get_fields(group); gfields; gfields = gfields->next) { PurpleRequestField *field = reinterpret_cast<PurpleRequestField*>(gfields->data); if (!purple_request_field_is_visible(field)) continue; PurpleRequestFieldType type = purple_request_field_get_type(field); switch (type) { case PURPLE_REQUEST_FIELD_STRING: tree->AppendNode(parent, *(new StringField(field))); break; case PURPLE_REQUEST_FIELD_INTEGER: tree->AppendNode(parent, *(new IntegerField(field))); break; case PURPLE_REQUEST_FIELD_BOOLEAN: tree->AppendNode(parent, *(new BooleanField(field))); break; case PURPLE_REQUEST_FIELD_CHOICE: tree->AppendNode(parent, *(new ChoiceField(field))); break; case PURPLE_REQUEST_FIELD_LIST: if (purple_request_field_list_get_multi_select(field)) tree->AppendNode(parent, *(new ListFieldMultiple(field))); else tree->AppendNode(parent, *(new ListFieldSingle(field))); break; case PURPLE_REQUEST_FIELD_LABEL: tree->AppendNode(parent, *(new LabelField(field))); break; case PURPLE_REQUEST_FIELD_IMAGE: tree->AppendNode(parent, *(new ImageField(field))); break; case PURPLE_REQUEST_FIELD_ACCOUNT: tree->AppendNode(parent, *(new AccountField(field))); break; default: LOG->Error(_("Unimplemented Request field type.")); break; } } } }