[pim/itinerary] src/app: Support clipboard paste from image
Kai Uwe Broulik <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit 7820f44551ad0e80138bc371b06244f46b030f45 by Kai Uwe Broulik.
Committed on 17/08/2026 at 12:08.
Pushed by broulik into branch 'master'.
Support clipboard paste from image
It uses the suggested file name the application set, if any.
M +1 -1 src/app/ImportAction.qml
M +5 -0 src/app/clipboard.cpp
M +3 -0 src/app/clipboard.h
M +24 -0 src/app/importcontroller.cpp
https://invent.kde.org/pim/itinerary/-/commit/7820f44551ad0e80138bc371b06244f46b030f45
diff --git a/src/app/ImportAction.qml b/src/app/ImportAction.qml
index 1063fe3ff..573f4f357 100644
--- a/src/app/ImportAction.qml
+++ b/src/app/ImportAction.qml
@@ -50,7 +50,7 @@ Kirigami.Action {
text: i18nc("@action:inmenu", "From clipboard")
icon.name: "edit-paste"
- enabled: Clipboard.hasText || Clipboard.hasUrls || Clipboard.hasBinaryData
+ enabled: Clipboard.hasText || Clipboard.hasUrls || Clipboard.hasImage || Clipboard.hasBinaryData
shortcut: StandardKey.Paste
onTriggered: ImportController.importFromClipboard()
}
diff --git a/src/app/clipboard.cpp b/src/app/clipboard.cpp
index 5df902dbc..c18448e75 100644
--- a/src/app/clipboard.cpp
+++ b/src/app/clipboard.cpp
@@ -27,6 +27,11 @@ bool Clipboard::hasUrls()
return QGuiApplication::clipboard()->mimeData()->hasUrls();
}
+bool Clipboard::hasImage()
+{
+ return QGuiApplication::clipboard()->mimeData()->hasImage();
+}
+
bool Clipboard::hasBinaryData()
{
return QGuiApplication::clipboard()->mimeData()->hasFormat("application/octet-stream"_L1);
diff --git a/src/app/clipboard.h b/src/app/clipboard.h
index 181e64ba2..ee2db73ab 100644
--- a/src/app/clipboard.h
+++ b/src/app/clipboard.h
@@ -21,6 +21,8 @@ class Clipboard : public QObject
Q_PROPERTY(bool hasText READ hasText NOTIFY contentChanged)
/** Clipboard currently holds URLs. */
Q_PROPERTY(bool hasUrls READ hasUrls NOTIFY contentChanged)
+ /** Clibpoard currently holds an image. */
+ Q_PROPERTY(bool hasImage READ hasImage NOTIFY contentChanged)
/** Clipboard currently holds binary data. */
Q_PROPERTY(bool hasBinaryData READ hasBinaryData NOTIFY contentChanged)
@@ -34,6 +36,7 @@ public:
[[nodiscard]] static bool hasText();
[[nodiscard]] static bool hasUrls();
+ [[nodiscard]] static bool hasImage();
[[nodiscard]] static bool hasBinaryData();
[[nodiscard]] static QString text();
diff --git a/src/app/importcontroller.cpp b/src/app/importcontroller.cpp
index d87602a8e..4c4272f26 100644
--- a/src/app/importcontroller.cpp
+++ b/src/app/importcontroller.cpp
@@ -195,6 +195,30 @@ void ImportController::importFromClipboard()
importData(content);
}
+ else if (md->hasImage()) {
+ const QString suggestedFileName = QFile::decodeName(
+ md->data(u"application/x-kde-suggestedfilename"_s));
+ QByteArray imageData;
+
+ // First try if we can import the image directly.
+ for (const QString &format : {u"image/png"_s, u"image/jpeg"_s}) {
+ imageData = md->data(format);
+ if (!imageData.isEmpty()) {
+ break;
+ }
+ }
+
+ // Otherwise try converting whatever image format.
+ if (imageData.isEmpty()) {
+ QBuffer buffer(&imageData);
+ if (buffer.open(QIODevice::WriteOnly)) {
+ md->imageData().value<QImage>().save(&buffer, "png");
+ }
+ }
+
+ importData(imageData, suggestedFileName);
+ }
+
else if (md->hasFormat("application/octet-stream"_L1)) {
importData(md->data("application/octet-stream"_L1));
}