src/hbwidgets/itemviews/hblistview_p.cpp
branchGCC_SURGE
changeset 15 f378acbc9cfb
parent 6 c3690ec91ef8
child 21 4633027730f5
child 34 ed14f46c0e55
--- a/src/hbwidgets/itemviews/hblistview_p.cpp	Thu Jul 15 14:03:49 2010 +0100
+++ b/src/hbwidgets/itemviews/hblistview_p.cpp	Thu Jul 22 16:36:53 2010 +0100
@@ -25,9 +25,11 @@
     
 #include "hblistview_p.h"
 #include "hblistview.h"
+#include "hbscrollbar.h"
 
 #include "hblistviewitem.h"
 #include "hbabstractitemcontainer_p.h"
+#include "hblistitemcontainer_p.h"
 #include <hbwidgetfeedback.h>
 #include "hbmodeliterator.h"
 #include <hbpangesture.h>
@@ -52,7 +54,8 @@
     mMousePressPos(),
     mScrollStartMousePos(),
     mLastScrollPos(),
-    mOriginalTransform()
+    mOriginalTransform(),
+    mMoveOngoing(false)
 {
 }
 
@@ -121,8 +124,16 @@
             //mDraggedItem->setPressed(false, false);
 
             int targetRow = targetIndex.row();
+            int startRow = qMin(targetRow, mDraggedItemIndex.row());
+            int endRow = qMax(targetRow, mDraggedItemIndex.row());
+            int containerStartIndex = mContainer->items().at(0)->modelIndex().row();
+            mMoveOngoing = true;
             q->move(mDraggedItemIndex, targetIndex);
-
+            static_cast <HbListItemContainer*>(mContainer)->setItemModelIndexes(startRow - containerStartIndex,
+                                                                                startRow,
+                                                                                endRow - startRow);
+            mMoveOngoing = false;
+           
             // in the swap the dragged item may have been deleted and recreated. So take it again here
             mDraggedItemIndex = mModelIterator->index(targetRow);
             if (mDraggedItemIndex.isValid()) {
@@ -165,10 +176,13 @@
                     mDraggedItemIndex = mDraggedItem->modelIndex();
 
                     if (mDraggedItemIndex.isValid()) {
+                        HbEffect::cancel(mDraggedItem, QString(), true);
                         mMousePressTimer.restart();
                         mMousePressPos = scenePos;
                         mOriginalTransform = mDraggedItem->transform();
                         mDraggedItem->setZValue(mDraggedItem->zValue() + 1);
+                        mDraggedItem->translate(0, event->mapToGraphicsScene(gesture->offset()).y() -
+                                               event->mapToGraphicsScene(gesture->lastOffset()).y());
 
                         QObject::connect(q, SIGNAL(scrollPositionChanged(QPointF)), q, SLOT(scrolling(QPointF)));    
                     } else {
@@ -185,8 +199,6 @@
 
                 if (!q->isScrolling()) {
                     // move the item with the cursor to indicate the move
-                    //qDebug() << "ScenePos: " << scenePos;
-                    //qDebug() << "Offset: " << event->mapToGraphicsScene(gesture->offset()).y() << " lastOffset: " <<  event->mapToGraphicsScene(gesture->lastOffset()).y();
                     mDraggedItem->translate(0, event->mapToGraphicsScene(gesture->offset()).y() -
                                                event->mapToGraphicsScene(gesture->lastOffset()).y());
 
@@ -207,8 +219,10 @@
                     QModelIndex firstItemIndex = mContainer->items().first()->modelIndex();
                     QModelIndex lastItemIndex = mContainer->items().last()->modelIndex();
                     // If the item is dragged up in the list (and there are more items to show), scroll up
-                    if (!q->isScrolling()
-                        && !q->isVisible(firstItemIndex)
+
+                    if (!mIsAnimating
+                        && !(visible(mContainer->itemByIndex(firstItemIndex), true) 
+                             && (firstItemIndex.row() == 0))
                         && scenePos.y() < mMousePressPos.y()
                         && pos.y() < q->itemByIndex(firstVisible)->size().height()) {
                         mScrollStartMousePos = scenePos;
@@ -216,8 +230,9 @@
                         animateScroll(QPointF(0.0f , DRAGGED_ITEM_SCROLL_SPEED));
                     }
                     // If the item is dragged down in the list (and there are more items to show), scroll down
-                    else if (!q->isScrolling()
-                               && !q->isVisible(lastItemIndex)
+                    else if (!mIsAnimating
+                               && !(visible(mContainer->itemByIndex(lastItemIndex), true) 
+                                    && (lastItemIndex.row() == mModelIterator->indexCount() - 1))
                                && scenePos.y() > mMousePressPos.y()
                                && pos.y() > (q->size().height() - q->itemByIndex(lastVisible)->size().height())) {
                         mScrollStartMousePos = scenePos;
@@ -274,12 +289,23 @@
     return HbAbstractItemViewPrivate::panTriggered(event);
 }
 
-bool HbListViewPrivate::animationEnabled(bool insertOperation)
+void HbListViewPrivate::arrangeModeSetup(bool newMode)
 {
-    if (mArrangeMode) {
-        return false;
+    Q_Q(HbListView);
+
+    if (newMode) {
+        mOriginalInteractiveScrollBar = q->verticalScrollBar()->isInteractive();
+        q->verticalScrollBar()->setInteractive(true);
+        mOriginalLongPressEnabled = q->longPressEnabled();
+        q->setLongPressEnabled(false);
+        mOriginalFriction = mFrictionEnabled;
+        q->setFrictionEnabled(false);
     } else {
-        return HbAbstractItemViewPrivate::animationEnabled(insertOperation);
+        q->verticalScrollBar()->setInteractive(mOriginalInteractiveScrollBar);
+        q->setLongPressEnabled(mOriginalLongPressEnabled);
+        q->setFrictionEnabled(mOriginalFriction);
     }
+
+    mArrangeMode = newMode;
+        
 }
-