diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 59e2da87b84..de4d72c9823 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -324,7 +324,7 @@ QmakePriFileNode::~QmakePriFileNode() void QmakePriFileNode::scheduleUpdate() { QtSupport::ProFileCacheManager::instance()->discardFile(m_projectFilePath); - m_qmakeProFileNode->scheduleUpdate(); + m_qmakeProFileNode->scheduleUpdate(QmakeProFileNode::ParseLater); } namespace Internal { @@ -1732,10 +1732,10 @@ bool QmakeProFileNode::parseInProgress() const return m_parseInProgress; } -void QmakeProFileNode::scheduleUpdate() +void QmakeProFileNode::scheduleUpdate(QmakeProFileNode::AsyncUpdateDelay delay) { setParseInProgressRecursive(true); - m_project->scheduleAsyncUpdate(this); + m_project->scheduleAsyncUpdate(this, delay); } void QmakeProFileNode::asyncUpdate() diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.h b/src/plugins/qmakeprojectmanager/qmakenodes.h index 461446f1b7b..2acbce65320 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.h +++ b/src/plugins/qmakeprojectmanager/qmakenodes.h @@ -418,7 +418,8 @@ public: bool isDeployable() const; QString resolvedMkspecPath() const; - void scheduleUpdate(); + enum AsyncUpdateDelay { ParseNow, ParseLater }; + void scheduleUpdate(AsyncUpdateDelay delay); bool validParse() const; bool parseInProgress() const; diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 625e83e5971..d2c2cc8e8d2 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -358,7 +358,7 @@ QmakeProject::QmakeProject(QmakeManager *manager, const QString &fileName) : setRequiredKitMatcher(QtSupport::QtKitInformation::qtVersionMatcher()); m_asyncUpdateTimer.setSingleShot(true); - m_asyncUpdateTimer.setInterval(0); // will be increased after first parse + m_asyncUpdateTimer.setInterval(3000); connect(&m_asyncUpdateTimer, SIGNAL(timeout()), this, SLOT(asyncUpdate())); connect(BuildManager::instance(), SIGNAL(buildQueueFinished(bool)), @@ -430,7 +430,7 @@ bool QmakeProject::fromMap(const QVariantMap &map) connect(this, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)), this, SLOT(activeTargetWasChanged())); - scheduleAsyncUpdate(); + scheduleAsyncUpdate(QmakeProFileNode::ParseNow); return true; } @@ -665,7 +665,7 @@ void QmakeProject::updateRunConfigurations() activeTarget()->updateDefaultRunConfigurations(); } -void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode *node) +void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode *node, QmakeProFileNode::AsyncUpdateDelay delay) { if (m_asyncUpdateState == ShuttingDown) return; @@ -688,7 +688,7 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode *node) // Just postpone if (debug) qDebug()<<" full update pending, restarting timer"; - m_asyncUpdateTimer.start(); + startAsyncTimer(delay); } else if (m_asyncUpdateState == AsyncPartialUpdatePending || m_asyncUpdateState == Base) { if (debug) @@ -717,11 +717,12 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode *node) if (add) m_partialEvaluate.append(node); - // and start the timer anew - m_asyncUpdateTimer.start(); // Cancel running code model update m_codeModelFuture.cancel(); + + startAsyncTimer(delay); + } else if (m_asyncUpdateState == AsyncUpdateInProgress) { // A update is in progress // And this slot only gets called if a file changed on disc @@ -732,11 +733,11 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode *node) // even if that's not really needed if (debug) qDebug()<<" Async update in progress, scheduling new one afterwards"; - scheduleAsyncUpdate(); + scheduleAsyncUpdate(delay); } } -void QmakeProject::scheduleAsyncUpdate() +void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode::AsyncUpdateDelay delay) { if (debug) qDebug()<<"scheduleAsyncUpdate"; @@ -765,12 +766,18 @@ void QmakeProject::scheduleAsyncUpdate() enableActiveQmakeBuildConfiguration(activeTarget(), false); m_rootProjectNode->setParseInProgressRecursive(true); m_asyncUpdateState = AsyncFullUpdatePending; - m_asyncUpdateTimer.start(); // Cancel running code model update m_codeModelFuture.cancel(); + startAsyncTimer(delay); } +void QmakeProject::startAsyncTimer(QmakeProFileNode::AsyncUpdateDelay delay) +{ + m_asyncUpdateTimer.stop(); + m_asyncUpdateTimer.setInterval(qMin(m_asyncUpdateTimer.interval(), delay == QmakeProFileNode::ParseLater ? 3000 : 0)); + m_asyncUpdateTimer.start(); +} void QmakeProject::incrementPendingEvaluateFutures() { @@ -806,7 +813,7 @@ void QmakeProject::decrementPendingEvaluateFutures() if (m_asyncUpdateState == AsyncFullUpdatePending || m_asyncUpdateState == AsyncPartialUpdatePending) { if (debug) qDebug()<<" Oh update is pending start the timer"; - m_asyncUpdateTimer.start(); + startAsyncTimer(QmakeProFileNode::ParseLater); } else if (m_asyncUpdateState != ShuttingDown){ // After being done, we need to call: m_asyncUpdateState = Base; @@ -1190,7 +1197,7 @@ void QmakeProject::notifyChanged(const QString &name) findProFile(name, rootQmakeProjectNode(), list); foreach (QmakeProFileNode *node, list) { QtSupport::ProFileCacheManager::instance()->discardFile(name); - node->scheduleUpdate(); + node->scheduleUpdate(QmakeProFileNode::ParseNow); } } } diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h index 92457e383d5..103dd6983ac 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.h +++ b/src/plugins/qmakeprojectmanager/qmakeproject.h @@ -108,7 +108,8 @@ public: void destroyProFileReader(QtSupport::ProFileReader *reader); /// \internal - void scheduleAsyncUpdate(QmakeProjectManager::QmakeProFileNode *node); + void scheduleAsyncUpdate(QmakeProjectManager::QmakeProFileNode *node, + QmakeProFileNode::AsyncUpdateDelay delay = QmakeProFileNode::ParseLater); /// \internal void incrementPendingEvaluateFutures(); /// \internal @@ -146,7 +147,7 @@ signals: void proFilesEvaluated(); public slots: - void scheduleAsyncUpdate(); + void scheduleAsyncUpdate(QmakeProFileNode::AsyncUpdateDelay delay = QmakeProFileNode::ParseLater); protected: bool fromMap(const QVariantMap &map); @@ -177,6 +178,7 @@ private: ProjectExplorer::DeploymentData &deploymentData); void collectLibraryData(const QmakeProFileNode *node, ProjectExplorer::DeploymentData &deploymentData); + void startAsyncTimer(QmakeProFileNode::AsyncUpdateDelay delay); bool matchesKit(const ProjectExplorer::Kit *kit); QmakeManager *m_manager;