[empathy] add empathy-roster-group



commit 043d63caaf16e09c291f0dcd28068e0efbf97bdb
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date:   Mon May 28 14:22:50 2012 +0200

    add empathy-roster-group

 libempathy-gtk/Makefile.am            |    2 +
 libempathy-gtk/empathy-roster-group.c |  196 +++++++++++++++++++++++++++++++++
 libempathy-gtk/empathy-roster-group.h |   62 +++++++++++
 libempathy-gtk/empathy-roster-view.c  |    3 +
 4 files changed, 263 insertions(+), 0 deletions(-)
---
diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am
index 7a9d01d..ac3d3c1 100644
--- a/libempathy-gtk/Makefile.am
+++ b/libempathy-gtk/Makefile.am
@@ -79,6 +79,7 @@ libempathy_gtk_handwritten_source =            	\
 	empathy-presence-chooser.c		\
 	empathy-protocol-chooser.c		\
 	empathy-roster-contact.c			\
+	empathy-roster-group.c			\
 	empathy-roster-view.c			\
 	empathy-search-bar.c			\
 	empathy-share-my-desktop.c		\
@@ -149,6 +150,7 @@ libempathy_gtk_headers =			\
 	empathy-presence-chooser.h		\
 	empathy-protocol-chooser.h		\
 	empathy-roster-contact.h			\
+	empathy-roster-group.h			\
 	empathy-roster-view.h			\
 	empathy-search-bar.h			\
 	empathy-share-my-desktop.h		\
diff --git a/libempathy-gtk/empathy-roster-group.c b/libempathy-gtk/empathy-roster-group.c
new file mode 100644
index 0000000..bffd6a8
--- /dev/null
+++ b/libempathy-gtk/empathy-roster-group.c
@@ -0,0 +1,196 @@
+#include "config.h"
+
+#include "empathy-roster-group.h"
+
+#include <telepathy-glib/telepathy-glib.h>
+
+G_DEFINE_TYPE (EmpathyRosterGroup, empathy_roster_group, GTK_TYPE_EXPANDER)
+
+enum
+{
+  PROP_NAME = 1,
+  N_PROPS
+};
+
+/*
+enum
+{
+  LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+*/
+
+struct _EmpathyRosterGroupPriv
+{
+  gchar *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;
+      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;
+      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;
+
+  if (chain_up != NULL)
+    chain_up (object);
+
+  g_assert (self->priv->name != NULL);
+
+  tmp = g_strdup_printf ("<b>%s</b>", self->priv->name);
+  gtk_expander_set_label (GTK_EXPANDER (self), tmp);
+  g_free (tmp);
+}
+
+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);
+
+  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);
+
+  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);
+}
+
+GtkWidget *
+empathy_roster_group_new (const gchar *name)
+{
+  return g_object_new (EMPATHY_TYPE_ROSTER_GROUP,
+      "name", name,
+      "use-markup", TRUE,
+      "expanded", TRUE,
+      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);
+}
diff --git a/libempathy-gtk/empathy-roster-group.h b/libempathy-gtk/empathy-roster-group.h
new file mode 100644
index 0000000..314ed3b
--- /dev/null
+++ b/libempathy-gtk/empathy-roster-group.h
@@ -0,0 +1,62 @@
+#ifndef __EMPATHY_ROSTER_GROUP_H__
+#define __EMPATHY_ROSTER_GROUP_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef struct _EmpathyRosterGroup EmpathyRosterGroup;
+typedef struct _EmpathyRosterGroupClass EmpathyRosterGroupClass;
+typedef struct _EmpathyRosterGroupPriv EmpathyRosterGroupPriv;
+
+struct _EmpathyRosterGroupClass
+{
+  /*<private>*/
+  GtkExpanderClass parent_class;
+};
+
+struct _EmpathyRosterGroup
+{
+  /*<private>*/
+  GtkExpander parent;
+  EmpathyRosterGroupPriv *priv;
+};
+
+GType empathy_roster_group_get_type (void);
+
+/* TYPE MACROS */
+#define EMPATHY_TYPE_ROSTER_GROUP \
+  (empathy_roster_group_get_type ())
+#define EMPATHY_ROSTER_GROUP(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj), \
+    EMPATHY_TYPE_ROSTER_GROUP, \
+    EmpathyRosterGroup))
+#define EMPATHY_ROSTER_GROUP_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass), \
+    EMPATHY_TYPE_ROSTER_GROUP, \
+    EmpathyRosterGroupClass))
+#define EMPATHY_IS_ROSTER_GROUP(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj), \
+    EMPATHY_TYPE_ROSTER_GROUP))
+#define EMPATHY_IS_ROSTER_GROUP_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass), \
+    EMPATHY_TYPE_ROSTER_GROUP))
+#define EMPATHY_ROSTER_GROUP_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+    EMPATHY_TYPE_ROSTER_GROUP, \
+    EmpathyRosterGroupClass))
+
+GtkWidget * empathy_roster_group_new (const gchar *name);
+
+const gchar * empathy_roster_group_get_name (EmpathyRosterGroup *self);
+
+guint empathy_roster_group_add_widget (EmpathyRosterGroup *self,
+    GtkWidget *widget);
+guint empathy_roster_group_remove_widget (EmpathyRosterGroup *self,
+    GtkWidget *widget);
+guint empathy_roster_group_get_widgets_count (EmpathyRosterGroup *self);
+GList * empathy_roster_group_get_widgets (EmpathyRosterGroup *self);
+
+G_END_DECLS
+
+#endif /* #ifndef __EMPATHY_ROSTER_GROUP_H__*/
diff --git a/libempathy-gtk/empathy-roster-view.c b/libempathy-gtk/empathy-roster-view.c
index fb41dfb..0212ee1 100644
--- a/libempathy-gtk/empathy-roster-view.c
+++ b/libempathy-gtk/empathy-roster-view.c
@@ -5,6 +5,7 @@
 #include <glib/gi18n-lib.h>
 
 #include <libempathy-gtk/empathy-roster-contact.h>
+#include <libempathy-gtk/empathy-roster-group.h>
 
 G_DEFINE_TYPE (EmpathyRosterView, empathy_roster_view, EGG_TYPE_LIST_BOX)
 
@@ -40,6 +41,8 @@ struct _EmpathyRosterViewPriv
    * I prefer to stay coherent in the way this hash is managed.
    */
   GHashTable *roster_contacts;
+  /* (gchar *group_name) -> EmpathyRosterGroup (borrowed) */
+  GHashTable *roster_groups;
 
   gboolean show_offline;
   gboolean show_groups;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]