https://bugs.kde.org/show_bug.cgi?id=389273

Maik Qualmann <metzping...@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
 Attachment #110071|0                           |1
        is obsolete|                            |

--- Comment #11 from Maik Qualmann <metzping...@gmail.com> ---
Comment on attachment 110071
  --> https://bugs.kde.org/attachment.cgi?id=110071
DIOProgressManager.patch

>diff --git a/libs/database/utils/dio.cpp b/libs/database/utils/dio.cpp
>index 82813bae60..952c9e8336 100644
>--- a/libs/database/utils/dio.cpp
>+++ b/libs/database/utils/dio.cpp
>@@ -48,6 +48,7 @@
> #include "collectionmanager.h"
> #include "dnotificationwrapper.h"
> #include "digikamapp.h"
>+#include "progressmanager.h"
> 
> namespace Digikam
> {
>@@ -188,7 +189,7 @@ void DIO::Private::processJob(int operation, const 
>QList<QUrl>& srcList, const Q
>     {
>         emit jobToCreate(operation, finder.remoteFiles, dest);
>         // stat'ing is unreliable; just try to copy and suppress error message
>-        emit jobToCreate(operation | SourceStatusUnknown, 
>finder.possibleRemoteSidecars, dest);
>+        emit jobToCreate(operation | IOJobsThread::SourceStatusUnknown, 
>finder.possibleRemoteSidecars, dest);
>     }
> }
> 
>@@ -200,7 +201,7 @@ void DIO::Private::processRename(const QUrl& src, const 
>QUrl& dest)
>     {
>         for (int i = 0 ; i < finder.localFiles.length() ; ++i)
>         {
>-            emit jobToCreate(Rename, QList<QUrl>() << finder.localFiles.at(i),
>+            emit jobToCreate(IOJobsThread::Rename, QList<QUrl>() << 
>finder.localFiles.at(i),
>                              QUrl::fromLocalFile(dest.toLocalFile() + 
> finder.localFileSuffixes.at(i)));
>         }
> 
>@@ -209,11 +210,11 @@ void DIO::Private::processRename(const QUrl& src, const 
>QUrl& dest)
> 
>     for (int i = 0 ; i < finder.remoteFileSuffixes.length() ; ++i)
>     {
>-        emit jobToCreate(Rename | SourceStatusUnknown,
>+        emit jobToCreate(IOJobsThread::Rename | 
>IOJobsThread::SourceStatusUnknown,
>                          QList<QUrl>() << finder.possibleRemoteSidecars.at(i),
>                          QUrl::fromLocalFile(dest.toLocalFile() + 
> finder.possibleRemoteSidecarSuffixes.at(i)));
>     }
>-    emit jobToCreate(Rename, QList<QUrl>() << src, dest);
>+    emit jobToCreate(IOJobsThread::Rename, QList<QUrl>() << src, dest);
> }
> 
> void DIO::Private::albumToAlbum(int operation, const PAlbum* const src, const 
> PAlbum* const dest)
>@@ -231,7 +232,7 @@ void DIO::Private::imagesToAlbum(int operation, const 
>QList<ImageInfo>& infos, c
>     QList<qlonglong> ids;
>     QList<QUrl>      urls;
> 
>-    if (operation == Move)
>+    if (operation == IOJobsThread::IOJobsThread::Move)
>     {
>         // update the image infos
>         CoreDbAccess access;
>@@ -290,7 +291,7 @@ void DIO::Private::deleteFiles(const QList<ImageInfo>& 
>infos, bool useTrash)
> 
>     qCDebug(DIGIKAM_DATABASE_LOG) << "Deleting files:" << urls;
> 
>-    emit jobToProcess(useTrash ? Trash : Delete, urls, QUrl());
>+    emit jobToProcess(useTrash ? IOJobsThread::Trash : IOJobsThread::Delete, 
>urls, QUrl());
> }
> 
> // 
> ------------------------------------------------------------------------------------------------
>@@ -335,19 +336,38 @@ void DIO::createJob(int operation, const QList<QUrl>& 
>src, const QUrl& dest)
>         return;
>     }
> 
>+    ProgressItem* item      = 0;
>     IOJobsThread* jobThread = 0;
>-    int flags               = operation & FlagMask;
>-    operation              &= OperationMask;
>+    int flags               = operation & IOJobsThread::FlagMask;
>+    operation              &= IOJobsThread::OperationMask;
> 
>-    if (operation == Copy)
>+    if (operation == IOJobsThread::Copy)
>     {
>+        item = getProgressItem(IOJobsThread::Copy);
>+
>+        if (!item || item->totalCompleted())
>+        {
>+            item = 
>ProgressManager::instance()->createProgressItem(QLatin1String("DIOCopy"),
>+                                                                   
>i18n("Copy"), QString(), true, false);
>+        }
>+
>+        item->setTotalItems(item->totalItems() + src.count());
>         jobThread = IOJobsManager::instance()->startCopy(src, dest);
>     }
>-    else if (operation == Move)
>+    else if (operation == IOJobsThread::Move)
>     {
>+        item = getProgressItem(IOJobsThread::Move);
>+
>+        if (!item || item->totalCompleted())
>+        {
>+            item = 
>ProgressManager::instance()->createProgressItem(QLatin1String("DIOMove"),
>+                                                                   
>i18n("Move"), QString(), true, false);
>+        }
>+
>+        item->setTotalItems(item->totalItems() + src.count());
>         jobThread = IOJobsManager::instance()->startMove(src, dest);
>     }
>-    else if (operation == Rename)
>+    else if (operation == IOJobsThread::Rename)
>     {
>         if (src.size() != 1)
>         {
>@@ -363,23 +383,53 @@ void DIO::createJob(int operation, const QList<QUrl>& 
>src, const QUrl& dest)
>         connect(jobThread, SIGNAL(renameFailed(QUrl)),
>                 this, SIGNAL(imageRenameFailed(QUrl)));
>     }
>-    else if (operation == Trash)
>+    else if (operation == IOJobsThread::Trash)
>     {
>+        item = getProgressItem(IOJobsThread::Trash);
>+
>+        if (!item || item->totalCompleted())
>+        {
>+            item = 
>ProgressManager::instance()->createProgressItem(QLatin1String("DIOTrash"),
>+                                                                   
>i18n("Trash"), QString(), true, false);
>+        }
>+
>+        item->setTotalItems(item->totalItems() + src.count());
>         jobThread = IOJobsManager::instance()->startDelete(src);
>     }
>     else // operation == Del
>     {
>+        item = getProgressItem(IOJobsThread::Delete);
>+
>+        if (!item || item->totalCompleted())
>+        {
>+            item = 
>ProgressManager::instance()->createProgressItem(QLatin1String("DIODelete"),
>+                                                                   
>i18n("Delete"), QString(), true, false);
>+        }
>+
>+        item->setTotalItems(item->totalItems() + src.count());
>         qCDebug(DIGIKAM_DATABASE_LOG) << "SRCS " << src;
>         jobThread = IOJobsManager::instance()->startDelete(src, false);
>     }
> 
>-    if (flags & SourceStatusUnknown)
>+    if (flags & IOJobsThread::SourceStatusUnknown)
>     {
>         jobThread->setKeepErrors(false);
>     }
> 
>+    connect(jobThread, SIGNAL(oneProccessed(int)),
>+            this, SLOT(slotOneProccessed(int)));
>+
>     connect(jobThread, SIGNAL(finished()),
>             this, SLOT(slotResult()));
>+
>+    if (item)
>+    {
>+        connect(item, SIGNAL(progressItemCanceled(ProgressItem*)),
>+                jobThread, SLOT(cancel()));
>+
>+        connect(item, SIGNAL(progressItemCanceled(ProgressItem*)),
>+                this, SLOT(slotCancel(ProgressItem*)));
>+    }
> }
> 
> void DIO::slotResult()
>@@ -398,6 +448,27 @@ void DIO::slotResult()
>         DNotificationWrapper(QString(), errors, DigikamApp::instance(),
>                              DigikamApp::instance()->windowTitle());
>     }
>+
>+    ProgressItem* const item = getProgressItem(jobThread->operation());
>+    slotCancel(item);
>+}
>+
>+void DIO::slotCancel(ProgressItem* item)
>+{
>+    if (item)
>+    {
>+        item->setComplete();
>+    }
>+}
>+
>+void DIO::slotOneProccessed(int operation)
>+{
>+    ProgressItem* const item = getProgressItem(operation);
>+
>+    if (item)
>+    {
>+        item->advance(1);
>+    }
> }
> 
> void DIO::slotRenamed(const QUrl& oldUrl, const QUrl& newUrl)
>@@ -410,6 +481,31 @@ void DIO::slotRenamed(const QUrl& oldUrl, const QUrl& 
>newUrl)
>     emit imageRenameSucceeded(oldUrl);
> }
> 
>+ProgressItem* DIO::getProgressItem(int operation)
>+{
>+    ProgressItem* item = 0;
>+
>+    switch ((IOJobsThread::Operation)operation)
>+    {
>+        case IOJobsThread::Copy:
>+            item = 
>ProgressManager::instance()->findItembyId(QLatin1String("DIOCopy"));
>+            break;
>+        case IOJobsThread::Move:
>+            item = 
>ProgressManager::instance()->findItembyId(QLatin1String("DIOMove"));
>+            break;
>+        case IOJobsThread::Trash:
>+            item = 
>ProgressManager::instance()->findItembyId(QLatin1String("DIOTrash"));
>+            break;
>+        case IOJobsThread::Delete:
>+            item = 
>ProgressManager::instance()->findItembyId(QLatin1String("DIODelete"));
>+            break;
>+        default:
>+            break;
>+    }
>+
>+    return item;
>+}
>+
> // Album -> Album -----------------------------------------------------
> 
> void DIO::copy(const PAlbum* const src, const PAlbum* const dest)
>@@ -419,7 +515,7 @@ void DIO::copy(const PAlbum* const src, const PAlbum* 
>const dest)
>         return;
>     }
> 
>-    instance()->d->albumToAlbum(Copy, src, dest);
>+    instance()->d->albumToAlbum(IOJobsThread::Copy, src, dest);
> }
> 
> void DIO::move(const PAlbum* src, const PAlbum* const dest)
>@@ -433,7 +529,7 @@ void DIO::move(const PAlbum* src, const PAlbum* const dest)
>     AlbumManager::instance()->removeWatchedPAlbums(src);
> #endif
> 
>-    instance()->d->albumToAlbum(Move, src, dest);
>+    instance()->d->albumToAlbum(IOJobsThread::Move, src, dest);
> }
> 
> // Images -> Album ----------------------------------------------------
>@@ -445,7 +541,7 @@ void DIO::copy(const QList<ImageInfo>& infos, const 
>PAlbum* const dest)
>         return;
>     }
> 
>-    instance()->d->imagesToAlbum(Copy, infos, dest);
>+    instance()->d->imagesToAlbum(IOJobsThread::Copy, infos, dest);
> }
> 
> void DIO::move(const QList<ImageInfo>& infos, const PAlbum* const dest)
>@@ -455,7 +551,7 @@ void DIO::move(const QList<ImageInfo>& infos, const 
>PAlbum* const dest)
>         return;
>     }
> 
>-    instance()->d->imagesToAlbum(Move, infos, dest);
>+    instance()->d->imagesToAlbum(IOJobsThread::Move, infos, dest);
> }
> 
> // External files -> album --------------------------------------------
>@@ -472,7 +568,7 @@ void DIO::copy(const QList<QUrl>& srcList, const PAlbum* 
>const dest)
>         return;
>     }
> 
>-    instance()->d->filesToAlbum(Copy, srcList, dest);
>+    instance()->d->filesToAlbum(IOJobsThread::Copy, srcList, dest);
> }
> 
> void DIO::move(const QUrl& src, const PAlbum* const dest)
>@@ -487,7 +583,7 @@ void DIO::move(const QList<QUrl>& srcList, const PAlbum* 
>const dest)
>         return;
>     }
> 
>-    instance()->d->filesToAlbum(Move, srcList, dest);
>+    instance()->d->filesToAlbum(IOJobsThread::Move, srcList, dest);
> }
> 
> // Rename --------------------------------------------------------------
>@@ -520,7 +616,7 @@ void DIO::del(const PAlbum* const album, bool useTrash)
>     AlbumManager::instance()->removeWatchedPAlbums(album);
> #endif
> 
>-    instance()->createJob(useTrash ? Trash : Delete, QList<QUrl>() << 
>album->fileUrl(), QUrl());
>+    instance()->createJob(useTrash ? IOJobsThread::Trash : 
>IOJobsThread::Delete, QList<QUrl>() << album->fileUrl(), QUrl());
> }
> 
> } // namespace Digikam
>diff --git a/libs/database/utils/dio.h b/libs/database/utils/dio.h
>index acc88c80c7..b4d3822ef9 100644
>--- a/libs/database/utils/dio.h
>+++ b/libs/database/utils/dio.h
>@@ -40,6 +40,7 @@ namespace Digikam
> 
> class PAlbum;
> class ImageInfo;
>+class ProgressItem;
> 
> class DIGIKAM_EXPORT DIO : public QObject
> {
>@@ -91,9 +92,15 @@ Q_SIGNALS:
>     void imageRenameSucceeded(const QUrl&);
>     void imageRenameFailed(const QUrl&);
> 
>+protected:
>+
>+    ProgressItem* getProgressItem(int operation);
>+
> protected Q_SLOTS:
> 
>     void slotResult();
>+    void slotCancel(ProgressItem* item);
>+    void slotOneProccessed(int operation);
>     void slotRenamed(const QUrl& oldUrl, const QUrl& newUrl);
>     void createJob(int operation, const QList<QUrl>& src, const QUrl& dest);
> 
>diff --git a/libs/database/utils/dio_p.h b/libs/database/utils/dio_p.h
>index 4e61874c9c..5768de1ced 100644
>--- a/libs/database/utils/dio_p.h
>+++ b/libs/database/utils/dio_p.h
>@@ -109,19 +109,6 @@ private:
>     void process(const QList<ImageInfo>& source);
> };
> 
>-enum Operation
>-{
>-    Copy                = 1 << 0,
>-    Move                = 1 << 1,
>-    Rename              = 1 << 2,
>-    Trash               = 1 << 3,
>-    Delete              = 1 << 4,
>-    SourceStatusUnknown = 1 << 20,
>-
>-    OperationMask       = 0xffff,
>-    FlagMask            = 0xffff0000
>-};
>-
> } // anonymous namespace
> 
> } // namespace Digikam
>diff --git a/libs/iojobs/iojob.cpp b/libs/iojobs/iojob.cpp
>index f5f1dc2ece..fe8a5dced1 100644
>--- a/libs/iojobs/iojob.cpp
>+++ b/libs/iojobs/iojob.cpp
>@@ -61,6 +61,11 @@ CopyJob::CopyJob(const QUrl& src, const QUrl& dest, bool 
>isMove)
> 
> void CopyJob::run()
> {
>+    if (m_cancel)
>+    {
>+        return;
>+    }
>+
>     QFileInfo srcInfo(m_src.toLocalFile());
>     QDir dstDir(m_dest.toLocalFile());
> 
>@@ -166,6 +171,11 @@ DeleteJob::DeleteJob(const QUrl& srcToDelete, bool 
>useTrash, bool markAsObsolete
> 
> void DeleteJob::run()
> {
>+    if (m_cancel)
>+    {
>+        return;
>+    }
>+
>     QFileInfo fileInfo(m_srcToDelete.toLocalFile());
>     qCDebug(DIGIKAM_IOJOB_LOG) << "Deleting:   " << fileInfo.filePath();
>     qCDebug(DIGIKAM_IOJOB_LOG) << "File exists?" << fileInfo.exists();
>diff --git a/libs/iojobs/iojobsthread.cpp b/libs/iojobs/iojobsthread.cpp
>index 5014ebc7da..d315eca7cb 100644
>--- a/libs/iojobs/iojobsthread.cpp
>+++ b/libs/iojobs/iojobsthread.cpp
>@@ -44,12 +44,14 @@ public:
> 
>     Private()
>         : jobsCount(0),
>+          operation(SourceStatusUnknown),
>           isCanceled(false),
>           keepErrors(true)
>     {
>     }
> 
>     int            jobsCount;
>+    int            operation;
>     bool           isCanceled;
> 
>     bool           keepErrors;
>@@ -81,6 +83,7 @@ void IOJobsThread::copy(const QList<QUrl>& srcFiles, const 
>QUrl destAlbum)
>         d->jobsCount++;
>     }
> 
>+    d->operation = Copy;
>     appendJobs(collection);
> }
> 
>@@ -98,6 +101,7 @@ void IOJobsThread::move(const QList<QUrl>& srcFiles, const 
>QUrl destAlbum)
>         d->jobsCount++;
>     }
> 
>+    d->operation = Move;
>     appendJobs(collection);
> }
> 
>@@ -107,7 +111,7 @@ void IOJobsThread::deleteFiles(const QList<QUrl>& 
>srcsToDelete, bool useTrash)
> 
>     foreach (const QUrl& url, srcsToDelete)
>     {
>-        DeleteJob* const j = new DeleteJob(url, useTrash,true);
>+        DeleteJob* const j = new DeleteJob(url, useTrash, true);
> 
>         connectOneJob(j);
> 
>@@ -115,6 +119,15 @@ void IOJobsThread::deleteFiles(const QList<QUrl>& 
>srcsToDelete, bool useTrash)
>         d->jobsCount++;
>     }
> 
>+    if (useTrash)
>+    {
>+        d->operation = Trash;
>+    }
>+    else
>+    {
>+        d->operation = Delete;
>+    }
>+
>     appendJobs(collection);
> }
> 
>@@ -194,6 +207,7 @@ void IOJobsThread::renameFile(const QUrl& srcToRename, 
>const QUrl& newName)
>     collection.insert(j, 0);
>     d->jobsCount++;
> 
>+    d->operation = Rename;
>     appendJobs(collection);
> }
> 
>@@ -266,6 +280,8 @@ void IOJobsThread::oneJobFinished()
> {
>     d->jobsCount--;
> 
>+    emit oneProccessed(d->operation);
>+
>     if (d->jobsCount == 0)
>     {
>         emit finished();
>@@ -278,4 +294,9 @@ void IOJobsThread::error(const QString& errString)
>     d->errorsList.append(errString);
> }
> 
>+int IOJobsThread::operation()
>+{
>+    return d->operation;
>+}
>+
> } // namespace Digikam
>diff --git a/libs/iojobs/iojobsthread.h b/libs/iojobs/iojobsthread.h
>index d7dd979e9b..477f2de588 100644
>--- a/libs/iojobs/iojobsthread.h
>+++ b/libs/iojobs/iojobsthread.h
>@@ -41,6 +41,19 @@ class DIGIKAM_EXPORT IOJobsThread : public ActionThreadBase
> 
> public:
> 
>+enum Operation
>+{
>+    Copy                = 1 << 0,
>+    Move                = 1 << 1,
>+    Rename              = 1 << 2,
>+    Trash               = 1 << 3,
>+    Delete              = 1 << 4,
>+    SourceStatusUnknown = 1 << 20,
>+
>+    OperationMask       = 0xffff,
>+    FlagMask            = 0xffff0000
>+};
>+
>     IOJobsThread(QObject* const parent);
>     ~IOJobsThread();
> 
>@@ -90,11 +103,6 @@ public:
>      */
>     void renameFile(const QUrl& srcToRename, const QUrl& newName);
> 
>-    /**
>-     * @brief cancels thread execution
>-     */
>-    void cancel();
>-
>     /**
>      * @brief isCanceled
>      * @return true if the thread was inturrupted
>@@ -125,6 +133,12 @@ public:
>      */
>     QList<QString>& errorsList();
> 
>+   /**
>+     * @brief operation
>+     * @return
>+     */
>+    int operation();
>+
> public Q_SLOTS:
> 
>     /**
>@@ -139,12 +153,18 @@ public Q_SLOTS:
>      */
>     void error(const QString& errString);
> 
>+    /**
>+     * @brief cancels thread execution
>+     */
>+    void cancel();
>+
> Q_SIGNALS:
> 
>     void finished();
> 
>     void renamed(const QUrl& oldUrl, const QUrl& newURl);
>     void renameFailed(const QUrl& oldUrl);
>+    void oneProccessed(int operation);
> 
>     void collectionTrashItemInfo(const DTrashItemInfo& trashItemInfo);
>

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to