#include <KLocale>
#include <KService>
#include <KServiceTypeTrader>
+#include <kitemviews/kfileitemmodel.h>
#include <kversioncontrolplugin.h>
#include "pendingthreadsmaintainer.h"
#include "updateitemstatesthread.h"
-#include <QAbstractProxyModel>
-#include <QAbstractItemView>
#include <QMutexLocker>
#include <QTimer>
-#include <views/dolphinmodel.h>
-
-VersionControlObserver::VersionControlObserver(QAbstractItemView* view) :
- QObject(view),
+VersionControlObserver::VersionControlObserver(QObject* parent) :
+ QObject(parent),
m_pendingItemStatesUpdate(false),
m_versionedDirectory(false),
m_silentUpdate(false),
- m_view(view),
- m_dirLister(0),
- m_dolphinModel(0),
+ m_model(0),
m_dirVerificationTimer(0),
m_plugin(0),
m_updateItemStatesThread(0)
{
- Q_ASSERT(view);
-
- QAbstractProxyModel* proxyModel = qobject_cast<QAbstractProxyModel*>(view->model());
- m_dolphinModel = proxyModel ?
- qobject_cast<DolphinModel*>(proxyModel->sourceModel()) :
- qobject_cast<DolphinModel*>(view->model());
-
- if (m_dolphinModel) {
- m_dirLister = m_dolphinModel->dirLister();
- connect(m_dirLister, SIGNAL(completed()),
- this, SLOT(delayedDirectoryVerification()));
-
- // The verification timer specifies the timeout until the shown directory
- // is checked whether it is versioned. Per default it is assumed that users
- // don't iterate through versioned directories and a high timeout is used
- // The timeout will be decreased as soon as a versioned directory has been
- // found (see verifyDirectory()).
- m_dirVerificationTimer = new QTimer(this);
- m_dirVerificationTimer->setSingleShot(true);
- m_dirVerificationTimer->setInterval(500);
- connect(m_dirVerificationTimer, SIGNAL(timeout()),
- this, SLOT(verifyDirectory()));
- }
+ // The verification timer specifies the timeout until the shown directory
+ // is checked whether it is versioned. Per default it is assumed that users
+ // don't iterate through versioned directories and a high timeout is used
+ // The timeout will be decreased as soon as a versioned directory has been
+ // found (see verifyDirectory()).
+ m_dirVerificationTimer = new QTimer(this);
+ m_dirVerificationTimer->setSingleShot(true);
+ m_dirVerificationTimer->setInterval(500);
+ connect(m_dirVerificationTimer, SIGNAL(timeout()),
+ this, SLOT(verifyDirectory()));
}
VersionControlObserver::~VersionControlObserver()
}
}
+void VersionControlObserver::setModel(KFileItemModel* model)
+{
+ if (m_model) {
+ disconnect(m_model, SIGNAL(itemsInserted(KItemRangeList)),
+ this, SLOT(delayedDirectoryVerification()));
+ }
+
+ m_model = model;
+
+ if (model) {
+ connect(m_model, SIGNAL(itemsInserted(KItemRangeList)),
+ this, SLOT(delayedDirectoryVerification()));
+ }
+}
+
+KFileItemModel* VersionControlObserver::model() const
+{
+ return m_model;
+}
+
QList<QAction*> VersionControlObserver::contextMenuActions(const KFileItemList& items) const
{
QList<QAction*> actions;
void VersionControlObserver::verifyDirectory()
{
- const KUrl versionControlUrl = m_dirLister->url();
+ if (!m_model) {
+ return;
+ }
+
+ const KUrl versionControlUrl = m_model->rootDirectory();
if (!versionControlUrl.isLocalFile()) {
return;
}
// The directory is versioned. Assume that the user will further browse through
// versioned directories and decrease the verification timer.
m_dirVerificationTimer->setInterval(100);
- connect(m_dirLister, SIGNAL(refreshItems(const QList<QPair<KFileItem,KFileItem>>&)),
- this, SLOT(delayedDirectoryVerification()));
- connect(m_dirLister, SIGNAL(newItems(const KFileItemList&)),
- this, SLOT(delayedDirectoryVerification()));
+ connect(m_model, SIGNAL(itemsInserted(KItemRangeList)),
+ this, SLOT(delayedDirectoryVerification()));
}
updateItemStates();
} else if (m_versionedDirectory) {
// value, so that browsing through non-versioned directories is not slown down
// by an immediate verification.
m_dirVerificationTimer->setInterval(500);
- disconnect(m_dirLister, SIGNAL(refreshItems(const QList<QPair<KFileItem,KFileItem>>&)),
- this, SLOT(delayedDirectoryVerification()));
- disconnect(m_dirLister, SIGNAL(newItems(const KFileItemList&)),
+ disconnect(m_model, SIGNAL(itemsInserted(KItemRangeList)),
this, SLOT(delayedDirectoryVerification()));
}
}
}
if (!m_updateItemStatesThread->retrievedItems()) {
- // ignore m_silentUpdate for an error message
+ // Ignore m_silentUpdate for an error message
emit errorMessage(i18nc("@info:status", "Update of version information failed."));
return;
}
- // QAbstractItemModel::setData() triggers a bottleneck in combination with QListView
- // (a detailed description of the root cause is given in the class KFilePreviewGenerator
- // from kdelibs). To bypass this bottleneck, the signals of the model are temporary blocked.
- // This works as the update of the data does not require a relayout of the views used in Dolphin.
- const bool signalsBlocked = m_dolphinModel->signalsBlocked();
- m_dolphinModel->blockSignals(true);
-
const QList<ItemState> itemStates = m_updateItemStatesThread->itemStates();
foreach (const ItemState& itemState, itemStates) {
- m_dolphinModel->setData(itemState.index,
- QVariant(static_cast<int>(itemState.version)),
- Qt::DecorationRole);
+ QHash<QByteArray, QVariant> values;
+ values.insert("version", QVariant(static_cast<int>(itemState.version)));
+ m_model->setData(itemState.index, values);
}
- m_dolphinModel->blockSignals(signalsBlocked);
- m_view->viewport()->repaint();
-
if (!m_silentUpdate) {
// Using an empty message results in clearing the previously shown information message and showing
// the default status bar information. This is useful as the user already gets feedback that the
}
QList<ItemState> itemStates;
- addDirectory(QModelIndex(), itemStates);
+ //addDirectory(QModelIndex(), itemStates);
if (!itemStates.isEmpty()) {
if (!m_silentUpdate) {
emit infoMessage(i18nc("@info:status", "Updating version information..."));
}
}
-void VersionControlObserver::addDirectory(const QModelIndex& parentIndex, QList<ItemState>& itemStates)
+/*void VersionControlObserver::addDirectory(const QModelIndex& parentIndex, QList<ItemState>& itemStates)
{
+ Q_UNUSED(parentIndex);
+ Q_UNUSED(itemStates);
const int rowCount = m_dolphinModel->rowCount(parentIndex);
for (int row = 0; row < rowCount; ++row) {
const QModelIndex index = m_dolphinModel->index(row, DolphinModel::Version, parentIndex);
itemStates.append(itemState);
}
-}
+}*/
KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& directory) const
{
// Verify whether the current directory contains revision information
// like .svn, .git, ...
+ Q_UNUSED(directory);
foreach (KVersionControlPlugin* plugin, plugins) {
// Use the KDirLister cache to check for .svn, .git, ... files
KUrl dirUrl(directory);
KUrl fileUrl = dirUrl;
fileUrl.addPath(plugin->fileName());
- const KFileItem item = m_dirLister->findByUrl(fileUrl);
+ const KFileItem item; // = m_dirLister->findByUrl(fileUrl);
if (!item.isNull()) {
return plugin;
}
bool VersionControlObserver::isVersioned() const
{
- return m_dolphinModel->hasVersionData() && m_plugin;
+ return false; //m_dolphinModel->hasVersionData() && m_plugin;
}
#include "versioncontrolobserver.moc"