/* SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez SPDX-License-Identifier: LGPL-2.0-or-later */ #include "clipboard.h" #include #include #include #include Clipboard::Clipboard(QObject *parent) : QObject(parent) , m_clipboard(QGuiApplication::clipboard()) , m_mode(QClipboard::Clipboard) { connect(m_clipboard, &QClipboard::changed, this, &Clipboard::clipboardChanged); } void Clipboard::setMode(QClipboard::Mode mode) { m_mode = mode; Q_EMIT modeChanged(m_mode); } void Clipboard::clipboardChanged(QClipboard::Mode m) { if (m == m_mode) { Q_EMIT contentChanged(); } } void Clipboard::clear() { m_clipboard->clear(m_mode); } QClipboard::Mode Clipboard::mode() const { return m_mode; } QVariant Clipboard::contentFormat(const QString &format) const { const QMimeData *data = m_clipboard->mimeData(m_mode); QVariant ret; if (format == QLatin1String("text/uri-list")) { QVariantList retList; const auto urls = data->urls(); for (const QUrl &url : urls) { retList += url; } ret = retList; } else if (format.startsWith(QLatin1String("text/"))) { ret = data->text(); } else if (format.startsWith(QLatin1String("image/"))) { ret = data->imageData(); } else { ret = data->data(format.isEmpty() ? data->formats().first() : format); } return ret; } QVariant Clipboard::content() const { return contentFormat(m_clipboard->mimeData(m_mode)->formats().first()); } void Clipboard::setContent(const QVariant &content) { QMimeData *mimeData = new QMimeData; switch (content.userType()) { case QMetaType::QString: mimeData->setText(content.toString()); break; case QMetaType::QColor: mimeData->setColorData(content.toString()); break; case QMetaType::QPixmap: case QMetaType::QImage: mimeData->setImageData(content); break; default: if (content.userType() == QMetaType::QVariantList) { const QVariantList list = content.toList(); QList urls; bool wasUrlList = true; for (const QVariant &url : list) { if (url.userType() != QMetaType::QUrl) { wasUrlList = false; break; } urls += url.toUrl(); } if (wasUrlList) { mimeData->setUrls(urls); break; } } if (content.canConvert()) { mimeData->setText(content.toString()); } else { mimeData->setData(QStringLiteral("application/octet-stream"), content.toByteArray()); qWarning() << "Couldn't figure out the content type, storing as application/octet-stream"; } break; } m_clipboard->setMimeData(mimeData, m_mode); } QStringList Clipboard::formats() const { return m_clipboard->mimeData(m_mode)->formats(); } #include "moc_clipboard.cpp"