From 8f8fa81c30831f295fa8d2215fc08f793e61bc92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cotty?= Date: Thu, 3 Dec 2020 20:59:34 +0100 Subject: [PATCH 01/60] Qbs: Fix executable path in equivalent command line Use QbsSettings to get qbs executable file path. Change-Id: Ie8e9dc85712a2a51ee14b5715cf5529ecd3b44c0 Reviewed-by: Christian Kandeler --- src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index 07ea3cd1b8d..5dff4d1b414 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -272,11 +272,7 @@ QString QbsBuildConfiguration::configurationName() const QString QbsBuildConfiguration::equivalentCommandLine(const QbsBuildStepData &stepData) const { CommandLine commandLine; - const QString qbsInstallDir = QString::fromLocal8Bit(qgetenv("QBS_INSTALL_DIR")); - const QString qbsFilePath = HostOsInfo::withExecutableSuffix(!qbsInstallDir.isEmpty() - ? qbsInstallDir + QLatin1String("/bin/qbs") - : QCoreApplication::applicationDirPath() + QLatin1String("/qbs")); - commandLine.addArg(QDir::toNativeSeparators(qbsFilePath)); + commandLine.addArg(QDir::toNativeSeparators(QbsSettings::qbsExecutableFilePath().toString())); commandLine.addArg(stepData.command); const QString buildDir = buildDirectory().toUserOutput(); commandLine.addArgs({"-d", buildDir}); From ec68b4e96c8f42b9446604191365324b04bb6813 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Sun, 6 Dec 2020 17:17:50 +0200 Subject: [PATCH 02/60] Android: fix SDK path on macOS Change-Id: I369cf218eb2fd42ede04a6cb6b638d6fa6282994 Reviewed-by: Alessandro Portale --- src/plugins/android/androidconfigurations.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 0d342acb530..13dd6f8a7de 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1020,8 +1020,7 @@ FilePath AndroidConfig::defaultSdkPath() // Set default path of SDK as used by Android Studio if (Utils::HostOsInfo::isMacHost()) { return Utils::FilePath::fromString( - QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) - + "/../Android/sdk"); + QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/Android/sdk"); } if (Utils::HostOsInfo::isWindowsHost()) { From e9f73408166f95596167ccaa79ecda522714daa8 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 2 Dec 2020 18:34:46 +0100 Subject: [PATCH 03/60] Doc: Add missing docs for 2D effects Moved the section to its own topic, because it was getting very long. Also described the properties of each effect. Fixes: QDS-3229 Change-Id: Ie93f4ca956bdca4afbd31e7606a47c4e1d1e5bb4 Reviewed-by: Thomas Hartmann --- .../qtquick/library/qtquick-data-models.qdoc | 4 + .../src/qtquick/qtquick-buttons.qdoc | 6 +- .../src/qtquick/qtquick-components.qdoc | 7 +- doc/qtdesignstudio/examples/doc/sidemenu.qdoc | 2 +- .../images/icons/displace-16px.png | Bin 0 -> 335 bytes .../images/icons/gamma-adjust-16px.png | Bin 0 -> 273 bytes .../images/icons/gaussian-blur-16px.png | Bin 0 -> 333 bytes .../images/icons/inner-shadow-16px.png | Bin 0 -> 208 bytes .../images/icons/levels-16px.png | Bin 0 -> 108 bytes .../images/icons/recursive-blur-16px.png | Bin 0 -> 335 bytes .../images/icons/threshold-16px.png | Bin 0 -> 147 bytes .../images/studio-2d-effects.png | Bin 0 -> 10924 bytes .../src/qtdesignstudio-toc.qdoc | 1 + .../src/qtdesignstudio-visual-effects.qdocinc | 117 ------ .../qtdesignstudio-visual-effects.qdoc | 376 ++++++++++++++++++ .../qtquickdesigner-components.qdoc | 5 +- 16 files changed, 392 insertions(+), 126 deletions(-) create mode 100644 doc/qtdesignstudio/images/icons/displace-16px.png create mode 100644 doc/qtdesignstudio/images/icons/gamma-adjust-16px.png create mode 100644 doc/qtdesignstudio/images/icons/gaussian-blur-16px.png create mode 100644 doc/qtdesignstudio/images/icons/inner-shadow-16px.png create mode 100644 doc/qtdesignstudio/images/icons/levels-16px.png create mode 100644 doc/qtdesignstudio/images/icons/recursive-blur-16px.png create mode 100644 doc/qtdesignstudio/images/icons/threshold-16px.png create mode 100644 doc/qtdesignstudio/images/studio-2d-effects.png delete mode 100644 doc/qtdesignstudio/src/qtdesignstudio-visual-effects.qdocinc create mode 100644 doc/qtdesignstudio/src/qtquickdesigner-components/qtdesignstudio-visual-effects.qdoc diff --git a/doc/qtcreator/src/qtquick/library/qtquick-data-models.qdoc b/doc/qtcreator/src/qtquick/library/qtquick-data-models.qdoc index 24cdb187e3a..f807f45e0fc 100644 --- a/doc/qtcreator/src/qtquick/library/qtquick-data-models.qdoc +++ b/doc/qtcreator/src/qtquick/library/qtquick-data-models.qdoc @@ -26,7 +26,11 @@ /*! \page quick-data-models.html \previouspage quick-controls.html + \if defined(qtdesignstudio) + \nextpage quick-2d-effects.html + \else \nextpage quick-buttons.html + \endif \title Lists and Other Data Models diff --git a/doc/qtcreator/src/qtquick/qtquick-buttons.qdoc b/doc/qtcreator/src/qtquick/qtquick-buttons.qdoc index 8b59984afff..288a80ec58d 100644 --- a/doc/qtcreator/src/qtquick/qtquick-buttons.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-buttons.qdoc @@ -30,8 +30,12 @@ // ********************************************************************** /*! - \previouspage quick-data-models.html \page quick-buttons.html + \if defined(qtdesignstudio) + \previouspage quick-2d-effects.html + \else + \previouspage quick-data-models.html + \endif \nextpage quick-scalable-image.html \title Creating Buttons diff --git a/doc/qtcreator/src/qtquick/qtquick-components.qdoc b/doc/qtcreator/src/qtquick/qtquick-components.qdoc index e54e3ca020e..20460bbe152 100644 --- a/doc/qtcreator/src/qtquick/qtquick-components.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-components.qdoc @@ -123,14 +123,13 @@ \li \l Images \li \l {User Interaction Methods} \li \l {Lists and Other Data Models} + \if defined(qtdesignstudio) + \li \l {2D Effects} + \endif \endlist \include qtquick-animation-types.qdocinc qtquick animation types - \if defined(qtdesignstudio) - \include qtdesignstudio-visual-effects.qdocinc qml visual effects - \endif - \include qtquick-mcu-support.qdocinc mcu qtquick components \section1 Styling Controls diff --git a/doc/qtdesignstudio/examples/doc/sidemenu.qdoc b/doc/qtdesignstudio/examples/doc/sidemenu.qdoc index 06131795b50..da4fe61e485 100644 --- a/doc/qtdesignstudio/examples/doc/sidemenu.qdoc +++ b/doc/qtdesignstudio/examples/doc/sidemenu.qdoc @@ -231,5 +231,5 @@ alias to be able to switch the image inside the stack. For more information about the available Qt graphical effects, see - \l {Applying Visual Effects}. + \l {2D Effects}. */ diff --git a/doc/qtdesignstudio/images/icons/displace-16px.png b/doc/qtdesignstudio/images/icons/displace-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..dc2306b93bc09d2d7da2c291d6d6aa33b45e685d GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4i*LmhONKMUokK+ig~&?hDb=39<=oqVUS^e z@IUoJp||5Jc8+y(q+FZS>>ak4q&PM@N1Jfy`cAYkV|6$WSusC@PR%!`?8wbFGmuiM9bj(js^8ULdTHN6|PlA?F}yz2guxA5PG zsGQ7e6QX}9J<9u=6!<3diof1(EhV{`D;O{TN?KP}e6X>jVqGZny^g29PDk!mN;(}f z)p}9%W1rVu9p!%3`oH|HTIfnEJzCXPTez}qPQe~Gp9sl7?qe3ucZt59w_{}?%kHVy0&a0Oeq~@_VDNPHb6Mw<&;$UKjgoW# literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/gamma-adjust-16px.png b/doc/qtdesignstudio/images/icons/gamma-adjust-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b16cad6e972725ff67c4de3a94056ba44d7925 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4i*LmhONKMUokK+-0*a943Us5J?O8^oFK#S z;Qp!kX4W%m81%BkEq7!*d9?5SLyw?+465wv>UrlG%h{i9ILx%2>guU}zPL0&C(36< z_0;W3g3S?=*R1{-*yEUDYNG0H*kgNgeGt!LrIp7F)b3h+SSr$dVx?72!MZe+Unea} z)#VezE{A;yo;GFi*=_u-FH%E;dd!R`Eq$T-`ruy6#aiq3YP#5W&$7F!sy{7RAhlnr e%*XY(yz1A6RY~lNQWzK*7(8A5T-G@yGywo{1#&9@ literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/gaussian-blur-16px.png b/doc/qtdesignstudio/images/icons/gaussian-blur-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..8abcc21164bff2e3c8f35102255e35d08860130f GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7MLb;`Lo9lGC-3!Q4isp$ zZ%xR5sjX6bzNqDF0jTmau!Vem}|=#XY;w5 zDfI8TJ@q&E_C5AwkY|=nU<{e0{6ivCURl-ppVI4gr#=*EHdu88;fQN1oS@wQ$O-WQk@PwwrAMs!?8o-C!0^$W*;d9rR@11*&>+Y k|J}H?XIHuzQys&+!;U9zyF8e{z`(%Z>FVdQ&MBb@0PqfoVE_OC literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/inner-shadow-16px.png b/doc/qtdesignstudio/images/icons/inner-shadow-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd605d1cc730306b7a0043018bb371e21bd8d19 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7rhB?LhFJ72ogB!;WXR*< z{&9UZhy4}fuXb^2+b{o}@7NioQNrCRt)aOk|HPJ)2hYUa5L_-_#kS#};^z#e?6qG# zH%*9A5%cO^q4aY1cb~dV>u-N8GB=i)9m4jly7x89qYcj;6_|hDRG84{nin#mL0#<8 zhdWLJ-?G>ndG^FQGR@oPDDq8zeniK?TJ>#_4d2V`RWIH!KgVz{w0+O+<@wkB85kHC NJYD@<);T3K0RW3sQ}qA< literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/levels-16px.png b/doc/qtdesignstudio/images/icons/levels-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..07cd3642e5e432e75de45681906691439b02b3fa GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRdMrH;E236Z!B?bltwg8_HR|W=#6)RSpxxYe( zfq{XsB*-tA!Qt7BGzJC+5l=G$zS7%^gVDNPH Kb6Mw<&;$UWvKgZQ literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/icons/recursive-blur-16px.png b/doc/qtdesignstudio/images/icons/recursive-blur-16px.png new file mode 100644 index 0000000000000000000000000000000000000000..e12e40b7b85e4b777ccc4f76609515d2f1672ad6 GIT binary patch literal 335 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 yq=lSLVD= \uicontrol Effects to the - component in \uicontrol Navigator. - - The following table summarizes the available effects and contains links to - the documentation of the inherited QML type. - - \table - \header - \li Icon - \li Qt Quick Studio Effect - \li Description - \row - \li \inlineimage icons/blend-mode-16px.png - \li \l [QML] {Blend} - \li Merges two source components by using a blend mode. - - The default mode is \c subtract, where the pixel value from the - component that is going to be blended over the source component - is subtracted from the source and written. - - For a list of possible values and examples of their use, see - \l{Blend::mode}{Blend.mode}. - \row - \li \inlineimage icons/fast-blur-16px.png - \li \l {FastBlur}{Blur} - \li Applies a fast blur effect to one or more source components. - \row - \li \inlineimage icons/brightness-contrast-16px.png - \li \l {BrightnessContrast}{Brightness Contrast} - \li Adjusts brightness and contrast. - \row - \li \inlineimage icons/colourize-16px.png - \li \l {ColorOverlay}{Color Overlay} - \li Alters the colors of the source component by applying an overlay - color. - \row - \li \inlineimage icons/colourize-16px.png - \li \l Colorize - \li Sets the color in the HSL color space. - \row - \li \inlineimage icons/directional-blur-16px.png - \li \l {DirectionalBlur}{Directional Blur} - \li Applies blur effect to the specified direction. - \row - \li \inlineimage icons/drop-shadow-16px.png - \li \l {DropShadow}{Drop Shadow} - \li Generates a soft shadow behind the source component. - \row - \li \inlineimage icons/glow-16px.png - \li \l [QML] {Glow} - \li Generates a halo-like glow around the source component. - \row - \li \inlineimage icons/hue-saturation-16px.png - \li \l {HueSaturation}{Hue Saturation} - \li Alters the source component colors in the HSL color space. - \row - \li \inlineimage icons/opacity-mask-16px.png - \li \l {OpacityMask}{Mask} - \li Masks the source component with another component. - \row - \li \inlineimage icons/mask-blur-16px.png - \li \l {MaskedBlur}{Masked Blur} - \li Applies a blur effect with a varying intesity. - The \l GradientStop type is used to specify the color used at a - given position in a gradient, as represented by a gradient stop. - The default positions for the stops are 0.20, 0.50, 0.80, and 1.00. - The default color is black. - \row - \li \inlineimage icons/radial-blur-16px.png - \li \l {RadialBlur}{Radial Blur} - \li Applies directional blur in a circular direction around the - component's center point. - \row - \li \inlineimage icons/desaturation-16px.png - \li \l {Desaturate}{Saturation} - \li Reduces the saturation of the colors. - \row - \li \inlineimage icons/zoom-blur-16px.png - \li \l {ZoomBlur}{Zoom Blur} - \li Applies directional blur effect towards source component's center - point. - \endtable - -//! [qml visual effects] -*/ diff --git a/doc/qtdesignstudio/src/qtquickdesigner-components/qtdesignstudio-visual-effects.qdoc b/doc/qtdesignstudio/src/qtquickdesigner-components/qtdesignstudio-visual-effects.qdoc new file mode 100644 index 00000000000..dd56ac8855e --- /dev/null +++ b/doc/qtdesignstudio/src/qtquickdesigner-components/qtdesignstudio-visual-effects.qdoc @@ -0,0 +1,376 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Studio documentation. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** +****************************************************************************/ + +/*! + \page quick-2d-effects.html + \previouspage quick-data-models.html + \nextpage quick-buttons.html + + \title 2D Effects + + \QDS provides a set of Qt Quick Studio effects that inherit the types in the + \l {Qt Graphical Effects} module. To apply a visual effect to a component, + drag-and-drop it from \uicontrol Library > \uicontrol Effects to the + component in \uicontrol Navigator. + + \image studio-2d-effects.png "Effects tab in Library" + + Effects have one or more source properties for specifying the visual input + for which the effect is applied to an item. The altered visual output is + then presented in the effect item itself. The source can be another, often + hidden, item in the QML scene. More complex effects can have multiple + sources. The source item type can be any QML type, even video or another + effect. Pipelining multiple effects together is a simple way to create + even more impressive output. + + Each effect has a set of properties that can be used to configure the effect + output. Properties can be animated just like any other QML properties. The + QML type documentation contains property descriptions and basic usage + examples. + + In addition to the effects described in this topic, you can set linear, + radial, and conical gradients. For more information, see + \l{Picking Gradients}. + + \section1 Caching and Borders + + The \uicontrol Cached property allows the effect output pixels to be cached + in order to improve the rendering performance. Every time the source or + effect properties are changed, the pixels in the cache must be updated. + Memory consumption is increased, because an extra buffer of memory is + required for storing the effect output. We recommend that you disable the + cache when the source or the effect properties are animated. + + The \uicontrol {Transparent border} property determines the blur behavior + near the edges of the item, where the pixel blurring is affected by + the pixels outside the source edges. + + If the property is set to \c true, the pixels outside the source are + interpreted as being transparent, which is similar to OpenGL clamp-to-border + extension. The blur is expanded slightly outside the effect item area. + + If the property is set to \c false, the pixels outside the source are + interpreted as containing the same color as the pixels at the edge of + the item, which is similar to OpenGL clamp-to-edge behavior. The blur + does not expand outside the effect item area. + + \section1 Summary of 2D Effects + + The following table summarizes the available effects and contains links to + the documentation of the inherited QML type. + + \note The effects are available when running with OpenGL. + + \table + \header + \li Icon + \li Qt Quick Studio Effect + \li Description + \row + \li \inlineimage icons/blend-mode-16px.png + \li \l [QML] {Blend} + \li Merges two source components by using a blend mode. + + The default \uicontrol Mode is \c subtract, where the pixel value + from the component specified in the \uicontrol {Foreground source} + field, which is going to be blended over the source component, + is subtracted from the source and written over it. + + For a list of possible \uicontrol Mode values and examples of their + use, see \l{Blend::mode}{Blend.mode}. + \row + \li \inlineimage icons/brightness-contrast-16px.png + \li \l {BrightnessContrast}{Brightness Contrast} + \li Adjusts \uicontrol Brightness and \uicontrol Contrast. + \row + \li \inlineimage icons/colourize-16px.png + \li \l {ColorOverlay}{Color Overlay} + \li Alters the colors of the source component by applying an + \uicontrol {Overlay Color}. You can use the color picker + to \l{Picking Colors}{select the color}. + \row + \li \inlineimage icons/colourize-16px.png + \li \l Colorize + \li Sets the color in the HSL color space by specifying \uicontrol Hue, + \uicontrol Lightness, and \uicontrol Saturation values. + \row + \li \inlineimage icons/desaturation-16px.png + \li \l {Desaturate}{Desaturation} + \li Reduces the saturation of the colors by the value set in the + \uicontrol Desaturation field. The value ranges from \c 0.0 + (no change) to \c 1.0 (desaturated). Desaturated pixel values are + calculated as averages of the original RGB component values + of the source item. + \row + \li \inlineimage icons/directional-blur-16px.png + \li \l {DirectionalBlur}{Directional Blur} + \li Applies a blur effect to the specified direction. The value of the + \uicontrol Angle field, defines the direction of the blur. This + effect makes the source item appear to be moving in the direction of + the blur. Blur is applied to both sides of each pixel, and therefore + setting the direction to \c 0 and \c 180 provides the same result. + + The value of the \uicontrol Length field specifies the perceived + amount of movement for each pixel. The movement is divided evenly + to both sides of each pixel. + + The quality of the blur depends on the value of the + \uicontrol Samples field. If the \uicontrol Length value is large, + more samples are needed to preserve high visual quality. + \row + \li \inlineimage icons/displace-16px.png + \li \l Displace + \li Moves the pixels of the source item according to the displacement + map specified in the \uicontrol {Displacement source} field. + + The value of the \uicontrol Displacement field specifies the + scale for the displacement. The larger the scale, the larger the + displacement of the pixels. The value set to \c 0.0 causes no + displacement. The value of \c -1.0 sets the inverted maximum shift + according to the displacement source value, while \c 1.0 sets the + maximum shift. + \row + \li \inlineimage icons/drop-shadow-16px.png + \li \l {DropShadow}{Drop Shadow} + \li Generates a soft shadow behind the source component using a + gaussian blur. This effect blurs the alpha channel of the input and + colorizes the result, which it then places behind the source object + to create a soft shadow. You can set the shadow's color in the + \uicontrol {Drop Shadow Color} field and change its location in the + \uicontrol {Horizontal offset} and \uicontrol {Vertical offset} + fields. + + The value of the \uicontrol Radius field specifies the softness of + the shadow. A larger radius causes the edges of the shadow to appear + more blurry. The ideal blur is achieved by setting the value of the + \uicontrol Samples field to twice as large as the highest required + radius value plus one (\c {samples = 1 + radius * 2}). + + The soft shadow is created by blurring the image live using a + gaussian blur, which is a costly operation. Fullscreen gaussian + blur with even a moderate number of samples will only run at 60 + FPS on high-end graphics hardware. + \row + \li \inlineimage icons/fast-blur-16px.png + \li \l {FastBlur}{Fast Blur} + \li Applies a fast blur effect to one or more source components. + \uicontrol {Fast Blur} offers lower blur quality than + \uicontrol {Gaussian Blur}, but it is faster to render. + This effect softens the source content by blurring it with + an algorithm that uses source content downscaling and + bilinear filtering. Use this effect if the source content + is rapidly changing and the highest possible blur quality + is not needed. + + The value of the \uicontrol Radius field specifies the distance of + the neighboring pixels that affect the blurring of an individual + pixel. A larger radius increases the blur effect. The fast blur + algorithm may internally reduce the accuracy of the radius in order + to provide good rendering performance. + \row + \li \inlineimage icons/gamma-adjust-16px.png + \li \l [QML] {GammaAdjust}{Gamma Adjust} + \li Alters the luminance of the source item. This effect is applied + to each pixel according to the curve that is pre-defined as a + power-law expression, where the value of the \uicontrol Gamma + field is used as the reciprocal scaling exponent. + \row + \li \inlineimage icons/gaussian-blur-16px.png + \li \l [QML] {GaussianBlur}{Gaussian Blur} + \li Applies a gaussian blur effect to one or more source components. + The effect softens the image by blurring it with an algorithm that + uses the gaussian function to calculate the effect. The effect + produces higher quality than \uicontrol {Fast Blur}, but is slower + to render. Performing blur live is a costly operation. Fullscreen + gaussian blur with even a moderate number of \uicontrol Samples + will only run at 60 FPS on high-end graphics hardware. + + The value of the \uicontrol Radius field specifies the distance of + the neighboring pixels that affect the blurring of an individual + pixel. The value of the \uicontrol Distance field is a parameter to + the gaussian function that is used when calculating neighboring + pixel weights for the blurring. A larger deviation causes an image + to appear more blurry, but it also reduces the quality of the blur. + A very large deviation value causes the effect to look a bit similar + to what, for exmple, a box blur algorithm produces. A too small + deviation value makes the effect insignificant for the pixels near + the radius. + \row + \li \inlineimage icons/glow-16px.png + \li \l [QML] {Glow} + \li Generates a halo-like glow around the source component. This effect + blurs the alpha channel of the source and colorizes it with + \uicontrol {Glow color}. It then places the alpha channel behind the + source, resulting in a halo or glow around the object. The quality + of the blurred edge can be controlled by using the values of the + \uicontrol Samples and \uicontrol Radius and the strength of the + glow can be changed using the value of the \uicontrol Spread field. + \row + \li \inlineimage icons/hue-saturation-16px.png + \li \l {HueSaturation}{Hue Saturation} + \li Alters the source component colors in the HSL color space. + This effect is similar to the \uicontrol Colorize effect, but + the \uicontrol Hue and \uicontrol Saturation values are handled + differently. This effect always shifts these values, as well as + the \uicontrol Lightness value from the original, instead of + setting them. + \row + \li \inlineimage icons/inner-shadow-16px.png + \li \l {InnerShadow}{Inner Shadow} + \li Generates a colorized and blurred shadow inside the source using + the color that you specify in the \uicontrol {Inner Shadow Color} + field. + + The quality of the shadow can be controlled by the values of the + \uicontrol Samples and \uicontrol Radius fields. Ideally, the + sample value should be twice as large as the highest required + radius value. For example, if the radius is animated between + \c 0.0 and \c 4.0, samples should be set to \c 8. + + The value of the \uicontrol Spread field specifies how large a part + of the shadow color is strengthened near the source edges. + The effect produces a high quality shadow image, and therefore the + rendering speed of the shadow might not be the highest possible. + The rendering speed is reduced especially if the shadow edges are + heavily softened. For use cases that require faster rendering speed + at the cost of high visual quality, select the \uicontrol Fast + check box. + \row + \li \inlineimage icons/levels-16px.png + \li \l {LevelAdjust}{Level Adjust} + \li Adjusts color levels in the RGBA color space. This effect adjusts + the source item colors separately for each color channel. Source + item contrast can be adjusted and color balance altered. + + The value of the \uicontrol Gamma field specifies the change factor + for how the value of each pixel color channel is altered according + to the equation. Setting the gamma values under + \c QtVector3d(1.0, 1.0, 1.0) makes the image darker, whereas the + values above \c QtVector3d(1.0, 1.0, 1.0) lighten it. The value + ranges from \c QtVector3d(0.0, 0.0, 0.0) (darkest) to \c inf + (lightest). + + You can specify the maximum and minimum input and output levels for + each color channel. \uicontrol {Maximum input} sets the white-point, + which means that all pixels with a higher value are rendered as + white (per color channel). Decreasing this value lightens the light + areas. To darken the light areas and to increase the contrast, + decrease the value of the \uicontrol {Maximum output} field. + + The value of the \uicontrol {Minimum input} field sets the minimum + input level for each color channel. It sets the black-point, which + means that all pixels with a lower value are rendered as black + (per color channel). Increasing this value darkens the dark areas. + To lighten the dark areas and to reduce the contrast, increase the + value of the \uicontrol {Minimum output} field. + \row + \li \inlineimage icons/mask-blur-16px.png + \li \l {MaskedBlur}{Masked Blur} + \li Softens the image by blurring it. The intensity of the blur can be + controlled for each pixel by specifying a \uicontrol {Mask source}, + so that some parts of the source are blurred more than others. + + The value of the \uicontrol Radius field specifies the distance of + the neighboring pixels that affect the blurring of an individual + pixel. + + The value of the \uicontrol Samples field specifies, how many + samples are taken per pixel when blur calculation is done. Larger + samples produce better quality, but are slower to render. + \row + \li \inlineimage icons/opacity-mask-16px.png + \li \l {OpacityMask}{Opacity Mask} + \li Masks the source component with another component specified in the + \uicontrol {Mask source} field. The mask item gets rendered into an + intermediate pixel buffer and the alpha values from the result are + used to determine the visibility of the source item's pixels in the + display. + + Select the \uicontrol Invert check box to specify that the + resulting opacity is the source alpha multiplied with the + inverse of the mask alpha: \c {As * (1 - Am)}. When this property + is \c false, the resulting opacity is the source alpha multiplied + with the mask alpha: \c {As * Am}. + \row + \li \inlineimage icons/radial-blur-16px.png + \li \l {RadialBlur}{Radial Blur} + \li Applies a directional blur effect in a circular direction around the + component's center point. This effect makes the source item appear + to be rotating into the direction of the blur. Other available + motionblur effects are \uicontrol {Zoom Blur} and + \uicontrol {Directional Blur}. + + The value of the \uicontrol Angle field specifies both the direction + of the blur and the level of blurring. The larger the angle, the + more blurred the result. The quality of the blur depends on the + value or the \uicontrol Samples field. If the angle is large, more + samples are needed to preserve high visual quality. + \row + \li \inlineimage icons/recursive-blur-16px.png + \li \l {RecursiveBlur}{Recursive Blur} + \li Blurs repeatedly, providing a strong blur effect. This effect + softens the image by blurring it with an algorithm that uses a + recursive feedback loop to blur the source as many times as + set in the \uicontrol Loops field. + + The value of the \uicontrol Radius field specifies the distance of + the neighboring pixels that affect the blurring of an individual + pixel. + + The effect may produce more blurred results than + \uicontrol {Fast Blur} or \uicontrol {Gaussian Blur}, + but the result is produced asynchronously and takes more time. + \row + \li \inlineimage icons/threshold-16px.png + \li \l {ThresholdMask}{Threshold Mask} + \li Masks the source item with another item specified by + \uicontrol {Mask source}. The value of the \uicontrol Spread + field determines the smoothness of the mask edges near the + \uicontrol Threshold alpha value. Setting spread to \c 0.0 uses + the mask with the specified threshold. Setting higher spread values + softens the transition from the transparent mask pixels towards + opaque mask pixels by adding interpolated values between them. + \row + \li \inlineimage icons/zoom-blur-16px.png + \li \l {ZoomBlur}{Zoom Blur} + \li Applies a directional blur effect towards source component's + center point. This effect makes the source item appear to be + moving towards the center point in Z-direction or the camera + appear to be zooming rapidly. + + The value of the \uicontrol Length field specifies the maximum + perceived amount of movement for each pixel. The amount is smaller + near the center specified by the \uicontrol {Horizontal offset} and + \uicontrol {Vertical offset} fields and reaches the specified value + at the edges. + + The quality of the blur depends on the value of the + \uicontrol Samples field. If the length value is large, + more samples are needed to preserve high visual quality. + + Other available motion blur effects are + \uicontrol {Directional Blur} and \uicontrol {Radial Blur}. + \endtable +*/ diff --git a/doc/qtdesignstudio/src/qtquickdesigner-components/qtquickdesigner-components.qdoc b/doc/qtdesignstudio/src/qtquickdesigner-components/qtquickdesigner-components.qdoc index da170cef0cf..8d1b90f7268 100644 --- a/doc/qtdesignstudio/src/qtquickdesigner-components/qtquickdesigner-components.qdoc +++ b/doc/qtdesignstudio/src/qtquickdesigner-components/qtquickdesigner-components.qdoc @@ -31,7 +31,8 @@ The Qt Quick Studio Components module provides sets of components and effects enhanced for creating animated UIs. The components inherit \l {Qt Quick Shapes QML Types}. The effects inherit the types in the - \l {Qt Graphical Effects} module. + \l {Qt Graphical Effects} module. For more information about the effects, + see \l{2D Effects}. \section1 Using Studio Components @@ -46,6 +47,4 @@ \annotatedlist qtquickstudio-components - \include qtdesignstudio-visual-effects.qdocinc qml visual effects - */ From 493f44ac6a91824c56840ae074237828876a4b75 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 26 Nov 2020 13:14:20 +0100 Subject: [PATCH 04/60] Debugger: Fix QObject children display for Qt6 Task-number: QTCREATORBUG-24098 Change-Id: If7b1e498bcbd191faecbcab9462f1d72331211f3 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index c7b1362a819..ce3f1611ec9 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1893,28 +1893,13 @@ class DumperBase(): else: self.putValue('0x0') self.putType('QObject *') + with SubItem(self, '[children]'): if not self.isCli: self.putSortGroup(8) - base = self.extractPointer(dd + 3 * ptrSize) # It's a QList - begin = self.extractInt(base + 8) - end = self.extractInt(base + 12) - array = base + 16 - if self.qtVersion() < 0x50000: - array += ptrSize - self.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000) - size = end - begin - self.check(size >= 0) - self.putItemCount(size) - if size > 0: - self.putExpandable() - if self.isExpanded(): - addrBase = array + begin * ptrSize - with Children(self, size): - for i in self.childRange(): - with SubItem(self, i): - childPtr = self.extractPointer(addrBase + i * ptrSize) - self.putItem(self.createValue(childPtr, qobjectType)) + dvtablePtr, qptr, parentPtr, children \ + = self.split('ppp{QList}', dd) + self.putItem(children) if isQMetaObject: with SubItem(self, '[strings]'): From eb711d7bd61f1d5f922cc0d14405358a29e570b5 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 4 Dec 2020 16:38:34 +0100 Subject: [PATCH 05/60] Fix qtquickcontrols2.conf in QtDS examples for Qt 6 Since the default style got renamed to 'Basic', Style=Default will cause a runtime error with Qt 6.0.0 Avoid this by not setting an explicit style. Task-number: QTCREATORBUG-24905 Change-Id: I0f35e1dfb38536412da064d9f8ba88264485ef52 Reviewed-by: Thomas Hartmann --- .../examples/Optimal3DScene/qtquickcontrols2.conf | 5 +---- doc/qtdesignstudio/examples/loginui1/qtquickcontrols2.conf | 5 +---- doc/qtdesignstudio/examples/loginui2/qtquickcontrols2.conf | 5 +---- doc/qtdesignstudio/examples/loginui3/qtquickcontrols2.conf | 5 +---- doc/qtdesignstudio/examples/loginui4/qtquickcontrols2.conf | 5 +---- 5 files changed, 5 insertions(+), 20 deletions(-) diff --git a/doc/qtdesignstudio/examples/Optimal3DScene/qtquickcontrols2.conf b/doc/qtdesignstudio/examples/Optimal3DScene/qtquickcontrols2.conf index 75b2cb8fffb..7ad5144dc36 100644 --- a/doc/qtdesignstudio/examples/Optimal3DScene/qtquickcontrols2.conf +++ b/doc/qtdesignstudio/examples/Optimal3DScene/qtquickcontrols2.conf @@ -1,6 +1,3 @@ ; This file can be edited to change the style of the application ; Read "Qt Quick Controls 2 Configuration File" for details: -; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html - -[Controls] -Style=Default +; https://doc.qt.io/qt/qtquickcontrols2-configuration.html diff --git a/doc/qtdesignstudio/examples/loginui1/qtquickcontrols2.conf b/doc/qtdesignstudio/examples/loginui1/qtquickcontrols2.conf index 75b2cb8fffb..7ad5144dc36 100644 --- a/doc/qtdesignstudio/examples/loginui1/qtquickcontrols2.conf +++ b/doc/qtdesignstudio/examples/loginui1/qtquickcontrols2.conf @@ -1,6 +1,3 @@ ; This file can be edited to change the style of the application ; Read "Qt Quick Controls 2 Configuration File" for details: -; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html - -[Controls] -Style=Default +; https://doc.qt.io/qt/qtquickcontrols2-configuration.html diff --git a/doc/qtdesignstudio/examples/loginui2/qtquickcontrols2.conf b/doc/qtdesignstudio/examples/loginui2/qtquickcontrols2.conf index 75b2cb8fffb..7ad5144dc36 100644 --- a/doc/qtdesignstudio/examples/loginui2/qtquickcontrols2.conf +++ b/doc/qtdesignstudio/examples/loginui2/qtquickcontrols2.conf @@ -1,6 +1,3 @@ ; This file can be edited to change the style of the application ; Read "Qt Quick Controls 2 Configuration File" for details: -; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html - -[Controls] -Style=Default +; https://doc.qt.io/qt/qtquickcontrols2-configuration.html diff --git a/doc/qtdesignstudio/examples/loginui3/qtquickcontrols2.conf b/doc/qtdesignstudio/examples/loginui3/qtquickcontrols2.conf index 75b2cb8fffb..7ad5144dc36 100644 --- a/doc/qtdesignstudio/examples/loginui3/qtquickcontrols2.conf +++ b/doc/qtdesignstudio/examples/loginui3/qtquickcontrols2.conf @@ -1,6 +1,3 @@ ; This file can be edited to change the style of the application ; Read "Qt Quick Controls 2 Configuration File" for details: -; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html - -[Controls] -Style=Default +; https://doc.qt.io/qt/qtquickcontrols2-configuration.html diff --git a/doc/qtdesignstudio/examples/loginui4/qtquickcontrols2.conf b/doc/qtdesignstudio/examples/loginui4/qtquickcontrols2.conf index 75b2cb8fffb..7ad5144dc36 100644 --- a/doc/qtdesignstudio/examples/loginui4/qtquickcontrols2.conf +++ b/doc/qtdesignstudio/examples/loginui4/qtquickcontrols2.conf @@ -1,6 +1,3 @@ ; This file can be edited to change the style of the application ; Read "Qt Quick Controls 2 Configuration File" for details: -; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html - -[Controls] -Style=Default +; https://doc.qt.io/qt/qtquickcontrols2-configuration.html From 193becffbbf86731fcdc7e8434c185bbdd4bb80c Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 4 Dec 2020 16:13:49 +0100 Subject: [PATCH 06/60] Fix Qt Quick wizards with Default style and Qt 6 The Default style got renamed to 'Basic' style in Qt 6.0. The 'default' is now to use the style of the system, if available. This however caused the projects generated by the wizard to not start with Qt6: QQmlApplicationEngine failed to load component qrc:/main.qml: module "Default" is not installed Work around this by not hardcoding the 'Default' style if set. It should be the default for Qt 5, anyhow. Fixes: QTCREATORBUG-24905 Change-Id: I71aff50b84e3d096b9a87b7e5b49e2df6821f938 Reviewed-by: Jarek Kobus Reviewed-by: Alessandro Portale --- .../wizards/projects/qtquickapplication/qtquickcontrols2.conf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/qtquickcontrols2.conf b/share/qtcreator/templates/wizards/projects/qtquickapplication/qtquickcontrols2.conf index 9c7633fb0a6..fd44f05995d 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickapplication/qtquickcontrols2.conf +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/qtquickcontrols2.conf @@ -1,6 +1,7 @@ ; This file can be edited to change the style of the application ; Read "Qt Quick Controls 2 Configuration File" for details: -; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html +; https://doc.qt.io/qt/qtquickcontrols2-configuration.html +@if '%{QtQuickControlsStyle}' != 'Default' [Controls] Style=%{QtQuickControlsStyle} @@ -21,3 +22,4 @@ Theme=%{QtQuickControlsStyleTheme} ;Foreground=Brown ;Background=Grey @endif +@endif From 480edb9151f2d9cf261ee072aad784b5765ccc7e Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 4 Dec 2020 16:38:01 +0100 Subject: [PATCH 07/60] Fix Qt 5 specific comments in Qt applicaton wizards Change-Id: I031c8d8284efe87009073b5ea0abf99f81a45615 Reviewed-by: Eike Ziller --- .../wizards/projects/qtquickapplication/CMakeLists.txt | 4 ++-- .../wizards/projects/qtwidgetsapplication/CMakeLists.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/CMakeLists.txt b/share/qtcreator/templates/wizards/projects/qtquickapplication/CMakeLists.txt index 95426d9498c..34f57b36b85 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickapplication/CMakeLists.txt +++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/CMakeLists.txt @@ -12,8 +12,8 @@ set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # QtCreator supports the following variables for Android, which are identical to qmake Android variables. -# Check http://doc.qt.io/qt-5/deployment-android.html for more information. -# They need to be set before the find_package(Qt5 ...) call. +# Check https://doc.qt.io/qt/deployment-android.html for more information. +# They need to be set before the find_package(...) calls below. #if(ANDROID) # set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") diff --git a/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/CMakeLists.txt b/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/CMakeLists.txt index 391da140528..bd016285173 100644 --- a/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/CMakeLists.txt +++ b/share/qtcreator/templates/wizards/projects/qtwidgetsapplication/CMakeLists.txt @@ -12,8 +12,8 @@ set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # QtCreator supports the following variables for Android, which are identical to qmake Android variables. -# Check http://doc.qt.io/qt-5/deployment-android.html for more information. -# They need to be set before the find_package(Qt5 ...) call. +# Check https://doc.qt.io/qt/deployment-android.html for more information. +# They need to be set before the find_package( ...) calls below. #if(ANDROID) # set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") From 2d9de4f706a5005c5ecf2f7d112246f044c8720f Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 7 Dec 2020 15:08:53 +0100 Subject: [PATCH 08/60] QmlDesigner: Fix evaluation dialog automatic close Fix Qt Enterprise Evaluation dialog being child of the QtDS splashscreen resulting in the dialog getting closed together with the splashscreen after its 15 seconds timer runs out. Task-number: QDS-3258 Change-Id: Ied7a883efc925491dae65ac90227573cc93e1167 Reviewed-by: Thomas Hartmann Reviewed-by: Eike Ziller --- src/plugins/coreplugin/icore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index 904bba89136..affad4c7940 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -637,7 +637,7 @@ QWidget *ICore::dialogParent() QWidget *active = QApplication::activeModalWidget(); if (!active) active = QApplication::activeWindow(); - if (!active) + if (!active || (active && active->windowFlags().testFlag(Qt::SplashScreen))) active = m_mainwindow; return active; } From 8e0cb785dcf84a9c79a4a3c50e97c1f21bf6bf6f Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 7 Dec 2020 15:07:13 +0100 Subject: [PATCH 09/60] Debugger: Drop alloc return value from dumper vectorData() helper Only used for checks, do that within the function. Change-Id: I4cc302864a9d3f8edac6f6364dfdac33b548e60a Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 6 +++--- share/qtcreator/debugger/qttypes.py | 20 +++++++++----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index ce3f1611ec9..26d6487ce60 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -571,7 +571,7 @@ class DumperBase(): (ref, alloc, size) = self.split('III', vector_data_ptr) data = vector_data_ptr + 16 self.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000) - return data, size, alloc + return data, size def qArrayData(self, value): if self.qtVersion() >= 0x60000: @@ -1736,7 +1736,7 @@ class DumperBase(): #yield self.createValue(data + i * stepSize, 'void*') def vectorChildrenGenerator(self, value, innerType): - data, size, _ = self.vectorData(value) + data, size = self.vectorData(value) for i in range(size): yield self.createValue(data + i * innerType.size(), innerType) @@ -2148,7 +2148,7 @@ class DumperBase(): with Children(self): innerType = connections.type[0] # Should check: innerType == ns::QObjectPrivate::ConnectionList - data, size, _ = self.vectorData(connections) + data, size = self.vectorData(connections) connectionType = self.createType('@QObjectPrivate::Connection') for i in range(size): first = self.extractPointer(data + i * 2 * ptrSize) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index df9913c4f87..4731ac8fbfe 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -1657,13 +1657,13 @@ def qdump__QStack(d, value): def qdump__QPolygonF(d, value): - data, size, _ = d.vectorData(value) + data, size = d.vectorData(value) d.putItemCount(size) d.putPlotData(data, size, d.createType('@QPointF')) def qdump__QPolygon(d, value): - data, size, _ = d.vectorData(value) + data, size = d.vectorData(value) d.putItemCount(size) d.putPlotData(data, size, d.createType('@QPoint')) @@ -1677,7 +1677,7 @@ def qdump__QGraphicsPolygonItem(d, value): offset = 328 if d.isMsvcTarget() else 320 else: offset = 308 - data, size, alloc = d.vectorData(dptr + offset) + data, size = d.vectorData(dptr + offset) d.putItemCount(size) d.putPlotData(data, size, d.createType('@QPointF')) @@ -2180,7 +2180,7 @@ def qdumpHelper__QVariant45(d, value): def qedit__QVector(d, value, data): values = data.split(',') d.call('void', value, 'resize', str(len(values))) - base, vsize, valloc = d.vectorData(value) + base, vsize = d.vectorData(value) d.setValues(base, value.type[0].name, values) @@ -2198,16 +2198,14 @@ def qdump__QVector(d, value): if value.type.name == d.qtNamespace() + "QVector": d.putBetterType(value.type.name + '<' + value.type.ltarget[0].name + '>') else: - data, size, alloc = d.vectorData(value) - d.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000) + data, size = d.vectorData(value) d.putItemCount(size) d.putPlotData(data, size, value.type[0]) if False: def qdump__QObjectConnectionList(d, value): - data, size, alloc = d.vectorData(value) - d.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000) + data, size = d.vectorData(value) d.putItemCount(size) d.putPlotData(data, size, d.createType('@QObjectPrivate::ConnectionList')) @@ -3245,7 +3243,7 @@ def qdumpHelper_QCbor_string(d, container_ptr, element_index, is_bytes): # d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB, # so be explicit: pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8) - elements_data_ptr, elements_size, _ = d.vectorData(pos + d.ptrSize()) + elements_data_ptr, elements_size = d.vectorData(pos + d.ptrSize()) element_at_n_addr = elements_data_ptr + element_index * 16 # sizeof(QtCbor::Element) == 15 element_value, _, element_flags = d.split('qII', element_at_n_addr) enc = 'latin1' if is_bytes or (element_flags & 8) else 'utf16' @@ -3281,7 +3279,7 @@ def qdumpHelper_QCbor_array(d, container_ptr, is_cbor): # d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB, # so be explicit: pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8) - elements_data_ptr, elements_size, _ = d.vectorData(pos + d.ptrSize()) + elements_data_ptr, elements_size = d.vectorData(pos + d.ptrSize()) d.putItemCount(elements_size) if d.isExpanded(): bytedata, _, _ = d.qArrayData(pos) @@ -3302,7 +3300,7 @@ def qdumpHelper_QCbor_map(d, container_ptr, is_cbor): # d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB, # so be explicit: pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8) - elements_data_ptr, elements_size, _ = d.vectorData(pos + d.ptrSize()) + elements_data_ptr, elements_size = d.vectorData(pos + d.ptrSize()) elements_size = int(elements_size / 2) d.putItemCount(elements_size) if d.isExpanded(): From ca263cd44aa9c1d26392c9ecab8ea9abb98a6a32 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 7 Dec 2020 14:56:00 +0100 Subject: [PATCH 10/60] Doc: Add links to videos Task-number: QDS-2744 Change-Id: I1ffa0cd1cd4999c372c68ec180bcf89f31db7293 Reviewed-by: Thomas Hartmann --- .../images/extraimages/images/DVWd_xMMgvg.jpg | Bin 0 -> 6927 bytes .../images/extraimages/images/Ed8WS03C-Vk.jpg | Bin 0 -> 5740 bytes .../images/extraimages/images/FzmLuRHQXaw.jpg | Bin 0 -> 5543 bytes .../images/extraimages/images/UfvA04CIXv0.jpg | Bin 0 -> 10685 bytes .../images/extraimages/images/w1yhDl93YI0.jpg | Bin 0 -> 11884 bytes .../extraimages/qtcreator-extraimages.qdocconf | 6 +++++- .../qtdesignstudio-extraimages.qdocconf | 7 ++++++- .../src/qtquick/library/qtquick-controls.qdoc | 4 ++++ .../src/qtquick/library/qtquick-images.qdoc | 4 ++++ .../src/qtquick/library/qtquick-text.qdoc | 6 +++--- .../qtquick-connection-editor-bindings.qdoc | 4 ++++ doc/qtcreator/src/qtquick/qtquick-states.qdoc | 4 ++++ .../exporting-3d/exporting-from-maya.qdoc | 4 ++++ .../qtdesignstudio-3d-design-mode.qdoc | 6 +++++- 14 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 doc/qtcreator/images/extraimages/images/DVWd_xMMgvg.jpg create mode 100644 doc/qtcreator/images/extraimages/images/Ed8WS03C-Vk.jpg create mode 100644 doc/qtcreator/images/extraimages/images/FzmLuRHQXaw.jpg create mode 100644 doc/qtcreator/images/extraimages/images/UfvA04CIXv0.jpg create mode 100644 doc/qtcreator/images/extraimages/images/w1yhDl93YI0.jpg diff --git a/doc/qtcreator/images/extraimages/images/DVWd_xMMgvg.jpg b/doc/qtcreator/images/extraimages/images/DVWd_xMMgvg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..995bbc9583d4e65792e9ede0a727c2d6b519502c GIT binary patch literal 6927 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 RO4)4(Ll-D<3@!ZsCIC}O)dc_m literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/extraimages/images/Ed8WS03C-Vk.jpg b/doc/qtcreator/images/extraimages/images/Ed8WS03C-Vk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac26338357b4ffbc22ea5b5a446a1b50fbf1074b GIT binary patch literal 5740 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/extraimages/images/UfvA04CIXv0.jpg b/doc/qtcreator/images/extraimages/images/UfvA04CIXv0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e2a3d8d1bd87c0198260e4469d470fbc44bdf96 GIT binary patch literal 10685 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 Z-c}DXe<_1ZF772e$eCm?vF-og1OT?E`*r{T literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/extraimages/images/w1yhDl93YI0.jpg b/doc/qtcreator/images/extraimages/images/w1yhDl93YI0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ebe585993379e047d9bc2ddb142f0e7a0f20a1c GIT binary patch literal 11884 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 z zsoZuyW9bJA@Pxg*-}Je4sy}{4e15gbFn_ta+_{L;t9Q$txa;#XZBFWzhvJ)kZFisJ zR(q=HriD%nxasDtbyL(W$aSV0Yh;+W)}dA1 zN=qk*yDkb8^AUR5tvB2xWbSg}!KmCA|;fNgbOwrg$=ncrYm7vIinAq0l98kY|x3k6GwMx4=!&8aG+Yf_!Eg z^)~XXR^7BlOEM^uA!K7vfSAj&kO_J-Q%XRYhDU zYwS{4r79}sBjAa5DHVg_L?=$IQ!HlES|@l`CvI8`3eA%_OJ)eF1x~sdc4*<$oN1vA zicJg*3{$+cJj7imTU<Dfn?nLeYNTqUNNP0C>XZ<(&C*J2l5Fv{jO!jm3b0A!WDw z)QA2Pf3;_P+N1f&K5*{BwW(`4PL}m+ADXZHmG5F|Mex(2of)X9c>mz@5v{KQ}9Ej#N(e#)=NWm~%_^|GPuGO(!2x5dUFlXw@JOnaoW zD@}Z>LWP zGoa{oDVq<8$OV_8)k0_dyPWzX7-Wd|bWrkXyRd8Po7G0Pprml>uk)75IFX;JucRH< zY+ci=e#>S(SIzn>?iri*XnxusaEmu}Et@x3iTny^LgQU Date: Sun, 6 Dec 2020 21:45:54 +0100 Subject: [PATCH 11/60] QbsProject: Fix set LangaugeVersion for newer standards I have some products which export c++20, some c++17 (not yet ported) and some which do not specify the language itself. And sometimes I end up with too much errors from the code model, because it sets the language to C++11 or C++17. Also adapted the C language. Change-Id: I0056c8d873191d49164c3e7f3e4fdb24ccc1fb9b Reviewed-by: Christian Kandeler --- src/plugins/qbsprojectmanager/qbsproject.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 2258a99e279..b0a7211bb69 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -786,7 +786,9 @@ static void getExpandedCompilerFlags(QStringList &cFlags, QStringList &cxxFlags, cFlags = cxxFlags = commonFlags; const auto cxxLanguageVersion = arrayToStringList(getCppProp("cxxLanguageVersion")); - if (cxxLanguageVersion.contains("c++17")) + if (cxxLanguageVersion.contains("c++20")) + cxxFlags << "-std=c++20"; + else if (cxxLanguageVersion.contains("c++17")) cxxFlags << "-std=c++17"; else if (cxxLanguageVersion.contains("c++14")) cxxFlags << "-std=c++14"; @@ -805,7 +807,11 @@ static void getExpandedCompilerFlags(QStringList &cFlags, QStringList &cxxFlags, cxxFlags << QLatin1String(enableRtti.toBool() ? "-frtti" : "-fno-rtti"); const auto cLanguageVersion = arrayToStringList(getCppProp("cLanguageVersion")); - if (cLanguageVersion.contains("c11")) + if (cLanguageVersion.contains("c18")) + cFlags << "-cstd=c18"; + else if (cLanguageVersion.contains("c17")) + cFlags << "-std=c17"; + else if (cLanguageVersion.contains("c11")) cFlags << "-std=c11"; else if (cLanguageVersion.contains("c99")) cFlags << "-std=c99"; From 10132574a7a28c21a6dac5963d50eeadcbda0e0a Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 7 Dec 2020 17:56:35 +0100 Subject: [PATCH 12/60] Doc: Describe all View menu commands - Add Curve Editor and Transition Editor to list of Design mode views - Describe Toggle States menu item Task-number: QDS-2744 Change-Id: Ib83d7f4d6ccdb8af0ee66af8d5a4f5be40394591 Reviewed-by: Thomas Hartmann --- doc/qtcreator/src/qtquick/qtquick-designer.qdoc | 12 +++++++++++- doc/qtcreator/src/qtquick/qtquick-states.qdoc | 6 ++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/doc/qtcreator/src/qtquick/qtquick-designer.qdoc b/doc/qtcreator/src/qtquick/qtquick-designer.qdoc index b64db4fdf5e..c3cc768f4cf 100644 --- a/doc/qtcreator/src/qtquick/qtquick-designer.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-designer.qdoc @@ -80,7 +80,7 @@ \uicontrol {Text Editor}. For more information, see \l {Specifying Item Properties}. - \li \uicontrol Connections (5) enables you to create connections + \li \uicontrol {Connection View} (5) enables you to create connections between objects, signals, and object properties. For more information, see \l{Adding Connections}. @@ -99,10 +99,20 @@ the UI controls, their properties and behavior and the available actions. For more information, see \l{Adding States}. + \li \uicontrol {Transition Editor} enables you to make movement between + states smooth by animating the changes between states. For more + information, see \l{Animating Transitions Between States}. + \li \uicontrol Timeline (7) provides a timeline and keyframe based editor that enables you to animate the properties of UI components. For more information, see \l{Creating Animations}. + \li \uicontrol {Curve Editor} enables you to view and modify the whole + animation curve by inserting keyframes to the curve and dragging + them and the point handlers to modify the curve. You can modify the + appearance of the curve in the style editor. For more information, + see \l {Editing Animation Curves}. + \endlist You can move the views anywhere on the screen and save them as diff --git a/doc/qtcreator/src/qtquick/qtquick-states.qdoc b/doc/qtcreator/src/qtquick/qtquick-states.qdoc index 40b23d2e06a..f04a7460e83 100644 --- a/doc/qtcreator/src/qtquick/qtquick-states.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-states.qdoc @@ -63,6 +63,12 @@ \section1 Creating States + To open the \uicontrol States view, select \uicontrol View > + \uicontrol Views > \uicontrol States. To collapse or expand + the open view, select \uicontrol {Toggle States} or press + \key {Ctr+Alt+S}. You can also right-click the view and select + \uicontrol Collapse or \uicontrol Expand. + The \uicontrol States view displays the different \l{State}{states} of a UI, beginning with a \e {base state}. From 698733afbfc16282b658790225b16548738786f5 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 7 Dec 2020 17:41:37 +0100 Subject: [PATCH 13/60] Doc: Fix some language issues in the Studio component docs Task-number: QDS-2744 Change-Id: I472bb1d030c8119357b17b58b645fc0364f3cc5a Reviewed-by: Thomas Hartmann --- .../components/qqs-components-flipable.qdoc | 20 +++++++++---------- .../components/qqs-components-pie.qdoc | 2 +- .../components/qqs-components-triangle.qdoc | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-flipable.qdoc b/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-flipable.qdoc index 92fcb6ba147..2d1b355f5e1 100644 --- a/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-flipable.qdoc +++ b/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-flipable.qdoc @@ -35,7 +35,7 @@ like a card. The front and back sides are specified by using any two types inside the Flipable type. The type with the higher z-order is the front side. The \l opacityFront and \l opacityBack properties are used to hide - and show either the front or back side of the flipable item at a time. + and show either the front or back side of the item at a time. The \l flipAngle property is used to animate the angle of the type to produce the flipping effect. The \l xAxis or \l yAxis property is set @@ -43,8 +43,8 @@ \section2 Example Usage - You can use the Flipable component in \QDS to create a flipable item. In - this example, the two sides of the flipable show ISO 7000 icons. + You can use the Flipable component in \QDS to create an item that can be + flipped. In this example, the two sides of the item show ISO 7000 icons. \image studio-flipable.png @@ -85,19 +85,19 @@ /*! \qmlproperty real Flipable::opacityBack - The opacity of the back side of the flipable type. + The opacity of the back side of the type. The opacity can be set between 0 and 1 to hide or show the items on the - back side of the flipable type. + back side of the type. */ /*! \qmlproperty real Flipable::opacityFront - The opacity of the front side of the flipable type. + The opacity of the front side of the type. The opacity can be set between 0 and 1 to hide or show the items on the - front side of the flipable type. + front side of the type. */ /*! @@ -105,7 +105,7 @@ Whether the type is rotated around the x-axis. - This property is set to 1 to rotate the flipable type around the x-axis. + This property is set to 1 to rotate the type around the x-axis. */ /*! @@ -113,13 +113,13 @@ Whether the type is rotated around the y-axis. - This property is set to 1 to rotate the flipable type around the y-axis. + This property is set to 1 to rotate the type around the y-axis. */ /*! \qmlproperty bool Flipable::flipped - Whether the flipable type has been flipped. + Whether the type has been flipped. This property is set to \c true when the type is flipped. */ diff --git a/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-pie.qdoc b/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-pie.qdoc index b7266ff0f1d..9804abae815 100644 --- a/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-pie.qdoc +++ b/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-pie.qdoc @@ -41,7 +41,7 @@ \l ShapeGradient subtypes and set using the \l gradient property. If both a color and a gradient are specified, the gradient is used. - The \l strokeColor, \l strokeWidth, and \l strokeStyle, properties specify + The \l strokeColor, \l strokeWidth, and \l strokeStyle properties specify the appearance of the pie outline. The \l dashPattern and \l dashOffset properties specify the appearance of dashed lines. diff --git a/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-triangle.qdoc b/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-triangle.qdoc index d627fe4bf3f..eeb33fe2e6e 100644 --- a/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-triangle.qdoc +++ b/doc/qtdesignstudio/src/qtquickdesigner-components/components/qqs-components-triangle.qdoc @@ -34,8 +34,8 @@ The Triangle type can be used to draw triangles with different dimensions and shapes. The type is enclosed in an invisible \l Rectangle type. The size - of the triagle is determined by the size of the bounding rectangle. The - dimensions of the triangle can be changed to make it elongated or squatter + of the triangle is determined by the size of the bounding rectangle. The + dimensions of the triangle can be changed to make it elongated or squat with space around it by using the \l leftMargin, \l topMargin, \l rightMargin, and \l bottomMargin properties. The margins are set between the triangle and the edges of the parent rectangle. From 786e4c6f8f343bbe0c8b9082beab982683ffe2ae Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 8 Dec 2020 07:40:01 +0100 Subject: [PATCH 14/60] Debugger: Re-enable shortcut to get known type sizes in dumpers Looks like we need to continue with this crutch for MinGW. This partiall reverts commit 1074c2ffceb1a0df5598ae6e4b9ce1985ee05f25. Change-Id: I89d32f31281c3ef720bbc2a21d5a99bfd0066ba3 Reviewed-by: Christian Stenger (cherry picked from commit ffe3c566700ba7550a0d0791c69a63d5623d32b4) --- share/qtcreator/debugger/dumper.py | 28 ++++++++++++++++++++++++++++ share/qtcreator/debugger/qttypes.py | 4 ++++ 2 files changed, 32 insertions(+) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 26d6487ce60..4c765990c67 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -3816,6 +3816,25 @@ class DumperBase(): self.registerType(typeId, tdata) return self.Type(self, typeId) + def knownArrayTypeSize(self): + return 3 * self.ptrSize() if self.qtVersion() >= 0x060000 else self.ptrSize() + + def knownTypeSize(self, typish): + if typish[0] == 'Q': + if typish.startswith('QList<') or typish.startswith('QVector<'): + return self.knownArrayTypeSize() + if typish == 'QObject': + return 2 * self.ptrSize() + if typish == 'QStandardItemData': + return 4 * self.ptrSize() if self.qtVersion() >= 0x060000 else 2 * self.ptrSize() + if typish == 'Qt::ItemDataRole': + return 4 + if typish == 'QChar': + return 2 + if typish in ('quint32', 'qint32'): + return 4 + return None + def createType(self, typish, size=None): if isinstance(typish, self.Type): #typish.check() @@ -3823,6 +3842,15 @@ class DumperBase(): if isinstance(typish, str): ns = self.qtNamespace() typish = typish.replace('@', ns) + if typish.startswith(ns): + if size is None: + size = self.knownTypeSize(typish[len(ns):]) + else: + if size is None: + size = self.knownTypeSize(typish) + if size is not None: + typish = ns + typish + tdata = self.typeData.get(typish, None) if tdata is not None: return self.Type(self, typish) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 4731ac8fbfe..f15cddffca9 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -243,11 +243,15 @@ def qdump__Qt__ItemDataRole(d, value): def qdump__QStandardItemData(d, value): + d.createType('@Qt::ItemDataRole') # warm up cache role, pad, val = value.split('{@Qt::ItemDataRole}@{@QVariant}') d.putPairContents(role.value(), (role, val), 'role', 'value') def qdump__QStandardItem(d, value): + d.createType('@QStandardItemData') # warm up cache + d.createType('@QStandardItem') + d.createType('@QStandardItem*') vtable, dptr = value.split('pp') # There used to be a virtual destructor that got removed in # 88b6abcebf29b455438 on Apr 18 17:01:22 2017 From a41b4eea75e8d2404d097e1921dc2357a7a74170 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 7 Dec 2020 09:15:32 +0100 Subject: [PATCH 15/60] Clang: Fix enabling of ClangFormat plugin with RelWithDebInfo RelWithDebInfo also builds in release mode, so just checking for the build type to match is not enough. Amends 6b62a99a8a7c37b119fc08a3b23ca386ba1cfe61 Fixes: QTCREATORBUG-25056 Change-Id: I5ea448e1cdd0cb3b76d052d6019337cdf13bdbc4 Reviewed-by: Cristian Adam --- cmake/FindClang.cmake | 45 +++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/cmake/FindClang.cmake b/cmake/FindClang.cmake index fcc9f241e10..b515820be1e 100644 --- a/cmake/FindClang.cmake +++ b/cmake/FindClang.cmake @@ -13,14 +13,39 @@ elseif (TARGET clang-cpp) set(CLANG_TOOLING_LIBS libclang clang-cpp) endif() -SET(QTC_CLANG_BUILDMODE_MATCH ON) -if (WIN32 AND TARGET libclang) - string(TOLOWER ${CMAKE_BUILD_TYPE} _type) - get_target_property(_llvmConfigs libclang IMPORTED_CONFIGURATIONS) - string(TOLOWER ${_llvmConfigs} _llvm_configs) - list(FIND _llvm_configs ${_type} _build_type_found) - if (_build_type_found LESS 0) - set(QTC_CLANG_BUILDMODE_MATCH OFF) - message("Build mode mismatch (debug vs release): limiting clangTooling") - endif() + +if (WIN32 AND TARGET clangTooling) + # check that we can compile against clangTooling + # which requires the build modes to be compatible + # (debug vs release on Windows) + include(CheckCxxSourceCompiles) + + set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE}) + set(CMAKE_REQUIRED_INCLUDES ${CLANG_INCLUDE_DIRS}) + set(CMAKE_REQUIRED_LIBRARIES clangTooling) + + check_cxx_source_compiles([=[ + #include + #include + using namespace clang; + using namespace clang::tooling; + llvm::cl::OptionCategory CheckToolCategory("check tool options"); + int main(int argc, const char **argv) + { + CommonOptionsParser OptionsParser(argc, argv, CheckToolCategory); + ClangTool Tool(OptionsParser.getCompilations(), + OptionsParser.getSourcePathList()); + return 0; + } + ]=] QTC_CLANG_BUILDMODE_MATCH + ) + unset(CMAKE_TRY_COMPILE_CONFIGURATION) + unset(CMAKE_REQUIRED_INCLUDES) + unset(CMAKE_REQUIRED_LIBRARIES) +else() + set(QTC_CLANG_BUILDMODE_MATCH ON) +endif() + +if (NOT QTC_CLANG_BUILDMODE_MATCH) + message("Clang build mode mismatch (debug vs release): limiting clangTooling") endif() From 618799809098bdba2bc336018f5d854713106676 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 8 Dec 2020 11:58:00 +0100 Subject: [PATCH 16/60] Debugger: re-add old qobject children dumper for qtversion < 6 Change-Id: Icbafb7c22d18247f89a8aa6a5029c9914d251c2e Reviewed-by: Christian Stenger Reviewed-by: hjk --- share/qtcreator/debugger/dumper.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 4c765990c67..731797bb6a1 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1897,9 +1897,31 @@ class DumperBase(): with SubItem(self, '[children]'): if not self.isCli: self.putSortGroup(8) - dvtablePtr, qptr, parentPtr, children \ - = self.split('ppp{QList}', dd) - self.putItem(children) + + if self.qtVersion() >= 0x60000: + dvtablePtr, qptr, parentPtr, children \ + = self.split('ppp{QList}', dd) + self.putItem(children) + else: + base = self.extractPointer(dd + 3 * ptrSize) # It's a QList + begin = self.extractInt(base + 8) + end = self.extractInt(base + 12) + array = base + 16 + if self.qtVersion() < 0x50000: + array += ptrSize + self.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000) + size = end - begin + self.check(size >= 0) + self.putItemCount(size) + if size > 0: + self.putExpandable() + if self.isExpanded(): + addrBase = array + begin * ptrSize + with Children(self, size): + for i in self.childRange(): + with SubItem(self, i): + childPtr = self.extractPointer(addrBase + i * ptrSize) + self.putItem(self.createValue(childPtr, qobjectType)) if isQMetaObject: with SubItem(self, '[strings]'): From 8044e7c50561dce82ff4d4a01419e11b9770b982 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 4 Dec 2020 16:58:11 +0100 Subject: [PATCH 17/60] Debugger: Re-fix QCbor dumper with Qt6 Change-Id: Icb2372fc9465b752a6709bf1d422ee3b1d79b2d6 Reviewed-by: David Schulz --- share/qtcreator/debugger/qttypes.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index f15cddffca9..94c99521835 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -3246,12 +3246,13 @@ def qdump__qfloat16(d, value): def qdumpHelper_QCbor_string(d, container_ptr, element_index, is_bytes): # d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB, # so be explicit: - pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8) - elements_data_ptr, elements_size = d.vectorData(pos + d.ptrSize()) - element_at_n_addr = elements_data_ptr + element_index * 16 # sizeof(QtCbor::Element) == 15 + data_pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8) + elements_pos = data_pos + (3 * d.ptrSize() if d.qtVersion() >= 0x060000 else d.ptrSize()) + elements_data_ptr, elements_size = d.vectorData(elements_pos) + element_at_n_addr = elements_data_ptr + element_index * 16 # sizeof(QtCbor::Element) == 16 element_value, _, element_flags = d.split('qII', element_at_n_addr) enc = 'latin1' if is_bytes or (element_flags & 8) else 'utf16' - bytedata, _, _ = d.qArrayData(pos) + bytedata, _, _ = d.qArrayData(data_pos) bytedata += element_value if d.qtVersion() >= 0x060000: bytedata_len = d.extractInt64(bytedata) @@ -3282,11 +3283,12 @@ def qdumpHelper_QCbor_array(d, container_ptr, is_cbor): return # d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB, # so be explicit: - pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8) - elements_data_ptr, elements_size = d.vectorData(pos + d.ptrSize()) + data_pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8) + elements_pos = data_pos + (3 * d.ptrSize() if d.qtVersion() >= 0x060000 else d.ptrSize()) + elements_data_ptr, elements_size = d.vectorData(elements_pos) d.putItemCount(elements_size) if d.isExpanded(): - bytedata, _, _ = d.qArrayData(pos) + bytedata, _, _ = d.qArrayData(data_pos) with Children(d, maxNumChild=1000): for i in range(elements_size): d.putSubItem(i, qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, i, bytedata, is_cbor)) @@ -3303,12 +3305,13 @@ def qdumpHelper_QCbor_map(d, container_ptr, is_cbor): return # d.split('i@{@QByteArray::size_type}pp', container_ptr) doesn't work with CDB, # so be explicit: - pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8) - elements_data_ptr, elements_size = d.vectorData(pos + d.ptrSize()) + data_pos = container_ptr + (2 * d.ptrSize() if d.qtVersion() >= 0x060000 else 8) + elements_pos = data_pos + (3 * d.ptrSize() if d.qtVersion() >= 0x060000 else d.ptrSize()) + elements_data_ptr, elements_size = d.vectorData(elements_pos) elements_size = int(elements_size / 2) d.putItemCount(elements_size) if d.isExpanded(): - bytedata, _, _ = d.qArrayDataHelper(pos) + bytedata, _, _ = d.qArrayDataHelper(data_pos) with Children(d, maxNumChild=1000): for i in range(elements_size): key = qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, 2 * i, bytedata, is_cbor) @@ -3324,6 +3327,7 @@ def qdump__QCborMap(d, value): def qdump__QCborValue(d, value): item_data, container_ptr, item_type = value.split('qpi') d.putItem(d.createProxyValue((item_data, container_ptr, item_type, True), 'QCborValue_proxy')) + d.putPlainChildren(value) def qdump__QCborValue_proxy(d, value): item_data, container_ptr, item_type, is_cbor = value.data() From 73f2ea11dd6ea2b24f489983c2612d4c13f98db7 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 8 Dec 2020 12:19:19 +0100 Subject: [PATCH 18/60] Debugger: Make GDB dumper tests pass with Qt release builds Change-Id: I45ae41486b8081bb803290895e942a71d41d5c0d Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 16 ++++++++++++---- share/qtcreator/debugger/qttypes.py | 7 ++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 731797bb6a1..66c826f1014 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -3847,8 +3847,6 @@ class DumperBase(): return self.knownArrayTypeSize() if typish == 'QObject': return 2 * self.ptrSize() - if typish == 'QStandardItemData': - return 4 * self.ptrSize() if self.qtVersion() >= 0x060000 else 2 * self.ptrSize() if typish == 'Qt::ItemDataRole': return 4 if typish == 'QChar': @@ -3860,7 +3858,12 @@ class DumperBase(): def createType(self, typish, size=None): if isinstance(typish, self.Type): #typish.check() - return typish + if hasattr(typish, 'lbitsize') and typish.lbitsize is not None and typish.lbitsize > 0: + return typish + # Size 0 is sometimes reported by GDB but doesn't help at all. + # Force using the fallback: + typish = typish.name + if isinstance(typish, str): ns = self.qtNamespace() typish = typish.replace('@', ns) @@ -3875,7 +3878,9 @@ class DumperBase(): tdata = self.typeData.get(typish, None) if tdata is not None: - return self.Type(self, typish) + if tdata.lbitsize is not None: + if tdata.lbitsize > 0: + return self.Type(self, typish) knownType = self.lookupType(typish) #DumperBase.warn('KNOWN: %s' % knownType) @@ -3888,6 +3893,9 @@ class DumperBase(): tdata.name = typish tdata.typeId = typish tdata.templateArguments = self.listTemplateParameters(typish) + if typish.endswith('*'): + tdata.code = TypeCode.Pointer + tdata.lbitsize = 8 * self.ptrSize() if size is not None: tdata.lbitsize = 8 * size diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 94c99521835..ebff0247cb1 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -249,9 +249,10 @@ def qdump__QStandardItemData(d, value): def qdump__QStandardItem(d, value): - d.createType('@QStandardItemData') # warm up cache - d.createType('@QStandardItem') - d.createType('@QStandardItem*') + # warm up cache + data_size = 4 * d.ptrSize() if d.qtVersion() >= 0x060000 else 2 * d.ptrSize() + d.createType('@QStandardItemData', data_size) + vtable, dptr = value.split('pp') # There used to be a virtual destructor that got removed in # 88b6abcebf29b455438 on Apr 18 17:01:22 2017 From e9ae81612fbbaa00238050fd9eb7cc5dfd9698e7 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 7 Dec 2020 14:25:22 +0100 Subject: [PATCH 19/60] Debugger: Disable StaticMembersInLib dumper test for Qt 6 Both values used as test cases are gone. Change-Id: I7f386a1ad1eccb0589b005d14090207cc518b6f3 Reviewed-by: hjk --- tests/auto/debugger/tst_dumpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index a969a79046f..97ffe847a01 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -8008,7 +8008,7 @@ void tst_Dumpers::dumper_data() + CorePrivateProfile() + QmlPrivateProfile() - + QtVersion(0x50800) + + QtVersion(0x50800, 0x5ffff) // Both test cases are gone in Qt6 + Check("d.Log10_2_100000", "30103", "int") + Check("p.FlagBit", "", "") % NoCdbEngine From fff1fafec73d78d8b22e61a565da21eecb8244bc Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 7 Dec 2020 15:15:58 +0100 Subject: [PATCH 20/60] Debugger: Consolidate list data extraction in dumper Change-Id: I5b860da4b1d15ffab8c60418321e40943dbbe07a Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 19 +++++++++++++++++-- share/qtcreator/debugger/qttypes.py | 21 ++++++--------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 66c826f1014..e94a21996a7 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1722,15 +1722,30 @@ class DumperBase(): addr += 1 return result - def listChildrenGenerator(self, addr, innerType): - base = self.extractPointer(addr) + def listData(self, value, check=True): + if self.qtVersion() >= 0x60000: + dd, data, size = self.split('ppi', value) + return data, size + + base = self.extractPointer(value) (ref, alloc, begin, end) = self.split('IIII', base) array = base + 16 if self.qtVersion() < 0x50000: array += self.ptrSize() size = end - begin + + if check: + self.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000) + size = end - begin + self.check(size >= 0) + stepSize = self.ptrSize() data = array + begin * stepSize + return data, size + + def listChildrenGenerator(self, addr, innerType): + stepSize = self.ptrSize() + data, size = self.listData(addr) for i in range(size): yield self.createValue(data + i * stepSize, innerType) #yield self.createValue(data + i * stepSize, 'void*') diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index ebff0247cb1..62c9d81c5c6 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -1057,25 +1057,16 @@ def qdump__QVariantList(d, value): def qdumpHelper_QList(d, value, innerType): + data, size = d.listData(value, check=True) + d.putItemCount(size) + if d.qtVersion() >= 0x60000: - dd, data, size = d.split('ppi', value) - d.putItemCount(size) d.putPlotData(data, size, innerType) return - base = d.extractPointer(value) - _, _, begin, end = d.split('IIII', base) - array = base + 16 - if d.qtVersion() < 0x50000: - array += d.ptrSize() - d.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000) - size = end - begin - d.check(size >= 0) - d.putItemCount(size) if d.isExpanded(): innerSize = innerType.size() stepSize = d.ptrSize() - addr = array + begin * stepSize # The exact condition here is: # QTypeInfo::isLarge || QTypeInfo::isStatic # but this data is available neither in the compiled binary nor @@ -1090,17 +1081,17 @@ def qdumpHelper_QList(d, value, innerType): isInternal = innerSize <= stepSize and innerType.isMovableType() if isInternal: if innerSize == stepSize: - d.putArrayData(addr, size, innerType) + d.putArrayData(data, size, innerType) else: with Children(d, size, childType=innerType): for i in d.childRange(): - p = d.createValue(addr + i * stepSize, innerType) + p = d.createValue(data + i * stepSize, innerType) d.putSubItem(i, p) else: # about 0.5s / 1000 items with Children(d, size, maxNumChild=2000, childType=innerType): for i in d.childRange(): - p = d.extractPointer(addr + i * stepSize) + p = d.extractPointer(data + i * stepSize) x = d.createValue(p, innerType) d.putSubItem(i, x) From e6b742a7e11c466eec50bc344f2685c31fd6c61b Mon Sep 17 00:00:00 2001 From: Johanna Vanhatapio Date: Tue, 8 Dec 2020 11:21:11 +0200 Subject: [PATCH 21/60] Doc: Describe the Group Component Fixes: QDS-3080 Change-Id: Iea4bae5c8d2cbf3097fc99bfbb87132b460ab404 Reviewed-by: Mahmoud Badri Reviewed-by: Leena Miettinen --- doc/qtcreator/src/qtcreator-toc.qdoc | 2 +- doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc | 2 +- .../qtdesignstudio-3d-components.qdoc | 2 +- .../qtquick3d-editor/qtdesignstudio-3d-node.qdoc | 13 +++++++++---- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 6e813743efa..edaf3bad4e4 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -138,7 +138,7 @@ \li \l{Adding 3D Views} \li \l{Using 3D Components} \list - \li \l{Setting Node Properties} + \li \l{Setting Group Properties} \li \l{Adding Models} \li \l{Using Materials and Shaders} \li \l{Attaching Textures to Materials} diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index 8992691047b..1dd1cd472a4 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -115,7 +115,7 @@ \li \l{Adding 3D Views} \li \l{Using 3D Components} \list - \li \l{Setting Node Properties} + \li \l{Setting Group Properties} \li \l{Adding Models} \li \l{Using Materials and Shaders} \li \l{Attaching Textures to Materials} diff --git a/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-components.qdoc b/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-components.qdoc index 5a28bdc5970..225902dc3e3 100644 --- a/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-components.qdoc +++ b/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-components.qdoc @@ -43,7 +43,7 @@ view. \list - \li \l {Setting Node Properties} + \li \l {Setting Group Properties} You can set the opacity, visibility, and transform properties of all 3D components. diff --git a/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-node.qdoc b/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-node.qdoc index 8057f8fa5c2..29b171c3485 100644 --- a/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-node.qdoc +++ b/doc/qtdesignstudio/src/qtquick3d-editor/qtdesignstudio-3d-node.qdoc @@ -28,12 +28,17 @@ \page studio-3d-node.html \nextpage studio-3d-model.html - \title Setting Node Properties + \title Setting Group Properties - You can set the opacity, visibility, and transform properties of a 3D - component in the \uicontrol Properties view. + The \uicontrol Group component is a \uicontrol Node type that can be used to + wrap other objects for the purpose of grouping them. This allows you to + transform and set the opacity and visibility of multiple 3D components in + the \uicontrol Properties view simultaneously. To add a \uicontrol Group + component to your scene, drag-and-drop it from \uicontrol Library > + \uicontrol {QML Types} > \uicontrol {Qt Quick 3D} to the \uicontrol + {3D Editor} view or to a \uicontrol Scene component in \uicontrol Navigator. - \section1 Setting Component Opacity and Visibility + \section1 Setting Node Opacity and Visibility All components have an \uicontrol Opacity value applied to them. The opacity of 100 makes a component fully opaque, while the opacity of 0 prevents a From df482e27b7ff959295d3ff090a744634c422d96e Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 7 Dec 2020 10:46:13 +0100 Subject: [PATCH 22/60] McuSupport: Identify kits also by toolchain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: QTCREATORBUG-25052 Fixes: QTCREATORBUG-25053 Change-Id: I87e51fbdb8d01cb564574f996bdfb51420f28584 Reviewed-by: Dawid Śliwa Reviewed-by: Yoann Lopes Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportconstants.h | 1 + src/plugins/mcusupport/mcusupportoptions.cpp | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/mcusupport/mcusupportconstants.h b/src/plugins/mcusupport/mcusupportconstants.h index 2e10d0ff332..130d645674a 100644 --- a/src/plugins/mcusupport/mcusupportconstants.h +++ b/src/plugins/mcusupport/mcusupportconstants.h @@ -39,6 +39,7 @@ const char KIT_MCUTARGET_SDKVERSION_KEY[] = "McuSupport.McuTargetSdkVersion"; const char KIT_MCUTARGET_KITVERSION_KEY[] = "McuSupport.McuTargetKitVersion"; const char KIT_MCUTARGET_COLORDEPTH_KEY[] = "McuSupport.McuTargetColorDepth"; const char KIT_MCUTARGET_OS_KEY[] = "McuSupport.McuTargetOs"; +const char KIT_MCUTARGET_TOOCHAIN_KEY[] = "McuSupport.McuTargetToolchain"; const char SETTINGS_GROUP[] = "McuSupport"; const char SETTINGS_KEY_PACKAGE_PREFIX[] = "Package_"; diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 9de0d0b0b7b..1d4a82e36c4 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -65,7 +65,7 @@ using namespace Utils; namespace McuSupport { namespace Internal { -static const int KIT_VERSION = 7; // Bumps up whenever details in Kit creation change +static const int KIT_VERSION = 8; // Bumps up whenever details in Kit creation change static QString packagePathFromSettings(const QString &settingsKey, QSettings::Scope scope = QSettings::UserScope, @@ -581,6 +581,7 @@ static void setKitProperties(const QString &kitName, Kit *k, const McuTarget *mc k->setValue(KIT_MCUTARGET_SDKVERSION_KEY, mcuTarget->qulVersion().toString()); k->setValue(KIT_MCUTARGET_KITVERSION_KEY, KIT_VERSION); k->setValue(KIT_MCUTARGET_OS_KEY, static_cast(mcuTarget->os())); + k->setValue(KIT_MCUTARGET_TOOCHAIN_KEY, mcuTarget->toolChainPackage()->toolChainName()); k->setAutoDetected(true); k->makeSticky(); if (mcuTarget->toolChainPackage()->isDesktopToolchain()) @@ -745,6 +746,8 @@ QList McuSupportOptions::existingKits(const McuTarget *mcuTarget) && kit->value(KIT_MCUTARGET_COLORDEPTH_KEY) == mcuTarget->colorDepth() && kit->value(KIT_MCUTARGET_OS_KEY).toInt() == static_cast(mcuTarget->os()) + && kit->value(KIT_MCUTARGET_TOOCHAIN_KEY) + == mcuTarget->toolChainPackage()->toolChainName() )); }); } From 5abe6327fc3f1d39cf7cc68995504870f317e53e Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Tue, 8 Dec 2020 16:17:02 +0100 Subject: [PATCH 23/60] Update Qbs submodule to the top of 1.18 branch Change-Id: I57600318a5b9df143b5f2ce9fcbd4566865d8000 Reviewed-by: Christian Kandeler --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 80cb55a1fb4..9025c2e130d 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 80cb55a1fb4d8d762003f1fc766365196cc6a450 +Subproject commit 9025c2e130d9a662354b6722c6b34fd964c5bc2b From 9cbcbfff3354564dd81e7207d46e53fef96580f5 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 8 Dec 2020 13:38:19 +0100 Subject: [PATCH 24/60] Fix various clang warnings Unused variables & functions, unneeded copies in range-for loops, missing overrides. Change-Id: I27b60e7c92a6ca425a84c89b537d5c3815449a94 Reviewed-by: Christian Stenger --- src/plugins/android/androidconfigurations.cpp | 18 ++++++++---------- src/plugins/incredibuild/commandbuilder.cpp | 1 - src/plugins/projectexplorer/makestep.cpp | 1 - .../connectioneditor/bindingmodel.cpp | 2 +- .../connectioneditor/connectionmodel.cpp | 2 +- .../dynamicpropertiesmodel.cpp | 2 +- .../imagecache/imagecachestorage.h | 2 +- .../designercore/model/qmlitemnode.cpp | 4 ++-- src/plugins/qtsupport/profilereader.cpp | 10 ---------- 9 files changed, 14 insertions(+), 28 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 13dd6f8a7de..4c7a5183684 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1450,16 +1450,14 @@ AndroidConfigurations::~AndroidConfigurations() = default; static Utils::FilePath androidStudioPath() { - if (Utils::HostOsInfo::isWindowsHost()) { - const QLatin1String registryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio"); - const QLatin1String valueName("Path"); - #if defined(Q_OS_WIN) - const QSettings settings64(registryKey, QSettings::Registry64Format); - const QSettings settings32(registryKey, QSettings::Registry32Format); - return Utils::FilePath::fromUserInput( - settings64.value(valueName, settings32.value(valueName).toString()).toString()); - #endif - } +#if defined(Q_OS_WIN) + const QLatin1String registryKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio"); + const QLatin1String valueName("Path"); + const QSettings settings64(registryKey, QSettings::Registry64Format); + const QSettings settings32(registryKey, QSettings::Registry32Format); + return Utils::FilePath::fromUserInput( + settings64.value(valueName, settings32.value(valueName).toString()).toString()); +#endif return {}; // TODO non-Windows } diff --git a/src/plugins/incredibuild/commandbuilder.cpp b/src/plugins/incredibuild/commandbuilder.cpp index 4e46ab8d009..b7ae39a2664 100644 --- a/src/plugins/incredibuild/commandbuilder.cpp +++ b/src/plugins/incredibuild/commandbuilder.cpp @@ -31,7 +31,6 @@ namespace Internal { namespace Constants { const QLatin1String CUSTOMCOMMANDBUILDER_COMMAND("IncrediBuild.BuildConsole.%1.Command"); const QLatin1String CUSTOMCOMMANDBUILDER_ARGS("IncrediBuild.BuildConsole.%1.Arguments"); -const QLatin1String CUSTOMCOMMANDBUILDER_ARGSSET("IncrediBuild.BuildConsole.%1.ArgumentsSet"); } // namespace Constants void CommandBuilder::fromMap(const QVariantMap &map) diff --git a/src/plugins/projectexplorer/makestep.cpp b/src/plugins/projectexplorer/makestep.cpp index 5bdf0d5f982..560cc177828 100644 --- a/src/plugins/projectexplorer/makestep.cpp +++ b/src/plugins/projectexplorer/makestep.cpp @@ -59,7 +59,6 @@ using namespace Utils; const char BUILD_TARGETS_SUFFIX[] = ".BuildTargets"; const char MAKE_ARGUMENTS_SUFFIX[] = ".MakeArguments"; const char MAKE_COMMAND_SUFFIX[] = ".MakeCommand"; -const char CLEAN_SUFFIX[] = ".Clean"; const char OVERRIDE_MAKEFLAGS_SUFFIX[] = ".OverrideMakeflags"; const char JOBCOUNT_SUFFIX[] = ".JobCount"; diff --git a/src/plugins/qmldesigner/components/connectioneditor/bindingmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/bindingmodel.cpp index f14acc16396..3fc86c480b8 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/bindingmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/bindingmodel.cpp @@ -57,7 +57,7 @@ void BindingModel::resetModel() QStringList({tr("Item"), tr("Property"), tr("Source Item"), tr("Source Property")})); if (connectionView()->isAttached()) { - for (const ModelNode modelNode : connectionView()->selectedModelNodes()) + for (const ModelNode &modelNode : connectionView()->selectedModelNodes()) addModelNode(modelNode); } diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp index 643f7462210..e8226d6632e 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp @@ -49,7 +49,7 @@ namespace { QStringList propertyNameListToStringList(const QmlDesigner::PropertyNameList &propertyNameList) { QStringList stringList; - for (const QmlDesigner::PropertyName propertyName : propertyNameList) { + for (const QmlDesigner::PropertyName &propertyName : propertyNameList) { stringList << QString::fromUtf8(propertyName); } stringList.removeDuplicates(); diff --git a/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp index f0ddc6e3e58..db81f1bb7d8 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp @@ -134,7 +134,7 @@ void DynamicPropertiesModel::resetModel() QStringList({tr("Item"), tr("Property"), tr("Property Type"), tr("Property Value")})); if (connectionView()->isAttached()) { - for (const ModelNode modelNode : connectionView()->selectedModelNodes()) + for (const ModelNode &modelNode : connectionView()->selectedModelNodes()) addModelNode(modelNode); } diff --git a/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h b/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h index 90900cf19e0..74fc5d933b4 100644 --- a/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h +++ b/src/plugins/qmldesigner/designercore/imagecache/imagecachestorage.h @@ -126,7 +126,7 @@ public: } } - void walCheckpointFull() + void walCheckpointFull() override { try { database.walCheckpointFull(); diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 814d5494806..462b44a9157 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -837,7 +837,7 @@ ModelNode QmlFlowItemNode::decisionNodeForTransition(const ModelNode &transition } QmlFlowViewNode flowView(transition.view()->rootModelNode()); if (flowView.isValid()) { - for (const ModelNode target : flowView.decicions()) { + for (const ModelNode &target : flowView.decicions()) { if (target.hasBindingProperty("targets") && target.bindingProperty("targets").resolveToModelNodeList().contains(transition)) return target; @@ -853,7 +853,7 @@ ModelNode QmlFlowTargetNode::findSourceForDecisionNode() const if (!isFlowDecision()) return {}; - for (const ModelNode transition : flowView().transitionsForTarget(modelNode())) { + for (const ModelNode &transition : flowView().transitionsForTarget(modelNode())) { if (transition.hasBindingProperty("from")) { const ModelNode source = transition.bindingProperty("from").resolveToModelNode(); if (source.isValid()) { diff --git a/src/plugins/qtsupport/profilereader.cpp b/src/plugins/qtsupport/profilereader.cpp index 0e6e8179c5a..7730ab95540 100644 --- a/src/plugins/qtsupport/profilereader.cpp +++ b/src/plugins/qtsupport/profilereader.cpp @@ -34,16 +34,6 @@ using namespace ProjectExplorer; using namespace QtSupport; -static QString format(const QString &fileName, int lineNo, const QString &msg) -{ - if (lineNo > 0) - return QString::fromLatin1("%1(%2): %3").arg(fileName, QString::number(lineNo), msg); - else if (lineNo) - return QString::fromLatin1("%1: %3").arg(fileName, msg); - else - return msg; -} - ProMessageHandler::ProMessageHandler(bool verbose, bool exact) : m_verbose(verbose) , m_exact(exact) From 43b5b6fe4b8e197ac969da3b2e1a1d773ec41cf2 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 8 Dec 2020 13:03:19 +0100 Subject: [PATCH 25/60] Define PaletteMid explicitly Since QTCREATORBUG-23505 we use QPalette::Mid for CheckBox and some other control. The value of QPalette::Mid depends on the system. On macOS this created issues with contrast see: QDS-3281 Task-number: QDS-3281 Change-Id: Ic6f83703d16778732992df6bbde50a235306d7c8 Reviewed-by: Alessandro Portale --- share/qtcreator/themes/design.creatortheme | 1 + 1 file changed, 1 insertion(+) diff --git a/share/qtcreator/themes/design.creatortheme b/share/qtcreator/themes/design.creatortheme index 996befe8911..2451371b7f8 100644 --- a/share/qtcreator/themes/design.creatortheme +++ b/share/qtcreator/themes/design.creatortheme @@ -385,6 +385,7 @@ PaletteWindowDisabled=backgroundColorDisabled PaletteWindowTextDisabled=textDisabled PaletteBaseDisabled=backgroundColorDisabled PaletteTextDisabled=textDisabled +PaletteMid=ffafafaf [Flags] ComboBoxDrawTextShadow=false From 036e6d9555bd4743da82dd0e92ffa6affaa69df8 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 8 Dec 2020 14:37:41 +0100 Subject: [PATCH 26/60] QmlDesigner: Normalize expression when comparing them Change-Id: I0697e7cea74b942ee3c3f667741744f17281162e Reviewed-by: Knud Dollereder Reviewed-by: Tim Jenssen --- .../qmldesigner/designercore/model/texttomodelmerger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 66752e27e3e..cc9a03568fc 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -1672,7 +1672,7 @@ void ModelValidator::signalHandlerSourceDiffer(SignalHandlerProperty &modelPrope { Q_UNUSED(modelProperty) Q_UNUSED(javascript) - QTC_ASSERT(modelProperty.source() == javascript, return); + QTC_ASSERT(compareJavaScriptExpression(modelProperty.source(), javascript), return); } void ModelValidator::shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, const QString & /*javascript*/) From 65fb5beb015c78213a1e283584dd5d1c3fdf35ef Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Tue, 8 Dec 2020 16:24:17 +0100 Subject: [PATCH 27/60] QmlDesigner: Extend QUL Metadata list Change-Id: I2dbd3a4325ced09fdcf3667887ec2e67ccf59252 Reviewed-by: Thomas Hartmann --- .../QtQuick/BorderImageSpecifics.qml | 10 +++++++++- share/qtcreator/qmldesigner/qt4mcu/qul-14.qml | 7 ++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/BorderImageSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/BorderImageSpecifics.qml index 2f35517968b..8d5a3e772c1 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/BorderImageSpecifics.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/BorderImageSpecifics.qml @@ -125,6 +125,7 @@ Column { Label { text: qsTr("Horizontal tile mode") + disabledState: !backendValues.horizontalTileMode.isAvailable } SecondColumnLayout { @@ -134,11 +135,13 @@ Column { implicitWidth: 180 Layout.fillWidth: true scope: "BorderImage" + enabled: backendValue.isAvailable } } Label { text: qsTr("Vertical tile mode") + disabledState: !backendValues.verticalTileMode.isAvailable } SecondColumnLayout { @@ -148,37 +151,42 @@ Column { implicitWidth: 180 Layout.fillWidth: true scope: "BorderImage" + enabled: backendValue.isAvailable } - } Label { text: qsTr("Source size") + disabledState: !backendValues.sourceSize.isAvailable } SecondColumnLayout { Label { text: "W" width: 12 + disabledStateSoft: !backendValues.sourceSize_width.isAvailable } SpinBox { backendValue: backendValues.sourceSize_width minimumValue: -2000 maximumValue: 2000 + enabled: backendValue.isAvailable decimals: 0 } Label { text: "H" width: 12 + disabledStateSoft: !backendValues.sourceSize_height.isAvailable } SpinBox { backendValue: backendValues.sourceSize_height minimumValue: -2000 maximumValue: 2000 + enabled: backendValue.isAvailable decimals: 0 } diff --git a/share/qtcreator/qmldesigner/qt4mcu/qul-14.qml b/share/qtcreator/qmldesigner/qt4mcu/qul-14.qml index 8b9ffed3b88..00e4ad790f8 100644 --- a/share/qtcreator/qmldesigner/qt4mcu/qul-14.qml +++ b/share/qtcreator/qmldesigner/qt4mcu/qul-14.qml @@ -27,7 +27,6 @@ VersionData { name: "QUL 1.4" bannedItems: ["QtQuick.AnimatedImage", - "QtQuick.BorderImage", "QtQuick.FocusScope", "QtQuick.TextInput", "QtQuick.TextEdit", @@ -104,6 +103,12 @@ VersionData { "sourceSize", "smooth"] } + QtQuick.BorderImage { + bannedProperties: ["asynchronous", "cache", "currentFrame", "frameCount", + "horizontalTileMode", "mirror", "progress", "smooth", "sourceSize", + "status", "verticalTileMode"] + } + QtQuick.Text { allowChildren: false allowedProperties: ["rotation", "scale", "transformOrigin"] From 19f2ed05d743dab0c3ecca151ac29f147160b35b Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 8 Dec 2020 15:16:28 +0100 Subject: [PATCH 28/60] Dark Themes: Set the color for PaletteMid explicitly Apparently, on macOS, the value of QPalette::Mid is set in a different way than on the other OSes. Let's set it explicitly to ensure the same painting of wigdets with dark themes. The value PaletteMid=ffa0a0a0 was determined by manual trial and error, to ensure that it does not change anything on non-macOS. Fixes: QDS-3281 Change-Id: I7c044d3b41116e50b2c8a676f30a3b26019ad627 Reviewed-by: Thomas Hartmann --- share/qtcreator/themes/dark.creatortheme | 1 + share/qtcreator/themes/flat-dark.creatortheme | 1 + 2 files changed, 2 insertions(+) diff --git a/share/qtcreator/themes/dark.creatortheme b/share/qtcreator/themes/dark.creatortheme index 944256eeeaa..cbc51b2ef69 100644 --- a/share/qtcreator/themes/dark.creatortheme +++ b/share/qtcreator/themes/dark.creatortheme @@ -257,6 +257,7 @@ PaletteWindowDisabled=backgroundColorDisabled PaletteWindowTextDisabled=textDisabled PaletteBaseDisabled=backgroundColorDisabled PaletteTextDisabled=textDisabled +PaletteMid=ffa0a0a0 QmlDesigner_BackgroundColor=qmlDesignerButtonColor QmlDesigner_HighlightColor=ff46a2da diff --git a/share/qtcreator/themes/flat-dark.creatortheme b/share/qtcreator/themes/flat-dark.creatortheme index 89150801ff4..0d750afcf0d 100644 --- a/share/qtcreator/themes/flat-dark.creatortheme +++ b/share/qtcreator/themes/flat-dark.creatortheme @@ -275,6 +275,7 @@ PaletteWindowDisabled=backgroundColorDisabled PaletteWindowTextDisabled=textDisabled PaletteBaseDisabled=backgroundColorDisabled PaletteTextDisabled=textDisabled +PaletteMid=ffa0a0a0 [Flags] ComboBoxDrawTextShadow=false From 17d7f2491116a94c83f52a9f110e3953ec7c26cb Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 4 Dec 2020 14:40:26 +0100 Subject: [PATCH 29/60] Debugger: Fix QGraphicsPolygonItem dumper for Qt6 64 bits And effectively disable the 32bit version, too much effort for the gain. Change-Id: Ia11da05f3d57feba915d6b2d2d9c901e5aec3433 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/qttypes.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 62c9d81c5c6..1a8223aa265 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -1666,13 +1666,20 @@ def qdump__QPolygon(d, value): def qdump__QGraphicsPolygonItem(d, value): (vtbl, dptr) = value.split('pp') - # Assume sizeof(QGraphicsPolygonItemPrivate) == 400 - if d.ptrSize() == 8: - offset = 384 - elif d.isWindowsTarget(): - offset = 328 if d.isMsvcTarget() else 320 + if d.qtVersion() >= 0x060000: + if d.ptrSize() == 8: + offset = 424 # sizeof(QGraphicsPolygonItemPrivate), the base + else: + # Chicken out. Not worth maintaining. + d.putPlainChildren(value) + return else: - offset = 308 + if d.ptrSize() == 8: + offset = 384 + elif d.isWindowsTarget(): + offset = 328 if d.isMsvcTarget() else 320 + else: + offset = 308 data, size = d.vectorData(dptr + offset) d.putItemCount(size) d.putPlotData(data, size, d.createType('@QPointF')) From 2b1de0c0849e6c607f3c4cfdfce25d1706f434b2 Mon Sep 17 00:00:00 2001 From: Johanna Vanhatapio Date: Tue, 8 Dec 2020 13:39:30 +0200 Subject: [PATCH 30/60] Doc: Add information about Telemetry and Crashpad settings Change-Id: I94af94cd99537cc5fe15f3bd33b5edcafe0b33e2 Reviewed-by: Leena Miettinen Reviewed-by: Thomas Hartmann Reviewed-by: Mahmoud Badri --- .../src/howto/creator-telemetry.qdoc | 23 +++++++++++++++--- .../images/studio-crashpad-checkbox.png | Bin 0 -> 28692 bytes .../images/studio-usage-statistics.png | Bin 0 -> 41776 bytes .../src/qtdesignstudio-advanced.qdoc | 7 ++++++ 4 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 doc/qtdesignstudio/images/studio-crashpad-checkbox.png create mode 100644 doc/qtdesignstudio/images/studio-usage-statistics.png diff --git a/doc/qtcreator/src/howto/creator-telemetry.qdoc b/doc/qtcreator/src/howto/creator-telemetry.qdoc index a8ebb892758..bfb26b0b478 100644 --- a/doc/qtcreator/src/howto/creator-telemetry.qdoc +++ b/doc/qtcreator/src/howto/creator-telemetry.qdoc @@ -34,7 +34,7 @@ \endif \title Managing Data Collection Settings - + \if defined (qtcreator) When you install \QC as a part of Qt installation, you are asked whether you allow it to collect pseudonymous information about your system and \QC use. If you decline, the plugin is not installed and no analytics data is @@ -44,6 +44,14 @@ you. You can change the settings for collecting and transmitting data any time. By default, no data is collected and you have to select a telemetry mode for data collection to begin. + \else + To enable the use of the telemetry plugin, you need to select \uicontrol + {Enable Usage Statistics} in the splash screen that appears when you first + launch \QDS. If the splash screen does not appear, you can enable the + telemetry plugin by selecting \uicontrol Help > \uicontrol {About Plugins} > + \uicontrol Utilities > \uicontrol UsageStatistics. + \image studio-usage-statistics.png "Enabling Usage Statistics" + \endif \section1 Principles of Data Collection @@ -58,7 +66,7 @@ \section1 Collecting Usage Statistics - The Telemetry plugin uses the + The telemetry plugin uses the \l{https://api.kde.org/frameworks/kuserfeedback/html/index.html} {KUserFeedback} framework to collect the usage data. The library has been designed from the user data privacy point of view and @@ -75,10 +83,10 @@ \list 1 \li Select \uicontrol Tools > \uicontrol Options > \uicontrol Telemetry > \uicontrol {Usage Statistics}. - \image qtcreator-telemetry-settings.png + \image qtcreator-telemetry-settings.png "Telemetry settings" \li In the \uicontrol {Telemetry mode} list, select the mode that determines what kind of data is collected. - \li In the \uicontrol {Data} list, select entries to view + \li In the \uicontrol {Data sources} list, select entries to view exactly what data is collected. Deselect check boxes for data that you do not want to transmit to the backend storage. \endlist @@ -104,5 +112,12 @@ (\uicontrol {Qt Design Studio} > \uicontrol Preferences > \uicontrol Environment > \uicontrol System on \macos), and then select \uicontrol {Enable crash reporting}. + + Since crash reports take up disk space, you may wish to remove them when + they are no longer needed. Select \uicontrol {Clear local crash reports} to + remove the crash report data. + + \image studio-crashpad-checkbox.png "Checkbox for enabling crash reporting" + \endif */ diff --git a/doc/qtdesignstudio/images/studio-crashpad-checkbox.png b/doc/qtdesignstudio/images/studio-crashpad-checkbox.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8fd3740e15723b544d1ca5aee85f56168e1354 GIT binary patch literal 28692 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/images/studio-usage-statistics.png b/doc/qtdesignstudio/images/studio-usage-statistics.png new file mode 100644 index 0000000000000000000000000000000000000000..26f8446e82fa08d5e507fe13eacf93e76c4e12a4 GIT binary patch literal 41776 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc index f0c0b8b42fd..403a69229c4 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-advanced.qdoc @@ -89,9 +89,16 @@ tools. \li \l{Managing Data Collection Settings} + \if defined (qtcreator) You can enable \QC to report crashes automatically. If you agreed to pseudonymous user statistics collection during the \QC installation, you can turn it on and determine what type of data is collected and transmitted to the backend storage. + \else + You can enable \QDS to report crashes automatically. If you enable + the telemetry plugin, you can turn on the pseudonymous user + statistics collection and determine what type of data is collected + and transmitted to the backend storage. + \endif \endlist */ From ee199c3fed3e9241614d456126789313bfb00d47 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Mon, 7 Dec 2020 18:08:32 +0200 Subject: [PATCH 31/60] Android: setSticky behavior to follow other platform's kits Don't set the whole kit's values to sticky, instead set only device, toolchain, qt version properties to sticky to follow the behavior of other platform's kits. This also allow users to set specific CMake version for the kits in case the selected one is not correct, since Android plugin doensn't handle that anyway. Fixes: QTCREATORBUG-25042 Change-Id: Ia6f6474b5ad9132e841e6e7024113439649b61f1 Reviewed-by: Alessandro Portale --- src/plugins/android/androidconfigurations.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 4c7a5183684..307faa3b5c0 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1347,7 +1347,11 @@ void AndroidConfigurations::updateAutomaticKitList() DeviceKitAspect::setDevice(k, device); QStringList abis = static_cast(qt)->androidAbis(); Debugger::DebuggerKitAspect::setDebugger(k, findOrRegisterDebugger(tc, abis, QtKitAspect::qtVersion(k))); - k->makeSticky(); + + k->setSticky(ToolChainKitAspect::id(), true); + k->setSticky(QtSupport::QtKitAspect::id(), true); + k->setSticky(DeviceKitAspect::id(), true); + k->setSticky(DeviceTypeKitAspect::id(), true); QString versionStr = QLatin1String("Qt %{Qt:Version}"); if (!qt->isAutodetected()) From 4a0a466b7565407d31e3932ca03fac25e4fd6ea3 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 8 Dec 2020 16:26:57 +0100 Subject: [PATCH 32/60] cmake build: Fix sdktool default output path The relative path that is passed to the sdktool build must be relative from the sdktool binary to the data path. IDE_DATA_PATH is relative from the Qt Creator binary. Change-Id: If74d9a07cb491247861eef36ebf8406de4fdedd8 Reviewed-by: Cristian Adam --- src/tools/sdktool/CMakeLists.txt | 4 +++- src/tools/sdktool/main.cpp | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/tools/sdktool/CMakeLists.txt b/src/tools/sdktool/CMakeLists.txt index cdd9d50f147..76040f4ba00 100644 --- a/src/tools/sdktool/CMakeLists.txt +++ b/src/tools/sdktool/CMakeLists.txt @@ -40,9 +40,11 @@ endif() set(UtilsSourcesDir "../../libs/utils") +file(RELATIVE_PATH DATA_PATH "/${IDE_LIBEXEC_PATH}" "/${IDE_DATA_PATH}") + add_qtc_executable(sdktool ${DESTINATION} - DEFINES DATA_PATH=\"${IDE_DATA_PATH}\" + DEFINES DATA_PATH=\"${DATA_PATH}\" DEPENDS Qt5::Core INCLUDES "${UtilsSourcesDir}/../" diff --git a/src/tools/sdktool/main.cpp b/src/tools/sdktool/main.cpp index c1ecb287461..0a07b1157cf 100644 --- a/src/tools/sdktool/main.cpp +++ b/src/tools/sdktool/main.cpp @@ -79,6 +79,14 @@ void printHelp(const std::vector> &operations) std::cout << " --help|-h Print this help text" << std::endl; std::cout << " --sdkpath=PATH|-s PATH Set the path to the SDK files" << std::endl << std::endl; + std::cout << "Default sdkpath is \"" + << qPrintable(QDir::cleanPath( + Utils::FilePath::fromString(QCoreApplication::applicationDirPath()) + .pathAppended(DATA_PATH) + .toUserOutput())) + << "\"" << std::endl + << std::endl; + std::cout << "OPERATION:" << std::endl; std::cout << " One of:" << std::endl; for (const std::unique_ptr &o : operations) From ce2e8bd2fb3bbe4f12b960825b40565300001a64 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 7 Dec 2020 09:56:53 +0100 Subject: [PATCH 33/60] Debugger: Adapt QJson dumper to Qt6 Task-number: QTCREATORBUG-24098 Change-Id: I0bdfca1389763582072fd774b6288b9a855cf8cf Reviewed-by: David Schulz --- share/qtcreator/debugger/qttypes.py | 26 ++++++++++++++++++-------- tests/auto/debugger/tst_dumpers.cpp | 2 +- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 1a8223aa265..b38f36a03b4 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -3160,21 +3160,31 @@ def qdump__QJsonValue(d, value): def qdump__QJsonArray(d, value): - if d.qtVersion() >= 0x050f00: + if d.qtVersion() >= 0x060000: + dptr = d.extractPointer(value) + if not dptr: + d.putItemCount(0) + else: + qdumpHelper_QCbor_array(d, dptr, False) + elif d.qtVersion() >= 0x050f00: _, container_ptr = value.split('pp') qdumpHelper_QCbor_array(d, container_ptr, False) - return - - qdumpHelper_QJsonArray(d, value['d'].pointer(), value['a'].pointer()) + else: + qdumpHelper_QJsonArray(d, value['d'].pointer(), value['a'].pointer()) def qdump__QJsonObject(d, value): - if d.qtVersion() >= 0x050f00: + if d.qtVersion() >= 0x060000: + dptr = d.extractPointer(value) + if not dptr: + d.putItemCount(0) + else: + qdumpHelper_QCbor_map(d, dptr, False) + elif d.qtVersion() >= 0x050f00: _, container_ptr = value.split('pp') qdumpHelper_QCbor_map(d, container_ptr, False) - return - - qdumpHelper_QJsonObject(d, value['d'].pointer(), value['o'].pointer()) + else: + qdumpHelper_QJsonObject(d, value['d'].pointer(), value['o'].pointer()) def qdump__QSqlResultPrivate(d, value): diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 97ffe847a01..969c7a9df49 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -7597,7 +7597,7 @@ void tst_Dumpers::dumper_data() const QtVersion jsonv1{0, 0x50f00}; - const QtVersion jsonv2{0x50f00}; + const QtVersion jsonv2{0x50f00, 0x60000}; QTest::newRow("QJson") << Data("#include \n" From c06d3e39d84c60511713e9eb8aa46245e3bd95d7 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 7 Dec 2020 11:59:50 +0100 Subject: [PATCH 34/60] Debugger: Adapt dumper test for QTCREATORBUG-4904 Maps have changed. Task-number: QTCREATORBUG-24098 Change-Id: I3a078e0168fb0e2a95d4c92fefc7c3cdeba9114f Reviewed-by: David Schulz --- tests/auto/debugger/tst_dumpers.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 969c7a9df49..a4c448ff048 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -6886,13 +6886,13 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "struct CustomStruct {\n" " int id;\n" - " double dvalue;\n" + " double dval;\n" "};", "QMap map;\n" "CustomStruct cs1;\n" "cs1.id = 1;\n" - "cs1.dvalue = 3.14;\n" + "cs1.dval = 3.14;\n" "CustomStruct cs2 = cs1;\n" "cs2.id = -1;\n" "map.insert(cs1.id, cs1);\n" @@ -6904,10 +6904,11 @@ void tst_Dumpers::dumper_data() + CoreProfile() + Check("map", "<2 items>", "@QMap") - + Check("map.0.key", "-1", "int") - + CheckType("map.0.value", "CustomStruct") - + Check("map.0.value.dvalue", FloatValue("3.14"), "double") - + Check("map.0.value.id", "-1", "int"); + + CheckPairish("map.0.key", "-1", "int") + + CheckType("map.0.value", "CustomStruct") % Qt5 + + CheckType("map.0.second", "CustomStruct") % Qt6 + + CheckPairish("map.0.value.dval", FloatValue("3.14"), "double") + + CheckPairish("map.0.value.id", "-1", "int"); #if 0 From 36c2e441efbe2e29421c560792ddfa7141c6dacb Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 9 Dec 2020 11:40:46 +0100 Subject: [PATCH 35/60] Debugger: Adapt BoostSharedPointer dumper test to Qt 6 Use QList instead of QStringList for the test, the actual dumper is unaffected. Task-number: QTCREATORBUG-24098 Change-Id: Ibbdd9255add9744acc06144f8f8d5b34e42186c9 Reviewed-by: Christian Stenger --- tests/auto/debugger/tst_dumpers.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index a4c448ff048..bea4f8c0d88 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -6635,7 +6635,7 @@ void tst_Dumpers::dumper_data() "boost::shared_ptr s;\n" "boost::shared_ptr i(new int(43));\n" "boost::shared_ptr j = i;\n" - "boost::shared_ptr sl(new QStringList(QStringList() << \"HUH!\"));", + "boost::shared_ptr> sl(new QList(QList() << \"HUH!\"));", "&s, &i, &j, &sl") @@ -6645,7 +6645,7 @@ void tst_Dumpers::dumper_data() + Check("s", "(null)", "boost::shared_ptr") + Check("i", "43", "boost::shared_ptr") + Check("j", "43", "boost::shared_ptr") - + Check("sl", "<1 items>", " boost::shared_ptr<@QStringList>") + + Check("sl", "<1 items>", " boost::shared_ptr<@QList<@QString>>") + Check("sl.0", "[0]", "\"HUH!\"", "@QString"); From 344802b8b2458ba463a5cc6e01f787ea46795025 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 9 Dec 2020 12:25:57 +0100 Subject: [PATCH 36/60] Don't call erase without namespace qualification C++20 adds free a function `erase` as API for containers, and Qt 6.1 adds it for Qt containers. Since it is a free function, ADL kicks in and creates issues if we don't fully qualify calls to our `erase` function. Change-Id: Ie5971d9206ae9e87e0f28f1390c09ded6f431b90 Reviewed-by: hjk --- src/plugins/projectexplorer/projectexplorer.cpp | 2 +- src/plugins/remotelinux/rsyncdeploystep.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index ca70a250b88..16970638495 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -3902,7 +3902,7 @@ void ProjectExplorerPlugin::addCustomParser(const CustomParserSettings &settings void ProjectExplorerPlugin::removeCustomParser(Id id) { - erase(dd->m_customParsers, [id](const CustomParserSettings &s) { + Utils::erase(dd->m_customParsers, [id](const CustomParserSettings &s) { return s.id == id; }); emit m_instance->customParsersChanged(); diff --git a/src/plugins/remotelinux/rsyncdeploystep.cpp b/src/plugins/remotelinux/rsyncdeploystep.cpp index 0ac1a9b9b01..76efc5b03ed 100644 --- a/src/plugins/remotelinux/rsyncdeploystep.cpp +++ b/src/plugins/remotelinux/rsyncdeploystep.cpp @@ -90,7 +90,7 @@ void RsyncDeployService::doDeploy() void RsyncDeployService::filterDeployableFiles() const { if (m_ignoreMissingFiles) { - erase(m_deployableFiles, [](const DeployableFile &f) { + Utils::erase(m_deployableFiles, [](const DeployableFile &f) { return !f.localFilePath().exists(); }); } From 3b7aee724d947df44361ed20e6479e3d7624ba65 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 9 Dec 2020 12:07:27 +0100 Subject: [PATCH 37/60] Debugger: Fix QFile dumper 64 bit for Qt6 32 bit offsets are mechanically adapted on the base that the size change was due to five containers changing from one to three pointer in Qt6, but this has not been checked. Task-number: QTCREATORBUG-24098 Change-Id: I492485a720f75df5fdde3dedb2fcfe9e953f1ed7 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/qttypes.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index b38f36a03b4..2f5c30d0333 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -652,7 +652,18 @@ def qdump__QFile(d, value): # 9fc0965 and a373ffcd change the layout of the private structure qtVersion = d.qtVersion() is32bit = d.ptrSize() == 4 - if qtVersion >= 0x050600 and d.qtTypeInfoVersion() >= 17: + if qtVersion >= 0x060000: + # FIXME: values 0 are wrong. As the file name is the + # only direct member of QFilePrivate, the offsets are + # equal to sizeof(QFileDevicePrivate), the base class. + if d.isWindowsTarget(): + if d.isMsvcTarget(): + offset = 0 if is32bit else 304 + else: + offset = 0 if is32bit else 304 + else: + offset = 0 if is32bit else 304 + elif qtVersion >= 0x050600 and d.qtTypeInfoVersion() >= 17: # Some QRingBuffer member got removed in 8f92baf5c9 if d.isWindowsTarget(): if d.isMsvcTarget(): From ca016bfb2e7a78253b1ad5dfc457583e8491be1a Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 9 Dec 2020 14:12:20 +0100 Subject: [PATCH 38/60] deploy.py: Support Python 2.7, do not require all clang executables FileNotFoundException is new in Python 3. We might not have a LLVM build with e.g. clazy-standalone and clang-tidy, make deployment of Clang executables optional. Change-Id: Id25b2f65a8d060bac9cb7a66fb2cd7022e2724e0 Reviewed-by: Cristian Adam --- scripts/deployqt.py | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/scripts/deployqt.py b/scripts/deployqt.py index 45bacd674e1..4dc11b6cf59 100755 --- a/scripts/deployqt.py +++ b/scripts/deployqt.py @@ -113,7 +113,7 @@ def is_debug(fpath): try: output = subprocess.check_output(['dumpbin', '/imports', fpath]) return coredebug.search(output.decode(encoding)) != None - except FileNotFoundError: + except OSError: # dumpbin is not there, maybe MinGW ? Just ship all .dlls. return debug_build @@ -238,16 +238,10 @@ def deploy_libclang(install_dir, llvm_install_dir, chrpath_bin): os.makedirs(clanglibdirtarget) deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'libclang.dll'), os.path.join(install_dir, 'bin'))) - deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clang.exe'), - clangbindirtarget)) - deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clang-cl.exe'), - clangbindirtarget)) - deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clangd.exe'), - clangbindirtarget)) - deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clang-tidy.exe'), - clangbindirtarget)) - deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clazy-standalone.exe'), - clangbindirtarget)) + for binary in ['clang', 'clang-cl', 'clangd', 'clang-tidy', 'clazy-standalone']: + binary_filepath = os.path.join(llvm_install_dir, 'bin', 'clang.exe') + if os.path.exists(binary_filepath): + deployinfo.append((binary_filepath, clangbindirtarget)) resourcetarget = os.path.join(clanglibdirtarget, 'clang') else: # libclang -> Qt Creator libraries @@ -260,12 +254,13 @@ def deploy_libclang(install_dir, llvm_install_dir, chrpath_bin): os.makedirs(clangbinary_targetdir) for binary in ['clang', 'clangd', 'clang-tidy', 'clazy-standalone']: binary_filepath = os.path.join(llvm_install_dir, 'bin', binary) - deployinfo.append((binary_filepath, clangbinary_targetdir)) - # add link target if binary is actually a symlink (to a binary in the same directory) - if os.path.islink(binary_filepath): - linktarget = os.readlink(binary_filepath) - deployinfo.append((os.path.join(os.path.dirname(binary_filepath), linktarget), - os.path.join(clangbinary_targetdir, linktarget))) + if os.path.exists(binary_filepath): + deployinfo.append((binary_filepath, clangbinary_targetdir)) + # add link target if binary is actually a symlink (to a binary in the same directory) + if os.path.islink(binary_filepath): + linktarget = os.readlink(binary_filepath) + deployinfo.append((os.path.join(os.path.dirname(binary_filepath), linktarget), + os.path.join(clangbinary_targetdir, linktarget))) clanglibs_targetdir = os.path.join(install_dir, 'libexec', 'qtcreator', 'clang', 'lib') # support libraries (for clazy) -> clang libexec if not os.path.exists(clanglibs_targetdir): From ddb2ae657db661281b35d544d0f5e20e63de0a12 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 9 Dec 2020 13:25:09 +0100 Subject: [PATCH 39/60] Debugger: Improve QMeta* dumper for default-initialized objects Null-dptr strikes again. Task-number: QTCREATORBUG-24098 Change-Id: I4e24cbe4cad4995ce39116a1b51b26153004ccfc Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index e94a21996a7..518767c5125 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1813,6 +1813,9 @@ class DumperBase(): metaObjectPtr, handle = value.split('pI') if metaObjectPtr != 0: if self.qtVersion() >= 0x060000: + if handle == 0: + self.putEmptyValue() + return revision = 9 name, alias, flags, keyCount, data = self.split('IIIII', handle) index = name From 37ec7f904a3b51186753aa144f7389f5abc75b90 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 8 Dec 2020 19:35:06 +0100 Subject: [PATCH 40/60] StudioWelcome: Set correct help topic Change-Id: I7cc2ae25d8adf0034a7d4eb10956607dd5e5e1c0 Reviewed-by: Tim Jenssen --- src/plugins/studiowelcome/studiowelcomeplugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index c360c8c3924..3fc5a850290 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -345,7 +345,7 @@ WelcomeMode::WelcomeMode() setPriority(Core::Constants::P_MODE_WELCOME); setId(Core::Constants::MODE_WELCOME); - setContextHelp("Qt Creator Manual"); + setContextHelp("Qt Design Studio Manual"); setContext(Core::Context(Core::Constants::C_WELCOME_MODE)); m_modeWidget = new QQuickWidget; From 5daee38ee390b91c15d843992f68706026012914 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 8 Dec 2020 16:49:38 +0100 Subject: [PATCH 41/60] QmlDesigner: Add compiler flag required to build Qt 6 Change-Id: I47defc9b8d4509f1a1aa367349c9b8268d876518 Reviewed-by: Thomas Hartmann --- share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri | 1 + 1 file changed, 1 insertion(+) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri index 1f4714d4d26..f0285ca4b0d 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri @@ -2,6 +2,7 @@ QT += core gui widgets qml quick network QT += core-private qml-private quick-private gui-private CONFIG += c++17 +win32: QMAKE_CXXFLAGS += /std:c++17 DEFINES -= QT_CREATOR From b0b419f7f8b94527a1bacf26da3444aadcb7bdbd Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Wed, 9 Dec 2020 13:39:32 +0100 Subject: [PATCH 42/60] Update Qbs submodule to the top of 1.18 branch Change-Id: I1c0744603cbd9765a6752d15dc70f3e1d040c792 Reviewed-by: Eike Ziller --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 9025c2e130d..baa18b3537f 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 9025c2e130d9a662354b6722c6b34fd964c5bc2b +Subproject commit baa18b3537f7471b7fec7a4ddcbce628386de0b4 From a45689f85c33941cbd5c840f2110770cf01fb050 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 1 Dec 2020 18:42:19 +0100 Subject: [PATCH 43/60] Doc: Update instructions for using the \youtube macro MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We needed a workaround to make this work in Qt Creator and Qt Design Studio help mode. Change-Id: I9b66fe91a5faa07366375a886a9f99352629945d Reviewed-by: Topi Reiniö --- .../src/qtcreator-documentation.qdoc | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/doc/qtcreatordev/src/qtcreator-documentation.qdoc b/doc/qtcreatordev/src/qtcreator-documentation.qdoc index c0be954940c..936163ad90d 100644 --- a/doc/qtcreatordev/src/qtcreator-documentation.qdoc +++ b/doc/qtcreatordev/src/qtcreator-documentation.qdoc @@ -424,10 +424,10 @@ docs show a thumbnail of the video with a play button. The support for the macro is defined in the - \c {qtcreator\doc\config\macros.qdocconf} file. To use the - macro, you need to save a thumbnail of the video in - \c {qtcreator\doc\qtcreator\images\videoicons} or - \c {qtcreator\doc\qtdesignstudio\images\videoicons}. + \c {qtcreator\doc\config\macros.qdocconf} and + \c {qtcreator\doc\config\macros-online.qdocconf} files. To + use the macro, you need to save a thumbnail of the video in + \c {qtcreator\doc\qtcreator\images\extraimages\images}. You can use the following URL to open the thumbnail image in a browser: \c {https://img.youtube.com/vi//0.jpg}. The \e {} is the ID of @@ -436,24 +436,21 @@ the ID is \c 9ihYeC0YJ0M. Save the image file as \c {9ihYeC0YJ0M.jpg}. You must add the filename of the thumbnail file to - \c {\qtcreator\doc\qtcreator\config\qtcreator-project.qdocconf} and - \c {\qtcreator\doc\qtdesignstudio\config\qtdesignstudio.qdocconf} - to the value of the \c {HTML.extraimages,qhp.qtcreator.extraFiles} - or \c {HTML.extraimages,qhp.qtdesignstudio.extraFiles} option. + \c {qtcreator-extraimages.qdocconf} and \c {qtdesignstudio-extraimages.qdocconf} + files in the \c {\qtcreator\doc\qtcreator\images\extraimages} folder. If you'll only link to the video from the \QC Manual or the \QDS Manual, - you'll only need to add the thumbnail filename to the \c .qdocconf file - for that project. + you'll only need to add the thumbnail filename to the \c extraimages.qdocconf + file for that project. For example, to enable linking to a video with the thumbnail filename - \c 9ihYeC0YJ0M.jpg in the \QDS Manual, the \c {qtdesignstudio.qdocconf} - file should contain the following entry: + \c 9ihYeC0YJ0M.jpg in the \QDS Manual, the \c {qtdesignstudio-extraimages.qdocconf} + file should contain the filename: \code - {HTML.extraimages,qhp.qtdesignstudio.extraFiles} += ../../config/images/commercial.png \ - ../images/videoicons/9ihYeC0YJ0M.jpg \ - ../images/videoicons/aV6kFxH3Xws.jpg \ - ../images/videoicons/ZzbucmQPU44.jpg + {HTML.extraimages,qhp.qtdesignstudio.extraFiles} += \ + images/commercial.png \ + images/9ihYeC0YJ0M.jpg \endcode To add a link to the video in text, you would write: From fdf6cd7899c2a9bc667adb971a9ec973b3b00015 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 9 Dec 2020 15:00:24 +0100 Subject: [PATCH 44/60] QmlDesigner: Reload file if type information is incomplete Unfortuatly we require this. The code model might be still parsing imports which will lead to an error. Reacting to ModelManagerInterface::libraryInfoUpdated and then reloading the document does fix this. This issue has high visibility. In case the puppet debug mode is enabled we ignore this. Task-number: QDS-3113 Task-number: QDS-1592 Change-Id: I6cbf9d01d1702f61c6bbbb86dca546174fecc825 Reviewed-by: Tim Jenssen --- .../designercore/include/rewriterview.h | 2 ++ .../designercore/model/rewriterview.cpp | 33 +++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 9ecc5d7b988..f71b1a42510 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -190,6 +190,7 @@ protected: // functions private: //variables ModelNode nodeAtTextCursorPositionHelper(const ModelNode &root, int cursorPosition) const; void setupCanonicalHashes() const; + void handleLibraryInfoUpdate(); TextModifier *m_textModifier = nullptr; int transactionLevel = 0; @@ -210,6 +211,7 @@ private: //variables std::function m_setWidgetStatusCallback; bool m_hasIncompleteTypeInformation = false; bool m_restoringAuxData = false; + bool m_modelAttachPending = false; mutable QHash m_canonicalIntModelNode; mutable QHash m_canonicalModelNodeInt; diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 928715ded8e..44726c23e00 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -64,6 +64,19 @@ namespace QmlDesigner { const char annotationsEscapeSequence[] = "##^##"; +bool debugQmlPuppet() +{ +#ifndef QMLDESIGNER_TEST + if (!QmlDesignerPlugin::instance()) + return false; + const QString debugPuppet = QmlDesignerPlugin::instance()->settings().value(DesignerSettingsKey:: + DEBUG_PUPPET).toString(); + return !debugPuppet.isEmpty(); +#else + return false; +#endif +} + RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *parent): AbstractView(parent), m_differenceHandling(differenceHandling), @@ -72,7 +85,12 @@ RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *paren m_textToModelMerger(new Internal::TextToModelMerger(this)) { m_amendTimer.setSingleShot(true); + m_amendTimer.setInterval(400); connect(&m_amendTimer, &QTimer::timeout, this, &RewriterView::amendQmlText); + + QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); + connect(modelManager, &QmlJS::ModelManagerInterface::libraryInfoUpdated, + this, &RewriterView::handleLibraryInfoUpdate, Qt::QueuedConnection); } RewriterView::~RewriterView() = default; @@ -89,6 +107,8 @@ Internal::TextToModelMerger *RewriterView::textToModelMerger() const void RewriterView::modelAttached(Model *model) { + m_modelAttachPending = false; + if (model && model->textModifier()) setTextModifier(model->textModifier()); @@ -102,10 +122,12 @@ void RewriterView::modelAttached(Model *model) if (!(m_errors.isEmpty() && m_warnings.isEmpty())) notifyErrorsAndWarnings(m_errors); - if (hasIncompleteTypeInformation()) + if (hasIncompleteTypeInformation()) { + m_modelAttachPending = true; QTimer::singleShot(1000, this, [this, model](){ modelAttached(model); }); + } } void RewriterView::modelAboutToBeDetached(Model * /*model*/) @@ -803,6 +825,13 @@ void RewriterView::setupCanonicalHashes() const } } +void RewriterView::handleLibraryInfoUpdate() +{ + // Trigger dummy amend to reload document when library info changes + if (isAttached() && !m_modelAttachPending && !debugQmlPuppet()) + m_amendTimer.start(); +} + ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const { return nodeAtTextCursorPositionHelper(rootModelNode(), cursorPosition); @@ -1005,7 +1034,7 @@ void RewriterView::qmlTextChanged() auto &viewManager = QmlDesignerPlugin::instance()->viewManager(); if (viewManager.usesRewriterView(this)) { QmlDesignerPlugin::instance()->viewManager().disableWidgets(); - m_amendTimer.start(400); + m_amendTimer.start(); } #else /*Keep test synchronous*/ From 4e806fc194c86c666c2bb6de41e64727e797305b Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 9 Dec 2020 15:44:57 +0100 Subject: [PATCH 45/60] Doc: Add location of anchor buttons to tutorial Fixes: QDS-3308 Change-Id: Ib177cfee01689ff51e6a4c56dce52857ac1f0705 Reviewed-by: Thomas Hartmann --- doc/qtdesignstudio/examples/doc/loginui2.qdoc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/qtdesignstudio/examples/doc/loginui2.qdoc b/doc/qtdesignstudio/examples/doc/loginui2.qdoc index 58bb5d2cbd6..54c3e887d04 100644 --- a/doc/qtdesignstudio/examples/doc/loginui2.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui2.qdoc @@ -71,8 +71,9 @@ \list 1 \li Open \e {Screen01.ui.qml} for editing in the \uicontrol {Form Editor} view. - \li Select \e logo in \uicontrol Navigator. - \li Select the \inlineimage icons/anchor-top.png + \li Select \e logo in the \uicontrol Navigator view. + \li In the \uicontrol Properties view, \uicontrol Layout tab, + select the \inlineimage icons/anchor-top.png (\uicontrol Top) and \inlineimage icons/anchor-left.png (\uicontrol Left) anchor buttons to anchor \e logo to the top left corner of its parent with 10-pixel margins. From 5b1cff753a9bd780309fb5817553c2296b16c518 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 9 Dec 2020 12:41:11 +0100 Subject: [PATCH 46/60] CMakeProjectManager: Match only on Cxx and C languages on import This way Qt Creator won't be creating imported kits on every import. On Windows the language "RC" is not part of the kit languages and would always discard valid matching kits. Fixes: QTCREATORBUG-25069 Change-Id: Ib4ec323ebf514c82e5036f7d0123100a75f3ea10 Reviewed-by: Eike Ziller --- src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 61d1d49f796..916df2cd886 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include @@ -318,7 +319,10 @@ bool CMakeProjectImporter::matchKit(void *directoryData, const Kit *k) const if (data->qt.qt && QtSupport::QtKitAspect::qtVersionId(k) != data->qt.qt->uniqueId()) return false; + const QList allLanguages = ToolChainManager::allLanguages(); for (const ToolChainDescription &tcd : data->toolChains) { + if (!Utils::contains(allLanguages, [&tcd](const Id& language) {return language == tcd.language;})) + continue; ToolChain *tc = ToolChainKitAspect::toolChain(k, tcd.language); if (!tc || tc->compilerCommand() != tcd.compilerPath) return false; From 34dfbe73b6eb8eab17eabf73d7ab9d563825df7a Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 10 Dec 2020 08:44:43 +0100 Subject: [PATCH 47/60] Debugger: Fix QVector and QList dumper with incomplete template types This can hapen when QList and QVector is used in split. Change-Id: Idb48901854e373139a38670a3d811bf01aef1915 Reviewed-by: hjk --- share/qtcreator/debugger/qttypes.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 2f5c30d0333..6a5a4e90f2a 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -1059,8 +1059,7 @@ def qform__QList(): def qdump__QList(d, value): - inner_type = value.type.ltarget[0] if value.type.code == TypeCode.Typedef else value.type[0] - return qdumpHelper_QList(d, value, value.type[0]) + return qdumpHelper_QList(d, value, d.createType(value.type[0])) def qdump__QVariantList(d, value): @@ -2206,7 +2205,7 @@ def qdump__QVector(d, value): if d.qtVersion() >= 0x060000: dd, data, size = value.split('ppi') d.putItemCount(size) - d.putPlotData(data, size, value.type.ltarget[0]) + d.putPlotData(data, size, d.createType(value.type.ltarget[0])) # g++ 9.3 does not add the template parameter list to the debug info. # Fake it for the common case: if value.type.name == d.qtNamespace() + "QVector": @@ -2214,7 +2213,7 @@ def qdump__QVector(d, value): else: data, size = d.vectorData(value) d.putItemCount(size) - d.putPlotData(data, size, value.type[0]) + d.putPlotData(data, size, d.createType(value.type[0])) if False: From 276c0ae4825e3d40c9243fd879db8ea5c8262936 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 4 Dec 2020 15:01:29 +0100 Subject: [PATCH 48/60] Debugger: Adapt QStandardItemDumper to Qt6 Task-number: QTCREATORBUG-24098 Change-Id: I1c21e6a1ee3db3532029638eedfcf58eead53424 Reviewed-by: David Schulz --- share/qtcreator/debugger/dumper.py | 5 +++-- share/qtcreator/debugger/qttypes.py | 24 +++++++++++++++--------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 518767c5125..113dabb21b2 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -3911,12 +3911,13 @@ class DumperBase(): tdata.name = typish tdata.typeId = typish tdata.templateArguments = self.listTemplateParameters(typish) + if size is not None: + tdata.lbitsize = 8 * size if typish.endswith('*'): tdata.code = TypeCode.Pointer tdata.lbitsize = 8 * self.ptrSize() + tdata.ltarget = self.createType(typish[:-1]) - if size is not None: - tdata.lbitsize = 8 * size self.registerType(typish, tdata) typeobj = self.Type(self, typish) #DumperBase.warn('CREATE TYPE: %s' % typeobj.stringify()) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 6a5a4e90f2a..bc86e878584 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -252,22 +252,28 @@ def qdump__QStandardItem(d, value): # warm up cache data_size = 4 * d.ptrSize() if d.qtVersion() >= 0x060000 else 2 * d.ptrSize() d.createType('@QStandardItemData', data_size) + d.createType('@QStandardItem', d.ptrSize()) + d.createType('@QStandardItem*', d.ptrSize()) vtable, dptr = value.split('pp') - # There used to be a virtual destructor that got removed in - # 88b6abcebf29b455438 on Apr 18 17:01:22 2017 - if d.qtVersion() >= 0x050900 or d.isMsvcTarget(): - model, parent, values, children, rows, cols, item = d.split('ppPPIIp', dptr) + if d.qtVersion() >= 0x060000: + model, parent, values, children, rows, cols, item = \ + d.split('pp{@QList<@QStandardItemData>}{@QList<@QStandardItem*>}IIp', dptr) else: - vtable1, model, parent, values, children, rows, cols, item = d.split('pppPPIIp', dptr) + # There used to be a virtual destructor that got removed in + # 88b6abcebf29b455438 on Apr 18 17:01:22 2017 + if d.qtVersion() < 0x050900 and not d.isMsvcTarget(): + dptr += d.ptrSize(); + model, parent, values, children, rows, cols, item = \ + d.split('pp{@QVector<@QStandardItemData>}{@QVector<@QStandardItem*>}IIp', dptr) + d.putEmptyValue() d.putExpandable() if d.isExpanded(): with Children(d): d.putSubItem('[model]', d.createValue(model, '@QStandardItemModel')) - d.putSubItem('[values]', d.createVectorItem(values, '@QStandardItemData')) - d.putSubItem('[children]', d.createVectorItem(children, - d.createPointerType(value.type))) + d.putSubItem('[values]', values) + d.putSubItem('[children]', children) def qdump__QDate(d, value): @@ -2203,7 +2209,7 @@ def qform__QVector(): def qdump__QVector(d, value): if d.qtVersion() >= 0x060000: - dd, data, size = value.split('ppi') + data, size = d.listData(value) d.putItemCount(size) d.putPlotData(data, size, d.createType(value.type.ltarget[0])) # g++ 9.3 does not add the template parameter list to the debug info. From 757d3200aaf5f519669d5984a374d8349659e6be Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 8 Dec 2020 16:48:19 +0200 Subject: [PATCH 49/60] QmlDesigner: Reset puppet if shader code changes If a shader file inside the project is modified, reset the puppets to update custom materials and effects that use the modified shader. Change-Id: Ie81accf5f3029c31b49b65b5e1b53e1259a9b4eb Reviewed-by: Thomas Hartmann --- .../designercore/include/nodeinstanceview.h | 14 +++ .../instances/nodeinstanceview.cpp | 101 ++++++++++++++++++ 2 files changed, 115 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 0e86ad11ee7..2027fc10bb8 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -39,10 +39,13 @@ #include #include #include +#include #include #include +QT_FORWARD_DECLARE_CLASS(QFileSystemWatcher) + namespace ProjectExplorer { class Target; } @@ -219,6 +222,8 @@ private: // functions QVariant modelNodePreviewImageDataToVariant(const ModelNodePreviewImageData &imageData); void updatePreviewImageForNode(const ModelNode &modelNode, const QImage &image); + void updateWatcher(const QString &path); + private: QHash m_imageDataMap; @@ -236,7 +241,16 @@ private: // key: fileUrl value: (key: instance qml id, value: related tool states) QHash> m_edit3DToolStates; + std::function m_crashCallback{[this] { handleCrash(); }}; + + // We use QFileSystemWatcher directly instead of Utils::FileSystemWatcher as we want + // shader changes to be applied immediately rather than requiring reactivation of + // the creator application. + QFileSystemWatcher *m_fileSystemWatcher; + QTimer m_resetTimer; + QTimer m_updateWatcherTimer; + QSet m_pendingUpdateDirs; }; } // namespace ProxyNodeInstanceView diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index be7460827d0..a06fddbc663 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -100,6 +100,7 @@ #include #include #include +#include enum { debug = false @@ -135,8 +136,44 @@ NodeInstanceView::NodeInstanceView(ConnectionManagerInterface &connectionManager : m_connectionManager(connectionManager) , m_baseStatePreviewImage(QSize(100, 100), QImage::Format_ARGB32) , m_restartProcessTimerId(0) + , m_fileSystemWatcher(new QFileSystemWatcher(this)) { m_baseStatePreviewImage.fill(0xFFFFFF); + + // Interval > 0 is used for QFileSystemWatcher related timers to allow all notifications + // related to a single event to be received before we act. + m_resetTimer.setSingleShot(true); + m_resetTimer.setInterval(100); + QObject::connect(&m_resetTimer, &QTimer::timeout, [this] { + resetPuppet(); + }); + m_updateWatcherTimer.setSingleShot(true); + m_updateWatcherTimer.setInterval(100); + QObject::connect(&m_updateWatcherTimer, &QTimer::timeout, [this] { + for (const auto &path : qAsConst(m_pendingUpdateDirs)) + updateWatcher(path); + m_pendingUpdateDirs.clear(); + }); + + connect(m_fileSystemWatcher, &QFileSystemWatcher::directoryChanged, + [this](const QString &path) { + const QSet pendingDirs = m_pendingUpdateDirs; + for (const auto &pendingPath : pendingDirs) { + if (path.startsWith(pendingPath)) { + // no need to add path, already handled by a pending parent path + return; + } else if (pendingPath.startsWith(path)) { + // Parent path to a pending path added, remove the pending path + m_pendingUpdateDirs.remove(pendingPath); + } + } + m_pendingUpdateDirs.insert(path); + m_updateWatcherTimer.start(); + + }); + connect(m_fileSystemWatcher, &QFileSystemWatcher::fileChanged, [this] { + m_resetTimer.start(); + }); } @@ -210,6 +247,8 @@ void NodeInstanceView::modelAttached(Model *model) NodeInstance newStateInstance = instanceForModelNode(stateNode); activateState(newStateInstance); } + + updateWatcher({}); } void NodeInstanceView::modelAboutToBeDetached(Model * model) @@ -227,6 +266,11 @@ void NodeInstanceView::modelAboutToBeDetached(Model * model) m_activeStateInstance = NodeInstance(); m_rootNodeInstance = NodeInstance(); AbstractView::modelAboutToBeDetached(model); + m_resetTimer.stop(); + m_updateWatcherTimer.stop(); + m_pendingUpdateDirs.clear(); + m_fileSystemWatcher->removePaths(m_fileSystemWatcher->directories()); + m_fileSystemWatcher->removePaths(m_fileSystemWatcher->files()); } void NodeInstanceView::handleCrash() @@ -1704,4 +1748,61 @@ void NodeInstanceView::updatePreviewImageForNode(const ModelNode &modelNode, con emitModelNodelPreviewPixmapChanged(modelNode, pixmap); } +void NodeInstanceView::updateWatcher(const QString &path) +{ + QString rootPath; + QStringList oldFiles; + QStringList oldDirs; + QStringList newFiles; + QStringList newDirs; + + if (path.isEmpty()) { + // Do full update + rootPath = QFileInfo(model()->fileUrl().toLocalFile()).absolutePath(); + m_fileSystemWatcher->removePaths(m_fileSystemWatcher->directories()); + m_fileSystemWatcher->removePaths(m_fileSystemWatcher->files()); + } else { + rootPath = path; + const QStringList files = m_fileSystemWatcher->files(); + const QStringList dirs = m_fileSystemWatcher->directories(); + for (const auto &file : files) { + if (file.startsWith(path)) + oldFiles.append(file); + } + for (const auto &dir : dirs) { + if (dir.startsWith(path)) + oldDirs.append(dir); + } + } + + newDirs.append(rootPath); + + QDirIterator dirIterator(rootPath, {}, QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); + while (dirIterator.hasNext()) + newDirs.append(dirIterator.next()); + + // Common shader suffixes + static const QStringList filterList {"*.frag", "*.vert", + "*.glsl", "*.glslv", "*.glslf", + "*.vsh","*.fsh"}; + + QDirIterator fileIterator(rootPath, filterList, QDir::Files, QDirIterator::Subdirectories); + while (fileIterator.hasNext()) + newFiles.append(fileIterator.next()); + + if (oldDirs != newDirs) { + if (!oldDirs.isEmpty()) + m_fileSystemWatcher->removePaths(oldDirs); + if (!newDirs.isEmpty()) + m_fileSystemWatcher->addPaths(newDirs); + } + + if (newFiles != oldFiles) { + if (!oldFiles.isEmpty()) + m_fileSystemWatcher->removePaths(oldFiles); + if (!newFiles.isEmpty()) + m_fileSystemWatcher->addPaths(newFiles); + } +} + } From 11d079a0fe143c3546778414f87a73673ec0e636 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 9 Dec 2020 17:00:30 +0100 Subject: [PATCH 50/60] Debugger: Partially fix QV4 dumper for Qt6 Just the 64 bit case, simple types. Task-number: QTCREATORBUG-24098 Change-Id: If13e342c1fb419a026cdaa35b21483566e8494b7 Reviewed-by: David Schulz --- share/qtcreator/debugger/qttypes.py | 54 +++++++++++++++++++++++++++-- tests/auto/debugger/tst_dumpers.cpp | 8 +++-- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index bc86e878584..ffbc2274ef6 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -2769,7 +2769,10 @@ def qdump__QJSValue(d, value): if d.ptrSize() == 4: qdump_32__QJSValue(d, value) else: - qdump_64__QJSValue(d, value) + if d.qtVersion() >= 0x60000: + qdump_64__QJSValue_6(d, value) + else: + qdump_64__QJSValue_5(d, value) def qdump_32__QJSValue(d, value): @@ -2795,8 +2798,55 @@ def qdump_32__QJSValue(d, value): d.putType(' ') d.putFields(value) +def qdump_64__QJSValue_6(d, value): + dd = value.split('Q')[0] + typ = dd >> 47 -def qdump_64__QJSValue(d, value): + if dd == 0: + d.putValue('(undefined)') + d.putType(value.type.name + ' (undefined)') + elif typ == 5: + d.putValue('(null)') + d.putType(value.type.name + ' (null)') + elif typ == 6: + d.putValue('true' if dd & 1 else 'false') + d.putType(value.type.name + ' (bool)') + elif typ == 7: + d.putValue(dd & 0xfffffffff) + d.putType(value.type.name + ' (int)') + elif typ > 7: + val = d.Value(d) + val.ldata = struct.pack('q', dd ^ 0xfffc000000000000) + val.type = d.createType('double') + d.putItem(val) + d.putType(value.type.name + ' (double)') + elif typ <= 3: # Heap + if dd & 1: # String + val = d.Value(d) + val.ldata = struct.pack('q', dd & ~1) + val.type = d.createType('@QString*') + d.putItem(val) + d.putType(value.type.name + ' (QString)') + else: + # FIXME: Arrays, Objects missing. + val = d.split('{@QV4::Managed*}', value)[0] + d.putItem(val) + d.putItemCount(1) + else: + d.putEmptyValue() + d.putItemCount(1) + d.putPlainChildren(value) + return + + if d.isExpanded(): + with Children(d): + with SubItem(d, '[raw]'): + d.putValue('[0x%x]' % dd) + d.putType(' ') + d.putFields(value) + + +def qdump_64__QJSValue_5(d, value): ns = d.qtNamespace() dd = value.split('Q')[0] if dd == 0: diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index bea4f8c0d88..f8bb7ec5801 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -7741,6 +7741,7 @@ void tst_Dumpers::dumper_data() "v18.setProperty(\"PropA\", 1);\n" "v18.setProperty(\"PropB\", 2.5);\n" "v18.setProperty(\"PropC\", v10);\n\n" + "#if QT_VERSION < 0x60000\n" "QV4::Value s11, *p11 = QJSValuePrivate::valueForData(&v11, &s11);\n" "QV4::Value s12, *p12 = QJSValuePrivate::valueForData(&v12, &s12);\n" "QV4::Value s13, *p13 = QJSValuePrivate::valueForData(&v13, &s13);\n" @@ -7748,10 +7749,11 @@ void tst_Dumpers::dumper_data() "QV4::Value s15, *p15 = QJSValuePrivate::valueForData(&v15, &s15);\n" "QV4::Value s16, *p16 = QJSValuePrivate::valueForData(&v16, &s16);\n" "QV4::Value s17, *p17 = QJSValuePrivate::valueForData(&v17, &s17);\n" - "QV4::Value s18, *p18 = QJSValuePrivate::valueForData(&v18, &s18);\n", + "QV4::Value s18, *p18 = QJSValuePrivate::valueForData(&v18, &s18);\n" + "unused(&p11, &p12, &p13, &p14, &p15, &p16, &p17, &p18);\n" + "#endif\n", - "&v10, &v11, &v12, &v13, &v14, &v15, &v16, &v17, &v18, " - "&p11, &p12, &p13, &p14, &p15, &p16, &p17, &p18") + "&v10, &v11, &v12, &v13, &v14, &v15, &v16, &v17, &v18") + QmlPrivateProfile() + QtVersion(0x50000) From c902974423862c13ec7130be0dc96209bcb1903a Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 9 Dec 2020 15:23:07 +0100 Subject: [PATCH 51/60] Debugger: Simplify QObject parent dumping Change-Id: I24fd6bf684a213c2e47978485442dd6c47073a7a Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 113dabb21b2..f362532fd2f 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1889,28 +1889,22 @@ class DumperBase(): if qobjectPtr: dd = self.extractPointer(qobjectPtr + ptrSize) if self.qtVersion() >= 0x50000: - (dvtablePtr, qptr, parentPtr, childrenDPtr, flags, postedEvents, + (dvtablePtr, qptr, parent, children, flags, postedEvents, dynMetaObjectPtr, # Up to here QObjectData. extraData, threadDataPtr, connectionListsPtr, sendersPtr, currentSenderPtr) \ - = self.split('ppppIIp' + 'ppppp', dd) + = self.split('pp{@QObject*}{@QList<@QObject*>}IIp' + 'ppppp', dd) else: - (dvtablePtr, qptr, parentPtr, childrenDPtr, flags, postedEvents, + (dvtablePtr, qptr, parent, children, flags, postedEvents, dynMetaObjectPtr, # Up to here QObjectData objectName, extraData, threadDataPtr, connectionListsPtr, sendersPtr, currentSenderPtr) \ - = self.split('ppppIIp' + 'pppppp', dd) + = self.split('pp{@QObject*}{@QList<@QObject*>}IIp' + 'pppppp', dd) - if qobjectPtr: - qobjectType = self.createType('@QObject') with SubItem(self, '[parent]'): if not self.isCli: self.putSortGroup(9) - if parentPtr: - self.putItem(self.createValue(parentPtr, qobjectType)) - else: - self.putValue('0x0') - self.putType('QObject *') + self.putItem(parent) with SubItem(self, '[children]'): if not self.isCli: From ca33079e91365479506025431fea93cccf210c68 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 9 Dec 2020 16:01:41 +0100 Subject: [PATCH 52/60] QmlDesigner: Add QTC_ASSERT In corner cases m_nodeInstanceServer can be null. This should be considered as an error, but there is no reason to crash in this case. Change-Id: If2b5e11b7d2462634ab8f9bce653bdbc5b3c8b45 Reviewed-by: Tim Jenssen --- .../designercore/instances/nodeinstanceview.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index a06fddbc663..3e3c6379b10 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -422,6 +422,7 @@ void NodeInstanceView::resetVerticalAnchors(const ModelNode &modelNode) void NodeInstanceView::propertiesAboutToBeRemoved(const QList& propertyList) { + QTC_ASSERT(m_nodeInstanceServer, return); QList nodeList; QList nonNodePropertyList; @@ -493,6 +494,7 @@ void NodeInstanceView::nodeTypeChanged(const ModelNode &, const TypeName &, int, void NodeInstanceView::bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags /*propertyChange*/) { + QTC_ASSERT(m_nodeInstanceServer, return); m_nodeInstanceServer->changePropertyBindings(createChangeBindingCommand(propertyList)); } @@ -507,6 +509,7 @@ void NodeInstanceView::bindingPropertiesChanged(const QList& pr void NodeInstanceView::variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags /*propertyChange*/) { + QTC_ASSERT(m_nodeInstanceServer, return); updatePosition(propertyList); m_nodeInstanceServer->changePropertyValues(createChangeValueCommand(propertyList)); } @@ -522,6 +525,7 @@ void NodeInstanceView::variantPropertiesChanged(const QList& pr void NodeInstanceView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags /*propertyChange*/) { + QTC_ASSERT(m_nodeInstanceServer, return); if (!isSkippedNode(node)) { updateChildren(newPropertyParent); m_nodeInstanceServer->reparentInstances( @@ -531,11 +535,14 @@ void NodeInstanceView::nodeReparented(const ModelNode &node, const NodeAbstractP void NodeInstanceView::fileUrlChanged(const QUrl &/*oldUrl*/, const QUrl &newUrl) { + QTC_ASSERT(m_nodeInstanceServer, return); m_nodeInstanceServer->changeFileUrl(createChangeFileUrlCommand(newUrl)); } void NodeInstanceView::nodeIdChanged(const ModelNode& node, const QString& /*newId*/, const QString &oldId) { + QTC_ASSERT(m_nodeInstanceServer, return); + if (hasInstanceForModelNode(node)) { NodeInstance instance = instanceForModelNode(node); m_nodeInstanceServer->changeIds(createChangeIdsCommand({instance})); @@ -546,6 +553,7 @@ void NodeInstanceView::nodeIdChanged(const ModelNode& node, const QString& /*new void NodeInstanceView::nodeOrderChanged(const NodeListProperty & listProperty, const ModelNode & /*movedNode*/, int /*oldIndex*/) { + QTC_ASSERT(m_nodeInstanceServer, return); QVector containerList; PropertyName propertyName = listProperty.name(); qint32 containerInstanceId = -1; @@ -574,6 +582,7 @@ void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &value) { + QTC_ASSERT(m_nodeInstanceServer, return); if (((node.isRootNode() && (name == "width" || name == "height")) || name == "invisible" || name == "locked") || name.endsWith(PropertyName("@NodeInstance"))) { if (hasInstanceForModelNode(node)) { @@ -610,6 +619,7 @@ void NodeInstanceView::customNotification(const AbstractView *view, const QStrin void NodeInstanceView::nodeSourceChanged(const ModelNode &node, const QString & newNodeSource) { + QTC_ASSERT(m_nodeInstanceServer, return); if (hasInstanceForModelNode(node)) { NodeInstance instance = instanceForModelNode(node); ChangeNodeSourceCommand changeNodeSourceCommand(instance.instanceId(), newNodeSource); From eac85f82615b75e87de248eb6d8f80e657826752 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 3 Dec 2020 16:33:02 +0100 Subject: [PATCH 53/60] Debugger: Fix QObject property display with Qt 6 Task-number: QTCREATORBUG-24098 Change-Id: I6e1013fe39208ef6e9ba792e6b2fb745eb5e3108 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 49 +++++++++++++++++++---------- tests/auto/debugger/tst_dumpers.cpp | 1 + 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index f362532fd2f..da599fd7155 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1743,13 +1743,6 @@ class DumperBase(): data = array + begin * stepSize return data, size - def listChildrenGenerator(self, addr, innerType): - stepSize = self.ptrSize() - data, size = self.listData(addr) - for i in range(size): - yield self.createValue(data + i * stepSize, innerType) - #yield self.createValue(data + i * stepSize, 'void*') - def vectorChildrenGenerator(self, value, innerType): data, size = self.vectorData(value) for i in range(size): @@ -2035,7 +2028,10 @@ class DumperBase(): with Children(self): # Static properties. for i in range(propertyCount): - t = self.split('III', dataPtr + properties * 4 + 12 * i) + if self.qtVersion() >= 0x60000: + t = self.split('IIIII', dataPtr + properties * 4 + 20 * i) + else: + t = self.split('III', dataPtr + properties * 4 + 12 * i) name = self.metaString(metaObjectPtr, t[0], revision) if qobject and self.qtPropertyFunc: # LLDB doesn't like calling it on a derived class, possibly @@ -2064,19 +2060,38 @@ class DumperBase(): # Dynamic properties. if extraData: + def list6Generator(addr, innerType): + data, size = self.listData(addr) + for i in range(size): + yield self.createValue(data + i * innerType.size(), innerType) + + def list5Generator(addr, innerType): + data, size = self.listData(addr) + for i in range(size): + yield self.createValue(data + i * ptrSize, innerType) + + def vectorGenerator(addr, innerType): + data, size = self.vectorData(addr) + for i in range(size): + yield self.createValue(data + i * innerType.size(), innerType) + byteArrayType = self.createType('@QByteArray') variantType = self.createType('@QVariant') - if self.qtVersion() >= 0x50600: - values = self.vectorChildrenGenerator( - extraData + 2 * ptrSize, variantType) + if self.qtVersion() >= 0x60000: + values = vectorGenerator(extraData + 3 * ptrSize, variantType) + elif self.qtVersion() >= 0x50600: + values = vectorGenerator(extraData + 2 * ptrSize, variantType) elif self.qtVersion() >= 0x50000: - values = self.listChildrenGenerator( - extraData + 2 * ptrSize, variantType) + values = list5Generator(extraData + 2 * ptrSize, variantType) else: - values = self.listChildrenGenerator( - extraData + 2 * ptrSize, variantType.pointer()) - names = self.listChildrenGenerator( - extraData + ptrSize, byteArrayType) + values = list5Generator(extraData + 2 * ptrSize, + variantType.pointer()) + + if self.qtVersion() >= 0x60000: + names = list6Generator(extraData, byteArrayType) + else: + names = list5Generator(extraData + ptrSize, byteArrayType) + for (k, v) in zip(names, values): with SubItem(self, propertyCount + dynamicPropertyCount): if not self.isCli: diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index f8bb7ec5801..afb0ec58779 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -3101,6 +3101,7 @@ void tst_Dumpers::dumper_data() + Check5("mm", "destroyed", "@QMetaMethod") + Check4("mm", "destroyed(QObject*)", "@QMetaMethod") + Check("mm.handle", "14", TypeDef("unsigned int", "uint")) + % QtVersion(0, 0x5ffff) // Gone in Qt 6 + Check("mp", "objectName", "@QMetaProperty"); From c282551569dd106943a861307f87af39c1371de8 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 10 Dec 2020 10:57:03 +0100 Subject: [PATCH 54/60] QmlDesigner: Track usage of flow tags Change-Id: Id9e27c601dcb67e6758de51e8a1fcfd02b3ac6e5 Reviewed-by: Miikka Heikkinen --- .../qmldesigner/components/itemlibrary/itemlibrarywidget.cpp | 2 ++ src/plugins/qmldesigner/qmldesignerconstants.h | 1 + 2 files changed, 3 insertions(+) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index ae3569ff022..4ee8346ed11 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -484,6 +484,8 @@ void ItemLibraryWidget::addImport(const QString &name, const QString &version) void ItemLibraryWidget::addPossibleImport(const QString &name) { QTC_ASSERT(m_model, return); + QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_IMPORT_ADDED_FLOWTAG + + name); const Import import = m_model->highestPossibleImport(name); try { QList addedImports = {Import::createLibraryImport(name, import.version())}; diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index 8884039df23..f91caac9597 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -86,6 +86,7 @@ const char EVENT_ANNOTATION_ADDED[] = "Annotation Added"; const char EVENT_RESOURCE_IMPORTED[] = "Resource Imported "; const char EVENT_ACTION_EXECUTED[] = "Action Executed "; const char EVENT_IMPORT_ADDED[] = "Import Added "; +const char EVENT_IMPORT_ADDED_FLOWTAG[] = "Import Added FlowTag "; const char EVENT_BINDINGEDITOR_OPENED[] = "Binding Editor Opened"; const char EVENT_RICHTEXT_OPENED[] = "Richtext Editor Opened"; const char EVENT_FORMEDITOR_TIME[] = "Form Editor"; From ad2699773dda84ba63bf2e4cc31169b41e353c72 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 10 Dec 2020 10:57:37 +0100 Subject: [PATCH 55/60] QmlDesigner: Set focus policy for 3D canvas Otherwise the widget does not get focus. Change-Id: I8209f85c375ff419d34397d9a9e1826d07b4e432 Reviewed-by: Miikka Heikkinen --- src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp index 62264e037f0..bb04dea333f 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp @@ -44,6 +44,7 @@ Edit3DCanvas::Edit3DCanvas(Edit3DWidget *parent) { setMouseTracking(true); setAcceptDrops(true); + setFocusPolicy(Qt::ClickFocus); } void Edit3DCanvas::updateRenderImage(const QImage &img) From 9c8768e752de83b3c0b8655c90e180b46fd4acdc Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 10 Dec 2020 11:02:47 +0100 Subject: [PATCH 56/60] Dumper: Remove some fallback code ..and unused or unknown variables. Change-Id: I13d1d03fa09ef3952fe2cb3f4b257fb2882709f2 Reviewed-by: hjk --- share/qtcreator/debugger/dumper.py | 31 ++++-------------------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index da599fd7155..07ce1d0ebfe 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1841,7 +1841,6 @@ class DumperBase(): # handle is what's store in QMetaMethod etc, pass -1 for QObject/QMetaObject # itself metaObjectPtr needs to point to a valid QMetaObject. def putQObjectGutsHelper(self, qobject, qobjectPtr, handle, metaObjectPtr, origType): - intSize = 4 ptrSize = self.ptrSize() def putt(name, value, typeName=' '): @@ -1886,13 +1885,13 @@ class DumperBase(): dynMetaObjectPtr, # Up to here QObjectData. extraData, threadDataPtr, connectionListsPtr, sendersPtr, currentSenderPtr) \ - = self.split('pp{@QObject*}{@QList<@QObject*>}IIp' + 'ppppp', dd) + = self.split('pp{@QObject*}{@QList<@QObject *>}IIp' + 'ppppp', dd) else: (dvtablePtr, qptr, parent, children, flags, postedEvents, dynMetaObjectPtr, # Up to here QObjectData objectName, extraData, threadDataPtr, connectionListsPtr, sendersPtr, currentSenderPtr) \ - = self.split('pp{@QObject*}{@QList<@QObject*>}IIp' + 'pppppp', dd) + = self.split('pp{@QObject*}{@QList<@QObject *>}IIp' + 'pppppp', dd) with SubItem(self, '[parent]'): if not self.isCli: @@ -1903,30 +1902,8 @@ class DumperBase(): if not self.isCli: self.putSortGroup(8) - if self.qtVersion() >= 0x60000: - dvtablePtr, qptr, parentPtr, children \ - = self.split('ppp{QList}', dd) - self.putItem(children) - else: - base = self.extractPointer(dd + 3 * ptrSize) # It's a QList - begin = self.extractInt(base + 8) - end = self.extractInt(base + 12) - array = base + 16 - if self.qtVersion() < 0x50000: - array += ptrSize - self.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000) - size = end - begin - self.check(size >= 0) - self.putItemCount(size) - if size > 0: - self.putExpandable() - if self.isExpanded(): - addrBase = array + begin * ptrSize - with Children(self, size): - for i in self.childRange(): - with SubItem(self, i): - childPtr = self.extractPointer(addrBase + i * ptrSize) - self.putItem(self.createValue(childPtr, qobjectType)) + dvtablePtr, qptr, parentPtr, children = self.split('ppp{QList}', dd) + self.putItem(children) if isQMetaObject: with SubItem(self, '[strings]'): From 9c8c5b63631dc4b2cc5dd1746671d795a2c53e88 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 10 Dec 2020 11:04:41 +0100 Subject: [PATCH 57/60] Debugger: Strip inner typenames in pointer type lookup fallbacks To compensate for a potential 'Foo*' vs 'Foo *' difference in debug info. Change-Id: I90e822f89bc13bdf7ffed30ee12a984a659aa38f Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 07ce1d0ebfe..9556f5a0cc5 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -3902,7 +3902,7 @@ class DumperBase(): if typish.endswith('*'): tdata.code = TypeCode.Pointer tdata.lbitsize = 8 * self.ptrSize() - tdata.ltarget = self.createType(typish[:-1]) + tdata.ltarget = self.createType(typish[:-1].strip()) self.registerType(typish, tdata) typeobj = self.Type(self, typish) From 33487984b978c1376043defd42699a7da771a7a8 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 4 Dec 2020 16:46:45 +0100 Subject: [PATCH 58/60] Doc: Use version independent Qt link or use direct links where possible. Change-Id: I00d559ad53a95caf91c39985bd9fb5ea99f9aed7 Reviewed-by: Leena Miettinen --- doc/qtcreator/config/qtcreator-project.qdocconf | 3 ++- .../creator-only/creator-tech-support.qdoc | 4 ++-- .../qtquick/creator-only/qtquick-creating.qdoc | 15 +++++---------- .../qtquick/qtquick-from-qmlproject-to-pro.qdoc | 4 ++-- doc/qtcreator/src/qtquick/qtquick-ui-forms.qdoc | 4 ++-- doc/qtcreatordev/src/distributing-plugins.qdoc | 2 +- doc/qtcreatordev/src/qtcreator-documentation.qdoc | 2 +- 7 files changed, 15 insertions(+), 19 deletions(-) diff --git a/doc/qtcreator/config/qtcreator-project.qdocconf b/doc/qtcreator/config/qtcreator-project.qdocconf index 479d17ed8b2..096548517da 100644 --- a/doc/qtcreator/config/qtcreator-project.qdocconf +++ b/doc/qtcreator/config/qtcreator-project.qdocconf @@ -68,7 +68,8 @@ depends += qtandroidextras\ qttestlib \ qtuitools \ qtxml \ - qtlocation + qtlocation \ + qtvirtualkeyboard include(../../config/macros.qdocconf) include(../../config/qt-cpp-ignore.qdocconf) diff --git a/doc/qtcreator/src/overview/creator-only/creator-tech-support.qdoc b/doc/qtcreator/src/overview/creator-only/creator-tech-support.qdoc index fb06269199e..90c9c8959de 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-tech-support.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-tech-support.qdoc @@ -47,9 +47,9 @@ \row \li View examples of what you can do with Qt - \li \l{https://doc.qt.io/qt-5/all-examples.html}{List of Qt Examples} + \li \l{https://doc.qt.io/qt/all-examples.html}{List of Qt Examples} - \l{https://doc.qt.io/qt-5/qtquick-codesamples.html} + \l{https://doc.qt.io/qt/qtquick-codesamples.html} {List of Qt Quick Examples} \row diff --git a/doc/qtcreator/src/qtquick/creator-only/qtquick-creating.qdoc b/doc/qtcreator/src/qtquick/creator-only/qtquick-creating.qdoc index 4841ee2023c..f5a70f9e8c4 100644 --- a/doc/qtcreator/src/qtquick/creator-only/qtquick-creating.qdoc +++ b/doc/qtcreator/src/qtquick/creator-only/qtquick-creating.qdoc @@ -52,18 +52,15 @@ target platforms. \li \uicontrol {Qt Quick Application - Scroll} uses the - \l{http://doc.qt.io/qt-5/qml-qtquick-controls2-scrollview.html} - {ScrollView} type to implement a scrollable list view + \l{ScrollView} type to implement a scrollable list view (requires Qt 5.9 or later). \li \uicontrol {Qt Quick Application - Stack} uses the - \l{http://doc.qt.io/qt-5/qml-qtquick-controls2-stackview.html} - {StackView} type to implement a set of pages with a stack-based + \l{StackView} type to implement a set of pages with a stack-based navigation model (requires Qt 5.7 or later). \li \uicontrol {Qt Quick Application - Swipe} uses the - \l{http://doc.qt.io/qt-5/qml-qtquick-controls2-swipeview.html} - {SwipeWiew} type to implement a set of pages with a swipe-based + \l{SwipeView} type to implement a set of pages with a swipe-based navigation model (requires Qt 5.7 or later). \endlist @@ -138,8 +135,7 @@ that are used in the QML files. \li Select the \uicontrol {Use Qt Virtual Keyboard} check box to add - support for \l{http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html} - {Qt Virtual Keyboard} to the application. + support for \l{Qt Virtual Keyboard} to the application. \note If you have not installed the Qt Virtual Keyboard module when you installed Qt, an error message will appear when you try to open @@ -236,8 +232,7 @@ since Qt 5.1). \li Select the \uicontrol {Use Qt Virtual Keyboard} check box to add - support for \l{http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html} - {Qt Virtual Keyboard} to the application. + support for \l{Qt Virtual Keyboard} to the application. \note If you have not installed the Qt Virtual Keyboard module when you installed Qt, an error message will appear when you try to open diff --git a/doc/qtcreator/src/qtquick/qtquick-from-qmlproject-to-pro.qdoc b/doc/qtcreator/src/qtquick/qtquick-from-qmlproject-to-pro.qdoc index 6665902d3e9..c91b97bd71c 100644 --- a/doc/qtcreator/src/qtquick/qtquick-from-qmlproject-to-pro.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-from-qmlproject-to-pro.qdoc @@ -46,7 +46,7 @@ \endlist For more information about integrating QML and C++, see - \l{https://doc.qt.io/qt-5/qtqml-cppintegration-overview.html} + \l{https://doc.qt.io/qt/qtqml-cppintegration-overview.html} {Overview - QML and C++ Integration}. You can use a Qt Creator wizard template to create a Qt Quick application @@ -59,7 +59,7 @@ The wizard automatically adds the \c QML_IMPORT_PATH option to the project file for specifying the required - \l{https://doc.qt.io/qt-5/qtqml-syntax-imports.html#qml-import-path} + \l{https://doc.qt.io/qt/qtqml-syntax-imports.html#qml-import-path} {QML import path}. The path is only needed if more than one subdirectory contains QML files. diff --git a/doc/qtcreator/src/qtquick/qtquick-ui-forms.qdoc b/doc/qtcreator/src/qtquick/qtquick-ui-forms.qdoc index b069337304b..9b398f476a6 100644 --- a/doc/qtcreator/src/qtquick/qtquick-ui-forms.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-ui-forms.qdoc @@ -112,7 +112,7 @@ In addition, all functions of the \c Math and \c Date objects are supported. For more information, see - \l{https://doc.qt.io/qt-5/qtqml-javascript-functionlist.html} + \l{https://doc.qt.io/qt/qtqml-javascript-functionlist.html} {List of JavaScript Objects and Functions}. \section2 Qt QML Methods @@ -159,7 +159,7 @@ \endlist For more information about using the methods, see - \l{https://doc.qt.io/qt-5/qml-qtqml-qt.html}{Qt QML Methods}. + \l{https://doc.qt.io/qt/qml-qtqml-qt.html}{Qt QML Methods}. \section1 Using Qt Quick UI Forms diff --git a/doc/qtcreatordev/src/distributing-plugins.qdoc b/doc/qtcreatordev/src/distributing-plugins.qdoc index 1b38a58798d..64317868ef7 100644 --- a/doc/qtcreatordev/src/distributing-plugins.qdoc +++ b/doc/qtcreatordev/src/distributing-plugins.qdoc @@ -79,7 +79,7 @@ that rely on external files, like the generic highlighter. You can still add \l{https://doc.qt.io/qtcreator/creator-project-wizards.html}{wizard templates} this way, by adding the - \l{https://doc.qt.io/qt-5/resources.html#using-resources-in-the-application} + \l{https://doc.qt.io/qt/resources.html#using-resources-in-the-application} {path to the resource directory} into your QRC file with ProjectExplorer::JsonWizardFactory::addWizardPath(). Registering documentation and translations can be done in similar ways. diff --git a/doc/qtcreatordev/src/qtcreator-documentation.qdoc b/doc/qtcreatordev/src/qtcreator-documentation.qdoc index 936163ad90d..4b6f1c205d8 100644 --- a/doc/qtcreatordev/src/qtcreator-documentation.qdoc +++ b/doc/qtcreatordev/src/qtcreator-documentation.qdoc @@ -345,7 +345,7 @@ You can use number icons in screenshots to highlight parts of the screenshot (instead of using red arrows or borders, or something similar). You can then refer to the numbers in text. For and example, see the - \l{http://doc.qt.io/qt-5/topics-app-development.html}{Development Tools} + \l{https://doc.qt.io/qt/topics-app-development.html}{Development Tools} topic in the Qt reference documentation. This improves the consistency of the look and feel of Qt documentation, From e7e0fa574553b1d926a321c449a21718db3c52eb Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 4 Dec 2020 16:32:16 +0100 Subject: [PATCH 59/60] Debugger: Remove create{Container,List,Vector}Item Not used anymore. Change-Id: I1d534a094717cfc44aea73e6b4ca948c088480ae Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 9556f5a0cc5..c651ac106a4 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -3938,27 +3938,6 @@ class DumperBase(): val.ldata = proxy_data return val - def createContainerItem(self, data, innerTypish, container): - innerType = self.createType(innerTypish) - name = self.qtNamespace() + '%s<%s>' % (container, innerType.name) - typeId = name - tdata = self.TypeData(self) - tdata.typeId = typeId - tdata.name = name - tdata.templateArguments = [innerType] - tdata.lbitsize = 8 * self.ptrSize() - self.registerType(typeId, tdata) - val = self.Value(self) - val.ldata = data - val.type = self.Type(self, typeId) - return val - - def createListItem(self, data, innerTypish): - return self.createContainerItem(data, innerTypish, 'QList') - - def createVectorItem(self, data, innerTypish): - return self.createContainerItem(data, innerTypish, 'QVector') - class StructBuilder(): def __init__(self, dumper): self.dumper = dumper From 8d6ca33a7af5d69883e52a0e785d6d238de67a0a Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 10 Dec 2020 11:47:13 +0100 Subject: [PATCH 60/60] Debugger: Remove more dead code in dumpers Change-Id: If0a48377470b75a2d9c5d7f3cb47a492b9214791 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index c651ac106a4..f3a6f0b16cc 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1743,11 +1743,6 @@ class DumperBase(): data = array + begin * stepSize return data, size - def vectorChildrenGenerator(self, value, innerType): - data, size = self.vectorData(value) - for i in range(size): - yield self.createValue(data + i * innerType.size(), innerType) - def putTypedPointer(self, name, addr, typeName): """ Prints a typed pointer, expandable if the type can be resolved, and without children otherwise """