diff options
Diffstat (limited to 'src/plugins')
43 files changed, 384 insertions, 154 deletions
diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp index dcb5edaeb1..2e039c5ec1 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.cpp +++ b/src/plugins/clangformat/clangformatbaseindenter.cpp @@ -188,8 +188,6 @@ QByteArray dummyTextForContext(CharacterContext context, bool closingBraceBlock) } switch (context) { - case CharacterContext::Unknown: - QTC_ASSERT(false, return "";); case CharacterContext::AfterComma: return "a,"; case CharacterContext::NewStatement: @@ -197,6 +195,9 @@ QByteArray dummyTextForContext(CharacterContext context, bool closingBraceBlock) case CharacterContext::Continuation: case CharacterContext::LastAfterComma: return "& a &"; + case CharacterContext::Unknown: + default: + QTC_ASSERT(false, return "";); } } diff --git a/src/plugins/clangformat/clangformatutils.cpp b/src/plugins/clangformat/clangformatutils.cpp index 74c4165a34..61e9386282 100644 --- a/src/plugins/clangformat/clangformatutils.cpp +++ b/src/plugins/clangformat/clangformatutils.cpp @@ -143,27 +143,6 @@ static clang::format::FormatStyle qtcStyle() return style; } -static void applyTabSettings(clang::format::FormatStyle &style, const TabSettings &settings) -{ - style.IndentWidth = static_cast<unsigned>(settings.m_indentSize); - style.TabWidth = static_cast<unsigned>(settings.m_tabSize); - - if (settings.m_tabPolicy == TabSettings::TabsOnlyTabPolicy) - style.UseTab = FormatStyle::UT_Always; - else if (settings.m_tabPolicy == TabSettings::SpacesOnlyTabPolicy) - style.UseTab = FormatStyle::UT_Never; - else - style.UseTab = FormatStyle::UT_ForContinuationAndIndentation; - - if (settings.m_continuationAlignBehavior == TabSettings::NoContinuationAlign) { - style.ContinuationIndentWidth = 0; - style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; - } else { - style.ContinuationIndentWidth = style.IndentWidth; - style.AlignAfterOpenBracket = FormatStyle::BAS_Align; - } -} - static bool useGlobalOverriddenSettings() { return ClangFormatSettings::instance().overrideDefaultFile(); diff --git a/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp b/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp index 7d564399b6..cf5aae1bde 100644 --- a/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp +++ b/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp @@ -31,6 +31,7 @@ #include "qtcreatorprojectupdater.h" #include <filepathcaching.h> +#include <projectpartsstorage.h> #include <refactoringdatabaseinitializer.h> #include <sqlitedatabase.h> @@ -79,11 +80,13 @@ public: "Creating Dependencies"); Core::ProgressManager::addTask(promise.future(), title, "dependency creation", nullptr); }}; + ClangBackEnd::ProjectPartsStorage<Sqlite::Database> projectPartsStorage{database}; PchManagerClient pchManagerClient{pchCreationProgressManager, dependencyCreationProgressManager}; PchManagerConnectionClient connectionClient{&pchManagerClient}; QtCreatorProjectUpdater<PchManagerProjectUpdater> projectUpdate{connectionClient.serverProxy(), pchManagerClient, - filePathCache}; + filePathCache, + projectPartsStorage}; }; std::unique_ptr<ClangPchManagerPluginData> ClangPchManagerPlugin::d; diff --git a/src/plugins/clangpchmanager/pchmanagerclient.cpp b/src/plugins/clangpchmanager/pchmanagerclient.cpp index 4b0b5430d7..c26b871f50 100644 --- a/src/plugins/clangpchmanager/pchmanagerclient.cpp +++ b/src/plugins/clangpchmanager/pchmanagerclient.cpp @@ -44,10 +44,9 @@ void PchManagerClient::alive() void PchManagerClient::precompiledHeadersUpdated(ClangBackEnd::PrecompiledHeadersUpdatedMessage &&message) { for (ClangBackEnd::ProjectPartPch &projectPartPch : message.takeProjectPartPchs()) { - const QString projectPartId{projectPartPch.projectPartId}; const QString pchPath{projectPartPch.pchPath}; addProjectPartPch(std::move(projectPartPch)); - precompiledHeaderUpdated(projectPartId, pchPath, projectPartPch.lastModified); + precompiledHeaderUpdated(projectPartPch.projectPartId, pchPath, projectPartPch.lastModified); } } @@ -65,11 +64,10 @@ void PchManagerClient::progress(ClangBackEnd::ProgressMessage &&message) } } -void PchManagerClient::precompiledHeaderRemoved(const QString &projectPartId) +void PchManagerClient::precompiledHeaderRemoved(ClangBackEnd::ProjectPartId projectPartId) { for (auto notifier : m_notifiers) { - Utils::SmallString id(projectPartId); - removeProjectPartPch(id); + removeProjectPartPch(projectPartId); notifier->precompiledHeaderRemoved(projectPartId); } } @@ -79,7 +77,8 @@ void PchManagerClient::setConnectionClient(PchManagerConnectionClient *connectio m_connectionClient = connectionClient; } -Utils::optional<ClangBackEnd::ProjectPartPch> PchManagerClient::projectPartPch(Utils::SmallStringView projectPartId) const +Utils::optional<ClangBackEnd::ProjectPartPch> PchManagerClient::projectPartPch( + ClangBackEnd::ProjectPartId projectPartId) const { auto found = std::lower_bound(m_projectPartPchs.cbegin(), m_projectPartPchs.cend(), @@ -110,7 +109,7 @@ void PchManagerClient::detach(PchManagerNotifierInterface *notifierToBeDeleted) m_notifiers.erase(newEnd, m_notifiers.end()); } -void PchManagerClient::removeProjectPartPch(Utils::SmallStringView projectPartId) +void PchManagerClient::removeProjectPartPch(ClangBackEnd::ProjectPartId projectPartId) { auto found = std::lower_bound(m_projectPartPchs.begin(), m_projectPartPchs.end(), @@ -145,7 +144,7 @@ const std::vector<PchManagerNotifierInterface *> &PchManagerClient::notifiers() return m_notifiers; } -void PchManagerClient::precompiledHeaderUpdated(const QString &projectPartId, +void PchManagerClient::precompiledHeaderUpdated(ClangBackEnd::ProjectPartId projectPartId, const QString &pchFilePath, long long lastModified) { diff --git a/src/plugins/clangpchmanager/pchmanagerclient.h b/src/plugins/clangpchmanager/pchmanagerclient.h index ccbd03299a..308370356e 100644 --- a/src/plugins/clangpchmanager/pchmanagerclient.h +++ b/src/plugins/clangpchmanager/pchmanagerclient.h @@ -52,21 +52,20 @@ public: void precompiledHeadersUpdated(ClangBackEnd::PrecompiledHeadersUpdatedMessage &&message) override; void progress(ClangBackEnd::ProgressMessage &&message) override; - void precompiledHeaderRemoved(const QString &projectPartId); + void precompiledHeaderRemoved(ClangBackEnd::ProjectPartId projectPartId); void setConnectionClient(PchManagerConnectionClient *connectionClient); Utils::optional<ClangBackEnd::ProjectPartPch> projectPartPch( - Utils::SmallStringView projectPartId) const override; + ClangBackEnd::ProjectPartId projectPartId) const override; const ClangBackEnd::ProjectPartPchs &projectPartPchs() const override { return m_projectPartPchs; } -unittest_public: - const std::vector<PchManagerNotifierInterface*> ¬ifiers() const; - void precompiledHeaderUpdated(const QString &projectPartId, + unittest_public : const std::vector<PchManagerNotifierInterface *> ¬ifiers() const; + void precompiledHeaderUpdated(ClangBackEnd::ProjectPartId projectPartId, const QString &pchFilePath, long long lastModified); @@ -74,7 +73,7 @@ unittest_public: void detach(PchManagerNotifierInterface *notifier); void addProjectPartPch(ClangBackEnd::ProjectPartPch &&projectPartPch); - void removeProjectPartPch(Utils::SmallStringView projectPartId); + void removeProjectPartPch(ClangBackEnd::ProjectPartId projectPartId); private: ClangBackEnd::ProjectPartPchs m_projectPartPchs; diff --git a/src/plugins/clangpchmanager/pchmanagernotifierinterface.h b/src/plugins/clangpchmanager/pchmanagernotifierinterface.h index 9f9b5d56cf..04461186d6 100644 --- a/src/plugins/clangpchmanager/pchmanagernotifierinterface.h +++ b/src/plugins/clangpchmanager/pchmanagernotifierinterface.h @@ -27,6 +27,8 @@ #include "clangpchmanager_global.h" +#include <projectpartid.h> + QT_FORWARD_DECLARE_CLASS(QString) namespace ClangPchManager { @@ -40,10 +42,11 @@ public: PchManagerNotifierInterface(const PchManagerNotifierInterface &) = delete; PchManagerNotifierInterface &operator=(const PchManagerNotifierInterface &) = delete; - virtual void precompiledHeaderUpdated(const QString &projectPartId, + virtual void precompiledHeaderUpdated(ClangBackEnd::ProjectPartId projectPartId, const QString &pchFilePath, - long long lastModified) = 0; - virtual void precompiledHeaderRemoved(const QString &projectPartId) = 0; + long long lastModified) + = 0; + virtual void precompiledHeaderRemoved(ClangBackEnd::ProjectPartId projectPartId) = 0; PchManagerClient &m_pchManagerClient; diff --git a/src/plugins/clangpchmanager/pchmanagerprojectupdater.cpp b/src/plugins/clangpchmanager/pchmanagerprojectupdater.cpp index f7b925049a..38af78719e 100644 --- a/src/plugins/clangpchmanager/pchmanagerprojectupdater.cpp +++ b/src/plugins/clangpchmanager/pchmanagerprojectupdater.cpp @@ -29,20 +29,22 @@ namespace ClangPchManager { -PchManagerProjectUpdater::PchManagerProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server, - PchManagerClient &client, - ClangBackEnd::FilePathCachingInterface &filePathCache) - : ProjectUpdater(server, filePathCache), - m_client(client) +void PchManagerProjectUpdater::removeProjectParts(const ClangBackEnd::ProjectPartIds &projectPartIds) { + ProjectUpdater::removeProjectParts(projectPartIds); + + for (ClangBackEnd::ProjectPartId projectPartId : projectPartIds) + m_client.precompiledHeaderRemoved(projectPartId); } -void PchManagerProjectUpdater::removeProjectParts(const QStringList &projectPartIds) +void PchManagerProjectUpdater::removeProjectParts(const QStringList &projectPartNames) { + ClangBackEnd::ProjectPartIds projectPartIds = toProjectPartIds(projectPartNames); + ProjectUpdater::removeProjectParts(projectPartIds); - for (const QString &projectPartiId : projectPartIds) - m_client.precompiledHeaderRemoved(projectPartiId); + for (ClangBackEnd::ProjectPartId projectPartId : projectPartIds) + m_client.precompiledHeaderRemoved(projectPartId); } } // namespace ClangPchManager diff --git a/src/plugins/clangpchmanager/pchmanagerprojectupdater.h b/src/plugins/clangpchmanager/pchmanagerprojectupdater.h index 470e12fe4a..fd1b98eab4 100644 --- a/src/plugins/clangpchmanager/pchmanagerprojectupdater.h +++ b/src/plugins/clangpchmanager/pchmanagerprojectupdater.h @@ -34,9 +34,14 @@ class PchManagerProjectUpdater : public ProjectUpdater public: PchManagerProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server, PchManagerClient &client, - ClangBackEnd::FilePathCachingInterface &filePathCache); + ClangBackEnd::FilePathCachingInterface &filePathCache, + ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage) + : ProjectUpdater(server, filePathCache, projectPartsStorage) + , m_client(client) + {} - void removeProjectParts(const QStringList &projectPartIds); + void removeProjectParts(const ClangBackEnd::ProjectPartIds &projectPartIds); + void removeProjectParts(const QStringList &projectPartNames); private: PchManagerClient &m_client; diff --git a/src/plugins/clangpchmanager/projectupdater.cpp b/src/plugins/clangpchmanager/projectupdater.cpp index 4e5cf95017..fc8db5bc07 100644 --- a/src/plugins/clangpchmanager/projectupdater.cpp +++ b/src/plugins/clangpchmanager/projectupdater.cpp @@ -61,13 +61,6 @@ public: ClangBackEnd::FilePathIds sources; }; -ProjectUpdater::ProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server, - ClangBackEnd::FilePathCachingInterface &filePathCache) - : m_server(server), - m_filePathCache(filePathCache) -{ -} - void ProjectUpdater::updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts, Utils::SmallStringVector &&toolChainArguments) { @@ -75,9 +68,9 @@ void ProjectUpdater::updateProjectParts(const std::vector<CppTools::ProjectPart toProjectPartContainers(projectParts), std::move(toolChainArguments)}); } -void ProjectUpdater::removeProjectParts(const QStringList &projectPartIds) +void ProjectUpdater::removeProjectParts(ClangBackEnd::ProjectPartIds projectPartIds) { - Utils::SmallStringVector sortedIds(projectPartIds); + auto sortedIds{projectPartIds}; std::sort(sortedIds.begin(), sortedIds.end()); m_server.removeProjectParts(ClangBackEnd::RemoveProjectPartsMessage{std::move(sortedIds)}); @@ -278,7 +271,12 @@ ClangBackEnd::ProjectPartContainer ProjectUpdater::toProjectPartContainer( auto includeSearchPaths = createIncludeSearchPaths(*projectPart); - return ClangBackEnd::ProjectPartContainer(projectPart->id(), + const QByteArray projectPartName = projectPart->id().toUtf8(); + + ClangBackEnd::ProjectPartId projectPartId = m_projectPartsStorage.fetchProjectPartId( + projectPartName); + + return ClangBackEnd::ProjectPartContainer(projectPartId, Utils::SmallStringVector(arguments), createCompilerMacros(projectPart->projectMacros), std::move(includeSearchPaths.system), @@ -296,9 +294,6 @@ ClangBackEnd::ProjectPartContainers ProjectUpdater::toProjectPartContainers( { using namespace std::placeholders; - std::vector<ClangBackEnd::ProjectPartContainer> projectPartContainers; - projectPartContainers.reserve(projectParts.size()); - projectParts.erase(std::remove_if(projectParts.begin(), projectParts.end(), [](const CppTools::ProjectPart *projectPart) { @@ -306,6 +301,9 @@ ClangBackEnd::ProjectPartContainers ProjectUpdater::toProjectPartContainers( }), projectParts.end()); + std::vector<ClangBackEnd::ProjectPartContainer> projectPartContainers; + projectPartContainers.reserve(projectParts.size()); + std::transform(projectParts.begin(), projectParts.end(), std::back_inserter(projectPartContainers), @@ -336,4 +334,26 @@ ClangBackEnd::FilePaths ProjectUpdater::createExcludedPaths( return excludedPaths; } +QString ProjectUpdater::fetchProjectPartName(ClangBackEnd::ProjectPartId projectPartId) const +{ + return m_projectPartsStorage.fetchProjectPartName(projectPartId).toQString(); +} + +ClangBackEnd::ProjectPartIds ProjectUpdater::toProjectPartIds( + const QStringList &projectPartNames) const +{ + ClangBackEnd::ProjectPartIds projectPartIds; + projectPartIds.reserve(projectPartIds.size()); + + std::transform(projectPartNames.begin(), + projectPartNames.end(), + std::back_inserter(projectPartIds), + [&](const QString &projectPartName) { + return m_projectPartsStorage.fetchProjectPartId( + Utils::SmallString{projectPartName}); + }); + + return projectPartIds; +} + } // namespace ClangPchManager diff --git a/src/plugins/clangpchmanager/projectupdater.h b/src/plugins/clangpchmanager/projectupdater.h index 896a02def0..044b86f637 100644 --- a/src/plugins/clangpchmanager/projectupdater.h +++ b/src/plugins/clangpchmanager/projectupdater.h @@ -33,6 +33,7 @@ #include <generatedfiles.h> #include <includesearchpath.h> #include <projectpartcontainer.h> +#include <projectpartsstorageinterface.h> #include <projectexplorer/headerpath.h> @@ -69,11 +70,16 @@ public: }; ProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server, - ClangBackEnd::FilePathCachingInterface &filePathCache); + ClangBackEnd::FilePathCachingInterface &filePathCache, + ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage) + : m_server(server) + , m_filePathCache(filePathCache) + , m_projectPartsStorage(projectPartsStorage) + {} void updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts, Utils::SmallStringVector &&toolChainArguments); - void removeProjectParts(const QStringList &projectPartIds); + void removeProjectParts(ClangBackEnd::ProjectPartIds projectPartIds); void updateGeneratedFiles(ClangBackEnd::V2::FileContainers &&generatedFiles); void removeGeneratedFiles(ClangBackEnd::FilePaths &&filePaths); @@ -88,6 +94,7 @@ public: CppTools::ProjectPart *projectPart) const; ClangBackEnd::ProjectPartContainers toProjectPartContainers( std::vector<CppTools::ProjectPart *> projectParts) const; + void addToHeaderAndSources(HeaderAndSources &headerAndSources, const CppTools::ProjectFile &projectFile) const; static QStringList toolChainArguments(CppTools::ProjectPart *projectPart); @@ -98,11 +105,16 @@ public: static ClangBackEnd::FilePaths createExcludedPaths( const ClangBackEnd::V2::FileContainers &generatedFiles); + QString fetchProjectPartName(ClangBackEnd::ProjectPartId projectPartId) const; + + ClangBackEnd::ProjectPartIds toProjectPartIds(const QStringList &projectPartNames) const; + private: ClangBackEnd::GeneratedFiles m_generatedFiles; ClangBackEnd::FilePaths m_excludedPaths; ClangBackEnd::ProjectManagementServerInterface &m_server; ClangBackEnd::FilePathCachingInterface &m_filePathCache; + ClangBackEnd::ProjectPartsStorageInterface &m_projectPartsStorage; }; } // namespace ClangPchManager diff --git a/src/plugins/clangpchmanager/qtcreatorprojectupdater.h b/src/plugins/clangpchmanager/qtcreatorprojectupdater.h index 4d66a2f8c3..a53bbc678a 100644 --- a/src/plugins/clangpchmanager/qtcreatorprojectupdater.h +++ b/src/plugins/clangpchmanager/qtcreatorprojectupdater.h @@ -55,11 +55,12 @@ class QtCreatorProjectUpdater : public ProjectUpdaterType, public ProjectExplorer::ExtraCompilerFactoryObserver { public: - template <typename ClientType> + template<typename ClientType> QtCreatorProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server, ClientType &client, - ClangBackEnd::FilePathCachingInterface &filePathCache) - : ProjectUpdaterType(server, client, filePathCache) + ClangBackEnd::FilePathCachingInterface &filePathCache, + ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage) + : ProjectUpdaterType(server, client, filePathCache, projectPartsStorage) { connectToCppModelManager(); } @@ -78,7 +79,7 @@ public: } void projectPartsRemoved(const QStringList &projectPartIds) - { + { ProjectUpdaterType::removeProjectParts(projectPartIds); } diff --git a/src/plugins/clangrefactoring/clangrefactoringplugin.cpp b/src/plugins/clangrefactoring/clangrefactoringplugin.cpp index ea765bed5f..059eff4c78 100644 --- a/src/plugins/clangrefactoring/clangrefactoringplugin.cpp +++ b/src/plugins/clangrefactoring/clangrefactoringplugin.cpp @@ -36,6 +36,7 @@ #include <clangpchmanager/clangpchmanagerplugin.h> #include <clangpchmanager/progressmanager.h> #include <clangsupport/refactoringdatabaseinitializer.h> +#include <projectpartsstorage.h> #include <cpptools/cppmodelmanager.h> @@ -61,6 +62,8 @@ namespace ClangRefactoring { namespace { +using ClangPchManager::ClangPchManagerPlugin; + QString backendProcessPath() { return Core::ICore::libexecPath() @@ -91,14 +94,16 @@ public: ClangBackEnd::RefactoringConnectionClient connectionClient{&refactoringClient}; QuerySqliteReadStatementFactory statementFactory{database}; SymbolQuery<QuerySqliteReadStatementFactory> symbolQuery{statementFactory}; + ClangBackEnd::ProjectPartsStorage<Sqlite::Database> projectPartsStorage{database}; RefactoringEngine engine{connectionClient.serverProxy(), refactoringClient, filePathCache, symbolQuery}; QtCreatorSearch qtCreatorSearch; QtCreatorClangQueryFindFilter qtCreatorfindFilter{connectionClient.serverProxy(), qtCreatorSearch, refactoringClient}; QtCreatorRefactoringProjectUpdater projectUpdate{connectionClient.serverProxy(), - ClangPchManager::ClangPchManagerPlugin::pchManagerClient(), - filePathCache}; + ClangPchManagerPlugin::pchManagerClient(), + filePathCache, + projectPartsStorage}; }; ClangRefactoringPlugin::ClangRefactoringPlugin() diff --git a/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.cpp b/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.cpp index f3ca992620..dea3ccfeec 100644 --- a/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.cpp +++ b/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.cpp @@ -60,10 +60,16 @@ std::vector<ClangBackEnd::V2::FileContainer> createGeneratedFiles() } } -QtCreatorRefactoringProjectUpdater::QtCreatorRefactoringProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server, - ClangPchManager::PchManagerClient &pchManagerClient, - ClangBackEnd::FilePathCachingInterface &filePathCache) - : RefactoringProjectUpdater(server, pchManagerClient, *cppModelManager(), filePathCache) +QtCreatorRefactoringProjectUpdater::QtCreatorRefactoringProjectUpdater( + ClangBackEnd::ProjectManagementServerInterface &server, + ClangPchManager::PchManagerClient &pchManagerClient, + ClangBackEnd::FilePathCachingInterface &filePathCache, + ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage) + : RefactoringProjectUpdater(server, + pchManagerClient, + *cppModelManager(), + filePathCache, + projectPartsStorage) { connectToCppModelManager(); } diff --git a/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.h b/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.h index 118c15b50c..85d635a3af 100644 --- a/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.h +++ b/src/plugins/clangrefactoring/qtcreatorrefactoringprojectupdater.h @@ -32,9 +32,11 @@ namespace ClangRefactoring { class QtCreatorRefactoringProjectUpdater final : public RefactoringProjectUpdater { public: - QtCreatorRefactoringProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server, - ClangPchManager::PchManagerClient &pchManagerClient, - ClangBackEnd::FilePathCachingInterface &filePathCache); + QtCreatorRefactoringProjectUpdater( + ClangBackEnd::ProjectManagementServerInterface &server, + ClangPchManager::PchManagerClient &pchManagerClient, + ClangBackEnd::FilePathCachingInterface &filePathCache, + ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage); private: void abstractEditorUpdated(const QString &filePath, const QByteArray &contents); diff --git a/src/plugins/clangrefactoring/refactoringprojectupdater.cpp b/src/plugins/clangrefactoring/refactoringprojectupdater.cpp index 99b028e522..8cfd5b942a 100644 --- a/src/plugins/clangrefactoring/refactoringprojectupdater.cpp +++ b/src/plugins/clangrefactoring/refactoringprojectupdater.cpp @@ -26,19 +26,22 @@ #include "refactoringprojectupdater.h" #include <cpptools/cppmodelmanager.h> +#include <projectpartsstorageinterface.h> namespace ClangRefactoring { -void RefactoringProjectUpdater::precompiledHeaderUpdated(const QString &projectPartId, +void RefactoringProjectUpdater::precompiledHeaderUpdated(ClangBackEnd::ProjectPartId projectPartId, const QString &, long long) { - auto projectPart = m_cppModelManager.projectPartForId(projectPartId); + const QString projectPartName = fetchProjectPartName(projectPartId); + + auto projectPart = m_cppModelManager.projectPartForId(projectPartName); if (projectPart) updateProjectParts({projectPart.data()}, {}); } -void RefactoringProjectUpdater::precompiledHeaderRemoved(const QString &projectPartId) +void RefactoringProjectUpdater::precompiledHeaderRemoved(ClangBackEnd::ProjectPartId projectPartId) { removeProjectParts({projectPartId}); } diff --git a/src/plugins/clangrefactoring/refactoringprojectupdater.h b/src/plugins/clangrefactoring/refactoringprojectupdater.h index 8e2652cf23..a9559ef94e 100644 --- a/src/plugins/clangrefactoring/refactoringprojectupdater.h +++ b/src/plugins/clangrefactoring/refactoringprojectupdater.h @@ -39,18 +39,18 @@ public: RefactoringProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server, ClangPchManager::PchManagerClient &pchManagerClient, CppTools::CppModelManagerInterface &cppModelManager, - ClangBackEnd::FilePathCachingInterface &filePathCache) - : ClangPchManager::ProjectUpdater(server, filePathCache), - ClangPchManager::PchManagerNotifierInterface(pchManagerClient), - m_cppModelManager(cppModelManager) + ClangBackEnd::FilePathCachingInterface &filePathCache, + ClangBackEnd::ProjectPartsStorageInterface &projectPartsStorage) + : ClangPchManager::ProjectUpdater(server, filePathCache, projectPartsStorage) + , ClangPchManager::PchManagerNotifierInterface(pchManagerClient) + , m_cppModelManager(cppModelManager) { - } - void precompiledHeaderUpdated(const QString &projectPartId, + void precompiledHeaderUpdated(ClangBackEnd::ProjectPartId projectPartId, const QString &pchFilePath, long long lastModified) override; - void precompiledHeaderRemoved(const QString &projectPartId) override; + void precompiledHeaderRemoved(ClangBackEnd::ProjectPartId projectPartId) override; private: CppTools::CppModelManagerInterface &m_cppModelManager; diff --git a/src/plugins/coreplugin/fancytabwidget.cpp b/src/plugins/coreplugin/fancytabwidget.cpp index 8ce0cfb199..e46a7e70aa 100644 --- a/src/plugins/coreplugin/fancytabwidget.cpp +++ b/src/plugins/coreplugin/fancytabwidget.cpp @@ -598,7 +598,7 @@ void FancyTabWidget::addCornerWidget(QWidget *widget) int FancyTabWidget::currentIndex() const { - return m_tabBar->currentIndex(); + return m_modesStack->currentIndex(); } QStatusBar *FancyTabWidget::statusBar() const diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp index 4a7fb5d4a3..f2b3869f9b 100644 --- a/src/plugins/debugger/debuggeritemmanager.cpp +++ b/src/plugins/debugger/debuggeritemmanager.cpp @@ -700,7 +700,7 @@ void DebuggerItemManagerPrivate::autoDetectCdbDebuggers() void DebuggerItemManagerPrivate::autoDetectGdbOrLldbDebuggers() { const QStringList filters = {"gdb-i686-pc-mingw32", "gdb-i686-pc-mingw32.exe", "gdb", - "gdb.exe", "lldb", "lldb.exe", "lldb-*"}; + "gdb.exe", "lldb", "lldb.exe", "lldb-[1-9]*"}; // DebuggerItem result; // result.setAutoDetected(true); @@ -746,14 +746,8 @@ void DebuggerItemManagerPrivate::autoDetectGdbOrLldbDebuggers() dir.setFilter(QDir::Files | QDir::Executable); foreach (const Utils::FileName &base, path) { dir.setPath(base.toFileInfo().absoluteFilePath()); - foreach (const QString &entry, dir.entryList()) { - if (entry.startsWith("lldb-platform-") - || entry.startsWith("lldb-gdbserver-") - || entry.startsWith("lldb-mi-")) { - continue; - } + foreach (const QString &entry, dir.entryList()) suspects.append(FileName::fromString(dir.absoluteFilePath(entry))); - } } foreach (const FileName &command, suspects) { diff --git a/src/plugins/fakevim/fakevimactions.cpp b/src/plugins/fakevim/fakevimactions.cpp index fbb7556eef..007d9fcf5a 100644 --- a/src/plugins/fakevim/fakevimactions.cpp +++ b/src/plugins/fakevim/fakevimactions.cpp @@ -108,7 +108,7 @@ FakeVimSettings::FakeVimSettings() createAction(ConfigTildeOp, false, "TildeOp", "top"); createAction(ConfigShowCmd, true, "ShowCmd", "sc"); createAction(ConfigRelativeNumber, false, "RelativeNumber", "rnu"); - createAction(ConfigBlinkingCursor, false, "BlinkingCursor", "cb"); + createAction(ConfigBlinkingCursor, false, "BlinkingCursor", "bc"); createAction(ConfigScrollOff, 0, "ScrollOff", "so"); createAction(ConfigBackspace, QString("indent,eol,start"), "ConfigBackspace", "bs"); createAction(ConfigIsKeyword, QString("@,48-57,_,192-255,a-z,A-Z"), "IsKeyword", "isk"); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 8dac609897..550a8489e4 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1208,7 +1208,7 @@ void GitClient::reset(const QString &workingDirectory, const QString &argument, if (!commit.isEmpty()) arguments << commit; - unsigned flags = 0; + unsigned flags = VcsCommand::ShowSuccessMessage; if (argument == "--hard") { if (gitStatus(workingDirectory, StatusMode(NoUntracked | NoSubmodules)) != StatusUnchanged) { if (QMessageBox::question( diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp index a486fb837e..f801f4cfe8 100644 --- a/src/plugins/pythoneditor/pythoneditorplugin.cpp +++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp @@ -334,7 +334,7 @@ static QStringList readLines(const Utils::FileName &projectFile) QTextStream stream(&file); while (true) { - QString line = stream.readLine(); + const QString line = stream.readLine(); if (line.isNull()) break; if (visited.contains(line)) @@ -382,8 +382,8 @@ static QStringList readLinesJson(const Utils::FileName &projectFile, const QJsonObject obj = doc.object(); if (obj.contains("files")) { - QJsonValue files = obj.value("files"); - QJsonArray files_array = files.toArray(); + const QJsonValue files = obj.value("files"); + const QJsonArray files_array = files.toArray(); QSet<QString> visited; for (const auto &file : files_array) visited.insert(file.toString()); @@ -396,7 +396,7 @@ static QStringList readLinesJson(const Utils::FileName &projectFile, bool PythonProject::saveRawFileList(const QStringList &rawFileList) { - bool result = saveRawList(rawFileList, projectFilePath().toString()); + const bool result = saveRawList(rawFileList, projectFilePath().toString()); // refresh(PythonProject::Files); return result; } @@ -463,7 +463,7 @@ bool PythonProject::addFiles(const QStringList &filePaths) { QStringList newList = m_rawFileList; - QDir baseDir(projectDirectory().toString()); + const QDir baseDir(projectDirectory().toString()); for (const QString &filePath : filePaths) newList.append(baseDir.relativeFilePath(filePath)); @@ -475,7 +475,7 @@ bool PythonProject::removeFiles(const QStringList &filePaths) QStringList newList = m_rawFileList; for (const QString &filePath : filePaths) { - QHash<QString, QString>::iterator i = m_rawListEntries.find(filePath); + const QHash<QString, QString>::iterator i = m_rawListEntries.find(filePath); if (i != m_rawListEntries.end()) newList.removeOne(i.value()); } @@ -486,7 +486,7 @@ bool PythonProject::removeFiles(const QStringList &filePaths) bool PythonProject::setFiles(const QStringList &filePaths) { QStringList newList; - QDir baseDir(projectDirectory().toString()); + const QDir baseDir(projectDirectory().toString()); for (const QString &filePath : filePaths) newList.append(baseDir.relativeFilePath(filePath)); @@ -497,11 +497,11 @@ bool PythonProject::renameFile(const QString &filePath, const QString &newFilePa { QStringList newList = m_rawFileList; - QHash<QString, QString>::iterator i = m_rawListEntries.find(filePath); + const QHash<QString, QString>::iterator i = m_rawListEntries.find(filePath); if (i != m_rawListEntries.end()) { - int index = newList.indexOf(i.value()); + const int index = newList.indexOf(i.value()); if (index != -1) { - QDir baseDir(projectDirectory().toString()); + const QDir baseDir(projectDirectory().toString()); newList.replace(index, baseDir.relativeFilePath(newFilePath)); } } @@ -550,12 +550,13 @@ void PythonProject::refresh(Target *target) emitParsingStarted(); parseProject(); - QDir baseDir(projectDirectory().toString()); + const QDir baseDir(projectDirectory().toString()); BuildTargetInfoList appTargets; auto newRoot = std::make_unique<PythonProjectNode>(this); - for (const QString &f : m_files) { + for (const QString &f : qAsConst(m_files)) { const QString displayName = baseDir.relativeFilePath(f); - FileType fileType = f.endsWith(".pyproject") || f.endsWith(".pyqtc") ? FileType::Project : FileType::Source; + const FileType fileType = f.endsWith(".pyproject") || f.endsWith(".pyqtc") ? FileType::Project + : FileType::Source; newRoot->addNestedNode(std::make_unique<PythonFileNode>(FileName::fromString(f), displayName, fileType)); if (fileType == FileType::Source) { @@ -659,8 +660,8 @@ QHash<QString, QStringList> sortFilesIntoPaths(const QString &base, const QSet<Q const QDir baseDir(base); for (const QString &absoluteFileName : files) { - QFileInfo fileInfo(absoluteFileName); - FileName absoluteFilePath = FileName::fromString(fileInfo.path()); + const QFileInfo fileInfo(absoluteFileName); + const FileName absoluteFilePath = FileName::fromString(fileInfo.path()); QString relativeFilePath; if (absoluteFilePath.isChildOf(baseDir)) { diff --git a/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp index 4a9147ae4e..62f7f315ce 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp @@ -117,6 +117,9 @@ QString filterMetaIcons(const QString &fileName) QModelIndex CustomFileSystemModel::setRootPath(const QString &newPath) { + if (m_fileSystemModel->rootPath() == newPath) + return QAbstractListModel::index(0, 0); + beginResetModel(); m_fileSystemModel->setRootPath(newPath); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index d4dea983c0..8dd1c0727e 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -431,11 +431,18 @@ void ItemLibraryWidget::addResources() filters.prepend(tr("All Files (%1)").arg(map.values().join(" "))); + static QString lastDir; + const QString currentDir = lastDir.isEmpty() ? document->fileName().parentDir().toString() : lastDir; + const auto fileNames = QFileDialog::getOpenFileNames(this, tr("Add Resources"), - document->fileName().parentDir().toString(), + currentDir, filters.join(";;")); + + if (!fileNames.isEmpty()) + lastDir = QFileInfo(fileNames.first()).absolutePath(); + QMultiMap<QString, QString> partitionedFileNames; for (const QString &fileName : fileNames) { diff --git a/src/plugins/qmldesigner/designercore/include/qmltimeline.h b/src/plugins/qmldesigner/designercore/include/qmltimeline.h index c04fd454c0..59342bcb04 100644 --- a/src/plugins/qmldesigner/designercore/include/qmltimeline.h +++ b/src/plugins/qmldesigner/designercore/include/qmltimeline.h @@ -72,6 +72,7 @@ public: void resetGroupRecording() const; bool hasKeyframeGroup(const ModelNode &node, const PropertyName &propertyName) const; + bool hasKeyframeGroupForTarget(const ModelNode &node) const; private: void addKeyframeGroupIfNotExists(const ModelNode &node, const PropertyName &propertyName); diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 6a69764dbe..a1513128d7 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -187,7 +187,7 @@ protected: // functions void notifyErrorsAndWarnings(const QList<DocumentMessage> &errors); private: //variables - ModelNode nodeAtTextCursorPositionRekursive(const ModelNode &root, int cursorPosition) const; + ModelNode nodeAtTextCursorPositionHelper(const ModelNode &root, int cursorPosition) const; void setupCanonicalHashes() const; TextModifier *m_textModifier = nullptr; diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp index 7c5ee2f7aa..4251dd96c3 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp @@ -45,7 +45,7 @@ public: int majorVersion{-1}; int minorVersion{-1}; QString libraryEntryIconPath; - QIcon typeIcon; + QIcon typeIcon = QIcon(":/ItemLibrary/images/item-default-icon.png"); QList<PropertyContainer> properties; QString qml; QString qmlSource; diff --git a/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp b/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp index e484848261..a687853604 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp @@ -280,6 +280,19 @@ bool QmlTimeline::hasKeyframeGroup(const ModelNode &node, const PropertyName &pr return false; } +bool QmlTimeline::hasKeyframeGroupForTarget(const ModelNode &node) const +{ + if (!isValid()) + return false; + + for (const QmlTimelineKeyframeGroup &frames : allKeyframeGroups()) { + if (frames.target().isValid() && frames.target() == node) + return true; + } + + return false; +} + QList<QmlTimelineKeyframeGroup> QmlTimeline::allKeyframeGroups() const { QList<QmlTimelineKeyframeGroup> returnList; diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 2b22844bb9..bbd5fad60a 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -390,7 +390,7 @@ void RewriterView::deactivateTextMofifierChangeSignals() textModifier()->deactivateChangeSignals(); } -void RewriterView::auxiliaryDataChanged(const ModelNode &, const PropertyName &name, const QVariant &) +void RewriterView::auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &) { if (m_restoringAuxData) return; @@ -401,6 +401,11 @@ void RewriterView::auxiliaryDataChanged(const ModelNode &, const PropertyName &n if (name.endsWith("@Internal")) return; + if (node.isRootNode()) { + if (name == "width" || name == "height" || name == "autoSize") + return; + } + m_textModifier->textDocument()->setModified(true); } @@ -686,39 +691,36 @@ static bool isInNodeDefinition(int nodeTextOffset, int nodeTextLength, int curso return (nodeTextOffset <= cursorPosition) && (nodeTextOffset + nodeTextLength > cursorPosition); } -ModelNode RewriterView::nodeAtTextCursorPositionRekursive(const ModelNode &root, int cursorPosition) const +ModelNode RewriterView::nodeAtTextCursorPositionHelper(const ModelNode &root, int cursorPosition) const { - ModelNode node = root; - - int lastOffset = -1; - - bool sorted = true; + using myPair = std::pair<ModelNode,int>; + std::vector<myPair> data; - if (!root.nodeProperties().isEmpty()) - sorted = false; + for (const ModelNode &node : allModelNodes()) { + int offset = nodeOffset(node); + if (offset > 0) + data.emplace_back(std::make_pair(node, offset)); + } - foreach (const ModelNode ¤tNode, node.directSubModelNodes()) { - const int offset = nodeOffset(currentNode); + std::sort(data.begin(), data.end(), [](myPair a, myPair b) { + return a.second < b.second; + }); - if (offset < cursorPosition && offset > lastOffset) { - node = nodeAtTextCursorPositionRekursive(currentNode, cursorPosition); - lastOffset = offset; - } else { - if (sorted) - break; - } - } + ModelNode lastNode = root; - const int nodeTextLength = nodeLength(node); - const int nodeTextOffset = nodeOffset(node); + for (const myPair &pair : data) { + ModelNode node = pair.first; - if (nodeTextLength < 0) - return ModelNode(); + const int nodeTextLength = nodeLength(node); + const int nodeTextOffset = nodeOffset(node); - if (isInNodeDefinition(nodeTextOffset, nodeTextLength, cursorPosition)) - return node; + if (isInNodeDefinition(nodeTextOffset, nodeTextLength, cursorPosition)) + lastNode = node; + else if (nodeTextOffset > cursorPosition) + break; + } - return root; + return lastNode; } void RewriterView::setupCanonicalHashes() const @@ -749,7 +751,7 @@ void RewriterView::setupCanonicalHashes() const ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const { - return nodeAtTextCursorPositionRekursive(rootModelNode(), cursorPosition); + return nodeAtTextCursorPositionHelper(rootModelNode(), cursorPosition); } bool RewriterView::renameId(const QString& oldId, const QString& newId) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index c5e9b284f1..c86336d550 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -76,7 +76,8 @@ bool isSupportedAttachedProperties(const QString &propertyName) QStringList supportedVersionsList() { static const QStringList list = { - "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12" + "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", + "2.10", "2.11", "2.12", "2.13" }; return list; } diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineanimationform.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineanimationform.cpp index 7fc378f2ea..09cd8ee453 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineanimationform.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineanimationform.cpp @@ -73,8 +73,15 @@ TimelineAnimationForm::TimelineAnimationForm(QWidget *parent) connect(ui->idLineEdit, &QLineEdit::editingFinished, [this]() { QTC_ASSERT(m_timeline.isValid(), return ); + static QString lastString; + const QString newId = ui->idLineEdit->text(); + if (lastString == newId) + return; + + lastString = newId; + if (newId == animation().id()) return; diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinecontrols.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinecontrols.cpp index f2e6761821..682a14f1c7 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinecontrols.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinecontrols.cpp @@ -56,6 +56,9 @@ FloatControl::FloatControl() setValue(0.0); setButtonSymbols(QAbstractSpinBox::NoButtons); setFrame(false); +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) + setStepType(QAbstractSpinBox::AdaptiveDecimalStepType); +#endif setMinimum(std::numeric_limits<float>::lowest()); setMaximum(std::numeric_limits<float>::max()); diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineform.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineform.cpp index 4f52ecd562..3c1c3950dd 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineform.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineform.cpp @@ -52,7 +52,17 @@ TimelineForm::TimelineForm(QWidget *parent) connect(ui->expressionBindingLineEdit, &QLineEdit::editingFinished, [this]() { QTC_ASSERT(m_timeline.isValid(), return ); - if (ui->expressionBindingLineEdit->text().isEmpty()) { + + static QString lastString; + + const QString bindingText = ui->expressionBindingLineEdit->text(); + + if (bindingText == lastString) + return; + + lastString = bindingText; + + if (bindingText.isEmpty()) { ui->animation->setChecked(true); try { m_timeline.modelNode().removeProperty("currentFrame"); @@ -67,7 +77,7 @@ TimelineForm::TimelineForm(QWidget *parent) try { m_timeline.modelNode() .bindingProperty("currentFrame") - .setExpression(ui->expressionBindingLineEdit->text()); + .setExpression(bindingText); } catch (const Exception &e) { e.showException(); } @@ -76,8 +86,15 @@ TimelineForm::TimelineForm(QWidget *parent) connect(ui->idLineEdit, &QLineEdit::editingFinished, [this]() { QTC_ASSERT(m_timeline.isValid(), return ); + static QString lastString; + const QString newId = ui->idLineEdit->text(); + if (newId == lastString) + return; + + lastString = newId; + if (newId == m_timeline.modelNode().id()) return; diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.cpp index c84923f7c2..af0f26d249 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.cpp @@ -154,4 +154,9 @@ int TimelineGraphicsLayout::maximumScrollValue() const return std::round(qMax(maxr, 0.0)); } +void TimelineGraphicsLayout::activate() +{ + m_layout->activate(); +} + } // End namespace QmlDesigner. diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.h b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.h index 192682f646..d5b7c4debc 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.h +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicslayout.h @@ -72,6 +72,8 @@ public: int maximumScrollValue() const; + void activate(); + private: QGraphicsLinearLayout *m_layout = nullptr; diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp index 8ef0448207..eb09492397 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp @@ -698,6 +698,11 @@ void TimelineGraphicsScene::deleteKeyframes(const QList<ModelNode> &frames) } } +void TimelineGraphicsScene::activateLayout() +{ + m_layout->activate(); +} + void TimelineGraphicsScene::emitScrollOffsetChanged() { for (QGraphicsItem *item : items()) diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.h b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.h index 670ed06feb..b8f93595c4 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.h +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.h @@ -137,6 +137,8 @@ public: void deleteKeyframeGroup(const ModelNode &group); void deleteKeyframes(const QList<ModelNode> &frames); + void activateLayout(); + signals: void statusBarMessageChanged(const QString &message); diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp index f4cab3aa05..7cb9760a51 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp @@ -443,6 +443,7 @@ void TimelineSectionItem::invalidateHeight() setPreferredHeight(height); setMinimumHeight(height); setMaximumHeight(height); + timelineScene()->activateLayout(); } void TimelineSectionItem::invalidateProperties() diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp index c66264ffbc..653ed27ba7 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp @@ -26,6 +26,8 @@ #include "timelineview.h" #include "easingcurve.h" +#include "timelineactions.h" +#include "timelineconstants.h" #include "timelinecontext.h" #include "timelinewidget.h" @@ -33,18 +35,22 @@ #include "timelinesettingsdialog.h" #include "timelinetoolbar.h" +#include <bindingproperty.h> #include <exception.h> +#include <modelnodecontextmenu_helper.h> #include <nodeabstractproperty.h> #include <nodelistproperty.h> #include <nodemetainfo.h> #include <rewritertransaction.h> #include <variantproperty.h> #include <qmldesignericons.h> +#include <qmldesignerplugin.h> #include <qmlitemnode.h> #include <qmlobjectnode.h> #include <qmlstate.h> #include <qmltimeline.h> #include <qmltimelinekeyframegroup.h> +#include <viewmanager.h> #include <coreplugin/icore.h> @@ -55,6 +61,8 @@ #include <utils/algorithm.h> #include <utils/qtcassert.h> +#include <QTimer> + namespace QmlDesigner { TimelineView::TimelineView(QObject *parent) @@ -97,6 +105,21 @@ void TimelineView::nodeAboutToBeRemoved(const ModelNode &removedNode) m_timelineWidget->graphicsScene()->clearTimeline(); if (lastId != currentId) m_timelineWidget->setTimelineId(currentId); + } else if (removedNode.parentProperty().isValid() + && QmlTimeline::isValidQmlTimeline(removedNode.parentProperty().parentModelNode())) { + if (removedNode.hasBindingProperty("target")) { + const ModelNode target = removedNode.bindingProperty("target").resolveToModelNode(); + if (target.isValid()) { + QmlTimeline timeline(removedNode.parentProperty().parentModelNode()); + if (timeline.hasKeyframeGroupForTarget(target)) + QTimer::singleShot(0, [this, target, timeline]() { + if (timeline.hasKeyframeGroupForTarget(target)) + m_timelineWidget->graphicsScene()->invalidateSectionForTarget(target); + else + m_timelineWidget->graphicsScene()->invalidateScene(); + }); + } + } } } } @@ -110,9 +133,6 @@ void TimelineView::nodeRemoved(const ModelNode & /*removedNode*/, parentProperty.parentModelNode())) { QmlTimelineKeyframeGroup frames(parentProperty.parentModelNode()); m_timelineWidget->graphicsScene()->invalidateSectionForTarget(frames.target()); - } else if (parentProperty.isValid() - && QmlTimeline::isValidQmlTimeline(parentProperty.parentModelNode())) { - m_timelineWidget->graphicsScene()->invalidateScene(); } } @@ -471,6 +491,98 @@ QmlModelState TimelineView::stateForTimeline(const QmlTimeline &timeline) return QmlModelState(); } +void TimelineView::registerActions() +{ + auto &actionManager = QmlDesignerPlugin::instance()->viewManager().designerActionManager(); + + SelectionContextPredicate timelineEnabled = [this](const SelectionContext &context) { + return context.singleNodeIsSelected() + && widget()->graphicsScene()->currentTimeline().isValid(); + }; + + SelectionContextPredicate timelineHasKeyframes = + [this](const SelectionContext &context) { + auto timeline = widget()->graphicsScene()->currentTimeline(); + return !timeline.keyframeGroupsForTarget(context.currentSingleSelectedNode()).isEmpty(); + }; + + SelectionContextPredicate timelineHasClipboard = [](const SelectionContext &context) { + return !context.fastUpdate() && TimelineActions::clipboardContainsKeyframes(); + }; + + SelectionContextOperation deleteKeyframes = [this](const SelectionContext &context) { + auto mutator = widget()->graphicsScene()->currentTimeline(); + if (mutator.isValid()) + TimelineActions::deleteAllKeyframesForTarget(context.currentSingleSelectedNode(), + mutator); + }; + + SelectionContextOperation insertKeyframes = [this](const SelectionContext &context) { + auto mutator = widget()->graphicsScene()->currentTimeline(); + if (mutator.isValid()) + TimelineActions::insertAllKeyframesForTarget(context.currentSingleSelectedNode(), + mutator); + }; + + SelectionContextOperation copyKeyframes = [this](const SelectionContext &context) { + auto mutator = widget()->graphicsScene()->currentTimeline(); + if (mutator.isValid()) + TimelineActions::copyAllKeyframesForTarget(context.currentSingleSelectedNode(), mutator); + }; + + SelectionContextOperation pasteKeyframes = [this](const SelectionContext &context) { + auto mutator = widget()->graphicsScene()->currentTimeline(); + if (mutator.isValid()) + TimelineActions::pasteKeyframesToTarget(context.currentSingleSelectedNode(), mutator); + }; + + actionManager.addDesignerAction(new ActionGroup(TimelineConstants::timelineCategoryDisplayName, + TimelineConstants::timelineCategory, + TimelineConstants::priorityTimelineCategory, + timelineEnabled, + &SelectionContextFunctors::always)); + + actionManager.addDesignerAction( + new ModelNodeContextMenuAction("commandId timeline delete", + TimelineConstants::timelineDeleteKeyframesDisplayName, + {}, + TimelineConstants::timelineCategory, + QKeySequence(), + 160, + deleteKeyframes, + timelineHasKeyframes)); + + actionManager.addDesignerAction( + new ModelNodeContextMenuAction("commandId timeline insert", + TimelineConstants::timelineInsertKeyframesDisplayName, + {}, + TimelineConstants::timelineCategory, + QKeySequence(), + 140, + insertKeyframes, + timelineHasKeyframes)); + + actionManager.addDesignerAction( + new ModelNodeContextMenuAction("commandId timeline copy", + TimelineConstants::timelineCopyKeyframesDisplayName, + {}, + TimelineConstants::timelineCategory, + QKeySequence(), + 120, + copyKeyframes, + timelineHasKeyframes)); + + actionManager.addDesignerAction( + new ModelNodeContextMenuAction("commandId timeline paste", + TimelineConstants::timelinePasteKeyframesDisplayName, + {}, + TimelineConstants::timelineCategory, + QKeySequence(), + 100, + pasteKeyframes, + timelineHasClipboard)); +} + TimelineWidget *TimelineView::createWidget() { if (!m_timelineWidget) diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.h b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.h index 14a49185a4..057ff3047b 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.h +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.h @@ -88,6 +88,8 @@ public: QmlTimeline timelineForState(const ModelNode &state) const; QmlModelState stateForTimeline(const QmlTimeline &timeline); + void registerActions(); + private: TimelineWidget *createWidget(); TimelineWidget *m_timelineWidget = nullptr; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 84b95cccc3..42fd9fbefa 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -194,8 +194,12 @@ bool QmlDesignerPlugin::delayedInitialize() d->settings.fromSettings(Core::ICore::settings()); d->viewManager.registerViewTakingOwnership(new QmlDesigner::Internal::ConnectionView); - if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool()) - d->viewManager.registerViewTakingOwnership(new QmlDesigner::TimelineView); + if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool()) { + auto timelineView = new QmlDesigner::TimelineView; + d->viewManager.registerViewTakingOwnership(timelineView); + timelineView->registerActions(); + } + d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::SourceTool); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::ColorTool); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::TextTool); diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 0995256d5f..c52be65ad5 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -343,6 +343,12 @@ QSet<Id> BaseQtVersion::availableFeatures() const if (qtVersion().matches(5, 12)) return features; + features.unite(versionedIds(Constants::FEATURE_QT_QUICK_PREFIX, 2, 13)); + features.unite(versionedIds(Constants::FEATURE_QT_QUICK_CONTROLS_2_PREFIX, 2, 13)); + + if (qtVersion().matches(5, 13)) + return features; + return features; } diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp index fd98b62bba..a4fc9cbdd4 100644 --- a/src/plugins/vcsbase/vcsoutputwindow.cpp +++ b/src/plugins/vcsbase/vcsoutputwindow.cpp @@ -243,6 +243,8 @@ void OutputWindowPlainTextEdit::appendLinesWithStyle(const QString &s, void OutputWindowPlainTextEdit::setFormat(VcsOutputWindow::MessageStyle style) { + m_formatter->setBoldFontEnabled(style == VcsOutputWindow::Command); + switch (style) { case VcsOutputWindow::Warning: m_format = LogMessageFormat; diff --git a/src/plugins/vcsbase/vcsoutputwindow.h b/src/plugins/vcsbase/vcsoutputwindow.h index f705dedf4d..f87a5309c5 100644 --- a/src/plugins/vcsbase/vcsoutputwindow.h +++ b/src/plugins/vcsbase/vcsoutputwindow.h @@ -74,7 +74,7 @@ public: None, Error, // Red error text Warning, // Dark yellow warning text - Command, // A bold command with timetamp "10:00 " + "Executing: vcs -diff" + Command, // A bold command with timestamp "10:00 " + "Executing: vcs -diff" Message, // A blue message text (e.g. "command has finished successfully") }; |