From 37e38588ea7425c4889cdb2c78e20fb895ada834 Mon Sep 17 00:00:00 2001 From: Tristan Matthews <tristan.matthews@savoirfairelinux.com> Date: Tue, 15 May 2012 10:47:03 -0400 Subject: [PATCH] * #10736: calltree: can now drop conference on call --- gnome/src/contacts/calltree.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/gnome/src/contacts/calltree.c b/gnome/src/contacts/calltree.c index 4487fe5435..f744db70d2 100644 --- a/gnome/src/contacts/calltree.c +++ b/gnome/src/contacts/calltree.c @@ -1167,6 +1167,19 @@ static void cleanup_popup_data(PopupData **data) } +static gboolean try_detach(const gchar *source_ID, GtkTreeModel *model, GtkTreeIter *dest_iter) +{ + callable_obj_t *source_call = calllist_get_call(current_calls_tab, source_ID); + GtkTreeIter iter_parent; + if (source_call && source_call->_confID && + !gtk_tree_model_iter_parent(model, &iter_parent, dest_iter)) { + sflphone_detach_participant(source_ID); + return TRUE; + } else { + return FALSE; + } +} + static gboolean render_drop(GtkTreeModel *model, GtkTreePath *dest_path, GtkTreeViewDropPosition dest_pos, GtkTreeIter *source_iter) @@ -1203,8 +1216,8 @@ render_drop(GtkTreeModel *model, GtkTreePath *dest_path, GtkTreeViewDropPosition gboolean result; switch (dest_pos) { case GTK_TREE_VIEW_DROP_BEFORE: - DEBUG("DROP_BEFORE, ignoring for now"); - result = FALSE; + DEBUG("DROP_BEFORE, detaching if appropriate"); + result = try_detach(source_ID, model, &dest_iter); break; case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: /* fallthrough */ @@ -1217,10 +1230,16 @@ render_drop(GtkTreeModel *model, GtkTreePath *dest_path, GtkTreeViewDropPosition if (is_conference(model, source_iter)) { DEBUG("dropped conference on conference, merging conferences"); dbus_join_conference(source_ID, dest_ID); + result = TRUE; } else { DEBUG("dropped call on conference, adding a call to a conference"); sflphone_add_participant(source_ID, dest_ID); + result = TRUE; } + } else if (is_conference(model, source_iter)) { + DEBUG("dropped conference on call, merging call into conference"); + sflphone_add_participant(dest_ID, source_ID); + result = TRUE; } else { DEBUG("Dropped call on call, creating new conference or transferring"); calltree_remove_call(current_calls_tab, source_ID); @@ -1231,21 +1250,25 @@ render_drop(GtkTreeModel *model, GtkTreePath *dest_path, GtkTreeViewDropPosition popup_data->source_ID = g_strdup(source_ID); popup_data->dest_ID = g_strdup(dest_ID); gtk_menu_popup(GTK_MENU(calltree_popupmenu), NULL, NULL, NULL, NULL, 0, 0); + result = TRUE; } } else { callable_obj_t *dest_call = calllist_get_call(current_calls_tab, dest_ID); if (dest_call && dest_call->_confID) { DEBUG("dropped call on participant, adding a call to a conference"); sflphone_add_participant(source_ID, dest_call->_confID); + result = TRUE; } } - result = TRUE; + result = FALSE; break; } case GTK_TREE_VIEW_DROP_AFTER: - DEBUG("DROP_AFTER, ignoring for now"); - result = FALSE; + { + DEBUG("DROP_AFTER, detaching if appropriate"); + result = try_detach(source_ID, model, &dest_iter); break; + } default: ERROR("Unexpected position"); result = FALSE; -- GitLab