libpurple/purplebadges.c

Tue, 07 Jan 2025 04:49:09 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 07 Jan 2025 04:49:09 -0600
changeset 43128
1ce3ad90614c
parent 42984
818220289e67
child 43180
cafab5224c86
permissions
-rw-r--r--

Make sure we notify on the n-items property for all objects that have it

Testing Done:
Called in the turtles.

Reviewed at https://reviews.imfreedom.org/r/3736/

42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Purple - Internet Messaging Library
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 * This library is free software; you can redistribute it and/or modify it
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * under the terms of the GNU General Public License as published by the Free
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * Software Foundation; either version 2 of the License, or (at your option)
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * any later version.
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 * This library is distributed in the hope that it will be useful, but WITHOUT
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * more details.
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License along with
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
20 * this library; if not, see <https://www.gnu.org/licenses/>.
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #include <gio/gio.h>
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25 #include "purplebadges.h"
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27 #include "util.h"
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 struct _PurpleBadges {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30 GObject parent;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32 GPtrArray *badges;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
33 };
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
34
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35 enum {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
36 PROP_0,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
37 PROP_ITEM_TYPE,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
38 PROP_N_ITEMS,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
39 N_PROPERTIES,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 };
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41 static GParamSpec *properties[N_PROPERTIES] = {NULL, };
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 /******************************************************************************
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 * Helpers
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
45 *****************************************************************************/
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
46 static gboolean
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 purple_badges_equal(gconstpointer a, gconstpointer b) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48 PurpleBadge *badge1 = (gpointer)a;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49 PurpleBadge *badge2 = (gpointer)b;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 return purple_badge_equal(badge1, badge2);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54 static int
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55 purple_badges_compare(gconstpointer a, gconstpointer b) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56 PurpleBadge *badge1 = (gpointer)a;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57 PurpleBadge *badge2 = (gpointer)b;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
59 return purple_badge_compare(badge1, badge2);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
62 /******************************************************************************
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
63 * GListModel Implementation
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64 *****************************************************************************/
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65 static GType
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 purple_badges_get_item_type(G_GNUC_UNUSED GListModel *model) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 return PURPLE_TYPE_BADGE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70 static guint
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71 purple_badges_get_n_items(GListModel *model) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72 PurpleBadges *badges = PURPLE_BADGES(model);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 return badges->badges->len;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77 static gpointer
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
78 purple_badges_get_item(GListModel *model, guint position) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
79 PurpleBadges *badges = PURPLE_BADGES(model);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
80 PurpleBadge *badge = NULL;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
81
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
82 if(position < badges->badges->len) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
83 badge = g_ptr_array_index(badges->badges, position);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
84
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
85 if(PURPLE_IS_BADGE(badge)) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
86 g_object_ref(badge);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
87 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
88 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
89
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
90 return badge;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
91 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
92
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
93 static void
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
94 purple_badges_list_model_init(GListModelInterface *iface) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
95 iface->get_item_type = purple_badges_get_item_type;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
96 iface->get_n_items = purple_badges_get_n_items;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
97 iface->get_item = purple_badges_get_item;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
98 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
99
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
100 /******************************************************************************
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
101 * GObject Implementation
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
102 *****************************************************************************/
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
103 G_DEFINE_FINAL_TYPE_WITH_CODE(PurpleBadges, purple_badges, G_TYPE_OBJECT,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
104 G_IMPLEMENT_INTERFACE(G_TYPE_LIST_MODEL,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
105 purple_badges_list_model_init))
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
106
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
107 static void
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
108 purple_badges_finalize(GObject *obj) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
109 PurpleBadges *badges = PURPLE_BADGES(obj);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
110
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
111 g_clear_pointer(&badges->badges, g_ptr_array_unref);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
112
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
113 G_OBJECT_CLASS(purple_badges_parent_class)->finalize(obj);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
114 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
115
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
116 static void
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
117 purple_badges_get_property(GObject *obj, guint param_id, GValue *value,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
118 GParamSpec *pspec)
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
119 {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
120 GListModel *model = G_LIST_MODEL(obj);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
121
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
122 switch(param_id) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
123 case PROP_ITEM_TYPE:
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
124 g_value_set_gtype(value, g_list_model_get_item_type(model));
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
125 break;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
126 case PROP_N_ITEMS:
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
127 g_value_set_uint(value, g_list_model_get_n_items(model));
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
128 break;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
129 default:
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
130 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
131 break;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
132 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
133 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
134
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
135 static void
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
136 purple_badges_init(PurpleBadges *badges) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
137 badges->badges = g_ptr_array_new_full(0, g_object_unref);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
138 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
139
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
140 static void
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
141 purple_badges_class_init(PurpleBadgesClass *klass) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
142 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
143
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
144 obj_class->finalize = purple_badges_finalize;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
145 obj_class->get_property = purple_badges_get_property;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
146
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
147 /**
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
148 * PurpleBadges:item-type:
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
149 *
42984
818220289e67 Update the gi-docgen subproject and fix some new issues it found
Gary Kramlich <grim@reaperworld.com>
parents: 42918
diff changeset
150 * The type of items. See [vfunc@Gio.ListModel.get_item_type].
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
151 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
152 * Since: 3.0
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
153 */
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
154 properties[PROP_ITEM_TYPE] = g_param_spec_gtype(
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
155 "item-type", NULL, NULL,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
156 PURPLE_TYPE_BADGE,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
157 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
158
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
159 /**
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
160 * PurpleBadges:n-items:
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
161 *
42984
818220289e67 Update the gi-docgen subproject and fix some new issues it found
Gary Kramlich <grim@reaperworld.com>
parents: 42918
diff changeset
162 * The number of items. See [vfunc@Gio.ListModel.get_n_items].
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
163 *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
164 * Since: 3.0
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
165 */
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166 properties[PROP_N_ITEMS] = g_param_spec_uint(
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
167 "n-items", NULL, NULL,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
168 0, G_MAXUINT, 0,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
169 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
170
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
171 g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
172 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174 /******************************************************************************
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
175 * Public API
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176 *****************************************************************************/
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177 PurpleBadges *
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
178 purple_badges_new(void) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179 return g_object_new(PURPLE_TYPE_BADGES, NULL);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
181
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182 gboolean
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
183 purple_badges_add_badge(PurpleBadges *badges, PurpleBadge *badge) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
184 gboolean found = FALSE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
185 guint len = 0;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
186
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
187 g_return_val_if_fail(PURPLE_IS_BADGES(badges), FALSE);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
188 g_return_val_if_fail(PURPLE_IS_BADGE(badge), FALSE);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
189
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
190 found = g_ptr_array_find_with_equal_func(badges->badges, badge,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
191 purple_badges_equal, NULL);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
192
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
193 if(found) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
194 return FALSE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
195 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
196
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
197 /* Store length before adding to make the math easier to understand. */
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
198 len = badges->badges->len;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
199
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
200 g_ptr_array_add(badges->badges, g_object_ref(badge));
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
201 g_ptr_array_sort_values(badges->badges, purple_badges_compare);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
202
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
203 g_list_model_items_changed(G_LIST_MODEL(badges), 0, len, len + 1);
43128
1ce3ad90614c Make sure we notify on the n-items property for all objects that have it
Gary Kramlich <grim@reaperworld.com>
parents: 42984
diff changeset
204 g_object_notify_by_pspec(G_OBJECT(badges), properties[PROP_N_ITEMS]);
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
205
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
206 return TRUE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
207 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
208
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
209 gboolean
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
210 purple_badges_remove_badge(PurpleBadges *badges, const char *id) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
211 PurpleBadge *needle = NULL;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
212 gboolean found = FALSE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
213 guint index = 0;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
214
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
215 g_return_val_if_fail(PURPLE_IS_BADGES(badges), FALSE);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
216 g_return_val_if_fail(!purple_strempty(id), FALSE);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
217
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
218 /* We only need the id, but the other values can't be null. */
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
219 needle = purple_badge_new(id, 0, "folder-saved-search-symbolic", "🔍");
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
220
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
221 found = g_ptr_array_find_with_equal_func(badges->badges, needle,
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
222 purple_badges_equal, &index);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
223 g_clear_object(&needle);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
224
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
225 if(!found) {
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
226 return FALSE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
227 }
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
228
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
229 g_ptr_array_remove_index(badges->badges, index);
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
230
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
231 g_list_model_items_changed(G_LIST_MODEL(badges), index, 1, 0);
43128
1ce3ad90614c Make sure we notify on the n-items property for all objects that have it
Gary Kramlich <grim@reaperworld.com>
parents: 42984
diff changeset
232 g_object_notify_by_pspec(G_OBJECT(badges), properties[PROP_N_ITEMS]);
42918
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
233
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
234 return TRUE;
6cb60e125051 Implement Purple.Badges
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
235 }

mercurial