File indexing completed on 2024-05-19 15:09:23

0001 /*
0002     SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "clipboard.h"
0008 #include <QDebug>
0009 #include <QGuiApplication>
0010 #include <QMimeData>
0011 #include <QUrl>
0012 
0013 Clipboard::Clipboard(QObject *parent)
0014     : QObject(parent)
0015     , m_clipboard(QGuiApplication::clipboard())
0016     , m_mode(QClipboard::Clipboard)
0017 {
0018     connect(m_clipboard, &QClipboard::changed, this, &Clipboard::clipboardChanged);
0019 }
0020 
0021 void Clipboard::setMode(QClipboard::Mode mode)
0022 {
0023     m_mode = mode;
0024     Q_EMIT modeChanged(m_mode);
0025 }
0026 
0027 void Clipboard::clipboardChanged(QClipboard::Mode m)
0028 {
0029     if (m == m_mode) {
0030         Q_EMIT contentChanged();
0031     }
0032 }
0033 
0034 void Clipboard::clear()
0035 {
0036     m_clipboard->clear(m_mode);
0037 }
0038 
0039 QClipboard::Mode Clipboard::mode() const
0040 {
0041     return m_mode;
0042 }
0043 
0044 QVariant Clipboard::contentFormat(const QString &format) const
0045 {
0046     const QMimeData *data = m_clipboard->mimeData(m_mode);
0047     QVariant ret;
0048     if (format == QLatin1String("text/uri-list")) {
0049         QVariantList retList;
0050         const auto urls = data->urls();
0051         for (const QUrl &url : urls) {
0052             retList += url;
0053         }
0054         ret = retList;
0055     } else if (format.startsWith(QLatin1String("text/"))) {
0056         ret = data->text();
0057     } else if (format.startsWith(QLatin1String("image/"))) {
0058         ret = data->imageData();
0059     } else {
0060         ret = data->data(format.isEmpty() ? data->formats().first() : format);
0061     }
0062 
0063     return ret;
0064 }
0065 
0066 QVariant Clipboard::content() const
0067 {
0068     return contentFormat(m_clipboard->mimeData(m_mode)->formats().first());
0069 }
0070 
0071 void Clipboard::setContent(const QVariant &content)
0072 {
0073     QMimeData *mimeData = new QMimeData;
0074     switch (content.type()) {
0075     case QVariant::String:
0076         mimeData->setText(content.toString());
0077         break;
0078     case QVariant::Color:
0079         mimeData->setColorData(content.toString());
0080         break;
0081     case QVariant::Pixmap:
0082     case QVariant::Image:
0083         mimeData->setImageData(content);
0084         break;
0085     default:
0086         if (content.type() == QVariant::List) {
0087             const QVariantList list = content.toList();
0088             QList<QUrl> urls;
0089             bool wasUrlList = true;
0090             for (const QVariant &url : list) {
0091                 if (url.type() != QVariant::Url) {
0092                     wasUrlList = false;
0093                     break;
0094                 }
0095                 urls += url.toUrl();
0096             }
0097             if (wasUrlList) {
0098                 mimeData->setUrls(urls);
0099                 break;
0100             }
0101         }
0102 
0103         if (content.canConvert(QVariant::String)) {
0104             mimeData->setText(content.toString());
0105         } else {
0106             mimeData->setData(QStringLiteral("application/octet-stream"), content.toByteArray());
0107             qWarning() << "Couldn't figure out the content type, storing as application/octet-stream";
0108         }
0109         break;
0110     }
0111     m_clipboard->setMimeData(mimeData, m_mode);
0112 }
0113 
0114 QStringList Clipboard::formats() const
0115 {
0116     return m_clipboard->mimeData(m_mode)->formats();
0117 }
0118 
0119 #include "moc_clipboard.cpp"