[graphics/koko] src: Add cut action

Oliver Beard <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 3621765563a363977e19aabb44257382d9fb47f4 by Oliver Beard.
Committed on 30/07/2026 at 22:12.
Pushed by olib into branch 'master'.

Add cut action

Adds the 'Cut' action alongside the existing 'Copy' and 'Paste'.

The implementation of copy in `FileMenuManager` is pulled out to be shared, with the only difference being that cut makes a call to `KIO::setClipboardDataCut` to set `application/x-kde-cutselection` in MIME data, such that pasting moves the files rather than copy.

M  +43   -18   src/filemenumanager.cpp
M  +4    -0    src/filemenumanager.h
M  +3    -0    src/qml/ActionCollection.qml
M  +7    -0    src/qml/gallery/GalleryPage.qml
M  +7    -0    src/qml/mediaview/MediaViewPage.qml

https://invent.kde.org/graphics/koko/-/commit/3621765563a363977e19aabb44257382d9fb47f4

diff --git a/src/filemenumanager.cpp b/src/filemenumanager.cpp
index e3e66c10..6c7bb9dd 100644
--- a/src/filemenumanager.cpp
+++ b/src/filemenumanager.cpp
@@ -122,6 +122,11 @@ bool FileMenuManager::canOpenWith() const
     return m_canOpenWith;
 }
 
+bool FileMenuManager::canCut() const
+{
+    return m_canCut;
+}
+
 bool FileMenuManager::canCopy() const
 {
     return m_canCopy;
@@ -322,29 +327,49 @@ void FileMenuManager::updateActions()
     }
     Q_EMIT canOpenWithChanged();
 
