Merge remote-tracking branch 'origin/5.13.0' into 5.13

Change-Id: I55353d8cee5420e0c9f59c3b3a387b461f1abf99
This commit is contained in:
Qt Forward Merge Bot 2019-06-20 16:25:19 +02:00
commit f9efc67bb8
5 changed files with 162 additions and 13 deletions

98
dist/changes-5.13.0 vendored Normal file
View File

@ -0,0 +1,98 @@
Qt 5.13 introduces many new features and improvements as well as bugfixes
over the 5.12.x series. For more details, refer to the online documentation
included in this distribution. The documentation is also available online:
https://doc.qt.io/qt-5/index.html
The Qt version 5.13 series is binary compatible with the 5.12.x series.
Applications compiled for 5.12 will continue to run with 5.13.
Some of the changes listed in this file include issue tracking numbers
corresponding to tasks in the Qt Bug Tracker:
https://bugreports.qt.io/
Each of these identifiers can be entered in the bug tracker to obtain more
information about a particular change.
****************************************************************************
* Important Behavior Changes *
****************************************************************************
- [QTBUG-68278] The Canvas requestAnimationFrame callback now gets passed a
millisecond timestamp instead of seconds.
****************************************************************************
* QtQml *
****************************************************************************
- Nested arrays are not flattened anymore when printed through console.log()
and friends.
- [QTBUG-72098] Assigning JavaScript null to incompatibly typed properties
generates a compile warning now. In future versions of Qt this will
become an error.
- [QTBUG-60057] QVariant's debug stream operator is now used in console.log()
and friends. This often includes more information than before, and
works better for custom types.
- [QTBUG-74068] Qt.include() is deprecated in favor of ECMAScript modules.
- [QTBUG-60338] Added support for QSequentialIterable in QML, meaning
that the engine understands many sequential value types (such as lists
of Q_GADGETS) and is able to convert them to JS arrays.
- [QTBUG-66504] QmlDebug has new features to improve integration with
external tools and IDEs.
- [QTBUG-50061] Global exception handlers are now called reliably by
unwinding JIT-generated code via a function table.
- [QTBUG-72294] Fixed a function table error on WinRT.
- [QTBUG-72430] Added the QTQUICK_COMPILER_RETAINED_RESOURCES option to
retain sources when generating QML cache files.
- [QTBUG-72930] A Component can no longer be assigned to properties of other types.
- [QTBUG-71838] LocalStorage now returns the new database version
from changeVersion() without reopening the connection.
- qml:
* [QTBUG-70826][QTBUG-74662] The QML Runtime tool now has an updated
application icon and a default window icon. QtQuick applications can
still use QWindow::setIcon() to override the window icon.
- qmlscene:
* [QDS-589] qmlscene now supports file selectors.
****************************************************************************
* QtQuick *
****************************************************************************
- Item Views:
* Added itemAtIndex() to GridView, ListView and PathView to fetch a visible
delegate by index.
- TableView:
* Added support for hiding rows and columns by setting their size to 0 from
the columnsWidthProvider/rowHeightProvider.
- Text:
* [QTBUG-32525][QTBUG-70748] Inline images in a QTextDocumentLayout are
now displayed in Text and friends.
* [QTBUG-68711] Fixed Keys.onShortcutOverride for TextEdit
* [QTBUG-50587] Fixed persistentSelection for readonly TextEdit
* [QTBUG-72736] Text wrapping no longer breaks on the last line if right
elide is enabled
- Window:
* [QTBUG-67903] Added the Window.transientParent property. QtQuick normally
guesses the transient parent relationship from the nesting of declarations,
but now you can override this "magic" by setting it explicitly.
* [QTBUG-73929] Fixed a race condition when closing windows.
****************************************************************************
* QtQuickTest *
****************************************************************************
- [QTBUG-71224] Added QQuickTest::qWaitForItemPolished() for verifying that
updatePolish() was called on an item.
- [QTBUG-71224] Added qIsPolishScheduled() function to allow checking if
updatePolish() has been called on an item since the last call to its
polish() function. This is useful to verify that a polish has been
scheduled.
- Added TestCase.isPolishScheduled() function to allow checking whether
updatePolish() has been called on an item since the last call to its polish()
function. This is useful to verify that a polish has been scheduled.

