#include "config.h" #include "empathy-roster-group.h" #include G_DEFINE_TYPE (EmpathyRosterGroup, empathy_roster_group, GTK_TYPE_LIST_BOX_ROW) enum { PROP_NAME = 1, PROP_ICON, N_PROPS }; /* enum { LAST_SIGNAL }; static guint signals[LAST_SIGNAL]; */ struct _EmpathyRosterGroupPriv { gchar *name; gchar *icon_name; /* Widgets associated with this group. EmpathyRosterGroup is not responsible * of packing/displaying these widgets. This hash table is a just a set * to keep track of them. */ GHashTable *widgets; }; static void empathy_roster_group_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { EmpathyRosterGroup *self = EMPATHY_ROSTER_GROUP (object); switch (property_id) { case PROP_NAME: g_value_set_string (value, self->priv->name); break; case PROP_ICON: g_value_set_string (value, self->priv->icon_name); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void empathy_roster_group_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { EmpathyRosterGroup *self = EMPATHY_ROSTER_GROUP (object); switch (property_id) { case PROP_NAME: g_assert (self->priv->name == NULL); /* construct-only */ self->priv->name = g_value_dup_string (value); break; case PROP_ICON: g_assert (self->priv->icon_name == NULL); /* construct-only */ self->priv->icon_name = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void empathy_roster_group_constructed (GObject *object) { EmpathyRosterGroup *self = EMPATHY_ROSTER_GROUP (object); void (*chain_up) (GObject *) = ((GObjectClass *) empathy_roster_group_parent_class)->constructed; gchar *tmp; GtkWidget *box, *label; if (chain_up != NULL) chain_up (object); g_assert (self->priv->name != NULL); box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); /* Icon, if any */ if (!tp_str_empty (self->priv->icon_name)) { GtkWidget *icon; icon = gtk_image_new_from_icon_name (self->priv->icon_name, GTK_ICON_SIZE_MENU); if (icon != NULL) gtk_box_pack_start (GTK_BOX (box), icon, FALSE, FALSE, 0); } /* Label */ tmp = g_strdup_printf ("%s", self->priv->name); label = gtk_label_new (tmp); g_free (tmp); gtk_label_set_use_markup (GTK_LABEL (label), TRUE); gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0); gtk_widget_show_all (box); gtk_expander_set_label_widget (self->expander, box); } static void empathy_roster_group_dispose (GObject *object) { EmpathyRosterGroup *self = EMPATHY_ROSTER_GROUP (object); void (*chain_up) (GObject *) = ((GObjectClass *) empathy_roster_group_parent_class)->dispose; tp_clear_pointer (&self->priv->widgets, g_hash_table_unref); if (chain_up != NULL) chain_up (object); } static void empathy_roster_group_finalize (GObject *object) { EmpathyRosterGroup *self = EMPATHY_ROSTER_GROUP (object); void (*chain_up) (GObject *) = ((GObjectClass *) empathy_roster_group_parent_class)->finalize; g_free (self->priv->name); g_free (self->priv->icon_name); if (chain_up != NULL) chain_up (object); } static void empathy_roster_group_class_init ( EmpathyRosterGroupClass *klass) { GObjectClass *oclass = G_OBJECT_CLASS (klass); GParamSpec *spec; oclass->get_property = empathy_roster_group_get_property; oclass->set_property = empathy_roster_group_set_property; oclass->constructed = empathy_roster_group_constructed; oclass->dispose = empathy_roster_group_dispose; oclass->finalize = empathy_roster_group_finalize; spec = g_param_spec_string ("name", "Name", "Group name", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); g_object_class_install_property (oclass, PROP_NAME, spec); spec = g_param_spec_string ("icon", "Icon", "Icon name", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); g_object_class_install_property (oclass, PROP_ICON, spec); g_type_class_add_private (klass, sizeof (EmpathyRosterGroupPriv)); } static void empathy_roster_group_init (EmpathyRosterGroup *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_ROSTER_GROUP, EmpathyRosterGroupPriv); self->priv->widgets = g_hash_table_new (NULL, NULL); self->expander = GTK_EXPANDER (gtk_expander_new (NULL)); gtk_expander_set_use_markup (self->expander, TRUE); gtk_expander_set_expanded (self->expander, TRUE); gtk_widget_show (GTK_WIDGET (self->expander)); gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->expander)); } GtkWidget * empathy_roster_group_new (const gchar *name, const gchar *icon) { return g_object_new (EMPATHY_TYPE_ROSTER_GROUP, "name", name, "icon", icon, NULL); } const gchar * empathy_roster_group_get_name (EmpathyRosterGroup *self) { return self->priv->name; } guint empathy_roster_group_add_widget (EmpathyRosterGroup *self, GtkWidget *widget) { g_return_val_if_fail (GTK_IS_WIDGET (widget), 0); g_hash_table_add (self->priv->widgets, widget); return empathy_roster_group_get_widgets_count (self); } guint empathy_roster_group_remove_widget (EmpathyRosterGroup *self, GtkWidget *widget) { g_return_val_if_fail (GTK_IS_WIDGET (widget), 0); g_hash_table_remove (self->priv->widgets, widget); return empathy_roster_group_get_widgets_count (self); } guint empathy_roster_group_get_widgets_count (EmpathyRosterGroup *self) { return g_hash_table_size (self->priv->widgets); } GList * empathy_roster_group_get_widgets (EmpathyRosterGroup *self) { return g_hash_table_get_keys (self->priv->widgets); }