File indexing completed on 2024-05-12 05:47:29

0001 /*
0002  * SPDX-FileCopyrightText: 2011 Peter Penz <peter.penz19@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kfileitemclipboard.h"
0008 
0009 #include <KUrlMimeData>
0010 
0011 #include <QApplication>
0012 #include <QClipboard>
0013 #include <QMimeData>
0014 
0015 class KFileItemClipboardSingleton
0016 {
0017 public:
0018     KFileItemClipboard instance;
0019 };
0020 Q_GLOBAL_STATIC(KFileItemClipboardSingleton, s_KFileItemClipboard)
0021 
0022 KFileItemClipboard *KFileItemClipboard::instance()
0023 {
0024     return &s_KFileItemClipboard->instance;
0025 }
0026 
0027 bool KFileItemClipboard::isCut(const QUrl &url) const
0028 {
0029     return m_cutItems.contains(url);
0030 }
0031 
0032 QList<QUrl> KFileItemClipboard::cutItems() const
0033 {
0034     return m_cutItems.values();
0035 }
0036 
0037 KFileItemClipboard::~KFileItemClipboard()
0038 {
0039 }
0040 
0041 void KFileItemClipboard::updateCutItems()
0042 {
0043     const QMimeData *mimeData = QApplication::clipboard()->mimeData();
0044 
0045     // mimeData can be 0 according to https://bugs.kde.org/show_bug.cgi?id=335053
0046     if (!mimeData) {
0047         m_cutItems.clear();
0048         Q_EMIT cutItemsChanged();
0049         return;
0050     }
0051 
0052     const QByteArray data = mimeData->data(QStringLiteral("application/x-kde-cutselection"));
0053     const bool isCutSelection = (!data.isEmpty() && data.at(0) == QLatin1Char('1'));
0054     if (isCutSelection) {
0055         const auto urlsFromMimeData = KUrlMimeData::urlsFromMimeData(mimeData);
0056         m_cutItems = QSet<QUrl>(urlsFromMimeData.constBegin(), urlsFromMimeData.constEnd());
0057     } else {
0058         m_cutItems.clear();
0059     }
0060     Q_EMIT cutItemsChanged();
0061 }
0062 
0063 KFileItemClipboard::KFileItemClipboard()
0064     : QObject(nullptr)
0065     , m_cutItems()
0066 {
0067     updateCutItems();
0068 
0069     connect(QApplication::clipboard(), &QClipboard::dataChanged, this, &KFileItemClipboard::updateCutItems);
0070 }
0071 
0072 #include "moc_kfileitemclipboard.cpp"