]> git.0d.be Git - empathy.git/commitdiff
add empathy-roster-group
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Mon, 28 May 2012 12:22:50 +0000 (14:22 +0200)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Thu, 14 Jun 2012 07:21:49 +0000 (09:21 +0200)
libempathy-gtk/Makefile.am
libempathy-gtk/empathy-roster-group.c [new file with mode: 0644]
libempathy-gtk/empathy-roster-group.h [new file with mode: 0644]
libempathy-gtk/empathy-roster-view.c

index 7a9d01dfa7b2c2c5aeaf7ac32c8e9f245764d837..ac3d3c1c6bbc1515062b6705b806f70a36138654 100644 (file)
@@ -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 (file)
index 0000000..bffd6a8
--- /dev/null
@@ -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 (file)
index 0000000..314ed3b
--- /dev/null
@@ -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__*/
index fb41dfbe0aa4d0426ae22ff07a7e8960b8bae125..0212ee1aa5329acda60457808bad1d9d1e1ddcdc 100644 (file)
@@ -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;