]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-roster-model.c
Moved contact_in_top and contact_is_favourite from view to model
[empathy.git] / libempathy-gtk / empathy-roster-model.c
1 /*
2  * empathy-roster-model.c
3  *
4  * Copyright (C) 2012 Collabora Ltd. <http://www.collabora.co.uk/>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20 #include "config.h"
21
22 #include "empathy-roster-model.h"
23
24 G_DEFINE_INTERFACE (EmpathyRosterModel, empathy_roster_model, G_TYPE_OBJECT)
25
26 enum
27 {
28   SIG_INDIVIDUAL_ADDED,
29   SIG_INDIVIDUAL_REMOVED,
30   SIG_GROUPS_CHANGED,
31   SIG_TOP_INDIVIDUALS_CHANGED,
32   SIG_FAVOURITES_CHANGED,
33   LAST_SIGNAL
34 };
35
36 static guint signals[LAST_SIGNAL];
37
38 static void
39 empathy_roster_model_default_init (EmpathyRosterModelInterface *iface)
40 {
41   signals[SIG_INDIVIDUAL_ADDED] =
42     g_signal_new ("individual-added",
43         EMPATHY_TYPE_ROSTER_MODEL,
44         G_SIGNAL_RUN_LAST,
45         0, NULL, NULL, NULL,
46         G_TYPE_NONE, 1,
47         FOLKS_TYPE_INDIVIDUAL);
48
49   signals[SIG_INDIVIDUAL_REMOVED] =
50     g_signal_new ("individual-removed",
51         EMPATHY_TYPE_ROSTER_MODEL,
52         G_SIGNAL_RUN_LAST,
53         0, NULL, NULL, NULL,
54         G_TYPE_NONE, 1,
55         FOLKS_TYPE_INDIVIDUAL);
56
57   signals[SIG_GROUPS_CHANGED] =
58     g_signal_new ("groups-changed",
59         EMPATHY_TYPE_ROSTER_MODEL,
60         G_SIGNAL_RUN_LAST,
61         0, NULL, NULL, NULL,
62         G_TYPE_NONE, 3,
63         FOLKS_TYPE_INDIVIDUAL,
64         G_TYPE_STRING,
65         G_TYPE_BOOLEAN);
66
67   signals[SIG_TOP_INDIVIDUALS_CHANGED] =
68     g_signal_new ("top-individuals-changed",
69         EMPATHY_TYPE_ROSTER_MODEL,
70         G_SIGNAL_RUN_LAST,
71         0, NULL, NULL, NULL,
72         G_TYPE_NONE, 0);
73
74   signals[SIG_FAVOURITES_CHANGED] =
75     g_signal_new ("favourites-changed",
76         EMPATHY_TYPE_ROSTER_MODEL,
77         G_SIGNAL_RUN_LAST,
78         0, NULL, NULL, NULL,
79         G_TYPE_NONE, 2,
80         FOLKS_TYPE_INDIVIDUAL,
81         G_TYPE_BOOLEAN);
82 }
83
84 /***** Restricted *****/
85
86 void
87 empathy_roster_model_fire_individual_added (EmpathyRosterModel *self,
88     FolksIndividual *individual)
89 {
90   g_signal_emit (self, signals[SIG_INDIVIDUAL_ADDED], 0, individual);
91 }
92
93 void
94 empathy_roster_model_fire_individual_removed (EmpathyRosterModel *self,
95     FolksIndividual *individual)
96 {
97   g_signal_emit (self, signals[SIG_INDIVIDUAL_REMOVED], 0, individual);
98 }
99
100 void
101 empathy_roster_model_fire_groups_changed (EmpathyRosterModel *self,
102     FolksIndividual *individual,
103     const gchar *group,
104     gboolean is_member)
105 {
106   g_signal_emit (self, signals[SIG_GROUPS_CHANGED], 0, individual, group, is_member);
107 }
108
109 void
110 empathy_roster_model_fire_top_individuals_changed (EmpathyRosterModel *self)
111 {
112   g_signal_emit (self, signals[SIG_TOP_INDIVIDUALS_CHANGED], 0);
113 }
114
115 void
116 empathy_roster_model_fire_favourites_changed (EmpathyRosterModel *self,
117     FolksIndividual *individual,
118     gboolean favourite)
119 {
120   g_signal_emit (self, signals[SIG_FAVOURITES_CHANGED], 0, individual, favourite);
121 }
122
123
124 /***** Public *****/
125
126 /**
127  * empathy_roster_model_get_individuals:
128  * @self: a #EmpathyRosterModel
129  *
130  * Returns all the individuals stored by @self.
131  *
132  * Returns: (transfer container): a #GList of #FolksIndividual
133  */
134 GList *
135 empathy_roster_model_get_individuals (EmpathyRosterModel *self)
136 {
137   EmpathyRosterModelInterface *iface;
138
139   g_return_val_if_fail (EMPATHY_IS_ROSTER_MODEL (self), NULL);
140
141   iface = EMPATHY_ROSTER_MODEL_GET_IFACE (self);
142   g_return_val_if_fail (iface->get_individuals != NULL, NULL);
143
144   return (* iface->get_individuals) (self);
145 }
146
147 /**
148  * empathy_roster_model_get_groups_for_individual:
149  * @self: a #EmpathyRosterModel
150  * @individual: a #FolksIndidivual
151  *
152  * Returns the groups of which @individual is a member of.
153  *
154  * Returns: (transfer container): a #GList of (const gchar *) representing the
155  * groups of @individual
156  */
157 GList *
158 empathy_roster_model_get_groups_for_individual (EmpathyRosterModel *self,
159     FolksIndividual *individual)
160 {
161   EmpathyRosterModelInterface *iface;
162
163   g_return_val_if_fail (EMPATHY_IS_ROSTER_MODEL (self), NULL);
164
165   iface = EMPATHY_ROSTER_MODEL_GET_IFACE (self);
166   g_return_val_if_fail (iface->get_groups_for_individual != NULL, NULL);
167
168   return (* iface->get_groups_for_individual) (self, individual);
169 }
170
171 /**
172  * empathy_roster_model_get_top_individuals:
173  * @self: a #EmpathyRosterModel
174  *
175  * Returns a list of the top_individuals.
176  *
177  * Return value: (transfer none): a #GList of #FolksIndividual
178  */
179 GList *
180 empathy_roster_model_get_top_individuals (EmpathyRosterModel *self)
181 {
182   EmpathyRosterModelInterface *iface;
183
184   g_return_val_if_fail (EMPATHY_IS_ROSTER_MODEL (self), NULL);
185
186   iface = EMPATHY_ROSTER_MODEL_GET_IFACE (self);
187   g_return_val_if_fail (iface->get_top_individuals != NULL, NULL);
188
189   return (* iface->get_top_individuals) (self);
190 }
191
192 /**
193  * empathy_roster_model_contact_in_top:
194  * @self: a #EmpathyRosterModel
195  * @contact: a #EmpathyRosterContact
196  *
197  * Checks if the passed #EmpathyRosterContact should be displayed in
198  * top contacts.
199  *
200  * Return value: %TRUE if it should be displayed in top contacts, %FALSE
201  * if not
202  */
203 gboolean
204 empathy_roster_model_contact_in_top (EmpathyRosterModel *self,
205     EmpathyRosterContact *contact)
206 {
207   EmpathyRosterModelInterface *iface;
208
209   g_return_val_if_fail (EMPATHY_IS_ROSTER_MODEL (self), FALSE);
210
211   iface = EMPATHY_ROSTER_MODEL_GET_IFACE (self);
212   g_return_val_if_fail (iface->contact_in_top != NULL, FALSE);
213
214   return (* iface->contact_in_top) (self, contact);
215 }