diff options
Diffstat (limited to 'tools/qmlscene/main.cpp')
-rw-r--r-- | tools/qmlscene/main.cpp | 117 |
1 files changed, 74 insertions, 43 deletions
diff --git a/tools/qmlscene/main.cpp b/tools/qmlscene/main.cpp index fe01b92244..fc4fc3e167 100644 --- a/tools/qmlscene/main.cpp +++ b/tools/qmlscene/main.cpp @@ -156,7 +156,7 @@ struct Options applicationAttributes.append(Qt::AA_ShareOpenGLContexts); } - QUrl file; + QUrl url; bool originalQml; bool originalQmlRaster; bool maximized; @@ -204,7 +204,7 @@ static int displayOptionsDialog(Options *options) QFileInfoList fileInfos = findQmlFiles(":/bundle") + findQmlFiles("./qmlscene-resources"); foreach (QFileInfo fileInfo, fileInfos) - qmlFileComboBox->addItem(fileInfo.dir().dirName() + "/" + fileInfo.fileName(), QVariant::fromValue(fileInfo)); + qmlFileComboBox->addItem(fileInfo.dir().dirName() + QLatin1Char('/') + fileInfo.fileName(), QVariant::fromValue(fileInfo)); QCheckBox *originalCheckBox = new QCheckBox(&dialog); originalCheckBox->setText("Use original QML viewer"); @@ -235,7 +235,7 @@ static int displayOptionsDialog(Options *options) QVariant variant = qmlFileComboBox->itemData(qmlFileComboBox->currentIndex()); QFileInfo fileInfo = variant.value<QFileInfo>(); - if (fileInfo.canonicalFilePath().startsWith(":")) + if (fileInfo.canonicalFilePath().startsWith(QLatin1Char(':'))) options->file = QUrl("qrc" + fileInfo.canonicalFilePath()); else options->file = QUrl::fromLocalFile(fileInfo.canonicalFilePath()); @@ -252,12 +252,10 @@ static bool checkVersion(const QUrl &url) if (!qgetenv("QMLSCENE_IMPORT_NAME").isEmpty()) fprintf(stderr, "QMLSCENE_IMPORT_NAME is no longer supported.\n"); - QString fileName = url.toLocalFile(); - if (fileName.isEmpty()) { - fprintf(stderr, "qmlscene: filename required.\n"); - return false; - } + if (!url.isLocalFile()) + return true; + const QString fileName = url.toLocalFile(); QFile f(fileName); if (!f.open(QFile::ReadOnly | QFile::Text)) { fprintf(stderr, "qmlscene: failed to check version of file '%s', could not open...\n", @@ -272,7 +270,7 @@ static bool checkVersion(const QUrl &url) bool codeFound= false; while (!codeFound) { QString line = stream.readLine(); - if (line.contains("{")) { + if (line.contains(QLatin1Char('{'))) { codeFound = true; } else { QString import; @@ -300,7 +298,7 @@ static void displayFileDialog(Options *options) QString fileName = QFileDialog::getOpenFileName(0, "Open QML file", QString(), "QML Files (*.qml)"); if (!fileName.isEmpty()) { QFileInfo fi(fileName); - options->file = QUrl::fromLocalFile(fi.canonicalFilePath()); + options->url = QUrl::fromLocalFile(fi.canonicalFilePath()); } #else Q_UNUSED(options); @@ -358,6 +356,8 @@ static void usage() puts(" --desktop..........................Force use of desktop GL (AA_UseDesktopOpenGL)"); puts(" --gles.............................Force use of GLES (AA_UseOpenGLES)"); puts(" --software.........................Force use of software rendering (AA_UseOpenGLES)"); + puts(" --scaling..........................Enable High DPI scaling (AA_EnableHighDpiScaling)"); + puts(" --no-scaling.......................Disable High DPI scaling (AA_DisableHighDpiScaling)"); puts(" --verbose..........................Print version and graphical diagnostics for the run-time"); puts(" -I <path> ........................ Add <path> to the list of import paths"); puts(" -P <path> ........................ Add <path> to the list of plugin paths"); @@ -416,17 +416,65 @@ static void setWindowTitle(bool verbose, const QObject *topLevel, QWindow *windo window->setTitle(newTitle); } +static QUrl parseUrlArgument(const QString &arg) +{ + const QUrl url = QUrl::fromUserInput(arg, QDir::currentPath(), QUrl::AssumeLocalFile); + if (!url.isValid()) { + fprintf(stderr, "Invalid URL: \"%s\"\n", qPrintable(arg)); + return QUrl(); + } + if (url.isLocalFile()) { + const QFileInfo fi(url.toLocalFile()); + if (!fi.exists()) { + fprintf(stderr, "\"%s\" does not exist.\n", + qPrintable(QDir::toNativeSeparators(fi.absoluteFilePath()))); + return QUrl(); + } + } + return url; +} + int main(int argc, char ** argv) { Options options; QStringList imports; QStringList pluginPaths; + + // Parse arguments for application attributes to be applied before Q[Gui]Application creation. for (int i = 1; i < argc; ++i) { - if (*argv[i] != '-' && QFileInfo(QFile::decodeName(argv[i])).exists()) { - options.file = QUrl::fromLocalFile(argv[i]); + const char *arg = argv[i]; + if (!qstrcmp(arg, "--disable-context-sharing")) + options.applicationAttributes.removeAll(Qt::AA_ShareOpenGLContexts); + else if (!qstrcmp(arg, "--gles")) + options.applicationAttributes.append(Qt::AA_UseOpenGLES); + else if (!qstrcmp(arg, "--software")) + options.applicationAttributes.append(Qt::AA_UseSoftwareOpenGL); + else if (!qstrcmp(arg, "--desktop")) + options.applicationAttributes.append(Qt::AA_UseDesktopOpenGL); + else if (!qstrcmp(arg, "--scaling")) + options.applicationAttributes.append(Qt::AA_EnableHighDpiScaling); + else if (!qstrcmp(arg, "--no-scaling")) + options.applicationAttributes.append(Qt::AA_DisableHighDpiScaling); + } + + foreach (Qt::ApplicationAttribute a, options.applicationAttributes) + QCoreApplication::setAttribute(a); +#ifdef QT_WIDGETS_LIB + QApplication app(argc, argv); +#else + QGuiApplication app(argc, argv); +#endif + app.setApplicationName("QtQmlViewer"); + app.setOrganizationName("QtProject"); + app.setOrganizationDomain("qt-project.org"); + + const QStringList arguments = QCoreApplication::arguments(); + for (int i = 1, size = arguments.size(); i < size; ++i) { + if (!arguments.at(i).startsWith(QLatin1Char('-'))) { + options.url = parseUrlArgument(arguments.at(i)); } else { - const QString lowerArgument = QString::fromLatin1(argv[i]).toLower(); + const QString lowerArgument = arguments.at(i).toLower(); if (lowerArgument == QLatin1String("--maximized")) options.maximized = true; else if (lowerArgument == QLatin1String("--fullscreen")) @@ -447,20 +495,12 @@ int main(int argc, char ** argv) options.resizeViewToRootItem = true; else if (lowerArgument == QLatin1String("--multisample")) options.multisample = true; - else if (lowerArgument == QLatin1String("--disable-context-sharing")) - options.applicationAttributes.removeAll(Qt::AA_ShareOpenGLContexts); - else if (lowerArgument == QLatin1String("--gles")) - options.applicationAttributes.append(Qt::AA_UseOpenGLES); - else if (lowerArgument == QLatin1String("--software")) - options.applicationAttributes.append(Qt::AA_UseSoftwareOpenGL); - else if (lowerArgument == QLatin1String("--desktop")) - options.applicationAttributes.append(Qt::AA_UseDesktopOpenGL); else if (lowerArgument == QLatin1String("--verbose")) options.verbose = true; - else if (lowerArgument == QLatin1String("-i") && i + 1 < argc) - imports.append(QString::fromLatin1(argv[++i])); - else if (lowerArgument == QLatin1String("-p") && i + 1 < argc) - pluginPaths.append(QString::fromLatin1(argv[++i])); + else if (lowerArgument == QLatin1String("-i") && i + 1 < size) + imports.append(arguments.at(++i)); + else if (lowerArgument == QLatin1String("-p") && i + 1 < size) + pluginPaths.append(arguments.at(++i)); else if (lowerArgument == QLatin1String("--help") || lowerArgument == QLatin1String("-help") || lowerArgument == QLatin1String("--h") @@ -469,17 +509,6 @@ int main(int argc, char ** argv) } } - foreach (Qt::ApplicationAttribute a, options.applicationAttributes) - QCoreApplication::setAttribute(a); -#ifdef QT_WIDGETS_LIB - QApplication app(argc, argv); -#else - QGuiApplication app(argc, argv); -#endif - app.setApplicationName("QtQmlViewer"); - app.setOrganizationName("QtProject"); - app.setOrganizationDomain("qt-project.org"); - #ifndef QT_NO_TRANSLATION QTranslator translator; QTranslator qtTranslator; @@ -502,7 +531,7 @@ int main(int argc, char ** argv) QUnifiedTimer::instance()->setSlowModeEnabled(options.slowAnimations); - if (options.file.isEmpty()) + if (options.url.isEmpty()) #if defined(QMLSCENE_BUNDLE) displayOptionsDialog(&options); #else @@ -514,8 +543,8 @@ int main(int argc, char ** argv) if (options.verbose) puts(QLibraryInfo::build()); - if (!options.file.isEmpty()) { - if (!options.versionDetection || checkVersion(options.file)) { + if (!options.url.isEmpty()) { + if (!options.versionDetection || checkVersion(options.url)) { #ifndef QT_NO_TRANSLATION QTranslator translator; #endif @@ -528,15 +557,17 @@ int main(int argc, char ** argv) engine.addImportPath(imports.at(i)); for (int i = 0; i < pluginPaths.size(); ++i) engine.addPluginPath(pluginPaths.at(i)); - if (options.file.isLocalFile()) { - QFileInfo fi(options.file.toLocalFile()); + if (options.url.isLocalFile()) { + QFileInfo fi(options.url.toLocalFile()); #ifndef QT_NO_TRANSLATION loadTranslationFile(translator, fi.path()); #endif loadDummyDataFiles(engine, fi.path()); } QObject::connect(&engine, SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit())); - component->loadUrl(options.file); + component->loadUrl(options.url); + while (component->isLoading()) + QCoreApplication::processEvents(); if ( !component->isReady() ) { fprintf(stderr, "%s\n", qPrintable(component->errorString())); return -1; @@ -560,7 +591,7 @@ int main(int argc, char ** argv) qxView->setResizeMode(QQuickView::SizeViewToRootObject); else qxView->setResizeMode(QQuickView::SizeRootObjectToView); - qxView->setContent(options.file, component, contentItem); + qxView->setContent(options.url, component, contentItem); } } |