diff --git a/copyfolderjob.cpp b/copyfolderjob.cpp index 697a61e29..0ee8e3908 100644 --- a/copyfolderjob.cpp +++ b/copyfolderjob.cpp @@ -66,7 +66,10 @@ CopyFolderJob::~CopyFolderJob() if ( mNewFolder ) mNewFolder->setMoveInProgress( false ); if ( mStorage ) - mStorage->close( "copyfolder" ); + { + mStorage->folder()->setMoveInProgress( false ); + mStorage->close("copyfolder"); + } } /* @@ -237,6 +240,7 @@ bool CopyFolderJob::createTargetDir() } mNewFolder->setMoveInProgress( true ); + mStorage->folder()->setMoveInProgress( true ); // inherit the folder type // FIXME we should probably copy over most if not all settings diff --git a/kmfolder.cpp b/kmfolder.cpp index 6e4462066..6e08dfa32 100644 --- a/kmfolder.cpp +++ b/kmfolder.cpp @@ -299,7 +299,7 @@ void KMFolder::setChild( KMFolderDir* aChild ) bool KMFolder::noContent() const { - return mStorage->noContent(); + return mStorage ? mStorage->noContent() : true; } void KMFolder::setNoContent( bool aNoContent ) diff --git a/kmfoldermgr.cpp b/kmfoldermgr.cpp index f01d186fe..c957004c7 100644 --- a/kmfoldermgr.cpp +++ b/kmfoldermgr.cpp @@ -552,6 +552,9 @@ void KMFolderMgr::renameFolder( KMFolder* folder, const QString& newName, RenameJob* job = new RenameJob( folder->storage(), newName, newParent ); connect( job, SIGNAL( renameDone( const QString&, bool ) ), this, SLOT( slotRenameDone( const QString&, bool ) ) ); + connect( job, SIGNAL( renameDone( const QString&, bool ) ), + this, SIGNAL( folderMoveOrCopyOperationFinished() ) ); + job->start(); } @@ -560,6 +563,8 @@ void KMFolderMgr::copyFolder( KMFolder* folder, KMFolderDir *newParent ) { kDebug(5006) << "Copy folder: " << folder->prettyUrl() << endl; CopyFolderJob* job = new CopyFolderJob( folder->storage(), newParent ); + connect( job, SIGNAL( folderCopyComplete( bool ) ), + this, SIGNAL( folderMoveOrCopyOperationFinished() ) ); job->start(); } diff --git a/kmfoldermgr.h b/kmfoldermgr.h index f56297a8d..f5898662c 100644 --- a/kmfoldermgr.h +++ b/kmfoldermgr.h @@ -165,6 +165,9 @@ signals: /** Emitted when a field of the header of a specific message changed. */ void msgHeaderChanged(KMFolder*, int idx); + /** Emitted when a folder has been moved or copied */ + void folderMoveOrCopyOperationFinished(); + protected: /** Auxillary function to facilitate removal of a folder */ diff --git a/kmfoldertree.cpp b/kmfoldertree.cpp index d7e26118c..a8b898e27 100644 --- a/kmfoldertree.cpp +++ b/kmfoldertree.cpp @@ -264,6 +264,11 @@ void KMFolderTreeItem::slotNameChanged() repaint(); } +//---------------------------------------------------------------------------- +void KMFolderTree::slotFolderMoveOrCopyOperationFinished() +{ + setDragEnabled( true ); +} //----------------------------------------------------------------------------- bool KMFolderTreeItem::acceptDrag(QDropEvent* e) const @@ -272,7 +277,7 @@ bool KMFolderTreeItem::acceptDrag(QDropEvent* e) const return false; // nothing can be dragged into search folders if ( KPIM::MailList::canDecode( e->mimeData() ) ) { - if ( !mFolder || mFolder->isReadOnly() || + if ( !mFolder || mFolder->moveInProgress() || mFolder->isReadOnly() || (mFolder->noContent() && childCount() == 0) || (mFolder->noContent() && isOpen()) ) { return false; @@ -390,6 +395,9 @@ void KMFolderTree::connectSignals() connect(kmkernel->folderMgr(), SIGNAL(folderRemoved(KMFolder*)), this, SLOT(slotFolderRemoved(KMFolder*))); + connect(kmkernel->folderMgr(), SIGNAL(folderMoveOrCopyOperationFinished()), + this, SLOT(slotFolderMoveOrCopyOperationFinished())); + connect(kmkernel->imapFolderMgr(), SIGNAL(changed()), this, SLOT(doFolderListChanged())); @@ -827,6 +835,11 @@ void KMFolderTree::slotFolderRemoved(KMFolder *aFolder) doFolderSelected( qlvi ); } removeFromFolderToItemMap( aFolder ); + + if ( dropItem == fti ) { // The removed item is the dropItem + dropItem = 0; // it becomes invalid + } + delete fti; updateCopyActions(); } @@ -1409,6 +1422,9 @@ void KMFolderTree::contentsDragEnterEvent( QDragEnterEvent *e ) dropItem = i; autoopen_timer.start( autoopenTime ); } + else + dropItem = 0; + e->setAccepted( acceptDrag(e) ); } @@ -1475,7 +1491,14 @@ void KMFolderTree::contentsDropEvent( QDropEvent *e ) Q3ListViewItem *item = itemAt( contentsToViewport(e->pos()) ); KMFolderTreeItem *fti = static_cast(item); int action = -1; - + // Check that each pointer is not null + for ( QList >::ConstIterator it = mCopySourceFolders.constBegin(); + it != mCopySourceFolders.constEnd(); ++it ) { + if ( ! (*it) ) { + fti = 0; + break; + } + } if (fti && mCopySourceFolders.count() == 1) { KMFolder *source = mCopySourceFolders.first(); @@ -2024,6 +2047,9 @@ void KMFolderTree::moveOrCopyFolder( QList > sources, KMFolde { kDebug(5006) << k_funcinfo << "source: " << sources << " destination: " << destination << " move: " << move << endl; + // Disable drag during copy operation since it prevents from many crashes + setDragEnabled( false ); + KMFolderDir* parent = &(kmkernel->folderMgr()->dir()); if ( destination ) parent = destination->createChildFolder(); diff --git a/kmfoldertree.h b/kmfoldertree.h index a9732b6d8..a429994ad 100644 --- a/kmfoldertree.h +++ b/kmfoldertree.h @@ -274,6 +274,9 @@ protected slots: /** called, when a folder has been deleted */ void slotFolderRemoved(KMFolder *); + /** called, when a folder has been moved or copied, successfully or not */ + void slotFolderMoveOrCopyOperationFinished(); + /** Updates the folder tree (delayed), causing a "blink" */ void refresh();