diff options
Diffstat (limited to 'src/labs')
| -rw-r--r-- | src/labs/folderlistmodel/qquickfolderlistmodel.cpp | 38 | ||||
| -rw-r--r-- | src/labs/models/qqmltablemodel.cpp | 9 | ||||
| -rw-r--r-- | src/labs/platform/qquicklabsplatformmenu.cpp | 2 |
3 files changed, 38 insertions, 11 deletions
diff --git a/src/labs/folderlistmodel/qquickfolderlistmodel.cpp b/src/labs/folderlistmodel/qquickfolderlistmodel.cpp index d7e872f9fd..04d4054cf5 100644 --- a/src/labs/folderlistmodel/qquickfolderlistmodel.cpp +++ b/src/labs/folderlistmodel/qquickfolderlistmodel.cpp @@ -38,11 +38,14 @@ public: bool showHidden = false; bool caseSensitive = true; bool sortCaseSensitive = true; + bool resettingModel = false; ~QQuickFolderListModelPrivate() {} void init(); void updateSorting(); + void finishModelReset(); + // private slots void _q_directoryChanged(const QString &directory, const QList<FileProperty> &list); void _q_directoryUpdated(const QString &directory, const QList<FileProperty> &list, int fromIndex, int toIndex); @@ -104,6 +107,22 @@ void QQuickFolderListModelPrivate::updateSorting() fileInfoThread.setSortFlags(flags); } +void QQuickFolderListModelPrivate::finishModelReset() +{ + Q_Q(QQuickFolderListModel); + const bool wasDataEmpty = data.isEmpty(); + data.clear(); + qCDebug(lcFolderListModel) << "about to emit endResetModel"; + q->endResetModel(); + if (!wasDataEmpty) + emit q->rowCountChanged(); + if (status != QQuickFolderListModel::Null) { + status = QQuickFolderListModel::Null; + emit q->statusChanged(); + } + resettingModel = false; +} + void QQuickFolderListModelPrivate::_q_directoryChanged(const QString &directory, const QList<FileProperty> &list) { qCDebug(lcFolderListModel) << "_q_directoryChanged called with directory" << directory; @@ -115,6 +134,7 @@ void QQuickFolderListModelPrivate::_q_directoryChanged(const QString &directory, qCDebug(lcFolderListModel) << "- endResetModel called"; emit q->rowCountChanged(); emit q->folderChanged(); + resettingModel = false; } @@ -411,6 +431,16 @@ void QQuickFolderListModel::setFolder(const QUrl &folder) if (folder == d->currentDir) return; + // It's possible for the folder to be set twice in quick succession, + // in which case we could still be waiting for FileInfoThread to finish + // getting the list of files from the previously set folder. We should + // at least ensure that the begin/end model reset routine is followed + // in the correct order, and not e.g. call beginResetModel twice. + if (d->resettingModel) + d->finishModelReset(); + + d->resettingModel = true; + QString resolvedPath = QQuickFolderListModelPrivate::resolvePath(folder); qCDebug(lcFolderListModel) << "about to emit beginResetModel since our folder was set to" << folder; @@ -424,13 +454,7 @@ void QQuickFolderListModel::setFolder(const QUrl &folder) QFileInfo info(resolvedPath); if (!info.exists() || !info.isDir()) { - d->data.clear(); - endResetModel(); - emit rowCountChanged(); - if (d->status != QQuickFolderListModel::Null) { - d->status = QQuickFolderListModel::Null; - emit statusChanged(); - } + d->finishModelReset(); return; } diff --git a/src/labs/models/qqmltablemodel.cpp b/src/labs/models/qqmltablemodel.cpp index 6b14eeaaef..b368d7cbf7 100644 --- a/src/labs/models/qqmltablemodel.cpp +++ b/src/labs/models/qqmltablemodel.cpp @@ -415,7 +415,8 @@ void QQmlTableModel::doInsert(int rowIndex, const QVariant &row) // Adding rowAsVariant.toList() will add each invidual variant in the list, // which is definitely not what we want. - const QVariant rowAsVariant = row.value<QJSValue>().toVariant(); + const QVariant rowAsVariant = row.userType() == QMetaType::QVariantMap ? row : row.value<QJSValue>().toVariant(); + mRows.insert(rowIndex, rowAsVariant); ++mRowCount; @@ -955,9 +956,11 @@ bool QQmlTableModel::validateNewRow(const char *functionName, const QVariant &ro return true; } + const bool isVariantMap = (row.userType() == QMetaType::QVariantMap); + // Don't require each row to be a QJSValue when setting all rows, // as they won't be; they'll be QVariantMap. - if (operation != SetRowsOperation && !validateRowType(functionName, row)) + if (operation != SetRowsOperation && (!isVariantMap && !validateRowType(functionName, row))) return false; if (operation == OtherOperation) { @@ -974,7 +977,7 @@ bool QQmlTableModel::validateNewRow(const char *functionName, const QVariant &ro } } - const QVariant rowAsVariant = operation == SetRowsOperation + const QVariant rowAsVariant = operation == SetRowsOperation || isVariantMap ? row : row.value<QJSValue>().toVariant(); if (rowAsVariant.userType() != QMetaType::QVariantMap) { qmlWarning(this) << functionName << ": row manipulation functions " diff --git a/src/labs/platform/qquicklabsplatformmenu.cpp b/src/labs/platform/qquicklabsplatformmenu.cpp index c8e9b854e2..a74348989c 100644 --- a/src/labs/platform/qquicklabsplatformmenu.cpp +++ b/src/labs/platform/qquicklabsplatformmenu.cpp @@ -695,7 +695,7 @@ void QQuickLabsPlatformMenu::open(QQmlV4Function *args) #endif } m_handle->showPopup(window, - QHighDpi::toNativePixels(targetRect, window), + QHighDpi::toNativeLocalPosition(targetRect, window), menuItem ? menuItem->handle() : nullptr); } |
