ganeswidgets/src/HgContainer.cpp
changeset 2 49c70dcc3f17
parent 1 e48454f237ca
child 3 c863538fcbb6
equal deleted inserted replaced
1:e48454f237ca 2:49c70dcc3f17
    26 #include "hgvgquadrenderer.h"
    26 #include "hgvgquadrenderer.h"
    27 #include "hgvgimage.h"
    27 #include "hgvgimage.h"
    28 #include "hgwidgetitem.h"
    28 #include "hgwidgetitem.h"
    29 #include "trace.h"
    29 #include "trace.h"
    30 
    30 
       
    31 //#include <hbstyleoptioncheckbox.h>
       
    32 //#include <hbcheckbox>
    31 #include <hbgridviewitem>
    33 #include <hbgridviewitem>
    32 #include <hbgridview>
    34 #include <hbgridview>
    33 #include <hbiconitem>
    35 #include <hbiconitem>
    34 #include <qabstractitemmodel>
    36 #include <qabstractitemmodel>
    35 #include "hglongpressvisualizer.h"
    37 #include "hglongpressvisualizer.h"
    48     mRenderer(0),
    50     mRenderer(0),
    49     mTapCount(0),
    51     mTapCount(0),
    50     mAnimateUsingScrollBar(false),
    52     mAnimateUsingScrollBar(false),
    51     mSelectionMode(HgWidget::NoSelection),
    53     mSelectionMode(HgWidget::NoSelection),
    52     mSelectionModel(0),
    54     mSelectionModel(0),
    53     mMarkImage(0),
    55     mMarkImageOn(0),
       
    56     mMarkImageOff(0),
    54     mSpringVelAtDragStart(0),
    57     mSpringVelAtDragStart(0),
    55     mDragged(false),
    58     mDragged(false),
    56     mFramesDragged(0),
    59     mFramesDragged(0),
    57     mHitItemView(NULL),
    60     mHitItemView(NULL),
    58     mLongPressVisualizer(NULL),
    61     mLongPressVisualizer(NULL),
    59     mLongPressTimer(NULL),
    62     mLongPressTimer(NULL),
    60     mHitItemIndex(NULL),
    63     mHitItemIndex(-1),
    61     mItemSizePolicy(HgWidget::ItemSizeUserDefined),
    64     mItemSizePolicy(HgWidget::ItemSizeAutomatic),
    62     mOrientation(Qt::Vertical)
    65     mOrientation(Qt::Vertical),
       
    66     mDelayedScrollToIndex(),
       
    67     mIgnoreTap(false)
    63 {
    68 {
    64     FUNC_LOG;
    69     FUNC_LOG;
    65 
    70 
    66     grabGesture(Qt::PanGesture);
    71     grabGesture(Qt::PanGesture);
    67     grabGesture(Qt::TapGesture);
    72     grabGesture(Qt::TapGesture);
    72 {
    77 {
    73     FUNC_LOG;
    78     FUNC_LOG;
    74 
    79 
    75     qDeleteAll(mItems);
    80     qDeleteAll(mItems);
    76     mItems.clear();
    81     mItems.clear();
    77     delete mMarkImage;
    82     delete mMarkImageOn;
       
    83     delete mMarkImageOff;
    78     delete mRenderer;
    84     delete mRenderer;
    79 }
    85 }
    80 
    86 
    81 void HgContainer::setItemCount(int itemCount)
    87 void HgContainer::setItemCount(int itemCount)
    82 {
    88 {
   190 
   196 
   191 void HgContainer::dimensions(qreal &screenSize, qreal &worldSize)
   197 void HgContainer::dimensions(qreal &screenSize, qreal &worldSize)
   192 {
   198 {
   193     const QRectF containerRect(rect());
   199     const QRectF containerRect(rect());
   194 
   200 
   195     // TODO, fix logic
   201     if (scrollDirection()== Qt::Vertical) {
   196     if (containerRect.height() > containerRect.width()) {
       
   197         // assume we are in portrait mode, ofcource this might not be the case
   202         // assume we are in portrait mode, ofcource this might not be the case
   198         screenSize = containerRect.height()/(mRenderer->getImageSize().height() + mRenderer->getSpacing().height());
   203         screenSize = containerRect.height()/(mRenderer->getImageSize().height() + mRenderer->getSpacing().height());
   199         worldSize = worldWidth();
   204         worldSize = worldWidth();
   200     }
   205     }
   201     else{
   206     else{
   212 }
   217 }
   213 
   218 
   214 void HgContainer::setOrientation(Qt::Orientation orientation, bool animate)
   219 void HgContainer::setOrientation(Qt::Orientation orientation, bool animate)
   215 {
   220 {
   216     FUNC_LOG;
   221     FUNC_LOG;
   217 
   222     
   218     mOrientation = orientation;
   223     mOrientation = orientation;
   219     mRenderer->setOrientation(orientation, false);
   224     mRenderer->setOrientation(orientation);
       
   225     mRenderer->setScrollDirection(orientation, animate);
       
   226     if (!mSpring.isActive() && mSpring.pos().x() > worldWidth())
       
   227         boundSpring();
       
   228 
   220 }
   229 }
   221 
   230 
   222 void HgContainer::scrollToPosition(qreal value, bool animate)
   231 void HgContainer::scrollToPosition(qreal value, bool animate)
   223 {
   232 {
   224     FUNC_LOG;
   233     FUNC_LOG;
   241 
   250 
   242 void HgContainer::scrollTo(const QModelIndex &index)
   251 void HgContainer::scrollTo(const QModelIndex &index)
   243 {
   252 {
   244     FUNC_LOG;
   253     FUNC_LOG;
   245 
   254 
   246     if (index.isValid() && mRenderer->getRowCount() > 0) {
   255     if (index.isValid() && mRenderer->getRowCount() > 0 ) {
   247         scrollToPosition(QPointF(index.row()/mRenderer->getRowCount(), 0), false);
   256     
       
   257         QRectF containerRect(rect());
       
   258         if (containerRect.isNull()) {
       
   259             // Container hasn't been resized yet. We need to know the container
       
   260             // size before we can calculate if index we are scrolling to is valid.
       
   261             // Store scrollTo index and scrolling is performed when container is resized.
       
   262             mDelayedScrollToIndex = index;
       
   263         }
       
   264         
       
   265         // Container has some size. We can try to calculate if scrollto index is valid.
       
   266         // ScrollTo index will be the top item in grid and left item on coverflow.
       
   267         
       
   268         if (!mRenderer->coverflowModeEnabled()) {
       
   269             // Grid case
       
   270             int itemsOnScreen = 0;
       
   271             if (scrollDirection()== Qt::Vertical) {
       
   272                 const int rowHeight = mRenderer->getImageSize().height() + mRenderer->getSpacing().height();
       
   273                 itemsOnScreen = containerRect.height()/rowHeight;
       
   274                 if ((int)containerRect.height()%rowHeight) {
       
   275                     itemsOnScreen++;
       
   276                 }
       
   277                 itemsOnScreen *= rowCount();
       
   278                 if (itemsOnScreen + index.row() > mItems.count()) {
       
   279                     int newItem = mItems.count()-itemsOnScreen;
       
   280                     
       
   281                     if (mItems.count()%rowCount()) 
       
   282                         newItem += rowCount() - (mItems.count()%rowCount());
       
   283                     if (newItem < 0) 
       
   284                         newItem = 0;
       
   285                     
       
   286                     scrollToPosition(QPointF(newItem/mRenderer->getRowCount(),0), false);
       
   287                 } else {
       
   288                     scrollToPosition(QPointF(index.row()/mRenderer->getRowCount(), 0), false);
       
   289                 }
       
   290             } else {
       
   291                 // Scrolldirection is horizontal
       
   292                 const int rowWidth = mRenderer->getImageSize().width() + mRenderer->getSpacing().width();
       
   293                 itemsOnScreen = containerRect.width()/rowWidth;
       
   294                 if ((int)containerRect.height()%rowWidth) {
       
   295                     itemsOnScreen++;
       
   296                 }
       
   297                 itemsOnScreen *= rowCount();
       
   298                 if (itemsOnScreen + index.row() > mItems.count()) {
       
   299                     int newItem = mItems.count()-itemsOnScreen;
       
   300 
       
   301                     if (mItems.count()%rowCount()) 
       
   302                         newItem += rowCount() - (mItems.count()%rowCount());
       
   303                     if (newItem < 0) newItem = 0;
       
   304                     
       
   305                     scrollToPosition(QPointF(newItem/mRenderer->getRowCount(),0), false);
       
   306                 } else {
       
   307                     scrollToPosition(QPointF(index.row()/mRenderer->getRowCount(), 0), false);
       
   308                 }
       
   309             }
       
   310             updateBySpringPosition();            
       
   311         } else {
       
   312             // Coverflow case. TODO, this will need some finetuning.
       
   313             scrollToPosition(QPointF(index.row()/mRenderer->getRowCount(), 0), false);
       
   314             updateBySpringPosition();            
       
   315         }                    
   248     }
   316     }
   249 }
   317 }
   250 
   318 
   251 void HgContainer::itemDataChanged(const QModelIndex &firstIndex, const QModelIndex &lastIndex)
   319 void HgContainer::itemDataChanged(const QModelIndex &firstIndex, const QModelIndex &lastIndex)
   252 {
   320 {
   325 }
   393 }
   326 
   394 
   327 int HgContainer::flags(int index) const
   395 int HgContainer::flags(int index) const
   328 {
   396 {
   329     if (index >= 0 && index < itemCount()) {
   397     if (index >= 0 && index < itemCount()) {
   330         if (mSelectionModel && mSelectionModel->isSelected(mSelectionModel->model()->index(index, 0))) {
   398         if (mSelectionMode != HgWidget::NoSelection) {
   331             return 1; // TODO: Assign flag to mark indicator
   399             // TODO, fix these returns values when we can use the checkbox indicators.
       
   400             if (mSelectionModel && mSelectionModel->isSelected(mSelectionModel->model()->index(index, 0))) {
       
   401                 return 1; // TODO: Assign flag to mark indicator
       
   402             } else
       
   403                 return 0;        
   332         }
   404         }
   333     }
   405     }
   334     return 0;
   406     return 0;
   335 }
   407 }
   336 
   408 
   337 const HgImage *HgContainer::indicator(int flags) const
   409 const HgImage *HgContainer::indicator(int flags) const
   338 {
   410 {
   339     if (flags & 1) {
   411     if (flags & 1) {
   340         return mMarkImage;
   412         return mMarkImageOn;
       
   413     }
       
   414     else if (flags & 2) {
       
   415         return mMarkImageOff;
   341     }
   416     }
   342 
   417 
   343     return 0;
   418     return 0;
   344 }
   419 }
   345 
   420 
   361 
   436 
   362 void HgContainer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
   437 void HgContainer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
   363 {
   438 {
   364     Q_UNUSED(option)
   439     Q_UNUSED(option)
   365     Q_UNUSED(widget)
   440     Q_UNUSED(widget)
       
   441     
       
   442     // update spring position at paint if needed, 
       
   443     // this is hack for scrollbar, since dragging it 
       
   444     // causes also paint events in here
   366     if (mSpring.updatePositionIfNeeded())
   445     if (mSpring.updatePositionIfNeeded())
   367     {
   446     {
   368         // spring works always in one dimension, that is, x coord.
       
   369         qreal pos = mSpring.pos().x();
   447         qreal pos = mSpring.pos().x();
   370         onScrollPositionChanged(pos);
   448         onScrollPositionChanged(pos);
   371         emit scrollPositionChanged(pos, true);        
   449         emit scrollPositionChanged(pos, true);        
   372     }
   450     }
   373 
   451     
   374     QRectF vp = painter->viewport();
   452     QPainter::RenderHints hints = painter->renderHints();
   375     QRectF rts = mapRectToScene(drawableRect());
   453     painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
   376     QRectF r;
   454     
   377 
       
   378     // transform rectangle to vg space &
       
   379     // rotate rendering according to orientation
       
   380     if (mOrientation == Qt::Horizontal) {
       
   381         r = QRectF(vp.width()-(rts.height()+rts.top()), rts.left(), rts.height(), rts.width());
       
   382 
       
   383         mRenderer->setRect(r);
       
   384 
       
   385         mRenderer->setCameraRotationZ(-90);
       
   386     }
       
   387     else {
       
   388         r = QRectF(rts.left(), vp.height()-(rts.height()+rts.top()), rts.width(), rts.height());
       
   389         mRenderer->setCameraRotationZ(0);
       
   390 
       
   391         mRenderer->setRect(r);
       
   392         
       
   393         if (!mSpring.isActive() && mSpring.pos().x() > worldWidth())
       
   394             boundSpring();
       
   395     }
       
   396 
   455 
   397     // interpolate spring velocity towards zero, this is done
   456     // interpolate spring velocity towards zero, this is done
   398     // so that spring velocity for rendering doesn't drop directly to
   457     // so that spring velocity for rendering doesn't drop directly to
   399     // zero when dragging starts
   458     // zero when dragging starts
   400     qreal springVel = mSpring.velocity().x();
   459     qreal springVel = mSpring.velocity().x();
   406 
   465 
   407     // setup rendering and draw the current view
   466     // setup rendering and draw the current view
   408     mRenderer->setCameraDistance(getCameraDistance(springVel));
   467     mRenderer->setCameraDistance(getCameraDistance(springVel));
   409     mRenderer->setCameraRotationY(getCameraRotationY(springVel));
   468     mRenderer->setCameraRotationY(getCameraRotationY(springVel));
   410     mRenderer->draw(mSpring.startPos(), mSpring.pos(), mSpring.endPos(),
   469     mRenderer->draw(mSpring.startPos(), mSpring.pos(), mSpring.endPos(),
   411                     springVel, painter);
   470                     springVel, painter, sceneTransform(), rect());
   412 
   471 
       
   472     painter->setRenderHint(QPainter::SmoothPixmapTransform, false);
   413 }
   473 }
   414 
   474 
   415 void HgContainer::resizeEvent(QGraphicsSceneResizeEvent *event)
   475 void HgContainer::resizeEvent(QGraphicsSceneResizeEvent *event)
   416 {
   476 {
   417     FUNC_LOG;
   477     FUNC_LOG;
   418 
   478 
   419     HbWidget::resizeEvent(event);
   479     HbWidget::resizeEvent(event);
       
   480 
       
   481     if (mDelayedScrollToIndex.isValid()) {
       
   482         scrollTo(mDelayedScrollToIndex);
       
   483         // set scrollto index to invalid value.
       
   484         mDelayedScrollToIndex = QModelIndex();
       
   485     }
   420 }
   486 }
   421 
   487 
   422 // this needs to be implemented for gesture framework to work
   488 // this needs to be implemented for gesture framework to work
   423 void HgContainer::mousePressEvent(QGraphicsSceneMouseEvent *event)
   489 void HgContainer::mousePressEvent(QGraphicsSceneMouseEvent *event)
   424 {
   490 {
   425     Q_UNUSED(event);
   491     Q_UNUSED(event);
       
   492     if (mSpring.isActive() && !mRenderer->coverflowModeEnabled()) {
       
   493         // We could do some small animation when scrolling is stopped.
       
   494         mSpring.cancel();
       
   495         update();
       
   496         mIgnoreTap = true;
       
   497     } else {
       
   498         mIgnoreTap = false;
       
   499     }
   426 }
   500 }
   427 
   501 
   428 void HgContainer::gestureEvent(QGestureEvent *event)
   502 void HgContainer::gestureEvent(QGestureEvent *event)
   429 {
   503 {
   430     FUNC_LOG;
   504     FUNC_LOG;
   472 
   546 
   473     QImage markImage(":/images/mark.svg");
   547     QImage markImage(":/images/mark.svg");
   474     if (markImage.isNull()) {
   548     if (markImage.isNull()) {
   475         ERROR("Failed to load :/images/mark.svg");
   549         ERROR("Failed to load :/images/mark.svg");
   476     }
   550     }
   477     mMarkImage = mQuadRenderer->createNativeImage();
   551     mMarkImageOn = mQuadRenderer->createNativeImage();
   478     HANDLE_ERROR_NULL(mMarkImage);
   552     HANDLE_ERROR_NULL(mMarkImageOn);
   479     if (mMarkImage) {
   553     if (mMarkImageOn) {
   480         mMarkImage->setImage(markImage);
   554         mMarkImageOn->setImage(markImage);
   481     }
   555     }
   482     
   556     
       
   557 /*    mMarkImageOn = mQuadRenderer->createNativeImage();
       
   558     HANDLE_ERROR_NULL(mMarkImageOn);
       
   559     mMarkImageOff = mQuadRenderer->createNativeImage();
       
   560     HANDLE_ERROR_NULL(mMarkImageOff);
       
   561     
       
   562     // Fetch icons for marking mode (on and off states).
       
   563     QGraphicsItem* checkBox = style()->createPrimitive(HbStyle::P_CheckBox_icon, this); 
       
   564     HbIconItem* iconItem = static_cast<HbIconItem*>(checkBox);    
       
   565     HbStyleOptionCheckBox checkBoxOption;
       
   566     checkBoxOption.state = QStyle::State_On;
       
   567     style()->updatePrimitive(iconItem, HbStyle::P_CheckBox_icon, &checkBoxOption);
       
   568     
       
   569     if (mMarkImageOn) {
       
   570         mMarkImageOn->setPixmap(iconItem->icon().pixmap());
       
   571     }
       
   572 
       
   573     checkBoxOption.state = QStyle::State_Off;
       
   574     style()->updatePrimitive(iconItem, HbStyle::P_CheckBox_icon, &checkBoxOption);
       
   575     if (mMarkImageOff) {
       
   576         mMarkImageOff->setPixmap(iconItem->icon().pixmap());
       
   577     }
       
   578 
       
   579     delete checkBox;
       
   580 */    
   483     connect(&mSpring, SIGNAL(updated()), SLOT(updateBySpringPosition()));
   581     connect(&mSpring, SIGNAL(updated()), SLOT(updateBySpringPosition()));
       
   582     connect(&mSpring, SIGNAL(started()), SIGNAL(scrollingStarted()));
       
   583     connect(&mSpring, SIGNAL(started()), SLOT(onScrollingStarted()));
   484     connect(&mSpring, SIGNAL(ended()), SIGNAL(scrollingEnded()));
   584     connect(&mSpring, SIGNAL(ended()), SIGNAL(scrollingEnded()));
   485     connect(&mSpring, SIGNAL(started()), SIGNAL(scrollingStarted()));
   585     connect(&mSpring, SIGNAL(ended()), SLOT(onScrollingEnded()));
   486     connect(mRenderer, SIGNAL(renderingNeeded()), SLOT(redraw()));
   586     connect(mRenderer, SIGNAL(renderingNeeded()), SLOT(redraw()));
   487 
   587 
   488 }
   588 }
   489 
   589 
   490 qreal HgContainer::worldWidth() const
   590 qreal HgContainer::worldWidth() const
   531 
   631 
   532     qreal pos = mSpring.pos().x();
   632     qreal pos = mSpring.pos().x();
   533     qreal delta(0);
   633     qreal delta(0);
   534     qreal itemSide(0);
   634     qreal itemSide(0);
   535 
   635 
   536     if (mOrientation == mRenderer->getOrientation()) {
   636     if (mOrientation == mRenderer->getScrollDirection()) {
   537         delta = gesture->delta().y();
   637         delta = gesture->delta().y();
   538     }
   638     }
   539     else {
   639     else {
   540         delta = gesture->delta().x();
   640         delta = gesture->delta().x();
   541     }
   641     }
   542 
   642 
   543     if (mRenderer->getOrientation() == Qt::Vertical)
   643     if (mRenderer->getScrollDirection() == Qt::Vertical)
   544         itemSide = mRenderer->getImageSize().height()+mRenderer->getSpacing().height();
   644         itemSide = mRenderer->getImageSize().height()+mRenderer->getSpacing().height();
   545     else
   645     else
   546         itemSide = mRenderer->getImageSize().width()+mRenderer->getSpacing().width();
   646         itemSide = mRenderer->getImageSize().width()+mRenderer->getSpacing().width();
   547 
   647 
   548     if (gesture->state() == Qt::GestureStarted) {
   648     if (gesture->state() == Qt::GestureStarted) {
   652     FUNC_LOG;
   752     FUNC_LOG;
   653 
   753 
   654     // If there is content, mSelectionModel must always exist - either default or client-provided
   754     // If there is content, mSelectionModel must always exist - either default or client-provided
   655     if (!mSelectionModel) return false;
   755     if (!mSelectionModel) return false;
   656 
   756 
   657     mHitItem = getItemAt(pos, mHitItemIndex);
   757     int index = -1;
       
   758     mHitItem = getItemAt(pos, index);
   658     if (mHitItem)
   759     if (mHitItem)
   659     {
   760     {
   660         int index = mHitItemIndex;
       
   661 
       
   662         HgWidgetItem* item = itemByIndex(index);
   761         HgWidgetItem* item = itemByIndex(index);
   663         if (item && action != DoubleTap) {
   762         if (item && action != DoubleTap) {
   664             if (action == LongTap) {
   763             if (action == LongTap) {
   665                 INFO("Long tap:" << item->modelIndex().row());
   764                 INFO("Long tap:" << item->modelIndex().row());
       
   765                 
   666                 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current);
   766                 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current);
   667 
   767                 
   668                 if (!mRenderer->coverflowModeEnabled())
   768                 if (!mRenderer->coverflowModeEnabled())
   669                     selectItem();
   769                     selectItem(index);
   670 
   770                 
   671                 emit longPressed(item->modelIndex(), pos);
   771                 emit longPressed(item->modelIndex(), pos);
   672             }
   772             }
   673             else if (mSelectionMode == HgWidget::MultiSelection) {
   773             else if (mSelectionMode == HgWidget::MultiSelection) {
   674                 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current);
   774                 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current);
   675                 INFO("Select:" << item->modelIndex().row());
   775                 INFO("Select:" << item->modelIndex().row());
   703                 update(); // It would be enough to update the item
   803                 update(); // It would be enough to update the item
   704             }
   804             }
   705             else {
   805             else {
   706                 INFO("Tap:" << item->modelIndex().row());
   806                 INFO("Tap:" << item->modelIndex().row());
   707 
   807 
   708                 if (mRenderer->coverflowModeEnabled())
   808                 if (mRenderer->coverflowModeEnabled()) {  //coverflow and t-bone modes  
   709                 {
       
   710                     if (qAbs(qreal(index) - mSpring.pos().x()) < 0.01f)
   809                     if (qAbs(qreal(index) - mSpring.pos().x()) < 0.01f)
   711                     {
   810                     {
   712                         mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current);
   811                         mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current);
   713                         emit activated(item->modelIndex());
   812                         emit activated(item->modelIndex());
   714                     }
   813                     }
   715                     else
   814                     else
   716                     {
   815                     {
   717                         mSpring.animateToPos(QPointF(index, 0));
   816                         mSpring.animateToPos(QPointF(index, 0));
   718                     }
   817                     }
   719                 }
   818                 }
   720                 else
   819                 else {   //grid mode
   721                 {
   820                     if (!mIgnoreTap) {
   722                     mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current);
   821                         mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current);
   723                     selectItem();
   822                         selectItem(index);
   724                     emit activated(item->modelIndex());
   823                         emit activated(item->modelIndex());                        
       
   824                     }
   725                 }
   825                 }
   726             }
   826             }
   727         }
   827         }
   728 
   828 
   729         return true;
   829         return true;
   736     }
   836     }
   737 }
   837 }
   738 
   838 
   739 bool HgContainer::getItemPoints(int index, QPolygonF& points)
   839 bool HgContainer::getItemPoints(int index, QPolygonF& points)
   740 {
   840 {
   741     QPolygonF poly;
   841     return mRenderer->getItemPoints(index, points);
   742     if (!mRenderer->getItemPoints(index, poly))
       
   743         return false;
       
   744 
       
   745     bool invertible;
       
   746     QTransform t = qtToVgTransform().inverted(&invertible);
       
   747 
       
   748     points = t.map(poly);
       
   749     return true;
       
   750 }
   842 }
   751 
   843 
   752 QList<QModelIndex> HgContainer::getVisibleItemIndices() const
   844 QList<QModelIndex> HgContainer::getVisibleItemIndices() const
   753 {
   845 {
   754     QList<HgQuad*> quads = mRenderer->getVisibleQuads();
   846     QList<HgQuad*> quads = mRenderer->getVisibleQuads();
   764 
   856 
   765 void HgContainer::itemDataChanged(const int &firstIndex, const int &lastIndex)
   857 void HgContainer::itemDataChanged(const int &firstIndex, const int &lastIndex)
   766 {
   858 {
   767     FUNC_LOG;
   859     FUNC_LOG;
   768 
   860 
   769     // if screen is frequently updated no need to update now.
       
   770     if (mSpring.isActive() || mDragged ) return;
       
   771     
       
   772     // TODO FIX THIS FUNCTION!!!!!!!!!!!!!!!!!!!!!!
       
   773 
       
   774     int firstItemOnScreen = 0, lastItemOnScreen = 0;
   861     int firstItemOnScreen = 0, lastItemOnScreen = 0;
   775     firstItemOnScreen = mSpring.pos().x();
   862     firstItemOnScreen = mSpring.pos().x();
   776     firstItemOnScreen *= rowCount();
   863     firstItemOnScreen *= rowCount();
   777 
   864 
   778     int itemsOnScreen = mRenderer->getVisibleQuads().count();
   865     int itemsOnScreen = mRenderer->getVisibleQuads().count();
   782         (lastIndex >= firstItemOnScreen && lastIndex < lastItemOnScreen)) {
   869         (lastIndex >= firstItemOnScreen && lastIndex < lastItemOnScreen)) {
   783         update();
   870         update();
   784     }
   871     }
   785 }
   872 }
   786 
   873 
   787 void HgContainer::selectItem()
   874 void HgContainer::selectItem(int index)
   788 {
   875 {
   789     // TODO: replace this with own selection implementation
   876     // TODO: replace this with own selection implementation
   790     if (mHitItemIndex < 0 && mHitItemIndex >= mItems.count())
   877 /*    if (index < 0 && index >= mItems.count())
   791         return;
   878         return;
       
   879     
       
   880     mHitItemIndex = index;
   792     
   881     
   793     if (mHitItemView)
   882     if (mHitItemView)
   794     {
   883     {
   795         delete mHitItemView;
   884         delete mHitItemView;
   796         mHitItemView = NULL;
   885         mHitItemView = NULL;
   816     iconItem->setAspectRatioMode(Qt::IgnoreAspectRatio);    
   905     iconItem->setAspectRatioMode(Qt::IgnoreAspectRatio);    
   817     iconItem->setIcon(icon);
   906     iconItem->setIcon(icon);
   818 
   907 
   819     mHitItemView->resize(mRenderer->getImageSize().width(),
   908     mHitItemView->resize(mRenderer->getImageSize().width(),
   820         mRenderer->getImageSize().height());
   909         mRenderer->getImageSize().height());
       
   910         */
   821 }
   911 }
   822 
   912 
   823 void HgContainer::updateSelectedItem()
   913 void HgContainer::updateSelectedItem()
   824 {
   914 {
   825     if (!mHitItemView || mHitItemIndex == -1)
   915     if (!mHitItemView || mHitItemIndex == -1)
   827 
   917 
   828     QPolygonF points;
   918     QPolygonF points;
   829     if (!getItemPoints(mHitItemIndex, points))
   919     if (!getItemPoints(mHitItemIndex, points))
   830     {
   920     {
   831         // the item was not rendered, we must hide
   921         // the item was not rendered, we must hide
   832         // our qt item
   922         // our qt item        
   833         mHitItemView->setVisible(false);
   923         mHitItemView->setVisible(false);
       
   924         return;
       
   925     }
       
   926     
       
   927     QRectF bounds = points.boundingRect();
       
   928     if (!(rect().contains(bounds) || rect().intersects(bounds)))
       
   929     {
       
   930         mHitItemView->setVisible(false);
       
   931         return;
   834     }
   932     }
   835 
   933 
   836     QPolygonF img;
   934     QPolygonF img;
   837     img.append(QPointF(3,mHitItemView->boundingRect().height()-3));
   935     img.append(QPointF(3,mHitItemView->boundingRect().height()-3));
   838     img.append(QPointF(mHitItemView->boundingRect().width()-3,mHitItemView->boundingRect().height()-3));
   936     img.append(QPointF(mHitItemView->boundingRect().width()-3,mHitItemView->boundingRect().height()-3));
   840     img.append(QPointF(3,3));
   938     img.append(QPointF(3,3));
   841 
   939 
   842     QTransform t;
   940     QTransform t;
   843     QTransform::quadToQuad(img, points, t);
   941     QTransform::quadToQuad(img, points, t);
   844 
   942 
   845     mHitItemView->setTransform(t);
   943     //t.translate(50,50);
       
   944     bool bOk;
       
   945     mHitItemView->setTransform(t * this->transform().inverted(&bOk));
   846     mHitItemView->setVisible(true);
   946     mHitItemView->setVisible(true);
   847 }
   947 }
   848 
   948 
   849 void HgContainer::unselectItem()
   949 void HgContainer::unselectItem()
   850 {
   950 {
   881     return false;
   981     return false;
   882 }
   982 }
   883 
   983 
   884 HgWidgetItem* HgContainer::getItemAt(const QPointF& pos, int& index)
   984 HgWidgetItem* HgContainer::getItemAt(const QPointF& pos, int& index)
   885 {
   985 {
   886     QPointF p = mapQtToVg(pos);
   986     HgQuad* quad = mRenderer->getQuadAt(pos);
   887     HgQuad* quad = mRenderer->getQuadAt(p);
       
   888     if (quad)
   987     if (quad)
   889     {
   988     {
   890         bool ok;
   989         bool ok;
   891         index = quad->userData().toInt(&ok);
   990         index = quad->userData().toInt(&ok);
   892 
   991 
   922     if (mLongPressTimer && mLongPressVisualizer)
  1021     if (mLongPressTimer && mLongPressVisualizer)
   923     {
  1022     {
   924         mLongPressTimer->stop();
  1023         mLongPressTimer->stop();
   925         mLongPressVisualizer->stop();
  1024         mLongPressVisualizer->stop();
   926     }
  1025     }
   927 }
       
   928 
       
   929 QTransform HgContainer::qtToVgTransform() const
       
   930 {
       
   931     QTransform t;
       
   932     if (mOrientation == Qt::Vertical)
       
   933     {
       
   934         t.translate(0, drawableRect().bottom());
       
   935         t.scale(1, -1);
       
   936     }
       
   937     else // horizontal
       
   938     {
       
   939         t.translate(drawableRect().bottom(), 0);
       
   940         t.scale(-1, 1);
       
   941         t.translate(0, drawableRect().right());
       
   942         t.rotate(-90, Qt::ZAxis);
       
   943     }
       
   944     return t;
       
   945 }
       
   946 
       
   947 QPointF HgContainer::mapQtToVg(const QPointF& p) const
       
   948 {
       
   949     QTransform t = qtToVgTransform();
       
   950     return t.map(p);
       
   951 }
  1026 }
   952 
  1027 
   953 qreal HgContainer::getCameraDistance(qreal springVelocity)
  1028 qreal HgContainer::getCameraDistance(qreal springVelocity)
   954 {
  1029 {
   955     Q_UNUSED(springVelocity)
  1030     Q_UNUSED(springVelocity)
   979 void HgContainer::onScrollPositionChanged(qreal pos)
  1054 void HgContainer::onScrollPositionChanged(qreal pos)
   980 {
  1055 {
   981     Q_UNUSED(pos)
  1056     Q_UNUSED(pos)
   982 }
  1057 }
   983 
  1058 
       
  1059 void HgContainer::onScrollingStarted()
       
  1060 {
       
  1061     // By default do nothing
       
  1062 }
       
  1063 
       
  1064 void HgContainer::onScrollingEnded()
       
  1065 {
       
  1066     // By default do nothing
       
  1067 }
       
  1068 
   984 void HgContainer::handleCurrentChanged(const QModelIndex &current)
  1069 void HgContainer::handleCurrentChanged(const QModelIndex &current)
   985 {
  1070 {
   986     Q_UNUSED(current)
  1071     Q_UNUSED(current)
   987     // By default do nothing
  1072     // By default do nothing
   988 }
       
   989 
       
   990 QRectF HgContainer::drawableRect() const
       
   991 {
       
   992     return rect();
       
   993 }
  1073 }
   994 
  1074 
   995 void HgContainer::setDefaultImage(QImage defaultImage)
  1075 void HgContainer::setDefaultImage(QImage defaultImage)
   996 {
  1076 {
   997     HgQuadRenderer *renderer = mRenderer->getRenderer();
  1077     HgQuadRenderer *renderer = mRenderer->getRenderer();
  1057     return mUserItemSpacing;
  1137     return mUserItemSpacing;
  1058 }
  1138 }
  1059 
  1139 
  1060 Qt::Orientation HgContainer::scrollDirection() const
  1140 Qt::Orientation HgContainer::scrollDirection() const
  1061 {
  1141 {
  1062     return mRenderer->getOrientation();
  1142     return mRenderer->getScrollDirection();
  1063 }
  1143 }
  1064 
  1144 
  1065 qreal HgContainer::scrollPosition() const
  1145 qreal HgContainer::scrollPosition() const
  1066 {
  1146 {
  1067     return mSpring.pos().x();
  1147     return mSpring.pos().x();