Mercurial > pidgin.yaz
diff src/request.c @ 8286:89d9d004e3f3
[gaim-migrate @ 9010]
Improved the field request API, adding required fields and account fields,
as well as some new utility API functions and bug fixes. These changes
allowed me to migrate the New IM dialog over to the field request API,
removing a lot of code and improving consistency.
committer: Tailor Script <tailor@pidgin.im>
| author | Christian Hammond <chipx86@chipx86.com> |
|---|---|
| date | Wed, 18 Feb 2004 07:22:53 +0000 |
| parents | d335cc7bca54 |
| children | e39ea2b4f6cd |
line wrap: on
line diff
--- a/src/request.c Wed Feb 18 02:39:47 2004 +0000 +++ b/src/request.c Wed Feb 18 07:22:53 2004 +0000 @@ -58,13 +58,18 @@ g_return_if_fail(fields != NULL); - for (l = fields->groups; l != NULL; l = l->next) { + for (l = fields->groups; l != NULL; l = l->next) + { group = l->data; gaim_request_field_group_destroy(group); } - g_list_free(fields->groups); + if (fields->groups != NULL) + g_list_free(fields->groups); + + if (fields->required_fields != NULL) + g_list_free(fields->required_fields); g_hash_table_destroy(fields->fields); @@ -104,6 +109,65 @@ return fields->groups; } +gboolean +gaim_request_fields_exists(const GaimRequestFields *fields, const char *id) +{ + g_return_val_if_fail(fields != NULL, FALSE); + g_return_val_if_fail(id != NULL, FALSE); + + return (g_hash_table_lookup(fields->fields, id) != NULL); +} + +const GList * +gaim_request_fields_get_required(const GaimRequestFields *fields) +{ + g_return_val_if_fail(fields != NULL, NULL); + + return fields->required_fields; +} + +gboolean +gaim_request_fields_is_field_required(const GaimRequestFields *fields, + const char *id) +{ + GaimRequestField *field; + + g_return_val_if_fail(fields != NULL, FALSE); + g_return_val_if_fail(id != NULL, FALSE); + + if ((field = gaim_request_fields_get_field(fields, id)) == NULL) + return FALSE; + + return gaim_request_field_is_required(field); +} + +gboolean +gaim_request_fields_all_required_filled(const GaimRequestFields *fields) +{ + GList *l; + + g_return_val_if_fail(fields != NULL, FALSE); + + for (l = fields->required_fields; l != NULL; l = l->next) + { + GaimRequestField *field = (GaimRequestField *)l->data; + + switch (gaim_request_field_get_type(field)) + { + case GAIM_REQUEST_FIELD_STRING: + if (gaim_request_field_string_get_value(field) == NULL) + return FALSE; + + break; + + default: + break; + } + } + + return TRUE; +} + GaimRequestField * gaim_request_fields_get_field(const GaimRequestFields *fields, const char *id) { @@ -176,6 +240,21 @@ return gaim_request_field_choice_get_value(field); } +GaimAccount * +gaim_request_fields_get_account(const GaimRequestFields *fields, + const char *id) +{ + GaimRequestField *field; + + g_return_val_if_fail(fields != NULL, NULL); + g_return_val_if_fail(id != NULL, NULL); + + if ((field = gaim_request_fields_get_field(fields, id)) == NULL) + return NULL; + + return gaim_request_field_account_get_value(field); +} + GaimRequestFieldGroup * gaim_request_field_group_new(const char *title) { @@ -220,10 +299,19 @@ group->fields = g_list_append(group->fields, field); - if (group->fields_list != NULL) { + if (group->fields_list != NULL) + { g_hash_table_insert(group->fields_list->fields, g_strdup(gaim_request_field_get_id(field)), field); } + + field->group = group; + + if (gaim_request_field_is_required(field)) + { + group->fields_list->required_fields = + g_list_append(group->fields_list->required_fields, field); + } } const char * @@ -344,6 +432,33 @@ field->type_hint = (type_hint == NULL ? NULL : g_strdup(type_hint)); } +void +gaim_request_field_set_required(GaimRequestField *field, gboolean required) +{ + g_return_if_fail(field != NULL); + + if (field->required == required) + return; + + field->required = required; + + if (field->group != NULL) + { + if (required) + { + field->group->fields_list->required_fields = + g_list_append(field->group->fields_list->required_fields, + field); + } + else + { + field->group->fields_list->required_fields = + g_list_remove(field->group->fields_list->required_fields, + field); + } + } +} + GaimRequestFieldType gaim_request_field_get_type(const GaimRequestField *field) { @@ -384,6 +499,14 @@ return field->type_hint; } +gboolean +gaim_request_field_is_required(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, FALSE); + + return field->required; +} + GaimRequestField * gaim_request_field_string_new(const char *id, const char *text, const char *default_value, gboolean multiline) @@ -855,6 +978,105 @@ return field; } + +GaimRequestField * +gaim_request_field_account_new(const char *id, const char *text, + GaimAccount *account) +{ + GaimRequestField *field; + + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + + field = gaim_request_field_new(id, text, GAIM_REQUEST_FIELD_ACCOUNT); + + if (account == NULL && gaim_connections_get_all() != NULL) + { + account = gaim_connection_get_account( + (GaimConnection *)gaim_connections_get_all()->data); + } + + gaim_request_field_account_set_default_value(field, account); + gaim_request_field_account_set_value(field, account); + + return field; +} + +void +gaim_request_field_account_set_default_value(GaimRequestField *field, + GaimAccount *default_value) +{ + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == GAIM_REQUEST_FIELD_ACCOUNT); + + field->u.account.default_account = default_value; +} + +void +gaim_request_field_account_set_value(GaimRequestField *field, + GaimAccount *value) +{ + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == GAIM_REQUEST_FIELD_ACCOUNT); + + field->u.account.account = value; +} + +void +gaim_request_field_account_set_show_all(GaimRequestField *field, + gboolean show_all) +{ + g_return_if_fail(field != NULL); + g_return_if_fail(field->type == GAIM_REQUEST_FIELD_ACCOUNT); + + if (field->u.account.show_all == show_all) + return; + + field->u.account.show_all = show_all; + + if (!show_all) + { + if (gaim_account_is_connected(field->u.account.default_account)) + { + gaim_request_field_account_set_default_value(field, + (GaimAccount *)gaim_connections_get_all()->data); + } + + if (gaim_account_is_connected(field->u.account.account)) + { + gaim_request_field_account_set_value(field, + (GaimAccount *)gaim_connections_get_all()->data); + } + } +} + +GaimAccount * +gaim_request_field_account_get_default_value(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_ACCOUNT, NULL); + + return field->u.account.default_account; +} + +GaimAccount * +gaim_request_field_account_get_value(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, NULL); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_ACCOUNT, NULL); + + return field->u.account.account; +} + +gboolean +gaim_request_field_account_get_show_all(const GaimRequestField *field) +{ + g_return_val_if_fail(field != NULL, FALSE); + g_return_val_if_fail(field->type == GAIM_REQUEST_FIELD_ACCOUNT, FALSE); + + return field->u.account.show_all; +} + /* -- */ void *
