| 1 | /* |
| 2 | SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com> |
| 3 | |
| 4 | SPDX-License-Identifier: LGPL-2.0-or-later |
| 5 | */ |
| 6 | |
| 7 | #include "clipboard.h" |
| 8 | #include <QDebug> |
| 9 | #include <QGuiApplication> |
| 10 | #include <QMimeData> |
| 11 | #include <QUrl> |
| 12 | |
| 13 | Clipboard::Clipboard(QObject *parent) |
| 14 | : QObject(parent) |
| 15 | , m_clipboard(QGuiApplication::clipboard()) |
| 16 | , m_mode(QClipboard::Clipboard) |
| 17 | { |
| 18 | connect(sender: m_clipboard, signal: &QClipboard::changed, context: this, slot: &Clipboard::clipboardChanged); |
| 19 | } |
| 20 | |
| 21 | void Clipboard::setMode(QClipboard::Mode mode) |
| 22 | { |
| 23 | m_mode = mode; |
| 24 | Q_EMIT modeChanged(mode: m_mode); |
| 25 | } |
| 26 | |
| 27 | void Clipboard::clipboardChanged(QClipboard::Mode m) |
| 28 | { |
| 29 | if (m == m_mode) { |
| 30 | Q_EMIT contentChanged(); |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | void Clipboard::clear() |
| 35 | { |
| 36 | m_clipboard->clear(mode: m_mode); |
| 37 | } |
| 38 | |
| 39 | QClipboard::Mode Clipboard::mode() const |
| 40 | { |
| 41 | return m_mode; |
| 42 | } |
| 43 | |
| 44 | QVariant Clipboard::contentFormat(const QString &format) const |
| 45 | { |
| 46 | const QMimeData *data = m_clipboard->mimeData(mode: m_mode); |
| 47 | QVariant ret; |
| 48 | if (format == QLatin1String("text/uri-list" )) { |
| 49 | QVariantList retList; |
| 50 | const auto urls = data->urls(); |
| 51 | for (const QUrl &url : urls) { |
| 52 | retList += url; |
| 53 | } |
| 54 | ret = retList; |
| 55 | } else if (format.startsWith(s: QLatin1String("text/" ))) { |
| 56 | ret = data->text(); |
| 57 | } else if (format.startsWith(s: QLatin1String("image/" ))) { |
| 58 | ret = data->imageData(); |
| 59 | } else { |
| 60 | ret = data->data(mimetype: format.isEmpty() ? data->formats().first() : format); |
| 61 | } |
| 62 | |
| 63 | return ret; |
| 64 | } |
| 65 | |
| 66 | QVariant Clipboard::content() const |
| 67 | { |
| 68 | return contentFormat(format: m_clipboard->mimeData(mode: m_mode)->formats().first()); |
| 69 | } |
| 70 | |
| 71 | void Clipboard::setContent(const QVariant &content) |
| 72 | { |
| 73 | QMimeData *mimeData = new QMimeData; |
| 74 | switch (content.userType()) { |
| 75 | case QMetaType::QString: |
| 76 | mimeData->setText(content.toString()); |
| 77 | break; |
| 78 | case QMetaType::QColor: |
| 79 | mimeData->setColorData(content.toString()); |
| 80 | break; |
| 81 | case QMetaType::QPixmap: |
| 82 | case QMetaType::QImage: |
| 83 | mimeData->setImageData(content); |
| 84 | break; |
| 85 | default: |
| 86 | if (content.userType() == QMetaType::QVariantList) { |
| 87 | const QVariantList list = content.toList(); |
| 88 | QList<QUrl> urls; |
| 89 | bool wasUrlList = true; |
| 90 | for (const QVariant &url : list) { |
| 91 | if (url.userType() != QMetaType::QUrl) { |
| 92 | wasUrlList = false; |
| 93 | break; |
| 94 | } |
| 95 | urls += url.toUrl(); |
| 96 | } |
| 97 | if (wasUrlList) { |
| 98 | mimeData->setUrls(urls); |
| 99 | break; |
| 100 | } |
| 101 | } |
| 102 | |
| 103 | if (content.canConvert<QString>()) { |
| 104 | mimeData->setText(content.toString()); |
| 105 | } else { |
| 106 | mimeData->setData(QStringLiteral("application/octet-stream" ), data: content.toByteArray()); |
| 107 | qWarning() << "Couldn't figure out the content type, storing as application/octet-stream" ; |
| 108 | } |
| 109 | break; |
| 110 | } |
| 111 | m_clipboard->setMimeData(data: mimeData, mode: m_mode); |
| 112 | } |
| 113 | |
| 114 | QStringList Clipboard::formats() const |
| 115 | { |
| 116 | return m_clipboard->mimeData(mode: m_mode)->formats(); |
| 117 | } |
| 118 | |
| 119 | #include "moc_clipboard.cpp" |
| 120 | |