[empathy] Make EmpathyIndividualMenu a proper GObject, derived from GtkMenu



commit 3172fd7585eef696197237c9e0d7dbd910a7af9f
Author: Philip Withnall <philip withnall collabora co uk>
Date:   Wed Sep 1 17:37:30 2010 +0100

    Make EmpathyIndividualMenu a proper GObject, derived from GtkMenu

 libempathy-gtk/empathy-individual-menu.c |  155 +++++++++++++++++++++++++++---
 libempathy-gtk/empathy-individual-menu.h |   26 +++++
 2 files changed, 168 insertions(+), 13 deletions(-)
---
diff --git a/libempathy-gtk/empathy-individual-menu.c b/libempathy-gtk/empathy-individual-menu.c
index 69f0330..622d278 100644
--- a/libempathy-gtk/empathy-individual-menu.c
+++ b/libempathy-gtk/empathy-individual-menu.c
@@ -42,6 +42,7 @@
 #include "empathy-images.h"
 #include "empathy-log-window.h"
 #include "empathy-contact-dialogs.h"
+#include "empathy-gtk-enum-types.h"
 #include "empathy-individual-dialogs.h"
 #include "empathy-individual-edit-dialog.h"
 #include "empathy-individual-information-dialog.h"
@@ -49,6 +50,20 @@
 #include "empathy-share-my-desktop.h"
 #include "empathy-linking-dialog.h"
 
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIndividualMenu)
+
+typedef struct {
+  FolksIndividual *individual; /* owned */
+  EmpathyIndividualFeatureFlags features;
+} EmpathyIndividualMenuPriv;
+
+enum {
+  PROP_INDIVIDUAL = 1,
+  PROP_FEATURES,
+};
+
+G_DEFINE_TYPE (EmpathyIndividualMenu, empathy_individual_menu, GTK_TYPE_MENU);
+
 static void
 individual_menu_add_personas (GtkMenuShell *menu,
     FolksIndividual *individual,
@@ -173,21 +188,28 @@ individual_menu_add_personas (GtkMenuShell *menu,
     }
 }
 
-GtkWidget *
-empathy_individual_menu_new (FolksIndividual *individual,
-    EmpathyIndividualFeatureFlags features)
+static void
+empathy_individual_menu_init (EmpathyIndividualMenu *self)
 {
-  GtkWidget *menu;
-  GtkMenuShell *shell;
-  GtkWidget *item;
+  EmpathyIndividualMenuPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+      EMPATHY_TYPE_INDIVIDUAL_MENU, EmpathyIndividualMenuPriv);
 
-  g_return_val_if_fail (FOLKS_IS_INDIVIDUAL (individual), NULL);
+  self->priv = priv;
+}
 
