diff options
author | Philip Withnall <philip.withnall@collabora.co.uk> | 2010-08-25 19:08:02 +0800 |
---|---|---|
committer | Philip Withnall <philip.withnall@collabora.co.uk> | 2010-08-27 17:23:48 +0800 |
commit | 8c812cfbd960392d2acee585c3d7d3030d3e3fa8 (patch) | |
tree | 9ec92562302be78a807b5ba7da2ec643afde7f40 | |
parent | e2f43f8e42064400f777e52937b845f804331b26 (diff) | |
download | gsoc2013-empathy-8c812cfbd960392d2acee585c3d7d3030d3e3fa8.tar gsoc2013-empathy-8c812cfbd960392d2acee585c3d7d3030d3e3fa8.tar.gz gsoc2013-empathy-8c812cfbd960392d2acee585c3d7d3030d3e3fa8.tar.bz2 gsoc2013-empathy-8c812cfbd960392d2acee585c3d7d3030d3e3fa8.tar.lz gsoc2013-empathy-8c812cfbd960392d2acee585c3d7d3030d3e3fa8.tar.xz gsoc2013-empathy-8c812cfbd960392d2acee585c3d7d3030d3e3fa8.tar.zst gsoc2013-empathy-8c812cfbd960392d2acee585c3d7d3030d3e3fa8.zip |
Add an EmpathyIndividualView feature for receiving Persona drops
This is necessary to avoid Personas being droppable on the main contact list,
which makes no sense (for the time being). Helps: bgo#627715
-rw-r--r-- | libempathy-gtk/empathy-individual-view.c | 119 | ||||
-rw-r--r-- | libempathy-gtk/empathy-individual-view.h | 5 | ||||
-rw-r--r-- | src/empathy-main-window.c | 5 |
3 files changed, 64 insertions, 65 deletions
diff --git a/libempathy-gtk/empathy-individual-view.c b/libempathy-gtk/empathy-individual-view.c index 96f6c38f4..9ef9c103a 100644 --- a/libempathy-gtk/empathy-individual-view.c +++ b/libempathy-gtk/empathy-individual-view.c @@ -70,7 +70,6 @@ typedef struct EmpathyIndividualViewFeatureFlags view_features; EmpathyIndividualFeatureFlags individual_features; GtkWidget *tooltip_widget; - GtkTargetList *file_targets; gboolean show_offline; @@ -119,17 +118,12 @@ enum DndDragType { (gchar *) T, 0, I } static const GtkTargetEntry drag_types_dest[] = { - DRAG_TYPE ("text/path-list", DND_DRAG_TYPE_URI_LIST), - DRAG_TYPE ("text/uri-list", DND_DRAG_TYPE_URI_LIST), DRAG_TYPE ("text/individual-id", DND_DRAG_TYPE_INDIVIDUAL_ID), DRAG_TYPE ("text/persona-id", DND_DRAG_TYPE_PERSONA_ID), - DRAG_TYPE ("text/plain", DND_DRAG_TYPE_STRING), - DRAG_TYPE ("STRING", DND_DRAG_TYPE_STRING), -}; - -static const GtkTargetEntry drag_types_dest_file[] = { DRAG_TYPE ("text/path-list", DND_DRAG_TYPE_URI_LIST), DRAG_TYPE ("text/uri-list", DND_DRAG_TYPE_URI_LIST), + DRAG_TYPE ("text/plain", DND_DRAG_TYPE_STRING), + DRAG_TYPE ("STRING", DND_DRAG_TYPE_STRING), }; static const GtkTargetEntry drag_types_source[] = { @@ -597,57 +591,11 @@ individual_view_drag_motion (GtkWidget *widget, gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), NULL, 0); return FALSE; } - target = gtk_drag_dest_find_target (widget, context, priv->file_targets); + target = gtk_drag_dest_find_target (widget, context, NULL); gtk_tree_model_get_iter (model, &iter, path); - if (target == GDK_NONE && - (priv->view_features & EMPATHY_INDIVIDUAL_VIEW_FEATURE_GROUPS_CHANGE || - priv->drag_row == NULL)) - { - /* If target == GDK_NONE, then we don't have a target that can be - dropped on a contact. This means a contact drag. If we're - pointing to a group, highlight it. Otherwise, if the contact - we're pointing to is in a group, highlight that. Otherwise, - set the drag position to before the first row for a drag into - the "non-group" at the top. - We only highlight things if the contact is from a different Individual - view, or if this Individual view has FEATURE_GROUPS_CHANGE. This - prevents highlighting in Individual views which don't have - FEATURE_GROUPS_CHANGE, but do have FEATURE_INDIVIDUAL_DRAG and - FEATURE_INDIVIDUAL_DROP. - */ - GtkTreeIter group_iter; - gboolean is_group; - GtkTreePath *group_path; - gtk_tree_model_get (model, &iter, - EMPATHY_INDIVIDUAL_STORE_COL_IS_GROUP, &is_group, -1); - if (is_group) - { - group_iter = iter; - } - else - { - if (gtk_tree_model_iter_parent (model, &group_iter, &iter)) - gtk_tree_model_get (model, &group_iter, - EMPATHY_INDIVIDUAL_STORE_COL_IS_GROUP, &is_group, -1); - } - if (is_group) - { - gdk_drag_status (context, GDK_ACTION_MOVE, time_); - group_path = gtk_tree_model_get_path (model, &group_iter); - gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), - group_path, GTK_TREE_VIEW_DROP_INTO_OR_BEFORE); - gtk_tree_path_free (group_path); - } - else - { - group_path = gtk_tree_path_new_first (); - gdk_drag_status (context, GDK_ACTION_MOVE, time_); - gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), - group_path, GTK_TREE_VIEW_DROP_BEFORE); - } - } - else if (target != GDK_NONE) + if (target == drag_atoms_dest[DND_DRAG_TYPE_URI_LIST] || + target == drag_atoms_dest[DND_DRAG_TYPE_STRING]) { /* This is a file drag, and it can only be dropped on contacts, * not groups. @@ -691,6 +639,58 @@ individual_view_drag_motion (GtkWidget *widget, if (individual != NULL) g_object_unref (individual); } + else if (((target == drag_atoms_dest[DND_DRAG_TYPE_STRING] || + target == drag_atoms_dest[DND_DRAG_TYPE_INDIVIDUAL_ID]) && + (priv->view_features & EMPATHY_INDIVIDUAL_VIEW_FEATURE_GROUPS_CHANGE || + priv->drag_row == NULL)) || + (target == drag_atoms_dest[DND_DRAG_TYPE_PERSONA_ID] && + priv->view_features & EMPATHY_INDIVIDUAL_VIEW_FEATURE_PERSONA_DROP)) + { + /* If target != GDK_NONE, then we have a contact (individual or persona) + drag. If we're pointing to a group, highlight it. Otherwise, if the + contact we're pointing to is in a group, highlight that. Otherwise, + set the drag position to before the first row for a drag into + the "non-group" at the top. + If it's an Individual: + We only highlight things if the contact is from a different + Individual view, or if this Individual view has + FEATURE_GROUPS_CHANGE. This prevents highlighting in Individual views + which don't have FEATURE_GROUPS_CHANGE, but do have + FEATURE_INDIVIDUAL_DRAG and FEATURE_INDIVIDUAL_DROP. + If it's a Persona: + We only highlight things if we have FEATURE_PERSONA_DROP. + */ + GtkTreeIter group_iter; + gboolean is_group; + GtkTreePath *group_path; + gtk_tree_model_get (model, &iter, + EMPATHY_INDIVIDUAL_STORE_COL_IS_GROUP, &is_group, -1); + if (is_group) + { + group_iter = iter; + } + else + { + if (gtk_tree_model_iter_parent (model, &group_iter, &iter)) + gtk_tree_model_get (model, &group_iter, + EMPATHY_INDIVIDUAL_STORE_COL_IS_GROUP, &is_group, -1); + } + if (is_group) + { + gdk_drag_status (context, GDK_ACTION_MOVE, time_); + group_path = gtk_tree_model_get_path (model, &group_iter); + gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), + group_path, GTK_TREE_VIEW_DROP_INTO_OR_BEFORE); + gtk_tree_path_free (group_path); + } + else + { + group_path = gtk_tree_path_new_first (); + gdk_drag_status (context, GDK_ACTION_MOVE, time_); + gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget), + group_path, GTK_TREE_VIEW_DROP_BEFORE); + } + } if (!is_different && !cleanup) return retval; @@ -1875,7 +1875,6 @@ individual_view_dispose (GObject *object) tp_clear_object (&priv->store); tp_clear_object (&priv->filter); tp_clear_pointer (&priv->tooltip_widget, gtk_widget_destroy); - tp_clear_pointer (&priv->file_targets, gtk_target_list_unref); empathy_individual_view_set_live_search (view, NULL); @@ -2045,10 +2044,6 @@ empathy_individual_view_init (EmpathyIndividualView *view) gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (view), empathy_individual_store_row_separator_func, NULL, NULL); - /* Set up drag target lists. */ - priv->file_targets = gtk_target_list_new (drag_types_dest_file, - G_N_ELEMENTS (drag_types_dest_file)); - /* Connect to tree view signals rather than override. */ g_signal_connect (view, "button-press-event", G_CALLBACK (individual_view_button_press_event_cb), NULL); diff --git a/libempathy-gtk/empathy-individual-view.h b/libempathy-gtk/empathy-individual-view.h index 5222eb1a4..8a250bf20 100644 --- a/libempathy-gtk/empathy-individual-view.h +++ b/libempathy-gtk/empathy-individual-view.h @@ -60,8 +60,9 @@ typedef enum EMPATHY_INDIVIDUAL_VIEW_FEATURE_INDIVIDUAL_DROP = 1 << 5, EMPATHY_INDIVIDUAL_VIEW_FEATURE_INDIVIDUAL_DRAG = 1 << 6, EMPATHY_INDIVIDUAL_VIEW_FEATURE_INDIVIDUAL_TOOLTIP = 1 << 7, - EMPATHY_INDIVIDUAL_VIEW_FEATURE_FILE_DROP = 1 << 8, - EMPATHY_INDIVIDUAL_VIEW_FEATURE_ALL = (1 << 9) - 1, + EMPATHY_INDIVIDUAL_VIEW_FEATURE_PERSONA_DROP = 1 << 8, + EMPATHY_INDIVIDUAL_VIEW_FEATURE_FILE_DROP = 1 << 9, + EMPATHY_INDIVIDUAL_VIEW_FEATURE_ALL = (1 << 10) - 1, } EmpathyIndividualViewFeatureFlags; struct _EmpathyIndividualView diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c index 0efa4a97d..07725fa3b 100644 --- a/src/empathy-main-window.c +++ b/src/empathy-main-window.c @@ -1673,9 +1673,12 @@ empathy_main_window_init (EmpathyMainWindow *window) individual_manager); g_object_unref (individual_manager); + /* For the moment, we disallow Persona drops onto the main contact list (e.g. from things such as + * the EmpathyPersonaView in the linking dialogue). No code is hooked up to do anything on a Persona + * drop, so allowing them would achieve nothing except confusion. */ priv->individual_view = empathy_individual_view_new ( priv->individual_store, - EMPATHY_INDIVIDUAL_VIEW_FEATURE_ALL, + EMPATHY_INDIVIDUAL_VIEW_FEATURE_ALL ^ EMPATHY_INDIVIDUAL_VIEW_FEATURE_PERSONA_DROP, EMPATHY_INDIVIDUAL_FEATURE_ALL); priv->butterfly_log_migration_members_changed_id = g_signal_connect ( |