@@ -0,0 +1,186 @@
2+ * Copyright (C) 2013 Canonical, Ltd.
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.
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.
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/>.
16+ * Author: Nick Dedekind <nick.dedekind@canonical.com>
20+#include "unitymenumodelpaths.h"
21+#include <QDBusArgument>
24+static QVariant parseVariantData(const QVariant& var);
26+UnityMenuModelPaths::UnityMenuModelPaths(QObject *parent)
31+QVariant UnityMenuModelPaths::source() const
36+void UnityMenuModelPaths::setSource(const QVariant& data)
38+ if (m_sourceData != data) {
40+ Q_EMIT sourceChanged();
46+const QDBusArgument &operator>>(const QDBusArgument &arg, QVariantMap &map)
50+ while (!arg.atEnd()) {
56+ map.insertMulti(key, parseVariantData(value)); // re-parse for qdbusargument
64+static QVariant parseVariantData(const QVariant& var) {
65+ if ((int)var.type() == QMetaType::User) {
66+ if (var.userType() == qMetaTypeId<QDBusArgument>()) {
68+ QDBusArgument arg(var.value<QDBusArgument>());
69+ if (arg.currentType() == QDBusArgument::MapType) {
74+ return arg.asVariant();
80+void UnityMenuModelPaths::updateData()
82+ QVariantMap dataMap = parseVariantData(m_sourceData).toMap();
84+ if (!m_busNameHint.isEmpty() && dataMap.contains(m_busNameHint)) {
85+ setBusName(dataMap[m_busNameHint].toByteArray());
90+ if (!m_menuObjectPathHint.isEmpty() && dataMap.contains(m_menuObjectPathHint)) {
91+ setMenuObjectPath(dataMap[m_menuObjectPathHint].toByteArray());
93+ setMenuObjectPath("");
96+ if (!m_actionsHint.isEmpty() && dataMap.contains(m_actionsHint)) {
97+ setActions(dataMap[m_actionsHint].toMap());
99+ setActions(QVariantMap());
103+QByteArray UnityMenuModelPaths::busName() const
108+void UnityMenuModelPaths::setBusName(const QByteArray &name)
110+ if (m_busName != name) {
112+ Q_EMIT busNameChanged();
116+QVariantMap UnityMenuModelPaths::actions() const
121+void UnityMenuModelPaths::setActions(const QVariantMap &actions)
123+ if (m_actions != actions) {
124+ qDebug() << "UnityMenuModelPaths setActions " << actions;
125+ m_actions = actions;
126+ Q_EMIT actionsChanged();
130+QByteArray UnityMenuModelPaths::menuObjectPath() const
132+ return m_menuObjectPath;
135+void UnityMenuModelPaths::setMenuObjectPath(const QByteArray &path)
137+ if (m_menuObjectPath != path) {
138+ m_menuObjectPath = path;
139+ Q_EMIT menuObjectPathChanged();
143+QByteArray UnityMenuModelPaths::busNameHint() const
145+ return m_busNameHint;
148+void UnityMenuModelPaths::setBusNameHint(const QByteArray &nameHint)
150+ if (m_busNameHint != nameHint) {
151+ m_busNameHint = nameHint;
152+ Q_EMIT busNameHintChanged();
158+QByteArray UnityMenuModelPaths::actionsHint() const
160+ return m_actionsHint;
163+void UnityMenuModelPaths::setActionsHint(const QByteArray &actionsHint)
165+ if (m_actionsHint != actionsHint) {
166+ m_actionsHint = actionsHint;
167+ Q_EMIT actionsHintChanged();
173+QByteArray UnityMenuModelPaths::menuObjectPathHint() const
175+ return m_menuObjectPathHint;
178+void UnityMenuModelPaths::setMenuObjectPathHint(const QByteArray &pathHint)
180+ if (m_menuObjectPathHint != pathHint) {
181+ m_menuObjectPathHint = pathHint;
182+ Q_EMIT menuObjectPathHintChanged();