┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/revisioncontrolobserver.cpp
blob: f20ff996d916215778c7550b0ee9f85946f3c13b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/***************************************************************************
 *   Copyright (C) 2009 by Peter Penz <[email protected]>                  *
 *                                                                         *
 *   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 <kdirlister.h>

#include <QAbstractProxyModel>
#include <QAbstractItemView>
#include <QTimer>

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<QAbstractProxyModel*>(view->model());
    m_dolphinModel = (proxyModel == 0) ?
                 qobject_cast<DolphinModel*>(view->model()) :
                 qobject_cast<DolphinModel*>(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<QPair<KFileItem,KFileItem>>&)),
        //        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::ItemType type = item.isDir() ?
                                                     RevisionControlPlugin::Directory :
                                                     RevisionControlPlugin::File;

        const RevisionControlPlugin::RevisionState revision = m_plugin->revisionState(item.name(), type);
        m_dolphinModel->setData(index, QVariant(static_cast<int>(revision)), Qt::DecorationRole);
    }
    m_view->viewport()->repaint(); // TODO: this should not be necessary, as DolphinModel::setData() calls dataChanged()

    m_plugin->endRetrieval();
}

#include "revisioncontrolobserver.moc"