Unity 8
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 
22 ActionRootState::ActionRootState(QObject *parent)
23  : RootStateObject(parent)
24  , m_actionGroup(nullptr)
25 {
26 }
27 
28 QDBusActionGroup *ActionRootState::actionGroup() const
29 {
30  return m_actionGroup;
31 }
32 
33 void 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, [&](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 
58 QString ActionRootState::actionName() const
59 {
60  return m_actionName;
61 }
62 
63 void 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 
77 bool ActionRootState::valid() const
78 {
79  return m_actionGroup && m_actionGroup->status() == DBusEnums::Connected &&
80  !m_actionName.isEmpty() && m_actionGroup->hasAction(m_actionName);
81 }
82 
83 void 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 }