/* * Copyright 2012 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 . * * Authors: * Renato Araujo Oliveira Filho */ #include "qstateaction.h" #include "qdbusactiongroup.h" /*! \qmltype QStateAction \inherits QAction \brief A QStateAction implementation to be used with \l QDBusActionGroup \b {This component is under heavy development.} This class can be used as a proxy for an action that is exported over D-Bus \code QDBusActionGroup { id: actionGroup busType: 1 busName: "com.ubuntu.menu" objectPath: "com/ubuntu/menu/actions" } Button { visible: actionGroup.getAction("button.bvisible").status } \endcode */ /*! \internal */ QStateAction::QStateAction(QDBusActionGroup *group, const QString &name) : QObject(group), m_group(group), m_name(name) { // This keep the code clean // But maybe we need move the action state control to QActionGroup to optimizations QObject::connect(m_group, SIGNAL(actionAppear(QString)), this, SLOT(onActionAppear(QString))); QObject::connect(m_group, SIGNAL(actionVanish(QString)), this, SLOT(onActionVanish(QString))); QObject::connect(m_group, SIGNAL(actionStateChanged(QString,QVariant)), this, SLOT(onActionStateChanged(QString,QVariant))); m_valid = m_group->hasAction(name); if (m_valid) { setState(m_group->actionState(name)); } } /*! \qmlproperty int QStateAction::state This property holds the current action state */ QVariant QStateAction::state() const { return m_state; } /*! \qmlproperty int QStateAction::isValid This property return if the current Action is valid or not A valid Action is a action which has a DBus action linked */ bool QStateAction::isValid() const { return m_valid; } /*! Request for the state of action to be changed to \a paramenter. This call merely requests a change. The action may refuse to change its state or may change its state to something other than \a paramenter. */ void QStateAction::updateState(const QVariant &state) { QVariant v = state; if (v.convert(m_state.type())) m_group->updateActionState(m_name, v); } /*! Activates the action passing \a parameter. \a parameter must be the correct type of parameter for the action */ void QStateAction::activate(const QVariant ¶meter) { m_group->activateAction(m_name, parameter); } /*! \internal */ QString QStateAction::name() const { return m_name; } /*! \internal */ void QStateAction::setValid(bool valid) { if (m_valid != valid) { m_valid = valid; Q_EMIT validChanged(m_valid); } } /*! \internal */ void QStateAction::setState(const QVariant &state) { QVariant v = state; if (!m_state.isValid() || (v.convert(m_state.type()) && v != m_state)) { m_state = v; Q_EMIT stateChanged(m_state); } } /*! \internal */ void QStateAction::onActionAppear(const QString &name) { if (m_name == name) { setState(m_group->actionState(name)); setValid(true); } } /*! \internal */ void QStateAction::onActionVanish(const QString &name) { if (m_name == name) { setState(QVariant()); setValid(false); } } /*! \internal */ void QStateAction::onActionStateChanged(const QString &name, const QVariant &state) { if (m_name == name) { setState(state); } }