summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/config/qtcreator-developer.qdocconf2
-rw-r--r--doc/config/qtcreator-project.qdocconf1
-rw-r--r--doc/doc.pri4
-rw-r--r--doc/doc_targets.pri81
-rw-r--r--doc/images/qtcreator-gerrit-options.pngbin6697 -> 20725 bytes
-rw-r--r--doc/images/qtcreator-gerrit.pngbin135269 -> 172409 bytes
-rw-r--r--doc/src/vcs/creator-vcs-git.qdoc16
-rw-r--r--docs.pri56
-rw-r--r--share/qtcreator/debugger/cdbbridge.py18
-rw-r--r--share/qtcreator/debugger/creatortypes.py4
-rw-r--r--share/qtcreator/debugger/qttypes.py2
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp2
-rw-r--r--share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml6
-rw-r--r--src/libs/qtcreatorcdbext/pyvalue.cpp14
-rw-r--r--src/libs/qtcreatorcdbext/pyvalue.h1
-rw-r--r--src/libs/timeline/qml/MainView.qml5
-rw-r--r--src/libs/timeline/qml/TimelineContent.qml52
-rw-r--r--src/libs/timeline/timelinerenderer.cpp41
-rw-r--r--src/libs/timeline/timelinerenderer_p.h12
-rw-r--r--src/libs/utils/environment.cpp13
-rw-r--r--src/libs/utils/environment.h2
-rw-r--r--src/plugins/android/androidmanager.cpp4
-rw-r--r--src/plugins/autotest/gtest/gtesttreeitem.cpp7
-rw-r--r--src/plugins/autotest/qtest/qttesttreeitem.cpp11
-rw-r--r--src/plugins/autotest/testconfiguration.cpp170
-rw-r--r--src/plugins/autotest/testrunner.cpp17
-rw-r--r--src/plugins/autotoolsprojectmanager/autotoolsproject.cpp6
-rw-r--r--src/plugins/autotoolsprojectmanager/autotoolsproject.h1
-rw-r--r--src/plugins/baremetal/baremetaldevice.cpp6
-rw-r--r--src/plugins/baremetal/baremetaldevice.h1
-rw-r--r--src/plugins/baremetal/gdbserverprovider.cpp2
-rw-r--r--src/plugins/clangcodemodel/clangassistproposal.cpp5
-rw-r--r--src/plugins/clangcodemodel/clangassistproposal.h4
-rw-r--r--src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp28
-rw-r--r--src/plugins/cmakeprojectmanager/builddirmanager.cpp26
-rw-r--r--src/plugins/cmakeprojectmanager/builddirmanager.h2
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.cpp18
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.h1
-rw-r--r--src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp14
-rw-r--r--src/plugins/cmakeprojectmanager/cmakerunconfiguration.h5
-rw-r--r--src/plugins/cmakeprojectmanager/servermodereader.cpp64
-rw-r--r--src/plugins/cmakeprojectmanager/servermodereader.h9
-rw-r--r--src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp9
-rw-r--r--src/plugins/coreplugin/iwelcomepage.cpp5
-rw-r--r--src/plugins/coreplugin/iwelcomepage.h2
-rw-r--r--src/plugins/coreplugin/locator/locatorwidget.cpp21
-rw-r--r--src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp15
-rw-r--r--src/plugins/cpptools/cppcompletionassist.cpp2
-rw-r--r--src/plugins/cpptools/modelmanagertesthelper.h2
-rw-r--r--src/plugins/debugger/cdb/cdbengine.cpp4
-rw-r--r--src/plugins/genericprojectmanager/genericproject.cpp14
-rw-r--r--src/plugins/genericprojectmanager/genericproject.h4
-rw-r--r--src/plugins/genericprojectmanager/genericprojectplugin.cpp3
-rw-r--r--src/plugins/git/branchdialog.cpp4
-rw-r--r--src/plugins/git/branchdialog.h1
-rw-r--r--src/plugins/git/branchmodel.cpp53
-rw-r--r--src/plugins/git/gitsubmitpanel.ui2
-rw-r--r--src/plugins/ios/ios.qbs5
-rw-r--r--src/plugins/ios/iosbuildsettingswidget.h8
-rw-r--r--src/plugins/nim/project/nimproject.cpp21
-rw-r--r--src/plugins/nim/project/nimproject.h1
-rw-r--r--src/plugins/plugins.pro4
-rw-r--r--src/plugins/projectexplorer/abi.cpp2
-rw-r--r--src/plugins/projectexplorer/project.cpp62
-rw-r--r--src/plugins/projectexplorer/project.h10
-rw-r--r--src/plugins/projectexplorer/projectexplorer.cpp263
-rw-r--r--src/plugins/projectexplorer/projectmodels.cpp31
-rw-r--r--src/plugins/projectexplorer/projectmodels.h2
-rw-r--r--src/plugins/projectexplorer/projectnodes.cpp43
-rw-r--r--src/plugins/projectexplorer/projectnodes.h28
-rw-r--r--src/plugins/projectexplorer/projecttree.cpp6
-rw-r--r--src/plugins/projectexplorer/projectwelcomepage.cpp147
-rw-r--r--src/plugins/projectexplorer/projectwelcomepage.h7
-rw-r--r--src/plugins/projectexplorer/sessionmodel.cpp10
-rw-r--r--src/plugins/projectexplorer/sessionmodel.h11
-rw-r--r--src/plugins/pythoneditor/pythoneditorplugin.cpp8
-rw-r--r--src/plugins/qbsprojectmanager/qbsproject.cpp53
-rw-r--r--src/plugins/qbsprojectmanager/qbsproject.h1
-rw-r--r--src/plugins/qmakeprojectmanager/profilecompletionassist.cpp2
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeproject.cpp59
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeproject.h6
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp6
-rw-r--r--src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp11
-rw-r--r--src/plugins/qmakeprojectmanager/wizards/librarywizard.cpp10
-rw-r--r--src/plugins/qmakeprojectmanager/wizards/testwizard.cpp5
-rw-r--r--src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp4
-rw-r--r--src/plugins/qmldesigner/components/componentcore/images/lower.pngbin149 -> 149 bytes
-rw-r--r--src/plugins/qmldesigner/components/componentcore/images/lower@2x.pngbin166 -> 166 bytes
-rw-r--r--src/plugins/qmldesigner/components/componentcore/images/raise.pngbin150 -> 149 bytes
-rw-r--r--src/plugins/qmldesigner/components/componentcore/images/raise@2x.pngbin166 -> 168 bytes
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp23
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h2
-rw-r--r--src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/resources/centerwidget.css2
-rw-r--r--src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally.pngbin0 -> 95 bytes
-rw-r--r--src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally@2x.pngbin0 -> 100 bytes
-rw-r--r--src/plugins/qmldesigner/components/resources/images/spliteditorvertically.pngbin0 -> 95 bytes
-rw-r--r--src/plugins/qmldesigner/components/resources/images/spliteditorvertically@2x.pngbin0 -> 100 bytes
-rw-r--r--src/plugins/qmldesigner/components/resources/resources.qrc4
-rw-r--r--src/plugins/qmldesigner/components/texteditor/texteditorview.cpp7
-rw-r--r--src/plugins/qmldesigner/components/texteditor/texteditorview.h2
-rw-r--r--src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp2
-rw-r--r--src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp16
-rw-r--r--src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.h1
-rw-r--r--src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp8
-rw-r--r--src/plugins/qmldesigner/designercore/include/viewmanager.h2
-rw-r--r--src/plugins/qmldesigner/designercore/model/abstractview.cpp23
-rw-r--r--src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp12
-rw-r--r--src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp6
-rw-r--r--src/plugins/qmldesigner/designercore/model/viewmanager.cpp5
-rw-r--r--src/plugins/qmldesigner/designmodewidget.cpp15
-rw-r--r--src/plugins/qmldesigner/designmodewidget.h1
-rw-r--r--src/plugins/qmldesigner/documentmanager.cpp4
-rw-r--r--src/plugins/qmldesigner/qmldesignerplugin.pro3
-rw-r--r--src/plugins/qmldesigner/qmldesignerplugin.qbs3
-rw-r--r--src/plugins/qmldesigner/shortcutmanager.cpp21
-rw-r--r--src/plugins/qmldesigner/shortcutmanager.h2
-rw-r--r--src/plugins/qmldesigner/switchsplittabwidget.cpp10
-rw-r--r--src/plugins/qmljstools/qmljsmodelmanager.cpp27
-rw-r--r--src/plugins/qmlprofiler/flamegraphmodel.cpp4
-rw-r--r--src/plugins/qmlprofiler/memoryusagemodel.cpp8
-rw-r--r--src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp3
-rw-r--r--src/plugins/qmlprofiler/qmlprofilertracefile.cpp79
-rw-r--r--src/plugins/qmlprojectmanager/qmlproject.cpp23
-rw-r--r--src/plugins/qmlprojectmanager/qmlproject.h7
-rw-r--r--src/plugins/remotelinux/remotelinuxsignaloperation.cpp20
-rw-r--r--src/plugins/resourceeditor/resourceeditorplugin.cpp1
-rw-r--r--src/plugins/scxmleditor/plugin_interface/scutilsprovider.cpp10
-rw-r--r--src/plugins/texteditor/codeassist/codeassistant.cpp2
-rw-r--r--src/plugins/texteditor/codeassist/iassistproposal.cpp2
-rw-r--r--src/plugins/texteditor/codeassist/iassistproposal.h2
-rw-r--r--src/plugins/welcome/welcomeplugin.cpp6
-rw-r--r--src/tools/clangrefactoringbackend/source/refactoringcompilationdatabase.cpp2
-rw-r--r--src/tools/icons/qtcreatoricons.svg51
-rw-r--r--src/tools/tools.pro2
-rw-r--r--src/tools/wininterrupt/wininterrupt.pro12
-rw-r--r--tests/auto/debugger/tst_dumpers.cpp23
-rw-r--r--tests/unit/unittest/codecompletionsextractor-test.cpp2
-rw-r--r--tests/unit/unittest/highlightingmarks-test.cpp4
139 files changed, 1056 insertions, 1110 deletions
diff --git a/doc/config/qtcreator-developer.qdocconf b/doc/config/qtcreator-developer.qdocconf
index 8f251a0d03..ef4a1eb8d5 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 f439b3a7b6..6f70204227 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 \
diff --git a/doc/doc.pri b/doc/doc.pri
index 1364a1a538..67a3032bfb 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 0000000000..16fbfa2b4e
--- /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/<qdocconf_name>$$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/doc/images/qtcreator-gerrit-options.png b/doc/images/qtcreator-gerrit-options.png
index cf6be7a328..9ead8c2b2e 100644
--- a/doc/images/qtcreator-gerrit-options.png
+++ b/doc/images/qtcreator-gerrit-options.png
Binary files differ
diff --git a/doc/images/qtcreator-gerrit.png b/doc/images/qtcreator-gerrit.png
index b02fd2a21f..1ba060be74 100644
--- a/doc/images/qtcreator-gerrit.png
+++ b/doc/images/qtcreator-gerrit.png
Binary files differ
diff --git a/doc/src/vcs/creator-vcs-git.qdoc b/doc/src/vcs/creator-vcs-git.qdoc
index fccb31f00f..07214d7709 100644
--- a/doc/src/vcs/creator-vcs-git.qdoc
+++ b/doc/src/vcs/creator-vcs-git.qdoc
@@ -292,11 +292,6 @@
If your Git project uses Gerrit for code reviews, you can view your changes
in \QC.
- Select \uicontrol Tools > \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 >
diff --git a/docs.pri b/docs.pri
index 4c125724a3..5727ee131d 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)
diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py
index 0849b532c2..211b595efe 100644
--- a/share/qtcreator/debugger/cdbbridge.py
+++ b/share/qtcreator/debugger/cdbbridge.py
@@ -153,18 +153,20 @@ class Dumper(DumperBase):
code = nativeType.code()
if code == TypeCodePointer:
- if nativeType.name().startswith('<function>'):
- code = TypeCodeFunction
- else:
+ if not nativeType.name().startswith('<function>'):
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:
- if nativeType.name().startswith('__fptr()'):
- code = TypeCodeStruct
- else:
+ # 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 not nativeType.name().startswith('__fptr()') and not nativeType.name().startswith('<gentype '):
targetType = self.lookupType(nativeType.targetName(), nativeType.moduleId())
- return self.createArrayType(targetType, nativeType.arrayElements())
+ if targetType is not None:
+ return self.createArrayType(targetType, nativeType.arrayElements())
+ code = TypeCodeStruct
tdata = self.TypeData(self)
tdata.name = nativeType.name()
diff --git a/share/qtcreator/debugger/creatortypes.py b/share/qtcreator/debugger/creatortypes.py
index 8b7d5d67e1..979e0c42ff 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)
diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py
index 69443b6cdc..ce7cda3f52 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:
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.cpp
index b71c24ce9b..8469b57685 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);
diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml
index 32c2f5a0c8..09f4f6c8fe 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/libs/qtcreatorcdbext/pyvalue.cpp b/src/libs/qtcreatorcdbext/pyvalue.cpp
index a786c2d9af..a56cb08ba9 100644
--- a/src/libs/qtcreatorcdbext/pyvalue.cpp
+++ b/src/libs/qtcreatorcdbext/pyvalue.cpp
@@ -54,12 +54,22 @@ 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(const PyValue &other)
+ : m_index(other.m_index)
+ , m_symbolGroup(other.m_symbolGroup)
+{
+ if (m_symbolGroup)
+ valuesForSymbolGroup[m_symbolGroup].push_back(this);
}
PyValue::~PyValue()
{
- valuesForSymbolGroup[m_symbolGroup].remove(this);
+ if (m_symbolGroup)
+ valuesForSymbolGroup[m_symbolGroup].remove(this);
}
std::string PyValue::name() const
diff --git a/src/libs/qtcreatorcdbext/pyvalue.h b/src/libs/qtcreatorcdbext/pyvalue.h
index fd009b2ff8..fa89c73062 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;
diff --git a/src/libs/timeline/qml/MainView.qml b/src/libs/timeline/qml/MainView.qml
index ca19e81e33..5a7acac4d0 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 3557f8a3ba..74a929769a 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;
+ operation();
+ recursionGuard = false;
+ }
+
+ onWidthChanged: scroll()
- var newStartTime = contentX * zoomer.rangeDuration / scroller.width +
- zoomer.windowStart;
+ // 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 + scroller.width) * zoomer.rangeDuration /
- scroller.width + zoomer.windowStart;
+ var newEndTime = (contentX + width) * zoomer.rangeDuration / width
+ + zoomer.windowStart;
if (isFinite(newEndTime))
zoomer.setRange(newStartTime, newEndTime);
}
- recursionGuard = false;
- }
+ });
// 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 {
diff --git a/src/libs/timeline/timelinerenderer.cpp b/src/libs/timeline/timelinerenderer.cpp
index c398de1acb..5aa12efc08 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()
-{
- Q_Q(TimelineRenderer);
- if (currentSelection.eventIndex != -1)
- q->setSelectedItem(currentSelection.eventIndex);
- else
- q->setSelectedItem(-1);
-}
-
-void TimelineRenderer::TimelineRendererPrivate::manageHovered(int mouseX, int mouseY)
+void TimelineRenderer::TimelineRendererPrivate::findCurrentSelection(int mouseX, int mouseY,
+ int width)
{
- 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 eccab59f4d..398a1c637e 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<QHash<qint64, TimelineRenderState *> > renderStates;
TimelineRenderState *lastState;
-
-private:
- TimelineRenderer *q_ptr;
- Q_DECLARE_PUBLIC(TimelineRenderer)
};
} // namespace Timeline
diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp
index 7bc0c09500..8808a570ad 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 a04cbe9284..95abaa2999 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/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp
index 0b8762f24d..0459355b04 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);
}
diff --git a/src/plugins/autotest/gtest/gtesttreeitem.cpp b/src/plugins/autotest/gtest/gtesttreeitem.cpp
index 06db3c0cda..540f7c6679 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<TestConfiguration *> 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<TestConfiguration *> 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 b4d226253a..9236b79631 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<TestConfiguration *> 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<TestConfiguration *> 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<TestConfiguration *> 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 c5d0c8d86a..6b1b710170 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<CppTools::ProjectPart::Ptr> 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;
- }
- }
- }
-
- 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();
- }
- }
-
- QList<RunConfiguration *> rcs = target->runConfigurations();
- foreach (RunConfiguration *rc, rcs) {
- Runnable runnable = rc->runnable();
- if (isLocal(rc) && runnable.is<StandardRunnable>()) {
+ const auto cppMM = CppTools::CppModelManager::instance();
+ const QVector<CppTools::ProjectPart::Ptr> projectParts = cppMM->projectInfo(project).projectParts();
+ const QVector<CppTools::ProjectPart::Ptr> relevantParts
+ = Utils::filtered(projectParts, [this] (const CppTools::ProjectPart::Ptr &part) {
+ return part->selectedForBuilding && part->projectFile == m_projectFile;
+ });
+ const QSet<QString> buildSystemTargets
+ = Utils::transform<QSet>(relevantParts, [] (const CppTools::ProjectPart::Ptr &part) {
+ return part->buildSystemTarget;
+ });
+
+ 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;
+
+ if (buildSystemTargets.contains(runConfig->buildSystemTarget())) {
+ Runnable runnable = runConfig->runnable();
+ if (!runnable.is<StandardRunnable>())
+ continue;
StandardRunnable stdRunnable = runnable.as<StandardRunnable>();
- // 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>()) {
- StandardRunnable stdRunnable = runnable.as<StandardRunnable>();
- 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>()) {
+ StandardRunnable stdRunnable = runnable.as<StandardRunnable>();
+ 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.
diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp
index 2e579e7dfa..acb59683f2 100644
--- a/src/plugins/autotest/testrunner.cpp
+++ b/src/plugins/autotest/testrunner.cpp
@@ -100,12 +100,19 @@ static void performTestRun(QFutureInterface<TestResultPtr> &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."))));
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp
index 296142ec5a..d7d389ed3a 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 9e90c12d80..3ebaeb763a 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/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp
index e5b22b5e21..b0e2c20db3 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 75d549b293..a82cdfea0e 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 3491ec3ad0..afcce6dcae 100644
--- a/src/plugins/baremetal/gdbserverprovider.cpp
+++ b/src/plugins/baremetal/gdbserverprovider.cpp
@@ -78,7 +78,7 @@ GdbServerProvider::~GdbServerProvider()
{
const QSet<BareMetalDevice *> devices = m_devices;
for (BareMetalDevice *device : devices)
- device->setGdbServerProviderId(QString());
+ device->unregisterProvider(this);
}
QString GdbServerProvider::displayName() const
diff --git a/src/plugins/clangcodemodel/clangassistproposal.cpp b/src/plugins/clangcodemodel/clangassistproposal.cpp
index 19fe708bbc..b70b56b794 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<ClangAssistProposalModel*>(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 8fc29b8374..70b5f15ca2 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/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp
index 265069ec7f..62870880fd 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<ClangBackEnd::DiagnosticContainer> &diagnostics)
{
// For debugging, add: style='border-width:1px;border-color:black'
- QString text = "<table cellspacing='0' cellpadding='0'>";
+ QString text = "<table cellspacing='0' cellpadding='0' width='100%'>";
foreach (const ClangBackEnd::DiagnosticContainer &diagnostic, diagnostics)
text.append(tableRows(diagnostic));
@@ -173,7 +179,7 @@ private:
const QString text = QString::fromLatin1(
" <tr>"
" <td align='left'><b>%1</b></td>"
- " <td align='right'><font color='gray'>%2</font></td>"
+ " <td align='right'>&nbsp;<font color='gray'>%2</font></td>"
" </tr>")
.arg(diagnostic.category(), diagnostic.enableOption());
@@ -185,15 +191,7 @@ private:
const bool hasFixit = m_displayHints.enableClickableFixits
&& !diagnostic.fixIts().isEmpty();
const QString diagnosticText = diagnostic.text().toString().toHtmlEscaped();
-
- // For debugging, add to <table>: style='border-width:1px;border-color:red'
- const QString text = QString::fromLatin1(
- "<table cellspacing='0' cellpadding='0'>"
- " <tr>"
- " <td>%1:&nbsp;</td>"
- " <td width='100%'>%2</td>"
- " </tr>"
- "</table>")
+ const QString text = QString::fromLatin1("%1: %2")
.arg(clickableLocation(diagnostic, m_mainFilePath),
clickableFixIt(diagnostic, diagnosticText, hasFixit));
diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp
index f3e039cd37..9e3f2a4274 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<void()> todo)
{
BuildDirReader::Parameters p(m_buildConfiguration);
@@ -98,7 +105,7 @@ void BuildDirManager::updateReaderType(std::function<void()> 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<const FileNode *> &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 QList<co
void BuildDirManager::updateCodeModel(CppTools::RawProjectParts &rpps)
{
+ QTC_ASSERT(!m_isHandlingError, return);
QTC_ASSERT(m_reader, return);
return m_reader->updateCodeModel(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<CMakeBuildTarget> BuildDirManager::buildTargets() const
{
+ QTC_ASSERT(!m_isHandlingError, return {});
+
if (!m_reader)
return QList<CMakeBuildTarget>();
if (m_buildTargets.isEmpty())
@@ -307,6 +324,8 @@ QList<CMakeBuildTarget> 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 4446c3f03f..10632f360e 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<BuildDirReader> m_reader;
mutable QList<CMakeBuildTarget> m_buildTargets;
+ mutable bool m_isHandlingError = false;
};
} // namespace Internal
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index c04d237f38..cf9d0f0ca4 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();
@@ -220,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);
}
@@ -307,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 33890fcd8f..f0bc68ce12 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/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
index ea018e1126..1205953c8b 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<ArgumentsAspect>()->arguments();
r.workingDirectory = extraAspect<WorkingDirectoryAspect>()->workingDirectory().toString();
r.environment = extraAspect<LocalEnvironmentAspect>()->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 b89c23ffc4..02ed4df607 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;
};
diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp
index 2951c918ad..33d0614ab9 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<Utils::FileName, ProjectNode *> cmakeListsNodes = addCMakeLists(root, cmakeLists);
+ addProjects(cmakeListsNodes, m_projects, allFiles);
}
void ServerModeReader::updateCodeModel(CppTools::RawProjectParts &rpps)
@@ -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 &section = bf.toMap();
@@ -528,30 +530,36 @@ void ServerModeReader::extractCacheData(const QVariantMap &data)
m_cmakeCache = config;
}
-void ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList<FileNode *> &cmakeLists)
+QHash<Utils::FileName, ProjectNode *>
+ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList<FileNode *> &cmakeLists)
{
- const QDir baseDir = QDir(m_parameters.sourceDirectory.toString());
+ QHash<Utils::FileName, ProjectNode *> cmakeListsNodes;
+ cmakeListsNodes.insert(root->filePath(), root);
+ const QSet<Utils::FileName> cmakeDirs
+ = Utils::transform<QSet>(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, &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<Utils::FileName, ProjectNode *> &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<Utils::FileName, ProjectNode *> &cmakeListsNodes,
const QList<Project *> &projects,
const QList<const FileNode *> &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<Utils::FileName, ProjectNode *> &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<Utils::FileName, ProjectNode *> &cmakeListsNodes,
const QList<ServerModeReader::Target *> &targets,
const QHash<FileName, QList<const FileNode *>> &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 8b973ce0ec..7eb831df8e 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<ProjectExplorer::FileNode *> &cmakeLists);
- void addProjects(CMakeProjectNode *root, const QList<Project *> &projects,
+ QHash<Utils::FileName, ProjectExplorer::ProjectNode *>
+ addCMakeLists(CMakeProjectNode *root, const QList<ProjectExplorer::FileNode *> &cmakeLists);
+ void addProjects(const QHash<Utils::FileName, ProjectExplorer::ProjectNode *> &cmakeListsNodes,
+ const QList<Project *> &projects,
const QList<const ProjectExplorer::FileNode *> &allFiles);
- void addTargets(CMakeProjectNode *root, const QList<Target *> &targets,
+ void addTargets(const QHash<Utils::FileName, ProjectExplorer::ProjectNode *> &cmakeListsNodes,
+ const QList<Target *> &targets,
const QHash<Utils::FileName, QList<const ProjectExplorer::FileNode *>> &headers);
void addFileGroups(ProjectExplorer::ProjectNode *targetRoot,
const Utils::FileName &sourceDirectory,
diff --git a/src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp b/src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp
index 7bc02adb38..de67e62b99 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<QIcon>();
- 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);
diff --git a/src/plugins/coreplugin/iwelcomepage.cpp b/src/plugins/coreplugin/iwelcomepage.cpp
index 8296d6c8f5..a99a309ea7 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 ae59d13e50..4732a2893c 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/coreplugin/locator/locatorwidget.cpp b/src/plugins/coreplugin/locator/locatorwidget.cpp
index e85bdf30df..b63ab3b798 100644
--- a/src/plugins/coreplugin/locator/locatorwidget.cpp
+++ b/src/plugins/coreplugin/locator/locatorwidget.cpp
@@ -102,6 +102,7 @@ public:
CompletionList(QWidget *parent = 0);
void resize();
+ void resizeHeaders();
QSize preferredSize() const { return m_preferredSize; }
void focusOutEvent (QFocusEvent *event) {
@@ -217,10 +218,14 @@ void LocatorModel::addEntries(const QList<LocatorFilterEntry> &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 ===========
@@ -252,8 +257,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 ===========
@@ -303,6 +314,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);
diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp
index 4ecdda76f5..859d88a879 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);
}
diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp
index 9c273190f2..6a5e70954d 100644
--- a/src/plugins/cpptools/cppcompletionassist.cpp
+++ b/src/plugins/cpptools/cppcompletionassist.cpp
@@ -458,7 +458,7 @@ public:
, m_replaceDotForArrow(static_cast<CppAssistProposalModel *>(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/cpptools/modelmanagertesthelper.h b/src/plugins/cpptools/modelmanagertesthelper.h
index f7ef4ec189..18f0d6b5ef 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/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index 997073d560..2692cdf759 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);
}
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index be174cae0d..7c6954bd89 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -326,9 +326,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)
@@ -469,22 +466,11 @@ void GenericProject::activeBuildConfigurationWasChanged()
refresh(Everything);
}
-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 3b14c0b11d..2b05eaf9bb 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -44,8 +44,6 @@ public:
QString displayName() const override;
- QStringList files(FilesMode fileMode) const override;
-
QStringList buildTargets() const;
bool addFiles(const QStringList &filePaths);
@@ -61,8 +59,6 @@ public:
void refresh(RefreshOptions options);
- 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 fb69394ff5..edd5d42866 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/git/branchdialog.cpp b/src/plugins/git/branchdialog.cpp
index 6f2184d507..eb71c73531 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 db0318b557..a967dc3bdf 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();
diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp
index 9a8a4d56cc..7b47f0f73e 100644
--- a/src/plugins/git/branchmodel.cpp
+++ b/src/plugins/git/branchmodel.cpp
@@ -55,13 +55,12 @@ class BranchNode
{
public:
BranchNode() :
- parent(0),
name("<ROOT>")
{ }
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<BranchNode *> children;
QString name;
@@ -273,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();
@@ -308,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;
}
@@ -349,7 +335,7 @@ void BranchModel::clear()
if (hasTags())
m_rootNode->children.takeLast();
- m_currentBranch = 0;
+ m_currentBranch = nullptr;
m_obsoleteLocalBranches.clear();
}
@@ -375,8 +361,8 @@ bool BranchModel::refresh(const QString &workingDirectory, QString *errorMessage
parseOutputLine(l);
if (m_currentBranch) {
- if (m_currentBranch->parent == m_rootNode->children.at(LocalBranches))
- m_currentBranch = 0;
+ if (m_currentBranch->isLocal())
+ m_currentBranch = nullptr;
setCurrentBranch();
}
@@ -392,11 +378,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)
@@ -448,8 +436,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 +610,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 +684,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 +718,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<BranchNode *>(index.internalPointer());
diff --git a/src/plugins/git/gitsubmitpanel.ui b/src/plugins/git/gitsubmitpanel.ui
index 1e10e3282f..2134b702c8 100644
--- a/src/plugins/git/gitsubmitpanel.ui
+++ b/src/plugins/git/gitsubmitpanel.ui
@@ -148,7 +148,7 @@
<item>
<widget class="QCheckBox" name="signOffCheckBox">
<property name="text">
- <string>&amp;Sign off</string>
+ <string>Sign off</string>
</property>
</widget>
</item>
diff --git a/src/plugins/ios/ios.qbs b/src/plugins/ios/ios.qbs
index 080d014540..8f156b421c 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",
diff --git a/src/plugins/ios/iosbuildsettingswidget.h b/src/plugins/ios/iosbuildsettingswidget.h
index 6460599c61..89b9a144ab 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();
diff --git a/src/plugins/nim/project/nimproject.cpp b/src/plugins/nim/project/nimproject.cpp
index a73daf1095..35795954eb 100644
--- a/src/plugins/nim/project/nimproject.cpp
+++ b/src/plugins/nim/project/nimproject.cpp
@@ -34,6 +34,7 @@
#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/kit.h>
#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectnodes.h>
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h>
#include <projectexplorer/kitinformation.h>
@@ -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<FileNode *> 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 7ea82a0c81..5072ce478d 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/plugins.pro b/src/plugins/plugins.pro
index c6a554fafa..49961bc7a4 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.")
diff --git a/src/plugins/projectexplorer/abi.cpp b/src/plugins/projectexplorer/abi.cpp
index 28356e1583..fa504ca3b8 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;
}
}
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index e8b68a4560..cf01c42801 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<ProjectAction> supportedActions(Node *) const final
- {
- return {};
- }
-
-private:
- Project *m_project;
-};
-
// -------------------------------------------------------------------------
// Project
// -------------------------------------------------------------------------
@@ -461,6 +429,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;
@@ -468,6 +444,7 @@ void Project::setRootProjectNode(ProjectNode *root)
if (root)
root->setParentFolderNode(&d->m_containerNode);
ProjectTree::emitSubtreeChanged(root);
+ emit fileListChanged();
delete oldNode;
}
@@ -516,6 +493,25 @@ Project::RestoreResult Project::restoreSettings(QString *errorMessage)
return result;
}
+QStringList Project::files(Project::FilesMode fileMode,
+ const std::function<bool (const FileNode *)> &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.
@@ -573,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 8de6d9ec21..f5f5fc49fd 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -36,6 +36,8 @@
#include <QObject>
#include <QFileSystemModel>
+#include <functional>
+
namespace Core {
class IDocument;
class Context;
@@ -46,7 +48,9 @@ namespace Utils { class MacroExpander; }
namespace ProjectExplorer {
class BuildInfo;
+class ContainerNode;
class EditorConfiguration;
+class FileNode;
class NamedWidget;
class ProjectImporter;
class ProjectNode;
@@ -81,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;
@@ -112,7 +116,8 @@ public:
GeneratedFiles = 0x2,
AllFiles = SourceFiles | GeneratedFiles
};
- virtual QStringList files(FilesMode fileMode) const = 0;
+ virtual QStringList files(FilesMode fileMode,
+ const std::function<bool(const FileNode *)> &filter = {}) const;
virtual QStringList filesGeneratedFrom(const QString &sourceFile) const;
static QString makeUnique(const QString &preferredName, const QStringList &usedNames);
@@ -143,7 +148,6 @@ public:
Utils::MacroExpander *macroExpander() const;
signals:
- void displayNameChanged();
void fileListChanged();
// Note: activeTarget can be 0 (if no targets are defined).
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index f38f8b3150..f4db58d9aa 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);
@@ -2353,119 +2362,9 @@ int ProjectExplorerPluginPrivate::queue(QList<Project *> projects, QList<Id> ste
return stepLists.count();
}
-void ProjectExplorerPluginPrivate::buildProjectOnly()
-{
- queue(QList<Project *>() << SessionManager::startupProject(), QList<Id>() << Id(Constants::BUILDSTEPS_BUILD));
-}
-
void ProjectExplorerPlugin::buildProject(Project *p)
{
- dd->queue(SessionManager::projectOrder(p),
- QList<Id>() << Id(Constants::BUILDSTEPS_BUILD));
-}
-
-void ProjectExplorerPluginPrivate::handleBuildProject()
-{
- queue(SessionManager::projectOrder(SessionManager::startupProject()),
- QList<Id>() << Id(Constants::BUILDSTEPS_BUILD));
-}
-
-void ProjectExplorerPluginPrivate::buildProjectContextMenu()
-{
- queue(QList<Project *>() << ProjectTree::currentProject(),
- QList<Id>() << Id(Constants::BUILDSTEPS_BUILD));
-}
-
-void ProjectExplorerPluginPrivate::buildProjectDependenciesContextMenu()
-{
- queue(SessionManager::projectOrder(ProjectTree::currentProject()),
- QList<Id>() << Id(Constants::BUILDSTEPS_BUILD));
-}
-
-void ProjectExplorerPluginPrivate::buildSession()
-{
- queue(SessionManager::projectOrder(),
- QList<Id>() << Id(Constants::BUILDSTEPS_BUILD));
-}
-
-void ProjectExplorerPluginPrivate::rebuildProjectOnly()
-{
- queue(QList<Project *>() << SessionManager::startupProject(),
- QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD));
-}
-
-void ProjectExplorerPluginPrivate::rebuildProject()
-{
- queue(SessionManager::projectOrder(SessionManager::startupProject()),
- QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD));
-}
-
-void ProjectExplorerPluginPrivate::rebuildProjectContextMenu()
-{
- queue(QList<Project *>() << ProjectTree::currentProject(),
- QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD));
-}
-
-void ProjectExplorerPluginPrivate::rebuildProjectDependenciesContextMenu()
-{
- queue(SessionManager::projectOrder(ProjectTree::currentProject()),
- QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD));
-}
-
-void ProjectExplorerPluginPrivate::rebuildSession()
-{
- queue(SessionManager::projectOrder(),
- QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN) << Id(Constants::BUILDSTEPS_BUILD));
-}
-
-void ProjectExplorerPluginPrivate::deployProjectOnly()
-{
- deploy(QList<Project *>() << SessionManager::startupProject());
-}
-
-void ProjectExplorerPluginPrivate::deployProject()
-{
- deploy(SessionManager::projectOrder(SessionManager::startupProject()));
-}
-
-void ProjectExplorerPluginPrivate::deployProjectContextMenu()
-{
- deploy(QList<Project *>() << ProjectTree::currentProject());
-}
-
-void ProjectExplorerPluginPrivate::deploySession()
-{
- deploy(SessionManager::projectOrder());
-}
-
-void ProjectExplorerPluginPrivate::cleanProjectOnly()
-{
- queue(QList<Project *>() << SessionManager::startupProject(),
- QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN));
-}
-
-void ProjectExplorerPluginPrivate::cleanProject()
-{
- queue(SessionManager::projectOrder(SessionManager::startupProject()),
- QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN));
-}
-
-void ProjectExplorerPluginPrivate::cleanProjectContextMenu()
-{
- queue(QList<Project *>() << ProjectTree::currentProject(),
- QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN));
-}
-
-void ProjectExplorerPluginPrivate::cleanProjectDependenciesContextMenu()
-{
- queue(SessionManager::projectOrder(ProjectTree::currentProject()),
- QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN));
-}
-
-void ProjectExplorerPluginPrivate::cleanSession()
-{
- queue(SessionManager::projectOrder(),
- QList<Id>() << Id(Constants::BUILDSTEPS_CLEAN));
+ dd->queue(SessionManager::projectOrder(p), { Id(Constants::BUILDSTEPS_BUILD) });
}
void ProjectExplorerPluginPrivate::runProjectContextMenu()
@@ -2881,12 +2780,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())
@@ -3015,7 +2908,13 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions()
if (currentNode && currentNode->managingProject()) {
QList<ProjectAction> 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/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp
index d71187ceab..d9b7a80d41 100644
--- a/src/plugins/projectexplorer/projectmodels.cpp
+++ b/src/plugins/projectexplorer/projectmodels.cpp
@@ -238,13 +238,8 @@ 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) {
- m_toExpand.insert(expandDataForNode(child->m_node));
- });
- }
update();
}
@@ -266,7 +261,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 +271,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 +347,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 8d177c8b0c..b59e08e04f 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;
diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp
index 0d3b102522..f3fa5565b9 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"
@@ -77,6 +78,7 @@ static FolderNode *recursiveFindOrCreateFolderNode(FolderNode *folder,
directoryWithoutPrefix = directory.relativeChildPath(path);
} else {
isRelative = false;
+ path.clear();
directoryWithoutPrefix = directory;
}
}
@@ -170,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...
}
@@ -499,8 +502,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);
@@ -521,6 +523,8 @@ void FolderNode::compress()
{
QList<Node *> 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()) {
@@ -788,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<ProjectAction> 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 757529da8b..4ed5b4eb56 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<ProjectAction> 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<Node *> m_nodes;
+};
+
} // namespace ProjectExplorer
Q_DECLARE_METATYPE(ProjectExplorer::Node *)
diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp
index 6d32406015..50b8b65256 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/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp
index 8f9029028e..f7e442ed5e 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,31 +240,11 @@ 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 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;
@@ -236,17 +254,27 @@ 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;
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) {
+ 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));
+ painter->drawPixmap(rc.right() - 20, y + 7, expanded ? arrowDown : arrowUp);
+ }
if (idx.row() < 9) {
painter->setPen(foregroundColor2);
@@ -264,10 +292,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;
@@ -336,7 +364,7 @@ public:
{
if (ev->type() == QEvent::MouseButtonRelease) {
const QPoint pos = static_cast<QMouseEvent *>(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".
@@ -385,41 +413,24 @@ private:
class ProjectDelegate : public BaseDelegate
{
QString entryType() override { return tr("project", "Appears in \"Open project <name>\""); }
+ 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;
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;
+ const int firstBase = y + 18;
+ const int secondBase = firstBase + 19;
- 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 + 6, projectIcon);
QString projectName = idx.data(Qt::DisplayRole).toString();
QString projectPath = idx.data(ProjectModel::FilePathRole).toString();
@@ -431,11 +442,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);
}
@@ -511,11 +522,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);
@@ -530,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);
@@ -546,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/projectexplorer/projectwelcomepage.h b/src/plugins/projectexplorer/projectwelcomepage.h
index 805bac2054..68f2ca3a0a 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 0d5456e86d..1f42b8cc00 100644
--- a/src/plugins/projectexplorer/sessionmodel.cpp
+++ b/src/plugins/projectexplorer/sessionmodel.cpp
@@ -28,6 +28,9 @@
#include "sessiondialog.h"
+#include <coreplugin/actionmanager/actionmanager.h>
+#include <coreplugin/id.h>
+
#include <utils/algorithm.h>
#include <utils/fileutils.h>
#include <utils/stringutils.h>
@@ -35,6 +38,8 @@
#include <QFileInfo>
#include <QDir>
+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 66a75242d4..2b1bacfda5 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);
diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp
index 08f2ffc95a..967c5f58a6 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<PythonProject *>(parent->project());
QList<Core::Id> 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<PythonProject *>(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 ec047b8639..56c326896e 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<QString> &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<QString> 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<QString> 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 c2d7c1df23..dd24093e42 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/profilecompletionassist.cpp b/src/plugins/qmakeprojectmanager/profilecompletionassist.cpp
index dea84b50dc..86f3a67cef 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",
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
index ffdcee6f2a..0d76e07cdb 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
@@ -191,7 +191,6 @@ static QList<QmakeProject *> 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<int>(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<ResourceEditor::ResourceTopLevelNode *>(folderNode))
- files.files[static_cast<int>(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<int>(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
@@ -1346,7 +1300,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<Utils::FileName, Utils::FileName> pair = qMakePair(expected, path);
if (!m_toolChainWarnings.contains(pair)) {
TaskHub::addTask(Task(Task::Warning,
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h
index fb96fbc266..2f4fb8a427 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<QmakeProFile> 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/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
index 9641c289e4..341ef74652 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<QmakeProFileNode *>(node));
- auto proFileNode = dynamic_cast<QmakeProFileNode *>(node);
+ ContainerNode *containerNode = node ? node->asContainerNode() : nullptr;
+ ProjectNode *proFileNode = containerNode ? containerNode->rootProjectNode() : dynamic_cast<QmakeProFileNode *>(node);
+
+ m_addLibraryActionContextMenu->setEnabled(proFileNode);
QmakeProject *qmakeProject = qobject_cast<QmakeProject *>(QmakeManager::contextProject());
QmakeProFileNode *subProjectNode = nullptr;
if (node) {
diff --git a/src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp b/src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp
index 94586b3798..60d708ed92 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 90e694af5e..e420502a45 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 9ff69a790b..3f2ebfc619 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);
diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp
index c2364ff432..6e5b3e4a11 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(),
diff --git a/src/plugins/qmldesigner/components/componentcore/images/lower.png b/src/plugins/qmldesigner/components/componentcore/images/lower.png
index e02bd9d28c..447b9f248d 100644
--- a/src/plugins/qmldesigner/components/componentcore/images/lower.png
+++ b/src/plugins/qmldesigner/components/componentcore/images/lower.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/lower@2x.png b/src/plugins/qmldesigner/components/componentcore/images/lower@2x.png
index 681b4a8a17..3b7cea40f7 100644
--- a/src/plugins/qmldesigner/components/componentcore/images/lower@2x.png
+++ b/src/plugins/qmldesigner/components/componentcore/images/lower@2x.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/raise.png b/src/plugins/qmldesigner/components/componentcore/images/raise.png
index aba160dcfe..0d1567645e 100644
--- a/src/plugins/qmldesigner/components/componentcore/images/raise.png
+++ b/src/plugins/qmldesigner/components/componentcore/images/raise.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/componentcore/images/raise@2x.png b/src/plugins/qmldesigner/components/componentcore/images/raise@2x.png
index ac122d57b5..ab47f8501b 100644
--- a/src/plugins/qmldesigner/components/componentcore/images/raise@2x.png
+++ b/src/plugins/qmldesigner/components/componentcore/images/raise@2x.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
index 5b2dc1034c..e9d1ab13ba 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
@@ -48,6 +48,7 @@
#include <QTabBar>
#include <QImageReader>
#include <QMimeData>
+#include <QMouseEvent>
#include <QWheelEvent>
#include <QMenu>
#include <QApplication>
@@ -55,10 +56,6 @@
#include <QShortcut>
#include <QQuickItem>
-#include <private/qquickwidget_p.h> // mouse ungrabbing workaround on quickitems
-#include <private/qquickwindow_p.h> // 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<ItemLibraryEntry>();
@@ -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 946dfc9b7d..a831b4c5fd 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/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp
index ab3b19c840..b28fec7c51 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
diff --git a/src/plugins/qmldesigner/components/resources/centerwidget.css b/src/plugins/qmldesigner/components/resources/centerwidget.css
index 1f91f8993b..b0e431d88d 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/components/resources/images/spliteditorhorizontally.png b/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally.png
new file mode 100644
index 0000000000..cbe0d46c94
--- /dev/null
+++ b/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally.png
Binary files differ
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 0000000000..660e546ae9
--- /dev/null
+++ b/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally@2x.png
Binary files differ
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 0000000000..a5e2be5144
--- /dev/null
+++ b/src/plugins/qmldesigner/components/resources/images/spliteditorvertically.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/resources/images/spliteditorvertically@2x.png b/src/plugins/qmldesigner/components/resources/images/spliteditorvertically@2x.png
new file mode 100644
index 0000000000..ebfd6793b7
--- /dev/null
+++ b/src/plugins/qmldesigner/components/resources/images/spliteditorvertically@2x.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/resources/resources.qrc b/src/plugins/qmldesigner/components/resources/resources.qrc
index aeb286a414..5b75f585a2 100644
--- a/src/plugins/qmldesigner/components/resources/resources.qrc
+++ b/src/plugins/qmldesigner/components/resources/resources.qrc
@@ -5,5 +5,9 @@
<file>scrollbar.css</file>
<file>formeditorstylesheet.css</file>
<file>centerwidget.css</file>
+ <file>images/spliteditorhorizontally.png</file>
+ <file>images/spliteditorhorizontally@2x.png</file>
+ <file>images/spliteditorvertically.png</file>
+ <file>images/spliteditorvertically@2x.png</file>
</qresource>
</RCC>
diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp
index c4b120c97b..5877424a14 100644
--- a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp
+++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp
@@ -147,12 +147,17 @@ 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 9b07ee2b5f..01ac15f219 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/filemanager/moveobjectbeforeobjectvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp
index ae86a770aa..0ec53a7452 100644
--- a/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp
+++ b/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp
@@ -27,8 +27,6 @@
#include <qmljs/parser/qmljsast_p.h>
-#include <QDebug>
-
using namespace QmlDesigner::Internal;
using namespace QmlDesigner;
diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp
index 779fdc3a25..a2b4c9b3fc 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());
}
diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.h b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.h
index d51ca90379..bf82daefea 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/filemanager/qmlrewriter.cpp b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp
index 27f75c9a22..6247f98697 100644
--- a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp
+++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp
@@ -28,10 +28,14 @@
#include <qmljs/parser/qmljsast_p.h>
#include <QDebug>
+#include <QLoggingCategory>
#include <QTextBlock>
#include <typeinfo>
+
+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();
}
}
diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h
index b10266d0f8..f69f714f0a 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 c6084a9c93..7579c12503 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 <qmlstate.h>
+#ifndef QMLDESIGNER_TEST
+#include <qmldesignerplugin.h>
+#include <viewmanager.h>
+#endif
+
#include <coreplugin/helpmanager.h>
#include <utils/qtcassert.h>
@@ -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/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp
index 000d6b549d..19b8b7c1d1 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<AbstractProperty>& 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()
@@ -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. ***";
@@ -348,8 +348,8 @@ QmlRefactoring::PropertyType ModelToTextMerger::propertyType(const AbstractPrope
else if (property.isVariantProperty())
return QmlRefactoring::ScriptBinding;
- Q_ASSERT(!"cannot convert property type");
- return (QmlRefactoring::PropertyType) -1;
+ Q_ASSERT(false); //Cannot convert property type
+ return QmlRefactoring::Invalid;
}
PropertyNameList ModelToTextMerger::propertyOrder()
diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
index 77f61b2d5f..f1665484b3 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()));
}
diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp
index bd7aa0185e..32e1398bd3 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();
diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp
index 09f1d51cdd..3bebbc0b8f 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 b6dbce5fb8..fd37ad48c8 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/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp
index 59412263ac..357420c1d8 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;
}
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pro b/src/plugins/qmldesigner/qmldesignerplugin.pro
index 460a77a96e..cc78fdc5db 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
+QT += quickwidgets core-private
CONFIG += exceptions
INCLUDEPATH += $$PWD
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs
index 8078a1de9e..828142b47f 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"
+ "core-private", "quickwidgets"
]
}
Depends { name: "Core" }
diff --git a/src/plugins/qmldesigner/shortcutmanager.cpp b/src/plugins/qmldesigner/shortcutmanager.cpp
index 3a68952530..0e1889d058 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 bf273e853e..c5fbe89fef 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;
diff --git a/src/plugins/qmldesigner/switchsplittabwidget.cpp b/src/plugins/qmldesigner/switchsplittabwidget.cpp
index 4cf6dd9c10..08ad71ef12 100644
--- a/src/plugins/qmldesigner/switchsplittabwidget.cpp
+++ b/src/plugins/qmldesigner/switchsplittabwidget.cpp
@@ -73,14 +73,20 @@ SwitchSplitTabWidget::SwitchSplitTabWidget(QWidget *parent)
m_tabBarBackground->layout()->addWidget(m_tabBar);
QToolButton *horizontalButton = new QToolButton;
- horizontalButton->setIcon(Utils::Icons::SPLIT_HORIZONTAL.icon());
+ horizontalButton->setObjectName("centralTabBar");
+ 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();
selectFakeTab();
});
QToolButton *verticalButton = new QToolButton;
- verticalButton->setIcon(Utils::Icons::SPLIT_VERTICAL.icon());
+ verticalButton->setObjectName("centralTabBar");
+ 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/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp
index cfbde13308..e13bbb3e29 100644
--- a/src/plugins/qmljstools/qmljsmodelmanager.cpp
+++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp
@@ -38,6 +38,7 @@
#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/project.h>
#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectnodes.h>
#include <projectexplorer/projecttree.h>
#include <projectexplorer/session.h>
#include <projectexplorer/target.h>
@@ -59,6 +60,8 @@
#include <QTextStream>
#include <QTimer>
#include <QRegExp>
+#include <QSet>
+#include <QString>
#include <QLibraryInfo>
#include <qglobal.h>
@@ -74,20 +77,18 @@ ModelManagerInterface::ProjectInfo ModelManager::defaultProjectInfoForProject(
Project *project) const
{
ModelManagerInterface::ProjectInfo projectInfo(project);
- Target *activeTarget = 0;
+ Target *activeTarget = nullptr;
if (project) {
- QSet<QString> 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<QString> 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();
diff --git a/src/plugins/qmlprofiler/flamegraphmodel.cpp b/src/plugins/qmlprofiler/flamegraphmodel.cpp
index d6899f5ce6..e3f98cfbcf 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<QmlEvent> &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 b4bd0d87ce..30d0da85c7 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 4384a10327..c43a302282 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;
diff --git a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp
index da66e9beb3..b84de415ae 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<QmlEvent> finalize();
+
+private:
+ struct QmlRange {
+ QmlEvent begin;
+ QmlEvent end;
+ };
+
+ QList<QmlRange> ranges; // We are going to do a lot of takeFirst() on this.
+};
+
+void EventList::addEvent(const QmlEvent &event)
+{
+ ranges.append({event, QmlEvent()});
+}
+
+void EventList::addRange(const QmlEvent &start, const QmlEvent &end)
+{
+ ranges.append({start, end});
+}
+
+QVector<QmlEvent> 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<QmlEvent> ends;
+ QVector<QmlEvent> 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<QmlEvent> 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;
diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp
index bb88cc898e..43fbe6ab56 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<Internal::QmlProjectNode *>(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 c8900b6ebe..616c2c6d18 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<QmlProjectItem> m_projectItem;
};
diff --git a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp
index 7c71c3c143..b59118b4aa 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)
diff --git a/src/plugins/resourceeditor/resourceeditorplugin.cpp b/src/plugins/resourceeditor/resourceeditorplugin.cpp
index 0ef8e5cb50..474092d350 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));
}
diff --git a/src/plugins/scxmleditor/plugin_interface/scutilsprovider.cpp b/src/plugins/scxmleditor/plugin_interface/scutilsprovider.cpp
index 89dc7bbdb0..b4b0f22742 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<QGraphicsItem*> &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<QGraphicsItem*> &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
diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp
index 8af30428e0..023e853d99 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 20afa68277..7e7f200ff0 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 f89021b5c8..9a6332808c 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;
diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp
index 13bcb6757e..8a34fdd466 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));
diff --git a/src/tools/clangrefactoringbackend/source/refactoringcompilationdatabase.cpp b/src/tools/clangrefactoringbackend/source/refactoringcompilationdatabase.cpp
index 24061fb7fb..38d89a39d0 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<std::string> &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
diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg
index 2041e47917..c700a1906c 100644
--- a/src/tools/icons/qtcreatoricons.svg
+++ b/src/tools/icons/qtcreatoricons.svg
@@ -4188,22 +4188,19 @@
x="473"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none" />
<path
- style="fill:#000000"
- d="m 475,580 h 13 v 1 h -13 z"
- id="path5905"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
sodipodi:nodetypes="ccccccccc"
inkscape:connector-curvature="0"
d="m 475.5,576 3,3 3,-3 z m 2.5,0 v -4 h 1 v 4 z"
style="fill:#000000"
id="path4774-4" />
<path
- id="path5907-4-74"
+ id="path5700"
+ style="fill:#000000;fill-opacity:1"
+ d="m 485,582 h 3 v 1 h -3 z m 0,-4 h 3 v 1 h -3 z m 0,-4 h 3 v 1 h -3 z m 0,2 h 3 v 1 h -3 z m 0,-4 h 3 v 1 h -3 z m -10,8 h 13 v 1 h -13 z" />
+ <path
style="fill:#707070"
- d="m 483,572 h 5 v 1 h -5 z m 0,4 h 5 v 1 h -5 z m 0,-2 h 5 v 1 h -5 z m 0,4 h 5 v 1 h -5 z m 0,4 h 5 v 1 h -5 z m -8,-12 h 13 v 1 h -13 z"
- inkscape:connector-curvature="0" />
+ d="m 475,570 h 13 v 1 h -13 z"
+ id="path5907-4-74" />
</g>
<use
x="0"
@@ -7458,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" />
</g>
+ <g
+ id="src/plugins/qmldesigner/components/resources/images/spliteditorvertically"
+ transform="translate(12)">
+ <rect
+ transform="rotate(90)"
+ id="rect5154-0-3-5-8-1-6-8"
+ height="8"
+ width="16"
+ y="-858"
+ x="584"
+ style="fill:#ffffff" />
+ <path
+ id="formEditorSplit_"
+ style="fill:none;stroke:#000000"
+ d="m 852,592.5 h 5 m -5.5,-3 h 6 v 6 h -6 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally">
+ <rect
+ style="fill:#ffffff"
+ x="584"
+ y="-878"
+ width="16"
+ height="8"
+ id="rect5704"
+ transform="rotate(90)" />
+ <use
+ height="100%"
+ width="100%"
+ transform="rotate(90,864.5,602.5)"
+ id="use5730"
+ xlink:href="#formEditorSplit_"
+ y="0"
+ x="0" />
+ </g>
</g>
</svg>
diff --git a/src/tools/tools.pro b/src/tools/tools.pro
index f727cb9abe..cfe34abaa0 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 \
diff --git a/src/tools/wininterrupt/wininterrupt.pro b/src/tools/wininterrupt/wininterrupt.pro
index 3ac6fc32ba..d7ea748d2a 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
diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp
index 5fd4e09ab0..b7b2f6057b 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 <QByteArray>"
- "\n#if QT_VERSION >= 0x050000"
+ "\n#if QT_VERSION >= 0x050900"
+ "\n#include <QHash>"
+ "\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;"
@@ -2677,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\"",
diff --git a/tests/unit/unittest/codecompletionsextractor-test.cpp b/tests/unit/unittest/codecompletionsextractor-test.cpp
index 86406377a1..28eb6a7548 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 db6995897c..d7a4c359c5 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));