| 1 | // Copyright (C) 2017 Ford Motor Company |
| 2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
| 3 | |
| 4 | #ifndef QREMOTEOBJECTS_ABSTRACT_ITEM_ADAPTER_P_H |
| 5 | #define QREMOTEOBJECTS_ABSTRACT_ITEM_ADAPTER_P_H |
| 6 | |
| 7 | // |
| 8 | // W A R N I N G |
| 9 | // ------------- |
| 10 | // |
| 11 | // This file is not part of the Qt API. It exists purely as an |
| 12 | // implementation detail. This header file may change from version to |
| 13 | // version without notice, or even be removed. |
| 14 | // |
| 15 | // We mean it. |
| 16 | // |
| 17 | |
| 18 | #include "qremoteobjectabstractitemmodeltypes_p.h" |
| 19 | #include "qremoteobjectsource.h" |
| 20 | |
| 21 | #include <QtCore/qsize.h> |
| 22 | |
| 23 | QT_BEGIN_NAMESPACE |
| 24 | |
| 25 | class QAbstractItemModel; |
| 26 | class QItemSelectionModel; |
| 27 | |
| 28 | class QAbstractItemModelSourceAdapter : public QObject |
| 29 | { |
| 30 | Q_OBJECT |
| 31 | public: |
| 32 | Q_INVOKABLE explicit QAbstractItemModelSourceAdapter(QAbstractItemModel *object, QItemSelectionModel *sel, const QList<int> &roles = QList<int>()); |
| 33 | Q_PROPERTY(QList<int> availableRoles READ availableRoles WRITE setAvailableRoles NOTIFY availableRolesChanged) |
| 34 | Q_PROPERTY(QIntHash roleNames READ roleNames) |
| 35 | static void registerTypes(); |
| 36 | QItemSelectionModel* selectionModel() const; |
| 37 | |
| 38 | public Q_SLOTS: |
| 39 | QList<int> availableRoles() const { return m_availableRoles; } |
| 40 | void setAvailableRoles(QList<int> availableRoles) |
| 41 | { |
| 42 | if (availableRoles != m_availableRoles) |
| 43 | { |
| 44 | m_availableRoles = availableRoles; |
| 45 | Q_EMIT availableRolesChanged(); |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | QIntHash roleNames() const {return m_model->roleNames();} |
| 50 | |
| 51 | QSize replicaSizeRequest(QtPrivate::IndexList parentList); |
| 52 | QtPrivate::DataEntries replicaRowRequest(QtPrivate::IndexList start, QtPrivate::IndexList end, QList<int> roles); |
| 53 | QVariantList (QList<Qt::Orientation> orientations, QList<int> sections, QList<int> roles); |
| 54 | void replicaSetCurrentIndex(QtPrivate::IndexList index, QItemSelectionModel::SelectionFlags command); |
| 55 | void replicaSetData(const QtPrivate::IndexList &index, const QVariant &value, int role); |
| 56 | QtPrivate::MetaAndDataEntries replicaCacheRequest(size_t size, const QList<int> &roles); |
| 57 | |
| 58 | void sourceDataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight, const QList<int> & roles = QList<int> ()) const; |
| 59 | void sourceRowsInserted(const QModelIndex & parent, int start, int end); |
| 60 | void sourceColumnsInserted(const QModelIndex & parent, int start, int end); |
| 61 | void sourceRowsRemoved(const QModelIndex & parent, int start, int end); |
| 62 | void sourceRowsMoved(const QModelIndex & sourceParent, int sourceRow, int count, const QModelIndex & destinationParent, int destinationChild) const; |
| 63 | void sourceCurrentChanged(const QModelIndex & current, const QModelIndex & previous); |
| 64 | void sourceLayoutChanged(const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint); |
| 65 | Q_SIGNALS: |
| 66 | void availableRolesChanged(); |
| 67 | void dataChanged(QtPrivate::IndexList topLeft, QtPrivate::IndexList bottomRight, QList<int> roles) const; |
| 68 | void rowsInserted(QtPrivate::IndexList parent, int start, int end) const; |
| 69 | void rowsRemoved(QtPrivate::IndexList parent, int start, int end) const; |
| 70 | void rowsMoved(QtPrivate::IndexList sourceParent, int sourceRow, int count, QtPrivate::IndexList destinationParent, int destinationChild) const; |
| 71 | void currentChanged(QtPrivate::IndexList current, QtPrivate::IndexList previous); |
| 72 | void columnsInserted(QtPrivate::IndexList parent, int start, int end) const; |
| 73 | void layoutChanged(QtPrivate::IndexList parents, QAbstractItemModel::LayoutChangeHint hint); |
| 74 | |
| 75 | private: |
| 76 | QAbstractItemModelSourceAdapter(); |
| 77 | QList<QtPrivate::IndexValuePair> fetchTree(const QModelIndex &parent, size_t &size, const QList<int> &roles); |
| 78 | |
| 79 | QAbstractItemModel *m_model; |
| 80 | QItemSelectionModel *m_selectionModel; |
| 81 | QList<int> m_availableRoles; |
| 82 | }; |
| 83 | |
| 84 | template <class ObjectType, class AdapterType> |
| 85 | struct QAbstractItemAdapterSourceAPI : public SourceApiMap |
| 86 | { |
| 87 | QAbstractItemAdapterSourceAPI(const QString &name) |
| 88 | : SourceApiMap() |
| 89 | , m_signalArgTypes {} |
| 90 | , m_methodArgTypes {} |
| 91 | , m_name(name) |
| 92 | { |
| 93 | m_properties[0] = 2; |
| 94 | m_properties[1] = QtPrivate::qtro_property_index<AdapterType>(&AdapterType::availableRoles, static_cast<QList<int> (QObject::*)()>(nullptr),"availableRoles" ); |
| 95 | m_properties[2] = QtPrivate::qtro_property_index<AdapterType>(&AdapterType::roleNames, static_cast<QIntHash (QObject::*)()>(nullptr),"roleNames" ); |
| 96 | m_signals[0] = 10; |
| 97 | m_signals[1] = QtPrivate::qtro_signal_index<AdapterType>(&AdapterType::availableRolesChanged, static_cast<void (QObject::*)()>(nullptr),m_signalArgCount+0,&m_signalArgTypes[0]); |
| 98 | m_signals[2] = QtPrivate::qtro_signal_index<AdapterType>(&AdapterType::dataChanged, static_cast<void (QObject::*)(QtPrivate::IndexList,QtPrivate::IndexList,QList<int>)>(nullptr),m_signalArgCount+1,&m_signalArgTypes[1]); |
| 99 | m_signals[3] = QtPrivate::qtro_signal_index<AdapterType>(&AdapterType::rowsInserted, static_cast<void (QObject::*)(QtPrivate::IndexList,int,int)>(nullptr),m_signalArgCount+2,&m_signalArgTypes[2]); |
| 100 | m_signals[4] = QtPrivate::qtro_signal_index<AdapterType>(&AdapterType::rowsRemoved, static_cast<void (QObject::*)(QtPrivate::IndexList,int,int)>(nullptr),m_signalArgCount+3,&m_signalArgTypes[3]); |
| 101 | m_signals[5] = QtPrivate::qtro_signal_index<AdapterType>(&AdapterType::rowsMoved, static_cast<void (QObject::*)(QtPrivate::IndexList,int,int,QtPrivate::IndexList,int)>(nullptr),m_signalArgCount+4,&m_signalArgTypes[4]); |
| 102 | m_signals[6] = QtPrivate::qtro_signal_index<AdapterType>(&AdapterType::currentChanged, static_cast<void (QObject::*)(QtPrivate::IndexList,QtPrivate::IndexList)>(nullptr),m_signalArgCount+5,&m_signalArgTypes[5]); |
| 103 | m_signals[7] = QtPrivate::qtro_signal_index<ObjectType>(&ObjectType::modelReset, static_cast<void (QObject::*)()>(nullptr),m_signalArgCount+6,&m_signalArgTypes[6]); |
| 104 | m_signals[8] = QtPrivate::qtro_signal_index<ObjectType>(&ObjectType::headerDataChanged, static_cast<void (QObject::*)(Qt::Orientation,int,int)>(nullptr),m_signalArgCount+7,&m_signalArgTypes[7]); |
| 105 | m_signals[9] = QtPrivate::qtro_signal_index<AdapterType>(&AdapterType::columnsInserted, static_cast<void (QObject::*)(QtPrivate::IndexList,int,int)>(nullptr),m_signalArgCount+8,&m_signalArgTypes[8]); |
| 106 | m_signals[10] = QtPrivate::qtro_signal_index<AdapterType>(&AdapterType::layoutChanged, static_cast<void (QObject::*)(QtPrivate::IndexList,QAbstractItemModel::LayoutChangeHint)>(nullptr),m_signalArgCount+9,&m_signalArgTypes[9]); |
| 107 | m_methods[0] = 6; |
| 108 | m_methods[1] = QtPrivate::qtro_method_index<AdapterType>(&AdapterType::replicaSizeRequest, static_cast<void (QObject::*)(QtPrivate::IndexList)>(nullptr),"replicaSizeRequest(QtPrivate::IndexList)" ,m_methodArgCount+0,&m_methodArgTypes[0]); |
| 109 | m_methods[2] = QtPrivate::qtro_method_index<AdapterType>(&AdapterType::replicaRowRequest, static_cast<void (QObject::*)(QtPrivate::IndexList,QtPrivate::IndexList,QList<int>)>(nullptr),"replicaRowRequest(QtPrivate::IndexList,QtPrivate::IndexList,QList<int>)" ,m_methodArgCount+1,&m_methodArgTypes[1]); |
| 110 | m_methods[3] = QtPrivate::qtro_method_index<AdapterType>(&AdapterType::replicaHeaderRequest, static_cast<void (QObject::*)(QList<Qt::Orientation>,QList<int>,QList<int>)>(nullptr),"replicaHeaderRequest(QList<Qt::Orientation>,QList<int>,QList<int>)" ,m_methodArgCount+2,&m_methodArgTypes[2]); |
| 111 | m_methods[4] = QtPrivate::qtro_method_index<AdapterType>(&AdapterType::replicaSetCurrentIndex, static_cast<void (QObject::*)(QtPrivate::IndexList,QItemSelectionModel::SelectionFlags)>(nullptr),"replicaSetCurrentIndex(QtPrivate::IndexList,QItemSelectionModel::SelectionFlags)" ,m_methodArgCount+3,&m_methodArgTypes[3]); |
| 112 | m_methods[5] = QtPrivate::qtro_method_index<AdapterType>(&AdapterType::replicaSetData, static_cast<void (QObject::*)(QtPrivate::IndexList,QVariant,int)>(nullptr),"replicaSetData(QtPrivate::IndexList,QVariant,int)" ,m_methodArgCount+4,&m_methodArgTypes[4]); |
| 113 | m_methods[6] = QtPrivate::qtro_method_index<AdapterType>(&AdapterType::replicaCacheRequest, static_cast<void (QObject::*)(size_t,QList<int>)>(nullptr),"replicaCacheRequest(size_t,QList<int>)" ,m_methodArgCount+5,&m_methodArgTypes[5]); |
| 114 | } |
| 115 | |
| 116 | QString name() const override { return m_name; } |
| 117 | QString typeName() const override { return QStringLiteral("QAbstractItemModelAdapter" ); } |
| 118 | int enumCount() const override { return 0; } |
| 119 | int propertyCount() const override { return m_properties[0]; } |
| 120 | int signalCount() const override { return m_signals[0]; } |
| 121 | int methodCount() const override { return m_methods[0]; } |
| 122 | int sourceEnumIndex(int /*index*/) const override |
| 123 | { |
| 124 | return -1; |
| 125 | } |
| 126 | int sourcePropertyIndex(int index) const override |
| 127 | { |
| 128 | if (index < 0 || index >= m_properties[0]) |
| 129 | return -1; |
| 130 | return m_properties[index+1]; |
| 131 | } |
| 132 | int sourceSignalIndex(int index) const override |
| 133 | { |
| 134 | if (index < 0 || index >= m_signals[0]) |
| 135 | return -1; |
| 136 | return m_signals[index+1]; |
| 137 | } |
| 138 | int sourceMethodIndex(int index) const override |
| 139 | { |
| 140 | if (index < 0 || index >= m_methods[0]) |
| 141 | return -1; |
| 142 | return m_methods[index+1]; |
| 143 | } |
| 144 | int signalParameterCount(int index) const override { return m_signalArgCount[index]; } |
| 145 | int signalParameterType(int sigIndex, int paramIndex) const override { return m_signalArgTypes[sigIndex][paramIndex]; } |
| 146 | int methodParameterCount(int index) const override { return m_methodArgCount[index]; } |
| 147 | int methodParameterType(int methodIndex, int paramIndex) const override { return m_methodArgTypes[methodIndex][paramIndex]; } |
| 148 | QByteArrayList signalParameterNames(int index) const override |
| 149 | { |
| 150 | QByteArrayList res; |
| 151 | int count = signalParameterCount(index); |
| 152 | while (count--) |
| 153 | res << QByteArray{}; |
| 154 | return res; |
| 155 | } |
| 156 | int propertyIndexFromSignal(int index) const override |
| 157 | { |
| 158 | switch (index) { |
| 159 | case 0: return m_properties[1]; |
| 160 | } |
| 161 | return -1; |
| 162 | } |
| 163 | int propertyRawIndexFromSignal(int index) const override |
| 164 | { |
| 165 | switch (index) { |
| 166 | case 0: return 0; |
| 167 | } |
| 168 | return -1; |
| 169 | } |
| 170 | const QByteArray signalSignature(int index) const override |
| 171 | { |
| 172 | switch (index) { |
| 173 | case 0: return QByteArrayLiteral("availableRolesChanged()" ); |
| 174 | case 1: return QByteArrayLiteral("dataChanged(QtPrivate::IndexList,QtPrivate::IndexList,QList<int>)" ); |
| 175 | case 2: return QByteArrayLiteral("rowsInserted(QtPrivate::IndexList,int,int)" ); |
| 176 | case 3: return QByteArrayLiteral("rowsRemoved(QtPrivate::IndexList,int,int)" ); |
| 177 | case 4: return QByteArrayLiteral("rowsMoved(QtPrivate::IndexList,int,int,QtPrivate::IndexList,int)" ); |
| 178 | case 5: return QByteArrayLiteral("currentChanged(QtPrivate::IndexList,QtPrivate::IndexList)" ); |
| 179 | case 6: return QByteArrayLiteral("resetModel()" ); |
| 180 | case 7: return QByteArrayLiteral("headerDataChanged(Qt::Orientation,int,int)" ); |
| 181 | case 8: return QByteArrayLiteral("columnsInserted(QtPrivate::IndexList,int,int)" ); |
| 182 | case 9: return QByteArrayLiteral("layoutChanged(QtPrivate::IndexList,QAbstractItemModel::LayoutChangeHint)" ); |
| 183 | } |
| 184 | return QByteArrayLiteral("" ); |
| 185 | } |
| 186 | const QByteArray methodSignature(int index) const override |
| 187 | { |
| 188 | switch (index) { |
| 189 | case 0: return QByteArrayLiteral("replicaSizeRequest(QtPrivate::IndexList)" ); |
| 190 | case 1: return QByteArrayLiteral("replicaRowRequest(QtPrivate::IndexList,QtPrivate::IndexList,QList<int>)" ); |
| 191 | case 2: return QByteArrayLiteral("replicaHeaderRequest(QList<Qt::Orientation>,QList<int>,QList<int>)" ); |
| 192 | case 3: return QByteArrayLiteral("replicaSetCurrentIndex(QtPrivate::IndexList,QItemSelectionModel::SelectionFlags)" ); |
| 193 | case 4: return QByteArrayLiteral("replicaSetData(QtPrivate::IndexList,QVariant,int)" ); |
| 194 | case 5: return QByteArrayLiteral("replicaCacheRequest(size_t,QList<int>)" ); |
| 195 | } |
| 196 | return QByteArrayLiteral("" ); |
| 197 | } |
| 198 | QMetaMethod::MethodType methodType(int) const override |
| 199 | { |
| 200 | return QMetaMethod::Slot; |
| 201 | } |
| 202 | const QByteArray typeName(int index) const override |
| 203 | { |
| 204 | switch (index) { |
| 205 | case 0: return QByteArrayLiteral("QSize" ); |
| 206 | case 1: return QByteArrayLiteral("QtPrivate::DataEntries" ); |
| 207 | case 2: return QByteArrayLiteral("QVariantList" ); |
| 208 | case 3: return QByteArrayLiteral("" ); |
| 209 | case 5: return QByteArrayLiteral("QtPrivate::MetaAndDataEntries" ); |
| 210 | } |
| 211 | return QByteArrayLiteral("" ); |
| 212 | } |
| 213 | |
| 214 | QByteArrayList methodParameterNames(int index) const override |
| 215 | { |
| 216 | QByteArrayList res; |
| 217 | int count = methodParameterCount(index); |
| 218 | while (count--) |
| 219 | res << QByteArray{}; |
| 220 | return res; |
| 221 | } |
| 222 | |
| 223 | QByteArray objectSignature() const override { return QByteArray{}; } |
| 224 | bool isAdapterSignal(int index) const override |
| 225 | { |
| 226 | switch (index) { |
| 227 | case 0: |
| 228 | case 1: |
| 229 | case 2: |
| 230 | case 3: |
| 231 | case 4: |
| 232 | case 5: |
| 233 | case 8: |
| 234 | case 9: |
| 235 | return true; |
| 236 | } |
| 237 | return false; |
| 238 | } |
| 239 | bool isAdapterMethod(int index) const override |
| 240 | { |
| 241 | switch (index) { |
| 242 | case 0: |
| 243 | case 1: |
| 244 | case 2: |
| 245 | case 3: |
| 246 | case 4: |
| 247 | case 5: |
| 248 | return true; |
| 249 | } |
| 250 | return false; |
| 251 | } |
| 252 | bool isAdapterProperty(int index) const override |
| 253 | { |
| 254 | switch (index) { |
| 255 | case 0: |
| 256 | case 1: |
| 257 | return true; |
| 258 | } |
| 259 | return false; |
| 260 | } |
| 261 | |
| 262 | int m_properties[3]; |
| 263 | int m_signals[11]; |
| 264 | int m_methods[7]; |
| 265 | int m_signalArgCount[10]; |
| 266 | const int* m_signalArgTypes[10]; |
| 267 | int m_methodArgCount[6]; |
| 268 | const int* m_methodArgTypes[6]; |
| 269 | QString m_name; |
| 270 | }; |
| 271 | |
| 272 | QT_END_NAMESPACE |
| 273 | |
| 274 | #endif //QREMOTEOBJECTS_ABSTRACT_ITEM_ADAPTER_P_H |
| 275 | |