1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "spreadmimedataprovider.h"
#include <QMimeData>
#ifndef QT_NO_CLIPBOARD
#include <QGuiApplication>
#include <QClipboard>
#endif
namespace {
static inline constexpr auto MIMETYPE_SPREADMODEL = "application/x-qtexamplespreadmodel";
static inline constexpr auto MIMETYPE_SELECTEDDATA = "model/data";
static inline constexpr auto MIMETYPE_TEXT = "text/plain";
}
QMimeData *SpreadMimeDataProvider::saveToMimeData() const
{
if (m_data.empty())
return nullptr;
QByteArray data;
QDataStream stream{&data, QDataStream::WriteOnly};
for (auto it = m_data.begin(); it != m_data.end(); ++it) {
const QPoint &cell = it->first;
const QMap<int, QVariant> &item_data = it->second;
stream << cell.x() << cell.y() << item_data;
}
QMimeData *mime_data = new QMimeData{};
mime_data->setData(MIMETYPE_SPREADMODEL, QByteArray{});
mime_data->setData(MIMETYPE_SELECTEDDATA, data);
return mime_data;
}
bool SpreadMimeDataProvider::loadFromMimeData(const QMimeData *mimeData)
{
if (!mimeData)
return false;
if (!mimeData->hasFormat(MIMETYPE_SPREADMODEL))
return false;
QByteArray data = mimeData->data(MIMETYPE_SELECTEDDATA);
QDataStream stream{&data, QDataStream::ReadOnly};
while (!stream.atEnd()) {
QPoint cell;
QMap<int, QVariant> item_data;
stream >> cell.rx() >> cell.ry() >> item_data;
m_data.push_back(std::make_pair(cell, item_data));
}
return true;
}
bool SpreadMimeDataProvider::saveToClipboard()
{
#ifdef QT_NO_CLIPBOARD
qWarning() << "Clipboard is not supported";
return false;
#else
QMimeData *mime_data = saveToMimeData();
if (!mime_data)
return false;
QGuiApplication::clipboard()->setMimeData(mime_data);
return true;
#endif
}
bool SpreadMimeDataProvider::loadFromClipboard()
{
#ifdef QT_NO_CLIPBOARD
qWarning() << "Clipboard is not supported";
return false;
#else
const QMimeData *mime_data = QGuiApplication::clipboard()->mimeData();
if (!mime_data)
return false;
return loadFromMimeData(mime_data);
#endif
}
bool SpreadMimeDataProvider::saveDataToModel(int index,
const QModelIndex &modelIndex,
QAbstractItemModel *model) const
{
const QMap<int, QVariant> &item_data = m_data.at(index).second;
return item_data.isEmpty() ? model->clearItemData(modelIndex)
: model->setItemData(modelIndex, item_data);
}
void SpreadMimeDataProvider::loadDataFromModel(const QPoint &cell,
const QModelIndex &index,
const QAbstractItemModel *model)
{
const QMap<int, QVariant> &item_data = model->itemData(index);
m_data.push_back(std::make_pair(cell, item_data));
}
|