diff -r 000000000000 -r 16d8024aca5e src/hbwidgets/widgets/hbpushbutton.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hbwidgets/widgets/hbpushbutton.cpp Mon Apr 19 14:02:13 2010 +0300 @@ -0,0 +1,1033 @@ +/**************************************************************************** +** +** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (developer.feedback@nokia.com) +** +** This file is part of the HbWidgets module of the UI Extensions for Mobile. +** +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this file. +** Please review the following information to ensure the GNU Lesser General +** Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at developer.feedback@nokia.com. +** +****************************************************************************/ + +#include "hbpushbutton.h" +#include "hbpushbutton_p.h" +#include "hbstyle.h" +#include "hbstyleoptionpushbutton.h" +#include "hbgesturefilter.h" +#include "hbgesture.h" +#include "hbframedrawerpool_p.h" +#include "hbnamespace.h" +#ifdef HB_EFFECTS +#include "hbeffect.h" +#include "hbeffectinternal_p.h" +#endif + +#include +#include +#include +#include + + +/*! + @beta + @hbwidgets + \class HbPushButton + + \brief The HbPushButton widget provides a button with command. + + \image html hbpushbutton.png A pushbutton with text ,icon and tooltip provided . + + A push button enable users to perform important commands easily. + A push button has a rectangular shape and typically displays a text label describing its command. + Push Button can appear in any container except toolbars where ToolButton HbToolButton is used and palettes. + A simple push button can be created as shown in the example below. + \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,16} + + A Push buttons display a textual label. Pushbutton also + can have icon.These can be set using the constructors and changed later using setText(),setIcon( ). + In addition to this a push button also displays additional text label. + Additional text can be set using setAdditionalText(). + Aligning of icon , text and additional text can be changed using setStretched()true/false property. + Default with setStretched()=false it will place icon and text vertically. + + \image html buttonIconTextV.png A pushbutton with icon ,text. + + and along with additional text will place icon horizontally to both texts ,where both text comes vertically aligned. + + \image html buttonIconTextAdditionalTextV.png A pushbutton with icon ,text and additional text. + + For setStretched()=true, it will stretch layout to have icon and text horizontally,side by side. + + \image html buttonIconTextH.png A pushbutton with icon ,text. + + and along with additional text will place all of them to Horizontally in one line . + + \image html buttonIconTextAdditionalTextH.png A pushbutton with custom icon ,text and additional text. + + Pushbutton can have both text and additoinal text placed vertically,this can be used in case Dialer button or + Virtual key pad buttons with stretched = false.Pushbutton doesn't supports both text in one line + stretched = true is not valid. + Pushbutton will not have stretch layout by default. + + \image html buttonTextAdditional.png A pushbutton with additional text and text. + + Pushbutton can have different states like normal, pressed, disabled, latched and focused. + A push button emits the signal clicked() when it is activated by tapping it. + Push buttons also provide less commonly used signals, for example, pressed() and + released() and emits longPress() on long press. + + Alignment of the text within the text and additionaltext items can be set using + setTextAlignment() and setAdditionalText(), default text alignment is Qt::AlignHCenter | Qt::AlignVCenter + + The push button is derived from HbWidget so it can be added to any QGraphicsLayout + instance for layouting. + \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,17} + + Push button can also be used as toggle button , following is code snippet + \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,30} + + and onOffButton as + \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,29} + + Push button will come up with additional text following is code snippet. + 1. Push button with icon , text and additionalText + \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,35} + + 2. Pushbutton with additionalText and text. + \snippet{ultimatecodesnippet/ultimatecodesnippet.cpp,36} + + \sa HbAbstractButton , HbToolButton +*/ + + +/*! + \reimp + \fn int HbPushButton::type() const + */ + +/*! + \fn void HbPushButton::longPress( QPointF ) + This signal is emitted in case of longpress. + */ + +HbPushButtonPrivate::HbPushButtonPrivate() : + textItem(0), + additionalTextItem(0), + touchArea(0), + iconItem(0), + frameItem(0), + focusItem(0), + orientation(Qt::Vertical), + backgroundFrameDrawer(0), + gestureFilter(0), + gestureLongpressed(0), + longPressTimer(0), + textAlignment(Qt::AlignHCenter | Qt::AlignVCenter ), + additionalTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter ), + stretched(false), + navigationKeyPress(false), + hasTextAlignment(false), + hasAdditionalTextAlignment(false) +{ +#ifdef HB_EFFECTS + //HbEffectInternal::add(HB_PUSHBUTTON_TYPE,"pushbutton_pressed.fxml", "pressed"); + HbEffectInternal::add(HB_PUSHBUTTON_TYPE,"pushbutton_released", "released"); +#endif + +} + +/* + Destructor. + */ +HbPushButtonPrivate::~HbPushButtonPrivate() +{ + if(gestureFilter){ + delete gestureFilter; + gestureFilter = NULL; + } +} + +/* + createPrimitives. + */ +void HbPushButtonPrivate::createPrimitives() +{ + Q_Q(HbPushButton); + + if ( !frameItem ) { + frameItem = q->style()->createPrimitive( HbStyle::P_PushButton_background, q ); + } + if ( !text.isNull() ) { + if ( !textItem ) { + textItem = q->style()->createPrimitive( HbStyle::P_PushButton_text, q ); + } + } else { + if( textItem ){ + delete textItem; + } + textItem = 0; + } + if ( !additionalText.isNull() ) { + if ( !additionalTextItem ) { + additionalTextItem = q->style()->createPrimitive( HbStyle::P_PushButton_additionaltext, q ); + } + } else { + if( additionalTextItem ){ + delete additionalTextItem; + } + additionalTextItem = 0; + } + + if ( !icon.isNull() ) { + if ( !iconItem ) { + iconItem = q->style()->createPrimitive( HbStyle::P_PushButton_icon, q); + } + } else { + if( iconItem ){ + delete iconItem; + } + iconItem = 0; + } + + if( !touchArea ) { + touchArea = q->style()->createPrimitive( HbStyle::P_PushButton_toucharea, q ); + } + + if( !focusItem ) { + focusItem = q->style()->createPrimitive(HbStyle::P_PushButton_focus, q); + //focus primitive is will not be visible by default, + //only in case of keyboard focus events it will be Visible. + focusItem->setVisible( false ); + } +} + +/* + initGesture. + */ +void HbPushButtonPrivate::initGesture() +{ + Q_Q(HbPushButton); + // Create gesture filter + gestureFilter = new HbGestureSceneFilter( Qt::LeftButton, q ); + // Add gestures for longpress + gestureLongpressed = new HbGesture( HbGesture::longpress,5 ); + gestureFilter->addGesture( gestureLongpressed ); + + // scene event filter for gesture can be installed + // if widget is already added to scene + if (q->scene()) { + q->installSceneEventFilter(gestureFilter); + if (touchArea) { + touchArea->installSceneEventFilter(gestureFilter); + } + } + +} + +void HbPushButtonPrivate::_q_handleLongPress(QPointF point) +{ + Q_Q(HbPushButton); + if(!longPress){ + longPress = true; + emit q->longPress( point ); + } +} + +void HbPushButtonPrivate::_q_handleLongKeyPress( ) +{ + Q_Q(HbPushButton); + if(!longPress){ + longPress = true; + emit q->longPress( q->pos() ); + } +} + +void HbPushButtonPrivate::initialize() +{ + Q_Q(HbPushButton); + q_ptr = q; + createPrimitives(); + initGesture(); + +} + +/*! + @beta + Constructs a new HbPushButton with \a parent. + */ +HbPushButton::HbPushButton( QGraphicsItem *parent ) + : HbAbstractButton( *new HbPushButtonPrivate, parent ) +{ + Q_D(HbPushButton); + d->initialize(); + connect( d->gestureLongpressed, SIGNAL(longPress(QPointF)), + this, SLOT(_q_handleLongPress(QPointF))); + setProperty("state", "normal"); + +} + +/*! + @beta + Constructs a new HbPushButton with \a text and \a parent. + */ +HbPushButton::HbPushButton(const QString &text, QGraphicsItem *parent) + : HbAbstractButton(*new HbPushButtonPrivate, parent) +{ + Q_D(HbPushButton); + d->text = text; + d->initialize(); + connect( d->gestureLongpressed, SIGNAL(longPress(QPointF)), + this, SLOT(_q_handleLongPress(QPointF)) ); + setProperty("state", "normal"); + + +} + +/*! + @beta + Constructs a new HbPushButton with \a icon, \a text and \a parent. + */ +HbPushButton::HbPushButton( const HbIcon &icon, const QString &text, QGraphicsItem *parent ) + : HbAbstractButton( *new HbPushButtonPrivate, parent ) +{ + Q_D(HbPushButton); + d->icon = icon; + d->text = text; + d->initialize(); + connect( d->gestureLongpressed, SIGNAL(longPress(QPointF)), + this, SLOT(_q_handleLongPress(QPointF)) ); + setProperty("state", "normal"); + +} + +/*! + \deprecated HbPushButton::HbPushButton(const HbIcon&, const QString&, Qt::Orientation, QGraphicsItem*) + is deprecated. + Constructs a new HbPushButton with \a icon, \a text \a orientation and \a parent. + */ +HbPushButton::HbPushButton( const HbIcon &icon, const QString &text, + Qt::Orientation orientation, QGraphicsItem *parent ) + : HbAbstractButton( *new HbPushButtonPrivate, parent ) +{ + Q_D(HbPushButton); + d->icon = icon; + d->text = text; + d->initialize(); + d->orientation = orientation; + connect( d->gestureLongpressed, SIGNAL(longPress(QPointF)), + this, SLOT(_q_handleLongPress(QPointF)) ); + setProperty("state", "normal"); + +} + +/*! + Destructs the push button. + */ +HbPushButton::~HbPushButton() +{ + Q_D(HbPushButton); + if( d->gestureFilter ) { + removeSceneEventFilter( d->gestureFilter ); + } +} + +/*! + @beta + Sets the \a background of the button. + + \note The background can contain different images for pressed and released states. + + \sa background() + */ +void HbPushButton::setBackground( const HbIcon &background ) +{ + Q_D(HbPushButton); + if( !d->frameItem ) { + d->createPrimitives(); + } + if ( d->background != background ) { + d->background = background; + d->backgroundFrameDrawer = 0; + HbStyleOptionPushButton buttonOption; + initStyleOption( &buttonOption ); + style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption ); + } +} + +/*! + @beta + Returns the background of the button. + + \sa setBackground() + */ +HbIcon HbPushButton::background() const +{ + Q_D(const HbPushButton); + return d->background; +} + +/*! + @beta + Sets the \a framebackground of the button. + + \note The background can contain different types of frame drawers(Nine piece, + three piece or single).Ownership is transferred to the Pushbutton + + \sa frameBackground() + */ +void HbPushButton::setFrameBackground( HbFrameDrawer *backgroundFrameDrawer ) +{ + Q_D(HbPushButton); + if (d->backgroundFrameDrawer != backgroundFrameDrawer) { + if( !d->frameItem ) { + d->createPrimitives(); + } + d->backgroundFrameDrawer=backgroundFrameDrawer; + d->background=HbIcon(); + HbStyleOptionPushButton buttonOption; + initStyleOption( &buttonOption ); + style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption ); + } +} + +/*! + @beta + Returns the background of the button. + + \sa setBackground() + */ +HbFrameDrawer* HbPushButton::frameBackground() const +{ + Q_D(const HbPushButton); + return ( d->backgroundFrameDrawer ); +} + + +/*! + @beta + Sets the \a text shown on the button. + + \sa text() + */ +void HbPushButton::setText( const QString &text ) +{ + Q_D(HbPushButton); + if ( d->text != text ) { + bool doPolish = text.isEmpty() || d->text.isEmpty(); + d->text = text; + d->createPrimitives(); + //updatePrimitives(); + if( d->textItem ){ + HbStyleOptionPushButton buttonOption; + initStyleOption(&buttonOption); + style()->updatePrimitive( d->textItem, HbStyle::P_PushButton_text, &buttonOption); + } + if(doPolish) { + repolish(); + } + } +} + + +/*! + @beta + Returns the text shown on the button. + + \sa setText() + */ +QString HbPushButton::text() const +{ + Q_D(const HbPushButton); + return d->text; +} + + +/*! + @beta + Sets the \a additional text shown on the button. + Additional text is only shown in case + 1. with icon and text in Qt::Horizontal alignment. + 2. with additionalText and text in Qt::Vertical alignment. + + \sa additionalText() + */ +void HbPushButton::setAdditionalText( const QString &additionalText ) +{ + Q_D(HbPushButton); + if ( d->additionalText != additionalText ) { + bool doPolish = additionalText.isEmpty() || d->additionalText.isEmpty(); + d->additionalText = additionalText; + d->createPrimitives(); + // updatePrimitives(); + if(d->additionalTextItem){ + HbStyleOptionPushButton buttonOption; + initStyleOption(&buttonOption); + style()->updatePrimitive( d->additionalTextItem, HbStyle::P_PushButton_additionaltext, &buttonOption); + } + if( doPolish ) { + repolish(); + } + } +} + +/*! + @beta + Returns the additional text shown on the button. + + \sa setAdditionalText() + */ +QString HbPushButton::additionalText() const +{ + Q_D(const HbPushButton); + return d->additionalText; +} + +/*! + @beta + Sets the \a icon shown on the button. + + \note The icon can contain images for different modes. + + \sa icon() + */ +void HbPushButton::setIcon(const HbIcon &icon) +{ + Q_D(HbPushButton); + + if ( d->icon != icon ) { + bool doPolish = icon.isNull() || d->icon.isNull(); + d->icon = icon; + d->createPrimitives(); + //updatePrimitives(); + if(d->iconItem ){ + HbStyleOptionPushButton buttonOption; + initStyleOption( &buttonOption ); + style()->updatePrimitive( d->iconItem, HbStyle::P_PushButton_icon, &buttonOption ); + + } + if( doPolish ){ + repolish(); + } + } +} + +/*! + @beta + Returns the icon shown on the button. + \sa setIcon() + */ + +HbIcon HbPushButton::icon() const +{ + Q_D(const HbPushButton); + return d->icon; +} + + +/*! + \deprecated HbPushButton::setOrientation( Qt::Orientation ) + is deprecated. Please use HbPushButton::setStretched(bool) instead + + Set the orientation.Default orientation is Qt::Vertical. + In case of icon ,text and additional text it has to be set to Qt::Horizontal. + In case of additionalText and text it has to be set to Qt:Vertical. + \sa orientation() +*/ +void HbPushButton::setOrientation( Qt::Orientation orientation ) +{ + Q_D(HbPushButton); + if( d->orientation != orientation ) { + d->orientation = orientation; + // calling setStretchedMode internaly this api is going to be depricated. + bool stretched = + (d->orientation == Qt::Vertical)?(false):(true); + setStretched( stretched ); + } + qDebug()<<"This api is deprecated use HbPushButton::setStretched( bool stretched )"; +} + +/*! + \deprecated HbPushButton::orientation() const + is deprecated.Please use bool HbPushButton::isStretched() const instead + + Returns orientation of button + \sa setOrientation () +*/ +Qt::Orientation HbPushButton::orientation() const +{ + Q_D(const HbPushButton); + qDebug()<<"This api is deprecated use bool HbPushButton::isStretched() const"; + return d->orientation; +} + +/*! + Set the text alignment for primarytext and additional text. + The default alignment is Qt::AlignHCenter | Qt::AlignVCenter. + \sa textAlignment() +*/ +void HbPushButton::setTextAlignment( Qt::Alignment alignment ) +{ + Q_D(HbPushButton); + + //HbWidgetBase* textItem = static_cast(d->textItem); + if(!d->textItem){ + //need to create text item if user call alignment api before setText. + d->textItem = style()->createPrimitive( HbStyle::P_PushButton_text, this); + } + //HbWidgetBasePrivate *textItem_p = HbWidgetBasePrivate::d_ptr(textItem); + // check for textitem and api protection flag + if(alignment != d->textAlignment ){ + //take the alignment + d->textAlignment = alignment; + //set the api protection flag + //HbWidgetBasePrivate::d_ptr(textItem)->setApiProtectionFlag(HbWidgetBasePrivate::AC_TextAlign,true); + d->hasTextAlignment = true; + HbStyleOptionPushButton buttonOption; + initStyleOption( &buttonOption ); + style()->updatePrimitive( + d->textItem, HbStyle::P_PushButton_text, &buttonOption ); + } + d->hasTextAlignment = true; +} + +/*! + Returns the text alignment for primary text and additional text + \sa setTextAlignment() +*/ +Qt::Alignment HbPushButton::textAlignment( ) const +{ + Q_D(const HbPushButton); + return d->textAlignment; +} + + +/*! + Set the text alignment for additional text. + The default alignment is Qt::AlignHCenter | Qt::AlignVCenter. + \sa additionalTextAlignment() +*/ +void HbPushButton::setAdditionalTextAlignment( Qt::Alignment alignment ) +{ + Q_D(HbPushButton); + + //HbWidgetBase* additionalTextItem = static_cast(d->additionalTextItem); + if(!d->additionalTextItem){ + //need to create text item if user call alignment api before setAdditionalText. + d->additionalTextItem = style()->createPrimitive( HbStyle::P_PushButton_additionaltext, this); + } + // check for textitem and api protection flag + if(alignment != d->additionalTextAlignment ){ + //take the alignment + d->additionalTextAlignment = alignment; + //set the api protection flag + //HbWidgetBasePrivate::d_ptr(additionalTextItem)->setApiProtectionFlag(HbWidgetBasePrivate::AC_TextAlign,true); + d->hasAdditionalTextAlignment = true; + HbStyleOptionPushButton buttonOption; + initStyleOption( &buttonOption ); + style()->updatePrimitive( + d->additionalTextItem, HbStyle::P_PushButton_additionaltext, &buttonOption ); + } +} + +/*! + Returns the text alignment for additional text + \sa setAdditionalTextAlignment() +*/ +Qt::Alignment HbPushButton::additionalTextAlignment( ) const +{ + Q_D(const HbPushButton); + return d->additionalTextAlignment; +} + +/*! + Sets the stretched layout for button by default it set to true. setStretched true/false. + For the case icon and text with value false will appear icon and text vertically aligned. + and with value true will appear icon and text horizontally aligned. + For the case icon , text and additional text with value false will appear like + both text will be vertically aligned and icon will be horizontally. + and with value true icon , text and additionaltext will come horizontally aligned in one line + For the case text and additonaltext(dialer button case ) only value false is applicable and both texts will + appeare vertically + + \sa isStretched() +*/ +void HbPushButton::setStretched( bool stretched ) +{ + Q_D(HbPushButton); + if( d->stretched != stretched ) { + d->stretched = stretched; + repolish(); + } +} + +/*! + Returns the whether button has streteched layout or not. + \sa setStretched () +*/ +bool HbPushButton::isStretched() const +{ + Q_D(const HbPushButton); + return d->stretched; +} + +/*! + \reimp + */ +QGraphicsItem* HbPushButton::primitive( HbStyle::Primitive primitive ) const +{ + Q_D(const HbPushButton); + + switch (primitive) { + case HbStyle::P_PushButton_background: + return d->frameItem; + case HbStyle::P_PushButton_icon: + return d->iconItem; + case HbStyle::P_PushButton_text: + return d->textItem; + case HbStyle::P_PushButton_toucharea: + return d->touchArea; + case HbStyle::P_PushButton_additionaltext: + return d->additionalTextItem; + case HbStyle::P_PushButton_focus: + return d->focusItem; + default: + return 0; + } +} + +/*! + \reimp + */ +void HbPushButton::recreatePrimitives() +{ + Q_D(HbPushButton); + HbWidget::recreatePrimitives(); + + delete d->frameItem; + d->frameItem = 0; + delete d->iconItem; + d->iconItem = 0; + delete d->textItem; + d->textItem = 0; + delete d->touchArea; + d->touchArea = 0; + delete d->additionalTextItem; + d->additionalTextItem = 0; + delete d->focusItem; + d->focusItem = 0; + + d->createPrimitives(); + setFrameBackground(0); +} +/*! + \reimp + */ +void HbPushButton::updatePrimitives() +{ + Q_D(HbPushButton); + HbWidget::updatePrimitives(); + + HbStyleOptionPushButton buttonOption; + initStyleOption(&buttonOption); + if ( d->textItem ) { + style()->updatePrimitive( d->textItem, HbStyle::P_PushButton_text, &buttonOption ); + } + if ( d->touchArea ) { + style()->updatePrimitive( d->touchArea, HbStyle::P_PushButton_toucharea, &buttonOption ); + } + if( d->additionalTextItem ){ + style()->updatePrimitive( + d->additionalTextItem,HbStyle::P_PushButton_additionaltext,&buttonOption ); + } + if ( d->iconItem) { + style()->updatePrimitive( d->iconItem, HbStyle::P_PushButton_icon, &buttonOption ); + } + if ( d->frameItem ){ + style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption ); + } + // update will happen only for keyevents when focusItem will be visible. + if( d->focusItem && hasFocus() && d->focusItem->isVisible() ) { + style()->updatePrimitive( d->focusItem,HbStyle::P_PushButton_focus, &buttonOption ); + } +} + +/*! + \internal + */ +HbPushButton::HbPushButton(HbPushButtonPrivate &dd, QGraphicsItem * parent) : + HbAbstractButton(dd, parent) +{ + Q_D(HbPushButton); + d->initGesture(); + connect( d->gestureLongpressed, SIGNAL(longPress(QPointF)), + this, SLOT(_q_handleLongPress(QPointF)) ); +} + +/*! + Initializes \a option with the values from this HbPushButton. + This method is useful for subclasses when they need a HbStyleOptionPushButton, + but don't want to fill in all the information themselves. + */ +void HbPushButton::initStyleOption(HbStyleOptionPushButton *option) const +{ + Q_D(const HbPushButton); + + HbAbstractButton::initStyleOption(option); + + Q_ASSERT(option); + option->background = d->background; + option->text = d->text; + option->additionalText = d->additionalText; + option->icon = d->icon; + option->isCheckable = d->checkable; + option->textAlignment = d->textAlignment; + option->additionalTextAlignment = d->additionalTextAlignment; + option->hasTextAlignment = d->hasTextAlignment; + option->hasAdditionalTextAlignment = d->hasAdditionalTextAlignment; + if(option->backgroundFrameDrawer) { + HbFrameDrawerPool::release(option->backgroundFrameDrawer); + option->backgroundFrameDrawer = 0; + } + option->backgroundFrameDrawer=( d->backgroundFrameDrawer ); +} + +/*! + \reimp + */ +void HbPushButton::keyPressEvent(QKeyEvent *event) +{ + Q_D(HbPushButton); + + switch (event->key()) { + case Qt::Key_Select: + case Qt::Key_Enter: + case Qt::Key_Return:{ + if (!event->isAutoRepeat() && !d->autoRepeat && !d->longPressTimer) { + d->longPressTimer = new QTimer(); + d->longPressTimer->setInterval(300); + connect( d->longPressTimer, SIGNAL(timeout()), this, SLOT(_q_handleLongKeyPress()) ); + d->longPressTimer->start(); + }else{ + #ifdef HB_EFFECTS + HbEffect::start( this, HB_PUSHBUTTON_TYPE, "pressed" ); + #endif + } + } + break; + case Qt::Key_Up: + case Qt::Key_Left: + case Qt::Key_Right: + case Qt::Key_Down:{ + d->navigationKeyPress = true; + } + break; + } + HbAbstractButton::keyPressEvent(event); +} + + +/*! + \reimp + */ +void HbPushButton::keyReleaseEvent(QKeyEvent *event) +{ + Q_D(HbPushButton); + switch(event->key()){ + case Qt::Key_Select: + case Qt::Key_Enter: + case Qt::Key_Return:{ + #ifdef HB_EFFECTS + HbEffect::start( this, HB_PUSHBUTTON_TYPE, "released" ); + #endif + if( d->longPressTimer && d->longPressTimer->isActive() ) { + d->longPressTimer->stop(); + delete d->longPressTimer; + d->longPressTimer = 0; + } + } + break; + case Qt::Key_Up: + case Qt::Key_Left: + case Qt::Key_Right: + case Qt::Key_Down:{ + d->navigationKeyPress = false; + } + break; + } + HbAbstractButton::keyReleaseEvent( event ); +} + +/*! + \reimp + */ +void HbPushButton::mousePressEvent( QGraphicsSceneMouseEvent *event ) +{ + Q_D(HbPushButton); + HbAbstractButton::mousePressEvent(event); + HbStyleOptionPushButton buttonOption; + initStyleOption( &buttonOption ); + if( d->frameItem ){ + style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption ); + } +#ifdef HB_EFFECTS + if ( hitButton(event->pos()) ){ + HbEffect::start( this, HB_PUSHBUTTON_TYPE, "pressed" ); + } +#endif + setProperty("state", "pressed"); +} + +/*! + \reimp + */ +void HbPushButton::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_D(HbPushButton); + HbAbstractButton::mouseReleaseEvent(event); + HbStyleOptionPushButton buttonOption; + initStyleOption( &buttonOption ); + if( d->frameItem ){ + style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption ); + } +#ifdef HB_EFFECTS + if ( hitButton(event->pos()) ){ + HbEffect::start( this, HB_PUSHBUTTON_TYPE, "released" ); + } +#endif + setProperty("state", "normal"); +} + +/*! + \reimp + */ +void HbPushButton::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + Q_D(HbPushButton); + HbAbstractButton::mouseMoveEvent(event); + HbStyleOptionPushButton buttonOption; + initStyleOption( &buttonOption ); + if( d->frameItem ){ + style()->updatePrimitive( d->frameItem, HbStyle::P_PushButton_background, &buttonOption ); + } + if (d->down) { + setProperty("state", "pressed"); + } else { + setProperty("state", "normal"); + } +} + + +/*! + \reimp + */ +void HbPushButton::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + HbAbstractButton::resizeEvent(event); +} +/*! + reimp + +*/ +void HbPushButton::polish( HbStyleParameters& params ) +{ + Q_D( HbPushButton ); + if(d->stretched && (d->textItem && d->additionalTextItem && !d->iconItem)){ + d->stretched = false; + qWarning()<<"Warning::Invalid Layout: Text and additonalText horizontal appearance not supported"; + } + HbAbstractButton::polish( params ); +} + + +/*! + \reimp + */ +void HbPushButton::focusInEvent(QFocusEvent *event) +{ + Q_D(HbPushButton); + if((event->reason() == Qt::TabFocusReason || event->reason() == Qt::BacktabFocusReason) + && ( d->navigationKeyPress ) ) { + if(d->focusItem) { + d->focusItem->setVisible(true); + if( hasFocus()){ + HbStyleOptionPushButton buttonOption; + initStyleOption( &buttonOption ); + style()->updatePrimitive( d->focusItem,HbStyle::P_PushButton_focus, &buttonOption ); + } + } else { + d->focusItem = style()->createPrimitive(HbStyle::P_PushButton_focus, this); + } + } + HbAbstractButton::focusInEvent(event); +} + +/*! + \reimp + */ +void HbPushButton::focusOutEvent(QFocusEvent *event) +{ + Q_D(HbPushButton); + if(d->focusItem) { + d->focusItem->setVisible(false); + } + HbAbstractButton::focusOutEvent(event); +} + +/*! + \reimp + */ +QVariant HbPushButton::itemChange(GraphicsItemChange change, const QVariant &value) +{ + Q_D(HbPushButton); + + switch ( change ) { + case ItemEnabledHasChanged: + case ItemVisibleChange: { + updatePrimitives( ); + } + break; + case ItemSceneHasChanged: { + // scene event filter for gestures can be installed + // once the widget has been added to the scene + if(!value.isNull() && d->gestureFilter) { + installSceneEventFilter(d->gestureFilter); + if (d->touchArea) { + d->touchArea->installSceneEventFilter(d->gestureFilter); + } + } + updatePrimitives(); + } + break; + default: + break; + } + return HbAbstractButton::itemChange( change, value ); +} + +/*! + Overloaded hit detection to include touch area + */ +bool HbPushButton::hitButton(const QPointF &pos) const +{ + Q_D( const HbPushButton ); + QRectF compRect = d->touchArea->boundingRect( ); + compRect.translate( d->touchArea->pos() ); + return compRect.contains( pos ); +} + +#include "moc_hbpushbutton.cpp" +