[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));
     }
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.