From f6ec8c334258dd04306c20a7db6ae357fa261209 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sat, 8 Jun 2013 23:39:21 +0300 Subject: [PATCH] DocumentManager: Support expect/unexpect directory changes Change-Id: I68b69fa00dd6cc189ecfcdb9dfad09c41531883f Reviewed-by: David Schulz --- src/plugins/coreplugin/documentmanager.cpp | 55 +++++++++++++++++++++- src/plugins/coreplugin/documentmanager.h | 4 ++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/documentmanager.cpp b/src/plugins/coreplugin/documentmanager.cpp index 540e2fa7d2b..03628535986 100644 --- a/src/plugins/coreplugin/documentmanager.cpp +++ b/src/plugins/coreplugin/documentmanager.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -156,6 +157,7 @@ struct DocumentManagerPrivate QString m_projectsDirectory; bool m_useProjectsDirectory; QString m_buildDirectory; + QSet m_expectedDirectories; // When we are callling into a IDocument // we don't want to receive a changed() // signal @@ -547,6 +549,46 @@ void DocumentManager::unexpectFileChange(const QString &fileName) updateExpectedState(fixedResolvedName); } +static QString dirWithTrailingSlash(const QString &directory) +{ + static const QChar slash(QLatin1Char('/')); + return directory.endsWith(slash) ? directory : directory + slash; +} + +/*! + * Any subsequent change to any file inside \a directory is treated as + * an expected file change. + * + * \see DocumentManager::unexpectDirectoryChange(const QString &directory) + */ +void DocumentManager::expectDirectoryChange(const QString &directory) +{ + QTC_ASSERT(!directory.isEmpty(), return); + d->m_expectedDirectories.insert(dirWithTrailingSlash(directory)); +} + +/*! + * Any subsequent change to any file inside \a directory is unexpected again. + * + * \see DocumentManager::expectDirectoryChange(const QString &directory) + */ +void DocumentManager::unexpectDirectoryChange(const QString &directory) +{ + QTimer *timer = new QTimer; + timer->setProperty("directory", QString(dirWithTrailingSlash(directory))); + connect(timer, SIGNAL(timeout()), instance(), SLOT(clearExpectedDirectory())); + timer->setSingleShot(true); + timer->start(300); +} + + +void DocumentManager::clearExpectedDirectory() +{ + if (QTimer *timer = qobject_cast(sender())) { + d->m_expectedDirectories.remove(timer->property("directory").toString()); + timer->deleteLater(); + } +} /*! Tries to save the files listed in \a documents. The \a cancelled argument is set to true @@ -903,9 +945,18 @@ void DocumentManager::checkForReload() continue; // was the change unexpected? - if ((currentState.modified != expectedState.modified || currentState.permissions != expectedState.permissions) + if ((currentState.modified != expectedState.modified + || currentState.permissions != expectedState.permissions) && !expectedFileNames.contains(fileName)) { - trigger = IDocument::TriggerExternal; + bool expectedDir = false; + foreach (const QString &expectedDirectory, d->m_expectedDirectories) { + if (fileName.startsWith(expectedDirectory)) { + expectedDir = true; + break; + } + } + if (!expectedDir) + trigger = IDocument::TriggerExternal; } // find out the type diff --git a/src/plugins/coreplugin/documentmanager.h b/src/plugins/coreplugin/documentmanager.h index 7f294244be2..2eef97b8e4c 100644 --- a/src/plugins/coreplugin/documentmanager.h +++ b/src/plugins/coreplugin/documentmanager.h @@ -74,6 +74,9 @@ public: static void expectFileChange(const QString &fileName); static void unexpectFileChange(const QString &fileName); + static void expectDirectoryChange(const QString &directory); + static void unexpectDirectoryChange(const QString &directory); + // recent files static void addToRecentFiles(const QString &fileName, const Id &editorId = Id()); Q_SLOT void clearRecentFiles(); @@ -150,6 +153,7 @@ private slots: void changedFile(const QString &file); void mainWindowActivated(); void syncWithEditor(const QList &context); + void clearExpectedDirectory(); }; /*! The FileChangeBlocker blocks all change notifications to all IDocument * that