diff options
author | Xavier Claessens <xclaesse@src.gnome.org> | 2008-04-25 17:33:29 +0800 |
---|---|---|
committer | Xavier Claessens <xclaesse@src.gnome.org> | 2008-04-25 17:33:29 +0800 |
commit | 50efb94e69a9cccebb7475f1977e7eb1f749f362 (patch) | |
tree | 60f490e3c7896e5ecb5b2cda835030ebfc1630ef /libempathy-gtk | |
parent | 9d5d80ba33f31e935c7335be6fa89ecd183b85bc (diff) | |
download | gsoc2013-empathy-50efb94e69a9cccebb7475f1977e7eb1f749f362.tar gsoc2013-empathy-50efb94e69a9cccebb7475f1977e7eb1f749f362.tar.gz gsoc2013-empathy-50efb94e69a9cccebb7475f1977e7eb1f749f362.tar.bz2 gsoc2013-empathy-50efb94e69a9cccebb7475f1977e7eb1f749f362.tar.lz gsoc2013-empathy-50efb94e69a9cccebb7475f1977e7eb1f749f362.tar.xz gsoc2013-empathy-50efb94e69a9cccebb7475f1977e7eb1f749f362.tar.zst gsoc2013-empathy-50efb94e69a9cccebb7475f1977e7eb1f749f362.zip |
Create contact menu in empathy-contact-menu.h
svn path=/trunk/; revision=1046
Diffstat (limited to 'libempathy-gtk')
-rw-r--r-- | libempathy-gtk/empathy-chat.c | 44 | ||||
-rw-r--r-- | libempathy-gtk/empathy-contact-list-view.c | 344 | ||||
-rw-r--r-- | libempathy-gtk/empathy-contact-list-view.h | 35 | ||||
-rw-r--r-- | libempathy-gtk/empathy-contact-menu.c | 63 | ||||
-rw-r--r-- | libempathy-gtk/empathy-contact-menu.h | 22 |
5 files changed, 260 insertions, 248 deletions
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c index 55282d164..22b6f46bb 100644 --- a/libempathy-gtk/empathy-chat.c +++ b/libempathy-gtk/empathy-chat.c @@ -1203,12 +1203,11 @@ chat_set_show_contacts (EmpathyChat *chat, gboolean show) store = empathy_contact_list_store_new (EMPATHY_CONTACT_LIST (priv->tp_chat)); priv->contact_list_view = GTK_WIDGET (empathy_contact_list_view_new (store, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CHAT | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CALL | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_LOG | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_FT | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INVITE | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INFO)); + EMPATHY_CONTACT_LIST_FEATURE_NONE, + EMPATHY_CONTACT_FEATURE_CHAT | + EMPATHY_CONTACT_FEATURE_CALL | + EMPATHY_CONTACT_FEATURE_LOG | + EMPATHY_CONTACT_FEATURE_INFO)); gtk_container_add (GTK_CONTAINER (priv->scrolled_window_contacts), priv->contact_list_view); gtk_widget_show (priv->contact_list_view); @@ -1709,39 +1708,16 @@ empathy_chat_get_contact_menu (EmpathyChat *chat) g_return_val_if_fail (EMPATHY_IS_CHAT (chat), NULL); if (priv->remote_contact) { - GtkMenuShell *shell; - GtkWidget *item; - - menu = gtk_menu_new (); - shell = GTK_MENU_SHELL (menu); - - item = empathy_contact_call_menu_item_new (priv->remote_contact); - gtk_menu_shell_append (shell, item); - gtk_widget_show (item); - - item = empathy_contact_log_menu_item_new (priv->remote_contact); - gtk_menu_shell_append (shell, item); - gtk_widget_show (item); - - /* Separator */ - item = gtk_separator_menu_item_new (); - gtk_menu_shell_append (shell, item); - gtk_widget_show (item); - - item = empathy_contact_info_menu_item_new (priv->remote_contact); - gtk_menu_shell_append (shell, item); - gtk_widget_show (item); + menu = empathy_contact_menu_new (priv->remote_contact, + EMPATHY_CONTACT_FEATURE_CALL | + EMPATHY_CONTACT_FEATURE_LOG | + EMPATHY_CONTACT_FEATURE_INFO); } else if (priv->contact_list_view) { EmpathyContactListView *view; - EmpathyContact *contact; view = EMPATHY_CONTACT_LIST_VIEW (priv->contact_list_view); - contact = empathy_contact_list_view_get_selected (view); - if (contact) { - menu = empathy_contact_list_view_get_contact_menu (view, contact); - g_object_unref (contact); - } + menu = empathy_contact_list_view_get_contact_menu (view); } return menu; diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c index b0bfdf909..646629bb0 100644 --- a/libempathy-gtk/empathy-contact-list-view.c +++ b/libempathy-gtk/empathy-contact-list-view.c @@ -41,7 +41,6 @@ #include "empathy-contact-list-view.h" #include "empathy-contact-list-store.h" -#include "empathy-contact-menu.h" #include "empathy-images.h" #include "empathy-cell-renderer-expander.h" #include "empathy-cell-renderer-text.h" @@ -62,9 +61,10 @@ #define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EMPATHY_TYPE_CONTACT_LIST_VIEW, EmpathyContactListViewPriv)) typedef struct { - EmpathyContactListStore *store; - GtkTreeRowReference *drag_row; - EmpathyContactListFeatures features; + EmpathyContactListStore *store; + GtkTreeRowReference *drag_row; + EmpathyContactListFeatureFlags list_features; + EmpathyContactFeatureFlags contact_features; } EmpathyContactListViewPriv; typedef struct { @@ -81,7 +81,9 @@ typedef struct { enum { PROP_0, - PROP_FEATURES + PROP_STORE, + PROP_LIST_FEATURES, + PROP_CONTACT_FEATURES, }; enum DndDragType { @@ -388,67 +390,55 @@ contact_list_view_drag_drop (GtkWidget *widget, return FALSE; } +typedef struct { + EmpathyContactListView *view; + guint button; + guint32 time; +} MenuPopupData; + static gboolean -contact_list_view_button_press_event_cb (EmpathyContactListView *view, - GdkEventButton *event, - gpointer user_data) +contact_list_view_popup_menu_idle_cb (gpointer user_data) { - EmpathyContactListViewPriv *priv; - EmpathyContact *contact; - GtkTreePath *path; - GtkTreeSelection *selection; - GtkTreeModel *model; - GtkTreeIter iter; - gboolean row_exists; - GtkWidget *menu; - - priv = GET_PRIV (view); - - if (event->button != 3) { - return FALSE; - } - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); - model = gtk_tree_view_get_model (GTK_TREE_VIEW (view)); - - gtk_widget_grab_focus (GTK_WIDGET (view)); - - row_exists = gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (view), - event->x, event->y, - &path, - NULL, NULL, NULL); - if (!row_exists) { - return FALSE; - } - - gtk_tree_selection_unselect_all (selection); - gtk_tree_selection_select_path (selection, path); - - gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_path_free (path); + MenuPopupData *data = user_data; + GtkWidget *menu; - gtk_tree_model_get (model, &iter, - EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact, - -1); - - if (contact) { - menu = empathy_contact_list_view_get_contact_menu (view, contact); - g_object_unref (contact); - } else { - menu = empathy_contact_list_view_get_group_menu (view); + menu = empathy_contact_list_view_get_contact_menu (data->view); + if (!menu) { + menu = empathy_contact_list_view_get_group_menu (data->view); } if (!menu) { - return FALSE; + goto OUT; } gtk_widget_show (menu); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, - event->button, event->time); + data->button, data->time); - return TRUE; +OUT: + g_slice_free (MenuPopupData, data); + + return FALSE; +} + +static gboolean +contact_list_view_button_press_event_cb (EmpathyContactListView *view, + GdkEventButton *event, + gpointer user_data) +{ + if (event->button == 3) { + MenuPopupData *data; + + data = g_slice_new (MenuPopupData); + data->view = view; + data->button = event->button; + data->time = event->time; + g_idle_add (contact_list_view_popup_menu_idle_cb, data); + } + + return FALSE; } static void @@ -462,7 +452,7 @@ contact_list_view_row_activated_cb (EmpathyContactListView *view, GtkTreeModel *model; GtkTreeIter iter; - if (!(priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CHAT)) { + if (!(priv->contact_features & EMPATHY_CONTACT_FEATURE_CHAT)) { return; } @@ -489,7 +479,7 @@ contact_list_view_voip_activated_cb (EmpathyCellRendererActivatable *cell, GtkTreeIter iter; EmpathyContact *contact; - if (!(priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CALL)) { + if (!(priv->contact_features & EMPATHY_CONTACT_FEATURE_CALL)) { return; } @@ -693,7 +683,7 @@ contact_list_view_row_expand_or_collapse_cb (EmpathyContactListView *view, gchar *name; gboolean expanded; - if (!(priv->features & EMPATHY_CONTACT_LIST_FEATURE_GROUPS_SAVE)) { + if (!(priv->list_features & EMPATHY_CONTACT_LIST_FEATURE_GROUPS_SAVE)) { return; } @@ -729,7 +719,7 @@ contact_list_view_row_has_child_toggled_cb (GtkTreeModel *model, return; } - if (!(priv->features & EMPATHY_CONTACT_LIST_FEATURE_GROUPS_SAVE) || + if (!(priv->list_features & EMPATHY_CONTACT_LIST_FEATURE_GROUPS_SAVE) || empathy_contact_group_get_expanded (name)) { g_signal_handlers_block_by_func (view, contact_list_view_row_expand_or_collapse_cb, @@ -865,6 +855,40 @@ contact_list_view_setup (EmpathyContactListView *view) } static void +contact_list_view_set_list_features (EmpathyContactListView *view, + EmpathyContactListFeatureFlags features) +{ + EmpathyContactListViewPriv *priv = GET_PRIV (view); + + g_return_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view)); + + priv->list_features = features; + + /* Update DnD source/dest */ + if (features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_DRAG) { + gtk_drag_source_set (GTK_WIDGET (view), + GDK_BUTTON1_MASK, + drag_types_source, + G_N_ELEMENTS (drag_types_source), + GDK_ACTION_MOVE | GDK_ACTION_COPY); + } else { + gtk_drag_source_unset (GTK_WIDGET (view)); + + } + + if (features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_DROP) { + gtk_drag_dest_set (GTK_WIDGET (view), + GTK_DEST_DEFAULT_ALL, + drag_types_dest, + G_N_ELEMENTS (drag_types_dest), + GDK_ACTION_MOVE | GDK_ACTION_COPY); + } else { + /* FIXME: URI could still be droped depending on FT feature */ + gtk_drag_dest_unset (GTK_WIDGET (view)); + } +} + +static void contact_list_view_finalize (GObject *object) { EmpathyContactListViewPriv *priv; @@ -889,8 +913,14 @@ contact_list_view_get_property (GObject *object, priv = GET_PRIV (object); switch (param_id) { - case PROP_FEATURES: - g_value_set_flags (value, priv->features); + case PROP_STORE: + g_value_set_object (value, priv->store); + break; + case PROP_LIST_FEATURES: + g_value_set_flags (value, priv->list_features); + break; + case PROP_CONTACT_FEATURES: + g_value_set_flags (value, priv->contact_features); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); @@ -905,13 +935,18 @@ contact_list_view_set_property (GObject *object, GParamSpec *pspec) { EmpathyContactListView *view = EMPATHY_CONTACT_LIST_VIEW (object); - EmpathyContactListViewPriv *priv; - - priv = GET_PRIV (object); + EmpathyContactListViewPriv *priv = GET_PRIV (object); switch (param_id) { - case PROP_FEATURES: - empathy_contact_list_view_set_features (view, g_value_get_flags (value)); + case PROP_STORE: + priv->store = g_value_dup_object (value); + contact_list_view_setup (view); + break; + case PROP_LIST_FEATURES: + contact_list_view_set_list_features (view, g_value_get_flags (value)); + break; + case PROP_CONTACT_FEATURES: + priv->contact_features = g_value_get_flags (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); @@ -951,12 +986,27 @@ empathy_contact_list_view_class_init (EmpathyContactListViewClass *klass) 3, EMPATHY_TYPE_CONTACT, G_TYPE_STRING, G_TYPE_STRING); g_object_class_install_property (object_class, - PROP_FEATURES, - g_param_spec_flags ("features", + PROP_STORE, + g_param_spec_object ("store", + "The store of the view", + "The store of the view", + EMPATHY_TYPE_CONTACT_LIST_STORE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_LIST_FEATURES, + g_param_spec_flags ("list-features", "Features of the view", "Falgs for all enabled features", - EMPATHY_TYPE_CONTACT_LIST_FEATURES, - 0, + EMPATHY_TYPE_CONTACT_LIST_FEATURE_FLAGS, + EMPATHY_CONTACT_LIST_FEATURE_NONE, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_CONTACT_FEATURES, + g_param_spec_flags ("contact-features", + "Features of the contact menu", + "Falgs for all enabled features for the menu", + EMPATHY_TYPE_CONTACT_FEATURE_FLAGS, + EMPATHY_CONTACT_FEATURE_NONE, G_PARAM_READWRITE)); g_type_class_add_private (object_class, sizeof (EmpathyContactListViewPriv)); @@ -992,69 +1042,17 @@ empathy_contact_list_view_init (EmpathyContactListView *view) } EmpathyContactListView * -empathy_contact_list_view_new (EmpathyContactListStore *store, - EmpathyContactListFeatures features) +empathy_contact_list_view_new (EmpathyContactListStore *store, + EmpathyContactListFeatureFlags list_features, + EmpathyContactFeatureFlags contact_features) { - EmpathyContactListView *view; - EmpathyContactListViewPriv *priv; - g_return_val_if_fail (EMPATHY_IS_CONTACT_LIST_STORE (store), NULL); - view = g_object_new (EMPATHY_TYPE_CONTACT_LIST_VIEW, - "features", features, - NULL); - - priv = GET_PRIV (view); - priv->store = g_object_ref (store); - contact_list_view_setup (EMPATHY_CONTACT_LIST_VIEW (view)); - - return view; -} - -void -empathy_contact_list_view_set_features (EmpathyContactListView *view, - EmpathyContactListFeatures features) -{ - EmpathyContactListViewPriv *priv = GET_PRIV (view); - - g_return_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view)); - - priv->features = features; - - /* Update DnD source/dest */ - if (features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_DRAG) { - gtk_drag_source_set (GTK_WIDGET (view), - GDK_BUTTON1_MASK, - drag_types_source, - G_N_ELEMENTS (drag_types_source), - GDK_ACTION_MOVE | GDK_ACTION_COPY); - } else { - gtk_drag_source_unset (GTK_WIDGET (view)); - - } - - if (features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_DROP) { - gtk_drag_dest_set (GTK_WIDGET (view), - GTK_DEST_DEFAULT_ALL, - drag_types_dest, - G_N_ELEMENTS (drag_types_dest), - GDK_ACTION_MOVE | GDK_ACTION_COPY); - } else { - /* FIXME: URI could still be droped depending on FT feature */ - gtk_drag_dest_unset (GTK_WIDGET (view)); - } - - g_object_notify (G_OBJECT (view), "features"); -} - -EmpathyContactListFeatures -empathy_contact_list_view_get_features (EmpathyContactListView *view) -{ - EmpathyContactListViewPriv *priv = GET_PRIV (view); - - g_return_val_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view), FALSE); - - return priv->features; + return g_object_new (EMPATHY_TYPE_CONTACT_LIST_VIEW, + "store", store, + "contact-features", contact_features, + "list-features", list_features, + NULL); } EmpathyContact * @@ -1180,14 +1178,20 @@ GtkWidget * empathy_contact_list_view_get_group_menu (EmpathyContactListView *view) { EmpathyContactListViewPriv *priv = GET_PRIV (view); + gchar *group; GtkWidget *menu; GtkWidget *item; GtkWidget *image; g_return_val_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view), NULL); - if (!(priv->features & (EMPATHY_CONTACT_LIST_FEATURE_GROUPS_RENAME | - EMPATHY_CONTACT_LIST_FEATURE_GROUPS_REMOVE))) { + if (!(priv->list_features & (EMPATHY_CONTACT_LIST_FEATURE_GROUPS_RENAME | + EMPATHY_CONTACT_LIST_FEATURE_GROUPS_REMOVE))) { + return NULL; + } + + group = empathy_contact_list_view_get_selected_group (view); + if (!group) { return NULL; } @@ -1203,7 +1207,7 @@ empathy_contact_list_view_get_group_menu (EmpathyContactListView *view) view); }*/ - if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_GROUPS_REMOVE) { + if (priv->list_features & EMPATHY_CONTACT_LIST_FEATURE_GROUPS_REMOVE) { item = gtk_image_menu_item_new_with_mnemonic (_("_Remove")); image = gtk_image_new_from_icon_name (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU); @@ -1215,6 +1219,8 @@ empathy_contact_list_view_get_group_menu (EmpathyContactListView *view) view); } + g_free (group); + return menu; } @@ -1248,89 +1254,53 @@ contact_list_view_remove_activate_cb (GtkMenuItem *menuitem, } GtkWidget * -empathy_contact_list_view_get_contact_menu (EmpathyContactListView *view, - EmpathyContact *contact) +empathy_contact_list_view_get_contact_menu (EmpathyContactListView *view) { EmpathyContactListViewPriv *priv = GET_PRIV (view); + EmpathyContact *contact; GtkWidget *menu; - GtkMenuShell *shell; GtkWidget *item; GtkWidget *image; g_return_val_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view), NULL); - g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); - - if (!(priv->features & (EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CHAT | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CALL | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_LOG | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_FT | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INVITE | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_EDIT | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INFO | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE))) { - return NULL; - } - menu = gtk_menu_new (); - shell = GTK_MENU_SHELL (menu); - - /* Main items */ - if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CHAT) { - item = empathy_contact_chat_menu_item_new (contact); - gtk_menu_shell_append (shell, item); - gtk_widget_show (item); - } - if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CALL) { - item = empathy_contact_call_menu_item_new (contact); - gtk_menu_shell_append (shell, item); - gtk_widget_show (item); - } - if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_LOG) { - item = empathy_contact_log_menu_item_new (contact); - gtk_menu_shell_append (shell, item); - gtk_widget_show (item); + contact = empathy_contact_list_view_get_selected (view); + if (!contact) { + return NULL; } - /* Separator */ - if (priv->features & (EMPATHY_CONTACT_LIST_FEATURE_CONTACT_EDIT | - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INFO)) { - item = gtk_separator_menu_item_new (); - gtk_menu_shell_append (shell, item); - gtk_widget_show (item); - } + menu = empathy_contact_menu_new (contact, priv->contact_features); - /* More items */ - if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_EDIT) { - item = empathy_contact_edit_menu_item_new (contact); - gtk_menu_shell_append (shell, item); - gtk_widget_show (item); - } - if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INFO) { - item = empathy_contact_info_menu_item_new (contact); - gtk_menu_shell_append (shell, item); - gtk_widget_show (item); + if (!menu && + !(priv->list_features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE)) { + g_object_unref (contact); + return NULL; } - /* Separator */ - if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE) { + if (menu) { + /* Separator */ item = gtk_separator_menu_item_new (); - gtk_menu_shell_append (shell, item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show (item); + } else { + menu = gtk_menu_new (); } - /* Custom items */ - if (priv->features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE) { + /* Remove contact */ + if (priv->list_features & EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE) { item = gtk_image_menu_item_new_with_mnemonic (_("_Remove")); image = gtk_image_new_from_icon_name (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); - gtk_menu_shell_append (shell, item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show (item); g_signal_connect (item, "activate", G_CALLBACK (contact_list_view_remove_activate_cb), view); } + g_object_unref (contact); + return menu; } diff --git a/libempathy-gtk/empathy-contact-list-view.h b/libempathy-gtk/empathy-contact-list-view.h index 34f194b14..47159fd24 100644 --- a/libempathy-gtk/empathy-contact-list-view.h +++ b/libempathy-gtk/empathy-contact-list-view.h @@ -31,6 +31,7 @@ #include <libempathy/empathy-contact.h> #include "empathy-contact-list-store.h" +#include "empathy-contact-menu.h" G_BEGIN_DECLS @@ -49,18 +50,11 @@ typedef enum { EMPATHY_CONTACT_LIST_FEATURE_GROUPS_SAVE = 1 << 0, EMPATHY_CONTACT_LIST_FEATURE_GROUPS_RENAME = 1 << 1, EMPATHY_CONTACT_LIST_FEATURE_GROUPS_REMOVE = 1 << 2, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CHAT = 1 << 3, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_CALL = 1 << 4, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_LOG = 1 << 5, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_FT = 1 << 6, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INVITE = 1 << 7, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_EDIT = 1 << 8, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_INFO = 1 << 9, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE = 1 << 10, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_DROP = 1 << 11, - EMPATHY_CONTACT_LIST_FEATURE_CONTACT_DRAG = 1 << 12, - EMPATHY_CONTACT_LIST_FEATURE_ALL = (1 << 13) - 1, -} EmpathyContactListFeatures; + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_REMOVE = 1 << 3, + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_DROP = 1 << 4, + EMPATHY_CONTACT_LIST_FEATURE_CONTACT_DRAG = 1 << 5, + EMPATHY_CONTACT_LIST_FEATURE_ALL = (1 << 6) - 1, +} EmpathyContactListFeatureFlags; struct _EmpathyContactListView { GtkTreeView parent; @@ -71,16 +65,13 @@ struct _EmpathyContactListViewClass { }; GType empathy_contact_list_view_get_type (void) G_GNUC_CONST; -EmpathyContactListView * empathy_contact_list_view_new (EmpathyContactListStore *store, - EmpathyContactListFeatures features); -void empathy_contact_list_view_set_features (EmpathyContactListView *view, - EmpathyContactListFeatures features); -EmpathyContactListFeatures empathy_contact_list_view_get_features (EmpathyContactListView *view); -EmpathyContact * empathy_contact_list_view_get_selected (EmpathyContactListView *view); -gchar * empathy_contact_list_view_get_selected_group (EmpathyContactListView *view); -GtkWidget * empathy_contact_list_view_get_contact_menu (EmpathyContactListView *view, - EmpathyContact *contact); -GtkWidget * empathy_contact_list_view_get_group_menu (EmpathyContactListView *view); +EmpathyContactListView * empathy_contact_list_view_new (EmpathyContactListStore *store, + EmpathyContactListFeatureFlags list_features, + EmpathyContactFeatureFlags contact_features); +EmpathyContact * empathy_contact_list_view_get_selected (EmpathyContactListView *view); +gchar * empathy_contact_list_view_get_selected_group (EmpathyContactListView *view); +GtkWidget * empathy_contact_list_view_get_contact_menu (EmpathyContactListView *view); +GtkWidget * empathy_contact_list_view_get_group_menu (EmpathyContactListView *view); G_END_DECLS diff --git a/libempathy-gtk/empathy-contact-menu.c b/libempathy-gtk/empathy-contact-menu.c index 4509dd171..b06bcd3e4 100644 --- a/libempathy-gtk/empathy-contact-menu.c +++ b/libempathy-gtk/empathy-contact-menu.c @@ -37,6 +37,69 @@ #define DEBUG_DOMAIN "ContactMenu" GtkWidget * +empathy_contact_menu_new (EmpathyContact *contact, + EmpathyContactFeatureFlags features) +{ + GtkWidget *menu; + GtkMenuShell *shell; + GtkWidget *item; + + g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); + + if (features == EMPATHY_CONTACT_FEATURE_NONE) { + return NULL; + } + + menu = gtk_menu_new (); + shell = GTK_MENU_SHELL (menu); + + /* Chat */ + if (features & EMPATHY_CONTACT_FEATURE_CHAT) { + item = empathy_contact_chat_menu_item_new (contact); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + + /* Call */ + if (features & EMPATHY_CONTACT_FEATURE_CALL) { + item = empathy_contact_call_menu_item_new (contact); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + + /* Log */ + if (features & EMPATHY_CONTACT_FEATURE_LOG) { + item = empathy_contact_log_menu_item_new (contact); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + + /* Separator */ + if (features & (EMPATHY_CONTACT_FEATURE_EDIT | + EMPATHY_CONTACT_FEATURE_INFO)) { + item = gtk_separator_menu_item_new (); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + + /* Edit */ + if (features & EMPATHY_CONTACT_FEATURE_EDIT) { + item = empathy_contact_edit_menu_item_new (contact); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + + /* Info */ + if (features & EMPATHY_CONTACT_FEATURE_INFO) { + item = empathy_contact_info_menu_item_new (contact); + gtk_menu_shell_append (shell, item); + gtk_widget_show (item); + } + + return menu; +} + +GtkWidget * empathy_contact_chat_menu_item_new (EmpathyContact *contact) { GtkWidget *item; diff --git a/libempathy-gtk/empathy-contact-menu.h b/libempathy-gtk/empathy-contact-menu.h index 4b9427b76..dd8d16147 100644 --- a/libempathy-gtk/empathy-contact-menu.h +++ b/libempathy-gtk/empathy-contact-menu.h @@ -28,11 +28,23 @@ G_BEGIN_DECLS -GtkWidget * empathy_contact_chat_menu_item_new (EmpathyContact *contact); -GtkWidget * empathy_contact_call_menu_item_new (EmpathyContact *contact); -GtkWidget * empathy_contact_log_menu_item_new (EmpathyContact *contact); -GtkWidget * empathy_contact_info_menu_item_new (EmpathyContact *contact); -GtkWidget * empathy_contact_edit_menu_item_new (EmpathyContact *contact); +typedef enum { + EMPATHY_CONTACT_FEATURE_NONE = 0, + EMPATHY_CONTACT_FEATURE_CHAT = 1 << 0, + EMPATHY_CONTACT_FEATURE_CALL = 1 << 1, + EMPATHY_CONTACT_FEATURE_LOG = 1 << 2, + EMPATHY_CONTACT_FEATURE_EDIT = 1 << 3, + EMPATHY_CONTACT_FEATURE_INFO = 1 << 4, + EMPATHY_CONTACT_FEATURE_ALL = (1 << 5) - 1, +} EmpathyContactFeatureFlags; + +GtkWidget * empathy_contact_menu_new (EmpathyContact *contact, + EmpathyContactFeatureFlags features); +GtkWidget * empathy_contact_chat_menu_item_new (EmpathyContact *contact); +GtkWidget * empathy_contact_call_menu_item_new (EmpathyContact *contact); +GtkWidget * empathy_contact_log_menu_item_new (EmpathyContact *contact); +GtkWidget * empathy_contact_info_menu_item_new (EmpathyContact *contact); +GtkWidget * empathy_contact_edit_menu_item_new (EmpathyContact *contact); G_END_DECLS |