From ca82019cf0febe6f58d7aab53e2e99a56d69004d Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 25 Mar 2020 16:29:04 +0100 Subject: [PATCH 01/27] AutoTest: Fix flakyness of plugin test Relying on the order of tests of the underlying tree model is bad as we order the model for the user with a QSortFilterProxyModel. Using non-unique keys is not wise either. Ensure the keys are unique to have reliable results. Change-Id: I556371d018c16e7b03a8ec85d60afc850056a94a Reviewed-by: David Schulz --- src/plugins/autotest/autotestunittests.cpp | 29 +++++++++++++++------- src/plugins/autotest/testtreemodel.cpp | 6 ++--- src/plugins/autotest/testtreemodel.h | 2 +- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/plugins/autotest/autotestunittests.cpp b/src/plugins/autotest/autotestunittests.cpp index 4897e98efae..767aee6a137 100644 --- a/src/plugins/autotest/autotestunittests.cpp +++ b/src/plugins/autotest/autotestunittests.cpp @@ -246,6 +246,7 @@ void AutoTestUnitTests::testCodeParserBoostTest() QSKIP("This test needs boost - set BOOST_INCLUDE_DIR (or have it installed)"); QFETCH(QString, projectFilePath); + QFETCH(QString, extension); CppTools::Tests::ProjectOpenerAndCloser projectManager; CppTools::ProjectInfo projectInfo = projectManager.open(projectFilePath, true); QVERIFY(projectInfo.isValid()); @@ -257,14 +258,23 @@ void AutoTestUnitTests::testCodeParserBoostTest() QCOMPARE(m_model->boostTestNamesCount(), 5); - QMultiMap expectedSuitesAndTests; - expectedSuitesAndTests.insert(QStringLiteral("Master Test Suite"), 2); // decorators w/o suite - expectedSuitesAndTests.insert(QStringLiteral("Master Test Suite"), 2); // fixtures - expectedSuitesAndTests.insert(QStringLiteral("Master Test Suite"), 3); // functions - expectedSuitesAndTests.insert(QStringLiteral("Suite1"), 4); - expectedSuitesAndTests.insert(QStringLiteral("SuiteOuter"), 5); // 2 sub suites + 3 tests + QString basePath; + if (auto project = projectInfo.project()) + basePath = project->projectFilePath().toFileInfo().absolutePath(); + QVERIFY(!basePath.isEmpty()); - QMultiMap foundNamesAndSets = m_model->boostTestSuitesAndTests(); + QMap expectedSuitesAndTests; + + auto pathConstructor = [basePath, extension](const QString &name, const QString &subPath) { + return QString(name + '|' + basePath + subPath + extension); + }; + expectedSuitesAndTests.insert(pathConstructor("Master Test Suite", "/tests/deco/deco"), 2); // decorators w/o suite + expectedSuitesAndTests.insert(pathConstructor("Master Test Suite", "/tests/fix/fix"), 2); // fixtures + expectedSuitesAndTests.insert(pathConstructor("Master Test Suite", "/tests/params/params"), 3); // functions + expectedSuitesAndTests.insert(pathConstructor("Suite1", "/tests/deco/deco"), 4); + expectedSuitesAndTests.insert(pathConstructor("SuiteOuter", "/tests/deco/deco"), 5); // 2 sub suites + 3 tests + + QMap foundNamesAndSets = m_model->boostTestSuitesAndTests(); QCOMPARE(expectedSuitesAndTests.size(), foundNamesAndSets.size()); for (const QString &name : expectedSuitesAndTests.keys()) QCOMPARE(expectedSuitesAndTests.values(name), foundNamesAndSets.values(name)); @@ -280,10 +290,11 @@ void AutoTestUnitTests::testCodeParserBoostTest() void AutoTestUnitTests::testCodeParserBoostTest_data() { QTest::addColumn("projectFilePath"); + QTest::addColumn("extension"); QTest::newRow("simpleBoostTest") - << QString(m_tmpDir->path() + "/simple_boost/simple_boost.pro"); + << QString(m_tmpDir->path() + "/simple_boost/simple_boost.pro") << QString(".pro"); QTest::newRow("simpleBoostTestQbs") - << QString(m_tmpDir->path() + "/simple_boost/simple_boost.qbs"); + << QString(m_tmpDir->path() + "/simple_boost/simple_boost.qbs") << QString(".qbs"); } } // namespace Internal diff --git a/src/plugins/autotest/testtreemodel.cpp b/src/plugins/autotest/testtreemodel.cpp index b4f3e06d892..22d4b3921e9 100644 --- a/src/plugins/autotest/testtreemodel.cpp +++ b/src/plugins/autotest/testtreemodel.cpp @@ -615,13 +615,13 @@ int TestTreeModel::boostTestNamesCount() const return rootNode ? rootNode->childCount() : 0; } -QMultiMap TestTreeModel::boostTestSuitesAndTests() const +QMap TestTreeModel::boostTestSuitesAndTests() const { - QMultiMap result; + QMap result; if (TestTreeItem *rootNode = boostTestRootNode()) { rootNode->forFirstLevelChildren([&result](TestTreeItem *child) { - result.insert(child->name(), child->childCount()); + result.insert(child->name() + '|' + child->proFile(), child->childCount()); }); } return result; diff --git a/src/plugins/autotest/testtreemodel.h b/src/plugins/autotest/testtreemodel.h index c22a8f8d493..895d71bbacb 100644 --- a/src/plugins/autotest/testtreemodel.h +++ b/src/plugins/autotest/testtreemodel.h @@ -71,7 +71,7 @@ public: int gtestNamesCount() const; QMultiMap gtestNamesAndSets() const; int boostTestNamesCount() const; - QMultiMap boostTestSuitesAndTests() const; + QMap boostTestSuitesAndTests() const; #endif void markAllForRemoval(); From 91d6214b581b1465045c17f0cd048fe335d119ea Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Wed, 25 Mar 2020 19:28:24 +0100 Subject: [PATCH 02/27] QmlDesigner: introduce DisableItemLibraryUpdateTimer This is a temporary change to enable better tracing of a bug which we have for a long time. Be aware if this is set it can be slow down importing or open bigger projects/files in the QtQuick DesignMode. add this under the category [QML] to your settings file: Designer\DisableItemLibraryUpdateTimer=true Change-Id: I0919fe18e358e68905eb4a7f4849c6841f26a10d Reviewed-by: Thomas Hartmann --- .../components/itemlibrary/itemlibrarywidget.cpp | 6 +++++- src/plugins/qmldesigner/designersettings.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 69d431582a0..378f1e897ae 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -293,7 +293,11 @@ void ItemLibraryWidget::setSearchFilter(const QString &searchFilter) void ItemLibraryWidget::delayedUpdateModel() { - m_compressionTimer.start(); + static bool disableTimer = DesignerSettings::getValue(DesignerSettingsKey::DISABLE_ITEM_LIBRARY_UPDATE_TIMER).toBool(); + if (disableTimer) + updateModel(); + else + m_compressionTimer.start(); } void ItemLibraryWidget::setModel(Model *model) diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index ec4dc1f7e58..4d25edb8bc0 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -67,6 +67,7 @@ const char STANDALONE_MODE[] = "StandAloneMode"; const char ENABLE_TIMELINEVIEW[] = "EnableTimelineView"; const char SIMPLE_COLOR_PALETTE_CONTENT[] = "SimpleColorPaletteContent"; const char ALWAYS_DESIGN_MODE[] = "AlwaysDesignMode"; +const char DISABLE_ITEM_LIBRARY_UPDATE_TIMER[] = "DisableItemLibraryUpdateTimer"; } class DesignerSettings : public QHash From 8b0cece0ba8033c5dcb014fd72099678dd9c65d3 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Wed, 25 Mar 2020 19:30:08 +0100 Subject: [PATCH 03/27] QmlDesigner: remove unclear "clearItems" function It calls reset this model which is destructing at this moment. There is no need to delete the items because they are objects with the model as the parent. Change-Id: I32be59238ea174faf66ce62ae9cd3ab02812d283 Reviewed-by: Thomas Hartmann --- .../components/itemlibrary/itemlibrarysectionmodel.cpp | 7 ------- .../components/itemlibrary/itemlibrarysectionmodel.h | 2 -- 2 files changed, 9 deletions(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp index c18a486fda8..5a60dd1eb78 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp @@ -39,7 +39,6 @@ ItemLibrarySectionModel::ItemLibrarySectionModel(QObject *parent) : ItemLibrarySectionModel::~ItemLibrarySectionModel() { - clearItems(); } int ItemLibrarySectionModel::rowCount(const QModelIndex &) const @@ -73,12 +72,6 @@ QHash ItemLibrarySectionModel::roleNames() const return m_roleNames; } -void ItemLibrarySectionModel::clearItems() -{ - beginResetModel(); - endResetModel(); -} - void ItemLibrarySectionModel::addItem(ItemLibraryItem *element) { m_itemList.append(element); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h index 6d543b5afae..6e1771a52f0 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.h @@ -45,8 +45,6 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QHash roleNames() const override; - void clearItems(); - void addItem(ItemLibraryItem *item); const QList &items() const; From 2246718cac8844d6f6c7223c041dd908b66bfbcb Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Wed, 25 Mar 2020 20:19:28 +0100 Subject: [PATCH 04/27] QmlDesigner: why not delay it everywhere Change-Id: Ic2df04e1e5dc6d1cbf8d01de5e3755df223976cb Reviewed-by: Thomas Hartmann --- .../qmldesigner/components/itemlibrary/itemlibraryview.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index 90c0a2f28f1..cad7189698c 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -98,15 +98,14 @@ void ItemLibraryView::setResourcePath(const QString &resourcePath) void ItemLibraryView::documentMessagesChanged(const QList &errors, const QList &) { if (m_hasErrors && errors.isEmpty()) - /* For some reason we have to call update from the event loop */ - QTimer::singleShot(0, m_widget, &ItemLibraryWidget::updateModel); + updateImports(); m_hasErrors = !errors.isEmpty(); } void ItemLibraryView::updateImports() { - m_widget->updateModel(); + m_widget->delayedUpdateModel(); } } //QmlDesigner From b9fb5b65f68725f849e447f3a1e742cb9094b07d Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Thu, 26 Mar 2020 15:36:17 +0200 Subject: [PATCH 05/27] QmlDesigner: Enable setting a material's diffuseMap by drag and drop Dragging and dropping an image from the assets on a default material creates a texture and sets its source the the image and the applies the texture to the diffuseMap property of the material making it pretty straight forward to set a texture on a marerial. Additionally dropping an image on a texture updates the texture's source property instead of creating an image object. Task-number: QDS-1844 Change-Id: I6906851ad070e06a17b1ef7d4321e302bb305d29 Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../navigator/navigatortreemodel.cpp | 44 +++++++++++++++---- .../designercore/include/qmlvisualnode.h | 6 +-- .../designercore/model/qmlvisualnode.cpp | 16 ++++--- 3 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index b7dd9d10820..2bb6b5aded8 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -551,20 +551,46 @@ void NavigatorTreeModel::handleItemLibraryImageDrop(const QMimeData *mimeData, i NodeAbstractProperty targetProperty; bool foundTarget = findTargetProperty(rowModelIndex, this, &targetProperty, &targetRowNumber); - if (foundTarget) { - const QString imageFileName = QString::fromUtf8(mimeData->data("application/vnd.bauhaus.libraryresource")); - const QmlItemNode newQmlItemNode = QmlItemNode::createQmlItemNodeFromImage(m_view, imageFileName, QPointF(), targetProperty); + ModelNode targetNode(modelNodeForIndex(rowModelIndex)); - if (newQmlItemNode.isValid()) { - QList newModelNodeList; - newModelNodeList.append(newQmlItemNode); + const QString imageSource = QString::fromUtf8(mimeData->data("application/vnd.bauhaus.libraryresource")); // absolute path + const QString imageFileName = imageSource.mid(imageSource.lastIndexOf('/') + 1); + ModelNode newModelNode; - moveNodesInteractive(targetProperty, newModelNodeList, targetRowNumber); + if (targetNode.isSubclassOf("QtQuick3D.DefaultMaterial")) { + // if dropping an image on a default material, create a texture instead of image + m_view->executeInTransaction("QmlItemNode::createQmlItemNode", [&] { + // create a texture item lib + ItemLibraryEntry itemLibraryEntry; + itemLibraryEntry.setName("Texture"); + itemLibraryEntry.setType("QtQuick3D.Texture", 1, 0); + + // set texture source + PropertyName prop = "source"; + QString type = "QUrl"; + QVariant val = imageFileName; + itemLibraryEntry.addProperty(prop, type, val); + + // create a texture + newModelNode = QmlItemNode::createQmlObjectNode(m_view, itemLibraryEntry, {}, targetProperty, false); + + // set the texture to parent material's diffuseMap property + // TODO: allow the user to choose which map property to set the texture for + targetNode.bindingProperty("diffuseMap").setExpression(newModelNode.validId()); + }); + } else if (targetNode.isSubclassOf("QtQuick3D.Texture")) { + // if dropping an image on a texture, set the texture source + targetNode.variantProperty("source").setValue(imageFileName); + } else { + // create an image + newModelNode = QmlItemNode::createQmlItemNodeFromImage(m_view, imageSource , QPointF(), targetProperty); } - if (newQmlItemNode.isValid()) - m_view->selectModelNode(newQmlItemNode.modelNode()); + if (newModelNode.isValid()) { + moveNodesInteractive(targetProperty, {newModelNode}, targetRowNumber); + m_view->setSelectedModelNode(newModelNode); + } } } diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index 65f3e96aa08..aae262686ae 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -94,13 +94,11 @@ public: const Position &position, QmlVisualNode parentQmlItemNode); - - - static QmlObjectNode createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const Position &position, - NodeAbstractProperty parentproperty); + NodeAbstractProperty parentProperty, + bool createInTransaction = true); static QmlVisualNode createQml3DNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index fe2e2fd49e8..ab9acc25e8c 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -243,11 +243,12 @@ static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const Position &position, - NodeAbstractProperty parentproperty) + NodeAbstractProperty parentProperty, + bool createInTransaction) { QmlObjectNode newQmlObjectNode; - view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlObjectNode, &parentproperty](){ + auto createNodeFunc = [=, &newQmlObjectNode, &parentProperty]() { NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName()); int minorVersion = metaInfo.minorVersion(); @@ -274,8 +275,8 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, newQmlObjectNode = createQmlObjectNodeFromSource(view, itemLibraryEntry.qmlSource(), position); } - if (parentproperty.isValid()) - parentproperty.reparentHere(newQmlObjectNode); + if (parentProperty.isValid()) + parentProperty.reparentHere(newQmlObjectNode); if (!newQmlObjectNode.isValid()) return; @@ -289,7 +290,12 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, newQmlObjectNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8()); Q_ASSERT(newQmlObjectNode.isValid()); - }); + }; + + if (createInTransaction) + view->executeInTransaction("QmlItemNode::createQmlItemNode", createNodeFunc); + else + createNodeFunc(); Q_ASSERT(newQmlObjectNode.isValid()); From 2392f29a59fd96cbec367a37174b58fbb8f22888 Mon Sep 17 00:00:00 2001 From: Maximilian Goldstein Date: Thu, 26 Mar 2020 12:17:03 +0100 Subject: [PATCH 06/27] qmljs: Do not use app.qmltypes and lib.qmltypes anymore Task-number: QTBUG-82710 Change-Id: I876ec2b8e2b668a239248511b0fbd58389098de6 Reviewed-by: Ulf Hermann Reviewed-by: Eike Ziller --- src/libs/qmljs/qmljslink.cpp | 5 +++- src/libs/qmljs/qmljsmodelmanagerinterface.cpp | 15 +++++++---- src/libs/qmljs/qmljsplugindumper.cpp | 25 ++++++++----------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index 6c723bba443..e505a9e4c5e 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -35,6 +35,7 @@ #include #include +#include using namespace LanguageUtils; using namespace QmlJS::AST; @@ -385,8 +386,10 @@ Import LinkPrivate::importNonFile(const Document::Ptr &doc, const ImportInfo &im if (!importFound) { for (const QString &dir : qAsConst(m_applicationDirectories)) { + QDirIterator it(dir, QStringList { "*.qmltypes" }, QDir::Files); + // This adds the types to the C++ types, to be found below if applicable. - if (QFile::exists(dir + "/app.qmltypes")) + if (it.hasNext()) importLibrary(doc, dir, &import); } } diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp index a7f2b3d3ae7..25cd5f02d0e 100644 --- a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp +++ b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp @@ -40,6 +40,7 @@ #include #include +#include #include #include #include @@ -781,13 +782,17 @@ static bool findNewQmlApplicationInPath(const QString &path, default: break; } - const QDir dir(path); - const QLatin1String appQmltypes("app.qmltypes"); - QFile appQmltypesFile(dir.filePath(appQmltypes)); - if (!appQmltypesFile.exists()) + QString qmltypesFile; + + QDir dir(path); + QDirIterator it(path, QStringList { "*.qmltypes" }, QDir::Files); + + if (!it.hasNext()) return false; - LibraryInfo libraryInfo = LibraryInfo(QmlDirParser::TypeInfo(appQmltypes)); + qmltypesFile = it.next(); + + LibraryInfo libraryInfo = LibraryInfo(QmlDirParser::TypeInfo(qmltypesFile)); const QString libraryPath = dir.absolutePath(); newLibraries->insert(libraryPath); modelManager->updateLibraryInfo(path, libraryInfo); diff --git a/src/libs/qmljs/qmljsplugindumper.cpp b/src/libs/qmljs/qmljsplugindumper.cpp index d74b4663fab..7ba665dc94b 100644 --- a/src/libs/qmljs/qmljsplugindumper.cpp +++ b/src/libs/qmljs/qmljsplugindumper.cpp @@ -36,17 +36,12 @@ #include #include +#include #include using namespace LanguageUtils; using namespace QmlJS; -static const QStringList qmltypesFileNames = { - QLatin1String("plugins.qmltypes"), - QLatin1String("app.qmltypes"), - QLatin1String("lib.qmltypes") -}; - PluginDumper::PluginDumper(ModelManagerInterface *modelManager) : QObject(modelManager) , m_modelManager(modelManager) @@ -152,9 +147,12 @@ void PluginDumper::onLoadPluginTypes(const QString &libraryPath, const QString & plugin.importVersion = importVersion; // add default qmltypes file if it exists - for (const QString &qmltypesFileName : qmltypesFileNames) { - const QString defaultQmltypesPath = makeAbsolute(qmltypesFileName, canonicalLibraryPath); - if (!plugin.typeInfoPaths.contains(defaultQmltypesPath) && QFile::exists(defaultQmltypesPath)) + QDirIterator it(canonicalLibraryPath, QStringList { "*.qmltypes" }, QDir::Files); + + while (it.hasNext()) { + const QString defaultQmltypesPath = makeAbsolute(it.next(), canonicalLibraryPath); + + if (!plugin.typeInfoPaths.contains(defaultQmltypesPath)) plugin.typeInfoPaths += defaultQmltypesPath; } @@ -405,11 +403,10 @@ QString PluginDumper::buildQmltypesPath(const QString &name) const if (path.isEmpty()) return QString(); - for (const QString &qmltypesFileName : qmltypesFileNames) { - const QString filename = path + QLatin1Char('/') + qmltypesFileName; - if (QFile::exists(filename)) - return filename; - } + QDirIterator it(path, QStringList { "*.qmltypes" }, QDir::Files); + + if (it.hasNext()) + return it.next(); return QString(); } From e7fcfb74c67a351c51e698a822487b06b24a0a0c Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 26 Mar 2020 16:03:17 +0100 Subject: [PATCH 07/27] Doc: Describe GDB settings Fixes: QTCREATORBUG-10831 Change-Id: I68a68f0949c5015ad7642c9e5e005759e7412823 Reviewed-by: hjk --- .../images/qtcreator-gdb-extended-options.png | Bin 0 -> 5727 bytes .../images/qtcreator-gdb-options.png | Bin 0 -> 7825 bytes .../creator-only/creator-debugger.qdoc | 87 ++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 doc/qtcreator/images/qtcreator-gdb-extended-options.png create mode 100644 doc/qtcreator/images/qtcreator-gdb-options.png diff --git a/doc/qtcreator/images/qtcreator-gdb-extended-options.png b/doc/qtcreator/images/qtcreator-gdb-extended-options.png new file mode 100644 index 0000000000000000000000000000000000000000..10e22f235c1021ef1122859705c97a7a4a4a0348 GIT binary patch literal 5727 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 aQQBkEH37X3YZw?97(8A5T-G@yGywn+3u#mU literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-gdb-options.png b/doc/qtcreator/images/qtcreator-gdb-options.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f3f59be027550000844455c7e03bdfa43faf9d GIT binary patch literal 7825 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc index 1a1f36d4918..78ac325ab46 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc @@ -390,6 +390,93 @@ \endlist + \section3 Specifying GDB Settings + + To specify settings for managing the GDB process, select \uicontrol Tools > + \uicontrol Options > \uicontrol Debugger > \uicontrol GDB. + + \image qtcreator-gdb-options.png "GDB options" + + To specify a timeout for terminating non-responsive GDB processes, set the + number of seconds to wait in the \uicontrol {GDB timeout} field. The default + value of 20 seconds should be sufficient for most applications, but if + loading big libraries or listing source files takes much longer than + that on slow machines, you should increase the value. + + To compress several steps into one step for less noisy debugging when + stepping into code, select the \uicontrol {Skip known frames when stepping} + check box. For example, the atomic reference counting code is skipped, and + a single \e {Step Into} for a signal emission ends up directly in the slot + connected to it. + + To display a message box as soon as your application receives a signal, such + as SIGSEGV, during debugging, select the \uicontrol {Show a message box when + receiving a signal} check box. + + GDB allows setting breakpoints on source lines for which no code was + generated. In such situations, the breakpoint is shifted to the next + source code line for which the code was actually generated. To reflect + such temporary changes by moving the breakpoint markers in the source + code editor, select the \uicontrol {Adjust breakpoint locations} check box. + + To specify whether the dynamic or the static type of objects will be + displayed, select the \uicontrol {Use dynamic object type for display} + check box. Keep in mind that choosing the dynamic type might be slower. + + To allow reading the user's default .gdbinit file on debugger startup, + select the \uicontrol {Load .gdbinit file on startup} check box. + + To use the default GDB pretty printers installed in your system + or linked to the libraries your application uses, select the + \uicontrol {Load system GDB pretty printers} check box. + + By default, GDB shows AT&T style disassembly. To switch to the Intel style, + select the \uicontrol {Use Intel style disassembly} check box. + + To execute GDB commands after GDB has been started, but before the debugged + program is started or attached, and before the debugging helpers are + initialized, enter them in the \uicontrol {Additional Startup Commands} + field. + + To execute GDB commands after GDB has successfully attached to remote + targets, enter them in the \uicontrol {Additional Attach Commands} field. + You can add commands to further set up the target here, such as + \c {monitor reset} or \c {load}. + + To execute simple Python commands, prefix them with \c python. To execute + sequences of Python commands spanning multiple lines, prepend the block + with \c python on a separate line, and append \c end on a separate line. + To execute arbitrary Python scripts, use + \c {python execfile('/path/to/script.py')}. + + \section3 Specifying Extended GDB Settings + + To specify extended settings for GBD, select \uicontrol Tools > + \uicontrol Options > \uicontrol Debugger > \uicontrol {GDB Extended}. + The settings give access to advanced or experimental functions of GDB. + Enabling them may negatively impact your debugging experience, so use + them with care. + + \image qtcreator-gdb-extended-options.png "GDB Extended options" + + To use asynchronous mode to control the inferior, select the + respective check box. + + To add common paths to locations of debug information, such as + \c {/usr/src/debug}, when starting GDB, select the + \uicontrol {Use common locations for debug information} check box. + + To stop when \c qWarning, \c qFatal, or \c abort is called, select the + respective check box. + + To enable stepping backwards, select the \uicontrol {Enable reverse + debugging} check box. This feature is very slow and unstable on the + GDB side. It exhibits unpredictable behavior when going backwards over + system calls and is very likely to destroy your debugging session. + + To keep debugging all children after a fork, select the + \uicontrol {Debug all child processes} check box. + \section3 Using CDB In remote mode, the local CDB process talks to a CDB process that runs on From 38a7bfe4eb519f893947e2fe0029ce1eb662b334 Mon Sep 17 00:00:00 2001 From: Unseon Ryu Date: Thu, 26 Mar 2020 14:12:50 +0900 Subject: [PATCH 08/27] Fix for Pane not being visible in the form editor Task-number: QDS-797 Change-Id: I4b06aa0e09f78fdd3bb9531cf21441bdae3ee2a5 Reviewed-by: Thomas Hartmann --- .../qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp index 2d2edeee4a6..1c6601784b8 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp @@ -653,7 +653,6 @@ QObject *ObjectNodeInstance::createPrimitive(const QString &typeName, int majorN || typeName == "QtQuick.Controls/Drawer" || typeName == "QtQuick.Controls/Dialog" || typeName == "QtQuick.Controls/Menu" - || typeName == "QtQuick.Controls/Pane" || typeName == "QtQuick.Controls/ToolTip") polishTypeName = "QtQuick/Item"; From ea5b098bc148b287d7db52ac827e400edd2a0b06 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 27 Mar 2020 16:24:43 +0200 Subject: [PATCH 09/27] QmlDesigner: Fix ItemLibraryEntry serialization When data is read from QDataStream into Qt containers, it is simply appended/inserted into the container rather than completely overwriting the container contents. This isn't desirable when reading an ItemLibraryEntry object from data stream, as the assumption is that we want the entry to be exactly what was originally stored into the stream. Task-number: QDS-1815 Change-Id: Ifaee244b2b4e7326b6f10fde3faeb5218f505ee2 Reviewed-by: Mahmoud Badri --- .../qmldesigner/designercore/metainfo/itemlibraryinfo.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp index abd64928527..7b3059247f3 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp @@ -225,6 +225,10 @@ QDataStream& operator<<(QDataStream& stream, const ItemLibraryEntry &itemLibrary QDataStream& operator>>(QDataStream& stream, ItemLibraryEntry &itemLibraryEntry) { + // Clear containers so that we don't simply append to them in case the object is reused + itemLibraryEntry.m_data->hints.clear(); + itemLibraryEntry.m_data->properties.clear(); + stream >> itemLibraryEntry.m_data->name; stream >> itemLibraryEntry.m_data->typeName; stream >> itemLibraryEntry.m_data->majorVersion; From 582b4bd0ae5eb2dc047b8c97003d3459585c7aa0 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 27 Mar 2020 10:25:03 +0100 Subject: [PATCH 10/27] Doc: Update images on the front page Store the source files in SVG format. Task-number: QDS-1851 Change-Id: Ife601967b4dffe10c8e48f31365da2d8df9357f9 Reviewed-by: Thomas Hartmann --- doc/qtcreator/images/creator-gs-01.png | Bin 4401 -> 0 bytes doc/qtcreator/images/creator-gs-02.png | Bin 4341 -> 0 bytes doc/qtcreator/images/creator-gs-03.png | Bin 6059 -> 0 bytes doc/qtcreator/images/creator-gs-04.png | Bin 2784 -> 0 bytes doc/qtcreator/images/creator_advanceduse.png | Bin 7537 -> 2751 bytes doc/qtcreator/images/creator_advanceduse.svg | 27 +++++++++++ .../images/creator_buildingrunning.png | Bin 5488 -> 3781 bytes .../images/creator_buildingrunning.svg | 39 +++++++++++++++ doc/qtcreator/images/creator_coding.png | Bin 4090 -> 6324 bytes doc/qtcreator/images/creator_coding.svg | 37 ++++++++++++++ .../images/creator_designinguserinterface.png | Bin 4297 -> 4617 bytes .../images/creator_designinguserinterface.svg | 45 ++++++++++++++++++ doc/qtcreator/images/creator_gettinghelp.png | Bin 4808 -> 2390 bytes doc/qtcreator/images/creator_gettinghelp.svg | 16 +++++++ .../images/creator_gettingstarted.png | Bin 7695 -> 2343 bytes .../images/creator_gettingstarted.svg | 22 +++++++++ .../images/creator_managingprojects.png | Bin 6761 -> 3034 bytes .../images/creator_managingprojects.svg | 26 ++++++++++ doc/qtcreator/images/creator_publishing.png | Bin 5980 -> 3716 bytes doc/qtcreator/images/creator_publishing.svg | 40 ++++++++++++++++ doc/qtcreator/images/creator_testing.png | Bin 6643 -> 3254 bytes doc/qtcreator/images/creator_testing.svg | 34 +++++++++++++ .../creator-only/creator-getting-started.qdoc | 10 ++-- .../creator-only/creator-tutorials.qdoc | 4 +- 24 files changed, 293 insertions(+), 7 deletions(-) delete mode 100644 doc/qtcreator/images/creator-gs-01.png delete mode 100644 doc/qtcreator/images/creator-gs-02.png delete mode 100644 doc/qtcreator/images/creator-gs-03.png delete mode 100644 doc/qtcreator/images/creator-gs-04.png create mode 100644 doc/qtcreator/images/creator_advanceduse.svg create mode 100644 doc/qtcreator/images/creator_buildingrunning.svg create mode 100644 doc/qtcreator/images/creator_coding.svg create mode 100644 doc/qtcreator/images/creator_designinguserinterface.svg create mode 100644 doc/qtcreator/images/creator_gettinghelp.svg create mode 100644 doc/qtcreator/images/creator_gettingstarted.svg create mode 100644 doc/qtcreator/images/creator_managingprojects.svg create mode 100644 doc/qtcreator/images/creator_publishing.svg create mode 100644 doc/qtcreator/images/creator_testing.svg diff --git a/doc/qtcreator/images/creator-gs-01.png b/doc/qtcreator/images/creator-gs-01.png deleted file mode 100644 index c67a633aa527226c661f5ce4e453804f04c502f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4401 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 BLGu6r diff --git a/doc/qtcreator/images/creator-gs-02.png b/doc/qtcreator/images/creator-gs-02.png deleted file mode 100644 index b8b4bd93ae0b216308a9cbf3d3fd704533f973d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4341 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 aPGI=-Dmo?lm5&T)Ai~qt&t;ucLK6VjFRse~ diff --git a/doc/qtcreator/images/creator-gs-03.png b/doc/qtcreator/images/creator-gs-03.png deleted file mode 100644 index f97d38b1d55c314d8fc38dc5db7a836d1a9b089e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6059 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 diff --git a/doc/qtcreator/images/creator-gs-04.png b/doc/qtcreator/images/creator-gs-04.png deleted file mode 100644 index b99158debd64adfe55fed18649c7ea0177d74746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2784 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 literal 7537 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 C4|Q7r diff --git a/doc/qtcreator/images/creator_advanceduse.svg b/doc/qtcreator/images/creator_advanceduse.svg new file mode 100644 index 00000000000..7a7b77186b4 --- /dev/null +++ b/doc/qtcreator/images/creator_advanceduse.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + diff --git a/doc/qtcreator/images/creator_buildingrunning.png b/doc/qtcreator/images/creator_buildingrunning.png index 7f51e328e87b8c31b0909e450d948ab5e8de862c..a52c4b392f61dda1c94de006d2ca0a52ca191352 100644 GIT binary patch literal 3781 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 CE}vEa diff --git a/doc/qtcreator/images/creator_buildingrunning.svg b/doc/qtcreator/images/creator_buildingrunning.svg new file mode 100644 index 00000000000..3d4808cdb58 --- /dev/null +++ b/doc/qtcreator/images/creator_buildingrunning.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + 1 + 2 + 3 + + + + + + + + + + + + 1 + 2 + 3 + + + diff --git a/doc/qtcreator/images/creator_coding.png b/doc/qtcreator/images/creator_coding.png index 7ddc31ad1c29599a4ee442d94c453dc70dc58c0a..9597fe831fcc2ae608e95daab22d353b418a8cfc 100644 GIT binary patch literal 6324 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 C25me5 literal 4090 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 + + + + + + + + + + + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +// main.cpp +#include <QApplication> +#include <QTableView> +#include "mymodel.h" +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + QTableView tableView; + MyModel myModel; +} + diff --git a/doc/qtcreator/images/creator_designinguserinterface.png b/doc/qtcreator/images/creator_designinguserinterface.png index ba6e86de4cca09336fbb46a78c8647cab1a5a45e..85162a52ceafde3bca0e3c84d35b03d0c573f88e 100644 GIT binary patch literal 4617 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 KT-G@yGywq0e`*5& diff --git a/doc/qtcreator/images/creator_designinguserinterface.svg b/doc/qtcreator/images/creator_designinguserinterface.svg new file mode 100644 index 00000000000..b3aff292403 --- /dev/null +++ b/doc/qtcreator/images/creator_designinguserinterface.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + +1 +2 +3 + + + ON + + + + + + + + + + + + + + diff --git a/doc/qtcreator/images/creator_gettinghelp.png b/doc/qtcreator/images/creator_gettinghelp.png index a9b51e3297c058047e05e42f12b46ba963d6878c..c3ae18b392aecf09d647346c00b641d8ec469ade 100644 GIT binary patch literal 2390 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 AMF0Q* diff --git a/doc/qtcreator/images/creator_gettinghelp.svg b/doc/qtcreator/images/creator_gettinghelp.svg new file mode 100644 index 00000000000..6663ed53eb9 --- /dev/null +++ b/doc/qtcreator/images/creator_gettinghelp.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + +? + diff --git a/doc/qtcreator/images/creator_gettingstarted.png b/doc/qtcreator/images/creator_gettingstarted.png index 85eb15c4e0010c93ce6271e85a828bee4edadf76..e6177959ad6a9038a32338bc7377135c6842a9b0 100644 GIT binary patch literal 2343 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 Z438NZayA}OC + + + + + + + + + + + + + + + diff --git a/doc/qtcreator/images/creator_managingprojects.png b/doc/qtcreator/images/creator_managingprojects.png index 016a4cd4281cc7d3af4d002bb137c6f8ddbe4817..dfb2ebe67d0ee52226ac09c2995d1ae40a2764a2 100644 GIT binary patch literal 3034 zcmeAS@N?(olHy`uVBq!ia0y~yV0g&Dz|g_L#=yWJ=+X0nfq{Xuz$3Dlfq}IXgc)-) z=Kf+};O_BsaSW-L^Y(6ZvG8+Qwh#3aa!$ILnQaxxN#;A|Q^;$m*1XW?&ciF2p8A)* zC@q<+x#g@+@ooJJ-E|Gi{<36RE%ZF;sxWubmf#r^W;7n4(g2 zh0VMf_n-gnKmYvq;q&(^9tV9YR&)CCy!>9}&x?!Q>*vm!w=QX;@Kb*ckzaqV=kKcw zsAtq|c|YH(v?izKPxH^8Kc7c@bNRWw?(eVlb)TPI zeVn}M=|ktrkRYwQrKLtukvmf!zsg#)srvSeDZkU7-ZQ^iRJ_3N*)!YD-{LmhpGx1( z@Cmb>aA{}IO_MnFs~1cEbaYP2a`8WWtoOb9;)`L)3%Ar2$8WQ(SnxOI)7z$;SzRaY zzRH^U*@pLK)c-XydD0Vv-Zz!)))JU(bbn8euO0Wzy}tr=8#YOtV1KO?Bpj)KkCoq^ zIqK`9k3XKRe}A{S+*e1;dfGaJRdV)zKV`FAWwY!T?|Sbt{g2wNGPS4qY2HEd?pvf5 z{uZA<_wU_VKFo%j=Uus_6%;n@hvm+jGk4S<+y7)+{x*}R`8I1X*2^7FU{b?3Q3-_TNpBazEv>6H^#EgDROD8_t|r^6f5zX<|jL zLiR?*nwttWqW@3-lW|!+^LzE#vqt9j^S>)~98D7PHooC}&FB1?1sEXCfBpV__p)z#Y}$AAW38=DDd_R1wxnr_ZacH~-Sl~{;4Wu>$D0S%)b5k(If`7Znx!2zL%}Pv!igXJo7})WzILQTv4(A_0jNc`rc== zXK-Y14>WFTTDaW)cdbr!)YflrDg#fSI&h%j<*5@T9Q*4ZG-_d7ig! ze?R%+MMqCxpH zt^F44y+*e;E{>Fv-tKw+?CeXIi#NZB;(k%K=gP%}d;K@{uM~LocW-CGtH^_43(RtF z-cj|N7*i%T5!MQ z&)4f)|2w!f^9Bj^- zm-Aj!#qKPMlrl3@(P}99ep}GZ`*X`1;dL=Z^@3+ZmLGB~*Pk_S?b>yk(LHyRTQ=?J ze-)g*DWX}?W#)szjL1YU$Na>H?*&h_wLQM|*5`Y-%!K{*HD=G>>YsW)<6vLNzOuDz z&;NWoSv~5qj%@$&Dzd2XFEiO5~@_xUe_hR&FJG=}%l|9< zc-+6vp5DGwKe?Yz_0Lpr(J%eupl!a|Ecc#{u64OsPPBg9o*hrN$r)T}(2iU=RnMWy z-stkF4Nra>X3YF9@Q8I|bM#yBM;eRd7xql*kK6U+pj3;_<>bqk9nxnr<R#U}`zrqbpOTaB1?;XgymWJ)T<&ls=h$Lyr_O>!l?gm^ZvS5OqTV#w>+!45+&aVi z1r08jg?*E^A3o5Tvf|>MLm?c7D%}h@TW-jh{>v@Wo%Xg;z$p2`msx@DRm7#g9KIkw zdtTqOz3V$17bS5dY%~x(H1XlXC4!2l+MV<&opZZO*ZsO=9CZ4M=iZ1dYrk{z%UK=i zKjS7b$FlmF^3H;N8<(jDwpI*4IU|ZjnmCLOXcVEzPd)qVXqEEeG{p?KE3yHIL>%G(~SoMDL z4f*)Wr^}5DF3i8df6=PgnRn+RQR9lqM=hLY>c1$CwfLWZea@Hew=VU9+SLMX%k}Ra z3%PO7xqa(F=aT6qH~hagSV`*lPIG_pT{P>RzI?!GUS2+{I={gAllM(3S=KCfz-RHV zh%<9*#9AkAi+TI2^z?WA?>kB)4%q~5M49Ojzo%aniHqq|M8xIJ<9`Ar*yojqLNzO;Fi>Av4JPN2=h zux$cKc;lAzzz`OuKQSF#D!Cln^Y5SgWUle?(;9v4KXt$NzZahB9335PXKwxe)TJrh z-*qN4H8xzyyP@#-`}^HV)uErN_I^6F?#uO}GpzHr?^?C$$Enkdw;xFDsFB=fm!DTx zw^iIVY{kYsIhHeyP1>Y!;GfaWp2dq@x(r)rgB4r8|4vwo#=yXkVf9Cbfq_A?#5JNMI6tkVJh3R1 z!7(L2DOJHUH!(dmC^a#qvhZZ84FdynMrKGvNrbPDRdRl=ULr`1UPW#J0|?mIR}>^B zXQ!4ZB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT8h zBDWwnwIorYA~z?m*s8)-32d%aUa=KOSYJs2tfVB{Rte&$2;Tq&=lr5n1yem^-DCqp zLj^N4Jwp>yGc!XS1tSAPBYguSeFHOHLlY}gGbE!^lXtC?!p|xH7LKu|hYmSQ%!5OKNd)QD#9& zW`3Rm$i&2?{L&IzB_*h_6}bhzzHo!{ilG6OoS&;-kyxN_sAr&`n+x(6*u%voL8%C5 zU{zflQdy9yACy|0Us{x$8kCx*jARvli$Dqse0{C_i!#$Q^AdAh@{>z*Q}aqZU2K&q zatriQGE=OKja)2@oD572-HZ&(EDQ}T3@nT-4V}!*+$@b<&0O7JW?<9nW?^V-=w|9> zY~gHbXy|I}WNBpXVqj=$Y-ZqQZtQ9Z)9aa6T#}fVoC>oyGc&~ss@D~-UMuIK)Wnkf zqLBRj99Rkn$jC3rFV4s>P;d@5Q_%2DOwP;$321^M2psxWE~!PCWvMA{Mftf3;1IUT z#O4AsV^dReV`n3CTt0{BO(7@L^z9UE^g+o3DY?Lef?V7{OmNBurE)t3MD|I|OR-fd zQnI%zyKiL7z#ul=)5S5Q;?|p3&VrDuv;JA%y~(K}AjHAJ!ZD*o^}`YMe)E3W#0WV@ zrYN1(9~$o2U6a1Eq^?@F%&Y5p&(gjH4~lhUW@v70QRm9qIGJZQlaL38w}*nXq9V&A zhZC1xzO#OAU+Z7|tL*;0=_<8#uL^csZ{Pj?@Bjb5w|}00S;}*g!-NF^%MA`PIX1Bf zuy6`F2&i~4I8IPtWTCFW3GpS|Po`&@%zAgix%bfu70*JECrYeE=XD#x!4 zVs-}k%$uFEUg73Pp+nIuH*LD-(_xc=)2#Bj7KdOU)-^I z!GeT-9xhdb6$-z;zvnkKHD!`u;)rEqdHC|>%kxK$9g|Vh={ZvE9M{&~?(FW)?lZ%H zQA{s}deNBh#8#>i>A!ky?*1ykCQiT+GNEiqV`aiMPL_~fCk5j zju|GIm*(HPb?e^$+HaSSOj>?m-rM5~!)x>1zwf7-mR)UfYO3lS+v;gd zi&w1R=xAq-68> z-|t6lN>uWx$x{-E*K6N9|F8U&yF2-t+4zC(0+|J(~x3?zvZTERTRZ*a8;lqZ8 z(1kN3jnn?@T)6Pz*`+KTe~lI?dR=G!<;K&xd1vc~!{>|>6cjHV>D=EuWs1m)>+9uN zk4#W>c36HnlJobkudl@d?(8b zpY@3J7nPq*W?#AZ-W~0YpP!!(4tVnXd2`(Q=fdwkA4&dG zo|*abzPx>1PQfGH8pfstr&d@qAB=lDcm2lQN1y!s{QUK%O`A$)o8@M4F-Y7nb=PRv zz}GloikxFZK%S+g;wt+k-%d3hn^ksWx3YMb{#55%9VQWyJNQemQkqZl* zUnZ+2Uh@6K*1dg4_4jo~5AXROTGh{KkoES7*gmGlaHB)nN}paj9@_IP_x84}yNhcV zGO)buleKOWQr+>c`^IFIHJ{VZ&#Mg(H2NXUQFwWoZ}sApD_{05&Hu|c>9X=eId+!M z(k2(yA1{!Qn9XUo{!t0(Eg`Ze-;_SFNF^_s)3_i{B&L2~&L@E3bF3Gh3tnahKWkM|^@GUY&fdBD`S!{r&a- z^Tl)`F5I}O6>>0Z;{}23{(A+v<~1}$xlaMWEU@Go>y|T8zBBG7PO)0B=A}?f{S5ZU>B|o7|9gG)hc{n%ZtN^p z*Etu-bL7<}F5!*SKK%K7K3MM0m&^VIZ*CZBXlpP2e*WFe-Wf9_W|(9Ot@TnAyw`F% z>`u6@j0i{1eGU2aqDQGqrd(d&*sP$Zr)O$s_b;63UIimdWI#)y2#3vKiOW;^r@Aja z?c?Lqa^{SWY~V3@4vBw;7WWj+yv%r8!E*hTzhm!9qm=bOnRD)ZGWzmLn)Usj&wOj* z{u;&XENYFa5qdW9`Rc?cCngp=KF0gw-R}1*wjXeb=HxiWedv4v|D%fKl}r=+-FpA8 zJJloEWte;{gF~QANrF$_?v8f_i#69(aRK@SN+h6LKd@NaE@!^uU{>1=}`SSL4GJLXDDTlRZ zswdj9G~KnhE1n=>nl(jDQ86*2qT&Z@kv^v)Ka2ak1JVWpPcI5h|7-e@$6F!b?mVey z;)i17JXCp~KlpR^y+Y;`wtK%)SkJ`$i?;auSyD=`_Q%8a3zsfAy%&6+{pra`lldE- zi>B0Ngk=4txNAwY^JX@iD@2UF~p^7r>tUa-jSoO?*Qf|*TKRaN!ijg84$Rr3D6 zI?%}Mt>EzXeBuxP$Gqw^BJh5qtf3k#)BmbZSkJz(vO=dQp6ZiMkR&Uy$dPTD_;k@+@Znk9%Yc?I>Ps&x$ z*7ja~`Q^XqDzhj56||4$zP8oopu)?QmsSg&bG?(jwqb>w)eD_Xh1auhSNAjoo#N2; zQAu}*{Oa%Pdp3S|S#HS&nJJn0}-sY5+_P1Z!bWNq)ASO^+~Uv61JOz z^iC=7>^siFvfEkDJ)n5&z7vvD`a8MHrWh=rTsVW{(BoZZbKMJsglsR}Z|6&%oxLZ} zur=$?2PT%oCmHW%>W3Gx$nos+STMEWnCG<#rv+usD*q7Tne#x#@OxzbL5J0D3$|Jp zD6L((_#~tL2PwuLHBKJ4PC4I6ulIanVyP@T@uKM8Gk${&ip+{8r}zXQz2=c?JUVwr0_*LG-QC@Z=jYiraEg7~mJt5z&d%bOON7Ft=BT8F zxtl-EU~7wf_nb#+whUu+kKC3!ir?MeiT?L2x}kjBZrb%7*E2QRvVuSnJ*Fm2G0R-Mw44f8*%k|6}>=yrE?P zm%mMux=amWV+%Qp~{9DBKyt$$?nmAkhf=v%?=-}wKJ0AAr z%a@W}CuG^Rr!JagZf17q(o*kCd%J4=X&%#cB9lbTelB=t*VXg*$*f;i`^80;9JA># z&&XKWe(V}sY4`dX--+5S?ME9@N^~Q?sdG$84OWSn-e7bvFXB!K1Fy)sInK^)Tz$_U zGb!EK$o#);)8V7;JIb0Q_1q^qdQ`FeGmMf<5i>o0-p;%F&d=h2laU!Ma!rwHV#_yO ze{*%mUIjL`FFaqf)Mq+NvN%e7Wa?kA?q^@+$~m&x`X|>NcvY$w{zBSX;F0Oyg-^Z+ zN|;nkxGr~4T0mpJaJSfwS$x(>7Y!DwyWM;I=EE}I*%{w;^fV479iMAmo^d%LEltg| zXu4kPqWa&TPV3JN6L2;&Nm|GgJ-Pc@Yh-zitf*Y{ zcerxR>#lTla%x)t>MciG`H70V6TJ_t&oF?~6K`mS4Czb${?Pd2+B5174Qta|p+iI3ykfeX9K^Iw%+-1S+MQ{~N}BP!i*Uw!y` zJwAGyYvR3x<9)JUYS-`i#C7EO@#v?VaRGXg^@Sx(7gOY>_Ntm#hHd`##wf?8_0O#v zQ=Tu_vqFr^|K5VtS2skpIeaKetDN~pu&q*Ad7GV-EtB4Q*VX;&6Cca03rlXX{`0W1 zu(0sU&kjN57lORP@=2W+JSMgnsx4URVBYo7?%4dEgFS^2c5}`1gm1*dJDInn9f<9WV4 zNy*8vyW*;4w<^xo`P|jz)xXEG&HME5!?mf^e*r6kM{YBEJqiK@^Z(fX6_`ETz zk?DZNRMjgP6Sw8v%@XFSoT$8mhpFoCq|P?C6<4wn&kN@#M0=g}k>WPz&UgO!)2QO> z)o@LD8O@36Ud^cqKEDiqPX8>oopbX2!pFxhUM+5IZ7uoCa3`ig@ZHz0)7~F{UFcXF zzyIDN-GaYg+jylj_{>XRg=qQvdmp^Z$FXNqlEj58S6EI@(_MVVuILFzS?{Gv<~xju z$9g113^LvpZnQgR@%ZGpUqFP{x?fMCv&Qrh38qm#JNYsQzV&^ z{{8tmO-tDRxo}SY1@vsQ;q^ggR>>ZBGvD*ar+rf^v`P5DzoOeE z@z&kl;-6V~fT9TekOvy@5a?XsG=cc;r83^veE-!tKVP8|cUkaCUe)8{Lgr|aiy z$MgUEv~m*XiGVpP0+ZE@f^r)>v{fC{6(W2@T;JC@dA>V(O8Le&LCd$glVbMAs?=9%A5NLH zM$7BnhcnXW9r!NKQN3{L{gZI9YuB$|zQ9pzagFJ5m&}{Bg&a4RS*sTRWn>e7*<`M; z;J&YLYC!JH0v^84GA*Bqu1a0ESt+%Xp^g2WlujKpqXc82mPZg=JdK9 z?|OTB)x_Bf1|Mz0PaVEjT>YtFi=pIe)y1b)TxQjEb>?_+lDG}t^NNF%*(T$?a$HRzF?ko^u3=!E7x=WKHcNC*p1C8 zV2{%Vo2Je?CE1mgKVyyl>~ag;7NRO~>UYP%X%ig3nFN$Sw)2rU=e=dkQ?U45+tf+c z%uSZZD}wAwm;7P$(YonxE7@tdv+B=}k0SM_J0x6~FLw3?aQ7}bJKH>b^5cXL_wOy) zQ)<}szAmcMk})_l^X2!$ZM@O3|GZPzH}mryz9Jf|xYM0$&Yn^ss~*{|ZCq15&Ad11 zSgyIDkz8P3&2sv@-P)+FS*7Ar1DET~_wwp?ZgZ5At&@1OxsvU-i{po4Z7r>=j;(XN z);#-Xz0~x>+x_obPq1IyP;f@6qyJTIdY)r$uhES)fn}=U0!FWPIRt14CvOQnSP;+i zulVg>nbqc;D!apSj%H}<=-eq;|L)$dYtzF1F5EBM^eEZ6$?Fqm z$NTFzf5YPIMGHgk=Nb1i#B{fc91!cy(_5_fSnx`cOFe&l+~&Zt*EimErE0zjsr6a$ z@6u9l?WpMJ{j1jRQUCklU%5aS^M)_xmKV(RB1^Z;yxg3obm9yE$_|ZX9x8|e-?bZ#(MgR zr2XccqJ*bY&+EtS(Rlj&dG-d|*pI)@OcDsZ{)Hn}lxLEXzr*^5-=|F`H|}S+6cZa; zyY5BN#hB)U0U^Imms)&!*>9kg$D(s)7W>3o8LpRQ#btJ1CUrJPZIa|NG0!&lkD% z_iRwm)O=}r^YsT+kFd$+Wo<_`Yfn;}u=j!9AFY(>&s5E~Y?|oEE$7LWw&mg{LoHq1 zx2-$o*onU521Y?cftcq0=sZ(rMO<#VS_o}4*<=FFd7B_$<1>uyBvulrkJ zFg^Qgk>8?r^~nJ>wfAq#Js=QpSH$6iw8EB89Mc&EkM_Pea^#4jKX28m%Lcv?Nsm5= zTyS-Fc>A=7r&(>Gk#Nrp4uws@!NKwM-|v>IpEz~@pzPGm8y&O#1snt%J{+-jDY~av zbY_NOJug51{Buv4BefFw`56|^4dB@o9UqnbK%OB zErCY!nPZ-IhR%`3NT-G@yGywoP4Z)HC diff --git a/doc/qtcreator/images/creator_managingprojects.svg b/doc/qtcreator/images/creator_managingprojects.svg new file mode 100644 index 00000000000..fb934268a09 --- /dev/null +++ b/doc/qtcreator/images/creator_managingprojects.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + +C++ +qml + + + + + diff --git a/doc/qtcreator/images/creator_publishing.png b/doc/qtcreator/images/creator_publishing.png index 8066ffddc1f29a96bd04f25c1775d65a5303416f..b7e79a9bc3a463a05670c256031bb25a31a97a71 100644 GIT binary patch literal 3716 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 literal 5980 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 OyFFd~T-G@yGywoU7LADj diff --git a/doc/qtcreator/images/creator_publishing.svg b/doc/qtcreator/images/creator_publishing.svg new file mode 100644 index 00000000000..4954f8930c2 --- /dev/null +++ b/doc/qtcreator/images/creator_publishing.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + + + diff --git a/doc/qtcreator/images/creator_testing.png b/doc/qtcreator/images/creator_testing.png index 194fd94beba61d5914fa79611b59052b88ec4f15..395f898cddfb0cd6c3597a5a6b897ad218235b98 100644 GIT binary patch literal 3254 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 bzw*96I6O~HJethFz`)??>gTe~DWM4fig**T literal 6643 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 diff --git a/doc/qtcreator/images/creator_testing.svg b/doc/qtcreator/images/creator_testing.svg new file mode 100644 index 00000000000..14e75f3489f --- /dev/null +++ b/doc/qtcreator/images/creator_testing.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + diff --git a/doc/qtcreator/src/overview/creator-only/creator-getting-started.qdoc b/doc/qtcreator/src/overview/creator-only/creator-getting-started.qdoc index 02eee1e2b04..1407cf33581 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-getting-started.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-getting-started.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -39,8 +39,8 @@ \table \row - \li \inlineimage creator-gs-01.png - \li \inlineimage creator-gs-02.png + \li \inlineimage creator_gettingstarted.png + \li \inlineimage creator_designinguserinterface.png \li \inlineimage creator_advanceduse.png \row \li \b {\l{IDE Overview}} @@ -60,8 +60,8 @@ control systems. For an overview of the options you have, go to \l{Configuring Qt Creator}. \row - \li \inlineimage creator-gs-03.png - \li \inlineimage creator-gs-04.png + \li \inlineimage creator_buildingrunning.png + \li \inlineimage creator_gettinghelp.png \li \row \li \b {\l{Building and Running an Example}} diff --git a/doc/qtcreator/src/overview/creator-only/creator-tutorials.qdoc b/doc/qtcreator/src/overview/creator-only/creator-tutorials.qdoc index 003422fef43..ec2ba4fdf95 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-tutorials.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-tutorials.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -37,7 +37,7 @@ \title Tutorials - \image creator-gs-04.png + \image creator_gettinghelp.png You can use \QC to create applications for several platforms by using several technologies. The tutorials in this manual explain how to create From 68b6b0dd4d7cbc803711ef07079f85577a8c91a5 Mon Sep 17 00:00:00 2001 From: Venugopal Shivashankar Date: Fri, 27 Mar 2020 12:48:58 +0100 Subject: [PATCH 11/27] Doc: Update the project template screen capture Also, reorganized the list of project templates based on the latest UI. Change-Id: I72f903909946d29ee3c181c926c2857a6da25a5e Reviewed-by: Leena Miettinen --- .../qtcreator-new-qt-quick-project-wizard.png | Bin 27692 -> 33979 bytes .../creator-projects-creating.qdoc | 39 ++++++++++++------ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/doc/qtcreator/images/qtcreator-new-qt-quick-project-wizard.png b/doc/qtcreator/images/qtcreator-new-qt-quick-project-wizard.png index 49562a64ea5da26f8c3c6e46e0c4ee40b6addc78..a2a5bf396fce2eb8a1654f4369a6299e6a755d0f 100644 GIT binary patch literal 33979 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%0DXo_w@MT|8iE!7N3-L z4`*k;Z~OXsW6P{Ei=&6`-dJhDmGInk--+7b9GMSCZ5rG6@o>w>oNv^;`RCO}{ZD7h z-dnof5|3Zwd-b*LRp0WYFK0EQfBb6x;$8MP?L&V5*+(CKeXUu@>wjr`OMaPTlJVQ4 zpB`|(YsoyCu9?NLX2G#ECVty(P3;U7w*y*D=TyJ5y%D}9;nuhKgvt+l1s=EV^ZR>F z|9jP&&FK!attItm)he%zjt`im-pRdUMN5^8bJwjdj|k8pblXPe*yR!@dfAwBTdkzE;kZsD!;YNdS*p``u9WI7D@iO5dPEpXt4dakSTq)ZfwXG z`<}w&zW8mo@wGeE8`kf*X#Q;Bis!bCnS0Jgechn}TMNMUzOuDz?a5-k+_I?fGfBUu zEV#j>)s+8zw%2Rx{}a0ROPt$#*6(!}r%YD8{+SBHxaDTnYqfPmK8pFCc`#4_jIRbncC4t#IiB0Hgg|J60-J*g}Ki`12j=9K>JJiL$piQDyp`#KdLkH2ROU%syP zj2gr88ELzuIHq!(TTpY5Wm%#9H`Zfs7bX=SH~-sKknDO({OFXNx~)uMwmasjy$`u` zu;9uuak(wL=OXMTuDcw4C2zi~??=-;Cv}$n6e5$Ap~L6l*Fu zdx+W!PE1_4vdT7JOh57V<;^_N{vWUO?+uo_|ERULeDk-BqBbH)f>U0+z5lp9`u?$f zNvz*Q5A55{S@&)I`yHYBMt?KwL-l?{=D)jY^ZvM9cK(4wa;}^6pM1D?pCz>S-s78l zm)|g}X4|qe*(&Fk(zoU6KYo1+|E2V{Tm9Po4_BtYFOTm|&c9rBrn=^XsmZsmV)6gK zvDAH?@%&fCvWR2#{Bb77s=w^vUU}rU`;ONlkJ6v4=;b|r_q@rUUkmKqoF?hrC?b9#A7$wzI)-N2U3FFC)Rsbnc`{ywwh zXUMyVp2IsPEj2XUJS8AJd0FB=si+MBy9zn`O8L6N58W!=kfr*jP;8^dZHu%ImJH{X z2|Q0*T=h>XYEkd@oU<2njwl%&;yqxAE@(uIIa+tS{RxdBNsKjh1rH>puM-RuLL^GdgaX?|ZnH|9WR-v;O>3QpUWW#RDwr8Cyl)K3VhSPyN-D zLmTrLTd$g>Mawh3pWog5?fiGS&9j)!JFlI4PVLll{RM0OrM{BRIWzC|&;K=bdYg0i z^VGyN-gTUQ@=VBqN#^Z((odc-rz9RbD44usnbMivyvbtI6BOs4nx(XB)!ye9o>W?t zKKS-YP59cWKR=EMPh8?z>v}%OY2!&Z_HNCsThzYq)cEE*}=-pnwh`z#Jyj#Wp&R9IUoP-_p?)TS)3C?v;WU%db~C5_kK@l0d>FN72lQTFLhP> z@MqVzdCqgcPcK_tADwA;WATxTL8(Xgd=&I5e^qIrBy={q=I_CO{H6W-{Qo5F^?U#E zaOmrwiKiY6tbn@7)Wb3f|ZqmVp4V&lAEn{H!TYmU|`uoIve;u-=Wv?Bb;aofa z)-AVo)9Fl6iFszSyRWmzJIp?N`P!Q$xtp6GE&X{RQ|~Nv%_qnn;raMJ8sGX`%n#85K{zc@cXAZx`%(grG-CG)Zw{ZS%z3=)4 z-khtu=DgG7X-ke;wZ>$Y*zpL@l1DFm{BmN?3A}d)1-zM6jr5(%j=P#Bd;eB@mF#8q z_KLYh$Y7M!?o#5$y>P(+fOR;eydQL^vUJC(><9Rn=kj(rdyxcdD-CU1>>Xo`&+EePjUEf zvftx(Pt$TfHb28J=lpb5@XXVi>HoBkD=j%Gu(xpbLjCUgoaFd@kG;Zwe{1bKTmOzB zWv1cHTTXwJwm&YIb>gHppWx&|pZ|9ED*}_&thwXxx$mk-OUJp5Kc|<7>KeY;91xYW zsBrVcG~Uy5pUiOj&##m=mv4^R=4mlvf`W|aO^zwC{gKV6)7#uDYIpvM$NFh!eN&>e zPvqPZGV0v&KBxWB(UfiP5B1HR`*wo$^c(vEwpqV0I(zVU?MBu7zTflqEGXXm=n)Vz|=xi%$8Z=I7HV)QVSs_#aeYym5uZwW??3!CyKQGrPCwKS`L9 zw?=LG-B-Wc&P2Cnt^8D%9Omr4t@>2b)jv{J1(zZ=9x%?mwBrAr&pxl)4%|4CyYJ_# zWeqJSwYfK+>^%IL`-aicEAKhhEAy#u(0B4_{5b9E?c^@Q%O71@@;Ue3|5m9#|KVPv zBEEumdlKXJb#!!W2@1XFvdr|#-uHnsx>kJMw$W*8`Bd-UYEn7xUM|?D-~4v>jmIUw z_80J_l{cLH-@4_m#u+oqU-f((<$PEDzKdVB-nRMFn=d~4yf)i!DXCw*cixy;%HKt3 z;-%^@cY?*|e>k(ZtiC#Ux5@mfc%jEj3g>>D9wN9i^1(fU%=i@t?_6Ep7GU1|bp5iM zv))Qy7Bnp|o_QnVLz|?Q+548#$1*=T_OE&4K38J-9{va(!?wRq-(B3av-8nZ)rcr_ z!_rK_SYGZ8?DlFmCofU`SG_~H-T2p6!JQEj^8E@*lO`CvW}2dF{D%ME=A}n$pBkT0 z=80M*#!|O&_Wl;vEx~f%{_kBIa@M?N<(*x}>h<>}*2K#kER^i;e|Sf!?|HVkUYMY# z3zv4)yH;Bt*Q@*T*JO43OqeUZOeg=K%(fSzneigigkG%)u&rlo{k+!1YO%Rzryu*d z3D4zBjusnKu3qy~Rb)1gd9?I*Yu?cPbykHe@&4U2ef~^6^WYR{aB@l9!8W0Y9Udio(&xDJzHWoZZ>J9`sz(ogw%&YZ#-7Xky5*CEy$@xS zUuZ3iO6EM8n3u-4Uby}8lX%|K)@zj#s@ke|y;ORx|2TfCk)~mlnD<7ppW?kQx8FaO zv-;yd`fv9|FzHg{li9B zEoSD2)en}f*4Xh<>)oap%PY%Ol@8CX6;3U*nXqT6mgMS^?h{9KQiIL8pQSy{xi9pE z`{cQEW$IgtKQ9zL;5q%L;H>f;o7eYcJ>Jsn@!M%*@cuPypZl_Ab${5pGV88Wa-r!~ z>#hTtiw}o4W-UD%*0?pzx;w{IBuw&m*3wmnd}4d6`SyHIT=sEo$J2SMc4?h=+IzQF zG-{Pt!IF|@Yq7(XX6ruxQ{(H?yp;bUHcjH#LE}=E^Oli@ z`D?z-pS=0xcMHw~lQXuzly;Rg%-dr)vv|W@JBwH$vm?4~{j`na@?5mp=C~Pd?tq zyLbKa_KW4Ur@w!{z22MoLH_=*Ig=vxe1GOUW5S(Rw|~Zo|L&`E`F?z_=i6|XNss@W z?r;BZTkr1FFW2Wux3DjZKlNsI#O-~Jx4hhcyo%A1yJF`f z5)!ugM5Ob=Nj4KF+7mD}guW%Lw6}xVoaa}iGPY<@Z;>a_xPP?JAhe0=g zpZyg@&`6()X-j9^1*6@D?}Y_lzORw*@oRtg&bUY3UT{gqm_hW^kBVbHj;OP2f$ zJtZR#yI(i{-jB`w{oyzj=1w`o`J=TA*rlC-c>^jvkKKyLxtokyd@{9_M6c z_*MNEk9qLt#MCc!pwZ?aM^RfrNx^g94@ocoWl^fPGg!y|U9y+FU-M?!T23GD zOFnm}TEh0%rX}C1Z_e20Gs~tmd)-`@-|xgx2Jt~=E_RPUws!ukbC3QT_pe^JOG)$Z zzW@I+rDn~0{?(k%@bR+SKmNY|rm{3%aN@*O3yQ3-<-AxC=Mb9R)B7p>a?V+{Xx>&s z^G}K?)Cf%h4K5l;gU1FZZOQvR-}s!`sp+{&-!}7!M%#IJ`*40yHQK~` zDoF?2W;^2_l>am2-3^D8tQ)2TJpcRIL3Oi!^7f_DOy}+f?P`1`d;9Ntj_XUoZ8AQO zl$KBTCQm=3az49h`FTUnUGM!}^a_u?y84H8-}Mh3pV%5VcYgZGt+8fX&L-&Ik*uIw%Y%efZ5YUg*Dty+EXmF-H7 z=dW@$1#SE6_bThzhUH2}(zjhRo#KDn%wbfI*@3HUlr|YP$(JJ~jo9SXu>e7o_ zEPPZi`qeg1cJ=<6+v~CC+&t^!|HAJl{9m14@b1oWXW71vj{d(Zgc*VZx2``We4R(m z-*wHNlbp+x!X$6E-I~7t*4!@@S{?74qD&i)F0fqlDMdd&j?p>*Z%(0JO26S zxk>wHS> z?&5#;|0eVM)pHz>yPf~@R(Q9BaoPjzqIWwQ zo6Uc3(V~-{&H2Xy?RGl;t(+X08?WxLcV?|!E*sO><9_gt z#rf+&PKFJa4+=WlD{8OX7hDj}en0&{MS5GQRl>UJH=#%Qu7#~Rn0I{cjkP)tJGNKt zC^0mN(9GfeuX%yVBG+`y+N{$0ur2EsZZP%%b#?CEF*`MF?Z;fL6?Y!2)6-jhaL?kV zJ8asmp=BE)G-4xtpI)>OyE-vZb!+Fmr+!5l>1$;Z#H%Y>Y)-3v=Qmu8H4TWqL04UVXA9T9e0W#nP@_#L^~DHuKlGmnpSSrqH6XHsq|mq=;|=WDMWy zi%ZhiW77G*C)qUc+x?heey?WsZM#}yhS+n$hF>RV&YH4i#-+=bcYa!xy#s`wz4H9? zZtC=@Z#rWxMXj9m{^yrBe~Teep5PDKhQALp_!mn^vwhOgV2+SYfBX{Y_a=&e~-+U){TR z@e51nvDfqW&Inag&z`>Z*f&eV(>#5#jI;YJ6wJB5v-_qChu&LqDR23{gKl?4rb_FD zY0ljxX;3O?ZGD?_R@;jug>#?F@2VB%H52})zf|chx9N?!PiEwpw47q8Rn7fxo<5P; zd~#>6+57!B12*P!qpMkeqAJ5O*wdDR4$M53TCRnOk z%7-nR)f?XzZE!sDhWD|bZdZ04v(3G1ohtGu?#lXvb)B}eZH>3j@tqQ`W1w>;`NyIC zrM>l1*+=yifBd>#=XrCN*|e}}U;bBq{KFIZiFaeE6~{jZ+p9eL9xYvYVt+u-QK!s8 zvsm}3Ph!^uMO-Y_FU?lkaD;!S$OWk+uH+^4CqDjH{%)?j@Eq6G&*B#z?fhBlQDRjP z-mm!3D}F)GL3{RWG2`7D1%}g{&LrfD>rw3S{1foN=yEez3!9V{yP=(RXF4( zquIu7iKeTww*Af%FS<1=B6=&Q_0N#JGpw6t=6>3eU3JLbd+jog$!pm*70sMG_v{;4 z*MHHyZ+72!Tyx~}<_B`??-|G4e0TNA+Z7*ro-bKkwNqW}K<47ycgiNwzVkk=nYFD_ z&^va~^!caX)Ge+2{^iu2nv6_VgNc*V7v9VJ9{!}p-e=;s)`a^<< ztd?JSuSnfet>f2@zy_&AO!0w7({v@HySIIMKL0PTs zmC2dCsfzvm1@cihX7ol~50H4bIp%`h{Vmr7oQ_@-5($raF1<&0Mec*&qW4Q#l;)c! zXf9>}zs$ada_1L4V@8(i| z(z5&VTca{JhbEZn9DDRUa?`eB|Id0SAN^!e|Ke_NXn5u1&^!Az`ljS@{AxSr`Pk~e z{gneVqHH^}W~aGzAIUs3J?LREt{a#5~*>>6Qe?3!= zeEHHd<%pV+(xi?{y`pE#95-(?(h%Re#WR#WHvCUc;u+qmswxTVyc(f4zBohUYqjEn z-khb{iMcJ(eScS1@0xt_z~`?%rm^J{OO^j*`3QRbWt|$hthCF+V`a@ArUPqk zryITgHq-N^H)u(S=#&>rXY8%BY~|e6YttU@a!9hTKU@Gb&+Fqn+6bxCfgL~ANy2(dcV~7uG!3qns*&O_r3iWp8D^>mhDpl zwkI<$6_hucP8gu=Z`S1D9U;0h^ zu;zvI&xs}%Z@UY;R6M{r*N5|{nzXFWvMZNn-Elw8qj7CP_KY{5`;G-U%@tksyjtwx zrYQll`k&9-tfZv$(Ocu9w7pq#;7cvGE|07w%aUHc=B%P;wr{Q*Ms10h_waZo!rmQ4$Lbp zd$Z;6DeH|_Zf{JM*t~15Otzrfftx8y*W8m!jsI}tVzTavJAJ0NFCPhWP85ANgL$1| zV{N3@iq(bvvK9B{8P1-gqg7NcWwlKs>h_BbVH;MJgm-LPc`k7n9;p4V%dyC@2npcF#TRJtKR6%m9sD2KJIFRH9%&bh|stj z!FZKhgJ)_Wj5O@9{rUfbF- zGiLkAz4!NZvPHv&$L4H&wtm^o@Jq#yI;!ra8Ew4yfY&%AXSS_%^z9cL^p53lcIhs- zmG;_v>b1*;Ur&n#j>xZ7ibZ`B=UoL5vu5a{u`dIYVt@wwXv+AGk z6tA0mrOtU%{-T4^dP|cz|A~II{hni4FIgKE=kwOO(871dW}Drgi)YGiS|9tSFfCZ7 zD7Q|%`kL zMSWV!#diz1o##vw>e{@xM}GYup~K4jI#13TJ}fD5+xe_n1{6slYzC#qob!*kxCE(8 z?GKl@ax|jgesI~666USeJxdMLdtdLF|0o(%4e)N2@b-E8_KNw9jBR<#Z*twpDQW3B z;`eux)EVnPp*tV2+TU4S8FtxbdFQ9p*)?1DHtoD=aeF(<)n9MkQHQ72RepH6WT?{qv7b z{Hk4}-kl!i^W^E*-x2b+m8u^4dL_lPnTy{!=)dmum$|>svX+0Ce7^Uye1XBf*OLl< z&p3C!AeZ;}o!u(^|9>A3uUN3u`k93*n-1^2>R*oF^_k_M8Rz4@-~ax7SIN&1u=$e<~;s*|MSy-8|~h)nzP-q zd#Pm0ZSbj>$u(%@bD#1b_np(vx87A(n&bnT*56y>bLRN`f3LPNuGuA-y~td%d%d5{ zNxe-Gb$?GTQ3>4lGFIJc=YFG$(h^ORW<6$psomolS@V9{~fyX5ch*z}0t zo&C>k+CjdE<*%5$^+M;g@Gsv4k5tqxTz1ZO_fOGHa{FdJWuG*grQ5}5f~!&R--_0Q zF+Hkl8tpDrZ;M-%R^4R@(arji<91W z&cyq@dh&oXU;c5#ugV{@-@kj(>ltaY`BB=m{m=Ydl-_fHEmGI3T))>TFW}PGH`C_Y za90S=e>(Zw#!tK1f2+Fw+o!gv?5K#9ba~PL)fJQWSx5YHch0$9I_dY_<_|CZH&$O1 zdA3#Ni|_IhY42-CjQ`vcet-6QA9wW14gWv#=-uNNoE-n<+d^%nk8#@X|2^fe=L&!9 zR}}yCjm1UZ=SQ+(gBSbe)OuidNx96@9g}!9j~{V z+jKgb>#jfO|F1~Nze+1q@7#wH=jGM^JN?XL=Nx*zp80xb#&4%RYQ8G@k37w`mVEDj zdwG7+cP0OqUB)te7w0wXJC^)R<^RW3>G3OW{JUOzUv~Yz)9YL#Q+$iwbC=GIIdHK2 z{DWP3UrM`EUqvl?`*?4dp2GScWfgBlyl@#_pwgjc*}g+%Ik9;UO(=2{Rsd=?mZCQ=pU;AiNx#+g-+2Td}yTmHvJFa(5-c$0aY+sbYy!777 zg6pN-pPe+m@iA=EgQo&-IbW=v?YHd5qm&@A_`g>?|0R3dRK^9czHw2X&G+o%-1f~I zey{8NU8Pg|U7^_D<(2leZ|@A3S84Uv{E8}CSkG#FXX~NZwKXdf<=y`o_3N^>Rr9O& z9)Gj9FY#W{#D_{hK5|v(?3exUSaeTMzdN{*x-Q79^z*%F^`b9Z!<*hcf3@uCR^vZU zu66E+D^(Yrd;RX2b?bN_$8RCbG3KC-Kr6k8ap z{on9>US;c=_WbngYu$g&mM{Hutn~4Tn(wi9=c_lTDa31l+RmV)dpOpK-)H`Zsmm?v z6BjtUSEa=~d44k1L@o8BkD-lJz*U~YGhLc9Y)_`#d2W5-o8d>F%G@0%?(^?l(IdyY zyl&nN=F8vr|6qbU-kWw&T>W%Z|~<_+Q*6?n-rhe_VLG$ zJCXBl{>f*4=k7AepWjD(;=_awax?TcT3$T4c>Udj{?kg@>lgg&^ppGXjzR8<-Gy(4 zJIYVKtvPD2HzZ|;_tVFs{~j4{=dswA@cvJr`Tnks4v!+$X)ksjnA#$}HAe5h_Pkp0 z$<6z3xxWiwH*`3k_sxH{sH6$=kL~kc9oJU5d~=@ho=w|xR~!})6r3oiw)OnQ?iVWB z`=yti5-ptH;Zd@(W{=Y*i``Zmx9&gEE?;MGWno80#|aMOhLy9$D_8ouwC&uokWXRB z{~s^+^ObUd!Y)vC%8Rc%W5oYX@e-807gP9e($60;{L_0SPyc>D|Jkb5>pZe_mfy4I zJ+QOb7Bq|F;-V5N8 zw0?hKhkN~mKQE^~KR^HRh1tI+-&^0&(cz&5=@6YP*!G;~?e6#oM?Rig;Ww-JECq=U;hsn-vdeu1Ik?Y{N3gV#o$q7vz&d zUdY)BN*e0PTlYzt*S4)*zi-;PFZbJk+7|53%A#3 zmFpY}+&HJoYsKoBhv#)Yy>grV##+_RTFKqIcOBOLoW8GkJ9q-+iTwewM~@mcWB#Z5Q&?YGYC`8|jCz2l^Hp^i_>x@5ynO{)C(bdu5IW#gU*dD{W7OuCE8-jy z4|&d;KKU5e_a9GvH)N!8PP{+Mqfph|d+Jo%VmZ&35=NV1VRJtJN?tL4`~Q!ZK`o{> z_R=p=K|w*!rBl?aK>fRYt!Lj(m|UJ&+f_dQw_bTrnr33?#L2IIW@i}6TnU){XU-2SSbEaw zrQ7$9XRWtA)}106@@xCf)#>+McB_e9mDn!%Yts+Vsz&Q|C0q03U)=cfoX=sJE(m_in};=IDX9x&?w0_PqOjW6|*$FDsf3E#OMpzdCH! zjGO1m%5H)B12b%|&p#o0=IpY?iM;JvT-a?sX&GC4adsrW`|63_eok5UE`vO&Ygf1|pNB$eN``}h8} z_RscD`#rPvm!JRr|Mu?hFSfn2djEZXjMt(sa{{6i^0r^ya$YX&oXvp%y{~II&qsZ7 zh(1;}<72B@wpAGa7ta{Btg~KL4#`mgJA5u12eoPTCC+oKtMcPoSKD@@Zb9qDbB!$V zE{$v!{_WjuOFsF@%vd1ywaytZxb-0!Qkvt6tI*X{p1btZQ;T) z+XtqlF>hDR<9+F^YRPTocfz@K&yPovUu%>$+)4GA6t+HYZFqd~+_>7arMuqU(z5;i zH(&T014BdZo9JCHGXvI|F8OU-HX|qNTjqsTfrsC`a!Af=o_3|@PQ{KX#g;DpS%+2y zx_|q1?rff9n9uR_uFF{+G@9b%`>fI)TYng z7U{27v;BP6l^Mx5lqUz>Eqi-n&;EjyuZ-@l^83GrfxY_e>-E#CKfl*6mtEt^Qd=;?Lc8UvcwgUzxrpb;It} zC%)>heSTuemjhwJ3o||iOMKq`V#jv#Nbh66W$w)PbG&IP>g7Ilg<<&3zfv0}owxmR z{@(|#+Az^I*_)%=OwX!Y`*Pv!Df_Oj)Ct7#MW;9M7j+446J^+U|}?OWui_Ofv5Fp1b|npQF>BF)=VO zXk0a7+q>b<*`LdLx#l+8F5-Hd6_~N}Gy?+z!-kA+b_TLw){}@`oDAFr*YDm{-TwE} zV@GLiMh1ox{gSpI*#e2QFANrOnwtx_=hm)XRTX>DY-)uHGXsNz<&2BW4W}DkzPCZ~$aL!BGtp?(lbSZvVEv-M#JS#r}FN&#KR}>*^hom(RQxC!4WVB;(zzS{_d$ z9nG&je*IN$w?tpR3(`2gIk4-y{(?*Af0{9?T2^_s;9S+|Z7ZTS+Z|q7cWmWN za2EBm%{umG%5`PUm>=of3=Vc@UN9c;N-KNS80OvhtoHLfQ_E-HGcRQ5+XZjF@lP}@ zZ|!8Y`4<*?uB_9(?6cWycWQ*8tpEPLZ`wzK+ZY(S5A?`2X!|XU+;Q~WzR){q+j~y@ z*fU|8Naz`(D;u{uzk4u$by!etK}7Dv2Y(`WE&A)*x@h+1v|gk1iJQ`=_*C+m{9k16@ru-`-R*76}cJyw2mZ>fUuN=SikdE}sk7 za$@J3Z1MG5H>OAIn-wzMBfz&#HGAH7$*g}7pyYWn`+WWVmDzleS=qjPvvzM&I`nwf zr_$Gq?=SZ3nQ}Gq(XX68H-ER3^Y5aT*G`8%na`i_J;7n|+Lsf=&IN|A`*oPhRs1K&t$g0* zj0vpWcKa_Fgx&o2c}8?dzKh8O_1LTLJ=uC|CcBBo9glO>XR+IJJ5GKwT@m<;L4KmsD5BpI*8D#(6e|2QFskUOc^dsq)^mt2w`U7+76@n+mL) z_&#Czvwd2@-;*N!#qM`*T=Gv{WV2D)3LD;?>AM!WnJ9=leWtEAoeXx`D%B-C)J9oN%UCMF{xo*&(vfTJ_ z`NEZJOWW4m==8q*balNU$oI;+e|zo)Z@m$i^?y@KM__{EVGl3lzQ_n>Va*AYfExbKTo#FUn?P>yV>GrS82!pefmF# zf#KYiRj2;PBt3q7+v}Y`|M91{3Q9S3y(_=*pJ!*95dY^+t4mWZRawakX+pEF(k1;@Ur^lj*Z|xAD7R zgAm#35Z{&TfBSx3{$9#r8hUx&;=9eC_+3J(Z{G<^?cIJgBdcKoI|Bp5gHs!s%I==I zXS6$%ce8YJMGY2DUwL5KP0464_42IK=57(~Z9JtFzBBKYg`T(D3_3`YVI7Zl zf}8%%)G`gJxz!J{*VXShyK(6kmwAGV-PM-b-rnl`GTnvoz?{_G>-iWM5;||leBs&3 z+J1Ff)zmu~s=IwVqtl+>6|!#6*w3~m@u$d?`E$UI=Soh#aJt;z)#ULHr*|hiw6?5v zT{vmIvTtpBwG~6iG+FC%CI*I(TU@){*E^l@E8W1!&A`CWpnZjFhx__T(9%_&;mj&u zhN))8pS3+NtqNVewea!PU;gI1Ps_d5fA@2O%FA-`bFWXg?~9oDi-Cbb*!fsOHa{egDt=D4Nd5z#wxh(YT7C;OB;A z{u)Lu)vx2im;V2$Z-4#p{8fKGothrEYr*{gPa=*UXJug6z-(N_AoH;1&m6V=pQohx z&0X{qS5ANlM3-`1BcU$-+Y+4WfM$D_tl62Er+d%piqO#YAN?Hg9BGcfGXxnaIIJuh&t z;Kd4y*A-t@sOdQ88Shg07`upC5E?)Ab zC(_?P|JcT$CojzN|0JHBI>l6b`er^)qo=krZtg!&%@PoJJ?^)a=cjdY&`RH_A{}o($m;ZopKgrowfP>TkUN!o6gKN6OU@Y8F>lqww=FGX+ ztz{x`aYg=mslzV=ro_mtRJ?!4JgM`T$=a~e3g6zFhS}4k>dj`%n)_-+XU2i}B-xb- z+0nHOVJ+o%E5jrI##KHQ{rl_;_pF(faT_1ohbm26QIN{Oz)<`qc9-P6Av%G{U^5U3{yq=k3WstzwXJm^mleSpL^y7S4f3qA1%q)`I=$Fn^U}##P#>B zS^ocL$3Dw%vYwZgz0Oy8!N|aH`^I+}TXhe6{qyN(-m-8pq(&^TBcrs{Qv0Z=Z;R_&BMS@(5m!;v0%%OpWMIp@3V<1`t8NKCB5Hv`FXovthV3vZDz1C zFzDDe$uS)Nb@P1x>xus#bN_nxy)L9^z8BjTghGqf1XX@Z`_uDn)y6Az zrvtSa5{^E$tYVOP{^;oRuV3?PydVBA59)MDI{5c8>dbxD^m*=;)Pc?0O`SvQfOQF}hv`_W$q$^MOwI$0ST@`mb-Fy2RyzKq2ya{O+ zyg237Q`5tiuXS%P$~yatXZkP8RcXtA)dVfrsru8{$olD553Ns+Cmu15XJoJhmD`2; z{ybT6?BD#(O-^x9RttD}YI6g(u8C6JTYP%$uGM>2?qNLRXL}(_^TM8dvn8IFX53%y zxOndmopVXQ!)NT=>Nl&#saDBI= z-&I@>TN}4`)f+=G*$XOrpUvvsmH&MH>+{?8MrU7Nr`%S)%vT)+9;r;`7iF5})3)@AOtmDAg1-HKB8mFd)~N(owZ zTd6p1e_W;Q+*jVccg?FWIz8XCK6cNwWAomqu9+t@Kk-_`vpZX#?|&a+{r=9T(|5Lt z3d&uda&Z;=re9{?p6m!q^PPSr>dEF=-|fUU*oZI`+*EwQSTM&lJM48|`Tk(}SHHMp z%io%Ezl-l|`1Wo4K2QEXSNB#m@7%fOU*@x3w|m9Mlcz0tfAYS}l_@&BW!qymiEOU; z&l;-y{$Rr^_1dhgyuje%?q~7mz&)QGTl${7)LnIbNuP_VYk!tg=`8z|=_}ScS1sA; z>U-BY==Hmv3t=zr9LkdYynRU@t7+)u7^kQg##3xwac;}9n(*qn?UJnc_kV8Pd3>_C zv7_hO+fNk_bwsT(XU#UJ6^qZ$7jXPt$tl|PZ);nJAZ2Nyo9-G zyMo^vhz>zyFoqn`M7nwdxNyh3ws2e`?Ld*^e4UA3vMDYU}Rbf2)2+ z-v{La)-Aisb0(kOS{In?5%lF}YumgsLI zD_>2(SlM($%X)ta;QkI`5AU%wYm;`(#`SJLn4XC|a9 zZE{|xZ_r=1MaoFzLPqwpk1<KN`2Tw?|0W(7%V2g^)^>$YYVx1 zQS-L?4y`>89ZbF~S=RF=)segH;a^s$t(j$W`mc`foA*HucXz%I{A{w~niQzZyxCiG_N-c|Em>C#tXHO=$-OXX z*2LL!U9~In7`LY7RVC#G)@n8yN?qP!^vcBgYGCk_U))b$&MD7-c+JW=>`luh2?e}YR5G^QA29DZ`vvb(!Yt&-04*?ylJ_u`II zR;^RBY~z#kL{}5j-J48*8=sNU)~VkfU3>7#^T|DKSF$|_=cr}NLCx_#%h{@NL(h5n3XX6V}r?H?}H5AA}C`?XA)*|_|| z{mJIPGxe&zcOTdpyl49!W_sq{ zqlu->yVu*6HdpsWZhEeJa_uA!pY5AnSwGLT{BrfhUB>t4Pn@&RTfV!;d)e*> zZEOqySCZr>ops*E$WX9Fm8)t}(CO4Fn}bLDr@pQa(AxB{LH7TqxsQ*PZ{9pf9MoTE zsGO$vLUYxHe~MpOcc-2R^6|PWac>n{zsa;HrkjDn7aR7U2(WB_f88M^Vqf!IE4%7= zkE+9s3ub9a-t$^(eRbX8>?|E)TetqKLtHUcG6%Z8FP8sr@_y(3FSapT{zvCmCbOX=HWgY{*9~!JAdc@^?zo2{BJn}L&8#p7ol9y zQ<*`HS4EC0h7AnH#``C!tc}_lC2bzJ_J2w7PyP>ox~uI}Jb&G7{rv0GLjABMb_@&* zoeS6xB>p?SyG+F9|M$lBVmbY76TPY;pGD{YJpXh`=!KW@^H%+s0qV+ctJ=xU(4c+u z=MT%;|1&>6)njI0u;4MSV%Xrb=B03#Po4MvpJ(fJ$~74n4kUt|@c*y({OET=3=9li zNiWqH+<)9{-J$YwSN8gqKWBVKM`hPKyzM3$o@A|mr&z!n1 zZ;pU_*BjoZLfk4>wFK1PC}>c< z)pK<5yoqH;nI^CLzV*}u6VZ%|3#F?|7nts3-319 zT-;H&?*8TXo~wBIR_h9d1aAsFxmE4>Mv;tr%Qq@r?7x_a9h&|m|@f(@#7N-qaQx0loxcQ2Z^SL!S8>Z%jVmpxnYtWmkw$y zUVC%pz6W`g{Uw?rUstH#SoPAOyR2<0SJ>W9^E~wDn}o=IUU_o9pv3NO{k0~0->%xK zR+_Ob_L>Fj`kBuH{Wtgt-_6G?#GwW0 znFaOx7flk8yFTT7z#9*(hb_lVpJq?LJ!KNF(Ji;%rUIFvhtoWZR!0f)E>YiabbjeC zUl~nPQ^_oDzSX`#Mc;HwZBu)b#da?Z6>&{tvu}I=Y&fQT_mghb=E*_pXXc4t$jE*b@M;&dGp24{yfUN~WSGJIRa*ax zJA3={wRbw($W6~aeAR4P$S*am)91m(MY{fVmH@$z#pzFrb{5Uw{C778Lst#9>6;H; zvAZf~elS^at?T8FqU&G}N`}3-bXGL)TV>@mw%y+|kNVqyN|POn)*M(MK5c(x>;3iM z1p4pkI*>R+5h$xNfU-7p1P0bm3chArCH?>U|D~5o84jpEdVWr?95nbged(sAd)e{7 zZ+Ts3WSDMI`|C^5bOr{7f=Dgx7pg*?AW;Seh7|(upqWV#)U9J^IJ}`m802-CHdyy8 z?F)#1An_De)#s}j&y(l=THK?&eEz>4yPtozzkDpe*Y$kev&mBP)?GYz{N06>=WBuv zU+&(Y^t0<~;M!^Z^yz4qGt-D3CoWTLP5TX0s>c4uvxr!x22<>@U8GHX9IAD${% zrx~*S#bf!svCDtkui$rk*0=SF$K{DlwxFO&a9w%e(%BZFlg+30FWNlC%v&*D_Uf%~ z`|q!td7<{zX`a%Jhpl9^uYgK)hOl{DXJ0%GT0D3D{$S(z|62Ic^~=}XTh?w@wtJGc zO21}F{CuTV*S59WneEQ`6jAnKQpo1dpFiz$eaW_Ky}nWT+~w&dzu%smynOz@Ep`+4 zWgOe;Xa9FgTG7;~zh!qfy_~Tx?$MdpcUDDL=Rdcd`tu*ibqhp9xvFND{622C{&w(s zuJ$QXZ~xrTt@?KPyDD?SSwGt?YojIx*Dt!A?zHQ@@XyP>OWxbLUP`X{=a;*>Z;8_r zwYza&OYfG)&kxxgJpcQ@&Mdy~nv0~~{)s4B_D)!EWz}uxUo)myznMGl;z^8tY8-hYoUM?$%@~?gMaLvr!M{;hL{B}`V*b=x@EB8{gQPaY{+W5|N zzn5FCuWpahv8_2NlHhe#@9VwE^SrFr25(NDe=T@%@X6Gv!S}BlzON2RRhbenb(Np} z()t-*dV70nzh+yN{jLr&JzMR3Y1!-2TBU^%@5<+VjQeyY@#zZt>lZy?JsjH}y7z73*Kc{3HtLtYOh{{fm0R^g?xlBZ?8($V{`v()PkrkB z?JfQ;xEH4E+U2|A>FVTP1%1DYWvn%)euadpi}(KnUtR{!x)}XsUhdVM{_=GZ^Q&HM zS+(xGRsG?ww@QA66ji2vz5Vr?@6M{{JFYFWz7jIICUWmv+bZvOZB~D_CRd%d-Fqu^ za^a4u+1swBnCb?(ulw~}R{Q&3P~qdysrBW+mzE_l)L6=?yhh6ynHordl zr4>jWgJ@9L1?$h!kg?r0A$Jyo(iCLq1v*>}8ah7=GlioHr0anJ3v|X8qR+x7^8CeU ziQs$9j9VpFPQNzc-TkZUSNs(R-Rjk#J!!AwdC&-O=;cN+)7IyGm9{}9F&orD1}*S0 zW3vsuXM1wO^Yc8V7wcMQoCC!T!|fa8{qrD&zH9nB(8`I>?L=k*DrZ@-~0W=MH3T$s`xIQUL|G?E)Pze+_ym7b`_`g0#IX9 zdj@!{IR50)nYTr6Z}m^+wuGuWwsdx2E1S})ue_^|PcF3B`dSU-!UJ-vSN%D!YG$`@ z?GrvwnDd5DuWNmyI>W}D-=Pyc*jDt^Zu^DzN(>s#I2ztf?90yU9R$aV4r_HeB!+Y> zpH_2-e7Z?C>MF|P7#(J|d?`ipySuH3h29XP-8bRs#lEn^_q>;b!^wN$i%T)!YIWM|x8CN>K}g0||{#^3!@+`qza>*rrrGZ$H3 z)mJDL*(-TIV0N|5RXe4{rMsnyuNZ*ub7Ls@88Io={5T))%3X_tmn}IayLOh`i|c#l zfJdQ^T{f-&jY9M6G+%x$(%EW?l{l}h<@P6+OIAm<-D)~4B`bMt#d^24>f(u6I=su+ zxxv%LX%j(ry)hg}J@Reo>`6;rfJYIkmQ*Es^tW`EYsS8NIt%2Pf~8T5p1*JvmD+IS zS@u-5{#TQt?=3R))h@0~Uv8BZWL$G`#HD(P`W9;f=c|CGJ-yCeY6W%ku1vQ{=jF}xDvkWhB$ewc z+r@JAiT>&XFhh=`6g`lJ%@(H_b6;`qGA%f{DS*LSweH=T7`^a!#o?#Q1shUBKUBZ? z)4Jz5!-7emk>}Ufr{4K@=5G7+te4N8E-!Rn&7-~S@#$C&kpFZpT++Q8^ASALHmz>L zd?hZE@9|akiXgc)1uT0b16#|sYHYa!8boI}ptKRz;6NJpr9uvf%>K>_>U(dIDrQ%5 zH2rzFEM5%cf^`ww&b?4|p10JYxO-MmJ=3de8U5;44=tWIF|N|rdNoK%gLZeVx3^xFZ>EVFNje=*yg>T>LP>z*YmlBO;EwO00(%DM zHM7`E&{p`i#o7UIsQr1g#Zv_=M3}>RUU%vnqDy6etVjsO;$Qg0RKx_kt(HsZ1(*L*j^3;OVwCpGCqMtyyxmFPZ?-e_K_7w6clD!ZRPHu0}!m_C_YUncJBoO>{FYwDcal3gcljn-T&nd}kZyKu#lvz50t ztAcCT6pZz2w~kF>P|$?s?HX~$2qxD3?dRf8RP!-tY0CAV-dY!X^6mLMwKtxfjR5(M z!Ml&T857pgKu;jqx%-=LuH2Wfy5~!Fw#WDPufnf<<9_}q@Vv+Fq`R?Py8hq>K!SC3 z^E{BUxoW$j)0#t*&&S0Rd4k_D;v-rSr~KfiW5xZ=Gb@#PFS zhB?HuChuHhyvX6RUGLKA;h@z}YbUBiI@`VVS$>qMR%BvUwhrs8@1C}YKV4n2PMCAm z$@mrENG{;3Hc#G|WHs;CYVbm~4Q}pLPfb-%E}nN~)465O#7tS2^gZG9Y`b;m@yf@7 zl51~YUGb=PRdWBTm6h|4sr3E~&YjgfYgOj;9Ai+R7Fbljzi51C^Y_QD&aqisOVjSD zoCH-ZSSO%FDAD*Dd2P$ju{Mf!TT^yOc4j%xjX2QnwYb(8)J z*W_7Yu|^A?-mO&K`^9MT@)HMCzZhCyeGbkKlQrKTyvw~(2Bcaq+f45+&+7{lu87^4 z9aT0{RqFDVETd_0(-vH@n|;^l(rGtPHsCS`r&#rkr7zP=t}I>l{CieOO2ob^hS?|7 z>q90%I@918O(UU@$@?#KsD9(LUwE*ufv;zaSC~t1*wcI9a%oKoM%(Fjgb;(u(erbs zo_>0&w(q?XgZF|5-!J^+t~}4^pbBd2UR$rd^Y6^v{I~Z&+FuDL1;Kd)Ja7eCxPspF zL@!31AqfGr(1MtjD@^;bXA7POp7&V4XW8Cxa56iS=myDouy)zzC64PirbjGRUTJSD z=ecYTd;8VLCo`VhTz#>5u2JzeaFB^?F4NREdzOE3#*!y{tKWW_70bozVp28RovU5d zvv>Q|jI4zDizY3azJ*^~B=%Gn$f5_IHZO7X2aWMuT@n}3OTPyX&z>it?#8^De71p?L0 z^Oieqy#|_=f|PZ7o}g*+;>!W~jk+W~{dTRc>vjuZ%&n^_I@! zbxzG$R~siL_P#63wkmGZs|pcb6}Z-P-Y)g^9uUXGksq<2Wx%d1kfKlXcg@!PjDFB0 zr1kGxmlDdSJ6&w;ySVN~({E7NADDXjnWU|E^IhGnth|eVor7-A^P9~@xk=>~uKT)r%=y?2VuSf#RFPms&Z3k+5Ow_-unBTKZYtcM49~1uBw_g>sHQcyLsRmC}COLmzc)(J^jmM z#qFA)qDQcI`ESs=Lc=Hb=3Lab%}BEcnNwgfdwSlp+nL5|oSolR9msyQ<5sBc&lM3N zpb;j9sT*_7Uj)siyxNxSKG&phNzV-N-pnY|ERXdJrq)*jCmS9H=Zo+aPpcEEw!|}s z^=7SAH%|L=NUDFywCZmaTwkY&Oxs`WadqF5OBXJJrZvB3o_V$j6wC=rqcN6VD~ad7 zkqkRrZd7)krGW=F?6&$rxgf)nU>xn!Lbvm8LfjAfLh7=o5!;@>*eZFlH|jJ*EwJ9)0`)8XdLNwRo{JM$h^cLj&u>-5dvsir2<(zoW|F5T^s_wiBvX zW^9sM4@y=RH^09BrMh)@zSr-+P+ryM8{Ky*2SL+uBFPx*8KbUfkJPT=nng^K|>& zt&nsq8FNf}>$jQ5x0Jn&`ui#T|F%0%W5m|&e0KHH|8fuMdmj(($&IV~nR>V6vTxMp zwBEF|v}qf5oxYwO_gQM^-8|RDf#4#0gT(8+AIf{P_ImICb9Mc+-BV5<~>}p>SGDb%{&T z&eJ>AtO?4TAKrAn)DzquY|!bvQm-L9|N5yzk3~T>cn+uZKZ*K9wfuiO@09iI4f-eY zJ3^Q<{qN11>2kGS^m4cTw0fEVuB%UMn(_bOG?lA$4*%cIGe5uA?%R%g_Nzh^ik{uM z-W4%vXX*BNJKn!7Ucdi)Wp4eK6Q8bb?g3|LhiOk(LMsnGJ@(yhMf-b;wfgUVZBPq3 z{%W_~0;{u2j+JFx&|Z2riMfQ)JokTeZP{&4+p_DiUhccs?k>;vesp`2?yIHuybm4w zaIOc`&kE2~)pOl5Wnpyw#DB;4)n9ON``>x~fAf>Ppv_C7cmMO_->+KvhyDML#M(Ts zNxMDg-}{{x>N%-yh5oxg?I|8-ivK{Iac7E5$}{Pz9}5F*?bpA}{M%nU|5Cu3Io|`8 zrTVTnU->WW1n)%5LmCsRfl)aMOzt>hpU(M`2R`lI3 zWN);2&0FVP&p%JfdVh8Ly~`@!uk_s8{r#@h*M9j+?#q`*-`^cRf5&@SssDSvJd8Q+ zzG}|EiY2EmV2rTB%qgk z^NHN?+&^>KE55r?wrhlMu2eRSQ=0fI``GJN+5hYK?);AR-2UpH{=dENuJV6v^*`rf zeE-7n>bB{6H&P?7&G_D(Id{)P|Gy@G1Q{5Z!#rIaLqh96EB<{X9{D`)-ogXv`B%&B zKiSFta((r+{q&AwClCMXct7D8Z~bS!znM2(Z+9Qp1{F_{LaG17FWT3}X8rn6A6k3t z;xB%+`184+C&fw4nvk@-WYw#?Rr#@>ZuD;7=X%}#H*>A}{lfCic7M{_gt{~;-lv;b zZT2+JsJmVHf9LG4GxgK11i$&J^iTWO&RgF&n(|+sT<>+;Znt~1abN!3$u(;y3-z)#`qQXqOK0!5xUzPCSU|n8 z!Girh@-@%iU;Wsf@2$@M#hm&5RF%0k&t^UmI{QcY<%P!eT0hL0rGA|LVjx@fWc}*r zvX@V;f3=?f#-}i?q|mAVcOE%*e7kPBECU0>fvykj^1s)a+**2hdHv2iOJl;!a;x@U zxw87XU2XQc&*|sqU7daJi`v;UXLJfvr*B`iO6%{BXRer$Z{chnX%5bwY`XZyUXr_;~BG+ke} zHLl|0(WiRPH+`6uz3$@9&Cje*B-`?0-M%cHY|= zy}CDg+U_}``BRseUfbMtyl%zihv%Q>eqR;7*Gqrzmr2W(FaP@Kw7!095pu@BqdC_T@jOrMWxLk_Or0>FVdQ&MBb@0JL1*h5!Hn literal 27692 zcmeAS@N?(olHy`uVBq!ia0y~yV1C8Gz?93u#K6FyXD1uTz>xjf)5S5Q;?|qJKevlq z-TPr~{JpRH>JM$cw)x)dhq2)wcKQpgKm54%q6Guj^EnbJ6PTMAcb-@%&G%rl01NBU z@O*jKJ#HyIo_%H3!tFDTRQTHTb{uI?J7Td_I7^5Wcf09&1`u$F{$ToX|9Xxl1u)9^>2RMD!e**f2MZ~1 zAXs1KLX;_RU}0S-cmDGK@4n*s^QW-*X*de7fRIV>{mHwnfB8Xp0%xy$xBgdEUR3T5 zvu06F&D-qw+ndw+F2c|LM#USyx^{iFUBqq&{WVQ-`%9-pC-kZw z51FzfV!z?ame4&sZ`Y{ZP(E5F2zHr(Xv>8!{~!PVv!97AKPGbHzWTrW>i-_ARnM|3-1e`y+cdZ~yak-F5qVXzgziB?UfaQ ztFo@Gdmp&_dhGqXmx78vos!C#y`x@f?QQPw>pO~=toPKtUc29K??i~bE~0GnFWeP= z`McBJ{_*~M@;83m@^}CD=*)ZD-_5E^SI7VT^Y!QYn2$I9{r`1Vo%#9y!mON6J-YS# z_mxh`Z+N@>{YuRo)uT~*axe1h?^>@tR>Wg%@<6T`5-}^TJea(@TB+9l=|n?)nLnRr z*{>Bn-Q;QgY>HiV?N#YoX7;jwe-6h_J6&7;)W6Un_2T(A8*GC2Jb1ZmpYO~&(mT~Q zJ(+NgEpBt!9P|7s`!)vN|EjCp)s@%0%ggheXVT46H!sevSiN(OM|Hmy%YOCv{c2SY zH>UTSD}th00OYYdcUNEheolSa-fuTwd(YedYo))|h3_|5voDs`xN{zzzxYny)9Y9J zs$=zSn|%T{?c4o&Zq%ik9ql(~*euSI3=Ij9K4fVjT9PB3d&k;xS&@^vpDlA+wC3SX zuJX6)_SMh;octwL?YzY=yW9sx3*U>|nm+$m+kfZ(JLUAhbxuaL)Bhg7CzUI)EVp%E z@2Q&E8(P#})bdZ4Nj!M(Z&TpntG`)xdM_xp-KFvPA}gzn)9&8dPs{FoH~J-a_qW`y zT8EVv?DHPyOL3l;1N(_(;)%Pj=i4On#_E2xuTOZtLw(u5{`vC@-|uTLuifi6XZrm4GwWY7ZVd8~`T5+re&+V-mq*0Yj=$Rd=3TGPt_^bnJ!j7}&yVx*^Io#= z_|jsQOZF-4#ZQ05En86_o#i!;bLt8|ZQ($_giC(q&t^VQ%&0yke)e*q8az~k%GaNG zApCOolO^r$@BjSR8UOF?e!n|qZVyxs?h-ejcCq}rmG4REeo>my!F(6VSjAN#F|D16;u>8a2@4f90-n{#p%j*{U=`XKy_~m)i z+QA7m>4aNXe=e8xuNTMF=Y4+7?ds;6@V9>7j+xqteu4g)Tjm=<%ASryLDAQ{1@GM5 zUS2W_tg|U&+CE{==6wa=AVVsfh%Tid8k-a@Kti3P30~wiWeC^WH$tpY=$OV2FXZ4# zv1vkRhqDlF!NTg8Ve$Q^XDJK3eElK|WlFsIxHiA`_3QZmzv|VK7VrBt&yD-2>z`-l z`#bjugVR1wVY&E!S>v=btl}{rn3b$vt$tscKW|6PBc*?z?f-8sc7!FRg_4U-mwkD0 z@%jAvf0-^hSHkaK&RDpk<55r-cNfg8n*yHV_y7OCmWqgrz#MYwm)qq*J@zF0IzL z|9a*0d)?f4bJbYSZ?CenYwcg}l%MnK%8NhV-(@Vn{R}UQ+4?(bV^PM7YWKVaPg+y= zoE3>*t^3nw)vvhyT9AYibm{xLb?bt^%&7VNEhzK%*~x$Rzl$w8rRn|d>-9**e|&9Q zBYhuU741uS+uJu|&P?ukbN@~6kNf4-DY}3Ev+Di(72NIzXD!(=p_>=b5knX#H{S+@|{1rc;`ZzT9o``^4KfXWwjl_W9lEd)w+#?`8YV47&gI z)T7k}TuLw7K#8tH?R9l}`ty@nK0@E>KC3+6|L*?MYO(n>pB`0vy_2$SdVTc1pGEfC z>F;-@@7{f=_TpW~%Cqa7uBGblczA8C*sJ|n`7&#adOHd~8rT2->smdn^xcjZxA*_r z-tsFh@M`+}+Hbns?-aGmCG|$g-w291RrP9jV3_XWsr%OG-&h}cOFHWD`WGjj&f&e& zlx+2R@1--_g&&0;J!|}rpY>al-phae9C4frv#u_44{d}bpo?9<-c|12^6Au<*gsD- zwr+|(scoR~@{{R$fuCKMW=*;$v%mG8*J_dQ$N70}`{r*>UnH?h>tFS!$?3}%zE5m6 z-&Otii*3TaF0S3($4tG_cg^z8e^LLv`pDw1u{V!t-mKTX<5X+Ex3%%qqg4+cgY#_1 zvCSQv3Ua(g6bnkV)PuDBz*`1@`mruSu_hHiBnw$EOdOvsXTKy$=N)Xd* zt-|w3>8+civnHmPeSh*R&XxI`)oY!^xAy-&_8+Z3x~WjQQ1kUH8{v2V*M;2|&AuLD z{cfJ(p3sQHzUxC5ynlG=(JD~9a5QDu*7EPzn0jXFtLlWstG?WQ84zC1pPQB8HcRM! zNo_e#-Pu{Df$!!u?K{pN8~Sud&L^L^+wN%(B32ir@m_z;_iFdARdXjy_PM`TOzYRW zaItXKlg8leyrpGdzr6iF6@9g+tUV`wXHQ&uMtE=Oxp?(fr|A6LH&YD?-$s?1@6Xw} zWN(^o>#L}grPm|8y>yG_ZrxM%_K53umM&lASF7J^ng+$33Q_O7viaCoyKg@huC7z+ zdUfpC7LoGk>V}*J{c+M0S1sQ=<#PGne-AE%?%y;+3tFH>`QC44%CRoqCRAJg_Lg^! z=KA+__WQS;b@?9NQ2j2@_1^8gMYAG}FaAG$!|uyowOV121d{+~Q+7opn!@kclI?Ti2Wr}SfguGh+mkAfDxe_;)-M_*X~n&)wU|MxqrhaUJ# zOB5g59Gj#h1uI}Bf_~j|o9J?Xax)}pISPcn`u+3y{Qt6xVy=WkawgQEBLRKu>;Jw^ zpHq0u^7)+R1>1M;>+aUjTe@QbOu>ZS{F=wo_kUg6?$#?+dav^NTz?n$+OK=xofV$$ zALCM}x&PEpYdgc2^7RN2QE-!y`D!VZ`%obYuevV{=SzY|% z_biSJ-ZQ+gX5a~~m3J3#xy|;AuVEiE!!JJpmS21zi3JcP4f~iEyf=OI`zOdCh!%v5 z!|GSRD-jYr>9za6e3MnxFS}EhX;izR>{gkml&ioCYla2y87>smeqUp&tGPc*dY!+3 z@1^g8%KkFeb%)N}+&j~CwYbhsvrre&MM{BlS4{EGW%we?P`iHlzW%St-+swjUpvpI zf88+5E~2X7X+)F4E8&x0V>7;Nk+jW>uAcF(yV{@vtRa8FzUX~>>-KuADvT4Xuexda zZrUrqPoY~S%BOB9t4)8a+N5ylYWYP$y{T3I7G3>Z9lo^t(n0&OJ1llP7%!AFe6dZf z6<_xD_pVJrtG21$|F-Fl=gWxjJN6e^-{-s7+c=s8-FMaMR=)gMEXMTJoNlQDhfc@V z&NtjWoj(t3{rcJa`adRLtEzwTs#$wZskYpd?nkNlft9J#mcH8jW$s<3DYeYjl~Zq4 z3$X;|s$BnmW>ILL&wR^Wzu(rrKN_%mhxOArre(9Hv+wVM8tCtN-`OsUldsonw*W zuX_d{f9-u(^0aGd&9XYyvTwXoxMr%!`Yj8PI#F5}dGY&$>whxr)9!9dKAyYTEj#h_ z)?KYKwXgD4zFD&8)!QwP93OLSbble*q@dNO_2q9j8{03w3o5nSMXq%xt=lZx5}FyL z__cy-Gc+eN!}Y@S{+o#9lb=Ysd8*7tT?bBkLUw(#rw;!Bsm zuR8SP4~rv@YHfV^YuV%d^6vK;Z@Jvh{T?c^GimM0{rjSQC!G~o_SEdWPOG5wcJKGq zZ`0Sae%<@j@&3m0CWrf51u_k;-`!AGP#{ptp21ve{&KOZdFvsElYuh(^KW0=$G3F7 zweYK-+gNV#h4(+X@A&!LGw)y1R`sv)EsB=dxVJLdRgd@X!%Z3=gPX5J{xwT;`QdSQ z(I?ig1ulU{YZgk}P`kpgf5ME-={Jt%Z;10gk~u}(FHYzGpWFLav-F?%!rfMHHsx%S z>TmYczmhuFb}u&A;%+ZpXumL`Rpisr74o51x>w9s3fx+K<(&67RXvUDKgFNU=+B#I zZv1uM#B9x4`|YoGT=J~1{BWw6vnj*R#OFS1_?j2iMNf*q$Syeg^{&wRfa%+on&0!< z*r@;L*0i|o+pCxrwq0Cuvq;Ci(`aW$PFF*{^sJPbGqYnCE_2J3S^U0=f3I@x$5+eb zR_1U2)>PVX?q{KON%PfAd%igW)!+8SKJlFV`&5+A(wBSRpDX&YsmeXq?$Uv8pF~c6 zeK^T?@B6sVBDL4Qf4Y5t;_K5c_x!z1ZWDhZ^|#>9Y|r;gP8L5kzh|9N+k5Hvx_{ld zOIzko12t3HChz0k)V`3vw&&~nf~h(G4t0oBX=r~azCyU*V{`;obYPY5MemA~5=itis5%E2Trtp09eO$A?egAna zzsam$?%wz*d#(KLw<&yIou*uo`YfX)W2>`6@TbAE`n{s+=Ow<_&Ntk*aFR^s(qD4n zXg{FZgfO_WoMWFS)JDf@;f;*v{4t``UR+?^hk4qd=~7 z@AdM7TfD{of6ae?J@9^R`S<;NSMMKudVZza{jd9s|Ew4Ix^$xH>+0}F{`DJ|PPK~; zos^n0J9*OVz_KrUCoNpP>duNzlQO2BFDm-6iVJ4{E1EymX0dh2k2tFjeSD^#k$rNz zr0zwW{>YKKxh4Ox?{-5&cdgdY&2GV;dgjLluRHVO$;?+@W6!@aS3kcZ+)}GjE$sf+ z=B_K>*TpCvI`K5{#GIKHwb%8l^kxU#e_EKi{Nm4-3y!uuycT)iUzKA~?qbbfdOH$6 z?YZuif7Sgy@8LH!`DQP7CtaO(w5u`T-u#bE^XBdAPV1Po`psSU`-*QnmA|gLc3|~B zf#~RG+`n#w)xO9|$Vgiee(!AkhIX^I|Dn>)o4%BBiiz&t7+$w?;p#T&&Ic2vEGco%lGPEcf9X=?RAZ_ z#%Jw}Rjc^+2y=fr|DoxVX8f6_Tv7FL1xqI#5dKkh;lBx=;AgA1Pp&WD`$o25(nQIP zMh`wV&XoDmsm3JivO?XU=GY$jiM^j&82WRwKBj9e)lY1D*PM0v#)8s+qFYng*?;jd zoV{Lt@Wn^t@^@AH+-l9At@QqXPQo~7N}T-B_`m0hO22>b|8Q*TD+TrSK})~eu1mjr zJ#XpOe<7TW^B4MRGyjsyQgvTkx$?{QtL=b4%aX>Mwr3?q!tZ^R6Giq~5;OGY`_#`;qr2K>LS-zpKdmP z-gBk0a~2#hSm`=*;p&6yK0Y`QochkvbmB4pd4_AR^xFS$5U!Ql?NQtBGtcq<#c~FR z`-}+|uYNCi_ojZ`|CJ^`?(^ErzP9JRs_o9B7SD_x>?lgwv|zc`=fEdiZJt_1%L?bO z(zCw#>eL;snLp0Ro9o{%`dFiAaLcqPb;IGf^?vhYvJdh8XK(*-;c7r1@2|dn;l`pu zGw*}iI9vAbi!VL9%irF%;>(K%t>S0Pzt~>ht+jUfx?RSrO%5pr8Am-XnGkwbkn=_L z-Y<72tY`zZh8PS)zWzOV-&T2gebw{kP0at6hR6B4-j{Z-TGq6WdGC9M3o*6t|36s0 z-Yz0)YMjp9-&ga0A3d}=+O9xMOXd5s=&ND84g0RU-oN_e$7BEVvgU`S_TDmm{ZW0} z_Qm^FcUrCVUDC17`SO?8zIPweQ%j3>Z8^>_%5>g4=$?4hrx~9v$p4&kI^ie7g{EKo zO5RVr|IYT)HR1Eu7Q7c#jQM|JnoJSfg`!`2kNW1{t^eP=-=^e6LDWfOh8NYmzt-8z z4B~kiCMUk?)$ac;29^m?^=}%!P1<@)ep;^RYWoIZhA990-~WAUHrE%}`{2?37uE+h zT>t*0aUZjZV&$>9Gc;!Fr_6O{+HGu+x%YjfsdU^+_wui?k&nObwr*Zx{rl53;fY7h zmaUx0upsoy-v7+I@5hE_Rqu>nvh~Ks^7Tots_S2``4SWFId9_b>f1G`>rYlbt$Diq zW{s+MSibbHr`&OY-&T9iw^+26#o_+N@`i`Af9EaFOyvr@zC+-P)BM*rO<(P<4WF>_ zJ-goquJ_84JPT64-o5^gd)|bf#@iBihrLzb${jpi^Hb8zn-)vnU-bO2Z>9D+{qR*k zzZ)su3#(tQbkU|#nXzHt;`a=P%U-Oq{kr1+7RLXDjDo-9{H7YNDNI+Js_p&CXU$4p zWk!elt1pyq{d{}H^}dMP_trc;Ss~5-_3o6G^wP!Uvewo z`!@3DHME_xd2CmIAo%BsePyXyp5GIhmDb<2DJflI7j`wM^6N{k7uF8kFMqS<#hnVT zy5`0E>s{`et{vA`>QBl7wb5i5YM-xM&G4dn>MuDNr&p>gA~+4QlzQjeEPis(UFCd4 z=liY>?VTodRX(aGjbB(Vcz^NNzN)jkUjH@=IWkN7TD(#E%PB9p)%~LrQciujXK5QA z7PZE~q|Lv80o0WC559lc=}pzhn!YLo3R>I*xtd1a%M=y!WkqwW>1d_^M|eEDa)G z|8BYL9$S0%R#-v#MV^Zib_c-?Y1vwKhx?Ceq?`fPSpjjt z1ro9VVOiZ}?`Jx#oDg~q+(LHKN%_3gsqHl*)Mni^?}b3Y$IkF&Z&6EBhsL+kDYrK{ zmq>OQRC{!s+t(PRnRpWFm7p&b)Kom)UnyXO|gXk6gO%wQt#Nnf33_t-g0L z^b$kE!|67U_n7C@e!rJ{YWDIOrz5ppn|gn*+kC%L^8MMF=OfLJGq=vyejgnu^4`4R z%GcT>Cxnmp%{M46%TK%biq(6auV`TF3Xc$Vt*1teCL#Cdu7B2Idrf!Q`?9ii`(rxy zaZmqHyExI~YGKs859&=zq_dY_ugLh8*}v=Br{^7AQ4$&p?fy@gvpV?c-z8t)FZ^2{ zm?>L3{eRMu`q}>_JL~V9TN16H7pxcD z+f-HBrEev=^S1aW*4v-%Mt3Yav;AZRZ&~!}c`}tQX`N@Dao6sQG5h&9)KpD2`Iw>5 z)9a$8%ojAQet){R|D?~tOMbW4#VD3MdtD>d9{RpI;DV?o|DBvldC5;PtNrfBi8Cya z{Tf@+Vt((g?6JPt2c|M*l)SHYn4A3NZdg!ypmCb!i#Yuq=7p`7Pu^WxRcE*O`@Y*p zf7+H`t4eJ)+WY?Bv}O0ocQc-nZCd&LuI9nGY3%D>?z>VR*jKF(W_ix+n%91@xBE`4 zc)!iP>uWVH0yKcds69H#Z=d@)m_p`RY*Xw?)WGZ`6?a429snr@PayNE_@exM?-fXCnW-sYmb0Y5aPp-_9SlGHF4?hja7RzW1{JTK{-c-2eMa z>f5?&cV5`)a6kD=tY_y(u8Y35v&-)(@)$CD#6$X={Wjm8TwL57zeHvcSK!3p$2~Xq z#%MMi*LM%TTYbyYWJ|rq>)mCcTkd_YQ8bWq+MW5iK2cMm`u^NQGxxDA z5d5VV9Jwze;e^-DAO_zn-x*hWdCluFtaOvtmGVh4R68&6^{&c`F3IrK@9UUX`OouQ z_x@no?8)gywfh9CPAAr0-@V;C@K@f8MS9nN=WW%Rxv#xmm81Mz+ozd}tL`UnzI6KK z?(!=e&E;;L{8)9Lx9Qz{#;+okzgMMKM||D4oU1tuR7kE^y-zwl!N$=))SNH&>a#2! z-*6$z5>w$Ll#(TgmlTK@hirmuEayS%z6TD-bB z^6RS-t9uFYmJ$jUlHMa6kKW(R`C&(NlfzqAqh@sf*~42n$rZs4?ZN zX;R7u`PrL;bbV#bbn6|pRz}Jlb7Xq8@6d1VpN|aA)cOm)WfNhTwe)@c-`l?@FV~eQ zJ?ARCJndfX`}`Ny2QIv<^`8-yY?8K)b&G9hy^O8%}|Cs#>Jg)@ z+f^%ReqQa%2LAOjs-^CgOT2#^R8q@4C-Nrgs(Nqs)K~m}K1Z#vQNQFpZ{qIP=l5}L z^R+*AV6n{M^HwL*_bgwU@CV$IW^nlA^Y&NXnS0a1vR-6_`QPa`MY z6BfH_v{ha6RC`hNuXSaskDDF)f7D@Z$j{t^*D}6)94)$7n^xg)fAQo8f2Y0JF80mq z^xdmvr#6Rw%Fgec+0O{7kuR1r?0a^*=EbU&-);TwD_7k=s`qNzyS{~fh3oBamq%{@ zZ8Kr}hcetuS58aDl_G|zj1Eos$|rq5!VoEWSZH`q3-+e4MgTA44rW zD1xNcy!V}9vFXvB^3}^Na~7Ta8tZAg@s;lC_ZP3-UV3i&WA&d`7QA2hYD!#j=Gzz6 zuo~L8CTH^1!?FUef6PpOBfF%y{0Y~(0_n-=XMVjCk29-WmU8B*p~#E7;SpO`cbe3F z>Y2nYKhb8fTx(taWB(Juo}YL?%>+;t?;L#p^}Bah&;MSRmT7%bJF)Rw`}}EFzKA}) zaJ4UBen~|~`k4!%PeXNUZRWgqwCsAcXy-~5=G_s?=6&zFbZqmhw_p05@^kkE1Oz=l z>>TcFX$E%U;fVWF^IK-0}85ny;x{q*lU-mBls*lXEA9j_Jd zjoL3=xHzwC-|{cq`oH*IRHuI4XKqo+28t%e3*UFW*nP5UZoZo8$19t1qwnvPk@zY4 z)c^DYshwLR=i6q^PGp$5E$8~A$&;fx5*t^r1GcZoAkUiCU6TEG_Y%1YhEVq zYNvKVFnj&sxX}81@!EYH&HG;SM+b(ja&pyb`<|-B7nF)}c!aHAw65l~IrwuDvwvt|og~M-*E{a7 ztM3$FJpHPAfseB;D6@bXaeNGi9qw;cndb1#Te9}LoO00QebasCajHFevH9tO_YM2B zf87(=5d>;J{kq5XdEahlr>7ULPFSpM{fggcjnDnBJd%e&(e}OVp!}IvQM-Suh_tO^ zf?8~Fko%_D) zL`1cwFK@}{*83Nox97l!%M7xoPM=?ThBgbd3H#=zS!+JSM+(<*SqJl zKJI#+%YSayN<**tdv6~7>LRYX*zJ3D^S;~1=5JoLUHbCUH?O{5u73L^J~ZFy$+wAL znII*!L-ecNk9Xf|Qa;$YM7-YEJpA6IX9f0q?_9d^Gj`qg*lC&4J2wTrQ{9|xQ~Q1Q zH-CwVXRVv`;x6awz5r*S3*`(FLBI5DZ(J__xcpZ5+gTf59lW>c-p|}uwfgJd$5pI< z6|`>GjvosT{JVU){Gx&Bn!Q(I6u!u|_3!JKsC;zeqj1`}cV~5?_9mR%x>9MCfN19{ zm!&akpb)Rk@7lL}?zNd+U-z!t`F>%n(2MGn(ihe|^0nepwz+Qpx30-8`~66cM-CjX zvzNU0%ktXj^T|iDw!G|1YqW3kO27N3)y}i1uihBt{fURixK>>DVQ+bP`^Lv=1xrEk z_hql;ue|SbrQ2FwIfw5)Wwp`l{cfxEdt&SETnH`Z-!(}wSz_0!J+HQ2K7YJ$oB1_v zgO)F`OEy^;{XLQFFK27@!}XNnDgjYT({nTKo}S9&aG&wQcf~JPLc`}abLyH3`4zBB zoWpEdfnD1^Vc&8mi>I;)5wCaqr2bsgsHpwaixD(|VEs$3b@nA^J?jPUORs<5ey^_l z>8si5erJ2+%!3OaUildwxA$8!|95aL4yv6m6#e>lxIX@tZSh6P=YF!K=UgY9o_-gc z6+qRb!|9j5zsTze{-0~LIQ;7O;&b~YKzR&Y&riEte(}BC+et?o?|nBuKeuZiG*dX7 ze!08n@$r7|PJ3p!VzGF34O26x`>#KgSU%kWtpwY)?tA{eQsv&=<0Ubd>aTCRe!n7m$L_=3^_6Rl zYPVY*W#*6kyw_5-wm&fLi!7vUSP=Vlul@hx%vbg^Y~HVYw9dJmZ?&|H<)@$C`qS%5 zs`p>{E^A#LzU;l4xcF-qqt5x!i(akVe{EWws;b-NcQJ}HVude#-;ju zb9$op&A*eh;$q#I&DS?Pag)1LzSZsZxr5r5_U;w5m*RP{DQ;fiix1%|&7H#P0%hOv zLR}u^a)18czn`C%pS|_(OR?dve^1`eoA^s_Tm7$@_IGyVtu`rDww`}Cc;Y_k&k;HP zZ?*3K&O5pKje3Vo6^ zV^;t&KlioQ+y1fSg9^T@vn9V?GB%q_3GZti`!YgfJ;jWt&_&7y#M~O*K3*y{L-6tde`q<>Gv`+HrICC z`R?`A_Ku=%Sl6OC|NA`L?`!+cTj_d#t(+PB!Kw!bPQ zSoT@1zUHU5OWN7DME|`L@ag#JGZMlR`PNx&j9ct^|Ey`)`uD$bzH?UH=WcCGxZY;R zy|1j95nP?{UjIIYEn(sNhJE3$-YL0=S1-6+d->Y#?|gV|%CzOv z-o30lt};_Z$?LxI^K$7*r-C5X?O99zOp;1k|KWxC7ugHnwH`e<=zLqQD#k}&dDp|= zdH0mWw%Pvq;Vxf$XBl+PJI=nA|7l*>qW6vS5Ai;}aiQGdzBFjo`WGL=+BNTAo%-=) zrqtKHHJ^MIoOy6Y2+_RxvhO)}W8f;!XC<2_KTB>~H|tC6=?R8Bv7w*S@6=W8SNvCU zktde*3wSh)F`?sSb&%GKS34}5cQIV}{_G&6>@NRe>u{twiUD57?_K)k?)=_)_3{U< z@Awlj3{xx%X|E^!Nwyu5fZjt07!x$rQZRdWU@yD$G>iGFZuU^h0DD7f@Jn6oM4HrPl8iLzgI^AtL^@q!9b_J+je?;mr(B|!_*z|qgn z09tYZ$%kL|y4BjxhigHS$q22r?}tk?JY4gB`n`RNRg!Oqp5uD`|NQQ(*`NPsx`)^% z?UlC9+y7+`n^}hfwD@fOdUxyNB~f=dYPVmxn}2QT_WO0Bzx<$4cR2L^@n443fBR%# zr}vv4ImPbHzfNX$UCZmvjNrvmE&^+1VU3y0)}+%(b7voaw2pIafXMCB6@}hgyFZ4V zUYp8jeQiB|ROJ=f)|`MHlN_o~Z8!hKz`;}t?)5}P-}j!y)BYuPYi4{+6Hik3Rhm|w1G(x(Ux{KZ?|Cy1x^R3S1E>Wk#aEt%z+rB>1Ilc4i z-6?mk>i$hS_TzMt^iHq)2ktDn(00&^=`H7<$eWA;F00vL>D29h>E3HDvDGJ|o=TT3 z+4owt?R5Od1%Yd8fAWVWW%U0~XJvN)`F_EBh6~SrE!*aLz=8UgRs@Iowt#AraStUI6 z(@Ie6FL?j;%J++PXLjWt@4KBgGwep%>ovib{NG&vvwyGdpSgF>%GDUe^lZ}czEOBP zm!Hj>^V-Yz$@;C@oLkiI>^Z{jAh1>*`-%;J&-h(cd|Ao8PO9{rD{sQXr|b5epK;@$lB)%tC>j^5RLzGma)JvKi=p=%{T%fnq*L1R2i;+C&{pX3;J3Tg`2 zrj_q`AryE~8u%7v(3=QvpDO2n>|C|)Mb>F5; zUsgzl%;2o8-}>d*oOw_0OB?H^eLDX5c>nUX@3-w1H|jd!)hvFR&0ReEwDvyF`?lHJ zvwAcfR~n|Ohuup4y{qW{qP-?Uwa;sNK}|7GCi-{u;^OAXyNpwx=h>IN`N3A8$NHt0zn`|Lnmtc8(D9$-iy7|sE91d! zOOWU5Hx^(2oO<`~okC+acJ|hN@%OhYZZG@1@bG-g-(Az!?M~cVv6AmsUQwZX=8;!z z{Lgp&$j-eP8kA)6_MB+bO;g3%`K!Mjyj?D6e<^Fr>61I2{0 z_p09SE`P3Y^m@$VNxzi7`Oo?ONOt$_@^@Pg=1*PpexvS2n|pC)rv7rXwg%|@`p*32 z+T!;N1}$Ij-eG5Bc)R9(xtQFfWpxLiRQijS%UYF0OwC{TOn-08uZwMUE8km}y$kyq zJ0Z5_tYhu^U0?R8U;Xam=xg-xTUSAF>5D9b?e}J^TRiQt?(FQ4O9@+^I_zzfQLJ>I zc-GrgocmX<+lg(xx}CZ6q8Hpa_N((iu7UhB&~QO)?e?mvSK@n%|J>s;Q2FwAyZ_rM zVtPWE^Xi`QD;`wTWdivY@|4S@)zMuN4`bOkYufQpv?+drnZyz2 zc3*jN`l`$2*1gMDT+{m$?X~cj%T^c3pHW?z^X9(PYde;fBARk;!FvXSl&^bZ>QX|) z`z}poWmvoNy^`FGZ>vA=PP5$XZ1p%eIb#3Ebq5b7yVaIo%3pHly4Cw?&!0C6gT6D} zTKnwwkDawo(|S5*sQ>nYK~g=jP%-YWw-nPA20K@e_8+F{rh?i^RT0T4|PB5Hu-h8`kUOhXG>Rp zUAa1MQ$=%C$Io6tkY=&H@4f!_nJo!@?_|t-m8oIc_3xXCcX4Nn`=^0=P&z$w_Q6jc zUioq5>a&OGGe8|M1CgTpr)@UPzE|F`aMAlk-L@BA?#q0AH&E;U-_GLg_J8kGzyJI9 z%*DHh9(*phzti{YU5UBDUrSK9EctTxr|9kfRi{O^thf3io3P?Vb;65RZ)bl>diu=z zo#CtB$K~r^>F7jPF23;H^KRtFf@|O2fQzeyj+eWCKQ1cRl)@m9^sDYYb3bdJ_hIb`}}e?Tiz}_o`1XIdGG6OU+(U4 z)yb*;@sZ#D*N<)~Ca~F{0pO4?w!M(ng~NTu1!}eVTrrxU@~#%#j)(ykC8N zO?UmYtQn@}Yxbv{yQFzp+;85t11F}u+*@3=Zq1g6M);r(c-Tex{&m{4i9m%kxZMrv z@VplRGQ6ms3+e>ateo&MJni$*eKFuc zUT`Nn?8^5wKm6?$zp5~M{(WD0=NWPH8u9bb_J&%<-~X$7_tKOnlIhax3#u0<#kbF2 z{dnC;Oph|J+xF89|8?O7u|37ptKMfdlVUwJ>bEI-%i^6kQfP|F)3 z(z{mWyu8Dva;ZH1U1i%k(AX0=!g9ZvuD@r-;E;-^E51^v&*yw}!POPTdRYwI`sH71kG+XoCjxEnFa$K>X~rNj#R8_<=__@D)?dC> zzEJ@&lEcRk`l|Xca!&fcsId`LRfE#0gVwKq*KWUG7gPKB$jX@)AE$BY&9VA_YW4NH z4-f0W0S-zBQGWN+&+c7R{cMr(xw)&-_Q%v6{R)mV&^YRrIs5$oKNR|Sf2DC%Xs!M4 zJ>8(8Z*Xrr!?M=?^PQEK^&(|n)QZimMAnzt**BeeAvXo$u+(Q%jw;-TC(J z@Qlwhz5K${?>DSjbmMwpop_+P;q{rG_;}DWPlE`|MtMEpn^h z$`zq|Ssv}#x%_lQ_a3o(@4_CR^*^y~UD3~OZjjr+YX$^={mXiJ*3$O$e)F`bGf(=D z_sjc7gT`=L{ckLuVzV));7dci+V%4Dw~}pwRvO0EhTl%sUJq{3Y;ydicRtJYSKbb> ziNEIk(sTv&G}#*z*SvS{=kt4YZpz%pA_=+buy`@A{(R?o_YHf{2I_N8;hacaJ*7HvQFTMAU#t-e^kJNm@$lQa8- z8x}5nZ(VL1f9>vhS@YzAf`Avlzt&0@Wt+=e{h7IWeZ|XN($~7DzgqBKO}u=P+nT%| z1?#%^Un_ILGXSJNw@oTH@vGD{o2Bmev^Z9Za(_C1!O6w@$x4kcKa*s$=G8kdx}#}n z>UQ5-<#PGks1xB+7yUV=k*)PRu@O?*gs*u&ZTIW@(Wj=f%s<4CyZZglYPrtx?}oC| zzue#Y_N)0lv3Ku2Jc^H-`b%#|lI#76%JZ+Ucz?`B?52D4vhT5fT|Rv}dN=1y!S_9% zCO*a57W#AWh3szaeR0x%!Zd%$-4^m*{5CcC^OJ><+(#GH+h33@%nwd|U+r=KZ0fPE zXPLnTpyPdB=H*xP{l3U9$o=~F+#%;nSM(8MW}kGg{8>8P+y2%C{jash&)r=GS)jV& zedzRi-xFJsxd#eT7!0hyP*Q3y#L;o-Li#&HC3& zIpy}TX-CY?>jvZ`|8;p_X7S?@5@0amsFMogh!)HT=EtB_w zR^?qf+ zwIrod(|S68oY=IAkH2@SbGWs0s#MmRxchG}{ds%1IK%DL?y5^y7Orl4)*5raMtboa zli)>xM}Ms|KX!h9`ZGyTIi&s_G;VQA{pOS{_4+{uKcW|OF_Tb0C;j`NfT?;Cd>1D6m z-ObjKRzpabW>jsB;!#-w*#b5U-hlkv; zy>NZqs+||Fz$>vYdkcT*{kqb<^V~$vFL(VmXj;jB230WNm1ri8_e1}G3%cEX?1|*| z)p4GEpeY3KMBjpwd*9!z*|P8V-4Coq_n}jP3m)!#f9UAfJKsP3TDPYKX7z&iymKp$ zotpV^*_6(U-*e)gohkXoy8vEU^3=+&^n0=H{L6J~ON8&geN&--|JV*?P(9iJGQp-) zv;pfXIFpe3?maezZ+>tZr+-fqTN}6G$*mB<(2g#b(nUdf!tmzB%zfOw^UM~j=VtR? zt}Wze;|Cl2!kQsu+51JxF zeqv+Y8m+!(!pc1@C(^DvwEjN;%FFe&;rrt+{d*u>8v1Q2Ps6_O)$i9&yEo_Z=0DZR z%Z~c|tN8Qd?!?f>zUc)c*zWCUmMulr(A03xitPV|f;q>Z#`FeNhiaOD-)lp2DM$B|o1E720VpRV*(7CFHox``CXa>?&$K zWk3C5dBe5K-xs^HtCyyqI(N73&5e)Jd3P!<>qeK`es|ybepmE+k40ZQzudjx{@Odp z>zCZ(8N64@A3i$xDfO+}U6T^;>vdX6Dd8rIPx&WPlxpg+b?7uTN!}pZj<$ZnByYxc&*}o6vGxw^!-g3H1v*0IB z`?aMp)2=2(&igP!z8Dlid-fgwW^#f*<~y_1BknU>BG3I2DY0M19Dn|WwL|h3+xqj$ zAK%$6dpzmi?rnSj9lL$#u58?&)2oAEyLvuLeZ9NFE@<1SFZ;4@DsM8reQnJKKTWfj zrOD~3bsa0+cF%E;+P>56w%S~&qyIR6&+Cn@YEOG*W%%XVY3Gis-}SDVP7O}f3D{cp z|4+uE^>cYIpK93WK3{nM%~NZewqLSZ{c7t3_NRBRx@_4W^KSR$2Ym0dPt^SEX;`BeS~#D?cAw#MCO`&A0B07>{`1 zPO*21ZC~%6+JC<7e9z9xUo)P4$X5{D`#$!daQ3g42Y$Rivj4(WRqloF8D3N~SKr@U z`McOl`sn*QajAU=PUWWk5OBZGD7EXva^u?dKlb|6L)fx?h*x0?z|JuY4}T ztiAaC#FNIMFLr01nhRR)^pDTh^kQz$q~<5j=gim?z;x1h;brNP+V>Jyna!68xvHOE zVf^Yvr1PmO98*=!n|Rzm+%EQGdFtJSFFPNzfYPOGEr0F1-M{kcb6M;*`@|=FoITU- z$i?!8V=s1huy6bO>d(5!b8jY``*B6$TK=Bwf)6tS@6Y`rt@(ZHx!>!)d0IbCX1cXj zYnjpd+?kTeN|R)GidMn~xx8xmrz~4qvtz$cTlb~vVwCP~WN^ zfu!xi$8Rm2p#Mr-qbPL)bF^gsoY0_{uAfaM8O#6vx^T6i&zJX?+>Cg8$M@AQE~Hr2 zU8~mYy$PD~{<8O5<^8Ss+_`J^ZoBk{Rc!anht4v!>=`rmtrjGrl^1?X%Fy{f=h+$Y ztKYQeemd_E-Yxw>X3>f(i<5Q*bDH)t)_A!3|jb=OC{Tf@ck=^R9dG20o zuc!O%3*UWPKEL|?-u?3}cSTFo{Cn4aJMjM8`)ogV^4G49xj%P)-|P8b!5vSKt@A?e zGlS+sr-0`}`vdRW|N9Y~o_O<=bSr3kOjrBnZRzi=9cDw;ih-vEukQHXc${hPd+BW= z+x|V-_d{ovt^S@H+si&n=kL3`4YY9svU#@cSKWsP3v>Bx>uw*j&X3u?^!+p4q{Q2Y z`|E#PJRW}qH0c8w7h1CDeI^Si+k@v2OkY+9KY%Uq0JmQts(2J@Pv+@54#ZB_(_Z zuGif8{cB3F|9PF5Ycb{GyaHz*R3RkM8+FhIt^=q6Zt`{S=KKXWt{+?p9r#0%M68Bt z+qy6Pv#L2;QLK8;i&LWBKYMmZy06PvD7;Nib-EU( z9I|i5>m}#q7N~yt8*Oa1#X`A$$JZyW-{$;}#|>xpE}HP`)$SJ=E>{>1b!-Q3zP`Td zeO}P+RnNkjc2CzzK3S{yzU;jA%@1MfHoy2Tq|}PvvQ7NB?A4Lj=|6nGn*InDyZ?W` z*d0y=Mn6YTfX(`H_hj=#%{N66S%E)xohjKq(z(9uV>XGs@4A2Yg!lhz zPan3w|Mgw|zdwbd9kTlI-#2Kuh_r%Ql?)g7P8u^@*!Jt)lQSW2-|^ip+pEp>^I#IZ zJ8|hsx%$_oV&&xpr&g}tH-Fm$KL!q1!|~U>Nx$~J_;-0zIg@?7d!o{J~xu*y!QKa)ylD z+VJ2!P-j+_0c7ri-mib3xPG5M=OsImK9B+6EP}L+gonNM{oeoa&%ZNc@s@-w)WRFzL&A&Gq!{w?&?&~l{f3MwEU44d4yR19yNAJq~hi~9{&f<(_3IzMXwtZdI+;@i_&y_2&_g7P@JQn-zgy_|CrTNK+r^UoJJY4pEntt1t zSgGO&^W5pYFLy^o#@*k(dfm(Jts5P#-nx6}ck`n6_l#ZEU-^2sVo6o-)o9lIrB`ik z=2UWQ`(-Way2ak>KL6`-rf*W!<-gSquDqMS>f?ne)*4F>F1xJ-nk_kb()g5@_tUxm zK_jl!d#mq1{&IIkr{@>jn2Appvn$=X9ucxYAo=9NsqdPi7F=S8UB>%sU+Mf?OW)=S zT(tQw^3tAl%F9~*xe=HB*?;v;*uHencEebAkin^6VsDgf)DNE!`6l&?trcj2vc$4q zbwTg{-hcUW`;NT#-p#+KS)bPH&#U`>;MwanPoM7IUsJRC*QC!`1y5c3Wh-88biXP) zHMRWUZMU0+ulG5>m#fGOc(*8F>#NhwT<`WJO}~4)`E5`9OTC#lRUE~YS zToT`R>&*>iUH>07TG>;?*rerGcvw$+x_j-^bM=$AFg~*61dXI#zW9COwh8IYmS#mS zvOG??vhS&Uq4kT;;LO*%W*(ZG`sRA4n!Mcoc1l+<_hQ>8H<#SFH#PS3e$(3UYZ^~G zx(>arc3P+Z-f+z-(c`7FWVZ&HC%iVO72P)b?LW;Ni>UispLObfZO&@g*Uqn7pq+F# z;Z5zG{Y{{egW|8YOiOpmGFPv0h{wIs#Wh_d*c=t2UzFwi9doz7)W%_&9Q^&-z zzwLXH|Np7?{tA;F|K`^A?|(ey^NVNYdzj{4()p%a{_oG>vYpf8J9c&Ne|Gx#c8lF_ zs$+Ch;?A6Ud#fq7eH{}I!-DsruYPZT{&jZb=I{FM`)w+|99U-hcjD~~ zn_VwuH~yVo|MTeLliSue>i*{Ymsq`Ms&lhT`?kN=-M{NfPihCx)_&Rh?^oXPlRqLs z>-4Ti-oNda-oAaG|Iee1iq$_rGsa7wNHRFwzxX|I{rg4t|DJAs|7LDe8Dv!-ta$(` zvK#ho@7nkOeC1yT0r0>KXq;tl=-0oS>X7OWaLEmtpE&U0^7mDSuYT{3xyH``8btXb z3yNuwCh!b{MBOjDw6ggLZ6y4#P<;*BD*{q0z2tqU#_m%`QvYsB zydPWf|No5J{0xjoqQUDrKnCso`OEJ2tV7%N@AkkemWF-XckT0!y7ymyv-!%MpquAu%^~y`$GhF!f%T6u%z8a={GK6q$$RBG4XX#{S1q!4KRBc+?H;pfVc)NR zb6dan|M@lU1sNYo&8VNs2IyFaQ(8^^yjyx z-vXu#&HK{dJA)b;zh3<2RNhtOy4u-x(f7MI8Dx1ZOpce|e(EG~Qz7(%SoM2Y>mNhh}}4dM;#gcy&v8~YybymQO9-|kzAQ1kas55fzV!p2}5-27!U#qw@fEWg}pZ&9IR_ub8R=R-u- zp?97|kj|T`cm4k>Z~M=$`1G>t*=khjO;#^K?Kns-Y&i90ub!|ws5*kgEJyA7(?=$X z@`A_LA>*ZOPi9v6$eg?o3T@ka#NK~xTBzb24h{7Mg1_RXcPa;;s(pV#)Z2*b=BMNL zZkjK6GokbL4(};*&(DZEC35QO)U(r}jUt?=G8REEwWeQ^WRTcd33{Ka|sO*wpA0~t9)mB7Hl}- zwbxtuo*mK?ugyCf8Z8K#)d!^<-jlWKj~|)%Reo32&I*TpuE#fL&s1|XDe(@^-20Tr zI#}TB2kFb-e(Cv@mTp%9m3^QzX%YeQR?6S@b+b&u*9ePce_ge^Q*KpBm)?_r_}#M? zELycKCM@jNO64-nth#PRPqo?GUtgVa>)z4q8R0o!P90!8rM!vz%_rlwH@s7LlrGvN zZ%$Qy8*cpW*O6oS*CniO*X_OLU3Sv4(y6J}1$ue{DCE|6D!;ZXxmx5tIl#&*OTfiB zfA5>{zU$?tr7ng!$&IVFuAX~s)r-?hzO9(LYoBz#$%pLbqSX)9ZkhEweNRPuLiE<) zK$qXizs{LH=3n+~byvRbY2CTiTAQo%gD?|8jZq`)Z+D{_vEU z*@lN|dtF(%45!INz0{jAso>9j@jHi2UhF=xKium2US6eH&*v}t@p0w8>Fwt>M9upB z+gaf|8z^IemVjLOx;IYP{aXC}*E4_1Eq~v(r6~NqZ{O;(Ig3le!`HuGxSMb3?P$5Q zxnFE6^&Fh$BgcI&SNwZ2zAZ9dzS@m^tR@Z244Y84um>c@1ZIDGO6 zsBZ>U_g5nGwmgx%>}6Z&HaF1y{L+uhm#|z3qO>(>ER)l(O!A!P2$}y? zds!W;*5~tbh4EXT{z_7mm)rG9ef10H@V9$K;?2K#-d>gU zHs}QVv)TPIk`lXK@iT9IJxNoqbgIxN!B{hc+^8>lT6P zS7wLi;`^@+3saQm?Ruq^^QlE3y!-MTLtDMz{ktrcKp6t$*$3HnUptk9t6pW@ZrH~R z>B^fpfRdLAD2YM^R4SLr3A-;dED?oeZioA(wd=1RnWzcfbq@;f3*UeF%iQc(xS9cJ zIO4TY;gf>%@G_0<>AveWg(+7N^G2Xzq7z(cg4#jK;7sl}Z<~WbYSsHW^R%yC653RC z)(Uxiz&zv839TuyOVbYqp$kXd`THvS+Ptz~8t5{s?%HlHxT(2(-np;f9WIbX%*S3@ ztII$;^+8v@pEf$(TK4|_e^1?a|1SRXcTp@hK5h9Bl;uFxz@mNr^Q_!wd~ZA3x{5b$ z$M3hZKQEf#8La;lsi6Nice3BS?Fp&9o40X4(~bBz_x-#xoS@uw>aYy*X9Mhj#~FL*HtsMP{099~#6K&mxJDF~@H8p5uZSHE~Q=kzMs zU0P)#oBg|-EN;V`xNhI|{6{CIO4vZPFIoM5(f!yH-%nl51`R!}DArrWwDIw$)p1zh=oQq2ko)^rSZe7$e{u1kyIl39o7pH!TrTYT^-f|B=&Uns_zt=) zTlSsaJ7W_Ytnz}i>A>NL9HgM)2b6$+%*vm$&wt)F1vyX~16)Canr6`EV#C8#?@#`{ zz2bf9{L3w{1bZOh+IQ$APW_v?walmZX71?S?Q-*H&&#Dg3u9t$)@UZ(-*n>8QKyaT z7lZrT-2W=IpINQeaGW#Y$7Wtgd{5}xr~dK1L~Z@Ue*L49V?e7*mIl07wEm_&Z|;}%p1OH0o9Exl_m9GL{r61`3px6i6Wl8M1scSw ze!Y8Xk0SS!V>vHs&A(hbUH7!2Hayr}zxJT5PxHR+Kh>@a5cS8jdVYzb`%nA)&R6{iiT=*dyaT$gcuVWP z)u(kK^+#SBO8ucI8kV+XVtb@|?Ro|NxRrrFOP&7d37(l+{?+#E$E}F5tW&?u->YI%y7->;yVXl#;&q-Jb`JlWB3k=m)!ylk7AGox+x2H{EZ5HiKhB+) z+PHA_KZAhXdNWrBojAQ)1f?>Gv;HgfH~e#JQ&o1N)UH)3_n|cdk9n>6%1UrmB7IRl zXAa+{RVY=-#C_^#8auClR|#CYZ@Up_TMMKpgY?Bf&6kFK{W`1f!pjA4Duh%rSEBE0 z3l)Om50>%Z5xRc+zHnYd6BH~CnU(LqQ2xBqAF{0A)31HJQ!(lakNc|w%BId^_1+2D zu?rr0zR&in?yG6Gzjdt$bh9pawLx_3ePizFbBkWRMBc8FKWASttl6&MTDxCob4JkzIl!?WT_$_gXXK>PgWMUROa7^Spn*X-QQ=a&o$HJD@sQJ)DfxV z4!dTNy*uGvlj!}Q?@rDs02M+Pz{e8EHqXCP`!dG5dl}b}zD4(C%VG708>F;=Hb3E< z5BuCeivy5@E~B(|d;7X`JJ;M=xH`$*@b?mpmd&7T7og(d<*VwyYJD-C2VvclUBC2x z-EFPOzZ3K~dG?XMM=Sjo2^juXL8=(b)zg<{l~3o7E5)cA@N{e74r*JwPhEX;#@919 z_a-0rmoWU~f>=6m;Szcu<(Bh(*5u>9NRtfU5n6d$s~;zl{jI9c!gr~H285%+@5`ch zJf>YMH+|ZMs0P604rH+dsQV4>K0pGo0d#m%%~>ST@I~+K|K0rC&L;~FR8TTokoT+Z z$7bcfKj(+5KS~v?Ke}r6|38mb!xQlp$NTYhPrt5SzjtYtp#LT3{U1JMbAPw{_4E1v z6(0Aki;hm}aoYB0WBE5;4eOLgX77YjpBpcmZq!;-n)-QZN9}1PZgK9T`}(@PJMzkO ze>`71<8_W3Gpx$m_iXZu-4z{|ocrxIe)wd%wWH#YPx-;~?`};4R}-Q!kZQuf1AjHq zv0E_n?ai1jQATKPTlW6Y^3c8O{Ei5F{r`KrPW7GGq*uG2K4SbS_IKa9)LCEdUeJzN z`gNM|8y`oL!}&h9U+=cKdi8D>C;`2&W-y7k&(7X&`)&38um9eI9CdTAOWL{9>-Pml zzT53teAFs&W7zs#vtKOqTK>X`@9WmxI4YBsL{ug@f697a-3)8FXZie8<7u`V>UXkt z#fLvgVS@U^_WRy1zizKyzk6$zVE_Hs%gghuYkq9@N}soJj_H#3muB$pecyJkYURR@ zzt%15(`d^DO@42^93@&i^NQTopzGz2C$iP$2IPtEnHu)_PmlO}fgHhdt*(svFaBJs zT2EIiE_`#8aqZJrm6I>MH&rO`)A~ObsquXCjB&fY@VwZ$9m|d0@Amxn=*!(3zvsE! zKP(!#Dz>K}J~^<_sYkUvj4d}Jzv156ybI+M>(`g8tCn^#IdAX!@o}*3@9XC_gnFBW zZ}DqgaVW3n-fy{#hD)C=oL7dVP=>FUzfY^q3AQZ;jlfO_d-rPh$-=EObEmv}_3Eo_ z$@PV2Je2u2`~8aZl-qN6PhZSIOV^)1)0ICy{W@0;ls_(%Gf4D-YoEK@qw2O*K9j6w z*Ie`Jh-n?u_W8w0XPh`y&a-?qfAQ;+ob%kLZr-5t^CqWXku3cZBUN8@%4<@(*7fh_ z_U)N<d1T=c;?3|zDCe*K%XvGRVXe#s=0 zLpvp_-tS1XSsHNZ!-Y`$r_S=bvfeNKQ5Dg#SFb*Mx|5wjig8hD!i!b*VOQ6AFWbRU z{q4_<-2HYXrc;uGOW*Gfnq(Hdyy(2Zx!2x%V4Rjy`c*^pHHK=6-9en#=Z~c9n@byZzgda{ylFd(o zj~71L)waPfh0WkW3*%#ZV>;vg zk{Wf*`<|!DCw-bb;1+WfiALx@M@lJ@cQ#CCt$_y5Jmb*%fR z*X*~cc>HkvKY`gIZOf1p&9^K5cI?aF+JEu44@+PE?zg}Cny?=@6rLzPs}B3Xd^q^} z<@}3#8b2P`@owE+NJ!XpAp#3x-Kp|RzoQ`j`7{?MGzrFhpZ(MCRJr_T3<;RFyT@%{ zfe%q57qyRhMb@76jmaPP*#)|9T4lSThMj?d;X}RqK4u06hEK8#3=9omp(oa$8)km; zF)%PVfaGM@qn7`_@^$yu{{Mg8OPR6d?ELDxGkw9rg$viMdpCEM8rz!n>!-hGU|_g< z|6TvTYta&tQnRI`_J_^x^F7*dxBuV1?1S#RkJnpUS^fI;OYgddVH8irt1ByWB0yFI ztUZ$Y(&M&&+p*i9YE5%^B$AJ9u%6$zL+9?jd-KjeKY!K4Fri2C@TqbJh6XLQeGx@Z zUxj3^+y1QAF!{#Z^A0r|mu%nu{f?o+v7W@I)(i{|rO$s~xUqcg&Uv%UkLgT*|MBjm z#}nQgE(3XN#jl$EMPDyZ>#xeXC-HfIOzr;%5)WR1H2FUH{h~k0O7HFUYJIb7`z3Gx zw`))9iJbfM-{$Ai+41}!+ZmSpw6n0fdFNv6%H;F=?rVJfbo1*omHX3=Y2AN*qQ~&` z(`tYJ^S{{-A9%d=Y50{gFuh0Ge>BH5evdX%Ln~k(jhDqLR3m5ki|7vb-sgQi8=x5!_OG`KZUM}!;UrqJ& zqe?GpUwWQCef0F_*6aSK;6uKd)~UM%?fwfEwe^ZYjnZ#w*>MbaDr1eVrb3B`^+Gd8KOVeW-MB{b~BUuC9e55_RWZ?jhFJxTmIB` zW9ib*&+i|7`Yn6+`kW=^myTX+4Zpwq{)w*rZx4XOvb_9z_3vc{@}hR}H*$BD=-R&X z<(r;A{hdeN-l&r|_I!z}@|pDB`g<*Nk`Fi)ef@dQ-sIkmY3q-$zufxyZMWwv{XUWR zvHu?*xinYdmb0lK z85kIHPJiEc>{^U#pH1(BxV^zPH5-Hi?WQlQER*v$uPdzun~h|IeQ@Gtb(7^X}2S&&a^A%I?1XPNTAgs^Kd$ z4~qXRGb>LlD}DU*kw?+>=6vOY$1hz@^R8d}`9x5%yfN*4xc-)! zkk7|vJpHtH^XAWYlN}H)kdyhFSnPgQI{8#ND3lfMKiv(=NCyI+{(gGs!%zO(+4m$i z$LxFl`RC>14HChi!Xm`{=lyl1CErTFefhuOWfHG6^RXF*Z_cGJShsH7%9ShEu3fwB zwk=zaVKOB5A2qojbLMWfVCL;`iG4APk7XDpy!#hFyZ%qkbK`mUHx3vIVCg! E0Iy_{x&QzG diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc index 2b249293704..6d1b2d01658 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc @@ -98,15 +98,9 @@ \list - \li Applications + \li Application (Qt Quick) \list - - \li Qt Widgets Application - - Use \QD forms to design a Qt widget based user interface for the - desktop and C++ to implement the application logic - \li Qt Quick Application - Empty Create an empty Qt Quick application that uses Qt Quick 2 types. @@ -121,10 +115,25 @@ {Qt Quick Controls} to implement a scrollable list (requires Qt 5.9 or later) or a set of pages with a stack-based or swipe-based navigation model (requires Qt 5.7 or later). + \endlist + + \li Application (Qt) + + \list + + \li Qt Widgets Application + + Use \QD forms to design a Qt widget based user interface for the + desktop and C++ to implement the application logic \li Qt Console Application Use a single main.cpp file + \endlist + + \li Application (Qt for Python) + + \list \li Qt for Python Application - Empty, Window, Window (UI file), or Qt Quick Application (Empty) @@ -135,14 +144,18 @@ a widget-based UI. Alternatively, you can create an empty Qt Quick Application. - \li MCU Support Application + \endlist - Creates an application that uses a subset of QML and - Qt Quick Controls (as supported by Qt for MCUs) that - you can deploy, run, and debug on MCU boards. For more - information, see \l {Connecting MCUs}. + \li Application (Qt for MCU) - \endlist + \list + \li MCU Support Application + + Creates an application that uses a subset of QML and + Qt Quick Controls (as supported by Qt for MCUs) that + you can deploy, run, and debug on MCU boards. For more + information, see \l {Connecting MCUs}. + \endlist \li Libraries From faad83d5a37448b472af2efa76b7193c83f2c1f1 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Tue, 24 Mar 2020 06:54:15 +0100 Subject: [PATCH 12/27] Android: Make sure that to be accepted licenses are visible to the user If Qt Creator is not run in fullscreen or the user's resolution is too small it is possible, that the licenses which have to be accepted are not visible when the according message box is shown. In these cases we scroll down to the SDK manager so that it's obvious that the licenses have to be accepted there and no additional message box will be shown. Task-number: QTBUG-79664 Change-Id: Ic24bd8c4457a43011b4035b659063dd45b321bcc Reviewed-by: Assam Boudjelthia Reviewed-by: Leena Miettinen Reviewed-by: Christian Stenger --- .../android/androidsdkmanagerwidget.cpp | 3 + src/plugins/android/androidsdkmanagerwidget.h | 1 + src/plugins/android/androidsettingswidget.cpp | 11 +- src/plugins/android/androidsettingswidget.ui | 821 +++++++++--------- 4 files changed, 446 insertions(+), 390 deletions(-) diff --git a/src/plugins/android/androidsdkmanagerwidget.cpp b/src/plugins/android/androidsdkmanagerwidget.cpp index 84dfe948d93..cb489716a9c 100644 --- a/src/plugins/android/androidsdkmanagerwidget.cpp +++ b/src/plugins/android/androidsdkmanagerwidget.cpp @@ -446,6 +446,9 @@ void AndroidSdkManagerWidget::switchView(AndroidSdkManagerWidget::View view) else emit updatingSdk(); + if (m_currentView == LicenseWorkflow) + emit licenseWorkflowStarted(); + m_ui->operationProgress->setValue(0); m_ui->viewStack->setCurrentWidget(m_currentView == PackageListing ? m_ui->packagesStack : m_ui->outputStack); diff --git a/src/plugins/android/androidsdkmanagerwidget.h b/src/plugins/android/androidsdkmanagerwidget.h index 7ef83d31f43..eadb61e7eb3 100644 --- a/src/plugins/android/androidsdkmanagerwidget.h +++ b/src/plugins/android/androidsdkmanagerwidget.h @@ -86,6 +86,7 @@ public: signals: void updatingSdk(); void updatingSdkFinished(); + void licenseWorkflowStarted(); private: void onApplyButton(); diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 251b621bf3a..7308bba88c1 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -425,6 +425,9 @@ AndroidSettingsWidget::AndroidSettingsWidget() m_ui->SDKLocationPathChooser->setEnabled(true); m_ui->managerTabWidget->tabBar()->setEnabled(true); }); + connect(m_sdkManagerWidget, &AndroidSdkManagerWidget::licenseWorkflowStarted, [this]() { + m_ui->scrollArea->ensureWidgetVisible(m_ui->managerTabWidget); + }); QMap javaValidationPoints; javaValidationPoints[JavaPathExistsRow] = tr("JDK path exists."); @@ -997,7 +1000,13 @@ AndroidSettingsPage::AndroidSettingsPage() setId(Constants::ANDROID_SETTINGS_ID); setDisplayName(AndroidSettingsWidget::tr("Android")); setCategory(ProjectExplorer::Constants::DEVICE_SETTINGS_CATEGORY); - setWidgetCreator([] { return new AndroidSettingsWidget; }); + setWidgetCreator([] { + auto widget = new AndroidSettingsWidget; + QPalette pal = widget->palette(); + pal.setColor(QPalette::Window, Utils::creatorTheme()->color(Utils::Theme::BackgroundColorNormal)); + widget->setPalette(pal); + return widget; + }); } } // namespace Internal diff --git a/src/plugins/android/androidsettingswidget.ui b/src/plugins/android/androidsettingswidget.ui index 1bd69e556ae..56eba59b99d 100644 --- a/src/plugins/android/androidsettingswidget.ui +++ b/src/plugins/android/androidsettingswidget.ui @@ -27,267 +27,32 @@ 4 - - - - 0 - 0 - + + + QFrame::NoFrame - - Java Settings + + QFrame::Plain - - - - - - 0 - 0 - - - - - - - - Open JDK download URL in the system's browser. - - - - - - - - 0 - 0 - - - - JDK location: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - - - - - - - Android Settings - - - - - - - 0 - 0 - - - - Android SDK location: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Automatically download Android SDK Tools to selected location. - - - - - - - - - - Open Android SDK download URL in the system's browser. - - - - - - - Open Android NDK download URL in the system's browser. - - - - - - - - - - - - - - - - Android NDK list: - - - - - - - QAbstractScrollArea::AdjustToContents - - - QListView::Adjust - - - 0 - - - false - - - - - - - - - true - - - - 0 - 0 - - - - Add the selected custom NDK. The toolchains and debuggers will be created automatically. - - - Add... - - - - - - - false - - - - 0 - 0 - - - - Remove the selected NDK if it has been added manually. - - - Remove - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - Android OpenSSL settings - - - - - - - 0 - 0 - - - - OpenSSL .pri location: - - - - - - - Select the path of the prebuilt OpenSSL binaries. - - - - - - - Automatically download OpenSSL prebuilt libraries. If the automatic download fails, the download URL will be opened in the system's browser for manual download. - - - - - - - - - - - - - - - - - 0 - 0 - - - - Automatically create kits for Android tool chains - - - true - - - - - - + 0 - - - AVD Manager - - + + true + + + + + 0 + 0 + 1123 + 818 + + + + false + + 0 @@ -301,155 +66,433 @@ 0 - + + + + 0 + 0 + + + + Java Settings + + + + + + + 0 + 0 + + + + + + + + Open JDK download URL in the system's browser. + + + + + + + + 0 + 0 + + + + JDK location: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + + + + + + + Android Settings + + + + + + + 0 + 0 + + + + Android SDK location: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Automatically download Android SDK Tools to selected location. + + + + + + + + + + Open Android SDK download URL in the system's browser. + + + + + + + Open Android NDK download URL in the system's browser. + + + + + + + + + + + + + + + + Android NDK list: + + + + + + + QAbstractScrollArea::AdjustToContents + + + QListView::Adjust + + + 0 + + + false + + + + + + + + + true + + + + 0 + 0 + + + + Add the selected custom NDK. The toolchains and debuggers will be created automatically. + + + Add... + + + + + + + false + + + + 0 + 0 + + + + Remove the selected NDK if it has been added manually. + + + Remove + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + Android OpenSSL settings + + + + + + + 0 + 0 + + + + OpenSSL .pri location: + + + + + + + Select the path of the prebuilt OpenSSL binaries. + + + + + + + Automatically download OpenSSL prebuilt libraries. If the automatic download fails, the download URL will be opened in the system's browser for manual download. + + + + + + + + + + + + + + - + 0 0 - - QAbstractItemView::SingleSelection + + Automatically create kits for Android tool chains - - QAbstractItemView::SelectRows + + true - - Qt::ElideMiddle - - - false - - - false - - - - - - System/data partition size: + + + 0 + + + + AVD Manager + + + + 0 - - - - - - - 0 - 0 - + + 0 - - Mb + + 0 - - 99999 + + 0 - - 1024 - - - - - - - false - - - - 0 - 0 - - - - Start... - - - - - - - Refresh List - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 0 - 8 - - - - - - - - - 0 - 0 - - - - Add... - - - - - - - false - - - - 0 - 0 - - - - Remove - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Native AVD Manager... - - - - + + + + + 0 + 0 + + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + Qt::ElideMiddle + + + false + + + false + + + + + + + + + System/data partition size: + + + + + + + + 0 + 0 + + + + Mb + + + 99999 + + + 1024 + + + + + + + false + + + + 0 + 0 + + + + Start... + + + + + + + Refresh List + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 0 + 8 + + + + + + + + + 0 + 0 + + + + Add... + + + + + + + false + + + + 0 + 0 + + + + Remove + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Native AVD Manager... + + + + + + + + + + SDK Manager + + + - - - SDK Manager - - From 99cd623fa7b9d57c78c9b59d37bc7e12f74bbd34 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 27 Mar 2020 12:55:38 +0100 Subject: [PATCH 13/27] QmlDesigner: Fix crash when selecting ISO icon On macOS. Never use dynamic_cast over library boundaries - it may or may not work, depending on compiler/platform. Fixes: QTCREATORBUG-23773 Change-Id: I889d35f336ff80e2b1ae3cbe921f7de2fe541bd8 Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/documentmanager.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index 2cae7208c5d..0e657f777c0 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -398,19 +398,20 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists, qCDebug(documentManagerLog) << "Checking" << node->displayName() << "(" << node << ")"; if (node->isVirtualFolderType() && node->displayName() == "Resources") { - auto virtualFolderNode = dynamic_cast(node); + ProjectExplorer::FolderNode *virtualFolderNode = node->asFolderNode(); + if (QTC_GUARD(virtualFolderNode)) { + for (int subFolderIndex = 0; subFolderIndex < virtualFolderNode->folderNodes().size() && !iconQrcFileNode; ++subFolderIndex) { + ProjectExplorer::FolderNode *subFolderNode = virtualFolderNode->folderNodes().at(subFolderIndex); - for (int subFolderIndex = 0; subFolderIndex < virtualFolderNode->folderNodes().size() && !iconQrcFileNode; ++subFolderIndex) { - ProjectExplorer::FolderNode *subFolderNode = virtualFolderNode->folderNodes().at(subFolderIndex); + qCDebug(documentManagerLog) << "Checking if" << subFolderNode->displayName() << "(" + << subFolderNode << ") is" << isoIconsQrcFile; - qCDebug(documentManagerLog) << "Checking if" << subFolderNode->displayName() << "(" - << subFolderNode << ") is" << isoIconsQrcFile; + if (subFolderNode->isFolderNodeType() && subFolderNode->displayName() == isoIconsQrcFile) { + qCDebug(documentManagerLog) << "Found" << isoIconsQrcFile << "in" << virtualFolderNode->filePath(); - if (subFolderNode->isFolderNodeType() && subFolderNode->displayName() == isoIconsQrcFile) { - qCDebug(documentManagerLog) << "Found" << isoIconsQrcFile << "in" << virtualFolderNode->filePath(); - - iconQrcFileNode = subFolderNode; - *resourceFileProPath = iconQrcFileNode->parentProjectNode()->filePath().toString(); + iconQrcFileNode = subFolderNode; + *resourceFileProPath = iconQrcFileNode->parentProjectNode()->filePath().toString(); + } } } } From 27f6e838ee2965b508bd6422dac76817b4070bdb Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 26 Mar 2020 13:20:58 +0100 Subject: [PATCH 14/27] ClangTools: Add "Analyze Current File" to Tools menu and context menu Add the action to "Tools > C++" and the C++ editor context menu. Task-number: QTCREATORBUG-23348 Change-Id: I650e4d10e07ba227c6f89ab660ce7fa81263172e Reviewed-by: David Schulz --- src/plugins/clangtools/CMakeLists.txt | 1 + src/plugins/clangtools/clangtools.qbs | 4 ++++ .../clangtools/clangtools_dependencies.pri | 2 ++ src/plugins/clangtools/clangtoolsplugin.cpp | 14 +++++++++++-- src/plugins/cppeditor/cppeditorconstants.h | 1 + src/plugins/cppeditor/cppeditorplugin.cpp | 21 ++++++++++--------- 6 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/plugins/clangtools/CMakeLists.txt b/src/plugins/clangtools/CMakeLists.txt index 88b25830d7e..9831046b5f7 100644 --- a/src/plugins/clangtools/CMakeLists.txt +++ b/src/plugins/clangtools/CMakeLists.txt @@ -8,6 +8,7 @@ add_qtc_plugin(ClangTools CONDITION TARGET libclang AND TARGET yaml-cpp DEPENDS ClangSupport libclang yaml-cpp PLUGIN_DEPENDS Core Debugger CppTools ${TST_COMPONENT} + PLUGIN_RECOMMENDS CppEditor INCLUDES ${CLANG_INCLUDE_DIRS} SOURCES clangfileinfo.h diff --git a/src/plugins/clangtools/clangtools.qbs b/src/plugins/clangtools/clangtools.qbs index d25707c562d..07ec6201b12 100644 --- a/src/plugins/clangtools/clangtools.qbs +++ b/src/plugins/clangtools/clangtools.qbs @@ -18,6 +18,10 @@ QtcPlugin { Depends { name: "Qt.widgets" } + pluginRecommends: [ + "CppEditor" + ] + pluginTestDepends: [ "QbsProjectManager", "QmakeProjectManager", diff --git a/src/plugins/clangtools/clangtools_dependencies.pri b/src/plugins/clangtools/clangtools_dependencies.pri index 943ca179360..eaaaf295154 100644 --- a/src/plugins/clangtools/clangtools_dependencies.pri +++ b/src/plugins/clangtools/clangtools_dependencies.pri @@ -9,6 +9,8 @@ isEmpty(EXTERNAL_YAML_CPP_FOUND): QTC_LIB_DEPENDS += yaml-cpp QTC_PLUGIN_DEPENDS += \ debugger \ cpptools +QTC_PLUGIN_RECOMMENDS += \ + cppeditor QTC_TEST_DEPENDS += \ qbsprojectmanager \ qmakeprojectmanager diff --git a/src/plugins/clangtools/clangtoolsplugin.cpp b/src/plugins/clangtools/clangtoolsplugin.cpp index 6d9e8b8aa55..eb1d73663ed 100644 --- a/src/plugins/clangtools/clangtoolsplugin.cpp +++ b/src/plugins/clangtools/clangtoolsplugin.cpp @@ -48,6 +48,8 @@ #include #include +#include + #include #include #include @@ -95,8 +97,16 @@ bool ClangToolsPlugin::initialize(const QStringList &arguments, QString *errorSt d = new ClangToolsPluginPrivate; ActionManager::registerAction(d->clangTool.startAction(), Constants::RUN_ON_PROJECT); - ActionManager::registerAction(d->clangTool.startOnCurrentFileAction(), - Constants::RUN_ON_CURRENT_FILE); + Command *cmd = ActionManager::registerAction(d->clangTool.startOnCurrentFileAction(), + Constants::RUN_ON_CURRENT_FILE); + ActionContainer *mtoolscpp = ActionManager::actionContainer(CppTools::Constants::M_TOOLS_CPP); + if (mtoolscpp) + mtoolscpp->addAction(cmd); + + Core::ActionContainer *mcontext = Core::ActionManager::actionContainer( + CppEditor::Constants::M_CONTEXT); + if (mcontext) + mcontext->addAction(cmd, CppEditor::Constants::G_CONTEXT_FIRST); // TODO auto panelFactory = m_projectPanelFactoryInstance = new ProjectPanelFactory; panelFactory->setPriority(100); diff --git a/src/plugins/cppeditor/cppeditorconstants.h b/src/plugins/cppeditor/cppeditorconstants.h index 4df974e1262..a6f3f9609f2 100644 --- a/src/plugins/cppeditor/cppeditorconstants.h +++ b/src/plugins/cppeditor/cppeditorconstants.h @@ -29,6 +29,7 @@ namespace CppEditor { namespace Constants { const char M_CONTEXT[] = "CppEditor.ContextMenu"; +const char G_CONTEXT_FIRST[] = "CppEditor.GFirst"; const char CPPEDITOR_ID[] = "CppEditor.C++Editor"; const char CPPEDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("OpenWith::Editors", "C++ Editor"); const char SWITCH_DECLARATION_DEFINITION[] = "CppEditor.SwitchDeclarationDefinition"; diff --git a/src/plugins/cppeditor/cppeditorplugin.cpp b/src/plugins/cppeditor/cppeditorplugin.cpp index bb86ee5be78..1376843080b 100644 --- a/src/plugins/cppeditor/cppeditorplugin.cpp +++ b/src/plugins/cppeditor/cppeditorplugin.cpp @@ -174,6 +174,7 @@ bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err Context context(Constants::CPPEDITOR_ID); ActionContainer *contextMenu = ActionManager::createMenu(Constants::M_CONTEXT); + contextMenu->insertGroup(Core::Constants::G_DEFAULT_ONE, Constants::G_CONTEXT_FIRST); Command *cmd; ActionContainer *cppToolsMenu = ActionManager::actionContainer(CppTools::Constants::M_TOOLS_CPP); @@ -181,12 +182,12 @@ bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err cmd = ActionManager::command(CppTools::Constants::SWITCH_HEADER_SOURCE); cmd->setTouchBarText(tr("Header/Source", "text on macOS touch bar")); - contextMenu->addAction(cmd); + contextMenu->addAction(cmd, Constants::G_CONTEXT_FIRST); touchBar->addAction(cmd, Core::Constants::G_TOUCHBAR_NAVIGATION); cmd = ActionManager::command(TextEditor::Constants::FOLLOW_SYMBOL_UNDER_CURSOR); cmd->setTouchBarText(tr("Follow", "text on macOS touch bar")); - contextMenu->addAction(cmd); + contextMenu->addAction(cmd, Constants::G_CONTEXT_FIRST); cppToolsMenu->addAction(cmd); touchBar->addAction(cmd, Core::Constants::G_TOUCHBAR_NAVIGATION); @@ -204,7 +205,7 @@ bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err cmd->setTouchBarText(tr("Decl/Def", "text on macOS touch bar")); connect(switchDeclarationDefinition, &QAction::triggered, this, &CppEditorPlugin::switchDeclarationDefinition); - contextMenu->addAction(cmd); + contextMenu->addAction(cmd, Constants::G_CONTEXT_FIRST); cppToolsMenu->addAction(cmd); touchBar->addAction(cmd, Core::Constants::G_TOUCHBAR_NAVIGATION); @@ -223,21 +224,21 @@ bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err cppToolsMenu->addAction(cmd); cmd = ActionManager::command(TextEditor::Constants::FIND_USAGES); - contextMenu->addAction(cmd); + contextMenu->addAction(cmd, Constants::G_CONTEXT_FIRST); cppToolsMenu->addAction(cmd); d->m_openTypeHierarchyAction = new QAction(tr("Open Type Hierarchy"), this); cmd = ActionManager::registerAction(d->m_openTypeHierarchyAction, Constants::OPEN_TYPE_HIERARCHY, context); cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? tr("Meta+Shift+T") : tr("Ctrl+Shift+T"))); connect(d->m_openTypeHierarchyAction, &QAction::triggered, this, &CppEditorPlugin::openTypeHierarchy); - contextMenu->addAction(cmd); + contextMenu->addAction(cmd, Constants::G_CONTEXT_FIRST); cppToolsMenu->addAction(cmd); d->m_openIncludeHierarchyAction = new QAction(tr("Open Include Hierarchy"), this); cmd = ActionManager::registerAction(d->m_openIncludeHierarchyAction, Constants::OPEN_INCLUDE_HIERARCHY, context); cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? tr("Meta+Shift+I") : tr("Ctrl+Shift+I"))); connect(d->m_openIncludeHierarchyAction, &QAction::triggered, this, &CppEditorPlugin::openIncludeHierarchy); - contextMenu->addAction(cmd); + contextMenu->addAction(cmd, Constants::G_CONTEXT_FIRST); cppToolsMenu->addAction(cmd); // Refactoring sub-menu @@ -256,19 +257,19 @@ bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err cppToolsMenu->addAction(cmd); // Update context in global context - cppToolsMenu->addSeparator(); + cppToolsMenu->addSeparator(Core::Constants::G_DEFAULT_THREE); d->m_reparseExternallyChangedFiles = new QAction(tr("Reparse Externally Changed Files"), this); cmd = ActionManager::registerAction(d->m_reparseExternallyChangedFiles, Constants::UPDATE_CODEMODEL); CppTools::CppModelManager *cppModelManager = CppTools::CppModelManager::instance(); connect(d->m_reparseExternallyChangedFiles, &QAction::triggered, cppModelManager, &CppTools::CppModelManager::updateModifiedSourceFiles); - cppToolsMenu->addAction(cmd); + cppToolsMenu->addAction(cmd, Core::Constants::G_DEFAULT_THREE); - cppToolsMenu->addSeparator(); + cppToolsMenu->addSeparator(Core::Constants::G_DEFAULT_THREE); QAction *inspectCppCodeModel = new QAction(tr("Inspect C++ Code Model..."), this); cmd = ActionManager::registerAction(inspectCppCodeModel, Constants::INSPECT_CPP_CODEMODEL); cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? tr("Meta+Shift+F12") : tr("Ctrl+Shift+F12"))); connect(inspectCppCodeModel, &QAction::triggered, d, &CppEditorPluginPrivate::inspectCppCodeModel); - cppToolsMenu->addAction(cmd); + cppToolsMenu->addAction(cmd, Core::Constants::G_DEFAULT_THREE); contextMenu->addSeparator(context); From 6cf8d7d64572b01c180740c81708d3b02b528a3b Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 24 Mar 2020 13:51:16 +0200 Subject: [PATCH 15/27] QmlDesigner: Create thumbnail for imported 3D assets Qmlpuppet now allows creating icon from qml source code. Invoke qmlpuppet with following arguments to create icons: --rendericon E.g. --rendericon 24 ~/my_icon.png ~/my_icon.qml Two icons are created, one with size x size dimensions and one with double the dimensions and "@2x" injected into the file name. 3D asset import utilizes this icon rendering to produce item library icons for imported components. Change-Id: I92c62c80d961f5f61a0ce1c09b32bbcbf80ea56c Fixes: QDS-1052 Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann --- .../qmlpuppet/mockfiles/IconRenderer3D.qml | 92 +++++++++ .../qml2puppet/editor3d/generalhelper.cpp | 2 +- .../qml2puppet/iconrenderer/iconrenderer.cpp | 181 ++++++++++++++++++ .../qml2puppet/iconrenderer/iconrenderer.h | 56 ++++++ .../qml2puppet/iconrenderer/iconrenderer.pri | 3 + .../qml/qmlpuppet/qml2puppet/qml2puppet.pri | 1 + .../qmlpuppet/qml2puppet/qml2puppetmain.cpp | 14 +- share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc | 1 + .../itemlibrary/itemlibraryassetimporter.cpp | 175 ++++++++++++----- .../itemlibrary/itemlibraryassetimporter.h | 8 + .../designercore/instances/puppetcreator.cpp | 18 +- .../designercore/instances/puppetcreator.h | 6 +- src/tools/qml2puppet/CMakeLists.txt | 6 + src/tools/qml2puppet/qml2puppet.qbs | 2 + 14 files changed, 506 insertions(+), 59 deletions(-) create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/IconRenderer3D.qml create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.h create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.pri diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/IconRenderer3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/IconRenderer3D.qml new file mode 100644 index 00000000000..b16b27406d9 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/IconRenderer3D.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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. +** +****************************************************************************/ + +import QtQuick 2.15 +import QtQuick3D 1.15 + +Item { + id: viewRoot + width: 1024 + height: 1024 + visible: true + + property alias view3D: view3D + property alias camPos: viewCamera.position + + function setSceneToBox() + { + selectionBox.targetNode = view3D.importScene; + } + + function fitAndHideBox() : bool + { + cameraControl.focusObject(selectionBox.model, viewCamera.eulerRotation, true); + if (cameraControl._zoomFactor < 0.1) { + view3D.importScene.scale = view3D.importScene.scale.times(10); + return false; + } + if (cameraControl._zoomFactor > 100) { + view3D.importScene.scale = view3D.importScene.scale.times(0.1); + return false; + } + + selectionBox.visible = false; + return true + } + + View3D { + id: view3D + camera: viewCamera + environment: sceneEnv + + SceneEnvironment { + id: sceneEnv + antialiasingMode: SceneEnvironment.MSAA + antialiasingQuality: SceneEnvironment.VeryHigh + } + + PerspectiveCamera { + id: viewCamera + position: Qt.vector3d(-200, 200, 200) + eulerRotation: Qt.vector3d(-45, -45, 0) + } + + DirectionalLight { + rotation: viewCamera.rotation + } + + SelectionBox { + id: selectionBox + view3D: view3D + geometryName: "SB" + } + + EditCameraController { + id: cameraControl + camera: view3D.camera + view3d: view3D + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp index 8fe5395a6a5..f99d219c5c5 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp @@ -200,7 +200,7 @@ QVector4D GeneralHelper::focusObjectToCamera(QQuick3DCamera *camera, float defau camera->setPosition(lookAt + newLookVector); - float newZoomFactor = updateZoom ? qBound(.01f, float(maxExtent / 700.), 100.f) : oldZoom; + float newZoomFactor = updateZoom ? qBound(.01f, float(maxExtent / 900.), 100.f) : oldZoom; float cameraZoomFactor = zoomCamera(camera, 0, defaultLookAtDistance, lookAt, newZoomFactor, false); return QVector4D(lookAt, cameraZoomFactor); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp new file mode 100644 index 00000000000..034a809b16f --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.cpp @@ -0,0 +1,181 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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. +** +****************************************************************************/ + +#include "iconrenderer.h" +#include "../editor3d/selectionboxgeometry.h" +#include "../editor3d/generalhelper.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef QUICK3D_MODULE +#include +#include +#endif + +#include + +IconRenderer::IconRenderer(int size, const QString &filePath, const QString &source) + : QObject(nullptr) + , m_size(size) + , m_filePath(filePath) + , m_source(source) +{ +} + +void IconRenderer::setupRender() +{ + DesignerSupport::activateDesignerMode(); + DesignerSupport::activateDesignerWindowManager(); + + m_quickView = new QQuickView; + + QSurfaceFormat surfaceFormat = m_quickView->requestedFormat(); + surfaceFormat.setVersion(4, 1); + surfaceFormat.setProfile(QSurfaceFormat::CoreProfile); + m_quickView->setFormat(surfaceFormat); + + DesignerSupport::createOpenGLContext(m_quickView); + + QQmlComponent component(m_quickView->engine()); + component.loadUrl(QUrl::fromLocalFile(m_source)); + QObject *iconItem = component.create(); + + if (iconItem) { + QQuickItem *containerItem = nullptr; + bool is3D = false; +#ifdef QUICK3D_MODULE + if (auto scene = qobject_cast(iconItem)) { + qmlRegisterType("SelectionBoxGeometry", 1, 0, "SelectionBoxGeometry"); + QQmlComponent component(m_quickView->engine()); + component.loadUrl(QUrl("qrc:/qtquickplugin/mockfiles/IconRenderer3D.qml")); + containerItem = qobject_cast(component.create()); + DesignerSupport::setRootItem(m_quickView, containerItem); + + auto helper = new QmlDesigner::Internal::GeneralHelper(); + m_quickView->engine()->rootContext()->setContextProperty("_generalHelper", helper); + + m_contentItem = QQmlProperty::read(containerItem, "view3D").value(); + auto view3D = qobject_cast(m_contentItem); + view3D->setImportScene(scene); + is3D = true; + } else +#endif + if (auto scene = qobject_cast(iconItem)) { + m_contentItem = scene; + containerItem = new QQuickItem(); + containerItem->setSize(QSizeF(1024, 1024)); + DesignerSupport::setRootItem(m_quickView, containerItem); + m_contentItem->setParentItem(containerItem); + } + + if (containerItem && m_contentItem) { + m_contentItem->setSize(QSizeF(m_size, m_size)); + if (m_contentItem->width() > containerItem->width()) + containerItem->setWidth(m_contentItem->width()); + if (m_contentItem->height() > containerItem->height()) + containerItem->setHeight(m_contentItem->height()); + + QTimer::singleShot(0, this, [this, containerItem, is3D]() { + m_designerSupport.refFromEffectItem(m_quickView->rootObject(), false); + QQuickDesignerSupportItems::disableNativeTextRendering(m_quickView->rootObject()); + +#ifdef QUICK3D_MODULE + if (is3D) { + // Render once to make sure scene is up to date before we set up the selection box + render({}); + QMetaObject::invokeMethod(containerItem, "setSceneToBox"); + bool success = false; + int tries = 0; + while (!success && tries < 10) { + ++tries; + render({}); + QMetaObject::invokeMethod(containerItem, "fitAndHideBox", + Q_RETURN_ARG(bool, success)); + } + } +#else + Q_UNUSED(is3D) +#endif + QFileInfo fi(m_filePath); + + // Render regular size image + render(fi.absoluteFilePath()); + + // Render @2x image + m_contentItem->setSize(QSizeF(m_size * 2, m_size * 2)); + + QString saveFile; + saveFile = fi.absolutePath() + '/' + fi.completeBaseName() + "@2x"; + if (!fi.suffix().isEmpty()) + saveFile += '.' + fi.suffix(); + + fi.absoluteDir().mkpath("."); + + render(saveFile); + + // Allow little time for file operations to finish + QTimer::singleShot(1000, qGuiApp, &QGuiApplication::quit); + }); + } else { + qGuiApp->quit(); + } + } else { + qGuiApp->quit(); + } +} + +void IconRenderer::render(const QString &fileName) +{ + std::function updateNodesRecursive; + updateNodesRecursive = [&updateNodesRecursive](QQuickItem *item) { + const auto childItems = item->childItems(); + for (QQuickItem *childItem : childItems) + updateNodesRecursive(childItem); + DesignerSupport::updateDirtyNode(item); + }; + updateNodesRecursive(m_quickView->rootObject()); + + QRect rect(QPoint(), m_contentItem->size().toSize()); + QImage renderImage = m_designerSupport.renderImageForItem(m_quickView->rootObject(), + rect, rect.size()); + if (!fileName.isEmpty()) { + QFileInfo fi(fileName); + if (fi.suffix().isEmpty()) + renderImage.save(fileName, "PNG"); + else + renderImage.save(fileName); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.h new file mode 100644 index 00000000000..f7bab0f6fc6 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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. +** +****************************************************************************/ + +#pragma once + +#include +#include + +#include + +QT_BEGIN_NAMESPACE +class QQuickView; +class QQuickItem; +QT_END_NAMESPACE + +class IconRenderer : public QObject +{ + Q_OBJECT + +public: + explicit IconRenderer(int size, const QString &filePath, const QString &source); + + void setupRender(); + +private: + void render(const QString &fileName); + + int m_size = 16; + QString m_filePath; + QString m_source; + QQuickView *m_quickView = nullptr; + QQuickItem *m_contentItem = nullptr; + DesignerSupport m_designerSupport; +}; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.pri new file mode 100644 index 00000000000..59d5b12cee1 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/iconrenderer/iconrenderer.pri @@ -0,0 +1,3 @@ +HEADERS += $$PWD/iconrenderer.h + +SOURCES += $$PWD/iconrenderer.cpp diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri index d0bab57ca1a..b8013102767 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri @@ -13,6 +13,7 @@ include (../container/container.pri) include (../interfaces/interfaces.pri) include (../types/types.pri) include (../qmlprivategate/qmlprivategate.pri) +include (iconrenderer/iconrenderer.pri) SOURCES += $$PWD/qml2puppetmain.cpp RESOURCES += $$PWD/../qmlpuppet.qrc diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppetmain.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppetmain.cpp index 70f403512fa..ee2f5bac599 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppetmain.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppetmain.cpp @@ -32,6 +32,7 @@ #include #include +#include "iconrenderer/iconrenderer.h" #include #include @@ -52,11 +53,13 @@ int internalMain(QGuiApplication *application) QCoreApplication::setApplicationVersion("1.0.0"); if (application->arguments().count() < 2 - || (application->arguments().at(1) == "--readcapturedstream" && application->arguments().count() < 3)) { + || (application->arguments().at(1) == "--readcapturedstream" && application->arguments().count() < 3) + || (application->arguments().at(1) == "--rendericon" && application->arguments().count() < 5)) { qDebug() << "Usage:\n"; qDebug() << "--test"; qDebug() << "--version"; qDebug() << "--readcapturedstream [control stream file]"; + qDebug() << "--rendericon "; return -1; } @@ -108,7 +111,16 @@ int internalMain(QGuiApplication *application) return -1; } + if (application->arguments().at(1) == "--rendericon") { + int size = application->arguments().at(2).toInt(); + QString iconFileName = application->arguments().at(3); + QString iconSource = application->arguments().at(4); + IconRenderer *iconRenderer = new IconRenderer(size, iconFileName, iconSource); + iconRenderer->setupRender(); + + return application->exec(); + } #ifdef ENABLE_QT_BREAKPAD const QString libexecPath = QCoreApplication::applicationDirPath() + '/' + RELATIVE_LIBEXEC_PATH; diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc index 0585896fedb..81f28c13ed3 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc @@ -7,6 +7,7 @@ mockfiles/SwipeView.qml mockfiles/GenericBackend.qml mockfiles/Dialog.qml + mockfiles/IconRenderer3D.qml mockfiles/EditView3D.qml mockfiles/EditCameraController.qml mockfiles/Arrow.qml diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp index b50322b4bb2..5d2686e8995 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp @@ -28,6 +28,7 @@ #include "rewriterview.h" #include "model.h" +#include "puppetcreator.h" #include #include @@ -84,44 +85,14 @@ void ItemLibraryAssetImporter::importQuick3D(const QStringList &inputFiles, parseFiles(inputFiles, options, extToImportOptionsMap); if (!isCancelled()) { - // Don't allow cancel anymore as existing asset overwrites are not trivially recoverable. - // Also, on Windows at least you can't delete a subdirectory of a watched directory, - // so complete rollback is no longer possible in any case. - emit importNearlyFinished(); - - copyImportedFiles(); - - auto doc = QmlDesignerPlugin::instance()->currentDesignDocument(); - Model *model = doc ? doc->currentModel() : nullptr; - if (model && !m_importFiles.isEmpty()) { - const QString progressTitle = tr("Updating data model."); + // Wait for icon generation processes to finish + if (m_qmlPuppetProcesses.isEmpty()) { + finalizeQuick3DImport(); + } else { + m_qmlPuppetCount = m_qmlPuppetProcesses.size(); + const QString progressTitle = tr("Generating icons."); addInfo(progressTitle); notifyProgress(0, progressTitle); - - // Trigger underlying qmljs snapshot update by making a non-change to the doc - model->rewriterView()->textModifier()->replace(0, 0, {}); - - // There is a inbuilt delay before rewriter change actually updates the data model, - // so we need to wait for a moment to allow the change to take effect. - // Otherwise subsequent subcomponent manager update won't detect new imports properly. - QTimer *timer = new QTimer(parent()); - static int counter; - counter = 0; - timer->callOnTimeout([this, timer, progressTitle, doc]() { - if (!isCancelled()) { - notifyProgress(++counter * 10, progressTitle); - if (counter >= 10) { - doc->updateSubcomponentManager(); - timer->stop(); - notifyFinished(); - } - } else { - timer->stop(); - } - }); - timer->start(100); - } else { - notifyFinished(); } } #else @@ -208,6 +179,26 @@ QHash ItemLibraryAssetImporter::supportedExtensions() cons #endif } +void ItemLibraryAssetImporter::processFinished(int exitCode, QProcess::ExitStatus exitStatus) +{ + Q_UNUSED(exitCode) + Q_UNUSED(exitStatus) + + auto process = qobject_cast(sender()); + if (process) { + m_qmlPuppetProcesses.remove(process); + process->deleteLater(); + const QString progressTitle = tr("Generating icons."); + if (m_qmlPuppetProcesses.isEmpty()) { + notifyProgress(100, progressTitle); + finalizeQuick3DImport(); + } else { + notifyProgress(int(100. * (1. - double(m_qmlPuppetCount) / double(m_qmlPuppetProcesses.size()))), + progressTitle); + } + } +} + void ItemLibraryAssetImporter::notifyFinished() { m_isImporting = false; @@ -224,6 +215,9 @@ void ItemLibraryAssetImporter::reset() m_tempDir = new QTemporaryDir; m_importFiles.clear(); m_overwrittenImports.clear(); + qDeleteAll(m_qmlPuppetProcesses); + m_qmlPuppetProcesses.clear(); + m_qmlPuppetCount = 0; #endif } @@ -307,6 +301,14 @@ void ItemLibraryAssetImporter::parseQuick3DAsset(const QString &file, const QVar return; } + QHash assetFiles; + const int outDirPathSize = outDir.path().size(); + auto insertAsset = [&](const QString &filePath) { + QString targetPath = filePath.mid(outDirPathSize); + targetPath.prepend(targetDirPath); + assetFiles.insert(filePath, targetPath); + }; + // Generate qmldir file if importer doesn't already make one QString qmldirFileName = outDir.absoluteFilePath(QStringLiteral("qmldir")); if (!QFileInfo(qmldirFileName).exists()) { @@ -349,8 +351,6 @@ void ItemLibraryAssetImporter::parseQuick3DAsset(const QString &file, const QVar int nlIdx = content.lastIndexOf('\n', braceIdx); QByteArray rootItem = content.mid(nlIdx, braceIdx - nlIdx).trimmed(); if (rootItem == "Node") { // a 3D object - QFile::copy(":/ItemLibrary/images/item-3D_model-icon.png", iconFileName); - QFile::copy(":/ItemLibrary/images/item-3D_model-icon@2x.png", iconFileName2x); // create hints file with proper hints QFile file(outDir.path() + '/' + fi.baseName() + ".hints"); file.open(QIODevice::WriteOnly | QIODevice::Text); @@ -359,9 +359,14 @@ void ItemLibraryAssetImporter::parseQuick3DAsset(const QString &file, const QVar out << "canBeDroppedInFormEditor: false" << endl; out << "canBeDroppedInView3D: true" << endl; file.close(); - } else { - QFile::copy(":/ItemLibrary/images/item-default-icon.png", iconFileName); - QFile::copy(":/ItemLibrary/images/item-default-icon@2x.png", iconFileName2x); + } + QString outIconSource = QString::fromUtf8(content); + if (generateComponentIcon(24, iconFileName, qmlIt.filePath())) { + // Since icon is generated by external process, the file won't be + // ready for asset gathering below, so assume its generation succeeds + // and add it now. + insertAsset(iconFileName); + insertAsset(iconFileName2x); } } } @@ -375,15 +380,10 @@ void ItemLibraryAssetImporter::parseQuick3DAsset(const QString &file, const QVar } // Gather all generated files - const int outDirPathSize = outDir.path().size(); QDirIterator dirIt(outDir.path(), QDir::Files, QDirIterator::Subdirectories); - QHash assetFiles; while (dirIt.hasNext()) { dirIt.next(); - const QString filePath = dirIt.filePath(); - QString targetPath = filePath.mid(outDirPathSize); - targetPath.prepend(targetDirPath); - assetFiles.insert(filePath, targetPath); + insertAsset(dirIt.filePath()); } // Copy the original asset into a subdirectory @@ -428,10 +428,12 @@ void ItemLibraryAssetImporter::copyImportedFiles() // by filesystem watchers. QHash::const_iterator it = assetFiles.begin(); while (it != assetFiles.end()) { - QDir targetDir = QFileInfo(it.value()).dir(); - if (!targetDir.exists()) - targetDir.mkpath(QStringLiteral(".")); - QFile::copy(it.key(), it.value()); + if (QFileInfo(it.key()).exists()) { + QDir targetDir = QFileInfo(it.value()).dir(); + if (!targetDir.exists()) + targetDir.mkpath("."); + QFile::copy(it.key(), it.value()); + } ++it; } notifyProgress((100 * ++counter) / m_importFiles.size(), progressTitle); @@ -461,6 +463,77 @@ bool ItemLibraryAssetImporter::confirmAssetOverwrite(const QString &assetName) QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes; } +bool ItemLibraryAssetImporter::generateComponentIcon(int size, const QString &iconFile, + const QString &iconSource) +{ + auto doc = QmlDesignerPlugin::instance()->currentDesignDocument(); + Model *model = doc ? doc->currentModel() : nullptr; + + if (model) { + PuppetCreator puppetCreator(doc->currentTarget(), model); + puppetCreator.createQml2PuppetExecutableIfMissing(); + QStringList puppetArgs; + puppetArgs << "--rendericon" << QString::number(size) << iconFile << iconSource; + QProcess *process = puppetCreator.createPuppetProcess( + "custom", {}, this, "", SLOT(processFinished(int, QProcess::ExitStatus)), puppetArgs); + + if (process->waitForStarted(5000)) { + connect(process, QOverload::of(&QProcess::finished), + process, &QProcess::deleteLater); + m_qmlPuppetProcesses << process; + return true; + } else { + delete process; + } + } + return false; +} + +void ItemLibraryAssetImporter::finalizeQuick3DImport() +{ + if (!isCancelled()) { + // Don't allow cancel anymore as existing asset overwrites are not trivially recoverable. + // Also, on Windows at least you can't delete a subdirectory of a watched directory, + // so complete rollback is no longer possible in any case. + emit importNearlyFinished(); + + copyImportedFiles(); + + auto doc = QmlDesignerPlugin::instance()->currentDesignDocument(); + Model *model = doc ? doc->currentModel() : nullptr; + if (model && !m_importFiles.isEmpty()) { + const QString progressTitle = tr("Updating data model."); + addInfo(progressTitle); + notifyProgress(0, progressTitle); + + // Trigger underlying qmljs snapshot update by making a non-change to the doc + model->rewriterView()->textModifier()->replace(0, 0, {}); + + // There is an inbuilt delay before rewriter change actually updates the data model, + // so we need to wait for a moment to allow the change to take effect. + // Otherwise subsequent subcomponent manager update won't detect new imports properly. + QTimer *timer = new QTimer(parent()); + static int counter; + counter = 0; + timer->callOnTimeout([this, timer, progressTitle, doc]() { + if (!isCancelled()) { + notifyProgress(++counter * 10, progressTitle); + if (counter >= 10) { + doc->updateSubcomponentManager(); + timer->stop(); + notifyFinished(); + } + } else { + timer->stop(); + } + }); + timer->start(100); + } else { + notifyFinished(); + } + } +} + bool ItemLibraryAssetImporter::isCancelled() const { keepUiAlive(); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h index 67b36c6e72b..4bdccad6af9 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.h @@ -29,6 +29,7 @@ #include #include #include +#include #include "import.h" @@ -72,6 +73,9 @@ signals: void importNearlyFinished() const; void importFinished(); +private slots: + void processFinished(int exitCode, QProcess::ExitStatus exitStatus); + private: void notifyFinished(); void reset(); @@ -83,6 +87,8 @@ private: void notifyProgress(int value, const QString &text) const; void keepUiAlive() const; bool confirmAssetOverwrite(const QString &assetName); + bool generateComponentIcon(int size, const QString &iconFile, const QString &iconSource); + void finalizeQuick3DImport(); #ifdef IMPORT_QUICK3D_ASSETS QScopedPointer m_quick3DAssetImporter; @@ -93,5 +99,7 @@ private: bool m_cancelled = false; QString m_importPath; QTemporaryDir *m_tempDir = nullptr; + QSet m_qmlPuppetProcesses; + int m_qmlPuppetCount = 0; }; } // QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index ba5b9a9f04d..f480e9bb97c 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -177,7 +177,8 @@ QProcess *PuppetCreator::createPuppetProcess(const QString &puppetMode, const QString &socketToken, QObject *handlerObject, const char *outputSlot, - const char *finishSlot) const + const char *finishSlot, + const QStringList &customOptions) const { return puppetProcess(qml2PuppetPath(m_availablePuppetType), qmlPuppetDirectory(m_availablePuppetType), @@ -185,7 +186,8 @@ QProcess *PuppetCreator::createPuppetProcess(const QString &puppetMode, socketToken, handlerObject, outputSlot, - finishSlot); + finishSlot, + customOptions); } @@ -195,7 +197,8 @@ QProcess *PuppetCreator::puppetProcess(const QString &puppetPath, const QString &socketToken, QObject *handlerObject, const char *outputSlot, - const char *finishSlot) const + const char *finishSlot, + const QStringList &customOptions) const { auto puppetProcess = new QProcess; puppetProcess->setObjectName(puppetMode); @@ -228,7 +231,14 @@ QProcess *PuppetCreator::puppetProcess(const QString &puppetPath, if (forceFreeType) forceFreeTypeOption = "-platform windows:fontengine=freetype"; - puppetProcess->start(puppetPath, {socketToken, puppetMode, "-graphicssystem raster", forceFreeTypeOption }); + if (puppetMode == "custom") { + QStringList args = customOptions; + args << "-graphicssystem raster"; + args << forceFreeTypeOption; + puppetProcess->start(puppetPath, args); + } else { + puppetProcess->start(puppetPath, {socketToken, puppetMode, "-graphicssystem raster", forceFreeTypeOption }); + } #ifndef QMLDESIGNER_TEST QString debugPuppet = m_designerSettings.value(DesignerSettingsKey:: diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.h b/src/plugins/qmldesigner/designercore/instances/puppetcreator.h index d11a798a319..bafea8fa3e6 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.h +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.h @@ -57,7 +57,8 @@ public: const QString &socketToken, QObject *handlerObject, const char *outputSlot, - const char *finishSlot) const; + const char *finishSlot, + const QStringList &customOptions = {}) const; void setQrcMappingString(const QString qrcMapping); @@ -87,7 +88,8 @@ protected: const QString &socketToken, QObject *handlerObject, const char *outputSlot, - const char *finishSlot) const; + const char *finishSlot, + const QStringList &customOptions) const; QProcessEnvironment processEnvironment() const; diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index da25ec53964..24a2b90351a 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -120,6 +120,12 @@ extend_qtc_executable(qml2puppet linegeometry.cpp linegeometry.h ) +extend_qtc_executable(qml2puppet + SOURCES_PREFIX "${SRCDIR}/qml2puppet/iconrenderer" + SOURCES + iconrenderer.cpp iconrenderer.h +) + extend_qtc_executable(qml2puppet SOURCES_PREFIX "${SRCDIR}/qml2puppet/instances" SOURCES diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index 445ab2e867a..5ca88541b00 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -217,6 +217,8 @@ QtcTool { "editor3d/selectionboxgeometry.h", "editor3d/linegeometry.cpp", "editor3d/linegeometry.h", + "iconrenderer/iconrenderer.cpp", + "iconrenderer/iconrenderer.h", "qml2puppetmain.cpp", ] } From 39297fecb4cbeb4a41f3d9f30986200038302e63 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 26 Mar 2020 15:47:55 +0100 Subject: [PATCH 16/27] Doc: Do not suggest to put sed in PATH Later on it is suggested to put it in the Kit's environment. Change-Id: I8268dac16bd03b9e7b1474cfece91f9e403d72bb Reviewed-by: Leena Miettinen --- doc/qtcreator/src/webassembly/creator-webassembly.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc index 083f8b7d40b..e648fb9c4b0 100644 --- a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc +++ b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc @@ -76,7 +76,7 @@ instructed in \l {Qt for WebAssembly}. \li On Windows, you have to download and install \c sed, as instructed in \l{http://gnuwin32.sourceforge.net/packages/sed.htm} - {sed for Windows}, and add its location to the system PATH. + {sed for Windows}. \li In \QC, select \uicontrol Help > \uicontrol {About Plugins} > \uicontrol {Device Support} > \uicontrol {WebAssembly} to enable the plugin. From c3fca6e7183a03d51cfffb68a2b8c9c6f4c50944 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 26 Mar 2020 15:36:10 +0100 Subject: [PATCH 17/27] Doc: Fix MinGW link Change-Id: Iff955512f1a4032304f37391d27c6fd4d732cb19 Reviewed-by: Leena Miettinen --- doc/qtcreator/src/webassembly/creator-webassembly.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc index e648fb9c4b0..b245fcb363c 100644 --- a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc +++ b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc @@ -54,7 +54,7 @@ \list \li Qt for WebAssembly 5.13.1, or later - \li On Windows: \l{http://mingw.org/}{MinGW} 7.3.0, or later + \li On Windows: \l{http://wiki.qt.io/MinGW}{MinGW} 7.3.0, or later \li \l{https://emscripten.org/docs/introducing_emscripten/index.html} {emscripten} tool chain for compiling to WebAssembly \li \c sed stream editor From 8288d6e97b00f08630eec5ca3024b31dd73a5d15 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 30 Mar 2020 11:55:30 +0300 Subject: [PATCH 18/27] Fix compile issue when there is no quick3dassetimport module Change-Id: I769a977f8422e002ed5680c1788aa6d3948f0534 Reviewed-by: Mahmoud Badri --- .../components/itemlibrary/itemlibraryassetimporter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp index 5d2686e8995..37f3acd4aa4 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp @@ -491,6 +491,7 @@ bool ItemLibraryAssetImporter::generateComponentIcon(int size, const QString &ic void ItemLibraryAssetImporter::finalizeQuick3DImport() { +#ifdef IMPORT_QUICK3D_ASSETS if (!isCancelled()) { // Don't allow cancel anymore as existing asset overwrites are not trivially recoverable. // Also, on Windows at least you can't delete a subdirectory of a watched directory, @@ -532,6 +533,7 @@ void ItemLibraryAssetImporter::finalizeQuick3DImport() notifyFinished(); } } +#endif } bool ItemLibraryAssetImporter::isCancelled() const From 621a823a539069b632e034f88594558a2d5663ab Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Fri, 27 Mar 2020 20:16:29 +0200 Subject: [PATCH 19/27] QmlDesigner: Enable toggling the helper grid on/off Also remove the toolbar buttons from the puppet side and few other clean-ups. Task-number: QDS-1849 Change-Id: I075753552043a9f1bc649f6baf54dc7b689e4f64 Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../qmlpuppet/commands/view3dactioncommand.h | 3 +- .../qml/qmlpuppet/mockfiles/EditView3D.qml | 233 +++--------------- .../qml/qmlpuppet/mockfiles/SceneView3D.qml | 5 +- .../qt5informationnodeinstanceserver.cpp | 11 +- .../qmldesigner/components/edit3d/edit3d.qrc | 4 + .../components/edit3d/edit3dview.cpp | 25 +- .../components/edit3d/edit3dview.h | 1 + .../components/edit3d/images/grid_off.png | Bin 0 -> 221 bytes .../components/edit3d/images/grid_off@2x.png | Bin 0 -> 116 bytes .../components/edit3d/images/grid_on.png | Bin 0 -> 221 bytes .../components/edit3d/images/grid_on@2x.png | Bin 0 -> 116 bytes .../qmldesigner/qmldesignerconstants.h | 17 +- src/plugins/qmldesigner/qmldesignericons.h | 4 + 13 files changed, 90 insertions(+), 213 deletions(-) create mode 100644 src/plugins/qmldesigner/components/edit3d/images/grid_off.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/grid_off@2x.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/grid_on.png create mode 100644 src/plugins/qmldesigner/components/edit3d/images/grid_on@2x.png diff --git a/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.h b/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.h index 9f25e2abb4b..332b6006c39 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.h +++ b/share/qtcreator/qml/qmlpuppet/commands/view3dactioncommand.h @@ -43,7 +43,8 @@ public: SelectionModeToggle, CameraToggle, OrientationToggle, - EditLightToggle + EditLightToggle, + ShowGrid }; explicit View3DActionCommand(Type type, bool enable); diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index 3910b36fd7f..92bc91edff3 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -24,7 +24,6 @@ ****************************************************************************/ import QtQuick 2.12 -import QtQuick.Window 2.12 import QtQuick3D 1.15 import QtQuick.Controls 2.0 import QtGraphicalEffects 1.0 @@ -40,11 +39,18 @@ Item { property View3D editView: null property string sceneId - property alias showEditLight: btnEditViewLight.toggled - property alias usePerspective: btnPerspective.toggled - property alias globalOrientation: btnLocalGlobal.toggled + property bool showEditLight: false + property bool showGrid: true + property bool usePerspective: true + property bool globalOrientation: false property alias contentItem: contentItem + enum SelectionMode { Item, Group } + enum TransformMode { Move, Rotate, Scale } + + property int selectionMode: EditView3D.SelectionMode.Item + property int transformMode: EditView3D.TransformMode.Move + property Node selectedNode: null // This is non-null only in single selection case property var selectedNodes: [] // All selected nodes @@ -53,16 +59,18 @@ Item { property var selectionBoxes: [] property rect viewPortRect: Qt.rect(0, 0, 1000, 1000) - property bool showButtons: false - signal selectionChanged(var selectedNodes) signal commitObjectProperty(var object, var propName) signal changeObjectProperty(var object, var propName) signal notifyActiveSceneChange() - onUsePerspectiveChanged: _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective) - onShowEditLightChanged: _generalHelper.storeToolState(sceneId,"showEditLight", showEditLight) + onUsePerspectiveChanged: _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective) + onShowEditLightChanged: _generalHelper.storeToolState(sceneId, "showEditLight", showEditLight) onGlobalOrientationChanged: _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation) + onShowGridChanged: _generalHelper.storeToolState(sceneId, "showGrid", showGrid); + onSelectionModeChanged: _generalHelper.storeToolState(sceneId, "selectionMode", selectionMode); + onTransformModeChanged: _generalHelper.storeToolState(sceneId, "transformMode", transformMode); + onActiveSceneChanged: updateActiveScene() function createEditView() @@ -72,11 +80,13 @@ Item { editView = component.createObject(viewRect, {"usePerspective": usePerspective, "showSceneLight": showEditLight, + "showGrid": showGrid, "importScene": activeScene, "cameraZoomFactor": cameraControl._zoomFactor, "z": 1}); editView.usePerspective = Qt.binding(function() {return usePerspective;}); editView.showSceneLight = Qt.binding(function() {return showEditLight;}); + editView.showGrid = Qt.binding(function() {return showGrid;}); editView.cameraZoomFactor = Qt.binding(function() {return cameraControl._zoomFactor;}); selectionBoxes.length = 0; @@ -148,41 +158,31 @@ Item { showEditLight = toolStates.showEditLight; else if (resetToDefault) showEditLight = false; + + if ("showGrid" in toolStates) + showGrid = toolStates.showGrid; + else if (resetToDefault) + showGrid = true; + if ("usePerspective" in toolStates) usePerspective = toolStates.usePerspective; else if (resetToDefault) - usePerspective = false; + usePerspective = true; + if ("globalOrientation" in toolStates) globalOrientation = toolStates.globalOrientation; else if (resetToDefault) globalOrientation = false; - var groupIndex; - var group; - var i; + if ("selectionMode" in toolStates) + selectionMode = toolStates.selectionMode; + else if (resetToDefault) + selectionMode = EditView3D.SelectionMode.Item; - if ("groupSelect" in toolStates) { - groupIndex = toolStates.groupSelect; - group = toolbarButtons.buttonGroups["groupSelect"]; - for (i = 0; i < group.length; ++i) - group[i].selected = (i === groupIndex); - _generalHelper.storeToolState(sceneId, "groupSelect", groupIndex) - } else if (resetToDefault) { - btnSelectItem.selected = true; - btnSelectGroup.selected = false; - } - - if ("groupTransform" in toolStates) { - groupIndex = toolStates.groupTransform; - group = toolbarButtons.buttonGroups["groupTransform"]; - for (i = 0; i < group.length; ++i) - group[i].selected = (i === groupIndex); - _generalHelper.storeToolState(sceneId, "groupTransform", groupIndex) - } else if (resetToDefault) { - btnRotate.selected = false; - btnScale.selected = false; - btnMove.selected = true; - } + if ("transformMode" in toolStates) + transformMode = toolStates.transformMode; + else if (resetToDefault) + selectionMode = EditView3D.TransformMode.Move; if ("editCamState" in toolStates) cameraControl.restoreCameraState(toolStates.editCamState); @@ -193,25 +193,11 @@ Item { function storeCurrentToolStates() { _generalHelper.storeToolState(sceneId, "showEditLight", showEditLight) + _generalHelper.storeToolState(sceneId, "showGrid", showGrid) _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective) _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation) - - var group = toolbarButtons.buttonGroups["groupSelect"]; - var i; - for (i = 0; i < group.length; ++i) { - if (group[i].selected) { - _generalHelper.storeToolState(sceneId, "groupSelect", i) - break; - } - } - - group = toolbarButtons.buttonGroups["groupTransform"]; - for (i = 0; i < group.length; ++i) { - if (group[i].selected) { - _generalHelper.storeToolState(sceneId, "groupTransform", i) - break; - } - } + _generalHelper.storeToolState(sceneId, "selectionMode", selectionMode); + _generalHelper.storeToolState(sceneId, "transformMode", transformMode); cameraControl.storeCameraState(0); } @@ -259,7 +245,7 @@ Item { function handleObjectClicked(object, multi) { var theObject = object; - if (btnSelectGroup.selected) { + if (selectionMode === EditView3D.SelectionMode.Group) { while (theObject && theObject !== activeScene && theObject.parent !== activeScene) theObject = theObject.parent; } @@ -434,7 +420,7 @@ Item { highlightOnHover: true targetNode: viewRoot.selectedNode globalOrientation: viewRoot.globalOrientation - visible: viewRoot.selectedNode && btnMove.selected + visible: viewRoot.selectedNode && transformMode === EditView3D.TransformMode.Move view3D: overlayView dragHelper: gizmoDragHelper @@ -447,7 +433,7 @@ Item { scale: autoScale.getScale(Qt.vector3d(5, 5, 5)) highlightOnHover: true targetNode: viewRoot.selectedNode - visible: viewRoot.selectedNode && btnScale.selected + visible: viewRoot.selectedNode && transformMode === EditView3D.TransformMode.Scale view3D: overlayView dragHelper: gizmoDragHelper @@ -461,7 +447,7 @@ Item { highlightOnHover: true targetNode: viewRoot.selectedNode globalOrientation: viewRoot.globalOrientation - visible: viewRoot.selectedNode && btnRotate.selected + visible: viewRoot.selectedNode && transformMode === EditView3D.TransformMode.Rotate view3D: overlayView dragHelper: gizmoDragHelper @@ -626,107 +612,6 @@ Item { } } - Rectangle { // toolbar - id: toolbar - color: "#9F000000" - width: 35 - height: toolbarButtons.height - visible: viewRoot.showButtons - - Column { - id: toolbarButtons - anchors.horizontalCenter: parent.horizontalCenter - spacing: 5 - padding: 5 - - // Button groups must be defined in parent object of buttons - property var buttonGroups: { - "groupSelect": [btnSelectGroup, btnSelectItem], - "groupTransform": [btnMove, btnRotate, btnScale] - } - - ToolBarButton { - id: btnSelectItem - selected: true - tooltip: qsTr("Select Item") - shortcut: "Q" - currentShortcut: selected ? "" : shortcut - tool: "item_selection" - buttonGroup: "groupSelect" - sceneId: viewRoot.sceneId - } - - ToolBarButton { - id: btnSelectGroup - tooltip: qsTr("Select Group") - shortcut: "Q" - currentShortcut: btnSelectItem.currentShortcut === shortcut ? "" : shortcut - tool: "group_selection" - buttonGroup: "groupSelect" - sceneId: viewRoot.sceneId - } - - Rectangle { // separator - width: 25 - height: 1 - color: "#f1f1f1" - anchors.horizontalCenter: parent.horizontalCenter - } - - ToolBarButton { - id: btnMove - selected: true - tooltip: qsTr("Move current selection") - shortcut: "W" - currentShortcut: shortcut - tool: "move" - buttonGroup: "groupTransform" - sceneId: viewRoot.sceneId - } - - ToolBarButton { - id: btnRotate - tooltip: qsTr("Rotate current selection") - shortcut: "E" - currentShortcut: shortcut - tool: "rotate" - buttonGroup: "groupTransform" - sceneId: viewRoot.sceneId - } - - ToolBarButton { - id: btnScale - tooltip: qsTr("Scale current selection") - shortcut: "R" - currentShortcut: shortcut - tool: "scale" - buttonGroup: "groupTransform" - sceneId: viewRoot.sceneId - } - - Rectangle { // separator - width: 25 - height: 1 - color: "#f1f1f1" - anchors.horizontalCenter: parent.horizontalCenter - } - - ToolBarButton { - id: btnFit - tooltip: qsTr("Fit camera to current selection") - shortcut: "F" - currentShortcut: shortcut - tool: "fit" - togglable: false - - onSelectedChanged: { - if (selected) - viewRoot.fitToView(); - } - } - } - } - AxisHelper { anchors.right: parent.right anchors.top: parent.top @@ -735,41 +620,5 @@ Item { editCameraCtrl: cameraControl selectedNode : viewRoot.selectedNodes.length ? selectionBoxes[0].model : null } - - Rectangle { // top controls bar - color: "#aa000000" - width: 290 - height: btnPerspective.height + 10 - anchors.top: parent.top - anchors.right: parent.right - anchors.rightMargin: 100 - visible: viewRoot.showButtons - - Row { - padding: 5 - anchors.fill: parent - ToggleButton { - id: btnPerspective - width: 105 - tooltip: qsTr("Toggle Perspective / Orthographic Projection") - states: [{iconId: "ortho", text: qsTr("Orthographic")}, {iconId: "persp", text: qsTr("Perspective")}] - } - - ToggleButton { - id: btnLocalGlobal - width: 65 - tooltip: qsTr("Toggle Global / Local Orientation") - states: [{iconId: "local", text: qsTr("Local")}, {iconId: "global", text: qsTr("Global")}] - } - - ToggleButton { - id: btnEditViewLight - width: 110 - toggleBackground: true - tooltip: qsTr("Toggle Edit Light") - states: [{iconId: "edit_light_off", text: qsTr("Edit Light Off")}, {iconId: "edit_light_on", text: qsTr("Edit Light On")}] - } - } - } } } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/SceneView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/SceneView3D.qml index 72608d20b8f..7a376179d82 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/SceneView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/SceneView3D.qml @@ -23,7 +23,6 @@ ** ****************************************************************************/ -import QtQuick 2.12 import QtQuick3D 1.15 View3D { @@ -31,7 +30,8 @@ View3D { anchors.fill: parent property bool usePerspective: false - property bool showSceneLight: false + property alias showSceneLight: sceneLight.visible + property alias showGrid: helperGrid.visible property alias sceneHelpers: sceneHelpers property alias perspectiveCamera: scenePerspectiveCamera property alias orthoCamera: sceneOrthoCamera @@ -62,7 +62,6 @@ View3D { PointLight { id: sceneLight - visible: showSceneLight position: usePerspective ? scenePerspectiveCamera.position : sceneOrthoCamera.position quadraticFade: 0 diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 253147de020..d3a7420464b 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -1162,19 +1162,19 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c switch (command.type()) { case View3DActionCommand::MoveTool: - updatedState.insert("groupTransform", 0); + updatedState.insert("transformMode", 0); break; case View3DActionCommand::RotateTool: - updatedState.insert("groupTransform", 1); + updatedState.insert("transformMode", 1); break; case View3DActionCommand::ScaleTool: - updatedState.insert("groupTransform", 2); + updatedState.insert("transformMode", 2); break; case View3DActionCommand::FitToView: QMetaObject::invokeMethod(m_editView3DRootItem, "fitToView"); break; case View3DActionCommand::SelectionModeToggle: - updatedState.insert("groupSelect", command.isEnabled() ? 0 : 1); + updatedState.insert("selectionMode", command.isEnabled() ? 1 : 0); break; case View3DActionCommand::CameraToggle: updatedState.insert("usePerspective", command.isEnabled()); @@ -1187,6 +1187,9 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c case View3DActionCommand::EditLightToggle: updatedState.insert("showEditLight", command.isEnabled()); break; + case View3DActionCommand::ShowGrid: + updatedState.insert("showGrid", command.isEnabled()); + break; default: break; } diff --git a/src/plugins/qmldesigner/components/edit3d/edit3d.qrc b/src/plugins/qmldesigner/components/edit3d/edit3d.qrc index c0456890cd5..69e7113f023 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3d.qrc +++ b/src/plugins/qmldesigner/components/edit3d/edit3d.qrc @@ -8,6 +8,10 @@ images/edit_light_off@2x.png images/edit_light_on.png images/edit_light_on@2x.png + images/grid_off.png + images/grid_off@2x.png + images/grid_on.png + images/grid_on@2x.png images/fit_selected.png images/fit_selected@2x.png images/move_off.png diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index d06e1b299cf..c8e1e222e54 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -101,12 +101,13 @@ void Edit3DView::renderImage3DChanged(const QImage &img) void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState) { - const QString sceneKey = QStringLiteral("sceneInstanceId"); - const QString selectKey = QStringLiteral("groupSelect"); - const QString transformKey = QStringLiteral("groupTransform"); + const QString sceneKey = QStringLiteral("sceneInstanceId"); + const QString selectKey = QStringLiteral("selectionMode"); + const QString transformKey = QStringLiteral("transformMode"); const QString perspectiveKey = QStringLiteral("usePerspective"); const QString orientationKey = QStringLiteral("globalOrientation"); - const QString editLightKey = QStringLiteral("showEditLight"); + const QString editLightKey = QStringLiteral("showEditLight"); + const QString gridKey = QStringLiteral("showGrid"); if (sceneState.contains(sceneKey)) { qint32 newActiveScene = sceneState[sceneKey].value(); @@ -115,7 +116,7 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState) } if (sceneState.contains(selectKey)) - m_selectionModeAction->action()->setChecked(sceneState[selectKey].toInt() == 0); + m_selectionModeAction->action()->setChecked(sceneState[selectKey].toInt() == 1); else m_selectionModeAction->action()->setChecked(false); @@ -135,14 +136,21 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState) m_cameraModeAction->action()->setChecked(sceneState[perspectiveKey].toBool()); else m_cameraModeAction->action()->setChecked(false); + if (sceneState.contains(orientationKey)) m_orientationModeAction->action()->setChecked(sceneState[orientationKey].toBool()); else m_orientationModeAction->action()->setChecked(false); + if (sceneState.contains(editLightKey)) m_editLightAction->action()->setChecked(sceneState[editLightKey].toBool()); else m_editLightAction->action()->setChecked(false); + + if (sceneState.contains(gridKey)) + m_showGridAction->action()->setChecked(sceneState[gridKey].toBool()); + else + m_showGridAction->action()->setChecked(false); } void Edit3DView::modelAttached(Model *model) @@ -247,6 +255,12 @@ void Edit3DView::createEdit3DActions() QKeySequence(Qt::Key_U), true, false, Icons::EDIT3D_LIGHT_OFF.icon(), Icons::EDIT3D_LIGHT_ON.icon()); + m_showGridAction = new Edit3DAction( + QmlDesigner::Constants::EDIT3D_EDIT_SHOW_GRID, View3DActionCommand::ShowGrid, + QCoreApplication::translate("ShowGridAction", "Toggle grid visibility"), + QKeySequence(Qt::Key_G), true, true, Icons::EDIT3D_GRID_OFF.icon(), + Icons::EDIT3D_GRID_ON.icon()); + SelectionContextOperation resetTrigger = [this](const SelectionContext &) { setCurrentStateNode(rootModelNode()); resetPuppet(); @@ -270,6 +284,7 @@ void Edit3DView::createEdit3DActions() m_leftActions << m_cameraModeAction; m_leftActions << m_orientationModeAction; m_leftActions << m_editLightAction; + m_leftActions << m_showGridAction; m_rightActions << m_resetAction; } diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h index 5835c89b325..d1646470b75 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h @@ -87,6 +87,7 @@ private: Edit3DAction *m_cameraModeAction = nullptr; Edit3DAction *m_orientationModeAction = nullptr; Edit3DAction *m_editLightAction = nullptr; + Edit3DAction *m_showGridAction = nullptr; Edit3DAction *m_resetAction = nullptr; }; diff --git a/src/plugins/qmldesigner/components/edit3d/images/grid_off.png b/src/plugins/qmldesigner/components/edit3d/images/grid_off.png new file mode 100644 index 0000000000000000000000000000000000000000..4c355f70a89ef21893e7394bbcf7c20ed38103e1 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUC>lA|Ns9#SLwZ;fq{XkB*-uL*(Y5V zt|SHqhHy_8#}J9BrTw@04k&Oq2RgQ!|M|cEu3JH;-lWe?m(_F|qWKbX*z^A0)t)lP zQ&TM=+tE>YNBLovq;FhvWpt9xc=*`a9?=haz0`-ji-pzy=(Sh-3xEHSE>+`lJ~G4U RAp-*ggQu&X%Q~loCIETjTA2U< literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/grid_off@2x.png b/src/plugins/qmldesigner/components/edit3d/images/grid_off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..88db6b9badd42a1be2cd242ee91880b0ba93e306 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;ICT0c(20oEV=?n}EoB=)|u7xFK-@bkO|NnoA zXvtm%1_m`x7sn8ZsmT$ntUOB$#S9o2#krD2#RUWt0=&aDvK=%|?mF>Nlc7MauIYWD S4jTgl1B0ilpUXO@geCwxhaT4e literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/grid_on.png b/src/plugins/qmldesigner/components/edit3d/images/grid_on.png new file mode 100644 index 0000000000000000000000000000000000000000..4c355f70a89ef21893e7394bbcf7c20ed38103e1 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUC>lA|Ns9#SLwZ;fq{XkB*-uL*(Y5V zt|SHqhHy_8#}J9BrTw@04k&Oq2RgQ!|M|cEu3JH;-lWe?m(_F|qWKbX*z^A0)t)lP zQ&TM=+tE>YNBLovq;FhvWpt9xc=*`a9?=haz0`-ji-pzy=(Sh-3xEHSE>+`lJ~G4U RAp-*ggQu&X%Q~loCIETjTA2U< literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/edit3d/images/grid_on@2x.png b/src/plugins/qmldesigner/components/edit3d/images/grid_on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..88db6b9badd42a1be2cd242ee91880b0ba93e306 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;ICT0c(20oEV=?n}EoB=)|u7xFK-@bkO|NnoA zXvtm%1_m`x7sn8ZsmT$ntUOB$#S9o2#krD2#RUWt0=&aDvK=%|?mF>Nlc7MauIYWD S4jTgl1B0ilpUXO@geCwxhaT4e literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index b334dced8b6..0f5b06c5161 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -55,14 +55,15 @@ const char FORMEDITOR_NO_SNAPPING[] = "QmlDesigner.FormEditor.NoSnapping"; const char FORMEDITOR_NO_SNAPPING_AND_ANCHORING[] = "QmlDesigner.FormEditor.NoSnappingAndAnchoring"; const char FORMEDITOR_NO_SHOW_BOUNDING_RECTANGLE[] = "QmlDesigner.FormEditor.ShowBoundingRectangle"; const char EDIT3D_SELECTION_MODE[] = "QmlDesigner.Editor3D.SelectionModeToggle"; -const char EDIT3D_MOVE_TOOL[] = "QmlDesigner.Editor3D.MoveTool"; -const char EDIT3D_ROTATE_TOOL[] = "QmlDesigner.Editor3D.RotateTool"; -const char EDIT3D_SCALE_TOOL[] = "QmlDesigner.Editor3D.ScaleTool"; -const char EDIT3D_FIT_SELECTED[] = "QmlDesigner.Editor3D.FitSelected"; -const char EDIT3D_EDIT_CAMERA[] = "QmlDesigner.Editor3D.EditCameraToggle"; -const char EDIT3D_ORIENTATION[] = "QmlDesigner.Editor3D.OrientationToggle"; -const char EDIT3D_EDIT_LIGHT[] = "QmlDesigner.Editor3D.EditLightToggle"; -const char EDIT3D_RESET_VIEW[] = "QmlDesigner.Editor3D.ResetView"; +const char EDIT3D_MOVE_TOOL[] = "QmlDesigner.Editor3D.MoveTool"; +const char EDIT3D_ROTATE_TOOL[] = "QmlDesigner.Editor3D.RotateTool"; +const char EDIT3D_SCALE_TOOL[] = "QmlDesigner.Editor3D.ScaleTool"; +const char EDIT3D_FIT_SELECTED[] = "QmlDesigner.Editor3D.FitSelected"; +const char EDIT3D_EDIT_CAMERA[] = "QmlDesigner.Editor3D.EditCameraToggle"; +const char EDIT3D_ORIENTATION[] = "QmlDesigner.Editor3D.OrientationToggle"; +const char EDIT3D_EDIT_LIGHT[] = "QmlDesigner.Editor3D.EditLightToggle"; +const char EDIT3D_EDIT_SHOW_GRID[] = "QmlDesigner.Editor3D.ToggleGrid"; +const char EDIT3D_RESET_VIEW[] = "QmlDesigner.Editor3D.ResetView"; const char QML_DESIGNER_SUBFOLDER[] = "/designer/"; const char QUICK_3D_ASSETS_FOLDER[] = "/Quick3DAssets"; diff --git a/src/plugins/qmldesigner/qmldesignericons.h b/src/plugins/qmldesigner/qmldesignericons.h index 146565133d7..34c9061072e 100644 --- a/src/plugins/qmldesigner/qmldesignericons.h +++ b/src/plugins/qmldesigner/qmldesignericons.h @@ -51,6 +51,10 @@ const Utils::Icon EDIT3D_LIGHT_ON({ {QLatin1String(":/edit3d/images/edit_light_on.png"), Utils::Theme::IconsBaseColor}}); const Utils::Icon EDIT3D_LIGHT_OFF({ {QLatin1String(":/edit3d/images/edit_light_off.png"), Utils::Theme::IconsBaseColor}}); +const Utils::Icon EDIT3D_GRID_ON({ + {QLatin1String(":/edit3d/images/grid_on.png"), Utils::Theme::IconsBaseColor}}); +const Utils::Icon EDIT3D_GRID_OFF({ + {QLatin1String(":/edit3d/images/grid_off.png"), Utils::Theme::IconsBaseColor}}); const Utils::Icon EDIT3D_SELECTION_MODE_ON({ {QLatin1String(":/edit3d/images/select_group.png"), Utils::Theme::IconsBaseColor}}); const Utils::Icon EDIT3D_SELECTION_MODE_OFF({ From 29488fbdafa4da33b343dc26b208622d0bb58315 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 19 Mar 2020 17:13:51 +0100 Subject: [PATCH 20/27] Qbs: Suppress spurious warnings about mismatching compiler paths Apparently, MSVC toolchains set their compiler paths asynchronously, so don't complain if it's empty initially. Fixes: QTCREATORBUG-23725 Change-Id: Id800fa01d6368d244ec879181d12f6f7c7f1bf0a Reviewed-by: Kai Koehne --- src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp index 4f373b8ee34..d8f380e3b6f 100644 --- a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp +++ b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp @@ -353,7 +353,8 @@ QVariantMap DefaultPropertyProvider::autoGeneratedProperties(const ProjectExplor data.insert(QLatin1String(CPP_CXXCOMPILERNAME), cxxCompilerName); } - if (tcC && tcCxx && cFileInfo.absolutePath() != cxxFileInfo.absolutePath()) { + if (tcC && tcCxx && !cCompilerPath.isEmpty() && !cxxCompilerPath.isEmpty() + && cFileInfo.absolutePath() != cxxFileInfo.absolutePath()) { Core::MessageManager::write(tr("C and C++ compiler paths differ. C compiler may not work."), Core::MessageManager::ModeSwitch); } From 7a7ee71f229b81d8021f2c8332acdd3e37baf305 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 25 Mar 2020 16:48:04 +0100 Subject: [PATCH 21/27] QmlDesigner: Do not support rectangle gradient in Qt for MCUs Change-Id: Ida324bf0647234a0ecff6689265767c0925d9115 Reviewed-by: Tim Jenssen --- .../propertyEditorQmlSources/QtQuick/RectangleSpecifics.qml | 2 +- .../components/propertyeditor/propertyeditorvalue.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RectangleSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RectangleSpecifics.qml index 0fa2b331a8c..3cd5d90399f 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RectangleSpecifics.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RectangleSpecifics.qml @@ -40,7 +40,7 @@ Column { ColorEditor { caption: qsTr("Color") backendValue: backendValues.color - supportGradient: true + supportGradient: backendValues.gradient.isAvailable } diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp index 3ec61f9cabb..515b73ed2cb 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp @@ -265,7 +265,8 @@ bool PropertyEditorValue::isTranslated() const bool PropertyEditorValue::isAvailable() const { - const QList mcuProperties = {"layer", "opacity", "rotation", "scale", "transformOrigin", "smooth", "antialiasing", "border"}; + const QList mcuProperties = {"layer", "opacity", "rotation", "scale", "gradient", + "transformOrigin", "smooth", "antialiasing", "border"}; const QList list = name().split('.'); const QByteArray pureName = list.first(); From cbb7099902419776ad5266d4e54e1f50e7d690f7 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 30 Mar 2020 13:17:00 +0300 Subject: [PATCH 22/27] QmlDesigner: Fix scene root finding logic If there's a single node child on View3D, detect that as scene root when another non-node direct child of View3D is selected. Change-Id: Ib538b0ae368e7b460700a99e4c450a15586c2f62 Fixes: QDS-1865 Reviewed-by: Mahmoud Badri --- .../qml2puppet/instances/qt5informationnodeinstanceserver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index d3a7420464b..67a031ee50e 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -745,7 +745,7 @@ QObject *Qt5InformationNodeInstanceServer::find3DSceneRoot(const ServerNodeInsta view = qobject_cast(parentInstance.internalObject()); int nodeCount = countChildNodes(view); if (nodeCount == 1) - return checkInstance.internalObject(); + return childNode; else return view->scene(); } else if (parentInstance.isSubclassOf("QQuick3DNode")) { From 92aca4db8d6721c9288768039041ab3d2a8aabd6 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 30 Mar 2020 13:50:22 +0300 Subject: [PATCH 23/27] QmlDesigner: Remove focus setting from EditView3D There is no keyboard handling on puppet side anymore, so no need to set focus, either. Change-Id: I00ebf7de1ac0b339c1323a62a61a1c086123d848 Reviewed-by: Mahmoud Badri --- share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index 92bc91edff3..db8d4fb4eab 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -508,7 +508,6 @@ Item { Rectangle { id: viewRect anchors.fill: parent - focus: true gradient: Gradient { GradientStop { position: 1.0; color: "#222222" } From df1152dd9503ed9577754700f9e603f572807c53 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 26 Mar 2020 15:46:44 +0100 Subject: [PATCH 24/27] Doc: Warn about using emsdk --embedded The Qt installation instructions for WebAssembly so far recommended using emsdk --embedded. Anyhow, this does mean that the .emscripten file will _not_ be put into the user's home directory, as Qt Creator expects. Change-Id: I0301d97e96baf0976b93ff7fc80e4f0cb058ea2e Reviewed-by: Leena Miettinen --- doc/qtcreator/src/webassembly/creator-webassembly.qdoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc index b245fcb363c..7de593b5815 100644 --- a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc +++ b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc @@ -74,6 +74,10 @@ Windows, \MinGW (found in \uicontrol {Developer and Designer Tools}). \li Check out \c emsdk and install and activate \c emscripten, as instructed in \l {Qt for WebAssembly}. + \note Do not use the \c{--embedded} option for activating the + \c emscripten version in the \c emsdk, because \QC + expects to find the \c{.emscripten} file describing the toolchain in + your home directory. \li On Windows, you have to download and install \c sed, as instructed in \l{http://gnuwin32.sourceforge.net/packages/sed.htm} {sed for Windows}. From 9a2eedf1962e1acd01aba40ea3ce4604c855c1b9 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 30 Mar 2020 15:00:14 +0300 Subject: [PATCH 25/27] QmlDesigner: Show selection and gizmo for scene root light/camera Change-Id: Ib650a5e331cf2936ef20a47abec5086bb08f06d2 Fixes: QDS-1857 Reviewed-by: Mahmoud Badri --- .../qt5informationnodeinstanceserver.cpp | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 67a031ee50e..4331e35ddc8 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -1045,24 +1045,26 @@ void Qt5InformationNodeInstanceServer::changeSelection(const ChangeSelectionComm if (firstSceneRoot && sceneRoot == firstSceneRoot && instance.isSubclassOf("QQuick3DNode")) object = instance.internalObject(); - auto instanceIsModelOrComponent = [&]() -> bool { - bool retval = instance.isSubclassOf("QQuick3DModel"); + auto isSelectableAsRoot = [&]() -> bool { #ifdef QUICK3D_MODULE - if (!retval) { - // Node is a component if it has node children that have no instances - auto node = qobject_cast(object); - if (node) { - const auto childItems = node->childItems(); - for (const auto &childItem : childItems) { - if (qobject_cast(childItem) && !hasInstanceForObject(childItem)) - return true; - } + if (qobject_cast(object) + || qobject_cast(object) + || qobject_cast(object)) { + return true; + } + // Node is a component if it has node children that have no instances + auto node = qobject_cast(object); + if (node) { + const auto childItems = node->childItems(); + for (const auto &childItem : childItems) { + if (qobject_cast(childItem) && !hasInstanceForObject(childItem)) + return true; } } #endif - return retval; + return false; }; - if (object && (firstSceneRoot != object || instanceIsModelOrComponent())) + if (object && (firstSceneRoot != object || isSelectableAsRoot())) selectedObjs << objectToVariant(object); } } From 92302378563ae20c250af34a43292455c46cf0ee Mon Sep 17 00:00:00 2001 From: Richard Weickelt Date: Mon, 30 Mar 2020 12:43:25 +0200 Subject: [PATCH 26/27] Update qbs submodule to HEAD of the 1.16 branch Change-Id: I3a4fd475623790a1a34a15d530c5f4ea53603792 Reviewed-by: Christian Kandeler --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index dcd57b60f8a..ee44dae4f53 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit dcd57b60f8a79a2ee9c46cb5fddf60846302d375 +Subproject commit ee44dae4f53d3c3fd16025c8d717f25084313070 From 41099a5eedd0f7c17185b9944c5f209b2588afc0 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 17 Mar 2020 11:48:26 +0100 Subject: [PATCH 27/27] Update change log for 4.12 Change-Id: I54a9e875c4b80bab4234bfb000cea15dc47b72e0 Reviewed-by: Leena Miettinen --- dist/changes-4.12.0.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/dist/changes-4.12.0.md b/dist/changes-4.12.0.md index 136428ef568..bcc86dee14e 100644 --- a/dist/changes-4.12.0.md +++ b/dist/changes-4.12.0.md @@ -104,6 +104,7 @@ Projects ### Qbs +* Updated included Qbs version to 1.16.0 * Changed to use separate Qbs executable instead of direcly linking to Qbs (QTCREATORBUG-20622) * Added option for default install root (QTCREATORBUG-12983) @@ -139,6 +140,7 @@ Analyzer ### Clang * Improved filtering +* Added `Analyze Current File` to `Tools` menu and editor context menu * Added context menu item that opens help on diagnostics ### CppCheck @@ -161,6 +163,7 @@ Qt Quick Designer * Added locking and pinning of animation curves (QDS-550, QDS-551) * Added support for annotations (QDS-39) * Fixed dragging of keyframes in curve editor (QDS-1405) +* Fixed crash when selecting icon (QTCREATORBUG-23773) Version Control Systems ----------------------- @@ -181,6 +184,7 @@ Test Integration ### Google Test * Added support for internal logging (QTCREATORBUG-23354) +* Added support for `GTEST_SKIP` (QTCREATORBUG-23736) Platforms --------- @@ -202,6 +206,8 @@ Platforms * Added option to automatically download and install required Android tools (QTCREATORBUG-23285) * Added option to register multiple NDKs (QTCREATORBUG-23286) * Added automatic selection of correct NDK for Qt version (QTCREATORBUG-23583) +* Added option to download and use [OpenSSL for Android](https://github.com/KDAB/android_openssl) + (QTBUG-80625) * Added support for Android 11 with API level 30 * Improved examples browser to only show items tagged with `android` (QTBUG-80716) * Improved manifest editor (QTCREATORBUG-23283) @@ -222,6 +228,10 @@ Platforms * Added support for J-Link and EBlink GDB servers * Added support for KEIL uVision v5.x debugger +### MCU + +* Added auto-registration of documentation (UL-1685) + Credits for these changes go to: -------------------------------- Aleksei German @@ -243,6 +253,7 @@ Eike Ziller Fawzi Mohamed Federico Guerinoni Filippo Cucchetto +Friedemann Kleint Halfdan Ingvarsson Hannes Domani Henning Gruendl @@ -266,6 +277,7 @@ Nikolai Kosjar Nikolay Panov Oliver Wolff Orgad Shaneh +Richard Weickelt Robert Löhning Sergey Morozov Tasuku Suzuki @@ -276,6 +288,8 @@ Tim Jenssen Tobias Hunger Topi Reinio Ulf Hermann +Unseon Ryu +Venugopal Shivashankar Vikas Pachdha Ville Voutilainen Volodymyr Samokhatko