aboutsummaryrefslogtreecommitdiffstats
path: root/tools/svgtoqml/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/svgtoqml/main.cpp')
-rw-r--r--tools/svgtoqml/main.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/tools/svgtoqml/main.cpp b/tools/svgtoqml/main.cpp
new file mode 100644
index 0000000000..64474030dc
--- /dev/null
+++ b/tools/svgtoqml/main.cpp
@@ -0,0 +1,141 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include <QGuiApplication>
+#include <QQmlApplicationEngine>
+#include <QCommandLineParser>
+#include <QFile>
+#include <QQuickWindow>
+#include <QQuickItem>
+#include <QtQuickVectorImageGenerator/private/qquickitemgenerator_p.h>
+#include <QtQuickVectorImageGenerator/private/qquickqmlgenerator_p.h>
+#include <QtQuickVectorImageGenerator/private/qquickvectorimageglobal_p.h>
+
+#define ENABLE_GUI
+
+int main(int argc, char *argv[])
+{
+#ifdef ENABLE_GUI
+ QGuiApplication app(argc, argv);
+#else
+ QCoreApplication app(argc, argv);
+#endif
+
+ QCommandLineParser parser;
+ parser.setApplicationDescription("SVG to QML converter [tech preview]");
+ parser.addHelpOption();
+ parser.addPositionalArgument("input", QCoreApplication::translate("main", "SVG file to read."));
+ parser.addPositionalArgument("output", QCoreApplication::translate("main", "QML file to write."));
+
+ QCommandLineOption optimizeOption("optimize-paths",
+ QCoreApplication::translate("main", "Optimize paths for the curve renderer."));
+ parser.addOption(optimizeOption);
+
+ QCommandLineOption curveRendererOption("curve-renderer",
+ QCoreApplication::translate("main", "Use the curve renderer in generated QML."));
+ parser.addOption(curveRendererOption);
+
+ QCommandLineOption typeNameOption(QStringList() << "t" << "type-name",
+ QCoreApplication::translate("main", "Use <typename> for Shape."),
+ QCoreApplication::translate("main", "typename"));
+ parser.addOption(typeNameOption);
+
+ QCommandLineOption copyrightOption("copyright-statement",
+ QCoreApplication::translate("main", "Add <string> as a comment at the start of the generated file."),
+ QCoreApplication::translate("main", "string"));
+ parser.addOption(copyrightOption);
+
+ QCommandLineOption outlineModeOption("outline-stroke-mode",
+ QCoreApplication::translate("main", "Stroke the outline (contour) of the filled shape instead of "
+ "the original path. Also sets optimize-paths."));
+ parser.addOption(outlineModeOption);
+
+ QCommandLineOption keepPathsOption("keep-external-paths",
+ QCoreApplication::translate("main", "Any paths to external files will be retained in the QML output. "
+ "The paths will be reformatted as relative to the output file. If "
+ "this is not enabled, copies of the file will be saved to the asset output "
+ "directory. Embedded data will still be saved to files, even if "
+ "this option is set."));
+ parser.addOption(keepPathsOption);
+
+ QCommandLineOption assetOutputDirectoryOption("asset-output-directory",
+ QCoreApplication::translate("main", "If the SVG refers to external or embedded files, such as images, these "
+ "will be copied into the same directory as the output QML file by default. "
+ "Set the asset output directory to override the location."),
+ QCoreApplication::translate("main", "directory"));
+ parser.addOption(assetOutputDirectoryOption);
+
+ QCommandLineOption assetOutputPrefixOption("asset-output-prefix",
+ QCoreApplication::translate("main", "If the SVG refers to external or embedded files, such as images, these "
+ "will be copied to files with unique identifiers. By default, the files will be prefixed "
+ "with \"svg_asset_\". Set the asset output prefix to override the prefix."),
+ QCoreApplication::translate("main", "prefix"));
+ parser.addOption(assetOutputPrefixOption);
+
+#ifdef ENABLE_GUI
+ QCommandLineOption guiOption(QStringList() << "v" << "view",
+ QCoreApplication::translate("main", "Display the SVG in a window."));
+ parser.addOption(guiOption);
+#endif
+ parser.process(app);
+ const QStringList args = parser.positionalArguments();
+ if (args.size() < 1) {
+ parser.showHelp(1);
+ }
+
+ const QString inFileName = args.at(0);
+
+ QString commentString = QLatin1String("Generated from SVG file %1").arg(inFileName);
+
+ const auto outFileName = args.size() > 1 ? args.at(1) : QString{};
+ const auto typeName = parser.value(typeNameOption);
+ const auto assetOutputDirectory = parser.value(assetOutputDirectoryOption);
+ const auto assetOutputPrefix = parser.value(assetOutputPrefixOption);
+ const bool keepPaths = parser.isSet(keepPathsOption);
+ auto copyrightString = parser.value(copyrightOption);
+
+ if (!copyrightString.isEmpty()) {
+ copyrightString = copyrightString.replace("\\n", "\n");
+ commentString = copyrightString + u"\n" + commentString;
+ }
+
+ QQuickVectorImageGenerator::GeneratorFlags flags;
+ if (parser.isSet(curveRendererOption))
+ flags |= QQuickVectorImageGenerator::GeneratorFlag::CurveRenderer;
+ if (parser.isSet(optimizeOption))
+ flags |= QQuickVectorImageGenerator::GeneratorFlag::OptimizePaths;
+ if (parser.isSet(outlineModeOption))
+ flags |= (QQuickVectorImageGenerator::GeneratorFlag::OutlineStrokeMode
+ | QQuickVectorImageGenerator::GeneratorFlag::OptimizePaths);
+
+ QQuickQmlGenerator generator(inFileName, flags, outFileName);
+ generator.setShapeTypeName(typeName);
+ generator.setCommentString(commentString);
+ generator.setAssetFileDirectory(assetOutputDirectory);
+ generator.setAssetFilePrefix(assetOutputPrefix);
+ generator.setRetainFilePaths(keepPaths);
+ generator.generate();
+
+#ifdef ENABLE_GUI
+ if (parser.isSet(guiOption)) {
+ app.setOrganizationName("QtProject");
+ const QUrl url(QStringLiteral("qrc:/main.qml"));
+ QQmlApplicationEngine engine;
+ QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
+ &app, [&](QObject *obj, const QUrl &objUrl){
+ if (!obj && url == objUrl)
+ QCoreApplication::exit(-1);
+ if (obj) {
+ auto *containerItem = obj->findChild<QQuickItem*>(QStringLiteral("svg_item"));
+ QQuickItemGenerator generator(inFileName, flags, containerItem);
+ generator.generate();
+ }
+ });
+ engine.load(url);
+ return app.exec();
+ }
+#else
+ return 0;
+#endif
+
+}