From 42e538d647921691ee71c88357044e00d88b4562 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Tue, 21 Mar 2017 13:08:48 +0200 Subject: [PATCH 01/92] Locator: Signal added column and resize headers Task-number: QTCREATORBUG-17899 Change-Id: If0b12d6c3b412437149a6ba0a9be34f7c0a983ba Reviewed-by: Orgad Shaneh Reviewed-by: Nikolai Kosjar --- .../coreplugin/locator/locatorwidget.cpp | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/locator/locatorwidget.cpp b/src/plugins/coreplugin/locator/locatorwidget.cpp index 8169cff3c04..b42d0e5fd8e 100644 --- a/src/plugins/coreplugin/locator/locatorwidget.cpp +++ b/src/plugins/coreplugin/locator/locatorwidget.cpp @@ -91,6 +91,7 @@ public: CompletionList(QWidget *parent = 0); void resize(); + void resizeHeaders(); QSize preferredSize() const { return m_preferredSize; } void focusOutEvent (QFocusEvent *event) { @@ -191,10 +192,14 @@ void LocatorModel::addEntries(const QList &entries) { beginInsertRows(QModelIndex(), mEntries.size(), mEntries.size() + entries.size() - 1); mEntries.append(entries); - hasExtraInfo = hasExtraInfo || Utils::anyOf(entries, [](const LocatorFilterEntry &e) { - return !e.extraInfo.isEmpty(); - }); endInsertRows(); + if (hasExtraInfo) + return; + if (Utils::anyOf(entries, [](const LocatorFilterEntry &e) { return !e.extraInfo.isEmpty();})) { + beginInsertColumns(QModelIndex(), 1, 1); + hasExtraInfo = true; + endInsertColumns(); + } } // =========== CompletionList =========== @@ -225,8 +230,14 @@ void CompletionList::resize() const int width = qMax(730, windowSize.width() * 2 / 3); m_preferredSize = QSize(width, shint.height() * 17 + frameWidth() * 2); - header()->resizeSection(0, width / 2); QTreeView::resize(m_preferredSize); + resizeHeaders(); +} + +void CompletionList::resizeHeaders() +{ + header()->resizeSection(0, m_preferredSize.width() / 2); + header()->resizeSection(1, 0); // last section is auto resized because of stretchLastSection } // =========== LocatorWidget =========== @@ -276,6 +287,8 @@ LocatorWidget::LocatorWidget(Locator *qop) : m_completionList->setModel(m_locatorModel); m_completionList->resize(); + connect(m_locatorModel, &QAbstractItemModel::columnsInserted, + m_completionList, &CompletionList::resizeHeaders); m_filterMenu->addAction(m_refreshAction); m_filterMenu->addAction(m_configureAction); From 00bb2425f560df08cbb91a5329f856b565f27999 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Wed, 22 Mar 2017 12:59:02 +0100 Subject: [PATCH 02/92] QmlDesigner: Really prevent possible nullptr access c16324061117b2724b2c50eb109b5ab9c13e903d added the check for !projectNode but then used the pointer anyway Change-Id: Ied63fd0991b0de1dab3d19cd57c00acd596bf752 Reviewed-by: Tobias Hunger --- src/plugins/qmldesigner/documentmanager.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index 59412263ac9..357420c1d87 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -436,7 +436,9 @@ bool DocumentManager::isoProFileSupportsAddingExistingFiles(const QString &resou if (!node || !node->parentFolderNode()) return false; ProjectExplorer::ProjectNode *projectNode = node->parentFolderNode()->asProjectNode(); - if (!projectNode || !projectNode->supportedActions(projectNode).contains(ProjectExplorer::AddExistingFile)) { + if (!projectNode) + return false; + if (!projectNode->supportedActions(projectNode).contains(ProjectExplorer::AddExistingFile)) { qCWarning(documentManagerLog) << "Project" << projectNode->displayName() << "does not support adding existing files"; return false; } From 2092d576765eedf67f476481de4b01c748cb857e Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 22 Mar 2017 14:30:13 +0100 Subject: [PATCH 03/92] Doc: Describe Gerrit changes Update screenshots. Change-Id: I1392d932613c2673e482dc121b13b7335c1ed713 Reviewed-by: Orgad Shaneh --- doc/images/qtcreator-gerrit-options.png | Bin 6697 -> 20725 bytes doc/images/qtcreator-gerrit.png | Bin 135269 -> 172409 bytes doc/src/vcs/creator-vcs-git.qdoc | 16 +++++++++++----- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/doc/images/qtcreator-gerrit-options.png b/doc/images/qtcreator-gerrit-options.png index cf6be7a3280f5817ca1cf11beffa5a52ae6650bd..9ead8c2b2e9fd957b74ae401b188e1b49bc1d296 100644 GIT binary patch literal 20725 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 VnFUs|1`G@g44$rjF6*2UngD~2gkt~z literal 6697 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 DBFa+V diff --git a/doc/images/qtcreator-gerrit.png b/doc/images/qtcreator-gerrit.png index b02fd2a21f1938c0d388ae86499f212d3920edfe..1ba060be741da00cc233f499b8f78315cd1f7f38 100644 GIT binary patch literal 172409 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

?u|L|n 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


>%uiUOTS3>Z- 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

(i;m9Frfb{4(iwo5djBy7)u5P2<~;TPC+|ekq#v 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 MboFyt=akR{0CWZJ9{>OV literal 135269 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

(X?c-}}Yg6x^s=4wz+BRIj;k?GlmoHwd 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 RI \uicontrol Options > \uicontrol {Version Control} - > \uicontrol Gerrit to specify the connection to the Gerrit server. - - \image qtcreator-gerrit-options.png - To push committed changes to Gerrit, select \uicontrol Tools > \uicontrol Git > \uicontrol {Remote Repository} > \uicontrol {Push to Gerrit}. @@ -319,6 +314,17 @@ To refresh the list of changes, select \uicontrol Refresh. + The \uicontrol Remote field lists the remotes of the current repository that + are detected as Gerrit servers. Select \uicontrol Tools > \uicontrol Options + > \uicontrol {Version Control} > \uicontrol Gerrit to specify a fallback + connection to a Gerrit server over SSH. The Gerrit REST interface and the + \l{https://curl.haxx.se/}{curl} tool are used for HTTP connections. + + Select the \uicontrol HTTPS check box to prepend \c https to the Gerrit URL + if Gerrit does not provide it. + + \image qtcreator-gerrit-options.png + \section1 Working with Git Tools To start a graphical interface to Git, select \uicontrol Tools > From a985521b39a947f293f070e3d321bd436a391e00 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 21 Mar 2017 16:50:06 +0100 Subject: [PATCH 04/92] RemoteLinux: Always kill the whole process group This way we can get rid of processes spawned from an initial shell, e.g. in case of the perf profiler. Also, if your target application spawns additional processes, we probably want to kill those. The kill -pgid only works if the target application is actually the process group leader. So, in case it isn't, also kill it individually by pid. Change-Id: Ifcaf3764d21281c3cac107419f84f6bc527854da Task-number: QCE-91 Reviewed-by: Tobias Hunger --- .../remotelinuxsignaloperation.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp index 7c71c3c1431..b59118b4aa4 100644 --- a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp +++ b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp @@ -49,9 +49,9 @@ RemoteLinuxSignalOperation::~RemoteLinuxSignalOperation() } } -static QString signalProcessByPidCommandLine(qint64 pid, int signal) +static QString signalProcessGroupByPidCommandLine(qint64 pid, int signal) { - return QString::fromLatin1("kill -%1 %2").arg(signal).arg(pid); + return QString::fromLatin1("kill -%1 -- -%2 %2").arg(signal).arg(pid); } void RemoteLinuxSignalOperation::run(const QString &command) @@ -72,32 +72,32 @@ void RemoteLinuxSignalOperation::finish() emit finished(m_errorMessage); } -static QString signalProcessByNameCommandLine(const QString &filePath, int signal) +static QString signalProcessGroupByNameCommandLine(const QString &filePath, int signal) { return QString::fromLatin1( "cd /proc; for pid in `ls -d [0123456789]*`; " "do " "if [ \"`readlink /proc/$pid/exe`\" = \"%1\" ]; then " - " kill -%2 $pid;" + " kill -%2 -- -$pid $pid;" "fi; " "done").arg(filePath).arg(signal); } QString RemoteLinuxSignalOperation::killProcessByNameCommandLine(const QString &filePath) const { - return QString::fromLatin1("%1; %2").arg(signalProcessByNameCommandLine(filePath, 15), - signalProcessByNameCommandLine(filePath, 9)); + return QString::fromLatin1("%1; %2").arg(signalProcessGroupByNameCommandLine(filePath, 15), + signalProcessGroupByNameCommandLine(filePath, 9)); } QString RemoteLinuxSignalOperation::interruptProcessByNameCommandLine(const QString &filePath) const { - return signalProcessByNameCommandLine(filePath, 2); + return signalProcessGroupByNameCommandLine(filePath, 2); } void RemoteLinuxSignalOperation::killProcess(qint64 pid) { - run(QString::fromLatin1("%1; sleep 1; %2").arg(signalProcessByPidCommandLine(pid, 15), - signalProcessByPidCommandLine(pid, 9))); + run(QString::fromLatin1("%1; sleep 1; %2").arg(signalProcessGroupByPidCommandLine(pid, 15), + signalProcessGroupByPidCommandLine(pid, 9))); } void RemoteLinuxSignalOperation::killProcess(const QString &filePath) @@ -107,7 +107,7 @@ void RemoteLinuxSignalOperation::killProcess(const QString &filePath) void RemoteLinuxSignalOperation::interruptProcess(qint64 pid) { - run(signalProcessByPidCommandLine(pid, 2)); + run(signalProcessGroupByPidCommandLine(pid, 2)); } void RemoteLinuxSignalOperation::interruptProcess(const QString &filePath) From cf61ca4846f59140341c46329fe451bb6f0ac4a4 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 22 Mar 2017 14:27:09 +0100 Subject: [PATCH 05/92] Debugger: Fix QHostAddress padding for MinGW Change-Id: I97f52587767537a5730753b593bc024e270bbd5e Reviewed-by: Christian Stenger --- share/qtcreator/debugger/qttypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 69443b6cdc4..ce7cda3f526 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -763,7 +763,7 @@ def qdump__QHostAddress(d, value): (ipString, scopeId, a4, pad, a6, protocol, isParsed) \ = d.split('{QString}{QString}{quint32}I16sI{bool}', dd) elif qtVersion >= 0x050600: # 5.6.0 at f3aabb42 - if d.ptrSize() == 8 or d.isMsvcTarget(): + if d.ptrSize() == 8 or d.isWindowsTarget(): (ipString, scopeId, a4, pad, a6, protocol, isParsed) \ = d.split('{QString}{QString}{quint32}I16sI{bool}', dd) else: From 2df831f5306b061e449a431acea531b2f1b06f47 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 22 Mar 2017 14:11:41 +0100 Subject: [PATCH 06/92] Debugger: Do not cache default constructed values Change-Id: I5b389902350abe2684cb26d262a22ce83330034b Reviewed-by: Christian Stenger --- src/libs/qtcreatorcdbext/pyvalue.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libs/qtcreatorcdbext/pyvalue.cpp b/src/libs/qtcreatorcdbext/pyvalue.cpp index a786c2d9af6..4ad149a95c0 100644 --- a/src/libs/qtcreatorcdbext/pyvalue.cpp +++ b/src/libs/qtcreatorcdbext/pyvalue.cpp @@ -54,12 +54,14 @@ PyValue::PyValue(unsigned long index, CIDebugSymbolGroup *symbolGroup) : m_index(index) , m_symbolGroup(symbolGroup) { - valuesForSymbolGroup[symbolGroup].push_back(this); + if (m_symbolGroup) + valuesForSymbolGroup[symbolGroup].push_back(this); } PyValue::~PyValue() { - valuesForSymbolGroup[m_symbolGroup].remove(this); + if (m_symbolGroup) + valuesForSymbolGroup[m_symbolGroup].remove(this); } std::string PyValue::name() const From 26056cea41ae0da6139d346c9adaf6f073d0427f Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 22 Mar 2017 14:14:16 +0100 Subject: [PATCH 07/92] Debugger: Cache copied values Change-Id: Ia61cbc5b2ef76edebe1061b747591e5bfd2f0d8d Reviewed-by: Christian Stenger --- src/libs/qtcreatorcdbext/pyvalue.cpp | 8 ++++++++ src/libs/qtcreatorcdbext/pyvalue.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/libs/qtcreatorcdbext/pyvalue.cpp b/src/libs/qtcreatorcdbext/pyvalue.cpp index 4ad149a95c0..a56cb08ba9c 100644 --- a/src/libs/qtcreatorcdbext/pyvalue.cpp +++ b/src/libs/qtcreatorcdbext/pyvalue.cpp @@ -58,6 +58,14 @@ PyValue::PyValue(unsigned long index, CIDebugSymbolGroup *symbolGroup) valuesForSymbolGroup[symbolGroup].push_back(this); } +PyValue::PyValue(const PyValue &other) + : m_index(other.m_index) + , m_symbolGroup(other.m_symbolGroup) +{ + if (m_symbolGroup) + valuesForSymbolGroup[m_symbolGroup].push_back(this); +} + PyValue::~PyValue() { if (m_symbolGroup) diff --git a/src/libs/qtcreatorcdbext/pyvalue.h b/src/libs/qtcreatorcdbext/pyvalue.h index fd009b2ff8c..fa89c730621 100644 --- a/src/libs/qtcreatorcdbext/pyvalue.h +++ b/src/libs/qtcreatorcdbext/pyvalue.h @@ -36,6 +36,7 @@ class PyValue public: PyValue() = default; PyValue(unsigned long index, CIDebugSymbolGroup *symbolGroup); + PyValue(const PyValue &other); ~PyValue(); std::string name() const; From c2f260ee2e58be1b9dd6390954e7678dd4bb93eb Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 22 Mar 2017 14:16:38 +0100 Subject: [PATCH 08/92] Debugger: Add exceptions for array type names Cdb also seems to return type names for virtual function table types. Change-Id: I0d9accb88222de599488fabdb69c7f1585216c8e Reviewed-by: Christian Stenger --- share/qtcreator/debugger/cdbbridge.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index 0849b532c20..1bbc2793acf 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -160,7 +160,9 @@ class Dumper(DumperBase): return self.createPointerType(targetType) if code == TypeCodeArray: - if nativeType.name().startswith('__fptr()'): + # cdb reports virtual function tables as arrays those ar handled separetly by + # the DumperBase. Declare those types as structs prevents a lookup to a none existing type + if nativeType.name().startswith('__fptr()') or nativeType.name().startswith(' Date: Tue, 21 Mar 2017 16:38:35 +0100 Subject: [PATCH 09/92] ios: Fix qbs build Change-Id: I538fd0702f2677b1a1bd5ce9267f793ab5270f69 Reviewed-by: Vikas Pachdha Reviewed-by: Eike Ziller --- src/plugins/ios/ios.qbs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/ios/ios.qbs b/src/plugins/ios/ios.qbs index 080d0145401..8f156b421c1 100644 --- a/src/plugins/ios/ios.qbs +++ b/src/plugins/ios/ios.qbs @@ -17,6 +17,11 @@ QtcPlugin { "ios.qrc", "iosanalyzesupport.cpp", "iosanalyzesupport.h", + "iosbuildconfiguration.cpp", + "iosbuildconfiguration.h", + "iosbuildsettingswidget.cpp", + "iosbuildsettingswidget.h", + "iosbuildsettingswidget.ui", "iosbuildstep.cpp", "iosbuildstep.h", "iosbuildstep.ui", From ce42e8aba53f30eaceda163f99adb041d2afa11a Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 22 Mar 2017 15:23:50 +0100 Subject: [PATCH 10/92] Tests: Fix compilation with Qt 5.9 qt_qhash_seed is no longer exported Change-Id: I78df98b7022dbe5ae9da56c3d2514b3b31a2312c Reviewed-by: Christian Stenger --- tests/auto/debugger/tst_dumpers.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 5fd4e09ab0b..eba1907fa84 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -1307,10 +1307,16 @@ void tst_Dumpers::dumper() "\n\n" + data.includes + "\n\n" + (data.useQHash ? "\n#include " - "\n#if QT_VERSION >= 0x050000" + "\n#if QT_VERSION >= 0x050900" + "\n#include " + "\nvoid initHashSeed() { qSetGlobalQHashSeed(0); }" + "\n#elif QT_VERSION >= 0x050000" "\nQT_BEGIN_NAMESPACE" "\nQ_CORE_EXPORT extern QBasicAtomicInt qt_qhash_seed; // from qhash.cpp" "\nQT_END_NAMESPACE" + "\nvoid initHashSeed() { qt_qhash_seed.store(0); }" + "\n#else" + "\nvoid initHashSeed() {}" "\n#endif" : "") + "\n\nint main(int argc, char *argv[])" "\n{" @@ -1332,10 +1338,7 @@ void tst_Dumpers::dumper() "\n#else" "\n int boostversion = 0; unused(&boostversion);" "\n#endif" - "\n" + (data.useQHash ? - "\n#if QT_VERSION >= 0x050000" - "\nqt_qhash_seed.store(0);" - "\n#endif\n" : "") + + "\n" + (data.useQHash ? "initHashSeed();" : "") + "\n" + data.code + "\n BREAK;" "\n return 0;" From 8ddfe96f76ea749796a668bd7ff318dc162a1cb1 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sat, 18 Mar 2017 23:31:51 +0200 Subject: [PATCH 11/92] iOS: De-slot Change-Id: Id5a8c4eae641280197db2e24b603e1906a56429e Reviewed-by: Eike Ziller --- src/plugins/ios/iosbuildsettingswidget.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/plugins/ios/iosbuildsettingswidget.h b/src/plugins/ios/iosbuildsettingswidget.h index 6460599c616..89b9a144ab3 100644 --- a/src/plugins/ios/iosbuildsettingswidget.h +++ b/src/plugins/ios/iosbuildsettingswidget.h @@ -49,17 +49,15 @@ public: bool isSigningAutoManaged, QWidget *parent = 0); ~IosBuildSettingsWidget(); -public: bool isSigningAutomaticallyManaged() const; -private slots: - void onSigningEntityComboIndexChanged(); - void onReset(); - signals: void signingSettingsChanged(bool isAutoManaged, QString identifier); private: + void onSigningEntityComboIndexChanged(); + void onReset(); + void setDefaultSigningIdentfier(const QString &identifier) const; void configureSigningUi(bool autoManageSigning); void populateDevelopmentTeams(); From fa6520ed75df0c1bc3f1d2f75dbea3120b83a919 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 21 Mar 2017 14:55:07 +0100 Subject: [PATCH 12/92] ProjectExplorer: Do not try to add a nullptr to the project tree Change-Id: Id6dedc11b9dac8be48fb579e171e4cec6efe1aa1 Reviewed-by: Tobias Hunger Reviewed-by: hjk --- src/plugins/projectexplorer/projectmodels.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index 53be442b194..b8e925230f8 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -238,7 +238,7 @@ ExpandData FlatModel::expandDataForNode(const Node *node) const void FlatModel::handleProjectAdded(Project *project) { - Node *node = project->rootProjectNode(); + Node *node = project->containerNode(); m_toExpand.insert(expandDataForNode(node)); if (WrapperNode *wrapper = wrapperForNode(node)) { wrapper->forFirstLevelChildren([this](WrapperNode *child) { From 9fc68e07b55f086d8f3e3ea4d6d5ba4362ba555f Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 22 Mar 2017 14:59:44 +0200 Subject: [PATCH 13/92] QmakePM: Highlight QMAKE_C[XX]FLAGS_RELEASE_WITH_DEBUGINFO Change-Id: I806878f447f2db836c3b56e534b6b6746c457187 Reviewed-by: Tobias Hunger --- src/plugins/qmakeprojectmanager/profilecompletionassist.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp b/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp index dea84b50dc3..86f3a67cef9 100644 --- a/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp +++ b/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp @@ -93,6 +93,7 @@ static const char *const variableKeywords[] = { "QMAKE_CFLAGS_MT_DLL", "QMAKE_CFLAGS_MT_DLLDBG", "QMAKE_CFLAGS_RELEASE", + "QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO", "QMAKE_CFLAGS_SHLIB", "QMAKE_CFLAGS_THREAD", "QMAKE_CFLAGS_WARN_OFF", @@ -106,6 +107,7 @@ static const char *const variableKeywords[] = { "QMAKE_CXXFLAGS_MT_DLL", "QMAKE_CXXFLAGS_MT_DLLDBG", "QMAKE_CXXFLAGS_RELEASE", + "QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO", "QMAKE_CXXFLAGS_SHLIB", "QMAKE_CXXFLAGS_THREAD", "QMAKE_CXXFLAGS_WARN_OFF", From d31ba1a60e9f226a8e3acecd11b9b536b3e95deb Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 22 Mar 2017 17:47:22 +0100 Subject: [PATCH 14/92] ProjectExplorer: Optimizations for ProjectDelegate::paint Cache the "project" icon in a static variable. Don't fill the background if not needed. Change-Id: I84049c5392a12947db24e2cdf91e7cb5317b9f44 Reviewed-by: hjk --- src/plugins/projectexplorer/projectwelcomepage.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index 8f9029028e6..bf243ecbb73 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -411,15 +411,16 @@ public: QRect rc = option.rect; const bool hovered = option.widget->isActiveWindow() && option.state & QStyle::State_MouseOver; - QColor color = themeColor(hovered ? Theme::Welcome_HoverColor : Theme::Welcome_BackgroundColor); - painter->fillRect(rc, color); + if (hovered) + painter->fillRect(rc, themeColor(Theme::Welcome_HoverColor)); const int x = rc.x(); const int y = rc.y(); const int firstBase = y + 15; const int secondBase = firstBase + 15; - painter->drawPixmap(x + 11, y + 3, pixmap("project", Theme::Welcome_ForegroundSecondaryColor)); + static const QPixmap projectIcon = pixmap("project", Theme::Welcome_ForegroundSecondaryColor); + painter->drawPixmap(x + 11, y + 3, projectIcon); QString projectName = idx.data(Qt::DisplayRole).toString(); QString projectPath = idx.data(ProjectModel::FilePathRole).toString(); From 0c6d5d6aed6bcd4350f96c31ad5e4e4f9c32e821 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 23 Mar 2017 09:06:41 +0200 Subject: [PATCH 15/92] BareMetal: Fix crash on shutdown Change-Id: I40c2381f5d70d57c8bb7b6d4727a5350a52eefc5 Reviewed-by: Denis Shienkov Reviewed-by: hjk --- src/plugins/baremetal/baremetaldevice.cpp | 6 ++++++ src/plugins/baremetal/baremetaldevice.h | 1 + src/plugins/baremetal/gdbserverprovider.cpp | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp index e5b22b5e214..b0e2c20db35 100644 --- a/src/plugins/baremetal/baremetaldevice.cpp +++ b/src/plugins/baremetal/baremetaldevice.cpp @@ -83,6 +83,12 @@ void BareMetalDevice::setGdbServerProviderId(const QString &id) } } +void BareMetalDevice::unregisterProvider(GdbServerProvider *provider) +{ + if (provider->id() == m_gdbServerProviderId) + m_gdbServerProviderId.clear(); +} + void BareMetalDevice::providerUpdated(GdbServerProvider *provider) { GdbServerProvider *myProvider = GdbServerProviderManager::findProvider(m_gdbServerProviderId); diff --git a/src/plugins/baremetal/baremetaldevice.h b/src/plugins/baremetal/baremetaldevice.h index 75d549b2932..a82cdfea0e6 100644 --- a/src/plugins/baremetal/baremetaldevice.h +++ b/src/plugins/baremetal/baremetaldevice.h @@ -59,6 +59,7 @@ public: QString gdbServerProviderId() const; void setGdbServerProviderId(const QString &id); + void unregisterProvider(GdbServerProvider *provider); void providerUpdated(GdbServerProvider *provider); virtual void fromMap(const QVariantMap &map) override; diff --git a/src/plugins/baremetal/gdbserverprovider.cpp b/src/plugins/baremetal/gdbserverprovider.cpp index 3491ec3ad01..afcce6dcaee 100644 --- a/src/plugins/baremetal/gdbserverprovider.cpp +++ b/src/plugins/baremetal/gdbserverprovider.cpp @@ -78,7 +78,7 @@ GdbServerProvider::~GdbServerProvider() { const QSet devices = m_devices; for (BareMetalDevice *device : devices) - device->setGdbServerProviderId(QString()); + device->unregisterProvider(this); } QString GdbServerProvider::displayName() const From c6e1bf6187618399860c4f3041c5f7cd725bd080 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 22 Mar 2017 14:23:41 +0100 Subject: [PATCH 16/92] ScxmlEditor: Retain explicitly set "initial" attributes If the user sets a state to be initial and then moves it around without reparenting it, the initial attribute has to be retained. This is achieved by saving a "removedInitial" attribute in the editor info when the state is released from its parent and restoring the attribute when it is reattached. This even works if the state is temporarily reparented and across save/load cycles. Change-Id: I65df959e4eb8d46177d59f71c8556d596e773c05 Task-number: QTCREATORBUG-17108 Reviewed-by: Marco Benelli --- .../scxmleditor/plugin_interface/scutilsprovider.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/plugins/scxmleditor/plugin_interface/scutilsprovider.cpp b/src/plugins/scxmleditor/plugin_interface/scutilsprovider.cpp index 89dc7bbdb0b..b4b0f227426 100644 --- a/src/plugins/scxmleditor/plugin_interface/scutilsprovider.cpp +++ b/src/plugins/scxmleditor/plugin_interface/scutilsprovider.cpp @@ -45,7 +45,10 @@ void SCUtilsProvider::checkInitialState(const QList &items, Scxm if (parentTag->hasChild(Initial)) { parentTag->setAttribute("initial", QString()); } else { + QString restoredInitial = parentTag->editorInfo("removedInitial"); QString id = parentTag->attribute("initial"); + if (id.isEmpty()) + id = restoredInitial; // 2. If no initial-state available, try to find state with initial-attribute if (!id.isEmpty()) { @@ -59,8 +62,13 @@ void SCUtilsProvider::checkInitialState(const QList &items, Scxm } } - if (!initialStateTag) + if (!initialStateTag) { + parentTag->setEditorInfo("removedInitial", id); parentTag->setAttribute("initial", QString()); + } else if (id == restoredInitial) { + parentTag->setAttribute("initial", id); + parentTag->setEditorInfo("removedInitial", QString()); + } } // 3. If we still cant find initial-state, we must select first From 926b4d1f3a3e01263d2e59d0d3fa3485726ca697 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 10 Mar 2017 13:44:29 +0100 Subject: [PATCH 17/92] Further abstract docs.pri So the same file can be used without adaptions in other projects (for example Qbs). Adds installation of the html documentation, which should not hurt, or might even be preferable. Change-Id: I8f6fbf072b348dfe13e54a5f2018ed6e24fc3a34 Reviewed-by: Joerg Bornemann --- doc/doc.pri | 4 +-- doc/doc_targets.pri | 81 +++++++++++++++++++++++++++++++++++++++++++++ docs.pri | 56 ++++++------------------------- 3 files changed, 93 insertions(+), 48 deletions(-) create mode 100644 doc/doc_targets.pri diff --git a/doc/doc.pri b/doc/doc.pri index 1364a1a5381..67a3032bfb3 100644 --- a/doc/doc.pri +++ b/doc/doc.pri @@ -1,7 +1,7 @@ build_online_docs: \ - QTC_DOCS = $$PWD/qtcreator-online.qdocconf $$PWD/api/qtcreator-dev-online.qdocconf + DOC_FILES += $$PWD/qtcreator-online.qdocconf $$PWD/api/qtcreator-dev-online.qdocconf else: \ - QTC_DOCS = $$PWD/qtcreator.qdocconf $$PWD/api/qtcreator-dev.qdocconf + DOC_FILES += $$PWD/qtcreator.qdocconf $$PWD/api/qtcreator-dev.qdocconf include(../docs.pri) diff --git a/doc/doc_targets.pri b/doc/doc_targets.pri new file mode 100644 index 00000000000..16fbfa2b4ef --- /dev/null +++ b/doc/doc_targets.pri @@ -0,0 +1,81 @@ +# Creates targets for building documentation +# (adapted from qt_docs.prf) +# +# Usage: Define variables (details below) and include this pri file afterwards. +# +# QDOC_ENV - environment variables to set for the qdoc call (see example below) +# DOC_INDEX_PATHS - list of paths where qdoc should search for index files of dependent +# modules (Qt index path is included by default) +# DOC_FILES - list of qdocconf files +# DOC_OUTDIR_POSTFIX - html is generated in $$OUT_PWD/$$DOC_OUTDIR_POSTFIX +# DOC_HTML_INSTALLDIR - path were to install the directory of html files +# DOC_QCH_OUTDIR - path where to generated the qch files +# DOC_QCH_INSTALLDIR - path where to install the qch files +# +# Example for QDOC_ENV: +# ver.name = VERSION +# ver.value = 1.0.2 +# foo.name = FOO +# foo.value = foo +# QDOC_ENV = ver foo + +isEmpty(DOC_FILES): error("Set DOC_FILES before including doc_targets.pri") +isEmpty(DOC_HTML_INSTALLDIR): error("Set DOC_HTML_INSTALLDIR before including doc_targets.pri") +isEmpty(DOC_QCH_OUTDIR): error("Set DOC_QCH_OUTDIR before including doc_targets.pri") +isEmpty(DOC_QCH_INSTALLDIR): error("Set DOC_QCH_INSTALLDIR before including doc_targets.pri") + +QT_TOOL_ENV = $$QDOC_ENV +qtPrepareTool(QDOC, qdoc) +QT_TOOL_ENV = + +!build_online_docs: qtPrepareTool(QHELPGENERATOR, qhelpgenerator) + +DOCS_BASE_OUTDIR = $$OUT_PWD/doc +DOC_INDEXES += -indexdir $$shell_quote($$[QT_INSTALL_DOCS]) +for (index_path, DOC_INDEX_PATHS): \ + DOC_INDEXES += -indexdir $$shell_quote($$index_path) + +for (doc_file, DOC_FILES) { + !exists($$doc_file): error("Cannot find documentation specification file $$doc_file") + DOC_TARGET = $$replace(doc_file, ^(.*/)?(.*)\\.qdocconf$, \\2) + DOC_TARGETDIR = $$DOC_TARGET + DOC_OUTPUTDIR = $${DOCS_BASE_OUTDIR}/$${DOC_TARGETDIR}$${DOC_OUTDIR_POSTFIX} + + html_docs_$${DOC_TARGET}.commands = $$QDOC -outputdir $$shell_quote($$DOC_OUTPUTDIR) $$doc_file $$DOC_INDEXES + QMAKE_EXTRA_TARGETS += html_docs_$${DOC_TARGET} + + !isEmpty(html_docs.commands): html_docs.commands += && + html_docs.commands += $$eval(html_docs_$${DOC_TARGET}.commands) + + inst_html_docs.files += $$DOC_OUTPUTDIR + + !build_online_docs { + qch_docs_$${DOC_TARGET}.commands = $$QHELPGENERATOR $$shell_quote($$DOC_OUTPUTDIR/$${DOC_TARGET}.qhp) -o $$shell_quote($$DOC_QCH_OUTDIR/$${DOC_TARGET}.qch) + qch_docs_$${DOC_TARGET}.depends = html_docs_$${DOC_TARGET} + QMAKE_EXTRA_TARGETS += qch_docs_$${DOC_TARGET} + + !isEmpty(qch_docs.commands): qch_docs.commands += && + qch_docs.commands += $$eval(qch_docs_$${DOC_TARGET}.commands) + + inst_qch_docs.files += $$DOC_QCH_OUTDIR/$${DOC_TARGET}.qch + } +} + +!build_online_docs { + qch_docs.depends = html_docs + inst_qch_docs.path = $$DOC_QCH_INSTALLDIR + inst_qch_docs.CONFIG += no_check_exist no_default_install no_build + install_docs.depends = install_inst_qch_docs + docs.depends = qch_docs + INSTALLS += inst_qch_docs + QMAKE_EXTRA_TARGETS += qch_docs install_docs +} else { + docs.depends = html_docs +} + +inst_html_docs.path = $$DOC_HTML_INSTALLDIR +inst_html_docs.CONFIG += no_check_exist no_default_install directory +INSTALLS += inst_html_docs +install_docs.depends += install_inst_html_docs + +QMAKE_EXTRA_TARGETS += html_docs docs diff --git a/docs.pri b/docs.pri index 4c125724a3f..5727ee131dd 100644 --- a/docs.pri +++ b/docs.pri @@ -1,4 +1,7 @@ -# adapted from qt_docs.prf +# Creates targets for building Qt Creator documentation +# +# Usage: Include qtcreator.pri and define DOC_FILES to point to a list of qdocconf files, +# then include this .pri file isEmpty(VERSION): error("Include qtcreator.pri before including docs.pri!") @@ -12,50 +15,11 @@ qdocindex.name = QDOC_INDEX_DIR qdocindex.value = $$[QT_INSTALL_DOCS] qtcdocsdir.name = QTC_DOCS_DIR qtcdocsdir.value = $$IDE_SOURCE_TREE/doc -QT_TOOL_ENV = qtcver qtcvertag qtdocs qdocindex qtcdocsdir -qtPrepareTool(QDOC, qdoc) -QT_TOOL_ENV = +QDOC_ENV += qtcver qtcvertag qtdocs qdocindex qtcdocsdir -!build_online_docs: qtPrepareTool(QHELPGENERATOR, qhelpgenerator) +DOC_INDEX_PATHS += $$IDE_BUILD_TREE/doc +DOC_HTML_INSTALLDIR = $$INSTALL_DOC_PATH +DOC_QCH_OUTDIR = $$IDE_DOC_PATH +DOC_QCH_INSTALLDIR = $$INSTALL_DOC_PATH -QTC_DOCS_BASE_OUTDIR = $$OUT_PWD/doc -DOC_INDEXES = -indexdir $$shell_quote($$[QT_INSTALL_DOCS]) \ - -indexdir $$shell_quote($$IDE_BUILD_TREE/doc) - -for (qtc_doc, QTC_DOCS) { - !exists($$qtc_doc): error("Cannot find documentation specification file $$qtc_doc") - QTC_DOCS_TARGET = $$replace(qtc_doc, ^(.*/)?(.*)\\.qdocconf$, \\2) - QTC_DOCS_TARGETDIR = $$QTC_DOCS_TARGET - QTC_DOCS_OUTPUTDIR = $$QTC_DOCS_BASE_OUTDIR/$$QTC_DOCS_TARGETDIR - - html_docs_$${QTC_DOCS_TARGET}.commands = $$QDOC -outputdir $$shell_quote($$QTC_DOCS_OUTPUTDIR) $$qtc_doc $$DOC_INDEXES - QMAKE_EXTRA_TARGETS += html_docs_$${QTC_DOCS_TARGET} - - !isEmpty(html_docs.commands): html_docs.commands += && - html_docs.commands += $$eval(html_docs_$${QTC_DOCS_TARGET}.commands) - - !build_online_docs { - qch_docs_$${QTC_DOCS_TARGET}.commands = $$QHELPGENERATOR $$shell_quote($$QTC_DOCS_OUTPUTDIR/$${QTC_DOCS_TARGET}.qhp) -o $$shell_quote($$IDE_DOC_PATH/$${QTC_DOCS_TARGET}.qch) - qch_docs_$${QTC_DOCS_TARGET}.depends = html_docs_$${QTC_DOCS_TARGET} - QMAKE_EXTRA_TARGETS += qch_docs_$${QTC_DOCS_TARGET} - - !isEmpty(qch_docs.commands): qch_docs.commands += && - qch_docs.commands += $$eval(qch_docs_$${QTC_DOCS_TARGET}.commands) - - inst_qch_docs.files += $$IDE_DOC_PATH/$${QTC_DOCS_TARGET}.qch - } -} - -!build_online_docs { - qch_docs.depends = html_docs - inst_qch_docs.path = $$INSTALL_DOC_PATH - inst_qch_docs.CONFIG += no_check_exist no_default_install no_build - install_docs.depends = install_inst_qch_docs - docs.depends = qch_docs - INSTALLS += inst_qch_docs - QMAKE_EXTRA_TARGETS += qch_docs install_docs -} else { - docs.depends = html_docs -} - -QMAKE_EXTRA_TARGETS += html_docs docs +include(doc/doc_targets.pri) From 7022b784c6c17fc5ead54f702c5801e392c78ff9 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 23 Mar 2017 10:01:42 +0100 Subject: [PATCH 18/92] ProjectExplorer: Fix project/subproject item context menu mixup Off-by one negation introduced in ebae642. Change-Id: I26701e170ea4e0dc18f114c6c032b8fa85fb4a98 Reviewed-by: Florian Apolloner Reviewed-by: Tim Jenssen --- src/plugins/projectexplorer/projecttree.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index 6d32406015a..4c5351beef9 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -323,7 +323,7 @@ void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &global } else { switch (node->nodeType()) { case NodeType::Project: - if (node->parentFolderNode()) + if (!node->parentFolderNode()) contextMenu = Core::ActionManager::actionContainer(Constants::M_PROJECTCONTEXT)->menu(); else contextMenu = Core::ActionManager::actionContainer(Constants::M_SUBPROJECTCONTEXT)->menu(); From 35c395cd1314412bd9189f3a73e30f6a38eb6a8e Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 22 Feb 2017 12:03:03 +0100 Subject: [PATCH 19/92] Clang: Enable now passing tests Looks like this was fixed in libclang in the meanwhile. Change-Id: I51200ef7c72a01f5075d2e5d6ca6db4690dfcdd0 Reviewed-by: Tim Jenssen --- tests/unit/unittest/codecompletionsextractor-test.cpp | 2 +- tests/unit/unittest/highlightingmarks-test.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/unittest/codecompletionsextractor-test.cpp b/tests/unit/unittest/codecompletionsextractor-test.cpp index 86406377a1b..28eb6a7548c 100644 --- a/tests/unit/unittest/codecompletionsextractor-test.cpp +++ b/tests/unit/unittest/codecompletionsextractor-test.cpp @@ -384,7 +384,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, Enumerator) CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_Constructor) +TEST_F(CodeCompletionsExtractorSlowTest, Constructor) { ClangCodeCompleteResults completeResults(getResults(constructorDocument, 20)); diff --git a/tests/unit/unittest/highlightingmarks-test.cpp b/tests/unit/unittest/highlightingmarks-test.cpp index db6995897c7..d7a4c359c57 100644 --- a/tests/unit/unittest/highlightingmarks-test.cpp +++ b/tests/unit/unittest/highlightingmarks-test.cpp @@ -782,7 +782,7 @@ TEST_F(HighlightingMarks, DISABLED_SecondArgumentInMacroExpansionIsField) } -TEST_F(HighlightingMarks, DISABLED_EnumerationType) +TEST_F(HighlightingMarks, EnumerationType) { const auto infos = translationUnit.highlightingMarksInRange(sourceRange(316, 30)); @@ -1090,7 +1090,7 @@ TEST_F(HighlightingMarks, DISABLED_NonConstReferenceMemberInitialization) HasTwoTypes(HighlightingType::LocalVariable, HighlightingType::OutputArgument)); } -TEST_F(HighlightingMarks, DISABLED_EnumerationTypeDef) +TEST_F(HighlightingMarks, EnumerationTypeDef) { const auto infos = translationUnit.highlightingMarksInRange(sourceRange(424, 41)); From 7347bad4de39829c51c08dc6b0c1c751d0a17e9a Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 22 Mar 2017 18:06:33 +0100 Subject: [PATCH 20/92] WelcomeScreen: 1-pixel tweaks Adjusting some font sizes and spacings to get the 4.2 look back. Change-Id: I4f21626c7d44c635ec5c88a50bb19214a777ef66 Reviewed-by: Thomas Hartmann --- .../projectexplorer/projectwelcomepage.cpp | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index bf243ecbb73..c74e3857615 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -225,8 +225,6 @@ public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &idx) const final { - static const QPixmap arrowUp = pixmap("expandarrow",Theme::Welcome_ForegroundSecondaryColor); - static const QPixmap arrowDown = QPixmap::fromImage(arrowUp.toImage().mirrored(false, true)); static const QPixmap sessionIcon = pixmap("session", Theme::Welcome_ForegroundSecondaryColor); const QRect rc = option.rect; @@ -243,10 +241,13 @@ public: const int y = rc.y(); const int firstBase = y + 18; - painter->drawPixmap(x + 11, y + 5, sessionIcon); + painter->drawPixmap(x + 11, y + 6, sessionIcon); - if (hovered || expanded) - painter->drawPixmap(rc.right() - 16, y + 5, expanded ? arrowDown : arrowUp); + if (hovered || expanded) { + static const QPixmap arrowUp = pixmap("expandarrow",Theme::Welcome_ForegroundSecondaryColor); + static const QPixmap arrowDown = QPixmap::fromImage(arrowUp.toImage().mirrored(false, true)); + painter->drawPixmap(rc.right() - 20, y + 7, expanded ? arrowDown : arrowUp); + } if (idx.row() < 9) { painter->setPen(foregroundColor2); @@ -264,10 +265,10 @@ public: if (isActiveSession && !isDefaultVirgin) fullSessionName = ProjectWelcomePage::tr("%1 (current session)").arg(fullSessionName); - const QRect switchRect = QRect(x, y, rc.width() - 20, firstBase + 3 - y); + const QRect switchRect = QRect(x, y, rc.width() - 24, firstBase + 3 - y); const bool switchActive = switchRect.contains(mousePos); painter->setPen(linkColor); - painter->setFont(sizedFont(12, option.widget, switchActive)); + painter->setFont(sizedFont(13, option.widget, switchActive)); painter->drawText(x1, firstBase, fullSessionName); if (switchActive) m_activeSwitchToRect = switchRect; @@ -416,11 +417,11 @@ public: const int x = rc.x(); const int y = rc.y(); - const int firstBase = y + 15; - const int secondBase = firstBase + 15; + const int firstBase = y + 18; + const int secondBase = firstBase + 19; static const QPixmap projectIcon = pixmap("project", Theme::Welcome_ForegroundSecondaryColor); - painter->drawPixmap(x + 11, y + 3, projectIcon); + painter->drawPixmap(x + 11, y + 6, projectIcon); QString projectName = idx.data(Qt::DisplayRole).toString(); QString projectPath = idx.data(ProjectModel::FilePathRole).toString(); @@ -432,11 +433,11 @@ public: painter->drawText(x + 3, firstBase, QString::number(idx.row() + 1)); painter->setPen(themeColor(Theme::Welcome_LinkColor)); - painter->setFont(sizedFont(12, option.widget, hovered)); + painter->setFont(sizedFont(13, option.widget, hovered)); painter->drawText(x + 36, firstBase, projectName); painter->setPen(themeColor(Theme::Welcome_ForegroundPrimaryColor)); - painter->setFont(sizedFont(12, option.widget)); + painter->setFont(sizedFont(13, option.widget)); QString pathWithTilde = Utils::withTildeHomePath(QDir::toNativeSeparators(projectPath)); painter->drawText(x + 36, secondBase, pathWithTilde); } @@ -512,11 +513,11 @@ public: openButton->setOnClicked([] { ProjectExplorerPlugin::openOpenProjectDialog(); }); auto sessionsLabel = new QLabel(this); - sessionsLabel->setFont(sizedFont(15, this)); + sessionsLabel->setFont(sizedFont(16, this)); sessionsLabel->setText(ProjectWelcomePage::tr("Sessions")); auto recentProjectsLabel = new QLabel(this); - recentProjectsLabel->setFont(sizedFont(15, this)); + recentProjectsLabel->setFont(sizedFont(16, this)); recentProjectsLabel->setText(ProjectWelcomePage::tr("Recent Projects")); auto sessionsList = new TreeView(this); From 637034c31857e149f1374abd64f54af5ad88a231 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Thu, 23 Mar 2017 12:11:00 +0100 Subject: [PATCH 21/92] Clang: fix SEH exception against the documentation nullptr is not working here Change-Id: I6b5329ef97289370715faba8046724d5e42662ed Reviewed-by: Nikolai Kosjar --- .../source/refactoringcompilationdatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/clangrefactoringbackend/source/refactoringcompilationdatabase.cpp b/src/tools/clangrefactoringbackend/source/refactoringcompilationdatabase.cpp index 24061fb7fbb..38d89a39d03 100644 --- a/src/tools/clangrefactoringbackend/source/refactoringcompilationdatabase.cpp +++ b/src/tools/clangrefactoringbackend/source/refactoringcompilationdatabase.cpp @@ -83,7 +83,7 @@ void RefactoringCompilationDatabase::addFile(const std::string &directory, const std::vector &commandLine) { #if LLVM_VERSION_MAJOR >= 4 - compileCommands.emplace_back(directory, fileName, commandLine, nullptr); + compileCommands.emplace_back(directory, fileName, commandLine, std::string()); #else compileCommands.emplace_back(directory, fileName, commandLine); #endif From 5593dc9d6e278a4b5882adf91b47712214912524 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 23 Mar 2017 11:33:12 +0100 Subject: [PATCH 22/92] QmlDesigner: Apply .css only to tool buttons This fixes the size of the tool buttons in the tool bar of the form editor. Change-Id: I06bda6beb59798b78e42d358107b511e9229107e Reviewed-by: Alessandro Portale --- src/plugins/qmldesigner/components/resources/centerwidget.css | 2 +- src/plugins/qmldesigner/switchsplittabwidget.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/resources/centerwidget.css b/src/plugins/qmldesigner/components/resources/centerwidget.css index 1f91f8993b2..b0e431d88d4 100644 --- a/src/plugins/qmldesigner/components/resources/centerwidget.css +++ b/src/plugins/qmldesigner/components/resources/centerwidget.css @@ -28,7 +28,7 @@ QTabBar#centralTabBar::tab:selected { color: creatorTheme.QmlDesignerTabDark; } -QToolButton { +QToolButton#centralTabBar { background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate; width: 08px; height: 16px; diff --git a/src/plugins/qmldesigner/switchsplittabwidget.cpp b/src/plugins/qmldesigner/switchsplittabwidget.cpp index 4cf6dd9c10c..e2ed26eb6bc 100644 --- a/src/plugins/qmldesigner/switchsplittabwidget.cpp +++ b/src/plugins/qmldesigner/switchsplittabwidget.cpp @@ -73,6 +73,7 @@ SwitchSplitTabWidget::SwitchSplitTabWidget(QWidget *parent) m_tabBarBackground->layout()->addWidget(m_tabBar); QToolButton *horizontalButton = new QToolButton; + horizontalButton->setObjectName("centralTabBar"); horizontalButton->setIcon(Utils::Icons::SPLIT_HORIZONTAL.icon()); connect(horizontalButton, &QToolButton::clicked, [this] () { m_splitter->setOrientation(Qt::Vertical); @@ -80,6 +81,7 @@ SwitchSplitTabWidget::SwitchSplitTabWidget(QWidget *parent) selectFakeTab(); }); QToolButton *verticalButton = new QToolButton; + verticalButton->setObjectName("centralTabBar"); verticalButton->setIcon(Utils::Icons::SPLIT_VERTICAL.icon()); connect(verticalButton, &QToolButton::clicked, [this] () { m_splitter->setOrientation(Qt::Horizontal); From 8d3c886780518d6eb954153c98dce2ab2dc87b02 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 23 Mar 2017 09:47:08 +0200 Subject: [PATCH 23/92] ProjectExplorer: Replace short functions with lambdas Change-Id: If5f8c9a0a3256fb85acda944466f350400449865 Reviewed-by: Tobias Hunger --- .../projectexplorer/projectexplorer.cpp | 255 +++++------------- 1 file changed, 74 insertions(+), 181 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 64cdb35e841..ac1f308e5c2 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -278,26 +278,6 @@ public: void buildQueueFinished(bool success); void buildStateChanged(ProjectExplorer::Project * pro); - void buildProjectOnly(); - void handleBuildProject(); - void buildProjectContextMenu(); - void buildProjectDependenciesContextMenu(); - void buildSession(); - void rebuildProjectOnly(); - void rebuildProject(); - void rebuildProjectContextMenu(); - void rebuildProjectDependenciesContextMenu(); - void rebuildSession(); - void deployProjectOnly(); - void deployProject(); - void deployProjectContextMenu(); - void deploySession(); - void cleanProjectOnly(); - void cleanProject(); - void cleanProjectContextMenu(); - void cleanProjectDependenciesContextMenu(); - void cleanSession(); - void cancelBuild(); void loadAction(); void handleUnloadProject(); void unloadProjectContextMenu(); @@ -1203,50 +1183,85 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er tmp = Utils::HostOsInfo::isWindowsHost() ? 1 : 0; dd->m_projectExplorerSettings.stopBeforeBuild = ProjectExplorerSettings::StopBeforeBuild(tmp); + auto buildManager = new BuildManager(this, dd->m_cancelBuildAction); + connect(buildManager, &BuildManager::buildStateChanged, + dd, &ProjectExplorerPluginPrivate::buildStateChanged); + connect(buildManager, &BuildManager::buildQueueFinished, + dd, &ProjectExplorerPluginPrivate::buildQueueFinished, Qt::QueuedConnection); + connect(dd->m_sessionManagerAction, &QAction::triggered, dd, &ProjectExplorerPluginPrivate::showSessionManager); connect(dd->m_newAction, &QAction::triggered, dd, &ProjectExplorerPlugin::openNewProjectDialog); connect(dd->m_loadAction, &QAction::triggered, dd, &ProjectExplorerPluginPrivate::loadAction); - connect(dd->m_buildProjectOnlyAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::buildProjectOnly); + connect(dd->m_buildProjectOnlyAction, &QAction::triggered, dd, [this] { + dd->queue({ SessionManager::startupProject() }, { Id(Constants::BUILDSTEPS_BUILD) }); + }); connect(dd->m_buildAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::handleBuildProject); - connect(dd->m_buildActionContextMenu, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::buildProjectContextMenu); - connect(dd->m_buildDependenciesActionContextMenu, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::buildProjectDependenciesContextMenu); - connect(dd->m_buildSessionAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::buildSession); - connect(dd->m_rebuildProjectOnlyAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::rebuildProjectOnly); - connect(dd->m_rebuildAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::rebuildProject); - connect(dd->m_rebuildActionContextMenu, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::rebuildProjectContextMenu); - connect(dd->m_rebuildDependenciesActionContextMenu, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::rebuildProjectDependenciesContextMenu); - connect(dd->m_rebuildSessionAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::rebuildSession); - connect(dd->m_deployProjectOnlyAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::deployProjectOnly); - connect(dd->m_deployAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::deployProject); - connect(dd->m_deployActionContextMenu, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::deployProjectContextMenu); - connect(dd->m_deploySessionAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::deploySession); - connect(dd->m_cleanProjectOnlyAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::cleanProjectOnly); - connect(dd->m_cleanAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::cleanProject); - connect(dd->m_cleanActionContextMenu, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::cleanProjectContextMenu); - connect(dd->m_cleanDependenciesActionContextMenu, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::cleanProjectDependenciesContextMenu); - connect(dd->m_cleanSessionAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::cleanSession); + dd, [this] { + dd->queue(SessionManager::projectOrder(SessionManager::startupProject()), + { Id(Constants::BUILDSTEPS_BUILD) }); + }); + connect(dd->m_buildActionContextMenu, &QAction::triggered, dd, [this] { + dd->queue({ ProjectTree::currentProject() }, { Id(Constants::BUILDSTEPS_BUILD) }); + }); + connect(dd->m_buildDependenciesActionContextMenu, &QAction::triggered, dd, [this] { + dd->queue(SessionManager::projectOrder(ProjectTree::currentProject()), + { Id(Constants::BUILDSTEPS_BUILD) }); + }); + connect(dd->m_buildSessionAction, &QAction::triggered, dd, [this] { + dd->queue(SessionManager::projectOrder(), { Id(Constants::BUILDSTEPS_BUILD) }); + }); + connect(dd->m_rebuildProjectOnlyAction, &QAction::triggered, dd, [this] { + dd->queue({ SessionManager::startupProject() }, + { Id(Constants::BUILDSTEPS_CLEAN), Id(Constants::BUILDSTEPS_BUILD) }); + }); + connect(dd->m_rebuildAction, &QAction::triggered, dd, [this] { + dd->queue(SessionManager::projectOrder(SessionManager::startupProject()), + { Id(Constants::BUILDSTEPS_CLEAN), Id(Constants::BUILDSTEPS_BUILD) }); + }); + connect(dd->m_rebuildActionContextMenu, &QAction::triggered, dd, [this] { + dd->queue({ ProjectTree::currentProject() }, + { Id(Constants::BUILDSTEPS_CLEAN), Id(Constants::BUILDSTEPS_BUILD) }); + }); + connect(dd->m_rebuildDependenciesActionContextMenu, &QAction::triggered, dd, [this] { + dd->queue(SessionManager::projectOrder(ProjectTree::currentProject()), + { Id(Constants::BUILDSTEPS_CLEAN), Id(Constants::BUILDSTEPS_BUILD) }); + }); + connect(dd->m_rebuildSessionAction, &QAction::triggered, dd, [this] { + dd->queue(SessionManager::projectOrder(), + { Id(Constants::BUILDSTEPS_CLEAN), Id(Constants::BUILDSTEPS_BUILD) }); + }); + connect(dd->m_deployProjectOnlyAction, &QAction::triggered, dd, [this] { + dd->deploy({ SessionManager::startupProject() }); + }); + connect(dd->m_deployAction, &QAction::triggered, dd, [this] { + dd->deploy(SessionManager::projectOrder(SessionManager::startupProject())); + }); + connect(dd->m_deployActionContextMenu, &QAction::triggered, dd, [this] { + dd->deploy({ ProjectTree::currentProject() }); + }); + connect(dd->m_deploySessionAction, &QAction::triggered, dd, [this] { + dd->deploy(SessionManager::projectOrder()); + }); + connect(dd->m_cleanProjectOnlyAction, &QAction::triggered, dd, [this] { + dd->queue({ SessionManager::startupProject() }, { Id(Constants::BUILDSTEPS_CLEAN) }); + }); + connect(dd->m_cleanAction, &QAction::triggered, dd, [this] { + dd->queue(SessionManager::projectOrder(SessionManager::startupProject()), + { Id(Constants::BUILDSTEPS_CLEAN) }); + }); + connect(dd->m_cleanActionContextMenu, &QAction::triggered, dd, [this] { + dd->queue({ ProjectTree::currentProject() }, { Id(Constants::BUILDSTEPS_CLEAN) }); + }); + connect(dd->m_cleanDependenciesActionContextMenu, &QAction::triggered, dd, [this] { + dd->queue(SessionManager::projectOrder(ProjectTree::currentProject()), + { Id(Constants::BUILDSTEPS_CLEAN) }); + }); + connect(dd->m_cleanSessionAction, &QAction::triggered, dd, [this] { + dd->queue(SessionManager::projectOrder(), { Id(Constants::BUILDSTEPS_CLEAN) }); + }); connect(dd->m_runAction, &QAction::triggered, dd, [this]() { m_instance->runStartupProject(Constants::NORMAL_RUN_MODE); }); connect(dd->m_runActionContextMenu, &QAction::triggered, @@ -1254,7 +1269,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er connect(dd->m_runWithoutDeployAction, &QAction::triggered, dd, [this]() { m_instance->runStartupProject(Constants::NORMAL_RUN_MODE, true); }); connect(dd->m_cancelBuildAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::cancelBuild); + BuildManager::instance(), &BuildManager::cancel); connect(dd->m_unloadAction, &QAction::triggered, dd, &ProjectExplorerPluginPrivate::handleUnloadProject); connect(dd->m_unloadActionContextMenu, &QAction::triggered, @@ -1297,12 +1312,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er connect(this, &ProjectExplorerPlugin::settingsChanged, dd, &ProjectExplorerPluginPrivate::updateRunWithoutDeployMenu); - auto buildManager = new BuildManager(this, dd->m_cancelBuildAction); - connect(buildManager, &BuildManager::buildStateChanged, - dd, &ProjectExplorerPluginPrivate::buildStateChanged); - connect(buildManager, &BuildManager::buildQueueFinished, - dd, &ProjectExplorerPluginPrivate::buildQueueFinished, Qt::QueuedConnection); - connect(ICore::instance(), &ICore::newItemDialogStateChanged, dd, &ProjectExplorerPluginPrivate::updateContextMenuActions); @@ -2358,119 +2367,9 @@ int ProjectExplorerPluginPrivate::queue(QList projects, QList ste return stepLists.count(); } -void ProjectExplorerPluginPrivate::buildProjectOnly() -{ - queue(QList() << SessionManager::startupProject(), QList() << Id(Constants::BUILDSTEPS_BUILD)); -} - void ProjectExplorerPlugin::buildProject(Project *p) { - dd->queue(SessionManager::projectOrder(p), - QList() << Id(Constants::BUILDSTEPS_BUILD)); -} - -void ProjectExplorerPluginPrivate::handleBuildProject() -{ - queue(SessionManager::projectOrder(SessionManager::startupProject()), - QList() << Id(Constants::BUILDSTEPS_BUILD)); -} - -void ProjectExplorerPluginPrivate::buildProjectContextMenu() -{ - queue(QList() << ProjectTree::currentProject(), - QList() << Id(Constants::BUILDSTEPS_BUILD)); -} - -void ProjectExplorerPluginPrivate::buildProjectDependenciesContextMenu() -{ - queue(SessionManager::projectOrder(ProjectTree::currentProject()), - QList() << Id(Constants::BUILDSTEPS_BUILD)); -} - -void ProjectExplorerPluginPrivate::buildSession() -{ - queue(SessionManager::projectOrder(), - QList() << Id(Constants::BUILDSTEPS_BUILD)); -} - -void ProjectExplorerPluginPrivate::rebuildProjectOnly() -{ - queue(QList() << SessionManager::startupProject(), - QList() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD)); -} - -void ProjectExplorerPluginPrivate::rebuildProject() -{ - queue(SessionManager::projectOrder(SessionManager::startupProject()), - QList() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD)); -} - -void ProjectExplorerPluginPrivate::rebuildProjectContextMenu() -{ - queue(QList() << ProjectTree::currentProject(), - QList() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD)); -} - -void ProjectExplorerPluginPrivate::rebuildProjectDependenciesContextMenu() -{ - queue(SessionManager::projectOrder(ProjectTree::currentProject()), - QList() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD)); -} - -void ProjectExplorerPluginPrivate::rebuildSession() -{ - queue(SessionManager::projectOrder(), - QList() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD)); -} - -void ProjectExplorerPluginPrivate::deployProjectOnly() -{ - deploy(QList() << SessionManager::startupProject()); -} - -void ProjectExplorerPluginPrivate::deployProject() -{ - deploy(SessionManager::projectOrder(SessionManager::startupProject())); -} - -void ProjectExplorerPluginPrivate::deployProjectContextMenu() -{ - deploy(QList() << ProjectTree::currentProject()); -} - -void ProjectExplorerPluginPrivate::deploySession() -{ - deploy(SessionManager::projectOrder()); -} - -void ProjectExplorerPluginPrivate::cleanProjectOnly() -{ - queue(QList() << SessionManager::startupProject(), - QList() << Id(Constants::BUILDSTEPS_CLEAN)); -} - -void ProjectExplorerPluginPrivate::cleanProject() -{ - queue(SessionManager::projectOrder(SessionManager::startupProject()), - QList() << Id(Constants::BUILDSTEPS_CLEAN)); -} - -void ProjectExplorerPluginPrivate::cleanProjectContextMenu() -{ - queue(QList() << ProjectTree::currentProject(), - QList() << Id(Constants::BUILDSTEPS_CLEAN)); -} - -void ProjectExplorerPluginPrivate::cleanProjectDependenciesContextMenu() -{ - queue(SessionManager::projectOrder(ProjectTree::currentProject()), - QList() << Id(Constants::BUILDSTEPS_CLEAN)); -} - -void ProjectExplorerPluginPrivate::cleanSession() -{ - queue(SessionManager::projectOrder(), - QList() << Id(Constants::BUILDSTEPS_CLEAN)); + dd->queue(SessionManager::projectOrder(p), { Id(Constants::BUILDSTEPS_BUILD) }); } void ProjectExplorerPluginPrivate::runProjectContextMenu() @@ -2886,12 +2785,6 @@ void ProjectExplorerPluginPrivate::slotUpdateRunActions() m_runWithoutDeployAction->setEnabled(state); } -void ProjectExplorerPluginPrivate::cancelBuild() -{ - if (BuildManager::isBuilding()) - BuildManager::cancel(); -} - void ProjectExplorerPluginPrivate::addToRecentProjects(const QString &fileName, const QString &displayName) { if (fileName.isEmpty()) From 213bfe9e9cf19f0a90394a3d0729395cbf169823 Mon Sep 17 00:00:00 2001 From: Max Blagay Date: Sun, 22 Jan 2017 10:47:12 +0100 Subject: [PATCH 24/92] Git: Remove "Sign off" shortcut from submit editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new "Sign off" option in Git submit editor had the shortcut Alt+S, which conflicted with the shortcut for "Diff Selected Files". As "Sign off" will most likey be used seldom, the shortcut is removed. Change-Id: Id7763277da304834e9dc5d850272dd5fc207fcb9 Reviewed-by: Orgad Shaneh Reviewed-by: Tasuku Suzuki Reviewed-by: Leena Miettinen Reviewed-by: André Hartmann --- src/plugins/git/gitsubmitpanel.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/git/gitsubmitpanel.ui b/src/plugins/git/gitsubmitpanel.ui index 1e10e3282f0..2134b702c8a 100644 --- a/src/plugins/git/gitsubmitpanel.ui +++ b/src/plugins/git/gitsubmitpanel.ui @@ -148,7 +148,7 @@ - &Sign off + Sign off From b7d1be77e9c6773eb00d220fe9aabdf2bdbdeac7 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 23 Mar 2017 13:24:19 +0100 Subject: [PATCH 25/92] Doc: Remove dependencies to deprecated modules To suppress QDoc warnings. Change-Id: Ic1eb077701d9e9bdcaee63af9af8eaff8d2ec26f Reviewed-by: Eike Ziller --- doc/config/qtcreator-developer.qdocconf | 2 -- doc/config/qtcreator-project.qdocconf | 1 - 2 files changed, 3 deletions(-) diff --git a/doc/config/qtcreator-developer.qdocconf b/doc/config/qtcreator-developer.qdocconf index 8f251a0d03f..ef4a1eb8d56 100644 --- a/doc/config/qtcreator-developer.qdocconf +++ b/doc/config/qtcreator-developer.qdocconf @@ -51,9 +51,7 @@ depends += qtwidgets \ qtgui \ qthelp \ qtquickcontrols \ - qtquicklayouts \ qtlinguist \ - qtscript \ qtsensors \ qtuitools \ qtwebkit \ diff --git a/doc/config/qtcreator-project.qdocconf b/doc/config/qtcreator-project.qdocconf index f439b3a7b6c..6f702042270 100644 --- a/doc/config/qtcreator-project.qdocconf +++ b/doc/config/qtcreator-project.qdocconf @@ -40,7 +40,6 @@ depends += qtwidgets \ qtquickcontrols2 \ qtquickextras \ qtlinguist \ - qtscript \ qtscxml \ qtsensors \ qttestlib \ From ef5def1bd4994d5e2300e8d7b5e44eda8d431c4e Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 23 Mar 2017 13:33:02 +0100 Subject: [PATCH 26/92] QmlDesigner: Improve lower and raise icons They should now look less "disabled". Change-Id: If871a393876ea47d139732b1935f72f4cf0eefa1 Reviewed-by: Thomas Hartmann --- .../components/componentcore/images/lower.png | Bin 149 -> 149 bytes .../componentcore/images/lower@2x.png | Bin 166 -> 166 bytes .../components/componentcore/images/raise.png | Bin 150 -> 149 bytes .../componentcore/images/raise@2x.png | Bin 166 -> 168 bytes src/tools/icons/qtcreatoricons.svg | 15 ++++++--------- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/images/lower.png b/src/plugins/qmldesigner/components/componentcore/images/lower.png index e02bd9d28c543bac97715a0d786faa8cc5ef4934..447b9f248d132a3ca66e9740d6171ed362741098 100644 GIT binary patch delta 75 zcmbQrIF)fipi6Y}iv}h(mcy((HWOT|q#Q)pr!>Yc>1Z@$(z&!wfh%mdKI;Vst0GMkS&Hw-a diff --git a/src/plugins/qmldesigner/components/componentcore/images/lower@2x.png b/src/plugins/qmldesigner/components/componentcore/images/lower@2x.png index 681b4a8a1764b0b3f4a47dd01fc17030025bbb01..3b7cea40f79730824ec54c6baccf7c77386a8303 100644 GIT binary patch delta 85 zcmZ3+xQuZ^gr8_yLV|)q!@}0Cv=)Pg2F*!g>E;xl6J4rYk5b^A0o^ZY=$BiR`ag!vU0_zDT#RS$9*R&Sy rZg!|JP+(rebi`exZR?R;%nULdEtjM(xy)l=U|{fc^>bP0l+XkKBIg~+ diff --git a/src/plugins/qmldesigner/components/componentcore/images/raise.png b/src/plugins/qmldesigner/components/componentcore/images/raise.png index aba160dcfe1bcc464d4a4b6bcbab212a24559e7b..0d1567645e137b8377917814a303996fad96d468 100644 GIT binary patch delta 84 zcmbQnIF)gNhp&aFi(?2!bh1V}6Pw0SzSIU6i31FgOKdD<7A^B}6j7RV?3I%Qn2G$u9wpcXFE@*lru5$V#cS6R(b&?YI+(iXk*dkatW;;4CFg(x6wR`pY S#B>G*1_n=8KbLh*2~7alb0rG^ delta 110 zcmZ3%xQuaveR`0mi(`n!#N+};W}XTb7DtBl40*;96Bxr77u`v0Nn2~&%(be4ky*G) zEPcUCtrJXa4vcCly5|zuS1kC!da|g7Ng`@RE?eUV0T;FiR*u<@4h#&v<=GCopNeNP QFfcH9y85}Sb4q9e0H~@Xxc~qF diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 2041e479172..014d5b46d4e 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -4187,12 +4187,6 @@ y="568" x="473" style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none" /> - + + d="m 475,570 h 13 v 1 h -13 z" + id="path5907-4-74" /> Date: Thu, 23 Mar 2017 13:28:57 +0100 Subject: [PATCH 27/92] QmlDesigner: un-swap lower and raise icons Change-Id: I25043dac5fb82b087e6866be9a608c1d8ddfda26 Reviewed-by: Thomas Hartmann Reviewed-by: Alessandro Portale --- .../components/componentcore/designeractionmanager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index c2364ff4327..6e5b3e4a119 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -647,7 +647,7 @@ void DesignerActionManager::createDefaultDesignerActions() addDesignerAction(new ModelNodeAction( raiseCommandId, raiseDisplayName, - Utils::Icon({{":/qmldesigner/icon/designeractions/images/lower.png", Utils::Theme::IconsBaseColor}}).icon(), + Utils::Icon({{":/qmldesigner/icon/designeractions/images/raise.png", Utils::Theme::IconsBaseColor}}).icon(), raiseToolTip, stackCategory, QKeySequence(), @@ -658,7 +658,7 @@ void DesignerActionManager::createDefaultDesignerActions() addDesignerAction(new ModelNodeAction( lowerCommandId, lowerDisplayName, - Utils::Icon({{":/qmldesigner/icon/designeractions/images/raise.png", Utils::Theme::IconsBaseColor}}).icon(), + Utils::Icon({{":/qmldesigner/icon/designeractions/images/lower.png", Utils::Theme::IconsBaseColor}}).icon(), lowerToolTip, stackCategory, QKeySequence(), From 0ba2706f54ad6cab27f7f10c254e3b2adb118d09 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 22 Mar 2017 14:44:51 +0200 Subject: [PATCH 28/92] WinInterrupt: Fix static linking flags * The source is a C file, not C++. * Release with debug info was not covered. Change-Id: I868cf7415b93499c07249bd42dd91037382233c7 Reviewed-by: David Schulz --- src/tools/wininterrupt/wininterrupt.pro | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/tools/wininterrupt/wininterrupt.pro b/src/tools/wininterrupt/wininterrupt.pro index 3ac6fc32bae..d7ea748d2ac 100644 --- a/src/tools/wininterrupt/wininterrupt.pro +++ b/src/tools/wininterrupt/wininterrupt.pro @@ -8,12 +8,14 @@ include(../../qtcreatortool.pri) # TODO: No effect, currently? msvc { - QMAKE_CXXFLAGS_RELEASE -= -MD - QMAKE_CXXFLAGS_DEBUG -= -MDd - QMAKE_CXXFLAGS_RELEASE += -MT - QMAKE_CXXFLAGS_DEBUG += -MT + QMAKE_CFLAGS_RELEASE -= -MD + QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO -= -MD + QMAKE_CFLAGS_DEBUG -= -MDd + QMAKE_CFLAGS_RELEASE += -MT + QMAKE_CFLAGS_DEBUG += -MT + QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -MT } else { - QMAKE_CXXFLAGS += -static + QMAKE_CFLAGS += -static } SOURCES = wininterrupt.c From 43ea2f2d821b7106c04d799e9879c4193d72ed76 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 22 Mar 2017 22:54:16 +0100 Subject: [PATCH 29/92] ProjectWelcomePage: Revive the expand arrow hover effect The <= 4.2 welcome screen had a separate hover effect for the expand arrow area. Let's have this back. Change-Id: I5f03092420b488f2a847ca6c50d81368c8a3c9aa Reviewed-by: Thomas Hartmann --- src/plugins/projectexplorer/projectwelcomepage.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index c74e3857615..02687d1fe50 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -234,7 +234,8 @@ public: //const bool hovered = option.state & QStyle::State_MouseOver; const bool hovered = option.rect.contains(mousePos); const bool expanded = m_expandedSessions.contains(sessionName); - painter->fillRect(rc, hovered || expanded ? hoverColor : backgroundColor); + if (hovered) + painter->fillRect(expanded ? rc : rc.adjusted(0, 0, -24, 0), hoverColor); const int x = rc.x(); const int x1 = x + 36; @@ -243,6 +244,12 @@ public: painter->drawPixmap(x + 11, y + 6, sessionIcon); + if (hovered && !expanded) { + const QRect arrowRect = rc.adjusted(rc.width() - 24, 0, 0, 0); + if (arrowRect.contains(mousePos)) + painter->fillRect(arrowRect, hoverColor); + } + if (hovered || expanded) { static const QPixmap arrowUp = pixmap("expandarrow",Theme::Welcome_ForegroundSecondaryColor); static const QPixmap arrowDown = QPixmap::fromImage(arrowUp.toImage().mirrored(false, true)); @@ -337,7 +344,7 @@ public: { if (ev->type() == QEvent::MouseButtonRelease) { const QPoint pos = static_cast(ev)->pos(); - const QRect rc(option.rect.right() - 20, option.rect.top(), 20, 30); + const QRect rc(option.rect.right() - 24, option.rect.top(), 24, 30); const QString sessionName = idx.data(Qt::DisplayRole).toString(); if (rc.contains(pos)) { // The expand/collapse "button". From 01cb51c11963772a34e503f907a1f80a0de85eb0 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 22 Mar 2017 16:31:12 +0100 Subject: [PATCH 30/92] Timeline: Use Flickable's width for scrolling, not parent's The parent width may get updated before the Flickable's, causing synchronization problems. Also, we can keep the width/contentWidth handling local to the Flickable now. Change-Id: Ia7fe09a9526c23b7d2f1ab4149f0aa2bc8f3ffb7 Task-number: QTCREATORBUG-16700 Reviewed-by: hjk --- src/libs/timeline/qml/MainView.qml | 5 +- src/libs/timeline/qml/TimelineContent.qml | 58 +++++++++++------------ 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/libs/timeline/qml/MainView.qml b/src/libs/timeline/qml/MainView.qml index ca19e81e337..5a7acac4d04 100644 --- a/src/libs/timeline/qml/MainView.qml +++ b/src/libs/timeline/qml/MainView.qml @@ -46,10 +46,7 @@ Rectangle { property bool selectionRangeMode: false property bool selectionRangeReady: selectionRange.ready property int typeId: content.typeId - onWidthChanged: { - zoomSliderToolBar.updateZoomLevel(); - content.scroll(); - } + onWidthChanged: zoomSliderToolBar.updateZoomLevel(); color: Theme.color(Theme.Timeline_BackgroundColor1) diff --git a/src/libs/timeline/qml/TimelineContent.qml b/src/libs/timeline/qml/TimelineContent.qml index 3557f8a3bae..74a929769a6 100644 --- a/src/libs/timeline/qml/TimelineContent.qml +++ b/src/libs/timeline/qml/TimelineContent.qml @@ -80,43 +80,43 @@ ScrollView { property bool recursionGuard: false - // Update the zoom control on srolling. - onContentXChanged: { + function guarded(operation) { if (recursionGuard) return; - recursionGuard = true; - - var newStartTime = contentX * zoomer.rangeDuration / scroller.width + - zoomer.windowStart; - if (isFinite(newStartTime) && Math.abs(newStartTime - zoomer.rangeStart) >= 1) { - var newEndTime = (contentX + scroller.width) * zoomer.rangeDuration / - scroller.width + zoomer.windowStart; - if (isFinite(newEndTime)) - zoomer.setRange(newStartTime, newEndTime); - } + operation(); recursionGuard = false; } + onWidthChanged: scroll() + + // Update the zoom control on scrolling. + onContentXChanged: guarded(function() { + var newStartTime = contentX * zoomer.rangeDuration / width + zoomer.windowStart; + if (isFinite(newStartTime) && Math.abs(newStartTime - zoomer.rangeStart) >= 1) { + var newEndTime = (contentX + width) * zoomer.rangeDuration / width + + zoomer.windowStart; + if (isFinite(newEndTime)) + zoomer.setRange(newStartTime, newEndTime); + } + }); + // Scroll when the zoom control is updated function scroll() { - if (recursionGuard) - return; - recursionGuard = true; - if (zoomer.rangeDuration <= 0) { - contentWidth = 0; - contentX = 0; - } else { - var newWidth = zoomer.windowDuration * scroller.width / zoomer.rangeDuration; - if (isFinite(newWidth) && Math.abs(newWidth - contentWidth) >= 1) - contentWidth = newWidth; - var newStartX = (zoomer.rangeStart - zoomer.windowStart) * scroller.width / - zoomer.rangeDuration; - if (isFinite(newStartX) && Math.abs(newStartX - contentX) >= 1) - contentX = newStartX; - } - - recursionGuard = false; + guarded(function() { + if (zoomer.rangeDuration <= 0) { + contentWidth = 0; + contentX = 0; + } else { + var newWidth = zoomer.windowDuration * width / zoomer.rangeDuration; + if (isFinite(newWidth) && Math.abs(newWidth - contentWidth) >= 1) + contentWidth = newWidth; + var newStartX = (zoomer.rangeStart - zoomer.windowStart) * width / + zoomer.rangeDuration; + if (isFinite(newStartX) && Math.abs(newStartX - contentX) >= 1) + contentX = newStartX; + } + }); } Column { From b609f2d9e948ec7fb91cd317f4e1a7e36969ce65 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 21 Mar 2017 13:33:00 +0100 Subject: [PATCH 31/92] QmlProfiler: Correctly process coarse-grained traces If many events start or end at the same time, the parser would confuse their order, resulting in meaningless statistics. Change-Id: I05f94e694c16d6c22b6e937c2f979ce572a068d1 Task-number: QTCREATORBUG-17885 Reviewed-by: hjk --- .../qmlprofiler/qmlprofilertracefile.cpp | 79 +++++++++++++++++-- 1 file changed, 71 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp index da66e9beb38..a821b43eb0b 100644 --- a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp @@ -416,10 +416,77 @@ void QmlProfilerFileReader::loadEventTypes(QXmlStreamReader &stream) } } +class EventList +{ +public: + void addEvent(const QmlEvent &event); + void addRange(const QmlEvent &start, const QmlEvent &end); + + QVector finalize(); + +private: + struct QmlRange { + QmlEvent begin; + QmlEvent end; + }; + + QVector ranges; +}; + +void EventList::addEvent(const QmlEvent &event) +{ + ranges.append({event, QmlEvent()}); +} + +void EventList::addRange(const QmlEvent &start, const QmlEvent &end) +{ + ranges.append({start, end}); +} + +QVector EventList::finalize() +{ + std::sort(ranges.begin(), ranges.end(), [](const QmlRange &a, const QmlRange &b) { + if (a.begin.timestamp() < b.begin.timestamp()) + return true; + if (a.begin.timestamp() > b.begin.timestamp()) + return false; + + // If the start times are equal. Sort the one with the greater end time first, so that + // the nesting is retained. + return (a.end.timestamp() > b.end.timestamp()); + }); + + QList ends; + QVector result; + while (!ranges.isEmpty()) { + // This is more expensive than just iterating, but we don't want to double the already + // high memory footprint. + QmlRange range = ranges.takeFirst(); + while (!ends.isEmpty() && ends.last().timestamp() <= range.begin.timestamp()) + result.append(ends.takeLast()); + + result.append(range.begin); + if (range.end.isValid()) { + auto it = ends.end(); + for (auto begin = ends.begin(); it != begin;) { + if ((--it)->timestamp() >= range.end.timestamp()) { + ++it; + break; + } + } + ends.insert(it, range.end); + } + } + while (!ends.isEmpty()) + result.append(ends.takeLast()); + + return result; +} + void QmlProfilerFileReader::loadEvents(QXmlStreamReader &stream) { QTC_ASSERT(stream.name() == _("profilerDataModel"), return); - QVector events; + EventList events; while (!stream.atEnd() && !stream.hasError() && !isCanceled()) { @@ -444,12 +511,11 @@ void QmlProfilerFileReader::loadEvents(QXmlStreamReader &stream) if (attributes.hasAttribute(_("duration"))) { event.setRangeStage(RangeStart); - events.append(event); QmlEvent rangeEnd(event); rangeEnd.setRangeStage(RangeEnd); rangeEnd.setTimestamp(event.timestamp() + attributes.value(_("duration")).toLongLong()); - events.append(rangeEnd); + events.addRange(event, rangeEnd); } else { // attributes for special events if (attributes.hasAttribute(_("framerate"))) @@ -485,7 +551,7 @@ void QmlProfilerFileReader::loadEvents(QXmlStreamReader &stream) if (attributes.hasAttribute(_("text"))) event.setString(attributes.value(_("text")).toString()); - events.append(event); + events.addEvent(event); } } break; @@ -493,10 +559,7 @@ void QmlProfilerFileReader::loadEvents(QXmlStreamReader &stream) case QXmlStreamReader::EndElement: { if (elementName == _("profilerDataModel")) { // done reading profilerDataModel - std::sort(events.begin(), events.end(), [](const QmlEvent &a, const QmlEvent &b) { - return a.timestamp() < b.timestamp(); - }); - emit qmlEventsLoaded(events); + emit qmlEventsLoaded(events.finalize()); return; } break; From 572ea47e97f7bfc2d2e77cc3585f449f4ca889ea Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 23 Mar 2017 11:23:10 +0100 Subject: [PATCH 32/92] CMake: Fix project tree getting lost during reparsing Fix the project tree getting lost after changing a cmake file. This is due to the old set of files being used for deduplication, so no CMakeLists.txt files got added to the tree, and then nothing could be added to those later. Change-Id: I46989e0b802ab2a030d1922282361359837c41a4 Reviewed-by: hjk --- src/plugins/cmakeprojectmanager/servermodereader.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index b62060b1032..610cc3d8885 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -488,6 +488,8 @@ void ServerModeReader::extractCMakeInputsData(const QVariantMap &data) QTC_ASSERT(src == m_parameters.sourceDirectory, return); QDir srcDir(src.toString()); + m_cmakeFiles.clear(); + const QVariantList buildFiles = data.value("buildFiles").toList(); for (const QVariant &bf : buildFiles) { const QVariantMap §ion = bf.toMap(); From bdecee9febb1a93e27947f76740215aa9d7b4eb1 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 20 Mar 2017 16:19:48 +0100 Subject: [PATCH 33/92] QmlProfiler: Add some sanity checks to the various models If we pop an event from the stack, then it should be the same type we pushed earlier. Change-Id: If4389cb57fa8996b3772fefca92d27c33dc35c65 Task-number: QTCREATORBUG-17885 Reviewed-by: hjk --- src/plugins/qmlprofiler/flamegraphmodel.cpp | 4 ++++ src/plugins/qmlprofiler/memoryusagemodel.cpp | 8 +++++--- src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp | 3 ++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmlprofiler/flamegraphmodel.cpp b/src/plugins/qmlprofiler/flamegraphmodel.cpp index d6899f5ce67..e3f98cfbcf7 100644 --- a/src/plugins/qmlprofiler/flamegraphmodel.cpp +++ b/src/plugins/qmlprofiler/flamegraphmodel.cpp @@ -106,6 +106,7 @@ void FlameGraphModel::loadEvent(const QmlEvent &event, const QmlEventType &type) const bool isCompiling = (type.rangeType() == Compiling); QStack &stack = isCompiling ? m_compileStack : m_callStack; FlameGraphData *&stackTop = isCompiling ? m_compileStackTop : m_callStackTop; + QTC_ASSERT(stackTop, return); if (type.message() == MemoryAllocation) { if (type.detailType() == HeapPage) @@ -121,6 +122,8 @@ void FlameGraphModel::loadEvent(const QmlEvent &event, const QmlEventType &type) } } else if (event.rangeStage() == RangeEnd) { + QTC_ASSERT(stackTop != &m_stackBottom, return); + QTC_ASSERT(stackTop->typeIndex == event.typeIndex(), return); stackTop->duration += event.timestamp() - stack.top().timestamp(); stack.pop(); stackTop = stackTop->parent; @@ -129,6 +132,7 @@ void FlameGraphModel::loadEvent(const QmlEvent &event, const QmlEventType &type) stack.push(event); stackTop = pushChild(stackTop, event); } + QTC_CHECK(stackTop); } void FlameGraphModel::finalize() diff --git a/src/plugins/qmlprofiler/memoryusagemodel.cpp b/src/plugins/qmlprofiler/memoryusagemodel.cpp index b4bd0d87cec..30d0da85c77 100644 --- a/src/plugins/qmlprofiler/memoryusagemodel.cpp +++ b/src/plugins/qmlprofiler/memoryusagemodel.cpp @@ -135,12 +135,14 @@ void MemoryUsageModel::loadEvent(const QmlEvent &event, const QmlEventType &type { if (type.message() != MemoryAllocation) { if (type.rangeType() != MaximumRangeType) { + m_continuation = ContinueNothing; if (event.rangeStage() == RangeStart) m_rangeStack.push(RangeStackFrame(event.typeIndex(), event.timestamp())); - else if (event.rangeStage() == RangeEnd) + else if (event.rangeStage() == RangeEnd) { + QTC_ASSERT(!m_rangeStack.isEmpty(), return); + QTC_ASSERT(m_rangeStack.top().originTypeIndex == event.typeIndex(), return); m_rangeStack.pop(); - - m_continuation = ContinueNothing; + } } return; } diff --git a/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp b/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp index 4384a103275..c43a3022822 100644 --- a/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp @@ -225,7 +225,8 @@ void QmlProfilerStatisticsModel::loadEvent(const QmlEvent &event, const QmlEvent break; case RangeEnd: { // update stats - + QTC_ASSERT(!stack.isEmpty(), return); + QTC_ASSERT(stack.top().typeIndex() == event.typeIndex(), return); QmlEventStats *stats = &d->data[event.typeIndex()]; qint64 duration = event.timestamp() - stack.top().timestamp(); stats->duration += duration; From 0cfe9f5c72e84a58b94ca75cac9ddab5160d2b1e Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 22 Mar 2017 09:48:46 +0100 Subject: [PATCH 34/92] QmlDesigner: Use logging category for debug output Task-number: QTCREATORBUG-12973 Change-Id: Idbd0236f8bb3e25be75b572e8507af619427e385 Reviewed-by: Tim Jenssen --- .../filemanager/moveobjectbeforeobjectvisitor.cpp | 2 -- .../qmldesigner/designercore/filemanager/qmlrewriter.cpp | 8 ++++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp index ae86a770aa2..0ec53a74527 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp @@ -27,8 +27,6 @@ #include -#include - using namespace QmlDesigner::Internal; using namespace QmlDesigner; diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp index 27f75c9a226..6247f98697e 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp @@ -28,10 +28,14 @@ #include #include +#include #include #include + +static Q_LOGGING_CATEGORY(qmlRewriter, "qtc.rewriter.qmlrewriter") + using namespace QmlDesigner::Internal; QMLRewriter::QMLRewriter(QmlDesigner::TextModifier &textModifier): @@ -330,9 +334,9 @@ QmlJS::AST::UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(QmlJS::AS void QMLRewriter::dump(const ASTPath &path) { - qDebug() << "AST path with" << path.size() << "node(s):"; + qCDebug(qmlRewriter) << "AST path with" << path.size() << "node(s):"; for (int i = 0; i < path.size(); ++i) { auto node = path.at(i); - qDebug().noquote() << QString(i + 1, QLatin1Char('-')) << typeid(*node).name(); + qCDebug(qmlRewriter).noquote() << QString(i + 1, QLatin1Char('-')) << typeid(*node).name(); } } From 316ed6943cbf6a2033ebd95b62216a5ea80f84d0 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 22 Mar 2017 10:41:12 +0100 Subject: [PATCH 35/92] QmlDesigner: Fix setting size if anchors are present To ignore width or height the item has to be anchored on both sides. Task-number: QTCREATORBUG-15915 Change-Id: I3f4595788a08c295be93b20ebfabd20eb4fe3a63 Reviewed-by: Tim Jenssen --- src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 77f61b2d5fd..f1665484b32 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -644,10 +644,12 @@ bool QmlItemNode::isInStackedContainer() const void QmlItemNode::setSize(const QSizeF &size) { - if (!hasBindingProperty("width") && !anchors().instanceHasAnchor(AnchorLineRight)) + if (!hasBindingProperty("width") && !(anchors().instanceHasAnchor(AnchorLineRight) + && anchors().instanceHasAnchor(AnchorLineLeft))) setVariantProperty("width", qRound(size.width())); - if (!hasBindingProperty("height") && !anchors().instanceHasAnchor(AnchorLineBottom)) + if (!hasBindingProperty("height") && !(anchors().instanceHasAnchor(AnchorLineBottom) + && anchors().instanceHasAnchor(AnchorLineTop))) setVariantProperty("height", qRound(size.height())); } From 970496b24ca46ed0dccee770a486e147e8b9554c Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 22 Mar 2017 12:17:28 +0100 Subject: [PATCH 36/92] QmlDesigner: Fix help The designer used a over simplified lookup, that did not distinguish between e.g. Controls 1 and Controls 2. Instead of fixing the lookup we simply use the working lookup from the QmlJSEditor. Change-Id: I2d31e633eaadc67e211d44bad307b26993f21fc9 Reviewed-by: Tim Jenssen --- .../components/texteditor/texteditorview.cpp | 7 +++++- .../components/texteditor/texteditorview.h | 2 ++ .../designercore/include/viewmanager.h | 2 ++ .../designercore/model/abstractview.cpp | 23 +++++++------------ .../designercore/model/viewmanager.cpp | 5 ++++ 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp index c4b120c97b5..5877424a142 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp @@ -146,13 +146,18 @@ WidgetInfo TextEditorView::widgetInfo() } QString TextEditorView::contextHelpId() const +{ + return AbstractView::contextHelpId(); +} + +QString TextEditorView::qmlJSEditorHelpId() const { if (m_widget->textEditor()) { QString contextHelpId = m_widget->textEditor()->contextHelpId(); if (!contextHelpId.isEmpty()) return m_widget->textEditor()->contextHelpId(); } - return AbstractView::contextHelpId(); + return QString(); } void TextEditorView::nodeIdChanged(const ModelNode& /*node*/, const QString &/*newId*/, const QString &/*oldId*/) diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.h b/src/plugins/qmldesigner/components/texteditor/texteditorview.h index 9b07ee2b5ff..01ac15f2191 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorview.h +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.h @@ -69,6 +69,8 @@ public: WidgetInfo widgetInfo() override; QString contextHelpId() const override; + QString qmlJSEditorHelpId() const; + TextEditor::BaseTextEditor *textEditor(); bool changeToMoveTool(); diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h index b10266d0f86..f69f714f0a7 100644 --- a/src/plugins/qmldesigner/designercore/include/viewmanager.h +++ b/src/plugins/qmldesigner/designercore/include/viewmanager.h @@ -95,6 +95,8 @@ public: void toggleStatesViewExpanded(); + QString qmlJSEditorHelpId() const; + private: // functions Q_DISABLE_COPY(ViewManager) diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index c6084a9c93d..7579c12503b 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -31,6 +31,11 @@ #include "nodeinstanceview.h" #include +#ifndef QMLDESIGNER_TEST +#include +#include +#endif + #include #include @@ -554,21 +559,9 @@ QString AbstractView::contextHelpId() const { QString helpId; - if (hasSelectedModelNodes()) { - QString className = firstSelectedModelNode().simplifiedTypeName(); - helpId = QStringLiteral("QML.") + className; - if (Core::HelpManager::linksForIdentifier(helpId).isEmpty() && firstSelectedModelNode().metaInfo().isValid()) { - - foreach (className, firstSelectedModelNode().metaInfo().superClassNames()) { - helpId = QStringLiteral("QML.") + className; - if (Core::HelpManager::linksForIdentifier(helpId).isEmpty()) - helpId = QString(); - else - break; - } - } - } - +#ifndef QMLDESIGNER_TEST + helpId = QmlDesignerPlugin::instance()->viewManager().qmlJSEditorHelpId(); +#endif return helpId; } diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp index bd7aa0185e6..32e1398bd3c 100644 --- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -411,6 +411,11 @@ void ViewManager::toggleStatesViewExpanded() d->statesEditorView.toggleStatesViewExpanded(); } +QString ViewManager::qmlJSEditorHelpId() const +{ + return d->textEditorView.qmlJSEditorHelpId(); +} + Model *ViewManager::currentModel() const { return currentDesignDocument()->currentModel(); From 9c12e0b7dc3d1ddc5dbf9569922e746d5ed79937 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 22 Mar 2017 14:19:54 +0100 Subject: [PATCH 37/92] QmlDesigner: Fix warning Change-Id: Idc3c8340b7eabef74d70bc0158307e464d5413ec Reviewed-by: Tim Jenssen --- .../qmldesigner/designercore/model/modeltotextmerger.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp index 000d6b549d4..d7ab127edc3 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp @@ -113,7 +113,7 @@ void ModelToTextMerger::propertiesChanged(const QList& propert break; default: - Q_ASSERT(!"Unknown PropertyChangeFlags"); + Q_ASSERT(false); //Unknown PropertyChange flag } } } @@ -178,7 +178,7 @@ void ModelToTextMerger::nodeReparented(const ModelNode &node, const NodeAbstract break; default: - Q_ASSERT(!"Unknown PropertyChange value"); + Q_ASSERT(false); //Unknown PropertyChange value } } else { // old is outside of hierarchy, new is outside of hierarchy, so who cares? @@ -198,7 +198,7 @@ void ModelToTextMerger::nodeSlidAround(const ModelNode &movingNode, const ModelN if (!inFrontOfNode.isValid() || movingNode.parentProperty() == inFrontOfNode.parentProperty()) schedule(new MoveNodeRewriteAction(movingNode, inFrontOfNode)); else - Q_ASSERT(!"Nodes do not belong to the same containing property"); + Q_ASSERT(false); //Nodes do not belong to the same containing property } RewriterView *ModelToTextMerger::view() @@ -348,7 +348,7 @@ QmlRefactoring::PropertyType ModelToTextMerger::propertyType(const AbstractPrope else if (property.isVariantProperty()) return QmlRefactoring::ScriptBinding; - Q_ASSERT(!"cannot convert property type"); + Q_ASSERT(false); //Cannot convert property type return (QmlRefactoring::PropertyType) -1; } From 95ecd506c15cc3e77b50f6315cce5f5e93875046 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 22 Mar 2017 14:24:26 +0100 Subject: [PATCH 38/92] QmlDesigner: Fix warning We should avoid C casts. Change-Id: Ib88dfab642a8f55bf81f428d4fe1cd59af1858da Reviewed-by: Tim Jenssen --- .../qmldesigner/designercore/filemanager/qmlrefactoring.h | 1 + .../qmldesigner/designercore/model/modeltotextmerger.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.h b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.h index d51ca903799..bf82daefea1 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.h +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.h @@ -38,6 +38,7 @@ class QmlRefactoring public: enum PropertyType { + Invalid = -1, ArrayBinding = 1, ObjectBinding = 2, ScriptBinding = 3 diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp index d7ab127edc3..bd424c28705 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp @@ -349,7 +349,7 @@ QmlRefactoring::PropertyType ModelToTextMerger::propertyType(const AbstractPrope return QmlRefactoring::ScriptBinding; Q_ASSERT(false); //Cannot convert property type - return (QmlRefactoring::PropertyType) -1; + return QmlRefactoring::Invalid; } PropertyNameList ModelToTextMerger::propertyOrder() From 7d7c54fe7450961d98373eab667c8243b044db8f Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 22 Mar 2017 14:24:48 +0100 Subject: [PATCH 39/92] QmlDesigner: Only show debug output if enabled Change-Id: I6ad7c44c72ca7b87f3c119df33d01c561dd3d614 Reviewed-by: Tim Jenssen --- .../qmldesigner/designercore/model/modeltotextmerger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp index bd424c28705..19b8b7c1d18 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp @@ -272,7 +272,7 @@ void ModelToTextMerger::applyChanges() if (!success) { m_rewriterView->enterErrorState(QStringLiteral("Error rewriting document")); - if (true || DebugRewriteActions) { + if (DebugRewriteActions) { qDebug() << "*** QML source code: ***"; qDebug() << qPrintable(textModifier->text()); qDebug() << "*** End of QML source code. ***"; From 4ca71590db2a03a1817071c204bede7385e69f90 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 22 Mar 2017 14:42:00 +0100 Subject: [PATCH 40/92] QmlDesigner: Fix warning Change-Id: Iff2c50439521e602bd2703716590a3e95c8ab2b1 Reviewed-by: Tim Jenssen --- .../qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp index b71c24ce9b6..8469b57685e 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp @@ -367,7 +367,7 @@ QImage QuickItemNodeInstance::renderImage() const QRectF renderBoundingRect = boundingRect(); QSize size = renderBoundingRect.size().toSize(); - static float devicePixelRatio = qgetenv("FORMEDITOR_DEVICE_PIXEL_RATIO").toDouble(); + static double devicePixelRatio = qgetenv("FORMEDITOR_DEVICE_PIXEL_RATIO").toDouble(); size *= devicePixelRatio; QImage renderImage = designerSupport()->renderImageForItem(quickItem(), renderBoundingRect, size); From c035cb81ceb5438e147c8f3a76d2b005187be071 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 22 Mar 2017 16:15:37 +0100 Subject: [PATCH 41/92] QmlDesigner: Fix warning Change-Id: If8fe5c9f3db5f1927b9e2dd979a88ce97fdf88a4 Reviewed-by: Tim Jenssen --- .../components/propertyeditor/propertyeditorview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index ab3b19c840b..b28fec7c518 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -278,7 +278,7 @@ void PropertyEditorView::changeExpression(const QString &propertyName) } } else if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(name) == "qreal") { bool ok; - qreal realValue = value->expression().toFloat(&ok); + qreal realValue = value->expression().toDouble(&ok); if (ok) { qmlObjectNode.setVariantProperty(name, realValue); transaction.commit(); //committing in the try block From b3763d9496744f38044c5c23c54ba2c40398b7d6 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 22 Mar 2017 16:16:00 +0100 Subject: [PATCH 42/92] QmlDesigener: Remove C casts Change-Id: I66317b46d7463545961f01b06baadf48470334ec Reviewed-by: Tim Jenssen --- .../designercore/filemanager/qmlrefactoring.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp index 779fdc3a258..a2b4c9b3fc8 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp @@ -90,7 +90,7 @@ bool QmlRefactoring::addToArrayMemberList(int parentLocation, const PropertyName if (parentLocation < 0) return false; - AddArrayMemberVisitor visit(*textModifier, (quint32) parentLocation, QString::fromUtf8(propertyName), content); + AddArrayMemberVisitor visit(*textModifier, parentLocation, QString::fromUtf8(propertyName), content); visit.setConvertObjectBindingIntoArrayBinding(true); return visit(qmlDocument->qmlProgram()); } @@ -100,7 +100,7 @@ bool QmlRefactoring::addToObjectMemberList(int parentLocation, const QString &co if (parentLocation < 0) return false; - AddObjectVisitor visit(*textModifier, (quint32) parentLocation, content, m_propertyOrder); + AddObjectVisitor visit(*textModifier, parentLocation, content, m_propertyOrder); return visit(qmlDocument->qmlProgram()); } @@ -113,7 +113,7 @@ bool QmlRefactoring::addProperty(int parentLocation, if (parentLocation < 0) return false; - AddPropertyVisitor visit(*textModifier, (quint32) parentLocation, name, value, propertyType, m_propertyOrder, dynamicTypeName); + AddPropertyVisitor visit(*textModifier, parentLocation, name, value, propertyType, m_propertyOrder, dynamicTypeName); return visit(qmlDocument->qmlProgram()); } @@ -123,7 +123,7 @@ bool QmlRefactoring::changeProperty(int parentLocation, const PropertyName &name return false; ChangePropertyVisitor visit(*textModifier, - (quint32) parentLocation, + parentLocation, QString::fromUtf8(name), value, propertyType); @@ -135,7 +135,7 @@ bool QmlRefactoring::changeObjectType(int nodeLocation, const QString &newType) if (nodeLocation < 0 || newType.isEmpty()) return false; - ChangeObjectTypeVisitor visit(*textModifier, (quint32) nodeLocation, newType); + ChangeObjectTypeVisitor visit(*textModifier, nodeLocation, newType); return visit(qmlDocument->qmlProgram()); } @@ -144,7 +144,7 @@ bool QmlRefactoring::moveObject(int objectLocation, const PropertyName &targetPr if (objectLocation < 0 || targetParentObjectLocation < 0) return false; - MoveObjectVisitor visit(*textModifier, (quint32) objectLocation, targetPropertyName, targetIsArrayBinding, (quint32) targetParentObjectLocation, m_propertyOrder); + MoveObjectVisitor visit(*textModifier, objectLocation, targetPropertyName, targetIsArrayBinding, (quint32) targetParentObjectLocation, m_propertyOrder); return visit(qmlDocument->qmlProgram()); } @@ -168,7 +168,7 @@ bool QmlRefactoring::removeObject(int nodeLocation) if (nodeLocation < 0) return false; - RemoveUIObjectMemberVisitor visit(*textModifier, (quint32) nodeLocation); + RemoveUIObjectMemberVisitor visit(*textModifier, nodeLocation); return visit(qmlDocument->qmlProgram()); } @@ -177,6 +177,6 @@ bool QmlRefactoring::removeProperty(int parentLocation, const PropertyName &name if (parentLocation < 0 || name.isEmpty()) return false; - RemovePropertyVisitor visit(*textModifier, (quint32) parentLocation, QString::fromUtf8(name)); + RemovePropertyVisitor visit(*textModifier, parentLocation, QString::fromUtf8(name)); return visit(qmlDocument->qmlProgram()); } From a9012ce747d11621d75919199f2b3858a2534b4d Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 23 Mar 2017 15:41:28 +0100 Subject: [PATCH 43/92] QmlDesigner: Provide proper form/text editor split icons Change-Id: Ic52197afb7a6bd381d95ec3a63ef2dfef8aaf5c3 Reviewed-by: Thomas Hartmann --- .../images/spliteditorhorizontally.png | Bin 0 -> 95 bytes .../images/spliteditorhorizontally@2x.png | Bin 0 -> 100 bytes .../images/spliteditorvertically.png | Bin 0 -> 95 bytes .../images/spliteditorvertically@2x.png | Bin 0 -> 100 bytes .../components/resources/resources.qrc | 4 ++ .../qmldesigner/switchsplittabwidget.cpp | 8 +++- src/tools/icons/qtcreatoricons.svg | 36 ++++++++++++++++++ 7 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally@2x.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spliteditorvertically.png create mode 100644 src/plugins/qmldesigner/components/resources/images/spliteditorvertically@2x.png diff --git a/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally.png b/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe0d46c94fbbf66c407333695ed71b179950b1f GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0y~yVBlb2U=UzrW?*0tbXjA^z`(#3;1lA?z`*eT|No^o z=ig;uU=ZFVdQ&MBb@0Pd?9 A*Z=?k literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally@2x.png b/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..660e546ae9fba265e02dcd59495725c67c69027e GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznU{GLWW?*1YbkFK%U|?Vi@Ck8cU|{(F|NqjP z^Y1b+Fi3j3IEHXUC;vHrpo3kufMMb1oj(Lzc=?1GDt0QRZz*nWWnf@n@O1TaS?83{ F1OSmx8}9%B literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/resources/images/spliteditorvertically.png b/src/plugins/qmldesigner/components/resources/images/spliteditorvertically.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e2be51447ee7fa0158e55aa9e8c0de6b41637c GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0y~yVBlb2U=UzrW?*0tbXjA^z`(#3;1lA?z`*eT|No^o z=ig;uU=ZItUZ_E~6%D}+D;OXk;vd$@? F2>^*g8>0XK literal 0 HcmV?d00001 diff --git a/src/plugins/qmldesigner/components/resources/resources.qrc b/src/plugins/qmldesigner/components/resources/resources.qrc index aeb286a4143..5b75f585a28 100644 --- a/src/plugins/qmldesigner/components/resources/resources.qrc +++ b/src/plugins/qmldesigner/components/resources/resources.qrc @@ -5,5 +5,9 @@ scrollbar.css formeditorstylesheet.css centerwidget.css + images/spliteditorhorizontally.png + images/spliteditorhorizontally@2x.png + images/spliteditorvertically.png + images/spliteditorvertically@2x.png diff --git a/src/plugins/qmldesigner/switchsplittabwidget.cpp b/src/plugins/qmldesigner/switchsplittabwidget.cpp index e2ed26eb6bc..08ad71ef12b 100644 --- a/src/plugins/qmldesigner/switchsplittabwidget.cpp +++ b/src/plugins/qmldesigner/switchsplittabwidget.cpp @@ -74,7 +74,9 @@ SwitchSplitTabWidget::SwitchSplitTabWidget(QWidget *parent) QToolButton *horizontalButton = new QToolButton; horizontalButton->setObjectName("centralTabBar"); - horizontalButton->setIcon(Utils::Icons::SPLIT_HORIZONTAL.icon()); + horizontalButton->setIcon(Utils::Icon({{QLatin1String(":/qmldesigner/images/spliteditorvertically.png"), + Utils::Theme::TextColorNormal}}, Utils::Icon::Tint).icon()); + horizontalButton->setIconSize(QSize(8, 16)); connect(horizontalButton, &QToolButton::clicked, [this] () { m_splitter->setOrientation(Qt::Vertical); updateSplitterSizes(); @@ -82,7 +84,9 @@ SwitchSplitTabWidget::SwitchSplitTabWidget(QWidget *parent) }); QToolButton *verticalButton = new QToolButton; verticalButton->setObjectName("centralTabBar"); - verticalButton->setIcon(Utils::Icons::SPLIT_VERTICAL.icon()); + verticalButton->setIcon(Utils::Icon({{QLatin1String(":/qmldesigner/images/spliteditorhorizontally.png"), + Utils::Theme::TextColorNormal}}, Utils::Icon::Tint).icon()); + verticalButton->setIconSize(QSize(8, 16)); connect(verticalButton, &QToolButton::clicked, [this] () { m_splitter->setOrientation(Qt::Horizontal); updateSplitterSizes(); diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 014d5b46d4e..c700a1906c6 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -7455,5 +7455,41 @@ d="m 636.00003,403 4.99997,0 0,-4.67861 -4.99997,0.67433 z M 642,398.18129 642,403 l 6.00003,0 0,-5.6287 z m 0,10.72061 6.00003,0.81345 0,-5.71535 L 642,404 Z M 636.00003,408.09093 641,408.7667 641,404 l -4.99997,0 z" id="path5333" /> + + + + + + + + From 535cc76cacba44871e0201973a9dfa5750ba476f Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 23 Mar 2017 14:00:09 +0100 Subject: [PATCH 44/92] Clang: Avoid dot-arrow-correction if dot is gone Change-Id: Iba23a17ba9345ed4f08e16faad02054903c04afc Reviewed-by: Tim Jenssen --- src/plugins/clangcodemodel/clangassistproposal.cpp | 5 +++-- src/plugins/clangcodemodel/clangassistproposal.h | 4 ++-- src/plugins/cpptools/cppcompletionassist.cpp | 2 +- src/plugins/texteditor/codeassist/codeassistant.cpp | 2 +- src/plugins/texteditor/codeassist/iassistproposal.cpp | 2 +- src/plugins/texteditor/codeassist/iassistproposal.h | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/plugins/clangcodemodel/clangassistproposal.cpp b/src/plugins/clangcodemodel/clangassistproposal.cpp index 19fe708bbcc..b70b56b7941 100644 --- a/src/plugins/clangcodemodel/clangassistproposal.cpp +++ b/src/plugins/clangcodemodel/clangassistproposal.cpp @@ -35,12 +35,13 @@ ClangAssistProposal::ClangAssistProposal(int cursorPos, TextEditor::GenericPropo { } -bool ClangAssistProposal::isCorrective() const +bool ClangAssistProposal::isCorrective(TextEditor::TextEditorWidget *editorWidget) const { auto clangAssistProposalModel = static_cast(model()); return clangAssistProposalModel->neededCorrection() - == ClangBackEnd::CompletionCorrection::DotToArrowCorrection; + == ClangBackEnd::CompletionCorrection::DotToArrowCorrection + && editorWidget->textAt(basePosition() - 1, 1) == "."; } void ClangAssistProposal::makeCorrection(TextEditor::TextEditorWidget *editorWidget) diff --git a/src/plugins/clangcodemodel/clangassistproposal.h b/src/plugins/clangcodemodel/clangassistproposal.h index 8fc29b8374b..70b5f15ca27 100644 --- a/src/plugins/clangcodemodel/clangassistproposal.h +++ b/src/plugins/clangcodemodel/clangassistproposal.h @@ -37,8 +37,8 @@ class ClangAssistProposal : public TextEditor::GenericProposal public: ClangAssistProposal(int cursorPos, TextEditor::GenericProposalModel *model); - virtual bool isCorrective() const; - virtual void makeCorrection(TextEditor::TextEditorWidget *editorWidget); + bool isCorrective(TextEditor::TextEditorWidget *editorWidget) const override; + void makeCorrection(TextEditor::TextEditorWidget *editorWidget) override; }; } // namespace Internal diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index 9c273190f23..6a5e70954d2 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -458,7 +458,7 @@ public: , m_replaceDotForArrow(static_cast(model)->m_replaceDotForArrow) {} - bool isCorrective() const override { return m_replaceDotForArrow; } + bool isCorrective(TextEditorWidget *) const override { return m_replaceDotForArrow; } void makeCorrection(TextEditorWidget *editorWidget) override; private: diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index 8af30428e07..023e853d990 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -304,7 +304,7 @@ void CodeAssistantPrivate::displayProposal(IAssistProposal *newProposal, AssistR clearAbortedPosition(); m_proposal.reset(proposalCandidate.take()); - if (m_proposal->isCorrective()) + if (m_proposal->isCorrective(m_editorWidget)) m_proposal->makeCorrection(m_editorWidget); m_editorWidget->keepAutoCompletionHighlight(true); diff --git a/src/plugins/texteditor/codeassist/iassistproposal.cpp b/src/plugins/texteditor/codeassist/iassistproposal.cpp index 20afa682778..7e7f200ff02 100644 --- a/src/plugins/texteditor/codeassist/iassistproposal.cpp +++ b/src/plugins/texteditor/codeassist/iassistproposal.cpp @@ -93,7 +93,7 @@ int IAssistProposal::basePosition() const is displayed. */ -bool IAssistProposal::isCorrective() const +bool IAssistProposal::isCorrective(TextEditorWidget *editorWidget) const { return false; } diff --git a/src/plugins/texteditor/codeassist/iassistproposal.h b/src/plugins/texteditor/codeassist/iassistproposal.h index f89021b5c8b..9a6332808cd 100644 --- a/src/plugins/texteditor/codeassist/iassistproposal.h +++ b/src/plugins/texteditor/codeassist/iassistproposal.h @@ -41,7 +41,7 @@ public: int basePosition() const; virtual bool isFragile() const = 0; - virtual bool isCorrective() const; + virtual bool isCorrective(TextEditorWidget *editorWidget) const; virtual void makeCorrection(TextEditorWidget *editorWidget); virtual IAssistProposalModel *model() const = 0; virtual IAssistProposalWidget *createWidget() const = 0; From d5f242f3d6c9edf0218ec8ff922f29585ffb7b4b Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 23 Mar 2017 17:17:58 +0100 Subject: [PATCH 45/92] Qmake: Do not warn when a compiler misses an .exe on windows Task-number: QTCREATORBUG-17489 Change-Id: I8fbbf48b41b84adf8905d81ae21ded4ed2fd541d Reviewed-by: Tim Jenssen --- src/libs/utils/environment.cpp | 13 +++++++++++++ src/libs/utils/environment.h | 2 ++ src/plugins/qmakeprojectmanager/qmakeproject.cpp | 11 ++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index 7bc0c09500c..8808a570ada 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -268,6 +268,19 @@ QStringList Environment::appendExeExtensions(const QString &executable) const return execs; } +bool Environment::isSameExecutable(const QString &exe1, const QString &exe2) const +{ + const QStringList exe1List = appendExeExtensions(exe1); + const QStringList exe2List = appendExeExtensions(exe2); + for (const QString &i1 : exe1List) { + for (const QString &i2 : exe2List) { + if (Utils::FileName::fromString(i1) == Utils::FileName::fromString(i2)) + return true; + } + } + return false; +} + FileName Environment::searchInPath(const QString &executable, const QStringList &additionalDirs, bool (*func)(const QString &name)) const diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index a04cbe92849..95abaa29996 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -106,6 +106,8 @@ public: QStringList path() const; QStringList appendExeExtensions(const QString &executable) const; + bool isSameExecutable(const QString &exe1, const QString &exe2) const; + QString expandVariables(const QString &input) const; QStringList expandVariables(const QStringList &input) const; diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index ffdcee6f2ad..a3c504e17f8 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -1346,7 +1346,16 @@ void QmakeProject::testToolChain(ToolChain *tc, const Utils::FileName &path) con return; const Utils::FileName expected = tc->compilerCommand(); - if (expected != path) { + + Environment env = Environment::systemEnvironment(); + if (Target *t = activeTarget()) { + if (BuildConfiguration *bc = t->activeBuildConfiguration()) + env = bc->environment(); + else + t->kit()->addToEnvironment(env); + } + + if (env.isSameExecutable(path.toString(), expected.toString())) { const QPair pair = qMakePair(expected, path); if (!m_toolChainWarnings.contains(pair)) { TaskHub::addTask(Task(Task::Warning, From 7d39f94f3d128051bb924d8135a392a30d4e0035 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 24 Mar 2017 11:05:22 +0100 Subject: [PATCH 46/92] Clang: Avoid warnings about unknown pragmas Task-number: QTCREATORBUG-17460 Change-Id: Ic57f59f87b58c44ac738fb87039b4844d82bc924 Reviewed-by: Tim Jenssen --- .../cpptools/clangdiagnosticconfigsmodel.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp index 4ecdda76f5f..859d88a879a 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp @@ -33,6 +33,11 @@ namespace CppTools { +static QStringList commonOptions() +{ + return { QStringLiteral("-Wno-unknown-pragmas") }; +} + static void addConfigForQuestionableConstructs(ClangDiagnosticConfigsModel &model) { ClangDiagnosticConfig config; @@ -40,10 +45,10 @@ static void addConfigForQuestionableConstructs(ClangDiagnosticConfigsModel &mode config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", "Warnings for questionable constructs")); config.setIsReadOnly(true); - config.setCommandLineOptions({ + config.setCommandLineOptions(QStringList{ QStringLiteral("-Wall"), QStringLiteral("-Wextra"), - }); + } + commonOptions()); model.appendOrUpdate(config); } @@ -55,7 +60,7 @@ static void addConfigForPedanticWarnings(ClangDiagnosticConfigsModel &model) config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", "Pedantic Warnings")); config.setIsReadOnly(true); - config.setCommandLineOptions({QStringLiteral("-Wpedantic")}); + config.setCommandLineOptions(QStringList{QStringLiteral("-Wpedantic")} + commonOptions()); model.appendOrUpdate(config); } @@ -67,7 +72,7 @@ static void addConfigForAlmostEveryWarning(ClangDiagnosticConfigsModel &model) config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", "Warnings for almost everything")); config.setIsReadOnly(true); - config.setCommandLineOptions({ + config.setCommandLineOptions(QStringList{ QStringLiteral("-Weverything"), QStringLiteral("-Wno-c++98-compat"), QStringLiteral("-Wno-c++98-compat-pedantic"), @@ -79,7 +84,7 @@ static void addConfigForAlmostEveryWarning(ClangDiagnosticConfigsModel &model) QStringLiteral("-Wno-documentation"), QStringLiteral("-Wno-shadow"), QStringLiteral("-Wno-missing-prototypes"), // Not optimal for C projects. - }); + } + commonOptions()); model.appendOrUpdate(config); } From dca76c9889d8bba49273ba9925cd5d2e9b32d9de Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 23 Mar 2017 12:43:02 +0100 Subject: [PATCH 47/92] Clang: Leave space between category and option in diagnostic display For some diagnostics ("#include_next is a language extension"), the text has a smaller width than the category and option together. In this case, there is no space between category and option, which looks terse. Change-Id: I27e4736a0d2aa527d5733c6115bc8d40fe7794e0 Reviewed-by: Tim Jenssen --- src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp index 265069ec7f7..f3004a55b5c 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp @@ -173,7 +173,7 @@ private: const QString text = QString::fromLatin1( " " " %1" - " %2" + "  %2" " ") .arg(diagnostic.category(), diagnostic.enableOption()); From 1074d974324c9461d6b019ac387681019d6915dd Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 23 Mar 2017 12:23:22 +0100 Subject: [PATCH 48/92] Clang: Avoid fragmentation in diagnostic display A "diagnostic row" is displayed in two columns with the help of table, one cell being the location, the other cell the diagnostic text. At times, the location is wrapped too, which makes the whole diagnostic display look fragmented/broken. It looks like there is no way to avoid the wrapping of the location column because Qt's CSS does not support the needed style='white-space:nowrap' Avoid the columns for a consistent display at all times. Change-Id: I35e4a1c831f18e2bce6a4c9ed891fcae439d1a1b Reviewed-by: Tim Jenssen --- .../clangcodemodel/clangdiagnostictooltipwidget.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp index f3004a55b5c..42c77883bfc 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp @@ -185,15 +185,7 @@ private: const bool hasFixit = m_displayHints.enableClickableFixits && !diagnostic.fixIts().isEmpty(); const QString diagnosticText = diagnostic.text().toString().toHtmlEscaped(); - - // For debugging, add to : style='border-width:1px;border-color:red' - const QString text = QString::fromLatin1( - "
" - " " - " " - " " - " " - "
%1: %2
") + const QString text = QString::fromLatin1("%1: %2") .arg(clickableLocation(diagnostic, m_mainFilePath), clickableFixIt(diagnostic, diagnosticText, hasFixit)); From 3492da12468f10a5ec83a102b7aba9043b46f4dc Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 24 Mar 2017 09:33:32 +0100 Subject: [PATCH 49/92] ResourceEditor: Prevent possible nullptr access Change-Id: Iad958d26272f471530a8494bee0e326ce9835aa9 Reviewed-by: Tim Jenssen --- src/plugins/resourceeditor/resourceeditorplugin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/resourceeditor/resourceeditorplugin.cpp b/src/plugins/resourceeditor/resourceeditorplugin.cpp index 0ef8e5cb508..474092d350d 100644 --- a/src/plugins/resourceeditor/resourceeditorplugin.cpp +++ b/src/plugins/resourceeditor/resourceeditorplugin.cpp @@ -220,6 +220,7 @@ void ResourceEditorPlugin::extensionsInitialized() for (FileNode *file : toReplace) { FolderNode *const pn = file->parentFolderNode(); + QTC_ASSERT(pn, continue); const Utils::FileName path = file->filePath(); pn->replaceSubtree(file, new ResourceTopLevelNode(path, QString(), pn)); } From b021660c1e6e00f5034439b6eaa143742c4d4007 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 24 Mar 2017 11:06:26 +0100 Subject: [PATCH 50/92] ProjectExplorer: Treat empty root project nodes better Do not set up empty root project nodes and fall back to the default project tree instead. A project can not ever be empty: It should at least include the project file itself so that the user can fix breakages when project parsing fails. Change-Id: I692e299f56727305120777cdc532607d5b0be99e Reviewed-by: Tim Jenssen --- src/plugins/projectexplorer/project.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index e8b68a4560e..6b092b676a1 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -461,6 +461,14 @@ void Project::setRootProjectNode(ProjectNode *root) if (d->m_rootProjectNode == root) return; + if (root && root->nodes().isEmpty()) { + // Something went wrong with parsing: At least the project file needs to be + // shown so that the user can fix the breakage. + // Do not leak root and use default project tree in this case. + delete root; + root = nullptr; + } + ProjectTree::applyTreeManager(root); ProjectNode *oldNode = d->m_rootProjectNode; From 975c283ec75867070b600e0be4f649462e2e5d61 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 23 Mar 2017 12:18:53 +0100 Subject: [PATCH 51/92] QmlDesigner: Use the same usage pattern for sidebars as edit mode Change-Id: Ia1ec631b8b486e98e957b5dbcccbc7b91baecb0f Reviewed-by: Tim Jenssen --- src/plugins/qmldesigner/designmodewidget.cpp | 15 -------------- src/plugins/qmldesigner/designmodewidget.h | 1 - src/plugins/qmldesigner/shortcutmanager.cpp | 21 ++------------------ src/plugins/qmldesigner/shortcutmanager.h | 2 -- 4 files changed, 2 insertions(+), 37 deletions(-) diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 09f1d51cdd6..3bebbc0b8ff 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -169,21 +169,6 @@ void DesignModeWidget::toggleRightSidebar() m_rightSideBar->setVisible(!m_rightSideBar->isVisible()); } -void DesignModeWidget::toggleSidebars() -{ - if (m_initStatus == Initializing) - return; - - m_showSidebars = !m_showSidebars; - - if (m_leftSideBar) - m_leftSideBar->setVisible(m_showSidebars); - if (m_rightSideBar) - m_rightSideBar->setVisible(m_showSidebars); - if (m_bottomSideBar) - m_bottomSideBar->setVisible(m_showSidebars); -} - void DesignModeWidget::readSettings() { QSettings *settings = Core::ICore::settings(); diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h index b6dbce5fb84..fd37ad48c8c 100644 --- a/src/plugins/qmldesigner/designmodewidget.h +++ b/src/plugins/qmldesigner/designmodewidget.h @@ -85,7 +85,6 @@ public: void showInternalTextEditor(); void restoreDefaultView(); - void toggleSidebars(); void toggleLeftSidebar(); void toggleRightSidebar(); diff --git a/src/plugins/qmldesigner/shortcutmanager.cpp b/src/plugins/qmldesigner/shortcutmanager.cpp index 3a68952530b..0e1889d0582 100644 --- a/src/plugins/qmldesigner/shortcutmanager.cpp +++ b/src/plugins/qmldesigner/shortcutmanager.cpp @@ -82,7 +82,6 @@ ShortCutManager::ShortCutManager() m_copyAction(tr("&Copy"), tr("Copy \"%1\""), Utils::ParameterAction::EnabledWithParameter), m_pasteAction(tr("&Paste"), tr("Paste \"%1\""), Utils::ParameterAction::EnabledWithParameter), m_selectAllAction(tr("Select &All"), tr("Select All \"%1\""), Utils::ParameterAction::EnabledWithParameter), - m_hideSidebarsAction(tr("Toggle Sidebars"), 0), m_collapseExpandStatesAction(tr("Toggle States Editor"), 0), m_restoreDefaultViewAction(tr("&Restore Default View"), 0), m_toggleLeftSidebarAction(tr("Toggle &Left Sidebar"), 0), @@ -115,8 +114,6 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex connect(&m_selectAllAction,&QAction::triggered, this, &ShortCutManager::selectAll); - connect(&m_hideSidebarsAction, &QAction::triggered, this, &ShortCutManager::toggleSidebars); - connect(&m_restoreDefaultViewAction, &QAction::triggered, QmlDesignerPlugin::instance()->mainWidget(), @@ -233,15 +230,8 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex Core::ActionContainer *viewsMenu = Core::ActionManager::actionContainer(Core::Constants::M_WINDOW_VIEWS); - command = Core::ActionManager::registerAction(&m_toggleLeftSidebarAction, Constants::TOGGLE_LEFT_SIDEBAR, qmlDesignerMainContext); - command->setAttribute(Core::Command::CA_Hide); - command->setDefaultKeySequence(QKeySequence("Ctrl+Shift+0")); - viewsMenu->addAction(command); - - command = Core::ActionManager::registerAction(&m_toggleRightSidebarAction, Constants::TOGGLE_RIGHT_SIDEBAR, qmlDesignerMainContext); - command->setAttribute(Core::Command::CA_Hide); - command->setDefaultKeySequence(QKeySequence("Ctrl+Alt+Shift+0")); - viewsMenu->addAction(command); + Core::ActionManager::registerAction(&m_toggleLeftSidebarAction, Core::Constants::TOGGLE_LEFT_SIDEBAR, qmlDesignerMainContext); + Core::ActionManager::registerAction(&m_toggleRightSidebarAction, Core::Constants::TOGGLE_RIGHT_SIDEBAR, qmlDesignerMainContext); command = Core::ActionManager::registerAction(&m_collapseExpandStatesAction, Constants::TOGGLE_STATES_EDITOR, qmlDesignerMainContext); command->setAttribute(Core::Command::CA_Hide); @@ -260,8 +250,6 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex command->setDefaultKeySequence(QKeySequence(Qt::Key_Escape)); m_escapeAction.setEnabled(false); - Core::ActionManager::registerAction(&m_hideSidebarsAction, Core::Constants::TOGGLE_LEFT_SIDEBAR, qmlDesignerMainContext); - connect(designerActionManager.view(), &DesignerActionManagerView::selectionChanged, this, [this](bool itemsSelected, bool rootItemIsSelected) { m_deleteAction.setEnabled(itemsSelected && !rootItemIsSelected); m_cutAction.setEnabled(itemsSelected && !rootItemIsSelected); @@ -353,11 +341,6 @@ void ShortCutManager::selectAll() currentDesignDocument()->selectAll(); } -void ShortCutManager::toggleSidebars() -{ - QmlDesignerPlugin::instance()->mainWidget()->toggleSidebars(); -} - void ShortCutManager::toggleLeftSidebar() { QmlDesignerPlugin::instance()->mainWidget()->toggleLeftSidebar(); diff --git a/src/plugins/qmldesigner/shortcutmanager.h b/src/plugins/qmldesigner/shortcutmanager.h index bf273e853e3..c5fbe89feff 100644 --- a/src/plugins/qmldesigner/shortcutmanager.h +++ b/src/plugins/qmldesigner/shortcutmanager.h @@ -64,7 +64,6 @@ private: void copySelected(); void paste(); void selectAll(); - void toggleSidebars(); void toggleLeftSidebar(); void toggleRightSidebar(); void undoAvailable(bool isAvailable); @@ -86,7 +85,6 @@ private: Utils::ParameterAction m_copyAction; Utils::ParameterAction m_pasteAction; Utils::ParameterAction m_selectAllAction; - QAction m_hideSidebarsAction; QAction m_collapseExpandStatesAction; QAction m_restoreDefaultViewAction; QAction m_toggleLeftSidebarAction; From 2df18ec34f13ffb84fcb5918e834c9571fd99ce2 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 24 Mar 2017 10:44:33 +0100 Subject: [PATCH 52/92] QmlDesigner: Fix drag and drop The release mouse event does not come through if we start a drag. There was already a workaround that stopped working with 5.8 and did rely on private API. I removed all usage of private API and added a simple workaround that synthesises a mouse release event. The actual execution of the drag is now asynchronous to ensure the release event is delivered properly. I removed all dependencies on private API in the designer. In Qt 5.9 the issue seems to be fixed in Qt. The workaround does not seem to get in the way of the fix. Eventually, the workaround can be removed. Change-Id: I9b45b255da5e44c26aba2acf4a42f88537126f75 Reviewed-by: Tim Jenssen --- .../itemLibraryQmlSources/ItemDelegate.qml | 6 +---- .../itemlibrary/itemlibrarywidget.cpp | 23 ++++++++----------- .../itemlibrary/itemlibrarywidget.h | 2 +- src/plugins/qmldesigner/qmldesignerplugin.pro | 1 - 4 files changed, 11 insertions(+), 21 deletions(-) diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml index 32c2f5a0c8f..09f4f6c8fe4 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml @@ -73,12 +73,8 @@ Item { id: mouseRegion anchors.fill: parent - property bool reallyPressed: false - property int pressedX - property int pressedY - onPressed: { - rootView.startDragAndDrop(itemLibraryEntry) + rootView.startDragAndDrop(mouseRegion, itemLibraryEntry) } } } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 5b2dc1034c1..e9d1ab13ba7 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -55,10 +56,6 @@ #include #include -#include // mouse ungrabbing workaround on quickitems -#include // mouse ungrabbing workaround on quickitems - - namespace QmlDesigner { ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : @@ -265,14 +262,7 @@ void ItemLibraryWidget::setResourcePath(const QString &resourcePath) updateSearch(); } -static void ungrabMouseOnQMLWorldWorkAround(QQuickWidget *quickWidget) -{ - const QQuickWidgetPrivate *widgetPrivate = QQuickWidgetPrivate::get(quickWidget); - if (widgetPrivate && widgetPrivate->offscreenWindow && widgetPrivate->offscreenWindow->mouseGrabberItem()) - widgetPrivate->offscreenWindow->mouseGrabberItem()->ungrabMouse(); -} - -void ItemLibraryWidget::startDragAndDrop(QVariant itemLibraryId) +void ItemLibraryWidget::startDragAndDrop(QQuickItem *mouseArea, QVariant itemLibraryId) { m_currentitemLibraryEntry = itemLibraryId.value(); @@ -283,9 +273,14 @@ void ItemLibraryWidget::startDragAndDrop(QVariant itemLibraryId) m_currentitemLibraryEntry.libraryEntryIconPath())); drag->setMimeData(mimeData); - drag->exec(); + /* Workaround for bug in Qt. The release event is not delivered for Qt < 5.9 if a drag is started */ + QMouseEvent event (QEvent::MouseButtonRelease, QPoint(-1, -1), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QApplication::sendEvent(mouseArea, &event); - ungrabMouseOnQMLWorldWorkAround(m_itemViewQuickWidget.data()); + QTimer::singleShot(0, [drag]() { + drag->exec(); + drag->deleteLater(); + }); } void ItemLibraryWidget::removeImport(const QString &name) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h index 946dfc9b7d0..a831b4c5fd1 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h @@ -84,7 +84,7 @@ public: void setModel(Model *model); - Q_INVOKABLE void startDragAndDrop(QVariant itemLibId); + Q_INVOKABLE void startDragAndDrop(QQuickItem *mouseArea, QVariant itemLibId); protected: void removeImport(const QString &name); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pro b/src/plugins/qmldesigner/qmldesignerplugin.pro index 460a77a96ef..a5261e0931a 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.pro +++ b/src/plugins/qmldesigner/qmldesignerplugin.pro @@ -1,5 +1,4 @@ QT += quickwidgets -QT += widgets-private quick-private quickwidgets-private core-private gui-private #mouse ungrabbing workaround on quickitems CONFIG += exceptions INCLUDEPATH += $$PWD From a63998f55b28575818faabd1a16d0c40b0433c23 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 24 Mar 2017 11:52:45 +0100 Subject: [PATCH 53/92] ProjectExplorer: Avoid some needless intermediate lists ... when creating folder nodes in the flat model. Change-Id: I28f95589d774fc83e1a30c8328707bd1db6be03e Reviewed-by: Tobias Hunger (cherry picked from commit 1a416d3f982d1fc574c578fdd6bafce51714f8a3) Reviewed-by: Eike Ziller --- src/plugins/projectexplorer/projectmodels.cpp | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index b8e925230f8..4f4e69f180a 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -264,23 +264,25 @@ void FlatModel::saveExpandData() void FlatModel::addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet *seen) { - const QList subFolderNodes = folderNode->folderNodes(); - for (FolderNode *subFolderNode : subFolderNodes) { - if (!filter(subFolderNode) && !seen->contains(subFolderNode)) { - seen->insert(subFolderNode); - auto node = new WrapperNode(subFolderNode); - parent->appendChild(node); - addFolderNode(node, subFolderNode, seen); - node->sortChildren(&sortWrapperNodes); - } else { - addFolderNode(parent, subFolderNode, seen); + for (Node *node : folderNode->nodes()) { + if (FolderNode *subFolderNode = node->asFolderNode()) { + if (!filter(subFolderNode) && !seen->contains(subFolderNode)) { + seen->insert(subFolderNode); + auto node = new WrapperNode(subFolderNode); + parent->appendChild(node); + addFolderNode(node, subFolderNode, seen); + node->sortChildren(&sortWrapperNodes); + } else { + addFolderNode(parent, subFolderNode, seen); + } } } - const QList fileNodes = folderNode->fileNodes(); - for (FileNode *fileNode : fileNodes) { - if (!filter(fileNode) && !seen->contains(fileNode)) { - seen->insert(fileNode); - parent->appendChild(new WrapperNode(fileNode)); + for (Node *node : folderNode->nodes()) { + if (FileNode *fileNode = node->asFileNode()) { + if (!filter(fileNode) && !seen->contains(fileNode)) { + seen->insert(fileNode); + parent->appendChild(new WrapperNode(fileNode)); + } } } } From 9c18e718a795200557e8cb9c17c23a5ac4a3d28c Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 24 Mar 2017 12:58:16 +0100 Subject: [PATCH 54/92] ProjectExplorer: Merge the two loops in FlatModel::addFolderNode And inline the filtering to avoid the duplicated type check and save a few cycles. Change-Id: I0dae5e51b05b0a4e581359e7ad7d3b9d4f684141 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/projectmodels.cpp | 24 ++++--------------- src/plugins/projectexplorer/projectmodels.h | 2 -- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index 4f4e69f180a..a8139f686ae 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -266,7 +266,8 @@ void FlatModel::addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet< { for (Node *node : folderNode->nodes()) { if (FolderNode *subFolderNode = node->asFolderNode()) { - if (!filter(subFolderNode) && !seen->contains(subFolderNode)) { + const bool isHidden = m_filterProjects && !subFolderNode->showInSimpleTree(); + if (!isHidden && !seen->contains(subFolderNode)) { seen->insert(subFolderNode); auto node = new WrapperNode(subFolderNode); parent->appendChild(node); @@ -275,11 +276,9 @@ void FlatModel::addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet< } else { addFolderNode(parent, subFolderNode, seen); } - } - } - for (Node *node : folderNode->nodes()) { - if (FileNode *fileNode = node->asFileNode()) { - if (!filter(fileNode) && !seen->contains(fileNode)) { + } else if (FileNode *fileNode = node->asFileNode()) { + const bool isHidden = m_filterProjects && fileNode->isGenerated(); + if (!isHidden && !seen->contains(fileNode)) { seen->insert(fileNode); parent->appendChild(new WrapperNode(fileNode)); } @@ -353,19 +352,6 @@ Node *FlatModel::nodeForIndex(const QModelIndex &index) const return flatNode ? flatNode->m_node : nullptr; } -bool FlatModel::filter(Node *node) const -{ - bool isHidden = false; - if (FolderNode *folderNode = node->asFolderNode()) { - if (m_filterProjects) - isHidden = !folderNode->showInSimpleTree(); - } else if (FileNode *fileNode = node->asFileNode()) { - if (m_filterGeneratedFiles) - isHidden = fileNode->isGenerated(); - } - return isHidden; -} - const QLoggingCategory &FlatModel::logger() { static QLoggingCategory logger("qtc.projectexplorer.flatmodel"); diff --git a/src/plugins/projectexplorer/projectmodels.h b/src/plugins/projectexplorer/projectmodels.h index 8d177c8b0c7..b59e08e04fa 100644 --- a/src/plugins/projectexplorer/projectmodels.h +++ b/src/plugins/projectexplorer/projectmodels.h @@ -85,8 +85,6 @@ signals: void requestExpansion(const QModelIndex &index); private: - bool filter(Node *node) const; // Returns true if node is hidden. - bool m_filterProjects = false; bool m_filterGeneratedFiles = true; From 5ac136204ecfad6a93a887af29534698f7f029c7 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 24 Mar 2017 13:39:18 +0100 Subject: [PATCH 55/92] ProjectExplorer: Don't update flat model on projectAdd We get called back soon enough when projects are parsed. Also, mark the container node for initial expansion not the project's root which typically does not exist yet. Change-Id: I49100f83f8c57d5ef80d0f6f369330b646707260 Reviewed-by: Tim Jenssen Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/projectmodels.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index a8139f686ae..2b330de4b72 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -240,12 +240,6 @@ void FlatModel::handleProjectAdded(Project *project) { Node *node = project->containerNode(); m_toExpand.insert(expandDataForNode(node)); - if (WrapperNode *wrapper = wrapperForNode(node)) { - wrapper->forFirstLevelChildren([this](WrapperNode *child) { - m_toExpand.insert(expandDataForNode(child->m_node)); - }); - } - update(); } void FlatModel::loadExpandData() From 551efd91990e07902e5324f720cf5585865c323d Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Fri, 24 Mar 2017 10:50:51 +0100 Subject: [PATCH 56/92] QmlProfiler: Use QList for QmlRange container when loading .qtd As we are using this as a queue, with many calls to takeFirst(), a QVector is prohibitively expensive here. Change-Id: I151452ae1299ab520a3aceae7ff3da0e29fe9bf9 Reviewed-by: hjk --- src/plugins/qmlprofiler/qmlprofilertracefile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp index a821b43eb0b..b84de415ae7 100644 --- a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp @@ -430,7 +430,7 @@ private: QmlEvent end; }; - QVector ranges; + QList ranges; // We are going to do a lot of takeFirst() on this. }; void EventList::addEvent(const QmlEvent &event) From 7da34ce33a37813f9e15644bae3835edd2250fa7 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 21 Mar 2017 09:47:55 +0100 Subject: [PATCH 57/92] Welcome: Reimplement session and project shortcuts Got disabled in 16944277d2aa2cdab194ec05de6c8e2d5ee814cd during refactoring. Delegates and models are not the right places for registering commands, since there can be multiple instances. Do registration in project welcome page, and let delegates retrieve shortcut string from the models. Task-number: QTCREATORBUG-17881 Change-Id: I06e3c29e57ee893865bf108a2f13bdb385c26d70 Reviewed-by: hjk --- .../projectexplorer/projectwelcomepage.cpp | 90 ++++++++++--------- .../projectexplorer/projectwelcomepage.h | 7 +- src/plugins/projectexplorer/sessionmodel.cpp | 10 +++ src/plugins/projectexplorer/sessionmodel.h | 11 ++- 4 files changed, 71 insertions(+), 47 deletions(-) diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index 02687d1fe50..8a8446acfcc 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -56,6 +56,7 @@ using namespace Core; using namespace Utils; const int LINK_HEIGHT = 35; +const char PROJECT_BASE_ID[] = "Welcome.OpenRecentProject"; namespace ProjectExplorer { namespace Internal { @@ -84,6 +85,12 @@ QVariant ProjectModel::data(const QModelIndex &index, int role) const return data.first; case PrettyFilePathRole: return Utils::withTildeHomePath(data.first); + case ShortcutRole: { + const Id projectBase = PROJECT_BASE_ID; + if (Command *cmd = ActionManager::command(projectBase.withSuffix(index.row() + 1))) + return cmd->keySequence().toString(QKeySequence::NativeText); + return QVariant(); + } default: return QVariant(); } @@ -108,6 +115,26 @@ void ProjectModel::resetProjects() /////////////////// +ProjectWelcomePage::ProjectWelcomePage() +{ + const int actionsCount = 9; + Context welcomeContext(Core::Constants::C_WELCOME_MODE); + + const Id projectBase = PROJECT_BASE_ID; + const Id sessionBase = SESSION_BASE_ID; + for (int i = 1; i <= actionsCount; ++i) { + auto act = new QAction(tr("Open Session #%1").arg(i), this); + Command *cmd = ActionManager::registerAction(act, sessionBase.withSuffix(i), welcomeContext); + cmd->setDefaultKeySequence(QKeySequence((UseMacShortcuts ? tr("Ctrl+Meta+%1") : tr("Ctrl+Alt+%1")).arg(i))); + connect(act, &QAction::triggered, this, [this, i] { openSessionAt(i - 1); }); + + act = new QAction(tr("Open Recent Project #%1").arg(i), this); + cmd = ActionManager::registerAction(act, projectBase.withSuffix(i), welcomeContext); + cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+%1").arg(i))); + connect(act, &QAction::triggered, this, [this, i] { openProjectAt(i - 1); }); + } +} + Core::Id ProjectWelcomePage::id() const { return "Develop"; @@ -128,7 +155,21 @@ void ProjectWelcomePage::newProject() void ProjectWelcomePage::openProject() { - ProjectExplorerPlugin::openOpenProjectDialog(); + ProjectExplorerPlugin::openOpenProjectDialog(); +} + +void ProjectWelcomePage::openSessionAt(int index) +{ + QTC_ASSERT(m_sessionModel, return); + m_sessionModel->switchToSession(m_sessionModel->sessionAt(index)); +} + +void ProjectWelcomePage::openProjectAt(int index) +{ + QTC_ASSERT(m_projectModel, return); + const QString projectFile = m_projectModel->data(m_projectModel->index(index, 0), + ProjectModel::FilePathRole).toString(); + ProjectExplorerPlugin::openProjectWelcomePage(projectFile); } /////////////////// @@ -160,6 +201,7 @@ protected: { return itemRect; } + virtual int shortcutRole() const = 0; bool helpEvent(QHelpEvent *ev, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &idx) final @@ -169,9 +211,7 @@ protected: return false; } - QString shortcut; - if (idx.row() < m_shortcuts.size()) - shortcut = m_shortcuts.at(idx.row()); + QString shortcut = idx.data(shortcutRole()).toString(); QString name = idx.data(Qt::DisplayRole).toString(); QString tooltipText; @@ -187,8 +227,6 @@ protected: QToolTip::showText(ev->globalPos(), tooltipText, view); return true; } - - QStringList m_shortcuts; }; class SessionDelegate : public BaseDelegate @@ -202,27 +240,9 @@ protected: const bool expanded = m_expandedSessions.contains(idx.data(Qt::DisplayRole).toString()); return expanded ? itemRect.adjusted(0, 0, 0, -LINK_HEIGHT) : itemRect; } + int shortcutRole() const override { return SessionModel::ShortcutRole; } public: - SessionDelegate() { - const int actionsCount = 9; - Context welcomeContext(Core::Constants::C_WELCOME_MODE); - - const Id sessionBase = "Welcome.OpenSession"; - for (int i = 1; i <= actionsCount; ++i) { - auto act = new QAction(tr("Open Session #%1").arg(i), this); - Command *cmd = ActionManager::registerAction(act, sessionBase.withSuffix(i), welcomeContext); - cmd->setDefaultKeySequence(QKeySequence((UseMacShortcuts ? tr("Ctrl+Meta+%1") : tr("Ctrl+Alt+%1")).arg(i))); - m_shortcuts.append(cmd->keySequence().toString(QKeySequence::NativeText)); - -// connect(act, &QAction::triggered, this, [this, i] { openSessionTriggered(i-1); }); - connect(cmd, &Command::keySequenceChanged, this, [this, i, cmd] { - m_shortcuts[i-1] = cmd->keySequence().toString(QKeySequence::NativeText); -// emit sessionsShortcutsChanged(m_sessionShortcuts); - }); - } - } - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &idx) const final { static const QPixmap sessionIcon = pixmap("session", Theme::Welcome_ForegroundSecondaryColor); @@ -393,27 +413,9 @@ private: class ProjectDelegate : public BaseDelegate { QString entryType() override { return tr("project", "Appears in \"Open project \""); } + int shortcutRole() const override { return ProjectModel::ShortcutRole; } public: - ProjectDelegate() - { - const int actionsCount = 9; - Context welcomeContext(Core::Constants::C_WELCOME_MODE); - - const Id projectBase = "Welcome.OpenRecentProject"; - for (int i = 1; i <= actionsCount; ++i) { - auto act = new QAction(tr("Open Recent Project #%1").arg(i), this); - Command *cmd = ActionManager::registerAction(act, projectBase.withSuffix(i), welcomeContext); - cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+%1").arg(i))); - m_shortcuts.append(cmd->keySequence().toString(QKeySequence::NativeText)); - -// connect(act, &QAction::triggered, this, [this, i] { openRecentProjectTriggered(i-1); }); - connect(cmd, &Command::keySequenceChanged, this, [this, i, cmd] { - m_shortcuts[i - 1] = cmd->keySequence().toString(QKeySequence::NativeText); - }); - } - } - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &idx) const final { QRect rc = option.rect; diff --git a/src/plugins/projectexplorer/projectwelcomepage.h b/src/plugins/projectexplorer/projectwelcomepage.h index 805bac2054f..68f2ca3a0a8 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.h +++ b/src/plugins/projectexplorer/projectwelcomepage.h @@ -40,7 +40,7 @@ class ProjectModel : public QAbstractListModel Q_OBJECT public: - enum { FilePathRole = Qt::UserRole+1, PrettyFilePathRole }; + enum { FilePathRole = Qt::UserRole+1, PrettyFilePathRole, ShortcutRole }; ProjectModel(QObject *parent = nullptr); int rowCount(const QModelIndex &parent) const override; @@ -55,7 +55,7 @@ class ProjectWelcomePage : public Core::IWelcomePage { Q_OBJECT public: - ProjectWelcomePage() = default; + ProjectWelcomePage(); QString title() const override { return tr("Projects"); } int priority() const override { return 20; } @@ -73,6 +73,9 @@ signals: void manageSessions(); private: + void openSessionAt(int index); + void openProjectAt(int index); + friend class SessionsPage; SessionModel *m_sessionModel = nullptr; ProjectModel *m_projectModel = nullptr; diff --git a/src/plugins/projectexplorer/sessionmodel.cpp b/src/plugins/projectexplorer/sessionmodel.cpp index 0d5456e86d4..1f42b8cc00d 100644 --- a/src/plugins/projectexplorer/sessionmodel.cpp +++ b/src/plugins/projectexplorer/sessionmodel.cpp @@ -28,6 +28,9 @@ #include "sessiondialog.h" +#include +#include + #include #include #include @@ -35,6 +38,8 @@ #include #include +using namespace Core; + namespace ProjectExplorer { namespace Internal { @@ -146,6 +151,11 @@ QVariant SessionModel::data(const QModelIndex &index, int role) const case ProjectsDisplayRole: result = pathsToBaseNames(SessionManager::projectsForSessionName(sessionName)); break; + case ShortcutRole: { + const Id sessionBase = SESSION_BASE_ID; + if (Command *cmd = ActionManager::command(sessionBase.withSuffix(index.row() + 1))) + result = cmd->keySequence().toString(QKeySequence::NativeText); + } break; } // switch (role) } diff --git a/src/plugins/projectexplorer/sessionmodel.h b/src/plugins/projectexplorer/sessionmodel.h index 66a75242d43..2b1bacfda5d 100644 --- a/src/plugins/projectexplorer/sessionmodel.h +++ b/src/plugins/projectexplorer/sessionmodel.h @@ -32,12 +32,21 @@ namespace ProjectExplorer { namespace Internal { +const char SESSION_BASE_ID[] = "Welcome.OpenSession"; + class SessionModel : public QAbstractTableModel { Q_OBJECT public: - enum { DefaultSessionRole = Qt::UserRole+1, LastSessionRole, ActiveSessionRole, ProjectsPathRole, ProjectsDisplayRole }; + enum { + DefaultSessionRole = Qt::UserRole+1, + LastSessionRole, + ActiveSessionRole, + ProjectsPathRole, + ProjectsDisplayRole, + ShortcutRole + }; explicit SessionModel(QObject *parent = nullptr); From 5f28650c2347d22d78a4a7f88aa1bf2c094ada21 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 24 Mar 2017 15:48:10 +0100 Subject: [PATCH 58/92] QmlDesigner: Remove private Qt dependencies from qbs We have no private Qt dependencies anymore. Change-Id: I7f6b33b593e9493920c59945cf451c1c66f0a46d Reviewed-by: hjk --- src/plugins/qmldesigner/qmldesignerplugin.qbs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 8078a1de9e0..d85d0c4594a 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -12,8 +12,7 @@ Project { Depends { name: "Qt"; submodules: [ - "core-private", "gui-private", "quick-private", "quickwidgets", "quickwidgets-private", - "widgets", "widgets-private" + "quickwidgets" ] } Depends { name: "Core" } From 3729500740a0e5db3f5c036b20562b36e9db639f Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Fri, 24 Mar 2017 15:07:49 +0100 Subject: [PATCH 59/92] WelcomeMode: Remove screenDependHeightDistance() That function always returns 16. Change-Id: I65cb0c62c5e553791f25e964de9eaf23a0f65687 Reviewed-by: hjk Reviewed-by: Eike Ziller --- src/plugins/coreplugin/iwelcomepage.cpp | 5 ----- src/plugins/coreplugin/iwelcomepage.h | 2 -- src/plugins/projectexplorer/projectwelcomepage.cpp | 12 +++++------- src/plugins/welcome/welcomeplugin.cpp | 6 ++---- 4 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/plugins/coreplugin/iwelcomepage.cpp b/src/plugins/coreplugin/iwelcomepage.cpp index 8296d6c8f5d..a99a309ea76 100644 --- a/src/plugins/coreplugin/iwelcomepage.cpp +++ b/src/plugins/coreplugin/iwelcomepage.cpp @@ -49,11 +49,6 @@ IWelcomePage::~IWelcomePage() { } -int IWelcomePage::screenDependHeightDistance() -{ - return std::min(50, std::max(16, ICore::mainWindow()->height() / 30)); -} - static QPalette buttonPalette(bool isActive, bool isCursorInside, bool forText) { QPalette pal; diff --git a/src/plugins/coreplugin/iwelcomepage.h b/src/plugins/coreplugin/iwelcomepage.h index ae59d13e501..4732a2893c1 100644 --- a/src/plugins/coreplugin/iwelcomepage.h +++ b/src/plugins/coreplugin/iwelcomepage.h @@ -55,8 +55,6 @@ public: virtual int priority() const { return 0; } virtual Core::Id id() const = 0; virtual QWidget *createWidget() const = 0; - - static int screenDependHeightDistance(); }; class WelcomePageButtonPrivate; diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index 8a8446acfcc..f7e442ed5e6 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -541,8 +541,6 @@ public: projectsList->setItemDelegate(&m_projectDelegate); projectsList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - const int d = IWelcomePage::screenDependHeightDistance(); - auto hbox11 = new QHBoxLayout; hbox11->setContentsMargins(0, 0, 0, 0); hbox11->addWidget(newButton); @@ -557,23 +555,23 @@ public: vbox1->setContentsMargins(0, 0, 0, 0); vbox1->addStrut(200); vbox1->addItem(hbox11); - vbox1->addSpacing(d); + vbox1->addSpacing(16); vbox1->addWidget(sessionsLabel); - vbox1->addSpacing(d + 5); + vbox1->addSpacing(21); vbox1->addWidget(sessionsList); auto vbox2 = new QVBoxLayout; vbox2->setContentsMargins(0, 0, 0, 0); vbox2->addItem(hbox21); - vbox2->addSpacing(d); + vbox2->addSpacing(16); vbox2->addWidget(recentProjectsLabel); - vbox2->addSpacing(d + 5); + vbox2->addSpacing(21); vbox2->addWidget(projectsList); auto hbox = new QHBoxLayout(this); hbox->setContentsMargins(30, 27, 0, 27); hbox->addItem(vbox1); - hbox->addSpacing(d); + hbox->addSpacing(16); hbox->addItem(vbox2); hbox->setStretchFactor(vbox2, 2); } diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index 13bcb6757e7..8a34fdd4667 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -208,12 +208,10 @@ public: vbox->setSpacing(0); vbox->setContentsMargins(0, 27, 0, 0); - int sd = IWelcomePage::screenDependHeightDistance(); - { auto l = m_pluginButtons = new QVBoxLayout; l->setContentsMargins(lrPadding, 0, lrPadding, 0); - l->setSpacing(sd + 3); + l->setSpacing(19); vbox->addItem(l); vbox->addSpacing(62); } @@ -221,7 +219,7 @@ public: { auto l = new QVBoxLayout; l->setContentsMargins(lrPadding, 0, lrPadding, 0); - l->setSpacing(sd - 8); + l->setSpacing(8); auto newLabel = new QLabel(tr("New to Qt?"), this); newLabel->setFont(sizedFont(18, this)); From ad869ba7c76a676032d4f410239eade6bc06eb70 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 21 Mar 2017 13:21:40 +0100 Subject: [PATCH 60/92] SearchResultDelegate: Fix display of icons on HiDPI screens Visible in e.g. the C++ Symbols search. The icon returns a higher resolution pixmap, and QItemDelegate::drawDecoration does not position pixmaps with higher devicePixelRatio correctly. Just draw the icon ourselves with similar code as QItemDelegate draws icons. Change-Id: Ia412de026c3fb38d91cb87381475b6884005a231 Reviewed-by: Serhii Moroz Reviewed-by: Alessandro Portale --- .../coreplugin/find/searchresulttreeitemdelegate.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp b/src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp index 7bc02adb389..de67e62b99b 100644 --- a/src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp +++ b/src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp @@ -67,19 +67,20 @@ void SearchResultTreeItemDelegate::paint(QPainter *painter, const QStyleOptionVi // icon QIcon icon = index.model()->data(index, ItemDataRoles::ResultIconRole).value(); - if (!icon.isNull()) - pixmapRect = QRect(0, 0, iconSize, iconSize); + if (!icon.isNull()) { + const QSize size = icon.actualSize(QSize(iconSize, iconSize)); + pixmapRect = QRect(0, 0, size.width(), size.height()); + } // text textRect = opt.rect.adjusted(0, 0, checkRect.width() + pixmapRect.width(), 0); // do layout doLayout(opt, &checkRect, &pixmapRect, &textRect, false); - // ---- draw the items // icon if (!icon.isNull()) - QItemDelegate::drawDecoration(painter, opt, pixmapRect, icon.pixmap(iconSize)); + icon.paint(painter, pixmapRect, option.decorationAlignment); // line numbers int lineNumberAreaWidth = drawLineNumber(painter, opt, textRect, index); From 5a13a2b5b4eaa4d89ec92eccc7c0e6e6c7642374 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 24 Mar 2017 13:52:31 +0100 Subject: [PATCH 61/92] Prevent compilation of the QmlPuppet if qtquick-private is not present Checking for qtquick is not sufficient in some distributions that install the development packages for the real thing but not *-private. Change-Id: I866539c54c845cecb37df8761f006046b28aec80 Reviewed-by: Cristian Adam Reviewed-by: Thomas Hartmann --- src/tools/tools.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/tools.pro b/src/tools/tools.pro index f727cb9abef..cfe34abaa0a 100644 --- a/src/tools/tools.pro +++ b/src/tools/tools.pro @@ -7,7 +7,7 @@ SUBDIRS = qtpromaker \ 3rdparty \ buildoutputparser -qtHaveModule(quick): SUBDIRS += qml2puppet +qtHaveModule(quick-private): SUBDIRS += qml2puppet win32 { SUBDIRS += qtcdebugger \ From 55a4a62797404f63d437971d110d2b4d48dbb39b Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 24 Mar 2017 16:30:05 +0100 Subject: [PATCH 62/92] CMake: Speed up server-mode Use a QSet to avoid having to search in a QList. Change-Id: I2261a83acd3924a8483495e1f03322c7574a78a8 Reviewed-by: hjk --- src/plugins/cmakeprojectmanager/servermodereader.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 610cc3d8885..000a6a376ef 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -532,14 +532,11 @@ void ServerModeReader::extractCacheData(const QVariantMap &data) void ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList &cmakeLists) { - const QDir baseDir = QDir(m_parameters.sourceDirectory.toString()); - + const QSet cmakeDirs + = Utils::transform(cmakeLists, [](const Node *n) { return n->filePath().parentDir(); }); root->addNestedNodes(cmakeLists, Utils::FileName(), - [&cmakeLists](const Utils::FileName &fp) -> ProjectExplorer::FolderNode * { - if (Utils::contains(cmakeLists, [&fp](const FileNode *fn) { return fn->filePath().parentDir() == fp; })) - return new CMakeListsNode(fp); - else - return new FolderNode(fp); + [&cmakeDirs](const Utils::FileName &fp) -> ProjectExplorer::FolderNode * { + return cmakeDirs.contains(fp) ? new CMakeListsNode(fp) : new FolderNode(fp); }); } From 87f7725b5afff8ce98cfbcc8873969709a5a7fce Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 24 Mar 2017 17:01:29 +0100 Subject: [PATCH 63/92] Prevent compilation of the QmlDesigner if qtquick-private is not present Checking for qtquick is not sufficient in some distributions that install the development packages for the real thing but not *-private. Change-Id: I5e6959f92b0da0a7a1b7770ed6e591a3ed1dae29 Reviewed-by: hjk --- src/plugins/plugins.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index c6a554fafaa..49961bc7a4e 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -76,10 +76,10 @@ qtHaveModule(designercomponents_private) { } DO_NOT_BUILD_QMLDESIGNER = $$(DO_NOT_BUILD_QMLDESIGNER) -isEmpty(DO_NOT_BUILD_QMLDESIGNER):qtHaveModule(quick) { +isEmpty(DO_NOT_BUILD_QMLDESIGNER):qtHaveModule(quick-private) { SUBDIRS += qmldesigner } else { - !qtHaveModule(quick) { + !qtHaveModule(quick-private) { warning("QmlDesigner plugin has been disabled since the Qt Quick module is not available.") } else { warning("QmlDesigner plugin has been disabled since DO_NOT_BUILD_QMLDESIGNER is set.") From b302eb2d0f0655f4066bfbd5ecbe36b9821162b6 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 24 Mar 2017 16:27:41 +0100 Subject: [PATCH 64/92] ProjectNodes: Avoid QFileInfo Avoid creating an unnecessary QFileInfo object. Change-Id: Ibd85ccdf948872c2505085aa04cc5525d25c4d29 Reviewed-by: hjk --- src/plugins/projectexplorer/projectnodes.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 0d3b102522d..bfdb15821a0 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -499,8 +499,7 @@ void FolderNode::addNestedNode(FileNode *fileNode, const Utils::FileName &overri const FolderNodeFactory &factory) { // Get relative path to rootNode - QString parentDir = fileNode->filePath().toFileInfo().absolutePath(); - FolderNode *folder = recursiveFindOrCreateFolderNode(this, Utils::FileName::fromString(parentDir), + FolderNode *folder = recursiveFindOrCreateFolderNode(this, fileNode->filePath().parentDir(), overrideBaseDir, factory); folder->addNode(fileNode); From e8498acde088879bd86c1cae43bd41ee6ef2ecd2 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 24 Mar 2017 16:34:03 +0100 Subject: [PATCH 65/92] ProjectNodes: Be less enthusiastic about compression opportunities Do not compress foldernodes that differ on their type. This makes it possible to use FolderNode::compress() in one more place in CMake. Change-Id: I4721d5d12e3032ee70a1c3d9e87df49d59751f04 Reviewed-by: hjk --- src/plugins/cmakeprojectmanager/servermodereader.cpp | 1 + src/plugins/projectexplorer/projectnodes.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 000a6a376ef..871ede041aa 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -538,6 +538,7 @@ void ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList ProjectExplorer::FolderNode * { return cmakeDirs.contains(fp) ? new CMakeListsNode(fp) : new FolderNode(fp); }); + root->compress(); } static ProjectNode *findCMakeNode(ProjectNode *root, const Utils::FileName &dir) diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index bfdb15821a0..633847e25dd 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -520,6 +520,8 @@ void FolderNode::compress() { QList children = nodes(); if (auto subFolder = children.count() == 1 ? children.at(0)->asFolderNode() : nullptr) { + if (subFolder->nodeType() != nodeType()) + return; // Only one subfolder: Compress! setDisplayName(QDir::toNativeSeparators(displayName() + "/" + subFolder->displayName())); for (Node *n : subFolder->nodes()) { From ad8b797860938dafbba55bce93e8de0d76975902 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 24 Mar 2017 18:47:17 +0100 Subject: [PATCH 66/92] QmlDesigner: Add core-private dependencies Seems to be needed explicitly at least on linux due to the use of sharedmemory_unix.cpp. Change-Id: I59e5b5c6dabbe05afa26c4367cce62286986b069 Reviewed-by: Orgad Shaneh --- src/plugins/qmldesigner/qmldesignerplugin.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pro b/src/plugins/qmldesigner/qmldesignerplugin.pro index a5261e0931a..cc78fdc5db4 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.pro +++ b/src/plugins/qmldesigner/qmldesignerplugin.pro @@ -1,4 +1,4 @@ -QT += quickwidgets +QT += quickwidgets core-private CONFIG += exceptions INCLUDEPATH += $$PWD From 8478e3538416f62df105160e8ad0277bf1c66e49 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 26 Mar 2017 16:36:07 +0300 Subject: [PATCH 67/92] Git: Minor cleanup in BranchModel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use member initialization * Use nullptr * Remove unneeded local var Change-Id: Ibca6c3bc5caf9e028166b833ba1ed9fc165e290b Reviewed-by: André Hartmann --- src/plugins/git/branchmodel.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index 9a8a4d56cc3..4bba46057d3 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -55,13 +55,12 @@ class BranchNode { public: BranchNode() : - parent(0), name("") { } BranchNode(const QString &n, const QString &s = QString(), const QString &t = QString(), const QDateTime &dt = QDateTime()) : - parent(0), name(n), sha(s), tracking(t), dateTime(dt) + name(n), sha(s), tracking(t), dateTime(dt) { } ~BranchNode() @@ -120,7 +119,7 @@ public: if (children.at(i)->name == name) return children.at(i); } - return 0; + return nullptr; } QStringList fullName(bool includePrefix = false) const @@ -182,7 +181,7 @@ public: return children.indexOf(node); } - BranchNode *parent; + BranchNode *parent = nullptr; QList children; QString name; @@ -349,7 +348,7 @@ void BranchModel::clear() if (hasTags()) m_rootNode->children.takeLast(); - m_currentBranch = 0; + m_currentBranch = nullptr; m_obsoleteLocalBranches.clear(); } @@ -376,7 +375,7 @@ bool BranchModel::refresh(const QString &workingDirectory, QString *errorMessage if (m_currentBranch) { if (m_currentBranch->parent == m_rootNode->children.at(LocalBranches)) - m_currentBranch = 0; + m_currentBranch = nullptr; setCurrentBranch(); } @@ -448,8 +447,7 @@ QString BranchModel::fullName(const QModelIndex &idx, bool includePrefix) const BranchNode *node = indexToNode(idx); if (!node || !node->isLeaf()) return QString(); - QStringList path = node->fullName(includePrefix); - return path.join('/'); + return node->fullName(includePrefix).join('/'); } QStringList BranchModel::localBranchNames() const @@ -623,7 +621,7 @@ QModelIndex BranchModel::addBranch(const QString &name, bool track, const QModel if (slash != -1) { const QString nodeName = name.left(slash); int pos = positionForName(local, nodeName); - BranchNode *child = (pos == local->count()) ? 0 : local->children.at(pos); + BranchNode *child = (pos == local->count()) ? nullptr : local->children.at(pos); if (!child || child->name != nodeName) { child = new BranchNode(nodeName); beginInsertRows(nodeToIndex(local, 0), pos, pos); @@ -697,7 +695,7 @@ void BranchModel::parseOutputLine(const QString &line) QStringList nameParts = fullName.split('/'); nameParts.removeFirst(); // remove refs... - BranchNode *root = 0; + BranchNode *root = nullptr; if (nameParts.first() == "heads") { root = m_rootNode->children.at(LocalBranches); } else if (nameParts.first() == "remotes") { @@ -731,7 +729,7 @@ void BranchModel::parseOutputLine(const QString &line) BranchNode *BranchModel::indexToNode(const QModelIndex &index) const { if (index.column() > 1) - return 0; + return nullptr; if (!index.isValid()) return m_rootNode; return static_cast(index.internalPointer()); From 07921dee775781ef681fea6a849cad8acd4c7a7a Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 26 Mar 2017 16:35:20 +0300 Subject: [PATCH 68/92] Git: Expand branches also on internal model refresh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I91e3b875be1a2c3b5da9ae7720709b34a7d83232 Reviewed-by: André Hartmann --- src/plugins/git/branchdialog.cpp | 4 ++++ src/plugins/git/branchdialog.h | 1 + 2 files changed, 5 insertions(+) diff --git a/src/plugins/git/branchdialog.cpp b/src/plugins/git/branchdialog.cpp index 6f2184d5070..eb71c73531a 100644 --- a/src/plugins/git/branchdialog.cpp +++ b/src/plugins/git/branchdialog.cpp @@ -92,6 +92,7 @@ BranchDialog::BranchDialog(QWidget *parent) : connect(m_model, &QAbstractItemModel::dataChanged, this, &BranchDialog::resizeColumns); connect(m_model, &QAbstractItemModel::rowsInserted, this, &BranchDialog::resizeColumns); connect(m_model, &QAbstractItemModel::rowsRemoved, this, &BranchDialog::resizeColumns); + connect(m_model, &QAbstractItemModel::modelReset, this, &BranchDialog::expandAndResize); m_ui->branchView->selectionModel()->clear(); } @@ -111,7 +112,10 @@ void BranchDialog::refresh(const QString &repository, bool force) QString errorMessage; if (!m_model->refresh(m_repository, &errorMessage)) VcsOutputWindow::appendError(errorMessage); +} +void BranchDialog::expandAndResize() +{ m_ui->branchView->expandAll(); resizeColumns(); } diff --git a/src/plugins/git/branchdialog.h b/src/plugins/git/branchdialog.h index db0318b5570..a967dc3bdf4 100644 --- a/src/plugins/git/branchdialog.h +++ b/src/plugins/git/branchdialog.h @@ -56,6 +56,7 @@ public: void refreshIfSame(const QString &repository); private: + void expandAndResize(); void resizeColumns(); void enableButtons(); void refreshCurrentRepository(); From 5736ef2c545045094493cde51b0ebdd6cef64395 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 26 Mar 2017 16:44:07 +0300 Subject: [PATCH 69/92] Git: Improve detection of nested local branch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the current branch was foo/bar it was not detected correctly. Change-Id: Ic030a6f4659801c6da2716c272a418c89585e22f Reviewed-by: André Hartmann --- src/plugins/git/branchmodel.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index 4bba46057d3..ef841be5226 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -374,7 +374,7 @@ bool BranchModel::refresh(const QString &workingDirectory, QString *errorMessage parseOutputLine(l); if (m_currentBranch) { - if (m_currentBranch->parent == m_rootNode->children.at(LocalBranches)) + if (m_currentBranch->isLocal()) m_currentBranch = nullptr; setCurrentBranch(); } @@ -391,11 +391,13 @@ void BranchModel::setCurrentBranch() return; BranchNode *local = m_rootNode->children.at(LocalBranches); - int pos = 0; - for (pos = 0; pos < local->count(); ++pos) { - if (local->children.at(pos)->name == currentBranch) - m_currentBranch = local->children[pos]; + const QStringList branchParts = currentBranch.split('/'); + for (const QString &branchPart : branchParts) { + local = local->childOfName(branchPart); + if (!local) + return; } + m_currentBranch = local; } void BranchModel::renameBranch(const QString &oldName, const QString &newName) From b30b4f8a11e1a78a780779edbf3f1f3b75133559 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 26 Mar 2017 16:45:25 +0300 Subject: [PATCH 70/92] Git: Fix inline nested branch rename MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We can't just change the node name. A branch named foo/bar can be renamed to baz/yyy. We have to refresh the model after rename. Change-Id: Id9dfaa15b9e0384668223ae746376025267f89a3 Reviewed-by: André Hartmann --- src/plugins/git/branchmodel.cpp | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index ef841be5226..7b47f0f73e2 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -272,7 +272,7 @@ QVariant BranchModel::data(const QModelIndex &index, int role) const return res; } case Qt::EditRole: - return index.column() == 0 ? node->name : QVariant(); + return index.column() == 0 ? node->fullName().join('/') : QVariant(); case Qt::ToolTipRole: if (!node->isLeaf()) return QVariant(); @@ -307,24 +307,11 @@ bool BranchModel::setData(const QModelIndex &index, const QVariant &value, int r if (newName.isEmpty()) return false; - if (node->name == newName) - return true; - - QStringList oldFullName = node->fullName(); - node->name = newName; - QStringList newFullName = node->fullName(); - - QString output; - QString errorMessage; - if (!m_client->synchronousBranchCmd(m_workingDirectory, - {"-m", oldFullName.last(), newFullName.last()}, - &output, &errorMessage)) { - node->name = oldFullName.last(); - VcsOutputWindow::appendError(errorMessage); + const QString oldName = node->fullName().join('/'); + if (oldName == newName) return false; - } - emit dataChanged(index, index); + renameBranch(oldName, newName); return true; } From cf40d98dc9115405176976172e0701b0a463813b Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sat, 25 Mar 2017 22:01:22 +0100 Subject: [PATCH 71/92] QMake: Prettify file lists in generated project files Having each source/header/form file on its own line makes further moving around (e.g. sorting) much easier. Also make sure there is a space between file name and trailing backslash. Change-Id: I54fccf7b6249c86034b8f41f58391ffcc63a0a27 Reviewed-by: Orgad Shaneh --- .../qmakeprojectmanager/wizards/guiappwizard.cpp | 11 +++++++---- .../qmakeprojectmanager/wizards/librarywizard.cpp | 10 ++++++---- .../qmakeprojectmanager/wizards/testwizard.cpp | 5 +++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp b/src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp index 94586b3798f..60d708ed923 100644 --- a/src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp @@ -187,11 +187,14 @@ Core::GeneratedFiles GuiAppWizard::generateFiles(const QWizard *w, QTextStream proStr(&contents); QtProjectParameters::writeProFileHeader(proStr); projectParams.writeProFile(proStr); - proStr << "\n\nSOURCES += " << Utils::FileName::fromString(mainSourceFileName).fileName() - << "\\\n " << Utils::FileName::fromString(formSource.path()).fileName() - << "\n\nHEADERS += " << Utils::FileName::fromString(formHeader.path()).fileName(); + proStr << "\n\nSOURCES +=" + << " \\\n " << Utils::FileName::fromString(mainSourceFileName).fileName() + << " \\\n " << Utils::FileName::fromString(formSource.path()).fileName() + << "\n\nHEADERS +=" + << " \\\n " << Utils::FileName::fromString(formHeader.path()).fileName(); if (params.designerForm) - proStr << "\n\nFORMS += " << Utils::FileName::fromString(form->path()).fileName(); + proStr << "\n\nFORMS +=" + << " \\\n " << Utils::FileName::fromString(form->path()).fileName(); if (params.isMobileApplication) { proStr << "\n\nCONFIG += mobility" << "\nMOBILITY = " diff --git a/src/plugins/qmakeprojectmanager/wizards/librarywizard.cpp b/src/plugins/qmakeprojectmanager/wizards/librarywizard.cpp index 90e694af5e3..e420502a450 100644 --- a/src/plugins/qmakeprojectmanager/wizards/librarywizard.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/librarywizard.cpp @@ -132,12 +132,14 @@ Core::GeneratedFiles LibraryWizard::generateFiles(const QWizard *w, QTextStream proStr(&profileContents); QtProjectParameters::writeProFileHeader(proStr); projectParams.writeProFile(proStr); - proStr << "\nSOURCES += " << Utils::FileName::fromString(source.path()).fileName() - << "\n\nHEADERS += " << headerFileName; + proStr << "\nSOURCES +=" + << " \\\n " << Utils::FileName::fromString(source.path()).fileName() + << "\n\nHEADERS +=" + << " \\\n " << headerFileName; if (!globalHeaderFileName.isEmpty()) - proStr << "\\\n " << globalHeaderFileName << '\n'; + proStr << " \\\n " << globalHeaderFileName << " \n"; if (!pluginJsonFileName.isEmpty()) - proStr << "\nDISTFILES += " << pluginJsonFileName << '\n'; + proStr << "\nDISTFILES += " << pluginJsonFileName << " \n"; writeLinuxProFile(proStr); } profile.setContents(profileContents); diff --git a/src/plugins/qmakeprojectmanager/wizards/testwizard.cpp b/src/plugins/qmakeprojectmanager/wizards/testwizard.cpp index 9ff69a790b7..3f2ebfc6191 100644 --- a/src/plugins/qmakeprojectmanager/wizards/testwizard.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/testwizard.cpp @@ -170,8 +170,9 @@ Core::GeneratedFiles TestWizard::generateFiles(const QWizard *w, QString *errorM QTextStream proStr(&contents); QtProjectParameters::writeProFileHeader(proStr); projectParams.writeProFile(proStr); - proStr << "\n\nSOURCES += " << Utils::FileName::fromString(sourceFilePath).fileName() << '\n' - << "DEFINES += SRCDIR=\\\\\\\"$$PWD/\\\\\\\"\n"; + proStr << "\n\nSOURCES +=" + << " \\\n " << Utils::FileName::fromString(sourceFilePath).fileName() + << " \n\nDEFINES += SRCDIR=\\\\\\\"$$PWD/\\\\\\\"\n"; } profile.setContents(contents); From c73bcd32a82f674929583a17f13c9d2bc696a356 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 24 Mar 2017 10:01:46 +0100 Subject: [PATCH 72/92] Debugger: Prepend additional info to cdb exception task entry Most users expect build related entries in the Issues pane, so prepend debugger related exception entries with a prefix making clear that these entries are not build related. Task-number: QTCREATORBUG-17806 Change-Id: I8a78c1eff3a4386f108997954329b694c223400f Reviewed-by: Tobias Hunger --- src/plugins/debugger/cdb/cdbengine.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 997073d560c..2692cdf7594 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -2320,7 +2320,9 @@ void CdbEngine::handleExtensionMessage(char t, int token, const QString &what, c isFatalWinException(exception.exceptionCode) ? Task::Error : Task::Warning; const FileName fileName = exception.file.isEmpty() ? FileName() : FileName::fromUserInput(exception.file); - TaskHub::addTask(type, exception.toString(false).trimmed(), + const QString taskEntry = tr("Debugger encountered an exception: %1").arg( + exception.toString(false).trimmed()); + TaskHub::addTask(type, taskEntry, Debugger::Constants::TASK_CATEGORY_DEBUGGER_RUNTIME, fileName, exception.lineNumber); } From 48c17a1e07e29e93e0b23ad6a64d457835497ae6 Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Wed, 22 Mar 2017 13:45:20 +0200 Subject: [PATCH 73/92] Update only old gradle distributionUrl Task-number: QTCREATORBUG-17814 Task-number: QTCREATORBUG-17672 Change-Id: I658e8edec5c231a30ef4e99bae5d15cb6f6497f5 Reviewed-by: Vikas Pachdha Reviewed-by: Tobias Hunger --- src/plugins/android/androidmanager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 0b8762f24dc..0459355b041 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -546,8 +546,8 @@ bool AndroidManager::updateGradleProperties(ProjectExplorer::Target *target) if (wrapperProps.exists()) { GradleProperties wrapperProperties = readGradleProperties(wrapperProps.toString()); QString distributionUrl = QString::fromLocal8Bit(wrapperProperties["distributionUrl"]); - QRegExp re(QLatin1String(".*services.gradle.org/distributions/gradle-2..*.zip")); - if (!re.exactMatch(distributionUrl)) { + // Update only old gradle distributionUrl + if (distributionUrl.endsWith(QLatin1String("distributions/gradle-1.12-all.zip"))) { wrapperProperties["distributionUrl"] = "https\\://services.gradle.org/distributions/gradle-2.2.1-all.zip"; mergeGradleProperties(wrapperProps.toString(), wrapperProperties); } From b26143561af5fe476f0c5ee933d428ace1a66ad0 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 23 Mar 2017 13:30:11 +0100 Subject: [PATCH 74/92] Clang: Make diagnostic display adapt to size of the info bar Change-Id: Ibc7431234b8a68c8e2b0c3f25387de96b203c4c5 Reviewed-by: Tim Jenssen --- .../clangdiagnostictooltipwidget.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp index 42c77883bfc..62870880fdf 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp @@ -112,10 +112,16 @@ private: label->setTextFormat(Qt::RichText); label->setText(text); label->setTextInteractionFlags(Qt::TextBrowserInteraction); - // Using "setWordWrap(true)" alone will wrap the text already for small - // widths, so do not require word wrapping until we hit limits. - if (m_displayHints.limitWidth && label->sizeHint().width() > widthLimit()) { - label->setMaximumWidth(widthLimit()); + + if (m_displayHints.limitWidth) { + const int limit = widthLimit(); + // Using "setWordWrap(true)" alone will wrap the text already for small + // widths, so do not require word wrapping until we hit limits. + if (label->sizeHint().width() > limit) { + label->setMaximumWidth(limit); + label->setWordWrap(true); + } + } else { label->setWordWrap(true); } @@ -141,7 +147,7 @@ private: QString htmlText(const QVector &diagnostics) { // For debugging, add: style='border-width:1px;border-color:black' - QString text = ""; + QString text = "
"; foreach (const ClangBackEnd::DiagnosticContainer &diagnostic, diagnostics) text.append(tableRows(diagnostic)); From 54fa601e5f0eb3444a1a718d9e8f9d8e152efa4e Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 24 Mar 2017 18:30:42 +0100 Subject: [PATCH 75/92] ProjectExplorer: Remove unused Project::displayName() signal Only ever emitted by the cmake project and never consumed Change-Id: I689120a2ac2c77896eed72da9bd0be194ac1af86 Reviewed-by: Tobias Hunger --- src/plugins/cmakeprojectmanager/cmakeproject.cpp | 1 - src/plugins/projectexplorer/project.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index c04d237f387..8e3bd1e73ea 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -185,7 +185,6 @@ void CMakeProject::updateProjectData(CMakeBuildConfiguration *bc) updateQmlJSCodeModel(); - emit displayNameChanged(); emit fileListChanged(); emit bc->emitBuildTypeChanged(); diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 8de6d9ec21b..3c7623cfcdf 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -143,7 +143,6 @@ public: Utils::MacroExpander *macroExpander() const; signals: - void displayNameChanged(); void fileListChanged(); // Note: activeTarget can be 0 (if no targets are defined). From 2703d02db6b327528ab7229ab91db47514f642e3 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Fri, 24 Mar 2017 10:22:54 +0100 Subject: [PATCH 76/92] Timeline: Only search hovered events when !selectionLocked Otherwise we are not going to do anything with the result. The searching can be very expensive would happen whenever the mouse moves. This also makes the q_ptr in TimelineRendererPrivate obsolete. Change-Id: I582d0e85b63925f3f329e9a7463f2abee7947c5b Task-number: QTCREATORBUG-14983 Reviewed-by: hjk Reviewed-by: Joerg Bornemann --- src/libs/timeline/timelinerenderer.cpp | 41 ++++++++++---------------- src/libs/timeline/timelinerenderer_p.h | 12 ++------ 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/src/libs/timeline/timelinerenderer.cpp b/src/libs/timeline/timelinerenderer.cpp index c398de1acb3..5aa12efc08e 100644 --- a/src/libs/timeline/timelinerenderer.cpp +++ b/src/libs/timeline/timelinerenderer.cpp @@ -43,8 +43,7 @@ namespace Timeline { -TimelineRenderer::TimelineRendererPrivate::TimelineRendererPrivate(TimelineRenderer *q) : - lastState(0), q_ptr(q) +TimelineRenderer::TimelineRendererPrivate::TimelineRendererPrivate() : lastState(0) { resetCurrentSelection(); } @@ -63,7 +62,7 @@ void TimelineRenderer::TimelineRendererPrivate::clear() } TimelineRenderer::TimelineRenderer(QQuickItem *parent) : - TimelineAbstractRenderer(*(new TimelineRendererPrivate(this)), parent) + TimelineAbstractRenderer(*(new TimelineRendererPrivate), parent) { setAcceptedMouseButtons(Qt::LeftButton); setAcceptHoverEvents(true); @@ -182,9 +181,8 @@ int TimelineRenderer::TimelineRendererPrivate::rowFromPosition(int y) const void TimelineRenderer::mouseReleaseEvent(QMouseEvent *event) { Q_D(TimelineRenderer); - Q_UNUSED(event); - if (d->model && !d->model->isEmpty()) - d->manageClicked(); + d->findCurrentSelection(event->pos().x(), event->pos().y(), width()); + setSelectedItem(d->currentSelection.eventIndex); } void TimelineRenderer::mouseMoveEvent(QMouseEvent *event) @@ -195,7 +193,11 @@ void TimelineRenderer::mouseMoveEvent(QMouseEvent *event) void TimelineRenderer::hoverMoveEvent(QHoverEvent *event) { Q_D(TimelineRenderer); - d->manageHovered(event->pos().x(), event->pos().y()); + if (!d->selectionLocked) { + d->findCurrentSelection(event->pos().x(), event->pos().y(), width()); + if (d->currentSelection.eventIndex != -1) + setSelectedItem(d->currentSelection.eventIndex); + } if (d->currentSelection.eventIndex == -1) event->setAccepted(false); } @@ -227,19 +229,10 @@ void TimelineRenderer::wheelEvent(QWheelEvent *event) } } -void TimelineRenderer::TimelineRendererPrivate::manageClicked() +void TimelineRenderer::TimelineRendererPrivate::findCurrentSelection(int mouseX, int mouseY, + int width) { - Q_Q(TimelineRenderer); - if (currentSelection.eventIndex != -1) - q->setSelectedItem(currentSelection.eventIndex); - else - q->setSelectedItem(-1); -} - -void TimelineRenderer::TimelineRendererPrivate::manageHovered(int mouseX, int mouseY) -{ - Q_Q(TimelineRenderer); - if (!zoomer || !model || q->width() < 1) + if (!zoomer || !model || width < 1) return; qint64 duration = zoomer->windowDuration(); @@ -247,18 +240,16 @@ void TimelineRenderer::TimelineRendererPrivate::manageHovered(int mouseX, int mo return; // Make the "selected" area 3 pixels wide by adding/subtracting 1 to catch very narrow events. - qint64 startTime = (mouseX - 1) * duration / q->width() + zoomer->windowStart(); - qint64 endTime = (mouseX + 1) * duration / q->width() + zoomer->windowStart(); + qint64 startTime = (mouseX - 1) * duration / width + zoomer->windowStart(); + qint64 endTime = (mouseX + 1) * duration / width + zoomer->windowStart(); qint64 exactTime = (startTime + endTime) / 2; int row = rowFromPosition(mouseY); - // already covered? Only recheck selectionLocked and make sure d->selectedItem is correct. + // already covered? Only make sure d->selectedItem is correct. if (currentSelection.eventIndex != -1 && exactTime >= currentSelection.startTime && exactTime < currentSelection.endTime && row == currentSelection.row) { - if (!selectionLocked) - q->setSelectedItem(currentSelection.eventIndex); return; } @@ -310,8 +301,6 @@ void TimelineRenderer::TimelineRendererPrivate::manageHovered(int mouseX, int mo bestOffset = offset; } - if (!selectionLocked && currentSelection.eventIndex != -1) - q->setSelectedItem(currentSelection.eventIndex); } void TimelineRenderer::clearData() diff --git a/src/libs/timeline/timelinerenderer_p.h b/src/libs/timeline/timelinerenderer_p.h index eccab59f4d6..398a1c637ec 100644 --- a/src/libs/timeline/timelinerenderer_p.h +++ b/src/libs/timeline/timelinerenderer_p.h @@ -31,17 +31,15 @@ namespace Timeline { class TimelineRenderer::TimelineRendererPrivate : - TimelineAbstractRenderer::TimelineAbstractRendererPrivate { + public TimelineAbstractRenderer::TimelineAbstractRendererPrivate { public: - TimelineRendererPrivate(TimelineRenderer *q); + TimelineRendererPrivate(); ~TimelineRendererPrivate(); void clear(); int rowFromPosition(int y) const; - - void manageClicked(); - void manageHovered(int mouseX, int mouseY); + void findCurrentSelection(int mouseX, int mouseY, int width); static const int SafeFloatMax = 1 << 12; @@ -58,10 +56,6 @@ public: QVector > renderStates; TimelineRenderState *lastState; - -private: - TimelineRenderer *q_ptr; - Q_DECLARE_PUBLIC(TimelineRenderer) }; } // namespace Timeline From 54be52a4fabedb6c3b81f761b95e7aee791d7e45 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 24 Mar 2017 16:26:26 +0100 Subject: [PATCH 77/92] ProjectNodes: Enable nested nodes outside of the top level node Enable adding nested nodes not a child of the top level node. Change-Id: Ia6bb4ed6e3e6649a98151c88133ff5ec7197573d Reviewed-by: Tim Jenssen --- src/plugins/projectexplorer/projectnodes.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 633847e25dd..7d275d2eac3 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -77,6 +77,7 @@ static FolderNode *recursiveFindOrCreateFolderNode(FolderNode *folder, directoryWithoutPrefix = directory.relativeChildPath(path); } else { isRelative = false; + path.clear(); directoryWithoutPrefix = directory; } } From 17b89cd422ff2d024df00dd8c8b35c42c3985819 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 24 Mar 2017 18:38:00 +0100 Subject: [PATCH 78/92] CMake: Speed up server-mode reader This patch reduces the time to generate a project tree by 15% in my test project. Change-Id: Ie5956cdd2108873118654857dc299bdb0b6d3636 Reviewed-by: Tim Jenssen --- .../cmakeprojectmanager/servermodereader.cpp | 56 +++++++++++-------- .../cmakeprojectmanager/servermodereader.h | 9 ++- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 871ede041aa..86430e041f8 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -284,8 +284,8 @@ void ServerModeReader::generateProjectTree(CMakeProjectNode *root, addCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.buildDirectory, cmakeFilesSource, cmakeFilesBuild, cmakeFilesOther); - addCMakeLists(root, cmakeLists); - addProjects(root, m_projects, allFiles); + QHash cmakeListsNodes = addCMakeLists(root, cmakeLists); + addProjects(cmakeListsNodes, m_projects, allFiles); } void ServerModeReader::updateCodeModel(CppTools::RawProjectParts &rpps) @@ -530,28 +530,36 @@ void ServerModeReader::extractCacheData(const QVariantMap &data) m_cmakeCache = config; } -void ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList &cmakeLists) +QHash +ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList &cmakeLists) { + QHash cmakeListsNodes; + cmakeListsNodes.insert(root->filePath(), root); + const QSet cmakeDirs = Utils::transform(cmakeLists, [](const Node *n) { return n->filePath().parentDir(); }); root->addNestedNodes(cmakeLists, Utils::FileName(), - [&cmakeDirs](const Utils::FileName &fp) -> ProjectExplorer::FolderNode * { - return cmakeDirs.contains(fp) ? new CMakeListsNode(fp) : new FolderNode(fp); + [&cmakeDirs, &cmakeListsNodes](const Utils::FileName &fp) + -> ProjectExplorer::FolderNode * { + FolderNode *fn = nullptr; + if (cmakeDirs.contains(fp)) { + CMakeListsNode *n = new CMakeListsNode(fp); + cmakeListsNodes.insert(fp, n); + fn = n; + } else { + fn = new FolderNode(fp); + } + return fn; }); root->compress(); + return cmakeListsNodes; } -static ProjectNode *findCMakeNode(ProjectNode *root, const Utils::FileName &dir) +static ProjectNode *createProjectNode(const QHash &cmakeListsNodes, + const Utils::FileName &dir, const QString &displayName) { - Node *n = root->findNode([&dir](Node *n) { return n->asProjectNode() && n->filePath() == dir; }); - return n ? n->asProjectNode() : nullptr; -} - -static ProjectNode *findOrCreateProjectNode(ProjectNode *root, const Utils::FileName &dir, - const QString &displayName) -{ - ProjectNode *cmln = findCMakeNode(root, dir); - QTC_ASSERT(cmln, return nullptr); + ProjectNode *cmln = cmakeListsNodes.value(dir); + QTC_ASSERT(cmln, qDebug() << dir.toUserOutput() ; return nullptr); Utils::FileName projectName = dir; projectName.appendPath(".project::" + displayName); @@ -565,7 +573,7 @@ static ProjectNode *findOrCreateProjectNode(ProjectNode *root, const Utils::File return pn; } -void ServerModeReader::addProjects(CMakeProjectNode *root, +void ServerModeReader::addProjects(const QHash &cmakeListsNodes, const QList &projects, const QList &allFiles) { @@ -577,16 +585,16 @@ void ServerModeReader::addProjects(CMakeProjectNode *root, } for (const Project *p : projects) { - ProjectNode *pNode = findOrCreateProjectNode(root, p->sourceDirectory, p->name); - QTC_ASSERT(pNode, continue); - addTargets(root, p->targets, includeFiles); + ProjectNode *pNode = createProjectNode(cmakeListsNodes, p->sourceDirectory, p->name); + QTC_ASSERT(pNode, qDebug() << p->sourceDirectory.toUserOutput() ; continue); + addTargets(cmakeListsNodes, p->targets, includeFiles); } } -static CMakeTargetNode *findOrCreateTargetNode(ProjectNode *root, const Utils::FileName &dir, - const QString &displayName) +static CMakeTargetNode *createTargetNode(const QHash &cmakeListsNodes, + const Utils::FileName &dir, const QString &displayName) { - ProjectNode *cmln = findCMakeNode(root, dir); + ProjectNode *cmln = cmakeListsNodes.value(dir); QTC_ASSERT(cmln, return nullptr); Utils::FileName targetName = dir; @@ -601,12 +609,12 @@ static CMakeTargetNode *findOrCreateTargetNode(ProjectNode *root, const Utils::F return tn; } -void ServerModeReader::addTargets(CMakeProjectNode *root, +void ServerModeReader::addTargets(const QHash &cmakeListsNodes, const QList &targets, const QHash> &headers) { for (const Target *t : targets) { - CMakeTargetNode *tNode = findOrCreateTargetNode(root, t->sourceDirectory, t->name); + CMakeTargetNode *tNode = createTargetNode(cmakeListsNodes, t->sourceDirectory, t->name); QTC_ASSERT(tNode, qDebug() << "No target node for" << t->sourceDirectory << t->name; return); tNode->setTargetInformation(t->artifacts, t->type); addFileGroups(tNode, t->sourceDirectory, t->buildDirectory, t->fileGroups, headers); diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index 8b973ce0ecd..7eb831df8ec 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -113,10 +113,13 @@ private: void extractCMakeInputsData(const QVariantMap &data); void extractCacheData(const QVariantMap &data); - void addCMakeLists(CMakeProjectNode *root, const QList &cmakeLists); - void addProjects(CMakeProjectNode *root, const QList &projects, + QHash + addCMakeLists(CMakeProjectNode *root, const QList &cmakeLists); + void addProjects(const QHash &cmakeListsNodes, + const QList &projects, const QList &allFiles); - void addTargets(CMakeProjectNode *root, const QList &targets, + void addTargets(const QHash &cmakeListsNodes, + const QList &targets, const QHash> &headers); void addFileGroups(ProjectExplorer::ProjectNode *targetRoot, const Utils::FileName &sourceDirectory, From 3a20cec60ac465192d6f03613c5d924e4438e1f3 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 24 Mar 2017 19:35:13 +0100 Subject: [PATCH 79/92] CMake: Break loop in error handling Block access to the BuildDirManager while one of its errors is processed. This prevents more errors being raised as part of error handling, which can trigger a loop. Task-number: QTCREATORBUG-17869 Change-Id: Ic6f8d9a3c3b4e63f27260c40f27ab09d20b62b3e Reviewed-by: Tim Jenssen --- .../cmakeprojectmanager/builddirmanager.cpp | 26 +++++++++++++++++-- .../cmakeprojectmanager/builddirmanager.h | 2 ++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index f3e039cd375..9e3f2a42743 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -75,7 +75,7 @@ const Utils::FileName BuildDirManager::workDirectory() const if (!m_tempDir) { m_tempDir.reset(new Utils::TemporaryDirectory("qtc-cmake-XXXXXXXX")); if (!m_tempDir->isValid()) - emit errorOccured(tr("Failed to create temporary directory \"%1\".").arg(m_tempDir->path())); + emitErrorOccured(tr("Failed to create temporary directory \"%1\".").arg(m_tempDir->path())); } return Utils::FileName::fromString(m_tempDir->path()); } @@ -86,6 +86,13 @@ void BuildDirManager::emitDataAvailable() emit dataAvailable(); } +void BuildDirManager::emitErrorOccured(const QString &message) const +{ + m_isHandlingError = true; + emit errorOccured(message); + m_isHandlingError = false; +} + void BuildDirManager::updateReaderType(std::function todo) { BuildDirReader::Parameters p(m_buildConfiguration); @@ -98,7 +105,7 @@ void BuildDirManager::updateReaderType(std::function todo) connect(m_reader.get(), &BuildDirReader::dataAvailable, this, &BuildDirManager::emitDataAvailable); connect(m_reader.get(), &BuildDirReader::errorOccured, - this, &BuildDirManager::errorOccured); + this, &BuildDirManager::emitErrorOccured); connect(m_reader.get(), &BuildDirReader::dirty, this, &BuildDirManager::becameDirty); } m_reader->setParameters(p); @@ -216,6 +223,8 @@ void BuildDirManager::becameDirty() void BuildDirManager::forceReparse() { + QTC_ASSERT(!m_isHandlingError, return); + if (m_buildConfiguration->target()->activeBuildConfiguration() != m_buildConfiguration) return; @@ -228,6 +237,8 @@ void BuildDirManager::forceReparse() void BuildDirManager::resetData() { + QTC_ASSERT(!m_isHandlingError, return); + if (m_reader) m_reader->resetData(); @@ -259,6 +270,7 @@ bool BuildDirManager::persistCMakeState() void BuildDirManager::generateProjectTree(CMakeProjectNode *root, const QList &allFiles) { + QTC_ASSERT(!m_isHandlingError, return); QTC_ASSERT(m_reader, return); const Utils::FileName projectFile = m_buildConfiguration->target()->project()->projectFilePath(); @@ -272,6 +284,7 @@ void BuildDirManager::generateProjectTree(CMakeProjectNode *root, const QListupdateCodeModel(rpps); } @@ -283,6 +296,8 @@ void BuildDirManager::parse() void BuildDirManager::clearCache() { + QTC_ASSERT(!m_isHandlingError, return); + auto cmakeCache = Utils::FileName(workDirectory()).appendPath(QLatin1String("CMakeCache.txt")); auto cmakeFiles = Utils::FileName(workDirectory()).appendPath(QLatin1String("CMakeFiles")); @@ -298,6 +313,8 @@ void BuildDirManager::clearCache() QList BuildDirManager::buildTargets() const { + QTC_ASSERT(!m_isHandlingError, return {}); + if (!m_reader) return QList(); if (m_buildTargets.isEmpty()) @@ -307,6 +324,8 @@ QList BuildDirManager::buildTargets() const CMakeConfig BuildDirManager::parsedConfiguration() const { + QTC_ASSERT(!m_isHandlingError, return {}); + if (!m_reader) return m_cmakeCache; if (m_cmakeCache.isEmpty()) @@ -389,6 +408,9 @@ void BuildDirManager::checkConfiguration() void BuildDirManager::maybeForceReparse() { + if (m_isHandlingError) + return; + if (!m_reader || !m_reader->hasData()) { forceReparse(); return; diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.h b/src/plugins/cmakeprojectmanager/builddirmanager.h index 4446c3f03f2..10632f360e6 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.h +++ b/src/plugins/cmakeprojectmanager/builddirmanager.h @@ -86,6 +86,7 @@ signals: private: void emitDataAvailable(); + void emitErrorOccured(const QString &message) const; void checkConfiguration(); const Utils::FileName workDirectory() const; @@ -109,6 +110,7 @@ private: std::unique_ptr m_reader; mutable QList m_buildTargets; + mutable bool m_isHandlingError = false; }; } // namespace Internal From 7da1e233eb6968c395298738ef15a760e0d21da3 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 27 Mar 2017 09:42:15 +0200 Subject: [PATCH 80/92] ProjectExplorer: Add missing breaks to switch in Abi class Change-Id: I6c855d221e7a4d81f7338bc119c7ecff815e7ea6 Reviewed-by: Tim Jenssen --- src/plugins/projectexplorer/abi.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/projectexplorer/abi.cpp b/src/plugins/projectexplorer/abi.cpp index 28356e15838..fa504ca3b8c 100644 --- a/src/plugins/projectexplorer/abi.cpp +++ b/src/plugins/projectexplorer/abi.cpp @@ -348,9 +348,11 @@ Abi::Abi(const Architecture &a, const OS &o, case Abi::VxWorks: if (m_osFlavor != VxWorksFlavor) m_osFlavor = VxWorksFlavor; + break; case Abi::QnxOS: if (m_osFlavor != GenericQnxFlavor) m_osFlavor = UnknownFlavor; + break; } } From 173186c31ddcd438c0b64f10750c6ca6e50265dc Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 27 Mar 2017 13:53:14 +0200 Subject: [PATCH 81/92] ProjectExplorer: Show something during parsing again This partially reverts 5ac13620. Looks like "soon enough" is not soon enough for non-trivial projects. Change-Id: Ib0d317c36e78f1af12b6c1f2a2aab48922517e98 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/projectmodels.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index 2b330de4b72..d9b7a80d417 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -240,6 +240,7 @@ void FlatModel::handleProjectAdded(Project *project) { Node *node = project->containerNode(); m_toExpand.insert(expandDataForNode(node)); + update(); } void FlatModel::loadExpandData() From bb04bbe9d49a9e9066798be86b44ee8d6b168f47 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 27 Mar 2017 13:43:45 +0200 Subject: [PATCH 82/92] Debugger: Add dumper for Utf8String Change-Id: I0f9411a246d121e22c8b65bf188598c427993726 Reviewed-by: hjk --- share/qtcreator/debugger/creatortypes.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/share/qtcreator/debugger/creatortypes.py b/share/qtcreator/debugger/creatortypes.py index 8b7d5d67e10..979e0c42ffb 100644 --- a/share/qtcreator/debugger/creatortypes.py +++ b/share/qtcreator/debugger/creatortypes.py @@ -192,6 +192,10 @@ def qdump__Utils__ElfSection(d, value): d.putByteArrayValue(value["name"]) d.putPlainChildren(value) +def qdump__Utf8String(d, value): + d.putByteArrayValue(value['byteArray']) + d.putPlainChildren(value) + def qdump__CPlusPlus__Token(d, value): k = value["f"]["kind"] e = int(k) From 767d988891ea7ea376e1e807fe921c9001b4abdf Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 27 Mar 2017 07:59:18 +0200 Subject: [PATCH 83/92] Debugger: Cache reference to an unresolvables type as struct This fixes throwing an uncaught exception if local variables contain arrays or pointer to a type that can not be looked up. Change-Id: If9407e5cf5d86bb89594266d4122a53dd65a80bb Reviewed-by: Christian Stenger --- share/qtcreator/debugger/cdbbridge.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index 1bbc2793acf..211b595efe9 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -153,20 +153,20 @@ class Dumper(DumperBase): code = nativeType.code() if code == TypeCodePointer: - if nativeType.name().startswith(''): - code = TypeCodeFunction - else: + if not nativeType.name().startswith(''): targetType = self.lookupType(nativeType.targetName(), nativeType.moduleId()) - return self.createPointerType(targetType) + if targetType is not None: + return self.createPointerType(targetType) + code = TypeCodeFunction if code == TypeCodeArray: # cdb reports virtual function tables as arrays those ar handled separetly by # the DumperBase. Declare those types as structs prevents a lookup to a none existing type - if nativeType.name().startswith('__fptr()') or nativeType.name().startswith(' Date: Mon, 27 Mar 2017 14:57:24 +0200 Subject: [PATCH 84/92] QmlJSModelManager: Avoid needless Mime database lookups This speeds up processing of a cmake project without any QML files by a factor of 16 on my machine. Task-number: QTCREATORBUG-17884 Change-Id: I823d4a051451adbca10a8b73c17d288e03387378 Reviewed-by: Orgad Shaneh --- src/plugins/qmljstools/qmljsmodelmanager.cpp | 27 ++++++++++---------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp index cfbde13308e..e13bbb3e292 100644 --- a/src/plugins/qmljstools/qmljsmodelmanager.cpp +++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +60,8 @@ #include #include #include +#include +#include #include #include @@ -74,20 +77,18 @@ ModelManagerInterface::ProjectInfo ModelManager::defaultProjectInfoForProject( Project *project) const { ModelManagerInterface::ProjectInfo projectInfo(project); - Target *activeTarget = 0; + Target *activeTarget = nullptr; if (project) { - QSet qmlTypeNames; - qmlTypeNames << QLatin1String(Constants::QML_MIMETYPE) - << QLatin1String(Constants::QBS_MIMETYPE) - << QLatin1String(Constants::QMLPROJECT_MIMETYPE) - << QLatin1String(Constants::QMLTYPES_MIMETYPE) - << QLatin1String(Constants::QMLUI_MIMETYPE); - foreach (const QString &filePath, project->files(Project::SourceFiles)) { - if (qmlTypeNames.contains(Utils::mimeTypeForFile( - filePath, MimeMatchMode::MatchExtension).name())) { - projectInfo.sourceFiles << filePath; - } - } + const QSet qmlTypeNames = { Constants::QML_MIMETYPE ,Constants::QBS_MIMETYPE, + Constants::QMLPROJECT_MIMETYPE, + Constants::QMLTYPES_MIMETYPE, + Constants::QMLUI_MIMETYPE }; + projectInfo.sourceFiles = project->files(Project::SourceFiles, + [&qmlTypeNames](const FileNode *fn) { + return fn->fileType() == FileType::QML + && qmlTypeNames.contains(Utils::mimeTypeForFile(fn->filePath().toString(), + MimeMatchMode::MatchExtension).name()); + }); activeTarget = project->activeTarget(); } Kit *activeKit = activeTarget ? activeTarget->kit() : KitManager::defaultKit(); From d1a53045640fc37f00ae556e683a87927cdddf91 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 27 Mar 2017 13:59:19 +0200 Subject: [PATCH 85/92] CMake: Fix WS Change-Id: Id06a9d8d831fcc0ce3fe38f852e34e144a79e0e9 Reviewed-by: Tim Jenssen --- src/plugins/cmakeprojectmanager/cmakeproject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 8e3bd1e73ea..7e77cba361a 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -219,7 +219,7 @@ void CMakeProject::updateQmlJSCodeModel() } foreach (const QString &cmakeImport, CMakeConfigItem::cmakeSplitValue(cmakeImports)) - projectInfo.importPaths.maybeInsert(FileName::fromString(cmakeImport),QmlJS::Dialect::Qml); + projectInfo.importPaths.maybeInsert(FileName::fromString(cmakeImport), QmlJS::Dialect::Qml); modelManager->updateProjectInfo(projectInfo, this); } From fc5ce1e710500bb603ceafb9a2c005bbaf2f7cec Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 27 Mar 2017 12:12:38 +0200 Subject: [PATCH 86/92] ProjectExplorer: Handle project file list globally Handle the generation of the list of files in a project globally, based on the project tree. Creator now has the concept of TreeManagers which can enrich the project tree with additional data (e.g. the files found in a resource file), which the project does not necessarily know about. So use that tree to find the files that belong to a project instead of implementing similar features in each project. Change-Id: Ia375a914a1f2c0adaa427f9eda834eec2db07f68 Reviewed-by: hjk Reviewed-by: Marco Benelli --- .../autotoolsproject.cpp | 6 --- .../autotoolsproject.h | 1 - .../cmakeprojectmanager/cmakeproject.cpp | 15 ------ .../cmakeprojectmanager/cmakeproject.h | 1 - src/plugins/cpptools/modelmanagertesthelper.h | 2 - .../genericprojectmanager/genericproject.cpp | 18 +------ .../genericprojectmanager/genericproject.h | 3 -- .../genericprojectplugin.cpp | 3 +- src/plugins/nim/project/nimproject.cpp | 21 +++----- src/plugins/nim/project/nimproject.h | 1 - src/plugins/projectexplorer/project.cpp | 20 +++++++ src/plugins/projectexplorer/project.h | 6 ++- .../pythoneditor/pythoneditorplugin.cpp | 8 +-- src/plugins/qbsprojectmanager/qbsproject.cpp | 53 ------------------- src/plugins/qbsprojectmanager/qbsproject.h | 1 - .../qmakeprojectmanager/qmakeproject.cpp | 48 +---------------- .../qmakeprojectmanager/qmakeproject.h | 6 --- src/plugins/qmlprojectmanager/qmlproject.cpp | 23 ++------ src/plugins/qmlprojectmanager/qmlproject.h | 7 +-- 19 files changed, 43 insertions(+), 200 deletions(-) diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp index 296142ec5a4..d7d389ed3a7 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp @@ -101,12 +101,6 @@ QString AutotoolsProject::defaultBuildDirectory(const QString &projectPath) return QFileInfo(projectPath).absolutePath(); } -QStringList AutotoolsProject::files(FilesMode fileMode) const -{ - Q_UNUSED(fileMode); - return m_files; -} - // This function, is called at the very beginning, to // restore the settings if there are some stored. Project::RestoreResult AutotoolsProject::fromMap(const QVariantMap &map, QString *errorMessage) diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.h b/src/plugins/autotoolsprojectmanager/autotoolsproject.h index 9e90c12d805..3ebaeb763a2 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsproject.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.h @@ -58,7 +58,6 @@ public: ~AutotoolsProject() override; QString displayName() const override; - QStringList files(FilesMode fileMode) const override; static QString defaultBuildDirectory(const QString &projectPath); QStringList buildTargets() const; diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 7e77cba361a..cf9d0f0ca45 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -306,21 +306,6 @@ QString CMakeProject::displayName() const return root ? root->displayName() : projectDirectory().fileName(); } -QStringList CMakeProject::files(FilesMode fileMode) const -{ - QStringList result; - if (ProjectNode *rpn = rootProjectNode()) { - rpn->forEachNode([&](const FileNode *fn) { - const bool isGenerated = fn->isGenerated(); - if ((fileMode & Project::SourceFiles) && !isGenerated) - result.append(fn->filePath().toString()); - if ((fileMode & Project::GeneratedFiles) && isGenerated) - result.append(fn->filePath().toString()); - }); - } - return result; -} - Project::RestoreResult CMakeProject::fromMap(const QVariantMap &map, QString *errorMessage) { RestoreResult result = Project::fromMap(map, errorMessage); diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 33890fcd8ff..f0bc68ce121 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -88,7 +88,6 @@ public: QString displayName() const final; - QStringList files(FilesMode fileMode) const final; QStringList buildTargetTitles(bool runnable = false) const; bool hasBuildTarget(const QString &title) const; diff --git a/src/plugins/cpptools/modelmanagertesthelper.h b/src/plugins/cpptools/modelmanagertesthelper.h index f7ef4ec1896..18f0d6b5ef9 100644 --- a/src/plugins/cpptools/modelmanagertesthelper.h +++ b/src/plugins/cpptools/modelmanagertesthelper.h @@ -45,8 +45,6 @@ public: QString displayName() const override { return m_name; } - QStringList files(FilesMode fileMode) const override { Q_UNUSED(fileMode); return QStringList(); } - private: QString m_name; }; diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index c8b14a125d5..8d70582f50a 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -249,9 +249,6 @@ void GenericProject::parseProject(RefreshOptions options) // TODO: Possibly load some configuration from the project file //QSettings projectInfo(m_fileName, QSettings::IniFormat); } - - if (options & Files) - emit fileListChanged(); } void GenericProject::refresh(RefreshOptions options) @@ -261,7 +258,7 @@ void GenericProject::refresh(RefreshOptions options) if (options & Files) { auto newRoot = new GenericProjectNode(this); - for (const QString &f : files()) { + for (const QString &f : m_files) { FileType fileType = FileType::Source; // ### FIXME if (f.endsWith(".qrc")) fileType = FileType::Resource; @@ -364,7 +361,7 @@ void GenericProject::refreshCppCodeModel() rpp.setQtVersion(activeQtVersion); rpp.setIncludePaths(projectIncludePaths()); rpp.setConfigFileName(configFileName()); - rpp.setFiles(files()); + rpp.setFiles(m_files); const CppTools::ProjectUpdateInfo projectInfoUpdate(this, cToolChain, cxxToolChain, k, {rpp}); m_cppCodeModelUpdater->update(projectInfoUpdate); @@ -397,22 +394,11 @@ QStringList GenericProject::projectIncludePaths() const return m_projectIncludePaths; } -QStringList GenericProject::files() const -{ - return m_files; -} - QString GenericProject::displayName() const { return projectFilePath().toFileInfo().completeBaseName(); } -QStringList GenericProject::files(FilesMode fileMode) const -{ - Q_UNUSED(fileMode); - return m_files; -} - QStringList GenericProject::buildTargets() const { const QStringList targets = { "all", "clean" }; diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index c63614ed6fa..a2d163328dd 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -57,8 +57,6 @@ public: QString displayName() const override; - QStringList files(FilesMode fileMode) const override; - QStringList buildTargets() const; bool addFiles(const QStringList &filePaths); @@ -75,7 +73,6 @@ public: void refresh(RefreshOptions options); QStringList projectIncludePaths() const; - QStringList files() const; protected: RestoreResult fromMap(const QVariantMap &map, QString *errorMessage) override; diff --git a/src/plugins/genericprojectmanager/genericprojectplugin.cpp b/src/plugins/genericprojectmanager/genericprojectplugin.cpp index fb69394ff57..edd5d42866b 100644 --- a/src/plugins/genericprojectmanager/genericprojectplugin.cpp +++ b/src/plugins/genericprojectmanager/genericprojectplugin.cpp @@ -87,7 +87,8 @@ void GenericProjectPlugin::editFiles() if (!genericProject) return; SelectableFilesDialogEditFiles sfd(genericProject->projectDirectory(), - Utils::transform(genericProject->files(), [](const QString &f) { return Utils::FileName::fromString(f); }), + Utils::transform(genericProject->files(Project::AllFiles), + [](const QString &f) { return Utils::FileName::fromString(f); }), ICore::mainWindow()); if (sfd.exec() == QDialog::Accepted) genericProject->setFiles(Utils::transform(sfd.selectedFiles(), &Utils::FileName::toString)); diff --git a/src/plugins/nim/project/nimproject.cpp b/src/plugins/nim/project/nimproject.cpp index a73daf10955..35795954ebb 100644 --- a/src/plugins/nim/project/nimproject.cpp +++ b/src/plugins/nim/project/nimproject.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -73,11 +74,6 @@ QString NimProject::displayName() const return projectFilePath().toFileInfo().completeBaseName(); } -QStringList NimProject::files(FilesMode) const -{ - return m_files; -} - bool NimProject::needsConfiguration() const { return targets().empty(); @@ -133,7 +129,7 @@ void NimProject::collectProjectFiles() void NimProject::updateProject() { - QStringList oldFiles = m_files; + const QStringList oldFiles = m_files; m_files.clear(); QList fileNodes = Utils::filtered(m_futureWatcher.future().result(), @@ -158,9 +154,6 @@ void NimProject::updateProject() newRoot->setDisplayName(displayName()); newRoot->addNestedNodes(fileNodes); setRootProjectNode(newRoot); - - emit fileListChanged(); - emit parsingFinished(); } @@ -182,12 +175,10 @@ bool NimProject::supportsKit(Kit *k, QString *errorMessage) const FileNameList NimProject::nimFiles() const { - FileNameList result; - rootProjectNode()->forEachNode([&](FileNode *file) { - if (file->displayName().endsWith(QLatin1String(".nim"))) - result.append(file->filePath()); + const QStringList nim = files(AllFiles, [](const ProjectExplorer::FileNode *fn) { + return fn->filePath().endsWith(".nim"); }); - return result; + return Utils::transform(nim, [](const QString &fp) { return Utils::FileName::fromString(fp); }); } QVariantMap NimProject::toMap() const @@ -203,4 +194,4 @@ Project::RestoreResult NimProject::fromMap(const QVariantMap &map, QString *erro return Project::fromMap(map, errorMessage); } -} +} // namespace Nim diff --git a/src/plugins/nim/project/nimproject.h b/src/plugins/nim/project/nimproject.h index 7ea82a0c81c..5072ce478d8 100644 --- a/src/plugins/nim/project/nimproject.h +++ b/src/plugins/nim/project/nimproject.h @@ -42,7 +42,6 @@ public: explicit NimProject(const Utils::FileName &fileName); QString displayName() const override; - QStringList files(FilesMode) const override; bool needsConfiguration() const override; bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const override; Utils::FileNameList nimFiles() const; diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 6b092b676a1..1549c51795c 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -476,6 +476,7 @@ void Project::setRootProjectNode(ProjectNode *root) if (root) root->setParentFolderNode(&d->m_containerNode); ProjectTree::emitSubtreeChanged(root); + emit fileListChanged(); delete oldNode; } @@ -524,6 +525,25 @@ Project::RestoreResult Project::restoreSettings(QString *errorMessage) return result; } +QStringList Project::files(Project::FilesMode fileMode, + const std::function &filter) const +{ + QStringList result; + + if (!rootProjectNode()) + return result; + + rootProjectNode()->forEachNode([&](const FileNode *fn) { + if (filter && !filter(fn)) + return; + if ((fileMode == AllFiles) + || (fileMode == SourceFiles && !fn->isGenerated()) + || (fileMode == GeneratedFiles && fn->isGenerated())) + result.append(fn->filePath().toString()); + }); + return result; +} + /*! Serializes all data into a QVariantMap. diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 3c7623cfcdf..daed9e5afc9 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -36,6 +36,8 @@ #include #include +#include + namespace Core { class IDocument; class Context; @@ -47,6 +49,7 @@ namespace ProjectExplorer { class BuildInfo; class EditorConfiguration; +class FileNode; class NamedWidget; class ProjectImporter; class ProjectNode; @@ -112,7 +115,8 @@ public: GeneratedFiles = 0x2, AllFiles = SourceFiles | GeneratedFiles }; - virtual QStringList files(FilesMode fileMode) const = 0; + virtual QStringList files(FilesMode fileMode, + const std::function &filter = {}) const; virtual QStringList filesGeneratedFrom(const QString &sourceFile) const; static QString makeUnique(const QString &preferredName, const QStringList &usedNames); diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp index 08f2ffc95aa..967c5f58a61 100644 --- a/src/plugins/pythoneditor/pythoneditorplugin.cpp +++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp @@ -96,9 +96,6 @@ public: QString displayName() const override; - QStringList files(FilesMode) const override { return m_files; } - QStringList files() const { return m_files; } - bool addFiles(const QStringList &filePaths); bool removeFiles(const QStringList &filePaths); bool setFiles(const QStringList &filePaths); @@ -356,7 +353,7 @@ public: PythonProject *project = static_cast(parent->project()); QList allIds; - foreach (const QString &file, project->files()) + foreach (const QString &file, project->files(ProjectExplorer::Project::AllFiles)) allIds.append(idFromScript(file)); return allIds; } @@ -371,7 +368,7 @@ public: if (!canHandle(parent)) return false; PythonProject *project = static_cast(parent->project()); - return project->files().contains(scriptFromId(id)); + return project->files(ProjectExplorer::Project::AllFiles).contains(scriptFromId(id)); } bool canRestore(Target *parent, const QVariantMap &map) const override @@ -533,7 +530,6 @@ void PythonProject::parseProject() m_rawFileList = readLines(projectFilePath().toString()); m_rawFileList << projectFilePath().fileName(); m_files = processEntries(m_rawFileList, &m_rawListEntries); - emit fileListChanged(); } /** diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index ec047b86390..56c326896ea 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -175,58 +175,6 @@ void QbsProject::projectLoaded() m_parsingDelay.start(0); } -static void collectFilesForProject(const qbs::ProjectData &project, Project::FilesMode mode, - QSet &result) -{ - if (mode & Project::SourceFiles) - result.insert(project.location().filePath()); - - foreach (const qbs::ProductData &prd, project.products()) { - if (mode & Project::SourceFiles) { - foreach (const qbs::GroupData &grp, prd.groups()) { - foreach (const QString &file, grp.allFilePaths()) - result.insert(file); - result.insert(grp.location().filePath()); - } - result.insert(prd.location().filePath()); - } - if (mode & Project::GeneratedFiles) { - foreach (const qbs::ProductData &prd, project.products()) { - foreach (const qbs::ArtifactData &artifact, prd.generatedArtifacts()) { - // A list of human-readable file types that we can reasonably expect - // to get generated during a build. Extend as needed. - static const QSet sourceTags = { - QLatin1String("c"), QLatin1String("cpp"), QLatin1String("hpp"), - QLatin1String("objc"), QLatin1String("objcpp"), - QLatin1String("c_pch_src"), QLatin1String("cpp_pch_src"), - QLatin1String("objc_pch_src"), QLatin1String("objcpp_pch_src"), - QLatin1String("asm"), QLatin1String("asm_cpp"), - QLatin1String("linkerscript"), - QLatin1String("qrc"), QLatin1String("java.java") - }; - if (artifact.fileTags().toSet().intersects(sourceTags)) - result.insert(artifact.filePath()); - } - } - } - } - - foreach (const qbs::ProjectData &subProject, project.subProjects()) - collectFilesForProject(subProject, mode, result); -} - -QStringList QbsProject::files(Project::FilesMode fileMode) const -{ - qCDebug(qbsPmLog) << Q_FUNC_INFO << fileMode << m_qbsProject.isValid() << isParsing(); - if (!m_qbsProject.isValid() || isParsing()) - return QStringList(); - QSet result; - collectFilesForProject(m_projectData, fileMode, result); - result.unite(m_qbsProject.buildSystemFiles()); - qCDebug(qbsPmLog) << "file count:" << result.count(); - return result.toList(); -} - QStringList QbsProject::filesGeneratedFrom(const QString &sourceFile) const { QStringList generated; @@ -312,7 +260,6 @@ bool QbsProject::addFilesToProduct(const QStringList &filePaths, if (notAdded->count() != filePaths.count()) { m_projectData = m_qbsProject.projectData(); setRootProjectNode(Internal::QbsNodeTreeBuilder::buildTree(this)); - emit fileListChanged(); } return notAdded->isEmpty(); } diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index c2d7c1df235..dd24093e421 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -64,7 +64,6 @@ public: QString displayName() const override; QbsRootProjectNode *rootProjectNode() const override; - QStringList files(FilesMode fileMode) const override; QStringList filesGeneratedFrom(const QString &sourceFile) const override; bool isProjectEditable() const; diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index a3c504e17f8..0d76e07cdb4 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -191,7 +191,6 @@ static QList s_projects; */ QmakeProject::QmakeProject(const FileName &fileName) : - m_projectFiles(new QmakeProjectFiles), m_qmakeVfs(new QMakeVfs), m_cppCodeModelUpdater(new CppTools::CppProjectUpdater(this)) { @@ -230,7 +229,6 @@ QmakeProject::~QmakeProject() setRootProjectNode(nullptr); m_rootProFile.reset(); - delete m_projectFiles; m_cancelEvaluate = true; Q_ASSERT(m_qmakeGlobalsRefCnt == 0); delete m_qmakeVfs; @@ -241,32 +239,6 @@ QmakeProFile *QmakeProject::rootProFile() const return m_rootProFile.get(); } -void QmakeProject::updateFileList() -{ - QmakeProjectFiles files; - rootProjectNode()->forEachNode([&](FileNode *fileNode) { - const int type = static_cast(fileNode->fileType()); - QStringList &targetList = fileNode->isGenerated() ? files.generatedFiles[type] : files.files[type]; - targetList.push_back(fileNode->filePath().toString()); - }, [&](FolderNode *folderNode) { - if (ProjectNode *projectNode = folderNode->asProjectNode()) - files.proFiles.append(projectNode->filePath().toString()); - if (dynamic_cast(folderNode)) - files.files[static_cast(FileType::Resource)].push_back(folderNode->filePath().toString()); - }); - - for (QStringList &f : files.files) - f.removeDuplicates(); - for (QStringList &f : files.generatedFiles) - f.removeDuplicates(); - files.proFiles.removeDuplicates(); - - if (files != *m_projectFiles) { - *m_projectFiles = files; - emit fileListChanged(); - } -} - Project::RestoreResult QmakeProject::fromMap(const QVariantMap &map, QString *errorMessage) { RestoreResult result = Project::fromMap(map, errorMessage); @@ -576,7 +548,6 @@ void QmakeProject::decrementPendingEvaluateFutures() setAllBuildConfigurationsEnabled(true); m_asyncUpdateState = Base; - updateFileList(); updateCodeModels(); updateBuildSystemData(); if (activeTarget()) @@ -639,21 +610,6 @@ QString QmakeProject::displayName() const return projectFilePath().toFileInfo().completeBaseName(); } -QStringList QmakeProject::files(FilesMode fileMode) const -{ - QStringList files; - for (int i = 0; i < static_cast(FileType::FileTypeSize); ++i) { - if (fileMode & SourceFiles) - files += m_projectFiles->files[i]; - if (fileMode & GeneratedFiles) - files += m_projectFiles->generatedFiles[i]; - } - - files.removeDuplicates(); - - return files; -} - // Find the folder that contains a file with a certain name (recurse down) static FolderNode *folderOf(FolderNode *in, const FileName &fileName) { @@ -1086,10 +1042,8 @@ void CentralizedFolderWatcher::delayedFolderChanged(const QString &folder) m_recursiveWatchedFolders += tmp; } - if (newOrRemovedFiles) { - m_project->updateFileList(); + if (newOrRemovedFiles) m_project->updateCodeModels(); - } } bool QmakeProject::needsConfiguration() const diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h index fb96fbc2663..2f4fb8a427b 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.h +++ b/src/plugins/qmakeprojectmanager/qmakeproject.h @@ -73,7 +73,6 @@ public: bool validParse(const Utils::FileName &proFilePath) const; bool parseInProgress(const Utils::FileName &proFilePath) const; - virtual QStringList files(FilesMode fileMode) const final; virtual QStringList filesGeneratedFrom(const QString &file) const final; enum Parsing {ExactParse, ExactAndCumulativeParse }; @@ -109,8 +108,6 @@ public: /// \internal bool wasEvaluateCanceled(); - // For QmakeProFileNode after a on disk change - void updateFileList(); void updateCodeModels(); void watchFolders(const QStringList &l, QmakePriFile *file); @@ -188,9 +185,6 @@ private: std::unique_ptr m_rootProFile; - // cached lists of all of files - Internal::QmakeProjectFiles *m_projectFiles = nullptr; - QMakeVfs *m_qmakeVfs = nullptr; // cached data during project rescan diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index bb88cc898eb..43fbe6ab561 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -168,9 +168,6 @@ void QmlProject::parseProject(RefreshOptions options) if (options & Configuration) { // update configuration } - - if (options & Files) - emit fileListChanged(); } void QmlProject::refresh(RefreshOptions options) @@ -195,16 +192,6 @@ void QmlProject::refresh(RefreshOptions options) emit parsingFinished(); } -QStringList QmlProject::files() const -{ - QStringList files; - if (m_projectItem) - files = m_projectItem.data()->files(); - else - files = m_files; - return files; -} - QString QmlProject::mainFile() const { if (m_projectItem) @@ -296,11 +283,6 @@ Internal::QmlProjectNode *QmlProject::rootProjectNode() const return static_cast(Project::rootProjectNode()); } -QStringList QmlProject::files(FilesMode) const -{ - return files(); -} - Project::RestoreResult QmlProject::fromMap(const QVariantMap &map, QString *errorMessage) { RestoreResult result = Project::fromMap(map, errorMessage); @@ -371,9 +353,12 @@ Project::RestoreResult QmlProject::fromMap(const QVariantMap &map, QString *erro void QmlProject::generateProjectTree() { + if (!m_projectItem) + return; + auto newRoot = new Internal::QmlProjectNode(this); - for (const QString &f : files()) { + for (const QString &f : m_projectItem.data()->files()) { FileType fileType = FileType::Source; // ### FIXME if (f == projectFilePath().toString()) fileType = FileType::Project; diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index c8900b6ebe1..616c2c6d18f 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -51,7 +51,6 @@ public: bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const override; Internal::QmlProjectNode *rootProjectNode() const override; - QStringList files(FilesMode fileMode) const override; bool validProjectFile() const; @@ -66,7 +65,6 @@ public: void refresh(RefreshOptions options); QDir projectDir() const; - QStringList files() const; QString mainFile() const; QStringList customImportPaths() const; @@ -92,10 +90,7 @@ private: void parseProject(RefreshOptions options); QmlImport m_defaultImport; - ProjectExplorer::Target *m_activeTarget = 0; - - // plain format - QStringList m_files; + ProjectExplorer::Target *m_activeTarget = nullptr; QPointer m_projectItem; }; From d2c3cff407bd035e525c8b772cc9993d5e1cf015 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 26 Mar 2017 20:11:50 +0300 Subject: [PATCH 87/92] QmlDesigner: Re-add core-private also in qbs build Change-Id: I197a4caafe984326778b6613957bbd3d327680d9 Reviewed-by: Christian Kandeler --- src/plugins/qmldesigner/qmldesignerplugin.qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index d85d0c4594a..828142b47f3 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -12,7 +12,7 @@ Project { Depends { name: "Qt"; submodules: [ - "quickwidgets" + "core-private", "quickwidgets" ] } Depends { name: "Core" } From a65ce0fe5b53d99225e3ac75bec556536efe1198 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 27 Mar 2017 12:08:30 +0200 Subject: [PATCH 88/92] CMakePM: Fix assignment of build system target Additionally rename formerly used variable to better express what it is for. Change-Id: I6ecf6a5ac30bc411b41a1de3629a27f8882a0a28 Reviewed-by: Tobias Hunger --- .../cmakeprojectmanager/cmakerunconfiguration.cpp | 14 ++++++++------ .../cmakeprojectmanager/cmakerunconfiguration.h | 5 +++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index ea018e11269..1205953c8b1 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -62,7 +62,8 @@ const char TITLE_KEY[] = "CMakeProjectManager.CMakeRunConfiguation.Title"; CMakeRunConfiguration::CMakeRunConfiguration(Target *parent, Core::Id id, const QString &target, const Utils::FileName &workingDirectory, const QString &title) : RunConfiguration(parent, id), - m_buildTarget(target), + m_buildSystemTarget(target), + m_executable(target), m_title(title) { addExtraAspect(new LocalEnvironmentAspect(this, LocalEnvironmentAspect::BaseEnvironmentModifier())); @@ -78,7 +79,8 @@ CMakeRunConfiguration::CMakeRunConfiguration(Target *parent, Core::Id id, const CMakeRunConfiguration::CMakeRunConfiguration(Target *parent, CMakeRunConfiguration *source) : RunConfiguration(parent, source), - m_buildTarget(source->m_buildTarget), + m_buildSystemTarget(source->m_buildSystemTarget), + m_executable(source->m_executable), m_title(source->m_title), m_enabled(source->m_enabled) { @@ -93,7 +95,7 @@ void CMakeRunConfiguration::ctor() Runnable CMakeRunConfiguration::runnable() const { StandardRunnable r; - r.executable = m_buildTarget; + r.executable = m_executable; r.commandLineArguments = extraAspect()->arguments(); r.workingDirectory = extraAspect()->workingDirectory().toString(); r.environment = extraAspect()->environment(); @@ -103,9 +105,9 @@ Runnable CMakeRunConfiguration::runnable() const QString CMakeRunConfiguration::baseWorkingDirectory() const { - const QString exe = m_buildTarget; + const QString exe = m_executable; if (!exe.isEmpty()) - return QFileInfo(m_buildTarget).absolutePath(); + return QFileInfo(m_executable).absolutePath(); return QString(); } @@ -116,7 +118,7 @@ QString CMakeRunConfiguration::title() const void CMakeRunConfiguration::setExecutable(const QString &executable) { - m_buildTarget = executable; + m_executable = executable; } void CMakeRunConfiguration::setBaseWorkingDirectory(const Utils::FileName &wd) diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h index b89c23ffc49..02ed4df6078 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h @@ -56,7 +56,7 @@ public: bool isEnabled() const override; QString disabledReason() const override; - QString buildSystemTarget() const final { return m_buildTarget; } + QString buildSystemTarget() const final { return m_buildSystemTarget; } protected: CMakeRunConfiguration(ProjectExplorer::Target *parent, CMakeRunConfiguration *source); @@ -67,7 +67,8 @@ private: QString baseWorkingDirectory() const; void ctor(); - QString m_buildTarget; + const QString m_buildSystemTarget; + QString m_executable; QString m_title; bool m_enabled = true; }; From 124efb32f5526f6e5391558897eee802ea9b8748 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 1 Feb 2017 15:42:55 +0100 Subject: [PATCH 89/92] AutoTest: Re-do completeTestInformation() Use information provided by the codemodel and the run configurations as much as possible to avoid guessing. This also fixes running CMake based tests from within the AutoTest plugin. Task-number: QTCREATORBUG-17882 Change-Id: I5639fa947fa602b76faf50e9b58d7a74af4e1f9c Reviewed-by: Tobias Hunger --- src/plugins/autotest/gtest/gtesttreeitem.cpp | 7 - src/plugins/autotest/qtest/qttesttreeitem.cpp | 11 -- src/plugins/autotest/testconfiguration.cpp | 166 ++++++------------ 3 files changed, 58 insertions(+), 126 deletions(-) diff --git a/src/plugins/autotest/gtest/gtesttreeitem.cpp b/src/plugins/autotest/gtest/gtesttreeitem.cpp index 06db3c0cda3..540f7c6679d 100644 --- a/src/plugins/autotest/gtest/gtesttreeitem.cpp +++ b/src/plugins/autotest/gtest/gtesttreeitem.cpp @@ -88,9 +88,6 @@ TestConfiguration *GTestTreeItem::testConfiguration() const config->setTestCaseCount(count); config->setProjectFile(proFile()); config->setProject(project); - // item has no filePath set - so take it of the first children - config->setDisplayName( - TestUtils::getCMakeDisplayNameIfNecessary(childItem(0)->filePath(), proFile())); } break; } @@ -103,8 +100,6 @@ TestConfiguration *GTestTreeItem::testConfiguration() const config->setTestCases(QStringList(testSpecifier)); config->setProjectFile(proFile()); config->setProject(project); - config->setDisplayName( - TestUtils::getCMakeDisplayNameIfNecessary(filePath(), parent->proFile())); break; } default: @@ -179,7 +174,6 @@ QList GTestTreeItem::getAllTestConfigurations() const GTestConfiguration *tc = new GTestConfiguration; tc->setTestCaseCount(it.value()); tc->setProjectFile(key.proFile); - tc->setDisplayName(key.displayName); tc->setProject(project); result << tc; } @@ -244,7 +238,6 @@ QList GTestTreeItem::getSelectedTestConfigurations() const tc->setTestCases(it.value().filters); tc->setTestCaseCount(tc->testCaseCount() + it.value().additionalTestCaseCount); tc->setProjectFile(proFileWithDisplayName.proFile); - tc->setDisplayName(proFileWithDisplayName.displayName); tc->setProject(project); result << tc; } diff --git a/src/plugins/autotest/qtest/qttesttreeitem.cpp b/src/plugins/autotest/qtest/qttesttreeitem.cpp index b4d226253a7..9236b796313 100644 --- a/src/plugins/autotest/qtest/qttesttreeitem.cpp +++ b/src/plugins/autotest/qtest/qttesttreeitem.cpp @@ -111,7 +111,6 @@ TestConfiguration *QtTestTreeItem::testConfiguration() const config->setTestCaseCount(childCount()); config->setProjectFile(proFile()); config->setProject(project); - config->setDisplayName(TestUtils::getCMakeDisplayNameIfNecessary(filePath(), proFile())); break; case TestFunctionOrSet: { TestTreeItem *parent = parentItem(); @@ -119,8 +118,6 @@ TestConfiguration *QtTestTreeItem::testConfiguration() const config->setTestCases(QStringList(name())); config->setProjectFile(parent->proFile()); config->setProject(project); - config->setDisplayName( - TestUtils::getCMakeDisplayNameIfNecessary(filePath(), parent->proFile())); break; } case TestDataTag: { @@ -133,8 +130,6 @@ TestConfiguration *QtTestTreeItem::testConfiguration() const config->setTestCases(QStringList(functionWithTag)); config->setProjectFile(parent->proFile()); config->setProject(project); - config->setDisplayName(TestUtils::getCMakeDisplayNameIfNecessary(filePath(), - parent->proFile())); break; } default: @@ -166,8 +161,6 @@ QList QtTestTreeItem::getAllTestConfigurations() const tc->setTestCaseCount(child->childCount()); tc->setProjectFile(child->proFile()); tc->setProject(project); - tc->setDisplayName(TestUtils::getCMakeDisplayNameIfNecessary(child->filePath(), - child->proFile())); result << tc; } return result; @@ -193,8 +186,6 @@ QList QtTestTreeItem::getSelectedTestConfigurations() const testConfiguration->setTestCaseCount(child->childCount()); testConfiguration->setProjectFile(child->proFile()); testConfiguration->setProject(project); - testConfiguration->setDisplayName( - TestUtils::getCMakeDisplayNameIfNecessary(child->filePath(), child->proFile())); result << testConfiguration; continue; case Qt::PartiallyChecked: @@ -220,8 +211,6 @@ QList QtTestTreeItem::getSelectedTestConfigurations() const testConfiguration->setTestCases(testCases); testConfiguration->setProjectFile(child->proFile()); testConfiguration->setProject(project); - testConfiguration->setDisplayName( - TestUtils::getCMakeDisplayNameIfNecessary(child->filePath(), child->proFile())); result << testConfiguration; } } diff --git a/src/plugins/autotest/testconfiguration.cpp b/src/plugins/autotest/testconfiguration.cpp index c5d0c8d86a0..6b1b7101701 100644 --- a/src/plugins/autotest/testconfiguration.cpp +++ b/src/plugins/autotest/testconfiguration.cpp @@ -54,30 +54,6 @@ TestConfiguration::~TestConfiguration() m_testCases.clear(); } -void completeBasicProjectInformation(Project *project, const QString &proFile, QString *displayName, - Project **targetProject) -{ - CppTools::CppModelManager *cppMM = CppTools::CppModelManager::instance(); - QVector projParts = cppMM->projectInfo(project).projectParts(); - - if (displayName->isEmpty()) { - foreach (const CppTools::ProjectPart::Ptr &part, projParts) { - if (part->projectFile == proFile) { - *displayName = part->displayName; - *targetProject = part->project; - return; - } - } - } else { // for CMake based projects we've got the displayname already - foreach (const CppTools::ProjectPart::Ptr &part, projParts) { - if (part->displayName == *displayName) { - *targetProject = part->project; - return; - } - } - } -} - static bool isLocal(RunConfiguration *runConfiguration) { Target *target = runConfiguration ? runConfiguration->target() : 0; @@ -93,106 +69,80 @@ void TestConfiguration::completeTestInformation(int runMode) if (!project) return; - QString executable; - QString targetName; - QString workDir; - QString displayName = m_displayName; - QString buildDir; - Project *targetProject = 0; - Utils::Environment env; - Target *runConfigTarget = 0; - bool hasDesktopTarget = false; - bool guessedRunConfiguration = false; - setProject(0); - - completeBasicProjectInformation(project, m_projectFile, &displayName, &targetProject); - Target *target = project->activeTarget(); if (!target) return; - BuildTargetInfoList appTargets = target->applicationTargets(); - if (m_displayName.isEmpty()) { - foreach (const BuildTargetInfo &bti, appTargets.list) { - // some project manager store line/column information as well inside ProjectPart - if (bti.isValid() && m_projectFile.startsWith(bti.projectFilePath.toString())) { - executable = bti.targetFilePath.toString(); - if (Utils::HostOsInfo::isWindowsHost() && !executable.toLower().endsWith(".exe")) - executable = Utils::HostOsInfo::withExecutableSuffix(executable); - targetName = bti.targetName; - break; - } - } - } else { // CMake based projects have no specific pro file, but target name matches displayname - foreach (const BuildTargetInfo &bti, appTargets.list) { - if (bti.isValid() && m_displayName == bti.targetName) { - // for CMake base projects targetFilePath has executable suffix already - executable = bti.targetFilePath.toString(); - targetName = m_displayName; - break; - } - } - } + const auto cppMM = CppTools::CppModelManager::instance(); + const QVector projectParts = cppMM->projectInfo(project).projectParts(); + const QVector relevantParts + = Utils::filtered(projectParts, [this] (const CppTools::ProjectPart::Ptr &part) { + return part->selectedForBuilding && part->projectFile == m_projectFile; + }); + const QSet buildSystemTargets + = Utils::transform(relevantParts, [] (const CppTools::ProjectPart::Ptr &part) { + return part->buildSystemTarget; + }); - if (targetProject) { - if (auto buildConfig = target->activeBuildConfiguration()) { - const QString buildBase = buildConfig->buildDirectory().toString(); - const QString projBase = targetProject->projectDirectory().toString(); - if (m_projectFile.startsWith(projBase)) - buildDir = QFileInfo(buildBase + m_projectFile.mid(projBase.length())).absolutePath(); - } - } + const BuildTargetInfo targetInfo + = Utils::findOrDefault(target->applicationTargets().list, [&buildSystemTargets] (const BuildTargetInfo &bti) { + return buildSystemTargets.contains(bti.targetName); + }); + const Utils::FileName executable = targetInfo.targetFilePath; // empty if BTI is default created + for (RunConfiguration *runConfig : target->runConfigurations()) { + if (!isLocal(runConfig)) // TODO add device support + continue; - QList rcs = target->runConfigurations(); - foreach (RunConfiguration *rc, rcs) { - Runnable runnable = rc->runnable(); - if (isLocal(rc) && runnable.is()) { + if (buildSystemTargets.contains(runConfig->buildSystemTarget())) { + Runnable runnable = runConfig->runnable(); + if (!runnable.is()) + continue; StandardRunnable stdRunnable = runnable.as(); - // we might have an executable that gets installed - in such a case the - // runnable's executable and executable won't match - but the (unique) display name - // of the run configuration should match targetName - if (stdRunnable.executable == executable - || (!targetName.isEmpty() && rc->displayName() == targetName)) { - executable = stdRunnable.executable; - workDir = Utils::FileUtils::normalizePathName(stdRunnable.workingDirectory); - env = stdRunnable.environment; - hasDesktopTarget = true; - runConfigTarget = rc->target(); - break; - } + // TODO this might pick up the wrong executable + m_executableFile = stdRunnable.executable; + m_displayName = runConfig->displayName(); + m_workingDir = Utils::FileUtils::normalizePathName(stdRunnable.workingDirectory); + m_environment = stdRunnable.environment; + m_project = project; + if (runMode == TestRunner::Debug) + m_runConfig = new TestRunConfiguration(runConfig->target(), this); + break; } } - - // if we could not figure out the run configuration - // try to use the run configuration of the parent project - if (!hasDesktopTarget && targetProject && !executable.isEmpty()) { + // RunConfiguration for this target could be explicitly removed or not created at all + if (m_displayName.isEmpty() && !executable.isEmpty()) { + // we failed to find a valid runconfiguration - but we've got the executable already if (auto rc = target->activeRunConfiguration()) { - Runnable runnable = rc->runnable(); - if (isLocal(rc) && runnable.is()) { - StandardRunnable stdRunnable = runnable.as(); - workDir = Utils::FileUtils::normalizePathName(stdRunnable.workingDirectory); - env = stdRunnable.environment; - hasDesktopTarget = true; - guessedRunConfiguration = true; - runConfigTarget = rc->target(); + if (isLocal(rc)) { // FIXME for now only Desktop support + Runnable runnable = rc->runnable(); + if (runnable.is()) { + StandardRunnable stdRunnable = runnable.as(); + m_environment = stdRunnable.environment; + // when guessing we might have no extension + const QString &exeString = executable.toString(); + if (Utils::HostOsInfo::isWindowsHost() && !exeString.toLower().endsWith(".exe")) + m_executableFile = Utils::HostOsInfo::withExecutableSuffix(exeString); + else + m_executableFile = exeString; + m_project = project; + m_guessedConfiguration = true; + if (runMode == TestRunner::Debug) + m_runConfig = new TestRunConfiguration(rc->target(), this); + } } } } - setDisplayName(displayName); - - if (hasDesktopTarget) { - setExecutableFile(executable); - setWorkingDirectory(workDir); - setBuildDirectory(buildDir); - setEnvironment(env); - setProject(project); - setGuessedConfiguration(guessedRunConfiguration); - if (runMode == TestRunner::Debug) - m_runConfig = new TestRunConfiguration(runConfigTarget, this); + if (auto buildConfig = target->activeBuildConfiguration()) { + const QString buildBase = buildConfig->buildDirectory().toString(); + const QString projBase = project->projectDirectory().toString(); + if (m_projectFile.startsWith(projBase)) + m_buildDir = QFileInfo(buildBase + m_projectFile.mid(projBase.length())).absolutePath(); } -} + if (m_displayName.isEmpty()) // happens e.g. when guessing the TestConfiguration or error + m_displayName = buildSystemTargets.isEmpty() ? "unknown" : *buildSystemTargets.begin(); +} /** * @brief sets the test cases for this test configuration. From 0a3efc042df1538c30e840b33641d00cb2f724da Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 14 Mar 2017 09:16:01 +0100 Subject: [PATCH 90/92] AutoTest: Fix warning for guessed configs The check whether to emit a warning regarding guessed configurations must get evaluated after the configuration has been completed otherwise the guessed flag would be always false. Change-Id: I20e6dcdfff5110d4d9128ffcc97cba1a70f44fe9 Reviewed-by: David Schulz --- src/plugins/autotest/testrunner.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp index 2e579e7dfa9..acb59683f26 100644 --- a/src/plugins/autotest/testrunner.cpp +++ b/src/plugins/autotest/testrunner.cpp @@ -100,12 +100,19 @@ static void performTestRun(QFutureInterface &futureInterface, const TestSettings &settings) { const int timeout = settings.timeout; + const bool omitRunConfigWarnings = settings.omitRunConfigWarn; QEventLoop eventLoop; int testCaseCount = 0; for (TestConfiguration *config : selectedTests) { config->completeTestInformation(TestRunner::Run); if (config->project()) { testCaseCount += config->testCaseCount(); + if (!omitRunConfigWarnings && config->guessedConfiguration()) { + futureInterface.reportResult(TestResultPtr(new FaultyTestResult(Result::MessageWarn, + TestRunner::tr("Project's run configuration was guessed for \"%1\".\n" + "This might cause trouble during execution." + ).arg(config->displayName())))); + } } else { futureInterface.reportResult(TestResultPtr(new FaultyTestResult(Result::MessageWarn, TestRunner::tr("Project is null for \"%1\". Removing from test run.\n" @@ -196,22 +203,12 @@ void TestRunner::prepareToRunTests(Mode mode) return; } - const bool omitRunConfigWarnings = AutotestPlugin::instance()->settings()->omitRunConfigWarn; - m_executingTests = true; emit testRunStarted(); // clear old log and output pane TestResultsPane::instance()->clearContents(); - for (TestConfiguration *config : m_selectedTests) { - if (!omitRunConfigWarnings && config->guessedConfiguration()) { - emit testResultReady(TestResultPtr(new FaultyTestResult(Result::MessageWarn, - tr("Project's run configuration was guessed for \"%1\".\n" - "This might cause trouble during execution.").arg(config->displayName())))); - } - } - if (m_selectedTests.empty()) { emit testResultReady(TestResultPtr(new FaultyTestResult(Result::MessageWarn, tr("No tests selected. Canceling test run.")))); From 7f5b37ed14d88df59972682eb6f9a7e76712bda2 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 27 Mar 2017 13:42:53 +0200 Subject: [PATCH 91/92] Debugger: Disable QObject property dumper test on Windows Change-Id: Iff91a41aae9328c6e935480c5cfc2fe3643ca743 Reviewed-by: hjk --- tests/auto/debugger/tst_dumpers.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index eba1907fa84..b7b2f6057bd 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -2680,12 +2680,14 @@ void tst_Dumpers::dumper_data() + Check("s", "\"HelloWorld\"", "@QString") + Check("test", "\"Name\"", "Bar::TestObject") + Check("test.[properties]", "<6 items>", "") +#ifndef Q_OS_WIN + Check("test.[properties].myProp1", - "\"Hello\"", "@QVariant (QString)") % NoCdbEngine + "\"Hello\"", "@QVariant (QString)") + Check("test.[properties].myProp2", - "\"World\"", "@QVariant (QByteArray)") % NoCdbEngine - + Check("test.[properties].myProp3", "54", "@QVariant (long)") % NoCdbEngine - + Check("test.[properties].myProp4", "44", "@QVariant (int)") % NoCdbEngine + "\"World\"", "@QVariant (QByteArray)") + + Check("test.[properties].myProp3", "54", "@QVariant (long)") + + Check("test.[properties].myProp4", "44", "@QVariant (int)") +#endif + Check("test.[properties].4", "\"New\"", "\"Stuff\"", "@QVariant (QByteArray)") + Check("test.[properties].5", "\"Old\"", From 2ee79677505668853f3271cd0a30b1700e34d512 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 27 Mar 2017 17:51:19 +0200 Subject: [PATCH 92/92] ProjectExplorer: Fix enabling state of main project nodes Since the rootProjectNode() containing the parsed files is now nested under a new project node the main node needs to delegate enable/disable decisions. Task-number: QTCREATORBUG-17922 Change-Id: Ie7bb6d6802072a2127b32c0fe51fb25fc1c9c6cc Reviewed-by: Eike Ziller --- src/plugins/projectexplorer/project.cpp | 34 +---------------- src/plugins/projectexplorer/project.h | 3 +- .../projectexplorer/projectexplorer.cpp | 8 +++- src/plugins/projectexplorer/projectnodes.cpp | 37 ++++++++++++++++++- src/plugins/projectexplorer/projectnodes.h | 28 +++++++++++++- src/plugins/projectexplorer/projecttree.cpp | 6 ++- .../qmakeprojectmanagerplugin.cpp | 6 ++- 7 files changed, 79 insertions(+), 43 deletions(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 1549c51795c..cf01c42801e 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -84,38 +84,6 @@ const char PLUGIN_SETTINGS_KEY[] = "ProjectExplorer.Project.PluginSettings"; namespace ProjectExplorer { -class ContainerNode : public ProjectNode -{ -public: - ContainerNode(Project *project) - : ProjectNode(Utils::FileName()), - m_project(project) - {} - - QString displayName() const final - { - QString name = m_project->displayName(); - - const QFileInfo fi = m_project->projectFilePath().toFileInfo(); - const QString dir = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath(); - if (Core::IVersionControl *vc = Core::VcsManager::findVersionControlForDirectory(dir)) { - QString vcsTopic = vc->vcsTopic(dir); - if (!vcsTopic.isEmpty()) - name += " [" + vcsTopic + ']'; - } - - return name; - } - - QList supportedActions(Node *) const final - { - return {}; - } - -private: - Project *m_project; -}; - // ------------------------------------------------------------------------- // Project // ------------------------------------------------------------------------- @@ -601,7 +569,7 @@ ProjectNode *Project::rootProjectNode() const return d->m_rootProjectNode; } -ProjectNode *Project::containerNode() const +ContainerNode *Project::containerNode() const { return &d->m_containerNode; } diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index daed9e5afc9..f5f5fc49fd3 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -48,6 +48,7 @@ namespace Utils { class MacroExpander; } namespace ProjectExplorer { class BuildInfo; +class ContainerNode; class EditorConfiguration; class FileNode; class NamedWidget; @@ -84,7 +85,7 @@ public: static Utils::FileName projectDirectory(const Utils::FileName &top); virtual ProjectNode *rootProjectNode() const; - ProjectNode *containerNode() const; + ContainerNode *containerNode() const; bool hasActiveBuildSettings() const; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index ac1f308e5c2..2bbb0e50372 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -2913,7 +2913,13 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions() if (currentNode && currentNode->managingProject()) { QList actions = currentNode->supportedActions(currentNode); - if (ProjectNode *pn = currentNode->asProjectNode()) { + ProjectNode *pn; + if (ContainerNode *cn = currentNode->asContainerNode()) + pn = cn->rootProjectNode(); + else + pn = currentNode->asProjectNode(); + + if (pn) { if (ProjectTree::currentProject() && pn == ProjectTree::currentProject()->rootProjectNode()) { m_runActionContextMenu->setVisible(true); } else { diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 7d275d2eac3..f3fa5565b9d 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -25,6 +25,7 @@ #include "projectnodes.h" +#include "project.h" #include "projectexplorerconstants.h" #include "projecttree.h" @@ -171,8 +172,9 @@ FolderNode *Node::parentFolderNode() const ProjectNode *Node::managingProject() { - if (!m_parentFolderNode) - return nullptr; + if (asContainerNode()) + return asContainerNode()->rootProjectNode(); + QTC_ASSERT(m_parentFolderNode, return nullptr); ProjectNode *pn = parentProjectNode(); return pn ? pn : asProjectNode(); // projects manage themselves... } @@ -790,4 +792,35 @@ bool FolderNode::isEmpty() const return m_nodes.isEmpty(); } +ContainerNode::ContainerNode(Project *project) + : FolderNode(Utils::FileName(), NodeType::Project), m_project(project) +{} + +QString ContainerNode::displayName() const +{ + QString name = m_project->displayName(); + + const QFileInfo fi = m_project->projectFilePath().toFileInfo(); + const QString dir = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath(); + if (Core::IVersionControl *vc = Core::VcsManager::findVersionControlForDirectory(dir)) { + QString vcsTopic = vc->vcsTopic(dir); + if (!vcsTopic.isEmpty()) + name += " [" + vcsTopic + ']'; + } + + return name; +} + +QList ContainerNode::supportedActions(Node *node) const +{ + if (Node *rootNode = m_project->rootProjectNode()) + return rootNode->supportedActions(node); + return {}; +} + +ProjectNode *ContainerNode::rootProjectNode() const +{ + return m_project->rootProjectNode(); +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 757529da8b5..4ed5b4eb568 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -39,6 +39,8 @@ namespace Utils { class MimeType; } namespace ProjectExplorer { + +class Project; class RunConfiguration; enum class NodeType : quint16 { @@ -92,6 +94,7 @@ enum ProjectAction { class FileNode; class FolderNode; class ProjectNode; +class ContainerNode; // Documentation inside. class PROJECTEXPLORER_EXPORT Node : public QObject @@ -115,8 +118,9 @@ public: FolderNode *parentFolderNode() const; // parent folder or project ProjectNode *managingProject(); // project managing this node. - // result is nullptr if node is the SessionNode - // or node if node is a ProjectNode directly below SessionNode + // result is the container's rootProject node if this is a project container node + // (i.e. possibly null) + // or node if node is a top-level ProjectNode directly below a container // or node->parentProjectNode() for all other cases. const ProjectNode *managingProject() const; // see above. @@ -137,6 +141,8 @@ public: virtual const FolderNode *asFolderNode() const { return nullptr; } virtual ProjectNode *asProjectNode() { return nullptr; } virtual const ProjectNode *asProjectNode() const { return nullptr; } + virtual ContainerNode *asContainerNode() { return nullptr; } + virtual const ContainerNode *asContainerNode() const { return nullptr; } static bool sortByPath(const Node *a, const Node *b); void setParentFolderNode(FolderNode *parentFolder); @@ -297,6 +303,24 @@ protected: explicit ProjectNode(const Utils::FileName &projectFilePath); }; +class PROJECTEXPLORER_EXPORT ContainerNode : public FolderNode +{ +public: + ContainerNode(Project *project); + + QString displayName() const final; + QList supportedActions(Node *node) const final; + + ContainerNode *asContainerNode() final { return this; } + const ContainerNode *asContainerNode() const final { return this; } + + ProjectNode *rootProjectNode() const; + +private: + Project *m_project; + QList m_nodes; +}; + } // namespace ProjectExplorer Q_DECLARE_METATYPE(ProjectExplorer::Node *) diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index 4c5351beef9..50b8b652566 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -322,12 +322,14 @@ void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &global contextMenu = Core::ActionManager::actionContainer(Constants::M_SESSIONCONTEXT)->menu(); } else { switch (node->nodeType()) { - case NodeType::Project: - if (!node->parentFolderNode()) + case NodeType::Project: { + if ((node->parentFolderNode() && node->parentFolderNode()->asContainerNode()) + || node->asContainerNode()) contextMenu = Core::ActionManager::actionContainer(Constants::M_PROJECTCONTEXT)->menu(); else contextMenu = Core::ActionManager::actionContainer(Constants::M_SUBPROJECTCONTEXT)->menu(); break; + } case NodeType::VirtualFolder: case NodeType::Folder: contextMenu = Core::ActionManager::actionContainer(Constants::M_FOLDERCONTEXT)->menu(); diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp index 9641c289e48..341ef746523 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp @@ -318,9 +318,11 @@ void QmakeProjectManagerPlugin::updateContextActions() { Node *node = ProjectTree::currentNode(); Project *project = ProjectTree::currentProject(); - m_addLibraryActionContextMenu->setEnabled(dynamic_cast(node)); - auto proFileNode = dynamic_cast(node); + ContainerNode *containerNode = node ? node->asContainerNode() : nullptr; + ProjectNode *proFileNode = containerNode ? containerNode->rootProjectNode() : dynamic_cast(node); + + m_addLibraryActionContextMenu->setEnabled(proFileNode); QmakeProject *qmakeProject = qobject_cast(QmakeManager::contextProject()); QmakeProFileNode *subProjectNode = nullptr; if (node) {