diff options
author | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2023-03-07 00:22:36 -0600 |
---|---|---|
committer | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2023-03-07 00:22:36 -0600 |
commit | 66dc29947dff7a229eee65749dafa6c6d314a0b2 (patch) | |
tree | dec95fb12561a0b3ac73f80482b6435e53058aec /libpurple/purplerequestgroup.c | |
parent | 46ba486242ec635371883de6a996923dd2423b1a (diff) | |
download | pidgin-66dc29947dff7a229eee65749dafa6c6d314a0b2.tar.gz |
Convert PurpleRequestGroup into a GObject
And go through with the renaming of `PurpleRequestFieldGroup` to `PurpleRequestGroup`.
Also, this now implements `GListModel`, but nothing is yet updated to use that.
Testing Done:
Compiled, and opened Request Fields from Demo protocol.
Reviewed at https://reviews.imfreedom.org/r/2322/
Diffstat (limited to 'libpurple/purplerequestgroup.c')
-rw-r--r-- | libpurple/purplerequestgroup.c | 183 |
1 files changed, 150 insertions, 33 deletions
diff --git a/libpurple/purplerequestgroup.c b/libpurple/purplerequestgroup.c index 90103b086a..371cb3a6f2 100644 --- a/libpurple/purplerequestgroup.c +++ b/libpurple/purplerequestgroup.c @@ -25,8 +25,9 @@ #include "purplerequestgroup.h" #include "purpleprivate.h" -struct _PurpleRequestFieldGroup -{ +struct _PurpleRequestGroup { + GObject parent; + PurpleRequestFields *fields_list; char *title; @@ -34,68 +35,182 @@ struct _PurpleRequestFieldGroup GList *fields; }; -PurpleRequestFieldGroup * -purple_request_field_group_new(const char *title) -{ - PurpleRequestFieldGroup *group; - - group = g_new0(PurpleRequestFieldGroup, 1); +enum { + PROP_0, + PROP_TITLE, + N_PROPERTIES, +}; +static GParamSpec *properties[N_PROPERTIES] = {NULL, }; +/****************************************************************************** + * Helpers + *****************************************************************************/ +static void +purple_request_group_set_title(PurpleRequestGroup *group, const char *title) { + g_free(group->title); group->title = g_strdup(title); - return group; + g_object_notify_by_pspec(G_OBJECT(group), properties[PROP_TITLE]); } -void -purple_request_field_group_destroy(PurpleRequestFieldGroup *group) +/****************************************************************************** + * GListModel Implementation + *****************************************************************************/ +static GType +purple_request_group_get_item_type(G_GNUC_UNUSED GListModel *model) { + return PURPLE_TYPE_REQUEST_FIELD; +} + +static guint +purple_request_group_get_n_items(GListModel *model) { + PurpleRequestGroup *group = PURPLE_REQUEST_GROUP(model); + + return g_list_length(group->fields); +} + +static gpointer +purple_request_group_get_item(G_GNUC_UNUSED GListModel *model, guint index) { + PurpleRequestGroup *group = PURPLE_REQUEST_GROUP(model); + + return g_list_nth_data(group->fields, index); +} + +static void +purple_request_group_list_model_init(GListModelInterface *iface) { + iface->get_item_type = purple_request_group_get_item_type; + iface->get_item = purple_request_group_get_item; + iface->get_n_items = purple_request_group_get_n_items; +} + +/****************************************************************************** + * GObject Implementation + *****************************************************************************/ +G_DEFINE_TYPE_WITH_CODE(PurpleRequestGroup, purple_request_group, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(G_TYPE_LIST_MODEL, + purple_request_group_list_model_init)) + +static void +purple_request_group_get_property(GObject *obj, guint param_id, GValue *value, + GParamSpec *pspec) +{ + PurpleRequestGroup *group = PURPLE_REQUEST_GROUP(obj); + + switch(param_id) { + case PROP_TITLE: + g_value_set_string(value, purple_request_group_get_title(group)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +static void +purple_request_group_set_property(GObject *obj, guint param_id, + const GValue *value, GParamSpec *pspec) { - g_return_if_fail(group != NULL); + PurpleRequestGroup *group = PURPLE_REQUEST_GROUP(obj); + + switch(param_id) { + case PROP_TITLE: + purple_request_group_set_title(group, g_value_get_string(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +static void +purple_request_group_finalize(GObject *obj) { + PurpleRequestGroup *group = PURPLE_REQUEST_GROUP(obj); g_free(group->title); g_list_free_full(group->fields, g_object_unref); - g_free(group); + G_OBJECT_CLASS(purple_request_group_parent_class)->finalize(obj); +} + +static void +purple_request_group_init(G_GNUC_UNUSED PurpleRequestGroup *group) { +} + +static void +purple_request_group_class_init(PurpleRequestGroupClass *klass) { + GObjectClass *obj_class = G_OBJECT_CLASS(klass); + + obj_class->finalize = purple_request_group_finalize; + obj_class->get_property = purple_request_group_get_property; + obj_class->set_property = purple_request_group_set_property; + + /** + * PurpleRequestGroup:title: + * + * The title of the field group. + * + * Since: 3.0.0 + */ + properties[PROP_TITLE] = g_param_spec_string( + "title", "title", + "The title of the field group.", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties(obj_class, N_PROPERTIES, properties); +} + +/****************************************************************************** + * Public API + *****************************************************************************/ +PurpleRequestGroup * +purple_request_group_new(const char *title) { + return g_object_new(PURPLE_TYPE_REQUEST_GROUP, + "title", title, + NULL); } void -_purple_request_field_group_set_field_list(PurpleRequestFieldGroup *group, - PurpleRequestFields *fields) +_purple_request_group_set_field_list(PurpleRequestGroup *group, + PurpleRequestFields *fields) { - g_return_if_fail(group != NULL); + g_return_if_fail(PURPLE_IS_REQUEST_GROUP(group)); group->fields_list = fields; } void -_purple_request_field_group_set_field_required(PurpleRequestFieldGroup *group, - PurpleRequestField *field, - gboolean required) +_purple_request_group_set_field_required(PurpleRequestGroup *group, + PurpleRequestField *field, + gboolean required) { - g_return_if_fail(group != NULL); + g_return_if_fail(PURPLE_IS_REQUEST_GROUP(group)); _purple_request_field_list_set_field_required(group->fields_list, field, required); } void -_purple_request_field_group_set_field_validator(PurpleRequestFieldGroup *group, - PurpleRequestField *field, - gboolean validator) +_purple_request_group_set_field_validator(PurpleRequestGroup *group, + PurpleRequestField *field, + gboolean validator) { - g_return_if_fail(group != NULL); + g_return_if_fail(PURPLE_IS_REQUEST_GROUP(group)); _purple_request_field_list_set_field_validator(group->fields_list, field, validator); } void -purple_request_field_group_add_field(PurpleRequestFieldGroup *group, - PurpleRequestField *field) +purple_request_group_add_field(PurpleRequestGroup *group, + PurpleRequestField *field) { - g_return_if_fail(group != NULL); + guint position; + + g_return_if_fail(PURPLE_IS_REQUEST_GROUP(group)); g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field)); + position = g_list_length(group->fields); group->fields = g_list_append(group->fields, field); if(group->fields_list != NULL) { @@ -103,28 +218,30 @@ purple_request_field_group_add_field(PurpleRequestFieldGroup *group, } _purple_request_field_set_group(field, group); + + g_list_model_items_changed(G_LIST_MODEL(group), position, 0, 1); } const char * -purple_request_field_group_get_title(const PurpleRequestFieldGroup *group) +purple_request_group_get_title(PurpleRequestGroup *group) { - g_return_val_if_fail(group != NULL, NULL); + g_return_val_if_fail(PURPLE_IS_REQUEST_GROUP(group), NULL); return group->title; } GList * -purple_request_field_group_get_fields(const PurpleRequestFieldGroup *group) +purple_request_group_get_fields(PurpleRequestGroup *group) { - g_return_val_if_fail(group != NULL, NULL); + g_return_val_if_fail(PURPLE_IS_REQUEST_GROUP(group), NULL); return group->fields; } PurpleRequestFields * -purple_request_field_group_get_fields_list(const PurpleRequestFieldGroup *group) +purple_request_group_get_fields_list(PurpleRequestGroup *group) { - g_return_val_if_fail(group != NULL, NULL); + g_return_val_if_fail(PURPLE_IS_REQUEST_GROUP(group), NULL); return group->fields_list; } |