From 2b4715c208c0410f119092c14baa26ba383adae1 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 9 May 2017 12:18:34 +0200 Subject: [PATCH 01/29] QbsProject: Use deleteLater to free QObjects Change-Id: I33af237b271f32adc606befef081b97ded5e67ff Reviewed-by: Christian Kandeler --- src/plugins/qbsprojectmanager/qbsproject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 170965ad18f..e9a1d3ef9e7 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -715,7 +715,7 @@ void QbsProject::updateDocuments(const QSet &files) foreach (IDocument *doc, currentDocuments) { if (filesToRemove.contains(doc->filePath().toString())) { m_qbsDocuments.remove(doc); - delete doc; + doc->deleteLater(); } } QSet toAdd; From 9f9776c4c9b89d06e7e43be74cb78dd150883b8a Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 9 May 2017 13:55:41 +0200 Subject: [PATCH 02/29] Qmake: Show executable in Run Configuration widget at all times Task-number: QTCREATORBUG-18168 Change-Id: I3db248c6db4c58206d64982f10f8ca641c1145c3 Reviewed-by: Tobias Hunger --- src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp index 2e0cb4ba395..a4a1302769e 100644 --- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp @@ -262,6 +262,7 @@ DesktopQmakeRunConfigurationWidget::DesktopQmakeRunConfigurationWidget(DesktopQm this, &DesktopQmakeRunConfigurationWidget::runConfigurationEnabledChange); Core::VariableChooser::addSupportForChildWidgets(this, m_qmakeRunConfiguration->macroExpander()); + effectiveTargetInformationChanged(); } void DesktopQmakeRunConfigurationWidget::runConfigurationEnabledChange() From 939913de5aa69a2797f4bddc291c151ed11e5df8 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 9 May 2017 13:50:55 +0200 Subject: [PATCH 03/29] Doc: Describe To-Do options Update the screenshot and add a new one hat shows the options. Change-Id: I7ceccef2c7c5bad5be4af58588c378a0df5e1383 Reviewed-by: Niels Weber --- doc/images/qtcreator-todo-options.png | Bin 0 -> 13161 bytes doc/images/qtcreator-todo-pane.png | Bin 13690 -> 35561 bytes doc/src/howto/creator-ui.qdoc | 28 ++++++++++++++++++-------- 3 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 doc/images/qtcreator-todo-options.png diff --git a/doc/images/qtcreator-todo-options.png b/doc/images/qtcreator-todo-options.png new file mode 100644 index 0000000000000000000000000000000000000000..acf1a1ee9066d352ea16a29b47a292c02e130a76 GIT binary patch literal 13161 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 literal 0 HcmV?d00001 diff --git a/doc/images/qtcreator-todo-pane.png b/doc/images/qtcreator-todo-pane.png index 73908e1538f33459a1fd5d12d4a01b666a94c5a6..eed8e3deba44679e93f34d8f4829004b26135a23 100644 GIT binary patch literal 35561 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 literal 13690 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 X`z+SDhrMQCU|{fc^>bP0l+XkKLmFj) diff --git a/doc/src/howto/creator-ui.qdoc b/doc/src/howto/creator-ui.qdoc index f00a025aadb..71e197e8d8b 100644 --- a/doc/src/howto/creator-ui.qdoc +++ b/doc/src/howto/creator-ui.qdoc @@ -504,20 +504,32 @@ \section2 To-Do Entries The \uicontrol {To-Do Entries} pane lists the BUG, FIXME, NOTE, TODO, and - WARNING keywords from the current file or from all project files. The - keywords are organized into information, warning, and error categories. + WARNING keywords from the current file, from all project files, or from a + subproject. Click the icons on the toolbar to show only the selected + keywords. \image qtcreator-todo-pane.png To add keywords, select \uicontrol Tools > \uicontrol Options > - \uicontrol {To-Do} > \uicontrol Add. - Set an icon and a line background color for the keyword. To change the icons - and colors set for an existing keyword, select \uicontrol Edit. + \uicontrol {To-Do} > \uicontrol Add. Set an icon and a line background color + for the keyword. - To determine whether the keywords in the whole project or in the current - file are displayed by default, select \uicontrol {Scanning scope}. + \image qtcreator-todo-options.png - To exclude files from scanning, select \uicontrol {To-Do} in the + To change the icon and line background color of the selected keyword, select + \uicontrol Edit. + + To remove the selected keyword, select \uicontrol Remove. + + To reset the list to predefined keywords, select \uicontrol Reset. All your + changes will be permanently lost. + + To determine whether the keywords in the whole project, in the current file, + or in a subproject are displayed by default, select the appropriate option + in the \uicontrol {Scanning scope} group. + + To exclude files from scanning, select \uicontrol {Project Settings} > + \uicontrol {To-Do} in the \uicontrol Projects mode. Select \uicontrol Add and enter a regular expression that matches the path to files to exclude. Use a forward slash (/) as a separator in the path also on Windows. From 98820ab3e6f91e70a25eee47c8e1eaadd04c3143 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 9 May 2017 13:14:15 +0200 Subject: [PATCH 04/29] TemporaryDir: Use qAddPostRoutine() for cleanup Otherwise, the directory is not cleaned up on Windows. Task-number: QTCREATORBUG-18063 Change-Id: I2e89f7de7642879ea402b50866fbee7e462501b6 Reviewed-by: Tobias Hunger --- src/libs/utils/temporarydirectory.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/temporarydirectory.cpp b/src/libs/utils/temporarydirectory.cpp index c0d0c15cb1b..da539919e42 100644 --- a/src/libs/utils/temporarydirectory.cpp +++ b/src/libs/utils/temporarydirectory.cpp @@ -25,13 +25,19 @@ #include "temporarydirectory.h" -#include "qtcassert.h" +#include -#include +#include "qtcassert.h" namespace Utils { -static std::unique_ptr m_masterTemporaryDir; +static QTemporaryDir* m_masterTemporaryDir = nullptr; + +static void cleanupMasterTemporaryDir() +{ + delete m_masterTemporaryDir; + m_masterTemporaryDir = nullptr; +} TemporaryDirectory::TemporaryDirectory(const QString &pattern) : QTemporaryDir(m_masterTemporaryDir->path() + '/' + pattern) @@ -41,12 +47,16 @@ TemporaryDirectory::TemporaryDirectory(const QString &pattern) : QTemporaryDir *TemporaryDirectory::masterTemporaryDirectory() { - return m_masterTemporaryDir.get(); + return m_masterTemporaryDir; } void TemporaryDirectory::setMasterTemporaryDirectory(const QString &pattern) { - m_masterTemporaryDir = std::make_unique(pattern); + if (m_masterTemporaryDir) + cleanupMasterTemporaryDir(); + else + qAddPostRoutine(cleanupMasterTemporaryDir); + m_masterTemporaryDir = new QTemporaryDir(pattern); } QString TemporaryDirectory::masterDirectoryPath() From 1957c8bc660403667249a42c874c225986828d4a Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Tue, 14 Mar 2017 18:37:35 +0100 Subject: [PATCH 05/29] Squish: Update tst_opencreator_qbs Change-Id: I2aac18170ee7d4490852e587b2c016f913b242e0 Reviewed-by: Christian Stenger --- tests/system/suite_general/tst_opencreator_qbs/test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system/suite_general/tst_opencreator_qbs/test.py b/tests/system/suite_general/tst_opencreator_qbs/test.py index 51b6b36185e..05167f53b3b 100644 --- a/tests/system/suite_general/tst_opencreator_qbs/test.py +++ b/tests/system/suite_general/tst_opencreator_qbs/test.py @@ -43,8 +43,8 @@ def main(): return test.log("Start parsing project") rootNodeTemplate = "{column='0' container=':Qt Creator_Utils::NavigationTreeView' text~='%s( \[\S+\])?' type='QModelIndex'}" - ntwObject = waitForObject(rootNodeTemplate % "qtcreator.qbs") - if waitFor("ntwObject.model().rowCount(ntwObject) > 2", 200000): # No need to wait for C++-parsing + ntwObject = waitForObject(rootNodeTemplate % "Qt Creator", 200000) + if waitFor("ntwObject.model().rowCount(ntwObject) > 2", 20000): # No need to wait for C++-parsing test.log("Parsing project done") # we only need the project else: test.warning("Parsing project timed out") From 452a057179d11d75fd9553c3491b9dda6f08748f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 10 May 2017 10:08:59 +0200 Subject: [PATCH 06/29] Bump version Change-Id: I744550af5e37d5863b42534608f2c8289b22c674 Reviewed-by: Eike Ziller --- qbs/modules/qtc/qtc.qbs | 10 +++++----- qtcreator.pri | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index 723181ccbcb..a908af617e7 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -4,16 +4,16 @@ import qbs.FileInfo import "qtc.js" as HelperFunctions Module { - property string qtcreator_display_version: '4.3.0-rc1' + property string qtcreator_display_version: '4.3.0' property string ide_version_major: '4' - property string ide_version_minor: '2' - property string ide_version_release: '83' + property string ide_version_minor: '3' + property string ide_version_release: '0' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release property string ide_compat_version_major: '4' - property string ide_compat_version_minor: '2' - property string ide_compat_version_release: '83' + property string ide_compat_version_minor: '3' + property string ide_compat_version_release: '0' property string qtcreator_compat_version: ide_compat_version_major + '.' + ide_compat_version_minor + '.' + ide_compat_version_release diff --git a/qtcreator.pri b/qtcreator.pri index 64172d42d63..243ad099194 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -1,10 +1,10 @@ !isEmpty(QTCREATOR_PRI_INCLUDED):error("qtcreator.pri already included") QTCREATOR_PRI_INCLUDED = 1 -QTCREATOR_VERSION = 4.2.83 -QTCREATOR_COMPAT_VERSION = 4.2.83 +QTCREATOR_VERSION = 4.3.0 +QTCREATOR_COMPAT_VERSION = 4.3.0 VERSION = $$QTCREATOR_VERSION -QTCREATOR_DISPLAY_VERSION = 4.3.0-rc1 +QTCREATOR_DISPLAY_VERSION = 4.3.0 BINARY_ARTIFACTS_BRANCH = 4.3 CONFIG += c++14 From 8e8283b342259de7a7dc6e9decbc1f4706c81377 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 21 Mar 2017 17:55:43 +0100 Subject: [PATCH 07/29] QmlProfiler: Keep flamegraph details window around When moving the mouse pointer out of an item the window should not disappear, so that you can reposition it then. Change-Id: Ic2fa0e41bcab5fada6c3c5fca68a5f82fcd0fc7a Task-number: QTCREATORBUG-16698 Reviewed-by: Robert Loehning Reviewed-by: Christian Kandeler --- src/plugins/qmlprofiler/qml/QmlProfilerFlameGraphView.qml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmlprofiler/qml/QmlProfilerFlameGraphView.qml b/src/plugins/qmlprofiler/qml/QmlProfilerFlameGraphView.qml index 88f4eb133f7..2de3ec9422c 100644 --- a/src/plugins/qmlprofiler/qml/QmlProfilerFlameGraphView.qml +++ b/src/plugins/qmlprofiler/qml/QmlProfilerFlameGraphView.qml @@ -147,8 +147,14 @@ ScrollView { } onMouseExited: { - if (tooltip.hoveredNode === flamegraphItem) + if (tooltip.hoveredNode === flamegraphItem) { + // Keep the window around until something else is hovered or selected. + if (tooltip.selectedNode === null + || tooltip.selectedNode.typeId !== root.selectedTypeId) { + tooltip.selectedNode = flamegraphItem; + } tooltip.hoveredNode = null; + } } onClicked: { From 9b44c6ea4f2502931835fd84fec3af827616c85b Mon Sep 17 00:00:00 2001 From: Vikas Pachdha Date: Tue, 9 May 2017 09:02:12 +0200 Subject: [PATCH 08/29] iOS: Stop ios-tool gracefully before killing Task-number: QTCREATORBUG-18147 Change-Id: Ic6b4c179fca5f51f5052dcffffefd1079a686233 Reviewed-by: Eike Ziller --- src/plugins/ios/iostoolhandler.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/plugins/ios/iostoolhandler.cpp b/src/plugins/ios/iostoolhandler.cpp index 4795d922a0c..895397ffbe9 100644 --- a/src/plugins/ios/iostoolhandler.cpp +++ b/src/plugins/ios/iostoolhandler.cpp @@ -248,6 +248,7 @@ class IosDeviceToolHandlerPrivate : public IosToolHandlerPrivate { public: explicit IosDeviceToolHandlerPrivate(const IosDeviceType &devType, IosToolHandler *q); + ~IosDeviceToolHandlerPrivate(); // IosToolHandlerPrivate overrides public: @@ -656,8 +657,11 @@ IosDeviceToolHandlerPrivate::IosDeviceToolHandlerPrivate(const IosDeviceType &de : IosToolHandlerPrivate(devType, q) { auto deleter = [](QProcess *p) { - p->kill(); - p->waitForFinished(10000); + if (p->state() != QProcess::NotRunning) { + p->kill(); + if (!p->waitForFinished(2000)) + p->terminate(); + } delete p; }; process = std::shared_ptr(new QProcess, deleter); @@ -696,6 +700,20 @@ IosDeviceToolHandlerPrivate::IosDeviceToolHandlerPrivate(const IosDeviceType &de QObject::connect(&killTimer, &QTimer::timeout, std::bind(&IosDeviceToolHandlerPrivate::killProcess, this)); } +IosDeviceToolHandlerPrivate::~IosDeviceToolHandlerPrivate() +{ + if (isRunning()) { + // Disconnect the signals to avoid notifications while destructing. + // QTCREATORBUG-18147 + process->disconnect(); + // Quit ios-tool gracefully before kill is executed. + process->write("k\n\r"); + process->closeWriteChannel(); + // Give some time to ios-tool to finish. + process->waitForFinished(2000); + } +} + void IosDeviceToolHandlerPrivate::requestTransferApp(const QString &bundlePath, const QString &deviceId, int timeout) { From d7f79349ed67c3b4cd69effba74fa3b4079fab9e Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Wed, 10 May 2017 14:56:00 +0200 Subject: [PATCH 09/29] Squish: Verify project was found when adding file Change-Id: I313d1ba1b621d45620bf613760cefdf0a2d2341c Task-number: QTCREATORBUG-17994 Reviewed-by: Christian Stenger --- tests/system/objects.map | 1 + tests/system/shared/project.py | 13 +++++++++++-- .../suite_editors/tst_rename_macros/test.py | 4 ++-- .../system/suite_general/tst_new_class/test.py | 18 +++++++++--------- tests/system/suite_tools/tst_git_local/test.py | 4 ++-- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/tests/system/objects.map b/tests/system/objects.map index fe5a4ea296e..e855d701b52 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -212,6 +212,7 @@ :popupFrame_Proposal_QListView {container=':popupFrame_TextEditor::GenericProposalWidget' type='QListView' unnamed='1' visible='1'} :popupFrame_TextEditor::GenericProposalWidget {name='m_popupFrame' type='TextEditor::GenericProposalWidget' visible='1'} :projectComboBox_QComboBox {buddy=':New Text File.Add to project:_QLabel' name='projectComboBox' type='QComboBox' visible='1'} +:projectComboBox_Utils::TreeViewComboBox {buddy=':New Text File.Add to project:_QLabel' name='projectComboBox' type='Utils::TreeViewComboBox' visible='1'} :qdesigner_internal::WidgetBoxCategoryListView {container=':Widget Box_qdesigner_internal::WidgetBoxTreeWidget' occurrence='3' type='qdesigner_internal::WidgetBoxCategoryListView' unnamed='1' visible='1'} :qmakeCallEdit {container=':Qt Creator.scrollArea_QScrollArea' text?='qmake: qmake*' type='QLabel' unnamed='1' visible='1'} :qt_tabwidget_stackedwidget.Core__Internal__GeneralSettings_QWidget {container=':Options.qt_tabwidget_stackedwidget_QStackedWidget' name='Core__Internal__GeneralSettings' type='QWidget' visible='1'} diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index fa03531e720..d3f47b73e51 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -749,13 +749,14 @@ def compareProjectTree(rootObject, dataset): # creates C++ file(s) and adds them to the current project if one is open # name name of the created object: filename for files, classname for classes # template "C++ Class", "C++ Header File" or "C++ Source File" +# projectName None or name of open project that the files will be added to # forceOverwrite bool: force overwriting existing files? # addToVCS name of VCS to add the file(s) to # newBasePath path to create the file(s) at # expectedSourceName expected name of created source file # expectedHeaderName expected name of created header file -def addCPlusPlusFileToCurrentProject(name, template, forceOverwrite=False, addToVCS="", - newBasePath=None, expectedSourceName=None, expectedHeaderName=None): +def addCPlusPlusFile(name, template, projectName, forceOverwrite=False, addToVCS="", + newBasePath=None, expectedSourceName=None, expectedHeaderName=None): if name == None: test.fatal("File must have a name - got None.") return @@ -785,6 +786,14 @@ def addCPlusPlusFileToCurrentProject(name, template, forceOverwrite=False, addTo test.compare(str(waitForObject("{name='HdrFileName' type='QLineEdit' visible='1'}").text), expectedHeaderName) clickButton(waitForObject(":Next_QPushButton")) + projectComboBox = waitForObjectExists(":projectComboBox_Utils::TreeViewComboBox") + test.compare(projectComboBox.enabled, projectName != None, + "Project combo box must be enabled when a project is open") + projectNameToDisplay = "" + if projectName: + projectNameToDisplay = projectName + test.compare(str(projectComboBox.currentText), projectNameToDisplay, + "The right project must be selected") fileExistedBefore = False if template == "C++ Class": fileExistedBefore = (os.path.exists(os.path.join(basePath, name.lower() + ".cpp")) diff --git a/tests/system/suite_editors/tst_rename_macros/test.py b/tests/system/suite_editors/tst_rename_macros/test.py index 067831da7d8..581247bfdfb 100644 --- a/tests/system/suite_editors/tst_rename_macros/test.py +++ b/tests/system/suite_editors/tst_rename_macros/test.py @@ -42,8 +42,8 @@ def main(): if not testRenameMacroAfterSourceModification(): return headerName = "anothertestfile.h" - addCPlusPlusFileToCurrentProject(headerName, "C++ Header File", - expectedHeaderName=headerName) + addCPlusPlusFile(headerName, "C++ Header File", "testfiles.pro", + expectedHeaderName=headerName) if not testRenameMacroAfterSourceMoving(): return invokeMenuItem("File", "Save All") diff --git a/tests/system/suite_general/tst_new_class/test.py b/tests/system/suite_general/tst_new_class/test.py index d7b37abddcd..7f1f056908b 100644 --- a/tests/system/suite_general/tst_new_class/test.py +++ b/tests/system/suite_general/tst_new_class/test.py @@ -34,9 +34,9 @@ def main(): startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): return - addCPlusPlusFileToCurrentProject(newClassName, "C++ Class", newBasePath=basePath, - expectedSourceName=sourceFileName, - expectedHeaderName=headerFileName) + addCPlusPlusFile(newClassName, "C++ Class", None, newBasePath=basePath, + expectedSourceName=sourceFileName, + expectedHeaderName=headerFileName) mainWindow = waitForObject(":Qt Creator_Core::Internal::MainWindow") if test.verify(waitFor("sourceFileName in str(mainWindow.windowTitle)", 1000), @@ -77,17 +77,17 @@ def main(): def overwritten(filename): return notOverwrittenComment not in readFile(os.path.join(basePath, filename)) - addCPlusPlusFileToCurrentProject(newClassName, "C++ Class", False, newBasePath=basePath, - expectedSourceName=sourceFileName, - expectedHeaderName=headerFileName) + addCPlusPlusFile(newClassName, "C++ Class", None, False, + newBasePath=basePath, expectedSourceName=sourceFileName, + expectedHeaderName=headerFileName) test.verify(not waitFor("overwritten(sourceFileName)", 2000), "Source file should not be overwritten.") test.verify(not waitFor("overwritten(headerFileName)", 500), "Header file should not be overwritten.") - addCPlusPlusFileToCurrentProject(newClassName, "C++ Class", True, newBasePath=basePath, - expectedSourceName=sourceFileName, - expectedHeaderName=headerFileName) + addCPlusPlusFile(newClassName, "C++ Class", None, True, + newBasePath=basePath, expectedSourceName=sourceFileName, + expectedHeaderName=headerFileName) test.verify(waitFor("overwritten(sourceFileName)", 2000), "Source file should be overwritten.") test.verify(waitFor("overwritten(headerFileName)", 500), diff --git a/tests/system/suite_tools/tst_git_local/test.py b/tests/system/suite_tools/tst_git_local/test.py index eda76fea5c7..a9186a228f1 100644 --- a/tests/system/suite_tools/tst_git_local/test.py +++ b/tests/system/suite_tools/tst_git_local/test.py @@ -175,8 +175,8 @@ def main(): commitMessages = [commit("Initial Commit", "Committed 5 file(s).")] clickButton(waitForObject(":*Qt Creator.Clear_QToolButton")) headerName = "pointless_header.h" - addCPlusPlusFileToCurrentProject(headerName, "C++ Header File", addToVCS="Git", - expectedHeaderName=headerName) + addCPlusPlusFile(headerName, "C++ Header File", projectName + ".pro", + addToVCS="Git", expectedHeaderName=headerName) commitMessages.insert(0, commit("Added pointless header file", "Committed 2 file(s).")) readmeName = "README.txt" addEmptyFileOutsideProject(readmeName) From bae03680347280ca8c1810fc8c92503f6f346068 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 10 May 2017 14:52:51 +0200 Subject: [PATCH 10/29] Squish: Fix switching to build or run settings If too many kits are present and/or the screen resolution is too low to have QC having the correct minimum windows size Squish fails to click on the items as it might be necessary to scroll to them to have them really (user-) visible. There is an obvious difference between 'visible' for Squish and 'visible' for the interacting user. Change-Id: Id658a323fcf2ae3882b225c6ce9383ed2c876e81 Reviewed-by: Robert Loehning --- tests/system/shared/project_explorer.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/system/shared/project_explorer.py b/tests/system/shared/project_explorer.py index 2396bbc80f1..686d5722e25 100644 --- a/tests/system/shared/project_explorer.py +++ b/tests/system/shared/project_explorer.py @@ -100,7 +100,9 @@ def switchToBuildOrRunSettingsFor(targetCount, currentTarget, projectSettings): if not test.verify(not str(findObject(currentTargetIndex).toolTip).startswith(clickToActivate), "Verifying target '%s' is enabled." % targets[currentTarget]): return False - mouseClick(waitForObject(currentTargetIndex)) + index = waitForObject(currentTargetIndex) + treeView.scrollTo(index) + mouseClick(index) if projectSettings == ProjectSettings.BUILD: settingsIndex = getQModelIndexStr("text='Build'", currentTargetIndex) From c7d7cb9d407a68085eaf2322e10744f6f43384be Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 10 May 2017 22:44:28 +0300 Subject: [PATCH 11/29] Autotest: De-noise TestCodeParser Change-Id: Ide351ed081417d3520714dcc44d543797f75dd4a Reviewed-by: Christian Stenger --- src/plugins/autotest/testcodeparser.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp index f12e418b220..5b48ed1ca70 100644 --- a/src/plugins/autotest/testcodeparser.cpp +++ b/src/plugins/autotest/testcodeparser.cpp @@ -55,6 +55,8 @@ static Q_LOGGING_CATEGORY(LOG, "qtc.autotest.testcodeparser") namespace Autotest { namespace Internal { +using namespace ProjectExplorer; + TestCodeParser::TestCodeParser(TestTreeModel *parent) : QObject(parent), m_model(parent) @@ -100,7 +102,7 @@ void TestCodeParser::setState(State state) } m_parserState = state; - if (m_parserState == Idle && ProjectExplorer::SessionManager::startupProject()) { + if (m_parserState == Idle && SessionManager::startupProject()) { if (m_fullUpdatePostponed || m_dirty) { emitUpdateTestTree(); } else if (m_partialUpdatePostponed) { @@ -160,7 +162,7 @@ void TestCodeParser::updateTestTree(ITestParser *parser) return; } - if (!ProjectExplorer::SessionManager::startupProject()) + if (!SessionManager::startupProject()) return; m_fullUpdatePostponed = false; @@ -201,10 +203,10 @@ void TestCodeParser::onDocumentUpdated(const QString &fileName) if (m_codeModelParsing || m_fullUpdatePostponed) return; - ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); + Project *project = SessionManager::startupProject(); if (!project) return; - if (!project->files(ProjectExplorer::Project::SourceFiles).contains(fileName)) + if (!project->files(Project::SourceFiles).contains(fileName)) return; scanForTests(QStringList(fileName)); @@ -222,7 +224,7 @@ void TestCodeParser::onQmlDocumentUpdated(const QmlJS::Document::Ptr &document) onDocumentUpdated(fileName); } -void TestCodeParser::onStartupProjectChanged(ProjectExplorer::Project *project) +void TestCodeParser::onStartupProjectChanged(Project *project) { if (m_parserState == FullParse || m_parserState == PartialParse) { qCDebug(LOG) << "Canceling scanForTest (startup project changed)"; @@ -233,9 +235,9 @@ void TestCodeParser::onStartupProjectChanged(ProjectExplorer::Project *project) emitUpdateTestTree(); } -void TestCodeParser::onProjectPartsUpdated(ProjectExplorer::Project *project) +void TestCodeParser::onProjectPartsUpdated(Project *project) { - if (project != ProjectExplorer::SessionManager::startupProject()) + if (project != SessionManager::startupProject()) return; if (m_codeModelParsing) m_fullUpdatePostponed = true; @@ -334,12 +336,12 @@ void TestCodeParser::scanForTests(const QStringList &fileList, ITestParser *pars m_reparseTimerTimedOut = false; m_postponedFiles.clear(); bool isFullParse = fileList.isEmpty(); - ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); + Project *project = SessionManager::startupProject(); if (!project) return; QStringList list; if (isFullParse) { - list = project->files(ProjectExplorer::Project::SourceFiles); + list = project->files(Project::SourceFiles); if (list.isEmpty()) { // at least project file should be there, but might happen if parsing current project // takes too long, especially when opening sessions holding multiple projects From f6c6224ebcb0bc2f815025bdf49af757d0aa773f Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 10 May 2017 22:48:55 +0300 Subject: [PATCH 12/29] Autotest: Avoid needless iterations over the project files Task-number: QTCREATORBUG-18185 Change-Id: I6c541cfa577331edc1ff3083d2f9b705ffc7ce73 Reviewed-by: Christian Stenger --- src/plugins/autotest/testcodeparser.cpp | 2 +- src/plugins/projectexplorer/session.cpp | 13 ++++++------- src/plugins/projectexplorer/session.h | 1 + 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp index 5b48ed1ca70..001ea5d48b0 100644 --- a/src/plugins/autotest/testcodeparser.cpp +++ b/src/plugins/autotest/testcodeparser.cpp @@ -206,7 +206,7 @@ void TestCodeParser::onDocumentUpdated(const QString &fileName) Project *project = SessionManager::startupProject(); if (!project) return; - if (!project->files(Project::SourceFiles).contains(fileName)) + if (!SessionManager::projectContainsFile(project, Utils::FileName::fromString(fileName))) return; scanForTests(QStringList(fileName)); diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index 5b8e6d382c0..432915f7770 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -74,7 +74,6 @@ namespace ProjectExplorer { class SessionManagerPrivate { public: - bool projectContainsFile(Project *p, const FileName &fileName) const; void restoreValues(const PersistentSettingsReader &reader); void restoreDependencies(const PersistentSettingsReader &reader); void restoreStartupProject(const PersistentSettingsReader &reader); @@ -658,19 +657,19 @@ Project *SessionManager::projectForFile(const Utils::FileName &fileName) { const QList &projectList = projects(); foreach (Project *p, projectList) { - if (d->projectContainsFile(p, fileName)) + if (projectContainsFile(p, fileName)) return p; } return nullptr; } -bool SessionManagerPrivate::projectContainsFile(Project *p, const Utils::FileName &fileName) const +bool SessionManager::projectContainsFile(Project *p, const Utils::FileName &fileName) { - if (!m_projectFileCache.contains(p)) - m_projectFileCache.insert(p, p->files(Project::AllFiles)); + if (!d->m_projectFileCache.contains(p)) + d->m_projectFileCache.insert(p, p->files(Project::AllFiles)); - return m_projectFileCache.value(p).contains(fileName.toString()); + return d->m_projectFileCache.value(p).contains(fileName.toString()); } void SessionManager::configureEditor(IEditor *editor, const QString &fileName) @@ -686,7 +685,7 @@ void SessionManager::configureEditor(IEditor *editor, const QString &fileName) void SessionManager::configureEditors(Project *project) { foreach (IDocument *document, DocumentModel::openedDocuments()) { - if (d->projectContainsFile(project, document->filePath())) { + if (projectContainsFile(project, document->filePath())) { foreach (IEditor *editor, DocumentModel::editorsForDocument(document)) { if (auto textEditor = qobject_cast(editor)) { project->editorConfiguration()->configureEditor(textEditor); diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h index 8d6987363a4..a229ce58e14 100644 --- a/src/plugins/projectexplorer/session.h +++ b/src/plugins/projectexplorer/session.h @@ -115,6 +115,7 @@ public: static Project *projectForNode(Node *node); static Node *nodeForFile(const Utils::FileName &fileName); static Project *projectForFile(const Utils::FileName &fileName); + static bool projectContainsFile(Project *p, const Utils::FileName &fileName); static QStringList projectsForSessionName(const QString &session); From ff6a20687dbf008d1ffafb4a01a9cd72a8045227 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 11 May 2017 13:41:04 +0200 Subject: [PATCH 13/29] CPaster: Fix URLs for pastebin.ca Protocol switched to HTTPS recently. Task-number: QTCREATORBUG-18192 Change-Id: I467534142478f5511e645a2e959ad3422640a0a6 Reviewed-by: Friedemann Kleint --- src/plugins/cpaster/pastebindotcaprotocol.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/cpaster/pastebindotcaprotocol.cpp b/src/plugins/cpaster/pastebindotcaprotocol.cpp index aeb83d20d4e..b6fac76b6c1 100644 --- a/src/plugins/cpaster/pastebindotcaprotocol.cpp +++ b/src/plugins/cpaster/pastebindotcaprotocol.cpp @@ -34,8 +34,8 @@ #include #include -static const char urlC[] = "http://pastebin.ca/"; -static const char internalUrlC[] = "http://pbin.ca/"; +static const char urlC[] = "https://pastebin.ca/"; +static const char internalUrlC[] = "https://pbin.ca/"; static const char protocolNameC[] = "Pastebin.Ca"; static inline QByteArray expiryValue(int expiryDays) From d4fe5310d6350e7725e4df24959e10d05176fd52 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 11 May 2017 16:06:03 +0200 Subject: [PATCH 14/29] QmlProfiler: Don't delete suspended models when acquiring is aborted AcquiringData to ClearingData is a valid transition, for example when the application crashes. We don't want to drop all models then. Change-Id: Ibb1b5a551e0dbec121a44054d36c132d038153f4 Reviewed-by: Christian Kandeler --- src/plugins/qmlprofiler/qmlprofilertraceview.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp index 22fad39df91..8519d124223 100644 --- a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp @@ -114,6 +114,8 @@ QmlProfilerTraceView::QmlProfilerTraceView(QWidget *parent, QmlProfilerViewManag break; case QmlProfilerModelManager::ClearingData: d->m_zoomControl->clear(); + if (!d->m_suspendedModels.isEmpty()) + break; // Models are suspended already. AcquiringData was aborted. // Fall through case QmlProfilerModelManager::AcquiringData: // Temporarily remove the models, while we're changing them From ae2a9dbb787e682e0f8db1b34075dcf10dff6125 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 11 May 2017 09:29:40 +0200 Subject: [PATCH 15/29] Work around issue with vanishing menu bar with Unity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When Widget Designer is opened with a QMainWindow based form, the "native" Unity menu bar vanishes. This is a workaround by disabling the native menu bar integration on Linux. Task-number: QTCREATORBUG-17519 Change-Id: I93eb3a590200fb8fff90017d8d6eddda8edaa42e Reviewed-by: André Hartmann --- src/app/main.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/app/main.cpp b/src/app/main.cpp index 97a509757b2..77cf8cb42e9 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -280,6 +280,9 @@ void loadFonts() int main(int argc, char **argv) { + if (Utils::HostOsInfo::isLinuxHost()) + QApplication::setAttribute(Qt::AA_DontUseNativeMenuBar); + Utils::TemporaryDirectory::setMasterTemporaryDirectory(QDir::tempPath() + "/QtCreator-XXXXXX"); const char *highDpiEnvironmentVariable = setHighDpiEnvironmentVariable(); From f603a115d022e50667d0f2e66c7900dec48eeaf2 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 10 May 2017 11:22:15 +0300 Subject: [PATCH 16/29] Dumper: Put object address for pointer also when it is not dereferenced int main() { int foo = 42; void *bar = &foo; // bar has no object address return 0; } Change-Id: I917c2976bd618c096bfd704abff8b3538e38a0d3 Reviewed-by: hjk Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 811c2dbaf5f..3ff100b5c4c 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1320,12 +1320,12 @@ class DumperBase: derefValue.name = '*' self.putItem(derefValue) self.currentChildType = savedCurrentChildType - self.putAddress(value.address()) def putFormattedPointerX(self, value): self.putOriginalAddress(value.address()) #warn("PUT FORMATTED: %s" % value) pointer = value.pointer() + self.putAddress(pointer) #warn('POINTER: 0x%x' % pointer) if pointer == 0: #warn('NULL POINTER') From 18537a5594a3bc6d999b6876a187acee9cfa7789 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 9 May 2017 12:19:13 +0200 Subject: [PATCH 17/29] ProjectNodes: Sprinkle QTC_ASSERT over code looking at parentFolderNode Not checking the parentFolderNode triggered a crash elsewhere already, so double check other uses of parentFolderNode and use QTC_ASSERT to make sure no nullptr is going to be accessed. This is necessary now that we have a forest of project trees and no longer have a sessionnode anymore. Change-Id: Ibc380c2ec9b12b983e709d2eeb03a8b741fe1058 Reviewed-by: Tim Jenssen --- src/plugins/projectexplorer/projectexplorer.cpp | 1 + src/plugins/qmakeprojectmanager/qmakenodes.cpp | 6 ++++-- src/plugins/qmakeprojectmanager/qmakeproject.cpp | 1 + src/plugins/resourceeditor/resourceeditorplugin.cpp | 1 + src/plugins/resourceeditor/resourcenode.cpp | 5 +++-- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 0d47cffeb95..b26fdce807f 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -3323,6 +3323,7 @@ void ProjectExplorerPlugin::renameFile(Node *node, const QString &newFilePath) { const QString oldFilePath = node->filePath().toFileInfo().absoluteFilePath(); FolderNode *folderNode = node->parentFolderNode(); + QTC_ASSERT(folderNode, return); const QString projectFileName = folderNode->managingProject()->filePath().fileName(); if (oldFilePath == newFilePath) diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 98c0cae52e9..007e47b0180 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -84,9 +84,11 @@ bool QmakePriFileNode::supportsAction(ProjectAction action, Node *node) const const FolderNode *folderNode = this; const QmakeProFileNode *proFileNode; - while (!(proFileNode = dynamic_cast(folderNode))) + while (!(proFileNode = dynamic_cast(folderNode))) { folderNode = folderNode->parentFolderNode(); - Q_ASSERT(proFileNode); + QTC_ASSERT(folderNode, return false); + } + QTC_ASSERT(proFileNode, return false); const QmakeProFile *pro = proFileNode->proFile(); switch (pro ? pro->projectType() : ProjectType::Invalid) { diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index abedb874033..c7ff2a2765f 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -611,6 +611,7 @@ QStringList QmakeProject::filesGeneratedFrom(const QString &input) const if (const FileNode *file = fileNodeOf(rootProjectNode(), FileName::fromString(input))) { const QmakeProFileNode *pro = static_cast(file->parentFolderNode()); + QTC_ASSERT(pro, return {}); if (const QmakeProFile *proFile = pro->proFile()) return Utils::transform(proFile->generatedFiles(FileName::fromString(pro->buildDir()), file->filePath(), file->fileType()), diff --git a/src/plugins/resourceeditor/resourceeditorplugin.cpp b/src/plugins/resourceeditor/resourceeditorplugin.cpp index 42a59226b73..75cce175429 100644 --- a/src/plugins/resourceeditor/resourceeditorplugin.cpp +++ b/src/plugins/resourceeditor/resourceeditorplugin.cpp @@ -287,6 +287,7 @@ void ResourceEditorPlugin::removeFileContextMenu() QTC_ASSERT(rfn, return); QString path = rfn->filePath().toString(); FolderNode *parent = rfn->parentFolderNode(); + QTC_ASSERT(parent, return); if (!parent->removeFiles(QStringList() << path)) QMessageBox::warning(Core::ICore::mainWindow(), tr("File Removal Failed"), diff --git a/src/plugins/resourceeditor/resourcenode.cpp b/src/plugins/resourceeditor/resourcenode.cpp index b8fbcc10cb2..20f67b2eecd 100644 --- a/src/plugins/resourceeditor/resourcenode.cpp +++ b/src/plugins/resourceeditor/resourcenode.cpp @@ -70,8 +70,9 @@ public: { if (type == TypePermissions) return true; - auto newNode = new ResourceTopLevelNode(m_node->filePath(), false, m_node->contents(), - m_node->parentFolderNode()); + FolderNode *parent = m_node->parentFolderNode(); + QTC_ASSERT(parent, return false); + auto newNode = new ResourceTopLevelNode(m_node->filePath(), false, m_node->contents(), parent); m_node->parentFolderNode()->replaceSubtree(m_node, newNode); return true; } From 5f03b47f36c835993c368e70bc3240d2394f627b Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 10 May 2017 14:04:18 +0200 Subject: [PATCH 18/29] Qmake: Hide dummy.cpp files in unconfigured projects, too Change-Id: I6580377c1a43996eb6d7737a095de29112840c26 Reviewed-by: Eike Ziller --- src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp b/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp index c1b5e060bf9..7deb70e5f1b 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp @@ -204,7 +204,7 @@ QmakeProFileNode *QmakeNodeTreeBuilder::buildTree(QmakeProject *project) { // Remove qmake implementation details that litter up the project data: Target *t = project->activeTarget(); - Kit *k = t ? t->kit() : nullptr; + Kit *k = t ? t->kit() : KitManager::defaultKit(); BaseQtVersion *qt = k ? QtKitInformation::qtVersion(k) : nullptr; const FileNameList toExclude = qt ? qt->directoriesToIgnoreInProjectTree() : FileNameList(); From 47198b44e400aa8ef447e6e750704fe9be5bafa3 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Fri, 12 May 2017 12:56:24 +0200 Subject: [PATCH 19/29] Squish: Exclude HTML when reading version from dialog Change-Id: I2e73a27aaa3b8c28cdce93576a8cdfc861e37b8d Reviewed-by: Christian Stenger --- tests/system/suite_HELP/tst_HELP02/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/suite_HELP/tst_HELP02/test.py b/tests/system/suite_HELP/tst_HELP02/test.py index 4f59878a14d..f246a41b6c6 100755 --- a/tests/system/suite_HELP/tst_HELP02/test.py +++ b/tests/system/suite_HELP/tst_HELP02/test.py @@ -27,7 +27,7 @@ source("../../shared/qtcreator.py") # test Qt Creator version information from file and dialog def getQtCreatorVersionFromDialog(): - chk = re.search("(?<=Qt Creator)\s\d+.\d+.\d+\S*", + chk = re.search("(?<=Qt Creator)\s\d+.\d+.\d+[-\w]*", str(waitForObject("{text?='*Qt Creator*' type='QLabel' unnamed='1' visible='1' " "window=':About Qt Creator_Core::Internal::VersionDialog'}").text)) try: From 69521da36e21795aa0d115f3b6cf53d7a499b013 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 12 May 2017 14:30:08 +0200 Subject: [PATCH 20/29] Debugger: Fix crash on second options opening Change-Id: I6ca5d860e9c2a82e7032873a0a2c939ab2f4c69f Task-number: QTCREATORBUG-18189 Reviewed-by: Eike Ziller --- src/plugins/debugger/debuggeritemmanager.cpp | 26 +++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp index 0b473fd93eb..6bdf2ca9801 100644 --- a/src/plugins/debugger/debuggeritemmanager.cpp +++ b/src/plugins/debugger/debuggeritemmanager.cpp @@ -197,8 +197,9 @@ public: void updateDebugger(const DebuggerItem &item); void apply(); void cancel(); + DebuggerTreeItem *currentTreeItem(); - DebuggerTreeItem *m_currentTreeItem = nullptr; + QPersistentModelIndex m_currentIndex; }; template @@ -287,8 +288,13 @@ void DebuggerItemModel::cancel() void DebuggerItemModel::setCurrentIndex(const QModelIndex &index) { - TreeItem *treeItem = itemForIndex(index); - m_currentTreeItem = treeItem && treeItem->level() == 2 ? static_cast(treeItem) : 0; + m_currentIndex = index; +} + +DebuggerTreeItem *DebuggerItemModel::currentTreeItem() +{ + TreeItem *treeItem = itemForIndex(m_currentIndex); + return treeItem && treeItem->level() == 2 ? static_cast(treeItem) : nullptr; } DebuggerItemConfigWidget::DebuggerItemConfigWidget() @@ -514,10 +520,11 @@ public: void DebuggerConfigWidget::cloneDebugger() { - if (!d->m_model->m_currentTreeItem) + DebuggerTreeItem *treeItem = d->m_model->currentTreeItem(); + if (!treeItem) return; - DebuggerItem *item = &d->m_model->m_currentTreeItem->m_item; + DebuggerItem *item = &treeItem->m_item; DebuggerItem newItem; newItem.createId(); newItem.setCommand(item->command()); @@ -542,9 +549,10 @@ void DebuggerConfigWidget::addDebugger() void DebuggerConfigWidget::removeDebugger() { - QTC_ASSERT(d->m_model->m_currentTreeItem, return); - d->m_model->m_currentTreeItem->m_removed = !d->m_model->m_currentTreeItem->m_removed; - d->m_model->m_currentTreeItem->update(); + DebuggerTreeItem *treeItem = d->m_model->currentTreeItem(); + QTC_ASSERT(treeItem, return); + treeItem->m_removed = !treeItem->m_removed; + treeItem->update(); updateButtons(); } @@ -556,7 +564,7 @@ void DebuggerConfigWidget::currentDebuggerChanged(const QModelIndex &newCurrent) void DebuggerConfigWidget::updateButtons() { - DebuggerTreeItem *titem = d->m_model->m_currentTreeItem; + DebuggerTreeItem *titem = d->m_model->currentTreeItem(); DebuggerItem *item = titem ? &titem->m_item : nullptr; m_itemConfigWidget->load(item); From d0f3f7f7e511e13ac2784e5e134cea33353493d8 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 12 May 2017 12:02:17 +0200 Subject: [PATCH 21/29] remove executable permission from .ts file Change-Id: Ie5817708c942523721421a4c1c9d553ec1bf2be0 Reviewed-by: Robert Loehning --- share/qtcreator/translations/qtcreator_da.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 share/qtcreator/translations/qtcreator_da.ts diff --git a/share/qtcreator/translations/qtcreator_da.ts b/share/qtcreator/translations/qtcreator_da.ts old mode 100755 new mode 100644 From 112254dc67917f6a113a229ec7aa3ce89aea48dd Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 12 May 2017 12:29:54 +0200 Subject: [PATCH 22/29] CMake: Improve detection of build directory in server-mode Detect both build directories next to the sources as well as below the source directory properly. Without this patch all files that normally go into "Build Directory" node were listed below "Source Directory" when the build directory was a child of the source directory. Task-number: QTCREATORBUG-18196 Change-Id: Ib8674489cfe04958f76df24904107bb7aa093162 Reviewed-by: Tim Jenssen --- src/plugins/cmakeprojectmanager/servermodereader.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 874c8f4f74c..59f6113b36b 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -702,14 +702,15 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot, } // Split up files in groups (based on location): + const bool inSourceBuild = (m_parameters.buildDirectory == m_parameters.sourceDirectory); QList sourceFileNodes; QList buildFileNodes; QList otherFileNodes; foreach (FileNode *fn, toList) { - if (fn->filePath().isChildOf(m_parameters.sourceDirectory)) - sourceFileNodes.append(fn); - else if (fn->filePath().isChildOf(m_parameters.buildDirectory)) + if (fn->filePath().isChildOf(m_parameters.buildDirectory) && !inSourceBuild) buildFileNodes.append(fn); + else if (fn->filePath().isChildOf(m_parameters.sourceDirectory)) + sourceFileNodes.append(fn); else otherFileNodes.append(fn); } From 3c02b9b96841348d4d6d6036b8ed430b02e67d8a Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 12 May 2017 14:32:20 +0200 Subject: [PATCH 23/29] C++: Fix invalid read in isQtReservedWord() The change CPlusPlus: Fix isQtReservedWord commit 7d76dd007954ee48182beb2adf17dab5df5fbea8 enabled the problematic code path. Change-Id: Ic89e3976b07ad55976c474f9c4b6d6f6cf64d29e Reviewed-by: Orgad Shaneh --- src/libs/cplusplus/pp-engine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 5f2e543c52e..3ef5e2c38e0 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -99,7 +99,7 @@ static bool isQtReservedWord(const char *name, int size) size -= 2; switch (size) { case 1: - return name[2] == 'D' || name[2] == 'Q'; + return name[0] == 'D' || name[0] == 'Q'; case 4: return same(name, "SLOT", size) || same(name, "EMIT", size); case 5: From 3e8e82b2e3d8b27b2e8002a15218e8a0f2ea233c Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 10 May 2017 15:19:00 +0200 Subject: [PATCH 24/29] Wizards: Fix wizards in KDE environments KDE checks for a "text" property in the wizard pages and will then replace the text it sees there with some text with added '&' characters. This breaks the wizards, so rename the properties to something that is not "text". Task-number: QTCREATORBUG-17503 Change-Id: Ie513848cef9cd795f06a47659abb550abd268b11 Reviewed-by: Tim Jenssen --- src/libs/utils/textfieldcheckbox.h | 2 +- src/libs/utils/textfieldcombobox.h | 2 +- src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libs/utils/textfieldcheckbox.h b/src/libs/utils/textfieldcheckbox.h index 9bcc17c9ad6..ad585255efc 100644 --- a/src/libs/utils/textfieldcheckbox.h +++ b/src/libs/utils/textfieldcheckbox.h @@ -33,7 +33,7 @@ namespace Utils { // Documentation inside. class QTCREATOR_UTILS_EXPORT TextFieldCheckBox : public QCheckBox { - Q_PROPERTY(QString text READ text WRITE setText) + Q_PROPERTY(QString compareText READ text WRITE setText) Q_PROPERTY(QString trueText READ trueText WRITE setTrueText) Q_PROPERTY(QString falseText READ falseText WRITE setFalseText) Q_OBJECT diff --git a/src/libs/utils/textfieldcombobox.h b/src/libs/utils/textfieldcombobox.h index 136b85de3c7..937a290cad2 100644 --- a/src/libs/utils/textfieldcombobox.h +++ b/src/libs/utils/textfieldcombobox.h @@ -33,7 +33,7 @@ namespace Utils { // Documentation inside. class QTCREATOR_UTILS_EXPORT TextFieldComboBox : public QComboBox { - Q_PROPERTY(QString text READ text WRITE setText) + Q_PROPERTY(QString indexText READ text WRITE setText) Q_OBJECT public: explicit TextFieldComboBox(QWidget *parent = 0); diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp index fe49ff41292..250555386d1 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp @@ -689,7 +689,7 @@ void CheckBoxField::setup(JsonFieldPage *page, const QString &name) auto w = static_cast(widget()); QObject::connect(w, &TextFieldCheckBox::clicked, page, [this, page]() { m_isModified = true; page->completeChanged();}); - page->registerFieldWithName(name, w, "text", SIGNAL(textChanged(QString))); + page->registerFieldWithName(name, w, "compareText", SIGNAL(textChanged(QString))); } bool CheckBoxField::validate(MacroExpander *expander, QString *message) @@ -822,7 +822,7 @@ QWidget *ComboBoxField::createWidget(const QString &displayName, JsonFieldPage * void ComboBoxField::setup(JsonFieldPage *page, const QString &name) { auto w = static_cast(widget()); - page->registerFieldWithName(name, w, "text", SIGNAL(text4Changed(QString))); + page->registerFieldWithName(name, w, "indexText", SIGNAL(text4Changed(QString))); QObject::connect(w, &TextFieldComboBox::text4Changed, page, [page](QString) { page->completeChanged(); }); } From 65234d36140e6fe9cf4191704a003ee32133fa1e Mon Sep 17 00:00:00 2001 From: Kevin Funk Date: Fri, 28 Apr 2017 18:05:46 +0200 Subject: [PATCH 25/29] Fix crash when attaching GammaRay to running proc Backtrace (excerpt): ``` Thread 1 "qtcreator" received signal SIGSEGV, Segmentation fault. 0 0x00007fffe2a809d0 in ProjectExplorer::Runnable::Runnable (this=0x7fffffffc5c0, other=...) at /home/kfunk/devel/src/qt-creator-4.3/src/plugins/projectexplorer/runconfiguration.h:175 1 0x00007fffe2a81eab in QPair::QPair (this=0x7fffffffc5c0, t1=..., t2=...) at ../../../../qt5.8/qtbase/include/QtCore/../../../../../src/qt5.8/qtbase/src/corelib/tools/qpair.h:61 2 0x00007fffe2a81f04 in qMakePair (x=..., y=...) at ../../../../qt5.8/qtbase/include/QtCore/../../../../../src/qt5.8/qtbase/src/corelib/tools/qpair.h:151 3 0x00007fffe2a6e74a in ProjectExplorer::ProjectExplorerPlugin::runningRunControlProcesses () at /home/kfunk/devel/src/qt-creator-4.3/src/plugins/projectexplorer/projectexplorer.cpp:2568 4 0x00007fffdfcfef4e in GammaRayIntegration::Internal::ProcessTrackerBackendQtCreator::checkProcess (this=0x555556240c10, pid=6881) at ../../../src/qtauto/kdab-plugin-gammaray-qtas1.2/gammarayprocesstrackerbackendqtc.cpp:112 5 0x00007fffdf943b6a in GammaRay::ProcessTracker::D::requestUpdate (this=0x555556230800) at /home/kfunk/devel/src/qtauto/gammaray-qtas1.2/common/processtracker.cpp:72 6 0x00007fffdf943548 in GammaRay::ProcessTracker::D::qt_static_metacall (_o=0x555556230800, _c=QMetaObject::InvokeMetaMethod, _id=0, _a=0x7fffffffc800) at common/processtracker.moc:77 7 0x00007ffff66cf95a in QMetaObject::activate (sender=0x555556230900, signalOffset=3, local_signal_index=0, argv=0x0) at /home/kfunk/devel/src/qt5.8/qtbase/src/corelib/kernel/qobject.cpp:3743 (gdb) frame 0 0 0x00007fffe2a809d0 in ProjectExplorer::Runnable::Runnable (this=0x7fffffffc5c0, other=...) at /home/kfunk/devel/src/qt-creator-4.3/src/plugins/projectexplorer/runconfiguration.h:175 (gdb) p other.d 8 = std::unique_ptr containing 0x0 ``` Fixed both locations where there's a potential nullptr derefence in this file. Change-Id: I23f7db6f18675470b19cdf39dce449c5b694160d Reviewed-by: Christian Stenger Reviewed-by: hjk --- src/plugins/projectexplorer/runconfiguration.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index e6ad09513e8..3efb2dae5b2 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -172,7 +172,7 @@ class PROJECTEXPLORER_EXPORT Runnable public: Runnable() = default; - Runnable(const Runnable &other) : d(other.d->clone()) { } + Runnable(const Runnable &other) : d(other.d ? other.d->clone() : nullptr) { } Runnable(Runnable &&other) : d(std::move(other.d)) {} template Runnable(const T &data) : d(new Model(data)) {} @@ -212,7 +212,7 @@ class PROJECTEXPLORER_EXPORT Connection public: Connection() = default; - Connection(const Connection &other) : d(other.d->clone()) { } + Connection(const Connection &other) : d(other.d ? other.d->clone() : nullptr) { } Connection(Connection &&other) /* MSVC 2013 doesn't want = default */ : d(std::move(other.d)) {} template Connection(const T &data) : d(new Model(data)) {} From 4b38b09a81555a183bcc44bfb7fa3dda8e702865 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 12 May 2017 14:05:21 +0200 Subject: [PATCH 26/29] Update qbs submodule To HEAD of 1.8 branch. Change-Id: Icebf0374b92612b7823d9e21b489205a94e34cc2 Reviewed-by: Joerg Bornemann --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 512704a5285..13089719966 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 512704a52858688366a99d8959bf75ee35099e19 +Subproject commit 130897199664f52d737ad4f3e24df19ccfbdee93 From 7e8bac1512b14275ad30478e0da82122a885ecd1 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 14 May 2017 11:27:54 +0300 Subject: [PATCH 27/29] Gerrit: Terminate previous query when remote is changed Change-Id: Ifafaa9068dca069562973151361e653f6db3617e Reviewed-by: Friedemann Kleint Reviewed-by: Tobias Hunger --- src/plugins/git/gerrit/gerritmodel.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/plugins/git/gerrit/gerritmodel.cpp b/src/plugins/git/gerrit/gerritmodel.cpp index 08196d81367..bb33916a5ef 100644 --- a/src/plugins/git/gerrit/gerritmodel.cpp +++ b/src/plugins/git/gerrit/gerritmodel.cpp @@ -230,6 +230,7 @@ public: ~QueryContext(); void start(); + void terminate(); signals: void resultRetrieved(const QByteArray &); @@ -242,7 +243,6 @@ private: void timeout(); void errorTermination(const QString &msg); - void terminate(); QProcess m_process; QTimer m_timer; @@ -498,10 +498,8 @@ QStandardItem *GerritModel::itemForNumber(int number) const void GerritModel::refresh(const QSharedPointer &server, const QString &query) { - if (m_query) { - qWarning("%s: Another query is still running", Q_FUNC_INFO); - return; - } + if (m_query) + m_query->terminate(); clearData(); m_server = server; From 689aa3891d8d87db04a90b6c60ea016088664747 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Mon, 15 May 2017 11:49:53 +0300 Subject: [PATCH 28/29] CMake: Ignore dirty signal on server-mode on Windows CMake sends false signals on Windows. Until this is fixed, ignore them. Task-number: QTCREATORBUG-17944 Change-Id: If59f04fd68a899069ecc02df592d3105e531f5bb Reviewed-by: Tobias Hunger --- src/plugins/cmakeprojectmanager/servermodereader.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 59f6113b36b..0d5673152b3 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -397,7 +397,8 @@ void ServerModeReader::handleProgress(int min, int cur, int max, const QString & void ServerModeReader::handleSignal(const QString &signal, const QVariantMap &data) { Q_UNUSED(data); - if (signal == "dirty") + // CMake on Windows sends false dirty signals on each edit (QTCREATORBUG-17944) + if (!HostOsInfo::isWindowsHost() && signal == "dirty") emit dirty(); } From 02d2b36ce7fcba99829c28325b803e07bb8b14b2 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 14 May 2017 11:09:51 +0300 Subject: [PATCH 29/29] Gerrit: Avoid UTF-8 in comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the default charset is not UTF-8, the editor fails to open this file for write. Change-Id: Idda8379e10ac48e3a5c1012a1c6b7b06ef5835e5 Reviewed-by: André Hartmann Reviewed-by: Tobias Hunger --- src/plugins/git/gerrit/gerritmodel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/git/gerrit/gerritmodel.cpp b/src/plugins/git/gerrit/gerritmodel.cpp index bb33916a5ef..17c4079c5e5 100644 --- a/src/plugins/git/gerrit/gerritmodel.cpp +++ b/src/plugins/git/gerrit/gerritmodel.cpp @@ -653,7 +653,7 @@ static GerritChangePtr parseSshOutput(const QJsonObject &object) { "value": 0, "_account_id": 1000528, - "name": "André Hartmann", + "name": "Andre Hartmann", "email": "aha_1980@gmx.de" }, { @@ -682,7 +682,7 @@ static GerritChangePtr parseSshOutput(const QJsonObject &object) { "value": 0, "_account_id": 1000528, - "name": "André Hartmann", + "name": "Andre Hartmann", "email": "aha_1980@gmx.de" }, {