From 857ffe457c5c6411a3eb91c89ab4dd9f571f0b89 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 2 Mar 2021 17:37:36 +0100 Subject: [PATCH 01/21] Doc: Restructure information about Timeline view - Add a new topic that describes the view, toolbar buttons, keyframe track icons, and context menu commands - Add a link to a video about using the Timeline view - Move Curve Editor info to a separate topic - Move Easing Curve Editor info to a separate topic - Update information about specifying Timeline Settings - Update terminology to use "component" instead of "item" or "type" Task-number: QDS-3771 Change-Id: I768aa171a6de962b65b1bdc7842cdd8d004b1e69 Reviewed-by: Knud Dollereder Reviewed-by: Thomas Hartmann --- .../images/extraimages/images/V3Po15bNErw.jpg | Bin 0 -> 10017 bytes .../qtcreator-extraimages.qdocconf | 3 +- .../qtdesignstudio-extraimages.qdocconf | 3 +- .../images/icons/easing-curve-linear-icon.png | Bin 0 -> 320 bytes .../images/icons/easing-curve-spline-icon.png | Bin 0 -> 551 bytes .../images/icons/easing-curve-step-icon.png | Bin 0 -> 243 bytes doc/qtcreator/images/icons/lockoff.png | Bin 0 -> 545 bytes doc/qtcreator/images/icons/pin.png | Bin 0 -> 563 bytes doc/qtcreator/images/studio-curve-editor.png | Bin 17781 -> 20623 bytes doc/qtcreator/images/studio-edit-keyframe.png | Bin 2831 -> 3634 bytes .../images/studio-timeline-empty.png | Bin 0 -> 3423 bytes .../studio-timeline-keyframe-track-colors.png | Bin 0 -> 13930 bytes .../images/studio-timeline-no-tracks.png | Bin 0 -> 8096 bytes .../images/studio-timeline-settings.png | Bin 34266 -> 18237 bytes .../studio-timeline-with-empty-tracks.png | Bin 0 -> 9657 bytes .../images/studio-timeline-with-tracks.png | Bin 0 -> 13697 bytes doc/qtcreator/images/studio-timeline.png | Bin 13712 -> 14055 bytes .../src/howto/creator-workspaces.qdoc | 2 +- doc/qtcreator/src/qtcreator-toc.qdoc | 5 + .../qtquick/qtquick-connection-editor.qdoc | 2 +- .../src/qtquick/qtquick-curve-editor.qdoc | 125 ++++++++ .../src/qtquick/qtquick-designer.qdoc | 7 +- .../qtquick/qtquick-easing-curve-editor.qdoc | 106 +++++++ .../src/qtquick/qtquick-timeline-view.qdoc | 281 ++++++++++++++++++ .../src/qtquick/qtquick-timeline.qdoc | 279 ++++++----------- .../src/qtdesignstudio-toc.qdoc | 5 + 26 files changed, 630 insertions(+), 188 deletions(-) create mode 100644 doc/qtcreator/images/extraimages/images/V3Po15bNErw.jpg create mode 100644 doc/qtcreator/images/icons/easing-curve-linear-icon.png create mode 100644 doc/qtcreator/images/icons/easing-curve-spline-icon.png create mode 100644 doc/qtcreator/images/icons/easing-curve-step-icon.png create mode 100644 doc/qtcreator/images/icons/lockoff.png create mode 100644 doc/qtcreator/images/icons/pin.png create mode 100644 doc/qtcreator/images/studio-timeline-empty.png create mode 100644 doc/qtcreator/images/studio-timeline-keyframe-track-colors.png create mode 100644 doc/qtcreator/images/studio-timeline-no-tracks.png create mode 100644 doc/qtcreator/images/studio-timeline-with-empty-tracks.png create mode 100644 doc/qtcreator/images/studio-timeline-with-tracks.png create mode 100644 doc/qtcreator/src/qtquick/qtquick-curve-editor.qdoc create mode 100644 doc/qtcreator/src/qtquick/qtquick-easing-curve-editor.qdoc create mode 100644 doc/qtcreator/src/qtquick/qtquick-timeline-view.qdoc diff --git a/doc/qtcreator/images/extraimages/images/V3Po15bNErw.jpg b/doc/qtcreator/images/extraimages/images/V3Po15bNErw.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3f27ff426e689dcb533e1b0f2a92483b098bc42 GIT binary patch literal 10017 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/extraimages/qtcreator-extraimages.qdocconf b/doc/qtcreator/images/extraimages/qtcreator-extraimages.qdocconf index b689825fc30..5eacc4d3118 100644 --- a/doc/qtcreator/images/extraimages/qtcreator-extraimages.qdocconf +++ b/doc/qtcreator/images/extraimages/qtcreator-extraimages.qdocconf @@ -6,4 +6,5 @@ images/Ed8WS03C-Vk.jpg \ images/UfvA04CIXv0.jpg \ images/FzmLuRHQXaw.jpg \ - images/pEETxSxYazg.jpg + images/pEETxSxYazg.jpg \ + images/V3Po15bNErw.jpg diff --git a/doc/qtcreator/images/extraimages/qtdesignstudio-extraimages.qdocconf b/doc/qtcreator/images/extraimages/qtdesignstudio-extraimages.qdocconf index a09c5566a21..c0f64117d24 100644 --- a/doc/qtcreator/images/extraimages/qtdesignstudio-extraimages.qdocconf +++ b/doc/qtcreator/images/extraimages/qtdesignstudio-extraimages.qdocconf @@ -11,4 +11,5 @@ images/UfvA04CIXv0.jpg \ images/FzmLuRHQXaw.jpg \ images/w1yhDl93YI0.jpg \ - images/pEETxSxYazg.jpg + images/pEETxSxYazg.jpg \ + images/V3Po15bNErw.jpg diff --git a/doc/qtcreator/images/icons/easing-curve-linear-icon.png b/doc/qtcreator/images/icons/easing-curve-linear-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1e97dccc7ede08a6982e5bdce09b3e292b4cf041 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7I14-?iy0XBj({-ZRBb+K z1_lQ95>H=O_NUCu0s^c*k8NONU|_iK>Eak-(YtiAV^*_+NZbC2T?^t4cz1Yb-m_h_ z(Olq8mE=L+!zoW0ZJH*`Iof+^$A-IGra7(Rn|Zal^1k_d`3fzLCjWUB`f6tbMJCSm z(^z^Ts(A0+4L&THlO9yct$RIbnP$Vx1KZv%o%j5vkAl)3Ilh`Z@4wWZ|NWEa%^zmL zh3m3UZCa8!%f5WJ@S20On{*|@lsY&+=~ zWb?>^uTbWFoA|-#X%BzfF~nYf+cuqJ+Sl1BvzFccpmZV1xKH`8!2*48<;JSAx%(N; Y?+kXy@6<41U|?YIboFyt=akR{0Dtv^ng9R* literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/icons/easing-curve-spline-icon.png b/doc/qtcreator/images/icons/easing-curve-spline-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4bc695fc9d86fc04dceaaaacac2fee667aa4d2 GIT binary patch literal 551 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7I14-?iy0XBj({-ZRBb+K z1_lQ95>H=O_NUCu0>XkP49)j5FfbnTba4!^=v_K#f7dGqkz@N=6z>@ZzA3w)tGlju z*LTi0Z&fvObZc1Uo!+?Y$X+G89y?d)vl=J(&9 zW1Mbs&hnx3w4Wt)d-ojJmaF2)biMTB_rHJrV%A@MV8K@s+b+OVfA8LcdNJAKjLAI9 zG7oKg+rItgHr~r72PJ}~SWl#F_BtU^&EYZ0<)=#tbH=Q;`B$|bS-45Gt+@VrMcC?c zhH#EK=hHK0wcX75rhn3Mx!YpLeeZ);hA5r08DunK#`@#t};HT+N(4_{J@{?MbJ(NPd^WGm`Q6c(8zWo3DT4bTt?Sr@c2VfWot5s&8t?+tU_e*5Ull0)yWhgZy7&a(I-N1@E)8mq>RfV#S4 zSz8a4SnVx+V8PeH(Uy4N=lZ90`}^f@>gb$yvYYR&p(@txTE!B3J-<`mj^Rz2wTEV? z3=88S10UuVfsRESL0%k+K@3VwuXn9lSNGt$`2q7c%xA8i&H=O_NUCu0)moX?%d^PU|^W!>Eak-(ffAtMqXw`9@qVgLvkEm3+iotq7t_2 z&BJK*?G5D)?|f&e_%=8%I{R8D=kq=mkz}124{llQ(B%&DDk$&Zn0Gwz?c!OCf)6+5 zawsw|oZ+`eV=D=NS u$|bxZrFjQA{&T!Pe zk04(LhAK4%hK3dfhF=T}3=Jgk>&)U zzm0XmXSdz+MWME{VYiOuzWDsI# zU}b1vWniRjU|?lnu+Tbb3yOx^{FKbJO57SQq}}3RU|>iF*-%`TZk3#$o12bP0l+XkK$XCAj literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/icons/pin.png b/doc/qtcreator/images/icons/pin.png new file mode 100644 index 0000000000000000000000000000000000000000..ac65f66815e690a433b2a66c2028d7e70269e32f GIT binary patch literal 563 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd5W$eeQS*<1fq^C6(btiIVPik{pF~y$1_p&> zk04(LhAK4%hK3dfhF=T}3=J#Kd@mSnw(dkZq%W~PHyxl)0EPej;e{Aog6WP}GNA#w(c%Bz*?l>g+MYlO( zhl}K*2eXyCntC@2=tZqMd*Hx<5BB_?2Q5`QzU-Cjc#yd6^(KSKlK=kKCmlX;;J^X- zUqz4Vbs8T2uirPDho|bd-O_*m`<)$ktebzt|J#2H1_nh|sWQR$l|L957*tDKBT7;d zOH!?pi&7IyQW=a4j0|)Q4RwtSLJSS83=OOdjI<35tPBhmS|@Em(U6;;l9^VCTf>F4 zTO14w49OrHip$cilJj$OQ}ap~6x>tuQi~Ex@{6n#98>a>QWZRNa!QL!z(NW}CVIwt z209ACVeSg96$SZ4B?`R!D+Mz>0|N!8(#)I`1p`e5g(QP} Rehdr@44$rjF6*2UngHDb&K>{& literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/studio-curve-editor.png b/doc/qtcreator/images/studio-curve-editor.png index ee44e74cc0a41dd32b8c8fca6243c715e6bc7004..01cd7f5ab4f8bbe47f47dfde94307ecbc290a7ed 100644 GIT binary patch literal 20623 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 W{<(*IBp&F1Z1HsUb6Mw<&;$S`&`Nm# literal 17781 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 P`}sXx{an^LB{Ts5J5$#8 diff --git a/doc/qtcreator/images/studio-edit-keyframe.png b/doc/qtcreator/images/studio-edit-keyframe.png index 446187d1414f6b200eee52b104af096e5f48d3c3..f2bcc891a58f80152a3d8e20eba41e6c39ed7e2b 100644 GIT binary patch literal 3634 zcmeAS@N?(olHy`uVBq!ia0y~yV7SJ>z_5jbiGhJ3eXpwq0|W0*PZ!6Kid%2z{?3;P z7d_s-s+D8OqAq!l2kqM?atQ9fV3Paj$KQL?->Sszm$kpX{%f{ufb(S=udCPcIy2{r zGij~jYPYBpImo}!qHwEx1 z{n-&%%;Fy#z5SfLz?tYmnexxid~0n(FRl7=yYCZ+U*D{?_ex8$+&>#X56`bFc)owp z(fj|?zZPHbF#F}1x~lU1x99tR-*&(M^Phf?K#c686yCM3u8WCP5ZIOpw&iXZ9Ei7_QQQM2Vyn-F9{{$1tEKKUR`$h~d(zDzFNPwrgY9Bsx5JN_IC`m*+S?c(oj z^EEAu|6j9zR}ml4v+wuG%cnn9->RRoP5GV|%TMiDcSBE3y0Ml$pmO6lp7W1MH z*DOV%p8Go(oav2l{;>M#@fCaOf9%|D|7-gD)~CYzyZ-&%d_KRX;(7b&k8=-C-{cVR zY7W=)XG^vw8N2!~;o7&M%x}B;&dH0fz0y9G9~iOX)s-Ks7A{PQn$*9<$9wfjS+(-z zF9kx|Hy_*o@kFxT+}YcE1g^hY&vT#uf7#W&qqXv*aUtvVX-73MCl((g%H-M_b4Kt@bJW@Fz1^G`C0KO(;K zuc(RlosnHtc7O8vzh58MSI0+en!*}fd$CQi^4ayYP}>(_y`O_u`gUzOcp-3a`pH#bg5TF#Gg$d9_CH#*@>T3) z=huGyx9hPr`|~w-3!YpMRM!?gFW+Mo_D||Ug}$!OsYQEs`*28oe=L@F!Zi70&btoL z!(5M@Ul(Qly0L8kfA4zEoEi=1ABD}r&MyVGWTe-ZoxQYq-PJ1>D*WDWyST$&RODxq zMzzM%r$P6pO1RpaX83=cCFuD0aO(G%fXA(kv(@@pP1~>C^I2KH`%H4SeADbo6W<@X zyiMo#Yfb{55J9N+rB zBT1dFxG%?%v_wws;Kn!>rlht95&G9{uQfY3ta15K80#RAv|LYtW25_r8xiIRBg*

{4YZmLBW(ph|gJ(A+uro1kbl%XMEt?A|aT*kk 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/studio-timeline-keyframe-track-colors.png b/doc/qtcreator/images/studio-timeline-keyframe-track-colors.png new file mode 100644 index 0000000000000000000000000000000000000000..3bea1a7a6b0e532c468384fea514ca13f1204bcb GIT binary patch literal 13930 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 QFKCIOr>mdKI;Vst0MJA{-T(jq literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/studio-timeline-no-tracks.png b/doc/qtcreator/images/studio-timeline-no-tracks.png new file mode 100644 index 0000000000000000000000000000000000000000..85a03a00b0ae95396f673d3fb7031ccbcbaa527d GIT binary patch literal 8096 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 KKbLh*2~7a~ze>pf literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/studio-timeline-settings.png b/doc/qtcreator/images/studio-timeline-settings.png index eefbc561cd954e8d09be89a692b7ad297631bc30..cd6ed4c8a8b1d43148079dd0068d783917fdd4cb 100644 GIT binary patch literal 18237 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 literal 34266 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%0DLoxUjS|IO=s*lhK> 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 P0V(%%^>bP0l+XkKM^>*% diff --git a/doc/qtcreator/images/studio-timeline-with-empty-tracks.png b/doc/qtcreator/images/studio-timeline-with-empty-tracks.png new file mode 100644 index 0000000000000000000000000000000000000000..d116d43e366ee452849c0f7062b0913e4ae7423f GIT binary patch literal 9657 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 Gp$Pzpt2I>s literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/studio-timeline.png b/doc/qtcreator/images/studio-timeline.png index 49557eeaaed8102c0c8c46a5de997d903e7ff47d..18e85ca5c183533f619148024e029000e8e26419 100644 GIT binary patch literal 14055 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 \uicontrol Views > + \uicontrol {Curve Editor} to open the animation curve editor. + \li Right-click in \uicontrol {Curve Editor}, and select + \uicontrol {Insert Keyframe} to add a keyframe. + \li Select keyframes to display the easing curves attached to them. + To select multiple keyframes, press and hold \key Ctrl. + \endlist + + Your changes are automatically saved when you close the view. + + \section1 Deleting Keyframes in Curve Editor + + To delete the selected keyframe, select \uicontrol {Delete All Keyframes} + in the context menu. +*/ diff --git a/doc/qtcreator/src/qtquick/qtquick-designer.qdoc b/doc/qtcreator/src/qtquick/qtquick-designer.qdoc index 43966d926c9..cab0701dfd5 100644 --- a/doc/qtcreator/src/qtquick/qtquick-designer.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-designer.qdoc @@ -106,16 +106,15 @@ the changes between states. \li \l{Animating Transitions Between States} \row - \li \l{Creating Animations}{Timeline} + \li \l Timeline \li Provides a timeline and keyframe based editor for animating the properties of components. \li \l{Creating Animations} \row - \li \l{Editing Animation Curves}{Curve Editor} + \li \l{Curve Editor} \li 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. + handlers to modify the curve. \li \l {Editing Animation Curves} \row \li \l{Working in Edit Mode}{Text Editor} diff --git a/doc/qtcreator/src/qtquick/qtquick-easing-curve-editor.qdoc b/doc/qtcreator/src/qtquick/qtquick-easing-curve-editor.qdoc new file mode 100644 index 00000000000..04e03ac5a0b --- /dev/null +++ b/doc/qtcreator/src/qtquick/qtquick-easing-curve-editor.qdoc @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Creator 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 qtquick-editing-easing-curves.html + \previouspage studio-timeline.html + \nextpage qmldesigner-connections.html + + \title Editing Easing Curves + + You can use \uicontrol {Easing Curve Editor} to edit the easing curve + between two keyframes. + + \image studio-easing-curve-editor.png "Easing Curve Editor" + + You can use the preset curves or modify them by dragging the curve handles + around. You can add points to the curve and drag them and the point handles + to modify the curve. When you are happy with the curve, you can save it as + a custom curve. For more information about easing curve types, see the + technical documentation for \l [QML] {PropertyAnimation}{easing curves}. + + To zoom into and out of the easing curve editor, use the mouse + roller. To reset the zoom factor, right-click in the picker and + select \uicontrol {Reset Zoom}. + + You can also use the more advanced \l {Curve Editor} that + shows the interpolated values of an animated property over + the \l{Creating Animations}{animation} range. + + The animation curves present a more readable view of the animation by + showing the effective values of the animated properties over the animation + range. In order to do so, they need to be converted to and from easing + curves. This comes with the following side effects: + + \list + \li Interpolation between identical current and previous keyframe values + is meaningless regardless of what the easing curve looks like. + \li Some easing curves are not trivially mappable to animation curves + and are therefore painted in a different color and without handles. + \endlist + + \section1 Attaching Easing Curves to Keyframes + + To attach easing curves to keyframes: + + \list 1 + \li Right-click a keyframe in \l Timeline and select + \uicontrol {Easing Curve Editor} in the context menu. + \li Select an easing curve in the \uicontrol Presets tab. + \li In the \uicontrol {Duration (ms)} field, select the + duration of the easing function in milliseconds. + \li Select \uicontrol Preview to preview the curve. + \li Select \uicontrol OK to attach the easing curve to the + keyframe, close \uicontrol {Easing Curve Editor}, and + return to \l Timeline. + \endlist + + When you attach easing curves to keyframes, the shape of the + \l{keyframe_marker}{keyframe marker} on a keyframe track in + \l Timeline changes from \inlineimage keyframe_linear_inactive.png + to a marker that describes the type of the selected easing curve. + + \section1 Customizing Easing Curves + + To customize easing curves: + + \list 1 + \li In \uicontrol {Easing Curve Editor}, select an easing curve in + the \uicontrol Presets tab. + \li Drag the curve handles to modify the curve. + \li Right-click in the editor, and select \uicontrol {Add Point} to add + points to the curve. + \li Drag the points or the point handles to modify the curve. If the + curve becomes invalid, it turns red in the editor and the + \uicontrol Save button is disabled. + \li Select \uicontrol Save to save your changes to the curve. + \li In the \uicontrol Name field, enter a name for the custom curve, + and then select \uicontrol OK to save the curve in the + \uicontrol Custom tab. + \endlist + + To paste easing curve definitions to \uicontrol {Easing Curve Editor} as + text, select the \uicontrol Text tab. +*/ diff --git a/doc/qtcreator/src/qtquick/qtquick-timeline-view.qdoc b/doc/qtcreator/src/qtquick/qtquick-timeline-view.qdoc new file mode 100644 index 00000000000..a9fd2855058 --- /dev/null +++ b/doc/qtcreator/src/qtquick/qtquick-timeline-view.qdoc @@ -0,0 +1,281 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Creator 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 qtquick-timeline-view.html + \previouspage qtquick-transition-editor.html + \nextpage qtquick-curve-editor.html + + \title Timeline + + You can use the timeline and keyframe based editor in the + \uicontrol Timeline view to animate the properties of + \l{glossary_component}{components}. The view is empty until + you create a timeline. + + \image studio-timeline-empty.png "Empty Timeline view" + + Select the \inlineimage plus.png + (\uicontrol {Add Timeline (A)}) button, or press \key {A} to + \l{Creating Timelines}{create a timeline} and specify settings + for it in the \uicontrol {Timeline Settings} dialog. + + \image studio-timeline-settings.png "Timeline Settings dialog" + + When you select \uicontrol Close, the \uicontrol Timeline view appears. + It now displays a \l{Timeline Toolbar}{toolbar} and a ruler but no + keyframe tracks. + + \image studio-timeline-no-tracks.png "Timeline view without keyframe tracks" + + To animate component properties in the \uicontrol Timeline view, you + must \l{Setting Keyframe Values}{insert keyframes} for them. In the + \l Properties view, select \uicontrol Settings > + \uicontrol {Insert Keyframe} for a property that you want to animate. + A keyframe track is generated for each component that you insert keyframes + for. + + \image studio-timeline-with-empty-tracks.png "Timeline view with a property" + + You can now select \inlineimage local_record_keyframes.png + to \l{Setting Keyframe Values}{record changes} in component properties + while you \l{Navigating in Timeline}{navigate the timeline}. + + The following video shows how to insert keyframes for component properties + and to animate them in \uicontrol Timeline: + + \youtube V3Po15bNErw + + \if defined(qtdesignstudio) + To try it yourself, follow the \l{Log In UI - Part 4} tutorial. + \endif + + + For more information about creating timeline animations, see + \l{Creating Animations}. + + \section1 Navigating in Timeline + + \image studio-timeline.png "Timeline view" + + You can navigate the timeline in the following ways: + + \list + \li Drag the playhead (1) to a frame. + \li Click on the ruler (2) to move to a frame. + \li Select the \uicontrol {To Start (Home)}, \uicontrol {Previous (,)}, + \uicontrol {Next (.)}, or \uicontrol {To End (End)} buttons (3), or + use the keyboard shortcuts to move to the first, previous, next, or + last frame on the timeline. + \li Enter the number of a frame in the current keyframe field (4) to + move to that frame. + \li Select the \uicontrol Previous and \uicontrol Next buttons next to + a property name on the timeline (5) to move to the previous or next + keyframe for that property. + \endlist + + \section1 Zooming in Timeline + + Use the slider on the toolbar to set the zooming level in the + \uicontrol Timeline view. Select the \inlineimage zoom_small.png + and \inlineimage zoom_big.png + buttons to zoom out of or into the view. + + \section1 Setting Keyframe Track Color + + To change the color of a keyframe track, select \uicontrol {Override Color} + in the context menu, and then select a color in the \l{Picking Colors} + {color picker}. To reset the color, select \uicontrol {Reset Color}. + + \image studio-timeline-keyframe-track-colors.png "Keyframe track colors in Timeline" + + \section1 Timeline Toolbar + + The \uicontrol Timeline toolbar contains the following buttons and fields. + + \table + \header + \li Button/Field + \li Action + \li Read More + \row + \li \inlineimage animation.png + \li Opens the \uicontrol {Timeline Settings} dialog for editing + timeline settings. + \li \l{Creating Timelines} + \row + \li Timeline ID + \li Displays the ID of the current timeline. + \li \l{Creating Timelines} + \row + \li \inlineimage to_first_frame.png + \li \uicontrol {To Start (Home)} moves to the first frame on the + timeline. + \li \l{Navigating in Timeline} + \row + \li \inlineimage back_one_frame.png + \li \uicontrol {Previous (,)} moves to the previous frame on the + timeline. + \li \l{Navigating in Timeline} + \row + \li \inlineimage start_playback.png + \li \uicontrol {Play (Space)} previews the animation. + \li \l{Viewing the Animation} + \row + \li \inlineimage forward_one_frame.png + \li \uicontrol {Next (.)} moves to the next frame on the timeline. + \li \l{Navigating in Timeline} + \row + \li \inlineimage to_last_frame.png + \li \uicontrol {To End (End)} moves to the last frame on the timeline. + \li \l{Navigating in Timeline} + \row + \li Current Keyframe + \li Displays the frame that the playhead is currently on. Enter a + number in the field to move the playhead to the respective frame. + \li \l{Navigating in Timeline} + \row + \li \inlineimage global_record_keyframes.png + \li Records changes in keyframe values. + \li \l {Setting Keyframe Values} + \row + \li \inlineimage curve_editor.png + \li Opens \uicontrol {Easing Curve Editor} for attaching an easing + curve to the selected transition. + \li \l{Editing Easing Curves} + \row + \li Start Frame + \li Specifies the first frame of the timeline. Negative values are + allowed. The difference between the start frame and the end frame + determines the duration of the animation. + \li \l{Creating Timelines} + \row + \li \inlineimage zoom_small.png + \li \uicontrol {Zoom Out} (\key Ctrl+-) zooms out of the view. + \li \l{Zooming in Timeline} + \row + \li Slider + \li Sets the zooming level. + \li \l{Zooming in Timeline} + \row + \li \inlineimage zoom_big.png + \li \uicontrol {Zoom In} (\key Ctrl++) zooms into the view. + \li \l{Zooming in Timeline} + \row + \li End Frame + \li Specifies the last frame of the timeline. The difference between + the start frame and the end frame determines the duration of the + animation, so if the start frame is 0, the end frame equals the + duration. + \li \l{Creating Timelines} + \row + \li State Name + \li Displays the name of the current state. + \li \l{Binding Animations to States} + \endtable + + \section1 Keyframe Track Icons + + Each keyframe track can contain the following buttons and markers. + + \table + \header + \li Button/Icon + \li Action + \li Read More + \row + \li \inlineimage previous_keyframe.png + \li Jumps to the previous frame on the timeline. + \li \l{Setting Keyframe Values} + \row + \li \inlineimage next_keyframe.png + \li Jumps to the next frame on the timeline. + \li \l{Setting Keyframe Values} + \row + \li \inlineimage local_record_keyframes.png + \li Records changes in keyframe values for a particular property. + \li \l {Setting Keyframe Values} + \target keyframe_marker + \row + \li \inlineimage keyframe.png + \li Indicates the type of easing curve attached to the keyframe. + When a keyframe track is selected, the keyframe markers on it turn + gray, and when a keyframe itself is selected, its marker turns + brown: + \list + \li \inlineimage keyframe_linear_inactive.png + - linear easing curve + \li \inlineimage keyframe_manualbezier_inactive.png + - manually set Bezier curve + \li \inlineimage keyframe_autobezier_inactive.png + - automatically set Bezier curve + \li \inlineimage keyframe_lineartobezier_inactive.png + - linear-to-Bezier curve + \endlist + \li \l {Editing Easing Curves} + \endtable + + \section1 Timeline Context Menu + + The following table summarizes the context menu items available for each + keyframe track for a component, property, or keyframe marker and provides + links to more information about them. + + \table + \header + \li To Learn About + \li Go To + \row + \li Delete All Keyframes + \li \l{Deleting Keyframes} + \row + \li Add Keyframes at Current Frame + \li \l{Setting Keyframe Values} + \row + \li Copy All Keyframes + \li \l{Copying Keyframes} + \row + \li Paste Keyframes + \li \l{Copying Keyframes} + \row + \li Remove Property + \li \l{Setting Keyframe Values} + \row + \li Delete Keyframe + \li \l{Deleting Keyframes} + \row + \li Edit Easing Curve + \li \l{Editing Easing Curves} + \row + \li Edit Keyframe + \li \l{Editing Keyframe Values} + \row + \li Override Color + \li \l{Setting Keyframe Track Color} + \row + \li Reset Color + \li \l{Setting Keyframe Track Color} + \endtable +*/ diff --git a/doc/qtcreator/src/qtquick/qtquick-timeline.qdoc b/doc/qtcreator/src/qtquick/qtquick-timeline.qdoc index dca62b7fc98..418a68cad63 100644 --- a/doc/qtcreator/src/qtquick/qtquick-timeline.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-timeline.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -30,21 +30,39 @@ \title Creating Animations - You can use the timeline and keyframe based editor in the - \uicontrol Timeline view to animate the properties of UI components. + Animation is based on \e keyframes. In \QC, keyframes determine the value + of the property of a \l{glossary_component}{component} at a certain time. Animating properties enables their values to move through intermediate - values instead of immediately changing to the target value. For example, - to move an item in a scene, you can animate the properties that control - the item's position, x and y, so that the item's position changes at - keyframes on the way to the target position. Similarly, you could change - the color and scale properties of the item at keyframes to make it appear - to move closer or farther away. + values instead of immediately changing to the target value. - Qt Quick allows you to declare various UI states in \l State objects. - These states are comprised of property changes from a base state, and - can be a useful way of organizing your UI logic. Transitions are objects - you can associate with an item to define how its properties will animate - when they change due to a state change. + For example, you can set the y position property of a rectangle to 0 at the + start of your animation and to 100 at the end of the animation. When the + animation is run, the rectangle moves from position 0 to 100 on the y axis. + In the middle of the animation, the y property has the value of 50 since + keyframes are interpolated linearly by default. + + Sometimes you don't want linear movement but would rather like the rectangle + to move faster at the beginning and slower at the end of the animation. + To achieve this effect, you could insert a lot keyframes between the start + frame and the end frame. To avoid this effort, you can use the + \l{Editing Easing Curves}{Easing Curve Editor} to specify \e {easing curves} + for nonlinear interpolation between keyframes. The easing curves can make + components appear to pick up speed, slow down, or bounce back at the end of + the animation. + + While easing curves work well for most simple UI animations, more complex + 3D animations require several keyframes so it becomes necessary to visualize + the value and the interpolation of a keyframe simultaneously. The + \l {Curve Editor} visualizes the whole animation of a property at once and + shows the effective values of a keyframe together with the interpolation + between keyframes. It can also show animations of different properties + simultaneously so that you can see the animation for the x position + side-by-side with the animation of the y position. + + You can declare various UI states as \l{Adding States}{states}, which + are specified as changes from a base state and can be a useful way of + organizing your UI logic. You can \l{Binding Animations to States} + {bind animations to states} to run an animation when a state is applied. Each component in a scene or a project can have its own timeline and its own set of states. We recommend that you place your timelines inside the @@ -55,9 +73,10 @@ timelines to your components will increase the file size and runtime memory requirements of your UI. - You can find a video tutorial about creating timelines and adding keyframes - \l{https://resources.qt.io/development-topic-ui-design/qtdesignstudio-clustertutorial-parttwo} - {here}. + The following video shows how to animate component properties using the + timeline and keyframe based editor in the \l Timeline view: + + \youtube V3Po15bNErw \if defined(qtcreator) To be able to create timelines, you also need the \l {Qt Quick Timeline} @@ -76,26 +95,28 @@ To create a timeline to animate a UI component: \list 1 - \li In the \uicontrol Navigator, select the item to animate. - \li In the \uicontrol Timeline view, select the \inlineimage plus.png + \li In the \l Timeline view, select the \inlineimage plus.png (\uicontrol {Add Timeline (A)}) button, or press \key {A} to specify settings for the timeline and running the animation in the \uicontrol {Timeline Settings} dialog. - \li In the \uicontrol {Timeline ID} field, enter a name that describes - the animated item. - \li In the \uicontrol {End frame} field, set the duration of the - animation. + \li In the \uicontrol {Timeline ID} field, enter an ID that describes + the animated component. + \li In the \uicontrol {Start frame} field, set the first frame of the + timeline. Negative values are allowed. + \li In the \uicontrol {End frame} field, set the last frame of the + timeline. \li To use bindings to specify the properties, select the \uicontrol {Expression binding} radio button and enter the binding in the \uicontrol {Expression binding} field. For more information about property binding, see \l{Setting Bindings}. \li To create a timeline animation, select the \uicontrol Animation radio button. - \li In the \uicontrol timelineAnimation tab, \uicontrol {Animation ID} - field, enter a name for the animation. - \li Select the \uicontrol {Running in Base State} check box to use the - settings in this tab when previewing the UI. Deselect the check box - to use the default settings. + \li In the \uicontrol {Animation ID} field, enter an ID for the + animation. + \li Select the \uicontrol {Running in Base State} check box to run the + animation when the base state is applied. Deselect the check box + if you want to run the animation when some other state is applied. + For more information, see \l{Binding Animations to States}. \li In the \uicontrol {Start frame} field, set the first frame of the animation. \li In the \uicontrol {End frame} field, set the last frame of the @@ -111,25 +132,26 @@ means that you must restart the animation to see it again \li Select the \uicontrol {Ping pong} check box to play the animation backwards back to the beginning when it reaches the end. - \li In the \uicontrol {Transitions to states} field, select the state - to switch to when the animation finishes. + \li In the \uicontrol Finished field, select the state + to apply when the animation finishes. \li Select \uicontrol Close to close the dialog and save the settings. \endlist To create additional timelines, select the \inlineimage plus.png - (\uicontrol {Add Timeline}) button next to the \uicontrol timeline tab. + (\uicontrol {Add Timeline}) button next to the + \uicontrol {Timeline Settings} tab. - To specify settings for running the timeline animations, select the + To specify settings for running timeline animations, select the \inlineimage plus.png (\uicontrol {Add Animation}) button next to the - \uicontrol {Animation Settings} group. For example, you could create + \uicontrol {Animation Settings} tab. For example, you could create settings for running a part of the timeline animation between specified frames or for running the animation backwards from the last frame to the first. To modify the settings, select the \inlineimage animation.png - (\uicontrol {Timeline Settings (S)}) button on the toolbar - (or press \key S) in the \uicontrol Timeline view. + (\uicontrol {Timeline Settings (S)}) button on the \l{Timeline Toolbar} + {toolbar} (or press \key S) in the \l Timeline view. \section2 Binding Animations to States @@ -141,38 +163,21 @@ \section1 Managing Keyframes - To animate components in the \uicontrol Timeline view, move to a frame + To animate components in the \l Timeline view, move to a frame on the timeline and specify changes in the values of a property. \QC - automatically adds keyframes between two keyframes, and sets their values + automatically adds keyframes between two keyframes and sets their values evenly to create an appearance of movement or transformation. - \section2 Navigating the Timeline - - \image studio-timeline.png "Timeline view" - - You can navigate the timeline in the following ways: - - \list - \li Drag the playhead (1) to a frame. - \li Click on the ruler (2) to move to a frame. - \li Select the \uicontrol {To Start (Home)}, \uicontrol {Previous (,)}, - or \uicontrol {Next (.)} buttons (3), or use the keyboard shortcuts - to move to the first, previous, or next frame on the timeline. - \li Enter the number of a frame in the current keyframe field (4) to - move to that frame. - \li Select the \uicontrol Previous and \uicontrol Next buttons next to - a property name on the timeline (5) to move to the previous or next - keyframe for that property. - \endlist + \image studio-timeline-with-tracks.png "Timeline view" \section2 Setting Keyframe Values You can insert keyframes for all the properties of all the components that you want to animate first, and then record the changes in their values by - selecting the \inlineimage recordfill.png + selecting the \inlineimage local_record_keyframes.png (\uicontrol {Per Property Recording}) button for one property at a time. - For example, you can hide and show items by turning their visibility off and - on or by setting their opacity to 0 or 1. + For example, you can hide and show components by turning their visibility + off and on or by setting their opacity to 0 or 1. You can also select the \uicontrol {Auto Key (K)} button (or press \key K) to record changes in property values, but you need to be more careful about @@ -181,17 +186,19 @@ To record the changes of property values: \list 1 - \li In the \uicontrol Navigator, select the item to animate. - \li In the \uicontrol Properties view, select \uicontrol Settings > + \li In the \l Navigator view, select the component to animate. + \li In the \l Properties view, select \uicontrol Settings > \uicontrol {Insert Keyframe} for the property that you want to animate. - \li Select the \uicontrol {Per Property Recording} button to start - recording property changes. + \li In the \l Timeline view, select the + \uicontrol {Per Property Recording} button + to start recording property changes. \li Check that the playhead is in frame 0 and enter the value of the property in the field next to the property name on the timeline. Press \key Enter to save the value. \li Move the playhead to another frame on the timeline and specify - the value at that frame. + the value at that frame. For more information, see + \l{Navigating in Timeline}. \li When you have specified as many values as you need, select \uicontrol {Per Property Recording} again to stop recording. \endlist @@ -199,32 +206,42 @@ To remove all the changes you recorded for a property, right-click the property name on the timeline and select \uicontrol {Remove Property}. - Keyframes are marked on the timeline by using markers of different colors and - shapes, depending on whether they are active or inactive or whether you have - applied easing curves to them, for example. + To add keyframes to the keyframe track of a component at the current + position of the playhead, select \uicontrol {Add Keyframes at Current Frame}. - To edit the value of a keyframe, double-click a keyframe marker or select - \uicontrol {Edit Keyframe} in the context menu. In the \uicontrol Frame - field, you can set the frame and the value: + Keyframes are marked on the timeline by using \l{keyframe_marker}{markers} + of different colors and shapes, depending on whether they are active or + inactive or whether you have applied \l{Editing Easing Curves} + {easing curves} to them. + + \section2 Editing Keyframe Values + + To fine-tune the value of a keyframe, double-click a keyframe marker or + select \uicontrol {Edit Keyframe} in the context menu. + + The \uicontrol {Edit Keyframe} dialog displays the name of the property + you are animating and its current value at the frame specified in the + \uicontrol Frame field. You can change both the keyframe and its value. \image studio-edit-keyframe.png "Edit Keyframe dialog" - You can copy the keyframes from the keyframe track for an item and - paste them to the keyframe track of another item. To copy all - keyframes from one item to another one, select an item, and then - select \uicontrol {Copy All Keyframes} in the context menu. Then - select the other item and select \uicontrol {Paste Keyframes} in - the context menu. + \section2 Copying Keyframes + + You can copy the keyframes from the keyframe track for a component and + paste them to the keyframe track of another component. To copy all + keyframes from one track to another one, first right-click the component ID + and select \uicontrol {Copy All Keyframes} in the context menu. + Then right-click the other component ID, and select + \uicontrol {Paste Keyframes} in the context menu. + + \section2 Deleting Keyframes To delete the selected keyframe, select \uicontrol {Delete Keyframe} in the context menu. - To delete all keyframes from the selected item, select + To delete all keyframes from the selected component, select \uicontrol {Delete All Keyframes} in the context menu. - To add keyframes to the keyframe track of an item at the current position - of the playhead select \uicontrol {Add Keyframes at Current Frame}. - \section1 Viewing the Animation You can view the animation on the canvas by moving the playhead along the @@ -236,109 +253,11 @@ (\uicontrol {Show Live Preview}) button on the canvas toolbar or press \key {Alt+P}. - \section1 Editing Easing Curves - - \e Easing specifies the rate of a property value over time, so that - components can appear to pick up speed, slow down, or bounce back at the - end of the animation. By default, the animations you specify on the - timeline are \e linear, which means that they move from the beginning to - the end at a constant speed. You can use the \uicontrol {Easing Curve Editor} - to edit the easing curve between two keyframes. You can also use the more - advanced \uicontrol {Curve Editor} to edit the curves for the whole - animation. - - \section2 Attaching Easing Curves to Keyframes - - \image studio-easing-curve-editor.png "Easing Curve Editor" - - You can use the preset curves or modify them by dragging the curve handlers - around. You can add points to the curve and drag them and the point handlers - to modify the curve. When you are happy with the curve, you can save it as a - custom curve. For more information about easing curve types, see the - documentation for \l [QML] {PropertyAnimation}{easing curves}. - - To zoom into and out of the easing curve editor, use the mouse roller. To - reset the zoom factor, right-click in the picker and select - \uicontrol {Reset Zoom}. - - To attach easing curves to keyframes: - - \list 1 - \li Right-click a keyframe on the timeline and select - \uicontrol {Easing Curve Editor} in the context menu. - \li Select an easing curve in the \uicontrol Presets tab. - \li In the \uicontrol {Duration (ms)} field, select the duration of the - easing function in milliseconds. - \li Select \uicontrol Preview to preview the curve. - \li Select \uicontrol OK to attach the easing curve to the keyframe - and to close the easing curve editor. - \endlist - - When you attach easing curves to keyframes, the shape of the keyframe - marker changes from \inlineimage keyframe_linear_inactive.png - to \inlineimage keyframe_manualbezier_inactive.png - . - - \section2 Customizing Easing Curves - - To customize easing curves: - - \list 1 - \li In \uicontrol {Easing Curve Editor}, select an easing curve in - the \uicontrol Presets tab. - \li Drag the curve handlers to modify the curve. - \li Right-click in the editor, and select \uicontrol {Add Point} to add - points to the curve. - \li Drag the points or the point handlers to modify the curve. If the - curve becomes invalid, it turns red in the editor and the - \uicontrol Save button is disabled. - \li Select \uicontrol Save to save your changes to the curve. - \li In the \uicontrol Name field, enter a name for the custom curve, - and then select \uicontrol OK to save the curve in the - \uicontrol Custom tab. - \endlist - - To paste easing curve definitions to \uicontrol {Easing Curve Editor} as - text, select the \uicontrol Text tab. - - \section1 Editing Animation Curves - - In \uicontrol {Curve Editor}, you can view and modify the whole animation - curve. You can insert keyframes to the curve and drag them and the point - handlers to modify the curve. You can modify the appearance of the curve - in the style editor. - - You can also edit easing curves that you added in - \uicontrol {Easing Curve Editor}. If the item that - contains the easing curves has been locked in - \uicontrol Navigator, you can select \inlineimage icons/lockon.png - to unlock it. You can also lock individual easing curves for editing. - - \image studio-curve-editor.png "Curve Editor" - - To edit animation curves: - - \list 1 - \li In the \uicontrol Timeline view, insert at least one keyframe. - \li Select \uicontrol View > \uicontrol Views > - \uicontrol {Curve Editor} to open the animation curve editor. - \li Right-click in the animation curve editor, and select - \uicontrol {Insert Keyframe} to add a keyframe. - \li Select keyframes to display the easing curves attached to them. - To select multiple keyframes, press and hold \key Ctrl. - \li To lock an easing curve, hover the mouse over the keyframe in the - list, and then select the lock icon. - \li To pin an easing curve, hover the mouse over the keyframe in the - list, and then select the pin icon. - \endlist - - Your changes are automatically saved when you close the view. - - \section1 Rotating Items + \section1 Animating Rotation To animate components that rotate around a central point, you can use the - \l {basic-item}{Item} QML type as a parent for the rotating component. Then - create a timeline for the Item and set the rotation property for the start + \l {basic-item}{Item} component as a parent for the rotating component. Then + create a timeline for the Item, and set the rotation property for the start and end keyframes. \if defined(qtdesignstudio) diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index 3fad0989341..fd69a3c30bb 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -63,6 +63,8 @@ \li \l{Navigator} \li \l{Properties} \li \l{Transition Editor} + \li \l{Timeline} + \li \l{Curve Editor} \endlist \li \l{Managing Workspaces} \li \l{Managing Sessions} @@ -110,6 +112,9 @@ \li \l {Adding Dynamics} \list \li \l{Creating Animations} + \list + \li \l{Editing Easing Curves} + \endlist \li \l{Adding Connections} \list \li\l{Connecting Objects to Signals} From 6deac5593ca6929138f07a28d81ca0124d8ec23e Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 9 Mar 2021 14:13:37 +0200 Subject: [PATCH 02/21] QmlDesigner: Fix infinite loop on item library resize If item library width goes to somewhere between 50-100 pixels (around the width of a single item), QDS gets stuck in infinite loop. It's unclear what exactly causes this loop, as it seems to be deep inside QtDeclarative, so worked around it by enforcing 100 pixel minimum width for item library. Change-Id: Ib1193cce760098edd0df61177058f134f406101e Reviewed-by: Mahmoud Badri --- .../qmldesigner/components/itemlibrary/itemlibrarywidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 8571f7a7d4b..1fcaadb5634 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -138,6 +138,7 @@ ItemLibraryWidget::ItemLibraryWidget(AsynchronousImageCache &imageCache, ItemLibraryModel::registerQmlTypes(); setWindowTitle(tr("Library", "Title of library view")); + setMinimumWidth(100); // create header widget m_headerWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); From fd763dd60b2467d74e968799884f174ce2419d31 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 9 Mar 2021 11:40:40 +0100 Subject: [PATCH 03/21] QmlDesigner: Return action by id Change-Id: Id1d15acf513786789c4ea4deaa84672f17fd889b Reviewed-by: Michael Winkelmann Reviewed-by: Thomas Hartmann --- .../components/componentcore/designeractionmanager.cpp | 8 ++++++++ .../components/componentcore/designeractionmanager.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index cccc108bbb5..808882220eb 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -1515,6 +1515,14 @@ QList DesignerActionManager::designerActions() const }); } +ActionInterface *DesignerActionManager::actionByMenuId(const QByteArray &id) +{ + for (const auto &action : m_designerActions) + if (action->menuId() == id) + return action.data(); + return nullptr; +} + DesignerActionManager::DesignerActionManager(DesignerActionManagerView *designerActionManagerView) : m_designerActionManagerView(designerActionManagerView) { diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h index bf7ab60017f..36253fc4453 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h @@ -110,6 +110,7 @@ public: QList> actionsForTargetView(const ActionInterface::TargetView &target); QList designerActions() const; + ActionInterface *actionByMenuId(const QByteArray &id); void createDefaultDesignerActions(); void createDefaultAddResourceHandler(); From 76be73b1573e9d900be53c4f74ac1b6e0f5e3603 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 5 Mar 2021 15:24:37 +0100 Subject: [PATCH 04/21] QmlDesigner: Trim state name States should never have trailing white spaces. Change-Id: I67dc08e12fa042a237ede3d2d0247e6ea2b55eff Reviewed-by: Aleksei German Reviewed-by: Thomas Hartmann --- .../qmldesigner/components/stateseditor/stateseditorview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index eb4acb358d3..220d2fb5afa 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -298,7 +298,7 @@ void StatesEditorView::renameState(int internalNodeId, const QString &newName) setCurrentState(baseState()); const bool updateDefault = state.isDefault(); - state.setName(newName); + state.setName(newName.trimmed()); if (updateDefault) state.setAsDefault(); From ed3e2fb8a535f98598db8bffd4fd2c4c6fd53828 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 9 Mar 2021 14:53:19 +0100 Subject: [PATCH 05/21] More changelog for 4.15 Change-Id: Ia10c90d6c5ee941087df3deb8cfc1c65b542132a Reviewed-by: Leena Miettinen --- dist/changes-4.15.0.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dist/changes-4.15.0.md b/dist/changes-4.15.0.md index 1ae6ebcdb4a..61d2974b133 100644 --- a/dist/changes-4.15.0.md +++ b/dist/changes-4.15.0.md @@ -44,6 +44,7 @@ Editing * Added type aliases to `C++ Classes, Enums and Functions` locator filter (QTCREATORBUG-5800) * Added parentheses highlighting for ternary operator (QTCREATORBUG-1410) +* Improved type name minimization for `Add definition` (QTCREATORBUG-8030) * Fixed type hierarchy with templates classes and typedefs * Fixed that `-include` compile option was ignored by code model (QTCREATORBUG-20602) @@ -73,12 +74,14 @@ Editing * Added support for inline components (QTCREATORBUG-24766, QTCREATORBUG-24705) * Fixed issues with multiple import paths (QTCREATORBUG-24405) * Fixed reformatting of arrow functions (QTCREATORBUG-25198) +* Fixed reformatting of JavaScript spread operator (QTCREATORBUG-23402) ### Language Client * Added support for new formatting options in LSP 3.15.0 * Added support for versioned diagnostics * Added support for server progress messages +* Improved Java language server support ### Java @@ -89,6 +92,8 @@ Projects -------- * Added `Open Terminal Here` for project nodes (QTCREATORBUG-25107) +* Added option for running application as root user (QTCREATORBUG-2831, + QTCREATORBUG-25330) ### qmake @@ -101,6 +106,11 @@ Projects * Added filesystem node to project tree (QTCREATORBUG-24677) * Added `install/strip` and `package` targets (QTCREATORBUG-22047, QTCREATORBUG-22620) +* Added automatic run of conan install on initial CMake call + (QTCREATORBUG-25362) +* Added batch editing for CMake configuration +* Made it possible to copy CMake variables from configuration + (QTCREATORBUG-24781) * Removed utility targets from CMake target locator filters (QTCREATORBUG-24718) * Fixed that configuration changes were lost when CMake configuration fails (QTCREATORBUG-24593) @@ -136,6 +146,10 @@ Debugging * Added option to copy selected items from stack view (QTCREATORBUG-24701) * Added visualization of hit breakpoint in `Breakpoints` view (QTCREATORBUG-6999) +* Fixed type display for automatically dereferenced pointers + (QTCREATORBUG-20907) +* Fixed that debugging repeatedly stopped with `SIGSTOP` (QTCREATORBUG-25073, + QTCREATORBUG-25082, QTCREATORBUG-25227) ### QML @@ -184,6 +198,7 @@ Platforms ### Remote Linux * Fixed issues with remote process PID parsing (QTCREATORBUG-25306) +* Fixed issues with `rsync` on Windows (QTCREATORBUG-25333) ### MCU From f176a6f530264a71a73cf18b2f4f64c58995a3c7 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 2 Mar 2021 09:50:49 +0100 Subject: [PATCH 06/21] Wizards: Fix error message if project name is empty It showed "The project already exists" instead of "Name is empty". Probably broke with 8d1a592d1637b52e539695afdef7f5564f6d723b Fixes: QTCREATORBUG-25398 Change-Id: I0cbe5753d80bc30c93408886668e39278d99c97f Reviewed-by: Alessandro Portale --- src/libs/utils/projectintropage.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/libs/utils/projectintropage.cpp b/src/libs/utils/projectintropage.cpp index ac172f4078a..e5890ac2edf 100644 --- a/src/libs/utils/projectintropage.cpp +++ b/src/libs/utils/projectintropage.cpp @@ -165,16 +165,15 @@ bool ProjectIntroPage::validate() return false; } - // Name valid? Ignore 'DisplayingPlaceholderText' state. - bool nameValid = false; + // Name valid? switch (d->m_ui.nameLineEdit->state()) { case FancyLineEdit::Invalid: displayStatusMessage(InfoLabel::Error, d->m_ui.nameLineEdit->errorMessage()); return false; case FancyLineEdit::DisplayingPlaceholderText: - break; + displayStatusMessage(InfoLabel::Error, tr("Name is empty.")); + return false; case FancyLineEdit::Valid: - nameValid = true; break; } @@ -183,12 +182,12 @@ bool ProjectIntroPage::validate() + QDir::fromNativeSeparators(d->m_ui.nameLineEdit->text())); if (!projectDirFile.exists()) { // All happy hideStatusLabel(); - return nameValid; + return true; } if (projectDirFile.isDir()) { displayStatusMessage(InfoLabel::Warning, tr("The project already exists.")); - return nameValid; + return true; } // Not a directory, but something else, likely causing directory creation to fail displayStatusMessage(InfoLabel::Error, tr("A file with that name already exists.")); From 9e4e9924ad26c7086d56b92be57f9bcde10c3b0e Mon Sep 17 00:00:00 2001 From: Bernhard Beschow Date: Sun, 28 Feb 2021 15:38:24 +0100 Subject: [PATCH 07/21] ProjectExplorer: Unit-test LinkSpecs of tasks Change-Id: Idc86c8fcb9a915490e4a67beb7a057672096861f Reviewed-by: hjk --- src/plugins/projectexplorer/clangparser.cpp | 47 +++- src/plugins/projectexplorer/gccparser.cpp | 227 ++++++++++++++---- src/plugins/projectexplorer/msvcparser.cpp | 42 +++- .../projectexplorer/outputparser_test.cpp | 6 + 4 files changed, 255 insertions(+), 67 deletions(-) diff --git a/src/plugins/projectexplorer/clangparser.cpp b/src/plugins/projectexplorer/clangparser.cpp index dcf935b2db9..8409d788322 100644 --- a/src/plugins/projectexplorer/clangparser.cpp +++ b/src/plugins/projectexplorer/clangparser.cpp @@ -142,6 +142,25 @@ void ProjectExplorerPlugin::testClangOutputParser_data() QTest::addColumn("tasks"); QTest::addColumn("outputLines"); + auto compileTask = [](Task::TaskType type, + const QString &description, + const Utils::FilePath &file, + int line, + const QVector formats) + { + CompileTask task(type, description, file, line); + task.formats = formats; + return task; + }; + + auto formatRange = [](int start, int length, const QString &anchorHref = QString()) + { + QTextCharFormat format; + format.setAnchorHref(anchorHref); + + return QTextLayout::FormatRange{start, length, format}; + }; + QTest::newRow("pass-through stdout") << QString::fromLatin1("Sometext") << OutputParserTester::STDOUT << QString::fromLatin1("Sometext\n") << QString() @@ -179,7 +198,7 @@ void ProjectExplorerPlugin::testClangOutputParser_data() " ^") << OutputParserTester::STDERR << QString() << QString() - << Tasks{CompileTask( + << Tasks{compileTask( Task::Warning, "unknown attribute 'dllimport' ignored [-Wunknown-attributes]\n" "In file included from ..\\..\\..\\QtSDK1.1\\Desktop\\Qt\\4.7.3\\mingw\\include/QtCore/qnamespace.h:45:\n" @@ -187,7 +206,9 @@ void ProjectExplorerPlugin::testClangOutputParser_data() "class Q_CORE_EXPORT QSysInfo {\n" " ^", FilePath::fromUserInput("..\\..\\..\\QtSDK1.1\\Desktop\\Qt\\4.7.3\\mingw\\include/QtCore/qglobal.h"), - 1425)} + 1425, + QVector() + << formatRange(61, 278))} << QString(); QTest::newRow("note") @@ -197,13 +218,15 @@ void ProjectExplorerPlugin::testClangOutputParser_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Unknown, + << compileTask(Task::Unknown, "instantiated from:\n" "..\\..\\..\\QtSDK1.1\\Desktop\\Qt\\4.7.3\\mingw\\include/QtCore/qglobal.h:1289:27: note: instantiated from:\n" "# define Q_CORE_EXPORT Q_DECL_IMPORT\n" " ^", FilePath::fromUserInput("..\\..\\..\\QtSDK1.1\\Desktop\\Qt\\4.7.3\\mingw\\include/QtCore/qglobal.h"), - 1289)) + 1289, + QVector() + << formatRange(19, 167))) << QString(); QTest::newRow("fatal error") @@ -213,13 +236,17 @@ void ProjectExplorerPlugin::testClangOutputParser_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Error, + << compileTask(Task::Error, "'bits/c++config.h' file not found\n" "/usr/include/c++/4.6/utility:68:10: fatal error: 'bits/c++config.h' file not found\n" "#include \n" " ^", FilePath::fromUserInput("/usr/include/c++/4.6/utility"), - 68)) + 68, + QVector() + << formatRange(34, 0) + << formatRange(34, 28, "olpfile:///usr/include/c++/4.6/utility::68::-1") + << formatRange(62, 93))) << QString(); QTest::newRow("line confusion") @@ -229,13 +256,17 @@ void ProjectExplorerPlugin::testClangOutputParser_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Warning, + << compileTask(Task::Warning, "?: has lower precedence than +; + will be evaluated first [-Wparentheses]\n" "/home/code/src/creator/src/plugins/coreplugin/manhattanstyle.cpp:567:51: warning: ?: has lower precedence than +; + will be evaluated first [-Wparentheses]\n" " int x = option->rect.x() + horizontal ? 2 : 6;\n" " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^", FilePath::fromUserInput("/home/code/src/creator/src/plugins/coreplugin/manhattanstyle.cpp"), - 567)) + 567, + QVector() + << formatRange(74, 0) + << formatRange(74, 64, "olpfile:///home/code/src/creator/src/plugins/coreplugin/manhattanstyle.cpp::567::-1") + << formatRange(138, 202))) << QString(); QTest::newRow("code sign error") diff --git a/src/plugins/projectexplorer/gccparser.cpp b/src/plugins/projectexplorer/gccparser.cpp index 3daf1f56e25..52bbfecd72a 100644 --- a/src/plugins/projectexplorer/gccparser.cpp +++ b/src/plugins/projectexplorer/gccparser.cpp @@ -271,6 +271,25 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() QTest::addColumn("tasks"); QTest::addColumn("outputLines"); + auto compileTask = [](Task::TaskType type, + const QString &description, + const Utils::FilePath &file, + int line, + const QVector formats) + { + CompileTask task(type, description, file, line); + task.formats = formats; + return task; + }; + + auto formatRange = [](int start, int length, const QString &anchorHref = QString()) + { + QTextCharFormat format; + format.setAnchorHref(anchorHref); + + return QTextLayout::FormatRange{start, length, format}; + }; + QTest::newRow("pass-through stdout") << QString::fromLatin1("Sometext") << OutputParserTester::STDOUT << QString::fromLatin1("Sometext\n") << QString() @@ -296,12 +315,18 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Error, + << compileTask(Task::Error, "`sfasdf' undeclared (first use this function)\n" "/temp/test/untitled8/main.cpp: In function `int main(int, char**)':\n" "/temp/test/untitled8/main.cpp:9: error: `sfasdf' undeclared (first use this function)", FilePath::fromUserInput("/temp/test/untitled8/main.cpp"), - 9) + 9, + QVector() + << formatRange(46, 0) + << formatRange(46, 29, "olpfile:///temp/test/untitled8/main.cpp::0::-1") + << formatRange(75, 39) + << formatRange(114, 29, "olpfile:///temp/test/untitled8/main.cpp::9::-1") + << formatRange(143, 56)) << CompileTask(Task::Error, "(Each undeclared identifier is reported only once for each function it appears in.)", FilePath::fromUserInput("/temp/test/untitled8/main.cpp"), @@ -371,12 +396,14 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Error, + << compileTask(Task::Error, "undefined reference to `MainWindow::doSomething()'\n" "main.o: In function `main':\n" "C:\\temp\\test\\untitled8/main.cpp:8: undefined reference to `MainWindow::doSomething()'", FilePath::fromUserInput("C:\\temp\\test\\untitled8/main.cpp"), - 8) + 8, + QVector() + << formatRange(51, 113)) << CompileTask(Task::Error, "collect2: ld returned 1 exit status")) << QString(); @@ -388,11 +415,14 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Error, + << compileTask(Task::Error, "undefined reference to `MainWindow::doSomething()'\n" "main.o: In function `main':\n" "C:\\temp\\test\\untitled8/main.cpp:(.text+0x40): undefined reference to `MainWindow::doSomething()'", - FilePath::fromUserInput("C:\\temp\\test\\untitled8/main.cpp")) + FilePath::fromUserInput("C:\\temp\\test\\untitled8/main.cpp"), + -1, + QVector() + << formatRange(51, 124)) << CompileTask(Task::Error, "collect2: ld returned 1 exit status")) << QString(); @@ -423,12 +453,14 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Warning, + << compileTask(Task::Warning, "unused variable 'index'\n" "../../../../master/src/plugins/debugger/gdb/gdbengine.cpp: In member function 'void Debugger::Internal::GdbEngine::handleBreakInsert2(const Debugger::Internal::GdbResponse&)':\n" "../../../../master/src/plugins/debugger/gdb/gdbengine.cpp:2114: warning: unused variable 'index'", FilePath::fromUserInput("../../../../master/src/plugins/debugger/gdb/gdbengine.cpp"), - 2114) + 2114, + QVector() + << formatRange(24, 272)) << CompileTask(Task::Warning, "unused variable 'handler'", FilePath::fromUserInput("../../../../master/src/plugins/debugger/gdb/gdbengine.cpp"), @@ -442,12 +474,18 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Error, + << compileTask(Task::Error, "expected primary-expression before ':' token\n" "/home/code/src/creator/src/plugins/projectexplorer/gnumakeparser.cpp: In member function 'void ProjectExplorer::ProjectExplorerPlugin::testGnuMakeParserTaskMangling_data()':\n" "/home/code/src/creator/src/plugins/projectexplorer/gnumakeparser.cpp:264: error: expected primary-expression before ':' token", FilePath::fromUserInput("/home/code/src/creator/src/plugins/projectexplorer/gnumakeparser.cpp"), - 264) + 264, + QVector() + << formatRange(45, 0) + << formatRange(45, 68, "olpfile:///home/code/src/creator/src/plugins/projectexplorer/gnumakeparser.cpp::0::-1") + << formatRange(113, 106) + << formatRange(219, 68, "olpfile:///home/code/src/creator/src/plugins/projectexplorer/gnumakeparser.cpp::264::-1") + << formatRange(287, 57)) << CompileTask(Task::Error, "expected ';' before ':' token", FilePath::fromUserInput("/home/code/src/creator/src/plugins/projectexplorer/gnumakeparser.cpp"), @@ -505,12 +543,18 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Warning, + << compileTask(Task::Warning, "suggest explicit braces to avoid ambiguous 'else'\n" "/Qt/4.6.2-Symbian/s60sdk/epoc32/include/stdapis/stlport/stl/_tree.c: In static member function 'static std::_Rb_tree_node_base* std::_Rb_global<_Dummy>::_Rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*&, std::_Rb_tree_node_base*&, std::_Rb_tree_node_base*&)':\n" "/Qt/4.6.2-Symbian/s60sdk/epoc32/include/stdapis/stlport/stl/_tree.c:194: warning: suggest explicit braces to avoid ambiguous 'else'", FilePath::fromUserInput("/Qt/4.6.2-Symbian/s60sdk/epoc32/include/stdapis/stlport/stl/_tree.c"), - 194)) + 194, + QVector() + << formatRange(50, 0) + << formatRange(50, 67, "olpfile:///Qt/4.6.2-Symbian/s60sdk/epoc32/include/stdapis/stlport/stl/_tree.c::0::-1") + << formatRange(117, 216) + << formatRange(333, 67, "olpfile:///Qt/4.6.2-Symbian/s60sdk/epoc32/include/stdapis/stlport/stl/_tree.c::194::-1") + << formatRange(400, 64))) << QString(); QTest::newRow("rm false positive") @@ -536,11 +580,14 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Unknown, + << compileTask(Task::Unknown, "In function void foo(i) [with i = double]:\n" "../../scriptbug/main.cpp: In function void foo(i) [with i = double]:\n" "../../scriptbug/main.cpp:22: instantiated from here", - FilePath::fromUserInput("../../scriptbug/main.cpp")) + FilePath::fromUserInput("../../scriptbug/main.cpp"), + -1, + QVector() + << formatRange(43, 120)) << CompileTask(Task::Warning, "unused variable c", FilePath::fromUserInput("../../scriptbug/main.cpp"), @@ -577,12 +624,15 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Unknown, + << compileTask(Task::Unknown, "At global scope:\n" "../../scriptbug/main.cpp: At global scope:\n" "../../scriptbug/main.cpp: In instantiation of void bar(i) [with i = double]:\n" "../../scriptbug/main.cpp:8: instantiated from void foo(i) [with i = double]", - FilePath::fromUserInput("../../scriptbug/main.cpp")) + FilePath::fromUserInput("../../scriptbug/main.cpp"), + -1, + QVector() + << formatRange(17, 195)) << CompileTask(Task::Unknown, "instantiated from here", FilePath::fromUserInput("../../scriptbug/main.cpp"), @@ -612,12 +662,14 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Error, + << compileTask(Task::Error, "undefined reference to `vtable for QPlotAxis'\n" "debug/qplotaxis.o: In function `QPlotAxis':\n" "M:\\Development\\x64\\QtPlot/qplotaxis.cpp:26: undefined reference to `vtable for QPlotAxis'", FilePath::fromUserInput("M:\\Development\\x64\\QtPlot/qplotaxis.cpp"), - 26) + 26, + QVector() + << formatRange(46, 133)) << CompileTask(Task::Error, "undefined reference to `vtable for QPlotAxis'", FilePath::fromUserInput("M:\\Development\\x64\\QtPlot/qplotaxis.cpp"), @@ -635,19 +687,25 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Unknown, + << compileTask(Task::Unknown, "In member function typename _Vector_base<_Tp, _Alloc>::_Tp_alloc_type::const_reference Vector<_Tp, _Alloc>::at(int) [with _Tp = Point, _Alloc = Allocator]:\n" "../stl/main.cpp: In member function typename _Vector_base<_Tp, _Alloc>::_Tp_alloc_type::const_reference Vector<_Tp, _Alloc>::at(int) [with _Tp = Point, _Alloc = Allocator]:\n" "../stl/main.cpp:38: instantiated from here", - FilePath::fromUserInput("../stl/main.cpp"), -1) + FilePath::fromUserInput("../stl/main.cpp"), + -1, + QVector() + << formatRange(163, 224)) << CompileTask(Task::Warning, "returning reference to temporary", FilePath::fromUserInput("../stl/main.cpp"), 31) - << CompileTask(Task::Warning, + << compileTask(Task::Warning, "unused parameter index\n" "../stl/main.cpp: At global scope:\n" "../stl/main.cpp:31: warning: unused parameter index", - FilePath::fromUserInput("../stl/main.cpp"), 31)) + FilePath::fromUserInput("../stl/main.cpp"), + 31, + QVector() + << formatRange(23, 85))) << QString(); QTest::newRow("GCCE from lines") @@ -657,14 +715,16 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "C:/Symbian_SDK/epoc32/include/e32cmn.inl:7094: warning: returning reference to temporary") << OutputParserTester::STDERR << QString() << QString() - << Tasks{CompileTask(Task::Warning, + << Tasks{compileTask(Task::Warning, "returning reference to temporary\n" "In file included from C:/Symbian_SDK/epoc32/include/e32cmn.h:6792,\n" " from C:/Symbian_SDK/epoc32/include/e32std.h:25,\n" "C:/Symbian_SDK/epoc32/include/e32cmn.inl: In member function 'SSecureId::operator const TSecureId&() const':\n" "C:/Symbian_SDK/epoc32/include/e32cmn.inl:7094: warning: returning reference to temporary", FilePath::fromUserInput("C:/Symbian_SDK/epoc32/include/e32cmn.inl"), - 7094)} + 7094, + QVector() + << formatRange(33, 329))} << QString(); QTest::newRow("In constructor 2") << QString::fromUtf8("perfattributes.cpp: In constructor ‘PerfEventAttributes::PerfEventAttributes()’:\n" @@ -673,13 +733,16 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() " | ^") << OutputParserTester::STDERR << QString() << QString() - << Tasks{CompileTask(Task::Warning, + << Tasks{compileTask(Task::Warning, "‘void* memset(void*, int, size_t)’ clearing an object of non-trivial type ‘class PerfEventAttributes’; use assignment or value-initialization instead [-Wclass-memaccess]\n" "perfattributes.cpp: In constructor ‘PerfEventAttributes::PerfEventAttributes()’:\n" "perfattributes.cpp:28:48: warning: ‘void* memset(void*, int, size_t)’ clearing an object of non-trivial type ‘class PerfEventAttributes’; use assignment or value-initialization instead [-Wclass-memaccess]\n" " 28 | memset(this, 0, sizeof(PerfEventAttributes));\n" " | ^", - FilePath::fromUserInput("perfattributes.cpp"), 28)} + FilePath::fromUserInput("perfattributes.cpp"), + 28, + QVector() + << formatRange(170, 400))} << QString(); QTest::newRow("QTCREATORBUG-2206") << QString::fromLatin1("../../../src/XmlUg/targetdelete.c: At top level:") @@ -697,14 +760,20 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "/Symbian/SDK/epoc32/include/variant/Symbian_OS.hrh:1134:26: warning: no newline at end of file") << OutputParserTester::STDERR << QString() << QString() - << Tasks{CompileTask( + << Tasks{compileTask( Task::Warning, "no newline at end of file\n" "In file included from /Symbian/SDK/EPOC32/INCLUDE/GCCE/GCCE.h:15,\n" " from :26:\n" "/Symbian/SDK/epoc32/include/variant/Symbian_OS.hrh:1134:26: warning: no newline at end of file", FilePath::fromUserInput("/Symbian/SDK/epoc32/include/variant/Symbian_OS.hrh"), - 1134)} + 1134, + QVector() + << formatRange(26, 22) + << formatRange(48, 39, "olpfile:///Symbian/SDK/EPOC32/INCLUDE/GCCE/GCCE.h::15::-1") + << formatRange(87, 46) + << formatRange(133, 50, "olpfile:///Symbian/SDK/epoc32/include/variant/Symbian_OS.hrh::1134::-1") + << formatRange(183, 44))} << QString(); QTest::newRow("Linker fail (release build)") @@ -723,12 +792,14 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Warning, + << compileTask(Task::Warning, "case value '0' not in enumerated type 'ProFileEvaluator::Private::TestFunc'\n" "../../../src/shared/proparser/profileevaluator.cpp: In member function 'ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::evaluateConditionalFunction(const ProString&, const ProStringList&)':\n" "../../../src/shared/proparser/profileevaluator.cpp:2817:9: warning: case value '0' not in enumerated type 'ProFileEvaluator::Private::TestFunc'", FilePath::fromUserInput("../../../src/shared/proparser/profileevaluator.cpp"), - 2817)) + 2817, + QVector() + << formatRange(76, 351))) << QString(); QTest::newRow("include with line:column info") @@ -736,12 +807,15 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "./mw.h:4:0: warning: \"STUPID_DEFINE\" redefined") << OutputParserTester::STDERR << QString() << QString() - << Tasks{CompileTask( + << Tasks{compileTask( Task::Warning, "\"STUPID_DEFINE\" redefined\n" "In file included from :0:0:\n" "./mw.h:4:0: warning: \"STUPID_DEFINE\" redefined", - FilePath::fromUserInput("./mw.h"), 4)} + FilePath::fromUserInput("./mw.h"), + 4, + QVector() + << formatRange(26, 88))} << QString(); QTest::newRow("instantiation with line:column info") @@ -751,11 +825,14 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Unknown, + << compileTask(Task::Unknown, "In function 'void UnitTest::CheckEqual(UnitTest::TestResults&, const Expected&, const Actual&, const UnitTest::TestDetails&) [with Expected = unsigned int, Actual = int]':\n" "file.h: In function 'void UnitTest::CheckEqual(UnitTest::TestResults&, const Expected&, const Actual&, const UnitTest::TestDetails&) [with Expected = unsigned int, Actual = int]':\n" "file.cpp:87:10: instantiated from here", - FilePath::fromUserInput("file.h")) + FilePath::fromUserInput("file.h"), + -1, + QVector() + << formatRange(172, 218)) << CompileTask(Task::Warning, "comparison between signed and unsigned integer expressions [-Wsign-compare]", FilePath::fromUserInput("file.h"), @@ -799,14 +876,19 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() " ^") << OutputParserTester::STDERR << QString() << QString() - << Tasks{CompileTask( + << Tasks{compileTask( Task::Error, "QtGui/QAction: No such file or directory\n" "In file included from /home/code/src/creator/src/libs/extensionsystem/pluginerrorview.cpp:31:0:\n" ".uic/ui_pluginerrorview.h:14:25: fatal error: QtGui/QAction: No such file or directory\n" " #include \n" " ^", - FilePath::fromUserInput(".uic/ui_pluginerrorview.h"), 14)} + FilePath::fromUserInput(".uic/ui_pluginerrorview.h"), + 14, + QVector() + << formatRange(41, 22) + << formatRange(63, 67, "olpfile:///home/code/src/creator/src/libs/extensionsystem/pluginerrorview.cpp::31::-1") + << formatRange(130, 146))} << QString(); QTest::newRow("qtcreatorbug-9195") @@ -817,7 +899,7 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "main.cpp:7:22: error: within this context") << OutputParserTester::STDERR << QString() << QString() - << Tasks{CompileTask( + << Tasks{compileTask( Task::Error, "'QString::QString(const char*)' is private\n" "In file included from /usr/include/qt4/QtCore/QString:1:0,\n" @@ -825,7 +907,16 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "/usr/include/qt4/QtCore/qstring.h: In function 'void foo()':\n" "/usr/include/qt4/QtCore/qstring.h:597:5: error: 'QString::QString(const char*)' is private\n" "main.cpp:7:22: error: within this context", - FilePath::fromUserInput("/usr/include/qt4/QtCore/qstring.h"), 597)} + FilePath::fromUserInput("/usr/include/qt4/QtCore/qstring.h"), + 597, + QVector() + << formatRange(43, 22) + << formatRange(65, 31, "olpfile:///usr/include/qt4/QtCore/QString::1::-1") + << formatRange(96, 40) + << formatRange(136, 33, "olpfile:///usr/include/qt4/QtCore/qstring.h::0::-1") + << formatRange(169, 28) + << formatRange(197, 33, "olpfile:///usr/include/qt4/QtCore/qstring.h::597::-1") + << formatRange(230, 99))} << QString(); QTest::newRow("ld: Multiple definition error") @@ -836,12 +927,16 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << OutputParserTester::STDERR << QString() << QString() << (Tasks() - << CompileTask(Task::Error, + << compileTask(Task::Error, "multiple definition of `foo()'\n" "foo.o: In function `foo()':\n" "/home/user/test/foo.cpp:2: multiple definition of `foo()'", FilePath::fromUserInput("/home/user/test/foo.cpp"), - 2) + 2, + QVector() + << formatRange(31, 28) + << formatRange(59, 23, "olpfile:///home/user/test/foo.cpp::2::-1") + << formatRange(82, 34)) << CompileTask(Task::Unknown, "first defined here", FilePath::fromUserInput("/home/user/test/bar.cpp"), @@ -1089,7 +1184,7 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() ) << OutputParserTester::STDERR << QString() << QString() - << Tasks{CompileTask(Task::Warning, + << Tasks{compileTask(Task::Warning, "implicitly-declared ‘constexpr QVariant::Private& QVariant::Private::operator=(const QVariant::Private&)’ is deprecated [-Wdeprecated-copy]\n" "In file included from /usr/include/qt/QtCore/qlocale.h:43,\n" " from /usr/include/qt/QtCore/qtextstream.h:46,\n" @@ -1101,8 +1196,23 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "/usr/include/qt/QtCore/qvariant.h:399:16: note: because ‘QVariant::Private’ has user-provided ‘QVariant::Private::Private(const QVariant::Private&)’\n" " 399 | inline Private(const Private &other) Q_DECL_NOTHROW\n" " | ^~~~~~~)", - FilePath::fromUserInput("/usr/include/qt/QtCore/qvariant.h"), 273), - CompileTask(Task::Error, + FilePath::fromUserInput("/usr/include/qt/QtCore/qvariant.h"), + 273, + QVector() + << formatRange(140, 22) + << formatRange(162, 32, "olpfile:///usr/include/qt/QtCore/qlocale.h::43::-1") + << formatRange(194, 27) + << formatRange(221, 36, "olpfile:///usr/include/qt/QtCore/qtextstream.h::46::-1") + << formatRange(257, 27) + << formatRange(284, 38, "olpfile:///qtc/src/shared/proparser/proitems.cpp::31::-1") + << formatRange(322, 5) + << formatRange(327, 33, "olpfile:///usr/include/qt/QtCore/qvariant.h::0::-1") + << formatRange(360, 51) + << formatRange(411, 33, "olpfile:///usr/include/qt/QtCore/qvariant.h::273::-1") + << formatRange(444, 229) + << formatRange(673, 33, "olpfile:///usr/include/qt/QtCore/qvariant.h::399::-1") + << formatRange(706, 221)), + compileTask(Task::Error, "no match for ‘operator+’ (operand types are ‘boxed_value’ and ‘boxed_value’)\n" "t.cc: In function ‘int test(const shape&, const shape&)’:\n" "t.cc:15:4: error: no match for ‘operator+’ (operand types are ‘boxed_value’ and ‘boxed_value’)\n" @@ -1115,8 +1225,10 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() " | |\n" " | boxed_value<[...]>", FilePath::fromUserInput("t.cc"), - 15), - CompileTask(Task::Error, + 15, + QVector() + << formatRange(93, 460)), + compileTask(Task::Error, "‘string’ in namespace ‘std’ does not name a type\n" "incomplete.c:1:6: error: ‘string’ in namespace ‘std’ does not name a type\n" " 1 | std::string test(void)\n" @@ -1125,8 +1237,10 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() " +++ |+#include \n" " 1 | std::string test(void)", FilePath::fromUserInput("incomplete.c"), - 1), - CompileTask(Task::Warning, + 1, + QVector() + << formatRange(49, 284)), + compileTask(Task::Warning, "passing argument 2 of ‘callee’ makes pointer from integer without a cast [-Wint-conversion]\n" "param-type-mismatch.c: In function ‘caller’:\n" "param-type-mismatch.c:5:24: warning: passing argument 2 of ‘callee’ makes pointer from integer without a cast [-Wint-conversion]\n" @@ -1137,7 +1251,10 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "param-type-mismatch.c:1:40: note: expected ‘const char *’ but argument is of type ‘int’\n" " 1 | extern int callee(int one, const char *two, float three);\n" " | ~~~~~~~~~~~~^~~", - FilePath::fromUserInput("param-type-mismatch.c"), 5)} + FilePath::fromUserInput("param-type-mismatch.c"), + 5, + QVector() + << formatRange(92, 519))} << QString(); QTest::newRow(R"("inlined from")") @@ -1154,7 +1271,7 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() " | ~~~~~~~~~~~~^~~") << OutputParserTester::STDERR << QString() << QString() - << Tasks{CompileTask(Task::Warning, + << Tasks{compileTask(Task::Warning, "writing 1 byte into a region of size 0 [-Wstringop-overflow=]\n" "In file included from smallstringvector.h:30,\n" " from smallstringio.h:28,\n" @@ -1167,7 +1284,10 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "smallstring.h:465:21: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]\n" " 465 | at(newSize) = 0;\n" " | ~~~~~~~~~~~~^~~", - FilePath::fromUserInput("smallstring.h"), 465)} + FilePath::fromUserInput("smallstring.h"), + 465, + QVector() + << formatRange(62, 805))} << QString(); QTest::newRow(R"("required from")") @@ -1189,7 +1309,7 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() " | ^~~~~") << OutputParserTester::STDERR << QString() << QString() - << Tasks{CompileTask(Task::Error, + << Tasks{compileTask(Task::Error, "‘QMapNode::value’ has incomplete type\n" "In file included from qmap.h:1,\n" " from qvariant.h:47,\n" @@ -1206,7 +1326,10 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "qmap.h:110:7: error: ‘QMapNode::value’ has incomplete type\n" " 110 | T value;\n" " | ^~~~~", - FilePath::fromUserInput("qmap.h"), 110)} + FilePath::fromUserInput("qmap.h"), + 110, + QVector() + << formatRange(46, 1458))} << QString(); QTest::newRow("cc1plus") diff --git a/src/plugins/projectexplorer/msvcparser.cpp b/src/plugins/projectexplorer/msvcparser.cpp index b351ea889bf..a0b1039f2b1 100644 --- a/src/plugins/projectexplorer/msvcparser.cpp +++ b/src/plugins/projectexplorer/msvcparser.cpp @@ -1,4 +1,4 @@ -/**************************************************************************** +/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ @@ -317,6 +317,25 @@ void ProjectExplorerPlugin::testMsvcOutputParsers_data() QTest::addColumn("tasks"); QTest::addColumn("outputLines"); + auto compileTask = [](Task::TaskType type, + const QString &description, + const Utils::FilePath &file, + int line, + const QVector formats) + { + CompileTask task(type, description, file, line); + task.formats = formats; + return task; + }; + + auto formatRange = [](int start, int length, const QString &anchorHref = QString()) + { + QTextCharFormat format; + format.setAnchorHref(anchorHref); + + return QTextLayout::FormatRange{start, length, format}; + }; + QTest::newRow("pass-through stdout") << "Sometext" << OutputParserTester::STDOUT << "Sometext\n" << "" @@ -436,14 +455,17 @@ void ProjectExplorerPlugin::testMsvcOutputParsers_data() << OutputParserTester::STDOUT << "" << "" << (Tasks() - << CompileTask(Task::Error, + << compileTask(Task::Error, "C2440: 'initializing' : cannot convert from 'int' to 'std::_Tree<_Traits>::iterator'\n" " with\n" " [\n" " _Traits=std::_Tmap_traits,std::allocator>,false>\n" " ]\n" " No constructor could take the source type, or constructor overload resolution was ambiguous", - FilePath::fromUserInput("..\\untitled\\main.cpp"), 19)) + FilePath::fromUserInput("..\\untitled\\main.cpp"), + 19, + QVector() + << formatRange(85, 247))) << ""; QTest::newRow("Linker error 1") @@ -502,14 +524,17 @@ void ProjectExplorerPlugin::testMsvcOutputParsers_data() << CompileTask(Task::Unknown, "see declaration of 'std::_Copy_impl'", FilePath::fromUserInput("c:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\INCLUDE\\xutility"), 2212) - << CompileTask(Task::Unknown, + << compileTask(Task::Unknown, "see reference to function template instantiation '_OutIt std::copy(_InIt,_InIt,_OutIt)' being compiled\n" " with\n" " [\n" " _OutIt=unsigned short *,\n" " _InIt=const unsigned char *\n" " ]", - FilePath::fromUserInput("symbolgroupvalue.cpp"), 2314)) + FilePath::fromUserInput("symbolgroupvalue.cpp"), + 2314, + QVector() + << formatRange(141, 109))) << ""; QTest::newRow("Ambiguous symbol") @@ -542,10 +567,13 @@ void ProjectExplorerPlugin::testMsvcOutputParsers_data() "main.cpp(6): note: see declaration of 'func'" << OutputParserTester::STDOUT << "" << "" - << Tasks{CompileTask(Task::Error, + << Tasks{compileTask(Task::Error, "C2733: 'func': second C linkage of overloaded function not allowed\n" "main.cpp(6): note: see declaration of 'func'", - FilePath::fromUserInput("main.cpp"), 7)} + FilePath::fromUserInput("main.cpp"), + 7, + QVector() + << formatRange(67, 44))} << ""; QTest::newRow("cyrillic warning") // QTCREATORBUG-20297 diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index a70a33a8d88..65718f5a460 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -92,6 +92,12 @@ void OutputParserTester::testParsing(const QString &lines, msgFileComparisonFail(m_receivedTasks.at(i).file, tasks.at(i).file)); QCOMPARE(m_receivedTasks.at(i).line, tasks.at(i).line); QCOMPARE(static_cast(m_receivedTasks.at(i).type), static_cast(tasks.at(i).type)); + QCOMPARE(m_receivedTasks.at(i).formats.size(), tasks.at(i).formats.size()); + for (int j = 0; j < tasks.at(i).formats.size(); ++j) { + QCOMPARE(m_receivedTasks.at(i).formats.at(j).start, tasks.at(i).formats.at(j).start); + QCOMPARE(m_receivedTasks.at(i).formats.at(j).length, tasks.at(i).formats.at(j).length); + QCOMPARE(m_receivedTasks.at(i).formats.at(j).format.anchorHref(), tasks.at(i).formats.at(j).format.anchorHref()); + } } } } From 4b1bb9c0fc76c4e3099731d3a74b8d88fdd0e38f Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 9 Mar 2021 14:04:52 +0100 Subject: [PATCH 08/21] CppTools: Fix highlighting angle brackets Change-Id: Id7ee6a13d34799aba46bd9a8005a925f745cf53a Reviewed-by: Christian Stenger --- src/tools/clangbackend/source/tokeninfo.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tools/clangbackend/source/tokeninfo.cpp b/src/tools/clangbackend/source/tokeninfo.cpp index b7e8f5d572c..1ca8f4cac03 100644 --- a/src/tools/clangbackend/source/tokeninfo.cpp +++ b/src/tools/clangbackend/source/tokeninfo.cpp @@ -597,7 +597,9 @@ void TokenInfo::punctuationOrOperatorKind() break; } - if (m_types.mixinHighlightingTypes.empty() && kind != CXCursor_InclusionDirective) { + if (m_types.mixinHighlightingTypes.empty() + && kind != CXCursor_InclusionDirective + && kind != CXCursor_PreprocessingDirective) { const ClangString spelling = m_token->spelling(); if (spelling == "<") m_types.mixinHighlightingTypes.push_back(HighlightingType::AngleBracketOpen); From 706b9ceedbb0b287644a13fad34fbb1c580e302a Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 4 Mar 2021 13:16:36 +0100 Subject: [PATCH 09/21] Doc: Restructure information about Connections View - Add a topic that summarizes the Connections View tabs - Hide some technical detail in the instructions - Make "Adding Connections" a collection topic - Fix terminology to use "component" instead of "object". "item", or "QML type" Task-number: QDS-3771 Change-Id: I0b0d66cb50d8ecc7dbc812ef57918ffafb64cd8c Reviewed-by: Thomas Hartmann --- .../images/qmldesigner-binding-editor.png | Bin 5228 -> 3812 bytes doc/qtcreator/images/qmldesigner-bindings.png | Bin 4181 -> 4190 bytes .../images/qmldesigner-connections.png | Bin 5705 -> 4495 bytes doc/qtcreator/src/qtcreator-toc.qdoc | 5 +- .../qtquick/creator-logical-operators.qdocinc | 10 +- .../creator-only/qtquick-app-tutorial.qdoc | 2 +- .../src/qtquick/library/qtquick-controls.qdoc | 4 +- .../src/qtquick/qtquick-components.qdoc | 2 +- .../qtquick-connection-editor-bindings.qdoc | 52 ++++++---- .../qtquick-connection-editor-properties.qdoc | 49 +++++---- .../qtquick-connection-editor-signals.qdoc | 94 +++++++++-------- .../qtquick/qtquick-connection-editor.qdoc | 61 +++++------ .../src/qtquick/qtquick-connection-view.qdoc | 96 ++++++++++++++++++ .../src/qtquick/qtquick-designer.qdoc | 4 +- .../src/qtquick/qtquick-navigator.qdoc | 2 +- doc/qtdesignstudio/examples/doc/loginui3.qdoc | 2 +- doc/qtdesignstudio/examples/doc/sidemenu.qdoc | 4 +- .../examples/doc/washingMachineUI.qdoc | 4 +- .../src/qtdesignstudio-toc.qdoc | 5 +- 19 files changed, 263 insertions(+), 133 deletions(-) create mode 100644 doc/qtcreator/src/qtquick/qtquick-connection-view.qdoc diff --git a/doc/qtcreator/images/qmldesigner-binding-editor.png b/doc/qtcreator/images/qmldesigner-binding-editor.png index fc6650bc5bcc1b9b74e8305c91c5afa1d6857e49..0ffb326628d6336402f418f8020f81e85c40079f 100644 GIT binary patch literal 3812 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 literal 5228 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 YeUhH4)7|?u3=9kmp00i_>zopr05@kKMgRZ+ diff --git a/doc/qtcreator/images/qmldesigner-bindings.png b/doc/qtcreator/images/qmldesigner-bindings.png index 017b22cd23f617a89169df885d2579d3e289c216..32ccc5690748baf99d208eabd83b20582e3a0b70 100644 GIT binary patch literal 4190 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 literal 4181 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 E01XCwivR!s literal 5705 zcmeAS@N?(olHy`uVBq!ia0y~yU~*+(V7Sb|#=yYPe=mI-0|NtRfk$L90|Va?5N4dJ z%_q&kz`$PO>Fdh=ghP^7#Qe}|$CnHYqAxsM978JRyuBOf5mVXp{$u_Y>yr!4*_d8t zwADPFBFCjS(||cL=#`Jlw0EgB()x_ChIf1}b34mDar&f?rfjz)zGgyWUXHkGcG=-? zdn|X~EjY^KcKFH4lim7rwY1$A?v{+ulYN>t$*fj>)u}0|Q=^voto&K0kl;7>vwi*l zum9)&y88dmYMW2p@&7)xtKY9}SMj_w`;Bgc{oj}VQ`a4retKtT@zixqThi}UKA-Cq z?l`Gz>8eYj6I48J@$qQz$`Wl8Pr2Sk&Q}^3PPkwlnv4AHD0k zVB7J%JG)D#yGrf6FnOjeSH5ux zx0L>YM|WMN^uJsXE!GYmrK*+0&D@Dr17j7(^HBqpmbW8dvpThE-Su0zcZP!lBjkjv6yl~&? zcXh$f_YdFQFxg^0QDSCO1pC|R`T~ka?`{-aCU#@j+if@OW8YQQNo6WBypT-WQP{KZ z<(%hBBP5UT#s2mVvYe_a(z=pGVDU!9_l-Xlt$r`-IBJ!V)Uxkf=DHd)zw4Kjf`fx6 zbON&IJP zD~pM)W6H#pD_MGNV_*M%zs1gW8KK-Zue`cQxizBnkEHgX(jfYZI?zMcIz9c+gpQ)>f;K|e6FE?B{ z`1E7lqeSJ-bAn>m;}er(b{hJH8=Swe(@tomf$`kUmDMw5r72!JSm4jk>pkIx_XMtm zioyRrRM@{34$%#t@lIx8W`&JywrPF&^{b zh2>U-8fluB7H*!%ZCjWy?`S@wQ(pY5loUl<=jr$RCVpM&!Fp@m##V(n=@~gaF2W{X z%r8iszG)w8G&9y{k6J&Tu9(_o-p>cK)n- zeeb1b?N%?}*i2tneZi?Z=Xdh8)|Fq*1a*ondoL)o{Qtppn-~4-ryHA^9jW2?xUTNk z@#B>ScQ$rk`aXTZ>h^i_#H41VzX+;|ja|3Qmh*kId!m8rpzXtjNq0Faz zmK3nlKWFN}U$Yji>6QQC-Ttm(o2`6h*>qm(B- zFLP?tpH!=5zptHc{PMP~qO3Z8*&prshWDoK3pFshbn?n01Ae_H(}JUF4^_W3b)9*? zqfc9xT}QxiPrXfXwqeS@Z(qNxo&HDs29uaup5gsV{?~t4+>}nYp0_z7BBgU3@AG}O zS5B5BSNU?k{yNj{i~b32LIchtVLy3F0W@BRvzVhh((Hy(ehe?GVT+nOBDTi&TL8FRxdtfy!Ph-fdr^2z(o ze+In`>-JduHBXpl@sZ(BwdLx`_jWk29A);~s9&SwE-kA0xHqTX^H$tV=ZRYkE}dL@ zl<$_bzQ98>=gW2S=hQk4+uCM%+|Ze{C10Xzi@MmdWf2-1gxn;#x!GJjZ>9ff-hf)k zJ(#tqtK!20$EB+kJSP?Xd1k)9aGA#>70x}iYMzr=z_nq+nOTeC|Go;Jx~^TtGwA4* zt5+?9RXiuL+_Rgk;>on&)${aoA-nh{sd$Qpf4#qYrPp=GNh&KJt&01z|JEe_s*jIY z_2c&3Xny4}NhQ?nWOi5Fo{EFZ=hvNDKEE!@V3LYwyW7?H|G%zJ;yc0X)TZP)sU%{G z45$+3Q?{R^?>Wikne^K2lj^(Qw9D7s_)z@sacJn$r)z@p4^EBRr{a0ZPsXzL*B5?m zZEaThGkUA^j=rz^zFU@k`d+>GNh+D@+x{BM?~e3{J!M!O3s#B+Eb_ioFgCnruH>XUhRV`H-FS&^sH_ot?M>wtB?di82sTyRKe=+XYVFN=9^@B9Dn z_t*LTvew6<^K*CWtX%R*)pL^8K}~VbNh;uWLc>B(*xg85SgLsQ=*5Qad8(e57H)X! z^x7##M%Qx^pYrlb70*cqBA$~}7(sqjIS>E}$q8{8e?QOvzvt3diw#1ZEWWJ_hE1Do#CHaC+Qf7|kWlyfD;!C%iA9{0y=j5EfRmz)v&g}7;-*L(Mg0F?e37>eY3iPg6R%~Pw42ZLVLZ8)%O#hmhs~$XpmAb0 zcP{gvg_V8x*KZFt`Fwz7a`RK$(7(%c1)DxI`aH?wI&uHYD)rknah~g!^}hRTP|mKm z&28q*Pge8Fb^WIOzoj(wb~cBrgV9Vmk+m0mjOMm43cM9%Z0zw+X7bI*<_zh*Yc9l3~#camS&CNXL*kYvLs&c8QzuT~r z=Dl|;bL{0)=Iyp@%4XhjQ0#nq;lzw78Q<<#9o_aqy!G7dx9pQ&zWvTUcZEm%%`4Yc zay4&N&3n32Qo+^3A?0sl+`6^>ha=M_wXQolGy8N~t@EtS$vbaIOpjaKrMD$+e&yNt z{4dk3dHBxlsj=}{dcXI~nT;{?Z(0g%s8P4pwLbm#4kOo+NuK%hb5$)5vi~obe9~aS z*6Jz$rF07zwXVElIIVaxWl~B}+s>y|O+Je>f7OTu)z5qOE^pW7|9boO+zj0^$LV=5 zOF_NaX4}voG0|VA{@JItvO{C-^XW5ZGkO?R@1OVVjcf8@i#rxG%woIE-|YS<74+to z(q6sw&%Z?~<}&xh@$4*C_qqRGjYGNpUMKD|FndDGI$O!zjNy^r=6U<^uKzaeB(SL>pTfb*Z` zI;N#HWE?p9EU9`K$Mor(>gwh?ue{q%J1jJHewi6NRj+no*4aPn3wDcd{``FNo~J5@ zQ(rY}>aja%(&L;jb?>NiH2{ThqL{6El60`5v z*2acZ@hI`@*G|7U`dLRmJ*{cS`LmpHbsW50+p8x&@~X1i9#CXCQ*!OaGd*HoPtO*Q z5`U{bschBSo%4QA-nlrfZRgX#sKvsw*ByU&M?u)Q^7^B%kuUDlzFzs9PhRC_#oLKm zPfonNyu99`^i{~x*MTv&8JKw{{mtsmc&~ByA^V%@>vvgfsb5+%fBWuBe7XN8FS)KU z(Su=XOmIlkuLZpsCaezG4inGEtiF>|?s;i;%K!5s2T#90t(cNmROX%?6F2?vAHQ0A zkltdDURCSh5(TG=bT3D* zA1`KSt-H4FfPs$PC?*+kQ2^0rU={V(knyH)q>OQGMjL-upmwoP4L^W*9* zx&L0j{SSUy1=6f|@b;GLhaN2swX0&f5?WaFRa4%svhvU2KTNOtKHb}$ZS!Z-X!Z#zyzt1za~Tod5JY{@jkZm44q> z=C9)ZcG~yxkJ(y&>+Jl$Z=Y%^cm2@esne6IPuK0d{+No> zy1$pT_WgRMDQ{opmt0nzYq}=qx?kv@UE8eIzj^-pp~>s*>HU{?eCla0J^u5Lk7#_& z&QtC8Lkf+5_u22ZE&enA^uN=qKNbDH$$jgw;IuSNGRbzwg@R|NmyC z_I_KNt?X&d<7#>CO4#R$!#-}Ny<3lN-~2N6(d?xeyVr==KTF9q-SBtKt!JBzvsPLB z&HMTbq_p_ca?_emdCxvxHQjgPRYj&WfB3ZpCw?uQ`)&30oAv(J!}2Yksc@DFcFC<< z^K@^<`i(o7_%-*~*4qC+``2no(%aB0r=f!BByFY2WHzj_Y9cmY~|HJx^7Z0b`)V

uiaT_zo|QPf8DvqXUeixEi60R zdaXV1Y@wayZ?h{Q#YLsF|AmMAv#1NS*^_@$zkFA`(`dps=RI8^|+?)73=%_pM}5g{(O5={_>X>yT2?~`@UJ&v?lKNl<)Vqn5Rtg z68d}Ce&50GTUGW>vbT$}6)^5j51Utf)9d?pg31G(rU zX#A*RgTe~DWM4f3+Al# diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 8bee7c96012..151bc150bf7 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -96,6 +96,7 @@ \li \l{Library} \li \l{Navigator} \li \l{Properties} + \li \l{Connection View} \li \l{Transition Editor} \li \l{Timeline} \li \l{Curve Editor} @@ -128,9 +129,9 @@ \endlist \li \l{Adding Connections} \list - \li \l{Connecting Objects to Signals} - \li \l{Specifying Dynamic Properties} + \li \l{Connecting Components to Signals} \li \l{Adding Bindings Between Properties} + \li \l{Specifying Dynamic Properties} \li \l{Managing C++ Backend Objects} \endlist \li \l {Adding States} diff --git a/doc/qtcreator/src/qtquick/creator-logical-operators.qdocinc b/doc/qtcreator/src/qtquick/creator-logical-operators.qdocinc index a8bd94c4621..79284654a4f 100644 --- a/doc/qtcreator/src/qtquick/creator-logical-operators.qdocinc +++ b/doc/qtcreator/src/qtquick/creator-logical-operators.qdocinc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -84,6 +84,14 @@ different type. \endtable + \if defined(qtdesignstudio) + Alternatively, you can use \uicontrol {And Operator}, + \uicontrol {Or Operator}, and \uicontrol {Not Operator} + components to bind property values using the boolean AND, + OR, and NOT operator. For more information, see \l{Logic Helpers}. + \endif + + In addition, you can use arithmetic operators to compare numbers before checks. However, we recommend that you create separate properties for this purpose whenever possible. diff --git a/doc/qtcreator/src/qtquick/creator-only/qtquick-app-tutorial.qdoc b/doc/qtcreator/src/qtquick/creator-only/qtquick-app-tutorial.qdoc index f9822526ccd..3fbef6889c6 100644 --- a/doc/qtcreator/src/qtquick/creator-only/qtquick-app-tutorial.qdoc +++ b/doc/qtcreator/src/qtquick/creator-only/qtquick-app-tutorial.qdoc @@ -248,7 +248,7 @@ \list \li \l{Adding States} - \li \l{Connecting Objects to Signals} + \li \l{Connecting Components to Signals} \endlist \section1 Animating Transitions diff --git a/doc/qtcreator/src/qtquick/library/qtquick-controls.qdoc b/doc/qtcreator/src/qtquick/library/qtquick-controls.qdoc index d3db5c08b58..d5b86029742 100644 --- a/doc/qtcreator/src/qtquick/library/qtquick-controls.qdoc +++ b/doc/qtcreator/src/qtquick/library/qtquick-controls.qdoc @@ -76,7 +76,7 @@ can define an area smaller or larger than the parent. Several controls,such as \l {Button}{buttons}, contain a mouse area. - A mouse area emits \l{Connecting Objects to Signals}{signals} in response + A mouse area emits \l{Connecting Components to Signals}{signals} in response to different mouse events: \list @@ -437,7 +437,7 @@ \section2 Button Signals A button emits the \c clicked() signal when it is activated by users. - \l{Connecting Objects to Signals}{Connect to this signal} to perform + \l{Connecting Components to Signals}{Connect to this signal} to perform the button's action. Buttons provide the following additional signals: \c canceled(), \c doubleClicked(), \c pressed(), \c released(), and \c pressAndHold() for long presses. diff --git a/doc/qtcreator/src/qtquick/qtquick-components.qdoc b/doc/qtcreator/src/qtquick/qtquick-components.qdoc index a03b2ce4576..b2e47db3f5a 100644 --- a/doc/qtcreator/src/qtquick/qtquick-components.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-components.qdoc @@ -90,7 +90,7 @@ \li To enable users to interact with components, connect the components to signals in the \uicontrol Connections view. For example, you can specify what happens when a component is clicked. - For more information, see \l{Connecting Objects to Signals}. + For more information, see \l{Connecting Components to Signals}. \image qmldesigner-connections.png "Connections view Connections tab" \li To dynamically change the behavior of an object when another object changes, create bindings between components in the diff --git a/doc/qtcreator/src/qtquick/qtquick-connection-editor-bindings.qdoc b/doc/qtcreator/src/qtquick/qtquick-connection-editor-bindings.qdoc index 6a6012dcbd4..610b582e512 100644 --- a/doc/qtcreator/src/qtquick/qtquick-connection-editor-bindings.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-connection-editor-bindings.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -25,43 +25,44 @@ /*! \page quick-property-bindings.html - \previouspage quick-dynamic-properties.html - \if defined(qtdesignstudio) - \nextpage quick-states.html - \else - \nextpage quick-connections-backend.html - \endif + \previouspage quick-signals.html + \nextpage quick-dynamic-properties.html \title Adding Bindings Between Properties - To dynamically change the behavior of an object, you can create a \e binding - between the properties of two objects. To create a property binding, a - property is assigned a JavaScript expression that evaluates to the desired - value. At its simplest, a binding may be a reference to another property. - For example, the height of an object can be bound to the height of its - parent, so that when the parent height changes, the object height is + To dynamically change the behavior of a component, you can create a + \e binding between the properties of two components. To create a property + binding, a property is assigned a JavaScript expression that evaluates to + the desired value. Behind the scenes, the variables in the binding + expression are monitored. When a change is detected, the binding + expression is re-evaluated and the new result is applied to the property. + + At its simplest, a binding may be a reference to another property. + For example, the height of a component can be bound to the height of its + parent, so that when the parent height changes, the component height is adjusted automatically. For more information about the use of property bindings, see \l{Property Binding}. - You can create bindings between objects in the \uicontrol Connections view. + You can create bindings between components in \uicontrol Bindings. \image qmldesigner-bindings.png - To bind a property of an object to the property of another object: + To bind a property of a component to the property of another component: \list 1 - \li In the \uicontrol {Connections} view, select the - \uicontrol {Bindings} tab. + \li Select \uicontrol View > \uicontrol Views > + \uicontrol {Connection view} > \uicontrol {Bindings}. \li Select the \inlineimage plus.png (\uicontrol Add) button to add a binding for the currently selected - item. The ID is displayed in the \uicontrol Item column. + component. The component ID is displayed in the \uicontrol Item + column. \li Double-click the value in the \uicontrol Property column to select the property to bind to a source property. \li Double-click the value in the \uicontrol {Source Item} column to - select the object whose property you want to use to determine the - behavior of the target object. + select the component whose property you want to use to determine the + behavior of the target component. \li Double-click the value in the \uicontrol {Source Property} column to select the property to bind the target property to. \endlist @@ -72,6 +73,17 @@ \image qmldesigner-binding-editor.png "Binding Editor" + For examples of creating property bindings, see: + + \list + \li \l{Using States to Change Component Property Values} + \if defined(qtdesignstudio) + \li \l{Exporting Properties} + \else + \li \l{Moving the Bubble} in \l{Creating a Mobile Application} + \endif + \endlist + For more information, watch the following video: \youtube UfvA04CIXv0 diff --git a/doc/qtcreator/src/qtquick/qtquick-connection-editor-properties.qdoc b/doc/qtcreator/src/qtquick/qtquick-connection-editor-properties.qdoc index c370f36b3f7..efcd189a302 100644 --- a/doc/qtcreator/src/qtquick/qtquick-connection-editor-properties.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-connection-editor-properties.qdoc @@ -24,40 +24,45 @@ ****************************************************************************/ /*! - \previouspage quick-signals.html \page quick-dynamic-properties.html - \nextpage quick-property-bindings.html + \previouspage quick-property-bindings.html + \if defined(qtdesignstudio) + \nextpage quick-states.html + \else + \nextpage quick-connections-backend.html + \endif \title Specifying Dynamic Properties - Each predefined QML type has a set of predefined properties that you can - specify values for. You can add custom properties that would not otherwise - exist for a particular type. You bind the properties to dynamic expressions - to define global properties for an object that can be read by other objects. - For example, you can specify global properties for the root object that you - can use in the child objects. + Each preset \l{glossary-component}{component} has a set of preset properties + that you can specify values for. You can add custom properties that would + not otherwise exist for a particular \l{Component Types}{component type}. + You bind the properties to dynamic expressions to define global properties + for a component that can be read by other components. For example, you can + specify global properties for the root component that you can use in the + child components. For example, to specify spacing between UI elements, you could define a - margin for an object of a QML type that does not have a margin property, - and then use bindings to refer to the value of the margin property from - other objects. + margin for a component that does not have a margin property, and then use + \l{Adding Bindings Between Properties}{bindings} to refer to the value of + the margin property from other components. - Similarly, you can add custom properties for your own QML types that are - based on the predefined types. + Similarly, you can add custom properties for your own components that are + based on preset components. - You can add properties for objects in the \uicontrol Connections view, - \uicontrol Properties tab. + You can add properties for components in \uicontrol {Connections View} > + \uicontrol Properties. \image qmldesigner-dynamicprops.png "Custom properties in Connection View Custom Properties tab" - To add properties for an object: + To add properties for a component: \list 1 \li Select \uicontrol View > \uicontrol Views > \uicontrol {Connections View} > \uicontrol {Properties}. \li Select the \inlineimage plus.png (\uicontrol Add) button to add a dynamic property for the currently - selected item. The item ID is displayed in the \uicontrol Item + selected component. The component ID is displayed in the \uicontrol Item column. \li Double-click the value in the \uicontrol Property column to give a name to the property. Property names must begin with a lower case @@ -76,17 +81,19 @@ \image qmldesigner-binding-editor.png "Binding Editor" - The properties you add for a QML type are displayed in the - \uicontrol Properties view when you select a component of - that type in \uicontrol Navigator or \uicontrol {Form Editor}. + The properties you add for a component are displayed in the \l Properties + view when you select a component of that type in \l Navigator or + \l {Form Editor}. \image qtquick-custom-properties.png "Custom properties in Properties view" For more information about setting property values in the - \uicontrol Properties view, see \l{Specifying Component Properties}. + \l Properties view, see \l{Specifying Component Properties}. + \if defined(qtcreator) For an example of using custom properties in an application, see \l{Creating a Mobile Application}. + \endif \section1 Supported Property Types diff --git a/doc/qtcreator/src/qtquick/qtquick-connection-editor-signals.qdoc b/doc/qtcreator/src/qtquick/qtquick-connection-editor-signals.qdoc index 43679007285..00ec0482642 100644 --- a/doc/qtcreator/src/qtquick/qtquick-connection-editor-signals.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-connection-editor-signals.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -26,55 +26,57 @@ /*! \previouspage qmldesigner-connections.html \page quick-signals.html - \nextpage quick-dynamic-properties.html + \nextpage quick-property-bindings.html - \title Connecting Objects to Signals + \title Connecting Components to Signals + + A signal and handler mechanism enables components to respond to application + events, which are represented by \e signals. When a signal is emitted, the + corresponding \e {signal handler} is invoked to respond to the event by + using scripts or other operations placed in the handler. To receive a notification when a particular signal is emitted for a - particular object, the object definition should declare a signal handler + particular component, the component definition should declare a signal handler named \e {on} where \e {} is the name of the signal, with the first letter capitalized. The signal handler should contain the JavaScript code to be executed when the signal handler is invoked. - QML types have predefined signals that are emitted when users interact with - the application. For example, the \l {Mouse Area} type has a - \c clicked signal that is emitted whenever the mouse is - clicked within the area. Since the signal name is \c clicked, the signal - handler for receiving this signal is named \c onClicked. + Components have predefined signals that are emitted when users interact with + the application. For example, the \l {Mouse Area} component has a \c clicked + signal that is emitted whenever the mouse is clicked within the area. Since + the signal name is \c clicked, the signal handler for receiving this signal + is named \c onClicked. - A signal is automatically emitted when the value of a QML property changes. + A signal is automatically emitted when the value of a property changes. This type of signal is a \e{property change signal} and signal handlers for these signals are written in the form \c onChanged, where \e is the name of the property, with the first letter capitalized. - For example, the Mouse Area type has a \c pressed property. To receive a - notification whenever this property changes, you would use a signal handler + For example, the Mouse Area component has a \c pressed property. To receive + a notification whenever this property changes, you would use a signal handler called \c onPressedChanged. For more information about signals and signal handlers, see \l{Signal and Handler Event System}. - To access a signal outside of the object that emits it, you can use the - \l Connections type for connecting to signals of arbitrary objects. A - connections object can receive any signal from its specified target. - You can connect objects to signals that are available to them in the - \uicontrol Connections view. + You can connect components to signals that are available to them in + \uicontrol Connections. \image qmldesigner-connections.png - To connect objects to signals: + To connect components to signals: \list 1 - \li In the \uicontrol {Connections} view, select the - \uicontrol {Connections} tab. + \li Select \uicontrol View > \uicontrol Views > + \uicontrol {Connection View} > \uicontrol {Connections}. \li Select the \inlineimage plus.png (\uicontrol Add) button to add a connection. \li Double-click the value in the \uicontrol Target column to add the - object to connect to a signal. + component to connect to a signal. \li Double-click the value in the \uicontrol {Signal Handler} column to select the signal that the connection will listen to from a list of - all signals available for the object. + all signals available for the component. \li Double-click the value in the \uicontrol Actions column to specify the action to perform when the signal is emitted. You use JavaScript to specify the actions. @@ -84,6 +86,18 @@ in the context menu to specify the connection in \uicontrol {Connection Editor}. + \if defined(qtcreator) + For an example of using the \uicontrol {Connections} view, see + \l{Connecting Mouse Clicks to State Changes}. + \else + For examples of using the \uicontrol {Connections} view, see: + + \list + \li \l{Connecting Buttons to States} in \l{Log In UI - Part 3} + \li \l{Connecting Buttons to State Changes} in \l{Washing Machine UI} + \endlist + \endif + \section1 Adding Signal Handlers If a signal handler that you need is not listed in the @@ -100,43 +114,41 @@ \li Select \uicontrol OK. \endlist - The added signal handler is automatically \l{Using Qt Quick UI Forms} + The added signal handler is automatically \l{Adding Property Aliases} {exported as a property}. - \if defined(qtdesignstudio) \section1 Adding Actions and Assignments You use the \uicontrol {Connection Editor} to create the JavaScript expressions for \e actions and \e assignments. An \e action connects - an object to a signal, whereas an \e assignment fetches property values - from another object. + an component to a signal, whereas an \e assignment fetches property values + from another component. For more information about the logical operators that you can use to construct conditional expressions, see \l {Summary of Logical Operators}. To create JavaScript expressions for actions: - \image qtquick-connection-editor-action.png - \list 1 - \li Select \uicontrol Action as the type of the connections object. - \li Select the object to connect to a signal. + \li Select \uicontrol {Open Connection Editor} in the context menu + in \uicontrol {Connections}. + \image qtquick-connection-editor-action.png + \li Select \uicontrol Action as the type of the connections component. + \li Select the component to connect to a signal. \li Select the action to perform when the signal is emitted. \endlist To create JavaScript expressions for assignments: - \image qtquick-connection-editor-assignment.png - \list 1 - \li Select \uicontrol Assignment as the type of the connections object. - \li Select the target object for the property assignment. - \li Select the property of the target object to assign a value to. - \li Select the source object for the property assignment. - \li Select the property of the source object to fetch the value from. + \li Select \uicontrol {Open Connection Editor} in the context menu + in \uicontrol {Connections}. + \image qtquick-connection-editor-assignment.png + \li Select \uicontrol Assignment as the type of the connections + component. + \li Select the target component for the property assignment. + \li Select the property of the target component to assign a value to. + \li Select the source component for the property assignment. + \li Select the property of the source component to fetch the value from. \endlist - - For an example of connecting the \c clicked signal of a button to a - \l{Adding States}{state}, see \l {Log In UI - Part 3}. - \endif */ diff --git a/doc/qtcreator/src/qtquick/qtquick-connection-editor.qdoc b/doc/qtcreator/src/qtquick/qtquick-connection-editor.qdoc index 732ae2beee6..2c3d6a15f15 100644 --- a/doc/qtcreator/src/qtquick/qtquick-connection-editor.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-connection-editor.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -30,43 +30,36 @@ \title Adding Connections - The user interface components and the application need to communicate with - each other. For example, a button needs to know that the user has clicked - on it. The button may then change color to indicate its state or perform an - action. Further, the application needs to know whether the user is clicking - the button, because it may need to relay this clicking event to other - applications. - - QML has a signal and handler mechanism, that enables components to respond - to application events. Events are represented by \e signals. When a signal - is emitted, the corresponding \e {signal handler} is invoked to respond to - the event by using scripts or other operations placed in the handler. - - To access a signal outside of the object that emits it, you can use the - \l Connections type for connecting to signals of arbitrary objects. A - Connections object can receive any signal from its specified target. - - A component's property can be assigned a static value which stays constant - until it is explicitly assigned a new value. However, to make the fullest - use of QML and its built-in support for dynamic object behaviors, most QML - types use property bindings. This means that you can specify relationships - between different object properties so that when a property's dependencies - change in value, the property's value is automatically updated accordingly. - - Behind the scenes, the QML engine monitors the property's dependencies (that - is, the variables in the binding expression). When a change is detected, the - QML engine re-evaluates the binding expression and applies the new result to - the property. - - The following sections describe how to use the \uicontrol {Connections} view - to perform the following tasks: - \list - \li \l{Connecting Objects to Signals} - \li \l{Specifying Dynamic Properties} + \li \l{Connecting Components to Signals} + + A signal and handler mechanism enables components to respond to + application events, which are represented by \e signals. When a + signal is emitted, the corresponding \e {signal handler} is + invoked to respond to the event by applying an action, for + example. + \li \l{Adding Bindings Between Properties} + + A component's property can be assigned a static value that stays + constant until it is explicitly changed. To make the UI more + dynamic, you can use \e {property bindings}. This means that you + can specify relationships between component properties so that when + the value of a property changes, the values of any properties that + are bound to it are automatically updated accordingly. + + \li \l{Specifying Dynamic Properties} + + Each preset component has a set of preset properties that you + can specify values for. You can add custom properties that would + not otherwise exist for a particular \l{Component Types} + {component type} or your custom components. + \if defined(qtcreator) \li \l{Managing C++ Backend Objects} + + Application developers can access QObject objects implemented in C++ + from QML files. \endif \endlist diff --git a/doc/qtcreator/src/qtquick/qtquick-connection-view.qdoc b/doc/qtcreator/src/qtquick/qtquick-connection-view.qdoc new file mode 100644 index 00000000000..5529ffa2de2 --- /dev/null +++ b/doc/qtcreator/src/qtquick/qtquick-connection-view.qdoc @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Creator 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 qtquick-connection-view.html + \previouspage qtquick-properties-view.html + \nextpage qtquick-states-view.html + + \title Connection View + + The \uicontrol {Connection View} is a collection of views that enable you + to create connections between components and the application, to bind + component properties together, and to add custom properties for components. + + \image qmldesigner-connections.png "Connections View" + + The \l{glossary-component}{components} of the application UI and the + application logic need to communicate with each other. For example, a + button needs to know that the user has clicked it. The button may then + change color to indicate its state or perform an action. Further, the + application needs to know whether the user clicked the button because + it may need to relay this clicking event to other applications. For + this purpose, a button typically contains a \l{Mouse Area} component, + which can receive different pointer events and emit \e signals in + response to them. + + Another way to connect components is to bind their \l{Properties} + {properties} together. A component's property can be assigned a static + value which stays constant until it is explicitly changed. To make the + UI more dynamic, you can use \e {property bindings}. This means that + you can specify relationships between component properties so that when + the value of a property changes, the values of any properties that are + bound to it are updated accordingly. + + Each preset component has a set of \l{Specifying Component Properties} + {preset properties} that you can specify values for. You can add + custom properties that would not otherwise exist for a particular + \l{Component Types}{component type}. + + \if defined(qtcreator) + In addition, application developers can use the \uicontrol Backends view + to access QObject objects implemented in C++ from QML files. + \endif + + \section1 Summary of Connection Views + + \table + \header + \li View + \li Purpose + \li Read More + \row + \li \uicontrol Connections + \li Create connections between components and the application logic + by accessing signals outside of the components that emit them. + \li \l{Connecting Components to Signals} + \row + \li \uicontrol Bindings + \li Dynamically change the behavior of a component by creating a + binding between the properties of two components. + \li \l{Adding Bindings Between Properties} + \row + \li \uicontrol Properties + \li Add custom properties that would not otherwise exist for a + particular preset component or your own custom component. + \li \l{Specifying Dynamic Properties} + \if defined(qtcreator) + \row + \li \uicontrol Backends + \li Access QObject objects implemented in C++ from QML files. + \li \l{Managing C++ Backend Objects} + \endif + \endtable +*/ diff --git a/doc/qtcreator/src/qtquick/qtquick-designer.qdoc b/doc/qtcreator/src/qtquick/qtquick-designer.qdoc index cab0701dfd5..7c79e441ade 100644 --- a/doc/qtcreator/src/qtquick/qtquick-designer.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-designer.qdoc @@ -89,9 +89,9 @@ \li Enables you to modify the properties of the selected component. \li \l {Specifying Component Properties} \row - \li \l{Adding Connections}{Connection View} + \li \l{Connection View} \li Enables you to add functionality to the UI by creating - connections between objects, signals, and object properties. + connections between components, signals, and component properties. \li \l{Adding Connections} \row \li \l{Adding States}{States} diff --git a/doc/qtcreator/src/qtquick/qtquick-navigator.qdoc b/doc/qtcreator/src/qtquick/qtquick-navigator.qdoc index e6eb7db95fc..59dcdad2997 100644 --- a/doc/qtcreator/src/qtquick/qtquick-navigator.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-navigator.qdoc @@ -26,7 +26,7 @@ /*! \page qtquick-navigator.html \previouspage quick-library.html - \nextpage qtquick-properties.html + \nextpage qtquick-properties-view.html \title Navigator diff --git a/doc/qtdesignstudio/examples/doc/loginui3.qdoc b/doc/qtdesignstudio/examples/doc/loginui3.qdoc index a0bc1d2294f..56a76bb73b2 100644 --- a/doc/qtdesignstudio/examples/doc/loginui3.qdoc +++ b/doc/qtdesignstudio/examples/doc/loginui3.qdoc @@ -186,7 +186,7 @@ is clicked within the area. You will now use the \uicontrol Connections view to - \l{Connecting Objects to Signals}{connect} the clicked signal of + \l{Connecting Components to Signals}{connect} the clicked signal of \e registerButton to \e registerState and that of \e backButton to \e loginState: diff --git a/doc/qtdesignstudio/examples/doc/sidemenu.qdoc b/doc/qtdesignstudio/examples/doc/sidemenu.qdoc index acc13538b81..ff69b48febf 100644 --- a/doc/qtdesignstudio/examples/doc/sidemenu.qdoc +++ b/doc/qtdesignstudio/examples/doc/sidemenu.qdoc @@ -205,8 +205,8 @@ The side menu is fully visible and accepts input only in the \e open state. - For more information about connecting objects to signals, see - \l {Connecting Objects to Signals}. + For more information about Connecting Components to Signals, see + \l {Connecting Components to Signals}. \section1 Applying Effects diff --git a/doc/qtdesignstudio/examples/doc/washingMachineUI.qdoc b/doc/qtdesignstudio/examples/doc/washingMachineUI.qdoc index 2bd8e7538b1..ed1d079fb3e 100644 --- a/doc/qtdesignstudio/examples/doc/washingMachineUI.qdoc +++ b/doc/qtdesignstudio/examples/doc/washingMachineUI.qdoc @@ -46,7 +46,7 @@ \endlist Users select buttons to navigate between the screens. - We use \l{Connecting Objects to Signals}{connections} to determine which + We use \l{Connecting Components to Signals}{connections} to determine which screen to open when users select a particular button and \l{Adding States} {States} to show the screens. We use the \l{Creating Animations}{timeline} to create progress indicators for buttons and the \e Running screen. @@ -234,7 +234,7 @@ We create similar connections between button objects and signals in the other screens to apply other actions that move users to other screens. - For more information, see \l {Connecting Objects to Signals}. + For more information, see \l {Connecting Components to Signals}. \section1 Showing the Current Time diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index fd69a3c30bb..4a1c0fcc2da 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -62,6 +62,7 @@ \li \l{Library} \li \l{Navigator} \li \l{Properties} + \li \l{Connection View} \li \l{Transition Editor} \li \l{Timeline} \li \l{Curve Editor} @@ -117,9 +118,9 @@ \endlist \li \l{Adding Connections} \list - \li\l{Connecting Objects to Signals} - \li\l{Specifying Dynamic Properties} + \li\l{Connecting Components to Signals} \li\l{Adding Bindings Between Properties} + \li\l{Specifying Dynamic Properties} \endlist \li \l{Adding States} \endlist From 47b569afa6673a003c654cf55ebc5b126331c89b Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 4 Mar 2021 13:24:10 +0100 Subject: [PATCH 10/21] Doc: Add a separate topic for the States view Replace occurrences of "item", "object", or "type" with "component" Task-number: QDS-3771 Change-Id: I92a78c0a714615cd51ada5459a9f4c1722103abd Reviewed-by: Thomas Hartmann --- doc/qtcreator/src/qtcreator-toc.qdoc | 1 + .../src/qtquick/qtquick-designer.qdoc | 2 +- .../src/qtquick/qtquick-states-view.qdoc | 103 ++++++++++++++++++ doc/qtcreator/src/qtquick/qtquick-states.qdoc | 78 ++++++------- .../src/qtdesignstudio-toc.qdoc | 1 + 5 files changed, 142 insertions(+), 43 deletions(-) create mode 100644 doc/qtcreator/src/qtquick/qtquick-states-view.qdoc diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 151bc150bf7..4a598ac7a45 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -97,6 +97,7 @@ \li \l{Navigator} \li \l{Properties} \li \l{Connection View} + \li \l{States} \li \l{Transition Editor} \li \l{Timeline} \li \l{Curve Editor} diff --git a/doc/qtcreator/src/qtquick/qtquick-designer.qdoc b/doc/qtcreator/src/qtquick/qtquick-designer.qdoc index 7c79e441ade..3ac6eb0353f 100644 --- a/doc/qtcreator/src/qtquick/qtquick-designer.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-designer.qdoc @@ -94,7 +94,7 @@ connections between components, signals, and component properties. \li \l{Adding Connections} \row - \li \l{Adding States}{States} + \li \l States \li Displays the different states that can be applied to a component. Typically, states describe UI configurations, such as the visibility and behavior of components and the available user diff --git a/doc/qtcreator/src/qtquick/qtquick-states-view.qdoc b/doc/qtcreator/src/qtquick/qtquick-states-view.qdoc new file mode 100644 index 00000000000..66179af77a1 --- /dev/null +++ b/doc/qtcreator/src/qtquick/qtquick-states-view.qdoc @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Creator 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 qtquick-states-view.html + \previouspage qtquick-connection-view.html + \nextpage qtquick-transition-editor.html + + \title States + + The \uicontrol States view displays the different \l{Adding States}{states} + of a UI. + + \image qmldesigner-transitions.png "States view" + + To open the \uicontrol States view, select \uicontrol View > + \uicontrol Views > \uicontrol States. + + To collapse or expand the \uicontrol States view, select: + + \list + \li Select \uicontrol View > \uicontrol Views > + \uicontrol {Toggle States}. + \li Press \key {Ctr+Alt+S} on Windows or \key {Cmd+Option+S} on \macOS. + \li Right-click the view and select \uicontrol Collapse or + \uicontrol Expand. + \endlist + + Initially, \uicontrol States displays a \e {base state} that shows the + selected \l{glossary-component}{component} in its initial state. To add + states, select \uicontrol {Create New State}. + + For more information, watch the following video: + + \youtube FzmLuRHQXaw + + \section1 Summary of States View Actions + + To open the \uicontrol Actions menu, select + \inlineimage icons/action-icon.png + . The actions available in the menu depend on the current context. For + example, the option for editing an annotation becomes available after + you add an annotation. + + \table + \header + \li Action + \li Purpose + \li Read More + \row + \li \uicontrol {Set when Condition} + \li Determines when a state should be applied. + \li \l{Applying States} + \row + \li \uicontrol {Reset when Condition} + \li Removes \c when condition for the state. + \li \l{Applying States} + \row + \li \uicontrol {Set as Default} + \li Sets the current state as the startup state of the application. + \li \l{Setting the Default State} + \row + \li\uicontrol {Reset Default} + \li Resets the current state as the default state. + \li \l{Setting the Default State} + \row + \li \uicontrol {Add Annotation} + \li Opens the \uicontrol {Annotation Editor} when you can add an + annotation for the states that you create. + \li \l{Annotating Designs} + \row + \li \uicontrol {Edit Annotation} + \li Opens the \uicontrol {Annotation Editor} where you can edit the + annotation for the state. + \li \l{Annotating Designs} + \row + \li \uicontrol {Add Annotation} + \li Removes the annotation for the state. + \li \l{Annotating Designs} + \endtable +*/ diff --git a/doc/qtcreator/src/qtquick/qtquick-states.qdoc b/doc/qtcreator/src/qtquick/qtquick-states.qdoc index f4ed8940e14..a79cda9becc 100644 --- a/doc/qtcreator/src/qtquick/qtquick-states.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-states.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -34,13 +34,13 @@ \title Adding States - User interfaces are designed to present different interface configurations - in different scenarios, or to modify their appearances in response to user + UIs are designed to present different UI configurations in different + scenarios, or to modify their appearances in response to user interaction. Often, there are a set of changes that are made concurrently, - such that the interface could be seen to be internally changing from one + such that the UI could be seen to be internally changing from one \e state to another. - This applies generally to interfaces regardless of their complexity. A photo + This applies generally to UIs regardless of their complexity. A photo viewer may initially present images in a grid, and when an image is clicked, change to a detailed state where the individual image is expanded and the interface is changed to present new options for image editing. At the other @@ -48,16 +48,16 @@ \e pressed state in which its color and position are modified so that it appears to be pressed down. - In QML, any item can change between different states to apply sets of - changes that modify the properties of relevant items. Each state can + Any component can change between different states to apply sets of + changes that modify the properties of relevant components. Each state can present a different configuration that can, for example: \list - \li Show some UI items and hide others. + \li Show some UI components and hide others. \li Present different available actions to the user. \li Start, stop, or pause animations. \li Execute some script required in the new state. - \li Change a property value for a particular item. + \li Change a property value for a particular component. \li Show a different view. \endlist @@ -65,24 +65,17 @@ \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}. + You can create states in the \l States view, by selecting + \uicontrol {Create New State}. \image qmldesigner-transitions.png "States view" - To add states, select \uicontrol {Create New State}. Click the new state to - switch to it in \uicontrol {Form Editor}, and then modify the properties of - components in \uicontrol Properties. + Click the new state to switch to it in \l {Form Editor}, and then modify the + properties of components in \l Properties. For example, to change the appearance of a button, you can hide the button image and show another image in its place. Or, to add movement to the view, - you can change the position of an object in \uicontrol {Form Editor} + you can change the position of a component in \uicontrol {Form Editor} and then add animation to the change between the states. The properties that you change in a state are highlighted with blue color. @@ -92,9 +85,8 @@ \image qmldesigner-states.png "States and Properties views" \note If you have \l{Locking Components}{locked a component} in - \uicontrol Navigator, and you attempt to remove states where you - change the values of its properties, you are prompted to confirm - the removal. + \l Navigator, and you attempt to remove states where you change the + values of its properties, you are prompted to confirm the removal. For more information, watch the following video: @@ -170,18 +162,18 @@ \section1 Using States - To keep the QML code clean, you should create a base state that contains all - the types you will need in the application. You can then create states, - in which you hide and show a set of items and modify their properties. + To keep the code clean, you should create a base state that contains all + the components you will need in the application. You can then create states, + in which you hide and show a set of components and modify their properties. This allows you to: \list - \li Align items on different views with each other. - \li Avoid excessive property changes. If an item is invisible in the - base state, you must define all changes to its child types as - property changes, which leads to complicated QML code. + \li Align components on different views with each other. + \li Avoid excessive property changes. If a component is invisible in + the base state, you must define all changes to its child components + as property changes, which leads to complicated code. \li Minimize the differences between the base state and the other states - to keep the QML code short and readable and to improve performance. + to keep the code short and readable and to improve performance. \li Avoid problems when using transitions and animation when changing states. \endlist @@ -191,18 +183,20 @@ \image qmldesigner-screen-design.png "Designing views" \list 1 - \li In the base state, add all items you will need in the application - (1). While you work on one view, you can click the + \li In the base state, add all components you will need in the + application (1). While you work on one view, you can click the \inlineimage eye_open.png - icon to hide items on the canvas that are not part of a view. - \li In \uicontrol States, click the empty slot to create a - new state and give it a name. For example, \c Normal. - \li In \uicontrol Properties (2), deselect the \uicontrol Visibility - check box or set \uicontrol Opacity to 0 for each item that is not - needed in this view. If you specify the setting for the parent item, - all child items inherit it and are also hidden. + icon in \l Navigator to hide components on the canvas that are + not part of a view. + \li In \uicontrol States, select \uicontrol {Create New State} to create + a new state and give it a name. For example, \c Normal. + \li In \l Properties (2), deselect the \uicontrol Visibility + check box or set \uicontrol Opacity to 0 for each component that + is not needed in this view. If you specify the setting for the + parent component, all child components inherit it and are also + hidden. \li Create additional states for each view and set the visibility - or opacity of the items in the view. + or opacity of the components in the view. \li To determine which state is applied when the application starts, select \uicontrol Actions > \uicontrol {Set as Default}. \endlist diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index 4a1c0fcc2da..d1461f8e2f4 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -63,6 +63,7 @@ \li \l{Navigator} \li \l{Properties} \li \l{Connection View} + \li \l{States} \li \l{Transition Editor} \li \l{Timeline} \li \l{Curve Editor} From f7d729f0b519aa17ec201ae76543185b92537d4b Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 3 Mar 2021 16:06:20 +0100 Subject: [PATCH 11/21] CMakePM: Treat empty build as empty when importing CMake builds Qt Creator 4.15 with the CMake multi-config support it parses the correct CMAKE_BUILD_TYPE file-api json export. With the empty build Qt Creator was giving it a name: Build, which was not part of the file-api json export. Fixes: QTCREATORBUG-25387 Change-Id: Id0b5f1077f6473fa5aef09397a8257b253557597 Reviewed-by: Eike Ziller --- src/plugins/cmakeprojectmanager/fileapireader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp index 0657782c980..ae3725e4a8c 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.cpp +++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp @@ -253,7 +253,7 @@ void FileApiReader::endState(const QFileInfo &replyFi) const FilePath sourceDirectory = m_parameters.sourceDirectory; const FilePath buildDirectory = m_parameters.workDirectory; const FilePath topCmakeFile = m_cmakeFiles.size() == 1 ? *m_cmakeFiles.begin() : FilePath{}; - const QString cmakeBuildType = m_parameters.cmakeBuildType; + const QString cmakeBuildType = m_parameters.cmakeBuildType == "Build" ? "" : m_parameters.cmakeBuildType; m_lastReplyTimestamp = replyFi.lastModified(); From 99dd3a02607e2325131412a296771ab3fdf10f4d Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Mon, 1 Mar 2021 20:18:08 +0100 Subject: [PATCH 12/21] CMakeProjectManager: expand variables for Batch Edit The Batch Edit dialog is offering the ability to use expanded variables, but these variables were not expanded upon acceptance. For the CMake command line they were expanded, but there was a conflict between what the settings dialog as value had and what CMake returned via file-api. Change-Id: Ia4a64e99676c43f7b182e059f9051393aa184c19 Reviewed-by: Alessandro Portale Reviewed-by: Eike Ziller --- .../cmakeprojectmanager/cmakebuildconfiguration.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 7b2d8eb5690..84ded757958 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -463,8 +463,14 @@ void CMakeBuildSettingsWidget::batchEditConfiguration() connect(buttons, &QDialogButtonBox::accepted, dialog, &QDialog::accept); connect(buttons, &QDialogButtonBox::rejected, dialog, &QDialog::reject); connect(dialog, &QDialog::accepted, this, [=]{ - const CMakeConfig config = CMakeConfigItem::itemsFromArguments( - editor->toPlainText().split('\n', Qt::SkipEmptyParts)); + const auto expander = m_buildConfiguration->macroExpander(); + + const QStringList lines = editor->toPlainText().split('\n', Qt::SkipEmptyParts); + const QStringList expandedLines = Utils::transform(lines, + [expander](const QString &s) { + return expander->expand(s); + }); + const CMakeConfig config = CMakeConfigItem::itemsFromArguments(expandedLines); m_configModel->setBatchEditConfiguration(config); }); From a3b537ad39b449d260fdf87d53c296f587f47785 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 10 Mar 2021 10:24:55 +0100 Subject: [PATCH 13/21] CMake build: Disable FakeVim and building with PCH with Qt 6 FakeVim does not compile on MSVC because Qt 6 doesn't like meta types that are recursive maps with keys that have a custom operator==. Building with PCH has different issues on macOS and MSVC. Change-Id: Id1b9580f7347f1c8facade67fd74532a023af41f Reviewed-by: Alessandro Portale Reviewed-by: hjk --- CMakeLists.txt | 6 +++++- src/plugins/fakevim/CMakeLists.txt | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d1db97b13ca..2d1b2a39d3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,6 @@ set(CMAKE_CXX_EXTENSIONS OFF) option(WITH_TESTS "Build Tests" OFF) add_feature_info("Build tests" ${WITH_TESTS} "") option(WITH_DEBUG_CMAKE "Enabled CMake project debugging functionality (e.g. source file disk checking)" OFF) -option(BUILD_WITH_PCH "Build with precompiled headers" ON) # merge binary directories of sub projects into top level set(QTC_MERGE_BINARY_DIR ON) @@ -50,10 +49,15 @@ find_package(Qt5 ) if (Qt5_VERSION VERSION_LESS 6.0.0) install(TARGETS Qt6Core5Compat EXPORT QtCreator) + set(BUILD_WITH_PCH_DEFAULT ON) +else() + set(BUILD_WITH_PCH_DEFAULT OFF) endif() find_package(Qt5 COMPONENTS LinguistTools QUIET) find_package(Qt5 COMPONENTS Designer DesignerComponents Help SerialPort Svg Tools QUIET) +option(BUILD_WITH_PCH "Build with precompiled headers" ${BUILD_WITH_PCH_DEFAULT}) + find_package(Threads) find_package(Clang QUIET) find_package(KF5SyntaxHighlighting QUIET) diff --git a/src/plugins/fakevim/CMakeLists.txt b/src/plugins/fakevim/CMakeLists.txt index ddb6f3c1f1e..b9bd8362ebe 100644 --- a/src/plugins/fakevim/CMakeLists.txt +++ b/src/plugins/fakevim/CMakeLists.txt @@ -1,4 +1,5 @@ add_qtc_plugin(FakeVim + CONDITION Qt5_VERSION VERSION_LESS 6.0.0 PLUGIN_DEPENDS Core TextEditor PLUGIN_TEST_DEPENDS CppEditor CppTools SOURCES ${TEST_SOURCES} From 50c0f0952d3b55e6c2bf4188090f210feddf061c Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 10 Mar 2021 13:48:28 +0100 Subject: [PATCH 14/21] QtSupport: Use native dir delimiter in "Link with Qt..." button tooltip Change-Id: I5b8def5abb16c965e5bec4ddd7b71e11fe4d9e57 Reviewed-by: Eike Ziller --- src/plugins/qtsupport/qtoptionspage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index b5a227f3010..5e1578a09e5 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -848,7 +848,7 @@ static bool canLinkWithQt(QString *toolTip) const QString link = installSettingsValue ? *installSettingsValue : QString(); if (!link.isEmpty()) tip << QtOptionsPageWidget::tr("%1 is currently linked to \"%2\".") - .arg(QString(Core::Constants::IDE_DISPLAY_NAME), link); + .arg(QString(Core::Constants::IDE_DISPLAY_NAME), QDir::toNativeSeparators(link)); if (toolTip) *toolTip = tip.join("\n\n"); return canLink; From 0af4f5152e7918d7e02823259482fe45b2c9c8f0 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 10 Mar 2021 17:36:53 +0100 Subject: [PATCH 15/21] Bump IDE_COPYRIGHT_YEAR to 2021 Change-Id: Iadb0f2618b02cd9f36366d718d50be7efcb5f679 Reviewed-by: Eike Ziller --- cmake/QtCreatorIDEBranding.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake index b9c7f5d4919..8b380e218ff 100644 --- a/cmake/QtCreatorIDEBranding.cmake +++ b/cmake/QtCreatorIDEBranding.cmake @@ -1,7 +1,7 @@ set(IDE_VERSION "4.14.2") # The IDE version. set(IDE_VERSION_COMPAT "4.14.0") # The IDE Compatibility version. set(IDE_VERSION_DISPLAY "4.14.2") # The IDE display version. -set(IDE_COPYRIGHT_YEAR "2020") # The IDE current copyright year. +set(IDE_COPYRIGHT_YEAR "2021") # The IDE current copyright year. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. set(IDE_COPY_SETTINGSVARIANT "Nokia") # The IDE settings to initially import. From f0004333b2f32971f8f4e2028054e136e7032562 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 10 Mar 2021 10:10:28 +0100 Subject: [PATCH 16/21] PE: Fix expectations of LinkSpecs test on Windows The output parser detects Windows paths on Unix differently which makes the format differ from the one that is generated on a Windows host. Beside this remove BOM from msvcparser again and do not perform the format check if there is no expected format specified. Amends 9e4e9924ad26c708. Change-Id: Icb0d292a8908cdd2f86b13fde6d2d287f3a96dd6 Reviewed-by: hjk --- src/plugins/projectexplorer/gccparser.cpp | 50 ++++++++++++++++--- src/plugins/projectexplorer/msvcparser.cpp | 2 +- .../projectexplorer/outputparser_test.cpp | 3 ++ 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/plugins/projectexplorer/gccparser.cpp b/src/plugins/projectexplorer/gccparser.cpp index 52bbfecd72a..33f820a34f1 100644 --- a/src/plugins/projectexplorer/gccparser.cpp +++ b/src/plugins/projectexplorer/gccparser.cpp @@ -389,6 +389,14 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() 8)) << QString(); + QVector formatRanges; + if (HostOsInfo::isWindowsHost()) { + formatRanges << formatRange(51, 28) + << formatRange(79, 31, "olpfile://C:/temp/test/untitled8/main.cpp::8::-1") + << formatRange(110, 54); + } else { + formatRanges << formatRange(51, 113); + } QTest::newRow("Undefined reference (debug)") << QString::fromLatin1("main.o: In function `main':\n" "C:\\temp\\test\\untitled8/main.cpp:8: undefined reference to `MainWindow::doSomething()'\n" @@ -402,12 +410,19 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "C:\\temp\\test\\untitled8/main.cpp:8: undefined reference to `MainWindow::doSomething()'", FilePath::fromUserInput("C:\\temp\\test\\untitled8/main.cpp"), 8, - QVector() - << formatRange(51, 113)) + formatRanges) << CompileTask(Task::Error, "collect2: ld returned 1 exit status")) << QString(); + formatRanges.clear(); + if (HostOsInfo::isWindowsHost()) { + formatRanges << formatRange(51, 28) + << formatRange(79, 31, "olpfile://C:/temp/test/untitled8/main.cpp::0::-1") + << formatRange(110, 65); + } else { + formatRanges << formatRange(51, 124); + } QTest::newRow("Undefined reference (release)") << QString::fromLatin1("main.o: In function `main':\n" "C:\\temp\\test\\untitled8/main.cpp:(.text+0x40): undefined reference to `MainWindow::doSomething()'\n" @@ -421,8 +436,7 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "C:\\temp\\test\\untitled8/main.cpp:(.text+0x40): undefined reference to `MainWindow::doSomething()'", FilePath::fromUserInput("C:\\temp\\test\\untitled8/main.cpp"), -1, - QVector() - << formatRange(51, 124)) + formatRanges) << CompileTask(Task::Error, "collect2: ld returned 1 exit status")) << QString(); @@ -654,6 +668,14 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() 54)) << QString(); + formatRanges.clear(); + if (HostOsInfo::isWindowsHost()) { + formatRanges << formatRange(46, 44) + << formatRange(90, 39, "olpfile://M:/Development/x64/QtPlot/qplotaxis.cpp::26::-1") + << formatRange(129, 50); + } else { + formatRanges << formatRange(46, 133); + } QTest::newRow("QTCREATORBUG-597") << QString::fromLatin1("debug/qplotaxis.o: In function `QPlotAxis':\n" "M:\\Development\\x64\\QtPlot/qplotaxis.cpp:26: undefined reference to `vtable for QPlotAxis'\n" @@ -668,8 +690,7 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "M:\\Development\\x64\\QtPlot/qplotaxis.cpp:26: undefined reference to `vtable for QPlotAxis'", FilePath::fromUserInput("M:\\Development\\x64\\QtPlot/qplotaxis.cpp"), 26, - QVector() - << formatRange(46, 133)) + formatRanges) << CompileTask(Task::Error, "undefined reference to `vtable for QPlotAxis'", FilePath::fromUserInput("M:\\Development\\x64\\QtPlot/qplotaxis.cpp"), @@ -708,6 +729,20 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() << formatRange(23, 85))) << QString(); + formatRanges.clear(); + if (HostOsInfo::isWindowsHost()) { + formatRanges << formatRange(33, 22) + << formatRange(55, 38, "olpfile://C:/Symbian_SDK/epoc32/include/e32cmn.h::6792::-1") + << formatRange(93, 29) + << formatRange(122, 38, "olpfile://C:/Symbian_SDK/epoc32/include/e32std.h::25::-1") + << formatRange(160, 5) + << formatRange(165, 40, "olpfile://C:/Symbian_SDK/epoc32/include/e32cmn.inl::0::-1") + << formatRange(205, 69) + << formatRange(274, 40, "olpfile://C:/Symbian_SDK/epoc32/include/e32cmn.inl::7094::-1") + << formatRange(314, 48); + } else { + formatRanges << formatRange(33, 329); + } QTest::newRow("GCCE from lines") << QString::fromLatin1("In file included from C:/Symbian_SDK/epoc32/include/e32cmn.h:6792,\n" " from C:/Symbian_SDK/epoc32/include/e32std.h:25,\n" @@ -723,8 +758,7 @@ void ProjectExplorerPlugin::testGccOutputParsers_data() "C:/Symbian_SDK/epoc32/include/e32cmn.inl:7094: warning: returning reference to temporary", FilePath::fromUserInput("C:/Symbian_SDK/epoc32/include/e32cmn.inl"), 7094, - QVector() - << formatRange(33, 329))} + formatRanges)} << QString(); QTest::newRow("In constructor 2") << QString::fromUtf8("perfattributes.cpp: In constructor ‘PerfEventAttributes::PerfEventAttributes()’:\n" diff --git a/src/plugins/projectexplorer/msvcparser.cpp b/src/plugins/projectexplorer/msvcparser.cpp index a0b1039f2b1..2ed0366902a 100644 --- a/src/plugins/projectexplorer/msvcparser.cpp +++ b/src/plugins/projectexplorer/msvcparser.cpp @@ -1,4 +1,4 @@ -/**************************************************************************** +/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index 65718f5a460..18e3a7ae19a 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -92,6 +92,9 @@ void OutputParserTester::testParsing(const QString &lines, msgFileComparisonFail(m_receivedTasks.at(i).file, tasks.at(i).file)); QCOMPARE(m_receivedTasks.at(i).line, tasks.at(i).line); QCOMPARE(static_cast(m_receivedTasks.at(i).type), static_cast(tasks.at(i).type)); + // Skip formats check if we haven't specified expected + if (tasks.at(i).formats.size() == 0) + continue; QCOMPARE(m_receivedTasks.at(i).formats.size(), tasks.at(i).formats.size()); for (int j = 0; j < tasks.at(i).formats.size(); ++j) { QCOMPARE(m_receivedTasks.at(i).formats.at(j).start, tasks.at(i).formats.at(j).start); From 8ac091abf8df9a0648e94df4755382f25dbb852f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 9 Mar 2021 18:12:47 +0100 Subject: [PATCH 17/21] CMake: Improve layout of "Apply configuration changes" dialog Show the CMake parameters that would be passed in a mono space font, one option per line. Change-Id: I462792736960b33fea669b5b753c89d21cd087fd Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 73c21babb9e..67cc7daa0b7 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -447,8 +447,9 @@ bool CMakeBuildSystem::mustApplyExtraArguments(const BuildDirParameters ¶met auto answer = QMessageBox::question(Core::ICore::mainWindow(), tr("Apply configuration changes?"), - tr("Run CMake with \"%1\"?") - .arg(parameters.extraCMakeArguments.join(" ")), + "

" + tr("Run CMake with configuration changes?") + + "

"
+                                            + parameters.extraCMakeArguments.join("\n") + "
", QMessageBox::Apply | QMessageBox::Discard, QMessageBox::Apply); return answer == QMessageBox::Apply; From ac5bffc1e4989e485c21c3515c84a90adfdd1873 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 10 Mar 2021 17:44:53 +0100 Subject: [PATCH 18/21] More bumping of the Copyright Year to 2021 Also for the qmake and qbs based build systems. Amends: 0af4f5152e7918d7e02823259482fe45b2c9c8f0 Change-Id: Ifcf1730d7b2b28dd9582d5b3569f50e3b7c91e07 Reviewed-by: Eike Ziller --- qbs/modules/qtc/qtc.qbs | 2 +- qtcreator_ide_branding.pri | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index c64025f67b4..0553724517d 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -17,7 +17,7 @@ Module { property string qtcreator_compat_version: ide_compat_version_major + '.' + ide_compat_version_minor + '.' + ide_compat_version_release - property string qtcreator_copyright_year: '2020' + property string qtcreator_copyright_year: '2021' property string qtcreator_copyright_string: "(C) " + qtcreator_copyright_year + " The Qt Company Ltd" property string ide_display_name: 'Qt Creator' diff --git a/qtcreator_ide_branding.pri b/qtcreator_ide_branding.pri index 614b2c15721..b6f68a4868d 100644 --- a/qtcreator_ide_branding.pri +++ b/qtcreator_ide_branding.pri @@ -1,7 +1,7 @@ QTCREATOR_VERSION = 4.14.2 QTCREATOR_COMPAT_VERSION = 4.14.0 QTCREATOR_DISPLAY_VERSION = 4.14.2 -QTCREATOR_COPYRIGHT_YEAR = 2020 +QTCREATOR_COPYRIGHT_YEAR = 2021 IDE_DISPLAY_NAME = Qt Creator IDE_ID = qtcreator From 2b5f7316ac1b2533d0ab6b2cc348e38e7d130a9e Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 11 Mar 2021 09:51:52 +0100 Subject: [PATCH 19/21] Tests: Work around problems in execution of dumper tests On several machines the QDir test interferes in a not yet known way and makes all following tests fail. Moving it to the end makes the problem vanish. Change-Id: Ic8e7fdaaf9581be0cdd5666c7d2f12a2e8ed80ee Reviewed-by: hjk --- tests/auto/debugger/tst_dumpers.cpp | 60 +++++++++++++++-------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 64fd5636661..8cf610bd281 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -2303,35 +2303,6 @@ void tst_Dumpers::dumper_data() // Value5("Tue Jan 1 13:15:32 1980 GMT"), "@QDateTime") % Optional(); -#ifdef Q_OS_WIN - QString tempDir = "C:/Program Files"; -#else - QString tempDir = "/tmp"; -#endif - auto quoted = [](const QString &str) { return QString('"' + str + '"'); }; - - QTest::newRow("QDir") - << Data("#include \n", - - "QDir dir(" + quoted(tempDir) + ");\n" - "QString s = dir.absolutePath();\n" - "QFileInfoList fil = dir.entryInfoList();\n" - "QFileInfo fi = fil.first();", - - "&dir, &s, &fi") - - + CoreProfile() - + QtVersion(0x50300) - - + Check("dir", quoted(tempDir), "@QDir") - // + Check("dir.canonicalPath", quoted(tempDir), "@QString") - + Check("dir.absolutePath", quoted(tempDir), "@QString") % Optional() - + Check("dir.entryInfoList.0", "[0]", quoted(tempDir + "/."), "@QFileInfo") % NoCdbEngine - + Check("dir.entryInfoList.1", "[1]", quoted(tempDir + "/.."), "@QFileInfo") % NoCdbEngine - + Check("dir.entryList.0", "[0]", "\".\"", "@QString") % NoCdbEngine - + Check("dir.entryList.1", "[1]", "\"..\"", "@QString") % NoCdbEngine; - - QTest::newRow("QFileInfo") #ifdef Q_OS_WIN << Data("#include \n" @@ -8176,6 +8147,37 @@ void tst_Dumpers::dumper_data() + Check("x.2", "[2]", "3", "NI"); #endif #endif + + +/* FIXME for unknown reasons the following test must be the last one to not interfere with the + dumper tests and make all following fail */ +#ifdef Q_OS_WIN + QString tempDir = "C:/Program Files"; +#else + QString tempDir = "/tmp"; +#endif + auto quoted = [](const QString &str) { return QString('"' + str + '"'); }; + + QTest::newRow("QDir") + << Data("#include \n", + + "QDir dir(" + quoted(tempDir) + ");\n" + "QString s = dir.absolutePath();\n" + "QFileInfoList fil = dir.entryInfoList();\n" + "QFileInfo fi = fil.first();", + + "&dir, &s, &fi") + + + CoreProfile() + + QtVersion(0x50300) + + + Check("dir", quoted(tempDir), "@QDir") + // + Check("dir.canonicalPath", quoted(tempDir), "@QString") + + Check("dir.absolutePath", quoted(tempDir), "@QString") % Optional() + + Check("dir.entryInfoList.0", "[0]", quoted(tempDir + "/."), "@QFileInfo") % NoCdbEngine + + Check("dir.entryInfoList.1", "[1]", quoted(tempDir + "/.."), "@QFileInfo") % NoCdbEngine + + Check("dir.entryList.0", "[0]", "\".\"", "@QString") % NoCdbEngine + + Check("dir.entryList.1", "[1]", "\"..\"", "@QString") % NoCdbEngine; } int main(int argc, char *argv[]) From 8f68cb9e75bb866aded211edd104bde00b64218e Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 11 Mar 2021 11:01:41 +0100 Subject: [PATCH 20/21] Doc: Fix broken navigation link Change-Id: I188d989380d51d993e00dab3f5ca6fe790e33ef2 Reviewed-by: Leena Miettinen --- doc/qtcreator/src/qtquick/qtquick-properties-view.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/qtcreator/src/qtquick/qtquick-properties-view.qdoc b/doc/qtcreator/src/qtquick/qtquick-properties-view.qdoc index 61c6312a5ab..39a6c1ef80d 100644 --- a/doc/qtcreator/src/qtquick/qtquick-properties-view.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-properties-view.qdoc @@ -26,7 +26,7 @@ /*! \page qtquick-properties-view.html \previouspage qtquick-navigator.html - \nextpage creator-project-managing-workspaces.html + \nextpage qtquick-connection-view.html \title Properties From e2112d68310965488e5640f810669580eb9ee57f Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Wed, 10 Mar 2021 23:49:03 +0300 Subject: [PATCH 21/21] Update Qbs submodule to the top of 1.18 branch Change-Id: Icc28aa5ac3c222a3a1bc3c018b59cb4ef73d1f6b 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 b9907900069..481c2a0a47d 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit b99079000697268bdf29c8ae09aa9fc02235edfc +Subproject commit 481c2a0a47d9c97bfa3d09869591e47e37f75c0b