2 * Copyright 2013 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>
20#include "indicatorclient_common.h"
32#include <qdbusmenumodel.h>
33#include <qdbusactiongroup.h>
34#include <qstateaction.h>
36//TODO: load this property dynamically
37#define TARGET_DEVICE "phone"
39IndicatorClientCommon::IndicatorClientCommon(QObject *parent)
51IndicatorClientCommon::~IndicatorClientCommon()
56void IndicatorClientCommon::init(const QSettings& settings)
58 Q_INIT_RESOURCE(indicatorclient_common);
60 setId(settings.value("Indicator Service/Name").toString());
61 QString dbusService = settings.value("Indicator Service/DBusName").toString();
62 QString objectPath = settings.value("Indicator Service/ObjectPath").toString();
64 m_model = new QDBusMenuModel(this);
65 m_model->setBusName(dbusService);
66 m_model->setObjectPath(objectPath + "/" + TARGET_DEVICE);
67 m_model->setBusType(DBusEnums::SessionBus);
69 //keep track of any change in the model
70 connect(m_model, SIGNAL(statusChanged(DBusEnums::ConnectionStatus)), SLOT(onModelChanged()));
71 connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(onModelChanged()));
72 connect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(onModelChanged()));
73 connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), SLOT(onModelChanged()));
75 m_actionGroup = new QDBusActionGroup(this);
76 m_actionGroup->setBusType(m_model->busType());
77 m_actionGroup->setBusName(m_model->busName());
78 m_actionGroup->setObjectPath(objectPath);
80 m_initialProperties.clear();
81 m_initialProperties.insert("title", m_title);
82 m_initialProperties.insert("busType", 1);
83 m_initialProperties.insert("busName", dbusService);
84 m_initialProperties.insert("objectPath", objectPath);
86 m_actionGroup->start();
90void IndicatorClientCommon::onModelChanged()
92 DBusEnums::ConnectionStatus status = m_model->status();
94 if (status == DBusEnums::Connected) {
95 QModelIndex index = m_model->index(0);
96 if (index.isValid()) {
97 QVariant extra = m_model->data(index, QDBusMenuModel::Extra);
98 QVariantMap extraMap = extra.toMap();
99 if (extraMap.contains("canonical_type")) {
100 QString type = extraMap["canonical_type"].toString();
101 parseRootElement(type, m_model->itemData(index));
105 parseRootElement("", QMap<int, QVariant>());
109bool IndicatorClientCommon::parseRootElement(const QString &type, QMap<int, QVariant> data)
111 if (type.isEmpty()) {
113 } else if (type != "com.canonical.indicator.root") {
114 if (!type.startsWith("com.canonical.indicator.root")) {
115 qWarning() << "indicator" << title() << "does not support root element";
123 QVariant action = data[QDBusMenuModel::Action];
124 m_action = m_actionGroup->action(action.toString());
126 if (m_action->isValid()) {
127 updateState(m_action->state());
129 QObject::connect(m_action, SIGNAL(stateChanged(QVariant)), this, SLOT(updateState(QVariant)));
134void IndicatorClientCommon::updateState(const QVariant &state)
136 if (state.isValid()) {
137 // (sssb) : the current label, icon name, accessible name, and visibility state of the indicator.
138 QVariantList states = state.toList();
139 if (states.size() == 4) {
140 setLabel(states[0].toString());
141 setIcon(QUrl(states[1].toString()));
142 setVisible(states[2].toBool());
143 setAccessibleName(states[3].toString());
151 setAccessibleName("");
154void IndicatorClientCommon::shutdown()
165 delete m_actionGroup;
169QString IndicatorClientCommon::identifier() const
174void IndicatorClientCommon::setId(const QString &identifier)
176 if (identifier != m_identifier) {
177 m_identifier = identifier;
178 Q_EMIT identifierChanged(m_identifier);
182QUrl IndicatorClientCommon::icon() const
184 if (!m_icon.isEmpty() && m_icon.scheme().isEmpty()) {
185 return QString("image://gicon/") + QUrl::toPercentEncoding(m_icon.toString());
191void IndicatorClientCommon::setIcon(const QUrl &icon)
193 if (icon != m_icon) {
195 Q_EMIT iconChanged(m_icon);
199QString IndicatorClientCommon::title() const
204void IndicatorClientCommon::setTitle(const QString &title)
206 if (title != m_title) {
208 Q_EMIT titleChanged(m_title);
212QString IndicatorClientCommon::description() const
214 return m_description;
217void IndicatorClientCommon::setDescription(const QString &description)
219 if (description != m_description) {
220 m_description = description;
221 Q_EMIT titleChanged(m_description);
225int IndicatorClientCommon::priority() const
230void IndicatorClientCommon::setPriority(int priority)
232 if (priority != m_priority) {
233 m_priority = priority;
234 Q_EMIT priorityChanged(m_priority);
238QString IndicatorClientCommon::accessibleName() const
240 return m_accessibleName;
243void IndicatorClientCommon::setAccessibleName(const QString &accesibleName)
245 if (accesibleName != m_accessibleName) {
246 m_accessibleName = accesibleName;
247 Q_EMIT accessibleNameChanged(m_accessibleName);
251bool IndicatorClientCommon::visible() const
256void IndicatorClientCommon::setVisible(bool visible)
258 if (visible != m_visible) {
260 Q_EMIT visibleChanged(m_visible);
264QString IndicatorClientCommon::label() const
269void IndicatorClientCommon::setLabel(const QString &label)
271 if (label != m_label) {
273 Q_EMIT labelChanged(m_label);
277QDBusActionGroup *IndicatorClientCommon::actionGroup() const
279 return m_actionGroup;
282QQmlComponent *IndicatorClientCommon::createComponent(QQmlEngine *engine, QObject *parent) const
284 return new QQmlComponent(engine, QUrl("qrc:/indicatorsclient/qml/commonplugin.qml"), parent);
287QQmlComponent *IndicatorClientCommon::component(QQmlEngine *engine, QObject *parent)
289 if (m_component == 0) {
290 m_component = createComponent(engine, parent);
295IndicatorClientInterface::PropertiesMap IndicatorClientCommon::initialProperties()
297 return m_initialProperties;
300IndicatorClientInterface::WidgetsMap IndicatorClientCommon::widgets()
302 // Register all basic/native widgets
305 //TODO: use a generic name for volumecontrol widget (Slider)
306 w.insert("unity.widgets.systemsettings.tablet.volumecontrol", QUrl("SliderMenu.qml"));
307 w.insert("unity.widgets.systemsettings.tablet.switch", QUrl("SwitchMenu.qml"));
309 w.insert("com.canonical.indicator.button", QUrl("ButtonMenu.qml"));
310 w.insert("com.canonical.indicator.div", QUrl("DivMenu.qml"));
311 w.insert("com.canonical.indicator.section", QUrl("MenuSection.qml"));
312 w.insert("com.canonical.indicator.progress", QUrl("ProgressMenu.qml"));
313 w.insert("com.canonical.indicator.slider", QUrl("SliderMenu.qml"));
314 w.insert("com.canonical.indicator.switch", QUrl("SwitchMenu.qml"));
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