+    // Shared cut and copy impl
+    auto copyCutLambda = [fileItems, this](const bool isCut) {
+        if (!m_enabled) {
+            return;
+        }
+
+        QMimeData *data = new QMimeData(); // Cleaned up by Qt later
+
+        QList<QUrl> urls;
+        QList<QUrl> mostLocalUrls;
+        urls.reserve(fileItems.size());
+        mostLocalUrls.reserve(fileItems.size());
+        for (const KFileItem &item : fileItems) {
+            urls << item.url();
+            mostLocalUrls << item.mostLocalUrl();
+        }
+
+        KUrlMimeData::setUrls(urls, mostLocalUrls, data);
+        if (isCut) {
+            KIO::setClipboardDataCut(data, true);
+        }
+        QApplication::clipboard()->setMimeData(data);
+    };
+
+    // Cut action
+    m_canCut = false;
+    disconnectStandardAction(KStandardActions::Cut);
+    if (m_enabled && hasFile) {
+        m_canCut = true;
+        auto cutLambda = [copyCutLambda] {
+            copyCutLambda(true);
+        };
+        connectStandardAction(KStandardActions::Cut, cutLambda);
+    }
+    Q_EMIT canCutChanged();
+
     // Copy action
     m_canCopy = false;
     disconnectStandardAction(KStandardActions::Copy);
     if (m_enabled && hasFile) {
         m_canCopy = true;
-        auto copyLambda = [fileItems, this] {
-            if (!m_enabled) {
-                return;
-            }
-
-            QMimeData *data = new QMimeData(); // Cleaned up by Qt later
-
-            QList<QUrl> urls;
-            QList<QUrl> mostLocalUrls;
-            urls.reserve(fileItems.size());
-            mostLocalUrls.reserve(fileItems.size());
-            for (const KFileItem &item : fileItems) {
-                urls << item.url();
-                mostLocalUrls << item.mostLocalUrl();
-            }
-
-            KUrlMimeData::setUrls(urls, mostLocalUrls, data);
-            QApplication::clipboard()->setMimeData(data);
+        auto copyLambda = [copyCutLambda] {
+            copyCutLambda(false);
         };
         connectStandardAction(KStandardActions::Copy, copyLambda);
     }
diff --git a/src/filemenumanager.h b/src/filemenumanager.h
index 98ea6e41..8674e778 100644
--- a/src/filemenumanager.h
+++ b/src/filemenumanager.h
@@ -27,6 +27,7 @@ class FileMenuManager : public QObject
     Q_PROPERTY(bool canSaveAs READ canSaveAs NOTIFY canSaveAsChanged FINAL)
     Q_PROPERTY(bool canOpenFolder READ canOpenFolder NOTIFY canOpenFolderChanged FINAL)
     Q_PROPERTY(bool canOpenWith READ canOpenWith NOTIFY canOpenWithChanged FINAL)
+    Q_PROPERTY(bool canCut READ canCut NOTIFY canCutChanged FINAL)
     Q_PROPERTY(bool canCopy READ canCopy NOTIFY canCopyChanged FINAL)
     Q_PROPERTY(bool canCopyPath READ canCopyPath NOTIFY canCopyPathChanged FINAL)
     Q_PROPERTY(bool canPaste READ canPaste NOTIFY canPasteChanged FINAL)
@@ -53,6 +54,7 @@ public:
     bool canSaveAs() const;
     bool canOpenFolder() const;
     bool canOpenWith() const;
+    bool canCut() const;
     bool canCopy() const;
     bool canCopyPath() const;
     bool canPaste() const;
@@ -69,6 +71,7 @@ Q_SIGNALS:
     void canSaveAsChanged();
     void canOpenFolderChanged();
     void canOpenWithChanged();
+    void canCutChanged();
     void canCopyChanged();
     void canCopyPathChanged();
     void canPasteChanged();
@@ -89,6 +92,7 @@ private:
     bool m_canSaveAs = false;
     bool m_canOpenFolder = false;
     bool m_canOpenWith = false;
+    bool m_canCut = false;
     bool m_canCopy = false;
     bool m_canCopyPath = false;
     bool m_canPaste = false;
diff --git a/src/qml/ActionCollection.qml b/src/qml/ActionCollection.qml
index 20ec3a45..f868045b 100644
--- a/src/qml/ActionCollection.qml
+++ b/src/qml/ActionCollection.qml
@@ -113,6 +113,9 @@ AC.ActionCollectionManager {
             text: i18nc("@action:inmenu", "&Open With…")
             icon.name: "system-run"
         }
+        AC.StandardActionData {
+            standardAction: AC.StandardActionData.Cut
+        }
         AC.StandardActionData {
             standardAction: AC.StandardActionData.Copy
         }
diff --git a/src/qml/gallery/GalleryPage.qml b/src/qml/gallery/GalleryPage.qml
index e12120ca..2eba37a9 100644
--- a/src/qml/gallery/GalleryPage.qml
+++ b/src/qml/gallery/GalleryPage.qml
@@ -434,6 +434,13 @@ Kirigami.ScrollablePage {
             AC.ActionCollection.action: "OpenWith"
             AC.ActionCollection.collection: "org.kde.koko.file"
         },
+        Kirigami.Action {
+            displayHint: Kirigami.DisplayHint.AlwaysHide
+            enabled: fileMenuManager.enabled && fileMenuManager.canCut && !page.showingCollections
+            visible: enabled
+            AC.ActionCollection.action: AC.StandardActionData.Cut
+            AC.ActionCollection.collection: "org.kde.koko.file"
+        },
         Kirigami.Action {
             displayHint: Kirigami.DisplayHint.AlwaysHide
             enabled: fileMenuManager.enabled && fileMenuManager.canCopy && !page.showingCollections
diff --git a/src/qml/mediaview/MediaViewPage.qml b/src/qml/mediaview/MediaViewPage.qml
index 2e1f800d..dbfb7b1e 100644
--- a/src/qml/mediaview/MediaViewPage.qml
+++ b/src/qml/mediaview/MediaViewPage.qml
@@ -221,6 +221,13 @@ Kirigami.Page {
             AC.ActionCollection.action: "OpenWith"
             AC.ActionCollection.collection: "org.kde.koko.file"
         },
+        Kirigami.Action {
+            displayHint: Kirigami.DisplayHint.AlwaysHide
+            enabled: fileMenuManager.enabled && fileMenuManager.canCut
+            visible: enabled
+            AC.ActionCollection.action: AC.StandardActionData.Cut
+            AC.ActionCollection.collection: "org.kde.koko.file"
+        },
         Kirigami.Action {
             displayHint: Kirigami.DisplayHint.AlwaysHide
             enabled: fileMenuManager.enabled && fileMenuManager.canCopy
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.