Fix rubberband-issue in combination with Shift- and Control-key

The old selection must be remembered before starting the rubberband
selection, otherwise it would not be possible anymore to deselect
items that have been selected by the rubberband itself.
This commit is contained in:
Peter Penz 2011-08-20 23:26:07 +02:00
parent 2f0ceedae0
commit 6a228cdbd9
2 changed files with 20 additions and 8 deletions

View file

@ -38,7 +38,8 @@ KItemListController::KItemListController(QObject* parent) :
m_model(0), m_model(0),
m_view(0), m_view(0),
m_selectionManager(new KItemListSelectionManager(this)), m_selectionManager(new KItemListSelectionManager(this)),
m_pressedIndex(-1) m_pressedIndex(-1),
m_oldSelection()
{ {
} }
@ -294,6 +295,8 @@ bool KItemListController::mousePressEvent(QGraphicsSceneMouseEvent* event, const
} else { } else {
startPos.rx() += m_view->offset(); startPos.rx() += m_view->offset();
} }
m_oldSelection = m_selectionManager->selectedItems();
rubberBand->setStartPosition(startPos); rubberBand->setStartPosition(startPos);
rubberBand->setEndPosition(startPos); rubberBand->setEndPosition(startPos);
rubberBand->setActive(true); rubberBand->setActive(true);
@ -338,6 +341,7 @@ bool KItemListController::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, con
if (rubberBand->isActive()) { if (rubberBand->isActive()) {
disconnect(rubberBand, SIGNAL(endPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandChanged())); disconnect(rubberBand, SIGNAL(endPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandChanged()));
rubberBand->setActive(false); rubberBand->setActive(false);
m_oldSelection.clear();
m_pressedIndex = -1; m_pressedIndex = -1;
return false; return false;
} }
@ -577,14 +581,13 @@ void KItemListController::slotRubberBandChanged()
rubberBandRect.translate(-m_view->offset(), 0); rubberBandRect.translate(-m_view->offset(), 0);
} }
QSet<int> previousSelectedItems; if (!m_oldSelection.isEmpty()) {
if (m_selectionManager->hasSelection()) { // Clear the old selection that was available before the rubberband has
// Don't clear the current selection in case if the user pressed the // been activated in case if no Shift- or Control-key are pressed
// Shift- or Control-key during the rubberband selection
const bool shiftOrControlPressed = QApplication::keyboardModifiers() & Qt::ShiftModifier || const bool shiftOrControlPressed = QApplication::keyboardModifiers() & Qt::ShiftModifier ||
QApplication::keyboardModifiers() & Qt::ControlModifier; QApplication::keyboardModifiers() & Qt::ControlModifier;
if (shiftOrControlPressed) { if (!shiftOrControlPressed) {
previousSelectedItems = m_selectionManager->selectedItems(); m_oldSelection.clear();
} }
} }
@ -631,7 +634,7 @@ void KItemListController::slotRubberBandChanged()
} }
} while (!selectionFinished); } while (!selectionFinished);
m_selectionManager->setSelectedItems(selectedItems + previousSelectedItems); m_selectionManager->setSelectedItems(selectedItems + m_oldSelection);
} }
#include "kitemlistcontroller.moc" #include "kitemlistcontroller.moc"

View file

@ -26,6 +26,7 @@
#include <libdolphin_export.h> #include <libdolphin_export.h>
#include <QObject> #include <QObject>
#include <QSet>
class KItemModelBase; class KItemModelBase;
class KItemListSelectionManager; class KItemListSelectionManager;
@ -134,6 +135,14 @@ private:
KItemListView* m_view; KItemListView* m_view;
KItemListSelectionManager* m_selectionManager; KItemListSelectionManager* m_selectionManager;
int m_pressedIndex; int m_pressedIndex;
/**
* When starting a rubberband selection during a Shift- or Control-key has been
* pressed the current selection should never be deleted. To be able to restore
* the current selection it is remembered in m_oldSelection before
* rubberband gets activated.
*/
QSet<int> m_oldSelection;
}; };
#endif #endif