diff options
Diffstat (limited to 'examples/nfc/ndefeditor/ndefmessagemodel.cpp')
-rw-r--r-- | examples/nfc/ndefeditor/ndefmessagemodel.cpp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/examples/nfc/ndefeditor/ndefmessagemodel.cpp b/examples/nfc/ndefeditor/ndefmessagemodel.cpp new file mode 100644 index 00000000..177d21dc --- /dev/null +++ b/examples/nfc/ndefeditor/ndefmessagemodel.cpp @@ -0,0 +1,156 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "ndefmessagemodel.h" + +#include <QNdefNfcTextRecord> +#include <QNdefNfcUriRecord> + +NdefMessageModel::NdefMessageModel(QObject *parent) : QAbstractListModel(parent) { } + +int NdefMessageModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + + return m_message.size(); +} + +static NdefMessageModel::RecordType getRecordType(const QNdefRecord &record) +{ + if (record.isRecordType<QNdefNfcTextRecord>()) { + return NdefMessageModel::TextRecord; + } else if (record.isRecordType<QNdefNfcUriRecord>()) { + return NdefMessageModel::UriRecord; + } + return NdefMessageModel::OtherRecord; +} + +static QString getText(const QNdefRecord &record) +{ + if (record.isRecordType<QNdefNfcTextRecord>()) { + QNdefNfcTextRecord r(record); + return r.text(); + } else if (record.isRecordType<QNdefNfcUriRecord>()) { + QNdefNfcUriRecord r(record); + return r.uri().toString(); + } + return record.payload().toHex(':'); +} + +QVariant NdefMessageModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return {}; + + if (index.row() < 0 || index.row() >= m_message.size()) + return {}; + + const auto &record = m_message.at(index.row()); + + switch (role) { + case RecordTypeRole: + return getRecordType(record); + case RecordTextRole: + return getText(record); + default: + return {}; + } +} + +QHash<int, QByteArray> NdefMessageModel::roleNames() const +{ + QHash<int, QByteArray> names; + names[RecordTypeRole] = "recordType"; + names[RecordTextRole] = "recordText"; + return names; +} + +bool NdefMessageModel::removeRows(int row, int count, const QModelIndex &parent) +{ + if (parent.isValid()) + return false; + if (row < 0 || count <= 0) + return false; + if (row >= m_message.size() || (m_message.size() - row) < count) + return false; + + beginRemoveRows(parent, row, row + count - 1); + m_message.remove(row, count); + endRemoveRows(); + Q_EMIT messageChanged(); + + return true; +} + +QNdefMessage NdefMessageModel::message() const +{ + return m_message; +} + +void NdefMessageModel::setMessage(const QNdefMessage &newMessage) +{ + if (m_message == newMessage) + return; + + beginResetModel(); + m_message = newMessage; + endResetModel(); + + Q_EMIT messageChanged(); +} + +void NdefMessageModel::clearMessage() +{ + if (m_message.isEmpty()) + return; + removeRows(0, m_message.size(), {}); +} + +void NdefMessageModel::addTextRecord(const QString &text) +{ + QNdefNfcTextRecord record; + record.setText(text); + + const auto newRow = m_message.size(); + beginInsertRows({}, newRow, newRow); + m_message.append(std::move(record)); + endInsertRows(); + Q_EMIT messageChanged(); +} + +void NdefMessageModel::addUriRecord(const QString &uri) +{ + QNdefNfcUriRecord record; + record.setUri(QUrl(uri)); + + const auto newRow = m_message.size(); + beginInsertRows({}, newRow, newRow); + m_message.append(std::move(record)); + endInsertRows(); + Q_EMIT messageChanged(); +} + +void NdefMessageModel::setTextData(int row, const QString &text) +{ + if (row < 0 || row >= m_message.size()) + return; + + const auto &record = m_message.at(row); + + if (record.isRecordType<QNdefNfcTextRecord>()) { + QNdefNfcTextRecord r(record); + r.setText(text); + m_message[row] = r; + } else if (record.isRecordType<QNdefNfcUriRecord>()) { + QNdefNfcUriRecord r(record); + r.setUri(text); + m_message[row] = r; + } else { + return; + } + + const auto idx = index(row); + Q_EMIT dataChanged(idx, idx, { RecordTextRole }); + Q_EMIT messageChanged(); +} |