/*
* Copyright 2014 Canonical Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*/
#include "actionrootstate.h"
#include
#include
ActionRootState::ActionRootState(QObject *parent)
: RootStateObject(parent)
, m_actionGroup(nullptr)
{
}
QDBusActionGroup *ActionRootState::actionGroup() const
{
return m_actionGroup;
}
void ActionRootState::setActionGroup(QDBusActionGroup *actionGroup)
{
if (m_actionGroup != actionGroup) {
bool wasValid = valid();
if (m_actionGroup) {
disconnect(m_actionGroup, 0, this, 0);
}
m_actionGroup = actionGroup;
if (m_actionGroup) {
connect(m_actionGroup, &QDBusActionGroup::statusChanged, this, [&](bool) { updateActionState(); });
connect(m_actionGroup, &QDBusActionGroup::actionAppear, this, [&](const QString&) { updateActionState(); });
connect(m_actionGroup, &QDBusActionGroup::actionVanish, this, [&](const QString&) { updateActionState(); });
connect(m_actionGroup, &QDBusActionGroup::actionStateChanged, this, [&](const QVariant&) { updateActionState(); });
connect(m_actionGroup, &QObject::destroyed, this, [&](QObject*) { updateActionState(); });
}
updateActionState();
Q_EMIT actionGroupChanged();
if (wasValid != valid()) Q_EMIT validChanged();
}
}
QString ActionRootState::actionName() const
{
return m_actionName;
}
void ActionRootState::setActionName(const QString &actionName)
{
if (m_actionName != actionName) {
bool wasValid = valid();
m_actionName = actionName;
updateActionState();
Q_EMIT actionNameChanged();
if (wasValid != valid()) Q_EMIT validChanged();
}
}
bool ActionRootState::valid() const
{
return m_actionGroup && m_actionGroup->status() == DBusEnums::Connected &&
!m_actionName.isEmpty() && m_actionGroup->hasAction(m_actionName);
}
void ActionRootState::updateActionState()
{
if (valid()) {
ActionStateParser* oldParser = m_actionGroup->actionStateParser();
m_actionGroup->setActionStateParser(&m_parser);
QVariantMap state = m_actionGroup->actionState(m_actionName).toMap();
m_actionGroup->setActionStateParser(oldParser);
setCurrentState(state);
} else {
setCurrentState(QVariantMap());
}
}