2 * Copyright 2012 Canonical Ltd.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 * Renato Araujo Oliveira Filho <renato@canonical.com>
24#include "flatmenuproxymodel.h"
28FlatMenuProxyModel::FlatMenuProxyModel(QAbstractItemModel *source)
29 : QAbstractProxyModel(source),
32 m_model = new QDBusMenuModel;
33 setSourceModel(m_model);
37FlatMenuProxyModel::~FlatMenuProxyModel()
42void FlatMenuProxyModel::setSourceModel(QAbstractItemModel *source)
45 QAbstractItemModel *oldSource = sourceModel();
46 if (oldSource == source) {
50 oldSource->disconnect(this);
53 QAbstractProxyModel::setSourceModel(source);
57 // FIXME - not working correctly with dynamic inserts/removes
58 // FIXME 2 - We're using Queud connections as a workaround to QTBUG-32859
59 // The signals from qmenumodel are coming straight off the glib event loop,
60 // which is not supported and has the effect of listview delegates not to be deleted.
63 SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
64 SLOT(onModelAboutToBeReset()), Qt::QueuedConnection);
66 SIGNAL(rowsInserted(QModelIndex,int,int)),
67 SLOT(onModelReset()), Qt::QueuedConnection);
70 SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
71 SLOT(onModelAboutToBeReset()), Qt::QueuedConnection);
73 SIGNAL(rowsRemoved(QModelIndex,int,int)),
74 SLOT(onModelReset()), Qt::QueuedConnection);
77 SIGNAL(modelAboutToBeReset()),
78 SLOT(onModelAboutToBeReset()), Qt::QueuedConnection);
81 SLOT(onModelReset()), Qt::QueuedConnection);
85 SIGNAL(busTypeChanged(DBusEnums::BusType)),
86 SIGNAL(busTypeChanged()));
89 SIGNAL(busNameChanged(const QString&)),
90 SIGNAL(busNameChanged()));
93 SIGNAL(objectPathChanged(const QString&)),
94 SIGNAL(objectPathChanged()));
97 SIGNAL(statusChanged(DBusEnums::ConnectionStatus)),
98 SIGNAL(statusChanged()), Qt::QueuedConnection);
100 // initiliaze rowCount
101 QModelIndex lastItem = source->index(source->rowCount() - 1, 0);
102 m_rowCount = recursiveRowCount(lastItem);
107 Q_EMIT countChanged();
110void FlatMenuProxyModel::setBusName(const QString &busName)
112 m_model->setBusName(busName);
115QString FlatMenuProxyModel::busName() const
117 return m_model->busName();
120void FlatMenuProxyModel::setObjectPath(const QString &busPath)
122 m_model->setObjectPath(busPath);
125QString FlatMenuProxyModel::objectPath() const
127 return m_model->objectPath();
130int FlatMenuProxyModel::status() const
132 return m_model->status();
135DBusEnums::BusType FlatMenuProxyModel::busType() const
137 return m_model->busType();
140void FlatMenuProxyModel::setIntBusType(int type)
142 m_model->setBusType((DBusEnums::BusType) type);
145void FlatMenuProxyModel::start()
150void FlatMenuProxyModel::stop()
155QModelIndex FlatMenuProxyModel::mapFromSource(const QModelIndex &index) const
157 if (!index.isValid()) {
158 return QModelIndex();
161 QModelIndex result = createIndex(rowOffsetOf(index, index.row()), 0);
165QModelIndex FlatMenuProxyModel::mapToSource(const QModelIndex &index) const
167 if (sourceModel() && m_indexCache.contains(index.row())) {
168 QString key = m_indexCache.value(index.row());
169 QStringList sections = key.split('.', QString::SkipEmptyParts);
170 QModelIndex sourceIndex = QModelIndex();
171 for(int i=0; i < sections.size(); i++) {
172 sourceIndex = sourceModel()->index(sections.at(i).toInt(), 9, sourceIndex);
176 return QModelIndex();
180QModelIndex FlatMenuProxyModel::index(int row, int sectionRow, const QModelIndex &parent, const QString &key) const
182 for (int i = 0, count = 0; i < sourceModel()->rowCount(parent); i++) {
183 QModelIndex sourceIndex = sourceModel()->index(i, 0, parent);
184 int indexCount = recursiveRowCount(sourceIndex);
186 if (count == sectionRow) {
187 QString sectionKey = key + "." + QString::number(i);
188 m_indexCache.insert(row, sectionKey);
189 return createIndex(row, 0);
190 } else if ((count + indexCount) >= sectionRow) {
192 return index(row, sectionRow - count, sourceIndex, key + "." + QString::number(i));
195 count += indexCount + 1;
197 return QModelIndex();
200QModelIndex FlatMenuProxyModel::index(int row, int, const QModelIndex &) const
202 return index(row, row, QModelIndex(), "");
205QModelIndex FlatMenuProxyModel::parent(const QModelIndex &) const
207 return QModelIndex();
210int FlatMenuProxyModel::columnCount(const QModelIndex &) const
215int FlatMenuProxyModel::rowCount(const QModelIndex &) const
220int FlatMenuProxyModel::count() const
222 return rowCount(QModelIndex());
225void FlatMenuProxyModel::onModelAboutToBeReset()
230void FlatMenuProxyModel::onModelReset()
232 // initiliaze rowCount
234 for (int i = 0, iMax = sourceModel()->rowCount(); i < iMax; i++) {
235 QModelIndex index = sourceModel()->index(i, 0);
236 m_rowCount += recursiveRowCount(index) + 1;
238 m_indexCache.clear();
240 Q_EMIT countChanged();
243int FlatMenuProxyModel::recursiveRowCount(const QModelIndex &index) const
245 int size = sourceModel()->rowCount(index);
246 for (int i=0, iMax=size; i < iMax; i++) {
247 QModelIndex currentIndex = sourceModel()->index(i, 0, index);
248 size += recursiveRowCount(currentIndex);
254int FlatMenuProxyModel::rowOffsetOf(const QModelIndex &index, int row, bool inclusive) const
258 QModelIndex parent = index.parent();
260 // Check row 0 offset
261 while(parent.isValid()) {
263 for (int i = 0; i < parent.row(); i++) {
264 QModelIndex currentIndex = sourceModel()->index(i, 0, parent);
265 offset += recursiveRowCount(currentIndex) + 1;
267 parent = parent.parent();
270 // Check index.row() offset
271 for(int i = 0; i < row; i++) {
272 QModelIndex currentIndex = sourceModel()->index(i, 0, index.parent());
273 offset += recursiveRowCount(currentIndex) + 1;
278 QModelIndex currentIndex = sourceModel()->index(row, 0, index.parent());
279 offset += recursiveRowCount(currentIndex);
285QVariant FlatMenuProxyModel::data(int row, int role) const
287 return QAbstractProxyModel::data(index(row, 0), role);
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list