diff --git a/src/gui/UBThumbnailWidget.cpp b/src/gui/UBThumbnailWidget.cpp index cd0ebec3..96f448d9 100644 --- a/src/gui/UBThumbnailWidget.cpp +++ b/src/gui/UBThumbnailWidget.cpp @@ -33,6 +33,7 @@ UBThumbnailWidget::UBThumbnailWidget(QWidget* parent) , mLastSelectedThumbnail(0) , mSelectionSpan(0) , mLassoRectItem(0) + , mPrevLassoRect(QRect()) { // By default, the drag is possible bCanDrag = true; @@ -217,6 +218,7 @@ void UBThumbnailWidget::mousePressEvent(QMouseEvent *event) QStyleOption option; option.initFrom(&rubberBand); + mPrevLassoRect = QRect(); mLassoRectItem = new QGraphicsRectItem(0, scene()); #ifdef Q_WS_MAC @@ -248,6 +250,8 @@ void UBThumbnailWidget::mousePressEvent(QMouseEvent *event) } mSelectedThumbnailItems.clear(); + mPreviouslyIncrementalSelectedItemsX.clear(); + mPreviouslyIncrementalSelectedItemsY.clear(); QGraphicsView::mousePressEvent(event); } else if (Qt::ShiftModifier & event->modifiers()) @@ -305,6 +309,8 @@ void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event) QRectF lassoRect( qMin(mMousePressScenePos.x(), currentScenePos.x()), qMin(mMousePressScenePos.y(), currentScenePos.y()), qAbs(mMousePressScenePos.x() - currentScenePos.x()), qAbs(mMousePressScenePos.y() - currentScenePos.y())); + if (QPoint() == prevMoveMousePos) + prevMoveMousePos = currentScenePos; QRectF incrementXSelection( qMin(prevMoveMousePos.x(), currentScenePos.x()), qMin(mMousePressScenePos.y(), currentScenePos.y()), qAbs(prevMoveMousePos.x() - currentScenePos.x())+incrementLassoMinWidth, qAbs(mMousePressScenePos.y() - currentScenePos.y())); @@ -315,50 +321,83 @@ void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event) prevMoveMousePos = currentScenePos; mLassoRectItem->setRect(lassoRect); + QSet lassoSelectedThumbnailItems; - QSet incSelectedItems = scene()->items(incrementXSelection, Qt::IntersectsItemBoundingRect).toSet() - + scene()->items(incrementYSelection, Qt::IntersectsItemBoundingRect).toSet(); + QSet toUnset; + QSet toSet; - mPreviouslyIncrementalSelectedItems = incSelectedItems; - QSet lassoSelectedItems; - QSet lassoSelectedThumbnailItems; - foreach (QGraphicsItem *lassoSelectedItem, incSelectedItems) + // for horizontal moving + QSet incSelectedItemsX = scene()->items(incrementXSelection, Qt::IntersectsItemBoundingRect).toSet(); + foreach (QGraphicsItem *lassoSelectedItem, incSelectedItemsX) + { + if (lassoSelectedItem) + { + UBSceneThumbnailPixmap *thumbnailItem = dynamic_cast(lassoSelectedItem); + if (thumbnailItem) + lassoSelectedThumbnailItems += lassoSelectedItem; + } + } + + if(lassoRect.width() < mPrevLassoRect.width()) + { + if (!lassoSelectedThumbnailItems.contains(mPreviouslyIncrementalSelectedItemsX)) + toUnset += mPreviouslyIncrementalSelectedItemsX - lassoSelectedThumbnailItems; + + } + mPreviouslyIncrementalSelectedItemsX = lassoSelectedThumbnailItems; + + toSet += lassoSelectedThumbnailItems + mPreviouslyIncrementalSelectedItemsX; + + + lassoSelectedThumbnailItems.clear(); + + // for vertical moving + + QSet incSelectedItemsY = scene()->items(incrementYSelection, Qt::IntersectsItemBoundingRect).toSet(); + foreach (QGraphicsItem *lassoSelectedItem, incSelectedItemsY) { if (lassoSelectedItem) { UBSceneThumbnailPixmap *thumbnailItem = dynamic_cast(lassoSelectedItem); if (thumbnailItem) - { - lassoSelectedItem->setSelected(true); lassoSelectedThumbnailItems += lassoSelectedItem; - } } } - QSet toUnset; - toUnset = mSelectedThumbnailItems - lassoSelectedThumbnailItems; - foreach(QGraphicsItem* item, toUnset) + if(lassoRect.height() < mPrevLassoRect.height()) { - item->setSelected(false); + if (!lassoSelectedThumbnailItems.contains(mPreviouslyIncrementalSelectedItemsY)) + toUnset += mPreviouslyIncrementalSelectedItemsY - lassoSelectedThumbnailItems; + } + mPreviouslyIncrementalSelectedItemsY = lassoSelectedThumbnailItems; - - mSelectedThumbnailItems += lassoSelectedItems; - // foreach (QGraphicsItem *lassoSelectedItem, lassoSelectedThumbnailItems) + + toSet += lassoSelectedThumbnailItems + mPreviouslyIncrementalSelectedItemsY; + + + toSet -= toUnset; + + foreach (QGraphicsItem *item, toSet) { - + item->setSelected(true); + } + + foreach (QGraphicsItem *item, toUnset) + { + item->setSelected(false); } + + mSelectedThumbnailItems += lassoSelectedThumbnailItems; + mPrevLassoRect = lassoRect; + if (Qt::ControlModifier & event->modifiers()) { for (int i = 0; i < mSelectedThumbnailItems.count()-1; i++) { mSelectedThumbnailItems.values().at(i)->setSelected(true); } - // foreach (QGraphicsItem *selectedItem, mSelectedThumbnailItems) - { - // selectedItem->setSelected(true); - } } } else @@ -404,6 +443,7 @@ void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event) void UBThumbnailWidget::mouseReleaseEvent(QMouseEvent *event) { int elapsedTimeSincePress = mClickTime.elapsed(); + prevMoveMousePos = QPoint(); deleteLasso(); QGraphicsView::mouseReleaseEvent(event); diff --git a/src/gui/UBThumbnailWidget.h b/src/gui/UBThumbnailWidget.h index 2ad70c37..0429e370 100644 --- a/src/gui/UBThumbnailWidget.h +++ b/src/gui/UBThumbnailWidget.h @@ -113,9 +113,11 @@ class UBThumbnailWidget : public QGraphicsView UBThumbnail *mLastSelectedThumbnail; int mSelectionSpan; + QRectF mPrevLassoRect; QGraphicsRectItem *mLassoRectItem; QSet mSelectedThumbnailItems; - QSet mPreviouslyIncrementalSelectedItems; + QSet mPreviouslyIncrementalSelectedItemsX; + QSet mPreviouslyIncrementalSelectedItemsY; QTime mClickTime; };