on 42c319d help sign in
unity8/tests/mocks/QMenuModel/unitymenumodel.cpp
256 lines 5.4 kB history raw
1/*
2 * Copyright (C) 2013 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
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 General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authors: Nick Dedekind <nick.dedekind@canonical.com>
17 */
19#include "unitymenumodel.h"
21enum MenuRoles {
22 LabelRole = Qt::DisplayRole + 1,
23 SensitiveRole,
24 IsSeparatorRole,
25 IconRole,
26 TypeRole,
27 ExtendedAttributesRole,
28 ActionRole,
29 ActionStateRole,
30 IsCheckRole,
31 IsRadioRole,
32 IsToggledRole
33};
35UnityMenuModel::UnityMenuModel(QObject *parent)
36: QAbstractListModel(parent)
40UnityMenuModel::~UnityMenuModel()
44QVariant UnityMenuModel::modelData() const
46 return m_modelData;
49void UnityMenuModel::setModelData(const QVariant& data)
51 beginResetModel();
53 m_modelData = data.toList();
54 Q_EMIT modelDataChanged();
56 endResetModel();
59QVariantMap UnityMenuModel::rootProperties() const
61 return m_rootProperties;
64void UnityMenuModel::setRootProperties(const QVariantMap& data)
66 m_rootProperties = data;
67 Q_EMIT rootPropertiesChanged();
70void UnityMenuModel::insertRow(int row, const QVariant& data)
72 row = qMin(row, rowCount());
74 beginInsertRows(QModelIndex(), row, row);
76 m_modelData.insert(row, data);
78 endInsertRows();
81void UnityMenuModel::appendRow(const QVariant& data)
83 insertRow(rowCount(), data);
86void UnityMenuModel::removeRow(int row)
88 if (row < 0 || rowCount() <= row) {
89 return;
90 }
92 beginRemoveRows(QModelIndex(), row, row);
94 m_modelData.removeAt(row);
96 endRemoveRows();
99QByteArray UnityMenuModel::busName() const
101 return m_busName;
104void UnityMenuModel::setBusName(const QByteArray &busName)
106 this->m_busName = busName;
109QVariantMap UnityMenuModel::actions() const
111 return m_actions;
114void UnityMenuModel::setActions(const QVariantMap &actions)
116 this->m_actions = actions;
119QByteArray UnityMenuModel::menuObjectPath() const
121 return m_menuObjectPath;
124void UnityMenuModel::setMenuObjectPath(const QByteArray &path)
126 this->m_menuObjectPath = path;
129ActionStateParser* UnityMenuModel::actionStateParser() const
131 return nullptr;
134void UnityMenuModel::setActionStateParser(ActionStateParser*)
138QString UnityMenuModel::nameOwner() const
140 return QString("");
143int UnityMenuModel::rowCount(const QModelIndex&) const
145 return m_modelData.count();
148int UnityMenuModel::columnCount(const QModelIndex&) const
150 return 1;
153QVariant UnityMenuModel::data(const QModelIndex &index, int role) const
155 return rowData(index.row())[roleNames()[role]];
158QVariantMap UnityMenuModel::rowData(int row) const
160 if (m_modelData.count() <= row) {
161 return QVariantMap();
162 }
163 return m_modelData[row].toMap()["rowData"].toMap();
166QVariant UnityMenuModel::subMenuData(int row) const
168 return m_modelData[row].toMap()["submenu"];
171QModelIndex UnityMenuModel::index(int row, int column, const QModelIndex&) const
173 return createIndex(row, column);
176QModelIndex UnityMenuModel::parent(const QModelIndex &) const
178 return QModelIndex();
181QHash<int, QByteArray> UnityMenuModel::roleNames() const
183 QHash<int, QByteArray> names;
185 names[LabelRole] = "label";
186 names[SensitiveRole] = "sensitive";
187 names[IsSeparatorRole] = "isSeparator";
188 names[IconRole] = "icon";
189 names[TypeRole] = "type";
190 names[ExtendedAttributesRole] = "ext";
191 names[ActionRole] = "action";
192 names[ActionStateRole] = "actionState";
193 names[IsCheckRole] = "isCheck";
194 names[IsRadioRole] = "isRadio";
195 names[IsToggledRole] = "isToggled";
197 return names;
200QObject * UnityMenuModel::submenu(int position, QQmlComponent*)
202 if (position < 0 || m_modelData.count() < position) {
203 return nullptr;
204 }
206 while (submenus.count() <= position) {
207 submenus.append(nullptr);
208 }
210 QVariant submenuData = subMenuData(position);
211 if (submenuData.type() == (int)QMetaType::QVariantList) {
212 UnityMenuModel*& model = submenus[position];
213 if (!model) {
214 model = new UnityMenuModel(this);
215 }
216 if (model->modelData() != submenuData) {
217 model->setModelData(submenuData);
218 }
219 return model;
220 }
222 return nullptr;
225bool UnityMenuModel::loadExtendedAttributes(int, const QVariantMap &)
227 return false;
230QVariant UnityMenuModel::get(int row, const QByteArray &role)
232 static QHash<QByteArray, int> roles;
233 if (roles.isEmpty()) {
234 QHash<int, QByteArray> names = roleNames();
235 Q_FOREACH (int role, names.keys())
236 roles.insert(names[role], role);
237 }
239 return this->data(this->index(row, 0), roles[role]);
242void UnityMenuModel::activate(int, const QVariant&)
246void UnityMenuModel::changeState(int, const QVariant&)
250void UnityMenuModel::registerAction(UnityMenuAction*)
254void UnityMenuModel::unregisterAction(UnityMenuAction*)