diff options
Diffstat (limited to 'gui/polkittqt1-gui-actionbutton.cpp')
-rw-r--r-- | gui/polkittqt1-gui-actionbutton.cpp | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/gui/polkittqt1-gui-actionbutton.cpp b/gui/polkittqt1-gui-actionbutton.cpp new file mode 100644 index 000000000..f817088c1 --- /dev/null +++ b/gui/polkittqt1-gui-actionbutton.cpp @@ -0,0 +1,166 @@ +/* + * This file is part of the Polkit-tqt project + * Copyright (C) 2009 Daniel Nicoletti <[email protected]> + * Copyright (C) 2009 Dario Freddi <[email protected]> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "polkittqt1-gui-actionbutton.h" + +#include "polkittqt1-gui-actionbutton_p.h" + +namespace PolkitTQt1 +{ + +namespace Gui +{ + +ActionButton::ActionButton(TQAbstractButton *button, const TQString &actionId, TQObject *parent) + : Action(actionId, parent) + , d_ptr(new ActionButtonPrivate(TQList<TQAbstractButton *>() << button)) +{ + d_ptr->q_ptr = this; + + setButton(button); + connect(this, SIGNAL(dataChanged()), SLOT(updateButton())); +} + +ActionButton::ActionButton(ActionButtonPrivate &dd, const TQString &actionId, TQObject *parent) + : Action(actionId, parent) + , d_ptr(&dd) +{ + d_ptr->q_ptr = this; + + connect(this, SIGNAL(dataChanged()), SLOT(updateButton())); +} + +ActionButton::~ActionButton() +{ + delete d_ptr; +} + +void ActionButtonPrivate::updateButton() +{ + TQ_Q(ActionButton); + + TQ_FOREACH(TQAbstractButton *ent, buttons) { + ent->setVisible(q->isVisible()); + ent->setEnabled(q->isEnabled()); + ent->setText(q->text()); + if (!q->toolTip().isNull()) { + ent->setToolTip(q->toolTip()); + } + if (!q->whatsThis().isNull()) { + ent->setWhatsThis(q->whatsThis()); + } + ent->setIcon(q->icon()); + // if the item cannot do the action anymore + // lets revert to the initial state + if (ent->isCheckable()) { + ent->setChecked(q->isChecked()); + } + } +} + +bool ActionButton::activate() +{ + TQ_D(ActionButton); + + bool tg = false; + TQ_FOREACH(TQAbstractButton *ent, d->buttons) { + if (ent->isCheckable()) { + // we set the the current Action state + ent->setChecked(isChecked()); + // toggle the action cause we are not directly connected there.. + tg = true; + } + } + + if (tg) { + toggle(); + } + + return Action::activate(); +} + +void ActionButton::setButton(TQAbstractButton *button) +{ + TQ_D(ActionButton); + + // First, let's clear the list + TQ_FOREACH(TQAbstractButton *ent, d->buttons) { + d->removeButton(ent); + } + + // And then add it + d->addButton(button); +} + +void ActionButtonPrivate::addButton(TQAbstractButton *button) +{ + TQ_Q(ActionButton); + + buttons.append(button); + TQObject::connect(button, SIGNAL(clicked(bool)), q, SLOT(streamClicked(bool))); + TQObject::connect(q, SIGNAL(toggled(bool)), button, SLOT(toggle())); + if (q->isCheckable()) { + // the button should follow our first buttons + button->setCheckable(true); + } else if (button->isCheckable()) { + // if we are not checkable BUT the button + // is (eg a TQCheckBox) we should set all buttons to + // checkable. + TQ_FOREACH(TQAbstractButton *ent, buttons) { + ent->setCheckable(true); + } + // set the checkable state of Action to store the initial state + q->setCheckable(true); + } + // call this after m_activateOnCheck receives the value + updateButton(); +} + +void ActionButtonPrivate::removeButton(TQAbstractButton *button) +{ + TQ_Q(ActionButton); + + if (buttons.contains(button)) { + TQObject::disconnect(button, SIGNAL(clicked(bool)), q, SLOT(streamClicked(bool))); + TQObject::disconnect(q, SIGNAL(toggled(bool)), button, SLOT(toggle())); + buttons.removeOne(button); + } +} + +TQAbstractButton *ActionButton::button() const +{ + TQ_D(const ActionButton); + + return d->buttons.first(); +} + +void ActionButtonPrivate::streamClicked(bool c) +{ + TQ_Q(ActionButton); + + TQ_EMIT q->clicked(qobject_cast<TQAbstractButton *>(q->sender()), c); +} + +} + +} + +#include "polkittqt1-gui-actionbutton.moc" |