From 5c93baca450d17910edeee267915d8e6ed90c515 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 12 Mar 2012 15:00:32 +0100 Subject: [PATCH 01/29] WelcomePage: fix vertical "Scrollbar" lines The lines are hidden now if the scrollbar gets visible. This avoids visual artifacts depending on styling. Change-Id: I2bce04273385c05c545fff3d5f1a8f0c898abdb9 Reviewed-by: Alessandro Portale --- share/qtcreator/welcomescreen/develop.qml | 8 +++++--- share/qtcreator/welcomescreen/widgets/RecentProjects.qml | 3 ++- share/qtcreator/welcomescreen/widgets/Sessions.qml | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/share/qtcreator/welcomescreen/develop.qml b/share/qtcreator/welcomescreen/develop.qml index c106084ca76..0dac47a8833 100644 --- a/share/qtcreator/welcomescreen/develop.qml +++ b/share/qtcreator/welcomescreen/develop.qml @@ -66,12 +66,13 @@ Rectangle { Rectangle { width: 1 - height: line.height + height: Math.max(Math.min(recentProjects.contentHeight + 120, recentProjects.height), sessions.height) color: "#c4c4c4" anchors.left: sessions.right anchors.leftMargin: -1 anchors.top: sessions.top - + visible: !sessions.scrollBarVisible + id: sessionLine } RecentProjects { @@ -96,11 +97,12 @@ Rectangle { Rectangle { id: line width: 1 - height: Math.min(recentProjects.contentHeight + 120, recentProjects.height) + height: sessionLine.height color: "#c4c4c4" anchors.left: recentProjects.right anchors.leftMargin: -1 anchors.top: recentProjects.top + visible: !recentProjects.scrollBarVisible } Text { diff --git a/share/qtcreator/welcomescreen/widgets/RecentProjects.qml b/share/qtcreator/welcomescreen/widgets/RecentProjects.qml index e3b6c853389..74c01bb2c0f 100644 --- a/share/qtcreator/welcomescreen/widgets/RecentProjects.qml +++ b/share/qtcreator/welcomescreen/widgets/RecentProjects.qml @@ -34,7 +34,8 @@ import QtQuick 1.0 import qtcomponents 1.0 ScrollArea { - //id: projectList + property bool scrollBarVisible: projectList.verticalScrollBar.visible + id: projectList property alias model: repeater.model Behavior on verticalScrollBar.opacity { diff --git a/share/qtcreator/welcomescreen/widgets/Sessions.qml b/share/qtcreator/welcomescreen/widgets/Sessions.qml index db970a2a144..ac8970c7666 100644 --- a/share/qtcreator/welcomescreen/widgets/Sessions.qml +++ b/share/qtcreator/welcomescreen/widgets/Sessions.qml @@ -38,6 +38,8 @@ Item { property int topMargin: 6 height: Math.min(root.contentHeight + topMargin, parent.height - 260) + property alias scrollBarVisible: vscrollbar.visible + ListView { id: root From 81e4216cd62ea309d3da8a67ad5d1d4d08240f51 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Tue, 6 Mar 2012 20:14:20 +0200 Subject: [PATCH 02/29] Fix qbs build. Cherry-picked from 36effe8cb41eb818afc23defad8354f30f731075 Change-Id: Ica43f7e10cbee5556f32f73bc2091b138e8847e8 Reviewed-by: Christian Kandeler --- share/share.qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/share.qbs b/share/share.qbs index de9b59400c5..081e3a72e3c 100644 --- a/share/share.qbs +++ b/share/share.qbs @@ -276,7 +276,7 @@ Product { "qtcreator/welcomescreen/widgets/PageCaption.qml", "qtcreator/welcomescreen/widgets/SessionItem.qml", "qtcreator/welcomescreen/widgets/Delegate.qml", - "qtcreator/welcomescreen/widgets/RecentSessions.qml", + "qtcreator/welcomescreen/widgets/Sessions.qml", "qtcreator/welcomescreen/widgets/GettingStartedItem.qml", ] } From 0cf5044d5a76424a1407029fff62dd90eab537bd Mon Sep 17 00:00:00 2001 From: Simjees Abraham Date: Mon, 12 Mar 2012 16:49:28 +0100 Subject: [PATCH 03/29] Set the parent window correctly for Code paster window. Task-number: QTCREATORBUG-7050 Change-Id: I0d57535a40b0cb29d90d3a7b753d85613a72ac61 Reviewed-by: Friedemann Kleint --- src/plugins/cpaster/cpasterplugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cpaster/cpasterplugin.cpp b/src/plugins/cpaster/cpasterplugin.cpp index 94c943d578e..9d6da9f2ff2 100644 --- a/src/plugins/cpaster/cpasterplugin.cpp +++ b/src/plugins/cpaster/cpasterplugin.cpp @@ -253,7 +253,7 @@ void CodepasterPlugin::post(QString data, const QString &mimeType) const QString username = m_settings->username; - PasteView view(m_protocols, mimeType, 0); + PasteView view(m_protocols, mimeType, ICore::mainWindow()); view.setProtocol(m_settings->protocol); const FileDataList diffChunks = splitDiffToFiles(data); From a450c13327124483ff36546a4c1f8488aa945c39 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Thu, 8 Mar 2012 15:53:28 +0100 Subject: [PATCH 04/29] CppEditor: Fix go to definition of macros. - Go to macro definition only on macro name (ie not in parameters). - Prefer macro definition over expanded code definition, as the preprocessor is executed first: when trying to go to definition, the user sees the macro, not the expanded code. Task-number: QTCREATORBUG-2240 Task-number: QTCREATORBUG-6175 Task-number: QTCREATORBUG-6848 Task-number: QTCREATORBUG-7008 Task-number: QTCREATORBUG-7009 Change-Id: I819c763524e79b20518c26a46a99a3a3b0a131bd Reviewed-by: Andre Hartmann Reviewed-by: Orgad Shaneh Reviewed-by: Erik Verbruggen --- src/libs/cplusplus/CppDocument.cpp | 4 +-- src/plugins/cppeditor/cppeditor.cpp | 41 ++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 0c0f7c2e93d..ec617ff9298 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -473,7 +473,7 @@ const Macro *Document::findMacroDefinitionAt(unsigned line) const const Document::MacroUse *Document::findMacroUseAt(unsigned offset) const { foreach (const Document::MacroUse &use, _macroUses) { - if (use.contains(offset)) + if (use.contains(offset) && (offset < use.begin() + use.macro().name().length())) return &use; } return 0; @@ -482,7 +482,7 @@ const Document::MacroUse *Document::findMacroUseAt(unsigned offset) const const Document::UndefinedMacroUse *Document::findUndefinedMacroUseAt(unsigned offset) const { foreach (const Document::UndefinedMacroUse &use, _undefinedMacroUses) { - if (use.contains(offset)) + if (use.contains(offset) && (offset < use.begin() + use.name().length())) return &use; } return 0; diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 4bf4a4fc40b..e6149b9bacd 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -707,11 +707,14 @@ const Macro *CPPEditorWidget::findCanonicalMacro(const QTextCursor &cursor, Docu int line, col; convertPosition(cursor.position(), &line, &col); - if (const Macro *macro = doc->findMacroDefinitionAt(line)) - return macro; - - if (const Document::MacroUse *use = doc->findMacroUseAt(cursor.position())) + if (const Macro *macro = doc->findMacroDefinitionAt(line)) { + QTextCursor macroCursor = cursor; + const QByteArray name = identifierUnderCursor(¯oCursor).toLatin1(); + if (macro->name() == name) + return macro; + } else if (const Document::MacroUse *use = doc->findMacroUseAt(cursor.position())) { return &use->macro(); + } return 0; } @@ -722,12 +725,13 @@ void CPPEditorWidget::findUsages() info.snapshot = CppModelManagerInterface::instance()->snapshot(); info.snapshot.insert(info.doc); - CanonicalSymbol cs(this, info); - Symbol *canonicalSymbol = cs(textCursor()); - if (canonicalSymbol) { - m_modelManager->findUsages(canonicalSymbol, cs.context()); - } else if (const Macro *macro = findCanonicalMacro(textCursor(), info.doc)) { + if (const Macro *macro = findCanonicalMacro(textCursor(), info.doc)) { m_modelManager->findMacroUsages(*macro); + } else { + CanonicalSymbol cs(this, info); + Symbol *canonicalSymbol = cs(textCursor()); + if (canonicalSymbol) + m_modelManager->findUsages(canonicalSymbol, cs.context()); } } @@ -1381,6 +1385,25 @@ CPPEditorWidget::Link CPPEditorWidget::findLinkAt(const QTextCursor &cursor, tc.setPosition(endOfToken); } + // Handle macro uses + const Macro *macro = doc->findMacroDefinitionAt(line); + if (macro) { + QTextCursor macroCursor = cursor; + const QByteArray name = identifierUnderCursor(¯oCursor).toLatin1(); + if (macro->name() == name) + return link; //already on definition! + } else { + const Document::MacroUse *use = doc->findMacroUseAt(endOfToken - 1); + if (use && use->macro().fileName() != QLatin1String("")) { + const Macro ¯o = use->macro(); + link.fileName = macro.fileName(); + link.line = macro.line(); + link.begin = use->begin(); + link.end = use->end(); + return link; + } + } + // Find the last symbol up to the cursor position Scope *scope = doc->scopeAt(line, column); if (!scope) From d88faf03a99c0d5630b378b95fcea7b8cbb7726f Mon Sep 17 00:00:00 2001 From: Yuchen Deng Date: Thu, 8 Mar 2012 14:39:07 +0800 Subject: [PATCH 05/29] Fix detection of Microsoft SDKs Change-Id: I44401c859279978ad13df52b589f29a39cc53042 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/msvctoolchain.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index 4c09b36ea8f..a73f04eb959 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -546,21 +546,24 @@ QList MsvcToolChainFactory::autoDetect() if (folder.isEmpty()) continue; - const QString sdkVcVarsBat = folder + QLatin1String("bin\\SetEnv.cmd"); - if (!QFileInfo(sdkVcVarsBat).exists()) + QDir dir(folder); + if (!dir.cd(QLatin1String("bin"))) + continue; + QFileInfo fi(dir, QLatin1String("SetEnv.cmd")); + if (!fi.exists()) continue; - QList tmp; + QList tmp; tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::s32), findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::s32, version), - sdkVcVarsBat, QLatin1String("/x86"), true)); + fi.absoluteFilePath(), QLatin1String("/x86"), true)); // Add all platforms tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::s64), findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::s64, version), - sdkVcVarsBat, QLatin1String("/x64"), true)); + fi.absoluteFilePath(), QLatin1String("/x64"), true)); tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::ia64), findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::ia64, version), - sdkVcVarsBat, QLatin1String("/ia64"), true)); + fi.absoluteFilePath(), QLatin1String("/ia64"), true)); // Make sure the default is front. if (folder == defaultSdkPath) results = tmp + results; From b03dbee78458c41dcb22cfaf6b67a77cfae3c10d Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 13 Mar 2012 09:26:30 +0100 Subject: [PATCH 06/29] Fix warning about use on unitialized variable, potential crash. Change-Id: I69bce05bb758b78f5cc7776a698ebcac509844dd Reviewed-by: Daniel Teske --- src/plugins/qt4projectmanager/qt4projectmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp index a57a903b3fc..5a0c459f348 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp @@ -201,7 +201,7 @@ void Qt4Manager::updateVariable(const QByteArray &variable) return; } QString value; - QtSupport::BaseQtVersion *qtv; + const QtSupport::BaseQtVersion *qtv = 0; if (Qt4BaseTarget *t = qt4pro->activeTarget()) { if (Qt4BuildConfiguration *bc = t->activeQt4BuildConfiguration()) qtv = bc->qtVersion(); From 1c2272772e2f4d4890106bd7b60e507570dad224 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 12 Mar 2012 18:38:59 +0100 Subject: [PATCH 07/29] debugger: better display of the "local format follows type" option Task-number: QTCREATORBUG-7076 Change-Id: Ice0c2567c0db63c6c0bb76866dc9cff876a92b87 Reviewed-by: hjk --- src/plugins/debugger/watchwindow.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp index 06e18efd7e3..0350bb03e48 100644 --- a/src/plugins/debugger/watchwindow.cpp +++ b/src/plugins/debugger/watchwindow.cpp @@ -631,8 +631,6 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev) mi0.data(LocalsTypeFormatRole).toInt(); const int individualFormat = mi0.data(LocalsIndividualFormatRole).toInt(); - const int effectiveIndividualFormat = - individualFormat == -1 ? typeFormat : individualFormat; const int unprintableBase = handler->unprintableBase(); QMenu formatMenu; @@ -667,16 +665,18 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev) QAction *dummy = formatMenu.addAction( tr("Change Display for Object Named \"%1\":").arg(mi0.data().toString())); dummy->setEnabled(false); - clearIndividualFormatAction - = formatMenu.addAction(spacer + tr("Use Display Format Based on Type")); - //clearIndividualFormatAction->setEnabled(individualFormat != -1); + QString msg = (individualFormat == -1 && typeFormat != -1) + ? tr("Use Format for Type (Currently %1)") + .arg(alternativeFormats.at(typeFormat)) + : tr("Use Display Format Based on Type "); + clearIndividualFormatAction = formatMenu.addAction(spacer + msg); clearIndividualFormatAction->setCheckable(true); - clearIndividualFormatAction->setChecked(effectiveIndividualFormat == -1); + clearIndividualFormatAction->setChecked(individualFormat == -1); for (int i = 0; i != alternativeFormats.size(); ++i) { const QString format = spacer + alternativeFormats.at(i); QAction *act = new QAction(format, &formatMenu); act->setCheckable(true); - if (i == effectiveIndividualFormat) + if (i == individualFormat) act->setChecked(true); formatMenu.addAction(act); individualFormatActions.append(act); From 5a3473fe962d6aada9a3464b9ab5bc7669e07205 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 13 Mar 2012 10:38:44 +0100 Subject: [PATCH 08/29] debugger: unbreak display of non-7bit-clean data Task-number: QTCREATORBUG-7086 Change-Id: Ia38c27b66dcd98b84c09bb0dc50bd2cd19470400 Reviewed-by: hjk --- src/plugins/debugger/watchdata.cpp | 23 +++++++++++++++++++---- src/plugins/debugger/watchhandler.cpp | 18 ++++++++++-------- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/plugins/debugger/watchdata.cpp b/src/plugins/debugger/watchdata.cpp index d8112360b00..8d6ed6bce5a 100644 --- a/src/plugins/debugger/watchdata.cpp +++ b/src/plugins/debugger/watchdata.cpp @@ -83,10 +83,11 @@ bool isIntType(const QByteArray &type) case 'c': return type == "char"; case 'i': - return type == "int" || type == "int64"; + return type == "int"; case 'l': return type == "long" - || type.startsWith("long "); + || type == "long int" + || type == "long unsigned int"; case 'p': return type == "ptrdiff_t"; case 'q': @@ -100,10 +101,24 @@ bool isIntType(const QByteArray &type) || type == "size_t" || type == "std::size_t" || type == "std::ptrdiff_t" - || type.startsWith("signed "); + || (type.startsWith("signed") && + ( type == "signed char" + || type == "signed short" + || type == "signed short int" + || type == "signed long" + || type == "signed long int" + || type == "signed long long" + || type == "signed long long int")); case 'u': return type == "unsigned" - || type.startsWith("unsigned "); + || (type.startsWith("unsigned") && + ( type == "unsigned char" + || type == "unsigned short" + || type == "unsigned short int" + || type == "unsigned long" + || type == "unsigned long int" + || type == "unsigned long long" + || type == "unsigned long long int")); default: return false; } diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 720a2232c3e..95e066fd201 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -378,8 +378,9 @@ static QString reformatCharacter(int code, int format) const QString codeS = reformatInteger(code, format); if (code < 0) // Append unsigned value. return codeS + QLatin1String(" / ") + reformatInteger(256 + code, format); - if (code >= 32 && code < 128) - return codeS + QLatin1String(" '") + QChar(code) + QLatin1Char('\''); + const QChar c = QLatin1Char(code); + if (c.isPrint()) + return codeS + QLatin1String(" '") + c + QLatin1Char('\''); switch (code) { case 0: return codeS + QLatin1String(" '\\0'"); @@ -402,7 +403,7 @@ static QString quoteUnprintable(const QString &str) if (WatchHandler::unprintableBase() == -1) { foreach (const QChar c, str) { int u = c.unicode(); - if (u >= 32 && u < 127) + if (c.isPrint()) encoded += c; else if (u == '\r') encoded += QLatin1String("\\r"); @@ -473,9 +474,6 @@ QString WatchModel::formattedValue(const WatchData &data) const return value; } - const QByteArray qtNamespace = engine()->qtNamespace(); - int format = itemFormat(data); - if (isIntType(data.type)) { if (value.isEmpty()) return value; @@ -483,7 +481,9 @@ QString WatchModel::formattedValue(const WatchData &data) const const QChar firstChar = value.at(0); if (!firstChar.isDigit() && firstChar != QLatin1Char('-')) return value; + // Append quoted, printable character also for decimal. + const int format = itemFormat(data); if (data.type.endsWith("char")) { bool ok; const int code = value.toInt(&ok); @@ -504,8 +504,10 @@ QString WatchModel::formattedValue(const WatchData &data) const if (!isPointerType(data.type) && !data.isVTablePointer()) { bool ok = false; qulonglong integer = value.toULongLong(&ok, 0); - if (ok) - return reformatInteger(integer, format); + if (ok) { + const int format = itemFormat(data); + return reformatInteger(integer, format); + } } return translate(value); From f371f3d3d7098c970a2575910badfda97fb0c5e0 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 13 Mar 2012 10:46:05 +0100 Subject: [PATCH 09/29] Update changes file. Change-Id: I5de76458bce21ee6b30b24e49fc55dfc834e74fb Reviewed-by: Leena Miettinen --- dist/changes-2.5.0 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dist/changes-2.5.0 b/dist/changes-2.5.0 index 3ead4dc4b28..3a9c7d2a32c 100644 --- a/dist/changes-2.5.0 +++ b/dist/changes-2.5.0 @@ -10,6 +10,8 @@ git log --cherry-pick --pretty=oneline v2.4.0...origin/2.5 General * Add a keyboard shortcut (Alt) to the locator to display the full path to a located file (QTCREATORBUG-3805) + * Add "Search Again" to recent searches (QTCREATORBUG-621) + * Allow multiple parallel searches (QTCREATORBUG-6101) Editing * Use the QML/JS editor for opening json files (QTCREATORBUG-4639) @@ -28,6 +30,9 @@ Editing * Fix layout update when folding/unfolding regions (QTCREATORBUG-6666) * Fix position of code-assist popup when cursor is outside viewport (QTCREATORBUG-6843) + * Add experimental plugin for showing "TODO"s in files + [by Dmitry Savchenko] + * Add "Open with" context menu in resource editor (QTCREATORBUG-4224) Managing Projects @@ -103,6 +108,7 @@ Platform Specific Mac * Pass architecture and bit width from the tool chain build setting to Qmake (QTCREATORBUG-6088) + * Fix adding Qt version on Mac OS X Lion (QTCREATORBUG-6222) Linux (GNOME and KDE) From c1f3b7170dfcb3e0e955ba05664a29b56895c611 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Wed, 5 Oct 2011 10:46:06 +0200 Subject: [PATCH 10/29] Do not add parentheses when completing dereferenced function. When completing function name, scan text backwards to find if we are trying to dereference the function. Change-Id: I32cabecb651ff35d949600d9fdeb61c8e68ae98f Reviewed-by: Erik Verbruggen --- src/plugins/cpptools/cppcompletionassist.cpp | 22 +++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index 5e59fa0401a..e7f41b2b733 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -198,6 +198,26 @@ bool CppAssistProposalItem::prematurelyApplies(const QChar &typedChar) const return false; } +static bool isDereferenced(TextEditor::BaseTextEditor *editor, int basePosition) +{ + QTextCursor cursor = editor->editorWidget()->textCursor(); + cursor.setPosition(basePosition); + + BackwardsScanner scanner(cursor); + for (int pos = scanner.startToken()-1; pos >= 0; pos--) { + switch (scanner[pos].kind()) { + case T_COLON_COLON: + case T_IDENTIFIER: + //Ignore scope specifiers + break; + + case T_AMPER: return true; + default: return false; + } + } + return false; +} + void CppAssistProposalItem::applyContextualContent(TextEditor::BaseTextEditor *editor, int basePosition) const { @@ -249,7 +269,7 @@ void CppAssistProposalItem::applyContextualContent(TextEditor::BaseTextEditor *e extraChars += QLatin1Char('<'); } #endif - } else if (! function->isAmbiguous()) { + } else if (!isDereferenced(editor, basePosition) && ! function->isAmbiguous()) { // When the user typed the opening parenthesis, he'll likely also type the closing one, // in which case it would be annoying if we put the cursor after the already automatically // inserted closing parenthesis. From 037a229d648114d9aba95e95937cb4ee80831aca Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 13 Mar 2012 11:47:26 +0100 Subject: [PATCH 11/29] WelcomePage: adjusting icons Change-Id: I5f13fb38d7c647f7fed8a84fb0719651786483ca Reviewed-by: Alessandro Portale --- .../widgets/images/icons/delete.png | Bin 252 -> 258 bytes .../widgets/images/icons/rename.png | Bin 393 -> 377 bytes .../welcomescreen/widgets/images/info.png | Bin 252 -> 261 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/share/qtcreator/welcomescreen/widgets/images/icons/delete.png b/share/qtcreator/welcomescreen/widgets/images/icons/delete.png index 3e4d8bb940d0e1c520f847e4153644776c44a004..0c88462ae8412cc4dad49b457f3839e24fcf7a12 100644 GIT binary patch delta 104 zcmeyv*u*r!lX1yJub7xKtp87TGA`hjh%E42w415jTw;cXFMEh_0<&b5xq`I8L>^|f zMd~U^L5e&+496T4cX~>$n;DSCbdf3GA^!rGW?kbz9tI{J2Cqe1KlTmu2mvepl4AaB&*Y`L4Fx)jo`GmDkfS;Y-Y6rFr1*a1yGrew+D5y?qkatLL{&SAk{s~9_*ViUJnDUJ!S%5*ZZ%KQB$s@*&j25-? zoGKaf7`!h%QAwTf%qhu8xI?UgtDfNz^9>{6qYMfM7`FY->}FgRWXiz6z~JfX=d#Wz Gp$Pyey=eIW delta 265 zcmey#)X6--lTmx3mvjB>1$@lYw}{X9`}k_0K^v3%gz^~+=G4qsQFA1FN1C3bKU?8) zUV-JCJ{or1(o1=?(e z^U3vgZJs#?3=TeR;=OU`;pMe6c_zL4E%~pemZh)P-XXk!N!XMBPDAGno{IW)Z4b3C zl&OW)ZQxd5)IQy?gk4opa57h70+Ru+$fVg*9?s%SRTI!<5dFt+gndJ*S{I{310%!z Yvzd9pw^zMoU|?YIboFyt=akR{00Ogh=Kufz diff --git a/share/qtcreator/welcomescreen/widgets/images/info.png b/share/qtcreator/welcomescreen/widgets/images/info.png index 52f0881a9050f6ac6463b948abe5959020d43c10..74e5a2e0b7ea981462b6dbb2ae7a81beb800b79d 100644 GIT binary patch delta 245 zcmeyv*vd3PqMn0|fq_B(^Z!H!1_sFz*NBqf{Irtt#G+IN$CUh}R0Yr6#Prml)Wnp^ z!jq{s3=9m*JzX3_DsCkuED$hQ#9guUO#wsDPY0O>wXKXD>Upyt7cwkobU6FhVO2xJ zQtpN}l_Uvm{Tssb;Ib}06EoV(Y*F6(tpxxw4HyM$*e=JhGOH*mE4nbIO3!OuNK zxWSi|Z?@!wuNxjrYPFm{!O>@j3daq<8w^Q|!a+)kqB#y`2}+V|J}&+qN0vBA%wX_g zZhfMbx+BeLCZ`LxL#sW*N5-6)okgTe~DWM4fmK<6) delta 236 zcmZo=`olOuqMn7Bfq~)e-A6$T3=E9LLGDfr>(0r%WME+6EbxddW?V2}v#32|j$V9;^wMMMAp|M#%@`jmlzfvqISFPOoh zfByRSIb4z3K~^PsySp%Su%^m-FfcH9d%8G=a9mGLaA26Y#l&6U>=ZT@HitIJj)`Xu z9GEd}THLg0Y6lK5C0ZD4SlZ~w)DalRmbzrI(Sxpsw Date: Mon, 12 Mar 2012 16:00:58 +0100 Subject: [PATCH 12/29] Improved German translation Change-Id: I64f29c0cbd60ffc0624931898b27241fd0548b2c Reviewed-by: Friedemann Kleint --- share/qtcreator/translations/qtcreator_de.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 32357b03a56..e5bc37137e1 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -18916,7 +18916,7 @@ Hinweis: Unter Umständen wird die lokale Datei gelöscht. Start and Debug Remote Application... - Starte und Debugge externe Anwendung... + Starte und Debugge entfernte Anwendung... Attach to Remote Debug Server... From 30e34ead0fe37b1bef2263b416c60ae3df273d32 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Tue, 13 Mar 2012 10:32:05 +0100 Subject: [PATCH 13/29] Updated changes file. Change-Id: If8e97f0277580a18951489bde12a223e7645f95d Reviewed-by: Leena Miettinen --- dist/changes-2.5.0 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dist/changes-2.5.0 b/dist/changes-2.5.0 index 3a9c7d2a32c..7de3f791d45 100644 --- a/dist/changes-2.5.0 +++ b/dist/changes-2.5.0 @@ -81,6 +81,11 @@ C++ Support * Add "rearrange parameter list" refactoring action [by Bojan Petrovic] * Add indent/unindent actions shortcut [by Adam Treat] * Improve sorting of completion items (QTCREATORBUG-6404) + * Improve C++11 lambda support, including formatting + * Fix "go to definition" of macros (QTCREATORBUG-2240, QTCREATORBUG-6175, + QTCREATORBUG-6848, QTCREATORBUG-7008, QTCREATORBUG-7009) + * Fix completion by not adding parentheses when completing dereferenced + function QML/JS Support * Add correct scoping for signal handlers; enables completion of signal From 712928ff0832238830814cde32e85f554206abd1 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 12 Mar 2012 09:55:10 +0100 Subject: [PATCH 14/29] QmlJS: Actually print warning for .qmltypes file Change-Id: I93030362168719c126818006839e9fae0ca673ce Reviewed-by: Fawzi Mohamed --- src/libs/qmljs/qmljsinterpreter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index b9fdb64e859..8f9ba9ebbce 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -1285,7 +1285,7 @@ CppQmlTypesLoader::BuiltinObjects CppQmlTypesLoader::loadQmlTypes(const QFileInf if (!warning.isEmpty()) { warnings->append(TypeDescriptionReader::tr( "Warnings while loading qmltypes from %1:\n%2").arg( - qmlTypeFile.absoluteFilePath(), error)); + qmlTypeFile.absoluteFilePath(), warning)); } } From 1f9a55e0b0a080e82fb85868b43e31bbaf6c0cb3 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 12 Mar 2012 10:40:14 +0100 Subject: [PATCH 15/29] QmlJS: Fix warning text when loading .qmltypes file Change-Id: Ia9509087fad6a63de2c6f35a012f5542c6bc2c98 Reviewed-by: Fawzi Mohamed --- src/libs/qmljs/qmljstypedescriptionreader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/qmljs/qmljstypedescriptionreader.cpp b/src/libs/qmljs/qmljstypedescriptionreader.cpp index a59584d334f..a0f96cdb5bf 100644 --- a/src/libs/qmljs/qmljstypedescriptionreader.cpp +++ b/src/libs/qmljs/qmljstypedescriptionreader.cpp @@ -218,7 +218,7 @@ void TypeDescriptionReader::readComponent(UiObjectDefinition *ast) fmo->setAttachedTypeName(readStringBinding(script)); } else { addWarning(script->firstSourceLocation(), - "Expected only name, prototype, defaultProperty, attachedType, exports" + "Expected only name, prototype, defaultProperty, attachedType, exports " "and exportMetaObjectRevisions script bindings"); } } else { From e9187909aec7a6840bc57cafaa5bb5ef74260ac0 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Mon, 12 Mar 2012 15:55:12 +0100 Subject: [PATCH 16/29] Image Viewer: Fix renaming not updating displayed names The window title and the editor combobox still showed the old name Change-Id: I97a34aacd6f37a70486428cc7c5b1308add9ae62 Reviewed-by: Eike Ziller --- src/plugins/imageviewer/imageviewerfile.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/imageviewer/imageviewerfile.cpp b/src/plugins/imageviewer/imageviewerfile.cpp index 2db2908262b..46caff8e6f9 100644 --- a/src/plugins/imageviewer/imageviewerfile.cpp +++ b/src/plugins/imageviewer/imageviewerfile.cpp @@ -89,6 +89,8 @@ bool ImageViewerFile::save(QString *errorString, const QString &fileName, bool a void ImageViewerFile::rename(const QString &newName) { d->fileName = newName; + d->editor->setDisplayName(QFileInfo(d->fileName).fileName()); + emit changed(); } QString ImageViewerFile::fileName() const From 28a03936cdb76f1d21cb341eea754b3074a5cfb4 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Tue, 13 Mar 2012 13:20:47 +0100 Subject: [PATCH 17/29] Changelog Change-Id: Id5d31857b5624fde01914ebfa7e437d266e5d9b1 Reviewed-by: Leena Miettinen --- dist/changes-2.5.0 | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/changes-2.5.0 b/dist/changes-2.5.0 index 7de3f791d45..a9a4432297b 100644 --- a/dist/changes-2.5.0 +++ b/dist/changes-2.5.0 @@ -33,6 +33,7 @@ Editing * Add experimental plugin for showing "TODO"s in files [by Dmitry Savchenko] * Add "Open with" context menu in resource editor (QTCREATORBUG-4224) + * Add task indicators in the left margin of a line Managing Projects From 272d590090a50691383e0e56856617fea21d1592 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Tue, 13 Mar 2012 13:20:00 +0100 Subject: [PATCH 18/29] deployqt: Proposed for for Windows deployment, some cleanups. Change-Id: I16583d70371e69bf6729a4b028a7dbf49b3b02df Reviewed-by: Andreas Holzammer Reviewed-by: Daniel Molkentin --- scripts/deployqt.py | 53 +++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/scripts/deployqt.py b/scripts/deployqt.py index 2c1fa96d134..cf1b008e05f 100755 --- a/scripts/deployqt.py +++ b/scripts/deployqt.py @@ -37,10 +37,10 @@ import shutil from glob import glob ignoreErrors = False -is_debug_build = False +debug_build = False def usage(): - print "Usage: %s [qmake_path]" % os.path.basename(sys.argv[0]) + print "Usage: %s [qmake_path]" % os.path.basename(sys.argv[0]) def which(program): def is_exe(fpath): @@ -64,15 +64,15 @@ def which(program): return None -def check_debug(fpath): +def is_debug(fpath): # bootstrap exception if fpath.endswith('QtCore4d.dll'): return True output = subprocess.check_output(['dumpbin', '/imports', fpath]) return output.find('QtCored4.dll') != -1 -def check_debug_build(install_dir): - return check_debug(os.path.join(install_dir, 'bin', 'qtcreator.exe')) +def is_debug_build(install_dir): + return is_debug(os.path.join(install_dir, 'bin', 'qtcreator.exe')) def op_failed(details = None): if details != None: @@ -117,24 +117,23 @@ def fix_rpaths(chrpath_bin, install_dir): filenames = [filename for filename in filenames if check_unix_library_helper(dirpath, filename)] fix_rpaths_helper(chrpath_bin, install_dir, dirpath, filenames) -def ignore_pattern_helper(filename): - ignore_patterns = ['.lib', '.pdb', '.exp', '.ilk', '.dll'] +def windows_debug_files_filter(filename): + ignore_patterns = ['.lib', '.pdb', '.exp', '.ilk'] for ip in ignore_patterns: if filename.endswith(ip): - return False - return True + return True + return False def copy_ignore_patterns_helper(dir, filenames): if not sys.platform.startswith('win'): return filenames - useful = filter(ignore_pattern_helper, filenames) - if is_debug_build: - dlls = filter(lambda filename: filename.endswith('.dll') and check_debug(os.path.join(dir, filename)), filenames) + if debug_build: + wrong_dlls = filter(lambda filename: filename.endswith('.dll') and not is_debug(os.path.join(dir, filename)), filenames) else: - dlls = filter(lambda filename: filename.endswith('.dll') and not check_debug(os.path.join(dir, filename)), filenames) + wrong_dlls = filter(lambda filename: filename.endswith('.dll') and is_debug(os.path.join(dir, filename)), filenames) - filenames = useful + dlls + filenames = wrong_dlls + filter(windows_debug_files_filter, filenames) return filenames def copy_qt_libs(install_dir, qt_libs_dir, qt_plugin_dir, qt_import_dir, plugins, imports): @@ -151,10 +150,10 @@ def copy_qt_libs(install_dir, qt_libs_dir, qt_plugin_dir, qt_import_dir, plugins dest = os.path.join(install_dir, 'lib', 'qtcreator') if sys.platform.startswith('win'): - if is_debug_build: - libraries = filter(lambda library: check_debug(library), libraries) + if debug_build: + libraries = filter(lambda library: is_debug(library), libraries) else: - libraries = filter(lambda library: not check_debug(library), libraries) + libraries = filter(lambda library: not is_debug(library), libraries) for library in libraries: print library, '->', dest @@ -186,7 +185,7 @@ def copy_qt_libs(install_dir, qt_libs_dir, qt_plugin_dir, qt_import_dir, plugins shutil.copytree(os.path.join(qt_import_dir, qtimport), target, ignore=copy_ignore_func, symlinks=True) def copy_translations(install_dir, qt_tr_dir, tr_catalogs): - langs=[] + langs = [] tr_dir = os.path.join(install_dir, 'share', 'qtcreator', 'translations') p = re.compile(r'_(.*).qm') for dirpath, dirnames, filenames in os.walk(tr_dir): @@ -210,11 +209,9 @@ def readQmakeVar(qmake_bin, var): return pipe.read().rstrip('\n') def main(): - generateMode = False try: opts, args = getopt.gnu_getopt(sys.argv[1:], 'hi', ['help', 'ignore-errors']) except: - print str(err) usage() sys.exit(2) for o, a in opts: @@ -227,10 +224,10 @@ def main(): print "Note: Ignoring all errors" if len(args) < 1: - usage() - sys.exit(2) + usage() + sys.exit(2) - install_dir=args[0] + install_dir = args[0] qmake_bin = 'qmake' if len(args) > 1: @@ -238,8 +235,8 @@ def main(): qmake_bin = which(qmake_bin) if qmake_bin == None: - print "Cannot find required binary 'qmake'." - sys.exit(2) + print "Cannot find required binary 'qmake'." + sys.exit(2) if not sys.platform.startswith('win'): chrpath_bin = which('chrpath') @@ -257,14 +254,14 @@ def main(): tr_catalogs = ['assistant', 'designer', 'qt', 'qt_help'] if sys.platform.startswith('win'): - global is_debug_build - is_debug_build = check_debug_build(install_dir) + global debug_build + debug_build = is_debug_build(install_dir) copy_qt_libs(install_dir, QT_INSTALL_LIBS, QT_INSTALL_PLUGINS, QT_INSTALL_IMPORTS, plugins, imports) copy_translations(install_dir, QT_INSTALL_TRANSLATIONS, tr_catalogs) if not sys.platform.startswith('win'): - fix_rpaths(chrpath_bin ,install_dir) + fix_rpaths(chrpath_bin, install_dir) if __name__ == "__main__": if sys.platform == 'darwin': From ca09c718b8e2a188e0c93cbbfe3a5800051b0844 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 13 Mar 2012 15:04:55 +0100 Subject: [PATCH 19/29] Update changes-2.5.0 (Debugger, FakeVim) Change-Id: I803749407b1a8f47abeea9f8d2a84d8d638674b6 Reviewed-by: hjk --- dist/changes-2.5.0 | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/dist/changes-2.5.0 b/dist/changes-2.5.0 index a9a4432297b..4296f6ffc0e 100644 --- a/dist/changes-2.5.0 +++ b/dist/changes-2.5.0 @@ -36,8 +36,30 @@ Editing * Add task indicators in the left margin of a line Managing Projects + * Add facility to change multiple environment variables in the + build and run settings at the same time Debugging + * Improve display of vtables and dynamic types (QTCREATORBUG-6933 et al) + * Adjust QDir and QFileInfo gdb pretty printer after Qt 4.8 changes + and various others for Qt 5.0 + * Adjust std::map dumper for gcc 4.6 + * Adjust to new *stopped output notifications of gdb 7.4 + * Add pretty printers for std::shared_ptr, std::unique_ptr, std::array, + std::complex, boost::posix_time::{ptime,time_duration}, + boost::gregorian::date + * Improve remote debugging facilities including new convenience + dialogs like "Attach to Running Remote Process" + * Improve per-type and per-variable selection of display formats + * Add display variants for map-like types (std::map, QMap, QHash etc) + * Make "gdb startup script" directly editable + * Improve expansion behaviour of pinned tooltips (QTCREATORBUG-6554) + * Prevent automatic loading of incompatible dumpers + * Make Shift-F5 exit when debugging a core file (QTCREATORBUG-6111) + * Make popping up the output pane optional (QTCREATORBUG-6764) + * Make entering commands in the log view more convenient + * Re-enable debugging of Python scripts + * Add pretty-printing for D arrays and strings Debugging QML/JS * Relocate breakpoints to next executable code @@ -45,6 +67,8 @@ Debugging QML/JS * Spruce up the script console for evaluating QML/JS expressions Analyzing Code + * Fix message for "incompatible" builds (QTCREATORBUG-7011) + * Fix suppression dialog (QTCREATORBUG-6500) C++ Support * Fix completion and the dot-to-arrow conversion not triggering reliably @@ -113,8 +137,9 @@ Help Platform Specific Mac - * Pass architecture and bit width from the tool chain build setting to Qmake (QTCREATORBUG-6088) * Fix adding Qt version on Mac OS X Lion (QTCREATORBUG-6222) + * Pass architecture and bit width from the tool chain build setting + to qmake (QTCREATORBUG-6088) Linux (GNOME and KDE) @@ -127,8 +152,17 @@ Remote Linux Support Qt Designer FakeVim + * Implement Ctrl-a, Ctrl-x, &, gm, `., '., :%, ciw. + * Add handling of number key block + * Fix cursor column after up/down in replace mode + * Fix case sensitivity of parsing of codes like "" in mappings + * Overhaul register handling + * Add old-style settings of for 'bs' (QTCREATORBUG-6640) + * Fix off-by-one error when creating a single line range (QTCREATORBUG-6630) Version control plugins + * Rename the ScmGit plugin to Git + * Rename the VCSBase plugin to VcsBase Additional credits go to: From 630ff22d613d1db8e601d88996e25301fecdb1a4 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Tue, 13 Mar 2012 12:47:55 +0100 Subject: [PATCH 20/29] BinEditor: Fix opening files Task-number: QTCREATORBUG-5772 Change-Id: I5aba3c9efeac76f261aca9f02fa193e721d735ca Reviewed-by: hjk --- src/plugins/bineditor/bineditor.cpp | 36 +++++++++++++++-------- src/plugins/bineditor/bineditorplugin.cpp | 2 +- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/plugins/bineditor/bineditor.cpp b/src/plugins/bineditor/bineditor.cpp index 46e3347577c..68eca4ea731 100644 --- a/src/plugins/bineditor/bineditor.cpp +++ b/src/plugins/bineditor/bineditor.cpp @@ -386,28 +386,40 @@ bool BinEditor::save(QString *errorString, const QString &oldFileName, const QSt void BinEditor::setSizes(quint64 startAddr, int range, int blockSize) { - m_blockSize = blockSize; + int newBlockSize = blockSize; QTC_ASSERT((blockSize/m_bytesPerLine) * m_bytesPerLine == blockSize, blockSize = (blockSize/m_bytesPerLine + 1) * m_bytesPerLine); + // Users can edit data in the range + // [startAddr - range/2, startAddr + range/2]. + quint64 newBaseAddr = quint64(range/2) > startAddr ? 0 : startAddr - range/2; + newBaseAddr = (newBaseAddr / blockSize) * blockSize; + + const quint64 maxRange = Q_UINT64_C(0xffffffffffffffff) - newBaseAddr + 1; + int newSize = newBaseAddr != 0 && quint64(range) >= maxRange + ? maxRange : range; + int newAddressBytes = (newBaseAddr + newSize < quint64(1) << 32 + && newBaseAddr + newSize >= newBaseAddr) ? 4 : 8; + + + + if (newBlockSize == m_blockSize + && newBaseAddr == m_baseAddr + && newSize == m_size + && newAddressBytes == m_addressBytes) + return; + + m_blockSize = blockSize; m_emptyBlock = QByteArray(blockSize, '\0'); m_modifiedData.clear(); m_requests.clear(); - // Users can edit data in the range - // [startAddr - range/2, startAddr + range/2]. - m_baseAddr = quint64(range/2) > startAddr ? 0 : startAddr - range/2; - m_baseAddr = (m_baseAddr / blockSize) * blockSize; - - const quint64 maxRange = Q_UINT64_C(0xffffffffffffffff) - m_baseAddr + 1; - m_size = m_baseAddr != 0 && quint64(range) >= maxRange - ? maxRange : range; - m_addressBytes = (m_baseAddr + m_size < quint64(1) << 32 - && m_baseAddr + m_size >= m_baseAddr) ? 4 : 8; + m_baseAddr = newBaseAddr; + m_size = newSize; + m_addressBytes = newAddressBytes; m_unmodifiedState = 0; m_undoStack.clear(); m_redoStack.clear(); - init(); setCursorPosition(startAddr - m_baseAddr); diff --git a/src/plugins/bineditor/bineditorplugin.cpp b/src/plugins/bineditor/bineditorplugin.cpp index 37c8b58de85..c7399d46e2a 100644 --- a/src/plugins/bineditor/bineditorplugin.cpp +++ b/src/plugins/bineditor/bineditorplugin.cpp @@ -234,10 +234,10 @@ public: if (offset >= static_cast(file.size())) return false; if (file.open(QIODevice::ReadOnly)) { + file.close(); m_fileName = fileName; m_editor->setSizes(offset, file.size()); m_editor->editor()->setDisplayName(QFileInfo(fileName).fileName()); - file.close(); return true; } QString errStr = tr("Cannot open %1: %2").arg( From f7684f689e43d659dcbf6e634d744b92574a0211 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Tue, 13 Mar 2012 15:44:59 +0100 Subject: [PATCH 21/29] Qt4project: Fix crash on changing a .pro file in particular ways Reported on irc by ckandler Change-Id: I96133c708e05a8c05d48d67fbcd05637f2a1e241 Reviewed-by: Daniel Teske --- src/plugins/qt4projectmanager/qt4nodes.cpp | 5 +++++ src/plugins/qt4projectmanager/qt4nodes.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 766519ee10e..002eb5fd1ae 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -257,6 +257,11 @@ Qt4PriFileNode::Qt4PriFileNode(Qt4Project *project, Qt4ProFileNode* qt4ProFileNo setIcon(qt4NodeStaticData()->projectIcon); } +Qt4PriFileNode::~Qt4PriFileNode() +{ + watchFolders(QSet()); +} + void Qt4PriFileNode::scheduleUpdate() { QtSupport::ProFileCacheManager::instance()->discardFile(m_projectFilePath); diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index dfaec5e67b2..8df585e1acb 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -129,6 +129,7 @@ class QT4PROJECTMANAGER_EXPORT Qt4PriFileNode : public ProjectExplorer::ProjectN public: Qt4PriFileNode(Qt4Project *project, Qt4ProFileNode* qt4ProFileNode, const QString &filePath); + ~Qt4PriFileNode(); void update(ProFile *includeFileExact, QtSupport::ProFileReader *readerExact, ProFile *includeFileCumlative, QtSupport::ProFileReader *readerCumalative); From 2e575363007dc8230561ce95ceb57a756b3fcb78 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 13 Mar 2012 15:34:28 +0100 Subject: [PATCH 22/29] Version bump. Change-Id: I1faf14a5ef42af2dcfdf4bad3785901863d9d82b Reviewed-by: Daniel Molkentin --- qtcreator.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtcreator.pri b/qtcreator.pri index d0387c53fd3..822e8ce91ef 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -1,7 +1,7 @@ !isEmpty(QTCREATOR_PRI_INCLUDED):error("qtcreator.pri already included") QTCREATOR_PRI_INCLUDED = 1 -QTCREATOR_VERSION = 2.4.81 +QTCREATOR_VERSION = 2.4.82 defineReplace(cleanPath) { win32:1 ~= s|\\\\|/|g From cec4f7d524ca6bedd76d890d9a9d067f98e71ccb Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 13 Mar 2012 15:51:41 +0100 Subject: [PATCH 23/29] bineditor: close file before doing anything complex Change-Id: I7f29515d903cb1109f2c15c2d36cf43b77285c4f Reviewed-by: Daniel Teske --- src/plugins/bineditor/bineditorplugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/bineditor/bineditorplugin.cpp b/src/plugins/bineditor/bineditorplugin.cpp index c7399d46e2a..9a26c4a1cbe 100644 --- a/src/plugins/bineditor/bineditorplugin.cpp +++ b/src/plugins/bineditor/bineditorplugin.cpp @@ -258,11 +258,11 @@ private slots: int blockSize = m_editor->dataBlockSize(); file.seek(block * blockSize); QByteArray data = file.read(blockSize); + file.close(); const int dataSize = data.size(); if (dataSize != blockSize) data += QByteArray(blockSize - dataSize, 0); m_editor->addData(block, data); - file.close(); } else { QMessageBox::critical(Core::ICore::mainWindow(), tr("File Error"), tr("Cannot open %1: %2").arg( From 273d823e6bfb74d5977ca9e1d9313a3eca33def9 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 13 Mar 2012 16:32:00 +0100 Subject: [PATCH 24/29] debugger: fix red foreground color for changed values Change-Id: Ib170199739bad3b193ddee077ff857a96f259f49 Reviewed-by: hjk --- src/plugins/debugger/watchhandler.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 95e066fd201..4eca5a19480 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1089,8 +1089,9 @@ void WatchModel::insertData(const WatchData &data) if (WatchItem *oldItem = findItem(data.iname, parent)) { bool hadChildren = oldItem->hasChildren; // Overwrite old entry. + bool hasChanged = oldItem->hasChanged(data); oldItem->setData(data); - oldItem->changed = data.hasChanged(*oldItem); + oldItem->changed = hasChanged; oldItem->generation = m_generationCounter; QModelIndex idx = watchIndex(oldItem); emit dataChanged(idx, idx.sibling(idx.row(), 2)); From ebaecead492a1a7471d306e0db6de7dc024068f3 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 13 Mar 2012 11:26:36 +0100 Subject: [PATCH 25/29] VCS: Handle missing checkout jobs Handle missing checkout jobs in the checkout wizard. Task-number: QTCREATORBUG-7082 Change-Id: I8c271ebba1edabb94b5795b2756d316324175151 Reviewed-by: Christian Stenger --- src/plugins/vcsbase/basecheckoutwizard.cpp | 3 +-- src/plugins/vcsbase/checkoutprogresswizardpage.cpp | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugins/vcsbase/basecheckoutwizard.cpp b/src/plugins/vcsbase/basecheckoutwizard.cpp index 6876130588f..b19c281c1ea 100644 --- a/src/plugins/vcsbase/basecheckoutwizard.cpp +++ b/src/plugins/vcsbase/basecheckoutwizard.cpp @@ -219,8 +219,7 @@ QString BaseCheckoutWizard::openProject(const QString &path, QString *errorMessa void BaseCheckoutWizard::slotProgressPageShown() { const QSharedPointer job = createJob(d->parameterPages, &(d->checkoutPath)); - if (!job.isNull()) - d->dialog->start(job); + d->dialog->start(job); } } // namespace VcsBase diff --git a/src/plugins/vcsbase/checkoutprogresswizardpage.cpp b/src/plugins/vcsbase/checkoutprogresswizardpage.cpp index 21994dce783..f7d0dd466fe 100644 --- a/src/plugins/vcsbase/checkoutprogresswizardpage.cpp +++ b/src/plugins/vcsbase/checkoutprogresswizardpage.cpp @@ -69,6 +69,11 @@ CheckoutProgressWizardPage::~CheckoutProgressWizardPage() void CheckoutProgressWizardPage::start(const QSharedPointer &job) { + if (job.isNull()) { + ui->logPlainTextEdit->setPlainText(tr("No job running, please abort.")); + return; + } + QTC_ASSERT(m_state != Running, return) m_job = job; connect(job.data(), SIGNAL(output(QString)), ui->logPlainTextEdit, SLOT(appendPlainText(QString))); From e4aa2b581e57b7a4eefea6f6ee74176147cf7f9f Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 13 Mar 2012 11:28:01 +0100 Subject: [PATCH 26/29] Git: Do not fail to create checkout job Do not fail to create checkout job when showing the configuration page. Task-number: QTCREATORBUG-7082 Change-Id: I501cf9421f63b9ca4fa88f0d274624ff48117ced Reviewed-by: Christian Stenger --- src/plugins/git/clonewizard.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/plugins/git/clonewizard.cpp b/src/plugins/git/clonewizard.cpp index 46441dff47f..c8923d2f8dd 100644 --- a/src/plugins/git/clonewizard.cpp +++ b/src/plugins/git/clonewizard.cpp @@ -83,8 +83,14 @@ QSharedPointer CloneWizard::createJob(const QList< QString *checkoutPath) { // Collect parameters for the clone command. - const CloneWizardPage *cwp = qobject_cast(parameterPages.front()); - QTC_ASSERT(cwp, return QSharedPointer()) + const CloneWizardPage *cwp = 0; + foreach (QWizardPage *wp, parameterPages) { + cwp = qobject_cast(wp); + if (cwp) + break; + } + + QTC_ASSERT(cwp, return QSharedPointer()); return cwp->createCheckoutJob(checkoutPath); } From 9bf9474e8d57f7ec3d01d1f4d56c501aa0eb43a0 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Tue, 13 Mar 2012 16:05:16 +0100 Subject: [PATCH 27/29] BaseTextMark: Remove checks for linenumber after updateLineNumber The breakpoints are deleted in some cases on updateLineNumber, thus we can't call anything on the mark after calling updateLineNumber Change-Id: Ib6c7bddc980fc72e9d4f4b9ec9e2eeb8292c1e15 Reviewed-by: hjk --- src/plugins/texteditor/basetextdocumentlayout.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/texteditor/basetextdocumentlayout.cpp b/src/plugins/texteditor/basetextdocumentlayout.cpp index 0166d19a4fe..66ac014c9b5 100644 --- a/src/plugins/texteditor/basetextdocumentlayout.cpp +++ b/src/plugins/texteditor/basetextdocumentlayout.cpp @@ -84,7 +84,7 @@ bool DocumentMarker::addMark(TextEditor::ITextMark *mark) userData->addMark(mark); m_marksCache.append(mark); mark->updateLineNumber(blockNumber + 1); - QTC_CHECK(mark->lineNumber() == blockNumber + 1); + QTC_CHECK(mark->lineNumber() == blockNumber + 1); // Checks that the base class is called mark->updateBlock(block); documentLayout->hasMarks = true; documentLayout->maxMarkWidthFactor = qMax(mark->widthFactor(), @@ -716,14 +716,14 @@ void BaseTextDocumentLayout::documentClosing() void BaseTextDocumentLayout::updateMarksLineNumber() { + // Note: the breakpointmanger deletes breakpoint marks and readds them + // if it doesn't agree with our updating QTextBlock block = document()->begin(); int blockNumber = 0; while (block.isValid()) { if (const TextBlockUserData *userData = testUserData(block)) - foreach (ITextMark *mrk, userData->marks()) { + foreach (ITextMark *mrk, userData->marks()) mrk->updateLineNumber(blockNumber + 1); - QTC_CHECK(mrk->lineNumber() == blockNumber +1); - } block = block.next(); ++blockNumber; } From 4ef89ffa033de88180e56437fecf659b068f7fed Mon Sep 17 00:00:00 2001 From: Casper van Donderen Date: Tue, 13 Mar 2012 16:40:01 +0100 Subject: [PATCH 28/29] Update the footer for qdoc output for qt-project. Change-Id: I7861fffebd07cab497faa71541117a1d686a5d60 Reviewed-by: Leena Miettinen --- doc/config/qt-html-templates-online.qdocconf | 25 +++++++------- doc/config/qt-html-templates.qdocconf | 34 +++++++++++--------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/doc/config/qt-html-templates-online.qdocconf b/doc/config/qt-html-templates-online.qdocconf index 723fcceff34..9fe93e211d9 100644 --- a/doc/config/qt-html-templates-online.qdocconf +++ b/doc/config/qt-html-templates-online.qdocconf @@ -105,21 +105,24 @@ HTML.footer = \ " \n" \ "
\n" \ "

\n" \ - " © 2008-2012 Nokia Corporation and/or its\n" \ - " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \ - " in Finland and/or other countries worldwide.

\n" \ "

\n" \ - " All other trademarks are property of their respective owners. Privacy Policy

\n" \ + " © 2012 Nokia Corporation and/or its\n" \ + " subsidiaries. Documentation contributions included herein are the copyrights of\n" \ + " their respective owners.

\n" \ "
\n" \ "

\n" \ - " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \ - " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \ - " with the terms contained in a written agreement between you and Nokia.

\n" \ + " The documentation provided herein is licensed under the terms of the\n" \ + " GNU Free Documentation\n" \ + " License version 1.3 as published by the Free Software Foundation.

\n" \ "

\n" \ - " Alternatively, this document may be used under the terms of the GNU\n" \ - " Free Documentation License version 1.3\n" \ - " as published by the Free Software Foundation.

\n" \ + " Documentation sources may be obtained from \n" \ + " www.qt-project.org.

\n" \ + "
\n" \ + "

\n" \ + " Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \ + " in Finland and/or other countries worldwide. All other trademarks are property\n" \ + " of their respective owners. Privacy Policy

\n" \ "
\n" \ "\n" \ " \n" \ diff --git a/doc/config/qt-html-templates.qdocconf b/doc/config/qt-html-templates.qdocconf index a44e4ea6868..cb0ff9db59b 100644 --- a/doc/config/qt-html-templates.qdocconf +++ b/doc/config/qt-html-templates.qdocconf @@ -23,22 +23,24 @@ HTML.footer = \ " \n" \ " \n" \ "
\n" \ - "

\n" \ - " © 2008-2012 Nokia Corporation and/or its\n" \ - " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \ - " in Finland and/or other countries worldwide.

\n" \ - "

\n" \ - " All other trademarks are property of their respective owners. Privacy Policy

\n" \ - "
\n" \ - "

\n" \ - " Licensees holding valid Qt Commercial licenses may use this document in accordance with the" \ - " Qt Commercial License Agreement provided with the Software or, alternatively, in accordance" \ - " with the terms contained in a written agreement between you and Nokia.

\n" \ - "

\n" \ - " Alternatively, this document may be used under the terms of the GNU\n" \ - " Free Documentation License version 1.3\n" \ - " as published by the Free Software Foundation.

\n" \ + "

\n" \ + " © 2012 Nokia Corporation and/or its\n" \ + " subsidiaries. Documentation contributions included herein are the copyrights of\n" \ + " their respective owners.

\n" \ + "
\n" \ + "

\n" \ + " The documentation provided herein is licensed under the terms of the\n" \ + " GNU Free Documentation\n" \ + " License version 1.3 as published by the Free Software Foundation.

\n" \ + "

\n" \ + " Documentation sources may be obtained from \n" \ + " www.qt-project.org.

\n" \ + "
\n" \ + "

\n" \ + " Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \ + " in Finland and/or other countries worldwide. All other trademarks are property\n" \ + " of their respective owners. Privacy Policy

\n" \ "
\n" \ # Files not referenced in any qdoc file. From b91f4700f8a6ee787f7e5915adfaad3254fdfe0c Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 13 Mar 2012 14:54:18 +0100 Subject: [PATCH 29/29] Doc: locations are now specified in one dialog Update screenshot Change-Id: I81f213bbabc50f80ce53b5b1762b89884f348d99 Reviewed-by: Nikolai Kosjar --- .../qtcreator-ssh-key-configuration.png | Bin 26679 -> 22837 bytes doc/src/linux-mobile/linuxdev-keys.qdocinc | 13 ++++++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/doc/images/qtcreator-ssh-key-configuration.png b/doc/images/qtcreator-ssh-key-configuration.png index 138fa94b4e43c9b782c7a8742d5014163293ea45..862a2183c7f8e602e1443198395a97f54acd4667 100644 GIT binary patch delta 22775 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 yac4*2 Options > Linux Devices > Device Configurations > Generate SSH Key}. - \o Click \gui {Generate SSH Key}. - \image qtcreator-ssh-key-configuration.png "SSH Key Configuration dialog" - \o Click \gui {Save Public Key} to select the location to save the - public key. + \o In the \gui {Private key file} field, select the location to save + the private key. - \o Click \gui {Save Private Key} to specify the location to save the - private key. + The \gui {Public key file} field displays the location to save the + corresponding public key. - \o Click \gui Close to close the dialog. + \o Select \gui {Generate And Save Key Pair} to generate and save the + keys at the specified locations. \endlist