Files
QtModelsToolkit/toolkit/include/qtmodelstoolkit/leftjoinmodel.h

91 lines
2.5 KiB
C++
Raw Permalink Normal View History

2025-06-10 13:39:28 +02:00
#pragma once
#include <QAbstractListModel>
#include <QPointer>
#include <QCache>
2025-06-10 13:39:28 +02:00
namespace qtmt {
2025-07-02 12:05:20 +02:00
class LeftJoinModel : public QAbstractListModel
2025-06-10 13:39:28 +02:00
{
Q_OBJECT
Q_PROPERTY(QAbstractItemModel* leftModel READ leftModel
WRITE setLeftModel NOTIFY leftModelChanged)
Q_PROPERTY(QAbstractItemModel* rightModel READ rightModel
WRITE setRightModel NOTIFY rightModelChanged)
Q_PROPERTY(QString joinRole READ joinRole
WRITE setJoinRole NOTIFY joinRoleChanged)
Q_PROPERTY(QStringList rolesToJoin READ rolesToJoin
WRITE setRolesToJoin NOTIFY rolesToJoinChanged)
Q_PROPERTY(qsizetype cacheSize READ cacheSize WRITE setCacheSize NOTIFY cacheSizeChanged)
2025-06-10 13:39:28 +02:00
public:
explicit LeftJoinModel(QObject* parent = nullptr);
void setLeftModel(QAbstractItemModel* model);
QAbstractItemModel* leftModel() const;
void setRightModel(QAbstractItemModel* model);
QAbstractItemModel* rightModel() const;
void setJoinRole(const QString& joinRole);
const QString& joinRole() const;
void setRolesToJoin(const QStringList& roles);
const QStringList& rolesToJoin() const;
qsizetype cacheSize() const;
void setCacheSize(qsizetype size);
2025-06-10 13:39:28 +02:00
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QHash<int, QByteArray> roleNames() const override;
QVariant data(const QModelIndex& index, int role) const override;
signals:
void leftModelChanged();
void rightModelChanged();
void joinRoleChanged();
void rolesToJoinChanged();
void cacheSizeChanged();
2025-06-10 13:39:28 +02:00
private:
void initializeIfReady(bool reset);
void initialize(bool reset);
void connectLeftModelSignals();
void connectRightModelSignals();
void clearCache();
2025-06-10 13:39:28 +02:00
int m_rightModelRolesOffset = 0;
QHash<int, QByteArray> m_leftRoleNames;
QHash<int, QByteArray> m_rightRoleNames;
QHash<int, QByteArray> m_roleNames;
2025-07-02 12:05:20 +02:00
mutable bool m_rolesFetched = false;
2025-06-10 13:39:28 +02:00
QVector<int> m_joinedRoles;
QString m_joinRole;
QStringList m_rolesToJoin;
int m_leftModelJoinRole = 0;
int m_rightModelJoinRole = 0;
QPointer<QAbstractItemModel> m_leftModel;
QPointer<QAbstractItemModel> m_rightModel;
bool m_initialized = false;
// LRU cache for right model
qsizetype m_cacheSize = 1000;
mutable QCache<QVariant, QPersistentModelIndex> m_rightModelCache;
2025-06-10 13:39:28 +02:00
// helpers for handling layoutChanged from source
QList<QPersistentModelIndex> m_layoutChangePersistentIndexes;
QModelIndexList m_proxyIndexes;
};
} // namespace qtmt