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"