Commit 3172fd75 authored by Philip Withnall's avatar Philip Withnall

Make EmpathyIndividualMenu a proper GObject, derived from GtkMenu

parent a92e47dd
......@@ -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
......
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment