diff options
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 Binary files differindex cf6be7a328..9ead8c2b2e 100644 --- a/doc/images/qtcreator-gerrit-options.png +++ b/doc/images/qtcreator-gerrit-options.png diff --git a/doc/images/qtcreator-gerrit.png b/doc/images/qtcreator-gerrit.png Binary files differindex b02fd2a21f..1ba060be74 100644 --- a/doc/images/qtcreator-gerrit.png +++ b/doc/images/qtcreator-gerrit.png 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 > @@ -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'> <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: </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 §ion = 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>&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 Binary files differindex e02bd9d28c..447b9f248d 100644 --- a/src/plugins/qmldesigner/components/componentcore/images/lower.png +++ b/src/plugins/qmldesigner/components/componentcore/images/lower.png diff --git a/src/plugins/qmldesigner/components/componentcore/images/lower@2x.png b/src/plugins/qmldesigner/components/componentcore/images/lower@2x.png Binary files differindex 681b4a8a17..3b7cea40f7 100644 --- a/src/plugins/qmldesigner/components/componentcore/images/lower@2x.png +++ b/src/plugins/qmldesigner/components/componentcore/images/lower@2x.png diff --git a/src/plugins/qmldesigner/components/componentcore/images/raise.png b/src/plugins/qmldesigner/components/componentcore/images/raise.png Binary files differindex aba160dcfe..0d1567645e 100644 --- a/src/plugins/qmldesigner/components/componentcore/images/raise.png +++ b/src/plugins/qmldesigner/components/componentcore/images/raise.png diff --git a/src/plugins/qmldesigner/components/componentcore/images/raise@2x.png b/src/plugins/qmldesigner/components/componentcore/images/raise@2x.png Binary files differindex ac122d57b5..ab47f8501b 100644 --- a/src/plugins/qmldesigner/components/componentcore/images/raise@2x.png +++ b/src/plugins/qmldesigner/components/componentcore/images/raise@2x.png 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 Binary files differnew file mode 100644 index 0000000000..cbe0d46c94 --- /dev/null +++ b/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally.png diff --git a/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally@2x.png b/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally@2x.png Binary files differnew file mode 100644 index 0000000000..660e546ae9 --- /dev/null +++ b/src/plugins/qmldesigner/components/resources/images/spliteditorhorizontally@2x.png diff --git a/src/plugins/qmldesigner/components/resources/images/spliteditorvertically.png b/src/plugins/qmldesigner/components/resources/images/spliteditorvertically.png Binary files differnew file mode 100644 index 0000000000..a5e2be5144 --- /dev/null +++ b/src/plugins/qmldesigner/components/resources/images/spliteditorvertically.png diff --git a/src/plugins/qmldesigner/components/resources/images/spliteditorvertically@2x.png b/src/plugins/qmldesigner/components/resources/images/spliteditorvertically@2x.png Binary files differnew file mode 100644 index 0000000000..ebfd6793b7 --- /dev/null +++ b/src/plugins/qmldesigner/components/resources/images/spliteditorvertically@2x.png 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)); |