From: Peter Penz Date: Sat, 10 Sep 2011 16:08:03 +0000 (+0200) Subject: Provide KVersionControlPlugin version 2 X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/ff243261742ecd70fb9e417614e757b5956c04aa Provide KVersionControlPlugin version 2 Based on the work of Vishesh Yadav some extensions where required for the KVersionControlPlugin interface that have found there way now into KVersionControlPlugin2. Beside some interface cleanups it is now possible that a version control plugin may also provide context actions for directories or files that are not versioned yet. REVIEW: 102541 --- diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index ff0c4a02d..c0287340e 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -223,13 +223,13 @@ int KFileItemModel::index(const KFileItem& item) const return m_items.value(item.url(), -1); } -KUrl KFileItemModel::rootDirectory() const +KFileItem KFileItemModel::rootItem() const { const KDirLister* dirLister = m_dirLister.data(); if (dirLister) { - return dirLister->url(); + return dirLister->rootItem(); } - return KUrl(); + return KFileItem(); } void KFileItemModel::clear() diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index 5d75329d1..160817043 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -97,9 +97,9 @@ public: int index(const KFileItem& item) const; /** - * @return Root directory of all items. + * @return Root item of all items. */ - KUrl rootDirectory() const; + KFileItem rootItem() const; /** * Clears all items of the model. diff --git a/src/views/dolphinfileitemlistwidget.cpp b/src/views/dolphinfileitemlistwidget.cpp index d39d58cd0..f3489e1b5 100644 --- a/src/views/dolphinfileitemlistwidget.cpp +++ b/src/views/dolphinfileitemlistwidget.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -41,7 +42,7 @@ void DolphinFileItemListWidget::refreshCache() if (values.contains("version")) { // The item is under version control. Apply the text color corresponding // to its version state. - const KVersionControlPlugin::VersionState version = static_cast(values.value("version").toInt()); + const KVersionControlPlugin2::ItemVersion version = static_cast(values.value("version").toInt()); const QColor textColor = styleOption().palette.text().color(); QColor tintColor = textColor; @@ -49,14 +50,16 @@ void DolphinFileItemListWidget::refreshCache() // as tint colors and are mixed with the current set text color. The tint colors // have been optimized for the base colors of the corresponding Oxygen emblems. switch (version) { - case KVersionControlPlugin::UpdateRequiredVersion: tintColor = Qt::yellow; break; - case KVersionControlPlugin::LocallyModifiedUnstagedVersion: tintColor = Qt::green; break; - case KVersionControlPlugin::LocallyModifiedVersion: tintColor = Qt::green; break; - case KVersionControlPlugin::AddedVersion: tintColor = Qt::green; break; - case KVersionControlPlugin::RemovedVersion: tintColor = Qt::darkRed; break; - case KVersionControlPlugin::ConflictingVersion: tintColor = Qt::red; break; - case KVersionControlPlugin::UnversionedVersion: tintColor = Qt::white; break; - case KVersionControlPlugin::NormalVersion: + case KVersionControlPlugin2::UpdateRequiredVersion: tintColor = Qt::yellow; break; + case KVersionControlPlugin2::LocallyModifiedUnstagedVersion: tintColor = Qt::green; break; + case KVersionControlPlugin2::LocallyModifiedVersion: tintColor = Qt::green; break; + case KVersionControlPlugin2::AddedVersion: tintColor = Qt::green; break; + case KVersionControlPlugin2::RemovedVersion: tintColor = Qt::darkRed; break; + case KVersionControlPlugin2::ConflictingVersion: tintColor = Qt::red; break; + case KVersionControlPlugin2::UnversionedVersion: tintColor = Qt::white; break; + case KVersionControlPlugin2::IgnoredVersion: tintColor = Qt::white; break; + case KVersionControlPlugin2::MissingVersion: tintColor = Qt::red; break; + case KVersionControlPlugin2::NormalVersion: default: break; } @@ -74,7 +77,7 @@ void DolphinFileItemListWidget::refreshCache() setTextColor(color); } -QPixmap DolphinFileItemListWidget::overlayForState(KVersionControlPlugin::VersionState version, int size) +QPixmap DolphinFileItemListWidget::overlayForState(KVersionControlPlugin2::ItemVersion version, int size) { int overlayHeight = KIconLoader::SizeSmall; if (size >= KIconLoader::SizeEnormous) { diff --git a/src/views/dolphinfileitemlistwidget.h b/src/views/dolphinfileitemlistwidget.h index 8435b5c18..87ed0333b 100644 --- a/src/views/dolphinfileitemlistwidget.h +++ b/src/views/dolphinfileitemlistwidget.h @@ -23,7 +23,7 @@ #include #include -#include +#include /** * @brief Extends KFileItemListWidget to handle the "version" role. @@ -43,7 +43,7 @@ protected: virtual void refreshCache(); private: - static QPixmap overlayForState(KVersionControlPlugin::VersionState state, int size); + static QPixmap overlayForState(KVersionControlPlugin2::ItemVersion version, int size); }; diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index a53934ddc..7cb594d8e 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -521,10 +521,10 @@ QList DolphinView::versionControlActions(const KFileItemList& items) c QList actions; if (items.isEmpty()) { - const KUrl url = fileItemModel()->rootDirectory(); - actions = m_versionControlObserver->contextMenuActions(url.path(KUrl::AddTrailingSlash)); + const KFileItem item = fileItemModel()->rootItem(); + actions = m_versionControlObserver->actions(KFileItemList() << item); } else { - actions = m_versionControlObserver->contextMenuActions(items); + actions = m_versionControlObserver->actions(items); } return actions; diff --git a/src/views/versioncontrol/updateitemstatesthread.cpp b/src/views/versioncontrol/updateitemstatesthread.cpp index 1fa3a6255..f9746aadd 100644 --- a/src/views/versioncontrol/updateitemstatesthread.cpp +++ b/src/views/versioncontrol/updateitemstatesthread.cpp @@ -19,6 +19,8 @@ #include "updateitemstatesthread.h" +#include + #include UpdateItemStatesThread::UpdateItemStatesThread() : @@ -64,9 +66,19 @@ void UpdateItemStatesThread::run() if (m_plugin->beginRetrieval(directory)) { itemLocker.relock(); const int count = m_itemStates.count(); - for (int i = 0; i < count; ++i) { - m_itemStates[i].version = m_plugin->versionState(m_itemStates[i].item); + + KVersionControlPlugin2* pluginV2 = qobject_cast(m_plugin); + if (pluginV2) { + for (int i = 0; i < count; ++i) { + m_itemStates[i].version = pluginV2->itemVersion(m_itemStates[i].item); + } + } else { + for (int i = 0; i < count; ++i) { + const KVersionControlPlugin::VersionState state = m_plugin->versionState(m_itemStates[i].item); + m_itemStates[i].version = static_cast(state); + } } + m_plugin->endRetrieval(); m_retrievedItems = true; } diff --git a/src/views/versioncontrol/versioncontrolobserver.cpp b/src/views/versioncontrol/versioncontrolobserver.cpp index c8d9d6874..20b059035 100644 --- a/src/views/versioncontrol/versioncontrolobserver.cpp +++ b/src/views/versioncontrol/versioncontrolobserver.cpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include "updateitemstatesthread.h" @@ -87,30 +87,41 @@ KFileItemModel* VersionControlObserver::model() const return m_model; } -QList VersionControlObserver::contextMenuActions(const KFileItemList& items) const +QList VersionControlObserver::actions(const KFileItemList& items) const { QList actions; - if (isVersioned()) { + if (!m_model) { + return actions; + } + + KVersionControlPlugin2* pluginV2 = qobject_cast(m_plugin); + if (pluginV2) { + // Use version 2 of the KVersionControlPlugin which allows providing actions + // also for non-versioned directories. if (m_updateItemStatesThread && m_updateItemStatesThread->lockPlugin()) { - actions = m_plugin->contextMenuActions(items); + actions = pluginV2->actions(items); m_updateItemStatesThread->unlockPlugin(); } else { - actions = m_plugin->contextMenuActions(items); + actions = pluginV2->actions(items); + } + } else if (isVersioned()) { + // Support deprecated interfaces from KVersionControlPlugin version 1. + // Context menu actions where only available for versioned directories. + QString directory; + if (items.count() == 1) { + const KFileItem rootItem = m_model->rootItem(); + if (!rootItem.isNull() && items.first().url() == rootItem.url()) { + directory = rootItem.url().path(KUrl::AddTrailingSlash); + } } - } - - return actions; -} -QList VersionControlObserver::contextMenuActions(const QString& directory) const -{ - QList actions; - if (isVersioned()) { if (m_updateItemStatesThread && m_updateItemStatesThread->lockPlugin()) { - actions = m_plugin->contextMenuActions(directory); + actions = directory.isEmpty() ? m_plugin->contextMenuActions(items) + : m_plugin->contextMenuActions(directory); m_updateItemStatesThread->unlockPlugin(); } else { - actions = m_plugin->contextMenuActions(directory); + actions = directory.isEmpty() ? m_plugin->contextMenuActions(items) + : m_plugin->contextMenuActions(directory); } } @@ -135,7 +146,7 @@ void VersionControlObserver::verifyDirectory() return; } - const KUrl versionControlUrl = m_model->rootDirectory(); + const KUrl versionControlUrl = m_model->rootItem().url(); if (!versionControlUrl.isLocalFile()) { return; } @@ -146,8 +157,14 @@ void VersionControlObserver::verifyDirectory() m_plugin = searchPlugin(versionControlUrl); if (m_plugin) { - connect(m_plugin, SIGNAL(versionStatesChanged()), - this, SLOT(silentDirectoryVerification())); + KVersionControlPlugin2* pluginV2 = qobject_cast(m_plugin); + if (pluginV2) { + connect(pluginV2, SIGNAL(itemVersionsChanged()), + this, SLOT(silentDirectoryVerification())); + } else { + connect(m_plugin, SIGNAL(versionStatesChanged()), + this, SLOT(silentDirectoryVerification())); + } connect(m_plugin, SIGNAL(infoMessage(QString)), this, SIGNAL(infoMessage(QString))); connect(m_plugin, SIGNAL(errorMessage(QString)), @@ -233,7 +250,7 @@ void VersionControlObserver::updateItemStates() ItemState itemState; itemState.index = i; itemState.item = m_model->fileItem(i); - itemState.version = KVersionControlPlugin::UnversionedVersion; + itemState.version = KVersionControlPlugin2::UnversionedVersion; itemStates.append(itemState); } diff --git a/src/views/versioncontrol/versioncontrolobserver.h b/src/views/versioncontrol/versioncontrolobserver.h index e160008d7..501af7d6f 100644 --- a/src/views/versioncontrol/versioncontrolobserver.h +++ b/src/views/versioncontrol/versioncontrolobserver.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include @@ -54,8 +54,7 @@ public: void setModel(KFileItemModel* model); KFileItemModel* model() const; - QList contextMenuActions(const KFileItemList& items) const; - QList contextMenuActions(const QString& directory) const; + QList actions(const KFileItemList& items) const; signals: /** @@ -105,7 +104,7 @@ private: { int index; KFileItem item; - KVersionControlPlugin::VersionState version; + KVersionControlPlugin2::ItemVersion version; }; void updateItemStates();