]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Context menu: allow to show copy to/move to inactive split view
authorMéven Car <meven.car@kdemail.net>
Sun, 2 Apr 2023 07:22:07 +0000 (07:22 +0000)
committerMéven Car <meven.car@kdemail.net>
Sun, 2 Apr 2023 07:22:07 +0000 (07:22 +0000)
Prevent copying/moving to same folder as origin when copying/moving to inactive split view

BUG: 356436

src/dolphincontextmenu.cpp
src/dolphinmainwindow.cpp
src/dolphinmainwindow.h
src/settings/contextmenu/contextmenusettingspage.cpp
src/settings/dolphin_contextmenusettings.kcfg
src/settings/dolphinsettingsdialog.cpp

index 94fed187214054ad0b8a9710783c2ea50066ad4b..a5b033c715f2486c2a739ff841ac5d50554480a2 100644 (file)
@@ -257,6 +257,16 @@ void DolphinContextMenu::addItemContextMenu()
         m_copyToMenu.addActionsTo(this);
     }
 
+    if (m_mainWindow->isSplitViewEnabledInCurrentTab()) {
+        if (ContextMenuSettings::showCopyToOtherSplitView()) {
+            addAction(m_mainWindow->actionCollection()->action(QStringLiteral("copy_to_inactive_split_view")));
+        }
+
+        if (ContextMenuSettings::showMoveToOtherSplitView()) {
+            addAction(m_mainWindow->actionCollection()->action(QStringLiteral("move_to_inactive_split_view")));
+        }
+    }
+
     // insert 'Properties...' entry
     addSeparator();
     QAction *propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties"));
index 9c3d9862b316fdd0d2d678ab51fc3c7e4c7fb913..5061a10afcae788c6c8b9a5ceb94c76f0701bbdf 100644 (file)
@@ -88,6 +88,8 @@
 #include <QTimer>
 #include <QToolButton>
 
+#include <algorithm>
+
 namespace
 {
 // Used for GeneralSettings::version() to determine whether
@@ -265,6 +267,11 @@ bool DolphinMainWindow::isInformationPanelEnabled() const
 #endif
 }
 
+bool DolphinMainWindow::isSplitViewEnabledInCurrentTab() const
+{
+    return m_tabWidget->currentTabPage()->splitViewEnabled();
+}
+
 void DolphinMainWindow::openFiles(const QStringList &files, bool splitView)
 {
     openFiles(QUrl::fromStringList(files), splitView);
@@ -1609,8 +1616,8 @@ void DolphinMainWindow::setupActions()
                         + cutCopyPastePara);
 
     QAction *copyToOtherViewAction = actionCollection()->addAction(QStringLiteral("copy_to_inactive_split_view"));
-    copyToOtherViewAction->setText(i18nc("@action:inmenu", "Copy to Inactive Split View"));
-    m_actionTextHelper->registerTextWhenNothingIsSelected(copyToOtherViewAction, i18nc("@action:inmenu", "Copy to Inactive Split View…"));
+    copyToOtherViewAction->setText(i18nc("@action:inmenu", "Copy to Other View"));
+    m_actionTextHelper->registerTextWhenNothingIsSelected(copyToOtherViewAction, i18nc("@action:inmenu", "Copy to Other View…"));
     copyToOtherViewAction->setWhatsThis(xi18nc("@info:whatsthis Copy",
                                                "This copies the selected items from "
                                                "the <emphasis>active</emphasis> view to the inactive split view."));
@@ -1620,8 +1627,8 @@ void DolphinMainWindow::setupActions()
     connect(copyToOtherViewAction, &QAction::triggered, this, &DolphinMainWindow::copyToInactiveSplitView);
 
     QAction *moveToOtherViewAction = actionCollection()->addAction(QStringLiteral("move_to_inactive_split_view"));
-    moveToOtherViewAction->setText(i18nc("@action:inmenu", "Move to Inactive Split View"));
-    m_actionTextHelper->registerTextWhenNothingIsSelected(moveToOtherViewAction, i18nc("@action:inmenu", "Move to Inactive Split View…"));
+    moveToOtherViewAction->setText(i18nc("@action:inmenu", "Move to Other View"));
+    m_actionTextHelper->registerTextWhenNothingIsSelected(moveToOtherViewAction, i18nc("@action:inmenu", "Move to Other View…"));
     moveToOtherViewAction->setWhatsThis(xi18nc("@info:whatsthis Move",
                                                "This moves the selected items from "
                                                "the <emphasis>active</emphasis> view to the inactive split view."));
@@ -2280,7 +2287,7 @@ void DolphinMainWindow::updateFileAndEditActions()
         duplicateAction->setEnabled(capabilitiesSource.supportsWriting());
     }
 
