on bcacecf help sign in
unity8/plugins/Utils/unitymenumodelpaths.cpp
182 lines 4.3 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 * Author: Nick Dedekind <nick.dedekind@canonical.com>
17 */
20#include "unitymenumodelpaths.h"
21#include <QDBusArgument>
23static QVariant parseVariantData(const QVariant& var);
25const QDBusArgument &operator>>(const QDBusArgument &arg, QVariantMap &map)
27 arg.beginMap();
28 map.clear();
29 while (!arg.atEnd()) {
30 QString key;
31 QVariant value;
32 arg.beginMapEntry();
34 arg >> key >> value;
35 map.insertMulti(key, parseVariantData(value)); // re-parse for qdbusargument
37 arg.endMapEntry();
38 }
39 arg.endMap();
40 return arg;
43static QVariant parseVariantData(const QVariant& var) {
44 if ((int)var.type() == QMetaType::User && var.userType() == qMetaTypeId<QDBusArgument>()) {
45 QDBusArgument arg(var.value<QDBusArgument>());
46 if (arg.currentType() == QDBusArgument::MapType) {
47 QVariantMap map;
48 arg >> map;
49 return map;
50 }
51 return arg.asVariant();
52 }
54 return var;
57UnityMenuModelPaths::UnityMenuModelPaths(QObject *parent)
58 : QObject(parent)
62QVariant UnityMenuModelPaths::source() const
64 return m_sourceData;
67void UnityMenuModelPaths::setSource(const QVariant& data)
69 if (m_sourceData != data) {
70 m_sourceData = data;
71 Q_EMIT sourceChanged();
73 updateData();
74 }
77void UnityMenuModelPaths::updateData()
79 QVariantMap dataMap = parseVariantData(m_sourceData).toMap();
81 if (!m_busNameHint.isEmpty() && dataMap.contains(m_busNameHint)) {
82 setBusName(dataMap[m_busNameHint].toByteArray());
83 } else {
84 setBusName("");
85 }
87 if (!m_menuObjectPathHint.isEmpty() && dataMap.contains(m_menuObjectPathHint)) {
88 setMenuObjectPath(dataMap[m_menuObjectPathHint].toByteArray());
89 } else {
90 setMenuObjectPath("");
91 }
93 if (!m_actionsHint.isEmpty() && dataMap.contains(m_actionsHint)) {
94 setActions(dataMap[m_actionsHint].toMap());
95 } else {
96 setActions(QVariantMap());
97 }
100QByteArray UnityMenuModelPaths::busName() const
102 return m_busName;
105void UnityMenuModelPaths::setBusName(const QByteArray &name)
107 if (m_busName != name) {
108 m_busName = name;
109 Q_EMIT busNameChanged();
110 }
113QVariantMap UnityMenuModelPaths::actions() const
115 return m_actions;
118void UnityMenuModelPaths::setActions(const QVariantMap &actions)
120 if (m_actions != actions) {
121 m_actions = actions;
122 Q_EMIT actionsChanged();
123 }
126QByteArray UnityMenuModelPaths::menuObjectPath() const
128 return m_menuObjectPath;
131void UnityMenuModelPaths::setMenuObjectPath(const QByteArray &path)
133 if (m_menuObjectPath != path) {
134 m_menuObjectPath = path;
135 Q_EMIT menuObjectPathChanged();
136 }
139QByteArray UnityMenuModelPaths::busNameHint() const
141 return m_busNameHint;
144void UnityMenuModelPaths::setBusNameHint(const QByteArray &nameHint)
146 if (m_busNameHint != nameHint) {
147 m_busNameHint = nameHint;
148 Q_EMIT busNameHintChanged();
150 updateData();
151 }
154QByteArray UnityMenuModelPaths::actionsHint() const
156 return m_actionsHint;
159void UnityMenuModelPaths::setActionsHint(const QByteArray &actionsHint)
161 if (m_actionsHint != actionsHint) {
162 m_actionsHint = actionsHint;
163 Q_EMIT actionsHintChanged();
165 updateData();
166 }
169QByteArray UnityMenuModelPaths::menuObjectPathHint() const
171 return m_menuObjectPathHint;
174void UnityMenuModelPaths::setMenuObjectPathHint(const QByteArray &pathHint)
176 if (m_menuObjectPathHint != pathHint) {
177 m_menuObjectPathHint = pathHint;
178 Q_EMIT menuObjectPathHintChanged();
180 updateData();
181 }