From 29dfcc0d7d552fcc73936f1b7d5bd266ca23ee34 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 10 Oct 2017 17:06:56 +1000 Subject: [PATCH] Avoid temporary no-selection state when selecting a new item in layouts using mouse interactions --- src/gui/layout/qgslayoutviewtoolselect.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/gui/layout/qgslayoutviewtoolselect.cpp b/src/gui/layout/qgslayoutviewtoolselect.cpp index e6c845acea1..f1ac9503570 100644 --- a/src/gui/layout/qgslayoutviewtoolselect.cpp +++ b/src/gui/layout/qgslayoutviewtoolselect.cpp @@ -62,11 +62,12 @@ void QgsLayoutViewToolSelect::layoutPressEvent( QgsLayoutViewMouseEvent *event ) QgsLayoutItem *selectedItem = nullptr; QgsLayoutItem *previousSelectedItem = nullptr; + QList selectedItems = layout()->selectedLayoutItems(); + if ( event->modifiers() & Qt::ControlModifier ) { //CTRL modifier, so we are trying to select the next item below the current one //first, find currently selected item - QList selectedItems = layout()->selectedLayoutItems(); if ( !selectedItems.isEmpty() ) { previousSelectedItem = selectedItems.at( 0 ); @@ -100,12 +101,6 @@ void QgsLayoutViewToolSelect::layoutPressEvent( QgsLayoutViewMouseEvent *event ) return; } - if ( ( !selectedItem->isSelected() ) && //keep selection if an already selected item pressed - !( event->modifiers() & Qt::ShiftModifier ) ) //keep selection if shift key pressed - { - layout()->deselectAll(); - } - if ( ( event->modifiers() & Qt::ShiftModifier ) && ( selectedItem->isSelected() ) ) { //SHIFT-clicking a selected item deselects it @@ -120,7 +115,15 @@ void QgsLayoutViewToolSelect::layoutPressEvent( QgsLayoutViewMouseEvent *event ) } else { - selectedItem->setSelected( true ); + if ( ( !selectedItem->isSelected() ) && //keep selection if an already selected item pressed + !( event->modifiers() & Qt::ShiftModifier ) ) //keep selection if shift key pressed + { + layout()->setSelectedItem( selectedItem ); // clears existing selection + } + else + { + selectedItem->setSelected( true ); + } event->ignore(); emit itemFocused( selectedItem ); }