34 explicit QAndroidItemModelProxy(QtJniTypes::JQtAbstractItemModel jInstance)
35 : jInstance(jInstance)
39 int columnCount(
const QModelIndex &parent = QModelIndex())
const override;
40 QVariant data(
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
41 QModelIndex index(
int row,
int column,
42 const QModelIndex &parent = QModelIndex())
const override;
43 QModelIndex parent(
const QModelIndex &index)
const override;
44 int rowCount(
const QModelIndex &parent = QModelIndex())
const override;
46 bool canFetchMore(
const QModelIndex &parent)
const override;
47 bool canFetchMoreDefault(
const QModelIndex &parent)
const;
48 QHash<
int, QByteArray> roleNames()
const override;
49 QHash<
int, QByteArray> defaultRoleNames()
const;
50 void fetchMore(
const QModelIndex &parent) override;
51 void fetchMoreDefault(
const QModelIndex &parent);
52 bool hasChildren(
const QModelIndex &parent)
const override;
53 bool hasChildrenDefault(
const QModelIndex &parent)
const;
54 QModelIndex sibling(
int row,
int column,
const QModelIndex &parent)
const override;
55 QModelIndex siblingDefault(
int row,
int column,
const QModelIndex &parent);
56 bool setData(
const QModelIndex &index,
const QVariant &value,
int role = Qt::EditRole) override;
57 bool setDataDefault(
const QModelIndex &index,
const QVariant &value,
int role);
59 Q_REQUIRED_RESULT
static QAbstractItemModel *
60 nativeInstance(QtJniTypes::JQtAbstractItemModel itemModel);
61 Q_REQUIRED_RESULT
static QAbstractItemModel *createNativeProxy(QJniObject itemModel);
62 static QJniObject createProxy(QAbstractItemModel *abstractClass);
64 template <
typename Func,
typename... Args>
65 static auto invokeNativeProxyMethod(JNIEnv * , jobject jvmObject, Func &&func,
69 auto model = qobject_cast<QAndroidItemModelProxy *>(nativeInstance(jvmObject));
71 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(model);
72 return std::invoke(std::forward<Func>(func), model, std::forward<Args>(args)...);
75 template <
typename Func,
typename... Args>
76 static auto invokeNativeMethod(JNIEnv * , jobject jvmObject, Func &&func, Args &&...args)
79 auto model = nativeInstance(jvmObject);
81 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(model);
82 return std::invoke(std::forward<Func>(func), model, std::forward<Args>(args)...);
85 template <
typename Func1,
typename Func2,
typename... Args>
86 static auto invokeNativeImpl(JNIEnv * , jobject jvmObject, Func1 &&defaultFunc,
87 Func2 &&func, Args &&...args)
90 auto nativeModel = nativeInstance(jvmObject);
91 auto nativeProxyModel = qobject_cast<QAndroidItemModelProxy *>(nativeModel);
92 const QMutexLocker<QRecursiveMutex> lock = getMutexLocker(nativeModel);
94 return std::invoke(std::forward<Func1>(defaultFunc), nativeProxyModel,
95 std::forward<Args>(args)...);
98 return std::invoke(std::forward<Func2>(func), nativeModel, std::forward<Args>(args)...);
101 static jint jni_columnCount(JNIEnv *env, jobject object, JQtModelIndex parent);
102 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_columnCount)
104 static jobject jni_data(JNIEnv *env, jobject object, JQtModelIndex index, jint role);
105 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_data)
107 static jobject jni_index(JNIEnv *env, jobject object, jint row, jint column,
108 JQtModelIndex parent);
109 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_index)
111 static jobject jni_parent(JNIEnv *env, jobject object, JQtModelIndex index);
112 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_parent)
114 static jint jni_rowCount(JNIEnv *env, jobject object, JQtModelIndex parent);
115 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_rowCount)
117 static jboolean jni_canFetchMore(JNIEnv *env, jobject object, JQtModelIndex parent);
118 QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE_2(jni_canFetchMore, canFetchMore)
120 static void jni_fetchMore(JNIEnv *env, jobject object, JQtModelIndex parent);
121 QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE_2(jni_fetchMore, fetchMore)
123 static jboolean jni_hasChildren(JNIEnv *env, jobject object, JQtModelIndex parent);
124 QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE_2(jni_hasChildren, hasChildren)
126 static jboolean jni_hasIndex(JNIEnv *env, jobject object, jint row, jint column,
127 JQtModelIndex parent);
128 QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE_2(jni_hasIndex, hasIndex)
130 static jobject jni_roleNames(JNIEnv *env, jobject object);
131 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_roleNames)
133 static void jni_beginInsertColumns(JNIEnv *env, jobject object, JQtModelIndex parent,
134 jint first, jint last);
135 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_beginInsertColumns)
137 static void jni_beginInsertRows(JNIEnv *env, jobject object, JQtModelIndex parent, jint first,
139 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_beginInsertRows)
141 static jboolean jni_beginMoveColumns(JNIEnv *env, jobject object, JQtModelIndex sourceParent,
142 jint sourceFirst, jint sourceLast,
143 JQtModelIndex destinationParent, jint destinationChild);
144 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_beginMoveColumns)
146 static jboolean jni_beginMoveRows(JNIEnv *env, jobject object, JQtModelIndex sourceParent,
147 jint sourceFirst, jint sourceLast,
148 JQtModelIndex destinationParent, jint destinationChild);
149 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_beginMoveRows)
151 static void jni_beginRemoveColumns(JNIEnv *env, jobject object, JQtModelIndex parent,
152 jint first, jint last);
153 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_beginRemoveColumns)
155 static void jni_beginRemoveRows(JNIEnv *env, jobject object, JQtModelIndex parent, jint first,
157 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_beginRemoveRows)
159 static void jni_beginResetModel(JNIEnv *env, jobject object);
160 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_beginResetModel)
162 static jobject jni_createIndex(JNIEnv *env, jobject object, jint row, jint column, jlong id);
163 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_createIndex)
165 static void jni_endInsertColumns(JNIEnv *env, jobject object);
166 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_endInsertColumns)
168 static void jni_endInsertRows(JNIEnv *env, jobject object);
169 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_endInsertRows)
171 static void jni_endMoveColumns(JNIEnv *env, jobject object);
172 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_endMoveColumns)
174 static void jni_endMoveRows(JNIEnv *env, jobject object);
175 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_endMoveRows)
177 static void jni_endRemoveColumns(JNIEnv *env, jobject object);
178 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_endRemoveColumns)
180 static void jni_endRemoveRows(JNIEnv *env, jobject object);
181 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_endRemoveRows)
183 static void jni_endResetModel(JNIEnv *env, jobject object);
184 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_endResetModel)
186 static jobject jni_sibling(JNIEnv *env, jobject object, jint row, jint column,
187 JQtModelIndex parent);
188 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_sibling)
190 static void jni_dataChanged(JNIEnv *env, jobject object, JQtModelIndex topLeft,
191 JQtModelIndex bottomRight, QJniArray<jint> roles);
192 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_dataChanged)
194 static jboolean jni_setData(JNIEnv *env, jobject object, JQtModelIndex index, jobject value,
196 Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(jni_setData)
198 static bool registerAbstractNatives(QJniEnvironment &env);
199 static bool registerProxyNatives(QJniEnvironment &env);
202 static std::map<
const QAbstractItemModel *, QRecursiveMutex> s_mutexes;
204 Q_REQUIRED_RESULT
static QMutexLocker<QRecursiveMutex>
205 getMutexLocker(
const QAbstractItemModel *model)
207 auto [iter, inserted] = s_mutexes.try_emplace(model);
209 QObject::connect(model, &QAbstractItemModel::destroyed, model, [](QObject *model) {
210 s_mutexes.erase(
reinterpret_cast<QAbstractItemModel *>(model));
212 return QMutexLocker(&iter->second);
215 QJniObject jInstance;
216 friend class QAndroidModelIndexProxy;