X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f46e630ddaaf5716cd1a1ce0c389ff66dcd76f85..53a778c1ebab4473da8ae7b18fd2f2ac75b9690a:/src/views/dolphinviewactionhandler.cpp diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp index fef236a78..4acc420b0 100644 --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -18,10 +18,13 @@ #endif #include #include +#include #include #include #include #include + +#include #include #include @@ -66,6 +69,9 @@ void DolphinViewActionHandler::setCurrentView(DolphinView* view) this, &DolphinViewActionHandler::slotZoomLevelChanged); connect(view, &DolphinView::writeStateChanged, this, &DolphinViewActionHandler::slotWriteStateChanged); + connect(view, &DolphinView::selectionChanged, + this, &DolphinViewActionHandler::slotSelectionChanged); + slotSelectionChanged(m_currentView->selectedItems()); } DolphinView* DolphinViewActionHandler::currentView() @@ -79,11 +85,7 @@ void DolphinViewActionHandler::createActions() // KNewFileMenu takes care of the GUI stuff. QAction* newDirAction = m_actionCollection->addAction(QStringLiteral("create_dir")); newDirAction->setText(i18nc("@action", "Create Folder...")); -#if KCONFIG_VERSION >= QT_VERSION_CHECK(5, 74, 0) m_actionCollection->setDefaultShortcuts(newDirAction, KStandardShortcut::createFolder()); -#else - m_actionCollection->setDefaultShortcut(newDirAction, Qt::Key_F10); -#endif newDirAction->setIcon(QIcon::fromTheme(QStringLiteral("folder-new"))); newDirAction->setEnabled(false); // Will be enabled in slotWriteStateChanged(bool) if the current URL is writable connect(newDirAction, &QAction::triggered, this, &DolphinViewActionHandler::createDirectoryTriggered); @@ -144,7 +146,7 @@ void DolphinViewActionHandler::createActions() "You can configure advanced options there like managing " "read- and write-permissions.")); propertiesAction->setIcon(QIcon::fromTheme(QStringLiteral("document-properties"))); - m_actionCollection->setDefaultShortcuts(propertiesAction, {Qt::ALT + Qt::Key_Return, Qt::ALT + Qt::Key_Enter}); + m_actionCollection->setDefaultShortcuts(propertiesAction, {Qt::ALT | Qt::Key_Return, Qt::ALT | Qt::Key_Enter}); connect(propertiesAction, &QAction::triggered, this, &DolphinViewActionHandler::slotProperties); QAction *copyPathAction = m_actionCollection->addAction( QStringLiteral("copy_location") ); @@ -154,9 +156,28 @@ void DolphinViewActionHandler::createActions() )); copyPathAction->setIcon(QIcon::fromTheme(QStringLiteral("edit-copy"))); - m_actionCollection->setDefaultShortcuts(copyPathAction, {Qt::CTRL + Qt::SHIFT + Qt::Key_C}); + m_actionCollection->setDefaultShortcuts(copyPathAction, {Qt::CTRL | Qt::ALT | Qt::Key_C}); connect(copyPathAction, &QAction::triggered, this, &DolphinViewActionHandler::slotCopyPath); + // This menu makes sure that users who don't know how to open a context menu and haven't + // figured out how to enable the menu bar can still perform basic file manipulation. + // This only works if they know how to select a file. + // The text when nothing is selected at least implies that a selection can /somehow/ be made. + // This menu is by default only used in the hamburger menu but created here so users can put + // it on their toolbar. + KActionMenu *basicActionsMenu = m_actionCollection->add(QStringLiteral("basic_actions"), this); + // The text is set later depending on the selection in the currently active view. + basicActionsMenu->setPopupMode(QToolButton::InstantPopup); + basicActionsMenu->addAction(m_actionCollection->action(KStandardAction::name(KStandardAction::Cut))); + basicActionsMenu->addAction(m_actionCollection->action(KStandardAction::name(KStandardAction::Copy))); + basicActionsMenu->addAction(m_actionCollection->action(KStandardAction::name(KStandardAction::Paste))); + basicActionsMenu->addSeparator(); + basicActionsMenu->addAction(m_actionCollection->action(KStandardAction::name(KStandardAction::RenameFile))); + basicActionsMenu->addAction(m_actionCollection->action(KStandardAction::name(KStandardAction::MoveToTrash))); + basicActionsMenu->addSeparator(); + basicActionsMenu->addAction(m_actionCollection->action(QStringLiteral("properties"))); + basicActionsMenu->addSeparator(); // We add one more separator because we sometimes add contextual + // actions in slotSelectionChanged() after the static ones above. // View menu KToggleAction* iconsAction = iconsModeAction(); @@ -202,7 +223,7 @@ void DolphinViewActionHandler::createActions() zoomResetAction->setToolTip(i18n("Zoom To Default")); zoomResetAction->setWhatsThis(i18nc("@info:whatsthis zoom reset", "This resets the icon size to default.")); zoomResetAction->setIcon(QIcon::fromTheme(QStringLiteral("zoom-original"))); - m_actionCollection->setDefaultShortcuts(zoomResetAction, {Qt::CTRL + Qt::Key_0}); + m_actionCollection->setDefaultShortcuts(zoomResetAction, {Qt::CTRL | Qt::Key_0}); connect(zoomResetAction, &QAction::triggered, this, &DolphinViewActionHandler::zoomReset); QAction* zoomOutAction = KStandardAction::zoomOut(this, @@ -210,6 +231,14 @@ void DolphinViewActionHandler::createActions() m_actionCollection); zoomOutAction->setWhatsThis(i18nc("@info:whatsthis zoom out", "This reduces the icon size.")); + KActionMenu* zoomMenu = m_actionCollection->add(QStringLiteral("zoom")); + zoomMenu->setText(i18nc("@action:inmenu menu of zoom actions", "Zoom")); + zoomMenu->setIcon(QIcon::fromTheme(QStringLiteral("zoom"))); + zoomMenu->setPopupMode(QToolButton::InstantPopup); + zoomMenu->addAction(zoomInAction); + zoomMenu->addAction(zoomResetAction); + zoomMenu->addAction(zoomOutAction); + KToggleAction* showPreview = m_actionCollection->add(QStringLiteral("show_preview")); showPreview->setText(i18nc("@action:intoolbar", "Show Previews")); showPreview->setToolTip(i18nc("@info", "Show preview of files and folders")); @@ -572,7 +601,7 @@ KToggleAction* DolphinViewActionHandler::iconsModeAction() KToggleAction* iconsView = m_actionCollection->add(QStringLiteral("icons")); iconsView->setText(i18nc("@action:inmenu View Mode", "Icons")); iconsView->setToolTip(i18nc("@info", "Icons view mode")); - m_actionCollection->setDefaultShortcut(iconsView, Qt::CTRL + Qt::Key_1); + m_actionCollection->setDefaultShortcut(iconsView, Qt::CTRL | Qt::Key_1); iconsView->setIcon(QIcon::fromTheme(QStringLiteral("view-list-icons"))); iconsView->setData(QVariant::fromValue(DolphinView::IconsView)); return iconsView; @@ -583,7 +612,7 @@ KToggleAction* DolphinViewActionHandler::compactModeAction() KToggleAction* iconsView = m_actionCollection->add(QStringLiteral("compact")); iconsView->setText(i18nc("@action:inmenu View Mode", "Compact")); iconsView->setToolTip(i18nc("@info", "Compact view mode")); - m_actionCollection->setDefaultShortcut(iconsView, Qt::CTRL + Qt::Key_2); + m_actionCollection->setDefaultShortcut(iconsView, Qt::CTRL | Qt::Key_2); iconsView->setIcon(QIcon::fromTheme(QStringLiteral("view-list-details"))); // TODO: discuss with Oxygen-team the wrong (?) name iconsView->setData(QVariant::fromValue(DolphinView::CompactView)); return iconsView; @@ -594,7 +623,7 @@ KToggleAction* DolphinViewActionHandler::detailsModeAction() KToggleAction* detailsView = m_actionCollection->add(QStringLiteral("details")); detailsView->setText(i18nc("@action:inmenu View Mode", "Details")); detailsView->setToolTip(i18nc("@info", "Details view mode")); - m_actionCollection->setDefaultShortcut(detailsView, Qt::CTRL + Qt::Key_3); + m_actionCollection->setDefaultShortcut(detailsView, Qt::CTRL | Qt::Key_3); detailsView->setIcon(QIcon::fromTheme(QStringLiteral("view-list-tree"))); detailsView->setData(QVariant::fromValue(DolphinView::DetailsView)); return detailsView; @@ -711,3 +740,69 @@ void DolphinViewActionHandler::slotCopyPath() { m_currentView->copyPathToClipboard(); } + +void DolphinViewActionHandler::slotSelectionChanged(const KFileItemList& selection) +{ + QString basicActionsMenuText; + switch (selection.count()) { + case 0: + basicActionsMenuText = + i18nc("@action:inmenu menu with actions like copy, paste, rename. The user's selection is empty when this text is shown.", + "Actions for Current View"); + break; + case 1: + basicActionsMenuText = + i18nc("@action:inmenu menu with actions like copy, paste, rename. %1 is the name of the singular selected file/folder.", + "Actions for \"%1\"", selection.first().name()); + break; + case 2: + basicActionsMenuText = + i18nc("@action:inmenu menu with actions like copy, paste, rename. %1 and %2 are names of files/folders.", + "Actions for \"%1\" and \"%2\"", selection.first().name(), selection.last().name()); + break; + case 3: + basicActionsMenuText = + i18nc("@action:inmenu menu with actions like copy, paste, rename. %1, %2 and %3 are names of files/folders.", + "Actions for \"%1\", \"%2\" and \"%3\"", + selection.first().name(), selection.at(1).name(), selection.last().name()); + break; + default: + basicActionsMenuText = QString(); + break; + } + + // At some point the added clarity from the text starts being less important than the menu width. + if (basicActionsMenuText.isEmpty() || basicActionsMenuText.length() > 40) { + const KFileItemListProperties properties(selection); + if (properties.isFile()) { + basicActionsMenuText = + i18ncp("@action:inmenu menu with actions like copy, paste, rename. %1 is the amount of selected files/folders.", + "Actions for One Selected File", "Actions for %1 Selected Files", selection.count()); + } else if (properties.isDirectory()) { + basicActionsMenuText = + i18ncp("@action:inmenu menu with actions like copy, paste, rename. %1 is the amount of selected files/folders.", + "Actions for One Selected Folder", "Actions for %1 Selected Folders", selection.count()); + } else { + basicActionsMenuText = + i18ncp("@action:inmenu menu with actions like copy, paste, rename. %1 is the amount of selected files/folders.", + "Actions for One Selected Item", "Actions for %1 Selected Items", selection.count()); + } + } + + QAction *basicActionsMenu = m_actionCollection->action(QStringLiteral("basic_actions")); + basicActionsMenu->setText(basicActionsMenuText); + + // Add or remove contextual actions + auto basicActionsMenuActions = basicActionsMenu->menu()->actions(); + while (!basicActionsMenu->menu()->actions().constLast()->isSeparator()) { + basicActionsMenu->menu()->removeAction(basicActionsMenu->menu()->actions().last()); + } + if (selection.count() == 1) { + if (selection.first().isLink()) { + basicActionsMenu->menu()->addAction(m_actionCollection->action(QStringLiteral("show_target"))); + } + if (selection.first().isDir()) { + basicActionsMenu->menu()->addAction(m_actionCollection->action(QStringLiteral("add_to_places"))); + } + } +}