src/hbwidgets/itemviews/hbtumbleview.cpp
changeset 5 627c4a0fd0e7
parent 3 11d3954df52a
child 6 c3690ec91ef8
equal deleted inserted replaced
3:11d3954df52a 5:627c4a0fd0e7
    50 
    50 
    51 class HbTumbleViewItemContainer:public HbListItemContainer
    51 class HbTumbleViewItemContainer:public HbListItemContainer
    52 {
    52 {
    53     Q_DECLARE_PRIVATE(HbTumbleViewItemContainer)
    53     Q_DECLARE_PRIVATE(HbTumbleViewItemContainer)
    54 public:
    54 public:
    55     HbTumbleViewItemContainer(QGraphicsItem* parent = 0);
    55     HbTumbleViewItemContainer(QGraphicsItem* parent = 0);    
    56     QPointF recycleItems(const QPointF &delta);
    56     QPointF recycleItems(const QPointF &delta);
    57 
    57 
    58     void setLoopingEnabled(bool looping) ;
    58     void setLoopingEnabled(bool looping) ;
    59     bool isLoopingEnabled() const ;
    59     bool isLoopingEnabled() const ;
    60     void removeItem(const QModelIndex &index, bool animate );
    60     void removeItem(const QModelIndex &index, bool animate );
    67 public:
    67 public:
    68     HbTumbleViewItemContainerPrivate();
    68     HbTumbleViewItemContainerPrivate();
    69     QPointF recycleItems(const QPointF &delta);
    69     QPointF recycleItems(const QPointF &delta);
    70     HbAbstractViewItem *shiftDownItem(QPointF& delta);
    70     HbAbstractViewItem *shiftDownItem(QPointF& delta);
    71     HbAbstractViewItem *shiftUpItem(QPointF& delta);
    71     HbAbstractViewItem *shiftUpItem(QPointF& delta);
       
    72     HbAbstractViewItem* item(const QModelIndex &index) const;
    72 
    73 
    73     bool mIsLooped;
    74     bool mIsLooped;
    74 };
    75 };
    75 
    76 
    76 class HbTumbleViewPrivate : public HbListViewPrivate
    77 class HbTumbleViewPrivate : public HbListViewPrivate
   127 }
   128 }
   128 
   129 
   129 QPointF HbTumbleViewItemContainer::recycleItems(const QPointF &delta)
   130 QPointF HbTumbleViewItemContainer::recycleItems(const QPointF &delta)
   130 {
   131 {
   131     Q_D(HbTumbleViewItemContainer);
   132     Q_D(HbTumbleViewItemContainer);
   132 
       
   133     if (d->mPrototypes.count() != 1) {
       
   134         return delta;
       
   135     }
       
   136 
       
   137     QRectF viewRect(d->itemBoundingRect(d->mItemView));
   133     QRectF viewRect(d->itemBoundingRect(d->mItemView));
   138     viewRect.moveTopLeft(viewRect.topLeft() + delta);
   134     viewRect.moveTopLeft(viewRect.topLeft() + delta);
   139 
   135 
   140     int firstVisibleBufferIndex = -1;
   136     int firstVisibleBufferIndex = -1;
   141     int lastVisibleBufferIndex = -1;
   137     int lastVisibleBufferIndex = -1;
   394         q->itemAdded(0, item);
   390         q->itemAdded(0, item);
   395     }
   391     }
   396     return item;
   392     return item;
   397 }
   393 }
   398 
   394 
       
   395 HbAbstractViewItem *HbTumbleViewItemContainerPrivate::item(const QModelIndex &index) const
       
   396 {
       
   397     int itemCount = mItems.count();
       
   398     for(int i=0;i<itemCount;++i) {
       
   399         if(mItems.at(i)->modelIndex() == index) {
       
   400             return mItems.at(i);
       
   401         }
       
   402     }
       
   403     return 0;
       
   404 }
       
   405 
   399 HbTumbleViewPrivate::HbTumbleViewPrivate()
   406 HbTumbleViewPrivate::HbTumbleViewPrivate()
   400     :HbListViewPrivate()
   407     :HbListViewPrivate()
   401     ,mHeight(10.0)
   408     ,mHeight(10.0)
   402     ,mPrevSelectedItem(0)
   409     ,mPrevSelectedItem(0)
   403     ,mInternalScroll(false)
   410     ,mInternalScroll(false)
   444     //scroll area settings
   451     //scroll area settings
   445     q->setClampingStyle(HbScrollArea::BounceBackClamping);
   452     q->setClampingStyle(HbScrollArea::BounceBackClamping);
   446     q->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff);
   453     q->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff);
   447     q->setHorizontalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff);
   454     q->setHorizontalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff);
   448     q->setFrictionEnabled(true);
   455     q->setFrictionEnabled(true);
       
   456 
       
   457     //dont want this to occupy entire screen. preferred is few items.
       
   458     q->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
       
   459 
   449     mDelayedSelectTimer.setSingleShot(true);
   460     mDelayedSelectTimer.setSingleShot(true);
   450     bool b = q->connect(q,SIGNAL(scrollingStarted()),q,SLOT(_q_scrollingStarted()));
   461     bool b = q->connect(q,SIGNAL(scrollingStarted()),q,SLOT(_q_scrollingStarted()));
   451     Q_ASSERT(b);
   462     Q_ASSERT(b);
   452     b = q->connect(q,SIGNAL(scrollingEnded()),q,SLOT(_q_scrollingEnded()));
   463     b = q->connect(q,SIGNAL(scrollingEnded()),q,SLOT(_q_scrollingEnded()));
   453     Q_ASSERT(b);
   464     Q_ASSERT(b);
   522             q->setCurrentIndex(index,QItemSelectionModel::SelectCurrent);
   533             q->setCurrentIndex(index,QItemSelectionModel::SelectCurrent);
   523         }
   534         }
   524     }
   535     }
   525 }
   536 }
   526 
   537 
   527 void HbTumbleView::scrollTo(const QModelIndex &index, ScrollHint)
   538 void HbTumbleView::scrollTo(const QModelIndex &index, ScrollHint hint)
   528 {
   539 {    
   529 #ifdef HBTUMBLE_DEBUG  
   540     Q_D(HbTumbleView);
   530     qDebug() << "HbTumbleView::scrollTo(" << index.row() << ", )";
   541 
   531 #endif
   542     if (!d->mModelIterator->model()
   532     HbListView::scrollTo(index, PositionAtCenter);
   543         ||  index.model() != d->mModelIterator->model()) {
       
   544         return;
       
   545     }
       
   546 
       
   547     //If item is in the buffer, just reveal it.
       
   548     //This is always the case if recycling is off
       
   549     //and sometimes the case when recycling is on
       
   550     if (itemRecycling()) {
       
   551         if (    !d->mContainer->itemByIndex(index)
       
   552             ||  hint != EnsureVisible) {
       
   553             //Now the item is not in the buffer.
       
   554             //We must first set the item to be in the buffer
       
   555             //If the item is above let's put it first and if it is below put it last
       
   556 
       
   557             int newIndex = -1;
       
   558 
       
   559             switch (hint) {
       
   560             case PositionAtCenter: {
       
   561                     int containerCount = d->mContainer->items().count();
       
   562                     newIndex = index.row() - containerCount / 2 ;
       
   563                     if(newIndex < 0){
       
   564                         if(isLoopingEnabled()){
       
   565                             newIndex = d->mModelIterator->indexCount()+newIndex;
       
   566                         }
       
   567                         else{
       
   568                             newIndex = 0;
       
   569                         }
       
   570                     }
       
   571                     break;
       
   572                 }
       
   573             case EnsureVisible:
       
   574             case PositionAtTop:
       
   575             case PositionAtBottom:
       
   576             default: {
       
   577                     qWarning()<<"Scroll Hint is not supported ";                }
       
   578             }
       
   579             d->mContainer->setModelIndexes(d->mModelIterator->index(newIndex));
       
   580         }
       
   581     }
       
   582     HbAbstractItemView::scrollTo(index, hint);
   533 }
   583 }
   534 
   584 
   535 void HbTumbleViewPrivate::createPrimitives()
   585 void HbTumbleViewPrivate::createPrimitives()
   536 {
   586 {
   537     Q_Q(HbTumbleView);
   587     Q_Q(HbTumbleView);