diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ModelNode2DImageView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/ModelNode2DImageView.qml index 23025477157..ea0498927fd 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/ModelNode2DImageView.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/ModelNode2DImageView.qml @@ -24,7 +24,6 @@ ****************************************************************************/ import QtQuick 2.15 -import QtQuick3D 1.15 Item { id: root @@ -33,10 +32,12 @@ Item { property alias contentItem: contentItem + /* View3D { // Dummy view to hold the context in case View3D items are used in the component // TODO remove when QTBUG-87678 is fixed } + */ Item { id: contentItem diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RectangleSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RectangleSpecifics.qml index f743af96e05..deca79ed00a 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RectangleSpecifics.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/RectangleSpecifics.qml @@ -63,7 +63,7 @@ Column { Section { anchors.left: parent.left anchors.right: parent.right - caption: "Rectangle" + caption: qsTr("Rectangle") SectionLayout { rows: 2 diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml index 3f70547692a..916bfc29d96 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml @@ -45,7 +45,10 @@ Item { width: 96 implicitHeight: spinBox.height - onFocusChanged: transaction.end(); + onFocusChanged: { + restoreCursor(); + transaction.end(); + } StudioControls.RealSpinBox { id: spinBox @@ -60,6 +63,8 @@ Item { transaction.end(); } + onDragging: holdCursorInPlace(); + onRealValueModified: { if (transaction.active()) commitValue(); diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml index a055447d967..cde5beedc17 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml @@ -55,7 +55,8 @@ Rectangle { visible: text !== StudioTheme.Constants.actionIcon || actionIndicator.forceVisible || (myControl !== undefined && ((myControl.edit !== undefined && myControl.edit) - || (myControl.hover !== undefined && myControl.hover))) + || (myControl.hover !== undefined && myControl.hover) + || (myControl.drag !== undefined && myControl.drag))) color: StudioTheme.Values.themeTextColor font.family: StudioTheme.Constants.iconFont.family font.pixelSize: StudioTheme.Values.myIconFontSize diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml index 85e21735de9..4170e9289fd 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml @@ -55,6 +55,7 @@ T.SpinBox { property bool dirty: false // user modification flag + // TODO Not used anymore. Will be removed when all dependencies were removed. property real realDragRange: mySpinBox.realTo - mySpinBox.realFrom property alias actionIndicatorVisible: actionIndicator.visible @@ -77,6 +78,7 @@ T.SpinBox { signal compressedRealValueModified signal dragStarted signal dragEnded + signal dragging // Use custom wheel handling due to bugs property bool __wheelEnabled: false diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml index edeeaf9fd2d..31c2bccf6fc 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml @@ -70,61 +70,25 @@ TextInput { height: StudioTheme.Values.height } - DragHandler { - id: dragHandler - target: null - acceptedDevices: PointerDevice.Mouse - enabled: true - - property real initialValue: myControl.realValue - property real multiplier: 1.0 - - onActiveChanged: { - if (dragHandler.active) { - dragHandler.initialValue = myControl.realValue - mouseArea.cursorShape = Qt.ClosedHandCursor // TODO - myControl.drag = true - myControl.dragStarted() - // Force focus on the non visible component to receive key events - dragModifierWorkaround.forceActiveFocus() - } else { - if (myControl.compressedValueTimer.running) { - myControl.compressedValueTimer.stop() - calcValue(myControl.compressedRealValueModified) - } - mouseArea.cursorShape = Qt.PointingHandCursor // TODO - myControl.drag = false - myControl.dragEnded() - // Avoid active focus on the component after dragging - dragModifierWorkaround.focus = false - textInput.focus = false - myControl.focus = false - } - } - onTranslationChanged: calcValue(myControl.realValueModified) - onMultiplierChanged: calcValue(myControl.realValueModified) - - function calcValue(callback) { - var tmp = myControl.realDragRange / StudioTheme.Values.dragLength - myControl.setRealValue(dragHandler.initialValue + (tmp * dragHandler.translation.x * dragHandler.multiplier)) - callback() - } - } - Item { id: dragModifierWorkaround Keys.onPressed: { event.accepted = true - if (event.modifiers & Qt.ControlModifier) - dragHandler.multiplier = 0.1 + if (event.modifiers & Qt.ControlModifier) { + mouseArea.stepSize = myControl.minStepSize + mouseArea.calcValue(myControl.realValueModified) + } - if (event.modifiers & Qt.ShiftModifier) - dragHandler.multiplier = 10.0 + if (event.modifiers & Qt.ShiftModifier) { + mouseArea.stepSize = myControl.maxStepSize + mouseArea.calcValue(myControl.realValueModified) + } } Keys.onReleased: { event.accepted = true - dragHandler.multiplier = 1.0 + mouseArea.stepSize = myControl.realStepSize + mouseArea.calcValue(myControl.realValueModified) } } @@ -133,21 +97,21 @@ TextInput { event.accepted = (event.key === Qt.Key_Up || event.key === Qt.Key_Down) } - TapHandler { - id: tapHandler - acceptedDevices: PointerDevice.Mouse - enabled: true - onTapped: { - textInput.forceActiveFocus() - textInput.deselect() // QTBUG-75862 - } - } - MouseArea { id: mouseArea property real stepSize: myControl.realStepSize + property bool dragging: false + property bool wasDragging: false + property bool potentialDragStart: false + + property real initialValue: myControl.realValue + + property real pressStartX: 0.0 + property real dragStartX: 0.0 + property real translationX: 0.0 + anchors.fill: parent enabled: true hoverEnabled: true @@ -156,7 +120,90 @@ TextInput { cursorShape: Qt.PointingHandCursor // Sets the global hover onContainsMouseChanged: myControl.hover = containsMouse - onPressed: mouse.accepted = false + + onPositionChanged: { + if (!mouseArea.dragging + && !myControl.edit + && Math.abs(mouseArea.pressStartX - mouse.x) > StudioTheme.Values.dragThreshold + && mouse.buttons === 1 + && mouseArea.potentialDragStart) { + mouseArea.dragging = true + mouseArea.potentialDragStart = false + mouseArea.initialValue = myControl.realValue + mouseArea.cursorShape = Qt.ClosedHandCursor + mouseArea.dragStartX = mouseArea.mouseX + + myControl.drag = true + myControl.dragStarted() + // Force focus on the non visible component to receive key events + dragModifierWorkaround.forceActiveFocus() + textInput.deselect() + } + + if (!mouseArea.dragging) + return + + mouse.accepted = true + + mouseArea.translationX += (mouseArea.mouseX - mouseArea.dragStartX) + mouseArea.calcValue(myControl.realValueModified) + } + + onCanceled: mouseArea.endDrag() + + onClicked: { + if (mouseArea.wasDragging) { + mouseArea.wasDragging = false + return + } + + textInput.forceActiveFocus() + textInput.deselect() // QTBUG-75862 + } + + onPressed: { + mouseArea.potentialDragStart = true + mouseArea.pressStartX = mouseArea.mouseX + } + + onReleased: mouseArea.endDrag() + + function endDrag() { + if (!mouseArea.dragging) + return + + mouseArea.dragging = false + mouseArea.wasDragging = true + + if (myControl.compressedValueTimer.running) { + myControl.compressedValueTimer.stop() + mouseArea.calcValue(myControl.compressedRealValueModified) + } + mouseArea.cursorShape = Qt.PointingHandCursor + myControl.drag = false + myControl.dragEnded() + // Avoid active focus on the component after dragging + dragModifierWorkaround.focus = false + textInput.focus = false + myControl.focus = false + + mouseArea.translationX = 0 + } + + function calcValue(callback) { + var minTranslation = (myControl.realFrom - mouseArea.initialValue) / mouseArea.stepSize + var maxTranslation = (myControl.realTo - mouseArea.initialValue) / mouseArea.stepSize + + mouseArea.translationX = Math.min(Math.max(mouseArea.translationX, minTranslation), maxTranslation) + + myControl.setRealValue(mouseArea.initialValue + (mouseArea.translationX * mouseArea.stepSize)) + + if (mouseArea.dragging) + myControl.dragging() + + callback() + } + onWheel: { if (!myControl.__wheelEnabled) return @@ -187,14 +234,6 @@ TextInput { color: StudioTheme.Values.themeControlBackground border.color: StudioTheme.Values.themeControlOutline } - PropertyChanges { - target: dragHandler - enabled: true - } - PropertyChanges { - target: tapHandler - enabled: true - } PropertyChanges { target: mouseArea cursorShape: Qt.PointingHandCursor @@ -217,14 +256,6 @@ TextInput { color: StudioTheme.Values.themeFocusEdit border.color: StudioTheme.Values.themeInteraction } - PropertyChanges { - target: dragHandler - enabled: false - } - PropertyChanges { - target: tapHandler - enabled: false - } PropertyChanges { target: mouseArea cursorShape: Qt.IBeamCursor diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml index 22f0ff872ef..3d504302a78 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml @@ -50,7 +50,7 @@ QtObject { property real sliderControlSize: 12 property real sliderControlSizeMulti: values.sliderControlSize * values.scaleFactor - property int dragLength: 400 // px + property int dragThreshold: 10 // px property real spinControlIconSize: 8 property real spinControlIconSizeMulti: values.spinControlIconSize * values.scaleFactor diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/CMakeLists.txt b/share/qtcreator/templates/wizards/projects/qtquickapplication/CMakeLists.txt index 3b479a595c4..95426d9498c 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickapplication/CMakeLists.txt +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/CMakeLists.txt @@ -34,22 +34,28 @@ find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Quick REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Quick REQUIRED) @endif -if(ANDROID) - add_library(%{ProjectName} SHARED - %{MainCppFileName} - qml.qrc -@if %{HasTranslation} - ${TS_FILES} -@endif +set(PROJECT_SOURCES + %{MainCppFileName} + qml.qrc + @if %{HasTranslation} + ${TS_FILES} + @endif +) + +if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) + qt_add_executable(%{ProjectName} + ${PROJECT_SOURCES} ) else() - add_executable(%{ProjectName} - %{MainCppFileName} - qml.qrc -@if %{HasTranslation} - ${TS_FILES} -@endif - ) + if(ANDROID) + add_library(%{ProjectName} SHARED + ${PROJECT_SOURCES} + ) + else() + add_executable(%{ProjectName} + ${PROJECT_SOURCES} + ) + endif() endif() target_compile_definitions(%{ProjectName} diff --git a/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/CMakeLists.txt b/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/CMakeLists.txt index 21fec5e47b8..391da140528 100644 --- a/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/CMakeLists.txt +++ b/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/CMakeLists.txt @@ -34,30 +34,32 @@ find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED) @endif -if(ANDROID) - add_library(%{ProjectName} SHARED - %{MainFileName} - %{SrcFileName} - %{HdrFileName} - @if %{GenerateForm} - %{FormFileName} - @endif - @if %{HasTranslation} - ${TS_FILES} - @endif - ) +set(PROJECT_SOURCES + %{MainFileName} + %{SrcFileName} + %{HdrFileName} + @if %{GenerateForm} + %{FormFileName} + @endif + @if %{HasTranslation} + ${TS_FILES} + @endif +) + +if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) + qt_add_executable(%{ProjectName} + ${PROJECT_SOURCES} + ) else() - add_executable(%{ProjectName} - %{MainFileName} - %{SrcFileName} - %{HdrFileName} - @if %{GenerateForm} - %{FormFileName} - @endif - @if %{HasTranslation} - ${TS_FILES} - @endif - ) + if(ANDROID) + add_library(%{ProjectName} SHARED + ${PROJECT_SOURCES} + ) + else() + add_executable(%{ProjectName} + ${PROJECT_SOURCES} + ) + endif() endif() target_link_libraries(%{ProjectName} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) diff --git a/src/libs/qmljs/qmljsdialect.h b/src/libs/qmljs/qmljsdialect.h index 230642e1454..a2f28225990 100644 --- a/src/libs/qmljs/qmljsdialect.h +++ b/src/libs/qmljs/qmljsdialect.h @@ -29,6 +29,7 @@ #include +#include #include namespace QmlJS { diff --git a/src/libs/utils/algorithm.h b/src/libs/utils/algorithm.h index e5b4396f24b..772c6b1c918 100644 --- a/src/libs/utils/algorithm.h +++ b/src/libs/utils/algorithm.h @@ -997,13 +997,13 @@ Container static_container_cast(const Container &container) template inline void sort(Container &container) { - std::sort(std::begin(container), std::end(container)); + std::stable_sort(std::begin(container), std::end(container)); } template inline void sort(Container &container, Predicate p) { - std::sort(std::begin(container), std::end(container), p); + std::stable_sort(std::begin(container), std::end(container), p); } // pointer to member @@ -1012,7 +1012,7 @@ inline void sort(Container &container, R S::*member) { auto f = std::mem_fn(member); using const_ref = typename Container::const_reference; - std::sort(std::begin(container), std::end(container), + std::stable_sort(std::begin(container), std::end(container), [&f](const_ref a, const_ref b) { return f(a) < f(b); }); @@ -1024,7 +1024,7 @@ inline void sort(Container &container, R (S::*function)() const) { auto f = std::mem_fn(function); using const_ref = typename Container::const_reference; - std::sort(std::begin(container), std::end(container), + std::stable_sort(std::begin(container), std::end(container), [&f](const_ref a, const_ref b) { return f(a) < f(b); }); diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index 3776b55c33a..3d52d70bd9d 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -90,7 +90,8 @@ AndroidDeployQtStep::AndroidDeployQtStep(BuildStepList *parent, Utils::Id id) m_uninstallPreviousPackage = addAspect(); m_uninstallPreviousPackage->setSettingsKey(UninstallPreviousPackageKey); - m_uninstallPreviousPackage->setLabel(tr("Uninstall the existing app first")); + m_uninstallPreviousPackage->setLabel(tr("Uninstall the existing app first"), + BoolAspect::LabelPlacement::AtCheckBox); m_uninstallPreviousPackage->setValue(false); const QtSupport::BaseQtVersion * const qt = QtSupport::QtKitAspect::qtVersion(kit()); diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index 96beaf565f1..0dbd72e88c0 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -445,7 +445,7 @@ void VcsManager::promptToAdd(const QString &directory, const QStringList &fileNa if (dlg.exec() == QDialog::Accepted) { QStringList notAddedToVc; foreach (const QString &file, unmanagedFiles) { - if (!vc->vcsAdd(file)) + if (!vc->vcsAdd(QDir(directory).filePath(file))) notAddedToVc << file; } diff --git a/src/plugins/cpptools/cppcodestylesettingspage.cpp b/src/plugins/cpptools/cppcodestylesettingspage.cpp index 4c4f2b8e58e..466322abf4f 100644 --- a/src/plugins/cpptools/cppcodestylesettingspage.cpp +++ b/src/plugins/cpptools/cppcodestylesettingspage.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include diff --git a/src/plugins/help/CMakeLists.txt b/src/plugins/help/CMakeLists.txt index 4d5fd23283e..6ed078497b3 100644 --- a/src/plugins/help/CMakeLists.txt +++ b/src/plugins/help/CMakeLists.txt @@ -32,7 +32,7 @@ extend_qtc_plugin(Help ) extend_qtc_plugin(Help - CONDITION FWWebKit AND FWAppKit + CONDITION FWWebKit AND FWAppKit AND Qt5_VERSION VERSION_LESS 6.0.0 FEATURE_INFO "Native WebKit help viewer" DEPENDS ${FWWebKit} ${FWAppKit} DEFINES QTC_MAC_NATIVE_HELPVIEWER diff --git a/src/plugins/help/qlitehtml/qlitehtmlwidget.h b/src/plugins/help/qlitehtml/qlitehtmlwidget.h index 5da2c90c72d..740ea27d54f 100644 --- a/src/plugins/help/qlitehtml/qlitehtmlwidget.h +++ b/src/plugins/help/qlitehtml/qlitehtmlwidget.h @@ -41,10 +41,11 @@ public: explicit QLiteHtmlWidget(QWidget *parent = nullptr); ~QLiteHtmlWidget() override; + // declaring the getters Q_INVOKABLE to make them Squish-testable void setUrl(const QUrl &url); - QUrl url() const; + Q_INVOKABLE QUrl url() const; void setHtml(const QString &content); - QString title() const; + Q_INVOKABLE QString title() const; void setZoomFactor(qreal scale); qreal zoomFactor() const; @@ -62,7 +63,8 @@ public: using ResourceHandler = std::function; void setResourceHandler(const ResourceHandler &handler); - QString selectedText() const; + // declaring this Q_INVOKABLE to make it Squish-testable + Q_INVOKABLE QString selectedText() const; signals: void linkClicked(const QUrl &url); diff --git a/src/plugins/imageviewer/CMakeLists.txt b/src/plugins/imageviewer/CMakeLists.txt index 6bf9c9693c5..5317e9321de 100644 --- a/src/plugins/imageviewer/CMakeLists.txt +++ b/src/plugins/imageviewer/CMakeLists.txt @@ -1,5 +1,10 @@ +find_package(Qt5 COMPONENTS SvgWidgets QUIET) +if (TARGET Qt5::SvgWidgets) + set(SVG_WIDGETS Qt5::SvgWidgets) +endif() + add_qtc_plugin(ImageViewer - DEPENDS OptionalSvg + DEPENDS OptionalSvg ${SVG_WIDGETS} PLUGIN_DEPENDS Core SOURCES exportdialog.cpp exportdialog.h diff --git a/src/plugins/projectexplorer/editorsettingspropertiespage.cpp b/src/plugins/projectexplorer/editorsettingspropertiespage.cpp index ba76cb078eb..1a9ede8c850 100644 --- a/src/plugins/projectexplorer/editorsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/editorsettingspropertiespage.cpp @@ -26,7 +26,12 @@ #include "editorsettingspropertiespage.h" #include "editorconfiguration.h" #include "project.h" + +#include +#include #include +#include +#include #include diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index 5d253eb0977..3e83ae80867 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -775,7 +775,10 @@ void Target::setNamedSettings(const QString &name, const QVariant &value) QVariant Target::additionalData(Utils::Id id) const { - return buildSystem()->additionalData(id); + if (const BuildSystem *bs = buildSystem()) + return bs->additionalData(id); + + return {}; } MakeInstallCommand Target::makeInstallCommand(const QString &installRoot) const diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index ba15c006754..2258a99e279 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -1121,13 +1121,13 @@ void QbsBuildSystem::updateApplicationTargets() if (result.error().hasError()) { Core::MessageManager::write(tr("Error retrieving run environment: %1") .arg(result.error().toString())); - } else { - QProcessEnvironment fullEnv = result.environment(); - QTC_ASSERT(!fullEnv.isEmpty(), fullEnv = procEnv); - env = Utils::Environment(); - for (const QString &key : fullEnv.keys()) - env.set(key, fullEnv.value(key)); + return; } + QProcessEnvironment fullEnv = result.environment(); + QTC_ASSERT(!fullEnv.isEmpty(), fullEnv = procEnv); + env = Utils::Environment(); + for (const QString &key : fullEnv.keys()) + env.set(key, fullEnv.value(key)); m_envCache.insert(key, env); }; diff --git a/src/plugins/qmldesigner/assetexporterplugin/parsers/textnodeparser.cpp b/src/plugins/qmldesigner/assetexporterplugin/parsers/textnodeparser.cpp index 9b797ad77db..dfbc78a75d9 100644 --- a/src/plugins/qmldesigner/assetexporterplugin/parsers/textnodeparser.cpp +++ b/src/plugins/qmldesigner/assetexporterplugin/parsers/textnodeparser.cpp @@ -27,6 +27,7 @@ #include "assetexportpluginconstants.h" #include +#include #include namespace { @@ -68,10 +69,14 @@ QJsonObject TextNodeParser::json(Component &component) const QJsonObject textDetails; textDetails.insert(TextContentTag, propertyValue("text").toString()); - textDetails.insert(FontFamilyTag, propertyValue("font.family").toString()); - textDetails.insert(FontStyleTag, propertyValue("font.styleName").toString()); - textDetails.insert(FontSizeTag, propertyValue("font.pixelSize").toInt()); - textDetails.insert(LetterSpacingTag, propertyValue("font.letterSpacing").toFloat()); + + QFont font = propertyValue("font").value(); + QFontInfo fontInfo(font); + textDetails.insert(FontFamilyTag, fontInfo.family()); + textDetails.insert(FontStyleTag, fontInfo.styleName()); + textDetails.insert(FontSizeTag, fontInfo.pixelSize()); + textDetails.insert(LetterSpacingTag, font.letterSpacing()); + QColor fontColor(propertyValue("font.color").toString()); textDetails.insert(TextColorTag, fontColor.name(QColor::HexArgb)); diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index b572d55f0b4..2b567a8e690 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -217,6 +217,7 @@ Utils::FilePath DesignDocument::fileName() const { if (editor()) return editor()->document()->filePath(); + return Utils::FilePath(); } @@ -239,14 +240,11 @@ void DesignDocument::loadDocument(QPlainTextEdit *edit) { Q_CHECK_PTR(edit); - connect(edit, &QPlainTextEdit::undoAvailable, - this, &DesignDocument::undoAvailable); - connect(edit, &QPlainTextEdit::redoAvailable, - this, &DesignDocument::redoAvailable); - connect(edit, &QPlainTextEdit::modificationChanged, - this, &DesignDocument::dirtyStateChanged); + connect(edit, &QPlainTextEdit::undoAvailable, this, &DesignDocument::undoAvailable); + connect(edit, &QPlainTextEdit::redoAvailable, this, &DesignDocument::redoAvailable); + connect(edit, &QPlainTextEdit::modificationChanged, this, &DesignDocument::dirtyStateChanged); - m_documentTextModifier.reset(new BaseTextEditModifier(dynamic_cast(plainTextEdit()))); + m_documentTextModifier.reset(new BaseTextEditModifier(qobject_cast(plainTextEdit()))); connect(m_documentTextModifier.data(), &TextModifier::textChanged, this, &DesignDocument::updateQrcFiles); @@ -266,7 +264,6 @@ void DesignDocument::changeToDocumentModel() viewManager().detachRewriterView(); viewManager().detachViewsExceptRewriterAndComponetView(); - m_inFileComponentModel.reset(); viewManager().attachRewriterView(); @@ -299,7 +296,8 @@ void DesignDocument::updateQrcFiles() ProjectExplorer::Project *currentProject = ProjectExplorer::SessionManager::projectForFile(fileName()); if (currentProject) { - for (const Utils::FilePath &fileName : currentProject->files(ProjectExplorer::Project::SourceFiles)) { + const auto srcFiles = currentProject->files(ProjectExplorer::Project::SourceFiles); + for (const Utils::FilePath &fileName : srcFiles) { if (fileName.endsWith(".qrc")) QmlJS::ModelManagerInterface::instance()->updateQrcFile(fileName.toString()); } @@ -350,6 +348,7 @@ bool DesignDocument::isUndoAvailable() const { if (plainTextEdit()) return plainTextEdit()->document()->isUndoAvailable(); + return false; } @@ -357,6 +356,7 @@ bool DesignDocument::isRedoAvailable() const { if (plainTextEdit()) return plainTextEdit()->document()->isRedoAvailable(); + return false; } @@ -380,7 +380,7 @@ void DesignDocument::deleteSelected() QStringList lockedNodes; for (const ModelNode &modelNode : view()->selectedModelNodes()) { for (const ModelNode &node : modelNode.allSubModelNodesAndThisNode()) { - if (node.isValid() && !node.isRootNode() && node.locked()) + if (node.isValid() && !node.isRootNode() && node.locked() && !lockedNodes.contains(node.id())) lockedNodes.push_back(node.id()); } } @@ -408,9 +408,8 @@ void DesignDocument::deleteSelected() return; } - rewriterView()->executeInTransaction("DesignDocument::deleteSelected", [this](){ - QList toDelete = view()->selectedModelNodes(); - + rewriterView()->executeInTransaction("DesignDocument::deleteSelected", [this]() { + const QList toDelete = view()->selectedModelNodes(); for (ModelNode node : toDelete) { if (node.isValid() && !node.isRootNode() && QmlObjectNode::isValidQmlObjectNode(node)) QmlObjectNode(node).destroy(); @@ -442,32 +441,33 @@ static void scatterItem(const ModelNode &pastedNode, const ModelNode &targetNode return; bool scatter = false; - foreach (const ModelNode &childNode, targetNode.directSubModelNodes()) { - if ((childNode.variantProperty("x").value() == pastedNode.variantProperty("x").value()) && - (childNode.variantProperty("y").value() == pastedNode.variantProperty("y").value())) + for (const ModelNode &childNode : targetNode.directSubModelNodes()) { + if (childNode.variantProperty("x").value() == pastedNode.variantProperty("x").value() && + childNode.variantProperty("y").value() == pastedNode.variantProperty("y").value()) { scatter = true; + break; + } } if (!scatter) return; - if (offset == -2000) { + if (offset == -2000) { // scatter in range double x = pastedNode.variantProperty("x").value().toDouble(); double y = pastedNode.variantProperty("y").value().toDouble(); - double targetWidth = 20; - double targetHeight = 20; - x = x + double(QRandomGenerator::global()->generate()) / RAND_MAX * targetWidth - - targetWidth / 2; - y = y + double(QRandomGenerator::global()->generate()) / RAND_MAX * targetHeight - - targetHeight / 2; - pastedNode.variantProperty("x").setValue(int(x)); - pastedNode.variantProperty("y").setValue(int(y)); - } else { - double x = pastedNode.variantProperty("x").value().toDouble(); - double y = pastedNode.variantProperty("y").value().toDouble(); - x = x + offset; - y = y + offset; + + const double scatterRange = 20.; + x += QRandomGenerator::global()->generateDouble() * scatterRange - scatterRange / 2; + y += QRandomGenerator::global()->generateDouble() * scatterRange - scatterRange / 2; + pastedNode.variantProperty("x").setValue(int(x)); pastedNode.variantProperty("y").setValue(int(y)); + } else { // offset + int x = pastedNode.variantProperty("x").value().toInt(); + int y = pastedNode.variantProperty("y").value().toInt(); + x += offset; + y += offset; + pastedNode.variantProperty("x").setValue(x); + pastedNode.variantProperty("y").setValue(y); } } @@ -495,7 +495,7 @@ void DesignDocument::paste() if (!view.selectedModelNodes().isEmpty()) targetNode = view.selectedModelNodes().constFirst(); - //In case we copy and paste a selection we paste in the parent item + // in case we copy and paste a selection we paste in the parent item if ((view.selectedModelNodes().count() == selectedNodes.count()) && targetNode.isValid() && targetNode.hasParentProperty()) { targetNode = targetNode.parentProperty().parentModelNode(); } else { @@ -516,19 +516,20 @@ void DesignDocument::paste() if (!targetNode.isValid()) targetNode = view.rootModelNode(); - foreach (const ModelNode &node, selectedNodes) { - foreach (const ModelNode &node2, selectedNodes) { + for (const ModelNode &node : qAsConst(selectedNodes)) { + for (const ModelNode &node2 : qAsConst(selectedNodes)) { if (node.isAncestorOf(node2)) selectedNodes.removeAll(node2); } } - rewriterView()->executeInTransaction("DesignDocument::paste1", [&view, selectedNodes, targetNode](){ + rewriterView()->executeInTransaction("DesignDocument::paste1", [&view, selectedNodes, targetNode]() { QList pastedNodeList; - int offset = double(QRandomGenerator::global()->generate()) / RAND_MAX * 20 - 10; + const double scatterRange = 20.; + int offset = QRandomGenerator::global()->generateDouble() * scatterRange - scatterRange / 2; - foreach (const ModelNode &node, selectedNodes) { + for (const ModelNode &node : qAsConst(selectedNodes)) { PropertyName defaultProperty(targetNode.metaInfo().defaultPropertyName()); ModelNode pastedNode(view.insertModel(node)); pastedNodeList.append(pastedNode); @@ -572,11 +573,11 @@ void DesignDocument::paste() PropertyName defaultProperty(targetNode.metaInfo().defaultPropertyName()); scatterItem(pastedNode, targetNode); - if (targetNode.metaInfo().propertyIsListProperty(defaultProperty)) { + if (targetNode.metaInfo().propertyIsListProperty(defaultProperty)) targetNode.nodeListProperty(defaultProperty).reparentHere(pastedNode); - } else { + else qWarning() << "Cannot reparent to" << targetNode; - } + view.setSelectedModelNodes({pastedNode}); }); view.model()->clearMetaInfoCache(); @@ -591,7 +592,6 @@ void DesignDocument::selectAll() DesignDocumentView view; currentModel()->attachView(&view); - QList allNodesExceptRootNode(view.allModelNodes()); allNodesExceptRootNode.removeOne(view.rootModelNode()); view.setSelectedModelNodes(allNodesExceptRootNode); @@ -607,7 +607,6 @@ void DesignDocument::setEditor(Core::IEditor *editor) m_textEditor = editor; // if the user closed the file explicit we do not want to do anything with it anymore - connect(Core::EditorManager::instance(), &Core::EditorManager::aboutToSave, this, [this](Core::IDocument *document) { if (m_textEditor && m_textEditor->document() == document) { @@ -622,8 +621,7 @@ void DesignDocument::setEditor(Core::IEditor *editor) m_textEditor.clear(); }); - connect(editor->document(), &Core::IDocument::filePathChanged, - this, &DesignDocument::updateFileName); + connect(editor->document(), &Core::IDocument::filePathChanged, this, &DesignDocument::updateFileName); updateActiveTarget(); updateActiveTarget(); @@ -678,7 +676,6 @@ static Target *getActiveTarget(DesignDocument *designDocument) if (!currentProject) return nullptr; - QObject::connect(ProjectTree::instance(), &ProjectTree::currentProjectChanged, designDocument, &DesignDocument::updateActiveTarget, Qt::UniqueConnection); diff --git a/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp b/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp index 5cd5721812d..9c3aab36870 100644 --- a/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp +++ b/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp @@ -32,7 +32,8 @@ #include "navigatortreemodel.h" #include "qproxystyle.h" -#include "metainfo.h" +#include +#include #include @@ -55,7 +56,7 @@ IconCheckboxItemDelegate::IconCheckboxItemDelegate(QObject *parent, QSize IconCheckboxItemDelegate::sizeHint(const QStyleOptionViewItem & /*option*/, const QModelIndex & /*modelIndex*/) const { - return {15, 20}; + return {15, 20}; } static bool isChecked(const QModelIndex &modelIndex) @@ -63,9 +64,9 @@ static bool isChecked(const QModelIndex &modelIndex) return modelIndex.model()->data(modelIndex, Qt::CheckStateRole) == Qt::Checked; } -static bool isVisible(const QModelIndex &modelIndex) +static bool isThisOrAncestorLocked(const QModelIndex &modelIndex) { - return modelIndex.model()->data(modelIndex, ItemIsVisibleRole).toBool(); + return modelIndex.model()->data(modelIndex, ItemOrAncestorLocked).toBool(); } static ModelNode getModelNode(const QModelIndex &modelIndex) @@ -82,6 +83,13 @@ void IconCheckboxItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &styleOption, const QModelIndex &modelIndex) const { + if (styleOption.state & QStyle::State_MouseOver && !isThisOrAncestorLocked(modelIndex)) + painter->fillRect(styleOption.rect.adjusted(0, delegateMargin, 0, -delegateMargin), + Theme::getColor(Theme::Color::DSsliderHandle)); + + if (styleOption.state & QStyle::State_Selected) + NavigatorTreeView::drawSelectionBackground(painter, styleOption); + bool isVisibilityIcon = modelIndex.column() != NavigatorTreeModel::ColumnType::Visibility; // We need to invert the check status if visibility icon bool checked = isVisibilityIcon ? isChecked(modelIndex) : !isChecked(modelIndex); @@ -89,10 +97,7 @@ void IconCheckboxItemDelegate::paint(QPainter *painter, return; if (rowIsPropertyRole(modelIndex.model(), modelIndex)) - return; //Do not paint icons for property rows - - if (styleOption.state & QStyle::State_Selected) - NavigatorTreeView::drawSelectionBackground(painter, styleOption); + return; // Do not paint icons for property rows if (!getModelNode(modelIndex).isRootNode()) { QWindow *window = dynamic_cast(painter->device())->window()->windowHandle(); @@ -101,17 +106,15 @@ void IconCheckboxItemDelegate::paint(QPainter *painter, const QRect iconRect(styleOption.rect.left() + 2, styleOption.rect.top() + 2, 16, 16); const QIcon &icon = isChecked(modelIndex) ? m_checkedIcon : m_uncheckedIcon; const QPixmap iconPixmap = icon.pixmap(window, iconRect.size()); - const bool visible = isVisible(modelIndex); - if (!visible) { - painter->save(); + painter->save(); + + if (isThisOrAncestorLocked(modelIndex)) painter->setOpacity(0.5); - } - painter->drawPixmap(iconRect.topLeft(), iconPixmap); + painter->drawPixmap(iconRect.topLeft() + QPoint(0, delegateMargin), iconPixmap); - if (!visible) - painter->restore(); + painter->restore(); } } diff --git a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp index 4da4a18c05b..34e3c9881ee 100644 --- a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp +++ b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -47,6 +48,8 @@ namespace QmlDesigner { +int NameItemDelegate::iconOffset = 0; + static QPixmap generateWavyPixmap(qreal maxRadius, const QPen &pen) { QPixmap pixmap; @@ -111,13 +114,15 @@ NameItemDelegate::NameItemDelegate(QObject *parent) static int drawIcon(QPainter *painter, const QStyleOptionViewItem &styleOption, const QModelIndex &modelIndex) { - QIcon icon = modelIndex.data(Qt::DecorationRole).value(); - - const int pixmapSize = icon.isNull() ? 4 : 16; - + const QIcon icon = modelIndex.data(Qt::DecorationRole).value(); + int pixmapSize = icon.isNull() ? 4 : 16; QPixmap pixmap = icon.pixmap(pixmapSize, pixmapSize); - painter->drawPixmap(styleOption.rect.x() + 1 , styleOption.rect.y() + 2, pixmap); + painter->drawPixmap(styleOption.rect.x() + 1 + delegateMargin, + styleOption.rect.y() + 2 + delegateMargin, + pixmap); + + pixmapSize += delegateMargin; return pixmapSize; } @@ -128,19 +133,20 @@ static QRect drawText(QPainter *painter, int iconOffset) { QString displayString = modelIndex.data(Qt::DisplayRole).toString(); - if (displayString.isEmpty()) - displayString = modelIndex.data(Qt::DisplayRole).toString(); QPoint displayStringOffset; int width = 0; // Check text length does not exceed available space - int extraSpace = 12 + iconOffset; + const int extraSpace = 12 + iconOffset; + + displayString = styleOption.fontMetrics.elidedText(displayString, + Qt::ElideMiddle, + styleOption.rect.width() - extraSpace); + displayStringOffset = QPoint(5 + iconOffset, -5 - delegateMargin); - displayString = styleOption.fontMetrics.elidedText(displayString, Qt::ElideMiddle, styleOption.rect.width() - extraSpace); - displayStringOffset = QPoint(5 + iconOffset, -5); width = styleOption.fontMetrics.horizontalAdvance(displayString); - QPoint textPosition = styleOption.rect.bottomLeft() + displayStringOffset; + const QPoint textPosition = styleOption.rect.bottomLeft() + displayStringOffset; painter->drawText(textPosition, displayString); QRect textFrame; @@ -150,9 +156,9 @@ static QRect drawText(QPainter *painter, return textFrame; } -static bool isVisible(const QModelIndex &modelIndex) +static bool isThisOrAncestorLocked(const QModelIndex &modelIndex) { - return modelIndex.model()->data(modelIndex, ItemIsVisibleRole).toBool(); + return modelIndex.model()->data(modelIndex, ItemOrAncestorLocked).toBool(); } static ModelNode getModelNode(const QModelIndex &modelIndex) @@ -175,17 +181,56 @@ static void drawRedWavyUnderLine(QPainter *painter, painter->fillRect(textFrame.x(), 0, qCeil(textFrame.width()), qMin(wave.height(), descent), wave); } +static void setId(const QModelIndex &index, const QString &newId) +{ + ModelNode modelNode = getModelNode(index); + + if (!modelNode.isValid()) + return; + + if (modelNode.id() == newId) + return; + + if (!modelNode.isValidId(newId)) { + Core::AsynchronousMessageBox::warning(NavigatorTreeView::tr("Invalid Id"), + NavigatorTreeView::tr("%1 is an invalid id.").arg(newId)); + } else if (modelNode.view()->hasId(newId)) { + Core::AsynchronousMessageBox::warning(NavigatorTreeView::tr("Invalid Id"), + NavigatorTreeView::tr("%1 already exists.").arg(newId)); + } else { + modelNode.setIdWithRefactoring(newId); + } +} + +static void openContextMenu(const QModelIndex &index, const QPoint &pos) +{ + const ModelNode modelNode = getModelNode(index); + QTC_ASSERT(modelNode.isValid(), return); + ModelNodeContextMenu::showContextMenu(modelNode.view(), pos, QPoint(), false); +} + +QSize NameItemDelegate::sizeHint(const QStyleOptionViewItem & /*option*/, + const QModelIndex & /*modelIndex*/) const +{ + return {15, 20 + (2 * delegateMargin)}; +} + void NameItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &styleOption, const QModelIndex &modelIndex) const { painter->save(); + + if (styleOption.state & QStyle::State_MouseOver && !isThisOrAncestorLocked(modelIndex)) + painter->fillRect(styleOption.rect.adjusted(0, delegateMargin, 0, -delegateMargin), + Theme::getColor(Theme::Color::DSsliderHandle)); + if (styleOption.state & QStyle::State_Selected) NavigatorTreeView::drawSelectionBackground(painter, styleOption); - int iconOffset = drawIcon(painter, styleOption, modelIndex); + iconOffset = drawIcon(painter, styleOption, modelIndex); - if (!isVisible(modelIndex)) + if (isThisOrAncestorLocked(modelIndex)) painter->setOpacity(0.5); QRect textFrame = drawText(painter, styleOption, modelIndex, iconOffset); @@ -196,28 +241,8 @@ void NameItemDelegate::paint(QPainter *painter, painter->restore(); } -static void openContextMenu(const QModelIndex &index, const QPoint &pos) -{ - const ModelNode modelNode = getModelNode(index); - QTC_ASSERT(modelNode.isValid(), return); - ModelNodeContextMenu::showContextMenu(modelNode.view(), pos, QPoint(), false); -} - -bool NameItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *, const QStyleOptionViewItem &, const QModelIndex &index) -{ - if (event->type() == QEvent::MouseButtonRelease) { - auto mouseEvent = static_cast(event); - if (mouseEvent->button() == Qt::RightButton) { - openContextMenu(index, mouseEvent->globalPos()); - mouseEvent->accept(); - return true; - } - } - return false; -} - QWidget *NameItemDelegate::createEditor(QWidget *parent, - const QStyleOptionViewItem & /*option*/, + const QStyleOptionViewItem &/*option*/, const QModelIndex &index) const { if (!getModelNode(index).isValid()) @@ -235,42 +260,35 @@ void NameItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) lineEdit->setText(value); } -static void setId(const QModelIndex &index, const QString &newId) -{ - ModelNode modelNode = getModelNode(index); - - if (!modelNode.isValid()) - return; - - if (modelNode.id() == newId) - return; - - if (!modelNode.isValidId(newId)) { - Core::AsynchronousMessageBox::warning(NavigatorTreeView::tr("Invalid Id"), - NavigatorTreeView::tr("%1 is an invalid id.").arg(newId)); - } else if (modelNode.view()->hasId(newId)) { - Core::AsynchronousMessageBox::warning(NavigatorTreeView::tr("Invalid Id"), - NavigatorTreeView::tr("%1 already exists.").arg(newId)); - } else { - modelNode.setIdWithRefactoring(newId); - } -} - - void NameItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { Q_UNUSED(model) auto lineEdit = static_cast(editor); - setId(index,lineEdit->text()); + setId(index, lineEdit->text()); lineEdit->clearFocus(); } +bool NameItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *, const QStyleOptionViewItem &, const QModelIndex &index) +{ + if (event->type() == QEvent::MouseButtonRelease) { + auto mouseEvent = static_cast(event); + if (mouseEvent->button() == Qt::RightButton) { + openContextMenu(index, mouseEvent->globalPos()); + mouseEvent->accept(); + return true; + } + } + return false; +} + void NameItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, - const QModelIndex & /*index*/) const + const QModelIndex &/*index*/) const { auto lineEdit = static_cast(editor); - lineEdit->setGeometry(option.rect); + lineEdit->setTextMargins(0, 0, 0, 2); + // + 2 is shifting the QLineEdit to the left so it will align with the text when activated + lineEdit->setGeometry(option.rect.adjusted(iconOffset + 2, delegateMargin, 0, -delegateMargin)); } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.h b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.h index d33cb42ef73..6919dc1ec6e 100644 --- a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.h +++ b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.h @@ -34,18 +34,28 @@ class NavigatorTreeModel; class NameItemDelegate : public QStyledItemDelegate { public: + static int iconOffset; + explicit NameItemDelegate(QObject *parent); - void paint(QPainter *painter, const QStyleOptionViewItem &styleOption, - const QModelIndex &index) const override; + QSize sizeHint(const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + void paint(QPainter *painter, + const QStyleOptionViewItem &styleOption, + const QModelIndex &index) const override; QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setEditorData(QWidget *editor, const QModelIndex &index) const override; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; protected: - bool editorEvent ( QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index ) override; - void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + bool editorEvent(QEvent *event, + QAbstractItemModel *model, + const QStyleOptionViewItem &option, + const QModelIndex &index) override; + void updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, + const QModelIndex &index) const override; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 602a0f73164..f02e41fc863 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -203,6 +203,12 @@ QVariant NavigatorTreeModel::data(const QModelIndex &index, int role) const if (role == ItemIsVisibleRole) // independent of column return m_view->isNodeInvisible(modelNode) ? Qt::Unchecked : Qt::Checked; + if (role == ItemOrAncestorLocked) + return ModelNode::isThisOrAncestorLocked(modelNode); + + if (role == ModelNodeRole) + return QVariant::fromValue(modelNode); + if (index.column() == ColumnType::Name) { if (role == Qt::DisplayRole) { return modelNode.displayName(); @@ -237,8 +243,6 @@ QVariant NavigatorTreeModel::data(const QModelIndex &index, int role) const auto op = m_actionManager->modelNodePreviewOperation(modelNode); if (op) return op(modelNode); - } else if (role == ModelNodeRole) { - return QVariant::fromValue(modelNode); } } else if (index.column() == ColumnType::Alias) { // export if (role == Qt::CheckStateRole) @@ -268,7 +272,7 @@ Qt::ItemFlags NavigatorTreeModel::flags(const QModelIndex &index) const if (index.column() == ColumnType::Alias || index.column() == ColumnType::Visibility || index.column() == ColumnType::Lock) - return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemNeverHasChildren; + return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemNeverHasChildren; const ModelNode modelNode = modelNodeForIndex(index); if (ModelNode::isThisOrAncestorLocked(modelNode)) @@ -277,8 +281,7 @@ Qt::ItemFlags NavigatorTreeModel::flags(const QModelIndex &index) const if (index.column() == ColumnType::Name) return Qt::ItemIsEditable | Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsSelectable | Qt::ItemIsEnabled; - return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable - | Qt::ItemNeverHasChildren; + return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemNeverHasChildren; } void static appendForcedNodes(const NodeListProperty &property, QList &list) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp index 8be526278c6..ad9c2d6dbed 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp @@ -33,6 +33,7 @@ #include "previewtooltip.h" #include +#include #include #include @@ -63,32 +64,28 @@ public: baseStyle()->setParent(parent); } - void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const override + void drawPrimitive(PrimitiveElement element, + const QStyleOption *option, + QPainter *painter, + const QWidget *widget = nullptr) const override { static QRect mouseOverStateSavedFrameRectangle; if (element == QStyle::PE_PanelItemViewRow) { if (option->state & QStyle::State_MouseOver) mouseOverStateSavedFrameRectangle = option->rect; - if (option->state & QStyle::State_Selected) - NavigatorTreeView::drawSelectionBackground(painter, *option); - + painter->fillRect(option->rect.adjusted(0, delegateMargin, 0, -delegateMargin), + Theme::getColor(Theme::Color::QmlDesigner_BorderColor)); } else if (element == PE_IndicatorItemViewItemDrop) { // between elements and on elements we have a width if (option->rect.width() > 0) { m_currentTextColor = option->palette.text().color(); QRect frameRectangle = adjustedRectangleToWidgetWidth(option->rect, widget); painter->save(); - if (option->rect.height() == 0) { bool isNotRootItem = option->rect.top() > 10 && mouseOverStateSavedFrameRectangle.top() > 10; - if (isNotRootItem) { + if (isNotRootItem) drawIndicatorLine(frameRectangle.topLeft(), frameRectangle.topRight(), painter); - // there is only a line in the styleoption object at this moment - // so we need to use the last saved rect from the mouse over state - frameRectangle = adjustedRectangleToWidgetWidth(mouseOverStateSavedFrameRectangle, widget); - drawBackgroundFrame(frameRectangle, painter); - } } else { drawHighlightFrame(frameRectangle, painter); } @@ -96,12 +93,72 @@ public: } } else if (element == PE_FrameFocusRect) { // don't draw + } else if (element == PE_IndicatorBranch) { + painter->save(); + static const int decoration_size = 10; + int mid_h = option->rect.x() + option->rect.width() / 2; + int mid_v = option->rect.y() + option->rect.height() / 2; + int bef_h = mid_h; + int bef_v = mid_v; + int aft_h = mid_h; + int aft_v = mid_v; + QBrush brush(Theme::getColor(Theme::Color::DSsliderHandle), Qt::SolidPattern); + if (option->state & State_Item) { + if (option->direction == Qt::RightToLeft) + painter->fillRect(option->rect.left(), mid_v, bef_h - option->rect.left(), 1, brush); + else + painter->fillRect(aft_h, mid_v, option->rect.right() - aft_h + 1, 1, brush); + } + if (option->state & State_Sibling) + painter->fillRect(mid_h, aft_v, 1, option->rect.bottom() - aft_v + 1, brush); + if (option->state & (State_Open | State_Children | State_Item | State_Sibling)) + painter->fillRect(mid_h, option->rect.y(), 1, bef_v - option->rect.y(), brush); + if (option->state & State_Children) { + int delta = decoration_size / 2; + bef_h -= delta; + bef_v -= delta; + aft_h += delta; + aft_v += delta; + + const QRectF rect(bef_h, bef_v, decoration_size + 1, decoration_size + 1); + painter->fillRect(rect, QBrush(Theme::getColor(Theme::Color::QmlDesigner_BackgroundColorDarkAlternate))); + + static const QPointF collapsePoints[3] = { + QPointF(0.0, 0.0), + QPointF(4.0, 4.0), + QPointF(0.0, 8.0) + }; + + static const QPointF expandPoints[3] = { + QPointF(0.0, 0.0), + QPointF(8.0, 0.0), + QPointF(4.0, 4.0) + }; + + auto color = Theme::getColor(Theme::Color::IconsBaseColor); + painter->setPen(color); + painter->setBrush(color); + + if (option->state & QStyle::State_Open) { + painter->translate(QPointF(mid_h - 4, mid_v - 2)); + painter->drawConvexPolygon(expandPoints, 3); + } else { + painter->translate(QPointF(mid_h - 2, mid_v - 4)); + painter->drawConvexPolygon(collapsePoints, 3); + } + } + painter->restore(); + } else { QProxyStyle::drawPrimitive(element, option, painter, widget); } } - int styleHint(StyleHint hint, const QStyleOption *option = nullptr, const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override { + int styleHint(StyleHint hint, + const QStyleOption *option = nullptr, + const QWidget *widget = nullptr, + QStyleHintReturn *returnData = nullptr) const override + { if (hint == SH_ItemView_ShowDecorationSelected) return 0; else @@ -180,7 +237,8 @@ NavigatorTreeView::NavigatorTreeView(QWidget *parent) void NavigatorTreeView::drawSelectionBackground(QPainter *painter, const QStyleOption &option) { painter->save(); - painter->fillRect(option.rect, option.palette.color(QPalette::Highlight)); + painter->fillRect(option.rect.adjusted(0, delegateMargin, 0, -delegateMargin), + Theme::getColor(Theme::Color::QmlDesigner_HighlightColor)); painter->restore(); } @@ -223,5 +281,4 @@ bool NavigatorTreeView::viewportEvent(QEvent *event) return QTreeView::viewportEvent(event); } - } diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index e1702bdac46..c2ed5c72065 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -145,6 +145,7 @@ void NavigatorView::modelAttached(Model *model) treeView->header()->resizeSection(NavigatorTreeModel::ColumnType::Visibility, 26); treeView->header()->resizeSection(NavigatorTreeModel::ColumnType::Lock, 26); treeView->setIndentation(20); + treeView->setSelectionBehavior(QAbstractItemView::SelectRows); m_currentModelInterface->setFilter(false); @@ -493,7 +494,6 @@ void NavigatorView::changeSelection(const QItemSelection & /*newSelection*/, con QSet nodeSet; for (const QModelIndex &index : treeWidget()->selectionModel()->selectedIndexes()) { - const ModelNode modelNode = modelNodeForIndex(index); if (modelNode.isValid()) nodeSet.insert(modelNode); @@ -539,7 +539,7 @@ void NavigatorView::updateItemSelection() } bool blocked = blockSelectionChangedSignal(true); - treeWidget()->selectionModel()->select(itemSelection, QItemSelectionModel::ClearAndSelect); + treeWidget()->selectionModel()->select(itemSelection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); blockSelectionChangedSignal(blocked); if (!selectedModelNodes().isEmpty()) @@ -586,7 +586,7 @@ void NavigatorView::reparentAndCatch(NodeAbstractProperty property, const ModelN { try { property.reparentHere(modelNode); - } catch (Exception &exception) { + } catch (Exception &exception) { exception.showException(); } } @@ -620,29 +620,29 @@ void NavigatorView::setupWidget() const QIcon visibilityOnIcon = Utils::StyleHelper::getIconFromIconFont(fontName, Theme::getIconUnicode(Theme::Icon::visibilityOn), - 28, 28, QColor(Qt::white)); + 20, 20, QColor(Qt::white)); const QIcon visibilityOffIcon = Utils::StyleHelper::getIconFromIconFont(fontName, Theme::getIconUnicode(Theme::Icon::visibilityOff), - 28, 28, QColor(Qt::white)); + 20, 20, QColor(Qt::white)); const QIcon aliasOnIcon = Utils::StyleHelper::getIconFromIconFont(fontName, Theme::getIconUnicode(Theme::Icon::idAliasOn), - 28, 28, QColor(Qt::red)); + 20, 20, QColor(Qt::red)); const QIcon aliasOffIcon = Utils::StyleHelper::getIconFromIconFont(fontName, Theme::getIconUnicode(Theme::Icon::idAliasOff), - 28, 28, QColor(Qt::white)); + 20, 20, QColor(Qt::white)); const QIcon lockOnIcon = Utils::StyleHelper::getIconFromIconFont(fontName, Theme::getIconUnicode(Theme::Icon::lockOn), - 28, 28, QColor(Qt::white)); + 20, 20, QColor(Qt::white)); const QIcon lockOffIcon = Utils::StyleHelper::getIconFromIconFont(fontName, Theme::getIconUnicode(Theme::Icon::lockOff), - 28, 28, QColor(Qt::white)); + 20, 20, QColor(Qt::white)); auto idDelegate = new NameItemDelegate(this); diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h index 6189b24559a..451de3be71c 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.h +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h @@ -43,6 +43,8 @@ QT_END_NAMESPACE namespace QmlDesigner { +static int delegateMargin = 2; + class NavigatorWidget; class NavigatorTreeModel; @@ -50,7 +52,8 @@ enum NavigatorRoles { ItemIsVisibleRole = Qt::UserRole, RowIsPropertyRole = Qt::UserRole + 1, ModelNodeRole = Qt::UserRole + 2, - ToolTipImageRole = Qt::UserRole + 3 + ToolTipImageRole = Qt::UserRole + 3, + ItemOrAncestorLocked = Qt::UserRole + 4 }; class NavigatorView : public AbstractView diff --git a/src/plugins/qmldesigner/components/previewtooltip/previewtooltipbackend.cpp b/src/plugins/qmldesigner/components/previewtooltip/previewtooltipbackend.cpp index 559cd5c17b9..4fac1432e58 100644 --- a/src/plugins/qmldesigner/components/previewtooltip/previewtooltipbackend.cpp +++ b/src/plugins/qmldesigner/components/previewtooltip/previewtooltipbackend.cpp @@ -31,7 +31,6 @@ #include #include -#include #include namespace QmlDesigner { @@ -65,8 +64,7 @@ void PreviewTooltipBackend::showTooltip() }, [] {}); - auto desktopWidget = QApplication::desktop(); - auto mousePosition = desktopWidget->cursor().pos(); + auto mousePosition = QCursor::pos(); mousePosition += {20, 20}; m_tooltip->move(mousePosition); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index 5f17ca77ffa..798274af20a 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include @@ -495,7 +496,9 @@ void PropertyEditorContextObject::hideCursor() return; QApplication::setOverrideCursor(QCursor(Qt::BlankCursor)); - m_lastPos = QCursor::pos(); + + if (QWidget *w = QApplication::activeWindow()) + m_lastPos = QCursor::pos(w->screen()); } void PropertyEditorContextObject::restoreCursor() @@ -503,8 +506,19 @@ void PropertyEditorContextObject::restoreCursor() if (!QApplication::overrideCursor()) return; - QCursor::setPos(m_lastPos); QApplication::restoreOverrideCursor(); + + if (QWidget *w = QApplication::activeWindow()) + QCursor::setPos(w->screen(), m_lastPos); +} + +void PropertyEditorContextObject::holdCursorInPlace() +{ + if (!QApplication::overrideCursor()) + return; + + if (QWidget *w = QApplication::activeWindow()) + QCursor::setPos(w->screen(), m_lastPos); } QStringList PropertyEditorContextObject::styleNamesForFamily(const QString &family) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.h index 35c909192b0..d4c39306c13 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.h @@ -91,6 +91,7 @@ public: Q_INVOKABLE void hideCursor(); Q_INVOKABLE void restoreCursor(); + Q_INVOKABLE void holdCursorInPlace(); Q_INVOKABLE QStringList styleNamesForFamily(const QString &family); diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 688dae2d074..d00294b89e0 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -693,35 +693,33 @@ void ModelNode::removeProperty(const PropertyName &name) const model()->d->removeProperty(internalNode()->property(name)); } - /*! \brief removes this node from the node tree */ - -static QList descendantNodes(const ModelNode &parent) +static QList descendantNodes(const ModelNode &node) { - QList descendants(parent.directSubModelNodes()); - foreach (const ModelNode &child, parent.directSubModelNodes()) { + const QList children = node.directSubModelNodes(); + QList descendants = children; + for (const ModelNode &child : children) descendants += descendantNodes(child); - } + return descendants; } static void removeModelNodeFromSelection(const ModelNode &node) { - { // remove nodes from the active selection: - QList selectedList = node.view()->selectedModelNodes(); + // remove nodes from the active selection + QList selectedList = node.view()->selectedModelNodes(); - foreach (const ModelNode &childModelNode, descendantNodes(node)) - selectedList.removeAll(childModelNode); - selectedList.removeAll(node); + const QList descendants = descendantNodes(node); + for (const ModelNode &descendantNode : descendants) + selectedList.removeAll(descendantNode); - node.view()->setSelectedModelNodes(selectedList); - } + selectedList.removeAll(node); + + node.view()->setSelectedModelNodes(selectedList); } - /*! \brief complete removes this ModelNode from the Model - */ void ModelNode::destroy() { diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 938a718d7c4..ff6110efb76 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -208,6 +208,8 @@ QmlDesignerPlugin::~QmlDesignerPlugin() //////////////////////////////////////////////////// bool QmlDesignerPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage/* = 0*/) { + QDir{}.mkpath(Core::ICore::cacheResourcePath()); + if (!Utils::HostOsInfo::canCreateOpenGLContext(errorMessage)) return false; d = new QmlDesignerPluginPrivate; diff --git a/src/plugins/qmljstools/qmljscodestylesettingspage.cpp b/src/plugins/qmljstools/qmljscodestylesettingspage.cpp index 560fce6f706..f99f98f1b36 100644 --- a/src/plugins/qmljstools/qmljscodestylesettingspage.cpp +++ b/src/plugins/qmljstools/qmljscodestylesettingspage.cpp @@ -30,6 +30,7 @@ #include "qmljsindenter.h" #include "qmljsqtstylecodeformatter.h" +#include #include #include #include diff --git a/src/plugins/texteditor/basehoverhandler.cpp b/src/plugins/texteditor/basehoverhandler.cpp index 34eb326b812..f1a1053e5d9 100644 --- a/src/plugins/texteditor/basehoverhandler.cpp +++ b/src/plugins/texteditor/basehoverhandler.cpp @@ -143,9 +143,9 @@ void BaseHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, Re void BaseHoverHandler::operateTooltip(TextEditorWidget *editorWidget, const QPoint &point) { - const QVariant helpItem = m_lastHelpItemIdentified.isEmpty() - ? QVariant() - : QVariant::fromValue(m_lastHelpItemIdentified); + const QVariant helpItem = m_lastHelpItemIdentified.isValid() + ? QVariant::fromValue(m_lastHelpItemIdentified) + : QVariant(); const bool extractHelp = m_lastHelpItemIdentified.isValid() && !m_lastHelpItemIdentified.isFuzzyMatch(); const QString helpContents = extractHelp ? m_lastHelpItemIdentified.firstParagraph() diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index 05f3c8ae17b..317d5a132b7 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -305,23 +305,17 @@ void CodeAssistantPrivate::displayProposal(IAssistProposal *newProposal, AssistR // TODO: The proposal should own the model until someone takes it explicitly away. QScopedPointer proposalCandidate(newProposal); - bool destroyCurrentContext = false; - if (isDisplayingProposal()) { - if (!m_proposal->isFragile()) - return; - destroyCurrentContext = true; - } + if (isDisplayingProposal() && !m_proposal->isFragile()) + return; int basePosition = proposalCandidate->basePosition(); if (m_editorWidget->position() < basePosition) { - if (destroyCurrentContext) - destroyContext(); + destroyContext(); return; } if (m_abortedBasePosition == basePosition && reason != ExplicitlyInvoked) { - if (destroyCurrentContext) - destroyContext(); + destroyContext(); return; } @@ -333,8 +327,7 @@ void CodeAssistantPrivate::displayProposal(IAssistProposal *newProposal, AssistR return; } - if (destroyCurrentContext) - destroyContext(); + destroyContext(); clearAbortedPosition(); m_proposal.reset(proposalCandidate.take()); diff --git a/src/plugins/texteditor/snippets/snippetssettingspage.cpp b/src/plugins/texteditor/snippets/snippetssettingspage.cpp index 802c9e456e7..c69002f6b9f 100644 --- a/src/plugins/texteditor/snippets/snippetssettingspage.cpp +++ b/src/plugins/texteditor/snippets/snippetssettingspage.cpp @@ -32,6 +32,7 @@ #include "ui_snippetssettingspage.h" #include +#include #include #include #include diff --git a/src/plugins/welcome/images/download.png b/src/plugins/welcome/images/download.png new file mode 100644 index 00000000000..7b98258ac34 Binary files /dev/null and b/src/plugins/welcome/images/download.png differ diff --git a/src/plugins/welcome/images/download@2x.png b/src/plugins/welcome/images/download@2x.png new file mode 100644 index 00000000000..8b8e6c10319 Binary files /dev/null and b/src/plugins/welcome/images/download@2x.png differ diff --git a/src/plugins/welcome/welcome.qrc b/src/plugins/welcome/welcome.qrc index d5b825d7e16..018d398c1b0 100644 --- a/src/plugins/welcome/welcome.qrc +++ b/src/plugins/welcome/welcome.qrc @@ -23,5 +23,7 @@ images/expandarrow.png images/expandarrow@2x.png images/border.png + images/download.png + images/download@2x.png diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index f814c9f4702..875cfb7c80f 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -287,6 +287,7 @@ public: auto l = new QVBoxLayout; l->setContentsMargins(0, 0, 0, 0); l->setSpacing(5); + l->addWidget(new IconAndLink("download", tr("Get Qt"), "https://www.qt.io/download", this)); l->addWidget(new IconAndLink("qtaccount", tr("Qt Account"), "https://account.qt.io", this)); l->addWidget(new IconAndLink("community", tr("Online Community"), "https://forum.qt.io", this)); l->addWidget(new IconAndLink("blogs", tr("Blogs"), "https://planet.qt.io", this)); diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index 131105b91f3..e1e5e32f035 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -86,32 +86,32 @@ QVector ProFileEvaluator::fixifiedValues( QVector result; foreach (const ProString &str, d->values(ProKey(variable))) { const QString &el = d->m_option->expandEnvVars(str.toQString()); - if (IoUtils::isAbsolutePath(el)) { - result << SourceFile{QDir::cleanPath(el), str.sourceFile()}; + const QString fn = IoUtils::isAbsolutePath(el) + ? QDir::cleanPath(el) : QDir::cleanPath(baseDirectory + QLatin1Char('/') + el); + if (IoUtils::exists(fn)) { + result << SourceFile{fn, str.sourceFile()}; + continue; + } + QStringView fileNamePattern; + if (expandWildcards) { + fileNamePattern = IoUtils::fileName(fn); + expandWildcards = fileNamePattern.contains('*') || fileNamePattern.contains('?'); + } + if (expandWildcards) { + const QString patternBaseDir = IoUtils::pathName(fn).toString(); + const QDir::Filters filters = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot; + for (const QString &fileName : QDir(patternBaseDir).entryList( + QStringList(fileNamePattern.toString()), filters)) { + const QString fullFilePath + = QDir::cleanPath(patternBaseDir + '/' + fileName); + result << SourceFile({fullFilePath, str.sourceFile()}); + } } else { - QString fn = QDir::cleanPath(baseDirectory + QLatin1Char('/') + el); - if (IoUtils::exists(fn)) { + if (IoUtils::isAbsolutePath(el)) { result << SourceFile{fn, str.sourceFile()}; } else { - QStringView fileNamePattern; - if (expandWildcards) { - fileNamePattern = IoUtils::fileName(fn); - expandWildcards = fileNamePattern.contains('*') - || fileNamePattern.contains('?'); - } - if (expandWildcards) { - const QString patternBaseDir = IoUtils::pathName(fn).toString(); - const QDir::Filters filters = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot; - for (const QString &fileName : QDir(patternBaseDir).entryList( - QStringList(fileNamePattern.toString()), filters)) { - const QString fullFilePath - = QDir::cleanPath(patternBaseDir + '/' + fileName); - result << SourceFile({fullFilePath, str.sourceFile()}); - } - } else { - result << SourceFile{QDir::cleanPath(buildDirectory + QLatin1Char('/') + el), - str.sourceFile()}; - } + result << SourceFile{QDir::cleanPath(buildDirectory + QLatin1Char('/') + el), + str.sourceFile()}; } } } diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index d1fbb86a153..40f2f2e8baf 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -7069,6 +7069,24 @@ id="path5457-0-5" style="display:inline" /> + + + + diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 657dadb2d85..4b0704efc1d 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -519,6 +519,7 @@ enum AdditionalCriteria static bool matchesAdditionalCriteria(int criteria) { #ifdef Q_OS_UNIX + Q_UNUSED(criteria) return true; #else return !(criteria & NeedsInferiorCall); diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index 26afa78c8a6..e3adb5c49d5 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -670,9 +670,9 @@ def getChildByClass(parent, classToSearchFor, occurrence=1): return children[occurrence - 1] def getHelpViewer(): - return waitForObject("{type='Help::Internal::TextBrowserHelpWidget' unnamed='1' " - "visible='1' window=':Qt Creator_Core::Internal::MainWindow'}", + return waitForObject("{type='QLiteHtmlWidget' unnamed='1' visible='1' " + "window=':Qt Creator_Core::Internal::MainWindow'}", 1000) def getHelpTitle(): - return str(getHelpViewer().documentTitle) + return str(getHelpViewer().title()) diff --git a/tests/system/suite_HELP/tst_HELP04/test.py b/tests/system/suite_HELP/tst_HELP04/test.py index 8a3049c173a..18e3ee45639 100644 --- a/tests/system/suite_HELP/tst_HELP04/test.py +++ b/tests/system/suite_HELP/tst_HELP04/test.py @@ -32,27 +32,17 @@ urlDictionary = { "abundance":"qthelp://com.trolltech.qt.487/qdoc/gettingstarted def __getSelectedText__(): - hv = getHelpViewer() try: - return hv.textCursor().selectedText() - except: - pass - try: - test.log("Falling back to searching for selection in HTML.") - return getHighlightsInHtml(str(hv.toHtml())) + return str(getHelpViewer().selectedText()) except: test.warning("Could not get highlighted text.") return str("") def __getUrl__(): - helpViewer = getHelpViewer() try: - url = helpViewer.url + url = getHelpViewer().url() except: - try: - url = helpViewer.source - except: - return "" + return "" return str(url.scheme) + "://" + str(url.host) + str(url.path) def getHighlightsInHtml(htmlCode):