diff options
| author | Peter Penz <[email protected]> | 2010-03-22 22:23:02 +0000 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2010-03-22 22:23:02 +0000 |
| commit | caf017c2fefa8280046b02cfd071a118f2909ced (patch) | |
| tree | a17f5bd569830806d679c7aedf103861ff9b2507 /src/versioncontrol | |
| parent | 622acabf23b6c8c3badab6a8c2e93e0ae8963f1b (diff) | |
Use KFileMetaDataWidget from kdelibs. Still open: Provide dialog which wraps KFileMetaDataConfigurationWidget.
svn path=/trunk/KDE/kdebase/apps/; revision=1106465
Diffstat (limited to 'src/versioncontrol')
| -rw-r--r-- | src/versioncontrol/updateitemstatesthread.cpp | 10 | ||||
| -rw-r--r-- | src/versioncontrol/updateitemstatesthread.h | 5 | ||||
| -rw-r--r-- | src/versioncontrol/versioncontrolobserver.cpp | 53 | ||||
| -rw-r--r-- | src/versioncontrol/versioncontrolobserver.h | 7 |
4 files changed, 48 insertions, 27 deletions
diff --git a/src/versioncontrol/updateitemstatesthread.cpp b/src/versioncontrol/updateitemstatesthread.cpp index ca212c97d..0cd5b93e1 100644 --- a/src/versioncontrol/updateitemstatesthread.cpp +++ b/src/versioncontrol/updateitemstatesthread.cpp @@ -86,14 +86,4 @@ bool UpdateItemStatesThread::retrievedItems() const return m_retrievedItems; } -void UpdateItemStatesThread::deleteWhenFinished() -{ - connect(this, SIGNAL(finished()), this, SLOT(slotFinished())); -} - -void UpdateItemStatesThread::slotFinished() -{ - deleteLater(); -} - #include "updateitemstatesthread.moc" diff --git a/src/versioncontrol/updateitemstatesthread.h b/src/versioncontrol/updateitemstatesthread.h index bee5c02c0..a687827c9 100644 --- a/src/versioncontrol/updateitemstatesthread.h +++ b/src/versioncontrol/updateitemstatesthread.h @@ -50,14 +50,9 @@ public: bool retrievedItems() const; - void deleteWhenFinished(); - protected: virtual void run(); -private slots: - void slotFinished(); - private: bool m_retrievedItems; KVersionControlPlugin* m_plugin; diff --git a/src/versioncontrol/versioncontrolobserver.cpp b/src/versioncontrol/versioncontrolobserver.cpp index ebe59e049..f47f47484 100644 --- a/src/versioncontrol/versioncontrolobserver.cpp +++ b/src/versioncontrol/versioncontrolobserver.cpp @@ -35,6 +35,18 @@ #include <QMutexLocker> #include <QTimer> +/* + * Maintains a list of pending threads, that get regulary checked + * whether they are finished and hence can get deleted. QThread::wait() + * is never used to prevent any blocking of the user interface. + */ +struct PendingThreadsSingleton +{ + QList<UpdateItemStatesThread*> list; +}; +K_GLOBAL_STATIC(PendingThreadsSingleton, s_pendingThreads) + + VersionControlObserver::VersionControlObserver(QAbstractItemView* view) : QObject(view), m_pendingItemStatesUpdate(false), @@ -74,14 +86,22 @@ VersionControlObserver::VersionControlObserver(QAbstractItemView* view) : VersionControlObserver::~VersionControlObserver() { if (m_updateItemStatesThread != 0) { - disconnect(m_updateItemStatesThread, SIGNAL(finished()), - this, SLOT(applyUpdatedItemStates())); if (m_updateItemStatesThread->isFinished()) { delete m_updateItemStatesThread; + m_updateItemStatesThread = 0; } else { - m_updateItemStatesThread->deleteWhenFinished(); + // The version controller gets deleted, while a thread still + // is working to get the version information. To avoid a blocking + // user interface, no waiting for the finished() signal of the thread is + // done. Instead the thread will be remembered inside the global + // list s_pendingThreads, which will checked regulary. The thread does + // not work on shared data that is part of the VersionController instance, + // so skipping the waiting is save. + disconnect(m_updateItemStatesThread, SIGNAL(finished()), + this, SLOT(slotThreadFinished())); + s_pendingThreads->list.append(m_updateItemStatesThread); + m_updateItemStatesThread = 0; } - m_updateItemStatesThread = 0; } m_plugin->disconnect(); @@ -123,6 +143,19 @@ void VersionControlObserver::silentDirectoryVerification() void VersionControlObserver::verifyDirectory() { + if (!s_pendingThreads->list.isEmpty()) { + // Try to cleanup pending threads (see explanation in destructor) + QList<UpdateItemStatesThread*>::iterator it = s_pendingThreads->list.begin(); + while (it != s_pendingThreads->list.end()) { + if ((*it)->isFinished()) { + (*it)->deleteLater(); + it = s_pendingThreads->list.erase(it); + } else { + ++it; + } + } + } + KUrl versionControlUrl = m_dirLister->url(); if (!versionControlUrl.isLocalFile()) { return; @@ -177,11 +210,9 @@ void VersionControlObserver::verifyDirectory() } } -void VersionControlObserver::applyUpdatedItemStates() +void VersionControlObserver::slotThreadFinished() { if (m_plugin == 0) { - // The signal finished() has been emitted, but the thread has been marked - // as invalid in the meantime. Just ignore the signal in this case. return; } @@ -214,7 +245,7 @@ void VersionControlObserver::applyUpdatedItemStates() // operation has been completed because of the icon emblems. emit operationCompletedMessage(QString()); } - + if (m_pendingItemStatesUpdate) { m_pendingItemStatesUpdate = false; updateItemStates(); @@ -227,11 +258,11 @@ void VersionControlObserver::updateItemStates() if (m_updateItemStatesThread == 0) { m_updateItemStatesThread = new UpdateItemStatesThread(); connect(m_updateItemStatesThread, SIGNAL(finished()), - this, SLOT(applyUpdatedItemStates())); + this, SLOT(slotThreadFinished())); } if (m_updateItemStatesThread->isRunning()) { // An update is currently ongoing. Wait until the thread has finished - // the update (see applyUpdatedItemStates()). + // the update (see slotThreadFinished()). m_pendingItemStatesUpdate = true; return; } @@ -243,7 +274,7 @@ void VersionControlObserver::updateItemStates() emit infoMessage(i18nc("@info:status", "Updating version information...")); } m_updateItemStatesThread->setData(m_plugin, itemStates); - m_updateItemStatesThread->start(); // applyUpdatedItemStates() is called when finished + m_updateItemStatesThread->start(); // slotThreadFinished() is called when finished } } diff --git a/src/versioncontrol/versioncontrolobserver.h b/src/versioncontrol/versioncontrolobserver.h index 2d1cd02b3..08bb234b3 100644 --- a/src/versioncontrol/versioncontrolobserver.h +++ b/src/versioncontrol/versioncontrolobserver.h @@ -93,7 +93,12 @@ private slots: void silentDirectoryVerification(); void verifyDirectory(); - void applyUpdatedItemStates(); + + /** + * Is invoked if the thread m_updateItemStatesThread has been finished + * and applys the item states. + */ + void slotThreadFinished(); private: struct ItemState |
