From f8959aa759b337919cd482555b090a7bdfe2c29a Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 7 Jun 2010 21:25:11 +0200 Subject: [PATCH 01/32] hide includes from within feature files this fixes the recent appearance of qt_webkit_version.pri in all qt 4.7 based projects. in fact, the patch does somewhat more: it makes the evaluator provide the information to the higher layers which is necessary for a truly hierarchical display of includes. TBD later. Reviewed-by: dt Task-number: QTCREATORBUG-1590 --- .../qt4projectmanager/profilereader.cpp | 15 ++++++-- src/plugins/qt4projectmanager/profilereader.h | 4 +- src/shared/proparser/profileevaluator.cpp | 37 +++++++++++-------- src/shared/proparser/profileevaluator.h | 4 +- 4 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/plugins/qt4projectmanager/profilereader.cpp b/src/plugins/qt4projectmanager/profilereader.cpp index 3781fc37d05..ecd53ee51c8 100644 --- a/src/plugins/qt4projectmanager/profilereader.cpp +++ b/src/plugins/qt4projectmanager/profilereader.cpp @@ -48,7 +48,8 @@ ProFileReader::~ProFileReader() bool ProFileReader::readProFile(const QString &fileName) { if (ProFile *pro = parsedProFile(fileName)) { - aboutToEval(pro); + m_ignoreLevel = 0; + aboutToEval(0, pro, EvalIncludeFile); bool ok = accept(pro); pro->deref(); return ok; @@ -56,15 +57,23 @@ bool ProFileReader::readProFile(const QString &fileName) return false; } -void ProFileReader::aboutToEval(ProFile *pro) +void ProFileReader::aboutToEval(ProFile *, ProFile *pro, EvalFileType type) { - if (!m_includeFiles.contains(pro->fileName())) { + if (m_ignoreLevel || type == EvalFeatureFile) { + m_ignoreLevel++; + } else if (!m_includeFiles.contains(pro->fileName())) { m_includeFiles.insert(pro->fileName(), pro); m_proFiles.append(pro); pro->ref(); } } +void ProFileReader::doneWithEval(ProFile *) +{ + if (m_ignoreLevel) + m_ignoreLevel--; +} + QList ProFileReader::includeFiles() const { QString qmakeMkSpecDir = QFileInfo(propertyValue("QMAKE_MKSPECS")).absoluteFilePath(); diff --git a/src/plugins/qt4projectmanager/profilereader.h b/src/plugins/qt4projectmanager/profilereader.h index b749bc3e569..1019be7870a 100644 --- a/src/plugins/qt4projectmanager/profilereader.h +++ b/src/plugins/qt4projectmanager/profilereader.h @@ -58,7 +58,8 @@ signals: void errorFound(const QString &error); private: - virtual void aboutToEval(ProFile *proFile); + virtual void aboutToEval(ProFile *parent, ProFile *proFile, EvalFileType type); + virtual void doneWithEval(ProFile *parent); virtual void logMessage(const QString &msg); virtual void fileMessage(const QString &msg); virtual void errorMessage(const QString &msg); @@ -66,6 +67,7 @@ private: private: QMap m_includeFiles; QList m_proFiles; + int m_ignoreLevel; }; class ProFileCacheManager : public QObject diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index b4788904b0d..2da92571166 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -260,6 +260,7 @@ public: ProItem::ProItemReturn evaluateConditionalFunction(const QString &function, const QString &arguments); ProFile *parsedProFile(const QString &fileName, bool cache, const QString &contents = QString()); + bool evaluateFileDirect(const QString &fileName, ProFileEvaluator::EvalFileType type); bool evaluateFile(const QString &fileName); bool evaluateFeatureFile(const QString &fileName, QHash *values = 0, FunctionDefs *defs = 0); @@ -3120,6 +3121,20 @@ ProFile *ProFileEvaluator::Private::parsedProFile(const QString &fileName, bool return pro; } +bool ProFileEvaluator::Private::evaluateFileDirect( + const QString &fileName, ProFileEvaluator::EvalFileType type) +{ + if (ProFile *pro = parsedProFile(fileName, true)) { + q->aboutToEval(currentProFile(), pro, type); + bool ok = (visitProFile(pro) == ProItem::ReturnTrue); + q->doneWithEval(currentProFile()); + pro->deref(); + return ok; + } else { + return false; + } +} + bool ProFileEvaluator::Private::evaluateFile(const QString &fileName) { if (fileName.isEmpty()) @@ -3129,14 +3144,7 @@ bool ProFileEvaluator::Private::evaluateFile(const QString &fileName) errorMessage(format("circular inclusion of %1").arg(fileName)); return false; } - if (ProFile *pro = parsedProFile(fileName, true)) { - q->aboutToEval(pro); - bool ok = (visitProFile(pro) == ProItem::ReturnTrue); - pro->deref(); - return ok; - } else { - return false; - } + return evaluateFileDirect(fileName, ProFileEvaluator::EvalIncludeFile); } bool ProFileEvaluator::Private::evaluateFeatureFile( @@ -3183,13 +3191,8 @@ bool ProFileEvaluator::Private::evaluateFeatureFile( bool cumulative = m_cumulative; m_cumulative = false; - // Don't use evaluateFile() here to avoid calling aboutToEval(). // The path is fully normalized already. - bool ok = false; - if (ProFile *pro = parsedProFile(fn, true)) { - ok = (visitProFile(pro) == ProItem::ReturnTrue); - pro->deref(); - } + bool ok = evaluateFileDirect(fn, ProFileEvaluator::EvalFeatureFile); m_cumulative = cumulative; return ok; @@ -3371,7 +3374,11 @@ QString ProFileEvaluator::propertyValue(const QString &name) const return d->propertyValue(name); } -void ProFileEvaluator::aboutToEval(ProFile *) +void ProFileEvaluator::aboutToEval(ProFile *, ProFile *, EvalFileType) +{ +} + +void ProFileEvaluator::doneWithEval(ProFile *) { } diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h index 57df396d5a0..d8202b65f78 100644 --- a/src/shared/proparser/profileevaluator.h +++ b/src/shared/proparser/profileevaluator.h @@ -94,7 +94,9 @@ public: QString propertyValue(const QString &val) const; // for our descendents - virtual void aboutToEval(ProFile *proFile); // only .pri, but not .prf. or .pro + enum EvalFileType { EvalFeatureFile, EvalIncludeFile }; + virtual void aboutToEval(ProFile *parent, ProFile *proFile, EvalFileType type); + virtual void doneWithEval(ProFile *parent); virtual void logMessage(const QString &msg); virtual void errorMessage(const QString &msg); // .pro parse errors virtual void fileMessage(const QString &msg); // error() and message() from .pro file From 4ae5d6269951b85efcb95a179bac33687601fb0b Mon Sep 17 00:00:00 2001 From: mae Date: Tue, 8 Jun 2010 12:52:07 +0200 Subject: [PATCH 02/32] Fix PropertyAction snippet Reviewed-by: thorbjorn --- share/qtcreator/snippets/qml.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/snippets/qml.xml b/share/qtcreator/snippets/qml.xml index cc81a722493..07d4a616bfe 100644 --- a/share/qtcreator/snippets/qml.xml +++ b/share/qtcreator/snippets/qml.xml @@ -76,7 +76,7 @@ PropertyAction { targets: [name]; properties: "name" } -PropertyAction { target: "name"; property: "name"; value: value } +PropertyAction { target: name; property: "name"; value: value } PauseAnimation { duration: 200 } From 716b3008ee9063e3e3e4e1791fbc155cfa3ea73f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Mon, 7 Jun 2010 15:10:36 +0200 Subject: [PATCH 03/32] Removed no longer used code Reviewed-by: mae --- src/plugins/cppeditor/cppeditor.cpp | 44 ----------------------------- src/plugins/cppeditor/cppeditor.h | 9 ------ 2 files changed, 53 deletions(-) diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 39acd23ba33..d7f0aaa77b8 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -710,50 +710,6 @@ void CPPEditor::createToolBar(CPPEditorEditable *editable) static_cast(w->layout())->insertWidget(0, m_methodCombo, 1); } -void CPPEditor::inAllRenameSelections(EditOperation operation, - const QTextEdit::ExtraSelection ¤tRenameSelection, - QTextCursor cursor, - const QString &text) -{ - cursor.beginEditBlock(); - - const int startOffset = cursor.selectionStart() - currentRenameSelection.cursor.anchor(); - const int endOffset = cursor.selectionEnd() - currentRenameSelection.cursor.anchor(); - const int length = endOffset - startOffset; - - for (int i = 0; i < m_renameSelections.size(); ++i) { - QTextEdit::ExtraSelection &s = m_renameSelections[i]; - int pos = s.cursor.anchor(); - int endPos = s.cursor.position(); - - s.cursor.setPosition(pos + startOffset); - s.cursor.setPosition(pos + endOffset, QTextCursor::KeepAnchor); - - switch (operation) { - case DeletePreviousChar: - s.cursor.deletePreviousChar(); - endPos -= qMax(1, length); - break; - case DeleteChar: - s.cursor.deleteChar(); - endPos -= qMax(1, length); - break; - case InsertText: - s.cursor.insertText(text); - endPos += text.length() - length; - break; - } - - s.cursor.setPosition(pos); - s.cursor.setPosition(endPos, QTextCursor::KeepAnchor); - } - - cursor.endEditBlock(); - - setExtraSelections(CodeSemanticsSelection, m_renameSelections); - setTextCursor(cursor); -} - void CPPEditor::paste() { if (m_currentRenameSelection == -1) { diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index 8ab0ab0c6b3..b922434117a 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -266,15 +266,6 @@ private: void createToolBar(CPPEditorEditable *editable); - enum EditOperation { - DeleteChar, - DeletePreviousChar, - InsertText - }; - void inAllRenameSelections(EditOperation operation, - const QTextEdit::ExtraSelection ¤tRenameSelection, - QTextCursor cursor, - const QString &text = QString()); void startRename(); void finishRename(); void abortRename(); From fa382022e02018de96863b60141d07fc0427dc48 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 8 Jun 2010 13:57:28 +0200 Subject: [PATCH 04/32] Fix uic warning. --- src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui b/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui index 9f03d493557..616c897e0f7 100644 --- a/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui +++ b/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui @@ -62,7 +62,6 @@ - From 72c74b7d5aaaf24f084ed81fcf58f59387983515 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Tue, 8 Jun 2010 13:55:50 +0200 Subject: [PATCH 05/32] Bug fix: Late crash when closing Creator while building debugging helper (QTCREATORBUG-1576). Reviewed-by: hjk --- src/plugins/coreplugin/coreimpl.cpp | 5 +++++ src/plugins/coreplugin/coreimpl.h | 2 +- src/plugins/projectexplorer/debugginghelper.cpp | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/coreimpl.cpp b/src/plugins/coreplugin/coreimpl.cpp index c6da6362d44..d072e8df091 100644 --- a/src/plugins/coreplugin/coreimpl.cpp +++ b/src/plugins/coreplugin/coreimpl.cpp @@ -61,6 +61,11 @@ CoreImpl::CoreImpl(MainWindow *mainwindow) m_mainwindow = mainwindow; } +CoreImpl::~CoreImpl() +{ + m_instance = 0; +} + QStringList CoreImpl::showNewItemDialog(const QString &title, const QList &wizards, const QString &defaultLocation) diff --git a/src/plugins/coreplugin/coreimpl.h b/src/plugins/coreplugin/coreimpl.h index d04defd3181..50a8a673fbd 100644 --- a/src/plugins/coreplugin/coreimpl.h +++ b/src/plugins/coreplugin/coreimpl.h @@ -42,7 +42,7 @@ class CoreImpl : public ICore public: CoreImpl(MainWindow *mainwindow); - ~CoreImpl() {} + ~CoreImpl(); QStringList showNewItemDialog(const QString &title, const QList &wizards, diff --git a/src/plugins/projectexplorer/debugginghelper.cpp b/src/plugins/projectexplorer/debugginghelper.cpp index 495996e4506..9c091557c01 100644 --- a/src/plugins/projectexplorer/debugginghelper.cpp +++ b/src/plugins/projectexplorer/debugginghelper.cpp @@ -113,6 +113,8 @@ QStringList DebuggingHelperLibrary::debuggingHelperLibraryLocationsByInstallData QString DebuggingHelperLibrary::debuggingHelperLibraryByInstallData(const QString &qtInstallData) { + if (!Core::ICore::instance()) + return QString(); const QString dumperSourcePath = Core::ICore::instance()->resourcePath() + QLatin1String("/gdbmacros/"); QDateTime lastModified = QFileInfo(dumperSourcePath + "gdbmacros.cpp").lastModified(); // We pretend that the lastmodified of gdbmacros.cpp is 5 minutes before what the file system says From 2068792c86d3a03a46024befb86009dff954c83e Mon Sep 17 00:00:00 2001 From: dt Date: Mon, 7 Jun 2010 17:22:16 +0200 Subject: [PATCH 06/32] Don't remove directories that were added multiple times --- src/plugins/projectexplorer/gnumakeparser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp index 92025f3ff3a..62fe2b107d3 100644 --- a/src/plugins/projectexplorer/gnumakeparser.cpp +++ b/src/plugins/projectexplorer/gnumakeparser.cpp @@ -110,14 +110,14 @@ void GnuMakeParser::stdError(const QString &line) void GnuMakeParser::addDirectory(const QString &dir) { - if (dir.isEmpty() || m_directories.contains(dir)) + if (dir.isEmpty()) return; m_directories.append(dir); } void GnuMakeParser::removeDirectory(const QString &dir) { - m_directories.removeAll(dir); + m_directories.removeOne(dir); } void GnuMakeParser::taskAdded(const Task &task) From fc67c5ca81700b0e16a99dc6418a5b6d17b8264d Mon Sep 17 00:00:00 2001 From: dt Date: Mon, 7 Jun 2010 17:27:24 +0200 Subject: [PATCH 07/32] Disconnect the output parser on taking it out of the chain Reviewed-By: hunger --- src/plugins/projectexplorer/ioutputparser.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp index 0974c661b4b..6cf1a4da5fe 100644 --- a/src/plugins/projectexplorer/ioutputparser.cpp +++ b/src/plugins/projectexplorer/ioutputparser.cpp @@ -59,6 +59,10 @@ void IOutputParser::appendOutputParser(IOutputParser *parser) IOutputParser *IOutputParser::takeOutputParserChain() { IOutputParser *parser = m_parser; + disconnect(parser, SIGNAL(addOutput(QString)), + this, SLOT(outputAdded(QString))); + disconnect(parser, SIGNAL(addTask(ProjectExplorer::Task)), + this, SLOT(taskAdded(ProjectExplorer::Task))); m_parser = 0; return parser; } From d807b14c85b37db1388d78a3c2679d84519cb882 Mon Sep 17 00:00:00 2001 From: dt Date: Tue, 8 Jun 2010 11:57:50 +0200 Subject: [PATCH 08/32] Make TaskModel 2.5x faster --- src/plugins/projectexplorer/taskwindow.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index fb289419386..77dcd19a8c3 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -250,9 +250,13 @@ void TaskModel::addTask(const Task &task) { Q_ASSERT(m_categories.keys().contains(task.category)); - QList tasksInCategory = m_tasksInCategory.value(task.category); - tasksInCategory.append(task); - m_tasksInCategory.insert(task.category, tasksInCategory); + if (m_tasksInCategory.contains(task.category)) { + m_tasksInCategory[task.category].append(task); + } else { + QList temp; + temp.append(task); + m_tasksInCategory.insert(task.category, temp); + } beginInsertRows(QModelIndex(), m_tasks.size(), m_tasks.size()); m_tasks.append(task); From 181cecbb32b7c4210f8a4906e7d731cd18a5429c Mon Sep 17 00:00:00 2001 From: dt Date: Tue, 8 Jun 2010 15:04:42 +0200 Subject: [PATCH 09/32] Port the compile output window away from HTML to QTextCharFormat Is more then twice as fast --- .../projectexplorer/abstractprocessstep.cpp | 43 +++++++++++++------ .../projectexplorer/abstractprocessstep.h | 2 +- src/plugins/projectexplorer/buildmanager.cpp | 38 +++++++++------- src/plugins/projectexplorer/buildmanager.h | 2 +- src/plugins/projectexplorer/buildstep.h | 4 +- .../projectexplorer/compileoutputwindow.cpp | 13 +++++- .../projectexplorer/compileoutputwindow.h | 4 +- src/plugins/projectexplorer/ioutputparser.cpp | 12 +++--- src/plugins/projectexplorer/ioutputparser.h | 4 +- .../projectexplorer/outputparser_test.cpp | 5 ++- .../projectexplorer/outputparser_test.h | 2 +- src/plugins/qt4projectmanager/makestep.cpp | 5 ++- src/plugins/qt4projectmanager/qmakestep.cpp | 8 +++- .../qt-maemo/maemopackagecreationstep.cpp | 11 +++-- 14 files changed, 98 insertions(+), 55 deletions(-) diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index 55d94dd474e..a6d5c13bd9f 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -82,8 +82,8 @@ void AbstractProcessStep::setOutputParser(ProjectExplorer::IOutputParser *parser m_outputParserChain = parser; if (m_outputParserChain) { - connect(parser, SIGNAL(addOutput(QString)), - this, SLOT(outputAdded(QString))); + connect(parser, SIGNAL(addOutput(QString, QTextCharFormat)), + this, SLOT(outputAdded(QString, QTextCharFormat))); connect(parser, SIGNAL(addTask(ProjectExplorer::Task)), this, SLOT(taskAdded(ProjectExplorer::Task))); } @@ -199,22 +199,34 @@ void AbstractProcessStep::run(QFutureInterface &fi) void AbstractProcessStep::processStarted() { - emit addOutput(tr("Starting: \"%1\" %2\n").arg(m_command, Qt::escape(m_arguments.join(" ")))); + QTextCharFormat textCharFormat; + textCharFormat.setForeground(Qt::blue); + emit addOutput(tr("Starting: \"%1\" %2\n").arg(m_command, m_arguments.join(" ")), textCharFormat); } void AbstractProcessStep::processFinished(int exitCode, QProcess::ExitStatus status) { - if (status == QProcess::NormalExit && exitCode == 0) - emit addOutput(tr("The process \"%1\" exited normally.").arg(m_command)); - else if (status == QProcess::NormalExit) - emit addOutput(tr("The process \"%1\" exited with code %2.").arg(m_command, m_process->exitCode())); - else - emit addOutput(tr("The process \"%1\" crashed.").arg(m_command)); + QTextCharFormat textCharFormat; + if (status == QProcess::NormalExit && exitCode == 0) { + textCharFormat.setForeground(Qt::blue); + emit addOutput(tr("The process \"%1\" exited normally.").arg(m_command), textCharFormat); + } else if (status == QProcess::NormalExit) { + textCharFormat.setForeground(Qt::red); + textCharFormat.setFontWeight(QFont::Bold); + emit addOutput(tr("The process \"%1\" exited with code %2.").arg(m_command, m_process->exitCode()), textCharFormat); + } else { + textCharFormat.setForeground(Qt::red); + textCharFormat.setFontWeight(QFont::Bold); + emit addOutput(tr("The process \"%1\" crashed.").arg(m_command), textCharFormat); + } } void AbstractProcessStep::processStartupFailed() { - emit addOutput(tr("Could not start process \"%1\"").arg(m_command)); + QTextCharFormat textCharFormat; + textCharFormat.setForeground(Qt::red); + textCharFormat.setFontWeight(QFont::Bold); + emit addOutput(tr("Could not start process \"%1\"").arg(m_command), textCharFormat); } bool AbstractProcessStep::processSucceeded(int exitCode, QProcess::ExitStatus status) @@ -235,7 +247,8 @@ void AbstractProcessStep::stdOutput(const QString &line) { if (m_outputParserChain) m_outputParserChain->stdOutput(line); - emit addOutput(Qt::escape(line)); + QTextCharFormat textCharFormat; + emit addOutput(Qt::escape(line), textCharFormat); } void AbstractProcessStep::processReadyReadStdError() @@ -251,7 +264,9 @@ void AbstractProcessStep::stdError(const QString &line) { if (m_outputParserChain) m_outputParserChain->stdError(line); - emit addOutput(QLatin1String("") + Qt::escape(line) + QLatin1String("")); + QTextCharFormat textCharFormat; + textCharFormat.setForeground(Qt::red); + emit addOutput(line, textCharFormat); } void AbstractProcessStep::checkForCancel() @@ -312,9 +327,9 @@ void AbstractProcessStep::taskAdded(const ProjectExplorer::Task &task) emit addTask(editable); } -void AbstractProcessStep::outputAdded(const QString &string) +void AbstractProcessStep::outputAdded(const QString &string, const QTextCharFormat &textCharFormat) { - emit addOutput(string); + emit addOutput(string, textCharFormat); } void AbstractProcessStep::slotProcessFinished(int, QProcess::ExitStatus) diff --git a/src/plugins/projectexplorer/abstractprocessstep.h b/src/plugins/projectexplorer/abstractprocessstep.h index 98399fdab2b..de4498a8f43 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.h +++ b/src/plugins/projectexplorer/abstractprocessstep.h @@ -147,8 +147,8 @@ private slots: void checkForCancel(); void taskAdded(const ProjectExplorer::Task &task); - void outputAdded(const QString &string); + void outputAdded(const QString &string, const QTextCharFormat &format); private: QTimer *m_timer; QFutureInterface *m_futureInterface; diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index f538d8d47a5..a2f307075d2 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -180,7 +180,9 @@ void BuildManager::finish() void BuildManager::emitCancelMessage() { - emit addToOutputWindow(tr("Canceled build.")); + QTextCharFormat textCharFormat; + textCharFormat.setForeground(Qt::red); + emit addToOutputWindow(tr("Canceled build."), textCharFormat); } void BuildManager::clearBuildQueue() @@ -282,9 +284,9 @@ void BuildManager::addToTaskWindow(const ProjectExplorer::Task &task) m_taskWindow->addTask(task); } -void BuildManager::addToOutputWindow(const QString &string) +void BuildManager::addToOutputWindow(const QString &string, const QTextCharFormat &format) { - m_outputWindow->appendText(string); + m_outputWindow->appendText(string, format); } void BuildManager::nextBuildQueue() @@ -294,8 +296,8 @@ void BuildManager::nextBuildQueue() disconnect(m_currentBuildStep, SIGNAL(addTask(ProjectExplorer::Task)), this, SLOT(addToTaskWindow(ProjectExplorer::Task))); - disconnect(m_currentBuildStep, SIGNAL(addOutput(QString)), - this, SLOT(addToOutputWindow(QString))); + disconnect(m_currentBuildStep, SIGNAL(addOutput(QString, QTextCharFormat)), + this, SLOT(addToOutputWindow(QString, QTextCharFormat))); ++m_progress; m_progressFutureInterface->setProgressValueAndText(m_progress*100, msgProgress(m_progress, m_maxProgress)); @@ -306,8 +308,10 @@ void BuildManager::nextBuildQueue() // Build Failure const QString projectName = m_currentBuildStep->buildConfiguration()->target()->project()->displayName(); const QString targetName = m_currentBuildStep->buildConfiguration()->target()->displayName(); - addToOutputWindow(tr("Error while building project %1 (target: %2)").arg(projectName, targetName)); - addToOutputWindow(tr("When executing build step '%1'").arg(m_currentBuildStep->displayName())); + QTextCharFormat textCharFormat; + textCharFormat.setForeground(Qt::red); + addToOutputWindow(tr("Error while building project %1 (target: %2)").arg(projectName, targetName), textCharFormat); + addToOutputWindow(tr("When executing build step '%1'").arg(m_currentBuildStep->displayName()), textCharFormat); // NBS TODO fix in qtconcurrent m_progressFutureInterface->setProgressValueAndText(m_progress*100, tr("Error while building project %1 (target: %2)").arg(projectName, targetName)); } @@ -337,8 +341,10 @@ void BuildManager::nextStep() if (m_currentBuildStep->buildConfiguration()->target()->project() != m_previousBuildStepProject) { const QString projectName = m_currentBuildStep->buildConfiguration()->target()->project()->displayName(); - addToOutputWindow(tr("Running build steps for project %2...") - .arg(projectName)); + QTextCharFormat textCharFormat; + textCharFormat.setFontWeight(QFont::Bold); + addToOutputWindow(tr("Running build steps for project %2...") + .arg(projectName), textCharFormat); m_previousBuildStepProject = m_currentBuildStep->buildConfiguration()->target()->project(); } m_watcher.setFuture(QtConcurrent::run(&BuildStep::run, m_currentBuildStep)); @@ -363,8 +369,8 @@ bool BuildManager::buildQueueAppend(QList steps) BuildStep *bs = steps.at(i); connect(bs, SIGNAL(addTask(ProjectExplorer::Task)), this, SLOT(addToTaskWindow(ProjectExplorer::Task))); - connect(bs, SIGNAL(addOutput(QString)), - this, SLOT(addToOutputWindow(QString))); + connect(bs, SIGNAL(addOutput(QString, QTextCharFormat)), + this, SLOT(addToOutputWindow(QString, QTextCharFormat))); init = bs->init(); if (!init) break; @@ -376,16 +382,18 @@ bool BuildManager::buildQueueAppend(QList steps) // print something for the user const QString projectName = bs->buildConfiguration()->target()->project()->displayName(); const QString targetName = bs->buildConfiguration()->target()->displayName(); - addToOutputWindow(tr("Error while building project %1 (target: %2)").arg(projectName, targetName)); - addToOutputWindow(tr("When executing build step '%1'").arg(bs->displayName())); + QTextCharFormat textCharFormat; + textCharFormat.setForeground(Qt::red); + addToOutputWindow(tr("Error while building project %1 (target: %2)").arg(projectName, targetName), textCharFormat); + addToOutputWindow(tr("When executing build step '%1'").arg(bs->displayName()), textCharFormat); // disconnect the buildsteps again for (int j = 0; j <= i; ++j) { BuildStep *bs = steps.at(j); disconnect(bs, SIGNAL(addTask(ProjectExplorer::Task)), this, SLOT(addToTaskWindow(ProjectExplorer::Task))); - disconnect(bs, SIGNAL(addOutput(QString)), - this, SLOT(addToOutputWindow(QString))); + disconnect(bs, SIGNAL(addOutput(QString, QTextCharFormat)), + this, SLOT(addToOutputWindow(QString, QTextCharFormat))); } return false; } diff --git a/src/plugins/projectexplorer/buildmanager.h b/src/plugins/projectexplorer/buildmanager.h index dda5c10c313..648790b0f02 100644 --- a/src/plugins/projectexplorer/buildmanager.h +++ b/src/plugins/projectexplorer/buildmanager.h @@ -95,7 +95,7 @@ signals: private slots: void addToTaskWindow(const ProjectExplorer::Task &task); - void addToOutputWindow(const QString &string); + void addToOutputWindow(const QString &string, const QTextCharFormat &textCharFormat); void nextBuildQueue(); void progressChanged(); diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h index fb92427e6cc..9a8739ce2d5 100644 --- a/src/plugins/projectexplorer/buildstep.h +++ b/src/plugins/projectexplorer/buildstep.h @@ -105,8 +105,8 @@ signals: void addTask(const ProjectExplorer::Task &task); // The string is added to the generated output, usually in the output // window. - // It should be in html format, that is properly escaped - void addOutput(const QString &string); + // It should be in plain text, with the format in the parameter + void addOutput(const QString &string, const QTextCharFormat &textCharFormat); private: BuildConfiguration *m_buildConfiguration; diff --git a/src/plugins/projectexplorer/compileoutputwindow.cpp b/src/plugins/projectexplorer/compileoutputwindow.cpp index 8bbfe18e651..a0856c76753 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.cpp +++ b/src/plugins/projectexplorer/compileoutputwindow.cpp @@ -52,6 +52,8 @@ CompileOutputWindow::CompileOutputWindow(BuildManager * /*bm*/) Aggregation::Aggregate *agg = new Aggregation::Aggregate; agg->add(m_textEdit); agg->add(new Find::BaseTextFind(m_textEdit)); + + qRegisterMetaType("QTextCharFormat"); } bool CompileOutputWindow::hasFocus() @@ -74,9 +76,16 @@ QWidget *CompileOutputWindow::outputWidget(QWidget *) return m_textEdit; } -void CompileOutputWindow::appendText(const QString &text) +void CompileOutputWindow::appendText(const QString &text, const QTextCharFormat &textCharFormat) { - m_textEdit->appendHtml(text); + QString textWithNewline = text; + if (!textWithNewline.endsWith("\n")) + textWithNewline.append("\n"); + QTextCursor cursor = QTextCursor(m_textEdit->document()); + cursor.movePosition(QTextCursor::End); + cursor.beginEditBlock(); + cursor.insertText(textWithNewline, textCharFormat); + cursor.endEditBlock(); } void CompileOutputWindow::clearContents() diff --git a/src/plugins/projectexplorer/compileoutputwindow.h b/src/plugins/projectexplorer/compileoutputwindow.h index e74d4e4ec2a..1bdd118c504 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.h +++ b/src/plugins/projectexplorer/compileoutputwindow.h @@ -31,6 +31,8 @@ #define COMPILEOUTPUTWINDOW_H #include +#include +#include QT_BEGIN_NAMESPACE class QPlainTextEdit; @@ -54,7 +56,7 @@ public: int priorityInStatusBar() const; void clearContents(); void visibilityChanged(bool visible); - void appendText(const QString &text); + void appendText(const QString &text, const QTextCharFormat &textCharFormat); bool canFocus(); bool hasFocus(); void setFocus(); diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp index 6cf1a4da5fe..ca5b8ba6eb9 100644 --- a/src/plugins/projectexplorer/ioutputparser.cpp +++ b/src/plugins/projectexplorer/ioutputparser.cpp @@ -50,8 +50,8 @@ void IOutputParser::appendOutputParser(IOutputParser *parser) } m_parser = parser; - connect(parser, SIGNAL(addOutput(QString)), - this, SLOT(outputAdded(QString)), Qt::DirectConnection); + connect(parser, SIGNAL(addOutput(QString, QTextCharFormat)), + this, SLOT(outputAdded(QString, QTextCharFormat)), Qt::DirectConnection); connect(parser, SIGNAL(addTask(ProjectExplorer::Task)), this, SLOT(taskAdded(ProjectExplorer::Task)), Qt::DirectConnection); } @@ -59,8 +59,8 @@ void IOutputParser::appendOutputParser(IOutputParser *parser) IOutputParser *IOutputParser::takeOutputParserChain() { IOutputParser *parser = m_parser; - disconnect(parser, SIGNAL(addOutput(QString)), - this, SLOT(outputAdded(QString))); + disconnect(parser, SIGNAL(addOutput(QString, QTextCharFormat)), + this, SLOT(outputAdded(QString, QTextCharFormat))); disconnect(parser, SIGNAL(addTask(ProjectExplorer::Task)), this, SLOT(taskAdded(ProjectExplorer::Task))); m_parser = 0; @@ -84,9 +84,9 @@ void IOutputParser::stdError(const QString &line) m_parser->stdError(line); } -void IOutputParser::outputAdded(const QString &string) +void IOutputParser::outputAdded(const QString &string, const QTextCharFormat &textCharFormat) { - emit addOutput(string); + emit addOutput(string, textCharFormat); } void IOutputParser::taskAdded(const ProjectExplorer::Task &task) diff --git a/src/plugins/projectexplorer/ioutputparser.h b/src/plugins/projectexplorer/ioutputparser.h index da761334604..058b5a75b29 100644 --- a/src/plugins/projectexplorer/ioutputparser.h +++ b/src/plugins/projectexplorer/ioutputparser.h @@ -67,14 +67,14 @@ signals: /// added to the output. /// Note: This is additional information. There is no need to add each /// line! - void addOutput(const QString &string); + void addOutput(const QString &string, const QTextCharFormat &format); /// Should be emitted for each task seen in the output. void addTask(const ProjectExplorer::Task &task); public slots: /// Subparsers have their addOutput signal connected to this slot. /// This method can be overwritten to change the string. - virtual void outputAdded(const QString &string); + virtual void outputAdded(const QString &string, const QTextCharFormat &color); /// Subparsers have their addTask signal connected to this slot. /// This method can be overwritten to change the task. virtual void taskAdded(const ProjectExplorer::Task &task); diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index 28a83b50011..7bf6c66800e 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -104,7 +104,8 @@ void OutputParserTester::testOutputMangling(const QString &input, { reset(); - childParser()->outputAdded(input); + QTextCharFormat textCharFormat; + childParser()->outputAdded(input, textCharFormat); QCOMPARE(m_receivedOutput, output); QVERIFY(m_receivedStdErrChildLine.isNull()); @@ -139,7 +140,7 @@ void OutputParserTester::appendOutputParser(IOutputParser *parser) parser->appendOutputParser(this); } -void OutputParserTester::outputAdded(const QString &line) +void OutputParserTester::outputAdded(const QString &line, const QTextCharFormat &textCharFormat) { if (!m_receivedOutput.isEmpty()) m_receivedOutput.append(QChar('\n')); diff --git a/src/plugins/projectexplorer/outputparser_test.h b/src/plugins/projectexplorer/outputparser_test.h index 8241766bb5b..5d3a4d2d0b1 100644 --- a/src/plugins/projectexplorer/outputparser_test.h +++ b/src/plugins/projectexplorer/outputparser_test.h @@ -71,7 +71,7 @@ public: void appendOutputParser(IOutputParser *parser); private slots: - void outputAdded(const QString &line); + void outputAdded(const QString &line, const QTextCharFormat &textCharFormat); void taskAdded(const ProjectExplorer::Task &task); private: diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index fb3184ac82b..02eaf9832ff 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -135,8 +135,9 @@ bool MakeStep::init() // Try to detect command in environment const QString tmp = environment.searchInPath(makeCmd); if (tmp.isEmpty()) { - emit addOutput(tr("Could not find make command: %1 "\ - "in the build environment").arg(makeCmd)); + QTextCharFormat textCharFormat; + textCharFormat.setForeground(Qt::red); + emit addOutput(tr("Could not find make command: %1 in the build environment").arg(makeCmd), textCharFormat); return false; } makeCmd = tmp; diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index 9b42e389bd6..12629bf2961 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -198,13 +198,17 @@ void QMakeStep::run(QFutureInterface &fi) canContinue = false; } if (!canContinue) { - emit addOutput(tr("Configuration is faulty, please check the Build Issues view for details.")); + QTextCharFormat textCharFormat; + textCharFormat.setForeground(Qt::blue); + emit addOutput(tr("Configuration is faulty, please check the Build Issues view for details."), textCharFormat); fi.reportResult(false); return; } if (!m_needToRunQMake) { - emit addOutput(tr("Configuration unchanged, skipping qmake step.")); + QTextCharFormat textCharFormat; + textCharFormat.setForeground(Qt::blue); + emit addOutput(tr("Configuration unchanged, skipping qmake step."), textCharFormat); fi.reportResult(true); return; } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp index c43a2f1bea3..0a007795970 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp @@ -114,7 +114,8 @@ bool MaemoPackageCreationStep::createPackage() if (!packagingNeeded()) return true; - emit addOutput(tr("Creating package file ...")); + QTextCharFormat textCharFormat; + emit addOutput(tr("Creating package file ..."), textCharFormat); QFile configFile(targetRoot() % QLatin1String("/config.sh")); if (!configFile.open(QIODevice::ReadOnly)) { raiseError(tr("Cannot open MADDE config file '%1'.") @@ -213,14 +214,15 @@ bool MaemoPackageCreationStep::createPackage() return false; } - emit addOutput(tr("Package created.")); + emit addOutput(tr("Package created."), textCharFormat); m_packageContents->setUnModified(); return true; } bool MaemoPackageCreationStep::runCommand(QProcess &proc, const QString &command) { - emit addOutput(tr("Package Creation: Running command '%1'.").arg(command)); + QTextCharFormat textCharFormat; + emit addOutput(tr("Package Creation: Running command '%1'.").arg(command), textCharFormat); QString perl; #ifdef Q_OS_WIN perl = maddeRoot() + QLatin1String("/bin/perl.exe "); @@ -323,7 +325,8 @@ QString MaemoPackageCreationStep::nativePath(const QFile &file) const void MaemoPackageCreationStep::raiseError(const QString &shortMsg, const QString &detailedMsg) { - emit addOutput(detailedMsg.isNull() ? shortMsg : detailedMsg); + QTextCharFormat textCharFormat; + emit addOutput(detailedMsg.isNull() ? shortMsg : detailedMsg, textCharFormat); emit addTask(Task(Task::Error, shortMsg, QString(), -1, TASK_CATEGORY_BUILDSYSTEM)); } From 313d30654ec6a731914cf600977a1aa97520228b Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Tue, 8 Jun 2010 15:36:06 +0200 Subject: [PATCH 10/32] QmlJS: Avoid infinite recursion when encountering property loops. Such as property int foo: bar property int bar: foo. Task-number: QTCREATORBUG-1389 Reviewed-by: Roberto Raggi --- src/libs/qmljs/qmljsevaluate.cpp | 2 +- src/libs/qmljs/qmljsinterpreter.cpp | 14 +++++++++++++- src/libs/qmljs/qmljsinterpreter.h | 13 +++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/libs/qmljs/qmljsevaluate.cpp b/src/libs/qmljs/qmljsevaluate.cpp index d7a7129216a..2b6821e755b 100644 --- a/src/libs/qmljs/qmljsevaluate.cpp +++ b/src/libs/qmljs/qmljsevaluate.cpp @@ -53,7 +53,7 @@ const Interpreter::Value *Evaluate::operator()(AST::Node *ast) const Value *result = reference(ast); if (const Reference *ref = value_cast(result)) - result = ref->value(_context); + result = _context->lookupReference(ref); if (! result) result = _engine->undefinedValue(); diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index a32cd10c9fc..a83f24141d9 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -1483,6 +1483,18 @@ const ObjectValue *Context::lookupType(const QmlJS::Document *doc, const QString return objectValue; } +const Value *Context::lookupReference(const Reference *reference) +{ + if (_referenceStack.contains(reference)) + return 0; + + _referenceStack.append(reference); + const Value *v = reference->value(this); + _referenceStack.removeLast(); + + return v; +} + const Value *Context::property(const ObjectValue *object, const QString &name) const { const Properties properties = _properties.value(object); @@ -1632,7 +1644,7 @@ const ObjectValue *ObjectValue::prototype(Context *context) const const ObjectValue *prototypeObject = value_cast(_prototype); if (! prototypeObject) { if (const Reference *prototypeReference = value_cast(_prototype)) { - prototypeObject = value_cast(prototypeReference->value(context)); + prototypeObject = value_cast(context->lookupReference(prototypeReference)); } } return prototypeObject; diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index 50254fda99c..7ce3fcffba6 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -293,6 +293,7 @@ public: const Value *lookup(const QString &name); const ObjectValue *lookupType(const Document *doc, AST::UiQualifiedId *qmlTypeName); const ObjectValue *lookupType(const Document *doc, const QStringList &qmlTypeName); + const Value *lookupReference(const Reference *reference); const Value *property(const ObjectValue *object, const QString &name) const; void setProperty(const ObjectValue *object, const QString &name, const Value *value); @@ -313,6 +314,7 @@ private: ScopeChain _scopeChain; int _qmlScopeObjectIndex; bool _qmlScopeObjectSet; + QList _referenceStack; }; class QMLJS_EXPORT Reference: public Value @@ -322,14 +324,16 @@ public: virtual ~Reference(); Engine *engine() const; - virtual const Value *value(Context *context) const; // Value interface virtual const Reference *asReference() const; virtual void accept(ValueVisitor *) const; private: + virtual const Value *value(Context *context) const; + Engine *_engine; + friend class Context; }; class QMLJS_EXPORT ColorValue: public Value @@ -742,9 +746,9 @@ public: AST::UiQualifiedId *qmlTypeName() const; +private: virtual const Value *value(Context *context) const; -private: AST::UiQualifiedId *_qmlTypeName; const Document *_doc; }; @@ -757,6 +761,7 @@ public: ASTVariableReference(AST::VariableDeclaration *ast, Engine *engine); virtual ~ASTVariableReference(); +private: virtual const Value *value(Context *context) const; }; @@ -792,6 +797,8 @@ public: QString onChangedSlotName() const { return _onChangedSlotName; } virtual bool getSourceLocation(QString *fileName, int *line, int *column) const; + +private: virtual const Value *value(Context *context) const; }; @@ -809,6 +816,8 @@ public: QString slotName() const { return _slotName; } virtual bool getSourceLocation(QString *fileName, int *line, int *column) const; + +private: virtual const Value *value(Context *context) const; }; From 1373fc13a65821105b88202e12cb987d29e988e0 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 8 Jun 2010 16:43:29 +0200 Subject: [PATCH 11/32] QmlDesigner: Prevent freezing while doing drag&drop on some Windows systems QWidget::grabMouse() might freeze if there are e.g. misbehaving virus scanners installed. This is why e.g. qdockwidget.cpp doesn't use grabMouse(), but QWidgetPrivate::grabMouseWhileInWindow(). As a hot fix we do the very same now in creator, at the cost of including the private header qwidget_p.h. Task-number: BAUHAUS-772 Task-number: QTBUG-11301 --- .../itemlibrary/customdraganddrop.cpp | 21 +++++++++++++++++-- .../itemlibrary/customdraganddrop.h | 1 + 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/customdraganddrop.cpp b/src/plugins/qmldesigner/components/itemlibrary/customdraganddrop.cpp index 7e67256099d..1672e9947fe 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/customdraganddrop.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/customdraganddrop.cpp @@ -38,6 +38,10 @@ #include #include +#ifdef Q_OS_WIN +#include +#endif + namespace QmlDesigner { namespace QmlDesignerItemLibraryDragAndDrop { @@ -54,7 +58,20 @@ void CustomDragAndDropIcon::startDrag() raise(); show(); + grabMouseSafely(); +} + +void CustomDragAndDropIcon::grabMouseSafely() +{ +#ifdef Q_OS_WIN + // grabMouse calls SetWindowsHookEx() - this function causes a system-wide + // freeze if any other app on the system installs a hook and fails to + // process events. + QWidgetPrivate *p = qt_widget_private(this); + p->grabMouseWhileInWindow(); +#else grabMouse(); +#endif } void CustomDragAndDropIcon::mouseReleaseEvent(QMouseEvent *event) @@ -108,7 +125,8 @@ void CustomDragAndDropIcon::mouseMoveEvent(QMouseEvent *event) leave(); // trigger animation if we leave a widget that accepted // the drag enter event } - grabMouse(); //enable the mouse grabber again - after the curser is set + //enable the mouse grabber again - after the curser is set + grabMouseSafely(); } else { if (CustomDragAndDrop::isAccepted()) // create DragMoveEvents if the current widget // accepted the DragEnter event @@ -231,7 +249,6 @@ void CustomDragAndDrop::startCustomDrag(const QPixmap icon, const QPixmap previe instance()->m_widget->setIcon(icon); instance()->m_widget->setPreview(preview); instance()->m_widget->startDrag(); - } bool CustomDragAndDrop::customDragActive() diff --git a/src/plugins/qmldesigner/components/itemlibrary/customdraganddrop.h b/src/plugins/qmldesigner/components/itemlibrary/customdraganddrop.h index 263af4c1859..4350f635dbb 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/customdraganddrop.h +++ b/src/plugins/qmldesigner/components/itemlibrary/customdraganddrop.h @@ -54,6 +54,7 @@ public: void enter(); void leave(); void startDrag(); + void grabMouseSafely(); public slots: void animateDrag(int frame); From cc295bc9d25e4a484d53f93311a29ff14c2f1e71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Schummer?= Date: Mon, 31 May 2010 15:27:52 +0300 Subject: [PATCH 12/32] QuickDesigner.itemLibrary: enable mouse wheel interaction in items view Task-number: BAUHAUS-657 --- .../components/itemlibrary/itemlibrary.cpp | 11 +++++++++++ .../qmldesigner/components/itemlibrary/itemlibrary.h | 4 ++++ .../components/itemlibrary/qml/ItemsView.qml | 4 ++++ .../components/itemlibrary/qml/ItemsViewStyle.qml | 1 + .../components/itemlibrary/qml/Scrollbar.qml | 8 ++++++-- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.cpp index a812f298680..48164c5f9ee 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.cpp @@ -153,6 +153,7 @@ ItemLibrary::ItemLibrary(QWidget *parent) : QDeclarativeItem *rootItem = qobject_cast(m_d->m_itemsView->rootObject()); connect(rootItem, SIGNAL(itemSelected(int)), this, SLOT(showItemInfo(int))); connect(rootItem, SIGNAL(itemDragged(int)), this, SLOT(startDragAndDrop(int))); + connect(this, SIGNAL(scrollItemsView(QVariant)), rootItem, SLOT(scrollView(QVariant))); connect(this, SIGNAL(resetItemsView()), rootItem, SLOT(resetView())); /* create Resources view and its model */ @@ -318,4 +319,14 @@ void ItemLibrary::showItemInfo(int /*itemLibId*/) // qDebug() << "showing item info about id" << itemLibId; } +void ItemLibrary::wheelEvent(QWheelEvent *event) +{ + if (m_d->m_stackedWidget->currentIndex() == 0 && + m_d->m_itemsView->rect().contains(event->pos())) { + emit scrollItemsView(event->delta()); + event->accept(); + } else + QFrame::wheelEvent(event); +} + } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.h index 26637e5a400..0eff37dee91 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrary.h @@ -61,8 +61,12 @@ public Q_SLOTS: void startDragAndDrop(int itemLibId); void showItemInfo(int itemLibId); +protected: + void wheelEvent(QWheelEvent *event); + signals: void itemActivated(const QString& itemName); + void scrollItemsView(QVariant delta); void resetItemsView(); private: diff --git a/src/plugins/qmldesigner/components/itemlibrary/qml/ItemsView.qml b/src/plugins/qmldesigner/components/itemlibrary/qml/ItemsView.qml index 002a003d694..6b47b38c778 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/qml/ItemsView.qml +++ b/src/plugins/qmldesigner/components/itemlibrary/qml/ItemsView.qml @@ -60,6 +60,10 @@ Rectangle { // public + function scrollView(delta) { + scrollbar.scroll(-delta / style.scrollbarWheelDeltaFactor) + } + function resetView() { expandAllEntries() scrollbar.reset() diff --git a/src/plugins/qmldesigner/components/itemlibrary/qml/ItemsViewStyle.qml b/src/plugins/qmldesigner/components/itemlibrary/qml/ItemsViewStyle.qml index 13242e3ae37..1cdae226dcb 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/qml/ItemsViewStyle.qml +++ b/src/plugins/qmldesigner/components/itemlibrary/qml/ItemsViewStyle.qml @@ -41,6 +41,7 @@ Item { property string scrollbarGradientMiddleColor: "#656565" property string scrollbarGradientEndColor: "#888888" property int scrollbarClickScrollAmount: 40 + property int scrollbarWheelDeltaFactor: 4 property string itemNameTextColor: "#FFFFFF" diff --git a/src/plugins/qmldesigner/components/itemlibrary/qml/Scrollbar.qml b/src/plugins/qmldesigner/components/itemlibrary/qml/Scrollbar.qml index a882c2fa140..34dca1c30aa 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/qml/Scrollbar.qml +++ b/src/plugins/qmldesigner/components/itemlibrary/qml/Scrollbar.qml @@ -38,6 +38,10 @@ Item { property variant flickable + function scroll(delta) { + handle.y = Math.max(0, Math.min(scrollHeight, handle.y + delta)) + } + function reset() { handle.y = 0 } @@ -100,7 +104,7 @@ Item { anchors.right: parent.right anchors.top: parent.top anchors.bottom: handle.top - onClicked: handle.y = Math.max(0, handle.y - style.scrollbarClickScrollAmount) + onClicked: scroll(-style.scrollbarClickScrollAmount) } Item { @@ -151,6 +155,6 @@ Item { anchors.right: parent.right anchors.top: handle.bottom anchors.bottom: parent.bottom - onClicked: handle.y = Math.min(scrollHeight, handle.y + style.scrollbarClickScrollAmount) + onClicked: scroll(style.scrollbarClickScrollAmount) } } From 942b12da1977fe997d53073f4cdc8fed4f29ef5f Mon Sep 17 00:00:00 2001 From: dt Date: Tue, 8 Jun 2010 16:01:48 +0200 Subject: [PATCH 13/32] Fix unused parameter warning --- src/plugins/projectexplorer/outputparser_test.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index 7bf6c66800e..2214aa0128e 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -142,6 +142,7 @@ void OutputParserTester::appendOutputParser(IOutputParser *parser) void OutputParserTester::outputAdded(const QString &line, const QTextCharFormat &textCharFormat) { + Q_UNUSED(textCharFormat); if (!m_receivedOutput.isEmpty()) m_receivedOutput.append(QChar('\n')); m_receivedOutput.append(line); From 7bfb7a62e7dfb34eb873479fdbe482f42620c6b4 Mon Sep 17 00:00:00 2001 From: dt Date: Tue, 8 Jun 2010 15:38:59 +0200 Subject: [PATCH 14/32] Make clearing the build issue list way faster --- src/plugins/projectexplorer/taskwindow.cpp | 29 ++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index 77dcd19a8c3..d016b28af75 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -293,21 +293,30 @@ void TaskModel::clearTasks(const QString &categoryId) endRemoveRows(); m_maxSizeOfFileName = 0; } else { - // TODO: Optimize this for consecutive rows - foreach (const Task &task, m_tasksInCategory.value(categoryId)) { - int index = m_tasks.indexOf(task); - Q_ASSERT(index >= 0); - beginRemoveRows(QModelIndex(), index, index); + int index = 0; + int start = 0; + while (index < m_tasks.size()) { + while (index < m_tasks.size() && m_tasks.at(index).category != categoryId) { + ++start; + ++index; + } + if (index == m_tasks.size()) + break; + while (index < m_tasks.size() && m_tasks.at(index).category == categoryId) { + ++index; + } + // Index is now on the first non category + beginRemoveRows(QModelIndex(), start, index - 1); - m_tasks.removeAt(index); + for (int i = start; i < index; ++i) { + m_tasksInCategory[categoryId].removeOne(m_tasks.at(i)); + } - QList tasksInCategory = m_tasksInCategory.value(categoryId); - tasksInCategory.removeOne(task); - m_tasksInCategory.insert(categoryId, tasksInCategory); + m_tasks.erase(m_tasks.begin() + start, m_tasks.begin() + index); endRemoveRows(); + index = start; } - // what to do with m_maxSizeOfFileName ? } } From cedf9e21dcb7eb78b71a1451981cc4cb7ee7e1b2 Mon Sep 17 00:00:00 2001 From: dt Date: Tue, 8 Jun 2010 17:18:53 +0200 Subject: [PATCH 15/32] Optimize the taskCount tracking Saving another 20% --- src/plugins/projectexplorer/taskwindow.cpp | 49 ++++++++++++++++------ src/plugins/projectexplorer/taskwindow.h | 4 +- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index d016b28af75..0deacbd4868 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -128,6 +128,9 @@ public: QIcon taskTypeIcon(Task::TaskType t) const; + int taskCount(); + int errorTaskCount(); + private: QHash m_categories; // category id -> display name QList m_tasks; // all tasks (in order of insertion) @@ -137,6 +140,8 @@ private: int m_maxSizeOfFileName; const QIcon m_errorIcon; const QIcon m_warningIcon; + int m_taskCount; + int m_errorTaskCount; }; class TaskFilterModel : public QSortFilterProxyModel @@ -214,8 +219,21 @@ void TaskView::keyPressEvent(QKeyEvent *e) TaskModel::TaskModel() : m_maxSizeOfFileName(0), m_errorIcon(QLatin1String(":/projectexplorer/images/compile_error.png")), - m_warningIcon(QLatin1String(":/projectexplorer/images/compile_warning.png")) + m_warningIcon(QLatin1String(":/projectexplorer/images/compile_warning.png")), + m_taskCount(0), + m_errorTaskCount(0) { + +} + +int TaskModel::taskCount() +{ + return m_taskCount; +} + +int TaskModel::errorTaskCount() +{ + return m_errorTaskCount; } QIcon TaskModel::taskTypeIcon(Task::TaskType t) const @@ -270,6 +288,9 @@ void TaskModel::addTask(const Task &task) filename = task.file.mid(pos +1); m_maxSizeOfFileName = qMax(m_maxSizeOfFileName, fm.width(filename)); + ++m_taskCount; + if (task.type == Task::Error) + ++m_errorTaskCount; } void TaskModel::removeTask(const Task &task) @@ -278,6 +299,9 @@ void TaskModel::removeTask(const Task &task) int index = m_tasks.indexOf(task); beginRemoveRows(QModelIndex(), index, index); m_tasks.removeAt(index); + --m_taskCount; + if (task.type == Task::Error) + --m_errorTaskCount; endRemoveRows(); } } @@ -290,11 +314,14 @@ void TaskModel::clearTasks(const QString &categoryId) beginRemoveRows(QModelIndex(), 0, m_tasks.size() -1); m_tasks.clear(); m_tasksInCategory.clear(); + m_taskCount = 0; + m_errorTaskCount = 0; endRemoveRows(); m_maxSizeOfFileName = 0; } else { int index = 0; int start = 0; + int subErrorTaskCount = 0; while (index < m_tasks.size()) { while (index < m_tasks.size() && m_tasks.at(index).category != categoryId) { ++start; @@ -303,6 +330,8 @@ void TaskModel::clearTasks(const QString &categoryId) if (index == m_tasks.size()) break; while (index < m_tasks.size() && m_tasks.at(index).category == categoryId) { + if (m_tasks.at(index).type == Task::Error) + ++subErrorTaskCount; ++index; } // Index is now on the first non category @@ -314,6 +343,9 @@ void TaskModel::clearTasks(const QString &categoryId) m_tasks.erase(m_tasks.begin() + start, m_tasks.begin() + index); + m_taskCount -= index - start; + m_errorTaskCount -= subErrorTaskCount; + endRemoveRows(); index = start; } @@ -683,21 +715,14 @@ void TaskWindow::filterCategoryTriggered(QAction *action) m_filter->setFilteredCategories(categories); } -int TaskWindow::taskCount(const QString &categoryId) const +int TaskWindow::taskCount() const { - return m_model->tasks(categoryId).count(); + return m_model->taskCount(); } -int TaskWindow::errorTaskCount(const QString &categoryId) const +int TaskWindow::errorTaskCount() const { - int errorTaskCount = 0; - - foreach (const Task &task, m_model->tasks(categoryId)) { - if (task.type == Task::Error) - ++ errorTaskCount; - } - - return errorTaskCount; + return m_model->errorTaskCount(); } int TaskWindow::priorityInStatusBar() const diff --git a/src/plugins/projectexplorer/taskwindow.h b/src/plugins/projectexplorer/taskwindow.h index 1d6df98e20e..4dd8cba3a1b 100644 --- a/src/plugins/projectexplorer/taskwindow.h +++ b/src/plugins/projectexplorer/taskwindow.h @@ -102,8 +102,8 @@ public: void removeTask(const Task &task); void clearTasks(const QString &categoryId = QString()); - int taskCount(const QString &categoryId = QString()) const; - int errorTaskCount(const QString &categoryId = QString()) const; + int taskCount() const; + int errorTaskCount() const; // IOutputPane From 769e67c35396d1ecd7d8fe8a4ea331527a28770a Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 8 Jun 2010 17:33:37 +0200 Subject: [PATCH 16/32] Fixed showing the proper path in prompt to overwrite msg box Reviewed-by: Friedemann Kleint Task-number: QTCREATORBUG-1601 --- src/plugins/coreplugin/basefilewizard.cpp | 30 ++++++++++++++--------- src/plugins/coreplugin/basefilewizard.h | 3 +-- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index 4c1309ddfb9..14d7b213c9a 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -540,7 +541,7 @@ QStringList BaseFileWizard::runWizard(const QString &path, QWidget *parent) foreach (const GeneratedFile &generatedFile, files) result.push_back(generatedFile.path()); - switch (promptOverwrite(path, result, &errorMessage)) { + switch (promptOverwrite(result, &errorMessage)) { case OverwriteCanceled: return QStringList(); case OverwriteError: @@ -615,29 +616,34 @@ bool BaseFileWizard::postGenerateOpenEditors(const GeneratedFiles &l, QString *e return true; } -BaseFileWizard::OverwriteResult BaseFileWizard::promptOverwrite(const QString &location, - const QStringList &files, +BaseFileWizard::OverwriteResult BaseFileWizard::promptOverwrite(const QStringList &files, QString *errorMessage) const { if (debugWizard) - qDebug() << Q_FUNC_INFO << location << files; + qDebug() << Q_FUNC_INFO << files; - bool existingFilesFound = false; + QStringList existingFiles; bool oddStuffFound = false; static const QString readOnlyMsg = tr(" [read only]"); static const QString directoryMsg = tr(" [directory]"); static const QString symLinkMsg = tr(" [symbolic link]"); - // Format a file list message as ( " [readonly], [directory]"). - QString fileNamesMsgPart; foreach (const QString &fileName, files) { + const QFileInfo fi(fileName); + if (fi.exists()) + existingFiles.append(fileName); + } + // Note: Generated files are using native separators, no need to convert. + const QString commonExistingPath = Utils::commonPath(existingFiles); + // Format a file list message as ( " [readonly], [directory]"). + QString fileNamesMsgPart; + foreach (const QString &fileName, existingFiles) { const QFileInfo fi(fileName); if (fi.exists()) { - existingFilesFound = true; if (!fileNamesMsgPart.isEmpty()) fileNamesMsgPart += QLatin1String(", "); - fileNamesMsgPart += fi.fileName(); + fileNamesMsgPart += fileName.mid(commonExistingPath.size() + 1); do { if (fi.isDir()) { oddStuffFound = true; @@ -657,17 +663,17 @@ BaseFileWizard::OverwriteResult BaseFileWizard::promptOverwrite(const QString &l } } - if (!existingFilesFound) + if (existingFiles.isEmpty()) return OverwriteOk; if (oddStuffFound) { - *errorMessage = tr("The project directory %1 contains files which cannot be overwritten:\n%2.").arg(location).arg(fileNamesMsgPart); + *errorMessage = tr("The project directory %1 contains files which cannot be overwritten:\n%2.").arg(commonExistingPath).arg(fileNamesMsgPart); return OverwriteError; } const QString messageFormat = tr("The following files already exist in the directory %1:\n" "%2.\nWould you like to overwrite them?"); - const QString message = messageFormat.arg(location).arg(fileNamesMsgPart); + const QString message = messageFormat.arg(commonExistingPath).arg(fileNamesMsgPart); const bool yes = (QMessageBox::question(Core::ICore::instance()->mainWindow(), tr("Existing files"), message, QMessageBox::Yes | QMessageBox::No, diff --git a/src/plugins/coreplugin/basefilewizard.h b/src/plugins/coreplugin/basefilewizard.h index 9a03410eeeb..e1f5a369d5d 100644 --- a/src/plugins/coreplugin/basefilewizard.h +++ b/src/plugins/coreplugin/basefilewizard.h @@ -210,8 +210,7 @@ protected: // Utility that performs an overwrite check on a set of files. It checks if // the file exists, can be overwritten at all and prompts the user. enum OverwriteResult { OverwriteOk, OverwriteError, OverwriteCanceled }; - OverwriteResult promptOverwrite(const QString &location, - const QStringList &files, + OverwriteResult promptOverwrite(const QStringList &files, QString *errorMessage) const; // Utility to open the editors for the files whose attribute is set accordingly. From 27bdfe510edca34b37231ec78a171f053b4d72d7 Mon Sep 17 00:00:00 2001 From: dt Date: Tue, 8 Jun 2010 17:36:47 +0200 Subject: [PATCH 17/32] Make the TaskView 10% faster by caching how wide "8888" is. --- src/plugins/projectexplorer/taskwindow.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index 0deacbd4868..d01dd1a87d8 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -142,6 +142,7 @@ private: const QIcon m_warningIcon; int m_taskCount; int m_errorTaskCount; + int m_sizeOfLineNumber; }; class TaskFilterModel : public QSortFilterProxyModel @@ -221,7 +222,8 @@ TaskModel::TaskModel() : m_errorIcon(QLatin1String(":/projectexplorer/images/compile_error.png")), m_warningIcon(QLatin1String(":/projectexplorer/images/compile_warning.png")), m_taskCount(0), - m_errorTaskCount(0) + m_errorTaskCount(0), + m_sizeOfLineNumber(0) { } @@ -422,9 +424,12 @@ int TaskModel::sizeOfFile() int TaskModel::sizeOfLineNumber() { - QFont font; - QFontMetrics fm(font); - return fm.width("8888"); + if (m_sizeOfLineNumber == 0) { + QFont font; + QFontMetrics fm(font); + m_sizeOfLineNumber = fm.width("8888"); + } + return m_sizeOfLineNumber; } void TaskModel::setFileNotFound(const QModelIndex &idx, bool b) From be1e0d2dba0a15a490f05054a08d0872476d3581 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Tue, 8 Jun 2010 18:22:23 +0200 Subject: [PATCH 18/32] Fix warning --- src/plugins/texteditor/icompletioncollector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/texteditor/icompletioncollector.cpp b/src/plugins/texteditor/icompletioncollector.cpp index 0d4dd129667..c6f6713aed7 100644 --- a/src/plugins/texteditor/icompletioncollector.cpp +++ b/src/plugins/texteditor/icompletioncollector.cpp @@ -41,7 +41,7 @@ using namespace TextEditor::Internal; namespace TextEditor { namespace Internal { -struct ICompletionCollectorPrivate +class ICompletionCollectorPrivate { public: CompletionSettings m_completionSettings; From fc421df12d88de7e0d14f214035e9495f3171e09 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 8 Jun 2010 13:57:23 +0200 Subject: [PATCH 19/32] micro-optimizations --- src/plugins/qt4projectmanager/qt4nodes.cpp | 6 +++--- src/shared/proparser/profileevaluator.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index d41f9af1e8b..52d0e043cd3 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -522,9 +522,9 @@ void Qt4PriFileNode::update(ProFile *includeFileExact, ProFileReader *readerExac newFilePaths += readerCumulative->absoluteFileValues(qmakeVariable, projectDir, vPathsCumulative, includeFileCumlative); } - newFilePaths.removeDuplicates(); if (!newFilePaths.isEmpty()) { + newFilePaths.removeDuplicates(); InternalNode *subfolder = new InternalNode; subfolder->type = type; subfolder->icon = fileTypes.at(i).icon; @@ -1444,14 +1444,14 @@ QStringList Qt4ProFileNode::subDirsPaths(ProFileReader *reader) const } if (QFile::exists(realFile)) { - if (!subProjectPaths.contains(realFile)) - subProjectPaths << realFile; + subProjectPaths << realFile; } else { m_project->proFileParseError(tr("Could not find .pro file for sub dir '%1' in '%2'") .arg(subDirVar).arg(realDir)); } } + subProjectPaths.removeDuplicates(); return subProjectPaths; } diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index 2da92571166..c9ce082b41b 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -2468,7 +2468,7 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( #endif case T_EVAL: { ProBlock *pro = new ProBlock(); - QString buf = args.join(QLatin1String(" ")); + QString buf = args.join(statics.field_sep); if (!readInternal(pro, buf, (ushort*)buf.data())) { delete pro; return ProItem::ReturnFalse; From 6a6e0091c8dc143de5ca4a53ee7b81caaf5df6bf Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 8 Jun 2010 14:02:15 +0200 Subject: [PATCH 20/32] consolidate the subdir name data path every path should be separator-fixed Reviewed-by: dt --- src/plugins/qt4projectmanager/qt4nodes.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 52d0e043cd3..f803b16ea8a 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -1425,16 +1425,15 @@ QStringList Qt4ProFileNode::subDirsPaths(ProFileReader *reader) const const QString subDirKey = subDirVar + QLatin1String(".subdir"); const QString subDirFileKey = subDirVar + QLatin1String(".file"); if (reader->contains(subDirKey)) - realDir = QFileInfo(reader->value(subDirKey)).filePath(); + realDir = reader->value(subDirKey); else if (reader->contains(subDirFileKey)) - realDir = QFileInfo(reader->value(subDirFileKey)).filePath(); + realDir = reader->value(subDirFileKey); else realDir = subDirVar; QFileInfo info(realDir); - if (!info.isAbsolute()) { + if (!info.isAbsolute()) info.setFile(m_projectDir + QLatin1Char('/') + realDir); - realDir = m_projectDir + QLatin1Char('/') + realDir; - } + realDir = info.filePath(); QString realFile; if (info.isDir()) { From 1dc99e8ff38c31fab948c5c57f47a492961841f2 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 8 Jun 2010 17:49:09 +0200 Subject: [PATCH 21/32] try to sort out the filename encoding mess use local8bit instead of latin1 resp. 8bit-passthrough, after all. the situation was as follows: - if the pro files and file names were all ascii, everything just worked - if either contained non-ascii: - on unix, the evaluator would work as long as the file content encoding matched the file name encoding, and the ui would work as long as the file name encoding was latin1 (i.e., on no modern system) - on windows, both would work only if the ansi code page was latin1/cp1252 (i.e., on western systems) i.e., even in the low-level evaluator, only native latin1 systems with actual latin1 files worked consistently. given this situation, it makes little sense to make an encoding adapter between the evaluator and the ui as originally planned. instead, take the easy way out and use local8bit - this continues to work for native latin1 systems+files in the backend, and makes the ui work for everything the backend groks and some more. Reviewed-by: dt Task-number: QTCREATORBUG-930 --- src/shared/proparser/ioutils.cpp | 2 +- src/shared/proparser/profileevaluator.cpp | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/shared/proparser/ioutils.cpp b/src/shared/proparser/ioutils.cpp index 8a2c9112d28..f43c29aa9ae 100644 --- a/src/shared/proparser/ioutils.cpp +++ b/src/shared/proparser/ioutils.cpp @@ -52,7 +52,7 @@ IoUtils::FileType IoUtils::fileType(const QString &fileName) return (attr & FILE_ATTRIBUTE_DIRECTORY) ? FileIsDir : FileIsRegular; #else struct ::stat st; - if (::stat(fileName.toLatin1().constData(), &st)) // latin1 symmetric to the file reader + if (::stat(fileName.toLocal8Bit().constData(), &st)) return FileNotFound; return S_ISDIR(st.st_mode) ? FileIsDir : FileIsRegular; #endif diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index c9ce082b41b..f54fd06ea6f 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -148,7 +148,7 @@ ProFileOption::ProFileOption() dirlist_sep = QLatin1Char(':'); dir_sep = QLatin1Char('/'); #endif - qmakespec = QString::fromLatin1(qgetenv("QMAKESPEC").data()); + qmakespec = QString::fromLocal8Bit(qgetenv("QMAKESPEC").data()); #if defined(Q_OS_WIN32) target_mode = TARG_WIN_MODE; @@ -557,7 +557,7 @@ bool ProFileEvaluator::Private::read(ProFile *pro) return false; } - QString content(QString::fromLatin1(file.readAll())); // yes, really latin1 + QString content(QString::fromLocal8Bit(file.readAll())); file.close(); m_lineNo = 1; m_profileStack.push(pro); @@ -1377,10 +1377,10 @@ ProItem::ProItemReturn ProFileEvaluator::Private::visitProFile(ProFile *pro) if (m_option->qmakespec_name == QLatin1String("default")) { #ifdef Q_OS_UNIX char buffer[1024]; - int l = ::readlink(m_option->qmakespec.toLatin1().constData(), buffer, 1024); + int l = ::readlink(m_option->qmakespec.toLocal8Bit().constData(), buffer, 1024); if (l != -1) m_option->qmakespec_name = - IoUtils::fileName(QString::fromLatin1(buffer, l)).toString(); + IoUtils::fileName(QString::fromLocal8Bit(buffer, l)).toString(); #else // We can't resolve symlinks as they do on Unix, so configure.exe puts // the source of the qmake.conf at the end of the default/qmake.conf in @@ -1815,7 +1815,7 @@ QStringList ProFileEvaluator::Private::expandVariableReferences( QStringList replacement; if (var_type == ENVIRON) { - replacement = split_value_list(QString::fromLocal8Bit(qgetenv(var.toLatin1().constData()))); + replacement = split_value_list(QString::fromLocal8Bit(qgetenv(var.toLocal8Bit().constData()))); } else if (var_type == PROPERTY) { replacement << propertyValue(var); } else if (var_type == FUNCTION) { @@ -2199,9 +2199,9 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun logMessage(format("system(execute) requires one or two arguments.")); } else { char buff[256]; - FILE *proc = QT_POPEN((QLatin1String("cd ") + FILE *proc = QT_POPEN(QString(QLatin1String("cd ") + IoUtils::shellQuote(currentDirectory()) - + QLatin1String(" && ") + args[0]).toLatin1(), "r"); + + QLatin1String(" && ") + args[0]).toLocal8Bit(), "r"); bool singleLine = true; if (args.count() > 1) singleLine = (!args[1].compare(QLatin1String("true"), Qt::CaseInsensitive)); @@ -2215,7 +2215,7 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun buff[i] = ' '; } buff[read_in] = '\0'; - output += QLatin1String(buff); + output += QString::fromLocal8Bit(buff); } ret += split_value_list(output); if (proc) @@ -2843,7 +2843,7 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( } return returnBool(system((QLatin1String("cd ") + IoUtils::shellQuote(currentDirectory()) - + QLatin1String(" && ") + args.first()).toLatin1().constData()) == 0); + + QLatin1String(" && ") + args.first()).toLocal8Bit().constData()) == 0); } #endif case T_ISEMPTY: { @@ -3040,7 +3040,7 @@ QStringList ProFileEvaluator::Private::values(const QString &variableName) const case V_QMAKE_HOST_version_string: what = name.version; break; case V_QMAKE_HOST_arch: what = name.machine; break; } - ret = QString::fromLatin1(what); + ret = QString::fromLocal8Bit(what); } } #endif From 101f4d3f6539060ccc04ec2b364150c2d50f374f Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Wed, 9 Jun 2010 12:58:16 +0200 Subject: [PATCH 22/32] FileIconProvider calling itself instead of a second object. Reviewed-by: Friedemann Kleint --- src/plugins/coreplugin/fileiconprovider.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/plugins/coreplugin/fileiconprovider.cpp b/src/plugins/coreplugin/fileiconprovider.cpp index db06060a8ba..b2a39c0285f 100644 --- a/src/plugins/coreplugin/fileiconprovider.cpp +++ b/src/plugins/coreplugin/fileiconprovider.cpp @@ -90,7 +90,6 @@ struct FileIconProviderPrivate { // Mapping of file suffix to icon. StringIconPairList m_cache; - QFileIconProvider m_systemIconProvider; QIcon m_unknownFileIcon; // singleton pattern @@ -140,23 +139,23 @@ QIcon FileIconProvider::icon(const QFileInfo &fileInfo) const } // Get icon from OS. #if defined(Q_WS_WIN) || defined(Q_WS_MAC) - return d->m_systemIconProvider.icon(fileInfo); + return QFileIconProvider::icon(fileInfo); #else // File icons are unknown on linux systems. return (fileInfo.isDir()) ? - d->m_systemIconProvider.icon(fileInfo) : + QFileIconProvider::icon(fileInfo) : d->m_unknownFileIcon; #endif } QIcon FileIconProvider::icon(IconType type) const { - return d->m_systemIconProvider.icon(type); + return QFileIconProvider::icon(type); } QString FileIconProvider::type(const QFileInfo &info) const { - return d->m_systemIconProvider.type(info); + return QFileIconProvider::type(info); } /*! From 17f8cfe27d5fa5681945a8debb23afe99b6bd658 Mon Sep 17 00:00:00 2001 From: dt Date: Wed, 9 Jun 2010 13:20:45 +0200 Subject: [PATCH 23/32] Fix: Removing of last buildstep not possible after building --- src/plugins/projectexplorer/buildmanager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index a2f307075d2..2a2ef6ec1d9 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -198,6 +198,7 @@ void BuildManager::clearBuildQueue() m_buildQueue.clear(); m_running = false; m_previousBuildStepProject = 0; + m_currentBuildStep = 0; m_progressFutureInterface->reportCanceled(); m_progressFutureInterface->reportFinished(); @@ -353,6 +354,7 @@ void BuildManager::nextStep() m_previousBuildStepProject = 0; m_progressFutureInterface->reportFinished(); m_progressWatcher.setFuture(QFuture()); + m_currentBuildStep = 0; delete m_progressFutureInterface; m_progressFutureInterface = 0; m_maxProgress = 0; From 9f86cfaf3c42cc48242f25d537d034e648e0b4ce Mon Sep 17 00:00:00 2001 From: dt Date: Wed, 9 Jun 2010 13:21:08 +0200 Subject: [PATCH 24/32] Cmake: Don't delete run configurations on switching buildconfigurations Just disable them, but preserve them. This is different from qmake, but for qmake we do have different assumptions what a buildconfiguration is. Task-Nr: QTCREATORBUG-1591 --- .../cmakerunconfiguration.cpp | 22 +++++++++++++++---- .../cmakerunconfiguration.h | 6 +++++ .../cmakeprojectmanager/cmaketarget.cpp | 6 ++++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index f45a479008c..3d1c180ae01 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -80,7 +80,8 @@ CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, const QString m_buildTarget(target), m_workingDirectory(workingDirectory), m_title(title), - m_baseEnvironmentBase(CMakeRunConfiguration::BuildEnvironmentBase) + m_baseEnvironmentBase(CMakeRunConfiguration::BuildEnvironmentBase), + m_enabled(true) { ctor(); } @@ -94,7 +95,8 @@ CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, CMakeRunConfig m_title(source->m_title), m_arguments(source->m_arguments), m_userEnvironmentChanges(source->m_userEnvironmentChanges), - m_baseEnvironmentBase(source->m_baseEnvironmentBase) + m_baseEnvironmentBase(source->m_baseEnvironmentBase), + m_enabled(source->m_enabled) { ctor(); } @@ -293,9 +295,21 @@ ProjectExplorer::ToolChain::ToolChainType CMakeRunConfiguration::toolChainType() return bc->toolChainType(); } +void CMakeRunConfiguration::setEnabled(bool b) +{ + if (m_enabled == b) + return; + m_enabled = b; + emit isEnabledChanged(isEnabled()); + setDisplayName(m_title + (m_enabled ? "" : tr(" (disabled)"))); +} + +bool CMakeRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *bc) const +{ + return m_enabled && LocalApplicationRunConfiguration::isEnabled(bc); +} + // Configuration widget - - CMakeRunConfigurationWidget::CMakeRunConfigurationWidget(CMakeRunConfiguration *cmakeRunConfiguration, QWidget *parent) : QWidget(parent), m_ignoreChange(false), m_cmakeRunConfiguration(cmakeRunConfiguration) { diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h index c856f0bcc7c..c4f49c5da22 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h @@ -81,6 +81,11 @@ public: QVariantMap toMap() const; + void setEnabled(bool b); + + bool isEnabled(ProjectExplorer::BuildConfiguration *bc) const; + using LocalApplicationRunConfiguration::isEnabled; + signals: void baseEnvironmentChanged(); void userEnvironmentChangesChanged(const QList &diff); @@ -115,6 +120,7 @@ private: QString m_arguments; QList m_userEnvironmentChanges; BaseEnvironmentBase m_baseEnvironmentBase; + bool m_enabled; }; class CMakeRunConfigurationWidget : public QWidget diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.cpp b/src/plugins/cmakeprojectmanager/cmaketarget.cpp index 9e45ee2cdc0..f0feff5e31b 100644 --- a/src/plugins/cmakeprojectmanager/cmaketarget.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketarget.cpp @@ -120,6 +120,7 @@ void CMakeTarget::updateRunConfigurations() foreach (CMakeRunConfiguration *rc, list) { rc->setExecutable(ct.executable); rc->setWorkingDirectory(ct.workingDirectory); + rc->setEnabled(true); } existingRunConfigurations.remove(ct.title); } else { @@ -131,7 +132,10 @@ void CMakeTarget::updateRunConfigurations() existingRunConfigurations.constBegin(); for( ; it != existingRunConfigurations.constEnd(); ++it) { CMakeRunConfiguration *rc = it.value(); - removeRunConfiguration(rc); + // The executables for those runconfigurations aren't build by the current buildconfiguration + // We just set a disable flag and show that in the display name + rc->setEnabled(false); + // removeRunConfiguration(rc); } if (runConfigurations().isEmpty()) { // Oh no, no run configuration, From 92583024eee22df223e232a46992ee34ce2aae1b Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 9 Jun 2010 09:59:27 +0200 Subject: [PATCH 25/32] QmlDesigner: Removing unreachable code Pointed out by static code analysis. --- .../qmldesigner/components/formeditor/formeditorscene.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp index ba2896d8ceb..10287437a07 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp @@ -223,10 +223,6 @@ void FormEditorScene::dragLeaveEvent(QGraphicsSceneDragDropEvent * event) currentTool()->dragLeaveEvent(event); return; - - if (m_dragNode.isValid()) { - m_dragNode.destroy(); - } } void FormEditorScene::dragMoveEvent(QGraphicsSceneDragDropEvent * event) From 740717f060c0668377ec9c18b68e73daffe41c4c Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 9 Jun 2010 16:22:27 +0200 Subject: [PATCH 26/32] Fix crash when loading a .qmlproject with a custom run configuration Task-number: QTCREATORBUG-1609 --- 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 ee72f414cd7..f4532b5dac3 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -258,7 +258,7 @@ bool QmlProject::fromMap(const QVariantMap &map) refresh(Everything); // FIXME workaround to guarantee that run/debug actions are enabled if a valid file exists - QmlProjectRunConfiguration *runConfig = static_cast(activeTarget()->activeRunConfiguration()); + QmlProjectRunConfiguration *runConfig = qobject_cast(activeTarget()->activeRunConfiguration()); if (runConfig) runConfig->changeCurrentFile(0); From 6056c3e126197c3afaaa9a7ddc77885162ac552b Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Wed, 9 Jun 2010 16:53:56 +0200 Subject: [PATCH 27/32] Cleaned up calls to parent class's functions --- src/plugins/coreplugin/fileiconprovider.cpp | 10 ---------- src/plugins/coreplugin/fileiconprovider.h | 3 +-- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/plugins/coreplugin/fileiconprovider.cpp b/src/plugins/coreplugin/fileiconprovider.cpp index b2a39c0285f..8f2d50863d0 100644 --- a/src/plugins/coreplugin/fileiconprovider.cpp +++ b/src/plugins/coreplugin/fileiconprovider.cpp @@ -148,16 +148,6 @@ QIcon FileIconProvider::icon(const QFileInfo &fileInfo) const #endif } -QIcon FileIconProvider::icon(IconType type) const -{ - return QFileIconProvider::icon(type); -} - -QString FileIconProvider::type(const QFileInfo &info) const -{ - return QFileIconProvider::type(info); -} - /*! Creates a pixmap with baseicon at size and overlays overlayIcon over it. See platform note in class documentation about recommended usage. diff --git a/src/plugins/coreplugin/fileiconprovider.h b/src/plugins/coreplugin/fileiconprovider.h index 31fef66ea89..b834459ae19 100644 --- a/src/plugins/coreplugin/fileiconprovider.h +++ b/src/plugins/coreplugin/fileiconprovider.h @@ -56,9 +56,8 @@ public: virtual ~FileIconProvider(); // Implement QFileIconProvider - virtual QIcon icon(IconType type) const; virtual QIcon icon(const QFileInfo &info) const; - virtual QString type(const QFileInfo &info) const; + using QFileIconProvider::icon; // Register additional overlay icons static QPixmap overlayIcon(QStyle::StandardPixmap baseIcon, const QIcon &overlayIcon, const QSize &size); From 7f90a96f886435e63db9539415feee795540bf36 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 10 Jun 2010 10:04:19 +0200 Subject: [PATCH 28/32] don't link to the jom project page but to the download location On the project page isn't much information for the end user. --- src/plugins/projectexplorer/projectexplorersettingspage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/projectexplorersettingspage.ui b/src/plugins/projectexplorer/projectexplorersettingspage.ui index 109626f89a9..a08005b5f3a 100644 --- a/src/plugins/projectexplorer/projectexplorersettingspage.ui +++ b/src/plugins/projectexplorer/projectexplorersettingspage.ui @@ -101,7 +101,7 @@ - <i>jom</i> is a drop-in replacement for <i>nmake</i> which distributes the compilation process to multiple CPU cores. For more details, see the <a href="http://qt.gitorious.org/qt-labs/jom/">jom Homepage</a>. Disable it if you experience problems with your builds. + <i>jom</i> is a drop-in replacement for <i>nmake</i> which distributes the compilation process to multiple CPU cores. The latest binary is available at <a href="ftp://ftp.qt.nokia.com/jom/">ftp://ftp.qt.nokia.com/jom/</a>. Disable it if you experience problems with your builds. true From ef48306ba74fa46521ac05f3dbba4ce923da2e69 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 10 Jun 2010 09:10:11 +0200 Subject: [PATCH 29/32] QmlProject: Consistently enable/disable debug & run buttons The heuristics to find the file to run and the logic that decides whether the show / debug button is shown weren't in sync. Also, don't try to run .qmlproject files if open in the editor. Reviewed-by: Lasse Holmstedt --- .../qmlprojectrunconfiguration.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index da51b8bc591..3b959f83af0 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -85,12 +85,7 @@ bool QmlProjectRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration * { Q_UNUSED(bc); - if (!QFile::exists(mainScript()) - || !Core::ICore::instance()->mimeDatabase()->findByFile(mainScript()).matchesType(QLatin1String("application/x-qml"))) - { - return false; - } - return true; + return m_isEnabled; } void QmlProjectRunConfiguration::ctor() @@ -326,15 +321,17 @@ void QmlProjectRunConfiguration::changeCurrentFile(Core::IEditor *editor) bool enable = false; if (editor) { m_currentFileFilename = editor->file()->fileName(); - if (Core::ICore::instance()->mimeDatabase()->findByFile(mainScript()).matchesType(QLatin1String("application/x-qml"))) + if (Core::ICore::instance()->mimeDatabase()->findByFile(mainScript()).type() == QLatin1String("application/x-qml")) enable = true; - } else { + } + if (!editor + || Core::ICore::instance()->mimeDatabase()->findByFile(mainScript()).type() == QLatin1String("application/x-qmlproject")) { // find a qml file with lowercase filename. This is slow but only done in initialization/other border cases. foreach(const QString& filename, m_projectTarget->qmlProject()->files()) { const QFileInfo fi(filename); if (!filename.isEmpty() && fi.baseName()[0].isLower() - && Core::ICore::instance()->mimeDatabase()->findByFile(fi).matchesType(QLatin1String("application/x-qml"))) + && Core::ICore::instance()->mimeDatabase()->findByFile(fi).type() == QLatin1String("application/x-qml")) { m_currentFileFilename = filename; enable = true; From 190fdf360c127ed6e788d0a57303ecc5f7961923 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 10 Jun 2010 10:25:16 +0200 Subject: [PATCH 30/32] QmlDesigner: Add test case for Rewriter not removing Ids form model Task-number: BAUHAUS-780 --- .../qml/qmldesigner/coretests/testcore.cpp | 33 +++++++++++++++++++ .../auto/qml/qmldesigner/coretests/testcore.h | 1 + 2 files changed, 34 insertions(+) diff --git a/tests/auto/qml/qmldesigner/coretests/testcore.cpp b/tests/auto/qml/qmldesigner/coretests/testcore.cpp index 89429e2a92c..1b40436aff6 100644 --- a/tests/auto/qml/qmldesigner/coretests/testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/testcore.cpp @@ -5426,6 +5426,39 @@ void TestCore::testRewriterChangeId() node.setId("myId"); } +void TestCore::testRewriterRemoveId() +{ + const char* qmlString = "import Qt 4.7\nRectangle { id: rect }"; + + QPlainTextEdit textEdit; + textEdit.setPlainText(qmlString); + NotIndentingTextEditModifier textModifier(&textEdit); + + QScopedPointer model(Model::create("Qt/Item")); + QVERIFY(model.data()); + + QScopedPointer view(new TestView); + QVERIFY(view.data()); + model->attachView(view.data()); + + QScopedPointer testRewriterView(new TestRewriterView()); + testRewriterView->setTextModifier(&textModifier); + model->attachView(testRewriterView.data()); + + ModelNode rootModelNode(view->rootModelNode()); + QVERIFY(rootModelNode.isValid()); + QCOMPARE(rootModelNode.id(), QString("rect")); + + QSKIP("Fix me!!!! Task BAUHAUS-780", SkipAll); + // + // remove id in text + // + const char* qmlString2 = "import Qt 4.7\nRectangle { }"; + textEdit.setPlainText(qmlString2); + + QCOMPARE(rootModelNode.id(), QString()); +} + void TestCore::testRewriterChangeValueProperty() { const char* qmlString = "import Qt 4.7\nRectangle { x: 10; y: 10 }"; diff --git a/tests/auto/qml/qmldesigner/coretests/testcore.h b/tests/auto/qml/qmldesigner/coretests/testcore.h index f3cbc8ebe8e..685a1e6a729 100644 --- a/tests/auto/qml/qmldesigner/coretests/testcore.h +++ b/tests/auto/qml/qmldesigner/coretests/testcore.h @@ -87,6 +87,7 @@ private slots: void testRewriterView(); void testRewriterErrors(); void testRewriterChangeId(); + void testRewriterRemoveId(); void testRewriterChangeValueProperty(); void testRewriterRemoveValueProperty(); void testRewriterSignalProperty(); From b099596858af3617294caea71f7c8959a6b3ccbe Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 8 Jun 2010 14:19:05 +0200 Subject: [PATCH 31/32] Fix targetsetuppage's shadowbuild dirs * Fix displayed shadow build location * Fix shadow build location used by newly set up shadow builds Task-number: QTCREATORBUG-1599 Reviewed-by: dt (cherry picked from commit 1d8e176067c48705cdfd746e2c1fb23539f58a8e) --- src/plugins/projectexplorer/project.cpp | 8 +++++++- src/plugins/projectexplorer/project.h | 1 + .../qt4projectmanager/projectloadwizard.cpp | 2 +- src/plugins/qt4projectmanager/qt4project.cpp | 9 +++++++-- src/plugins/qt4projectmanager/qt4project.h | 1 + src/plugins/qt4projectmanager/qt4target.cpp | 17 +++++++++++------ src/plugins/qt4projectmanager/qt4target.h | 1 + .../qt4projectmanager/wizards/qtwizard.cpp | 2 +- .../wizards/targetsetuppage.cpp | 19 ++++++++++--------- .../wizards/targetsetuppage.h | 2 +- 10 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index fb6793b9d55..bdea6c9ef2b 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -229,10 +229,16 @@ QVariantMap Project::toMap() const QString Project::projectDirectory() const { - QFileInfo info(file()->fileName()); + return projectDirectory(file()->fileName()); +} + +QString Project::projectDirectory(const QString &proFile) +{ + QFileInfo info(proFile); return info.absoluteDir().path(); } + bool Project::fromMap(const QVariantMap &map) { if (map.contains(QLatin1String(EDITOR_SETTINGS_KEY))) { diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 79f4f8ba4aa..01b4569cb37 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -129,6 +129,7 @@ public: // The directory that holds the project file. This includes the absolute path. QString projectDirectory() const; + static QString projectDirectory(const QString &proFile); signals: void fileListChanged(); diff --git a/src/plugins/qt4projectmanager/projectloadwizard.cpp b/src/plugins/qt4projectmanager/projectloadwizard.cpp index 89dae97b505..334dce57fd4 100644 --- a/src/plugins/qt4projectmanager/projectloadwizard.cpp +++ b/src/plugins/qt4projectmanager/projectloadwizard.cpp @@ -99,7 +99,7 @@ void ProjectLoadWizard::setupTargetPage() m_project->file()->fileName()); importVersions.append(TargetSetupPage::recursivelyCheckDirectoryForBuild(m_project->defaultTopLevelBuildDirectory(), m_project->file()->fileName())); - importVersions.append(TargetSetupPage::importInfosForKnownQtVersions(m_project)); + importVersions.append(TargetSetupPage::importInfosForKnownQtVersions()); m_targetSetupPage = new TargetSetupPage(this); m_targetSetupPage->setProFilePath(m_project->file()->fileName()); diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index e72aca89126..006352f4a01 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -780,8 +780,13 @@ bool Qt4Project::wasEvaluateCanceled() QString Qt4Project::defaultTopLevelBuildDirectory() const { - QFileInfo info(file()->fileName()); - return QDir(projectDirectory() + QLatin1String("/../") + info.baseName() + QLatin1String("-build")).absolutePath(); + return defaultTopLevelBuildDirectory(file()->fileName()); +} + +QString Qt4Project::defaultTopLevelBuildDirectory(const QString &profilePath) +{ + QFileInfo info(profilePath); + return QDir(projectDirectory(profilePath) + QLatin1String("/../") + info.baseName() + QLatin1String("-build")).absolutePath(); } void Qt4Project::asyncUpdate() diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index 84aad0efd18..a9629a5b787 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -160,6 +160,7 @@ public: bool wasEvaluateCanceled(); QString defaultTopLevelBuildDirectory() const; + static QString defaultTopLevelBuildDirectory(const QString &profilePath); signals: /// emitted after parse diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp index 784897f6461..59b8c1bd9b2 100644 --- a/src/plugins/qt4projectmanager/qt4target.cpp +++ b/src/plugins/qt4projectmanager/qt4target.cpp @@ -366,23 +366,28 @@ QString Qt4Target::defaultBuildDirectory() const ) return project()->projectDirectory(); + return defaultShadowBuildDirectory(qt4Project()->defaultTopLevelBuildDirectory(), id()); +} + +QString Qt4Target::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id) +{ QString shortName = QLatin1String("unknown"); - if (id() == QLatin1String(Constants::DESKTOP_TARGET_ID)) + if (id == QLatin1String(Constants::DESKTOP_TARGET_ID)) shortName = QLatin1String("desktop"); - else if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) + else if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) shortName = QLatin1String("symbian_emulator"); - else if (id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) + else if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) shortName = QLatin1String("symbian"); - else if (id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)) + else if (id == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)) shortName = QLatin1String("maemo"); - else if (id() == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID)) + else if (id == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID)) shortName = QLatin1String("simulator"); // currently we can't have the build directory to be deeper then the source directory // since that is broken in qmake // Once qmake is fixed we can change that to have a top directory and // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') ) - return qt4Project()->defaultTopLevelBuildDirectory() + QChar('-') + shortName; + return projectLocation + QChar('-') + shortName; } bool Qt4Target::fromMap(const QVariantMap &map) diff --git a/src/plugins/qt4projectmanager/qt4target.h b/src/plugins/qt4projectmanager/qt4target.h index 13b9d2c7995..9b7f7f0c2a2 100644 --- a/src/plugins/qt4projectmanager/qt4target.h +++ b/src/plugins/qt4projectmanager/qt4target.h @@ -81,6 +81,7 @@ public: ProjectExplorer::ToolChain::ToolChainType preferredToolChainType(const QList &candidates) const; QString defaultBuildDirectory() const; + static QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id); signals: void buildDirectoryInitialized(); diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp index a6211f9846b..65954e9394e 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp @@ -236,7 +236,7 @@ int BaseQt4ProjectWizardDialog::addTargetSetupPage(QSet targets, bool m connect(this, SIGNAL(projectLocationChanged(QString)), m_targetSetupPage, SLOT(setProFilePath(QString))); - QList infos = TargetSetupPage::importInfosForKnownQtVersions(0); + QList infos = TargetSetupPage::importInfosForKnownQtVersions(); if (!targets.isEmpty()) infos = TargetSetupPage::filterImportInfos(targets, infos); m_targetSetupPage->setImportDirectoryBrowsingEnabled(false); diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index edb1a8a3235..111dea1c0c4 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -168,7 +168,15 @@ void TargetSetupPage::setImportInfos(const QList &infos) versionItem->setToolTip(1, status); // Column 2 (directory): - const QString dir = QDir::toNativeSeparators(i.directory); + QString dir; + if (i.directory.isEmpty()) { + if (i.version->supportsShadowBuilds()) + dir = QDir::toNativeSeparators(Qt4Target::defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(m_proFilePath), t)); + else + dir = QDir::toNativeSeparators(Qt4Project::projectDirectory(m_proFilePath)); + } else { + dir = QDir::toNativeSeparators(i.directory); + } versionItem->setText(2, dir); versionItem->setToolTip(2, dir); } @@ -308,8 +316,7 @@ void TargetSetupPage::setProFilePath(const QString &path) setImportInfos(tmp); } -QList -TargetSetupPage::importInfosForKnownQtVersions(Qt4ProjectManager::Qt4Project *project) +QList TargetSetupPage::importInfosForKnownQtVersions() { QList results; QtVersionManager * vm = QtVersionManager::instance(); @@ -319,12 +326,6 @@ TargetSetupPage::importInfosForKnownQtVersions(Qt4ProjectManager::Qt4Project *pr validVersions.append(vm->versions().at(0)); // there is always one! foreach (QtVersion *v, validVersions) { ImportInfo info; - if (project) { - if (v->supportsShadowBuilds()) - info.directory = project->defaultTopLevelBuildDirectory(); - else - info.directory = project->projectDirectory(); - } info.isExistingBuild = false; info.isTemporary = false; info.version = v; diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h index a60c3863957..27985d76227 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h @@ -99,7 +99,7 @@ public: void setShowLocationInformation(bool location); void setPreferMobile(bool mobile); - static QList importInfosForKnownQtVersions(Qt4ProjectManager::Qt4Project *project); + static QList importInfosForKnownQtVersions(); static QList filterImportInfos(const QSet &validTargets, const QList &infos); From 2de4a98ce0247efef280b6648c707e8575481c48 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Thu, 10 Jun 2010 11:18:14 +0200 Subject: [PATCH 32/32] Fixed id syncing when and id gets removed from the QML source. Task-number: BAUHAUS-780 Reviewed-by: kkoehne --- .../qmldesigner/designercore/model/texttomodelmerger.cpp | 7 ++++++- tests/auto/qml/qmldesigner/coretests/testcore.cpp | 3 +-- tests/auto/qml/qmldesigner/coretests/testrewriterview.cpp | 4 +++- tests/auto/qml/qmldesigner/coretests/testrewriterview.h | 3 ++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index cf5dd941500..81a1dd18d62 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -636,6 +636,8 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, context->enterScope(astNode); QSet modelPropertyNames = QSet::fromList(modelNode.propertyNames()); + if (!modelNode.id().isEmpty()) + modelPropertyNames.insert(QLatin1String("id")); QList defaultPropertyItems; for (UiObjectMemberList *iter = astInitializer->members; iter; iter = iter->next) { @@ -744,7 +746,10 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, AbstractProperty modelProperty = modelNode.property(modelPropertyName); // property deleted. - differenceHandler.propertyAbsentFromQml(modelProperty); + if (modelPropertyName == QLatin1String("id")) + differenceHandler.idsDiffer(modelNode, QString()); + else + differenceHandler.propertyAbsentFromQml(modelProperty); } context->leaveScope(); diff --git a/tests/auto/qml/qmldesigner/coretests/testcore.cpp b/tests/auto/qml/qmldesigner/coretests/testcore.cpp index 1b40436aff6..b3a36212ce4 100644 --- a/tests/auto/qml/qmldesigner/coretests/testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/testcore.cpp @@ -5441,7 +5441,7 @@ void TestCore::testRewriterRemoveId() QVERIFY(view.data()); model->attachView(view.data()); - QScopedPointer testRewriterView(new TestRewriterView()); + QScopedPointer testRewriterView(new TestRewriterView(0, TestRewriterView::Amend)); testRewriterView->setTextModifier(&textModifier); model->attachView(testRewriterView.data()); @@ -5449,7 +5449,6 @@ void TestCore::testRewriterRemoveId() QVERIFY(rootModelNode.isValid()); QCOMPARE(rootModelNode.id(), QString("rect")); - QSKIP("Fix me!!!! Task BAUHAUS-780", SkipAll); // // remove id in text // diff --git a/tests/auto/qml/qmldesigner/coretests/testrewriterview.cpp b/tests/auto/qml/qmldesigner/coretests/testrewriterview.cpp index b12c164a6de..eb3cf27b80b 100644 --- a/tests/auto/qml/qmldesigner/coretests/testrewriterview.cpp +++ b/tests/auto/qml/qmldesigner/coretests/testrewriterview.cpp @@ -83,7 +83,9 @@ VariantProperty TestModelToTextMerger::findAddedVariantProperty(const VariantPro return VariantProperty(); } -TestRewriterView::TestRewriterView(QObject *parent) : RewriterView(RewriterView::Validate, parent) +TestRewriterView::TestRewriterView(QObject *parent, + DifferenceHandling differenceHandling) + : RewriterView(differenceHandling, parent) { } diff --git a/tests/auto/qml/qmldesigner/coretests/testrewriterview.h b/tests/auto/qml/qmldesigner/coretests/testrewriterview.h index 0fa319f2199..c313fe5bed9 100644 --- a/tests/auto/qml/qmldesigner/coretests/testrewriterview.h +++ b/tests/auto/qml/qmldesigner/coretests/testrewriterview.h @@ -53,7 +53,8 @@ class TestRewriterView : public RewriterView Q_OBJECT public: - TestRewriterView(QObject *parent = 0); + TestRewriterView(QObject *parent = 0, + DifferenceHandling differenceHandling = RewriterView::Validate); Internal::TestModelToTextMerger *modelToTextMerger() const; Internal::TextToModelMerger *textToModelMerger() const;