From: Sergio Villar Senin Date: Thu, 15 Mar 2007 17:38:08 +0000 (+0000) Subject: * Fixed some issues of the drag and drop system X-Git-Tag: git_migration_finished~3976 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=d5b5c23f5bf5600e6514c482d423674fd9370d0c * Fixed some issues of the drag and drop system pmo-trunk-r906 --- diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index c902b66..bfef576 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -647,12 +647,12 @@ modest_mail_operation_create_folder (ModestMailOperation *self, new_folder = tny_folder_store_create_folder (parent, name, &(priv->error)); CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, return NULL); - /* Subscribe to folder */ - if (!tny_folder_is_subscribed (new_folder)) { - store_account = TNY_STORE_ACCOUNT (tny_folder_get_account (TNY_FOLDER (parent))); - tny_store_account_subscribe (store_account, new_folder); - g_object_unref (G_OBJECT (store_account)); - } +/* /\* Subscribe to folder *\/ */ +/* if (!tny_folder_is_subscribed (new_folder)) { */ +/* store_account = TNY_STORE_ACCOUNT (tny_folder_get_account (TNY_FOLDER (parent))); */ +/* tny_store_account_subscribe (store_account, new_folder); */ +/* g_object_unref (G_OBJECT (store_account)); */ +/* } */ return new_folder; } diff --git a/src/modest-widget-memory.c b/src/modest-widget-memory.c index a6b9a1d..323bf6d 100644 --- a/src/modest-widget-memory.c +++ b/src/modest-widget-memory.c @@ -231,8 +231,8 @@ save_settings_header_view (ModestConf *conf, ModestHeaderView *header_view, ModestHeaderViewStyle style; folder = modest_header_view_get_folder (header_view); - if (!folder || modest_header_view_is_empty (header_view)) - return TRUE; /* no non-empty folder: no settings */ + if (!folder || modest_header_view_is_empty (header_view)) + return TRUE; /* no non-empty folder: no settings */ type = modest_tny_folder_guess_folder_type (folder); style = modest_header_view_get_style (header_view); @@ -256,7 +256,7 @@ save_settings_header_view (ModestConf *conf, ModestHeaderView *header_view, MODEST_HEADER_VIEW_COLUMN)); width = gtk_tree_view_column_get_width (col); - g_string_append_printf (str, "%d:%d ", col_id, width); + g_string_append_printf (str, "%d:%d ", col_id, width); cursor = g_list_next (cursor); } @@ -281,8 +281,8 @@ restore_settings_header_view (ModestConf *conf, ModestHeaderView *header_view, ModestHeaderViewStyle style; folder = modest_header_view_get_folder (header_view); - if (!folder || modest_header_view_is_empty (header_view)) - return TRUE; /* no non-empty folder: no settings */ + if (!folder || modest_header_view_is_empty (header_view)) + return TRUE; /* no non-empty folder: no settings */ type = modest_tny_folder_guess_folder_type (folder); style = modest_header_view_get_style (header_view); diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index a496f5a..af1d6b1 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -749,8 +749,6 @@ on_drag_data_get (GtkWidget *widget, typedef struct _DndHelper { gboolean delete_source; - GtkWidget *source_widget; - GtkWidget *dest_widget; GtkTreePath *source_row; GdkDragContext *context; guint time; @@ -758,27 +756,6 @@ typedef struct _DndHelper { /* - * This function saves the source row in the source widget, will be - * used by the drag-data-delete handler to remove the source row - */ -static void -save_and_clean (DndHelper *helper, - gboolean success) -{ - /* Save row data */ - if (success && helper->delete_source) - g_object_set_data (G_OBJECT (helper->source_widget), - ROW_REF_DATA_NAME, - gtk_tree_path_copy (helper->source_row)); - - /* Clean dest row */ - gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (helper->dest_widget), - NULL, - GTK_TREE_VIEW_DROP_BEFORE); - -} - -/* * This function is the callback of the * modest_mail_operation_xfer_msg() call. We check here if the message * was correctly asynchronously transfered @@ -806,16 +783,12 @@ on_progress_changed (ModestMailOperation *mail_op, gpointer user_data) modest_mail_operation_queue_remove (queue, mail_op); g_object_unref (G_OBJECT (mail_op)); - /* Save and clean. HACK: Force success to FALSE in order not - to save data in the source widget */ - gtk_tree_path_free (helper->source_row); - save_and_clean (helper, FALSE); - /* Notify the drag source. Never call delete, the monitor will do the job if needed */ gtk_drag_finish (helper->context, success, FALSE, helper->time); /* Free the helper */ + gtk_tree_path_free (helper->source_row); g_slice_free (DndHelper, helper); } @@ -888,9 +861,8 @@ drag_and_drop_from_folder_view (GtkTreeModel *source_model, { ModestMailOperation *mail_op; const GError *error; - GtkTreeRowReference *source_row_reference; GtkTreeIter parent_iter, iter; - TnyFolder *folder, *new_folder; + TnyFolder *folder; TnyFolderStore *parent_folder; gboolean success = FALSE; @@ -915,8 +887,8 @@ drag_and_drop_from_folder_view (GtkTreeModel *source_model, /* Do the mail operation */ mail_op = modest_mail_operation_new (); - new_folder = modest_mail_operation_xfer_folder (mail_op, folder, parent_folder, - helper->delete_source); + modest_mail_operation_xfer_folder (mail_op, folder, parent_folder, + helper->delete_source); g_object_unref (G_OBJECT (parent_folder)); g_object_unref (G_OBJECT (folder)); @@ -928,40 +900,13 @@ drag_and_drop_from_folder_view (GtkTreeModel *source_model, goto out; } g_object_unref (G_OBJECT (mail_op)); - - /* Get a row reference to the source path because the path - could change after the insertion. The gtk_drag_finish() is - not able to delete the source because that, so we have to - do it manually */ - source_row_reference = gtk_tree_row_reference_new (source_model, helper->source_row); - gtk_tree_path_free (helper->source_row); - - /* Insert the dragged row as a child of the dest row */ - gtk_tree_path_down (dest_row); - if (gtk_tree_drag_dest_drag_data_received (GTK_TREE_DRAG_DEST (dest_model), - dest_row, - selection_data)) { - - GtkTreeIter iter; - - /* Set the newly created folder as the instance in the row */ - gtk_tree_model_get_iter (dest_model, &iter, dest_row); - gtk_tree_store_set (GTK_TREE_STORE (dest_model), &iter, - TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, - new_folder, -1); - g_object_unref (G_OBJECT (new_folder)); - - helper->source_row = gtk_tree_row_reference_get_path (source_row_reference); - - success = TRUE; - } - gtk_tree_row_reference_free (source_row_reference); - - /* Save and clean */ - save_and_clean (helper, success); - + success = TRUE; out: - gtk_drag_finish (helper->context, success, (success && helper->delete_source), helper->time); + gtk_drag_finish (helper->context, success, FALSE, helper->time); + + /* Free the helper */ + gtk_tree_path_free (helper->source_row); + g_slice_free (DndHelper, helper); } /* @@ -996,7 +941,7 @@ on_drag_data_received (GtkWidget *widget, /* Check if the get_data failed */ if (selection_data == NULL || selection_data->length < 0) - gtk_drag_finish (context, success, (success && delete_source), time); + gtk_drag_finish (context, success, FALSE, time); /* Get the models */ source_widget = gtk_drag_get_source_widget (context); @@ -1020,14 +965,12 @@ on_drag_data_received (GtkWidget *widget, /* Only allow drops IN other rows */ if (!dest_row || pos == GTK_TREE_VIEW_DROP_BEFORE || pos == GTK_TREE_VIEW_DROP_AFTER) - gtk_drag_finish (context, success, (success && delete_source), time); + gtk_drag_finish (context, success, FALSE, time); /* Create the helper */ helper = g_slice_new0 (DndHelper); helper->delete_source = delete_source; - helper->source_widget = source_widget; - helper->dest_widget = widget; - helper->source_row = source_row; + helper->source_row = gtk_tree_path_copy (source_row); helper->context = context; helper->time = time; @@ -1053,6 +996,9 @@ on_drag_data_received (GtkWidget *widget, selection_data, helper); } + + /* Frees */ + gtk_tree_path_free (source_row); gtk_tree_path_free (child_dest_row); } @@ -1086,31 +1032,6 @@ drag_drop_cb (GtkWidget *widget, } /* - * This function deletes the data that has been dragged from its - * source widget. Since is a function received by the source of the - * drag, this function only deletes rows of the folder view - * widget. The header view widget will need to define its own one. - */ -static void -drag_data_delete_cb (GtkWidget *widget, - GdkDragContext *context, - gpointer user_data) -{ - GtkTreePath *source_row; - GtkTreeModel *model_sort, *model; - - model_sort = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); - model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model_sort)); - source_row = g_object_steal_data (G_OBJECT (widget), ROW_REF_DATA_NAME); - - /* Delete the source row */ - gtk_tree_drag_source_drag_data_delete (GTK_TREE_DRAG_SOURCE (model), - source_row); - - gtk_tree_path_free (source_row); -} - -/* * This function expands a node of a tree view if it's not expanded * yet. Not sure why it needs the threads stuff, but gtk+`example code * does that, so that's why they're here. @@ -1167,6 +1088,7 @@ on_drag_motion (GtkWidget *widget, GtkTreePath *dest_row; ModestFolderViewPrivate *priv; GdkDragAction suggested_action; + gboolean valid_location = FALSE; priv = MODEST_FOLDER_VIEW_GET_PRIVATE (widget); @@ -1180,8 +1102,17 @@ on_drag_motion (GtkWidget *widget, &dest_row, &pos); - if (!dest_row) - return FALSE; + /* Do not allow drops between folders */ + if (!dest_row || + pos == GTK_TREE_VIEW_DROP_BEFORE || + pos == GTK_TREE_VIEW_DROP_AFTER) { + gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW (widget), NULL, 0); + gdk_drag_status(context, 0, time); + valid_location = FALSE; + goto out; + } else { + valid_location = TRUE; + } /* Expand the selected row after 1/2 second */ if (!gtk_tree_view_row_expanded (GTK_TREE_VIEW (widget), dest_row)) { @@ -1202,7 +1133,9 @@ on_drag_motion (GtkWidget *widget, else gdk_drag_status(context, GDK_ACTION_DEFAULT, time); - return TRUE; + out: + g_signal_stop_emission_by_name (widget, "drag-motion"); + return valid_location; } @@ -1229,10 +1162,10 @@ setup_drag_and_drop (GtkTreeView *self) G_N_ELEMENTS (folder_view_drag_types), GDK_ACTION_MOVE | GDK_ACTION_COPY); - gtk_signal_connect(GTK_OBJECT (self), - "drag_data_received", - GTK_SIGNAL_FUNC(on_drag_data_received), - NULL); + g_signal_connect (G_OBJECT (self), + "drag_data_received", + G_CALLBACK (on_drag_data_received), + NULL); /* Set up the treeview as a dnd source */ @@ -1242,24 +1175,18 @@ setup_drag_and_drop (GtkTreeView *self) G_N_ELEMENTS (folder_view_drag_types), GDK_ACTION_MOVE | GDK_ACTION_COPY); - gtk_signal_connect(GTK_OBJECT (self), - "drag_data_delete", - GTK_SIGNAL_FUNC(drag_data_delete_cb), - NULL); - - gtk_signal_connect(GTK_OBJECT (self), - "drag_motion", - GTK_SIGNAL_FUNC(on_drag_motion), - NULL); - - - gtk_signal_connect(GTK_OBJECT (self), - "drag_data_get", - GTK_SIGNAL_FUNC(on_drag_data_get), - NULL); - - gtk_signal_connect(GTK_OBJECT (self), - "drag_drop", - GTK_SIGNAL_FUNC(drag_drop_cb), - NULL); + g_signal_connect (G_OBJECT (self), + "drag_motion", + G_CALLBACK (on_drag_motion), + NULL); + + g_signal_connect (G_OBJECT (self), + "drag_data_get", + G_CALLBACK (on_drag_data_get), + NULL); + + g_signal_connect (G_OBJECT (self), + "drag_drop", + G_CALLBACK (drag_drop_cb), + NULL); } diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index a2b56ba..08faaae 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -745,7 +745,6 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) if (folder) { priv->folder = g_object_ref (folder); - tny_folder_refresh_async (folder, on_refresh_folder, on_refresh_folder_status_update,