-    if (m_tabWidget->currentTabPage()->splitViewEnabled()) {
+    if (m_tabWidget->currentTabPage()->splitViewEnabled() && !list.isEmpty()) {
         DolphinTabPage *tabPage = m_tabWidget->currentTabPage();
         KFileItem capabilitiesDestination;
 
@@ -2290,8 +2297,14 @@ void DolphinMainWindow::updateFileAndEditActions()
             capabilitiesDestination = tabPage->primaryViewContainer()->rootItem();
         }
 
-        copyToOtherViewAction->setEnabled(capabilitiesDestination.isWritable());
-        moveToOtherViewAction->setEnabled((list.isEmpty() || capabilitiesSource.supportsMoving()) && capabilitiesDestination.isWritable());
+        const auto destUrl = capabilitiesDestination.url();
+        const bool allNotTargetOrigin = std::all_of(list.cbegin(), list.cend(), [destUrl](const KFileItem &item) {
+            return item.url().adjusted(QUrl::RemoveFilename | QUrl::StripTrailingSlash) != destUrl;
+        });
+
+        copyToOtherViewAction->setEnabled(capabilitiesDestination.isWritable() && allNotTargetOrigin);
+        moveToOtherViewAction->setEnabled((list.isEmpty() || capabilitiesSource.supportsMoving()) && capabilitiesDestination.isWritable()
+                                          && allNotTargetOrigin);
     } else {
         copyToOtherViewAction->setEnabled(false);
         moveToOtherViewAction->setEnabled(false);
index 3a97f557c05f52478e1c574899c87d2ed32e7495..2c68749665378cf6fb186da42d2d3162c1dac79b 100644 (file)
@@ -118,6 +118,7 @@ public:
 
     bool isFoldersPanelEnabled() const;
     bool isInformationPanelEnabled() const;
+    bool isSplitViewEnabledInCurrentTab() const;
 
 public Q_SLOTS:
     /**
index 2205fadd017fe28edfccc948104086fa57fb8ea3..c363914d0dd89b20864657681121b514cead771a 100644 (file)
@@ -129,6 +129,10 @@ bool ContextMenuSettingsPage::entryVisible(const QString &id)
         return ContextMenuSettings::showDuplicateHere();
     } else if (id == "open_terminal_here") {
         return ContextMenuSettings::showOpenTerminal();
+    } else if (id == "copy_to_inactive_split_view") {
+        return ContextMenuSettings::showCopyToOtherSplitView();
+    } else if (id == "move_to_inactive_split_view") {
+        return ContextMenuSettings::showMoveToOtherSplitView();
     }
     return false;
 }
@@ -151,6 +155,10 @@ void ContextMenuSettingsPage::setEntryVisible(const QString &id, bool visible)
         ContextMenuSettings::setShowDuplicateHere(visible);
     } else if (id == "open_terminal_here") {
         ContextMenuSettings::setShowOpenTerminal(visible);
+    } else if (id == "copy_to_inactive_split_view") {
+        ContextMenuSettings::setShowCopyToOtherSplitView(visible);
+    } else if (id == "move_to_inactive_split_view") {
+        ContextMenuSettings::setShowMoveToOtherSplitView(visible);
     }
 }
 
index 44fd83513ff2c27c4bfc2d36f65bbfc65502a233..63ca079af77926ae951eacc267c5ad5e5537b458 100644 (file)
             <label>Show 'Open Terminal' in context menu.</label>
             <default>true</default>
         </entry>
+        <entry name="ShowCopyToOtherSplitView" type="Bool">
+            <label>Show 'Copy to other split view' in context menu.</label>
+            <default>true</default>
+        </entry>
+        <entry name="ShowMoveToOtherSplitView" type="Bool">
+            <label>Show 'Move to other split view' in context menu.</label>
+            <default>true</default>
+        </entry>
     </group>
 </kcfg>
index ec92cb6353c2b9faf45f3f761fae32845ca2451d..af3dbc865adf73d52a3dd91b978d50e2893ce83e 100644 (file)
@@ -84,7 +84,9 @@ DolphinSettingsDialog::DolphinSettingsDialog(const QUrl &url, QWidget *parent, K
                                                                 QStringLiteral("open_in_new_window"),
                                                                 QStringLiteral("copy_location"),
                                                                 QStringLiteral("duplicate"),
-                                                                QStringLiteral("open_terminal_here")});
+                                                                QStringLiteral("open_terminal_here"),
+                                                                QStringLiteral("copy_to_inactive_split_view"),
+                                                                QStringLiteral("move_to_inactive_split_view")});
     KPageWidgetItem *contextMenuSettingsFrame = addPage(contextMenuSettingsPage, i18nc("@title:group", "Context Menu"));
     contextMenuSettingsFrame->setIcon(QIcon::fromTheme(QStringLiteral("preferences-desktop-menu-edit")));
     connect(contextMenuSettingsPage, &ContextMenuSettingsPage::changed, this, &DolphinSettingsDialog::enableApply);