mirror of
https://invent.kde.org/system/dolphin
synced 2024-11-05 18:47:12 +00:00
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:
parent
2f0ceedae0
commit
6a228cdbd9
2 changed files with 20 additions and 8 deletions
|
@ -38,7 +38,8 @@ KItemListController::KItemListController(QObject* parent) :
|
|||
m_model(0),
|
||||
m_view(0),
|
||||
m_selectionManager(new KItemListSelectionManager(this)),
|
||||
m_pressedIndex(-1)
|
||||
m_pressedIndex(-1),
|
||||
m_oldSelection()
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -294,6 +295,8 @@ bool KItemListController::mousePressEvent(QGraphicsSceneMouseEvent* event, const
|
|||
} else {
|
||||
startPos.rx() += m_view->offset();
|
||||
}
|
||||
|
||||
m_oldSelection = m_selectionManager->selectedItems();
|
||||
rubberBand->setStartPosition(startPos);
|
||||
rubberBand->setEndPosition(startPos);
|
||||
rubberBand->setActive(true);
|
||||
|
@ -338,6 +341,7 @@ bool KItemListController::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, con
|
|||
if (rubberBand->isActive()) {
|
||||
disconnect(rubberBand, SIGNAL(endPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandChanged()));
|
||||
rubberBand->setActive(false);
|
||||
m_oldSelection.clear();
|
||||
m_pressedIndex = -1;
|
||||
return false;
|
||||
}
|
||||
|
@ -577,14 +581,13 @@ void KItemListController::slotRubberBandChanged()
|
|||
rubberBandRect.translate(-m_view->offset(), 0);
|
||||
}
|
||||
|
||||
QSet<int> previousSelectedItems;
|
||||
if (m_selectionManager->hasSelection()) {
|
||||
// Don't clear the current selection in case if the user pressed the
|
||||
// Shift- or Control-key during the rubberband selection
|
||||
if (!m_oldSelection.isEmpty()) {
|
||||
// Clear the old selection that was available before the rubberband has
|
||||
// been activated in case if no Shift- or Control-key are pressed
|
||||
const bool shiftOrControlPressed = QApplication::keyboardModifiers() & Qt::ShiftModifier ||
|
||||
QApplication::keyboardModifiers() & Qt::ControlModifier;
|
||||
if (shiftOrControlPressed) {
|
||||
previousSelectedItems = m_selectionManager->selectedItems();
|
||||
if (!shiftOrControlPressed) {
|
||||
m_oldSelection.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -631,7 +634,7 @@ void KItemListController::slotRubberBandChanged()
|
|||
}
|
||||
} while (!selectionFinished);
|
||||
|
||||
m_selectionManager->setSelectedItems(selectedItems + previousSelectedItems);
|
||||
m_selectionManager->setSelectedItems(selectedItems + m_oldSelection);
|
||||
}
|
||||
|
||||
#include "kitemlistcontroller.moc"
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <libdolphin_export.h>
|
||||
|
||||
#include <QObject>
|
||||
#include <QSet>
|
||||
|
||||
class KItemModelBase;
|
||||
class KItemListSelectionManager;
|
||||
|
@ -134,6 +135,14 @@ private:
|
|||
KItemListView* m_view;
|
||||
KItemListSelectionManager* m_selectionManager;
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue