Source code
Revision control
Copy as Markdown
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QRANGEMODEL_H
#define QRANGEMODEL_H
#include <QtCore/qrangemodel_impl.h>
QT_BEGIN_NAMESPACE
class QRangeModelPrivate;
class QCollator;
class Q_CORE_EXPORT QRangeModel : public QAbstractItemModel
{
Q_OBJECT
Q_PROPERTY(QHash<int, QByteArray> roleNames READ roleNames WRITE setRoleNames RESET resetRoleNames
NOTIFY roleNamesChanged FINAL)
Q_PROPERTY(AutoConnectPolicy autoConnectPolicy READ autoConnectPolicy WRITE setAutoConnectPolicy
NOTIFY autoConnectPolicyChanged REVISION(6, 11))
Q_PROPERTY(int sortRole READ sortRole WRITE setSortRole RESET resetSortRole
NOTIFY sortRoleChanged REVISION(6, 12))
Q_PROPERTY(QCollator sortCollator READ sortCollator WRITE setSortCollator
RESET resetSortCollator NOTIFY sortCollatorChanged REVISION(6, 12))
Q_PROPERTY(QCollator matchCollator READ matchCollator WRITE setMatchCollator
RESET resetMatchCollator NOTIFY matchCollatorChanged REVISION(6, 13))
Q_PROPERTY(Qt::DropActions supportedDropActions READ supportedDropActions
WRITE setSupportedDropActions
RESET resetSupportedDropActions
NOTIFY supportedDropActionsChanged REVISION(6, 12))
Q_PROPERTY(Qt::DropActions supportedDragActions READ supportedDragActions
WRITE setSupportedDragActions
RESET resetSupportedDragActions
NOTIFY supportedDragActionsChanged REVISION(6, 12))
Q_CLASSINFO("RegisterEnumClassesUnscoped", "false")
public:
enum class AutoConnectPolicy {
None,
Full,
OnRead,
};
Q_ENUM(AutoConnectPolicy)
enum class RowCategory {
Default,
MultiRoleItem,
};
enum class DropOperation {
DontDrop,
Automatic,
OverwriteAndIgnore,
OverwriteAndExtend,
InsertAsSiblings,
InsertAsChildren,
};
Q_ENUM(DropOperation)
template <typename T>
struct RowOptions {
#ifdef Q_QDOC
static constexpr RowCategory rowCategory;
static QVariant headerData(int section, int role);
static Qt::ItemFlags flags(const T &row);
static QStringList mimeTypes();
static QMimeData *mimeData(const auto &range);
static QMimeData *mimeData(const QModelIndex &range);
static bool canDropMimeData(const QMimeData *mimeData);
static bool canDropMimeData(const QMimeData *mimeData, Qt::DragAction action,
int row, int column, const QModelIndex &parent);
static auto dropMimeData(const QMimeData *mimeData, auto inserter);
static auto dropMimeData(const QMimeData *mimeData, Qt::DragAction action,
int row, int column, const QModelIndex &parent,
auto inserter);
#endif
};
template <typename T>
struct ItemAccess {
#ifdef Q_QDOC
static QVariant readRole(const T &item, int role);
static bool writeRole(T &item, const QVariant &value, int role);
static Qt::ItemFlags flags(const T &item);
static QStringList mimeTypes();
static QMimeData *mimeData(const auto &range);
static QMimeData *mimeData(const QModelIndex &range);
static bool canDropMimeData(const QMimeData *mimeData);
static bool canDropMimeData(const QMimeData *mimeData, Qt::DragAction action,
int row, int column, const QModelIndex &parent);
static auto dropMimeData(const QMimeData *mimeData, auto inserter);
static auto dropMimeData(const QMimeData *mimeData, Qt::DragAction action,
int row, int column, const QModelIndex &parent,
auto inserter);
#endif
};
template <typename Range,
QRangeModelDetails::if_table_range<Range> = true>
explicit QRangeModel(Range &&range, QObject *parent = nullptr)
: QRangeModel(new QGenericTableItemModelImpl<Range>(std::forward<Range>(range), this), parent)
{}
template <typename Range,
QRangeModelDetails::if_tree_range<Range> = true>
explicit QRangeModel(Range &&range, QObject *parent = nullptr)
: QRangeModel(std::forward<Range>(range), QRangeModelDetails::DefaultTreeProtocol<Range>{},
parent)
{}
template <typename Range, typename Protocol,
QRangeModelDetails::if_tree_range<Range, Protocol> = true>
explicit QRangeModel(Range &&range, Protocol &&protocol, QObject *parent = nullptr)
: QRangeModel(new QGenericTreeItemModelImpl<Range, Protocol>(std::forward<Range>(range),
std::forward<Protocol>(protocol),
this),
parent)
{}
~QRangeModel() override;
QModelIndex index(int row, int column, const QModelIndex &parent = {}) const final;
QModelIndex parent(const QModelIndex &child) const final;
QModelIndex sibling(int row, int column, const QModelIndex &index) const final;
int rowCount(const QModelIndex &parent = {}) const final;
int columnCount(const QModelIndex &parent = {}) const final;
Qt::ItemFlags flags(const QModelIndex &index) const override;
QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const override;
bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &data,
int role = Qt::EditRole) override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex &index, const QVariant &data, int role = Qt::EditRole) override;
QMap<int, QVariant> itemData(const QModelIndex &index) const override;
bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &data) override;
bool clearItemData(const QModelIndex &index) override;
bool insertColumns(int column, int count, const QModelIndex &parent = {}) final;
bool removeColumns(int column, int count, const QModelIndex &parent = {}) final;
bool moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count,
const QModelIndex &destParent, int destColumn) final;
bool insertRows(int row, int count, const QModelIndex &parent = {}) final;
bool removeRows(int row, int count, const QModelIndex &parent = {}) final;
bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count,
const QModelIndex &destParent, int destRow) final;
QHash<int, QByteArray> roleNames() const override;
void setRoleNames(const QHash<int, QByteArray> &names);
void resetRoleNames();
bool canFetchMore(const QModelIndex &parent) const override;
void fetchMore(const QModelIndex &parent) override;
bool hasChildren(const QModelIndex &parent = QModelIndex()) const final;
QModelIndex buddy(const QModelIndex &index) const override;
bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
const QModelIndex &parent) const override;
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
const QModelIndex &parent) override;
QMimeData *mimeData(const QModelIndexList &indexes) const override;
QStringList mimeTypes() const override;
QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits,
Qt::MatchFlags flags) const override;
void multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const override;
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
QCollator sortCollator() const;
void setSortCollator(const QCollator &collator);
void resetSortCollator();
QCollator matchCollator() const;
void setMatchCollator(const QCollator &collator);
void resetMatchCollator();
int sortRole() const;
void setSortRole(int role);
void resetSortRole();
QSize span(const QModelIndex &index) const override;
Qt::DropActions supportedDragActions() const override;
void setSupportedDragActions(Qt::DropActions actions);
void resetSupportedDragActions();
Qt::DropActions supportedDropActions() const override;
void setSupportedDropActions(Qt::DropActions actions);
void resetSupportedDropActions();
AutoConnectPolicy autoConnectPolicy() const;
void setAutoConnectPolicy(AutoConnectPolicy policy);
Q_SIGNALS:
void roleNamesChanged();
Q_REVISION(6, 11) void autoConnectPolicyChanged(AutoConnectPolicy policy);
Q_REVISION(6, 12) void sortRoleChanged(int role);
Q_REVISION(6, 12) void sortCollatorChanged(const QCollator &collator);
Q_REVISION(6, 13) void matchCollatorChanged(const QCollator &collator);
Q_REVISION(6, 12) void supportedDragActionsChanged(Qt::DropActions actions);
Q_REVISION(6, 12) void supportedDropActionsChanged(Qt::DropActions actions);
protected Q_SLOTS:
void resetInternalData() override;
protected:
bool event(QEvent *) override;
bool eventFilter(QObject *, QEvent *) override;
private:
Q_DISABLE_COPY_MOVE(QRangeModel)
Q_DECLARE_PRIVATE(QRangeModel)
explicit QRangeModel(QRangeModelImplBase *impl, QObject *parent);
friend class QRangeModelImplBase;
};
// implementation of forwarders
QModelIndex QRangeModelImplBase::createIndex(int row, int column, const void *ptr) const
{
return m_rangeModel->createIndex(row, column, ptr);
}
QModelIndexList QRangeModelImplBase::persistentIndexList() const
{
return m_rangeModel->persistentIndexList();
}
void QRangeModelImplBase::changePersistentIndex(const QModelIndex &from,
const QModelIndex &to)
{
m_rangeModel->changePersistentIndex(from, to);
}
QHash<int, QByteArray> QRangeModelImplBase::roleNames() const
{
return m_rangeModel->roleNames();
}
void QRangeModelImplBase::dataChanged(const QModelIndex &from, const QModelIndex &to,
const QList<int> &roles)
{
m_rangeModel->dataChanged(from, to, roles);
}
void QRangeModelImplBase::beginResetModel()
{
m_rangeModel->beginResetModel();
}
void QRangeModelImplBase::endResetModel()
{
m_rangeModel->endResetModel();
}
void QRangeModelImplBase::beginInsertColumns(const QModelIndex &parent, int start, int count)
{
m_rangeModel->beginInsertColumns(parent, start, count);
}
void QRangeModelImplBase::endInsertColumns()
{
m_rangeModel->endInsertColumns();
}
void QRangeModelImplBase::beginRemoveColumns(const QModelIndex &parent, int start, int count)
{
m_rangeModel->beginRemoveColumns(parent, start, count);
}
void QRangeModelImplBase::endRemoveColumns()
{
m_rangeModel->endRemoveColumns();
}
bool QRangeModelImplBase::beginMoveColumns(const QModelIndex &sourceParent, int sourceFirst,
int sourceLast, const QModelIndex &destParent,
int destColumn)
{
return m_rangeModel->beginMoveColumns(sourceParent, sourceFirst, sourceLast,
destParent, destColumn);
}
void QRangeModelImplBase::endMoveColumns()
{
m_rangeModel->endMoveColumns();
}
void QRangeModelImplBase::beginInsertRows(const QModelIndex &parent, int start, int count)
{
m_rangeModel->beginInsertRows(parent, start, count);
}
void QRangeModelImplBase::endInsertRows()
{
m_rangeModel->endInsertRows();
}
void QRangeModelImplBase::beginRemoveRows(const QModelIndex &parent, int start, int count)
{
m_rangeModel->beginRemoveRows(parent, start, count);
}
void QRangeModelImplBase::endRemoveRows()
{
m_rangeModel->endRemoveRows();
}
bool QRangeModelImplBase::beginMoveRows(const QModelIndex &sourceParent, int sourceFirst,
int sourceLast,
const QModelIndex &destParent, int destRow)
{
return m_rangeModel->beginMoveRows(sourceParent, sourceFirst, sourceLast, destParent, destRow);
}
void QRangeModelImplBase::endMoveRows()
{
m_rangeModel->endMoveRows();
}
void QRangeModelImplBase::beginLayoutChange()
{
Q_EMIT m_rangeModel->layoutAboutToBeChanged();
}
void QRangeModelImplBase::endLayoutChange()
{
Q_EMIT m_rangeModel->layoutChanged();
}
QAbstractItemModel &QRangeModelImplBase::itemModel()
{
return *m_rangeModel;
}
const QAbstractItemModel &QRangeModelImplBase::itemModel() const
{
return *m_rangeModel;
}
QRangeModelImplBase::AutoConnectPolicy QRangeModelImplBase::autoConnectPolicy() const
{
return QRangeModelImplBase::AutoConnectPolicy(m_rangeModel->autoConnectPolicy());
}
Qt::weak_ordering QRangeModelImplBase::compareData(const QVariant &lhs, const QVariant &rhs,
const QCollator *collator)
{
return collator ? QRangeModel::compareData(lhs, rhs, *collator)
: QRangeModel::compareData(lhs, rhs);
}
// Helper templates that we can forward declare in the _impl header,
// where QRangeModel is not yet defined.
namespace QRangeModelDetails
{
template <typename T>
struct QRangeModelRowOptions : QRangeModel::RowOptions<T> {};
template <typename T>
struct QRangeModelItemAccess : QRangeModel::ItemAccess<T> {};
}
QT_END_NAMESPACE
#endif // QRANGEMODEL_H