diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index fcaa5d4a2f..7cdfbc6fba 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -167,7 +167,7 @@ DolphinMainWindow::DolphinMainWindow() : m_actionHandler = new DolphinViewActionHandler(actionCollection(), m_actionTextHelper, this); connect(m_actionHandler, &DolphinViewActionHandler::actionBeingHandled, this, &DolphinMainWindow::clearStatusBar); connect(m_actionHandler, &DolphinViewActionHandler::createDirectoryTriggered, this, &DolphinMainWindow::createDirectory); - connect(m_actionHandler, &DolphinViewActionHandler::setSelectionMode, this, &DolphinMainWindow::slotSetSelectionMode); + connect(m_actionHandler, &DolphinViewActionHandler::selectionModeChangeTriggered, this, &DolphinMainWindow::slotSetSelectionMode); m_remoteEncoding = new DolphinRemoteEncoding(this, m_actionHandler); connect(this, &DolphinMainWindow::urlChanged, diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index c801d095d9..d69aa119f4 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -376,7 +376,7 @@ void DolphinViewContainer::disconnectUrlNavigator() void DolphinViewContainer::setSelectionModeEnabled(bool enabled, KActionCollection *actionCollection, SelectionMode::BottomBar::Contents bottomBarContents) { const bool wasEnabled = m_view->selectionMode(); - m_view->setSelectionMode(enabled); + m_view->setSelectionModeEnabled(enabled); if (!enabled) { Q_CHECK_PTR(m_selectionModeTopBar); // there is no point in disabling selectionMode when it wasn't even enabled once. @@ -396,7 +396,7 @@ void DolphinViewContainer::setSelectionModeEnabled(bool enabled, KActionCollecti }); m_selectionModeTopBar = new SelectionMode::TopBar(this); // will be created hidden - connect(m_selectionModeTopBar, &SelectionMode::TopBar::leaveSelectionModeRequested, this, [this]() { + connect(m_selectionModeTopBar, &SelectionMode::TopBar::selectionModeLeavingRequested, this, [this]() { setSelectionModeEnabled(false); }); m_topLayout->addWidget(m_selectionModeTopBar, positionFor.selectionModeTopBar, 0); @@ -410,7 +410,7 @@ void DolphinViewContainer::setSelectionModeEnabled(bool enabled, KActionCollecti connect(m_selectionModeBottomBar, &SelectionMode::BottomBar::error, this, [this](const QString &errorMessage) { showErrorMessage(errorMessage); }); - connect(m_selectionModeBottomBar, &SelectionMode::BottomBar::leaveSelectionModeRequested, this, [this]() { + connect(m_selectionModeBottomBar, &SelectionMode::BottomBar::selectionModeLeavingRequested, this, [this]() { setSelectionModeEnabled(false); }); m_topLayout->addWidget(m_selectionModeBottomBar, positionFor.selectionModeBottomBar, 0); diff --git a/src/dolphinviewcontainer.h b/src/dolphinviewcontainer.h index 9d5cec11f1..3ff5759703 100644 --- a/src/dolphinviewcontainer.h +++ b/src/dolphinviewcontainer.h @@ -137,7 +137,20 @@ public: */ void disconnectUrlNavigator(); + /** + * Sets a selection mode that is useful for quick and easy selecting or deselecting of files. + * This method is the central authority about enabling or disabling selection mode: + * All other classes that want to enable or disable selection mode should trigger a call of this method. + * + * This method sets the selection mode for the view of this viewContainer and sets the visibility of the + * selection mode top and bottom bar which also belong to this viewContainer. + * + * @param enabled Whether to enable or disable selection mode. + * @param actionCollection The collection of actions from which the actions on the bottom bar are retrieved. + * @param bottomBarContents The contents the bar is supposed to show after this call. + */ void setSelectionModeEnabled(bool enabled, KActionCollection *actionCollection = nullptr, SelectionMode::BottomBar::Contents bottomBarContents = SelectionMode::BottomBar::Contents::GeneralContents); + /** @see setSelectionModeEnabled() */ bool isSelectionModeEnabled() const; /** diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index cc58ed06c2..ce96cab6c9 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -77,7 +77,7 @@ KItemListController::KItemListController(KItemModelBase* model, KItemListView* v m_longPressDetectionTimer->setInterval(QGuiApplication::styleHints()->mousePressAndHoldInterval()); connect(m_longPressDetectionTimer, &QTimer::timeout, this, [this]() { if (!m_selectionMode) { - Q_EMIT selectionModeRequested(); + Q_EMIT selectionModeChangeRequested(true); } }); @@ -232,7 +232,7 @@ bool KItemListController::singleClickActivationEnforced() const return m_singleClickActivationEnforced; } -void KItemListController::setSelectionMode(bool enabled) +void KItemListController::setSelectionModeEnabled(bool enabled) { m_selectionMode = enabled; } @@ -430,6 +430,9 @@ bool KItemListController::keyPressEvent(QKeyEvent* event) } case Qt::Key_Escape: + if (m_selectionMode && m_selectionManager->selectedItems().count() < 1) { + Q_EMIT selectionModeChangeRequested(false); + } if (m_selectionBehavior != SingleSelection) { m_selectionManager->clearSelection(); } diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index a3d952de55..515511f863 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -126,7 +126,11 @@ public: void setSingleClickActivationEnforced(bool singleClick); bool singleClickActivationEnforced() const; - void setSelectionMode(bool enabled); + /** + * Setting the selection mode to enabled will make selecting and deselecting easier by acting + * kind of similar to when the Control Key is held down. + */ + void setSelectionModeEnabled(bool enabled); bool selectionMode() const; bool processEvent(QEvent* event, const QTransform& transform); @@ -213,12 +217,15 @@ Q_SIGNALS: void escapePressed(); /** - * Is emitted if left click is pressed down for a long time without moving the cursor too much. + * Used to request either entering or leaving of selection mode + * Leaving is requested by pressing Escape when no item is selected. + * + * Entering is requested if left click is pressed down for a long time without moving the cursor too much. * Moving the cursor would either trigger an item drag if the click was initiated on top of an item * or a selection rectangle if the click was not initiated on top of an item. * So long press is only emitted if there wasn't a lot of cursor movement. */ - void selectionModeRequested(); + void selectionModeChangeRequested(bool enabled); void modelChanged(KItemModelBase* current, KItemModelBase* previous); void viewChanged(KItemListView* current, KItemListView* previous); diff --git a/src/selectionmode/bottombar.cpp b/src/selectionmode/bottombar.cpp index 4ca184a6df..529384435c 100644 --- a/src/selectionmode/bottombar.cpp +++ b/src/selectionmode/bottombar.cpp @@ -52,7 +52,7 @@ BottomBar::BottomBar(KActionCollection *actionCollection, QWidget *parent) : } setVisibleInternal(visible, WithAnimation); }); - connect(m_contentsContainer, &BottomBarContentsContainer::leaveSelectionModeRequested, this, &BottomBar::leaveSelectionModeRequested); + connect(m_contentsContainer, &BottomBarContentsContainer::selectionModeLeavingRequested, this, &BottomBar::selectionModeLeavingRequested); BackgroundColorHelper::instance()->controlBackgroundColor(this); } @@ -114,7 +114,7 @@ void BottomBar::slotSplitTabDisabled() switch (contents()) { case CopyToOtherViewContents: case MoveToOtherViewContents: - Q_EMIT leaveSelectionModeRequested(); + Q_EMIT selectionModeLeavingRequested(); default: return; } diff --git a/src/selectionmode/bottombar.h b/src/selectionmode/bottombar.h index ab29a85a5b..8d33e5ac17 100644 --- a/src/selectionmode/bottombar.h +++ b/src/selectionmode/bottombar.h @@ -100,7 +100,7 @@ Q_SIGNALS: */ void error(const QString &errorMessage); - void leaveSelectionModeRequested(); + void selectionModeLeavingRequested(); protected: /** Is installed on an internal widget to make sure that the height of the bar is adjusted to its contents. */ diff --git a/src/selectionmode/bottombarcontentscontainer.cpp b/src/selectionmode/bottombarcontentscontainer.cpp index 2c924415ac..0358c6ded7 100644 --- a/src/selectionmode/bottombarcontentscontainer.cpp +++ b/src/selectionmode/bottombarcontentscontainer.cpp @@ -158,7 +158,7 @@ void BottomBarContentsContainer::addCopyContents() // i18n: Aborts the current step-by-step process to copy files by leaving the selection mode. auto *cancelButton = new QPushButton(i18nc("@action:button", "Abort Copying"), this); - connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::leaveSelectionModeRequested); + connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::selectionModeLeavingRequested); m_layout->addWidget(cancelButton); auto *copyButton = new QPushButton(this); @@ -176,7 +176,7 @@ void BottomBarContentsContainer::addCopyContents() resetContents(BottomBar::Contents::PasteContents); // resetContents() needs to be connected last because // it instantly deletes the button and then the other slots won't be called. } - Q_EMIT leaveSelectionModeRequested(); + Q_EMIT selectionModeLeavingRequested(); }); updateMainActionButton(KFileItemList()); m_layout->addWidget(copyButton); @@ -191,7 +191,7 @@ void BottomBarContentsContainer::addCopyLocationContents() // i18n: Aborts the current step-by-step process to copy the location of files by leaving the selection mode. auto *cancelButton = new QPushButton(i18nc("@action:button", "Abort Copying"), this); - connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::leaveSelectionModeRequested); + connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::selectionModeLeavingRequested); m_layout->addWidget(cancelButton); auto *copyLocationButton = new QPushButton(this); @@ -210,7 +210,7 @@ void BottomBarContentsContainer::addCopyToOtherViewContents() // i18n: Aborts the current step-by-step process to copy the location of files by leaving the selection mode. auto *cancelButton = new QPushButton(i18nc("@action:button", "Abort Copying"), this); - connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::leaveSelectionModeRequested); + connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::selectionModeLeavingRequested); m_layout->addWidget(cancelButton); auto *copyToOtherViewButton = new QPushButton(this); @@ -228,7 +228,7 @@ void BottomBarContentsContainer::addCutContents() // i18n: Aborts the current step-by-step process to cut files by leaving the selection mode. auto *cancelButton = new QPushButton(i18nc("@action:button", "Abort Cutting"), this); - connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::leaveSelectionModeRequested); + connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::selectionModeLeavingRequested); m_layout->addWidget(cancelButton); auto *cutButton = new QPushButton(this); @@ -246,7 +246,7 @@ void BottomBarContentsContainer::addCutContents() resetContents(BottomBar::Contents::PasteContents); // resetContents() needs to be connected last because // it instantly deletes the button and then the other slots won't be called. } - Q_EMIT leaveSelectionModeRequested(); + Q_EMIT selectionModeLeavingRequested(); }); updateMainActionButton(KFileItemList()); m_layout->addWidget(cutButton); @@ -261,7 +261,7 @@ void BottomBarContentsContainer::addDeleteContents() // i18n: Aborts the current step-by-step process to delete files by leaving the selection mode. auto *cancelButton = new QPushButton(i18nc("@action:button", "Abort"), this); - connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::leaveSelectionModeRequested); + connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::selectionModeLeavingRequested); m_layout->addWidget(cancelButton); auto *deleteButton = new QPushButton(this); @@ -279,7 +279,7 @@ void BottomBarContentsContainer::addDuplicateContents() // i18n: Aborts the current step-by-step process to duplicate files by leaving the selection mode. auto *cancelButton = new QPushButton(i18nc("@action:button", "Abort Duplicating"), this); - connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::leaveSelectionModeRequested); + connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::selectionModeLeavingRequested); m_layout->addWidget(cancelButton); auto *duplicateButton = new QPushButton(this); @@ -349,7 +349,7 @@ void BottomBarContentsContainer::addMoveToOtherViewContents() // i18n: Aborts the current step-by-step process to copy the location of files by leaving the selection mode. auto *cancelButton = new QPushButton(i18nc("@action:button", "Abort Moving"), this); - connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::leaveSelectionModeRequested); + connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::selectionModeLeavingRequested); m_layout->addWidget(cancelButton); auto *moveToOtherViewButton = new QPushButton(this); @@ -367,7 +367,7 @@ void BottomBarContentsContainer::addMoveToTrashContents() // i18n: Aborts the current step-by-step process of moving files to the trash by leaving the selection mode. auto *cancelButton = new QPushButton(i18nc("@action:button", "Abort"), this); - connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::leaveSelectionModeRequested); + connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::selectionModeLeavingRequested); m_layout->addWidget(cancelButton); auto *moveToTrashButton = new QPushButton(this); @@ -393,7 +393,7 @@ void BottomBarContentsContainer::addPasteContents() * So we first have to claim that we have different contents before requesting to leave selection mode. */ auto actuallyLeaveSelectionMode = [this]() { m_contents = BottomBar::Contents::CopyLocationContents; - Q_EMIT leaveSelectionModeRequested(); + Q_EMIT selectionModeLeavingRequested(); }; auto *pasteButton = new QPushButton(this); @@ -428,7 +428,7 @@ void BottomBarContentsContainer::addRenameContents() // i18n: Aborts the current step-by-step process to delete files by leaving the selection mode. auto *cancelButton = new QPushButton(i18nc("@action:button", "Stop Renaming"), this); - connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::leaveSelectionModeRequested); + connect(cancelButton, &QAbstractButton::clicked, this, &BottomBarContentsContainer::selectionModeLeavingRequested); m_layout->addWidget(cancelButton); auto *renameButton = new QPushButton(this); diff --git a/src/selectionmode/bottombarcontentscontainer.h b/src/selectionmode/bottombarcontentscontainer.h index b9d7947ae3..aa335a5bff 100644 --- a/src/selectionmode/bottombarcontentscontainer.h +++ b/src/selectionmode/bottombarcontentscontainer.h @@ -78,7 +78,7 @@ Q_SIGNALS: */ void barVisibilityChangeRequested(bool visible); - void leaveSelectionModeRequested(); + void selectionModeLeavingRequested(); private: void addCopyContents(); diff --git a/src/selectionmode/selectionmodebottombar.h b/src/selectionmode/selectionmodebottombar.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/selectionmode/selectionmodetopbar.h b/src/selectionmode/selectionmodetopbar.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/selectionmode/topbar.cpp b/src/selectionmode/topbar.cpp index 51467cd99b..0a5d3f2cf2 100644 --- a/src/selectionmode/topbar.cpp +++ b/src/selectionmode/topbar.cpp @@ -70,7 +70,7 @@ TopBar::TopBar(QWidget *parent) : m_closeButton->setAccessibleName(m_closeButton->toolTip()); m_closeButton->setFlat(true); connect(m_closeButton, &QAbstractButton::pressed, - this, &TopBar::leaveSelectionModeRequested); + this, &TopBar::selectionModeLeavingRequested); QHBoxLayout *layout = new QHBoxLayout(contentsContainer); auto contentsMargins = layout->contentsMargins(); diff --git a/src/selectionmode/topbar.h b/src/selectionmode/topbar.h index 10a65cba07..b7374ff3b5 100644 --- a/src/selectionmode/topbar.h +++ b/src/selectionmode/topbar.h @@ -42,7 +42,7 @@ public: void setVisible(bool visible, Animated animated); Q_SIGNALS: - void leaveSelectionModeRequested(); + void selectionModeLeavingRequested(); protected: /** Calls updateLabelString() */ diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 0566dbf842..5a36ad1036 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -173,7 +173,7 @@ DolphinView::DolphinView(const QUrl& url, QWidget* parent) : connect(controller, &KItemListController::increaseZoom, this, &DolphinView::slotIncreaseZoom); connect(controller, &KItemListController::decreaseZoom, this, &DolphinView::slotDecreaseZoom); connect(controller, &KItemListController::swipeUp, this, &DolphinView::slotSwipeUp); - connect(controller, &KItemListController::selectionModeRequested, this, &DolphinView::selectionModeRequested); + connect(controller, &KItemListController::selectionModeChangeRequested, this, &DolphinView::selectionModeChangeRequested); connect(m_model, &KFileItemModel::directoryLoadingStarted, this, &DolphinView::slotDirectoryLoadingStarted); connect(m_model, &KFileItemModel::directoryLoadingCompleted, this, &DolphinView::slotDirectoryLoadingCompleted); @@ -283,7 +283,7 @@ DolphinView::Mode DolphinView::viewMode() const return m_mode; } -void DolphinView::setSelectionMode(const bool enabled) +void DolphinView::setSelectionModeEnabled(const bool enabled) { if (enabled) { m_proxyStyle = std::make_unique(); @@ -293,7 +293,7 @@ void DolphinView::setSelectionMode(const bool enabled) setStyle(QApplication::style()); m_view->setStyle(QApplication::style()); } - m_container->controller()->setSelectionMode(enabled); + m_container->controller()->setSelectionModeEnabled(enabled); } bool DolphinView::selectionMode() const diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index 9b0dee62e4..2ecd75957f 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -115,7 +115,7 @@ public: /** * Enables or disables a mode for quick and easy selection of items. */ - void setSelectionMode(bool enabled); + void setSelectionModeEnabled(bool enabled); bool selectionMode() const; /** @@ -609,11 +609,11 @@ Q_SIGNALS: void goForwardRequested(); /** - * Is emitted when the selection mode is requested for the current view. - * This typically happens on press and hold. - * @see KItemListController::longPress() + * Used to request either entering or leaving of selection mode + * Entering is typically requested on press and hold. + * Leaving by pressing Escape when no item is selected. */ - void selectionModeRequested(); + void selectionModeChangeRequested(bool enabled); /** * Is emitted when the user wants to move the focus to another view. diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp index e6c3fc083a..9fde10d3ef 100644 --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -73,8 +73,8 @@ void DolphinViewActionHandler::setCurrentView(DolphinView* view) this, &DolphinViewActionHandler::slotZoomLevelChanged); connect(view, &DolphinView::writeStateChanged, this, &DolphinViewActionHandler::slotWriteStateChanged); - connect(view, &DolphinView::selectionModeRequested, - this, [this]() { Q_EMIT setSelectionMode(true); }); + connect(view, &DolphinView::selectionModeChangeRequested, + this, [this](bool enabled) { Q_EMIT selectionModeChangeTriggered(enabled); }); connect(view, &DolphinView::selectionChanged, this, &DolphinViewActionHandler::slotSelectionChanged); slotSelectionChanged(m_currentView->selectedItems()); @@ -435,7 +435,7 @@ void DolphinViewActionHandler::slotViewModeActionTriggered(QAction* action) void DolphinViewActionHandler::slotRename() { if (m_currentView->selectedItemsCount() == 0) { - Q_EMIT setSelectionMode(true, SelectionMode::BottomBar::Contents::RenameContents); + Q_EMIT selectionModeChangeTriggered(true, SelectionMode::BottomBar::Contents::RenameContents); } else { Q_EMIT actionBeingHandled(); m_currentView->renameSelectedItems(); @@ -446,22 +446,22 @@ void DolphinViewActionHandler::slotRename() void DolphinViewActionHandler::slotTrashActivated() { if (m_currentView->selectedItemsCount() == 0) { - Q_EMIT setSelectionMode(true, SelectionMode::BottomBar::Contents::MoveToTrashContents); + Q_EMIT selectionModeChangeTriggered(true, SelectionMode::BottomBar::Contents::MoveToTrashContents); } else { Q_EMIT actionBeingHandled(); m_currentView->trashSelectedItems(); - Q_EMIT setSelectionMode(false); + Q_EMIT selectionModeChangeTriggered(false); } } void DolphinViewActionHandler::slotDeleteItems() { if (m_currentView->selectedItemsCount() == 0) { - Q_EMIT setSelectionMode(true, SelectionMode::BottomBar::Contents::DeleteContents); + Q_EMIT selectionModeChangeTriggered(true, SelectionMode::BottomBar::Contents::DeleteContents); } else { Q_EMIT actionBeingHandled(); m_currentView->deleteSelectedItems(); - Q_EMIT setSelectionMode(false); + Q_EMIT selectionModeChangeTriggered(false); } } @@ -762,11 +762,11 @@ void DolphinViewActionHandler::slotAdjustViewProperties() void DolphinViewActionHandler::slotDuplicate() { if (m_currentView->selectedItemsCount() == 0) { - Q_EMIT setSelectionMode(true, SelectionMode::BottomBar::Contents::DuplicateContents); + Q_EMIT selectionModeChangeTriggered(true, SelectionMode::BottomBar::Contents::DuplicateContents); } else { Q_EMIT actionBeingHandled(); m_currentView->duplicateSelectedItems(); - Q_EMIT setSelectionMode(false); + Q_EMIT selectionModeChangeTriggered(false); } } @@ -790,10 +790,10 @@ void DolphinViewActionHandler::slotProperties() void DolphinViewActionHandler::slotCopyPath() { if (m_currentView->selectedItemsCount() == 0) { - Q_EMIT setSelectionMode(true, SelectionMode::BottomBar::Contents::CopyLocationContents); + Q_EMIT selectionModeChangeTriggered(true, SelectionMode::BottomBar::Contents::CopyLocationContents); } else { m_currentView->copyPathToClipboard(); - Q_EMIT setSelectionMode(false); + Q_EMIT selectionModeChangeTriggered(false); } } diff --git a/src/views/dolphinviewactionhandler.h b/src/views/dolphinviewactionhandler.h index 5c7475fdb8..8631936d9c 100644 --- a/src/views/dolphinviewactionhandler.h +++ b/src/views/dolphinviewactionhandler.h @@ -87,8 +87,8 @@ Q_SIGNALS: */ void createDirectoryTriggered(); - /** Used to request selection mode */ - void setSelectionMode(bool enabled, SelectionMode::BottomBar::Contents bottomBarContents = SelectionMode::BottomBar::Contents::GeneralContents); + /** Used to request either entering or leaving of selection mode */ + void selectionModeChangeTriggered(bool enabled, SelectionMode::BottomBar::Contents bottomBarContents = SelectionMode::BottomBar::Contents::GeneralContents); private Q_SLOTS: /**