/*************************************************************************** * Copyright (C) 2009 by Peter Penz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "revisioncontrolobserver.h" #include "dolphinmodel.h" #include "revisioncontrolplugin.h" #include #include #include #include RevisionControlObserver::RevisionControlObserver(QAbstractItemView* view) : QObject(view), m_view(view), m_dirLister(0), m_dolphinModel(0), m_dirVerificationTimer(0), m_plugin(0) { Q_ASSERT(view != 0); QAbstractProxyModel* proxyModel = qobject_cast(view->model()); m_dolphinModel = (proxyModel == 0) ? qobject_cast(view->model()) : qobject_cast(proxyModel->sourceModel()); if (m_dolphinModel != 0) { m_dirLister = m_dolphinModel->dirLister(); connect(m_dirLister, SIGNAL(completed()), this, SLOT(delayedDirectoryVerification())); // TODO: // connect(m_dirLister, SIGNAL(refreshItems(const QList>&)), // this, SLOT(refreshItems())); // 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())); } } RevisionControlObserver::~RevisionControlObserver() { delete m_plugin; m_plugin = 0; } void RevisionControlObserver::delayedDirectoryVerification() { m_dirVerificationTimer->start(); } void RevisionControlObserver::verifyDirectory() { KUrl revisionControlUrl = m_dirLister->url(); if (!revisionControlUrl.isLocalFile()) { return; } if (m_plugin == 0) { // TODO: just for testing purposes. A plugin approach will be used later. m_plugin = new SubversionPlugin(); } revisionControlUrl.addPath(m_plugin->fileName()); KFileItem item = m_dirLister->findByUrl(revisionControlUrl); if (item.isNull()) { // 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 { // The directory is versioned. Assume that the user will further browse through // versioned directories and decrease the verification timer. m_dirVerificationTimer->setInterval(100); updateItemStates(); } } void RevisionControlObserver::updateItemStates() { Q_ASSERT(m_plugin != 0); const KUrl directory = m_dirLister->url(); if (!m_plugin->beginRetrieval(directory.toLocalFile(KUrl::AddTrailingSlash))) { return; } const int rowCount = m_dolphinModel->rowCount(); for (int row = 0; row < rowCount; ++row) { const QModelIndex index = m_dolphinModel->index(row, DolphinModel::Revision); const KFileItem item = m_dolphinModel->itemForIndex(index); const RevisionControlPlugin::RevisionState revision = m_plugin->revisionState(item.name()); m_dolphinModel->setData(index, QVariant(static_cast(revision)), Qt::DecorationRole); } m_view->viewport()->repaint(); // TODO: this should not be necessary, as DolphinModel::setData() calls dataChanged() m_plugin->endRetrieval(); } #include "revisioncontrolobserver.moc"