Merge remote-tracking branch 'origin/5.15' into dev
Change-Id: Ife31dad3c8dc43c5ff4d266e6d646230c5d20a50bb10
commit
2c4b44d750
|
|
@ -0,0 +1,34 @@
|
|||
qtPrepareTool(MOC_COLLECT_JSON, moc)
|
||||
|
||||
QMAKE_MOC_OPTIONS += --output-json
|
||||
|
||||
moc_json_header.input = HEADERS
|
||||
moc_json_header.output = $$MOC_DIR/$${QMAKE_H_MOD_MOC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)}.json
|
||||
moc_json_header.CONFIG = no_link moc_verify
|
||||
moc_json_header.depends = $$MOC_DIR/$${QMAKE_H_MOD_MOC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)}
|
||||
moc_json_header.commands = $$escape_expand(\\n) # force creation of rule
|
||||
moc_json_header.variable_out = MOC_JSON_FILES
|
||||
|
||||
moc_json_source.input = SOURCES
|
||||
moc_json_source.output = $$MOC_DIR/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_EXT_CPP_MOC}.json
|
||||
moc_json_source.CONFIG = no_link moc_verify
|
||||
moc_json_source.depends = $$MOC_DIR/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_EXT_CPP_MOC}
|
||||
moc_json_source.commands = $$escape_expand(\\n) # force creation of rule
|
||||
moc_json_source.variable_out = MOC_JSON_FILES
|
||||
|
||||
MOC_COLLECT_JSON_OUTPUT = $$lower($$basename(TARGET))_metatypes.json
|
||||
|
||||
moc_collect_json.CONFIG += no_link combine
|
||||
moc_collect_json.commands = $$MOC_COLLECT_JSON --collect-json -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
|
||||
moc_collect_json.input = MOC_JSON_FILES
|
||||
moc_collect_json.output = $$MOC_COLLECT_JSON_OUTPUT
|
||||
moc_collect_json.name = Collect moc JSON output into central file
|
||||
|
||||
install_metatypes {
|
||||
do_install.path = $$[QT_INSTALL_LIBS]/metatypes
|
||||
do_install.files = $$OUT_PWD/$$MOC_COLLECT_JSON_OUTPUT
|
||||
prefix_build: INSTALLS += do_install
|
||||
else: COPIES += do_install
|
||||
}
|
||||
|
||||
QMAKE_EXTRA_COMPILERS += moc_collect_json moc_json_header moc_json_source
|
||||
|
|
@ -4,8 +4,6 @@
|
|||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>${ASSETCATALOG_COMPILER_APPICON_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>${ASSETCATALOG_COMPILER_APPICON_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>${ASSETCATALOG_COMPILER_APPICON_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
|
|
|
|||
|
|
@ -6,8 +6,6 @@
|
|||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>${ASSETCATALOG_COMPILER_APPICON_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
|
|
|
|||
|
|
@ -8,8 +8,6 @@
|
|||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIcons</key>
|
||||
<dict>
|
||||
<key>CFBundlePrimaryIcon</key>
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
|
|
|
|||
|
|
@ -8,8 +8,6 @@
|
|||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundleName</key>
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ QOBJS = \
|
|||
qjsonarray.o qjson.o qjsondocument.o qjsonobject.o qjsonparser.o qjsonvalue.o \
|
||||
qmetatype.o qsystemerror.o qvariant.o \
|
||||
quuid.o \
|
||||
qarraydata.o qbitarray.o qbytearray.o qbytearraymatcher.o \
|
||||
qarraydata.o qbitarray.o qbytearray.o qbytearraylist.o qbytearraymatcher.o \
|
||||
qcalendar.o qgregoriancalendar.o qromancalendar.o \
|
||||
qcryptographichash.o qdatetime.o qhash.o qlist.o \
|
||||
qlocale.o qlocale_tools.o qmap.o qregexp.o qringbuffer.o \
|
||||
|
|
@ -106,7 +106,8 @@ DEPEND_SRC = \
|
|||
$(SOURCE_PATH)/src/corelib/serialization/qtextstream.cpp \
|
||||
$(SOURCE_PATH)/src/corelib/serialization/qxmlstream.cpp \
|
||||
$(SOURCE_PATH)/src/corelib/serialization/qxmlutils.cpp \
|
||||
$(SOURCE_PATH)/src/corelib/text/qbytearray.cpp\
|
||||
$(SOURCE_PATH)/src/corelib/text/qbytearray.cpp \
|
||||
$(SOURCE_PATH)/src/corelib/text/qbytearraylist.cpp \
|
||||
$(SOURCE_PATH)/src/corelib/text/qbytearraymatcher.cpp \
|
||||
$(SOURCE_PATH)/src/corelib/text/qlocale.cpp \
|
||||
$(SOURCE_PATH)/src/corelib/text/qlocale_tools.cpp \
|
||||
|
|
@ -309,6 +310,9 @@ qarraydata.o: $(SOURCE_PATH)/src/corelib/tools/qarraydata.cpp
|
|||
qbytearray.o: $(SOURCE_PATH)/src/corelib/text/qbytearray.cpp
|
||||
$(CXX) -c -o $@ $(CXXFLAGS) $<
|
||||
|
||||
qbytearraylist.o: $(SOURCE_PATH)/src/corelib/text/qbytearraylist.cpp
|
||||
$(CXX) -c -o $@ $(CXXFLAGS) $<
|
||||
|
||||
qvsnprintf.o: $(SOURCE_PATH)/src/corelib/text/qvsnprintf.cpp
|
||||
$(CXX) -c -o $@ $(CXXFLAGS) $<
|
||||
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ QTOBJS= \
|
|||
qfsfileengine_iterator.obj \
|
||||
qarraydata.obj \
|
||||
qbytearray.obj \
|
||||
qbytearraylist.obj \
|
||||
qvsnprintf.obj \
|
||||
qbytearraymatcher.obj \
|
||||
qcalendar.obj \
|
||||
|
|
|
|||
|
|
@ -252,6 +252,10 @@ void BuildsMetaMakefileGenerator::checkForConflictingTargets() const
|
|||
// and the last entry in makefiles is the "glue" Build.
|
||||
return;
|
||||
}
|
||||
if (!project->isActiveConfig("build_all")) {
|
||||
// Only complain if we're about to build all configurations.
|
||||
return;
|
||||
}
|
||||
using TargetInfo = std::pair<Build *, ProString>;
|
||||
QVector<TargetInfo> targets;
|
||||
const int last = makefiles.count() - 1;
|
||||
|
|
|
|||
|
|
@ -433,12 +433,9 @@ UnixMakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
|
|||
QMakeLocalFileName f(opt.mid(2));
|
||||
if (!frameworkdirs.contains(f))
|
||||
frameworkdirs.insert(fwidx++, f);
|
||||
} else if (target_mode == TARG_MAC_MODE && opt.startsWith("-framework")) {
|
||||
} else if (target_mode == TARG_MAC_MODE && opt == "-framework") {
|
||||
if (linkPrl) {
|
||||
if (opt.length() == 10)
|
||||
opt = (*++it).toQString();
|
||||
else
|
||||
opt = opt.mid(10).trimmed();
|
||||
opt = (*++it).toQString();
|
||||
static const QChar suffixMarker = ',';
|
||||
const int suffixPosition = opt.indexOf(suffixMarker);
|
||||
const bool hasSuffix = suffixPosition >= 0;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@
|
|||
#include <qdir.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
ProString Win32MakefileGenerator::fixLibFlag(const ProString &lib)
|
||||
|
|
@ -73,16 +75,37 @@ Win32MakefileGenerator::parseLibFlag(const ProString &flag, ProString *arg)
|
|||
return LibFlagFile;
|
||||
}
|
||||
|
||||
class LibrarySearchPath : public QMakeLocalFileName
|
||||
{
|
||||
public:
|
||||
LibrarySearchPath() = default;
|
||||
|
||||
LibrarySearchPath(const QString &s)
|
||||
: QMakeLocalFileName(s)
|
||||
{
|
||||
}
|
||||
|
||||
LibrarySearchPath(QString &&s, bool isDefault = false)
|
||||
: QMakeLocalFileName(std::move(s)), _default(isDefault)
|
||||
{
|
||||
}
|
||||
|
||||
bool isDefault() const { return _default; }
|
||||
|
||||
private:
|
||||
bool _default = false;
|
||||
};
|
||||
|
||||
bool
|
||||
Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
|
||||
{
|
||||
ProStringList impexts = project->values("QMAKE_LIB_EXTENSIONS");
|
||||
if (impexts.isEmpty())
|
||||
impexts = project->values("QMAKE_EXTENSION_STATICLIB");
|
||||
QVector<QMakeLocalFileName> dirs;
|
||||
QVector<LibrarySearchPath> dirs;
|
||||
int libidx = 0;
|
||||
for (const ProString &dlib : project->values("QMAKE_DEFAULT_LIBDIRS"))
|
||||
dirs.append(QMakeLocalFileName(dlib.toQString()));
|
||||
dirs.append(LibrarySearchPath(dlib.toQString(), true));
|
||||
static const char * const lflags[] = { "LIBS", "LIBS_PRIVATE",
|
||||
"QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", nullptr };
|
||||
for (int i = 0; lflags[i]; i++) {
|
||||
|
|
@ -92,12 +115,20 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
|
|||
ProString arg;
|
||||
LibFlagType type = parseLibFlag(opt, &arg);
|
||||
if (type == LibFlagPath) {
|
||||
QMakeLocalFileName lp(arg.toQString());
|
||||
int idx = dirs.indexOf(lp);
|
||||
const QString argqstr = arg.toQString();
|
||||
auto dit = std::find_if(dirs.cbegin(), dirs.cend(),
|
||||
[&argqstr](const LibrarySearchPath &p)
|
||||
{
|
||||
return p.real() == argqstr;
|
||||
});
|
||||
int idx = dit == dirs.cend()
|
||||
? -1
|
||||
: std::distance(dirs.cbegin(), dit);
|
||||
if (idx >= 0 && idx < libidx) {
|
||||
it = l.erase(it);
|
||||
continue;
|
||||
}
|
||||
const LibrarySearchPath lp(argqstr);
|
||||
dirs.insert(libidx++, lp);
|
||||
(*it) = "-L" + lp.real();
|
||||
} else if (type == LibFlagLib) {
|
||||
|
|
@ -114,7 +145,8 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
|
|||
for (ProStringList::ConstIterator extit = impexts.cbegin();
|
||||
extit != impexts.cend(); ++extit) {
|
||||
if (exists(libBase + '.' + *extit)) {
|
||||
(*it) = cand + verovr + '.' + *extit;
|
||||
*it = (dir_it->isDefault() ? lib : cand)
|
||||
+ verovr + '.' + *extit;
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,6 +46,8 @@ if (NOT TARGET Qt5::rcc)
|
|||
)
|
||||
endif()
|
||||
|
||||
set(CMAKE_AUTOMOC_MACRO_NAMES "Q_OBJECT" "Q_GADGET" "Q_NAMESPACE" "Q_NAMESPACE_EXPORT")
|
||||
|
||||
set(Qt5Core_QMAKE_EXECUTABLE Qt5::qmake)
|
||||
set(Qt5Core_MOC_EXECUTABLE Qt5::moc)
|
||||
set(Qt5Core_RCC_EXECUTABLE Qt5::rcc)
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ QT_BEGIN_NAMESPACE
|
|||
int qfloat16::fpClassify() const noexcept
|
||||
{
|
||||
return isInf() ? FP_INFINITE : isNaN() ? FP_NAN
|
||||
: !b16 ? FP_ZERO : isNormal() ? FP_NORMAL : FP_SUBNORMAL;
|
||||
: !(b16 & 0x7fff) ? FP_ZERO : isNormal() ? FP_NORMAL : FP_SUBNORMAL;
|
||||
}
|
||||
|
||||
/*! \fn int qRound(qfloat16 value)
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ public:
|
|||
static constexpr qfloat16 _limit_quiet_NaN() noexcept { return qfloat16(Wrap(0x7e00)); }
|
||||
// Signalling NaN is 0x7f00
|
||||
inline constexpr bool isNormal() const noexcept
|
||||
{ return b16 == 0 || ((b16 & 0x7c00) && (b16 & 0x7c00) != 0x7c00); }
|
||||
{ return (b16 & 0x7fff) == 0 || ((b16 & 0x7c00) && (b16 & 0x7c00) != 0x7c00); }
|
||||
private:
|
||||
quint16 b16;
|
||||
constexpr inline explicit qfloat16(Wrap nibble) noexcept : b16(nibble.b16) {}
|
||||
|
|
@ -296,7 +296,7 @@ class numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> : public numeric_limits<flo
|
|||
public:
|
||||
/*
|
||||
Treat quint16 b16 as if it were:
|
||||
uint S: 1; // b16 >> 15 (sign)
|
||||
uint S: 1; // b16 >> 15 (sign); can be set for zero
|
||||
uint E: 5; // (b16 >> 10) & 0x1f (offset exponent)
|
||||
uint M: 10; // b16 & 0x3ff (adjusted mantissa)
|
||||
|
||||
|
|
|
|||
|
|
@ -2956,11 +2956,10 @@ QString QSysInfo::prettyProductName()
|
|||
if (!name)
|
||||
return result + versionString;
|
||||
result += QLatin1String(name);
|
||||
# if !defined(Q_OS_WIN)
|
||||
return result + QLatin1String(" (") + versionString + QLatin1Char(')');
|
||||
# else
|
||||
# if !defined(Q_OS_WIN) || defined(Q_OS_WINRT)
|
||||
return result + QLatin1String(" (") + versionString + QLatin1Char(')');
|
||||
# else
|
||||
// (resembling winver.exe): Windows 10 "Windows 10 Version 1809"
|
||||
result += QLatin1String(" Version ");
|
||||
if (majorVersion >= 10) {
|
||||
const auto releaseId = windows10ReleaseId();
|
||||
if (!releaseId.isEmpty())
|
||||
|
|
@ -2968,7 +2967,7 @@ QString QSysInfo::prettyProductName()
|
|||
return result;
|
||||
}
|
||||
// Windows 7: "Windows 7 Version 6.1 (Build 7601: Service Pack 1)"
|
||||
result += versionString + QLatin1String(" (");
|
||||
result += QLatin1String(" Version ") + versionString + QLatin1String(" (");
|
||||
const auto build = windows7Build();
|
||||
if (!build.isEmpty())
|
||||
result += QLatin1String("Build ") + build;
|
||||
|
|
@ -2976,7 +2975,7 @@ QString QSysInfo::prettyProductName()
|
|||
if (!servicePack.isEmpty())
|
||||
result += QLatin1String(": ") + servicePack;
|
||||
return result + QLatin1Char(')');
|
||||
# endif // Windows
|
||||
# endif // Windows
|
||||
#elif defined(Q_OS_HAIKU)
|
||||
return QLatin1String("Haiku ") + productVersion();
|
||||
#elif defined(Q_OS_UNIX)
|
||||
|
|
|
|||
|
|
@ -495,6 +495,8 @@ static QString prefixFromAppDirHelper()
|
|||
#endif
|
||||
|
||||
#if !defined(QT_BUILD_QMAKE) && QT_CONFIG(relocatable)
|
||||
#if !defined(QT_STATIC) && !(defined(Q_OS_DARWIN) && QT_CONFIG(framework)) \
|
||||
&& (QT_CONFIG(dlopen) || defined(Q_OS_WIN))
|
||||
static QString prefixFromQtCoreLibraryHelper(const QString &qtCoreLibraryPath)
|
||||
{
|
||||
const QString qtCoreLibrary = QDir::fromNativeSeparators(qtCoreLibraryPath);
|
||||
|
|
@ -503,6 +505,7 @@ static QString prefixFromQtCoreLibraryHelper(const QString &qtCoreLibraryPath)
|
|||
+ QLatin1String(QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH);
|
||||
return QDir::cleanPath(prefixDir);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(Q_OS_WIN)
|
||||
#if defined(Q_OS_WINRT)
|
||||
|
|
@ -851,10 +854,14 @@ QT_END_NAMESPACE
|
|||
|
||||
#include "private/qcoreapplication_p.h"
|
||||
|
||||
QT_WARNING_DISABLE_GCC("-Wattributes")
|
||||
QT_WARNING_DISABLE_CLANG("-Wattributes")
|
||||
QT_WARNING_DISABLE_INTEL(2621)
|
||||
|
||||
extern const char qt_core_interpreter[] __attribute__((section(".interp")))
|
||||
= ELF_INTERPRETER;
|
||||
|
||||
extern "C" void qt_core_boilerplate();
|
||||
extern "C" void qt_core_boilerplate() __attribute__((force_align_arg_pointer));
|
||||
void qt_core_boilerplate()
|
||||
{
|
||||
printf("This is the QtCore library version " QT_BUILD_STR "\n"
|
||||
|
|
|
|||
|
|
@ -746,7 +746,6 @@ bool QSettingsPrivate::iniUnescapedStringList(const QByteArray &str, int from, i
|
|||
{ '\'', '\'' },
|
||||
{ '\\', '\\' }
|
||||
};
|
||||
static const int numEscapeCodes = sizeof(escapeCodes) / sizeof(escapeCodes[0]);
|
||||
|
||||
bool isStringList = false;
|
||||
bool inQuotedString = false;
|
||||
|
|
@ -770,9 +769,9 @@ StNormal:
|
|||
goto end;
|
||||
|
||||
ch = str.at(i++);
|
||||
for (int j = 0; j < numEscapeCodes; ++j) {
|
||||
if (ch == escapeCodes[j][0]) {
|
||||
stringResult += QLatin1Char(escapeCodes[j][1]);
|
||||
for (const auto &escapeCode : escapeCodes) {
|
||||
if (ch == escapeCode[0]) {
|
||||
stringResult += QLatin1Char(escapeCode[1]);
|
||||
goto StNormal;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -211,6 +211,12 @@ QDebug operator<<(QDebug debug, const QMacAutoReleasePool *pool)
|
|||
debug << "QMacAutoReleasePool(" << (const void *)pool << ')';
|
||||
return debug;
|
||||
}
|
||||
|
||||
QDebug operator<<(QDebug debug, const QCFString &string)
|
||||
{
|
||||
debug << static_cast<QString>(string);
|
||||
return debug;
|
||||
}
|
||||
#endif // !QT_NO_DEBUG_STREAM
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
|
|
|
|||
|
|
@ -137,8 +137,10 @@ private:
|
|||
template <typename T>
|
||||
class QCFType : public QAppleRefCounted<T, CFTypeRef, CFRetain, CFRelease>
|
||||
{
|
||||
using Base = QAppleRefCounted<T, CFTypeRef, CFRetain, CFRelease>;
|
||||
public:
|
||||
using QAppleRefCounted<T, CFTypeRef, CFRetain, CFRelease>::QAppleRefCounted;
|
||||
using Base::Base;
|
||||
explicit QCFType(CFTypeRef r) : Base(static_cast<T>(r)) {}
|
||||
template <typename X> X as() const { return reinterpret_cast<X>(this->value); }
|
||||
static QCFType constructFromGet(const T &t)
|
||||
{
|
||||
|
|
@ -151,6 +153,7 @@ public:
|
|||
class Q_CORE_EXPORT QCFString : public QCFType<CFStringRef>
|
||||
{
|
||||
public:
|
||||
using QCFType<CFStringRef>::QCFType;
|
||||
inline QCFString(const QString &str) : QCFType<CFStringRef>(0), string(str) {}
|
||||
inline QCFString(const CFStringRef cfstr = 0) : QCFType<CFStringRef>(cfstr) {}
|
||||
inline QCFString(const QCFType<CFStringRef> &other) : QCFType<CFStringRef>(other) {}
|
||||
|
|
@ -168,7 +171,8 @@ Q_CORE_EXPORT bool qt_mac_applicationIsInDarkMode();
|
|||
#endif
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
QDebug operator<<(QDebug debug, const QMacAutoReleasePool *pool);
|
||||
Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QMacAutoReleasePool *pool);
|
||||
Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QCFString &string);
|
||||
#endif
|
||||
|
||||
Q_CORE_EXPORT bool qt_apple_isApplicationExtension();
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ QT_BEGIN_NAMESPACE
|
|||
/*!
|
||||
\class QLatin1Char
|
||||
\inmodule QtCore
|
||||
\reentrant
|
||||
\brief The QLatin1Char class provides an 8-bit ASCII/Latin-1 character.
|
||||
|
||||
\ingroup string-processing
|
||||
|
|
|
|||
|
|
@ -345,6 +345,23 @@ QByteArray QLocalePrivate::bcp47Name(char separator) const
|
|||
return localeId.withLikelySubtagsRemoved().name(separator);
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
QByteArray QLocalePrivate::rawName(char separator) const
|
||||
{
|
||||
QByteArrayList parts;
|
||||
if (m_data->m_language_id != QLocale::AnyLanguage)
|
||||
parts.append(languageCode().latin1());
|
||||
if (m_data->m_script_id != QLocale::AnyScript)
|
||||
parts.append(scriptCode().latin1());
|
||||
if (m_data->m_country_id != QLocale::AnyCountry)
|
||||
parts.append(countryCode().latin1());
|
||||
|
||||
return parts.join(separator);
|
||||
}
|
||||
|
||||
|
||||
static const QLocaleData *findLocaleDataById(const QLocaleId &lid)
|
||||
{
|
||||
QLocaleId localeId = lid.withLikelySubtagsAdded();
|
||||
|
|
@ -4367,30 +4384,63 @@ QString QLocale::formattedDataSize(qint64 bytes, int precision, DataSizeFormats
|
|||
*/
|
||||
QStringList QLocale::uiLanguages() const
|
||||
{
|
||||
QStringList uiLanguages;
|
||||
QVector<QLocale> locales;
|
||||
#ifndef QT_NO_SYSTEMLOCALE
|
||||
if (d->m_data == systemData()) {
|
||||
QVariant res = systemLocale()->query(QSystemLocale::UILanguages, QVariant());
|
||||
if (!res.isNull()) {
|
||||
QStringList result = res.toStringList();
|
||||
if (!result.isEmpty())
|
||||
return result;
|
||||
uiLanguages = res.toStringList();
|
||||
// ... but we need to include likely-adjusted forms of each of those, too:
|
||||
for (const auto entry : qAsConst(uiLanguages))
|
||||
locales.append(QLocale(entry));
|
||||
}
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
QLocaleId id = QLocaleId::fromIds(d->m_data->m_language_id, d->m_data->m_script_id,
|
||||
d->m_data->m_country_id);
|
||||
const QLocaleId max = id.withLikelySubtagsAdded();
|
||||
const QLocaleId min = max.withLikelySubtagsRemoved();
|
||||
|
||||
QStringList uiLanguages;
|
||||
uiLanguages.append(QString::fromLatin1(min.name()));
|
||||
if (id.script_id) {
|
||||
id.script_id = 0;
|
||||
if (id != min && id.withLikelySubtagsAdded() == max)
|
||||
uiLanguages.append(QString::fromLatin1(id.name()));
|
||||
{
|
||||
locales.append(*this);
|
||||
}
|
||||
for (int i = locales.size(); i-- > 0; ) {
|
||||
const QLocale &locale = locales.at(i);
|
||||
int j;
|
||||
QByteArray prior;
|
||||
if (i < uiLanguages.size()) {
|
||||
// Adding likely-adjusted forms to system locale's list.
|
||||
// Name the locale is derived from:
|
||||
const QString &name = uiLanguages.at(i);
|
||||
prior = name.toLatin1();
|
||||
// Don't try to likely-adjust if construction's likely-adjustments
|
||||
// were so drastic the result doesn't match the prior name:
|
||||
if (locale.name() != name && locale.d->rawName() != prior)
|
||||
continue;
|
||||
// Insert just after prior:
|
||||
j = i + 1;
|
||||
} else {
|
||||
// Plain locale, not system locale; just append.
|
||||
j = uiLanguages.size();
|
||||
}
|
||||
const auto data = locale.d->m_data;
|
||||
|
||||
QLocaleId id
|
||||
= QLocaleId::fromIds(data->m_language_id, data->m_script_id, data->m_country_id);
|
||||
const QLocaleId max = id.withLikelySubtagsAdded();
|
||||
const QLocaleId min = max.withLikelySubtagsRemoved();
|
||||
id.script_id = 0; // For re-use as script-less variant.
|
||||
|
||||
// Include version with all likely sub-tags (last) if distinct from the rest:
|
||||
if (max != min && max != id && max.name() != prior)
|
||||
uiLanguages.insert(j, QString::fromLatin1(max.name()));
|
||||
|
||||
// Include scriptless version if likely-equivalent and distinct:
|
||||
if (data->m_script_id && id != min && id.name() != prior
|
||||
&& id.withLikelySubtagsAdded() == max) {
|
||||
uiLanguages.insert(j, QString::fromLatin1(id.name()));
|
||||
}
|
||||
|
||||
// Include minimal version (first) unless it's what our locale is derived from:
|
||||
if (min.name() != prior)
|
||||
uiLanguages.insert(j, QString::fromLatin1(min.name()));
|
||||
}
|
||||
if (max != min && max != id)
|
||||
uiLanguages.append(QString::fromLatin1(max.name()));
|
||||
return uiLanguages;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -359,6 +359,7 @@ public:
|
|||
quint16 countryId() const { return m_data->m_country_id; }
|
||||
|
||||
QByteArray bcp47Name(char separator = '-') const;
|
||||
QByteArray rawName(char separator = '-') const;
|
||||
|
||||
inline QLatin1String languageCode() const { return languageToCode(QLocale::Language(m_data->m_language_id)); }
|
||||
inline QLatin1String scriptCode() const { return scriptToCode(QLocale::Script(m_data->m_script_id)); }
|
||||
|
|
|
|||
|
|
@ -1051,7 +1051,7 @@ int lastIndexOf(const QList<T> &list, const U &u, int from)
|
|||
Node *n = reinterpret_cast<Node *>(list.p.at(from + 1));
|
||||
while (n-- != b) {
|
||||
if (n->t() == u)
|
||||
return typename QList<T>::difference_type(n - b);
|
||||
return int(n - b);
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
/*!
|
||||
\class QPair
|
||||
\inmodule QtCore
|
||||
\reentrant
|
||||
\brief The QPair class is a template class that stores a pair of items.
|
||||
|
||||
\ingroup tools
|
||||
|
|
|
|||
|
|
@ -100,15 +100,15 @@ bool qdbus_loadLibDBus()
|
|||
};
|
||||
|
||||
lib->unload();
|
||||
for (uint i = 0; i < sizeof(majorversions) / sizeof(majorversions[0]); ++i) {
|
||||
for (uint j = 0; j < sizeof(baseNames) / sizeof(baseNames[0]); ++j) {
|
||||
for (const int majorversion : majorversions) {
|
||||
for (const QString &baseName : baseNames) {
|
||||
#ifdef Q_OS_WIN
|
||||
QString suffix;
|
||||
if (majorversions[i] != -1)
|
||||
suffix = QString::number(- majorversions[i]); // negative so it prepends the dash
|
||||
lib->setFileName(baseNames[j] + suffix);
|
||||
if (majorversion != -1)
|
||||
suffix = QString::number(- majorversion); // negative so it prepends the dash
|
||||
lib->setFileName(baseName + suffix);
|
||||
#else
|
||||
lib->setFileNameAndVersion(baseNames[j], majorversions[i]);
|
||||
lib->setFileNameAndVersion(baseName, majorversion);
|
||||
#endif
|
||||
if (lib->load() && lib->resolve("dbus_connection_open_private"))
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -2533,9 +2533,8 @@ void QGuiApplicationPrivate::processCloseEvent(QWindowSystemInterfacePrivate::Cl
|
|||
|
||||
QCloseEvent event;
|
||||
QGuiApplication::sendSpontaneousEvent(e->window.data(), &event);
|
||||
if (e->accepted) {
|
||||
*(e->accepted) = event.isAccepted();
|
||||
}
|
||||
|
||||
e->eventAccepted = event.isAccepted();
|
||||
}
|
||||
|
||||
void QGuiApplicationPrivate::processFileOpenEvent(QWindowSystemInterfacePrivate::FileOpenEvent *e)
|
||||
|
|
|
|||
|
|
@ -348,9 +348,7 @@ void QPlatformWindow::setWindowIcon(const QIcon &icon) { Q_UNUSED(icon); }
|
|||
*/
|
||||
bool QPlatformWindow::close()
|
||||
{
|
||||
bool accepted = false;
|
||||
QWindowSystemInterface::handleCloseEvent<QWindowSystemInterface::SynchronousDelivery>(window(), &accepted);
|
||||
return accepted;
|
||||
return QWindowSystemInterface::handleCloseEvent<QWindowSystemInterface::SynchronousDelivery>(window());
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -340,13 +340,11 @@ QT_DEFINE_QPA_EVENT_HANDLER(void, handleExposeEvent, QWindow *window, const QReg
|
|||
QWindowSystemInterfacePrivate::handleWindowSystemEvent<Delivery>(e);
|
||||
}
|
||||
|
||||
QT_DEFINE_QPA_EVENT_HANDLER(void, handleCloseEvent, QWindow *window, bool *accepted)
|
||||
QT_DEFINE_QPA_EVENT_HANDLER(bool, handleCloseEvent, QWindow *window)
|
||||
{
|
||||
if (window) {
|
||||
QWindowSystemInterfacePrivate::CloseEvent *e =
|
||||
new QWindowSystemInterfacePrivate::CloseEvent(window, accepted);
|
||||
QWindowSystemInterfacePrivate::handleWindowSystemEvent<Delivery>(e);
|
||||
}
|
||||
Q_ASSERT(window);
|
||||
auto *event = new QWindowSystemInterfacePrivate::CloseEvent(window);
|
||||
return QWindowSystemInterfacePrivate::handleWindowSystemEvent<Delivery>(event);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -194,7 +194,7 @@ public:
|
|||
static void handleExposeEvent(QWindow *window, const QRegion ®ion);
|
||||
|
||||
template<typename Delivery = QWindowSystemInterface::DefaultDelivery>
|
||||
static void handleCloseEvent(QWindow *window, bool *accepted = nullptr);
|
||||
static bool handleCloseEvent(QWindow *window);
|
||||
|
||||
template<typename Delivery = QWindowSystemInterface::DefaultDelivery>
|
||||
static void handleEnterEvent(QWindow *window, const QPointF &local = QPointF(), const QPointF& global = QPointF());
|
||||
|
|
|
|||
|
|
@ -123,11 +123,10 @@ public:
|
|||
|
||||
class CloseEvent : public WindowSystemEvent {
|
||||
public:
|
||||
explicit CloseEvent(QWindow *w, bool *a = nullptr)
|
||||
: WindowSystemEvent(Close), window(w), accepted(a)
|
||||
explicit CloseEvent(QWindow *w)
|
||||
: WindowSystemEvent(Close), window(w)
|
||||
{ }
|
||||
QPointer<QWindow> window;
|
||||
bool *accepted;
|
||||
};
|
||||
|
||||
class GeometryChangeEvent : public WindowSystemEvent {
|
||||
|
|
|
|||
|
|
@ -222,8 +222,6 @@ static const int qt_windowsConversion[][2] = {
|
|||
{DMPAPER_PENV_10_ROTATED, DMPAPER_PENV_10} // Is = DMPAPER_LAST, use as loop terminator
|
||||
};
|
||||
|
||||
static const int windowsConversionCount = int(sizeof(qt_windowsConversion) / sizeof(qt_windowsConversion[0]));
|
||||
|
||||
// Standard sizes data
|
||||
struct StandardPageSize {
|
||||
QPageSize::PageSizeId id;
|
||||
|
|
@ -423,9 +421,9 @@ static QPageSize::PageSizeId qt_idForWindowsID(int windowsId, QSize *match = 0)
|
|||
if (windowsId <= DMPAPER_NONE || windowsId > DMPAPER_LAST)
|
||||
return QPageSize::Custom;
|
||||
// Check if one of the unsupported values, convert to valid value if is
|
||||
for (int i = 0; i < windowsConversionCount; ++i) {
|
||||
if (qt_windowsConversion[i][0] == windowsId) {
|
||||
windowsId = qt_windowsConversion[i][1];
|
||||
for (const auto &it : qt_windowsConversion) {
|
||||
if (it[0] == windowsId) {
|
||||
windowsId = it[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3241,12 +3241,12 @@ QVector<int> QRhiVulkan::supportedSampleCounts() const
|
|||
VkSampleCountFlags stencil = limits->framebufferStencilSampleCounts;
|
||||
QVector<int> result;
|
||||
|
||||
for (size_t i = 0; i < sizeof(qvk_sampleCounts) / sizeof(qvk_sampleCounts[0]); ++i) {
|
||||
if ((color & qvk_sampleCounts[i].mask)
|
||||
&& (depth & qvk_sampleCounts[i].mask)
|
||||
&& (stencil & qvk_sampleCounts[i].mask))
|
||||
for (const auto &qvk_sampleCount : qvk_sampleCounts) {
|
||||
if ((color & qvk_sampleCount.mask)
|
||||
&& (depth & qvk_sampleCount.mask)
|
||||
&& (stencil & qvk_sampleCount.mask))
|
||||
{
|
||||
result.append(qvk_sampleCounts[i].count);
|
||||
result.append(qvk_sampleCount.count);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3263,9 +3263,9 @@ VkSampleCountFlagBits QRhiVulkan::effectiveSampleCount(int sampleCount)
|
|||
return VK_SAMPLE_COUNT_1_BIT;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < sizeof(qvk_sampleCounts) / sizeof(qvk_sampleCounts[0]); ++i) {
|
||||
if (qvk_sampleCounts[i].count == sampleCount)
|
||||
return qvk_sampleCounts[i].mask;
|
||||
for (const auto &qvk_sampleCount : qvk_sampleCounts) {
|
||||
if (qvk_sampleCount.count == sampleCount)
|
||||
return qvk_sampleCount.mask;
|
||||
}
|
||||
|
||||
Q_UNREACHABLE();
|
||||
|
|
|
|||
|
|
@ -1062,6 +1062,7 @@ QTextHtmlImporter::ProcessNodeResult QTextHtmlImporter::processBlockNode()
|
|||
fmt.setLeftPadding(leftPadding(currentNodeIdx));
|
||||
if (rightPadding(currentNodeIdx) >= 0)
|
||||
fmt.setRightPadding(rightPadding(currentNodeIdx));
|
||||
#ifndef QT_NO_CSSPARSER
|
||||
if (tableCellBorder(currentNodeIdx, QCss::TopEdge) > 0)
|
||||
fmt.setTopBorder(tableCellBorder(currentNodeIdx, QCss::TopEdge));
|
||||
if (tableCellBorder(currentNodeIdx, QCss::RightEdge) > 0)
|
||||
|
|
@ -1086,6 +1087,7 @@ QTextHtmlImporter::ProcessNodeResult QTextHtmlImporter::processBlockNode()
|
|||
fmt.setBottomBorderBrush(tableCellBorderBrush(currentNodeIdx, QCss::BottomEdge));
|
||||
if (tableCellBorderBrush(currentNodeIdx, QCss::LeftEdge) != Qt::NoBrush)
|
||||
fmt.setLeftBorderBrush(tableCellBorderBrush(currentNodeIdx, QCss::LeftEdge));
|
||||
#endif
|
||||
|
||||
cell.setFormat(fmt);
|
||||
|
||||
|
|
|
|||
|
|
@ -265,6 +265,9 @@ public:
|
|||
|
||||
inline QFixed topPadding(QTextTable *table, const QTextTableCell &cell) const
|
||||
{
|
||||
#ifdef QT_NO_CSSPARSER
|
||||
Q_UNUSED(table);
|
||||
#endif
|
||||
return paddingProperty(cell.format(), QTextFormat::TableCellTopPadding)
|
||||
#ifndef QT_NO_CSSPARSER
|
||||
+ cellBorderWidth(table, cell, QCss::TopEdge)
|
||||
|
|
@ -274,6 +277,9 @@ public:
|
|||
|
||||
inline QFixed bottomPadding(QTextTable *table, const QTextTableCell &cell) const
|
||||
{
|
||||
#ifdef QT_NO_CSSPARSER
|
||||
Q_UNUSED(table);
|
||||
#endif
|
||||
return paddingProperty(cell.format(), QTextFormat::TableCellBottomPadding)
|
||||
#ifndef QT_NO_CSSPARSER
|
||||
+ cellBorderWidth(table, cell, QCss::BottomEdge)
|
||||
|
|
@ -283,6 +289,9 @@ public:
|
|||
|
||||
inline QFixed leftPadding(QTextTable *table, const QTextTableCell &cell) const
|
||||
{
|
||||
#ifdef QT_NO_CSSPARSER
|
||||
Q_UNUSED(table);
|
||||
#endif
|
||||
return paddingProperty(cell.format(), QTextFormat::TableCellLeftPadding)
|
||||
#ifndef QT_NO_CSSPARSER
|
||||
+ cellBorderWidth(table, cell, QCss::LeftEdge)
|
||||
|
|
@ -292,6 +301,9 @@ public:
|
|||
|
||||
inline QFixed rightPadding(QTextTable *table, const QTextTableCell &cell) const
|
||||
{
|
||||
#ifdef QT_NO_CSSPARSER
|
||||
Q_UNUSED(table);
|
||||
#endif
|
||||
return paddingProperty(cell.format(), QTextFormat::TableCellRightPadding)
|
||||
#ifndef QT_NO_CSSPARSER
|
||||
+ cellBorderWidth(table, cell, QCss::RightEdge)
|
||||
|
|
@ -1034,15 +1046,22 @@ static bool cellClipTest(QTextTable *table, QTextTableData *td,
|
|||
const QTextTableCell &cell,
|
||||
QRectF cellRect)
|
||||
{
|
||||
#ifdef QT_NO_CSSPARSER
|
||||
Q_UNUSED(table);
|
||||
Q_UNUSED(cell);
|
||||
#endif
|
||||
|
||||
if (!cell_context.clip.isValid())
|
||||
return false;
|
||||
|
||||
if (td->borderCollapse) {
|
||||
// we need to account for the cell borders in the clipping test
|
||||
#ifndef QT_NO_CSSPARSER
|
||||
cellRect.adjust(-axisEdgeData(table, td, cell, QCss::LeftEdge).width / 2,
|
||||
-axisEdgeData(table, td, cell, QCss::TopEdge).width / 2,
|
||||
axisEdgeData(table, td, cell, QCss::RightEdge).width / 2,
|
||||
axisEdgeData(table, td, cell, QCss::BottomEdge).width / 2);
|
||||
#endif
|
||||
} else {
|
||||
qreal border = td->border.toReal();
|
||||
cellRect.adjust(-border, -border, border, border);
|
||||
|
|
@ -1798,6 +1817,13 @@ void QTextDocumentLayoutPrivate::drawTableCellBorder(const QRectF &cellRect, QPa
|
|||
|
||||
if (turn_off_antialiasing)
|
||||
painter->setRenderHint(QPainter::Antialiasing, false);
|
||||
#else
|
||||
Q_UNUSED(cell);
|
||||
Q_UNUSED(cellRect);
|
||||
Q_UNUSED(painter);
|
||||
Q_UNUSED(table);
|
||||
Q_UNUSED(td);
|
||||
Q_UNUSED(cell);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -2285,12 +2311,14 @@ QTextLayoutStruct QTextDocumentLayoutPrivate::layoutCell(QTextTable *t, const QT
|
|||
+ td->border
|
||||
+ td->paddingProperty(cell.format(), QTextFormat::TableCellTopPadding); // top cell-border is not repeated
|
||||
|
||||
#ifndef QT_NO_CSSPARSER
|
||||
const int headerRowCount = t->format().headerRowCount();
|
||||
if (td->borderCollapse && headerRowCount > 0) {
|
||||
// consider the header row's bottom edge width
|
||||
qreal headerRowBottomBorderWidth = axisEdgeData(t, td, t->cellAt(headerRowCount - 1, cell.column()), QCss::BottomEdge).width;
|
||||
layoutStruct.pageTopMargin += QFixed::fromReal(scaleToDevice(headerRowBottomBorderWidth) / 2);
|
||||
}
|
||||
#endif
|
||||
|
||||
layoutStruct.pageBottomMargin = td->effectiveBottomMargin + td->cellSpacing + td->effectiveBottomBorder + td->bottomPadding(t, cell);
|
||||
layoutStruct.pageBottom = (currentPage + 1) * layoutStruct.pageHeight - layoutStruct.pageBottomMargin;
|
||||
|
|
|
|||
|
|
@ -498,12 +498,12 @@ QVector<int> QVulkanWindow::supportedSampleCounts()
|
|||
VkSampleCountFlags depth = limits->framebufferDepthSampleCounts;
|
||||
VkSampleCountFlags stencil = limits->framebufferStencilSampleCounts;
|
||||
|
||||
for (size_t i = 0; i < sizeof(qvk_sampleCounts) / sizeof(qvk_sampleCounts[0]); ++i) {
|
||||
if ((color & qvk_sampleCounts[i].mask)
|
||||
&& (depth & qvk_sampleCounts[i].mask)
|
||||
&& (stencil & qvk_sampleCounts[i].mask))
|
||||
for (const auto &qvk_sampleCount : qvk_sampleCounts) {
|
||||
if ((color & qvk_sampleCount.mask)
|
||||
&& (depth & qvk_sampleCount.mask)
|
||||
&& (stencil & qvk_sampleCount.mask))
|
||||
{
|
||||
result.append(qvk_sampleCounts[i].count);
|
||||
result.append(qvk_sampleCount.count);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -547,9 +547,9 @@ void QVulkanWindow::setSampleCount(int sampleCount)
|
|||
return;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < sizeof(qvk_sampleCounts) / sizeof(qvk_sampleCounts[0]); ++i) {
|
||||
if (qvk_sampleCounts[i].count == sampleCount) {
|
||||
d->sampleCount = qvk_sampleCounts[i].mask;
|
||||
for (const auto &qvk_sampleCount : qvk_sampleCounts) {
|
||||
if (qvk_sampleCount.count == sampleCount) {
|
||||
d->sampleCount = qvk_sampleCount.mask;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1339,14 +1339,13 @@ void QHttp2ProtocolHandler::markAsReset(quint32 streamID)
|
|||
quint32 QHttp2ProtocolHandler::popStreamToResume()
|
||||
{
|
||||
quint32 streamID = connectionStreamID;
|
||||
const int nQ = sizeof suspendedStreams / sizeof suspendedStreams[0];
|
||||
using QNR = QHttpNetworkRequest;
|
||||
const QNR::Priority ranks[nQ] = {QNR::HighPriority,
|
||||
QNR::NormalPriority,
|
||||
QNR::LowPriority};
|
||||
const QNR::Priority ranks[] = {QNR::HighPriority,
|
||||
QNR::NormalPriority,
|
||||
QNR::LowPriority};
|
||||
|
||||
for (int i = 0; i < nQ; ++i) {
|
||||
auto &queue = suspendedStreams[ranks[i]];
|
||||
for (const QNR::Priority rank : ranks) {
|
||||
auto &queue = suspendedStreams[rank];
|
||||
auto it = queue.begin();
|
||||
for (; it != queue.end(); ++it) {
|
||||
if (!activeStreams.contains(*it))
|
||||
|
|
@ -1367,9 +1366,7 @@ quint32 QHttp2ProtocolHandler::popStreamToResume()
|
|||
|
||||
void QHttp2ProtocolHandler::removeFromSuspended(quint32 streamID)
|
||||
{
|
||||
const int nQ = sizeof suspendedStreams / sizeof suspendedStreams[0];
|
||||
for (int i = 0; i < nQ; ++i) {
|
||||
auto &q = suspendedStreams[i];
|
||||
for (auto &q : suspendedStreams) {
|
||||
q.erase(std::remove(q.begin(), q.end(), streamID), q.end());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,8 +42,6 @@
|
|||
#include "qedidparser_p.h"
|
||||
#include "qedidvendortable_p.h"
|
||||
|
||||
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
|
||||
|
||||
#define EDID_DESCRIPTOR_ALPHANUMERIC_STRING 0xfe
|
||||
#define EDID_DESCRIPTOR_PRODUCT_NAME 0xfc
|
||||
#define EDID_DESCRIPTOR_SERIAL_NUMBER 0xff
|
||||
|
|
@ -139,9 +137,9 @@ bool QEdidParser::parse(const QByteArray &blob)
|
|||
manufacturer = m_vendorCache.value(pnpIdString);
|
||||
if (manufacturer.isEmpty()) {
|
||||
// Find the manufacturer from the vendor lookup table
|
||||
for (size_t i = 0; i < ARRAY_LENGTH(q_edidVendorTable); i++) {
|
||||
if (strncmp(q_edidVendorTable[i].id, pnpId, 3) == 0) {
|
||||
manufacturer = QString::fromUtf8(q_edidVendorTable[i].name);
|
||||
for (const auto &vendor : q_edidVendorTable) {
|
||||
if (strncmp(vendor.id, pnpId, 3) == 0) {
|
||||
manufacturer = QString::fromUtf8(vendor.name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ void QCoreTextFontDatabase::populateFamily(const QString &familyName)
|
|||
// A single family might match several different fonts with different styles eg.
|
||||
QCFType<CFArrayRef> matchingFonts = (CFArrayRef) CTFontDescriptorCreateMatchingFontDescriptors(nameOnlyDescriptor, 0);
|
||||
if (!matchingFonts) {
|
||||
qWarning() << "QCoreTextFontDatabase: Found no matching fonts for family" << familyName;
|
||||
qCWarning(lcQpaFonts) << "QCoreTextFontDatabase: Found no matching fonts for family" << familyName;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -400,20 +400,20 @@ QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family)
|
|||
auto attributes = @{ id(kCTFontFamilyNameAttribute): family.toNSString() };
|
||||
QCFType<CTFontDescriptorRef> fontDescriptor = CTFontDescriptorCreateWithAttributes(CFDictionaryRef(attributes));
|
||||
if (!fontDescriptor) {
|
||||
qWarning() << "Failed to create fallback font descriptor for" << family;
|
||||
qCWarning(lcQpaFonts) << "Failed to create fallback font descriptor for" << family;
|
||||
return QStringList();
|
||||
}
|
||||
|
||||
QCFType<CTFontRef> font = CTFontCreateWithFontDescriptor(fontDescriptor, 12.0, 0);
|
||||
if (!font) {
|
||||
qWarning() << "Failed to create fallback font for" << family;
|
||||
qCWarning(lcQpaFonts) << "Failed to create fallback font for" << family;
|
||||
return QStringList();
|
||||
}
|
||||
|
||||
QCFType<CFArrayRef> cascadeList = CFArrayRef(CTFontCopyDefaultCascadeListForLanguages(font,
|
||||
(CFArrayRef)[NSUserDefaults.standardUserDefaults stringArrayForKey:@"AppleLanguages"]));
|
||||
if (!cascadeList) {
|
||||
qWarning() << "Failed to create fallback cascade list for" << family;
|
||||
qCWarning(lcQpaFonts) << "Failed to create fallback cascade list for" << family;
|
||||
return QStringList();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1272,14 +1272,11 @@ void QCocoaWindow::windowWillClose()
|
|||
bool QCocoaWindow::windowShouldClose()
|
||||
{
|
||||
qCDebug(lcQpaWindow) << "QCocoaWindow::windowShouldClose" << window();
|
||||
// This callback should technically only determine if the window
|
||||
// should (be allowed to) close, but since our QPA API to determine
|
||||
// that also involves actually closing the window we do both at the
|
||||
// same time, instead of doing the latter in windowWillClose.
|
||||
bool accepted = false;
|
||||
QWindowSystemInterface::handleCloseEvent(window(), &accepted);
|
||||
QWindowSystemInterface::flushWindowSystemEvents();
|
||||
return accepted;
|
||||
// This callback should technically only determine if the window
|
||||
// should (be allowed to) close, but since our QPA API to determine
|
||||
// that also involves actually closing the window we do both at the
|
||||
// same time, instead of doing the latter in windowWillClose.
|
||||
return QWindowSystemInterface::handleCloseEvent<QWindowSystemInterface::SynchronousDelivery>(window());
|
||||
}
|
||||
|
||||
// ----------------------------- QPA forwarding -----------------------------
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#include "qsql_ibase_p.h"
|
||||
#include <qcoreapplication.h>
|
||||
#include <qdatetime.h>
|
||||
#include <qdeadlinetimer.h>
|
||||
#include <qvariant.h>
|
||||
#include <qsqlerror.h>
|
||||
#include <qsqlfield.h>
|
||||
|
|
@ -1570,10 +1571,9 @@ void QIBaseDriver::close()
|
|||
d->eventBuffers.clear();
|
||||
|
||||
#if defined(FB_API_VER)
|
||||
// Workaround for Firebird crash
|
||||
QTime timer;
|
||||
timer.start();
|
||||
while (timer.elapsed() < 500)
|
||||
// TODO check whether this workaround for Firebird crash is still needed
|
||||
QDeadlineTimer timer(500);
|
||||
while (!timer.hasExpired())
|
||||
QCoreApplication::processEvents();
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ SOURCES += \
|
|||
../../corelib/serialization/qxmlutils.cpp \
|
||||
../../corelib/serialization/qxmlstream.cpp \
|
||||
../../corelib/text/qbytearray.cpp \
|
||||
../../corelib/text/qbytearraylist.cpp \
|
||||
../../corelib/text/qbytearraymatcher.cpp \
|
||||
../../corelib/text/qlocale.cpp \
|
||||
../../corelib/text/qlocale_tools.cpp \
|
||||
|
|
|
|||
|
|
@ -0,0 +1,103 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2018 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <qfile.h>
|
||||
#include <qjsonarray.h>
|
||||
#include <qjsondocument.h>
|
||||
#include <qjsonobject.h>
|
||||
#include <qhashfunctions.h>
|
||||
#include <qstringlist.h>
|
||||
#include <cstdlib>
|
||||
|
||||
static bool readFromDevice(QIODevice *device, QJsonArray *allMetaObjects)
|
||||
{
|
||||
const QByteArray contents = device->readAll();
|
||||
if (contents.isEmpty())
|
||||
return true;
|
||||
|
||||
QJsonParseError error {};
|
||||
QJsonDocument metaObjects = QJsonDocument::fromJson(contents, &error);
|
||||
if (error.error != QJsonParseError::NoError) {
|
||||
fprintf(stderr, "%s at %d\n", error.errorString().toUtf8().constData(), error.offset);
|
||||
return false;
|
||||
}
|
||||
|
||||
allMetaObjects->append(metaObjects.object());
|
||||
return true;
|
||||
}
|
||||
|
||||
int collectJson(const QStringList &jsonFiles, const QString &outputFile)
|
||||
{
|
||||
qSetGlobalQHashSeed(0);
|
||||
|
||||
QFile output;
|
||||
if (outputFile.isEmpty()) {
|
||||
if (!output.open(stdout, QIODevice::WriteOnly)) {
|
||||
fprintf(stderr, "Error opening stdout for writing\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
} else {
|
||||
output.setFileName(outputFile);
|
||||
if (!output.open(QIODevice::WriteOnly)) {
|
||||
fprintf(stderr, "Error opening %s for writing\n", qPrintable(outputFile));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
QJsonArray allMetaObjects;
|
||||
if (jsonFiles.isEmpty()) {
|
||||
QFile f;
|
||||
if (!f.open(stdin, QIODevice::ReadOnly)) {
|
||||
fprintf(stderr, "Error opening stdin for reading\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (!readFromDevice(&f, &allMetaObjects)) {
|
||||
fprintf(stderr, "Error parsing data from stdin\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
for (const QString &jsonFile: jsonFiles) {
|
||||
QFile f(jsonFile);
|
||||
if (!f.open(QIODevice::ReadOnly)) {
|
||||
fprintf(stderr, "Error opening %s for reading\n", qPrintable(jsonFile));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (!readFromDevice(&f, &allMetaObjects)) {
|
||||
fprintf(stderr, "Error parsing %s\n", qPrintable(jsonFile));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
QJsonDocument doc(allMetaObjects);
|
||||
output.write(doc.toJson());
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2019 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the tools applications of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef COLLECTJSON_H
|
||||
#define COLLECTJSON_H
|
||||
|
||||
#include <qglobal.h>
|
||||
#include <qstring.h>
|
||||
#include <qstringlist.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
int collectJson(const QStringList &jsonFiles, const QString &outputFile);
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // COLLECTOJSON_H
|
||||
|
|
@ -30,6 +30,7 @@
|
|||
#include "preprocessor.h"
|
||||
#include "moc.h"
|
||||
#include "outputrevision.h"
|
||||
#include "collectjson.h"
|
||||
|
||||
#include <qfile.h>
|
||||
#include <qfileinfo.h>
|
||||
|
|
@ -37,10 +38,12 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <qcoreapplication.h>
|
||||
#include <qcommandlineoption.h>
|
||||
#include <qcommandlineparser.h>
|
||||
#include <qscopedpointer.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
@ -77,6 +80,10 @@ void error(const char *msg = "Invalid argument")
|
|||
fprintf(stderr, "moc: %s\n", msg);
|
||||
}
|
||||
|
||||
struct ScopedPointerFileCloser
|
||||
{
|
||||
static inline void cleanup(FILE *handle) { if (handle) fclose(handle); }
|
||||
};
|
||||
|
||||
static inline bool hasNext(const Symbols &symbols, int i)
|
||||
{ return (i < symbols.size()); }
|
||||
|
|
@ -293,10 +300,20 @@ int runMoc(int argc, char **argv)
|
|||
ignoreConflictsOption.setDescription(QStringLiteral("Ignore all options that conflict with compilers, like -pthread conflicting with moc's -p option."));
|
||||
parser.addOption(ignoreConflictsOption);
|
||||
|
||||
QCommandLineOption jsonOption(QStringLiteral("output-json"));
|
||||
jsonOption.setDescription(QStringLiteral("In addition to generating C++ code, create a machine-readable JSON file in a file that matches the output file and an extra .json extension."));
|
||||
parser.addOption(jsonOption);
|
||||
|
||||
QCommandLineOption collectOption(QStringLiteral("collect-json"));
|
||||
collectOption.setDescription(QStringLiteral("Instead of processing C++ code, collect previously generated JSON output into a single file."));
|
||||
parser.addOption(collectOption);
|
||||
|
||||
parser.addPositionalArgument(QStringLiteral("[header-file]"),
|
||||
QStringLiteral("Header file to read from, otherwise stdin."));
|
||||
parser.addPositionalArgument(QStringLiteral("[@option-file]"),
|
||||
QStringLiteral("Read additional options from option-file."));
|
||||
parser.addPositionalArgument(QStringLiteral("[MOC generated json file]"),
|
||||
QStringLiteral("MOC generated json output"));
|
||||
|
||||
const QStringList arguments = argumentsFromCommandLineAndFile(app.arguments());
|
||||
if (arguments.isEmpty())
|
||||
|
|
@ -305,6 +322,10 @@ int runMoc(int argc, char **argv)
|
|||
parser.process(arguments);
|
||||
|
||||
const QStringList files = parser.positionalArguments();
|
||||
output = parser.value(outputOption);
|
||||
if (parser.isSet(collectOption))
|
||||
return collectJson(files, output);
|
||||
|
||||
if (files.count() > 1) {
|
||||
error(qPrintable(QLatin1String("Too many input files specified: '") + files.join(QLatin1String("' '")) + QLatin1Char('\'')));
|
||||
parser.showHelp(1);
|
||||
|
|
@ -313,7 +334,6 @@ int runMoc(int argc, char **argv)
|
|||
}
|
||||
|
||||
const bool ignoreConflictingOptions = parser.isSet(ignoreConflictsOption);
|
||||
output = parser.value(outputOption);
|
||||
pp.preprocessOnly = parser.isSet(preprocessOption);
|
||||
if (parser.isSet(noIncludeOption)) {
|
||||
moc.noInclude = true;
|
||||
|
|
@ -485,6 +505,8 @@ int runMoc(int argc, char **argv)
|
|||
|
||||
// 3. and output meta object code
|
||||
|
||||
QScopedPointer<FILE, ScopedPointerFileCloser> jsonOutput;
|
||||
|
||||
if (output.size()) { // output file specified
|
||||
#if defined(_MSC_VER)
|
||||
if (_wfopen_s(&out, reinterpret_cast<const wchar_t *>(output.utf16()), L"w") != 0)
|
||||
|
|
@ -496,6 +518,21 @@ int runMoc(int argc, char **argv)
|
|||
fprintf(stderr, "moc: Cannot create %s\n", QFile::encodeName(output).constData());
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (parser.isSet(jsonOption)) {
|
||||
const QString jsonOutputFileName = output + QLatin1String(".json");
|
||||
FILE *f;
|
||||
#if defined(_MSC_VER)
|
||||
if (_wfopen_s(&f, reinterpret_cast<const wchar_t *>(jsonOutputFileName.utf16()), L"w") != 0)
|
||||
#else
|
||||
f = fopen(QFile::encodeName(jsonOutputFileName).constData(), "w");
|
||||
if (!f)
|
||||
#endif
|
||||
fprintf(stderr, "moc: Cannot create JSON output file %s. %s\n",
|
||||
QFile::encodeName(jsonOutputFileName).constData(),
|
||||
strerror(errno));
|
||||
jsonOutput.reset(f);
|
||||
}
|
||||
} else { // use stdout
|
||||
out = stdout;
|
||||
}
|
||||
|
|
@ -506,7 +543,7 @@ int runMoc(int argc, char **argv)
|
|||
if (moc.classList.isEmpty())
|
||||
moc.note("No relevant classes found. No output generated.");
|
||||
else
|
||||
moc.generate(out);
|
||||
moc.generate(out, jsonOutput.data());
|
||||
}
|
||||
|
||||
if (output.size())
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include <QtCore/qfile.h>
|
||||
#include <QtCore/qfileinfo.h>
|
||||
#include <QtCore/qdir.h>
|
||||
#include <QtCore/qjsondocument.h>
|
||||
|
||||
// for normalizeTypeInternal
|
||||
#include <private/qmetaobject_moc_p.h>
|
||||
|
|
@ -999,7 +1000,7 @@ static QByteArrayList requiredQtContainers(const QVector<ClassDef> &classes)
|
|||
return required;
|
||||
}
|
||||
|
||||
void Moc::generate(FILE *out)
|
||||
void Moc::generate(FILE *out, FILE *jsonOutput)
|
||||
{
|
||||
QByteArray fn = filename;
|
||||
int i = filename.length()-1;
|
||||
|
|
@ -1062,6 +1063,23 @@ void Moc::generate(FILE *out)
|
|||
|
||||
fprintf(out, "QT_WARNING_POP\n");
|
||||
fprintf(out, "QT_END_MOC_NAMESPACE\n");
|
||||
|
||||
if (jsonOutput) {
|
||||
QJsonObject mocData;
|
||||
mocData[QLatin1String("outputRevision")] = mocOutputRevision;
|
||||
mocData[QLatin1String("inputFile")] = QLatin1String(fn.constData());
|
||||
|
||||
QJsonArray classesJsonFormatted;
|
||||
|
||||
for (const ClassDef &cdef: qAsConst(classList))
|
||||
classesJsonFormatted.append(cdef.toJson());
|
||||
|
||||
if (!classesJsonFormatted.isEmpty())
|
||||
mocData[QLatin1String("classes")] = classesJsonFormatted;
|
||||
|
||||
QJsonDocument jsonDoc(mocData);
|
||||
fputs(jsonDoc.toJson().constData(), jsonOutput);
|
||||
}
|
||||
}
|
||||
|
||||
void Moc::parseSlots(ClassDef *def, FunctionDef::Access access)
|
||||
|
|
@ -1784,6 +1802,186 @@ void Moc::checkProperties(ClassDef *cdef)
|
|||
}
|
||||
}
|
||||
|
||||
QJsonObject ClassDef::toJson() const
|
||||
{
|
||||
QJsonObject cls;
|
||||
cls[QLatin1String("className")] = QString::fromUtf8(classname.constData());
|
||||
cls[QLatin1String("qualifiedClassName")] = QString::fromUtf8(qualified.constData());
|
||||
|
||||
QJsonArray classInfos;
|
||||
for (const auto &info: qAsConst(classInfoList)) {
|
||||
QJsonObject infoJson;
|
||||
infoJson[QLatin1String("name")] = QString::fromUtf8(info.name);
|
||||
infoJson[QLatin1String("value")] = QString::fromUtf8(info.value);
|
||||
classInfos.append(infoJson);
|
||||
}
|
||||
|
||||
if (classInfos.size())
|
||||
cls[QLatin1String("classInfos")] = classInfos;
|
||||
|
||||
const auto appendFunctions = [&cls](const QString &type, const QVector<FunctionDef> &funcs) {
|
||||
QJsonArray jsonFuncs;
|
||||
|
||||
for (const FunctionDef &fdef: funcs)
|
||||
jsonFuncs.append(fdef.toJson());
|
||||
|
||||
if (!jsonFuncs.isEmpty())
|
||||
cls[type] = jsonFuncs;
|
||||
};
|
||||
|
||||
appendFunctions(QLatin1String("signals"), signalList);
|
||||
appendFunctions(QLatin1String("slots"), slotList);
|
||||
appendFunctions(QLatin1String("constructors"), constructorList);
|
||||
appendFunctions(QLatin1String("methods"), methodList);
|
||||
|
||||
QJsonArray props;
|
||||
|
||||
for (const PropertyDef &propDef: qAsConst(propertyList))
|
||||
props.append(propDef.toJson());
|
||||
|
||||
if (!props.isEmpty())
|
||||
cls[QLatin1String("properties")] = props;
|
||||
|
||||
if (hasQGadget)
|
||||
cls[QLatin1String("gadget")] = true;
|
||||
|
||||
QJsonArray superClasses;
|
||||
|
||||
for (const auto &super: qAsConst(superclassList)) {
|
||||
const auto name = super.first;
|
||||
const auto access = super.second;
|
||||
QJsonObject superCls;
|
||||
superCls[QLatin1String("name")] = QString::fromUtf8(name);
|
||||
FunctionDef::accessToJson(&superCls, access);
|
||||
superClasses.append(superCls);
|
||||
}
|
||||
|
||||
if (!superClasses.isEmpty())
|
||||
cls[QLatin1String("superClasses")] = superClasses;
|
||||
|
||||
QJsonArray enums;
|
||||
for (const EnumDef &enumDef: qAsConst(enumList))
|
||||
enums.append(enumDef.toJson(*this));
|
||||
if (!enums.isEmpty())
|
||||
cls[QLatin1String("enums")] = enums;
|
||||
|
||||
QJsonArray ifaces;
|
||||
for (const QVector<Interface> &ifaceList: interfaceList) {
|
||||
QJsonArray jsonList;
|
||||
for (const Interface &iface: ifaceList) {
|
||||
QJsonObject ifaceJson;
|
||||
ifaceJson[QLatin1String("id")] = QString::fromUtf8(iface.interfaceId);
|
||||
ifaceJson[QLatin1String("className")] = QString::fromUtf8(iface.className);
|
||||
jsonList.append(ifaceJson);
|
||||
}
|
||||
ifaces.append(jsonList);
|
||||
}
|
||||
if (!ifaces.isEmpty())
|
||||
cls[QLatin1String("interfaces")] = ifaces;
|
||||
|
||||
return cls;
|
||||
}
|
||||
|
||||
QJsonObject FunctionDef::toJson() const
|
||||
{
|
||||
QJsonObject fdef;
|
||||
fdef[QLatin1String("name")] = QString::fromUtf8(name);
|
||||
if (!tag.isEmpty())
|
||||
fdef[QLatin1String("tag")] = QString::fromUtf8(tag);
|
||||
fdef[QLatin1String("returnType")] = QString::fromUtf8(normalizedType);
|
||||
|
||||
QJsonArray args;
|
||||
for (const ArgumentDef &arg: arguments)
|
||||
args.append(arg.toJson());
|
||||
|
||||
if (!args.isEmpty())
|
||||
fdef[QLatin1String("arguments")] = args;
|
||||
|
||||
accessToJson(&fdef, access);
|
||||
|
||||
if (revision > 0)
|
||||
fdef[QLatin1String("revision")] = revision;
|
||||
|
||||
return fdef;
|
||||
}
|
||||
|
||||
void FunctionDef::accessToJson(QJsonObject *obj, FunctionDef::Access acs)
|
||||
{
|
||||
switch (acs) {
|
||||
case Private: (*obj)[QLatin1String("access")] = QLatin1String("private"); break;
|
||||
case Public: (*obj)[QLatin1String("access")] = QLatin1String("public"); break;
|
||||
case Protected: (*obj)[QLatin1String("access")] = QLatin1String("protected"); break;
|
||||
}
|
||||
}
|
||||
|
||||
QJsonObject ArgumentDef::toJson() const
|
||||
{
|
||||
QJsonObject arg;
|
||||
arg[QLatin1String("type")] = QString::fromUtf8(normalizedType);
|
||||
if (!name.isEmpty())
|
||||
arg[QLatin1String("name")] = QString::fromUtf8(name);
|
||||
return arg;
|
||||
}
|
||||
|
||||
QJsonObject PropertyDef::toJson() const
|
||||
{
|
||||
QJsonObject prop;
|
||||
prop[QLatin1String("name")] = QString::fromUtf8(name);
|
||||
prop[QLatin1String("type")] = QString::fromUtf8(type);
|
||||
|
||||
const auto jsonify = [&prop](const char *str, const QByteArray &member) {
|
||||
if (!member.isEmpty())
|
||||
prop[QLatin1String(str)] = QString::fromUtf8(member);
|
||||
};
|
||||
|
||||
jsonify("member", member);
|
||||
jsonify("read", read);
|
||||
jsonify("write", write);
|
||||
jsonify("reset", reset);
|
||||
jsonify("notify", notify);
|
||||
jsonify("privateClass", inPrivateClass);
|
||||
|
||||
const auto jsonifyBoolOrString = [&prop](const char *str, const QByteArray &boolOrString) {
|
||||
QJsonValue value;
|
||||
if (boolOrString == "true")
|
||||
value = true;
|
||||
else if (boolOrString == "false")
|
||||
value = false;
|
||||
else
|
||||
value = QString::fromUtf8(boolOrString); // function name to query at run-time
|
||||
prop[QLatin1String(str)] = value;
|
||||
};
|
||||
|
||||
jsonifyBoolOrString("designable", designable);
|
||||
jsonifyBoolOrString("scriptable", scriptable);
|
||||
jsonifyBoolOrString("stored", stored);
|
||||
jsonifyBoolOrString("user", user);
|
||||
|
||||
prop[QLatin1String("constant")] = constant;
|
||||
prop[QLatin1String("final")] = final;
|
||||
|
||||
if (revision > 0)
|
||||
prop[QLatin1String("revision")] = revision;
|
||||
|
||||
return prop;
|
||||
}
|
||||
|
||||
QJsonObject EnumDef::toJson(const ClassDef &cdef) const
|
||||
{
|
||||
QJsonObject def;
|
||||
def[QLatin1String("name")] = QString::fromUtf8(name);
|
||||
if (!enumName.isEmpty())
|
||||
def[QLatin1String("alias")] = QString::fromUtf8(enumName);
|
||||
def[QLatin1String("isFlag")] = cdef.enumDeclarations.value(name);
|
||||
def[QLatin1String("isClass")] = isEnumClass;
|
||||
|
||||
QJsonArray valueArr;
|
||||
for (const QByteArray &value: values)
|
||||
valueArr.append(QString::fromUtf8(value));
|
||||
if (!valueArr.isEmpty())
|
||||
def[QLatin1String("values")] = valueArr;
|
||||
|
||||
return def;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ struct Type
|
|||
};
|
||||
Q_DECLARE_TYPEINFO(Type, Q_MOVABLE_TYPE);
|
||||
|
||||
struct ClassDef;
|
||||
struct EnumDef
|
||||
{
|
||||
QByteArray name;
|
||||
|
|
@ -68,6 +69,7 @@ struct EnumDef
|
|||
QVector<QByteArray> values;
|
||||
bool isEnumClass; // c++11 enum class
|
||||
EnumDef() : isEnumClass(false) {}
|
||||
QJsonObject toJson(const ClassDef &cdef) const;
|
||||
};
|
||||
Q_DECLARE_TYPEINFO(EnumDef, Q_MOVABLE_TYPE);
|
||||
|
||||
|
|
@ -78,6 +80,8 @@ struct ArgumentDef
|
|||
QByteArray rightType, normalizedType, name;
|
||||
QByteArray typeNameForCast; // type name to be used in cast from void * in metacall
|
||||
bool isDefault;
|
||||
|
||||
QJsonObject toJson() const;
|
||||
};
|
||||
Q_DECLARE_TYPEINFO(ArgumentDef, Q_MOVABLE_TYPE);
|
||||
|
||||
|
|
@ -111,6 +115,9 @@ struct FunctionDef
|
|||
bool isConstructor = false;
|
||||
bool isDestructor = false;
|
||||
bool isAbstract = false;
|
||||
|
||||
QJsonObject toJson() const;
|
||||
static void accessToJson(QJsonObject *obj, Access acs);
|
||||
};
|
||||
Q_DECLARE_TYPEINFO(FunctionDef, Q_MOVABLE_TYPE);
|
||||
|
||||
|
|
@ -130,6 +137,8 @@ struct PropertyDef
|
|||
int revision = 0;
|
||||
bool constant = false;
|
||||
bool final = false;
|
||||
|
||||
QJsonObject toJson() const;
|
||||
};
|
||||
Q_DECLARE_TYPEINFO(PropertyDef, Q_MOVABLE_TYPE);
|
||||
|
||||
|
|
@ -183,6 +192,7 @@ struct ClassDef : BaseDef {
|
|||
bool hasQObject = false;
|
||||
bool hasQGadget = false;
|
||||
|
||||
QJsonObject toJson() const;
|
||||
};
|
||||
Q_DECLARE_TYPEINFO(ClassDef, Q_MOVABLE_TYPE);
|
||||
Q_DECLARE_TYPEINFO(ClassDef::Interface, Q_MOVABLE_TYPE);
|
||||
|
|
@ -215,7 +225,7 @@ public:
|
|||
QMap<QString, QJsonArray> metaArgs;
|
||||
|
||||
void parse();
|
||||
void generate(FILE *out);
|
||||
void generate(FILE *out, FILE *jsonOutput);
|
||||
|
||||
bool parseClassHead(ClassDef *def);
|
||||
inline bool inClass(const ClassDef *def) const {
|
||||
|
|
|
|||
|
|
@ -10,9 +10,12 @@ HEADERS = $$PWD/moc.h \
|
|||
$$PWD/utils.h \
|
||||
$$PWD/generator.h \
|
||||
$$PWD/outputrevision.h \
|
||||
$$PWD/cbordevice.h
|
||||
$$PWD/cbordevice.h \
|
||||
$$PWD/collectjson.h
|
||||
|
||||
SOURCES = $$PWD/moc.cpp \
|
||||
$$PWD/preprocessor.cpp \
|
||||
$$PWD/generator.cpp \
|
||||
$$PWD/parser.cpp \
|
||||
$$PWD/token.cpp
|
||||
$$PWD/token.cpp \
|
||||
$$PWD/collectjson.cpp
|
||||
|
|
|
|||
|
|
@ -1776,8 +1776,8 @@ void QAbstractItemView::mousePressEvent(QMouseEvent *event)
|
|||
QItemSelectionModel::SelectionFlags command = selectionCommand(index, event);
|
||||
d->noSelectionOnMousePress = command == QItemSelectionModel::NoUpdate || !index.isValid();
|
||||
QPoint offset = d->offset();
|
||||
d->pressedPosition = pos + offset;
|
||||
if ((command & QItemSelectionModel::Current) == 0) {
|
||||
d->pressedPosition = pos + offset;
|
||||
d->currentSelectionStartIndex = index;
|
||||
}
|
||||
else if (!d->currentSelectionStartIndex.isValid())
|
||||
|
|
|
|||
|
|
@ -748,11 +748,14 @@ QMimeData *QTreeModel::internalMimeData() const
|
|||
|
||||
QMimeData *QTreeModel::mimeData(const QModelIndexList &indexes) const
|
||||
{
|
||||
QList<QTreeWidgetItem*> items;
|
||||
for (const auto &index : indexes) {
|
||||
if (index.column() == 0) // only one item per row
|
||||
items << item(index);
|
||||
}
|
||||
QList<QTreeWidgetItem *> items;
|
||||
std::transform(indexes.begin(), indexes.end(), std::back_inserter(items),
|
||||
[this](const QModelIndex &idx) -> QTreeWidgetItem * { return item(idx); });
|
||||
|
||||
// Ensure we only have one item as an item may have more than
|
||||
// one index selected if there is more than one column
|
||||
std::sort(items.begin(), items.end());
|
||||
items.erase(std::unique(items.begin(), items.end()), items.end());
|
||||
|
||||
// cachedIndexes is a little hack to avoid copying from QModelIndexList to
|
||||
// QList<QTreeWidgetItem*> and back again in the view
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ Qt::GestureType QGestureManager::registerGestureRecognizer(QGestureRecognizer *r
|
|||
void QGestureManager::unregisterGestureRecognizer(Qt::GestureType type)
|
||||
{
|
||||
QList<QGestureRecognizer *> list = m_recognizers.values(type);
|
||||
m_recognizers.remove(type);
|
||||
foreach (QGesture *g, m_gestureToRecognizer.keys()) {
|
||||
QGestureRecognizer *recognizer = m_gestureToRecognizer.value(g);
|
||||
if (list.contains(recognizer)) {
|
||||
|
|
|
|||
|
|
@ -107,6 +107,7 @@ void tst_qfloat16::ltgt_data()
|
|||
QTest::addColumn<float>("val2");
|
||||
|
||||
QTest::newRow("zero") << 0.0f << 0.0f;
|
||||
QTest::newRow("-zero") << -0.0f << 0.0f;
|
||||
QTest::newRow("ten") << 10.0f << 10.0f;
|
||||
QTest::newRow("large") << 100000.0f << 100000.0f;
|
||||
QTest::newRow("small") << 0.0000001f << 0.0000001f;
|
||||
|
|
@ -405,6 +406,7 @@ void tst_qfloat16::finite_data()
|
|||
QTest::addColumn<int>("mode");
|
||||
|
||||
QTest::newRow("zero") << qfloat16(0) << FP_ZERO;
|
||||
QTest::newRow("-zero") << -qfloat16(0) << FP_ZERO;
|
||||
QTest::newRow("one") << qfloat16(1) << FP_NORMAL;
|
||||
QTest::newRow("-one") << qfloat16(-1) << FP_NORMAL;
|
||||
QTest::newRow("ten") << qfloat16(10) << FP_NORMAL;
|
||||
|
|
@ -459,6 +461,12 @@ void tst_qfloat16::limits() // See also: qNaN() and infinity()
|
|||
// A few useful values:
|
||||
const qfloat16 zero(0), one(1), ten(10);
|
||||
|
||||
// The specifics of minus zero:
|
||||
// (IEEE 754 seems to want -zero < zero, but -0. == 0. and -0.f == 0.f in C++.)
|
||||
QVERIFY(-zero <= zero);
|
||||
QVERIFY(-zero == zero);
|
||||
QVERIFY(!(-zero > zero));
|
||||
|
||||
// digits in the mantissa, including the implicit 1 before the binary dot at its left:
|
||||
QVERIFY(qfloat16(1 << (Bounds::digits - 1)) + one > qfloat16(1 << (Bounds::digits - 1)));
|
||||
QVERIFY(qfloat16(1 << Bounds::digits) + one == qfloat16(1 << Bounds::digits));
|
||||
|
|
@ -523,7 +531,10 @@ void tst_qfloat16::limits() // See also: qNaN() and infinity()
|
|||
QVERIFY(Bounds::denorm_min() > zero);
|
||||
if (overOptimized)
|
||||
QEXPECT_FAIL("", "Over-optimized on ARM", Continue);
|
||||
QCOMPARE(Bounds::denorm_min() / rose, zero);
|
||||
QVERIFY(Bounds::denorm_min() / rose == zero);
|
||||
if (overOptimized)
|
||||
QEXPECT_FAIL("", "Over-optimized on ARM", Continue);
|
||||
QVERIFY(-Bounds::denorm_min() / rose == -zero);
|
||||
}
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_qfloat16)
|
||||
|
|
|
|||
|
|
@ -6,8 +6,6 @@
|
|||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Created by Qt/QMake</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>${ASSETCATALOG_COMPILER_APPICON_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
|
|
|||
|
|
@ -59,8 +59,6 @@ void tst_MacPlist::test_plist_data()
|
|||
" <string></string>\n"
|
||||
" <key>CFBundlePackageType</key>\n"
|
||||
" <string>APPL</string>\n"
|
||||
" <key>CFBundleGetInfoString</key>\n"
|
||||
" <string>Created by Qt/QMake</string>\n"
|
||||
" <key>CFBundleExecutable</key>\n"
|
||||
" <string>app</string>\n"
|
||||
" <key>CFBundleIdentifier</key>\n"
|
||||
|
|
@ -77,8 +75,6 @@ void tst_MacPlist::test_plist_data()
|
|||
" <string></string>\n"
|
||||
" <key>CFBundlePackageType</key>\n"
|
||||
" <string>APPL</string>\n"
|
||||
" <key>CFBundleGetInfoString</key>\n"
|
||||
" <string>Created by Qt/QMake</string>\n"
|
||||
" <key>CFBundleExecutable</key>\n"
|
||||
" <string>app</string>\n"
|
||||
" <key>CFBundleIdentifier</key>\n"
|
||||
|
|
@ -97,8 +93,6 @@ void tst_MacPlist::test_plist_data()
|
|||
" <string></string>\n"
|
||||
" <key>CFBundlePackageType</key>\n"
|
||||
" <string>APPL</string>\n"
|
||||
" <key>CFBundleGetInfoString</key>\n"
|
||||
" <string>Created by Qt/QMake</string>\n"
|
||||
" <key>CFBundleExecutable</key>\n"
|
||||
" <string>app</string>\n"
|
||||
" <key>CFBundleIdentifier</key>\n"
|
||||
|
|
@ -117,8 +111,6 @@ void tst_MacPlist::test_plist_data()
|
|||
" <string></string>\n"
|
||||
" <key>CFBundlePackageType</key>\n"
|
||||
" <string>APPL</string>\n"
|
||||
" <key>CFBundleGetInfoString</key>\n"
|
||||
" <string>Created by Qt/QMake</string>\n"
|
||||
" <key>CFBundleExecutable</key>\n"
|
||||
" <string>app</string>\n"
|
||||
" <key>CFBundleIdentifier</key>\n"
|
||||
|
|
@ -137,8 +129,6 @@ void tst_MacPlist::test_plist_data()
|
|||
" <string></string>\n"
|
||||
" <key>CFBundlePackageType</key>\n"
|
||||
" <string>APPL</string>\n"
|
||||
" <key>CFBundleGetInfoString</key>\n"
|
||||
" <string>Created by Qt/QMake</string>\n"
|
||||
" <key>CFBundleExecutable</key>\n"
|
||||
" <string>app</string>\n"
|
||||
" <key>CFBundleIdentifier</key>\n"
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
tst_moc
|
||||
allmocs.json
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -32,6 +32,9 @@ HEADERS += using-namespaces.h no-keywords.h task87883.h c-comments.h backslash-n
|
|||
namespace.h cxx17-namespaces.h \
|
||||
cxx-attributes.h
|
||||
|
||||
# No platform specifics in the JSON files, so that we can compare them
|
||||
JSON_HEADERS = $$HEADERS
|
||||
JSON_HEADERS -= cxx-attributes.h
|
||||
|
||||
if(*-g++*|*-icc*|*-clang*|*-llvm):!win32-*: HEADERS += os9-newlines.h win-newlines.h
|
||||
if(*-g++*|*-clang*): HEADERS += dollars.h
|
||||
|
|
@ -50,3 +53,49 @@ QMAKE_MOC_OPTIONS += -Muri=com.company.app -Muri=com.company.app.private
|
|||
# Define macro on the command lines used in parse-defines.h
|
||||
QMAKE_MOC_OPTIONS += "-DDEFINE_CMDLINE_EMPTY=" "\"-DDEFINE_CMDLINE_SIGNAL=void cmdlineSignal(const QMap<int, int> &i)\""
|
||||
|
||||
QMAKE_MOC_OPTIONS += --output-json
|
||||
|
||||
debug_and_release {
|
||||
CONFIG(debug, debug|release) {
|
||||
MOC_CPP_DIR = $$MOC_DIR/debug
|
||||
} else {
|
||||
MOC_CPP_DIR = $$MOC_DIR/release
|
||||
}
|
||||
} else {
|
||||
MOC_CPP_DIR = $$MOC_DIR
|
||||
}
|
||||
|
||||
moc_json_header.input = JSON_HEADERS
|
||||
moc_json_header.output = $$MOC_CPP_DIR/$${QMAKE_H_MOD_MOC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)}.json
|
||||
moc_json_header.CONFIG = no_link moc_verify
|
||||
moc_json_header.depends = $$MOC_CPP_DIR/$${QMAKE_H_MOD_MOC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)}
|
||||
moc_json_header.commands = $$escape_expand(\\n) # force creation of rule
|
||||
moc_json_header.variable_out = MOC_JSON_HEADERS
|
||||
|
||||
BASELINE_IN = allmocs_baseline_in.json
|
||||
copy_baseline.commands = $${QMAKE_COPY} $$shell_path(${QMAKE_FILE_NAME}) ${QMAKE_FILE_OUT}
|
||||
copy_baseline.input = BASELINE_IN
|
||||
copy_baseline.output = $$OUT_PWD/allmocs_baseline.json
|
||||
copy_baseline.CONFIG = no_link
|
||||
|
||||
qtPrepareTool(MOC_COLLECT_JSON, moc)
|
||||
jsoncollector.CONFIG += combine
|
||||
jsoncollector.commands = $$MOC_COLLECT_JSON --collect-json -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
|
||||
jsoncollector.input = MOC_JSON_HEADERS
|
||||
jsoncollector.output = $$OUT_PWD/allmocs.json
|
||||
jsoncollector.variable_out = GENERATED_FILES
|
||||
|
||||
allmocs_contents = \
|
||||
"<!DOCTYPE RCC><RCC version=\"1.0\">"\
|
||||
"<qresource prefix=\"/\">"\
|
||||
"<file>allmocs.json</file>"\
|
||||
"<file>allmocs_baseline.json</file>"\
|
||||
"</qresource>"\
|
||||
"</RCC>"
|
||||
|
||||
allmocs_file = $$OUT_PWD/allmocs.qrc
|
||||
|
||||
!write_file($$allmocs_file, allmocs_contents): error()
|
||||
RESOURCES += $$allmocs_file
|
||||
|
||||
QMAKE_EXTRA_COMPILERS += moc_json_header copy_baseline jsoncollector
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include <stdio.h>
|
||||
#include <qobject.h>
|
||||
#include <qmetaobject.h>
|
||||
#include <qjsondocument.h>
|
||||
|
||||
#include "using-namespaces.h"
|
||||
#include "assign-namespace.h"
|
||||
|
|
@ -717,6 +718,7 @@ private slots:
|
|||
void testQNamespace();
|
||||
void cxx17Namespaces();
|
||||
void cxxAttributes();
|
||||
void mocJsonOutput();
|
||||
|
||||
signals:
|
||||
void sigWithUnsignedArg(unsigned foo);
|
||||
|
|
@ -3971,6 +3973,57 @@ void tst_Moc::cxxAttributes()
|
|||
QCOMPARE(meta.keyCount(), 7);
|
||||
}
|
||||
|
||||
void tst_Moc::mocJsonOutput()
|
||||
{
|
||||
const auto readFile = [](const QString &fileName) {
|
||||
QFile f(fileName);
|
||||
f.open(QIODevice::ReadOnly);
|
||||
return QJsonDocument::fromJson(f.readAll());
|
||||
};
|
||||
|
||||
const QString actualFile = QStringLiteral(":/allmocs.json");
|
||||
const QString expectedFile = QStringLiteral(":/allmocs_baseline.json");
|
||||
|
||||
QVERIFY2(QFile::exists(actualFile), qPrintable(actualFile));
|
||||
QVERIFY2(QFile::exists(expectedFile), qPrintable(expectedFile));
|
||||
|
||||
QJsonDocument actualOutput = readFile(QLatin1String(":/allmocs.json"));
|
||||
QJsonDocument expectedOutput = readFile(QLatin1String(":/allmocs_baseline.json"));
|
||||
|
||||
const auto showPotentialDiff = [](const QJsonDocument &actual, const QJsonDocument &expected) -> QByteArray {
|
||||
#if defined(Q_OS_UNIX)
|
||||
QByteArray actualStr = actual.toJson();
|
||||
QByteArray expectedStr = expected.toJson();
|
||||
|
||||
QTemporaryFile actualFile;
|
||||
if (!actualFile.open())
|
||||
return "Error opening actual temp file";
|
||||
actualFile.write(actualStr);
|
||||
actualFile.flush();
|
||||
|
||||
QTemporaryFile expectedFile;
|
||||
if (!expectedFile.open())
|
||||
return "Error opening expected temp file";
|
||||
expectedFile.write(expectedStr);
|
||||
expectedFile.flush();
|
||||
|
||||
QProcess diffProc;
|
||||
diffProc.setProgram("diff");
|
||||
diffProc.setArguments(QStringList() << "-ub" << expectedFile.fileName() << actualFile.fileName());
|
||||
diffProc.start();
|
||||
if (!diffProc.waitForStarted())
|
||||
return "Error waiting for diff process to start.";
|
||||
if (!diffProc.waitForFinished())
|
||||
return "Error waiting for diff process to finish.";
|
||||
return diffProc.readAllStandardOutput();
|
||||
#else
|
||||
return "Cannot launch diff. Please check allmocs.json and allmocs_baseline.json on disk.";
|
||||
#endif
|
||||
};
|
||||
|
||||
QVERIFY2(actualOutput == expectedOutput, showPotentialDiff(actualOutput, expectedOutput).constData());
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_Moc)
|
||||
|
||||
// the generated code must compile with QT_NO_KEYWORDS
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
TEMPLATE = app
|
||||
CONFIG += debug_and_release
|
||||
CONFIG += debug_and_release build_all
|
||||
TARGET = bah
|
||||
DESTDIR = shu
|
||||
SOURCES += main.cpp
|
||||
|
|
|
|||
|
|
@ -26,25 +26,21 @@
|
|||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "../../../../shared/fakedirmodel.h"
|
||||
#include <QtTest/QtTest>
|
||||
#include <QColumnView>
|
||||
#include <QScrollBar>
|
||||
#include <QSignalSpy>
|
||||
#include <QStringListModel>
|
||||
#include <QStyledItemDelegate>
|
||||
#include <QTest>
|
||||
#include <QtTest/private/qtesthelpers_p.h>
|
||||
#include <qitemdelegate.h>
|
||||
#include <qcolumnview.h>
|
||||
#include <private/qcolumnviewgrip_p.h>
|
||||
#include <private/qfilesystemmodel_p.h>
|
||||
#include <qstringlistmodel.h>
|
||||
#include <qdebug.h>
|
||||
#include <qitemdelegate.h>
|
||||
#include <qscrollbar.h>
|
||||
#include <private/qcolumnview_p.h>
|
||||
#include <qscreen.h>
|
||||
#include <QtWidgets/private/qcolumnviewgrip_p.h>
|
||||
#include "../../../../shared/fakedirmodel.h"
|
||||
|
||||
#define ANIMATION_DELAY 300
|
||||
|
||||
class tst_QColumnView : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
class tst_QColumnView : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
tst_QColumnView();
|
||||
|
||||
|
|
@ -98,6 +94,7 @@ private:
|
|||
|
||||
class TreeModel : public QStandardItemModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TreeModel()
|
||||
{
|
||||
|
|
@ -122,51 +119,31 @@ public:
|
|||
inline QModelIndex thirdLevel() { return index(0, 0, secondLevel()); }
|
||||
};
|
||||
|
||||
class ColumnView : public QColumnView {
|
||||
|
||||
class ColumnView : public QColumnView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ColumnView(QWidget *parent = 0) : QColumnView(parent){}
|
||||
using QColumnView::QColumnView;
|
||||
using QColumnView::horizontalOffset;
|
||||
using QColumnView::clicked;
|
||||
using QColumnView::isIndexHidden;
|
||||
using QColumnView::moveCursor;
|
||||
using QColumnView::scrollContentsBy;
|
||||
using QColumnView::setSelection;
|
||||
using QColumnView::visualRegionForSelection;
|
||||
|
||||
QList<QPointer<QAbstractItemView> > createdColumns;
|
||||
void ScrollContentsBy(int x, int y) {scrollContentsBy(x,y); }
|
||||
int HorizontalOffset() const { return horizontalOffset(); }
|
||||
void emitClicked() { emit clicked(QModelIndex()); }
|
||||
friend class tst_QColumnView;
|
||||
|
||||
enum PublicCursorAction {
|
||||
MoveUp = QAbstractItemView::MoveUp,
|
||||
MoveDown = QAbstractItemView::MoveDown,
|
||||
MoveLeft = QAbstractItemView::MoveLeft,
|
||||
MoveRight = QAbstractItemView::MoveRight,
|
||||
MoveHome = QAbstractItemView::MoveHome,
|
||||
MoveEnd = QAbstractItemView::MoveEnd,
|
||||
MovePageUp = QAbstractItemView::MovePageUp,
|
||||
MovePageDown = QAbstractItemView::MovePageDown,
|
||||
MoveNext = QAbstractItemView::MoveNext,
|
||||
MovePrevious = QAbstractItemView::MovePrevious
|
||||
};
|
||||
QVector<QPointer<QAbstractItemView>> createdColumns;
|
||||
|
||||
inline QModelIndex MoveCursor(PublicCursorAction ca, Qt::KeyboardModifiers kbm)
|
||||
{ return QColumnView::moveCursor((CursorAction)ca, kbm); }
|
||||
bool IsIndexHidden(const QModelIndex&index) const
|
||||
{ return isIndexHidden(index); }
|
||||
|
||||
void setSelection(const QRect & rect, QItemSelectionModel::SelectionFlags command )
|
||||
{
|
||||
QColumnView::setSelection(rect, command);
|
||||
}
|
||||
|
||||
// visualRegionForSelection() is protected in QColumnView.
|
||||
QRegion getVisualRegionForSelection(const QItemSelection &selection){
|
||||
return QColumnView::visualRegionForSelection(selection);
|
||||
}
|
||||
protected:
|
||||
QAbstractItemView *createColumn(const QModelIndex &index) {
|
||||
QAbstractItemView *createColumn(const QModelIndex &index) override
|
||||
{
|
||||
QAbstractItemView *view = QColumnView::createColumn(index);
|
||||
QPointer<QAbstractItemView> savedView = view;
|
||||
createdColumns.append(savedView);
|
||||
return view;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
tst_QColumnView::tst_QColumnView()
|
||||
|
|
@ -183,7 +160,7 @@ void tst_QColumnView::initTestCase()
|
|||
|
||||
void tst_QColumnView::init()
|
||||
{
|
||||
qApp->setLayoutDirection(Qt::LeftToRight);
|
||||
QGuiApplication::setLayoutDirection(Qt::LeftToRight);
|
||||
}
|
||||
|
||||
void tst_QColumnView::rootIndex()
|
||||
|
|
@ -199,7 +176,7 @@ void tst_QColumnView::rootIndex()
|
|||
QModelIndex drive = model.firstLevel();
|
||||
QVERIFY(view.visualRect(drive).isValid());
|
||||
view.setRootIndex(QModelIndex());
|
||||
QCOMPARE(view.HorizontalOffset(), 0);
|
||||
QCOMPARE(view.horizontalOffset(), 0);
|
||||
QCOMPARE(view.rootIndex(), QModelIndex());
|
||||
QVERIFY(view.visualRect(drive).isValid());
|
||||
|
||||
|
|
@ -210,7 +187,7 @@ void tst_QColumnView::rootIndex()
|
|||
while (i < model.rowCount(home) - 1 && !model.hasChildren(homeFile))
|
||||
homeFile = model.index(++i, 0, home);
|
||||
view.setRootIndex(home);
|
||||
QCOMPARE(view.HorizontalOffset(), 0);
|
||||
QCOMPARE(view.horizontalOffset(), 0);
|
||||
QCOMPARE(view.rootIndex(), home);
|
||||
QVERIFY(!view.visualRect(drive).isValid());
|
||||
QVERIFY(!view.visualRect(home).isValid());
|
||||
|
|
@ -221,7 +198,7 @@ void tst_QColumnView::rootIndex()
|
|||
view.setRootIndex(home);
|
||||
view.setCurrentIndex(homeFile);
|
||||
view.scrollTo(model.index(0,0, homeFile));
|
||||
QCOMPARE(view.HorizontalOffset(), 0);
|
||||
QCOMPARE(view.horizontalOffset(), 0);
|
||||
QCOMPARE(view.rootIndex(), home);
|
||||
QVERIFY(!view.visualRect(drive).isValid());
|
||||
QVERIFY(!view.visualRect(home).isValid());
|
||||
|
|
@ -238,17 +215,15 @@ void tst_QColumnView::rootIndex()
|
|||
QModelIndex two = model.index(0, 0, homeFile);
|
||||
while (i < model.rowCount(homeFile) - 1 && !model.hasChildren(two))
|
||||
two = model.index(++i, 0, homeFile);
|
||||
qApp->processEvents();
|
||||
QTest::qWait(ANIMATION_DELAY);
|
||||
view.setCurrentIndex(two);
|
||||
view.scrollTo(two);
|
||||
QTest::qWait(ANIMATION_DELAY);
|
||||
qApp->processEvents();
|
||||
QVERIFY(two.isValid());
|
||||
QVERIFY(view.HorizontalOffset() != 0);
|
||||
QVERIFY(view.horizontalOffset() != 0);
|
||||
|
||||
view.setRootIndex(homeFile);
|
||||
QCOMPARE(view.HorizontalOffset(), 0);
|
||||
QCOMPARE(view.horizontalOffset(), 0);
|
||||
}
|
||||
|
||||
void tst_QColumnView::grips()
|
||||
|
|
@ -262,9 +237,9 @@ void tst_QColumnView::grips()
|
|||
|
||||
{
|
||||
const QObjectList list = view.viewport()->children();
|
||||
for (int i = 0 ; i < list.count(); ++i) {
|
||||
if (QAbstractItemView *view = qobject_cast<QAbstractItemView*>(list.at(i)))
|
||||
QVERIFY(view->cornerWidget() != 0);
|
||||
for (QObject *obj : list) {
|
||||
if (QAbstractItemView *view = qobject_cast<QAbstractItemView*>(obj))
|
||||
QVERIFY(view->cornerWidget() != nullptr);
|
||||
}
|
||||
}
|
||||
view.setResizeGripsVisible(false);
|
||||
|
|
@ -272,8 +247,8 @@ void tst_QColumnView::grips()
|
|||
|
||||
{
|
||||
const QObjectList list = view.viewport()->children();
|
||||
for (int i = 0 ; i < list.count(); ++i) {
|
||||
if (QAbstractItemView *view = qobject_cast<QAbstractItemView*>(list.at(i))) {
|
||||
for (QObject *obj : list) {
|
||||
if (QAbstractItemView *view = qobject_cast<QAbstractItemView*>(obj)) {
|
||||
if (view->isVisible())
|
||||
QVERIFY(!view->cornerWidget());
|
||||
}
|
||||
|
|
@ -288,9 +263,9 @@ void tst_QColumnView::isIndexHidden()
|
|||
{
|
||||
ColumnView view;
|
||||
QModelIndex idx;
|
||||
QCOMPARE(view.IsIndexHidden(idx), false);
|
||||
QCOMPARE(view.isIndexHidden(idx), false);
|
||||
view.setModel(&m_fakeDirModel);
|
||||
QCOMPARE(view.IsIndexHidden(idx), false);
|
||||
QCOMPARE(view.isIndexHidden(idx), false);
|
||||
}
|
||||
|
||||
void tst_QColumnView::indexAt()
|
||||
|
|
@ -319,7 +294,6 @@ void tst_QColumnView::indexAt()
|
|||
|
||||
view.selectionModel()->select(child, QItemSelectionModel::SelectCurrent);
|
||||
view.setCurrentIndex(child);
|
||||
qApp->processEvents();
|
||||
QTest::qWait(200);
|
||||
|
||||
// test that the second row doesn't start at 0
|
||||
|
|
@ -348,17 +322,17 @@ void tst_QColumnView::scrollContentsBy()
|
|||
ColumnView view;
|
||||
if (reverse)
|
||||
view.setLayoutDirection(Qt::RightToLeft);
|
||||
view.ScrollContentsBy(-1, -1);
|
||||
view.ScrollContentsBy(0, 0);
|
||||
view.scrollContentsBy(-1, -1);
|
||||
view.scrollContentsBy(0, 0);
|
||||
|
||||
TreeModel model;
|
||||
view.setModel(&model);
|
||||
view.ScrollContentsBy(0, 0);
|
||||
view.scrollContentsBy(0, 0);
|
||||
|
||||
QModelIndex home = model.thirdLevel();
|
||||
view.setCurrentIndex(home);
|
||||
QTest::qWait(ANIMATION_DELAY);
|
||||
view.ScrollContentsBy(0, 0);
|
||||
view.scrollContentsBy(0, 0);
|
||||
}
|
||||
|
||||
void tst_QColumnView::scrollTo_data()
|
||||
|
|
@ -385,7 +359,7 @@ void tst_QColumnView::scrollTo()
|
|||
QVERIFY(QTest::qWaitForWindowActive(&topLevel));
|
||||
|
||||
view.scrollTo(QModelIndex(), QAbstractItemView::EnsureVisible);
|
||||
QCOMPARE(view.HorizontalOffset(), 0);
|
||||
QCOMPARE(view.horizontalOffset(), 0);
|
||||
|
||||
TreeModel model;
|
||||
view.setModel(&model);
|
||||
|
|
@ -400,45 +374,44 @@ void tst_QColumnView::scrollTo()
|
|||
|
||||
QModelIndex index = model.index(0, 0, home);
|
||||
view.scrollTo(index, QAbstractItemView::EnsureVisible);
|
||||
QCOMPARE(view.HorizontalOffset(), 0);
|
||||
QCOMPARE(view.horizontalOffset(), 0);
|
||||
|
||||
// Embedded requires that at least one widget have focus
|
||||
QWidget w;
|
||||
w.show();
|
||||
|
||||
QCOMPARE(view.HorizontalOffset(), 0);
|
||||
QCOMPARE(view.horizontalOffset(), 0);
|
||||
if (giveFocus)
|
||||
view.setFocus(Qt::OtherFocusReason);
|
||||
else
|
||||
view.clearFocus();
|
||||
|
||||
QCOMPARE(view.HorizontalOffset(), 0);
|
||||
qApp->processEvents();
|
||||
QCOMPARE(view.HorizontalOffset(), 0);
|
||||
QCOMPARE(view.horizontalOffset(), 0);
|
||||
QCoreApplication::processEvents();
|
||||
QCOMPARE(view.horizontalOffset(), 0);
|
||||
QTRY_COMPARE(view.hasFocus(), giveFocus);
|
||||
// scroll to the right
|
||||
int level = 0;
|
||||
int last = view.HorizontalOffset();
|
||||
while(model.hasChildren(index) && level < 5) {
|
||||
int last = view.horizontalOffset();
|
||||
while (model.hasChildren(index) && level < 5) {
|
||||
view.setCurrentIndex(index);
|
||||
QTest::qWait(ANIMATION_DELAY);
|
||||
view.scrollTo(index, QAbstractItemView::EnsureVisible);
|
||||
QTest::qWait(ANIMATION_DELAY);
|
||||
qApp->processEvents();
|
||||
index = model.index(0, 0, index);
|
||||
level++;
|
||||
if (level >= 2) {
|
||||
if (!reverse) {
|
||||
QTRY_VERIFY(view.HorizontalOffset() < 0);
|
||||
QTRY_VERIFY(view.horizontalOffset() < 0);
|
||||
qDebug() << "last=" << last
|
||||
<< " ; HorizontalOffset= " << view.HorizontalOffset();
|
||||
QTRY_VERIFY(last > view.HorizontalOffset());
|
||||
<< " ; horizontalOffset= " << view.horizontalOffset();
|
||||
QTRY_VERIFY(last > view.horizontalOffset());
|
||||
} else {
|
||||
QTRY_VERIFY(view.HorizontalOffset() > 0);
|
||||
QTRY_VERIFY(last < view.HorizontalOffset());
|
||||
QTRY_VERIFY(view.horizontalOffset() > 0);
|
||||
QTRY_VERIFY(last < view.horizontalOffset());
|
||||
}
|
||||
}
|
||||
last = view.HorizontalOffset();
|
||||
last = view.horizontalOffset();
|
||||
}
|
||||
|
||||
// scroll to the left
|
||||
|
|
@ -450,17 +423,17 @@ void tst_QColumnView::scrollTo()
|
|||
index = index.parent();
|
||||
if (start != level) {
|
||||
if (!reverse) {
|
||||
QTRY_VERIFY(last < view.HorizontalOffset());
|
||||
QTRY_VERIFY(last < view.horizontalOffset());
|
||||
} else {
|
||||
if (last <= view.HorizontalOffset()) {
|
||||
if (last <= view.horizontalOffset()) {
|
||||
qDebug() << "Test failure. last=" << last
|
||||
<< " ; HorizontalOffset= " << view.HorizontalOffset();
|
||||
<< " ; horizontalOffset= " << view.horizontalOffset();
|
||||
}
|
||||
QTRY_VERIFY(last > view.HorizontalOffset());
|
||||
QTRY_VERIFY(last > view.horizontalOffset());
|
||||
}
|
||||
}
|
||||
level--;
|
||||
last = view.HorizontalOffset();
|
||||
last = view.horizontalOffset();
|
||||
}
|
||||
// It shouldn't automatically steal focus if it doesn't have it
|
||||
QTRY_COMPARE(view.hasFocus(), giveFocus);
|
||||
|
|
@ -490,20 +463,20 @@ void tst_QColumnView::moveCursor()
|
|||
if (reverse)
|
||||
view.setLayoutDirection(Qt::RightToLeft);
|
||||
// don't crash
|
||||
view.MoveCursor(ColumnView::MoveUp, Qt::NoModifier);
|
||||
view.moveCursor(ColumnView::MoveUp, Qt::NoModifier);
|
||||
|
||||
// don't do anything
|
||||
QCOMPARE(view.MoveCursor(ColumnView::MoveEnd, Qt::NoModifier), QModelIndex());
|
||||
QCOMPARE(view.moveCursor(ColumnView::MoveEnd, Qt::NoModifier), QModelIndex());
|
||||
|
||||
view.setModel(&m_fakeDirModel);
|
||||
QModelIndex ci = view.currentIndex();
|
||||
QCOMPARE(view.MoveCursor(ColumnView::MoveUp, Qt::NoModifier), QModelIndex());
|
||||
QCOMPARE(view.MoveCursor(ColumnView::MoveDown, Qt::NoModifier), QModelIndex());
|
||||
QCOMPARE(view.moveCursor(ColumnView::MoveUp, Qt::NoModifier), QModelIndex());
|
||||
QCOMPARE(view.moveCursor(ColumnView::MoveDown, Qt::NoModifier), QModelIndex());
|
||||
|
||||
// left at root
|
||||
view.setCurrentIndex(m_fakeDirModel.index(0,0));
|
||||
ColumnView::PublicCursorAction action = reverse ? ColumnView::MoveRight : ColumnView::MoveLeft;
|
||||
QCOMPARE(view.MoveCursor(action, Qt::NoModifier), m_fakeDirModel.index(0,0));
|
||||
ColumnView::CursorAction action = reverse ? ColumnView::MoveRight : ColumnView::MoveLeft;
|
||||
QCOMPARE(view.moveCursor(action, Qt::NoModifier), m_fakeDirModel.index(0,0));
|
||||
|
||||
// left shouldn't move up
|
||||
int i = 0;
|
||||
|
|
@ -513,30 +486,29 @@ void tst_QColumnView::moveCursor()
|
|||
QVERIFY(m_fakeDirModel.hasChildren(ci));
|
||||
view.setCurrentIndex(ci);
|
||||
action = reverse ? ColumnView::MoveRight : ColumnView::MoveLeft;
|
||||
QCOMPARE(view.MoveCursor(action, Qt::NoModifier), ci);
|
||||
QCOMPARE(view.moveCursor(action, Qt::NoModifier), ci);
|
||||
|
||||
// now move to the left (i.e. move over one column)
|
||||
view.setCurrentIndex(m_fakeDirHomeIndex);
|
||||
QCOMPARE(view.MoveCursor(action, Qt::NoModifier), m_fakeDirHomeIndex.parent());
|
||||
QCOMPARE(view.moveCursor(action, Qt::NoModifier), m_fakeDirHomeIndex.parent());
|
||||
|
||||
// right
|
||||
action = reverse ? ColumnView::MoveLeft : ColumnView::MoveRight;
|
||||
view.setCurrentIndex(ci);
|
||||
QModelIndex mc = view.MoveCursor(action, Qt::NoModifier);
|
||||
QModelIndex mc = view.moveCursor(action, Qt::NoModifier);
|
||||
QCOMPARE(mc, m_fakeDirModel.index(0,0, ci));
|
||||
|
||||
// for empty directories (no way to go 'right'), next one should move down
|
||||
QModelIndex idx = m_fakeDirModel.index(0, 0, ci);
|
||||
const int rowCount = m_fakeDirModel.rowCount(ci);
|
||||
while (m_fakeDirModel.hasChildren(idx) && rowCount > idx.row() + 1) {
|
||||
while (m_fakeDirModel.hasChildren(idx) && rowCount > idx.row() + 1)
|
||||
idx = idx.sibling(idx.row() + 1, idx.column());
|
||||
}
|
||||
static const char error[] = "This test requires an empty directory followed by another directory.";
|
||||
QVERIFY2(idx.isValid(), error);
|
||||
QVERIFY2(!m_fakeDirModel.hasChildren(idx), error);
|
||||
QVERIFY2(idx.row() + 1 < rowCount, error);
|
||||
view.setCurrentIndex(idx);
|
||||
mc = view.MoveCursor(action, Qt::NoModifier);
|
||||
mc = view.moveCursor(action, Qt::NoModifier);
|
||||
QCOMPARE(mc, idx.sibling(idx.row() + 1, idx.column()));
|
||||
}
|
||||
|
||||
|
|
@ -554,11 +526,12 @@ void tst_QColumnView::selectAll()
|
|||
QVERIFY(view.selectionModel()->selectedIndexes().count() > 0);
|
||||
|
||||
QModelIndex file;
|
||||
for (int i = 0; i < m_fakeDirModel.rowCount(m_fakeDirHomeIndex); ++i)
|
||||
for (int i = 0; i < m_fakeDirModel.rowCount(m_fakeDirHomeIndex); ++i) {
|
||||
if (!m_fakeDirModel.hasChildren(m_fakeDirModel.index(i, 0, m_fakeDirHomeIndex))) {
|
||||
file = m_fakeDirModel.index(i, 0, m_fakeDirHomeIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
view.setCurrentIndex(file);
|
||||
view.selectAll();
|
||||
QVERIFY(view.selectionModel()->selectedIndexes().count() > 0);
|
||||
|
|
@ -572,7 +545,7 @@ void tst_QColumnView::clicked()
|
|||
ColumnView view;
|
||||
|
||||
view.setModel(&m_fakeDirModel);
|
||||
view.resize(800,300);
|
||||
view.resize(800, 300);
|
||||
view.show();
|
||||
|
||||
view.setCurrentIndex(m_fakeDirHomeIndex);
|
||||
|
|
@ -581,12 +554,12 @@ void tst_QColumnView::clicked()
|
|||
QModelIndex parent = m_fakeDirHomeIndex.parent();
|
||||
QVERIFY(parent.isValid());
|
||||
|
||||
QSignalSpy clickedSpy(&view, SIGNAL(clicked(QModelIndex)));
|
||||
QSignalSpy clickedSpy(&view, &QAbstractItemView::clicked);
|
||||
|
||||
QPoint localPoint = view.visualRect(m_fakeDirHomeIndex).center();
|
||||
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, localPoint);
|
||||
QTest::mouseClick(view.viewport(), Qt::LeftButton, {}, localPoint);
|
||||
QCOMPARE(clickedSpy.count(), 1);
|
||||
qApp->processEvents();
|
||||
QCoreApplication::processEvents();
|
||||
|
||||
if (sizeof(qreal) != sizeof(double))
|
||||
QSKIP("Skipped due to rounding errors");
|
||||
|
|
@ -653,21 +626,21 @@ void tst_QColumnView::visualRegionForSelection()
|
|||
{
|
||||
ColumnView view;
|
||||
QItemSelection emptyItemSelection;
|
||||
QCOMPARE(QRegion(), view.getVisualRegionForSelection(emptyItemSelection));
|
||||
QCOMPARE(QRegion(), view.visualRegionForSelection(emptyItemSelection));
|
||||
|
||||
// a region that isn't empty
|
||||
view.setModel(&m_fakeDirModel);
|
||||
|
||||
|
||||
QItemSelection itemSelection(m_fakeDirModel.index(0, 0, m_fakeDirHomeIndex), m_fakeDirModel.index(m_fakeDirModel.rowCount(m_fakeDirHomeIndex) - 1, 0, m_fakeDirHomeIndex));
|
||||
QVERIFY(QRegion() != view.getVisualRegionForSelection(itemSelection));
|
||||
QVERIFY(QRegion() != view.visualRegionForSelection(itemSelection));
|
||||
}
|
||||
|
||||
void tst_QColumnView::moveGrip_basic()
|
||||
{
|
||||
QColumnView view;
|
||||
QColumnViewGrip *grip = new QColumnViewGrip(&view);
|
||||
QSignalSpy spy(grip, SIGNAL(gripMoved(int)));
|
||||
QSignalSpy spy(grip, &QColumnViewGrip::gripMoved);
|
||||
view.setCornerWidget(grip);
|
||||
int oldX = view.width();
|
||||
grip->moveGrip(10);
|
||||
|
|
@ -707,12 +680,11 @@ void tst_QColumnView::moveGrip()
|
|||
|
||||
int columnNum = view.createdColumns.count() - 2;
|
||||
QVERIFY(columnNum >= 0);
|
||||
QObjectList list = view.createdColumns[columnNum]->children();
|
||||
QColumnViewGrip *grip = 0;
|
||||
for (int i = 0; i < list.count(); ++i) {
|
||||
if ((grip = qobject_cast<QColumnViewGrip *>(list[i]))) {
|
||||
const QObjectList list = view.createdColumns[columnNum]->children();
|
||||
QColumnViewGrip *grip = nullptr;
|
||||
for (QObject *obj : list) {
|
||||
if ((grip = qobject_cast<QColumnViewGrip *>(obj)))
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!grip)
|
||||
return;
|
||||
|
|
@ -728,7 +700,7 @@ void tst_QColumnView::doubleClick()
|
|||
{
|
||||
QColumnView view;
|
||||
QColumnViewGrip *grip = new QColumnViewGrip(&view);
|
||||
QSignalSpy spy(grip, SIGNAL(gripMoved(int)));
|
||||
QSignalSpy spy(grip, &QColumnViewGrip::gripMoved);
|
||||
view.setCornerWidget(grip);
|
||||
view.resize(200, 200);
|
||||
QCOMPARE(view.width(), 200);
|
||||
|
|
@ -741,24 +713,24 @@ void tst_QColumnView::gripMoved()
|
|||
{
|
||||
QColumnView view;
|
||||
QColumnViewGrip *grip = new QColumnViewGrip(&view);
|
||||
QSignalSpy spy(grip, SIGNAL(gripMoved(int)));
|
||||
QSignalSpy spy(grip, &QColumnViewGrip::gripMoved);
|
||||
view.setCornerWidget(grip);
|
||||
view.move(300, 300);
|
||||
view.resize(200, 200);
|
||||
qApp->processEvents();
|
||||
QCoreApplication::processEvents();
|
||||
|
||||
int oldWidth = view.width();
|
||||
|
||||
QTest::mousePress(grip, Qt::LeftButton, 0, QPoint(1,1));
|
||||
QTest::mousePress(grip, Qt::LeftButton, {}, QPoint(1, 1));
|
||||
//QTest::mouseMove(grip, QPoint(grip->globalX()+50, y));
|
||||
|
||||
QPoint posNew = QPoint(grip->mapToGlobal(QPoint(1,1)).x() + 65, 0);
|
||||
QPoint posNew = QPoint(grip->mapToGlobal(QPoint(1, 1)).x() + 65, 0);
|
||||
QMouseEvent *event = new QMouseEvent(QEvent::MouseMove, posNew, posNew, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
|
||||
QCoreApplication::postEvent(grip, event);
|
||||
QCoreApplication::processEvents();
|
||||
QTest::mouseRelease(grip, Qt::LeftButton);
|
||||
|
||||
QCOMPARE(spy.count(), 1);
|
||||
QTRY_COMPARE(spy.count(), 1);
|
||||
QCOMPARE(view.width(), oldWidth + 65);
|
||||
}
|
||||
|
||||
|
|
@ -785,12 +757,12 @@ void tst_QColumnView::preview()
|
|||
}
|
||||
QVERIFY(file.isValid());
|
||||
view.setCurrentIndex(file);
|
||||
QVERIFY(view.previewWidget() != (QWidget*)0);
|
||||
QVERIFY(view.previewWidget() != nullptr);
|
||||
|
||||
QWidget *previewWidget = new QWidget(&view);
|
||||
view.setPreviewWidget(previewWidget);
|
||||
QCOMPARE(view.previewWidget(), previewWidget);
|
||||
QVERIFY(previewWidget->parent() != ((QWidget*)&view));
|
||||
QVERIFY(previewWidget->parent() != &view);
|
||||
view.setCurrentIndex(home);
|
||||
|
||||
// previewWidget should be marked for deletion
|
||||
|
|
@ -803,21 +775,21 @@ void tst_QColumnView::swapPreview()
|
|||
{
|
||||
// swap the preview widget in updatePreviewWidget
|
||||
QColumnView view;
|
||||
QStringList sl;
|
||||
sl << QLatin1String("test");
|
||||
QStringListModel model(sl);
|
||||
QStringListModel model({ QLatin1String("test") });
|
||||
view.setModel(&model);
|
||||
view.setCurrentIndex(view.indexAt(QPoint(1, 1)));
|
||||
connect(&view, SIGNAL(updatePreviewWidget(QModelIndex)),
|
||||
this, SLOT(setPreviewWidget()));
|
||||
connect(&view, &QColumnView::updatePreviewWidget,
|
||||
this, &tst_QColumnView::setPreviewWidget);
|
||||
view.setCurrentIndex(view.indexAt(QPoint(1, 1)));
|
||||
QTest::qWait(ANIMATION_DELAY);
|
||||
qApp->processEvents();
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
|
||||
void tst_QColumnView::setPreviewWidget()
|
||||
{
|
||||
((QColumnView*)sender())->setPreviewWidget(new QWidget);
|
||||
auto ptr = qobject_cast<QColumnView *>(sender());
|
||||
QVERIFY(ptr);
|
||||
ptr->setPreviewWidget(new QWidget);
|
||||
}
|
||||
|
||||
void tst_QColumnView::sizes()
|
||||
|
|
@ -825,8 +797,7 @@ void tst_QColumnView::sizes()
|
|||
QColumnView view;
|
||||
QCOMPARE(view.columnWidths().count(), 0);
|
||||
|
||||
QList<int> newSizes;
|
||||
newSizes << 10 << 4 << 50 << 6;
|
||||
const QList<int> newSizes{ 10, 4, 50, 6 };
|
||||
|
||||
QList<int> visibleSizes;
|
||||
view.setColumnWidths(newSizes);
|
||||
|
|
@ -839,8 +810,7 @@ void tst_QColumnView::sizes()
|
|||
QCOMPARE(postSizes, newSizes.mid(0, postSizes.count()));
|
||||
|
||||
QVERIFY(view.columnWidths().count() > 1);
|
||||
QList<int> smallerSizes;
|
||||
smallerSizes << 6;
|
||||
QList<int> smallerSizes{ 6 };
|
||||
view.setColumnWidths(smallerSizes);
|
||||
QList<int> expectedSizes = newSizes;
|
||||
expectedSizes[0] = 6;
|
||||
|
|
@ -851,13 +821,13 @@ void tst_QColumnView::sizes()
|
|||
void tst_QColumnView::rowDelegate()
|
||||
{
|
||||
ColumnView view;
|
||||
QItemDelegate *d = new QItemDelegate;
|
||||
QStyledItemDelegate *d = new QStyledItemDelegate;
|
||||
view.setItemDelegateForRow(3, d);
|
||||
|
||||
view.setModel(&m_fakeDirModel);
|
||||
for (int i = 0; i < view.createdColumns.count(); ++i) {
|
||||
QAbstractItemView *column = view.createdColumns.at(i);
|
||||
QCOMPARE(column->itemDelegateForRow(3), (QAbstractItemDelegate*)d);
|
||||
QCOMPARE(column->itemDelegateForRow(3), d);
|
||||
}
|
||||
delete d;
|
||||
}
|
||||
|
|
@ -900,7 +870,7 @@ void tst_QColumnView::changeSameColumn()
|
|||
}
|
||||
QVERIFY(second.isValid());
|
||||
|
||||
QList<QPointer<QAbstractItemView> > old = view.createdColumns;
|
||||
const auto old = view.createdColumns;
|
||||
view.setCurrentIndex(second);
|
||||
|
||||
QCOMPARE(old, view.createdColumns);
|
||||
|
|
@ -973,7 +943,7 @@ void tst_QColumnView::pullRug()
|
|||
QModelIndex home = model.thirdLevel();
|
||||
view.setCurrentIndex(home);
|
||||
if (removeModel)
|
||||
view.setModel(0);
|
||||
view.setModel(nullptr);
|
||||
else
|
||||
view.setCurrentIndex(QModelIndex());
|
||||
QTest::qWait(ANIMATION_DELAY);
|
||||
|
|
@ -982,19 +952,19 @@ void tst_QColumnView::pullRug()
|
|||
|
||||
void tst_QColumnView::dynamicModelChanges()
|
||||
{
|
||||
struct MyItemDelegate : public QItemDelegate
|
||||
struct MyItemDelegate : public QStyledItemDelegate
|
||||
{
|
||||
void paint(QPainter *painter,
|
||||
const QStyleOptionViewItem &option,
|
||||
const QModelIndex &index) const
|
||||
const QModelIndex &index) const override
|
||||
{
|
||||
paintedIndexes += index;
|
||||
QItemDelegate::paint(painter, option, index);
|
||||
QStyledItemDelegate::paint(painter, option, index);
|
||||
}
|
||||
|
||||
mutable QSet<QModelIndex> paintedIndexes;
|
||||
|
||||
} delegate;;
|
||||
} delegate;
|
||||
QStandardItemModel model;
|
||||
ColumnView view;
|
||||
view.setModel(&model);
|
||||
|
|
@ -1008,8 +978,6 @@ void tst_QColumnView::dynamicModelChanges()
|
|||
QVERIFY(QTest::qWaitForWindowExposed(&view)); //let the time for painting to occur
|
||||
QTRY_COMPARE(delegate.paintedIndexes.count(), 1);
|
||||
QCOMPARE(*delegate.paintedIndexes.begin(), model.index(0,0));
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2019 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <QTextDocument>
|
||||
|
||||
extern "C" int LLVMFuzzerTestOneInput(const char *Data, size_t Size) {
|
||||
QTextDocument().setMarkdown(QByteArray(Data, Size));
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
CONFIG += console
|
||||
CONFIG -= app_bundle
|
||||
SOURCES += main.cpp
|
||||
LIBS += -fsanitize=fuzzer
|
||||
Loading…
Reference in New Issue