void Request::FieldsDialog::ListFieldMultiple::ListFieldItem::OnToggle( CheckBox& activator, bool new_state) { if (new_state) purple_request_field_list_add_selected(field, GetText()); else { /* XXX This chunk is super-slow, libpurple should provide * purple_request_field_list_remove_selected() function. */ GList *new_selected = NULL; for (GList *selected = purple_request_field_list_get_selected(field); selected; selected = selected->next) { const char *data = reinterpret_cast<const char*>(selected->data); if (strcmp(GetText(), data)) new_selected = g_list_append(new_selected, g_strdup(data)); } if (new_selected) { purple_request_field_list_set_selected(field, new_selected); g_list_foreach(new_selected, reinterpret_cast<GFunc>(g_free), NULL); } else purple_request_field_list_clear_selected(field); } }
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); }
gpointer fb_util_request_buddy(PurpleConnection *gc, const gchar *title, const gchar *primary, const gchar *secondary, GSList *select, gboolean multi, GCallback ok_cb, GCallback cancel_cb, gpointer data) { const gchar *alias; const gchar *name; gchar *str; GList *items = NULL; gpointer *mata; GSList *buddies; GSList *l; PurpleAccount *acct; PurpleRequestCommonParameters *cpar; PurpleRequestField *field; PurpleRequestFieldGroup *group; PurpleRequestFields *fields; mata = g_new0(gpointer, 3); mata[0] = ok_cb; mata[1] = cancel_cb; mata[2] = data; acct = purple_connection_get_account(gc); buddies = purple_blist_find_buddies(acct, NULL); buddies = g_slist_sort(buddies, (GCompareFunc) g_ascii_strcasecmp); fields = purple_request_fields_new(); group = purple_request_field_group_new(NULL); purple_request_fields_add_group(fields, group); field = purple_request_field_list_new("buddy", NULL); purple_request_field_list_set_multi_select(field, multi); purple_request_field_set_required(field, TRUE); purple_request_field_group_add_field(group, field); for (l = buddies; l != NULL; l = l->next) { name = purple_buddy_get_name(l->data); alias = purple_buddy_get_alias(l->data); str = g_strdup_printf("%s (%s)", alias, name); purple_request_field_list_add_icon(field, str, NULL, l->data); g_free(str); } for (l = select; l != NULL; l = l->next) { name = purple_buddy_get_name(l->data); alias = purple_buddy_get_alias(l->data); str = g_strdup_printf("%s (%s)", alias, name); items = g_list_append(items, str); } purple_request_field_list_set_selected(field, items); g_slist_free(buddies); g_list_free_full(items, g_free); cpar = purple_request_cpar_from_connection(gc); return purple_request_fields(gc, title, primary, secondary, fields, _("Ok"), G_CALLBACK(fb_util_request_buddy_ok), _("Cancel"), G_CALLBACK(fb_util_request_buddy_cancel), cpar, mata); }