View File

@ -39,6 +39,8 @@
#include "fileinfothread_p.h"
#include <qdiriterator.h>
#include <qpointer.h>
#include <qtimer.h>
#include <QDebug>
@ -46,6 +48,7 @@
FileInfoThread::FileInfoThread(QObject *parent)
: QThread(parent),
abort(false),
scanPending(false),
#if QT_CONFIG(filesystemwatcher)
watcher(nullptr),
#endif
@ -109,7 +112,7 @@ void FileInfoThread::setPath(const QString &path)
#endif
currentPath = path;
needUpdate = true;
condition.wakeAll();
initiateScan();
}
void FileInfoThread::setRootPath(const QString &path)
@ -126,7 +129,7 @@ void FileInfoThread::dirChanged(const QString &directoryPath)
Q_UNUSED(directoryPath);
QMutexLocker locker(&mutex);
folderUpdate = true;
condition.wakeAll();
initiateScan();
}
#endif
@ -136,7 +139,7 @@ void FileInfoThread::setSortFlags(QDir::SortFlags flags)
sortFlags = flags;
sortUpdate = true;
needUpdate = true;
condition.wakeAll();
initiateScan();
}
void FileInfoThread::setNameFilters(const QStringList & filters)
@ -144,7 +147,7 @@ void FileInfoThread::setNameFilters(const QStringList & filters)
QMutexLocker locker(&mutex);
nameFilters = filters;
folderUpdate = true;
condition.wakeAll();
initiateScan();
}
void FileInfoThread::setShowFiles(bool show)
@ -152,7 +155,7 @@ void FileInfoThread::setShowFiles(bool show)
QMutexLocker locker(&mutex);
showFiles = show;
folderUpdate = true;
condition.wakeAll();
initiateScan();
}
void FileInfoThread::setShowDirs(bool showFolders)
@ -160,7 +163,7 @@ void FileInfoThread::setShowDirs(bool showFolders)
QMutexLocker locker(&mutex);
showDirs = showFolders;
folderUpdate = true;
condition.wakeAll();
initiateScan();
}
void FileInfoThread::setShowDirsFirst(bool show)
@ -168,7 +171,7 @@ void FileInfoThread::setShowDirsFirst(bool show)
QMutexLocker locker(&mutex);
showDirsFirst = show;
folderUpdate = true;
condition.wakeAll();
initiateScan();
}
void FileInfoThread::setShowDotAndDotDot(bool on)
@ -177,7 +180,7 @@ void FileInfoThread::setShowDotAndDotDot(bool on)
showDotAndDotDot = on;
folderUpdate = true;
needUpdate = true;
condition.wakeAll();
initiateScan();
}
void FileInfoThread::setShowHidden(bool on)
@ -186,7 +189,7 @@ void FileInfoThread::setShowHidden(bool on)
showHidden = on;
folderUpdate = true;
needUpdate = true;
condition.wakeAll();
initiateScan();
}
void FileInfoThread::setShowOnlyReadable(bool on)
@ -194,7 +197,7 @@ void FileInfoThread::setShowOnlyReadable(bool on)
QMutexLocker locker(&mutex);
showOnlyReadable = on;
folderUpdate = true;
condition.wakeAll();
initiateScan();
}
void FileInfoThread::setCaseSensitive(bool on)
@ -202,7 +205,7 @@ void FileInfoThread::setCaseSensitive(bool on)
QMutexLocker locker(&mutex);
caseSensitive = on;
folderUpdate = true;
condition.wakeAll();
initiateScan();
}
#if QT_CONFIG(filesystemwatcher)
@ -211,7 +214,7 @@ void FileInfoThread::updateFile(const QString &path)
Q_UNUSED(path);
QMutexLocker locker(&mutex);
folderUpdate = true;
condition.wakeAll();
initiateScan();
}
#endif
@ -242,6 +245,37 @@ void FileInfoThread::run()
}
}
void FileInfoThread::runOnce()
{
if (scanPending)
return;
scanPending = true;
QPointer<FileInfoThread> guardedThis(this);
auto getFileInfosAsync = [guardedThis](){
if (!guardedThis)
return;
guardedThis->scanPending = false;
if (guardedThis->currentPath.isEmpty()) {
emit guardedThis->statusChanged(QQuickFolderListModel::Null);
return;
}
emit guardedThis->statusChanged(QQuickFolderListModel::Loading);
guardedThis->getFileInfos(guardedThis->currentPath);
emit guardedThis->statusChanged(QQuickFolderListModel::Ready);
};
QTimer::singleShot(0, getFileInfosAsync);
}
void FileInfoThread::initiateScan()
{
#if QT_CONFIG(thread)
condition.wakeAll();
#else
runOnce();
#endif
}
void FileInfoThread::getFileInfos(const QString &path)
{

View File

@ -99,6 +99,8 @@ public Q_SLOTS:
protected:
void run() override;
void runOnce();
void initiateScan();
void getFileInfos(const QString &path);
void findChangeRange(const QList<FileProperty> &list, int &fromIndex, int &toIndex);
@ -106,6 +108,7 @@ private:
QMutex mutex;
QWaitCondition condition;
volatile bool abort;
bool scanPending;
#if QT_CONFIG(filesystemwatcher)
QFileSystemWatcher *watcher;

View File

@ -6,7 +6,7 @@ SUBDIRS += \
models \
labsmodels
qtConfig(thread): SUBDIRS += folderlistmodel
SUBDIRS += folderlistmodel
qtHaveModule(sql): SUBDIRS += localstorage
qtConfig(settings): SUBDIRS += settings
qtConfig(statemachine): SUBDIRS += statemachine

View File

@ -104,14 +104,18 @@ QQmlThreadPrivate::MainObject::MainObject(QQmlThreadPrivate *p)
// Trigger mainEvent in main thread. Must be called from thread.
void QQmlThreadPrivate::triggerMainEvent()
{
#if QT_CONFIG(thread)
Q_ASSERT(q->isThisThread());
#endif
QCoreApplication::postEvent(&m_mainObject, new QEvent(QEvent::User));
}
// Trigger even in thread. Must be called from main thread.
void QQmlThreadPrivate::triggerThreadEvent()
{
#if QT_CONFIG(thread)
Q_ASSERT(!q->isThisThread());
#endif
QCoreApplication::postEvent(this, new QEvent(QEvent::User));
}
@ -353,6 +357,12 @@ void QQmlThread::internalCallMethodInThread(Message *message)
void QQmlThread::internalCallMethodInMain(Message *message)
{
#if !QT_CONFIG(thread)
message->call(this);
delete message;
return;
#endif
Q_ASSERT(isThisThread());
d->lock();
@ -397,7 +407,9 @@ void QQmlThread::internalPostMethodToThread(Message *message)
void QQmlThread::internalPostMethodToMain(Message *message)
{
#if QT_CONFIG(thread)
Q_ASSERT(isThisThread());
#endif
d->lock();
bool wasEmpty = d->mainList.isEmpty();
d->mainList.append(message);
@ -408,7 +420,9 @@ void QQmlThread::internalPostMethodToMain(Message *message)
void QQmlThread::waitForNextMessage()
{
#if QT_CONFIG(thread)
Q_ASSERT(!isThisThread());
#endif
d->lock();
Q_ASSERT(d->m_mainThreadWaiting == false);