Lomiri
Loading...
Searching...
No Matches
actionrootstate.cpp
1/*
2 * Copyright 2014 Canonical Ltd.
3 *
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.
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 Lesser General Public License for more details.
12 *
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/>.
15 */
16
17#include "actionrootstate.h"
18
19#include <qdbusactiongroup.h>
20#include <QDebug>
21
22ActionRootState::ActionRootState(QObject *parent)
23 : RootStateObject(parent)
24 , m_actionGroup(nullptr)
25{
26}
27
28QDBusActionGroup *ActionRootState::actionGroup() const
29{
30 return m_actionGroup;
31}
32
33void ActionRootState::setActionGroup(QDBusActionGroup *actionGroup)
34{
35 if (m_actionGroup != actionGroup) {
36 bool wasValid = valid();
37
38 if (m_actionGroup) {
39 disconnect(m_actionGroup, 0, this, 0);
40 }
41 m_actionGroup = actionGroup;
42
43 if (m_actionGroup) {
44 connect(m_actionGroup, &QDBusActionGroup::statusChanged, this, [&](bool) { updateActionState(); });
45 connect(m_actionGroup, &QDBusActionGroup::actionAppear, this, [&](const QString&) { updateActionState(); });
46 connect(m_actionGroup, &QDBusActionGroup::actionVanish, this, [&](const QString&) { updateActionState(); });
47 connect(m_actionGroup, &QDBusActionGroup::actionStateChanged, this, [&](const QVariant&) { updateActionState(); });
48
49 connect(m_actionGroup, &QObject::destroyed, this, [&](QObject*) { updateActionState(); });
50 }
51 updateActionState();
52 Q_EMIT actionGroupChanged();
53
54 if (wasValid != valid()) Q_EMIT validChanged();
55 }
56}
57
58QString ActionRootState::actionName() const
59{
60 return m_actionName;
61}
62
63void ActionRootState::setActionName(const QString &actionName)
64{
65 if (m_actionName != actionName) {
66 bool wasValid = valid();
67
68 m_actionName = actionName;
69 updateActionState();
70
71 Q_EMIT actionNameChanged();
72
73 if (wasValid != valid()) Q_EMIT validChanged();
74 }
75}
76
77bool ActionRootState::valid() const
78{
79 return m_actionGroup && m_actionGroup->status() == DBusEnums::Connected &&
80 !m_actionName.isEmpty() && m_actionGroup->hasAction(m_actionName);
81}
82
83void ActionRootState::updateActionState()
84{
85 if (valid()) {
86 ActionStateParser* oldParser = m_actionGroup->actionStateParser();
87 m_actionGroup->setActionStateParser(&m_parser);
88
89 QVariantMap state = m_actionGroup->actionState(m_actionName).toMap();
90
91 m_actionGroup->setActionStateParser(oldParser);
92
93 setCurrentState(state);
94 } else {
95 setCurrentState(QVariantMap());
96 }
97}