ginebra2/ActionButton.cpp
changeset 0 1450b09d0cfd
child 3 0954f5dd2cd0
child 5 0f2326c2a325
--- /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 <QDebug>
+
+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