SortFilterProxyModel/qqmlsortfilterproxymodel.h

161 lines
5.6 KiB
C++

#ifndef QQMLSORTFILTERPROXYMODEL_H
#define QQMLSORTFILTERPROXYMODEL_H
#include <QSortFilterProxyModel>
#include <QQmlParserStatus>
#include "filters/filtercontainer.h"
#include "sorters/sortercontainer.h"
#include "proxyroles/proxyrolecontainer.h"
namespace qqsfpm {
class QQmlSortFilterProxyModel : public QSortFilterProxyModel,
public QQmlParserStatus,
public FilterContainer,
public SorterContainer,
public ProxyRoleContainer
{
Q_OBJECT
Q_INTERFACES(QQmlParserStatus)
Q_INTERFACES(qqsfpm::FilterContainer)
Q_INTERFACES(qqsfpm::SorterContainer)
Q_INTERFACES(qqsfpm::ProxyRoleContainer)
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_PROPERTY(bool delayed READ delayed WRITE setDelayed NOTIFY delayedChanged)
Q_PROPERTY(QString filterRoleName READ filterRoleName WRITE setFilterRoleName NOTIFY filterRoleNameChanged)
Q_PROPERTY(QString filterPattern READ filterPattern WRITE setFilterPattern NOTIFY filterPatternChanged)
Q_PROPERTY(PatternSyntax filterPatternSyntax READ filterPatternSyntax WRITE setFilterPatternSyntax NOTIFY filterPatternSyntaxChanged)
Q_PROPERTY(QVariant filterValue READ filterValue WRITE setFilterValue NOTIFY filterValueChanged)
Q_PROPERTY(QString sortRoleName READ sortRoleName WRITE setSortRoleName NOTIFY sortRoleNameChanged)
Q_PROPERTY(bool ascendingSortOrder READ ascendingSortOrder WRITE setAscendingSortOrder NOTIFY ascendingSortOrderChanged)
Q_PROPERTY(QQmlListProperty<qqsfpm::Filter> filters READ filtersListProperty)
Q_PROPERTY(QQmlListProperty<qqsfpm::Sorter> sorters READ sortersListProperty)
Q_PROPERTY(QQmlListProperty<qqsfpm::ProxyRole> proxyRoles READ proxyRolesListProperty)
public:
enum PatternSyntax {
RegExp = QRegExp::RegExp,
Wildcard = QRegExp::Wildcard,
FixedString = QRegExp::FixedString,
RegExp2 = QRegExp::RegExp2,
WildcardUnix = QRegExp::WildcardUnix,
W3CXmlSchema11 = QRegExp::W3CXmlSchema11 };
Q_ENUM(PatternSyntax)
QQmlSortFilterProxyModel(QObject* parent = 0);
int count() const;
bool delayed() const;
void setDelayed(bool delayed);
const QString& filterRoleName() const;
void setFilterRoleName(const QString& filterRoleName);
QString filterPattern() const;
void setFilterPattern(const QString& filterPattern);
PatternSyntax filterPatternSyntax() const;
void setFilterPatternSyntax(PatternSyntax patternSyntax);
const QVariant& filterValue() const;
void setFilterValue(const QVariant& filterValue);
const QString& sortRoleName() const;
void setSortRoleName(const QString& sortRoleName);
bool ascendingSortOrder() const;
void setAscendingSortOrder(bool ascendingSortOrder);
void classBegin() override;
void componentComplete() override;
QVariant sourceData(const QModelIndex& sourceIndex, const QString& roleName) const;
QVariant sourceData(const QModelIndex& sourceIndex, int role) const;
QVariant data(const QModelIndex& index, int role) const override;
QHash<int, QByteArray> roleNames() const override;
Q_INVOKABLE int roleForName(const QString& roleName) const;
Q_INVOKABLE QVariantMap get(int row) const;
Q_INVOKABLE QVariant get(int row, const QString& roleName) const;
Q_INVOKABLE QModelIndex mapToSource(const QModelIndex& proxyIndex) const override;
Q_INVOKABLE int mapToSource(int proxyRow) const;
Q_INVOKABLE QModelIndex mapFromSource(const QModelIndex& sourceIndex) const override;
Q_INVOKABLE int mapFromSource(int sourceRow) const;
void setSourceModel(QAbstractItemModel *sourceModel) override;
Q_SIGNALS:
void countChanged();
void delayedChanged();
void filterRoleNameChanged();
void filterPatternSyntaxChanged();
void filterPatternChanged();
void filterValueChanged();
void sortRoleNameChanged();
void ascendingSortOrderChanged();
protected:
bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override;
bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const override;
protected Q_SLOTS:
void resetInternalData();
private Q_SLOTS:
void queueInvalidateFilter();
void invalidateFilter();
void queueInvalidate();
void invalidate();
void updateRoleNames();
void updateFilterRole();
void updateSortRole();
void updateRoles();
void initRoles();
void onDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector<int>& roles);
void queueInvalidateProxyRoles();
void invalidateProxyRoles();
private:
QVariantMap modelDataMap(const QModelIndex& modelIndex) const;
void onFilterAppended(Filter* filter) override;
void onFilterRemoved(Filter* filter) override;
void onFiltersCleared() override;
void onSorterAppended(Sorter* sorter) override;
void onSorterRemoved(Sorter* sorter) override;
void onSortersCleared() override;
void onProxyRoleAppended(ProxyRole *proxyRole) override;
void onProxyRoleRemoved(ProxyRole *proxyRole) override;
void onProxyRolesCleared() override;
bool m_delayed;
QString m_filterRoleName;
QVariant m_filterValue;
QString m_sortRoleName;
bool m_ascendingSortOrder = true;
bool m_completed = false;
QHash<int, QByteArray> m_roleNames;
QHash<int, QPair<ProxyRole*, QString>> m_proxyRoleMap;
QVector<int> m_proxyRoleNumbers;
bool m_invalidateFilterQueued = false;
bool m_invalidateQueued = false;
bool m_invalidateProxyRolesQueued = false;
};
}
#endif // QQMLSORTFILTERPROXYMODEL_H