]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-roster-group.c
Updated Spanish Translation
[empathy.git] / libempathy-gtk / empathy-roster-group.c
1 #include "config.h"
2 #include "empathy-roster-group.h"
3
4 #include <telepathy-glib/telepathy-glib.h>
5
6 G_DEFINE_TYPE (EmpathyRosterGroup, empathy_roster_group, GTK_TYPE_LIST_BOX_ROW)
7
8 enum
9 {
10   PROP_NAME = 1,
11   PROP_ICON,
12   N_PROPS
13 };
14
15 /*
16 enum
17 {
18   LAST_SIGNAL
19 };
20
21 static guint signals[LAST_SIGNAL];
22 */
23
24 struct _EmpathyRosterGroupPriv
25 {
26   gchar *name;
27   gchar *icon_name;
28
29   /* Widgets associated with this group. EmpathyRosterGroup is not responsible
30    * of packing/displaying these widgets. This hash table is a just a set
31    * to keep track of them. */
32   GHashTable *widgets;
33 };
34
35 static void
36 empathy_roster_group_get_property (GObject *object,
37     guint property_id,
38     GValue *value,
39     GParamSpec *pspec)
40 {
41   EmpathyRosterGroup *self = EMPATHY_ROSTER_GROUP (object);
42
43   switch (property_id)
44     {
45       case PROP_NAME:
46         g_value_set_string (value, self->priv->name);
47         break;
48       case PROP_ICON:
49         g_value_set_string (value, self->priv->icon_name);
50         break;
51       default:
52         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
53         break;
54     }
55 }
56
57 static void
58 empathy_roster_group_set_property (GObject *object,
59     guint property_id,
60     const GValue *value,
61     GParamSpec *pspec)
62 {
63   EmpathyRosterGroup *self = EMPATHY_ROSTER_GROUP (object);
64
65   switch (property_id)
66     {
67       case PROP_NAME:
68         g_assert (self->priv->name == NULL); /* construct-only */
69         self->priv->name = g_value_dup_string (value);
70         break;
71       case PROP_ICON:
72         g_assert (self->priv->icon_name == NULL); /* construct-only */
73         self->priv->icon_name = g_value_dup_string (value);
74         break;
75       default:
76         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
77         break;
78     }
79 }
80
81 static void
82 empathy_roster_group_constructed (GObject *object)
83 {
84   EmpathyRosterGroup *self = EMPATHY_ROSTER_GROUP (object);
85   void (*chain_up) (GObject *) =
86       ((GObjectClass *) empathy_roster_group_parent_class)->constructed;
87   gchar *tmp;
88   GtkWidget *box, *label;
89
90   if (chain_up != NULL)
91     chain_up (object);
92
93   g_assert (self->priv->name != NULL);
94
95   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
96
97   /* Icon, if any */
98   if (!tp_str_empty (self->priv->icon_name))
99     {
100       GtkWidget *icon;
101
102       icon = gtk_image_new_from_icon_name (self->priv->icon_name,
103           GTK_ICON_SIZE_MENU);
104
105       if (icon != NULL)
106         gtk_box_pack_start (GTK_BOX (box), icon, FALSE, FALSE, 0);
107     }
108
109   /* Label */
110   tmp = g_strdup_printf ("<b>%s</b>", self->priv->name);
111   label = gtk_label_new (tmp);
112   g_free (tmp);
113
114   gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
115   gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
116
117   gtk_widget_show_all (box);
118
119   gtk_expander_set_label_widget (self->expander, box);
120 }
121
122 static void
123 empathy_roster_group_dispose (GObject *object)
124 {
125   EmpathyRosterGroup *self = EMPATHY_ROSTER_GROUP (object);
126   void (*chain_up) (GObject *) =
127       ((GObjectClass *) empathy_roster_group_parent_class)->dispose;
128
129   tp_clear_pointer (&self->priv->widgets, g_hash_table_unref);
130
131   if (chain_up != NULL)
132     chain_up (object);
133 }
134
135 static void
136 empathy_roster_group_finalize (GObject *object)
137 {
138   EmpathyRosterGroup *self = EMPATHY_ROSTER_GROUP (object);
139   void (*chain_up) (GObject *) =
140       ((GObjectClass *) empathy_roster_group_parent_class)->finalize;
141
142   g_free (self->priv->name);
143   g_free (self->priv->icon_name);
144
145   if (chain_up != NULL)
146     chain_up (object);
147 }
148
149 static void
150 empathy_roster_group_class_init (
151     EmpathyRosterGroupClass *klass)
152 {
153   GObjectClass *oclass = G_OBJECT_CLASS (klass);
154   GParamSpec *spec;
155
156   oclass->get_property = empathy_roster_group_get_property;
157   oclass->set_property = empathy_roster_group_set_property;
158   oclass->constructed = empathy_roster_group_constructed;
159   oclass->dispose = empathy_roster_group_dispose;
160   oclass->finalize = empathy_roster_group_finalize;
161
162   spec = g_param_spec_string ("name", "Name",
163       "Group name",
164       NULL,
165       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
166   g_object_class_install_property (oclass, PROP_NAME, spec);
167
168   spec = g_param_spec_string ("icon", "Icon",
169       "Icon name",
170       NULL,
171       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
172   g_object_class_install_property (oclass, PROP_ICON, spec);
173
174   g_type_class_add_private (klass, sizeof (EmpathyRosterGroupPriv));
175 }
176
177 static void
178 empathy_roster_group_init (EmpathyRosterGroup *self)
179 {
180   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
181       EMPATHY_TYPE_ROSTER_GROUP, EmpathyRosterGroupPriv);
182
183   self->priv->widgets = g_hash_table_new (NULL, NULL);
184
185   self->expander = GTK_EXPANDER (gtk_expander_new (NULL));
186   gtk_expander_set_use_markup (self->expander, TRUE);
187   gtk_expander_set_expanded (self->expander, TRUE);
188   gtk_widget_show (GTK_WIDGET (self->expander));
189
190   gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->expander));
191 }
192
193 GtkWidget *
194 empathy_roster_group_new (const gchar *name,
195     const gchar *icon)
196 {
197   return g_object_new (EMPATHY_TYPE_ROSTER_GROUP,
198       "name", name,
199       "icon", icon,
200       NULL);
201 }
202
203 const gchar *
204 empathy_roster_group_get_name (EmpathyRosterGroup *self)
205 {
206   return self->priv->name;
207 }
208
209 guint
210 empathy_roster_group_add_widget (EmpathyRosterGroup *self,
211     GtkWidget *widget)
212 {
213   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
214
215   g_hash_table_add (self->priv->widgets, widget);
216
217   return empathy_roster_group_get_widgets_count (self);
218 }
219
220 guint
221 empathy_roster_group_remove_widget (EmpathyRosterGroup *self,
222     GtkWidget *widget)
223 {
224   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
225
226   g_hash_table_remove (self->priv->widgets, widget);
227
228   return empathy_roster_group_get_widgets_count (self);
229 }
230
231 guint
232 empathy_roster_group_get_widgets_count (EmpathyRosterGroup *self)
233 {
234   return g_hash_table_size (self->priv->widgets);
235 }
236
237 GList *
238 empathy_roster_group_get_widgets (EmpathyRosterGroup *self)
239 {
240   return g_hash_table_get_keys (self->priv->widgets);
241 }