src/hbwidgets/dataform/hbdataform.cpp
changeset 28 b7da29130b0e
parent 23 e6ad4ef83b23
child 30 80e4d18b72f5
equal deleted inserted replaced
23:e6ad4ef83b23 28:b7da29130b0e
    37 #include <hbdataformmodel.h>
    37 #include <hbdataformmodel.h>
    38 #include <hbcombobox.h>
    38 #include <hbcombobox.h>
    39 
    39 
    40 #include <QGraphicsSceneMouseEvent>
    40 #include <QGraphicsSceneMouseEvent>
    41 #include <QCoreApplication>
    41 #include <QCoreApplication>
    42 
    42 #include <QGraphicsScene>
       
    43 #include <QGestureRecognizer>
       
    44 #include <hbgesturerecognizers_p.h>
       
    45 
       
    46 class HbTapDelayGesture:public HbTapGesture
       
    47 {
       
    48 public:
       
    49     using HbTapGesture::d_ptr;
       
    50     
       
    51     Q_DECLARE_PRIVATE_D(d_ptr, HbTapGesture);
       
    52 };
       
    53 class HbTapDelayGestureRecognizer : public HbTapGestureRecognizer
       
    54 {
       
    55 public:
       
    56     explicit HbTapDelayGestureRecognizer(){};
       
    57     virtual ~HbTapDelayGestureRecognizer()
       
    58     {
       
    59         int i = 0;
       
    60         i++;
       
    61     };
       
    62 
       
    63     QGestureRecognizer::Result recognize(QGesture *state, QObject *watched, QEvent *event)
       
    64     {
       
    65         HbTapDelayGesture* gesture = static_cast<HbTapDelayGesture *>(state);
       
    66         QMouseEvent* me = toMouseEvent(event);
       
    67         Qt::GestureState gestureState = state->state();
       
    68         switch(event->type())
       
    69         {
       
    70         case QEvent::MouseButtonDblClick:
       
    71         case QEvent::MouseButtonPress:
       
    72             if ( state->state() == Qt::NoGesture && me->button() == Qt::LeftButton){
       
    73                 
       
    74                 gesture->setPosition(me->globalPos());
       
    75                 gesture->setHotSpot(me->globalPos());
       
    76                 gesture->setStartPos(me->globalPos());
       
    77                 gesture->setScenePosition(HbGestureUtils::mapToScene(watched, me->globalPos()));
       
    78                 gesture->setSceneStartPos(HbGestureUtils::mapToScene(watched, me->globalPos()));
       
    79                 mTapRadius = (int)(HbDefaultTapRadius * HbDeviceProfile::current().ppmValue());        
       
    80 
       
    81                 HbTapGesturePrivate* d_ptr = gesture->d_func();
       
    82                 d_ptr->mTapStyleHint = HbTapGesture::Tap;
       
    83                 if ( d_ptr->mTimerId ) {
       
    84                     gesture->killTimer(d_ptr->mTimerId);
       
    85                 }
       
    86                 d_ptr->mTimerId = gesture->startTimer(50);
       
    87                 return QGestureRecognizer::MayBeGesture;
       
    88                 
       
    89             }
       
    90             else {
       
    91                 return QGestureRecognizer::Ignore;
       
    92             }
       
    93     
       
    94 
       
    95         case QEvent::MouseMove:
       
    96             if(gestureState != Qt::NoGesture && gestureState != Qt::GestureCanceled) { 
       
    97                 return handleMouseMove(gestureState, gesture, watched, toMouseEvent(event));
       
    98             }
       
    99             else{
       
   100                 if (gesture->d_func()->mTimerId) {
       
   101                     gesture->setPosition(me->globalPos());
       
   102                     gesture->setScenePosition(HbGestureUtils::mapToScene(watched, me->globalPos()));
       
   103                     gesture->setHotSpot(me->globalPos());
       
   104 
       
   105                     int tapRadiusSquare(mTapRadius * mTapRadius);
       
   106                     if(gesture->property(HbPrivate::TapRadius.latin1()).isValid()) {
       
   107                         qWarning("WARNING using widget specific properties in HbTapGestureRecognizer");
       
   108                         int tapRadius = gesture->property(HbPrivate::TapRadius.latin1()).toInt();
       
   109                         tapRadiusSquare = tapRadius * tapRadius;
       
   110                     }
       
   111                     QPointF delta = me->globalPos() - gesture->startPos();
       
   112 
       
   113                      // cancel long press with radius
       
   114                     if((delta.x() * delta.x() + delta.y() * delta.y()) > tapRadiusSquare) {                
       
   115                         gesture->killTimer(gesture->d_func()->mTimerId);
       
   116                         gesture->d_func()->mTimerId = 0;
       
   117                     }
       
   118 
       
   119                 }
       
   120                 return QGestureRecognizer::Ignore;
       
   121             }
       
   122 
       
   123         case QEvent::MouseButtonRelease:
       
   124             if(gestureState != Qt::NoGesture) {
       
   125                 return handleMouseRelease(gestureState, gesture, watched, toMouseEvent(event));
       
   126             }
       
   127             else{
       
   128                 
       
   129                 if (gesture->d_func()->mTimerId) {
       
   130                     gesture->killTimer(gesture->d_func()->mTimerId);
       
   131                     gesture->d_func()->mTimerId = 0;
       
   132                     return QGestureRecognizer::FinishGesture;
       
   133                 } else {
       
   134                     return QGestureRecognizer::Ignore;
       
   135                 }
       
   136             }
       
   137 
       
   138         case QEvent::Timer:
       
   139             {
       
   140             QGestureRecognizer::Result result;
       
   141             gesture->killTimer(gesture->d_func()->mTimerId);
       
   142             gesture->d_func()->mTimerId = 0;
       
   143             if(gestureState == Qt::NoGesture) {
       
   144                 result = QGestureRecognizer::TriggerGesture;        
       
   145                 gesture->d_func()->mTimerId = gesture->startTimer(HbTapAndHoldTimeout);
       
   146               
       
   147             } 
       
   148             else {
       
   149                 result = handleTimerEvent(gesture->state(),gesture,watched);
       
   150             }
       
   151 
       
   152             return result;
       
   153             }
       
   154             break;
       
   155 
       
   156         case QEvent::TouchBegin:
       
   157         case QEvent::TouchUpdate:        
       
   158             return HbTapGestureRecognizer::recognize(state, watched, event);
       
   159 
       
   160         default: break;
       
   161         }
       
   162 
       
   163         return QGestureRecognizer::Ignore;
       
   164 
       
   165     }
       
   166 };
       
   167 
       
   168 class DelayGestureInstaller
       
   169 {
       
   170 public:
       
   171     DelayGestureInstaller():count(0){}
       
   172     void install()
       
   173     {
       
   174         if(count <=0){
       
   175             QGestureRecognizer::unregisterRecognizer(Qt::TapGesture);
       
   176             QGestureRecognizer::registerRecognizer(new HbTapDelayGestureRecognizer);
       
   177             
       
   178         }
       
   179         count++;
       
   180     }
       
   181     void unInstall()
       
   182     {
       
   183         count--;
       
   184         if(count <1){
       
   185             QGestureRecognizer::unregisterRecognizer(Qt::TapGesture);
       
   186             QGestureRecognizer::registerRecognizer(new HbTapGestureRecognizer);
       
   187         }
       
   188     }
       
   189     int count;
       
   190 };
       
   191 static DelayGestureInstaller delayGestureInstaller;
    43 /*!
   192 /*!
    44     @beta
   193     @beta
    45     @hbwidgets
   194     @hbwidgets
    46     \class HbDataForm
   195     \class HbDataForm
    47 
   196 
   231                          new HbTreeModelIterator(0, QModelIndex(), false), parent)
   380                          new HbTreeModelIterator(0, QModelIndex(), false), parent)
   232 {
   381 {
   233     Q_D( HbDataForm );
   382     Q_D( HbDataForm );
   234     d->q_ptr = this;
   383     d->q_ptr = this;
   235     d->init();
   384     d->init();
   236     setVerticalScrollBarPolicy(ScrollBarAlwaysOff);
   385     //setVerticalScrollBarPolicy(ScrollBarAlwaysOff);
   237 }
   386 }
   238 
   387 
   239 /*!
   388 /*!
   240     Constructs a data form with the given private class object \a dd, 
   389     Constructs a data form with the given private class object \a dd, 
   241     \a container and \a parent.
   390     \a container and \a parent.
   511             HbDataFormModelItem *modelItem = 
   660             HbDataFormModelItem *modelItem = 
   512                         static_cast<HbDataFormModel *>(model())->itemFromIndex(topLeft);           
   661                         static_cast<HbDataFormModel *>(model())->itemFromIndex(topLeft);           
   513             HbDataFormModelItemPrivate *modelItem_priv = HbDataFormModelItemPrivate::d_ptr(modelItem);
   662             HbDataFormModelItemPrivate *modelItem_priv = HbDataFormModelItemPrivate::d_ptr(modelItem);
   514 
   663 
   515             if(item){
   664             if(item){
   516                 HbDataFormViewItemPrivate::d_ptr(item)->setEnabled( modelItem->isEnabled() );
       
   517                 if( modelItem_priv->dirtyProperty() == "LabelRole"      ||
   665                 if( modelItem_priv->dirtyProperty() == "LabelRole"      ||
   518                     modelItem_priv->dirtyProperty() == "DecorationRole" || 
   666                     modelItem_priv->dirtyProperty() == "DecorationRole" || 
   519                     modelItem_priv->dirtyProperty() == "DescriptionRole" ) {
   667                     modelItem_priv->dirtyProperty() == "DescriptionRole" ) {
   520 
   668 
   521                      HbDataFormViewItemPrivate::d_ptr(item)->updateData();
   669                      HbDataFormViewItemPrivate::d_ptr(item)->updateData();
   522                      return;
   670                      return;
       
   671                 } else if(modelItem_priv->dirtyProperty() == "enabled") {
       
   672                     HbDataFormViewItemPrivate::d_ptr(item)->setEnabled( modelItem->isEnabled() );
   523                 }
   673                 }
   524                 item->restore();
   674                 item->restore();
   525             }
   675             }
   526     }
   676     }
   527 }
   677 }
   652 {   
   802 {   
   653     Q_D(HbDataForm);
   803     Q_D(HbDataForm);
   654     d->removeAllConnection(item);
   804     d->removeAllConnection(item);
   655 }
   805 }
   656 
   806 
       
   807 
       
   808 /*!
       
   809     \reimp
       
   810 
       
   811     This slot is called when orientation is changed.
       
   812     \a newOrientation has the currentOrientation mode.
       
   813     Note: Currently platform dependent orientation support is not available
       
   814 */
       
   815 void HbDataForm::orientationChanged(Qt::Orientation newOrientation)
       
   816 {
       
   817     Q_UNUSED(newOrientation);
       
   818     Q_D(HbDataForm);
       
   819 
       
   820     //Setting the uniform ites sizes to container again resets size caches.
       
   821     d->mContainer->setUniformItemSizes(d->mContainer->uniformItemSizes());
       
   822     d->mContainer->setPos(0,0);
       
   823     d->mContainer->resizeContainer();
       
   824 
       
   825     d->updateScrollMetrics();
       
   826 
       
   827     d->stopAnimating();
       
   828     scrollTo(d->mVisibleIndex, HbAbstractItemView::PositionAtCenter);
       
   829     d->mVisibleIndex = QModelIndex();
       
   830 }
       
   831 
       
   832 void HbDataForm::orientationAboutToBeChanged()
       
   833 {
       
   834     Q_D(HbDataForm);
       
   835     QRectF rect = mapToScene(boundingRect()).boundingRect();
       
   836     HbAbstractViewItem * item = d->itemAt((rect.center()));
       
   837     if(item){
       
   838         d->mVisibleIndex = item->modelIndex();
       
   839     } else{
       
   840         HbAbstractItemView::orientationAboutToBeChanged();
       
   841     }
       
   842 }
       
   843 
       
   844 /*!
       
   845     \reimp
       
   846 */
       
   847 
       
   848 void HbDataForm::showEvent(QShowEvent * event)
       
   849 {
       
   850     if(!isVisible() ){
       
   851         delayGestureInstaller.install();       
       
   852     }    
       
   853     HbAbstractItemView::showEvent( event );
       
   854 }
       
   855 
       
   856 /*!
       
   857     \reimp
       
   858 */
       
   859 void HbDataForm::hideEvent ( QHideEvent * event )  
       
   860 {
       
   861     delayGestureInstaller.unInstall();
       
   862     HbAbstractItemView::hideEvent( event );
       
   863     
       
   864 }
       
   865 
       
   866 
   657 #include "moc_hbdataform.cpp"
   867 #include "moc_hbdataform.cpp"
   658 
   868 
   659 
   869