diff --git a/kdevplatform/interfaces/iproject.h b/kdevplatform/interfaces/iproject.h --- a/kdevplatform/interfaces/iproject.h +++ b/kdevplatform/interfaces/iproject.h @@ -159,6 +159,13 @@ */ virtual void setReloadJob(KJob* job) = 0; + /** + * @brief Tells the project to prepare for the reload of the moodel + * + * It's useful so that we can disconnect some slots, like the file watcher. + */ + virtual void prepareReloadModel() = 0; + Q_SIGNALS: /** * Gets emitted whenever a file was added to the project. diff --git a/kdevplatform/project/abstractfilemanagerplugin.h b/kdevplatform/project/abstractfilemanagerplugin.h --- a/kdevplatform/project/abstractfilemanagerplugin.h +++ b/kdevplatform/project/abstractfilemanagerplugin.h @@ -66,6 +66,7 @@ QList parse( ProjectFolderItem *item ) override; ProjectFolderItem *import( IProject *project ) override; + void prepareReload(IProject *project) override; bool reload(ProjectFolderItem* item) override; KJob* createImportJob(ProjectFolderItem* item) override; diff --git a/kdevplatform/project/abstractfilemanagerplugin.cpp b/kdevplatform/project/abstractfilemanagerplugin.cpp --- a/kdevplatform/project/abstractfilemanagerplugin.cpp +++ b/kdevplatform/project/abstractfilemanagerplugin.cpp @@ -479,6 +479,14 @@ return QList(); } +void AbstractFileManagerPlugin::prepareReload(IProject *project) +{ + if(project != nullptr && d->m_watchers.contains(project)) + { + d->m_watchers[project]->disconnect(); + } +} + ProjectFolderItem *AbstractFileManagerPlugin::import( IProject *project ) { ProjectFolderItem *projectRoot = createFolderItem( project, project->path(), nullptr ); diff --git a/kdevplatform/project/interfaces/iprojectfilemanager.h b/kdevplatform/project/interfaces/iprojectfilemanager.h --- a/kdevplatform/project/interfaces/iprojectfilemanager.h +++ b/kdevplatform/project/interfaces/iprojectfilemanager.h @@ -84,6 +84,11 @@ */ virtual ProjectFolderItem *import(IProject *project) = 0; + /** + * This method prepares the reload of a model, e.g. disconnects the file watcher slots + */ + virtual void prepareReload(IProject *project) = 0; + /** * @brief This method creates an import job for the given @p item * diff --git a/kdevplatform/shell/project.h b/kdevplatform/shell/project.h --- a/kdevplatform/shell/project.h +++ b/kdevplatform/shell/project.h @@ -68,6 +68,7 @@ QString projectTempFile() const; QString developerTempFile() const; Path developerFile() const; + void prepareReloadModel() override; void reloadModel() override; Path projectFile() const override; KSharedConfigPtr projectConfiguration() const override; diff --git a/kdevplatform/shell/project.cpp b/kdevplatform/shell/project.cpp --- a/kdevplatform/shell/project.cpp +++ b/kdevplatform/shell/project.cpp @@ -452,6 +452,11 @@ return d->projectPath; } +void Project::prepareReloadModel() +{ + projectFileManager()->prepareReload(d->project); +} + void Project::reloadModel() { if (d->loading) { diff --git a/kdevplatform/shell/tests/test_projectcontroller.cpp b/kdevplatform/shell/tests/test_projectcontroller.cpp --- a/kdevplatform/shell/tests/test_projectcontroller.cpp +++ b/kdevplatform/shell/tests/test_projectcontroller.cpp @@ -125,6 +125,7 @@ return it; } + virtual void prepareReload(IProject* /*project*/) override {}; ProjectFolderItem* addFolder(const Path& /*folder*/, ProjectFolderItem* /*parent*/) override { return nullptr; } ProjectFileItem* addFile(const Path& /*file*/, ProjectFolderItem* /*parent*/) override { return nullptr; } bool removeFilesAndFolders(const QList &/*items*/) override { return false; } diff --git a/kdevplatform/tests/testproject.h b/kdevplatform/tests/testproject.h --- a/kdevplatform/tests/testproject.h +++ b/kdevplatform/tests/testproject.h @@ -74,6 +74,7 @@ QString name() const override { return QStringLiteral("Test Project"); } bool inProject(const IndexedString& path) const override; void setReloadJob(KJob* ) override {} + void prepareReloadModel() override {} private: QSet m_fileSet; Path m_path; diff --git a/plugins/cmake/settings/cmakepreferences.cpp b/plugins/cmake/settings/cmakepreferences.cpp --- a/plugins/cmake/settings/cmakepreferences.cpp +++ b/plugins/cmake/settings/cmakepreferences.cpp @@ -377,6 +377,7 @@ connect(job, &KJob::finished, this, &CMakePreferences::cacheUpdated); } + m_project->prepareReloadModel(); connect(job, &KJob::finished, m_project, &IProject::reloadModel); ICore::self()->runController()->registerJob(job); }