diff options
Diffstat (limited to 'libpurple/purplerequestpage.c')
-rw-r--r-- | libpurple/purplerequestpage.c | 84 |
1 files changed, 73 insertions, 11 deletions
diff --git a/libpurple/purplerequestpage.c b/libpurple/purplerequestpage.c index 62442772c8..ab909697f0 100644 --- a/libpurple/purplerequestpage.c +++ b/libpurple/purplerequestpage.c @@ -34,6 +34,7 @@ struct _PurpleRequestPage { GObject parent; GList *groups; + GHashTable *invalid_groups; GHashTable *fields; @@ -42,6 +43,38 @@ struct _PurpleRequestPage { GList *validated_fields; }; +enum { + PROP_0, + PROP_VALID, + N_PROPERTIES, +}; +static GParamSpec *properties[N_PROPERTIES] = {NULL, }; + +/****************************************************************************** + * Callbacks + *****************************************************************************/ +static void +purple_request_page_notify_group_cb(GObject *obj, + G_GNUC_UNUSED GParamSpec *pspec, + gpointer data) +{ + PurpleRequestPage *page = PURPLE_REQUEST_PAGE(data); + PurpleRequestGroup *group = PURPLE_REQUEST_GROUP(obj); + gboolean before, after; + + before = purple_request_page_is_valid(page); + if(purple_request_group_is_valid(group)) { + g_hash_table_remove(page->invalid_groups, group); + } else { + g_hash_table_add(page->invalid_groups, group); + } + after = purple_request_page_is_valid(page); + + if(before != after) { + g_object_notify_by_pspec(G_OBJECT(page), properties[PROP_VALID]); + } +} + /****************************************************************************** * GListModel Implementation *****************************************************************************/ @@ -85,10 +118,27 @@ G_DEFINE_TYPE_WITH_CODE(PurpleRequestPage, purple_request_page, G_TYPE_OBJECT, purple_request_page_list_model_init)) static void +purple_request_page_get_property(GObject *obj, guint param_id, GValue *value, + GParamSpec *pspec) +{ + PurpleRequestPage *page = PURPLE_REQUEST_PAGE(obj); + + switch(param_id) { + case PROP_VALID: + g_value_set_boolean(value, purple_request_page_is_valid(page)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +static void purple_request_page_finalize(GObject *obj) { PurpleRequestPage *page = PURPLE_REQUEST_PAGE(obj); g_list_free_full(page->groups, g_object_unref); + g_clear_pointer(&page->invalid_groups, g_hash_table_destroy); g_list_free(page->required_fields); g_list_free(page->validated_fields); g_hash_table_destroy(page->fields); @@ -99,6 +149,7 @@ purple_request_page_finalize(GObject *obj) { static void purple_request_page_init(PurpleRequestPage *page) { page->fields = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + page->invalid_groups = g_hash_table_new(g_direct_hash, g_direct_equal); } static void @@ -106,6 +157,22 @@ purple_request_page_class_init(PurpleRequestPageClass *klass) { GObjectClass *obj_class = G_OBJECT_CLASS(klass); obj_class->finalize = purple_request_page_finalize; + obj_class->get_property = purple_request_page_get_property; + + /** + * PurpleRequestPage:valid: + * + * Whether all fields in a page are valid. + * + * Since: 3.0.0 + */ + properties[PROP_VALID] = g_param_spec_boolean( + "valid", "valid", + "Whether all fields in a page are valid.", + TRUE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties(obj_class, N_PROPERTIES, properties); } /****************************************************************************** @@ -177,6 +244,10 @@ purple_request_page_add_group(PurpleRequestPage *page, _purple_request_group_set_page(group, page); + purple_request_page_notify_group_cb(G_OBJECT(group), NULL, page); + g_signal_connect(group, "notify::valid", + G_CALLBACK(purple_request_page_notify_group_cb), page); + for (l = purple_request_group_get_fields(group); l != NULL; l = l->next) { @@ -248,19 +319,10 @@ purple_request_page_all_required_filled(PurpleRequestPage *page) { } gboolean -purple_request_page_all_valid(PurpleRequestPage *page) { - GList *l; - +purple_request_page_is_valid(PurpleRequestPage *page) { g_return_val_if_fail(PURPLE_IS_REQUEST_PAGE(page), FALSE); - for(l = page->validated_fields; l != NULL; l = l->next) { - PurpleRequestField *field = PURPLE_REQUEST_FIELD(l->data); - - if (!purple_request_field_is_valid(field, NULL)) - return FALSE; - } - - return TRUE; + return g_hash_table_size(page->invalid_groups) == 0; } PurpleRequestField * |