[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