-  if (features == EMPATHY_INDIVIDUAL_FEATURE_NONE)
-    return NULL;
+static void
+constructed (GObject *object)
+{
+  EmpathyIndividualMenuPriv *priv = GET_PRIV (object);
+  GtkMenuShell *shell;
+  GtkWidget *item;
+  FolksIndividual *individual;
+  EmpathyIndividualFeatureFlags features;
 
-  menu = gtk_menu_new ();
-  shell = GTK_MENU_SHELL (menu);
+  /* Build the menu */
+  shell = GTK_MENU_SHELL (object);
+  individual = priv->individual;
+  features = priv->features;
 
   /* Add Contact */
   item = empathy_individual_add_menu_item_new (individual);
@@ -247,7 +269,7 @@ empathy_individual_menu_new (FolksIndividual *individual,
   gtk_widget_show (item);
 
   /* Menu items to target specific contacts */
-  individual_menu_add_personas (GTK_MENU_SHELL (menu), individual, features);
+  individual_menu_add_personas (GTK_MENU_SHELL (object), individual, features);
 
   /* Separator */
   if (features & (EMPATHY_INDIVIDUAL_FEATURE_EDIT |
@@ -291,8 +313,115 @@ empathy_individual_menu_new (FolksIndividual *individual,
       gtk_menu_shell_append (shell, item);
       gtk_widget_show (item);
     }
+}
+
+static void
+get_property (GObject *object,
+    guint param_id,
+    GValue *value,
+    GParamSpec *pspec)
+{
+  EmpathyIndividualMenuPriv *priv;
+
+  priv = GET_PRIV (object);
+
+  switch (param_id)
+    {
+      case PROP_INDIVIDUAL:
+        g_value_set_object (value, priv->individual);
+        break;
+      case PROP_FEATURES:
+        g_value_set_flags (value, priv->features);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+        break;
+    }
+}
 
-  return menu;
+static void
+set_property (GObject *object,
+    guint param_id,
+    const GValue *value,
+    GParamSpec *pspec)
+{
+  EmpathyIndividualMenuPriv *priv;
+
+  priv = GET_PRIV (object);
+
+  switch (param_id)
+    {
+      case PROP_INDIVIDUAL:
+        priv->individual = g_value_dup_object (value);
+        break;
+      case PROP_FEATURES:
+        priv->features = g_value_get_flags (value);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+        break;
+    }
+}
+
+static void
+dispose (GObject *object)
+{
+  EmpathyIndividualMenuPriv *priv = GET_PRIV (object);
+
+  tp_clear_object (&priv->individual);
+
+  G_OBJECT_CLASS (empathy_individual_menu_parent_class)->dispose (object);
+}
+
+static void
+empathy_individual_menu_class_init (EmpathyIndividualMenuClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->constructed = constructed;
+  object_class->get_property = get_property;
+  object_class->set_property = set_property;
+  object_class->dispose = dispose;
+
+  /**
+   * EmpathyIndividualMenu:individual:
+   *
+   * The #FolksIndividual the menu is for.
+   */
+  g_object_class_install_property (object_class, PROP_INDIVIDUAL,
+      g_param_spec_object ("individual",
+          "Individual",
+          "The #FolksIndividual the menu is for.",
+          FOLKS_TYPE_INDIVIDUAL,
+          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+  /**
+   * EmpathyIndividualMenu:features:
+   *
+   * A set of feature flags controlling which entries are shown.
+   */
+  g_object_class_install_property (object_class, PROP_FEATURES,
+      g_param_spec_flags ("features",
+          "Features",
+          "A set of feature flags controlling which entries are shown.",
+          EMPATHY_TYPE_INDIVIDUAL_FEATURE_FLAGS,
+          EMPATHY_INDIVIDUAL_FEATURE_NONE,
+          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+  g_type_class_add_private (object_class, sizeof (EmpathyIndividualMenuPriv));
+}
+
+GtkWidget *
+empathy_individual_menu_new (FolksIndividual *individual,
+    EmpathyIndividualFeatureFlags features)
+{
+  g_return_val_if_fail (FOLKS_IS_INDIVIDUAL (individual), NULL);
+  g_return_val_if_fail (features != EMPATHY_INDIVIDUAL_FEATURE_NONE, NULL);
+
+  return g_object_new (EMPATHY_TYPE_INDIVIDUAL_MENU,
+      "individual", individual,
+      "features", features,
+      NULL);
 }
 
 static void
diff --git a/libempathy-gtk/empathy-individual-menu.h b/libempathy-gtk/empathy-individual-menu.h
index a00de3d..41eac60 100644
--- a/libempathy-gtk/empathy-individual-menu.h
+++ b/libempathy-gtk/empathy-individual-menu.h
@@ -39,6 +39,32 @@ typedef enum {
 	EMPATHY_INDIVIDUAL_FEATURE_ALL = (1 << 7) - 1,
 } EmpathyIndividualFeatureFlags;
 
+#define EMPATHY_TYPE_INDIVIDUAL_MENU (empathy_individual_menu_get_type ())
+#define EMPATHY_INDIVIDUAL_MENU(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), \
+    EMPATHY_TYPE_INDIVIDUAL_MENU, EmpathyIndividualMenu))
+#define EMPATHY_INDIVIDUAL_MENU_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), \
+    EMPATHY_TYPE_INDIVIDUAL_MENU, EmpathyIndividualMenuClass))
+#define EMPATHY_IS_INDIVIDUAL_MENU(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
+    EMPATHY_TYPE_INDIVIDUAL_MENU))
+#define EMPATHY_IS_INDIVIDUAL_MENU_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), \
+    EMPATHY_TYPE_INDIVIDUAL_MENU))
+#define EMPATHY_INDIVIDUAL_MENU_GET_CLASS(o) ( \
+    G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_INDIVIDUAL_MENU, \
+        EmpathyIndividualMenuClass))
+
+typedef struct {
+	GtkMenu parent;
+
+	/*<private>*/
+	gpointer priv;
+} EmpathyIndividualMenu;
+
+typedef struct {
+	GtkMenuClass parent_class;
+} EmpathyIndividualMenuClass;
+
+GType empathy_individual_menu_get_type (void) G_GNUC_CONST;
+
 GtkWidget * empathy_individual_menu_new (FolksIndividual *individual,
     EmpathyIndividualFeatureFlags features);
 GtkWidget * empathy_individual_add_menu_item_new  (FolksIndividual *individual);



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