┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/versioncontrol
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2010-03-22 22:23:02 +0000
committerPeter Penz <[email protected]>2010-03-22 22:23:02 +0000
commitcaf017c2fefa8280046b02cfd071a118f2909ced (patch)
treea17f5bd569830806d679c7aedf103861ff9b2507 /src/versioncontrol
parent622acabf23b6c8c3badab6a8c2e93e0ae8963f1b (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.cpp10
-rw-r--r--src/versioncontrol/updateitemstatesthread.h5
-rw-r--r--src/versioncontrol/versioncontrolobserver.cpp53
-rw-r--r--src/versioncontrol/versioncontrolobserver.h7
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