diff -r 000000000000 -r 1450b09d0cfd ginebra2/ActionButton.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ginebra2/ActionButton.cpp Tue May 04 12:39:35 2010 +0300 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "ActionButton.h" +#include + +namespace GVA { + + ActionButton::ActionButton(ChromeSnippet * snippet, QGraphicsItem* parent) + : NativeChromeItem(snippet, parent), + m_internalAction(new QAction(this)), + m_triggerOn(QEvent::GraphicsSceneMousePress), + m_active(false) + { + m_internalAction->setCheckable(true); + m_internalAction->setEnabled(true); + setAction(m_internalAction); + + //Just testing . . . + //addIcon(":/chrome/demochrome/HandButton.png"); + //addIcon(":/chrome/demochrome/Stop.png", QIcon::Disabled); + connect(m_internalAction, SIGNAL(triggered(bool)), this, SLOT(onTriggered(bool))); + } + + void ActionButton::paint( QPainter * painter, const QStyleOptionGraphicsItem * opt, QWidget * widget ) + { + Q_UNUSED(opt) + Q_UNUSED(widget) + + painter->save(); + QAction * action = defaultAction(); + QIcon::Mode mode = QIcon::Normal; + if(m_active) + mode = QIcon::Active; + else if(action){ + if(action->isChecked()) + mode = QIcon::Selected; + else if(!action->isEnabled()) + mode = QIcon::Disabled; + } + m_icon.paint(painter, boundingRect().toRect(), Qt::AlignCenter, mode, QIcon::On); + painter->restore(); + } + + void ActionButton::mousePressEvent( QGraphicsSceneMouseEvent * ev ) + { + if(m_triggerOn == ev->type()){ + if (ev->button() == Qt::LeftButton) { + QAction * action = defaultAction(); + if(action && action->isEnabled()){ + action->trigger(); + emit activated(); + } + } + m_active = true; + } + } + + void ActionButton::mouseReleaseEvent( QGraphicsSceneMouseEvent * ev ) + { + if(m_triggerOn == ev->type()){ + if (ev->button() == Qt::LeftButton) { + QAction * action = defaultAction(); + if(action && action->isEnabled()){ + action->trigger(); + emit activated(); + } + } + m_active = false; + } + } + + void ActionButton::contextMenuEvent( QGraphicsSceneContextMenuEvent * ev ) + { + Q_UNUSED(ev) + emit contextMenuEvent(); + } + + //Action buttons only have one action at a time, so whenever we add an action, we remove any previously set action + //NB: The action is typically one of the available actions on a view (via ControllableView.getContext()). + //ActionButtonSnippet provides the scriptable method connectAction() to create native connections to view actions + + void ActionButton::setAction ( QAction * action, QEvent::Type triggerOn ) + { + QAction * currentAction = defaultAction(); + if(currentAction == action) + return; + if(currentAction){ + disconnect(currentAction, SIGNAL(changed()), this, SLOT(onActionChanged())); + removeAction(currentAction); + } + addAction(action); + connect(action, SIGNAL(changed()),this, SLOT(onActionChanged())); + m_triggerOn = triggerOn; + update(); + } + + void ActionButton::disconnectAction () { + setAction(m_internalAction); + } + + void ActionButton::setEnabled(bool enabled) + { + m_internalAction->setEnabled(enabled); + } + + void ActionButton::setChecked(bool checked) + { + m_internalAction->setChecked(checked); + } + + void ActionButton::setInputEvent(QEvent::Type event) + { + m_triggerOn = event; + } + + //NB: handle icon on/off states too? + + void ActionButton::addIcon( const QString & resource, QIcon::Mode mode ) + { + m_icon.addPixmap( QPixmap(resource), mode, QIcon::On ); + } + + QAction * ActionButton::defaultAction() + { + if (actions().isEmpty()) + return 0; + return actions()[0]; + } + + void ActionButton::onActionChanged(){ + //Repaint when the action changes state + update(); + } + + // For testing only . . . + void ActionButton::onTriggered(bool checked){ + Q_UNUSED(checked) + qDebug() << "ActionButton::triggered"; + } + +}//end of name space