From e693c9a02e3e698c2cd9cd79da0439b7e34aafb7 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 1 Mar 2018 14:12:06 +0100 Subject: [PATCH 01/41] Fix issue with snippet variables not behaving correctly on Gnome Directly after triggering the snippet completion, a funny input method event is sent that doesn't contain any data. This still results in a even more funny contentsChanged signal from QPlainTextEdit which made our text editor think that the document has changed somewhere else. In which case we close the snippet variable input. So ignore funny input method events. Task-number: QTCREATORBUG-19571 Change-Id: I3958e8736b1b3e3dea5225356ee4cd173d6beaa0 Reviewed-by: Mitch Curtis Reviewed-by: David Schulz --- src/plugins/texteditor/texteditor.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 1b406d2d3bc..ee9e9c493da 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -2998,6 +2998,14 @@ bool TextEditorWidget::event(QEvent *e) void TextEditorWidget::inputMethodEvent(QInputMethodEvent *e) { + if (e->commitString().isEmpty() && e->preeditString().isEmpty() && e->attributes().isEmpty()) { + // Avoid doing anything when getting bogus events as it can happen on Gnome desktop. + // Otherwise QPlainTextEdit will report content changes for locations where factually + // nothing changed. + // Workaround for QTCREATORBUG-19571 + e->accept(); + return; + } if (d->m_inBlockSelectionMode) { if (!e->commitString().isEmpty()) d->insertIntoBlockSelection(e->commitString()); From 5f682095415d1918c115e0d3937ddf38f24f1baa Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 2 Mar 2018 11:28:45 +0100 Subject: [PATCH 02/41] Fix middle mouse button in help viewer It didn't do anything on links though opening links in new pages was its purpose. Task-number: QTCREATORBUG-19344 Change-Id: I9560a59bd2ad4ec7179dce984cf3bc5160b84ff3 Reviewed-by: Jarek Kobus --- src/plugins/help/textbrowserhelpviewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/help/textbrowserhelpviewer.cpp b/src/plugins/help/textbrowserhelpviewer.cpp index 2dd128fd323..34e821e5245 100644 --- a/src/plugins/help/textbrowserhelpviewer.cpp +++ b/src/plugins/help/textbrowserhelpviewer.cpp @@ -432,7 +432,7 @@ void TextBrowserHelpWidget::mouseReleaseEvent(QMouseEvent *e) bool controlPressed = e->modifiers() & Qt::ControlModifier; const QString link = linkAt(e->pos()); - if ((controlPressed || e->button() == Qt::MidButton) && link.isEmpty()) { + if ((controlPressed || e->button() == Qt::MidButton) && !link.isEmpty()) { emit m_parent->newPageRequested(QUrl(link)); return; } From 779095a587bbf389f34fdd569c7c17781971d407 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 2 Mar 2018 15:44:50 +0100 Subject: [PATCH 03/41] Fix crash in kit's variable chooser if Qt version is removed Currently the variable chooser cannot update itself if a sub-expander changes or even is deleted, leading to inconsistencies and crashes if that happens. Make the Qt version sub-macroexpander be available for the kit even if currently is no Qt version selected. For this we create a macro expander that delegates to the kit's Qt version if possible at variable substitution time, instead of taking the Qt version's expander directly. Task-number: QTCREATORBUG-19900 Task-number: QTCREATORBUG-19901 Change-Id: I2bd9b3db60bf6e292abf2a29e0697dc5385709cd Reviewed-by: Tobias Hunger --- src/plugins/qtsupport/baseqtversion.cpp | 252 ++++++++++++++------- src/plugins/qtsupport/baseqtversion.h | 4 +- src/plugins/qtsupport/qtkitinformation.cpp | 22 +- 3 files changed, 185 insertions(+), 93 deletions(-) diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index e715d1364d2..cb38340e7c5 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -282,91 +282,7 @@ void BaseQtVersion::ctor(const FileName &qmakePath) void BaseQtVersion::setupExpander() { - m_expander.setDisplayName( - QtKitInformation::tr("Qt version")); - - m_expander.registerVariable("Qt:Version", - QtKitInformation::tr("The version string of the current Qt version."), - [this] { return qtVersionString(); }); - - m_expander.registerVariable("Qt:Type", - QtKitInformation::tr("The type of the current Qt version."), - [this] { return type(); }); - - m_expander.registerVariable("Qt:Mkspec", - QtKitInformation::tr("The mkspec of the current Qt version."), - [this] { return mkspec().toUserOutput(); }); - - m_expander.registerVariable("Qt:QT_INSTALL_PREFIX", - QtKitInformation::tr("The installation prefix of the current Qt version."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_PREFIX"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_DATA", - QtKitInformation::tr("The installation location of the current Qt version's data."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_DATA"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_HEADERS", - QtKitInformation::tr("The installation location of the current Qt version's header files."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_HEADERS"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_LIBS", - QtKitInformation::tr("The installation location of the current Qt version's library files."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_LIBS"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_DOCS", - QtKitInformation::tr("The installation location of the current Qt version's documentation files."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_DOCS"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_BINS", - QtKitInformation::tr("The installation location of the current Qt version's executable files."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_BINS"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_PLUGINS", - QtKitInformation::tr("The installation location of the current Qt version's plugins."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_PLUGINS"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_QML", - QtKitInformation::tr("The installation location of the current Qt version's QML files."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_QML"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_IMPORTS", - QtKitInformation::tr("The installation location of the current Qt version's imports."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_IMPORTS"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_TRANSLATIONS", - QtKitInformation::tr("The installation location of the current Qt version's translation files."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_TRANSLATIONS"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_CONFIGURATION", - QtKitInformation::tr("The installation location of the current Qt version's translation files."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_CONFIGURATION"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_EXAMPLES", - QtKitInformation::tr("The installation location of the current Qt version's examples."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_EXAMPLES"); }); - - m_expander.registerVariable("Qt:QT_INSTALL_DEMOS", - QtKitInformation::tr("The installation location of the current Qt version's demos."), - [this] { return qmakeProperty(m_versionInfo, "QT_INSTALL_DEMOS"); }); - - m_expander.registerVariable("Qt:QMAKE_MKSPECS", - QtKitInformation::tr("The current Qt version's default mkspecs (Qt 4)."), - [this] { return qmakeProperty(m_versionInfo, "QMAKE_MKSPECS"); }); - m_expander.registerVariable("Qt:QMAKE_SPEC", - QtKitInformation::tr("The current Qt version's default mkspec (Qt 5; host system)."), - [this] { return qmakeProperty(m_versionInfo, "QMAKE_SPEC"); }); - m_expander.registerVariable("Qt:QMAKE_XSPEC", - QtKitInformation::tr("The current Qt version's default mkspec (Qt 5; target system)."), - [this] { return qmakeProperty(m_versionInfo, "QMAKE_XSPEC"); }); - - m_expander.registerVariable("Qt:QMAKE_VERSION", - QtKitInformation::tr("The current Qt's qmake version."), - [this] { return qmakeProperty(m_versionInfo, "QMAKE_VERSION"); }); - -// FIXME: Re-enable once we can detect expansion loops. -// m_expander.registerVariable("Qt:Name", -// QtKitInformation::tr("The display name of the current Qt version."), -// [this] { return displayName(); }); + m_expander = createMacroExpander([this]{ return this; }); } BaseQtVersion::~BaseQtVersion() @@ -801,7 +717,7 @@ void BaseQtVersion::setAutoDetectionSource(const QString &autodetectionSource) QString BaseQtVersion::displayName() const { - return m_expander.expand(m_unexpandedDisplayName); + return m_expander->expand(m_unexpandedDisplayName); } QString BaseQtVersion::unexpandedDisplayName() const @@ -1312,7 +1228,169 @@ QStringList BaseQtVersion::qtConfigValues() const MacroExpander *BaseQtVersion::macroExpander() const { - return &m_expander; + return m_expander.get(); +} + +std::unique_ptr BaseQtVersion::createMacroExpander(const std::function &qtVersion) +{ + const auto versionProperty = + [qtVersion](const std::function &property) { + return [property, qtVersion]() -> QString { + BaseQtVersion *version = qtVersion(); + return version ? property(version) : QString(); + }; + }; + std::unique_ptr expander(new Utils::MacroExpander); + expander->setDisplayName(QtKitInformation::tr("Qt version")); + + expander->registerVariable( + "Qt:Version", + QtKitInformation::tr("The version string of the current Qt version."), + versionProperty([](BaseQtVersion *version) { + return version->qtVersionString(); + })); + + expander->registerVariable( + "Qt:Type", + QtKitInformation::tr("The type of the current Qt version."), + versionProperty([](BaseQtVersion *version) { + return version->type(); + })); + + expander->registerVariable( + "Qt:Mkspec", + QtKitInformation::tr("The mkspec of the current Qt version."), + versionProperty([](BaseQtVersion *version) { + return version->mkspec().toUserOutput(); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_PREFIX", + QtKitInformation::tr("The installation prefix of the current Qt version."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_PREFIX"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_DATA", + QtKitInformation::tr("The installation location of the current Qt version's data."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_DATA"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_HEADERS", + QtKitInformation::tr("The installation location of the current Qt version's header files."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_HEADERS"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_LIBS", + QtKitInformation::tr("The installation location of the current Qt version's library files."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_LIBS"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_DOCS", + QtKitInformation::tr("The installation location of the current Qt version's documentation files."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_DOCS"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_BINS", + QtKitInformation::tr("The installation location of the current Qt version's executable files."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_BINS"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_PLUGINS", + QtKitInformation::tr("The installation location of the current Qt version's plugins."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_PLUGINS"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_QML", + QtKitInformation::tr("The installation location of the current Qt version's QML files."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_QML"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_IMPORTS", + QtKitInformation::tr("The installation location of the current Qt version's imports."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_IMPORTS"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_TRANSLATIONS", + QtKitInformation::tr("The installation location of the current Qt version's translation files."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_TRANSLATIONS"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_CONFIGURATION", + QtKitInformation::tr("The installation location of the current Qt version's translation files."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_CONFIGURATION"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_EXAMPLES", + QtKitInformation::tr("The installation location of the current Qt version's examples."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_EXAMPLES"); + })); + + expander->registerVariable( + "Qt:QT_INSTALL_DEMOS", + QtKitInformation::tr("The installation location of the current Qt version's demos."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_DEMOS"); + })); + + expander->registerVariable( + "Qt:QMAKE_MKSPECS", + QtKitInformation::tr("The current Qt version's default mkspecs (Qt 4)."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QMAKE_MKSPECS"); + })); + + expander->registerVariable( + "Qt:QMAKE_SPEC", + QtKitInformation::tr("The current Qt version's default mkspec (Qt 5; host system)."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QMAKE_SPEC"); + })); + + expander->registerVariable( + "Qt:QMAKE_XSPEC", + QtKitInformation::tr("The current Qt version's default mkspec (Qt 5; target system)."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QMAKE_XSPEC"); + })); + + expander->registerVariable( + "Qt:QMAKE_VERSION", + QtKitInformation::tr("The current Qt's qmake version."), + versionProperty([](BaseQtVersion *version) { + return version->qmakeProperty(version->m_versionInfo, "QMAKE_VERSION"); + })); + + // FIXME: Re-enable once we can detect expansion loops. + // expander->registerVariable("Qt:Name", + // QtKitInformation::tr("The display name of the current Qt version."), + // versionProperty([](BaseQtVersion *version) { + // return version->displayName(); + // })); + + return expander; } void BaseQtVersion::populateQmlFileFinder(FileInProjectFinder *finder, const Target *target) diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index e71f9b3a071..b1af4f955ee 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -232,6 +232,8 @@ public: QStringList qtConfigValues() const; Utils::MacroExpander *macroExpander() const; // owned by the Qt version + static std::unique_ptr createMacroExpander( + const std::function &qtVersion); static void populateQmlFileFinder(Utils::FileInProjectFinder *finder, const ProjectExplorer::Target *target); @@ -315,7 +317,7 @@ private: mutable QList m_qtAbis; - mutable Utils::MacroExpander m_expander; + std::unique_ptr m_expander; }; } diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index 1653b48a16d..3e55fb3fd04 100644 --- a/src/plugins/qtsupport/qtkitinformation.cpp +++ b/src/plugins/qtsupport/qtkitinformation.cpp @@ -124,14 +124,26 @@ ProjectExplorer::IOutputParser *QtKitInformation::createOutputParser(const Proje return nullptr; } +class QtMacroSubProvider +{ +public: + QtMacroSubProvider(Kit *kit) + : expander(BaseQtVersion::createMacroExpander( + [kit] { return QtKitInformation::qtVersion(kit); })) + {} + + MacroExpander *operator()() const + { + return expander.get(); + } + + std::shared_ptr expander; +}; + void QtKitInformation::addToMacroExpander(Kit *kit, MacroExpander *expander) const { QTC_ASSERT(kit, return); - expander->registerSubProvider( - [kit]() -> MacroExpander * { - BaseQtVersion *version = qtVersion(kit); - return version ? version->macroExpander() : nullptr; - }); + expander->registerSubProvider(QtMacroSubProvider(kit)); expander->registerVariable("Qt:Name", tr("Name of Qt Version"), [kit]() -> QString { From 7f487535bc0e8f935919fd7d928340a55f25cba4 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 2 Mar 2018 12:23:40 +0100 Subject: [PATCH 04/41] QmlDesigner: Fix crash This did crash if the meta info is invalid. Change-Id: Idb560b570b7951c02a4165cc1936952478bd00d7 Reviewed-by: Tim Jenssen --- .../components/formeditor/contentnoteditableindicator.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp b/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp index 20ee2531cc8..579a9d792f0 100644 --- a/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp @@ -88,7 +88,8 @@ void ContentNotEditableIndicator::updateItems(const QList &ite void ContentNotEditableIndicator::addAddiationEntries(const QList &itemList) { foreach (FormEditorItem *formEditorItem, itemList) { - if (formEditorItem->qmlItemNode().modelNode().metaInfo().isSubclassOf("QtQuick.Loader")) { + const ModelNode modelNode = formEditorItem->qmlItemNode().modelNode(); + if (modelNode.metaInfo().isValid() && modelNode.metaInfo().isSubclassOf("QtQuick.Loader")) { if (!m_entryList.contains(EntryPair(formEditorItem, 0))) { QGraphicsRectItem *indicatorShape = new QGraphicsRectItem(m_layerItem); From 059f1a5a778dc8848383dec89d69c3f2adef8a62 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 2 Mar 2018 15:29:50 +0100 Subject: [PATCH 05/41] QmlDesigner: Fix crash Change-Id: I9ce5492c6c3c7da243ef9c1850b4a27762becb51 Reviewed-by: Tim Jenssen --- .../components/componentcore/designeractionmanager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index db4b726f384..58d4c2608d9 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -614,6 +614,9 @@ bool raiseAvailable(const SelectionContext &selectionState) if (modelNode.isRootNode()) return false; + if (!modelNode.hasParentProperty()) + return false; + if (!modelNode.parentProperty().isNodeListProperty()) return false; From 25c41809ada64a69b07d04709fed3dd308ca1484 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 2 Mar 2018 15:47:26 +0100 Subject: [PATCH 06/41] QmlDesigner: Remove duplicates from tag list Change-Id: I09f59b0be9edf58476ab14e2c5888c87a87738f5 Reviewed-by: Tim Jenssen --- .../qmldesigner/designercore/metainfo/itemlibraryinfo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp index 30fe3b4cc27..4183af4b1fe 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp @@ -350,6 +350,7 @@ QStringList ItemLibraryInfo::showTagsForImports() const auto list = m_showTagsForImports; if (m_baseInfo) list.append(m_baseInfo->m_showTagsForImports); + list.removeDuplicates(); return list; } From 24aa3c35b0ed0d051c58651037a4d9828594075e Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Fri, 2 Mar 2018 17:29:32 +0100 Subject: [PATCH 07/41] Clang: Don't translate tidy checks Change-Id: I1bcefd69bc4e7e6705bd8f3d2d992bd544244949 Reviewed-by: Eike Ziller Reviewed-by: Leena Miettinen --- src/plugins/cpptools/tidychecks.ui | 32 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/plugins/cpptools/tidychecks.ui b/src/plugins/cpptools/tidychecks.ui index ee88173ea42..71bd30fd616 100644 --- a/src/plugins/cpptools/tidychecks.ui +++ b/src/plugins/cpptools/tidychecks.ui @@ -30,82 +30,82 @@ - android-* + android-* - boost-* + boost-* - bugprone-* + bugprone-* - cert-* + cert-* - cppcoreguidelines-* + cppcoreguidelines-* - clang-analyzer-* + clang-analyzer-* - clang-diagnostic-* + clang-diagnostic-* - google-* + google-* - hicpp-* + hicpp-* - llvm-* + llvm-* - misc-* + misc-* - modernize-* + modernize-* - mpi-* + mpi-* - objc-* + objc-* - performance-* + performance-* - readability-* + readability-* From 9853667c3a6f7a9cf3b049c2d3d857cab93e11e3 Mon Sep 17 00:00:00 2001 From: Sergey Belyashov Date: Tue, 6 Mar 2018 14:49:06 +0300 Subject: [PATCH 08/41] Update Russian translation Change-Id: Ic59eaaeec67f8aab71faec4e47910fc6755d7f6e Reviewed-by: Anton Kudryavtsev Reviewed-by: Denis Shienkov Reviewed-by: Oswald Buddenhagen --- share/qtcreator/translations/qtcreator_ru.ts | 1785 ++++++++++++------ 1 file changed, 1222 insertions(+), 563 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_ru.ts b/share/qtcreator/translations/qtcreator_ru.ts index 7c0d2dfd5eb..5770974f8a8 100644 --- a/share/qtcreator/translations/qtcreator_ru.ts +++ b/share/qtcreator/translations/qtcreator_ru.ts @@ -8,6 +8,13 @@ + + AddAnalysisMessageSuppressionComment + + Add a Comment to Suppress This Message + Добавьте комментарий для подавления этого сообщения + + AddSignalHandlerDialog @@ -167,8 +174,8 @@ Версия установленного SDK (%1) не включает скрипты Gradle. Минимальная версия Qt, необходимая для работы сборки Gradle, является %2 - The minimum Qt version required for Gradle build to work is %2. It is recommended to install the latest Qt version. - Для работы сборки Gradle необходима Qt версии не ниже %2. Рекомендуется установить последнюю версию Qt. + The minimum Qt version required for Gradle build to work is %1. It is recommended to install the latest Qt version. + Для работы сборки Gradle необходима Qt версии не ниже %1. Рекомендуется установить последнюю версию Qt. The API level set for the APK is less than the minimum required by the kit. @@ -238,6 +245,17 @@ The minimum API level required by the kit is %1. Сбой запуска виртуального устройства Android. + + Android::AndroidPackageInstallationStep + + Copy application data + Копирование данных приложения + + + Removing directory %1 + Удаление каталога %1 + + Android::Internal::AddNewAVDDialog @@ -311,13 +329,6 @@ The minimum API level required by the kit is %1. Установить на устройство Android - - Android::Internal::AndroidDeployConfigurationFactory - - Deploy on Android - Установить на Android - - Android::Internal::AndroidDeployQtStep @@ -766,6 +777,20 @@ Do you want to uninstall the existing package? Выбор значка высокого разрешения + + Android::Internal::AndroidPackageInstallationFactory + + Deploy to device + Установка на устройство + + + + Android::Internal::AndroidPackageInstallationStepWidget + + Make install + Make install + + Android::Internal::AndroidPotentialKit @@ -1357,10 +1382,6 @@ Install an SDK of at least API version %1. Open package location after build Открывать каталог пакета после создания - - Qt Deployment - Установка Qt - Uses the external Ministro application to download and maintain Qt libraries. Использовать внешнее приложение Ministro для загрузки и обслуживания библиотек Qt. @@ -1369,14 +1390,6 @@ Install an SDK of at least API version %1. Use Ministro service to install Qt Использовать Ministro для установки Qt - - Creates a standalone APK. - Создавать автономный APK. - - - Bundle Qt libraries in APK - Внедрять библиотеки Qt в APK - Packages debug server with the APK to enable debugging. For the signed APK this option is unchecked by default. Добавляет отладочный сервер в APK для включения отладки. Для подписанных APK эта опция отключена по умолчанию. @@ -1502,6 +1515,13 @@ Install an SDK of at least API version %1. Удалять предыдущий пакет + + AndroidPackageInstallationFactory + + Deploy to device + Установка на устройство + + AndroidSdkManager @@ -1626,8 +1646,8 @@ Install an SDK of at least API version %1. Не удалось отправить сообщение - Unable to send command line arguments to the already running instance. It appears to be not responding. Do you want to start a new instance of Creator? - Невозможно отправить параметры командной строки запущенному процессу. Видимо он не отвечает. Желаете запустить ещё один экземпляр Qt Creator? + Unable to send command line arguments to the already running instance. It does not appear to be responding. Do you want to start a new instance of %1? + Невозможно отправить параметры командной строки запущенному процессу. Видимо, он не отвечает. Желаете запустить ещё один экземпляр %1? Could not find Core plugin in %1 @@ -1682,6 +1702,10 @@ Install an SDK of at least API version %1. Run &All Tests Запустить &все + + Run All Tests + Запуск всех тестов + Alt+Shift+T,Alt+A Alt+Shift+T,Alt+A @@ -1690,6 +1714,10 @@ Install an SDK of at least API version %1. &Run Selected Tests &Запустить выбранные + + Run Selected Tests + Запуск выбранных тестов + Alt+Shift+T,Alt+R Alt+Shift+T,Alt+R @@ -1934,8 +1962,8 @@ Warning: Plain text misses some information, such as duration. Выбор конфигурации запуска - Could not determine which run configuration to choose for running tests (%1) - Не удалось определить, какую выбрать конфигурацию запуска для запуска тестов (%1) + Could not determine which run configuration to choose for running tests + Не удалось определить, какую конфигурацию запуска выбрать для запуска тестов Run Configuration: @@ -2035,20 +2063,19 @@ Warning: Plain text misses some information, such as duration. Тесты + + Autotest::Internal::TestOutputReader + + Test executable crashed. + Сбой программы тестирования. + + Autotest::Internal::TestResultsPane Expand All Развернуть всё - - Run All Tests - Запуск всех тестов - - - Run Selected Tests - Запуск выбранных тестов - Stop Test Run Остановка тестов @@ -2225,10 +2252,6 @@ Check the test environment. Test for project "%1" did not produce any expected output. Тест проекта «%1» не создал ожидаемого вывода. - - <unknown> - <неизвестный> - No test cases left for execution. Canceling test run. Не осталось больше тестов для запуска. Запуск отменён. @@ -2376,6 +2399,18 @@ Warning: this is an experimental feature and might lead to failing to execute th Process arguments Передавать параметры + + Framework + Framework + + + Group + Объединить + + + Enables grouping of test cases. + Включение группировки тестов. + Autotest::Internal::TestSettingsWidget @@ -2387,22 +2422,30 @@ Warning: this is an experimental feature and might lead to failing to execute th You will not be able to use the AutoTest plugin without having at least one active test framework. Использовать модуль AutoTest можно только при наличии хотя бы одной активной среды тестирования. + + Enable or disable test frameworks to be handled by the AutoTest plugin. + Включение/отключение управления средами тестирования модулем AutoTest. + + + Enable or disable grouping of test cases by folder. + Включение/отключение объединения тестов по каталогам. + Add Filter Добавление фильтра - <p>Specify a filter expression to be added to the list of filters.<br/>Wildcards are not supported.</p> - <p>Укажите выражение добавляемого в список фильтра<br/>Шаблонные символы не поддерживаются.</p> + Specify a filter expression to be added to the list of filters.<br/>Wildcards are not supported. + Укажите выражение добавляемого в список фильтра<br/>Шаблонные символы не поддерживаются. + + + Specify a filter expression that will replace "%1".<br/>Wildcards are not supported. + Укажите выражение фильтра вместо «%1»<br/>Шаблонные символы не поддерживаются. Edit Filter Изменение фильтра - - <p>Specify a filter expression that will replace "%1".<br/>Wildcards are not supported.</p> - <p>Укажите выражение фильтра вместо «%1»<br/>Шаблонные символы не поддерживаются.</p> - AutotoolsProjectManager::Internal::AutogenStep @@ -3411,7 +3454,7 @@ Local commits are not pushed to the master branch until a normal commit is perfo Remember specified location as default - Запомнить указанное размещение, как умолчальное + Запомнить указанное размещение как размещение по умолчанию Overwrite @@ -4134,6 +4177,13 @@ For example, "Revision: 15" will leave the branch at revision 15.Переименовать закладку + + Bookmarks::Internal::BookmarkFilter + + Bookmarks + Закладки + + Bookmarks::Internal::BookmarkManager @@ -4507,12 +4557,12 @@ For example, "Revision: 15" will leave the branch at revision 15.Генератор: %1<br>Дополнительный генератор: %2 - <br>Platform: %1 - <br>Платформа: %1 + Platform: %1 + Платформа: %1 - <br>Toolset: %1 - <br>Инструментарий: %1 + Toolset: %1 + Инструментарий: %1 CMake Generator @@ -5195,8 +5245,7 @@ For example, "Revision: 15" will leave the branch at revision 15.Не удалось разобрать проект CMake. - %1 in line %3 - думаю, ошибка в оригинале + %1 in line %2 %1 в строке %2 @@ -5254,8 +5303,8 @@ For example, "Revision: 15" will leave the branch at revision 15.Нет результатов сборки - Build artifacts:<br> - Результаты сборки:<br> + Build artifacts: + Результаты сборки: @@ -5410,7 +5459,7 @@ For example, "Revision: 15" will leave the branch at revision 15. Parse templates in a MSVC-compliant way. This helps to parse headers for example from Active Template Library (ATL) or Windows Runtime Library (WRL). However, using the relaxed and extended rules means also that no highlighting/completion can be provided within template functions. - Разбирать шаблоны, как MSVC. Это поможет разобрать заголовки, например из Active Template Library (ATL) и Windows Runtime Library (WRL). + Разбирать шаблоны как MSVC. Это поможет разобрать заголовки, например из Active Template Library (ATL) и Windows Runtime Library (WRL). Однако, использование ослабленных или расширенных правил подразумевает отсутствие подсветки и дополнения внутри шаблонных функций. @@ -5445,6 +5494,13 @@ However, using the relaxed and extended rules means also that no highlighting/co %1 [встроенный] + + ClangHoverHandler + + %1 bytes + %1 байт(ов) + + ClangRefactoring::ClangQueryProjectsFindFilter @@ -6339,8 +6395,8 @@ Output: &Загруженная версия - <html><head/><body><p><b>Note: You will not be able to check in this file without merging the changes (not supported by the plugin)</b></p></body></html> - <b>Внимание! Невозможно зафиксировать данный файл без объединения изменений, которое не поддерживается эти модулем</b> + Note: You will not be able to check in this file without merging the changes (not supported by the plugin) + Внимание! Невозможно зафиксировать данный файл без объединения изменений (не поддерживается модулем) @@ -6582,8 +6638,8 @@ p, li { white-space: pre-wrap; } Вставка в KDE paster требует авторизации.<br/>Для продолжения введите учётные данные KDE Identity. - <span style='background-color:LightYellow;color:red'>Login failed</span><br/><br/> - <span style='background-color:LightYellow;color:red'>Не удалось войти</span><br/><br/> + Login failed + Не удалось войти @@ -8274,6 +8330,25 @@ Do you want to kill it? Тема: + + Core::Internal::JavaScriptFilter + + Evaluate JavaScript + Вычислить JavaScript + + + Reset Engine + Сбросить движок + + + Engine aborted after timeout. + Движок был прерван после таймаута. + + + Copy to clipboard: %1 + Скопировать в буфер обмена: %1 + + Core::Internal::Locator @@ -8491,6 +8566,30 @@ Do you want to kill it? Ctrl+L Ctrl+L + + Zoom In + Увеличить + + + Ctrl++ + Ctrl++ + + + Zoom Out + Уменьшить + + + Ctrl+- + Ctrl+- + + + Original Size + Исходный размер + + + Meta+0 + Meta+0 + &Options... П&араметры... @@ -8573,6 +8672,13 @@ Do you want to kill it? Настройки... + + Core::Internal::MenuBarFilter + + Actions from the Menu + Действия из меню + + Core::Internal::MessageOutputWindow @@ -9163,11 +9269,11 @@ Do you want to kill it? Use "Cmd", "Opt", "Ctrl", and "Shift" for modifier keys. Use "Escape", "Backspace", "Delete", "Insert", "Home", and so on, for special keys. Combine individual keys with "+", and combine multiple shortcuts to a shortcut sequence with ",". For example, if the user must hold the Ctrl and Shift modifier keys while pressing Escape, and then release and press A, enter "Ctrl+Shift+Escape,A". - Используйте «Cmd», «Opt», «Ctrl» и «Shift», как модификаторы. «Escape», «Backspace», «Delete», «Insert», «Home» и прочие, как специальные клавиши. Комбинируйте отдельные клавиши с помощью «+», а комбинации с помощью «,». Например: «Ctrl+Shift+Escape,A» - удерживая «Ctrl» и «Shift» нажать «Escape», отпустить и нажать «A». + Используйте «Cmd», «Opt», «Ctrl» и «Shift» как модификаторы. «Escape», «Backspace», «Delete», «Insert», «Home» и прочие как специальные клавиши. Комбинируйте отдельные клавиши с помощью «+», а комбинации с помощью «,». Например: «Ctrl+Shift+Escape,A» - удерживая «Ctrl» и «Shift» нажать «Escape», отпустить и нажать «A». Use "Ctrl", "Alt", "Meta", and "Shift" for modifier keys. Use "Escape", "Backspace", "Delete", "Insert", "Home", and so on, for special keys. Combine individual keys with "+", and combine multiple shortcuts to a shortcut sequence with ",". For example, if the user must hold the Ctrl and Shift modifier keys while pressing Escape, and then release and press A, enter "Ctrl+Shift+Escape,A". - Используйте «Ctrl», «Alt», «Meta» и «Shift», как модификаторы. «Escape», «Backspace», «Delete», «Insert», «Home» и прочие, как специальные клавиши. Комбинируйте отдельные клавиши с помощью «+», а комбинации с помощью «,». Например: «Ctrl+Shift+Escape,A» - удерживая «Ctrl» и «Shift» нажать «Escape», отпустить и нажать «A». + Используйте «Ctrl», «Alt», «Meta» и «Shift» как модификаторы. «Escape», «Backspace», «Delete», «Insert», «Home» и прочие как специальные клавиши. Комбинируйте отдельные клавиши с помощью «+», а комбинации с помощью «,». Например: «Ctrl+Shift+Escape,A» - удерживая «Ctrl» и «Shift» нажать «Escape», отпустить и нажать «A». Reset @@ -9571,25 +9677,6 @@ Do you want to check them out now? Получить их сейчас? - - Core::RemoveFileDialog - - Remove File - Удалить файл - - - File to remove: - Файл для удаления: - - - &Delete file permanently - &Удалить файл навсегда - - - &Remove from Version Control - У&далить из контроля версий - - Core::SearchResultWindow @@ -9719,6 +9806,33 @@ to version control (%2) Нет доступных иерархий включений + + CppEditor::CppQuickFixFactory + + Create Getter and Setter Member Functions + Создать методы получения и установки значения + + + Create Getter Member Function + Создать метод получения значения + + + Create Setter Member Function + Создать метод установки значения + + + Convert to Stack Variable + Преобразовать в стековую переменную + + + Convert to Pointer + Преобразовать в указатель + + + Generate Missing Q_PROPERTY Members + Создание отсутствующих членов Q_PROPERTY + + CppEditor::InsertDeclOperation @@ -10100,14 +10214,21 @@ to version control (%2) - CppTools::ClangDiagnosticConfigsWidget + CppTools::ClangBaseChecks Form - Configuration to use: - Использовать конфигурацию: + For appropriate options, consult the GCC or Clang manual pages or the <a href="https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html">GCC online documentation</a>. + Описание параметров можно найти страницах man GCC или Clang или в <a href="https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html">Документации GCC</a>. + + + + CppTools::ClangDiagnosticConfigsWidget + + Form + Copy... @@ -10117,10 +10238,6 @@ to version control (%2) Remove Удалить - - For appropriate options, consult the GCC or Clang manual pages or the <a href="https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html">GCC online documentation</a>. - Описание параметров можно найти страницах man GCC или Clang или в <a href="https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html">Документации GCC</a>. - Copy Diagnostic Configuration Копирование конфигурации диагностики @@ -10137,6 +10254,10 @@ to version control (%2) Option "%1" is invalid. Параметр «%1» неверен. + + Copy this configuration to customize it. + Изменить можно только копию этой конфигурации. + Configuration passes sanity checks. Конфигурация прошла предпроверку. @@ -10146,14 +10267,61 @@ to version control (%2) %1 - ValidationIcon + Clang + Clang + + + Clang-Tidy + Clang-Tidy + + + Clazy + Clazy + + + InfoIcon - ValidationText + InfoText + + CppTools::ClazyChecks + + Form + + + + Each level adds checks to the previous level. For more information, see <a href="https://github.com/KDE/clazy">clazy's homepage</a>. + Каждый уровень добавляет проверки к предыдущему. Подробнее на <a href="https://github.com/KDE/clazy">домашней странице clazy</a>. + + + Disabled + Отключено + + + Level 0: No false positives + Уровень 0: без ложных срабатываний + + + Level 1: Very few false positives + Уровень 1: немного ложных срабатываний + + + Level 2: More false positives + Уровень 2: больше ложных срабатываний + + + Not always correct, possibly very noisy, might require a knowledgeable developer to review, might have a very big rate of false-positives, might have bugs. + Не всегда корретны, возможно, много шума, может потребоваться информированный разработчик для анализа, может иметь высокий уровень ложных срабатываний, может содержать ошибки. + + + Level 3: Experimental checks + Уровень 3: экспериментальные проверки + + CppTools::CppClassesFilter @@ -10201,17 +10369,13 @@ to version control (%2) Form - - Clang Code Model Warnings - Предупреждения модели кода Clang - <i>The Clang Code Model is enabled because the corresponding plugin is loaded.</i> - <i>Clang Code Model включена, так как соответствующий модуль загружен.</i> + <i>Модель кода Clang включена, так как соответствующий модуль загружен.</i> <i>The Clang Code Model is disabled because the corresponding plugin is not loaded.</i> - <i>Clang Code Model выключена, так как соответствующий модуль не загружен.</i> + <i>Модель кода Clang выключена, так как соответствующий модуль не загружен.</i> Do not index files greater than @@ -10237,6 +10401,10 @@ to version control (%2) Ignore precompiled headers Игнорировать прекомпилированные заголовки + + Clang Diagnostics + Диагностика Clang + CppTools::Internal::CppCodeStyleSettingsPage @@ -10571,17 +10739,17 @@ These prefixes are used in addition to current file name on Switch Header/Source CppTools::Internal::CppFileSettingsWidget /************************************************************************** -** Qt Creator license header template +** %1 license header template ** Special keywords: %USER% %DATE% %YEAR% ** Environment variables: %$VARIABLE% ** To protect a percent sign, use '%%'. **************************************************************************/ /************************************************************************** -** Шаблон лицензии заголовочного файлы Qt Creator -** Специальные ключевые слова: %USER% %DATE% %YEAR% -** Переменные среды: %$VARIABLE% -** Если требуется символ «процент», то используйте «%%». +** %1 license header template +** Special keywords: %USER% %DATE% %YEAR% +** Environment variables: %$VARIABLE% +** To protect a percent sign, use '%%'. **************************************************************************/ @@ -10833,7 +11001,7 @@ Flags: %3 Extract Constant as Function Parameter - Извлечь константу, как параметр функции + Извлечь константу как параметр функции Assign to Local Variable @@ -10884,6 +11052,13 @@ Flags: %3 Завершить оператор Switch + + CppTools::TidyChecks + + Form + + + CustomToolChain @@ -11381,9 +11556,9 @@ Flags: %3 32-х битная версия - <html><body><p>Specify the path to the <a href="%1">Windows Console Debugger executable</a> (%2) here.</p></body></html> + Specify the path to the <a href="%1">Windows Console Debugger executable</a> (%2) here. Label text for path configuration. %2 is "x-bit version". - <html><body><p>Укажите здесь путь к <a href="%1">программе Windows Console Debugger</a> (%2).</p></body></html> + Укажите здесь путь к <a href="%1">программе Windows Console Debugger</a> (%2). Auto-detected CDB at %1 @@ -11574,36 +11749,6 @@ Flags: %3 Копировать - - Debugger::GdbServerPortsGatherer - - Checking available ports... - Проверка доступных портов... - - - Found %n free ports. - - Обнаружен %n свободный порт. - Обнаружено %n свободных порта. - Обнаружено %n свободных портов. - - - - Not enough free ports on device for C++ debugging. - Недостаточно свободных портов на устройстве для отладки C++. - - - Not enough free ports on device for QML debugging. - Недостаточно свободных портов на устройстве для отладки QML. - - - - Debugger::GdbServerRunner - - Starting gdbserver... - Запускается gdbserver... - - Debugger::Internal::AddressDialog @@ -11836,12 +11981,12 @@ Flags: %3 Пут&ь: - &Module: - &Модуль: + Specifying the module (base name of the library or executable) for function or file type breakpoints can significantly speed up debugger startup times (CDB, LLDB). + Указание модуля (имени библиотеки или программы) для точек останова на функциях или исходниках может значительно повысить скорость запуска отладчика (CDB, LLDB). - <p>Debugger commands to be executed when the breakpoint is hit. This feature is only available for GDB. - <p>Команды отладчика, выполняемые при срабатывании точки останова. Данная возможность есть только в GDB. + &Module: + &Модуль: &Commands: @@ -12039,6 +12184,10 @@ Flags: %3 Function Name: Имя функции: + + Debugger commands to be executed when the breakpoint is hit. This feature is only available for GDB. + Команды отладчика, выполняемые при срабатывании точки останова. Данная возможность есть только в GDB. + Line Number: Номер строки: @@ -12131,10 +12280,6 @@ Flags: %3 Break When JavaScript Exception Is Thrown Остановиться при возникновении исключения JavaScript - - <p>Specifying the module (base name of the library or executable) for function or file type breakpoints can significantly speed up debugger startup times (CDB, LLDB). - <p>Указание модуля (имени библиотеки или программы) для точек останова на функциях или исходниках может значительно повысить скорость запуска отладчика (CDB, LLDB). - Function Функция @@ -12244,6 +12389,14 @@ Flags: %3 There is no CDB executable specified. Программа CDB не указана. + + Internal error: The extension %1 cannot be found. +If you have updated %2 via Maintenance Tool, you may need to rerun the Tool and select "Add or remove components" and then select the Qt > Tools > Qt Creator CDB Debugger Support component. +If you build %2 from sources and want to use a CDB executable with another bitness than your %2 build, you will need to build a separate CDB extension with the same bitness as the CDB you want to use. + Внутренняя ошибка: Не удалось найти расширение %1. +Если %2 был обновлён через Maintenance Tool, то следует перезапустить её и выбрать «Добавить или удалить компоненты», затем отметить компонент Qt > Tools -> Qt Creator > Qt Creator CDB Debugger Support. +Если же %2 был собран из исходников и требует программу CDB отличной от него разрядности, то необходимо собрать отдельное расширение CDB соответствующее разрядности используемого CDB. + Interrupting is not possible in remote sessions. Прерывание в удалённых сессиях невозможно. @@ -12272,18 +12425,6 @@ Flags: %3 Malformed stop response received. Получен неверный ответ на требование остановки. - - Internal error: The extension %1 cannot be found. -If you have updated Qt Creator via Maintenance Tool, you may need to rerun the Tool and select "Add or remove components" and then select the -Qt > Tools > Qt Creator > Qt Creator CDB Debugger Support component. -If you build Qt Creator from sources and want to use a CDB executable with another bitness than your Qt Creator build, -you will need to build a separate CDB extension with the same bitness as the CDB you want to use. - Внутренняя ошибка: Не удалось найти расширение %1. -Если Qt Creator был обновлён через Maintenance Tool, то следует перезапустить её и выбрать "Добавить или удалить компоненты", затем -отметить компонент Qt > Tools -> Qt Creator > Qt Creator CDB Debugger Support. -Если же Qt Creator был собран из исходников и требует программу CDB отличной разрядности, то необходимо собрать -отдельное расширение CDB соответствующее разрядности используемого CDB. - Switching to main thread... Переключение в основной поток... @@ -12556,10 +12697,6 @@ you will need to build a separate CDB extension with the same bitness as the CDB Debugging has failed Ошибка отладки - - Setup failed. - Не удалось настроить. - Loading finished. Загрузка завершена. @@ -13132,10 +13269,6 @@ Affected are breakpoints %1 &Threads &Потоки - - Locals and &Expressions - Переменные и &выражения - Debugger Отладчик @@ -13234,6 +13367,14 @@ Affected are breakpoints %1 Source Files Файлы исходных текстов + + Locals + Локальные переменные + + + &Expressions + Выра&жения + Snapshots Снимки @@ -13891,8 +14032,8 @@ You can choose between waiting longer or aborting debugging. Это могло возникнуть из-за ограничений на длину пути в файле дампа. - Try to specify the binary in Debug > Start Debugging > Attach to Core. - Попробуйте указать программу используя диалог Отладка->Начать отладку->Присоединиться к дампу. + Try to specify the binary in Debug > Start Debugging > Load Core File. + Попробуйте указать программу используя диалог Отладка > Начать отладку > Загрузить файл дампа. Starting executable failed: @@ -14316,8 +14457,8 @@ In this case, the value should be increased. Помощники отладчика используются для корректного отображения объектов некоторых типов, вроде QString и std::map в обзоре «Переменные» режима отладки. - <html><head/><body><p>Python commands entered here will be executed after built-in debugging helpers have been loaded and fully initialized. You can load additional debugging helpers or modify existing ones here.</p></body></html> - <html><head/><body><p>Введённые здесь команды на языке Python будут выполнены после загрузки и полной инициализации помощников отладчика. Здесь же можно загрузить дополнительные помощники или изменить существующие.</p></body></html> + Python commands entered here will be executed after built-in debugging helpers have been loaded and fully initialized. You can load additional debugging helpers or modify existing ones here. + Введённые здесь команды на языке Python будут выполнены после загрузки и полной инициализации помощников отладчика. Здесь же можно загрузить дополнительные помощники или изменить существующие. Extra Debugging Helpers @@ -15665,11 +15806,11 @@ You can choose another communication channel here, such as a serial line or cust Display Boolean Values as True or False - Отображать булевы значения, как True и False + Отображать булевы значения как True и False Display Boolean Values as 1 or 0 - Отображать булевы значения, как 1 и 0 + Отображать булевы значения как 1 и 0 Decimal Integer @@ -16499,6 +16640,10 @@ Rebuilding the project might help. Export Property as Alias Экспортировать свойства как алиас + + Insert Keyframe + Вставить ключевой кадр + Binding Editor Редактор привязок @@ -16769,7 +16914,7 @@ Plugin is not available on this platform. Path: %1 Plugin is enabled as dependency of an enabled plugin. Путь: %1 -Модуль включён, как зависимость включённого модуля. +Модуль включён как зависимость включённого модуля. Path: %1 @@ -17355,6 +17500,32 @@ will also disable the following plugins: Sets the letter spacing for the font. Задание интервала между буквами для шрифта. + + Performance + Производительность + + + Kerning + Кернинг + + + Enables or disables the kerning OpenType feature when shaping the text. Disabling this may improve performance when creating or changing the text, at the expense of some cosmetic features. The default value is true. + Включает/выключает OpenType функцию кернинг при оформлении текста. Выключение её может повысить быстродействие при создании или изменении текста за счёт некоторых косметических деталей. По умолчанию включено. + + + Prefer shaping + Предпочитать оформление + + + Sometimes, a font will apply complex rules to a set of characters in order to display them correctly. +In some writing systems, such as Brahmic scripts, this is required in order for the text to be legible, whereas in Latin script, + it is merely a cosmetic feature. Setting the preferShaping property to false will disable all such features +when they are not required, which will improve performance in most cases. + Иногда шрифт требует применения сложных правил к набору символов для правильного отображения. +В некоторых системах письма (например, брахми), они необходимы для читабельности, в то же время для латиницы +это просто косметическая функция. Задание свойству preferShaping значения false отключит все обработки, если они +не обязательны. В большинстве случаев это позволит поднять производительность. + FontSettings_C_OCCURRENCES_UNUSED @@ -17927,10 +18098,6 @@ were not verified among remotes in %3. Select different folder? &Topic: &Тема: - - &Draft - &Черновик - Number of commits Число фиксаций @@ -17951,6 +18118,22 @@ were not verified among remotes in %3. Select different folder? Number of commits between %1 and %2: %3 Число фиксаций между %1 и %2: %3 + + Checked - Mark change as WIP. +Unchecked - Mark change as ready for review. +Partially checked - Do not change current state. + Включите, чтобы отметить как WIP. +Оставьте серым, если менять состояние не требуется. + + + Supported on Gerrit 2.15 and later. + Поддерживается начиная с Gerrit 2.15. + + + Checked - The change is a draft. +Unchecked - The change is not a draft. + Включите, если изменение является черновиком. + No remote branches found. This is probably the initial commit. Внешние ветки не обнаружены. Возможно, это начальная фиксация. @@ -17991,6 +18174,20 @@ Partial names can be used if they are unambiguous. To: В: + + Checked - Mark change as private. +Unchecked - Remove mark. +Partially checked - Do not change current state. + Включите, чтобы отметить изменение личным, оставьте серым, чтобы не менять отметку. + + + &Draft/private + &Черновик + + + &Work-in-progress + В р&аботе + Gerrit::Internal::GerritRemoteChooser @@ -18397,6 +18594,10 @@ Would you like to terminate it? Ignore whitespace only changes. Игнорировать изменения пробелов. + + Reload + Перезагрузить + Ignore Whitespace Игнорировать пробелы @@ -18510,6 +18711,14 @@ Commit now? Create Local Branch Создание локальной ветки + + Nothing to recover + Нечего восстанавливать + + + Files recovered + Файлы восстановлены + Cannot obtain log of "%1": %2 Не удалось получить историю «%1»: %2 @@ -18876,6 +19085,10 @@ Commit now? Show textual graph log. Показать граф журнала в ASCII графике. + + Reload + Перезагрузить + Git::Internal::GitPlugin @@ -19199,6 +19412,10 @@ Commit now? Reflog Reflog + + Recover Deleted Files + Восстановить удалённые файлы + Skip Rebase Пропустить перебазирование @@ -20738,34 +20955,6 @@ Would you like to overwrite it? ImageViewer::Internal::ImageViewerPlugin - - Zoom In - Увеличить - - - Ctrl++ - Ctrl++ - - - Zoom Out - Уменьшить - - - Ctrl+- - Ctrl+- - - - Original Size - Исходный размер - - - Meta+0 - Meta+0 - - - Ctrl+0 - Ctrl+0 - Fit to Screen На весь экран @@ -21007,13 +21196,6 @@ Ids must begin with a lowercase letter. Видимо dSYM %1 устарел, он может смутить отладчик. - - Ios::Internal::IosDeployConfiguration - - Deploy to iOS - Установка на iOS - - Ios::Internal::IosDeployConfigurationFactory @@ -21227,10 +21409,6 @@ Ids must begin with a lowercase letter. Could not get inferior PID. Не удалось получить PID процесса. - - Could not get necessary ports the debugger connection. - Не удалось получить необходимые порты для подключения отладчика. - Run failed. The settings in the Organizer window of Xcode might be incorrect. Не удалось запустить. Настройки Xcode в окне Organizer могут быть неверны. @@ -21333,14 +21511,6 @@ Ids must begin with a lowercase letter. Simulator Start Запустить эмулятор - - Starting simulator devices... - - Запуск эмулируемых устройств... - Запуск эмулируемых устройств... - Запуск эмулируемых устройств... - - Cannot start simulator (%1, %2) in current state: %3 Невозможно запустить эмулятор (%1, %2) в текущем состоянии: %3 @@ -21366,11 +21536,19 @@ Error: %2 Ошибка: %2 - Do you really want to reset the contents and settings of the selected devices? + Starting %n simulator device(s)... - Удалить содержимое и настройки выбранных устройств? - Удалить содержимое и настройки выбранных устройств? - Удалить содержимое и настройки выбранных устройств? + Запуск %n эмулируемого устройства... + Запуск %n эмулируемых устройств... + Запуск %n эмулируемых устройств... + + + + Do you really want to reset the contents and settings of the %n selected device(s)? + + Сбросить содержимое и настройки %n выбранного устройства? + Сбросить содержимое и настройки %n выбранных устройств? + Сбросить содержимое и настройки %n выбранных устройств? @@ -21402,33 +21580,33 @@ Error: %2 Удаление устройства - Do you really want to delete the selected devices? + Do you really want to delete the %n selected device(s)? - Удалить выбранные устройства? - Удалить выбранные устройства? - Удалить выбранные устройства? + Удалить %n выбранное устройство? + Удалить %n выбранных устройства? + Удалить %n выбранных устройств? - Deleting simulator devices... + Deleting %n simulator device(s)... - Удаление эмулируемых устройств... - Удаление эмулируемых устройств... - Удаление эмулируемых устройств... + Удаление %n эмулируемого устройства... + Удаление %n эмулируемых устройств... + Удаление %n эмулируемых устройств... + + + + Capturing screenshots from %n device(s)... + + Создание снимков экрана с %n устройства... + Создание снимков экрана с %n устройств... + Создание снимков экрана с %n устройств... simulator delete удаление эмулятора - - Capturing screenshots from devices... - - Создание снимка экрана устройств... - Создание снимка экрана устройств... - Создание снимка экрана устройств... - - simulator screenshot снимок экрана эмулятора @@ -21553,7 +21731,7 @@ Error: %5 Toggles whether this item is exported as an alias property of the root item. - Переключает режим экспорта элемента, как свойства псевдоним корневого элемента. + Переключает режим экспорта элемента, как псевдонима свойства корневого элемента. Visibility @@ -22096,6 +22274,10 @@ Error: %5 Quit Выйти + + %1 has crashed + %1 аварийно завершился + We specifically send the following information: @@ -22620,25 +22802,14 @@ Error: %5 &Delete &Удалить - - Model Editor - Редактор моделей - Export Diagram... Экспорт диаграммы... - Zoom In - Увеличить - - - Zoom Out - Уменьшить - - - Reset Zoom - Сбросить масштаб + Export Selected Elements... + убрал слово "выбранные", а то слишком длинно для команды. + Экспортировать элементы... Open Parent Diagram @@ -22661,8 +22832,12 @@ Error: %5 Добавить диаграмму холста - Synchronize Browser and Diagram<br><i><small>Press&Hold for options</small></i> - Синхронизировать браузер и диаграмму<br><i><small>Нажмите и удерживайте для настройки</small></i> + Synchronize Browser and Diagram + Согласовывать обозреватель с диаграммой + + + Press && Hold for Options + Нажмите и удерживайте для входа в настройки Edit Element Properties @@ -22724,22 +22899,6 @@ Error: %5 <html><body style="color:#909090; font-size:14px"><div align='center'><div style="font-size:20px">Open a diagram</div><table><tr><td><hr/><div style="margin-top: 5px">&bull; Double-click on diagram in model tree</div><div style="margin-top: 5px">&bull; Select "Open Diagram" from package's context menu in model tree</div></td></tr></table></div></body></html> <html><body style="color:#909090; font-size:14px"><div align='center'><div style="font-size:20px">Открытие диаграммы</div><table><tr><td><hr/><div style="margin-top: 5px">&bull; Двойной щелчок на диаграмме в дереве модели</div><div style="margin-top: 5px">&bull; «Открыть диаграмму» в контекстном меню пакета дерева модели</div></td></tr></table></div></body></html> - - Add Package - Добавить пакет - - - Add Component - Добавить компонент - - - Add Class - Добавить класс - - - Add Canvas Diagram - Добавить диаграмму холста - Synchronize Structure with Diagram Согласовывать структуру с диаграммой @@ -22764,6 +22923,18 @@ Error: %5 Export Diagram Экспорт диаграммы + + Export Selected Elements + Экспорт выбранных элементов + + + Exporting Selected Elements Failed + Не удалось экспортировать выбранные элементы + + + Exporting the selected elements of the current diagram into file<br>"%1"<br>failed. + Не удалось экспортировать выбранные элементы текущей диаграммы в файл<br>«%1». + Exporting Diagram Failed Не удалось экспортировать диаграмму @@ -22772,22 +22943,42 @@ Error: %5 Exporting the diagram into file<br>"%1"<br>failed. Не удалось экспортировать диаграмму в файл «%1». + + New %1 + Новый %1 + Package Пакет + + New Package + Создать пакет + Component Компонент + + New Component + Создать компонент + Class Класс + + New Class + Создать класс + Item Элемент + + New Item + Создать элемент + Annotation Аннотация @@ -24036,6 +24227,37 @@ Error: %5 Интервал между внутренними элементами элемента управления. + + ProcessCreator + + Executable does not exist: %1 + Программа отсутствует: %1 + + + Unknown error occurred. + Возникла неизвестная ошибка. + + + Process crashed. + Процесс аварийно завершился. + + + Process failed at startup. + Сбой запуска процесса. + + + Process timed out. + Вышло время ожидания процесса. + + + Cannot write to process. + Не удалось отправить данные процессу. + + + Cannot read from process. + Не удалось получить данные от процесса. + + ProjectExplorer @@ -24189,16 +24411,6 @@ Error: %5 ProjectExplorer::BuildConfiguration - - Build - Display name of the build build step list. Used as part of the labels in the project window. - Сборка - - - Clean - Display name of the clean build step list. Used as part of the labels in the project window. - Очистка - Build Settings Настройки сборки @@ -24300,6 +24512,19 @@ Error: %5 Этап сборки + + ProjectExplorer::BuildStepList + + Build + Display name of the build build step list. Used as part of the labels in the project window. + Сборка + + + Clean + Display name of the clean build step list. Used as part of the labels in the project window. + Очистка + + ProjectExplorer::BuildableHelperLibrary @@ -24562,6 +24787,7 @@ cannot be found in the path. ProjectExplorer::DeployConfigurationFactory Deploy Configuration + Display name of the default deploy configuration Конфигурация установки @@ -24643,10 +24869,6 @@ cannot be found in the path. DebugBreakProcess failed: Ошибка DebugBreakProcess: - - %1 does not exist. If you built Qt Creator yourself, check out https://code.qt.io/cgit/qt-creator/binary-artifacts.git/. - %1 не существует. Если производится самостоятельная сборка Qt Creator, то посетите https://code.qt.io/cgit/qt-creator/binary-artifacts.git/. - could not break the process. не удалось остановить процесс. @@ -24659,6 +24881,10 @@ cannot be found in the path. Cannot interrupt process with pid %1: %2 Не удалось прервать процесс с PID %1: %2 + + %1 does not exist. If you built %2 yourself, check out https://code.qt.io/cgit/qt-creator/binary-artifacts.git/. + %1 не существует. Если вы сами собрали %2, то посетите https://code.qt.io/cgit/qt-creator/binary-artifacts.git/. + Cannot start %1. Check src\tools\win64interrupt\win64interrupt.c for more information. Не удалось запустить %1. Подробности можно найти в src\tools\win64interrupt\win64interrupt.c. @@ -24828,23 +25054,16 @@ cannot be found in the path. Базовая среда данной конфигурации выполнения: - - ProjectExplorer::EnvironmentIdAccessor - - <p>No .user settings file created by this instance of %1 was found.</p><p>Did you work with this project on another machine or using a different settings path before?</p><p>Do you still want to load the settings file "%2"?</p> - <p>Не удалось найти файл настроек от этого %1.</p><p>Не работали ли вы ранее с этим проектом на другой машине или не использовали ли вы другой путь к настройкам?</p><p>Продолжить загрузку файла настроек «%2»?</p> - - - Settings File for "%1" from a different Environment? - Настройки проекта «%1» с другого компьютера? - - ProjectExplorer::EnvironmentKitInformation The environment setting value is invalid. Значение параметра среды не верно. + + Environment + Среда + ProjectExplorer::EnvironmentValidator @@ -25566,10 +25785,22 @@ Excluding: %2 Show Hidden Files Отображать скрытые файлы + + The file "%1" was renamed to "%2", but the following projects could not be automatically changed: %3 + Файл «%1» был переименован в «%2», но не удалось автоматически изменить проекты: %3 + + + Show Bread Crumbs + Показать навигационную цепочку + Synchronize with Editor Согласовывать с редактором + + The following projects failed to automatically remove the file: %1 + Не удалось автоматически удалить файл из следующих проектов: %1 + Open Project in "%1" Открыть проект в «%1» @@ -25606,8 +25837,8 @@ Excluding: %2 Alt+Y - Filter Files - Отображение файлов + Options + Параметры @@ -26013,14 +26244,14 @@ Excluding: %2 Same Build Directory В том же каталоге сборки - - Limit build output to - Ограничить вывод сборки - Limit application output to Ограничить вывод приложения + + Limit build output to + Ограничить вывод сборки + ProjectExplorer::Internal::ProjectFileWizardExtension @@ -26650,18 +26881,6 @@ to project "%2". Field has no name. Поле не имеет имени. - - Label data is not an object. - Данные Label не являются объектом. - - - No text given for Label. - Для Label не задан текст. - - - Spacer data is not an object. - Данные Spacer не являются объектом. - Field "%1" has no type. Поле «%1» не имеет типа. @@ -26683,20 +26902,68 @@ to project "%2". При обработке поля «%1»: %2 - "factor" is no integer value. - Значение «factor» не является целым. + Label ("%1") data is not an object. + Данные Label («%1») не являются объектом. - LineEdit data is not an object. - Данные LineEdit не являются объектом. + Label ("%1") has no trText. + У Label («%1») нет trText. - Invalid regular expression "%1" in "validator". - Неверное регулярное выражение «%1» в «validator». + Spacer ("%1") data is not an object. + Данные Spacer («%1») не являются объектом. - TextEdit data is not an object. - Данные TextEdit не являются объектом. + Spacer ("%1") property "factor" is no integer value. + Свойство «factor» элемента Spacer («%1») не целое число. + + + LineEdit ("%1") data is not an object. + Данные LineEdit («%1») не являются объектом. + + + LineEdit ("%1") has an invalid regular expression "%2" in "validator". + LineEdit («%1») содержит неверное регулярное выражение «%2» в поле «validator». + + + TextEdit ("%1") data is not an object. + Данные TextEdit («%1») не являются объектом. + + + CheckBox ("%1") data is not an object. + Данные CheckBox («%1») не являются объектом. + + + CheckBox ("%1") values for checked and unchecked state are identical. + Значения CheckBox («%1») для включённого и выключенного состояний одинаковы. + + + No JSON lists allowed inside List items. + Списки JSON недопустимы внутри элементов List. + + + No "key" found in List items. + Не найден «key» в элементах List. + + + %1 ("%2") data is not an object. + Данные %1 («%2») не являются объектом. + + + %1 ("%2") "index" is not an integer value. + Значение «index» объекта %1 («%2») не является целым. + + + %1 ("%2") "disabledIndex" is not an integer value. + Значение «disabledIndex» объекта %1 («%2») не является целым. + + + %1 ("%2") "items" missing. + Отсутствует элемент «items» у %1 («%2»). + + + %1 ("%2") "items" is not a JSON list. + Поле «items» у %1 («%2») не является списком JSON. PathChooser data is not an object. @@ -26706,46 +26973,6 @@ to project "%2". kind "%1" is not one of the supported "existingDirectory", "directory", "file", "saveFile", "existingCommand", "command", "any". вид «%1» не один из: «existingDirectory», «directory», «file», «saveFile», «existingCommand», «command», «any». - - No "key" found in ComboBox items. - Не найден «key» в элементах ComboBox. - - - ComboBox "index" is not an integer value. - Значение «index» объекта ComboBox не является целым. - - - ComboBox "disabledIndex" is not an integer value. - Значение «disabledIndex» объекта ComboBox не является целым. - - - ComboBox "items" missing. - Элемент «items» ComboBox отсутствует. - - - ComboBox "items" is not a list. - Поле «items» ComboBox не является списком. - - - Internal Error: ComboBox items lists got mixed up. - Внутренняя ошибка: элементы ComboBox перемешаны. - - - CheckBox data is not an object. - Данные CheckBox не являются объектом. - - - CheckBox values for checked and unchecked state are identical. - Значения CheckBox для включённого и выключенного состояний одинаковы. - - - No lists allowed inside ComboBox items list. - Списки не допустимы внутри списка элементов ComboBox. - - - ComboBox data is not an object. - Данные ComboBox не являются объектом. - Files data list entry is not an object. Список файлов не является объектом. @@ -27321,10 +27548,6 @@ Preselects a desktop Qt for building the application if available. Qt Console Application Консольное приложение Qt - - Use Qt Virtual Keyboard. - Использовать виртуальную клавиатуру Qt - This wizard creates an empty .pro file. Этот мастер создаст пустой файл .pro. @@ -27397,10 +27620,6 @@ Preselects a desktop Qt for building the application if available. Qt Test Qt Test - - Googletest - Googletest - GUI Application Приложение с GUI @@ -27507,6 +27726,26 @@ Use this only if you are prototyping. You cannot create a full application with Use Qt Virtual Keyboard Использовать виртуальную клавиатуру Qt + + Google Test + Тест Google + + + Qt Quick Test + Тест Qt Quick + + + Qt 5.10 + Qt 5.10 + + + Creates a scratch model using a temporary file. + Создание черновой модели с использованием временного файла. + + + Scratch Model + Черновая модель + Creates a Qt Canvas 3D QML project, optionally including three.js. Создание проекта Qt Canvas 3D QML, возможно, с three.js. @@ -28098,13 +28337,6 @@ Please close all running instances of your application before starting a build.< Некоторые конфигураций не удалось скопировать. - - ProjectExplorer::ProjectConfiguration - - Clone of %1 - Копия %1 - - ProjectExplorer::ProjectExplorerPlugin @@ -28296,10 +28528,6 @@ Please close all running instances of your application before starting a build.< Rename... Переименовать... - - Diff Against Current File - Сравнить с текущим файлом - Set as Active Project Сделать активным проектом @@ -28933,17 +29161,6 @@ These files are preserved. Безымянная - - ProjectExplorer::SettingsAccessor - - Unsupported Shared Settings File - Неподдерживаемый файл общих настроек - - - The version of your .shared file is not supported by %1. Do you want to try loading it anyway? - Версия вашего файла .shared не поддерживается этой версией %1. Попробовать загрузить файл? - - ProjectExplorer::SimpleTargetRunner @@ -29045,6 +29262,10 @@ These files are preserved. Select all kits Выбрать все комлекты + + Type to filter kits by name... + Фильтр комплектов по имени... + Select Kits for Your Project Выбор комплектов для проекта @@ -29211,7 +29432,7 @@ App ID: %2 PuppetCreator - Puppet is starting ... + Puppet is starting... Запускается Puppet... @@ -29235,8 +29456,8 @@ App ID: %2 Неверный комплект - The QML emulation layer (QML Puppet) cannot be built because the kit is not configured correctly. For example the compiler can be misconfigured. Fix the kit configuration and restart Qt Creator. Otherwise, the fallback emulation layer, which does not support all features, will be used. - Невозможно собрать слой эмуляции QML (QML Puppet), так как комплект не настроен корректно. Например, не настроен компилятор. Исправьте настройку комплекта и перезапустите Qt Creator. Иначе будет использоваться резервный эмулятор, не поддерживающий всех возможностей. + The QML emulation layer (QML Puppet) cannot be built because the kit is not configured correctly. For example the compiler can be misconfigured. Fix the kit configuration and restart %1. Otherwise, the fallback emulation layer, which does not support all features, will be used. + Невозможно собрать слой эмуляции QML (QML Puppet), так как комплект не настроен корректно. Например, не настроен компилятор. Исправьте настройку комплекта и перезапустите %1. Иначе будет использоваться резервный эмулятор, не поддерживающий всех возможностей. Qt Version is not supported @@ -29287,6 +29508,13 @@ App ID: %2 Закрывает прицепляемый виджет + + QObject + + C++ Usages: + Использование C++: + + QSsh::Internal::SftpChannelPrivate @@ -29855,8 +30083,8 @@ App ID: %2 Force probes - Не знаю, что это значит. "Исследовать принудительно"? - Форсировать пробы + Есть такой раздел Probe в проекте QBS, предназначенный для однократного вычисления, возможно, очень ресурсоемкого, поэтому результат кэшируется. Данная галка отключает кэширование. + Всегда выполнять Probe Installation flags: @@ -30144,6 +30372,10 @@ App ID: %2 QbsProjectManager::Internal::QbsRunConfigurationWidget + + Add library paths to run environment + Добавить в среду исполнения пути к библиотекам + <unknown> <неизвестный> @@ -30160,35 +30392,6 @@ App ID: %2 Файлы Qbs - - QmakeAndroidSupport::Internal::AndroidPackageInstallationFactory - - Deploy to device - Установка на устройство - - - - QmakeAndroidSupport::Internal::AndroidPackageInstallationStep - - Copy application data - Копирование данных приложения - - - Removing directory %1 - Удаление каталога %1 - - - - QmakeAndroidSupport::Internal::AndroidPackageInstallationStepWidget - - <b>Make install</b> - <b>Make install</b> - - - Make install - Make install - - QmakeAndroidSupport::Internal::ChooseDirectoryPage @@ -31401,6 +31604,10 @@ Neither the path to the library nor the path to its includes is added to the .pr QML Debugging Отладка QML + + QMake Configuration + Конфигурация QMake + The option will only take effect if the project is recompiled. Do you want to recompile now? Этот параметр вступит в силу только после перекомпиляции проекта. Перекомпилировать? @@ -31601,6 +31808,21 @@ Neither the path to the library nor the path to its includes is added to the .pr Ошибка: %1 + + QmlDebug::QmlDebugConnectionManager + + Debug connection opened. + Отладочное соединение открыто. + + + Debug connection closed. + Отладочное соединение закрыто. + + + Debug connection failed. + Не удалось установить отладочное подключение. + + QmlDebug::QmlOutputParser @@ -31754,8 +31976,8 @@ Neither the path to the library nor the path to its includes is added to the .pr QmlDesigner::DocumentWarningWidget - Ignore always these unsupported Qt Quick Designer warnings. - Всегда игнорировать эти предупреждения Qt Quick Designer. + Always ignore these warnings about features not supported by Qt Quick Designer. + Всегда игнорировать эти предупреждения о неподдерживаемых функциях Qt Quick Designer. Cannot open this QML document because of an error in the QML file: @@ -32046,6 +32268,10 @@ Neither the path to the library nor the path to its includes is added to the .pr Invalid type %1 Неверный тип %1 + + Unknown property for Imports %1 + Неизвестное свойство для Imports %1 + Unknown property for Type %1 Неизвестное свойство для Type %1 @@ -32323,6 +32549,34 @@ Neither the path to the library nor the path to its includes is added to the .pr Library search input hint text <Фильтр> + + Add New Resources... + Добавить новые ресурсы... + + + Add new resources to project. + Добавление новых ресурсов в проект. + + + Add import %1 + Добавить импорт %1 + + + Add Resources + Добавление ресурсов + + + Target Directory + Каталог назначения + + + Failed to Add File + Не удалось добавить файл + + + Could not add %1 to project. + Не удалось добавить файл %1 в проект. + QmlDesigner::NavigatorTreeModel @@ -32332,7 +32586,7 @@ Neither the path to the library nor the path to its includes is added to the .pr Toggles whether this item is exported as an alias property of the root item. - Включает экспорт элемента, как свойства alias корневого элемента. + Включает экспорт элемента, как псевдонима свойства корневого элемента. Toggles the visibility of this item in the form editor. @@ -32366,6 +32620,14 @@ This is independent of the visibility property in QML. QmlDesigner::NavigatorWidget + + Navigator + Навигатор + + + Project + Проект + Navigator Title of navigator view @@ -32389,7 +32651,7 @@ This is independent of the visibility property in QML. Filter Tree - Настроить отображение + Отфильтровать дерево Show only visible items. @@ -32593,10 +32855,6 @@ This is independent of the visibility property in QML. Select All "%1" Выделить все «%1» - - Toggle States Editor - Показать/скрыть редактор состояний - Switch Text/Design Переключить текст/дизайн @@ -32605,6 +32863,10 @@ This is independent of the visibility property in QML. &Restore Default View &Восстановить исходный вид + + Toggle States + Показать/скрыть состояния + Toggle &Left Sidebar Показать/скрыть &левую панель @@ -32662,7 +32924,7 @@ This is independent of the visibility property in QML. The empty string as a name is reserved for the base state. - Пустая строка зарезервирована, как название исходного состояния. + Пустая строка зарезервирована как название исходного состояния. Name already used in another state @@ -32672,8 +32934,8 @@ This is independent of the visibility property in QML. QmlDesigner::StatesEditorView - States Editor - Редактор состояний + States + Состояния base state @@ -32730,6 +32992,13 @@ This is independent of the visibility property in QML. Не найден импорт Qt Quick. + + QmlDesignerAddResources + + Image Files + Файлы изображений + + QmlDesignerContextMenu @@ -32873,7 +33142,7 @@ This is independent of the visibility property in QML. Сбросить положение и использовать неявное. - Fill selected item to parent. + Fill selected item to parent. Заполнить родительским. @@ -33010,6 +33279,17 @@ This is independent of the visibility property in QML. Анонимная функция + + QmlJS Code Model Marks + + Code Model Warning + Предупреждение модели кода + + + Code Model Error + Ошибка модели кода + + QmlJS::Bind @@ -33682,13 +33962,6 @@ For more information, see the "Checking Code Syntax" documentation.Qt Quick - - QmlJSEditor::AddAnalysisMessageSuppressionComment - - Add a Comment to Suppress This Message - Добавьте комментарий для подавления этого сообщения - - QmlJSEditor::ComponentFromObjectDef @@ -34627,21 +34900,6 @@ the QML editor know about a likely URI. Комплект: - - QmlProfiler::Internal::QmlProfilerClientManager - - Debug connection opened - Отладочное соединение открыто - - - Debug connection closed - Отладочное соединение закрыто - - - Debug connection failed - Не удалось установить отладочное подключение - - QmlProfiler::Internal::QmlProfilerConfigWidget @@ -34792,6 +35050,70 @@ itself takes time. Main Program Основная программа + + Callee + Вызываемое + + + Callee Description + Описание вызываемого + + + Caller + Вызывающее + + + Caller Description + Описание вызывающего + + + Calls + Вызовы + + + Details + Подробнее + + + Location + Размещение + + + Longest Time + Наибольшее время + + + Mean Time + Среднее время + + + Self Time + Собственное время + + + Self Time in Percent + Собственное время в процентах + + + Shortest Time + Наименьше время + + + Time in Percent + Время в процентах + + + Total Time + Общее время + + + Type + Тип + + + Median Time + Медианное время + <bytecode> <байтовый код> @@ -35107,10 +35429,6 @@ Do you want to save the data first? QmlProjectManager::Internal::QmlProjectRunConfigurationFactory - - QML Viewer - QML Viewer - QML Scene QML Scene @@ -35141,10 +35459,6 @@ Do you want to save the data first? Qt version is too old. Версия Qt слишком стара. - - Device type is not desktop. - Устройство не соответствует типу desktop. - No Qt version set in kit. Для комплекта не задан профиль Qt. @@ -35170,19 +35484,18 @@ Do you want to save the data first? QmlProjectManager::QmlProjectRunConfiguration - - No qmlviewer or qmlscene found. - Не найдены ни qmlviewer, ни qmlscene. - QML Scene QMLRunConfiguration display name. QML Scene - QML Viewer - QMLRunConfiguration display name. - + No qmlscene found. + qmlscene не найден. + + + No qmlscene binary specified for target device. + Не задана программа qmlscene для целевого устройства. No script file to execute. @@ -35989,6 +36302,10 @@ For more details, see /etc/sysctl.d/10-ptrace.conf The installation location of the current Qt version's plugins. Каталог установки модулей текущего профиля Qt. + + The installation location of the current Qt version's QML files. + Каталог установки файлов QML текущего профиля Qt. + The installation location of the current Qt version's imports. Каталог установки импорта текущего профиля Qt. @@ -36129,10 +36446,6 @@ For more details, see /etc/sysctl.d/10-ptrace.conf qmake "%1" is not an executable. qmake «%1» не является программой. - - No qmlviewer installed. - qmlviewer не установлен. - Desktop Qt Version is meant for the desktop @@ -36745,8 +37058,8 @@ In addition, device connectivity will be tested. RemoteLinux::Internal::RemoteLinuxRunConfigurationFactory - (on Remote Generic Linux Host) - (на удалённой машине с Linux) + %1 (on Remote Generic Linux Host) + %1 (на удалённой машине с Linux) @@ -36878,6 +37191,28 @@ In addition, device connectivity will be tested. Не удалось загрузить окружение: %1 + + RemoteLinux::RemoteLinuxKillAppService + + Trying to kill "%1" on remote device... + Попытка уничтожить «%1» на внешнем устройстве... + + + Remote application killed. + Внешнее приложение уничтожено. + + + Failed to kill remote application. Assuming it was not running. + Не удалось уничтожить внешнее приложение. Возможно, оно не было запущено. + + + + RemoteLinux::RemoteLinuxKillAppStep + + Kill current application instance + Уничтожение текущего экземпляра приложения + + RemoteLinux::RemoteLinuxRunConfiguration @@ -37945,10 +38280,6 @@ Description: %4 Each state must have a unique ID. Каждое состояние должно иметь уникальный ID. - - Missing ID - Отсутствует ID - Missing ID. Отсутствует ID. @@ -38136,10 +38467,6 @@ Row: %4, Column: %5 Re-Layout Перекомпоновать - - Relayout - Перекомпоновать - Change initial state Сменить начальное состояние @@ -38397,6 +38724,14 @@ with a password, which you can enter below. Specifies how the font size of the displayed text is determined. Задаёт режим определения размера шрифта отображаемого текста. + + Line height + Высота строки + + + Sets the line height for the text. + Задаёт высоту строки текста. + StatesDelegate @@ -38829,8 +39164,8 @@ with a password, which you can enter below. Не удалять - Disable Kit %1 in This Project? - Отключить комплект %1 в этом проекте? + Disable Kit "%1" in This Project? + Отключить комплект «%1» в этом проекте? The kit <b>%1</b> is currently being built. @@ -39272,7 +39607,7 @@ Specifies how backspace interacts with indentation. Определяет, как клавиша «забой» взаимодействует с отступами. <ul> -<li>Обычное: Никакого взаимодействия. Поведение, как для обычного текста. +<li>Обычное: Никакого взаимодействия. Поведение как для обычного текста. </li> <li>Следовать предыдущим отступам: Перемещение курсора на ближайший уровень отступов назад, определяемый предыдущими строками текста. @@ -39848,10 +40183,6 @@ In addition, Shift+Enter inserts an escape character at the cursor position and Animate navigation within file Анимировать навигацию по файлу - - Annotations next to lines - Построчная аннотация - Next to editor content За содержимым редактора @@ -39864,6 +40195,14 @@ In addition, Shift+Enter inserts an escape character at the cursor position and Aligned at right side Прижать к правому краю + + Line annotations + Построчная аннотация + + + Between lines + Между строк + TextEditor::Internal::FindInCurrentFile @@ -40086,6 +40425,79 @@ In addition, Shift+Enter inserts an escape character at the cursor position and Настроить отображение + + TextEditor::Internal::Snippets + + + Snippets are text fragments that can be inserted into an editor via the usual completion mechanics using a trigger text. The translated text (trigger variant) is used to disambiguate between snippets with the same trigger. + + + + derived from QObject + group:'C++' trigger:'class' + производный от QObject + + + derived from QWidget + group:'C++' trigger:'class' + производный от QWidget + + + template + group:'C++' trigger:'class' + шаблон + + + with if + group:'C++' trigger:'else' + с if + + + and else + group:'C++' trigger:'if' + и else + + + and catch + group:'C++' trigger:'try' + и catch + + + namespace + group:'C++' trigger:'using' + пространство имён + + + template + group:'C++' trigger:'struct' + шаблон + + + with targets + group:'QML' trigger:'NumberAnimation' + с целями + + + with target + group:'QML' trigger:'NumberAnimation' + с целью + + + with targets + group:'QML' trigger:'PropertyAction' + с целями + + + with target + group:'QML' trigger:'PropertyAction' + с целью + + + example + group:'Text' trigger:'global' + пример + + TextEditor::Internal::SnippetsCollection @@ -40667,6 +41079,14 @@ Influences the indentation of continuation lines. Select Word Under Cursor Выбрать слово под курсором + + Go to Document Start + Перейти в начало документа + + + Go to Document End + Перейти в конец документа + Go to Line Start Перейти в начало строки @@ -40804,33 +41224,6 @@ Influences the indentation of continuation lines. Размер шрифта в точках в текущем документе. - - TextEditor::QuickFixFactory - - Create Getter and Setter Member Functions - Создать методы получения и установки значения - - - Create Getter Member Function - Создать метод получения значения - - - Create Setter Member Function - Создать метод установки значения - - - Convert to Stack Variable - Преобразовать в стековую переменную - - - Convert to Pointer - Преобразовать в указатель - - - Generate Missing Q_PROPERTY Members - Создание отсутствующих членов Q_PROPERTY - - TextEditor::SearchEngine @@ -40840,6 +41233,10 @@ Influences the indentation of continuation lines. TextEditor::TextDocument + + Diff Against Current File + Сравнить с текущим файлом + Opening File Открытие файла @@ -41333,12 +41730,20 @@ Will not be applied to whitespace in comments and strings. Цвет подчёркивания контекстов предупреждений. - Declaration - Объявление + Function Declaration + Объявление функции - Declaration of a function, variable, and so on. - Объявление функций, переменных и пр. + Style adjustments to (function) declarations. + Корректировка стиля для объявлений (функций). + + + Function Definition + Реализация функции + + + Name of function at its definition. + Имя функции в месте её реализации. Output Argument @@ -42000,6 +42405,17 @@ Will not be applied to whitespace in comments and strings. Изменение среды + + Utils::EnvironmentIdAccessor + + <p>No .user settings file created by this instance of %1 was found.</p><p>Did you work with this project on another machine or using a different settings path before?</p><p>Do you still want to load the settings file "%2"?</p> + <p>Не удалось найти файл настроек от этого %1.</p><p>Не работали ли вы ранее с этим проектом на другой машине или не использовали ли вы другой путь к настройкам?</p><p>Продолжить загрузку файла настроек «%2»?</p> + + + Settings File for "%1" from a Different Environment? + Настройки проекта «%1» с другого компьютера? + + Utils::EnvironmentModel @@ -42486,14 +42902,42 @@ Will not be applied to whitespace in comments and strings. - Utils::SaveFile + Utils::RemoveFileDialog - File might be locked. - Файл может быть заблокирован. + Remove File + Удаление файла + + + File to remove: + Удаляемый файл: + + + &Delete file permanently + &Удалить файл навсегда + + + &Remove from version control + Удалить из-под &контроля версий Utils::SettingsAccessor + + Failed to Read File + Не удалось прочитать файл + + + Could not open "%1". + Не удалось открыть «%1». + + + Failed to Write File + Не удалось записать файл + + + There was nothing to write. + Нечего записывать. + No Valid Settings Found Подходящие настройки не найдены @@ -42510,6 +42954,14 @@ Will not be applied to whitespace in comments and strings. <p>The versioned backup "%1" of the settings file is used, because the non-versioned file was created by an incompatible version of %2.</p><p>Settings changes made since the last time this version of %2 was used are ignored, and changes made now will <b>not</b> be propagated to the newer version.</p> <p>Будет использоваться резервная копия файла настроек .user более старой версии («%1»), так как текущий файл создан несовместимой версией %2.</p><p>Изменения настроек проекта, сделанные с момента последнего запуска этой версии %2, не будут учтены, а изменения, вносимые сейчас, <b>не будут</b> сохранены в новую версию файла проекта.</p> + + Unsupported Shared Settings File + Неподдерживаемый файл общих настроек + + + The version of your .shared file is not supported by %1. Do you want to try loading it anyway? + Версия вашего файла .shared не поддерживается этой версией %1. Попробовать загрузить файл? + Utils::SettingsSelector @@ -43205,6 +43657,184 @@ Will not be applied to whitespace in comments and strings. Обработка данных профилирования... + + Valgrind::Internal::HeobData + + Process %1 + Процесс %1 + + + Process finished with exit code %1 (0x%2). + Процесс завершился с кодом %1 (0x%2). + + + Unknown argument: -%1 + Неизвестный параметр: -%1 + + + Cannot create target process. + Не удалось создать целевой процесс. + + + Wrong bitness. + Неверная разрядность. + + + Process killed. + Процесс уничтожен. + + + Only works with dynamically linked CRT. + Работает только с динамически подключаемой CRT. + + + Process stopped with unhandled exception code 0x%1. + Процесс остановлен из-за необработанного исключения с кодом 0x%1. + + + Not enough memory to keep track of allocations. + Недостаточно памяти для сохранения истории выделений. + + + Application stopped unexpectedly. + Приложение неожиданно остановилось. + + + Extra console. + Допольнительная консоль. + + + Unknown exit reason. + Неизвестная причина завершения. + + + Heob stopped unexpectedly. + Heob неожиданно остановился. + + + Heob: %1 + Heob: %1 + + + Heob: Failure in process attach handshake (%1). + Heob: не удалось выполнить рукопожание при подключении к процессу (%1). + + + + Valgrind::Internal::HeobDialog + + XML output file: + Выходной файл XML: + + + Handle exceptions: + Обрабатывать исключения: + + + Off + Откл. + + + On + Вкл. + + + Only + Только + + + Page protection: + Защита страниц: + + + After + Перед + + + Before + После + + + Freed memory protection + Защита освобождённой памяти + + + Raise breakpoint exception on error + Кидать исключение (точка останова) при ошибке + + + Leak details: + Подробности об утечке: + + + None + Нет + + + Simple + Простые + + + Detect Leak Types + Определять типы утечек + + + Detect Leak Types (Show Reachable) + Определять типы утечек (показывать доступные) + + + Fuzzy Detect Leak Types + Нечётко определять типы утечек + + + Fuzzy Detect Leak Types (Show Reachable) + Нечётко определять типы утечек (показывать доступные) + + + Minimum leak size: + Минимальный размер утечки: + + + Control leak recording: + Управление записью утечек: + + + On (Start Disabled) + Вкл. (отключён старт) + + + On (Start Enabled) + Вкл. (включён старт) + + + Run with debugger + Запускать с отладчиком + + + Extra arguments: + Доп. параметры: + + + Heob path: + Путь к Heob: + + + The location of heob32.exe and heob64.exe. + Размещение heob32.exe и heob64.exe. + + + Save current settings as default. + Сохранить текущие настройки как настройки по умолчанию. + + + OK + OK + + + Heob + Heob + + Valgrind::Internal::MemcheckErrorView @@ -43264,10 +43894,47 @@ When a problem is detected, the application is interrupted and can be debugged.< Анализатор памяти Valgrind с GDB использует утилиту Memcheck для поиска утечек памяти. При обнаружении проблем программа останавливается для отладки. + + Heob + Х.з. что такое + Heob + + + Ctrl+Alt+H + Ctrl+Alt+H + Valgrind Memory Analyzer (External Application) Анализатор памяти Valgrind (внешняя программа) + + Heob: No local run configuration available. + Heob: недоступна локальная конфигурация запуска. + + + Heob: No toolchain available. + Heob: недоступен инструментарий. + + + Heob: No executable set. + Heob: программа не задана. + + + Heob: Cannot find %1. + Heob: не удалось найти %1. + + + The %1 executables must be in the appropriate location. + Программы %1 должны быть в соответствущем месте. + + + Heob used with MinGW projects needs the %1 DLLs for proper stacktrace resolution. + При использовании Heob совместно с проектами MinGW требуются динамические библиотеки %1 для корректного разбора трассировки стека. + + + Heob: Cannot create %1 process (%2). + Heob: не удалось создать процесс %1: %2. + A Valgrind Memcheck analysis is still in progress. Анализатор памяти Valgrind уже выполняется. @@ -43289,19 +43956,19 @@ When a problem is detected, the application is interrupted and can be debugged.< Memcheck: Ошибка при разборе вывода Valgrind: %1 - Memory Analyzer Tool finished, %n issues were found. + Memory Analyzer Tool finished. %n issues were found. - Анализ памяти завершён, найдена %n проблема. - Анализ памяти завершён, найдено %n проблемы. - Анализ памяти завершён, найдено %n проблем. + Анализ памяти завершён. Найдена %n проблема. + Анализ памяти завершён. Найдено %n проблемы. + Анализ памяти завершён. Найдено %n проблем. - Log file processed, %n issues were found. + Log file processed. %n issues were found. - Файл журнала обработан, найдена %n проблема. - Файл журнала обработан, найдено %n проблемы. - Файл журнала обработан, найдено %n проблем. + Файл журнала обработан. Найдена %n проблема. + Файл журнала обработан. Найдено %n проблемы. + Файл журнала обработан. Найдено %n проблем. @@ -44566,30 +45233,14 @@ should a repository require SSH-authentication (see documentation on SSH and the Create Connection Создание соединения - - New Package - Новый пакет - - - New Component - Новый компонент - - - New Class - Новый класс - - - New Item - Новый элемент - - - New %1 - Новый %1 - Drop Element Удаление элемента + + Add Related Element + Добавление связанного элемента + Add Element Добавление элемента @@ -44773,6 +45424,10 @@ should a repository require SSH-authentication (see documentation on SSH and the Same Size По размеру + + Add Related Elements + Добавить связанные элементы + qmt::ProjectController @@ -45001,7 +45656,11 @@ should a repository require SSH-authentication (see documentation on SSH and the Outline - Обведённым + Обведённый + + + Flat + Гладкий Emphasized @@ -45061,11 +45720,7 @@ should a repository require SSH-authentication (see documentation on SSH and the Swimlanes - Swimlane'ы - - - <font color=red>Invalid syntax.</font> - <font color=red>Неверный синтаксис.</font> + Swimlane'ы Box @@ -45107,6 +45762,10 @@ should a repository require SSH-authentication (see documentation on SSH and the Boundaries Границы + + Invalid syntax. + Неверный синтаксис. + Multi-Selection Множественное выделение From a776157cabb5943b0910d34cf967c17ec46444e9 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 7 Mar 2018 11:56:32 +0200 Subject: [PATCH 09/41] Git: Show decorations in commit details Change-Id: Ifbf4737b0d374006a69b7005e4c6a032d5bf43e3 Reviewed-by: Tobias Hunger --- src/plugins/git/changeselectiondialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/git/changeselectiondialog.cpp b/src/plugins/git/changeselectiondialog.cpp index ec7e724f16f..247427eed52 100644 --- a/src/plugins/git/changeselectiondialog.cpp +++ b/src/plugins/git/changeselectiondialog.cpp @@ -251,7 +251,7 @@ void ChangeSelectionDialog::recalculateDetails() connect(m_process, static_cast(&QProcess::finished), this, &ChangeSelectionDialog::setDetails); - m_process->start(m_gitExecutable.toString(), {"show", "--stat=80", ref}); + m_process->start(m_gitExecutable.toString(), {"show", "--decorate", "--stat=80", ref}); m_process->closeWriteChannel(); if (!m_process->waitForStarted()) m_ui->detailsText->setPlainText(tr("Error: Could not start Git.")); From 3b1e0e070af73bb757406d7257bd1d161d307974 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 7 Mar 2018 14:50:13 +0100 Subject: [PATCH 10/41] QmlJS: Allow NumberAnimation for ui.qml files Change-Id: I12836a2d7708d50278715139f0cfba5fa221f8eb Reviewed-by: Alessandro Portale --- src/libs/qmljs/qmljscheck.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index 5b184d37b0b..1acedaf4a09 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -575,7 +575,6 @@ public: "PropertyAnimation", "SequentialAnimation", "ParallelAnimation", - "NumberAnimation", "Drawer"}) { append(UnsupportedTypesByVisualDesigner()); From 23e48fe207d62b16ca5cef701536ce34f3c9681d Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 7 Mar 2018 14:56:07 +0100 Subject: [PATCH 11/41] AutoTest: Fix marking for removal If marking a test case for removal by file it could be possible that children of this test case are not marked because of being located inside a different file. When performing sweep the test case and the not marked children would be gone as the test case is marked and so sweep would not look into the children. This currently can only happen for gtest based test cases as registering the tests is different and the test case stores here the path of the first found test set. Change-Id: I712054534307ee2839894c5148ae04b86b9df967 Reviewed-by: David Schulz --- src/plugins/autotest/testtreeitem.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/autotest/testtreeitem.cpp b/src/plugins/autotest/testtreeitem.cpp index a597a2de7ad..362465e923b 100644 --- a/src/plugins/autotest/testtreeitem.cpp +++ b/src/plugins/autotest/testtreeitem.cpp @@ -196,12 +196,13 @@ void TestTreeItem::markForRemovalRecursively(bool mark) void TestTreeItem::markForRemovalRecursively(const QString &filePath) { - if (m_filePath == filePath) - markForRemoval(true); + bool mark = m_filePath == filePath; for (int row = 0, count = childCount(); row < count; ++row) { TestTreeItem *child = childItem(row); child->markForRemovalRecursively(filePath); + mark &= child->markedForRemoval(); } + markForRemoval(mark); } TestTreeItem *TestTreeItem::parentItem() const From 6e419d642a2c1e9d6f5cc334bdd58305fd01b3e5 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 7 Mar 2018 10:35:08 +0100 Subject: [PATCH 12/41] RunConfigurationFactories: Fix crash opening non-qmake based projects Make sure the Qnx RCs only get triggered for qmake-based projects and defend against broken set-ups using QTC_ASSERT. Task-number: QTCREATORBUG-19755 Change-Id: If64b73de49b0199308f767151d68909dc8b1bc53 Reviewed-by: hjk --- .../cmakeprojectmanager/cmakerunconfiguration.cpp | 3 ++- src/plugins/ios/iosrunfactories.cpp | 3 ++- src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp | 2 +- .../qmakeandroidsupport/qmakeandroidrunfactories.cpp | 3 ++- .../qmakeprojectmanager/desktopqmakerunconfiguration.cpp | 6 ++++-- src/plugins/qnx/qnxrunconfigurationfactory.cpp | 9 +++++++-- src/plugins/winrt/winrtrunfactories.cpp | 3 ++- 7 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index e59daaa0fe8..6b68d478685 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -241,7 +241,8 @@ CMakeRunConfigurationFactory::CMakeRunConfigurationFactory(QObject *parent) : QList CMakeRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode) const { - CMakeProject *project = static_cast(parent->project()); + CMakeProject *project = qobject_cast(parent->project()); + QTC_ASSERT(project, return {}); const QStringList titles = project->buildTargetTitles(true); return Utils::transform(titles, [project](const QString &title) { BuildTargetInfo bti; diff --git a/src/plugins/ios/iosrunfactories.cpp b/src/plugins/ios/iosrunfactories.cpp index dccf82e9520..854cf45c750 100644 --- a/src/plugins/ios/iosrunfactories.cpp +++ b/src/plugins/ios/iosrunfactories.cpp @@ -62,7 +62,8 @@ bool IosRunConfigurationFactory::canCreateHelper(Target *parent, const QString & QList IosRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const { - auto project = static_cast(parent->project()); + auto project = qobject_cast(parent->project()); + QTC_ASSERT(project, return {}); return project->buildTargets(mode, {ProjectType::ApplicationTemplate, ProjectType::SharedLibraryTemplate, ProjectType::AuxTemplate}); diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index e2324f39f91..ca0ed33f0c0 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -388,7 +388,7 @@ QList QbsRunConfigurationFactory::availableBuildTargets(Target { QList products; - QbsProject *project = static_cast(parent->project()); + QbsProject *project = qobject_cast(parent->project()); if (!project || !project->qbsProject().isValid()) return {}; diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.cpp index e5c62c52dc6..dfb0084c613 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.cpp +++ b/src/plugins/qmakeandroidsupport/qmakeandroidrunfactories.cpp @@ -59,7 +59,8 @@ QmakeAndroidRunConfigurationFactory::QmakeAndroidRunConfigurationFactory(QObject QList QmakeAndroidRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const { - auto project = static_cast(parent->project()); + auto project = qobject_cast(parent->project()); + QTC_ASSERT(project, return {}); return project->buildTargets(mode, {ProjectType::ApplicationTemplate, ProjectType::SharedLibraryTemplate}); } diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp index 549db31d2f2..6ead3531d9e 100644 --- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp @@ -439,14 +439,16 @@ DesktopQmakeRunConfigurationFactory::DesktopQmakeRunConfigurationFactory(QObject bool DesktopQmakeRunConfigurationFactory::canCreateHelper(Target *parent, const QString &buildTarget) const { - QmakeProject *project = static_cast(parent->project()); + QmakeProject *project = qobject_cast(parent->project()); + QTC_ASSERT(project, return {}); return project->hasApplicationProFile(Utils::FileName::fromString(buildTarget)); } QList DesktopQmakeRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const { - QmakeProject *project = static_cast(parent->project()); + QmakeProject *project = qobject_cast(parent->project()); + QTC_ASSERT(project, return {}); return project->buildTargets(mode); } diff --git a/src/plugins/qnx/qnxrunconfigurationfactory.cpp b/src/plugins/qnx/qnxrunconfigurationfactory.cpp index 05112b36bbe..5e2e2c8e464 100644 --- a/src/plugins/qnx/qnxrunconfigurationfactory.cpp +++ b/src/plugins/qnx/qnxrunconfigurationfactory.cpp @@ -32,6 +32,7 @@ #include #include #include +#include using namespace ProjectExplorer; @@ -41,14 +42,17 @@ namespace Internal { QnxRunConfigurationFactory::QnxRunConfigurationFactory(QObject *parent) : ProjectExplorer::IRunConfigurationFactory(parent) { - registerRunConfiguration(Constants::QNX_QNX_RUNCONFIGURATION_PREFIX); - setSupportedTargetDeviceTypes({Constants::QNX_QNX_OS_TYPE}); + registerRunConfiguration(Qnx::Constants::QNX_QNX_RUNCONFIGURATION_PREFIX); + setSupportedTargetDeviceTypes({Qnx::Constants::QNX_QNX_OS_TYPE}); + addSupportedProjectType(QmakeProjectManager::Constants::QMAKEPROJECT_ID); } QList QnxRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const { auto project = qobject_cast(parent->project()); + QTC_ASSERT(project, return {}); + const QList buildTargets = project->buildTargets(mode); return Utils::transform(buildTargets, [](BuildTargetInfo bti) { bti.displayName = tr("%1 on QNX Device").arg(QFileInfo(bti.targetName).completeBaseName()); @@ -60,6 +64,7 @@ bool QnxRunConfigurationFactory::canCreateHelper(ProjectExplorer::Target *parent const QString &buildTarget) const { auto project = qobject_cast(parent->project()); + QTC_ASSERT(project, return false); return project->hasApplicationProFile(Utils::FileName::fromString(buildTarget)); } diff --git a/src/plugins/winrt/winrtrunfactories.cpp b/src/plugins/winrt/winrtrunfactories.cpp index 55e098db0cd..f8bc558cfa5 100644 --- a/src/plugins/winrt/winrtrunfactories.cpp +++ b/src/plugins/winrt/winrtrunfactories.cpp @@ -53,7 +53,8 @@ WinRtRunConfigurationFactory::WinRtRunConfigurationFactory() QList WinRtRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const { - QmakeProject *project = static_cast(parent->project()); + QmakeProject *project = qobject_cast(parent->project()); + QTC_ASSERT(project, return {}); const QList buildTargets = project->buildTargets(mode); return Utils::transform(buildTargets, [](BuildTargetInfo bti) { bti.displayName = tr("Run App Package"); From 5179dbbe688e0dc01708432eebe444003c24c439 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 21 Feb 2018 17:01:45 +0100 Subject: [PATCH 13/41] QmlProject: Clean up environment selection On desktop you get "system environment" as default now and "clean environment" as option. "kit environment" doesn't make any sense as that is meant for build configurations. On remote Devices you only get "clean environment" because we cannot query the generic remote device for its default environment. However, as the environment was rather random before and it worked, a clean environment will probably not break it. Change-Id: Iab0ed804a21cf77db9e3413926ff710c91561db0 Task-number: QTCREATORBUG-19887 Reviewed-by: Tobias Hunger Reviewed-by: Tim Jenssen --- .../qmlprojectenvironmentaspect.cpp | 32 ++++++++++++------- .../qmlprojectenvironmentaspect.h | 2 +- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.cpp b/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.cpp index 5cc6fe9988c..a4721ada4e4 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.cpp @@ -27,6 +27,7 @@ #include "qmlproject.h" +#include #include #include #include @@ -39,28 +40,35 @@ namespace QmlProjectManager { QList QmlProjectEnvironmentAspect::possibleBaseEnvironments() const { - return QList() << static_cast(KitEnvironmentBase) - << static_cast(SystemEnvironmentBase); + QList ret; + if (ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(runConfiguration()->target()->kit()) + == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { + ret << SystemEnvironmentBase; + } + ret << CleanEnvironmentBase; + return ret; } QString QmlProjectEnvironmentAspect::baseEnvironmentDisplayName(int base) const { - if (base == static_cast(SystemEnvironmentBase)) + switch (base) { + case SystemEnvironmentBase: return tr("System Environment"); - if (base == static_cast(KitEnvironmentBase)) - return tr("Kit Environment"); - return QString(); + case CleanEnvironmentBase: + return tr("Clean Environment"); + default: + QTC_CHECK(false); + return QString(); + } } Utils::Environment QmlProjectEnvironmentAspect::baseEnvironment() const { - int base = baseEnvironmentBase(); - Utils::Environment env = Utils::Environment::systemEnvironment(); - if (base == static_cast(KitEnvironmentBase)) - runConfiguration()->target()->kit()->addToEnvironment(env); + Utils::Environment env = baseEnvironmentBase() == SystemEnvironmentBase + ? Utils::Environment::systemEnvironment() + : Utils::Environment(); - QmlProject *project = qobject_cast(runConfiguration()->target()->project()); - if (project) + if (QmlProject *project = qobject_cast(runConfiguration()->target()->project())) env.modify(project->environment()); return env; diff --git a/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.h b/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.h index 14c460085f6..efa32fdfdb4 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.h +++ b/src/plugins/qmlprojectmanager/qmlprojectenvironmentaspect.h @@ -43,7 +43,7 @@ public: private: enum BaseEnvironmentBase { SystemEnvironmentBase = 0, - KitEnvironmentBase + CleanEnvironmentBase, }; }; From cf82b8e685c112fef4170f72eacacb5ca5363b6c Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 21 Feb 2018 18:41:31 +0100 Subject: [PATCH 14/41] QmlDesigner: Allow annotations in comments This patch allows to store the auxiliary data of model nodes as meta data in the QML file. The meta data is encoded in a comment at the end of the QML file. By default such meta data is attached to the clipboard. Change-Id: I794d2c1297d270c5c1099c6c1be98b6b7a7f650b Reviewed-by: Tim Jenssen --- .../integration/designdocumentview.cpp | 5 +- .../designercore/include/rewriterview.h | 6 + .../designercore/model/modelmerger.cpp | 10 +- .../designercore/model/rewriterview.cpp | 160 ++++++++++++++++++ .../qmldesigner/coretests/testrewriterview.h | 2 + .../qmldesigner/coretests/tst_testcore.cpp | 119 +++++++++++++ .../qml/qmldesigner/coretests/tst_testcore.h | 4 + 7 files changed, 304 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp index c30a392cef0..bc8930edb6d 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp @@ -130,8 +130,9 @@ QString DesignDocumentView::toText() const ModelNode rewriterNode(rewriterView->rootModelNode()); + rewriterView->writeAuxiliaryData(); + return rewriterView->extractText({rewriterNode}).value(rewriterNode) + rewriterView->getRawAuxiliaryData(); //get the text of the root item without imports - return rewriterView->extractText({rewriterNode}).value(rewriterNode); } void DesignDocumentView::fromText(QString text) @@ -151,6 +152,8 @@ void DesignDocumentView::fromText(QString text) rewriterView->setTextModifier(&modifier); inputModel->setRewriterView(rewriterView.data()); + rewriterView->restoreAuxiliaryData(); + if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) { ModelMerger merger(this); merger.replaceModel(rewriterView->rootModelNode()); diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 4d4cfee8e68..3c73ec1fabc 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -163,6 +163,12 @@ public: void qmlTextChanged(); void delayedSetup(); + void writeAuxiliaryData(); + void restoreAuxiliaryData(); + + QString getRawAuxiliaryData() const; + QString auxiliaryDataAsQML() const; + protected: // functions void importAdded(const Import &import); void importRemoved(const Import &import); diff --git a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp index a1569322373..161cf1f9f52 100644 --- a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp @@ -60,6 +60,13 @@ static void syncVariantProperties(ModelNode &outputNode, const ModelNode &inputN } } +static void syncAuxiliaryProperties(ModelNode &outputNode, const ModelNode &inputNode) +{ + auto tmp = inputNode.auxiliaryData(); + for (auto iter = tmp.begin(); iter != tmp.end(); ++iter) + outputNode.setAuxiliaryData(iter.key(), iter.value()); +} + static void syncBindingProperties(ModelNode &outputNode, const ModelNode &inputNode, const QHash &idRenamingHash) { foreach (const BindingProperty &bindingProperty, inputNode.bindingProperties()) { @@ -138,6 +145,7 @@ static ModelNode createNodeFromNode(const ModelNode &modelNode,const QHashmodel()->metaInfo(modelNode.type()); ModelNode newNode(view->createModelNode(modelNode.type(), nodeMetaInfo.majorVersion(), nodeMetaInfo.minorVersion(), propertyList, variantPropertyList, modelNode.nodeSource(), modelNode.nodeSourceType())); + syncAuxiliaryProperties(newNode, modelNode); syncBindingProperties(newNode, modelNode, idRenamingHash); syncId(newNode, modelNode, idRenamingHash); syncNodeProperties(newNode, modelNode, idRenamingHash, view); @@ -165,7 +173,6 @@ ModelNode ModelMerger::insertModel(const ModelNode &modelNode) return newNode; } - void ModelMerger::replaceModel(const ModelNode &modelNode) { view()->model()->changeImports(modelNode.model()->imports(), {}); @@ -182,6 +189,7 @@ void ModelMerger::replaceModel(const ModelNode &modelNode) QHash idRenamingHash; setupIdRenamingHash(modelNode, idRenamingHash, view()); + syncAuxiliaryProperties(rootNode, modelNode); syncVariantProperties(rootNode, modelNode); syncBindingProperties(rootNode, modelNode, idRenamingHash); syncId(rootNode, modelNode, idRenamingHash); diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index c4cb5bf7102..a5f036c49b3 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -42,11 +42,17 @@ #include #include +#include + +#include +#include using namespace QmlDesigner::Internal; namespace QmlDesigner { +const char annotationsEscapeSequence[] = "##^##"; + RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *parent): AbstractView(parent), m_differenceHandling(differenceHandling), @@ -442,6 +448,56 @@ void RewriterView::notifyErrorsAndWarnings(const QList &errors) emitDocumentMessage(errors, m_warnings); } +QString RewriterView::auxiliaryDataAsQML() const +{ + bool hasAuxData = false; + + QString str = "Designer {\n "; + + int columnCount = 0; + for (const auto node : allModelNodes()) { + QHash data = node.auxiliaryData(); + if (!data.isEmpty()) { + hasAuxData = true; + if (columnCount > 80) { + str += "\n"; + columnCount = 0; + } + const int startLen = str.length(); + str += "D{"; + str += "i:"; + str += QString::number(node.internalId()); + str += ";"; + + for (auto i = data.begin(); i != data.end(); ++i) { + const QVariant value = i.value(); + QString strValue = value.toString(); + if (value.type() == QMetaType::QString) + strValue = "\"" + strValue + "\""; + + if (!strValue.isEmpty()) { + str += QString::fromUtf8(i.key()) + ":"; + str += strValue; + str += ";"; + } + } + + if (str.back() == ';') + str.chop(1); + + str += "}"; + columnCount += str.length() - startLen; + } + } + + str += "\n}\n"; + + if (hasAuxData) + return str; + + return {}; +} + Internal::ModelNodePositionStorage *RewriterView::positionStorage() const { return m_positionStorage.data(); @@ -820,4 +876,108 @@ void RewriterView::delayedSetup() m_textToModelMerger->delayedSetup(); } +static QString annotationsEnd() +{ + const static QString end = QString(" %1*/\n").arg(annotationsEscapeSequence); + return end; +} + +static QString annotationsStart() +{ + const static QString start = QString("\n/*%1 ").arg(annotationsEscapeSequence); + return start; +} + +QString RewriterView::getRawAuxiliaryData() const +{ + QTC_ASSERT(m_textModifier, return {}); + + const QString oldText = m_textModifier->text(); + + QString newText = oldText; + + int startIndex = newText.indexOf(annotationsStart()); + int endIndex = newText.indexOf(annotationsEnd()); + + if (startIndex > 0 && endIndex > 0) + return newText.mid(startIndex, endIndex - startIndex + annotationsEnd().length()); + + return {}; +} + +void RewriterView::writeAuxiliaryData() +{ + QTC_ASSERT(m_textModifier, return); + + const QString oldText = m_textModifier->text(); + + QString newText = oldText; + + int startIndex = newText.indexOf(annotationsStart()); + int endIndex = newText.indexOf(annotationsEnd()); + + if (startIndex > 0 && endIndex > 0) + newText.remove(startIndex, endIndex - startIndex + annotationsEnd().length()); + + QString auxData = auxiliaryDataAsQML(); + + if (!auxData.isEmpty()) { + auxData.prepend(annotationsStart()); + auxData.append(annotationsEnd()); + newText.append(auxData); + + QTextCursor tc(m_textModifier->textDocument()); + Utils::ChangeSet changeSet; + changeSet.replace(0, oldText.length(), newText); + changeSet.apply(&tc); + } +} + +void checkNode(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view); + +void static checkChildNodes(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view) +{ + for (auto child : node->children()) + checkNode(child, view); +} +void static checkNode(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view) +{ + if (!node) + return; + + if (!node->propertyNames().contains("i")) + return; + + const int internalId = node->property("i").toInt(); + const ModelNode modelNode = view->modelNodeForInternalId(internalId); + if (!modelNode.isValid()) + return; + + auto properties = node->properties(); + + for (auto i = properties.begin(); i != properties.end(); ++i) { + if (i.key() != "i") + modelNode.setAuxiliaryData(i.key().toUtf8(), i.value()); + } + + checkChildNodes(node, view); +} + +void RewriterView::restoreAuxiliaryData() +{ + QTC_ASSERT(m_textModifier, return); + + const QString text = m_textModifier->text(); + + int startIndex = text.indexOf(annotationsStart()); + int endIndex = text.indexOf(annotationsEnd()); + + if (startIndex > 0 && endIndex > 0) { + const QString auxSource = text.mid(startIndex + annotationsStart().length(), + endIndex - startIndex - annotationsStart().length()); + QmlJS::SimpleReader reader; + checkChildNodes(reader.readFromSource(auxSource), this); + } +} + } //QmlDesigner diff --git a/tests/auto/qml/qmldesigner/coretests/testrewriterview.h b/tests/auto/qml/qmldesigner/coretests/testrewriterview.h index 74b5fa384ac..46f7e1078f8 100644 --- a/tests/auto/qml/qmldesigner/coretests/testrewriterview.h +++ b/tests/auto/qml/qmldesigner/coretests/testrewriterview.h @@ -57,6 +57,8 @@ public: bool isModificationGroupActive() const; void setModificationGroupActive(bool active); void applyModificationGroupChanges(); + + using RewriterView::auxiliaryDataAsQML; }; } // QmlDesigner diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp index 25eca2c3ce8..33b275046bf 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp @@ -59,6 +59,7 @@ #include #include +#include #include #include @@ -8208,5 +8209,123 @@ void tst_TestCore::changeGradientId() } } +void checkNode(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view); + +void static checkChildNodes(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view) +{ + for (auto child : node->children()) + checkNode(child, view); +} + +void static checkNode(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view) +{ + QVERIFY(node); + QVERIFY(node->propertyNames().contains("i")); + const int internalId = node->property("i").toInt(); + const ModelNode modelNode = view->modelNodeForInternalId(internalId); + QVERIFY(modelNode.isValid()); + auto properties = node->properties(); + + for (auto i = properties.begin(); i != properties.end(); ++i) { + if (i.key() != "i") + QCOMPARE(i.value(), modelNode.auxiliaryData(i.key().toUtf8())); + } + + checkChildNodes(node, view); +} + +void tst_TestCore::writeAnnotations() +{ + const QLatin1String qmlCode("\n" + "import QtQuick 2.1\n" + "\n" + "Rectangle {\n" + " Item {\n" + " }\n" + "\n" + " MouseArea {\n" + " x: 3\n" + " y: 3\n" + " }\n" + "}"); + + const QLatin1String metaCode("\n/*##^## Designer {\n D{i:0;x:10}D{i:1;test:true;x:10;test2:\"string\"}" + "D{i:2;test:true;x:10;test2:\"string\"}\n}\n ##^##*/\n"); + + QPlainTextEdit textEdit; + textEdit.setPlainText(qmlCode); + NotIndentingTextEditModifier textModifier(&textEdit); + + QScopedPointer model(Model::create("QtQuick.Item", 2, 1)); + QVERIFY(model.data()); + + QScopedPointer testRewriterView(new TestRewriterView()); + testRewriterView->setTextModifier(&textModifier); + model->attachView(testRewriterView.data()); + + QVERIFY(model.data()); + ModelNode rootModelNode(testRewriterView->rootModelNode()); + QVERIFY(rootModelNode.isValid()); + + rootModelNode.setAuxiliaryData("x", 10); + for (const auto child : rootModelNode.allSubModelNodes()) { + child.setAuxiliaryData("x", 10); + child.setAuxiliaryData("test", true); + child.setAuxiliaryData("test2", "string"); + } + + const QString metaSource = testRewriterView->auxiliaryDataAsQML(); + + QmlJS::SimpleReader reader; + checkChildNodes(reader.readFromSource(metaSource), testRewriterView.data()); + + testRewriterView->writeAuxiliaryData(); + const QString textWithMeta = testRewriterView->textModifier()->text(); + testRewriterView->writeAuxiliaryData(); + QCOMPARE(textWithMeta.length(), testRewriterView->textModifier()->text().length()); +} + +void tst_TestCore::readAnnotations() +{ + const QLatin1String qmlCode("\n" + "import QtQuick 2.1\n" + "\n" + "Rectangle {\n" + " Item {\n" + " }\n" + "\n" + " MouseArea {\n" + " x: 3\n" + " y: 3\n" + " }\n" + "}"); + + const QLatin1String metaCode("\n/*##^## Designer {\n D{i:0;x:10}D{i:1;test:true;x:10;test2:\"string\"}" + "D{i:2;test:true;x:10;test2:\"string\"}\n}\n ##^##*/\n"); + + const QLatin1String metaCodeQmlCode("Designer {\n D{i:0;x:10}D{i:1;test2:\"string\";x:10;test:true}" + "D{i:2;test2:\"string\";x:10;test:true}\n}\n"); + + QPlainTextEdit textEdit; + textEdit.setPlainText(qmlCode + metaCode); + NotIndentingTextEditModifier textModifier(&textEdit); + + QScopedPointer model(Model::create("QtQuick.Item", 2, 1)); + QVERIFY(model.data()); + + QScopedPointer testRewriterView(new TestRewriterView()); + testRewriterView->setTextModifier(&textModifier); + model->attachView(testRewriterView.data()); + + QVERIFY(model.data()); + ModelNode rootModelNode(testRewriterView->rootModelNode()); + QVERIFY(rootModelNode.isValid()); + + testRewriterView->restoreAuxiliaryData(); + + const QString metaSource = testRewriterView->auxiliaryDataAsQML(); + QCOMPARE(metaSource.length(), QString(metaCodeQmlCode).length()); +} + QTEST_MAIN(tst_TestCore); diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.h b/tests/auto/qml/qmldesigner/coretests/tst_testcore.h index a3ce437947c..def024c63f3 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.h +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.h @@ -229,4 +229,8 @@ private slots: // Object bindings as properties: void loadGradient(); void changeGradientId(); + + // QMLAnnotations + void writeAnnotations(); + void readAnnotations(); }; From a11d49efeeed7d865d19e8ff1a1f432ca527ad43 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 6 Mar 2018 16:54:49 +0100 Subject: [PATCH 15/41] NewDialog: Add option for wizard list Change-Id: I2b1b09bd64507b9875f9770d20233b7ec936f075 Reviewed-by: Alessandro Portale --- src/plugins/coreplugin/dialogs/newdialog.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/plugins/coreplugin/dialogs/newdialog.cpp b/src/plugins/coreplugin/dialogs/newdialog.cpp index 0bc113a42fb..7ae0953ad17 100644 --- a/src/plugins/coreplugin/dialogs/newdialog.cpp +++ b/src/plugins/coreplugin/dialogs/newdialog.cpp @@ -53,6 +53,7 @@ const char LAST_PLATFORM_KEY[] = "Core/NewDialog/LastPlatform"; const char ALLOW_ALL_TEMPLATES[] = "Core/NewDialog/AllowAllTemplates"; const char SHOW_PLATOFORM_FILTER[] = "Core/NewDialog/ShowPlatformFilter"; const char BLACKLISTED_CATEGORIES_KEY[] = "Core/NewDialog/BlacklistedCategories"; +const char ALTERNATIVE_WIZARD_STYLE[] = "Core/NewDialog/AlternativeWizardStyle"; using namespace Core; using namespace Core::Internal; @@ -205,6 +206,21 @@ NewDialog::NewDialog(QWidget *parent) : m_ui->templatesView->setModel(m_filterProxyModel); m_ui->templatesView->setIconSize(QSize(ICON_SIZE, ICON_SIZE)); + const bool alternativeWizardStyle = ICore::settings()->value(ALTERNATIVE_WIZARD_STYLE, false).toBool(); + + if (alternativeWizardStyle) { + m_ui->templatesView->setGridSize(QSize(256, 128)); + m_ui->templatesView->setIconSize(QSize(96, 96)); + m_ui->templatesView->setSpacing(4); + + m_ui->templatesView->setViewMode(QListView::IconMode); + m_ui->templatesView->setMovement(QListView::Static); + m_ui->templatesView->setResizeMode(QListView::Adjust); + m_ui->templatesView->setSelectionRectVisible(false); + m_ui->templatesView->setWrapping(true); + m_ui->templatesView->setWordWrap(true); + } + connect(m_ui->templateCategoryView->selectionModel(), &QItemSelectionModel::currentChanged, this, &NewDialog::currentCategoryChanged); From c0f98299dfec442d71c57da49df84510247fa0be Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 8 Mar 2018 16:15:02 +0100 Subject: [PATCH 16/41] QmlDesigner: Fix build Fixes an error and a warning, and removes a local inconsistency regarding "void static" vs "static void". Change-Id: I1685823162290cb7d5f2df9cef6e32928fbf0a32 Reviewed-by: Tim Jenssen Reviewed-by: Thomas Hartmann --- .../qmldesigner/designercore/model/rewriterview.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index a5f036c49b3..64e69a2d119 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -472,7 +472,7 @@ QString RewriterView::auxiliaryDataAsQML() const for (auto i = data.begin(); i != data.end(); ++i) { const QVariant value = i.value(); QString strValue = value.toString(); - if (value.type() == QMetaType::QString) + if (static_cast(value.type()) == QMetaType::QString) strValue = "\"" + strValue + "\""; if (!strValue.isEmpty()) { @@ -933,14 +933,14 @@ void RewriterView::writeAuxiliaryData() } } -void checkNode(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view); +static void checkNode(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view); -void static checkChildNodes(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view) +static void checkChildNodes(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view) { for (auto child : node->children()) checkNode(child, view); } -void static checkNode(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view) +static void checkNode(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view) { if (!node) return; From 144bba95e9b29d5edd909049452da47565305e9f Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 7 Mar 2018 13:47:45 +0100 Subject: [PATCH 17/41] ITaskHandler: Harden against vanishing ITaskHandlers Harden against vanishing ITaskHandlers and avoid qobject_casts. Task-number: QTCREATORBUG-19994 Change-Id: I72bccb944cb6fa6ec92a8c0293617931a2eb2732 Reviewed-by: Christian Stenger Reviewed-by: hjk --- src/plugins/projectexplorer/taskwindow.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index 75ba8e63916..6b23ac4e5e7 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -210,11 +210,18 @@ void TaskView::resizeEvent(QResizeEvent *e) class TaskWindowPrivate { public: + ITaskHandler *handler(const QAction *action) + { + ITaskHandler *handler = m_actionToHandlerMap.value(action, nullptr); + return g_taskHandlers.contains(handler) ? handler : nullptr; + } + Internal::TaskModel *m_model; Internal::TaskFilterModel *m_filter; Internal::TaskView *m_listview; Internal::TaskWindowContext *m_taskWindowContext; QMenu *m_contextMenu; + QMap m_actionToHandlerMap; ITaskHandler *m_defaultHandler = nullptr; QToolButton *m_filterWarningsButton; QToolButton *m_categoriesButton; @@ -318,14 +325,6 @@ TaskWindow::~TaskWindow() delete d; } -static ITaskHandler *handler(QAction *action) -{ - QVariant prop = action->property("ITaskHandler"); - ITaskHandler *handler = qobject_cast(prop.value()); - QTC_CHECK(handler); - return handler; -} - void TaskWindow::delayedInitialization() { static bool alreadyDone = false; @@ -340,7 +339,7 @@ void TaskWindow::delayedInitialization() QAction *action = h->createAction(this); QTC_ASSERT(action, continue); - action->setProperty("ITaskHandler", qVariantFromValue(qobject_cast(h))); + d->m_actionToHandlerMap.insert(action, h); connect(action, &QAction::triggered, this, &TaskWindow::actionTriggered); d->m_actions << action; @@ -395,7 +394,7 @@ void TaskWindow::currentChanged(const QModelIndex &index) { const Task task = index.isValid() ? d->m_filter->task(index) : Task(); foreach (QAction *action, d->m_actions) { - ITaskHandler *h = handler(action); + ITaskHandler *h = d->handler(action); action->setEnabled((task.isNull() || !h) ? false : h->canHandle(task)); } } @@ -511,7 +510,7 @@ void TaskWindow::actionTriggered() auto action = qobject_cast(sender()); if (!action || !action->isEnabled()) return; - ITaskHandler *h = handler(action); + ITaskHandler *h = d->handler(action); if (!h) return; From 37ef24114cde593ba16e02f3d4c422a969a63317 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 7 Mar 2018 15:31:08 +0100 Subject: [PATCH 18/41] Debugger: Move DebugInfoTask handling to plugin This does not involve the engine (currently). Task-number: QTCREATORBUG-19994 Change-Id: I07a628580bf99c988eb0df165d649d5cc0869c0d Reviewed-by: Tobias Hunger --- src/plugins/debugger/debuggercore.h | 2 + src/plugins/debugger/debuggerplugin.cpp | 44 +++++++++++++++++ src/plugins/debugger/gdb/gdbengine.cpp | 64 +------------------------ src/plugins/debugger/gdb/gdbengine.h | 5 -- 4 files changed, 47 insertions(+), 68 deletions(-) diff --git a/src/plugins/debugger/debuggercore.h b/src/plugins/debugger/debuggercore.h index 3f5f1e6a84e..57f9476bf88 100644 --- a/src/plugins/debugger/debuggercore.h +++ b/src/plugins/debugger/debuggercore.h @@ -124,5 +124,7 @@ QAction *addCheckableAction(QMenu *menu, const QString &display, bool on, bool c // Qt's various build paths for unpatched versions QStringList qtBuildPaths(); +void addDebugInfoTask(unsigned id, const QString &cmd); + } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 8e46a9735e3..b58a226b095 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -92,6 +92,7 @@ #include #include #include +#include #include #include #include @@ -578,6 +579,42 @@ static Kit *findUniversalCdbKit() return KitManager::kit(cdbPredicate()); } +/////////////////////////////////////////////////////////////////////// +// +// Debuginfo Taskhandler +// +/////////////////////////////////////////////////////////////////////// + +class DebugInfoTaskHandler : public ITaskHandler +{ +public: + bool canHandle(const Task &task) const final + { + return m_debugInfoTasks.contains(task.taskId); + } + + void handle(const Task &task) final + { + QString cmd = m_debugInfoTasks.value(task.taskId); + QProcess::startDetached(cmd); + } + + void addTask(unsigned id, const QString &cmd) + { + m_debugInfoTasks[id] = cmd; + } + + QAction *createAction(QObject *parent) const final + { + QAction *action = new QAction(DebuggerPlugin::tr("Install &Debug Information"), parent); + action->setToolTip(DebuggerPlugin::tr("Tries to install missing debug information.")); + return action; + } + +private: + QHash m_debugInfoTasks; +}; + /////////////////////////////////////////////////////////////////////// // // DebuggerPluginPrivate @@ -1028,6 +1065,8 @@ public: CommonOptionsPage *m_commonOptionsPage = 0; DummyEngine *m_dummyEngine = 0; const QSharedPointer m_globalDebuggerOptions; + + DebugInfoTaskHandler m_debugInfoTaskHandler; }; DebuggerPluginPrivate::DebuggerPluginPrivate(DebuggerPlugin *plugin) @@ -2955,6 +2994,11 @@ QMessageBox *showMessageBox(int icon, const QString &title, return mb; } +void addDebugInfoTask(unsigned id, const QString &cmd) +{ + dd->m_debugInfoTaskHandler.addTask(id, cmd); +} + bool isReverseDebuggingEnabled() { static bool enabled = qEnvironmentVariableIsSet("QTC_DEBUGGER_ENABLE_REVERSE"); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 9a1381844da..410c30944ce 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -55,7 +55,6 @@ #include #include -#include #include #include @@ -131,52 +130,6 @@ static bool isMostlyHarmlessMessage(const QStringRef &msg) "Invalid argument\\n"; } -/////////////////////////////////////////////////////////////////////// -// -// Debuginfo Taskhandler -// -/////////////////////////////////////////////////////////////////////// - -class DebugInfoTask -{ -public: - QString command; -}; - -class DebugInfoTaskHandler : public ITaskHandler -{ -public: - explicit DebugInfoTaskHandler(GdbEngine *engine) - : m_engine(engine) - {} - - bool canHandle(const Task &task) const override - { - return m_debugInfoTasks.contains(task.taskId); - } - - void handle(const Task &task) override - { - m_engine->requestDebugInformation(m_debugInfoTasks.value(task.taskId)); - } - - void addTask(unsigned id, const DebugInfoTask &task) - { - m_debugInfoTasks[id] = task; - } - - QAction *createAction(QObject *parent) const override - { - QAction *action = new QAction(DebuggerPlugin::tr("Install &Debug Information"), parent); - action->setToolTip(DebuggerPlugin::tr("Tries to install missing debug information.")); - return action; - } - -private: - GdbEngine *m_engine; - QHash m_debugInfoTasks; -}; - /////////////////////////////////////////////////////////////////////// // // GdbEngine @@ -190,9 +143,6 @@ GdbEngine::GdbEngine() m_gdbOutputCodec = QTextCodec::codecForLocale(); m_inferiorOutputCodec = QTextCodec::codecForLocale(); - m_debugInfoTaskHandler = new DebugInfoTaskHandler(this); - //ExtensionSystem::PluginManager::addObject(m_debugInfoTaskHandler); - m_commandTimer.setSingleShot(true); connect(&m_commandTimer, &QTimer::timeout, this, &GdbEngine::commandTimeout); @@ -222,10 +172,6 @@ GdbEngine::GdbEngine() GdbEngine::~GdbEngine() { - //ExtensionSystem::PluginManager::removeObject(m_debugInfoTaskHandler); - delete m_debugInfoTaskHandler; - m_debugInfoTaskHandler = 0; - // Prevent sending error messages afterwards. disconnect(); } @@ -434,10 +380,7 @@ void GdbEngine::handleResponse(const QString &buff) FileName(), 0, Debugger::Constants::TASK_CATEGORY_DEBUGGER_DEBUGINFO); TaskHub::addTask(task); - - DebugInfoTask dit; - dit.command = cmd; - m_debugInfoTaskHandler->addTask(task.taskId, dit); + Internal::addDebugInfoTask(task.taskId, cmd); } } @@ -4177,11 +4120,6 @@ void GdbEngine::scheduleTestResponse(int testCase, const QString &response) m_scheduledTestResponses[token] = response; } -void GdbEngine::requestDebugInformation(const DebugInfoTask &task) -{ - QProcess::startDetached(task.command); -} - QString GdbEngine::msgGdbStopFailed(const QString &why) { return tr("The gdb process could not be stopped:\n%1").arg(why); diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 17689351691..7ccccd16325 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -381,11 +381,6 @@ private: ////////// General Interface ////////// QHash m_scheduledTestResponses; QSet m_testCases; - // Debug information - friend class DebugInfoTaskHandler; - void requestDebugInformation(const DebugInfoTask &task); - DebugInfoTaskHandler *m_debugInfoTaskHandler; - bool m_systemDumpersLoaded = false; static QString msgGdbStopFailed(const QString &why); From 32188f448ab9cfc0e7ed3da4f95c3f9ce2953795 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 9 Mar 2018 06:55:34 +0100 Subject: [PATCH 19/41] QmlDesigner: Fix compile before Qt5.10 QString::back() was introduced in Qt5.10. Beside this fix the signature change of void checkNode(). Change-Id: I4945e618274e1a67fc36d33e875c14284a4b160c Reviewed-by: Orgad Shaneh --- src/plugins/qmldesigner/designercore/model/rewriterview.cpp | 2 +- tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 64e69a2d119..6bd5522d637 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -482,7 +482,7 @@ QString RewriterView::auxiliaryDataAsQML() const } } - if (str.back() == ';') + if (str.endsWith(';')) str.chop(1); str += "}"; diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp index 33b275046bf..83cdaf3675a 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp @@ -8209,7 +8209,7 @@ void tst_TestCore::changeGradientId() } } -void checkNode(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view); +static void checkNode(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view); void static checkChildNodes(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view) { @@ -8217,7 +8217,7 @@ void static checkChildNodes(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView checkNode(child, view); } -void static checkNode(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view) +static void checkNode(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view) { QVERIFY(node); QVERIFY(node->propertyNames().contains("i")); From 711ac6602f67a711eeeb307174408cdc5cf0ab3a Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 8 Mar 2018 19:25:04 +0100 Subject: [PATCH 20/41] Fix C++ type hierarchy Dynamic casts between library boundaries tend to fail. Add an "explicit cast" to CppClass via virtual functions as a quickfix. This is a recurring issue, e.g. d2769f30037aa, 3f11ef92167ba and 2ffd0e2d0da5d to name just a few... This was introduced in 5e861d2be6729 Task-number: QTCREATORBUG-20001 Change-Id: Ie5a89a028d587e4e9d1ecec920a7c7d17497dbde Reviewed-by: Ivan Donchevskii --- src/plugins/cppeditor/cpptypehierarchy.cpp | 2 +- src/plugins/cpptools/cppelementevaluator.cpp | 10 ++++++++++ src/plugins/cpptools/cppelementevaluator.h | 10 ++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/plugins/cppeditor/cpptypehierarchy.cpp b/src/plugins/cppeditor/cpptypehierarchy.cpp index 0b3198d4c9f..ad581602f07 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.cpp +++ b/src/plugins/cppeditor/cpptypehierarchy.cpp @@ -154,7 +154,7 @@ void CppTypeHierarchyWidget::perform() if (evaluator.identifiedCppElement()) { const QSharedPointer &cppElement = evaluator.cppElement(); CppElement *element = cppElement.data(); - if (CppClass *cppClass = dynamic_cast(element)) { + if (CppClass *cppClass = element->toCppClass()) { m_inspectedClass->setText(cppClass->name); m_inspectedClass->setLink(cppClass->link); QStandardItem *bases = new QStandardItem(tr("Bases")); diff --git a/src/plugins/cpptools/cppelementevaluator.cpp b/src/plugins/cpptools/cppelementevaluator.cpp index df9ebefa3da..513926802b7 100644 --- a/src/plugins/cpptools/cppelementevaluator.cpp +++ b/src/plugins/cpptools/cppelementevaluator.cpp @@ -63,6 +63,11 @@ CppElement::CppElement() : helpCategory(TextEditor::HelpItem::Unknown) CppElement::~CppElement() {} +CppClass *CppElement::toCppClass() +{ + return nullptr; +} + class Unknown : public CppElement { public: @@ -156,6 +161,11 @@ bool CppClass::operator==(const CppClass &other) return this->declaration == other.declaration; } +CppClass *CppClass::toCppClass() +{ + return this; +} + void CppClass::lookupBases(Symbol *declaration, const LookupContext &context) { typedef QPair Data; diff --git a/src/plugins/cpptools/cppelementevaluator.h b/src/plugins/cpptools/cppelementevaluator.h index 0755bd3004e..0bececefaf4 100644 --- a/src/plugins/cpptools/cppelementevaluator.h +++ b/src/plugins/cpptools/cppelementevaluator.h @@ -81,6 +81,8 @@ private: QString m_diagnosis; }; +class CppClass; + class CPPTOOLS_EXPORT CppElement { protected: @@ -89,6 +91,8 @@ protected: public: virtual ~CppElement(); + virtual CppClass *toCppClass(); + TextEditor::HelpItem::Category helpCategory; QStringList helpIdCandidates; QString helpMark; @@ -96,7 +100,7 @@ public: QString tooltip; }; -class CppDeclarableElement : public CppElement +class CPPTOOLS_EXPORT CppDeclarableElement : public CppElement { public: explicit CppDeclarableElement(CPlusPlus::Symbol *declaration); @@ -109,7 +113,7 @@ public: QIcon icon; }; -class CppClass : public CppDeclarableElement +class CPPTOOLS_EXPORT CppClass : public CppDeclarableElement { public: CppClass(); @@ -117,6 +121,8 @@ public: bool operator==(const CppClass &other); + CppClass *toCppClass() final; + void lookupBases(CPlusPlus::Symbol *declaration, const CPlusPlus::LookupContext &context); void lookupDerived(CPlusPlus::Symbol *declaration, const CPlusPlus::Snapshot &snapshot); From 1997692f86ea61086a35760912420c45973d8409 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 7 Mar 2018 14:48:57 +0100 Subject: [PATCH 21/41] Class view: Fix keyboard focus when using shortcut Pass focus to the treeview, and make sure something is selected, so focus is also visibly moving there. Task-number: QTCREATORBUG-15920 Change-Id: Icf7c213765739e992edcb52cc88f8730875e0bed Reviewed-by: Ivan Donchevskii --- src/plugins/classview/classviewnavigationwidget.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/classview/classviewnavigationwidget.cpp b/src/plugins/classview/classviewnavigationwidget.cpp index 5ce0d24e73a..58cab5a6d87 100644 --- a/src/plugins/classview/classviewnavigationwidget.cpp +++ b/src/plugins/classview/classviewnavigationwidget.cpp @@ -105,7 +105,7 @@ NavigationWidget::NavigationWidget(QWidget *parent) : verticalLayout->addWidget(Core::ItemViewFind::createSearchableWrapper( treeView, Core::ItemViewFind::DarkColored, Core::ItemViewFind::FetchMoreWhileSearching)); - + setFocusProxy(treeView); // tree model treeModel = new TreeItemModel(this); treeView->setModel(treeModel); @@ -282,10 +282,12 @@ void NavigationWidget::onDataUpdate(QSharedPointer result) // expand top level projects QModelIndex sessionIndex; - - for (int i = 0; i < treeModel->rowCount(sessionIndex); ++i) + const int toplevelCount = treeModel->rowCount(sessionIndex); + for (int i = 0; i < toplevelCount; ++i) treeView->expand(treeModel->index(i, 0, sessionIndex)); + if (!treeView->currentIndex().isValid() && toplevelCount > 0) + treeView->setCurrentIndex(treeModel->index(0, 0, sessionIndex)); if (debug) qDebug() << "Class View:" << QDateTime::currentDateTime().toString() << "TreeView is updated in" << timer.elapsed() << "msecs"; From 6cf1465ff88bb7802abeeb866ff0b7b9b011cf64 Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Fri, 23 Feb 2018 12:31:37 +0100 Subject: [PATCH 22/41] Clang: Fix paths and updated diff for latest clang patches I forgot that they must be relative to LLVM folder. Also one patch had a typo and therefore is updated here. Change-Id: I35241db84c0aa394211dfc7b4d779f8dfac5326a Reviewed-by: Eike Ziller --- ...static-functions-in-SemaCodeComplete.patch | 16 +++++----- ...oaded-static-functions-for-templates.patch | 29 +++++++++---------- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/dist/clang/patches/200_D36390_Fix-overloaded-static-functions-in-SemaCodeComplete.patch b/dist/clang/patches/200_D36390_Fix-overloaded-static-functions-in-SemaCodeComplete.patch index 3e5bfe553f3..316f3afd178 100644 --- a/dist/clang/patches/200_D36390_Fix-overloaded-static-functions-in-SemaCodeComplete.patch +++ b/dist/clang/patches/200_D36390_Fix-overloaded-static-functions-in-SemaCodeComplete.patch @@ -1,5 +1,5 @@ ---- a/include/clang/Sema/Sema.h -+++ b/include/clang/Sema/Sema.h +--- a/tools/clang/include/clang/Sema/Sema.h ++++ b/tools/clang/include/clang/Sema/Sema.h @@ -2707,7 +2707,8 @@ OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr, @@ -10,8 +10,8 @@ void AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType, Expr::Classification ObjectClassification, ---- a/lib/Sema/SemaCodeComplete.cpp -+++ b/lib/Sema/SemaCodeComplete.cpp +--- a/tools/clang/lib/Sema/SemaCodeComplete.cpp ++++ b/tools/clang/lib/Sema/SemaCodeComplete.cpp @@ -4396,9 +4396,11 @@ ArgExprs.append(Args.begin(), Args.end()); UnresolvedSet<8> Decls; @@ -25,8 +25,8 @@ } else { FunctionDecl *FD = nullptr; if (auto MCE = dyn_cast(NakedFn)) ---- a/lib/Sema/SemaOverload.cpp -+++ b/lib/Sema/SemaOverload.cpp +--- a/tools/clang/lib/Sema/SemaOverload.cpp ++++ b/tools/clang/lib/Sema/SemaOverload.cpp @@ -6343,24 +6343,36 @@ OverloadCandidateSet& CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs, @@ -72,8 +72,8 @@ SuppressUserConversions, PartialOverloading); } } else { ---- a/test/Index/complete-call.cpp -+++ b/test/Index/complete-call.cpp +--- a/tools/clang/test/Index/complete-call.cpp ++++ b/tools/clang/test/Index/complete-call.cpp @@ -94,6 +94,24 @@ s.foo_7(42,); } diff --git a/dist/clang/patches/210_D43453_Fix-overloaded-static-functions-for-templates.patch b/dist/clang/patches/210_D43453_Fix-overloaded-static-functions-for-templates.patch index 2296904f7dd..0223c96e784 100644 --- a/dist/clang/patches/210_D43453_Fix-overloaded-static-functions-for-templates.patch +++ b/dist/clang/patches/210_D43453_Fix-overloaded-static-functions-for-templates.patch @@ -1,8 +1,8 @@ -diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp +diff --git a/tools/clang/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 1b07ec60ce..46ed08d1cf 100644 ---- a/lib/Sema/SemaOverload.cpp -+++ b/lib/Sema/SemaOverload.cpp -@@ -6371,57 +6371,54 @@ void Sema::AddFunctionCandidates(const UnresolvedSetImpl &Fns, +--- a/tools/clang/lib/Sema/SemaOverload.cpp ++++ b/tools/clang/lib/Sema/SemaOverload.cpp +@@ -6321,57 +6321,56 @@ void Sema::AddFunctionCandidates(const UnresolvedSetImpl &Fns, bool FirstArgumentIsBase) { for (UnresolvedSetIterator F = Fns.begin(), E = Fns.end(); F != E; ++F) { NamedDecl *D = F.getDecl()->getUnderlyingDecl(); @@ -56,8 +56,7 @@ index 1b07ec60ce..46ed08d1cf 100644 + Expr::Classification ObjectClassification; + if (Args.size() > 0) { if (Expr *E = Args[0]) { -- // Use the explit base to restrict the lookup: -+ // Use the explicit base to restrict the lookup: + // Use the explit base to restrict the lookup: ObjectType = E->getType(); ObjectClassification = E->Classify(Context); } // .. else there is an implit base. @@ -65,19 +64,17 @@ index 1b07ec60ce..46ed08d1cf 100644 + } + if (IsTemplate) AddMethodTemplateCandidate( -- FunTmpl, F.getPair(), -- cast(FunTmpl->getDeclContext()), -- ExplicitTemplateArgs, ObjectType, ObjectClassification, + FunTmpl, F.getPair(), + cast(FunTmpl->getDeclContext()), + ExplicitTemplateArgs, ObjectType, ObjectClassification, - Args.slice(1), CandidateSet, SuppressUserConversions, -- PartialOverloading); ++ FunctionArgs, CandidateSet, SuppressUserConversions, + PartialOverloading); - } else { - AddTemplateOverloadCandidate(FunTmpl, F.getPair(), - ExplicitTemplateArgs, Args, - CandidateSet, SuppressUserConversions, - PartialOverloading); -+ FunTmpl, F.getPair(), cast(FD), ExplicitTemplateArgs, -+ ObjectType, ObjectClassification, FunctionArgs, CandidateSet, -+ SuppressUserConversions, PartialOverloading); + else + AddMethodCandidate(cast(FD), F.getPair(), + cast(FD)->getParent(), ObjectType, @@ -102,10 +99,10 @@ index 1b07ec60ce..46ed08d1cf 100644 } } } -diff --git a/test/Index/complete-call.cpp b/test/Index/complete-call.cpp +diff --git a/tools/clang/test/Index/complete-call.cpp b/test/Index/complete-call.cpp index ca116485ac..35f2009066 100644 ---- a/test/Index/complete-call.cpp -+++ b/test/Index/complete-call.cpp +--- a/tools/clang/test/Index/complete-call.cpp ++++ b/tools/clang/test/Index/complete-call.cpp @@ -112,6 +112,33 @@ struct Bar2 : public Bar { } }; From 7f226bc48f99a782880c127b6071a51b729599a6 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 9 Mar 2018 10:10:27 +0100 Subject: [PATCH 23/41] Update qbs submodule To HEAD of 1.11 branch. Change-Id: Ibc9b4ca2d9ae889b3991d97b8ffcede8460e28ee Reviewed-by: Joerg Bornemann --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 053b31802b3..abfc4c1b37d 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 053b31802b3520b083a8fc587cd367251fa0b2d8 +Subproject commit abfc4c1b37d18515c8da0678a665886d7cb69af5 From 8ae505f30ea7d41f404112f563012acd2361de03 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 8 Mar 2018 17:46:20 +0100 Subject: [PATCH 24/41] QmlProject: Unify selection of supported kits Change-Id: Ic33e9688d823bd09664e5dc74fe5253cb5fcbc58 Reviewed-by: hjk Reviewed-by: Tobias Hunger --- .../cmakeprojectmanager/cmakeproject.cpp | 2 +- .../cmakeprojectmanager/cmakeproject.h | 2 +- src/plugins/nim/project/nimproject.cpp | 2 +- src/plugins/nim/project/nimproject.h | 2 +- src/plugins/projectexplorer/project.cpp | 2 +- src/plugins/projectexplorer/project.h | 2 +- .../qmakeprojectmanager/qmakeproject.cpp | 2 +- .../qmakeprojectmanager/qmakeproject.h | 2 +- src/plugins/qmlprojectmanager/qmlproject.cpp | 72 +++++++++---------- src/plugins/qmlprojectmanager/qmlproject.h | 2 +- 10 files changed, 44 insertions(+), 46 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 64cf50b6e4d..cd29127f6a7 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -376,7 +376,7 @@ bool CMakeProject::knowsAllBuildExecutables() const return false; } -bool CMakeProject::supportsKit(Kit *k, QString *errorMessage) const +bool CMakeProject::supportsKit(const Kit *k, QString *errorMessage) const { if (!CMakeKitInformation::cmakeTool(k)) { if (errorMessage) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index a747504740b..73b4c90f01a 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -72,7 +72,7 @@ public: bool requiresTargetPanel() const final; bool knowsAllBuildExecutables() const final; - bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage = 0) const final; + bool supportsKit(const ProjectExplorer::Kit *k, QString *errorMessage = 0) const final; void runCMake(); void runCMakeAndScanProjectTree(); diff --git a/src/plugins/nim/project/nimproject.cpp b/src/plugins/nim/project/nimproject.cpp index 47bd87ee12b..82a412e41bd 100644 --- a/src/plugins/nim/project/nimproject.cpp +++ b/src/plugins/nim/project/nimproject.cpp @@ -159,7 +159,7 @@ void NimProject::updateProject() emitParsingFinished(true); } -bool NimProject::supportsKit(Kit *k, QString *errorMessage) const +bool NimProject::supportsKit(const Kit *k, QString *errorMessage) const { auto tc = dynamic_cast(ToolChainKitInformation::toolChain(k, Constants::C_NIMLANGUAGE_ID)); if (!tc) { diff --git a/src/plugins/nim/project/nimproject.h b/src/plugins/nim/project/nimproject.h index 50e03a3fa31..75a9fe1cffc 100644 --- a/src/plugins/nim/project/nimproject.h +++ b/src/plugins/nim/project/nimproject.h @@ -42,7 +42,7 @@ public: explicit NimProject(const Utils::FileName &fileName); bool needsConfiguration() const override; - bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const override; + bool supportsKit(const ProjectExplorer::Kit *k, QString *errorMessage) const override; Utils::FileNameList nimFiles() const; QVariantMap toMap() const override; diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index f2704e6119e..af299aa5d74 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -329,7 +329,7 @@ Target *Project::target(Kit *k) const return Utils::findOrDefault(d->m_targets, Utils::equal(&Target::kit, k)); } -bool Project::supportsKit(Kit *k, QString *errorMessage) const +bool Project::supportsKit(const Kit *k, QString *errorMessage) const { Q_UNUSED(k); Q_UNUSED(errorMessage); diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 28b50551895..96056a991f3 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -123,7 +123,7 @@ public: Target *activeTarget() const; Target *target(Core::Id id) const; Target *target(Kit *k) const; - virtual bool supportsKit(Kit *k, QString *errorMessage = nullptr) const; + virtual bool supportsKit(const Kit *k, QString *errorMessage = nullptr) const; Target *createTarget(Kit *k); static bool copySteps(Target *sourceTarget, Target *newTarget); diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 68fe0d4355c..7d10a31cd8d 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -588,7 +588,7 @@ void QmakeProject::buildFinished(bool success) m_qmakeVfs->invalidateContents(); } -bool QmakeProject::supportsKit(Kit *k, QString *errorMessage) const +bool QmakeProject::supportsKit(const Kit *k, QString *errorMessage) const { QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); if (!version && errorMessage) diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h index 3e745193e83..580b750aade 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.h +++ b/src/plugins/qmakeprojectmanager/qmakeproject.h @@ -61,7 +61,7 @@ public: QmakeProFile *rootProFile() const; - bool supportsKit(ProjectExplorer::Kit *k, QString *errorMesage) const final; + bool supportsKit(const ProjectExplorer::Kit *k, QString *errorMesage) const final; QmakeProFileNode *rootProjectNode() const final; diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 26e5060b0fb..fb1b20bbfa6 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -277,20 +277,51 @@ void QmlProject::refreshTargetDirectory() updateDeploymentData(target); } -bool QmlProject::supportsKit(Kit *k, QString *errorMessage) const +bool QmlProject::supportsKit(const Kit *k, QString *errorMessage) const { + if (!k->isValid()) { + if (errorMessage) + *errorMessage = tr("Kit is not valid."); + return false; + } + + IDevice::ConstPtr dev = DeviceKitInformation::device(k); + if (dev.isNull()) { + if (errorMessage) + *errorMessage = tr("Kit has no device."); + return false; + } + QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); if (!version) { if (errorMessage) *errorMessage = tr("No Qt version set in kit."); return false; } - if (version->qtVersion() < QtSupport::QtVersionNumber(5, 0, 0)) { if (errorMessage) *errorMessage = tr("Qt version is too old."); return false; } + + if (dev->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { + if (version->type() != QtSupport::Constants::DESKTOPQT) { + if (static_cast(version)->qmlsceneCommand().isEmpty()) { + if (errorMessage) + *errorMessage = tr("Qt version has no qmlscene command."); + return false; + } + } else { + // Non-desktop Qt on a desktop device? We don't support that. + if (errorMessage) + *errorMessage = tr("Non-desktop Qt is used with a Desktop device."); + return false; + } + } + + // If not a desktop device, don't check the Qt version for qmlscene. + // The device is responsible for providing it and we assume qmlscene can be found + // in $PATH if it's not explicitly given. return true; } @@ -305,43 +336,10 @@ Project::RestoreResult QmlProject::fromMap(const QVariantMap &map, QString *erro if (!activeTarget()) { // find a kit that matches prerequisites (prefer default one) - QList kits = KitManager::kits( - std::function([](const Kit *k) -> bool { - if (!k->isValid()) - return false; - - IDevice::ConstPtr dev = DeviceKitInformation::device(k); - if (dev.isNull()) - return false; - - QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); - if (!version || version->qtVersion() < QtSupport::QtVersionNumber(5, 0, 0)) - return false; - - if (dev->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { - if (version->type() != QLatin1String(QtSupport::Constants::DESKTOPQT)) { - return !static_cast(version) - ->qmlsceneCommand().isEmpty(); - } else { - // Non-desktop Qt on a desktop device? We don't support that. - return false; - } - } - - // If not a desktop device, don't check the Qt version for qmlscene. - // The device is responsible for providing it and we assume qmlscene can be found - // in $PATH if it's not explicitly given. - return true; - - }) - ); + const QList kits = KitManager::kits([this](const Kit *k) { return supportsKit(k, nullptr); }); if (!kits.isEmpty()) { - Kit *kit = 0; - if (kits.contains(KitManager::defaultKit())) - kit = KitManager::defaultKit(); - else - kit = kits.first(); + Kit *kit = kits.contains(KitManager::defaultKit()) ? KitManager::defaultKit() : kits.first(); addTarget(createTarget(kit)); } } diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index 1728aad36fa..0a23f43a792 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -48,7 +48,7 @@ public: explicit QmlProject(const Utils::FileName &filename); ~QmlProject() override; - bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const override; + bool supportsKit(const ProjectExplorer::Kit *k, QString *errorMessage) const override; bool validProjectFile() const; From 97ede133a935d0196ae378f9a13f46a0affcfcdf Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 8 Mar 2018 17:46:51 +0100 Subject: [PATCH 25/41] QmlProject: Fix selection of supported kits This now fixes the auto-selection of kits for me. Task-number: QTCREATORBUG-19717 Change-Id: I39581ab2471211e9553c345164bb3ce788242dad Reviewed-by: hjk Reviewed-by: Tobias Hunger --- src/plugins/qmlprojectmanager/qmlproject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index fb1b20bbfa6..11334a79e17 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -305,7 +305,7 @@ bool QmlProject::supportsKit(const Kit *k, QString *errorMessage) const } if (dev->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { - if (version->type() != QtSupport::Constants::DESKTOPQT) { + if (version->type() == QtSupport::Constants::DESKTOPQT) { if (static_cast(version)->qmlsceneCommand().isEmpty()) { if (errorMessage) *errorMessage = tr("Qt version has no qmlscene command."); From 783b310ee66e2e91b8b59ccf9594cfc215eb8987 Mon Sep 17 00:00:00 2001 From: Alexander Akulich Date: Wed, 7 Mar 2018 13:09:28 +0300 Subject: [PATCH 26/41] ProjectTree: Refactor editCurrentItem() Change-Id: Id848b608e256b95e9704d61d1926d05625106ecc Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/projecttreewidget.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp index 1db41b1e8e1..9ce74310517 100644 --- a/src/plugins/projectexplorer/projecttreewidget.cpp +++ b/src/plugins/projectexplorer/projecttreewidget.cpp @@ -411,8 +411,11 @@ void ProjectTreeWidget::collapseAll() void ProjectTreeWidget::editCurrentItem() { m_delayedRename.clear(); - if (m_view->selectionModel()->currentIndex().isValid()) - m_view->edit(m_view->selectionModel()->currentIndex()); + const QModelIndex currentIndex = m_view->selectionModel()->currentIndex(); + if (!currentIndex.isValid()) + return; + + m_view->edit(currentIndex); } void ProjectTreeWidget::renamed(const FileName &oldPath, const FileName &newPath) From 48a68851fcec74f8ac5eefb9ab8155e78fd7c70e Mon Sep 17 00:00:00 2001 From: Alexander Akulich Date: Thu, 8 Mar 2018 02:04:34 +0300 Subject: [PATCH 27/41] ProjectTree: Select only (complete) file basename on rename Change-Id: I29effc5f61fbaa214d7a1a01d92de5d5a726cec4 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/projecttreewidget.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp index 9ce74310517..961b9fa8949 100644 --- a/src/plugins/projectexplorer/projecttreewidget.cpp +++ b/src/plugins/projectexplorer/projecttreewidget.cpp @@ -54,6 +54,7 @@ #include #include #include +#include #include #include @@ -416,6 +417,18 @@ void ProjectTreeWidget::editCurrentItem() return; m_view->edit(currentIndex); + // Select complete file basename for renaming + const Node *node = m_model->nodeForIndex(currentIndex); + if (!node || node->nodeType() != NodeType::File) + return; + QLineEdit *editor = qobject_cast(m_view->indexWidget(currentIndex)); + if (!editor) + return; + + const QString text = editor->text(); + const int dotIndex = text.lastIndexOf(QLatin1Char('.')); + if (dotIndex > 0) + editor->setSelection(0, dotIndex); } void ProjectTreeWidget::renamed(const FileName &oldPath, const FileName &newPath) From 98889e1a3801d66d9bfdb7474316bfb76ef79c43 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 8 Mar 2018 17:07:53 +0100 Subject: [PATCH 28/41] QmlDesigner: Define new possible enum scopes Change-Id: Ifb96706615be8cd5d7f588a83bdfe1cf31886bb5 Reviewed-by: Alessandro Portale --- .../qmldesigner/designercore/model/texttomodelmerger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 3f4e60fb32e..013854c698c 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -94,7 +94,7 @@ static inline QStringList globalQtEnums() static inline QStringList knownEnumScopes() { static const QStringList list = { - "TextInput", "TextEdit", "Material", "Universal", "Font" + "TextInput", "TextEdit", "Material", "Universal", "Font", "Shape", "ShapePath" }; return list; } From 8a8b8c46025752175edf7d894613eeb33188b005 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 2 Mar 2018 15:29:26 +0100 Subject: [PATCH 29/41] QmlDesigner: Add meta hint if item renders children directly In some cases items render their children directly using an effect. In this case we do not want to hide the children when calling refFromEffectItem(). If the hint takesOverRenderingOfChildren is set in the .metainfo hints for a parent item we forward a flag to the puppet and refFromEffectItem() is not hiding this item, Change-Id: I37a8c0ad8a15bc914c220e03b1b744779431d655 Reviewed-by: Alessandro Portale --- .../qmlpuppet/container/instancecontainer.cpp | 33 +++++++++++-- .../qmlpuppet/container/instancecontainer.h | 20 +++++++- .../instances/objectnodeinstance.cpp | 3 +- .../qml2puppet/instances/objectnodeinstance.h | 4 +- .../instances/quickitemnodeinstance.cpp | 8 ++-- .../instances/quickitemnodeinstance.h | 3 +- .../instances/servernodeinstance.cpp | 6 ++- .../designercore/include/nodehints.h | 1 + .../instances/nodeinstanceview.cpp | 46 ++++++++++++++++--- .../designercore/metainfo/nodehints.cpp | 12 ++++- 10 files changed, 116 insertions(+), 20 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp index bb9ec181610..6e480ceef98 100644 --- a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp +++ b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp @@ -44,9 +44,24 @@ InstanceContainer::InstanceContainer() { } -InstanceContainer::InstanceContainer(qint32 instanceId, const TypeName &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &nodeSource, NodeSourceType nodeSourceType, NodeMetaType metaType) - : m_instanceId(instanceId), m_type(properDelemitingOfType(type)), m_majorNumber(majorNumber), m_minorNumber(minorNumber), m_componentPath(componentPath), - m_nodeSource(nodeSource), m_nodeSourceType(nodeSourceType), m_metaType(metaType) +InstanceContainer::InstanceContainer(qint32 instanceId, + const TypeName &type, + int majorNumber, + int minorNumber, + const QString &componentPath, + const QString &nodeSource, + NodeSourceType nodeSourceType, + NodeMetaType metaType, + NodeFlags metaFlags) + : m_instanceId(instanceId) + ,m_type(properDelemitingOfType(type)) + ,m_majorNumber(majorNumber) + ,m_minorNumber(minorNumber) + ,m_componentPath(componentPath) + ,m_nodeSource(nodeSource) + ,m_nodeSourceType(nodeSourceType) + ,m_metaType(metaType) + ,m_metaFlags(metaFlags) { } @@ -90,6 +105,16 @@ InstanceContainer::NodeMetaType InstanceContainer::metaType() const return static_cast(m_metaType); } +InstanceContainer::NodeFlags InstanceContainer::metaFlags() const +{ + return m_metaFlags; +} + +bool InstanceContainer::checkFlag(NodeFlag flag) const +{ + return NodeFlags(m_metaFlags).testFlag(flag); +} + QDataStream &operator<<(QDataStream &out, const InstanceContainer &container) { out << container.instanceId(); @@ -100,6 +125,7 @@ QDataStream &operator<<(QDataStream &out, const InstanceContainer &container) out << container.nodeSource(); out << qint32(container.nodeSourceType()); out << qint32(container.metaType()); + out << qint32(container.metaFlags()); return out; } @@ -115,6 +141,7 @@ QDataStream &operator>>(QDataStream &in, InstanceContainer &container) in >> container.m_nodeSource; in >> container.m_nodeSourceType; in >> container.m_metaType; + in >> container.m_metaFlags; return in; } diff --git a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.h b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.h index 6dc86bf93c9..9d4c21b1274 100644 --- a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.h +++ b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.h @@ -54,8 +54,22 @@ public: ItemMetaType }; + enum NodeFlag { + ParentTakesOverRendering = 1 + }; + + Q_DECLARE_FLAGS(NodeFlags, NodeFlag) + InstanceContainer(); - InstanceContainer(qint32 instanceId, const TypeName &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &nodeSource, NodeSourceType nodeSourceType, NodeMetaType metaType); + InstanceContainer(qint32 instanceId, + const TypeName &type, + int majorNumber, + int minorNumber, + const QString &componentPath, + const QString &nodeSource, + NodeSourceType nodeSourceType, + NodeMetaType metaType, + NodeFlags metaFlags); qint32 instanceId() const; TypeName type() const; @@ -65,6 +79,8 @@ public: QString nodeSource() const; NodeSourceType nodeSourceType() const; NodeMetaType metaType() const; + bool checkFlag(NodeFlag flag) const; + NodeFlags metaFlags() const; private: qint32 m_instanceId = -1; @@ -75,6 +91,7 @@ private: QString m_nodeSource; qint32 m_nodeSourceType = 0; qint32 m_metaType = 0; + qint32 m_metaFlags = 0; }; QDebug operator <<(QDebug debug, const InstanceContainer &command); @@ -82,3 +99,4 @@ QDebug operator <<(QDebug debug, const InstanceContainer &command); } // namespace QmlDesigner Q_DECLARE_METATYPE(QmlDesigner::InstanceContainer) +Q_DECLARE_OPERATORS_FOR_FLAGS(QmlDesigner::InstanceContainer::NodeFlags) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp index 1dc4716649c..3ee177a3872 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp @@ -126,7 +126,8 @@ void ObjectNodeInstance::initializePropertyWatcher(const ObjectNodeInstance::Poi m_signalSpy.setObjectNodeInstance(objectNodeInstance); } -void ObjectNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance) +void ObjectNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance, + InstanceContainer::NodeFlags /*flags*/) { initializePropertyWatcher(objectNodeInstance); QmlPrivateGate::registerNodeInstanceMetaObject(objectNodeInstance->object(), objectNodeInstance->nodeInstanceServer()->engine()); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h index 8266f0addf8..5977d3d31ce 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h @@ -28,6 +28,8 @@ #include "nodeinstanceserver.h" #include "nodeinstancesignalspy.h" +#include "instancecontainer.h" + #include #include #include @@ -78,7 +80,7 @@ public: NodeInstanceServer *nodeInstanceServer() const; void setNodeInstanceServer(NodeInstanceServer *server); - virtual void initialize(const Pointer &objectNodeInstance); + virtual void initialize(const Pointer &objectNodeInstance, InstanceContainer::NodeFlags flags); virtual QImage renderImage() const; virtual QImage renderPreviewImage(const QSize &previewImageSize) const; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp index a30fbc184a9..647d1d74706 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp @@ -156,7 +156,8 @@ void QuickItemNodeInstance::createEffectItem(bool createEffectItem) s_createEffectItem = createEffectItem; } -void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance) +void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance, + InstanceContainer::NodeFlags flags) { if (instanceId() == 0) { @@ -167,10 +168,11 @@ void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &object if (quickItem()->window()) { if (s_createEffectItem || instanceId() == 0) - designerSupport()->refFromEffectItem(quickItem()); + designerSupport()->refFromEffectItem(quickItem(), + !flags.testFlag(InstanceContainer::ParentTakesOverRendering)); } - ObjectNodeInstance::initialize(objectNodeInstance); + ObjectNodeInstance::initialize(objectNodeInstance, flags); quickItem()->update(); } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h index d655a9a1032..1f000f1ba2b 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h @@ -46,7 +46,8 @@ public: static Pointer create(QObject *objectToBeWrapped); static void createEffectItem(bool createEffectItem); - void initialize(const ObjectNodeInstance::Pointer &objectNodeInstance) override; + void initialize(const ObjectNodeInstance::Pointer &objectNodeInstance, + InstanceContainer::NodeFlags flags) override; QQuickItem *contentItem() const override; bool hasContent() const override; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp index 58b17e2451e..2f090517dc8 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp @@ -188,7 +188,9 @@ Internal::ObjectNodeInstance::Pointer ServerNodeInstance::createInstance(QObject return instance; } -ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceServer, const InstanceContainer &instanceContainer, ComponentWrap componentWrap) +ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceServer, + const InstanceContainer &instanceContainer, + ComponentWrap componentWrap) { Q_ASSERT(instanceContainer.instanceId() != -1); Q_ASSERT(nodeInstanceServer); @@ -229,7 +231,7 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe instance.internalInstance()->setInstanceId(instanceContainer.instanceId()); - instance.internalInstance()->initialize(instance.m_nodeInstance); + instance.internalInstance()->initialize(instance.m_nodeInstance, instanceContainer.metaFlags()); return instance; } diff --git a/src/plugins/qmldesigner/designercore/include/nodehints.h b/src/plugins/qmldesigner/designercore/include/nodehints.h index 3fbb89c72cc..982c3a80b06 100644 --- a/src/plugins/qmldesigner/designercore/include/nodehints.h +++ b/src/plugins/qmldesigner/designercore/include/nodehints.h @@ -64,6 +64,7 @@ public: bool isStackedContainer() const; bool canBeReparentedTo(const ModelNode &potenialParent); QString indexPropertyForStackedContainer() const; + bool takesOverRenderingOfChildren() const; QHash hints() const; static NodeHints fromModelNode(const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 823f966d8c0..e1d07e65afc 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include "abstractproperty.h" @@ -125,7 +126,7 @@ NodeInstanceView::~NodeInstanceView() //\{ -bool isSkippedRootNode(const ModelNode &node) +bool static isSkippedRootNode(const ModelNode &node) { static const PropertyNameList skipList({"Qt.ListModel", "QtQuick.ListModel", "Qt.ListModel", "QtQuick.ListModel"}); @@ -136,7 +137,7 @@ bool isSkippedRootNode(const ModelNode &node) } -bool isSkippedNode(const ModelNode &node) +bool static isSkippedNode(const ModelNode &node) { static const PropertyNameList skipList({"QtQuick.XmlRole", "Qt.XmlRole", "QtQuick.ListElement", "Qt.ListElement"}); @@ -146,6 +147,22 @@ bool isSkippedNode(const ModelNode &node) return false; } +bool static parentTakesOverRendering(const ModelNode &modelNode) +{ + if (!modelNode.isValid()) + return false; + + ModelNode currentNode = modelNode; + + while (currentNode.hasParentProperty()) { + currentNode = currentNode.parentProperty().parentModelNode(); + if (NodeHints::fromModelNode(currentNode).takesOverRenderingOfChildren()) + return true; + } + + return false; +} + /*! Notifies the view that it was attached to \a model. For every model node in the model, a NodeInstance will be created. @@ -817,6 +834,11 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() if (instance.modelNode().metaInfo().isSubclassOf("QtQuick.Item")) nodeMetaType = InstanceContainer::ItemMetaType; + InstanceContainer::NodeFlags nodeFlags; + + if (parentTakesOverRendering(instance.modelNode())) + nodeFlags.setFlag(InstanceContainer::ParentTakesOverRendering); + InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), @@ -824,8 +846,8 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() instance.modelNode().metaInfo().componentFileName(), instance.modelNode().nodeSource(), nodeSourceType, - nodeMetaType - ); + nodeMetaType, + nodeFlags); instanceContainerList.append(container); } @@ -958,8 +980,20 @@ CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QLis if (instance.modelNode().metaInfo().isSubclassOf("QtQuick.Item")) nodeMetaType = InstanceContainer::ItemMetaType; - InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), instance.modelNode().minorVersion(), - instance.modelNode().metaInfo().componentFileName(), instance.modelNode().nodeSource(), nodeSourceType, nodeMetaType); + InstanceContainer::NodeFlags nodeFlags; + + if (parentTakesOverRendering(instance.modelNode())) + nodeFlags.setFlag(InstanceContainer::ParentTakesOverRendering); + + InstanceContainer container(instance.instanceId(), + instance.modelNode().type(), + instance.modelNode().majorVersion(), + instance.modelNode().minorVersion(), + instance.modelNode().metaInfo().componentFileName(), + instance.modelNode().nodeSource(), + nodeSourceType, + nodeMetaType, + nodeFlags); containerList.append(container); } diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp index 1a38b0a631f..28d7c0a205a 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp @@ -193,6 +193,14 @@ QString NodeHints::indexPropertyForStackedContainer() const return Internal::evaluateExpression(expression, modelNode(), ModelNode()).toString(); } +bool NodeHints::takesOverRenderingOfChildren() const +{ + if (!isValid()) + return false; + + return evaluateBooleanExpression("takesOverRenderingOfChildren", false); +} + QHash NodeHints::hints() const { return m_hints; @@ -277,7 +285,7 @@ bool JSObject::potentialParentIsRoot() const bool JSObject::potentialChildIsRoot() const { - return m_otherNode.isValid() && m_otherNode.isRootNode(); + return m_otherNode.isValid() && m_otherNode.isRootNode(); } bool JSObject::isSubclassOf(const QString &typeName) @@ -303,7 +311,7 @@ bool JSObject::rootItemIsSubclassOf(const QString &typeName) bool JSObject::currentParentIsSubclassOf(const QString &typeName) { if (m_modelNode.hasParentProperty() - && m_modelNode.parentProperty().isValid()) { + && m_modelNode.parentProperty().isValid()) { NodeMetaInfo metaInfo = m_modelNode.parentProperty().parentModelNode().metaInfo(); if (metaInfo.isValid()) return metaInfo.isSubclassOf(typeName.toUtf8()); From c25ba91fc13eb6d2903cdd5dab359a5695770e05 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 9 Mar 2018 16:36:04 +0100 Subject: [PATCH 30/41] Fix compile Change-Id: I0837b8830735f80dd98928769e603907226ab6e0 Reviewed-by: Christian Kandeler --- share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp index 6e480ceef98..8562f7bc86a 100644 --- a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp +++ b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp @@ -107,7 +107,7 @@ InstanceContainer::NodeMetaType InstanceContainer::metaType() const InstanceContainer::NodeFlags InstanceContainer::metaFlags() const { - return m_metaFlags; + return NodeFlags(m_metaFlags); } bool InstanceContainer::checkFlag(NodeFlag flag) const From d90da11f07a07cbb5608deac607ff0c46cc12db8 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 9 Mar 2018 14:10:57 +0100 Subject: [PATCH 31/41] AutoTest: Update Qbs/GTest wizard Instead of using undefined objects pass the needed objects around to access them inside the JavaScript file. Also update deprecated function use. Change-Id: I4c0cafc319047d0b72a0f9310e5335f793f800ac Reviewed-by: Christian Kandeler --- .../wizards/autotest/files/googlecommon.js | 22 +++++++++---------- .../templates/wizards/autotest/files/tst.qbs | 8 +++---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/share/qtcreator/templates/wizards/autotest/files/googlecommon.js b/share/qtcreator/templates/wizards/autotest/files/googlecommon.js index 1799b1c242c..1079ed5fdf7 100644 --- a/share/qtcreator/templates/wizards/autotest/files/googlecommon.js +++ b/share/qtcreator/templates/wizards/autotest/files/googlecommon.js @@ -13,9 +13,9 @@ ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** **/ -var FileInfo = loadExtension("qbs.FileInfo") +var FileInfo = require("qbs.FileInfo") -function getGTestDir(str) { +function getGTestDir(qbs, str) { if (!str) { if (qbs.hostOS.contains("linux")) return "/usr/include/gtest"; @@ -25,7 +25,7 @@ function getGTestDir(str) { return ""; } -function getGMockDir(str) { +function getGMockDir(qbs, str) { if (!str) { if (qbs.hostOS.contains("linux")) return "/usr/include/gmock"; @@ -35,29 +35,29 @@ function getGMockDir(str) { return ""; } -function getGTestAll(str) { - var gtest = getGTestDir(str); +function getGTestAll(qbs, str) { + var gtest = getGTestDir(qbs, str); if (!gtest) return []; return [FileInfo.joinPaths(gtest, "src/gtest-all.cc")]; } -function getGMockAll(str) { - var gmock = getGMockDir(str); +function getGMockAll(qbs, str) { + var gmock = getGMockDir(qbs, str); if (!gmock) return []; return [FileInfo.joinPaths(gmock, "src/gmock-all.cc")]; } -function getGTestIncludes(str) { - var gtest = getGTestDir(str); +function getGTestIncludes(qbs, str) { + var gtest = getGTestDir(qbs, str); if (!gtest) return []; return [gtest, FileInfo.joinPaths(gtest, "include")]; } -function getGMockIncludes(str) { - var mock = getGMockDir(str); +function getGMockIncludes(qbs, str) { + var mock = getGMockDir(qbs, str); if (!mock) return []; return [mock, FileInfo.joinPaths(mock, "include")]; diff --git a/share/qtcreator/templates/wizards/autotest/files/tst.qbs b/share/qtcreator/templates/wizards/autotest/files/tst.qbs index cb7076a0ace..14d277a429b 100644 --- a/share/qtcreator/templates/wizards/autotest/files/tst.qbs +++ b/share/qtcreator/templates/wizards/autotest/files/tst.qbs @@ -43,14 +43,14 @@ CppApplication { } - cpp.includePaths: [].concat(googleCommon.getGTestIncludes(googletestDir)) - .concat(googleCommon.getGMockIncludes(googletestDir)) + cpp.includePaths: [].concat(googleCommon.getGTestIncludes(qbs, googletestDir)) + .concat(googleCommon.getGMockIncludes(qbs, googletestDir)) files: [ "%{MainCppName}", "%{TestCaseFileWithHeaderSuffix}", - ].concat(googleCommon.getGTestAll(googletestDir)) - .concat(googleCommon.getGMockAll(googletestDir)) + ].concat(googleCommon.getGTestAll(qbs, googletestDir)) + .concat(googleCommon.getGMockAll(qbs, googletestDir)) @endif @if "%{TestFrameWork}" == "QtQuickTest" Depends { name: "cpp" } From 7d83472906566857f9afaa95440a41d1ed5edcae Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 28 Feb 2018 15:35:18 +0100 Subject: [PATCH 32/41] QtSupport/Welcome: Refresh the tutorials/examples/videos thumbnails And adjust the drawing code to support the HighDPI variants. Task-number: QTCREATORBUG-19942 Change-Id: I77b07674305b29680de27714fc56f1ad25f5346d Reviewed-by: Alessandro Portale --- src/plugins/qtsupport/exampleslistmodel.cpp | 4 +- .../qtsupport/gettingstartedwelcomepage.cpp | 12 +- .../qtsupport/images/icons/qteventicon.png | Bin 4074 -> 3210 bytes .../qtsupport/images/icons/qteventicon@2x.png | Bin 0 -> 6527 bytes .../qtsupport/images/icons/tutorialicon.png | Bin 4421 -> 5498 bytes .../images/icons/tutorialicon@2x.png | Bin 0 -> 11861 bytes .../images/icons/videotutorialicon.png | Bin 5911 -> 4062 bytes .../images/icons/videotutorialicon@2x.png | Bin 0 -> 8552 bytes src/plugins/qtsupport/qtsupport.qrc | 3 + src/tools/icons/qtcreatoricons.svg | 104 ++++++++++++++++++ 10 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 src/plugins/qtsupport/images/icons/qteventicon@2x.png create mode 100644 src/plugins/qtsupport/images/icons/tutorialicon@2x.png create mode 100644 src/plugins/qtsupport/images/icons/videotutorialicon@2x.png diff --git a/src/plugins/qtsupport/exampleslistmodel.cpp b/src/plugins/qtsupport/exampleslistmodel.cpp index a9e4c208acf..199f581b6c1 100644 --- a/src/plugins/qtsupport/exampleslistmodel.cpp +++ b/src/plugins/qtsupport/exampleslistmodel.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include @@ -300,7 +301,8 @@ void ExamplesListModel::parseExamples(QXmlStreamReader *reader, item.projectPath = attributes.value(QLatin1String("projectPath")).toString(); item.hasSourceCode = !item.projectPath.isEmpty(); item.projectPath = relativeOrInstallPath(item.projectPath, projectsOffset, examplesInstallPath); - item.imageUrl = attributes.value(QLatin1String("imageUrl")).toString(); + item.imageUrl = Utils::StyleHelper::dpiSpecificImageFile( + attributes.value(QLatin1String("imageUrl")).toString()); item.docUrl = attributes.value(QLatin1String("docUrl")).toString(); item.isHighlighted = attributes.value(QLatin1String("isHighlighted")).toString() == QLatin1String("true"); diff --git a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp index 045222fe77f..156c956ad54 100644 --- a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp +++ b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp @@ -440,18 +440,16 @@ public: QRect pixmapRect = inner; if (!pm.isNull()) { painter->setPen(foregroundColor2); - if (item.isVideo) - pixmapRect = inner.adjusted(6, 10, -6, -25); + pixmapRect = inner.adjusted(6, 20, -6, -15); QPoint pixmapPos = pixmapRect.center(); - pixmapPos.rx() -= pm.width() / 2; - pixmapPos.ry() -= pm.height() / 2; + pixmapPos.rx() -= pm.width() / pm.devicePixelRatio() / 2; + pixmapPos.ry() -= pm.height() / pm.devicePixelRatio() / 2; painter->drawPixmap(pixmapPos, pm); if (item.isVideo) { painter->setFont(sizedFont(13, option.widget)); - QRect lenRect(x, y + 120, w, 20); QString videoLen = item.videoLength; - lenRect = fm.boundingRect(lenRect, Qt::AlignHCenter, videoLen); - painter->drawText(lenRect.adjusted(0, 0, 5, 0), videoLen); + painter->drawText(pixmapRect.adjusted(0, 0, 0, painter->font().pixelSize() + 3), + videoLen, Qt::AlignBottom | Qt::AlignHCenter); } } else { // The description text as fallback. diff --git a/src/plugins/qtsupport/images/icons/qteventicon.png b/src/plugins/qtsupport/images/icons/qteventicon.png index b3ba23cbe3d97d4a37f9e9e2820ab76f1bb66bde..a4d27e29a2888a47d58f97ee18f06881409b6c5b 100644 GIT binary patch literal 3210 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 literal 4074 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 HDWM4f^_9Q^ diff --git a/src/plugins/qtsupport/images/icons/qteventicon@2x.png b/src/plugins/qtsupport/images/icons/qteventicon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b3eb6e5eaf142ab1996a2ba3ae891a8d78636e05 GIT binary patch literal 6527 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 literal 0 HcmV?d00001 diff --git a/src/plugins/qtsupport/images/icons/tutorialicon.png b/src/plugins/qtsupport/images/icons/tutorialicon.png index 955d29d92c6412256c464995436c32bc69f08f1e..a3ac270f8cd2a9f55a678f00dca5b09058c3b9a4 100644 GIT binary patch literal 5498 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 literal 4421 zcmeAS@N?(olHy`uVBq!ia0y~yVA##Tz%YS>je&t7;J4I#1_lPs0*}aI1_nK45N51c zYG1~{z`$PO>Fdh=keiEFTt?vcj|#AmYeb1-X-P(Y5yQ%LXFM1f7i4 zFfed}WP(9 zSV`fuOQDD>t8K$>r9}o#1rCOWJuzpZC|-;p>0Z+^_zA_q&!?cCUcihPZdU0*^c<-e@&cDNE$(jFoUs545LclG5L`U(_H_X)Rti2!Y0vx~EV;wuwzN+v^=HUqt@GE+Hg9=uDEGcr=>DgI zsk@H{#!qJ8DzW|H{Pbzx?jwaYoOc6wyYHUdmCw1miLw7hBVXav)6>=Bj;wTk#`EL1 zywxikG243m`*%LXI>|oNnC)@=$s4tQ*^gA8%(W?hzoR`qcXzj%b+yOs6*{laem$XD zB5bPjZHLU;^cPH5mz;VktoM?Cuko8l2j8{dlq|jcj_=`DS!G81o*EvKc3ZO8`M!s5<^1Ve)OZ#*u9q+Q+jPD7u54X)XCG9{MV&}x$_LSMdkZ_?ZD??Ms5O1f zT+21xF>6h?;J7^r}Ey}^3!bHoC3jZn<|t4eO;rm_TgXUdxu|NdVC^6li}W! zdggGy9US*RMTFlxu;}^wqucj5-`}Q?@aDxtn>|nbX3gHD(zz^Z^}>dbQ|^&s+1J*j ze~Uh^%AqWCTdu&?bJBy~cF$|SFa>G$w|2izKmP6c#<|YFKetWQ684*OswsLMd%}~J zn#*?4kC$&sIj&!_lgh5RoHp52$4b$KI$j{dqw z=iYYnX@84NpEl2FqDI$8o9W-S{qoyU>#klXayeROqROll5o()s_xMPi-qv|&!ip&7 z(@rzKu3h(weT=$;i4=WaX6j{m=YNwg%OfJWVxX z*(&9t*y=QqeVUDr|3VK5mxyVuTces4UPSXJ?5?=!^Z&V~*z4DvhdbErbyuF1xN~Ex zTJBPbXIq&!=-%+lk2w@pEvJ~9dRbWP1y6a=mU@xHdl#mx<@vw4R`7VL`p0Y6CV$lJ zzxuRP=XI>(DZh=owus&T#Gn1U=6v$;&#`Cb)QW8_Y86iNd7NLruQ_Y$v1q?)d4K!Q zGV5MH*r}&}Zf0vxm#D0Npyu?9{QTrYJ1$N+Ejlk|W1H|Y|Air1lh2zQ|DCVqEVH@p zaoVo(cPevF7QNaNENNV&V%r+`@7o9a8y~J1SNKK-Y4%I1`>A@Gc>n)azRYK?i`wL6 zi<5Qd@BfnZ$YNQ{%12gW$!_vT4JRKne)U4|#tx7oS2U1z$s%Tc4LUR(cvE!yd|He%T_k@ePPO#FBEGc;rx`=|d*_O85b`FY3J zW!aJ6o@o86e7EyX>F@6+p1)3CBVGUF>%Y`cnN1ZJ^(``=efd{fUi$UJMgQ1ivE1)c z-pt6fskr|(V{PP*-}WEhUA}+JKQHP)Xn6g6_i1-L7j8eXBl-EG8=7JN9?J#&n`ix_ zeBJ&|Zv8z%Pv!6R7^o(*3RcLU+tgxB-&2b zuW!#~pJRUJZ}`?cws>G=(YN<@w%HCoi?UiDnXB8^?)$syf3ZrGaGRp}{VMUTQ49wb zRlj?lZoj{|SK8dT{$J}HlVYpa*X&Qbir07Ezw@_#%eH4fAM(a4-oE4}z!LIX&+hz; za;{dViR$wr8ed=QclMl=a9eC@R&Rd%cjI+CKHaW)ku3iCZ2o_V2LIYWOl`8YB32yI zpSD-%N`K+LGGmE-Qn+OVv){r@kq0Y&J#(>Ax_B}n|CaY870wTb&TY^xTPl*M`{2_5 zJ#G9k1!DW&7rqp|pY-!_{lU|{N%wZ&<2sP~dHut_|Nj{6e;)m~ruuR%kMy-;Uxb%` zymBjj!xW{yWV=6|-ar37vcI^q)Y|x-#p3t1rt2PmsJULY?#H2;S-0FTUYoUe`SzA; zQs;|LKAm;r-<@g7|I915N?y4k+NHp$`Hk1V$glYCyBBfgPFt`2n0CK@^9qUSoFzNX z-}v`*)9-(l4>~>36+!1aVz=%pGUTkxRrNVk`%E~lkNxUtC^yWUvDOtKVl9%V_oojmkc4s+btJ6gO zng_OXEZ>Wm<=#71DPA+{d+mqfBZWbfIUi*^XDm@g?LRC0g9u|Tt>JDe=n1$Z|duG4sv5HZcyf8mY# zgWVd23tqew!a04EOiH zJH00Mx5Q`t-{lMJQa0w!K6GyGn&|zE4YTWi>CTJ$uW;C%=W%v;J%2-g&4;}?H}}k8 z-5%4Q8~x|S^6eWFziMroX|nG10}H?Z)$jJ{u3cLhbN%6Z@Be%UZl>>>d+uDXPIZak zw9x*)&hPEnCrSN`sWn?+cV^;`?`AK=SL}QGvE*rF-IkZrYtpW`pRl&vXZ10ttS$D- zG1a0n;k9{x{o*ax6`XC8-=O?r$<0ir1p=ax*KQxws8^Y6B>dxK;dQ1D74MDgw!Y#{ zd0XP#_hH-XOFK8uj;{L}eaK)@gjTXOpO>c0{l}lD*USxCd5H7!@(*{4qbolwbf0OI zDs(>YPSE`4+jQ*8KZc&!|HimSw%R0mTh8%P*>|yj+@H<;TWI&~VX@`286Qi^$_l?9 z`n}`dZu{eYrh!^hcmAAa&8Q*f{dM=cX;=5_E)8l8IhB6#Q1#9~-Peo0&0PNQx83%8 z-=fXzwzrnguj6XH7pHUk>9%;-|I@dQ+Uw?1A9c+9e*VYT)$T;wKRy)fVNpuLL_~Umg7J=K9I6@8e5Dp6_jsqUEkGIriMGzG-2c_1!@J`7x!2 z=flhaqb#%oQ`}+OI**A%lU0Zldc>b3IXRPIJ{!M4^ z`kQdYUBdIPx61EIuEOiik=6Q}_g{}+6)V1Yw;Y$ZP;ZdTHLLiIQ(RM@Zwh}`9`N0L z;R(yLE>=mdnWp|C;fqS0H1#HL3pyiTuc+%cPy5(k_W7~3mK*&xOubqze$Dmq2IE(5 z*|GnpU9MZEdN-^;Aw9S7ib$EsALA9j?%re8H!e8SF8x!l+Wu!oJ_185&oRqIuAL)DZdvSopsfX6m^+z)5 zRlIjiPtx37FZC&*GS|*A{B3#kyr@dQ3J@tN}5UyIkTKO6ji_1qw{ zLXntg?KOKc46fbZaHDj}6uzJ3jN`ERMKdhU=ZYjQ4soPif&f@<^f4jN|+Wt$m zqtsR763^e|VD%C_{_uNN>r`IZU2oPE{@=}Taf#d7*QzJ0?wCLO)?CGPs{8GEw|TXk zdw%@SRPHnJzP`(98{ac)lblz99pP3#ySfe9j_CC$Zsbn(cymZXX!nrk{^vh#d8NRA T^?!B-1_lOCS3j3^P6D75eeX+2Hi*fA6@tTAgNI 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 literal 0 HcmV?d00001 diff --git a/src/plugins/qtsupport/images/icons/videotutorialicon.png b/src/plugins/qtsupport/images/icons/videotutorialicon.png index b3e88de859f9d1070d9649cced466f167e93cacc..037adc27a35a9598800129a98d1170d0b419dbfb 100644 GIT binary patch literal 4062 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 literal 5911 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.xml qtcreator_tutorials.xml images/icons/tutorialicon.png + images/icons/tutorialicon@2x.png images/icons/videotutorialicon.png + images/icons/videotutorialicon@2x.png images/icons/qteventicon.png + images/icons/qteventicon@2x.png diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 2fd16a1b7ae..cc5e8a30e0c 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -496,6 +496,37 @@ effect="fill_between_many" linkedpaths="#path2259-2-0-6,0" id="path-effect2469-8" /> + + + + + + + + + + + + + + + + + + + + + + + Date: Mon, 12 Mar 2018 07:04:56 +0100 Subject: [PATCH 33/41] QmlDesigner: Fix compile for Qt5.6 Change-Id: I25cdf8874c03865400a3a1bc451c6c58e9294ab0 Reviewed-by: Orgad Shaneh --- .../qmldesigner/designercore/instances/nodeinstanceview.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index e1d07e65afc..614e61cc544 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -837,7 +837,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() InstanceContainer::NodeFlags nodeFlags; if (parentTakesOverRendering(instance.modelNode())) - nodeFlags.setFlag(InstanceContainer::ParentTakesOverRendering); + nodeFlags |= InstanceContainer::ParentTakesOverRendering; InstanceContainer container(instance.instanceId(), instance.modelNode().type(), @@ -983,7 +983,7 @@ CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QLis InstanceContainer::NodeFlags nodeFlags; if (parentTakesOverRendering(instance.modelNode())) - nodeFlags.setFlag(InstanceContainer::ParentTakesOverRendering); + nodeFlags |= InstanceContainer::ParentTakesOverRendering; InstanceContainer container(instance.instanceId(), instance.modelNode().type(), From 27063168ad386e7136cc285667b33774d150bbe7 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 11 Mar 2018 22:53:53 +0200 Subject: [PATCH 34/41] QmlDesigner: void static -> static void That's the order everywhere in the codebase. Change-Id: I62e57f2ddddd6e4fac0dc26d81b05839cf80a9db Reviewed-by: Christian Stenger --- .../components/componentcore/modelnodeoperations.cpp | 2 +- tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 0861597828f..5287db7a8ce 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -890,7 +890,7 @@ PropertyName getIndexPropertyName(const ModelNode &modelNode) return PropertyName(); } -void static setIndexProperty(const AbstractProperty &property, const QVariant &value) +static void setIndexProperty(const AbstractProperty &property, const QVariant &value) { if (!property.exists() || property.isVariantProperty()) { /* Using QmlObjectNode ensures we take states into account. */ diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp index 83cdaf3675a..6f8e390a05a 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp @@ -8211,7 +8211,7 @@ void tst_TestCore::changeGradientId() static void checkNode(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view); -void static checkChildNodes(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view) +static void checkChildNodes(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view) { for (auto child : node->children()) checkNode(child, view); From 102a058c2517621a758730bd47389f914d4a8c8a Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 9 Mar 2018 17:12:52 +0100 Subject: [PATCH 35/41] QbsProjectManager: Fix "equivalent command line" contents - We forgot to adapt to the introduction of the "config" key. - The space character was missing before the QML debugging property. Task-number: QTCREATORBUG-20024 Change-Id: Ie4a94a04989caa14b1ddc11c8595d679d1871625 Reviewed-by: Joerg Bornemann --- src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp | 2 +- src/plugins/qbsprojectmanager/qbsbuildstep.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index 94555e802c8..5f4c8341b6b 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -372,7 +372,7 @@ QString QbsBuildConfiguration::equivalentCommandLine(const BuildStep *buildStep) const QString profileName = QbsManager::instance()->profileForKit(buildStep->target()->kit()); const QString buildVariant = qbsConfiguration() .value(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY)).toString(); - Utils::QtcProcess::addArg(&commandLine, configurationName()); + Utils::QtcProcess::addArg(&commandLine, QLatin1String("config:") + configurationName()); Utils::QtcProcess::addArg(&commandLine, QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY) + QLatin1Char(':') + buildVariant); const Utils::FileName installRoot = stepProxy.installRoot(); diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 7b2e024f3e6..ffe80df75f4 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -634,7 +634,7 @@ void QbsBuildStepConfigWidget::updateState() } if (m_step->isQmlDebuggingEnabled()) - command.append(Constants::QBS_CONFIG_QUICK_DEBUG_KEY).append(":true"); + command.append(' ').append(Constants::QBS_CONFIG_QUICK_DEBUG_KEY).append(":true"); m_ui->commandLineTextEdit->setPlainText(command); QString summary = tr("Qbs: %1").arg(command); From 64fe131c142377821a1e38671e5684946616a33f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 8 Mar 2018 17:41:14 +0100 Subject: [PATCH 36/41] Fix ordering of items without file name in open documents popup An item that has no file name (like Git Commit, Diff etc.) was always last in the list. Broke by 324de13b4e6703db778010d0682ac26cff359516. Change-Id: Ied3add2a372b4b176ee800e8c023c3cef5495488 Reviewed-by: Orgad Shaneh --- src/plugins/coreplugin/editormanager/editorview.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 4d6dc676232..9848b30ab1d 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -270,7 +270,8 @@ void EditorView::updateEditorHistory(IEditor *editor, QList &histo for (int i = 0; i < history.size(); ++i) { const EditLocation &item = history.at(i); if (item.document == document - || !DocumentModel::indexOfFilePath(FileName::fromString(item.fileName))) { + || (!item.document + && !DocumentModel::indexOfFilePath(FileName::fromString(item.fileName)))) { history.removeAt(i--); } } From 6d3f2e43171665e1fca6548f0e3226bc0847074a Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 9 Mar 2018 16:33:09 +0100 Subject: [PATCH 37/41] qbs build: Suppress vcs header file creation The repository state is only used on the project file level at the moment. Change-Id: I8f6ff587785d4fbc5586836a31c256a2e114cdb6 Reviewed-by: Eike Ziller --- qbs/modules/pluginjson/pluginjson.qbs | 1 + 1 file changed, 1 insertion(+) diff --git a/qbs/modules/pluginjson/pluginjson.qbs b/qbs/modules/pluginjson/pluginjson.qbs index 8cba1834370..f684dbccb4e 100644 --- a/qbs/modules/pluginjson/pluginjson.qbs +++ b/qbs/modules/pluginjson/pluginjson.qbs @@ -13,6 +13,7 @@ Module { Depends { name: "vcs"; condition: hasVcs } Properties { condition: hasVcs + vcs.headerFileName: undefined vcs.repoDir: { // TODO: Could something like this be incorporated into the vcs module? // Currently, the default repo dir is project.sourceDirectory, which From f37982d859cd9916d05a91b82f0a2ed49d48bdde Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 12 Mar 2018 10:29:01 +0100 Subject: [PATCH 38/41] Doc: Add a link to a new Qt Creator and Qt video Change-Id: I3ea8c67e5cb967fc5c963b96c30a4de1ff1baa63 Reviewed-by: Alessandro Portale --- src/plugins/qtsupport/qtcreator_tutorials.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/qtsupport/qtcreator_tutorials.xml b/src/plugins/qtsupport/qtcreator_tutorials.xml index 264813a594a..2464a480917 100644 --- a/src/plugins/qtsupport/qtcreator_tutorials.xml +++ b/src/plugins/qtsupport/qtcreator_tutorials.xml @@ -60,7 +60,11 @@ - qt creator + qt creator,video + + + + qt creator,video From 84e0573cad70d8517e4445d2eb5e700ae77b874c Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 8 Mar 2018 10:10:36 +0100 Subject: [PATCH 39/41] ProjectExplorer: fix gcc toolchain abi detection This updates the selected abi in the toolchain widget when editing the binary path to the compiler. Task-number: QTCREATORBUG-19673 Change-Id: I8df69af207360364fb6f75e94a3aa26f84fd13d9 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/gcctoolchain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 0650827f43c..13714864ae6 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -1185,7 +1185,7 @@ void GccToolChainConfigWidget::handleCompilerCommandChange() { bool haveCompiler = false; Abi currentAbi = m_abiWidget->currentAbi(); - bool customAbi = m_abiWidget->isCustomAbi(); + bool customAbi = m_abiWidget->isCustomAbi() && m_abiWidget->isEnabled(); FileName path = m_compilerCommand->fileName(); QList abiList; From 7ac1b852b75837c391ae06490b17037bf9ac7591 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 7 Mar 2018 16:30:27 +0100 Subject: [PATCH 40/41] Fix binary editor tool tip It should show up also over the last column, it should also show up if the selection spans multiple lines, and if the mouse is not over the selection it show up with information about the single byte under cursor. If the mouse is over a selection that is longer than 8 bytes, the tool tip is restricted to the first 8 bytes of the selection. Task-number: QTCREATORBUG-17573 Change-Id: Ie7aaf1e52ceadd6be815d4ce3386a60df1418297 Reviewed-by: David Schulz --- src/plugins/bineditor/bineditorwidget.cpp | 33 ++++++++++++++++------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/plugins/bineditor/bineditorwidget.cpp b/src/plugins/bineditor/bineditorwidget.cpp index e647432723c..bb61571fb17 100644 --- a/src/plugins/bineditor/bineditorwidget.cpp +++ b/src/plugins/bineditor/bineditorwidget.cpp @@ -1147,16 +1147,31 @@ QString BinEditorWidget::toolTip(const QHelpEvent *helpEvent) const { int selStart = selectionStart(); int selEnd = selectionEnd(); - int byteCount = selEnd - selStart + 1; - if (m_hexCursor == 0 || byteCount > 8) - return QString(); + int byteCount = std::min(8, selEnd - selStart + 1); - const QPoint &startPoint = offsetToPos(selStart); - const QPoint &endPoint = offsetToPos(selEnd + 1); - QRect selRect(startPoint, endPoint); - selRect.setHeight(m_lineHeight); - if (!selRect.contains(helpEvent->pos())) - return QString(); + // check even position against selection line by line + bool insideSelection = false; + int startInLine = selStart; + do { + const int lineIndex = startInLine / m_bytesPerLine; + const int endOfLine = (lineIndex + 1) * m_bytesPerLine - 1; + const int endInLine = std::min(selEnd, endOfLine); + const QPoint &startPoint = offsetToPos(startInLine); + const QPoint &endPoint = offsetToPos(endInLine) + QPoint(m_columnWidth, 0); + QRect selectionLineRect(startPoint, endPoint); + selectionLineRect.setHeight(m_lineHeight); + if (selectionLineRect.contains(helpEvent->pos())) { + insideSelection = true; + break; + } + startInLine = endInLine + 1; + } while (startInLine <= selEnd); + if (!insideSelection) { + // show popup for byte under cursor + selStart = posAt(helpEvent->pos()); + selEnd = selStart; + byteCount = 1; + } quint64 bigEndianValue, littleEndianValue; quint64 bigEndianValueOld, littleEndianValueOld; From 0bcc983cdbb74baebccfdb09f7d2ffb22ebf950d Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 8 Mar 2018 08:10:51 +0100 Subject: [PATCH 41/41] BinEditor: Fix that posAt could be larger than available bytes Task-number: QTCREATORBUG-17573 Change-Id: Ia34bb9b6765850937793d6481bb1e6404319d510 Reviewed-by: David Schulz --- src/plugins/bineditor/bineditorwidget.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/plugins/bineditor/bineditorwidget.cpp b/src/plugins/bineditor/bineditorwidget.cpp index bb61571fb17..51d80a73c5c 100644 --- a/src/plugins/bineditor/bineditorwidget.cpp +++ b/src/plugins/bineditor/bineditorwidget.cpp @@ -550,17 +550,16 @@ QRect BinEditorWidget::cursorRect() const int BinEditorWidget::posAt(const QPoint &pos) const { - int xoffset = horizontalScrollBar()->value(); + const int xoffset = horizontalScrollBar()->value(); int x = xoffset + pos.x() - m_margin - m_labelWidth; int column = qMin(15, qMax(0,x) / m_columnWidth); - qint64 topLine = verticalScrollBar()->value(); - qint64 line = pos.y() / m_lineHeight; - + const qint64 topLine = verticalScrollBar()->value(); + const qint64 line = topLine + pos.y() / m_lineHeight; if (x > m_bytesPerLine * m_columnWidth + m_charWidth/2) { x -= m_bytesPerLine * m_columnWidth + m_charWidth; for (column = 0; column < 15; ++column) { - int dataPos = (topLine + line) * m_bytesPerLine + column; + const int dataPos = line * m_bytesPerLine + column; if (dataPos < 0 || dataPos >= m_size) break; QChar qc(QLatin1Char(dataAt(dataPos))); @@ -572,7 +571,7 @@ int BinEditorWidget::posAt(const QPoint &pos) const } } - return qMin(m_size, qMin(m_numLines, topLine + line) * m_bytesPerLine) + column; + return qMin(m_size - 1, line * m_bytesPerLine + column); } bool BinEditorWidget::inTextArea(const QPoint &pos) const