X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/38c34eeca315c7be58e65d4d3fb72aaf7b866719..e018ecafca79a73f1e9d76c577b9529fc3a7ae03:/src/views/versioncontrol/versioncontrolobserver.cpp diff --git a/src/views/versioncontrol/versioncontrolobserver.cpp b/src/views/versioncontrol/versioncontrolobserver.cpp index 28fbbef1a..521ff8b90 100644 --- a/src/views/versioncontrol/versioncontrolobserver.cpp +++ b/src/views/versioncontrol/versioncontrolobserver.cpp @@ -26,7 +26,7 @@ VersionControlObserver::VersionControlObserver(QObject *parent) , m_model(nullptr) , m_dirVerificationTimer(nullptr) , m_pluginsInitialized(false) - , m_plugin(nullptr) + , m_currentPlugin(nullptr) , m_updateItemStatesThread(nullptr) { // The verification timer specifies the timeout until the shown directory @@ -42,17 +42,35 @@ VersionControlObserver::VersionControlObserver(QObject *parent) VersionControlObserver::~VersionControlObserver() { - if (m_plugin) { - m_plugin->disconnect(this); - m_plugin = nullptr; + if (m_currentPlugin) { + m_currentPlugin->disconnect(this); } + if (m_updateItemStatesThread) { + m_updateItemStatesThread->requestInterruption(); + m_updateItemStatesThread->wait(); + m_updateItemStatesThread->deleteLater(); + } + + if (m_currentPlugin) { + delete m_currentPlugin; + m_currentPlugin = nullptr; + } + m_plugins.clear(); } void VersionControlObserver::setModel(KFileItemModel *model) { if (m_model) { + if (m_currentPlugin) { + delete m_currentPlugin; + m_currentPlugin = nullptr; + } + if (m_updateItemStatesThread) { + m_updateItemStatesThread->requestInterruption(); + } disconnect(m_model, &KFileItemModel::itemsInserted, this, &VersionControlObserver::delayedDirectoryVerification); disconnect(m_model, &KFileItemModel::itemsChanged, this, &VersionControlObserver::slotItemsChanged); + disconnect(m_model, &KFileItemModel::directoryLoadingCompleted, this, &VersionControlObserver::verifyDirectory); } m_model = model; @@ -60,6 +78,7 @@ void VersionControlObserver::setModel(KFileItemModel *model) if (model) { connect(m_model, &KFileItemModel::itemsInserted, this, &VersionControlObserver::delayedDirectoryVerification); connect(m_model, &KFileItemModel::itemsChanged, this, &VersionControlObserver::slotItemsChanged); + connect(m_model, &KFileItemModel::directoryLoadingCompleted, this, &VersionControlObserver::verifyDirectory); } } @@ -102,10 +121,10 @@ QList VersionControlObserver::actions(const KFileItemList &items) con } if (isVersionControlled()) { - return m_plugin->versionControlActions(items); + return m_currentPlugin->versionControlActions(items); } else { QList actions; - for (const QPointer &plugin : qAsConst(m_plugins)) { + for (const KVersionControlPlugin *plugin : std::as_const(m_plugins)) { actions << plugin->outOfVersionControlActions(items); } return actions; @@ -114,12 +133,22 @@ QList VersionControlObserver::actions(const KFileItemList &items) con void VersionControlObserver::delayedDirectoryVerification() { + if (!isVersionControlled()) { + m_dirVerificationTimer->stop(); + return; + } + m_silentUpdate = false; m_dirVerificationTimer->start(); } void VersionControlObserver::silentDirectoryVerification() { + if (!isVersionControlled()) { + m_dirVerificationTimer->stop(); + return; + } + m_silentUpdate = true; m_dirVerificationTimer->start(); } @@ -147,24 +176,24 @@ void VersionControlObserver::verifyDirectory() return; } - if (m_plugin != nullptr) { - if (!rootItem.url().path().startsWith(m_localRepoRoot) || !QFile::exists(m_localRepoRoot + '/' + m_plugin->fileName())) { - m_plugin = nullptr; + if (m_currentPlugin && rootItem.url().path().startsWith(m_localRepoRoot) && QFile::exists(m_localRepoRoot + '/' + m_currentPlugin->fileName())) { + // current directory is still versionned + updateItemStates(); + return; + } - // The directory is not versioned. Reset the verification timer to a higher - // value, so that browsing through non-versioned directories is not slown down - // by an immediate verification. - m_dirVerificationTimer->setInterval(500); - } else { - // View was versioned but should not be anymore - updateItemStates(); - } - } else if ((m_plugin = searchPlugin(rootItem.url()))) { + if ((m_currentPlugin = searchPlugin(rootItem.url()))) { // The directory is versioned. Assume that the user will further browse through // versioned directories and decrease the verification timer. m_dirVerificationTimer->setInterval(100); updateItemStates(); + return; } + + // The directory is not versioned. Reset the verification timer to a higher + // value, so that browsing through non-versioned directories is not slown down + // by an immediate verification. + m_dirVerificationTimer->setInterval(500); } void VersionControlObserver::slotThreadFinished() @@ -172,7 +201,7 @@ void VersionControlObserver::slotThreadFinished() UpdateItemStatesThread *thread = m_updateItemStatesThread; m_updateItemStatesThread = nullptr; // The thread deletes itself automatically (see updateItemStates()) - if (!m_plugin || !thread) { + if (!m_currentPlugin || !thread) { return; } @@ -205,7 +234,7 @@ void VersionControlObserver::slotThreadFinished() void VersionControlObserver::updateItemStates() { - Q_ASSERT(m_plugin); + Q_ASSERT(m_currentPlugin); if (m_updateItemStatesThread) { // An update is currently ongoing. Wait until the thread has finished // the update (see slotThreadFinished()). @@ -218,9 +247,9 @@ void VersionControlObserver::updateItemStates() if (!itemStates.isEmpty()) { if (!m_silentUpdate) { - Q_EMIT infoMessage(i18nc("@info:status", "Updating version information...")); + Q_EMIT infoMessage(i18nc("@info:status", "Updating version information…")); } - m_updateItemStatesThread = new UpdateItemStatesThread(m_plugin, itemStates); + m_updateItemStatesThread = new UpdateItemStatesThread(m_currentPlugin, itemStates); connect(m_updateItemStatesThread, &UpdateItemStatesThread::finished, this, &VersionControlObserver::slotThreadFinished); connect(m_updateItemStatesThread, &UpdateItemStatesThread::finished, m_updateItemStatesThread, &UpdateItemStatesThread::deleteLater); @@ -271,19 +300,16 @@ void VersionControlObserver::initPlugins() const QVector plugins = KPluginMetaData::findPlugins(QStringLiteral("dolphin/vcs")); - QSet loadedPlugins; - for (const auto &p : plugins) { if (enabledPlugins.contains(p.name())) { auto plugin = KPluginFactory::instantiatePlugin(p, parent()).plugin; if (plugin) { m_plugins.append(plugin); - loadedPlugins += p.name(); } } } - for (auto &plugin : qAsConst(m_plugins)) { + for (const auto *plugin : std::as_const(m_plugins)) { connect(plugin, &KVersionControlPlugin::itemVersionsChanged, this, &VersionControlObserver::silentDirectoryVerification); connect(plugin, &KVersionControlPlugin::infoMessage, this, &VersionControlObserver::infoMessage); connect(plugin, &KVersionControlPlugin::errorMessage, this, &VersionControlObserver::errorMessage); @@ -299,17 +325,14 @@ KVersionControlPlugin *VersionControlObserver::searchPlugin(const QUrl &director initPlugins(); // Verify whether the current directory is under a version system - for (const QPointer &plugin : qAsConst(m_plugins)) { - if (!plugin) { - continue; - } - + for (KVersionControlPlugin *plugin : std::as_const(m_plugins)) { // first naively check if we are at working copy root const QString fileName = directory.path() + '/' + plugin->fileName(); if (QFile::exists(fileName)) { m_localRepoRoot = directory.path(); return plugin; } + const QString root = plugin->localRepositoryRoot(directory.path()); if (!root.isEmpty()) { m_localRepoRoot = root; @@ -321,5 +344,7 @@ KVersionControlPlugin *VersionControlObserver::searchPlugin(const QUrl &director bool VersionControlObserver::isVersionControlled() const { - return m_plugin != nullptr; + return m_currentPlugin != nullptr; } + +#include "moc_versioncontrolobserver.cpp"