From 618eda3572a2df97d28ffdf603daa35b509fbcf1 Mon Sep 17 00:00:00 2001 From: Samuel Ghinet Date: Wed, 23 Feb 2022 15:32:34 +0200 Subject: [PATCH] Implement custom presets Task-number: QDS-4989 Change-Id: I95844ae97204ad3bb94905c89f8e16b79eed8f64 Reviewed-by: Alessandro Portale --- .../newprojectdialog/NewProjectDialog.qml | 115 ++++--- .../newprojectdialog/image/style-basic.png | Bin 3891 -> 3642 bytes .../newprojectdialog/image/style-basic@2x.png | Bin 9643 -> 5661 bytes .../newprojectdialog/image/style-default.png | Bin 1617 -> 2222 bytes .../image/style-default@2x.png | Bin 4165 -> 4150 bytes .../newprojectdialog/image/style-fusion.png | Bin 2436 -> 3371 bytes .../image/style-fusion@2x.png | Bin 8903 -> 5328 bytes .../newprojectdialog/image/style-imagine.png | Bin 3598 -> 3527 bytes .../image/style-imagine@2x.png | Bin 8809 -> 5090 bytes .../newprojectdialog/image/style-macOs@2x.png | Bin 4165 -> 0 bytes .../newprojectdialog/image/style-macos.png | Bin 1617 -> 2222 bytes .../newprojectdialog/image/style-macos@2x.png | Bin 0 -> 4150 bytes .../image/style-material_dark.png | Bin 4033 -> 3406 bytes .../image/style-material_dark@2x.png | Bin 10919 -> 5410 bytes .../image/style-material_light.png | Bin 3780 -> 3588 bytes .../image/style-material_light@2x.png | Bin 9504 -> 5467 bytes .../image/style-universal_dark.png | Bin 3887 -> 3338 bytes .../image/style-universal_dark@2x.png | Bin 9579 -> 5417 bytes .../image/style-universal_light.png | Bin 2486 -> 3461 bytes .../image/style-universal_light@2x.png | Bin 9157 -> 5297 bytes .../image/style-universal_system.png | Bin 3395 -> 3354 bytes .../image/style-universal_system@2x.png | Bin 8527 -> 5172 bytes .../imports/NewProjectDialog/Details.qml | 180 ++++++---- .../imports/NewProjectDialog/DialogValues.qml | 48 ++- .../NewProjectDialog/NewProjectView.qml | 313 +++++++++++++----- .../imports/NewProjectDialog/PopupDialog.qml | 66 ++++ .../NewProjectDialog/PopupDialogButton.qml | 107 ++++++ .../NewProjectDialog/PopupDialogButtonBox.qml | 46 +++ .../imports/NewProjectDialog/Styles.qml | 182 +++++----- .../imports/NewProjectDialog/qmldir | 7 +- .../StudioControls/VerticalScrollBar.qml | 31 +- .../imports/StudioTheme/Values.qml | 2 + src/plugins/studiowelcome/CMakeLists.txt | 1 + src/plugins/studiowelcome/presetmodel.cpp | 139 ++++++-- src/plugins/studiowelcome/presetmodel.h | 114 ++++++- src/plugins/studiowelcome/qdsnewdialog.cpp | 186 +++++++++-- src/plugins/studiowelcome/qdsnewdialog.h | 28 +- src/plugins/studiowelcome/recentpresets.cpp | 86 +++-- src/plugins/studiowelcome/recentpresets.h | 58 +++- src/plugins/studiowelcome/studiowelcome.qbs | 4 +- src/plugins/studiowelcome/userpresets.cpp | 125 +++++++ src/plugins/studiowelcome/userpresets.h | 91 +++++ src/plugins/studiowelcome/wizardfactories.cpp | 23 +- src/plugins/studiowelcome/wizardfactories.h | 2 +- src/plugins/studiowelcome/wizardhandler.cpp | 82 ++++- src/plugins/studiowelcome/wizardhandler.h | 14 +- .../qml/qmldesigner/wizard/CMakeLists.txt | 2 + .../qmldesigner/wizard/presetmodel-test.cpp | 187 ++++++++++- .../qmldesigner/wizard/recentpresets-test.cpp | 148 ++++++--- .../qmldesigner/wizard/userpresets-test.cpp | 308 +++++++++++++++++ .../wizard/wizardfactories-test.cpp | 10 +- 51 files changed, 2218 insertions(+), 487 deletions(-) delete mode 100644 share/qtcreator/qmldesigner/newprojectdialog/image/style-macOs@2x.png create mode 100644 share/qtcreator/qmldesigner/newprojectdialog/image/style-macos@2x.png create mode 100644 share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialog.qml create mode 100644 share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialogButton.qml create mode 100644 share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialogButtonBox.qml create mode 100644 src/plugins/studiowelcome/userpresets.cpp create mode 100644 src/plugins/studiowelcome/userpresets.h create mode 100644 tests/auto/qml/qmldesigner/wizard/userpresets-test.cpp diff --git a/share/qtcreator/qmldesigner/newprojectdialog/NewProjectDialog.qml b/share/qtcreator/qmldesigner/newprojectdialog/NewProjectDialog.qml index 9176af9e34d..5d4d281ff86 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/NewProjectDialog.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/NewProjectDialog.qml @@ -32,6 +32,7 @@ import StudioTheme as StudioTheme import StudioControls as SC import NewProjectDialog +import BackendApi Item { id: rootDialog @@ -161,17 +162,43 @@ Item { readonly property int animDur: 500 id: tabBar x: 10 // left padding - width: parent.width - 64 // right padding + width: parent.width - 20 // right padding height: DialogValues.projectViewHeaderHeight color: DialogValues.lightPaneColor + function selectTab(tabIndex, selectLast = false) { + var item = repeater.itemAt(tabIndex) + tabBarRow.currIndex = tabIndex + + projectView.selectLast = selectLast + BackendApi.presetModel.setPage(tabIndex) // NOTE: it resets preset model + } + + Connections { + target: BackendApi + + function onUserPresetSaved() { + var customTabIndex = repeater.count - 1 + tabBar.selectTab(customTabIndex, true) + } + + function onLastUserPresetRemoved() { + tabBar.selectTab(0, false) + } + } + Row { id: tabBarRow spacing: 20 property int currIndex: 0 + readonly property string currentTabName: + repeater.count > 0 && repeater.itemAt(currIndex) + ? repeater.itemAt(currIndex).text + : '' Repeater { - model: categoryModel + id: repeater + model: BackendApi.categoryModel Text { text: name font.weight: Font.DemiBold @@ -184,13 +211,7 @@ Item { MouseArea { anchors.fill: parent onClicked: { - tabBarRow.currIndex = index - presetModel.setPage(index) - projectView.currentIndex = 0 - projectView.currentIndexChanged() - - strip.x = parent.x - strip.width = parent.width + tabBar.selectTab(index) } } @@ -199,8 +220,19 @@ Item { } // tabBarRow Rectangle { + function computeX() { + var item = tabBarRow.children[tabBarRow.currIndex] ?? tabBarRow.children[0] + return item.x; + } + + function computeWidth() { + var item = tabBarRow.children[tabBarRow.currIndex] ?? tabBarRow.children[0] + return item.width; + } + id: strip - width: tabBarRow.children[0].width + x: computeX() + width: computeWidth() height: 5 radius: 2 color: DialogValues.textColorInteraction @@ -209,35 +241,40 @@ Item { Behavior on x { SmoothedAnimation { duration: tabBar.animDur } } Behavior on width { SmoothedAnimation { duration: strip.width === 0 ? 0 : tabBar.animDur } } // do not animate initial width } - - Connections { - target: rootDialog - function onWidthChanged() { - if (rootDialog.width < 1200) { // 1200 = the width threshold - tabBar.width = tabBar.parent.width - 20 - projectView.width = projectView.parent.width - 20 - } else { - tabBar.width = tabBar.parent.width - 64 - projectView.width = projectView.parent.width - 64 - } - } - } } // Rectangle - NewProjectView { - id: projectView + Rectangle { + id: projectViewFrame x: 10 // left padding - width: parent.width - 64 // right padding + width: parent.width - 20 // right padding height: DialogValues.projectViewHeight - loader: projectDetailsLoader + color: DialogValues.darkPaneColor - Connections { - target: rootDialog - function onHeightChanged() { - if (rootDialog.height < 700) { // 700 = minimum height big dialog - projectView.height = DialogValues.projectViewHeight / 2 - } else { - projectView.height = DialogValues.projectViewHeight + Item { + anchors.fill: parent + anchors.margins: DialogValues.gridMargins + + NewProjectView { + id: projectView + anchors.fill: parent + + loader: projectDetailsLoader + currentTabName: tabBarRow.currentTabName + + Connections { + target: rootDialog + function onHeightChanged() { + if (rootDialog.height < 720) { // 720 = minimum height big dialog + DialogValues.projectViewHeight = + DialogValues.projectItemHeight + + 2 * DialogValues.gridMargins + } else { + DialogValues.projectViewHeight = + DialogValues.projectItemHeight * 2 + + DialogValues.gridSpacing + + 2 * DialogValues.gridMargins + } + } } } } @@ -247,12 +284,12 @@ Item { Text { id: descriptionText - text: dialogBox.projectDescription + text: BackendApi.projectDescription font.pixelSize: DialogValues.defaultPixelSize lineHeight: DialogValues.defaultLineHeight lineHeightMode: Text.FixedHeight leftPadding: 14 - width: projectView.width + width: projectViewFrame.width color: DialogValues.textColor wrapMode: Text.WordWrap maximumLineCount: 4 @@ -298,7 +335,7 @@ Item { iconFont: StudioTheme.Constants.font onClicked: { - dialogBox.reject(); + BackendApi.reject(); } } @@ -310,11 +347,11 @@ Item { visible: true buttonIcon: qsTr("Create") iconSize: DialogValues.defaultPixelSize - enabled: dialogBox.fieldsValid + enabled: BackendApi.fieldsValid iconFont: StudioTheme.Constants.font onClicked: { - dialogBox.accept(); + BackendApi.accept(); } } } // RowLayout diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-basic.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-basic.png index 389a4eab87371b660218d76f0795fbd464aebc83..d139d6e026638816cce9e0987028961abe5c1036 100644 GIT binary patch literal 3642 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 literal 3891 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 q1q!xK&jKsvSrI19i0{} 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 B3%&pV literal 9643 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 literal 1617 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 su$Df{mdKI;Vst07g(U+5i9m diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-fusion.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-fusion.png index 745828c1f7eb942d384e0f09a3c3aa45a668c21f..d196646855f2de24255803f0055a88d73f1f5c16 100644 GIT binary patch literal 3371 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 JF6*2UngArfOFRGo delta 2426 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 Hr-UW|7D=j^ literal 8903 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 WuQxyOiDzJ7VDNPHb6Mw<&;$Ti!{9Ig diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-imagine@2x.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-imagine@2x.png index c4ef9b7854dbaecc8435026c6d05a0b80ebf2481..34c41c3587fc99f58653c70f84b47e04fdf04f17 100644 GIT binary patch literal 5090 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 Zv%HLziA(&&CkzY>44$rjF6*2UngCmcp1uG8 literal 8809 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 RISdR844$rjF6*2UngDj!eq{gv diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-macOs@2x.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-macOs@2x.png deleted file mode 100644 index 09ea1ce94d5dcb8b0bbfc199aca2fc244567fe92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4165 zcmeAS@N?(olHy`uVBq!ia0y~yV4T3fz{JDBz`(%pZ^qKC3=9H1o-U3d6}R5rtqlqJ zKJ!2!Yv3Ziu+2F>nRi29XHCCytW9k8jk{NGsm1#5+Bo}&@8q=Ex#v8q&TL#Z`|dRr zb^U9(w|ZY+6G)!6s`>-#2UeG+9wlbu^B>gS8#8lsaPTxQ+QVslX#Vfr%*Q18pNrVs znaN$Z-#tCyfyC$EbE@B;IZ^z63wvwN6%z*rMHIv#;DCgfSOj2bLg4BD?D5s_DlDFV z`0#gI{;@m@g-@5<#Ed)?Dj&YyD#Rqe)kXE!yZL=J@1FPj-Pb+8E={qSZBy}+#g|v6 z3BIe(tbAIvu|UqAim z!b|rKi!WAwRPOLyeewjIa{UoE%M$oww?V{ z7!j4{vMBWTEB1+rr{isuxLnSpeV*K1RNnf2@_$b6#K=;Xi+wNu>uj8TMV))QO3Un{ zHjgK$DiuC?u&?&+o|o&h6_nPWu~qE1-;{lQ-Hfw3tKaQjqo3Km=graoF(Ldz%Y;C=Os`!{oc_d%c*|Ws#Z1@pl$`@!X#E_1c%iI;-mx43*Ds z+UDkd?B9HqBN`KCG=FlsvOj}=UTsm`lRv&;_bfmQ>&})FzfDpCw=|MwaahiGFV;eCw%exuhlj`b8BVw?J1r=&jzjB6{+|1 zUel^>rKxfbU)U`JpT@sDaeCsVw$=AmXK{agyJX3Ww1pzqP0Xru8eZ&g4f#F2_BZ!a z^V5GFv~1r!b8~27nDn-JL;sXF)o(7DmIlAj{mh*CR$wKQ3Wvh9lBW+ORu=ro%*4DitbX13o169i>B|?HFDA{3%MAFO$2xD4Q~vVZ@3Xe=UOwG*e!zr_ z#}=Ko`DSMtRB`yG^0$9Xn%|~PtMYc;#pIA@wdBdN;J4SkBENRBNapJ7Iul&6IA~o= zh{D=;$BrGFx63N`dFgSnARX3wLW2I1tL+v>gPksy`6@ttW}t%Jch%6?+V3A6Wd-g! zx=DA3DIC4Gj4x2ZuCwcsR(}=mqi>BF?9)D*GhXCQ*|IT%RVjSWR4EU~{i~OiF7Vi8 zovpXKMj`dyvR!)m3cL35Nv7)T^67OBUwz;2>+T(2qi$E0N;OV9*DW3sv{-KC&Rc=+ zv@}aZyU#9lh-vWA;Yhy7#+;~gt3aX0RhqYjfw2W|LFm9CFe^jg*%e;aLvwa5bU0S} zGw+gY$`#AfWfz^Jyk0gKXIBmo#pwdFNO1H{a0zwXQV&t*yRUztwWL&DX!- zSyxqeUlm(a7JWE8T2m!n-i{34zbA?7da? zAV*@w-hy0~BM*08y#HeB&0lv+r?Y!Sq|3&)_gF1o_jF44+}x>pD~mGwMZ-k0rTqd= zn~JB;z9^cKQ~c`g^zN?P>o@OnWRSc)rz-OL0f%(M*U};rHlAI1yTV#EgNS^BT#hve zKs3Nf(n~;aQHZR~*K0zHOy&7gN^LwU?;ajFfA*m|f7{zsL1)%Urs>yKT05#VoAOAW z(0>$`FIHK<^u&KX@t^%OT=QG!pNX8L>dCJkG4)6gn|#X2Z}qf%a1Kzh1t77G3|@b>jb7>eBzip4=$mePX}(YWVyA z4O@APPN;AG?5b02Z)NoM?cCGPJ%f&1>)-e6cIwQ<^Kbt4DUr*TOqrl=ma*Objza#L zj^71aPrMIbcT2S1NZro+(*EsVe!tXNDj2s?7+Pb10|+yKJFh0O9v3r2%GZfn`Flfm-rS&Ye$BPK@Vyp)W~zRAG3BepemdPO# znm1qJXvz$Gb%k9sgs}gUx#cSG&2Gr=Pc(HgDgX zxt{L=Bg@!5W+l!~wcYaetHsT|4z*u?*#B%ib7H#rzGaOvbN{JceP;iceJ*>7lf%8Z zpVzIQ6u7KA(WT3!QoYO5ul;9Z%J~rEU6JX_Zy7$BlIU2Zl)gIs>Bjp1Cr?j|ytR4F zis$xm((l-nvcup0`&#R+X4_$W;Be-R=3OU#shdob*NvU5GVQAS)646R@B6>@%$5q) zPvuJexnifePs`o3{W(8X_WSn@^3T^!p0Gc_{CA^_A*0YIqrN-e4Bkbne-F5JC#Ajr z@WeUV4H66gd~s&~SD~O9`&~GU!RXqjGtbY6{rzv;AfbcO)?-jaZtFR4AliBtPj`29 z&H8?#)ANsg{?>?PA}7|=9-sUu%rA;}va5A<=Sizp2fpq<-xw!e-zV{xxjV(qs{W_D z(s{SzK3&|~=H^M***fo@v7GP3J6n03x>&oeTh#?O&#Sy!Ir+U?blpac()ufQkE>_I zI9gYGesEBlrWd=VpnKcL<+j`Xk)Z2l^Bqm8s}dhWi5{ql|J`i8!W6aLJcpYvniiDRWno1(s-@i2etajW@u z58otVi;8*Hp$_+IK2I;?K4TyG=j7}x?w_A7dq%%Iee=iFTI=-xiF4|ME}UPJ$j7o$ zPfya_wT-p2zrX%XtItN8tv}@J|FkSw8~6 zTeHIP6(eWiawbQe;Kve1ou@f%s!tX=IK@7=>Ai`O^C$P$hRxF>7&$8?cRE^Eb1EcP zt(|9C^lg&y$(>9cihOTgwtri_dHNi)8^3M7f7&nc>?zyRH>wRjuRwJYBe-UQkkE#@ zb901n+y7FlhX${uxF$Sbyy%~g@7AZa{~9clesI-ymu*_<|IfSlMxE)GoouiJO}QyWuC*sdBg-`z)E zbw8UKsq}xJQ=`o1*y69I)688Io^^ZFnr2J9Ov`ab03T-EJ-tL>9o1bmL+aYLk%6|U8f|(4QfB&8OKj}+uIs<2E zWAJ&_FbAiYya!i``4k@KCi%+-B=WOZ1{*EB%dH?>J+E!kGlvOhCV8qDsXD$YWz~El zVRTQYQDM17Tg#4y&n8=}ELXJe%Gn)wKBZ{=J_DOa&lAlUg??@K%juvee2!@M`_h|i&oyOTAmwJC~d+eHq z7Xi2CzP@wk`OCc~ViR7~IF!7&A$$6c(UYt!`7F6^4uyjZFZV9WTleM0+tRhVrQdFO z^L?GTYh`|J8G{hlgmwF7J+!@^P<}pP@!{Jk+qZwed7FLr@85G9S{Rn(C2Y7}>!`Wq z#@p-GZ^PH$e*0I~)Va5;I^J4Akzu3ttaV@bx88c&yY}t%^|xQ=TfJhN>wE9px3XM& zHjfXETh>*)xo$J}o!{0<9+R!*H)rq7({*rScyw{zr)^a-%~|SKmpa^9|K0qiKF>;K zZ)ar%MTSEDZSh(1IorRN$L?BG7Wpk|eYox3SNkqLlG?-Lp-~n&y_&u1>ZR*(uQPWS zh1S;jR?EF9_*!EAaf^A%@d+DQJp%4oNfs{^b12bxz0T2(OTj9|lCR^S*~Hy7%>NSX z6n3SYwVDuZ8`t~UJ@^b$hu_@OUefuJ%W4=?KCyv1TktB8td1ABR%K-3=#_mU%|B`4 aulf^C%dGQiPlJXB7(8A5T-G@yGywntVQK~d diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-macos.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-macos.png index 6c50e4e1fa92bf90ac3506e9bd29067a579934f8..ceb573b339f1e7f71f3d15d721a05c9f2b765c35 100644 GIT binary patch delta 2211 zcmcb}vrce=ay>_>r;B4q#jUq@ZwE_Xmu3I($9?Y0Ew!(sC;J(DzS)ucMvBL*EXKK~ zuxDlO+ZhM@x`mw&9JL6(pA=lfx$&UIjPAVZbMtJgr+!;>_o^4i-3c6?R<*C4;SX2g2&-=B8>_wBoX{fM5+ zfB&wg#`-U1+hcduy}Z=y{@l%FnZn)uHa`+?FWkGl?&`kHOWU-b$KN%tdU5!){o5NC zKSg;Ya29P$%SfqCD2T4jiBGR@7nI=l%DZ=@?zz8nxy|=iaTdTb=$M zHFv(WuI<>fWqbEq6n`ww{jJ=h*zutxMBz_--iO0a5MMZ3>H|MHDF;+sn@d#e`lWeW%e#ah36#VB|5^GZo` zvFp70^UvJ;Xp)@F;;(Rc5o7(W`a`Q6S2(aXdd%`*owzZw`*?70Bd3qn=l7S^bpK7t z`}MUt{3)Zi2qdyN9JX<>iz8=l{%NX+BH^fNjco( zz_F<6ivL?dxt*+i|AX9(`dc!NUEuKNSh}Y}GE>k`-@U9k>B*nij#|;rM)mV1olkjG zCR81!XdT^=sHR|%Az3%m$gS+2Uz#wh`uwX)eGYjq-jW^NH_;(yi^q+g=r9|(BN~G9 zXM67Wxnr`Igys3OnU%-?cc0^EX;EJG+Cs%=!@47;&KHfhv zoqWJzk$DvSPgqjF2e$^TNpb@dS?0t@%dP zuA9Fkym9HDe=~WS?Anwv?vF0V>H@@Fnq0eXW(n%0{r?=lQ$knWBiMMlg;if$z9=e=`{CB$xh7^n`g>SP2Tn2d(O!j9Er!+ejClK z{X8$F{R|%>DKQaX&eP0%Ic>)jua;Dfz4pGYaVi^+e_vPBbw;P&p6y@zH?=je^os{VRLE;FMZR z-`>{U_ikSP@ta@jp2hV`;qm4Qn>hv5+LvBPUwmDjd;2@T-irqvCtfvF^4O!$wdus^ zNe-2sP0UIT3?K)$Xr7Q-_bpDeKBakm%CR{rZUv!=SM1mQ_Rny(&uH8beWFq%R8Xn> zPM_TT3BB6#FZOt-Mow9wa_MQ6lWBKKck9leRkH-P?*5t?`+wcLdEfN@{By{?eDPVq z?S<<1Cvt3=rCM>cDPC1Q$d-fCY>w^T^iBJ|zOj3Fpwqa1&zG{((bavm)^j*^1)i<% zI(u%aqN}>YDs#6hkL|1X6mNNVTdH`(Irs1 z!Snx)W#un^Ep7YO-@fa8Ip6#|sim)N+zJl9k6!8{5nlXjDc7_=itqXhch-FNsXyZV zdatmf(?g$=8-=g^;L_Dk5_NsE?=*(?uPxf9kD^3O`0v{3tXezwws&$TeiOXckAih zx56z{>vvuA6?rp7Yc~&<;I!3QY}%C@%Kl%C_I-cHqON4e-ptl@Td(?U z(xw>C(79XxtckOmsWFxPH6K-PZ|jGc)ZHpO{w1gE-R@nm zEX1o-+2*mpJeK9^YReC`RGzrC%{$>Dhd=|v6L*G*Cb=K$XBlUH)P51!%2B?%dR=x% z&=2WJMxQ#D1i2}e6nuYuce|VXpU@ju?eEox?6L8ad>eJl;rZ5Z{VVU^)&0$Q`!jeg zdwFq-Z^y0bW$TxJzuxYD_2|93^`E9DZ}rz$JYnDEzp?#Uv-0z^*X=IYwD#kZ;&tBz z59zZh`P9nIn9#m{;l|nZ$qUsh9&G#&Gn=>Rap#?G%f2c5*#x_d{7VSIijQ7#TDW1t+0ERZHBa~dZ+*1qXaAP(u9?#uJGR`|>QjEraLk@gg$vm3X#%;ackI(^-xWdn<% xcHFAXhc*dL`v@yx!8Jdmu$2L^6F2_jmcGs;pX@2`$-uzC;OXk;vd$@?2>^Gs3vmDd literal 1617 zcmeAS@N?(olHy`uVBq!ia0y~yU^v0Rz{tkIz`(%3x~$cRfq_lJ)5S5Q;?~={fBl8a zW!MY;PyQ`cRg8a_s@@pLeq-RhQHF2(w3LG zfAOS*iv51Y_4%*)U+>=jrpl!x?dK}@)jz9Qr}OB#zKNYETC(BXiQH9hmZ&dZv9@Td z<@)7ye<#M~IDUIEp?P-qyLXRy)XRi&bHu!Ffef_fQgxnJUe8r$uw|;oqQ`dbL~x4_KPp> zI8HY?C(|PBnbzRJd+CC=P*L+ivdd&2&FSdLd^kZU z@X*1QX59{7zdco=bJpH0?U3kpGyN-@wR}>?G1YAfVe9q9yso`jrNh1`+3Lu8EiWIw z&K}2qt8V_STOKbpEyHEf;cpiOuPwX3J-f`^BIS4!2Q=KkfrpPcVeRC%EN=hLuNs#p z{FcA-`)O4E>Ez38^VCi+oPVP=BzFCt!WV(14-Y@RE4p;MdHF^z!LZOZI}&%r@13@- zJX|E$S9|pYZTA;9j+#Dg&*q(9@_zS*r6CFB8=LKt<%)kXFRxW4KbKpVb-eFUQS$3!leX74W*f{c z%q%WkE}W#RTf3qCnxysq2d8*zICC|O>#lwJK6%c(EomyOg-c6&a`fM8XWh=J3HtDO zo63n!IyQ%&x0h?_A@cbvyff-PW@eUqAcGzV5mlCso9_x1lSA zeN+AWi)xR%o|SIpzb51NUAo}VrCX}r%`tZSbDzH5bNYJN-`PW8Rw4obvIHM%QPf(gHza~#}k69SL>^Wud7;gtewYs-n+bPtKUD4e81xs?C$&9 zH&}o3_G|yFr;6{((b)Yv(cSUv*F)Eg+7v^db-nugHhRU1XRq9sT|VQqZ(p*}eJ#zG zKexPjvGJRh^WFVx^IHFNO}ck>olO6(+&9iYUgXG%KAF+(Q9SkSgKF-`l<$r~LFZ@a zY&w~A-pVEB$zh|%#S;_@3oGmMb&ty&Irc|l5?D710VM2ywiVqv!m**B0B_&xI319s$uDyA}$LGeA zC(c|s^t%{-WfwLyFISR@`@+SG}B5a#bb|qXG*DGGb)nKp>|E1~@Xx`uYDw_IcUvVm^NR z{QqHZ+L)Ej=cgz%vrH1-7pJXQuu@g);`cu(PcHATsQ8t4bIYto9;p-OCieR+pXIvd z`4gA64oxLPf89;@KF_PFvG6-LH+X-@EA4a3o*1n-$nZ0<;>w%1lM3$NKQnJ%oS6UY z&u!ZZ4j$XA~{${(kd&V&duf)=FG1XVN}D?k*~CeLwj>r*~pRDa*xgFaIlToPD*sHCp)4*`#@e zCxj+iY$~qLzq{w<`V0jn{d2a8{dQZjudkb-%d`63>^18%n)kf<+2XO9$hba9tB1F- zw1t*WkTouwbIV3Oo8^eq&o+M*vtQRc^Yvp^n?+_8&%eFci|6*VugAU|=2=~*V5saK zd3%v^@_&D!BoU7@j+JJw;j$tl#WvcKm(U#VVJ3y)(Cd&~-D_$e$Z=Y}=JX zGuSv=7#Ld^6djNehkyeTVqy_MAh2r276wKaou5AMOaxBcyu8%3%sb8Qa5{&8_p-%4 zt2ezlGymTsru+Jr1dn8C?VtL0^Tbrub@%3_-PVY&xtFZ{NyP9>Ra45e-=$?0raK;P zv#ws($M$HeXeHxCVU_2srr6PYzji zq+D?`*ZRBPcNY2gS1(w4z4q~}8&$jRGOulT!9OYPW&F_(6T@b2-|jne%6*-wt7bn9 zdZ)W$mqyS_Mwj{t!lD1B_RZ;=Vixl?E;PF%Us=`FoO|hxWgBlMGrRmZU2<#xo7?j> z_D8;B4|-W>Zq6jcG9gF4rFKcm{Y~E2uQ)HN%9KZd{^b*{<#L@U9MXL&qFnyPVD8DR0joI4q$sss35Wt&^8yp4>HnWG+OWV&Y(g z=P4*7n4u-}VjELp)Ru(~$82V~hSwxh zret1BHNSf+c;fcweiMY$o!1zj$hf@dv<-9XtCbsrnOCk`FLFP4C)3ITkFCyoi$re8 zw3hm9w0zAa`Gu2JGB>JZ=JL&swqLJmPw2BNub+LZs?w@TYS)rw;Zo~5MJl|w_Rf8` zZ}r`G^WxZQogCd}i^V?M_`NgaZo#*Xz55-y_AXs|FKFUAh6%IzGWtyT%5 zOmk15X1Jc#gs}4Dd(yDd) zswO5uB^N_jZ$ zU%jk!fyXZEY`xtz3aR&&?b6d%*fqDk$4GbAnWcQiSM!(uioH{{_U#^zMDOQEx%E~C zdS|UGo3h)BEB0tov8I5yf-v`?Eg8*?2D-Nj6nwhPq`<`;G$NqIoq$3EDl)mKa3dHMJX`slXJu6W`CxfA%@=Q9N$k+M`q$h_miM0aT-~g~-@M;@ z%i1E{1@7CFo=sly{F}|!M1kL~_xHYAz4!UiXN6rR)wxrdTZ5jgOqlbP`QzE(?~Nt* z=PkF}bW&?&ZqBzArY^bLwy3^(c zO^3RYa*t|e?R@qq%Xn8)Pwu>`?@t#!`u4gfU%=s*ng8B3*$E3a&-lp8b>haemA5Ob zRWpdlC1`O%WVPi)v^HO_2`w^}$4@D=@u<8zc;Nc850lvse>3V>$aHd+@#`yd6(${& zXybV@y>RvRjy=1Bp43n8{*!)Yk@+G2XF4Y*Enyd5qfZCy(tHwls@n z{+YYw*PFfXji))X{j4b4*OB_J-F?~Koy9+GJiBguduU!WTc`L-aP|DIbICf*JfCi` zz5VDe{p6}>q5K-LpNCI{?tbL|>`1!jukX|UDa>7Ha%iR%w5-CBCniMbhB@>so)}xT z@NtvsZJrKABk$xKV8XsTX?nj@Oqtz?#tI4pSkVY z?URy=n`GupUHtFe8Lzp&6j;~(6OG{IQi`v2e{wy3a*yeEz58n$Q*>?BpDmr4*&txEf47fX z3qRkd&R?&e`dj9*#J*71rH!k1Fsoc%p&oYidsNtDMnUf2`|B?#X$T zI<~bpqbJ{4yy*?!1e3#ZskR&bPPMqX*P-^y3;W-VXHHBH-@mX?X6`@HtJCcN_MT%l zQdG!a_vf{2k%dxt%F!^^Nw#-YmLLA(uqi#QBW3Q~tltxY+gML_&RN@cD*6Az$Kpzx zw=7<>BHb=Z`W?GccKF-6xAT-I%N>z?@X+LqUu??XWU15r)7N`+v*Q zqV_QTte)t;t>fv?bIzIXJ}~n|NF9Snca4+*3@= zZ$5lnpz@qc!A-;d?}bKx{v}IZ*B#_?I2JYU=bW31{@1e!G_#^K@)TIWr5?Pg2ajr_ zs>;B?z|V44hMoVPuN6Bzg=yy2_Z2~RPI<0Q+>{ZnZy32;;6&oY`*+npeVV?wK4apU z_UHQl15$!Z&MeuHc>87B!_&rFx+`Bbyt()J-=pv+hga-npZ+)I(L9TvWm}$3?+*Iz z{?>S3`$^F)tEaQ@t0cX=Kem-HZ=SjX? zCgZuge)mPkA|~~D&;3LvT#x@BdWY$=zj*zhT~W^aex+QxR$XLPS9|~5&3c*Vu4wsU>m~1j@Apju@GKQ=GhG&Vkj_W!P1&u*U6Gk)AMN{tEV(y+^n_PMki$ zd+VwH;l)O03d@{BJp%KP@n&P?R%_x<&L zX8i>Rxyb1@+p5=HYH2=WqxVd*{qp7gKedZ*)J^ow7U|G@lu`9-({{;w0S#xork`Jy zxjmxxoQ<*f6ZfX*vX*0i}@R3U;t}$YM{JyN^Gad^+maFhiIm@^4kI9$s zF{Y1Njhm{M+Tyh(`-G2X8>jQF*udU2M|0+deH;qH)pOf6J#(0FW|F6hk*edX zQdZ3rd82zejS9gLM!T{*i0*Qb1PwKcSP^gPjwQRvrpzr5}zX&

MegE0>-q9tUpyZJ(X#Z`_1y# ziQ?J{R#VEJTbO^ZtkUmgU1B9KAZt~2++aJ;&RMtGXB}5!@-T3yTEC)Q+qSGaHrspd z-fxqfYnRBqik>ao(89E2_4>4m)227>8sB*F!R+SSx3%BC9enq%PF+EfVWqUho6`6I zF5R-v?|n94@!fmZ`8+rr-t;Zg{_DK9tU5XS_t)3oe$DRN<(NKs``*2= zxBD1{Y6RA5%l$U>U%oqdtsJxO+t_bu>!Z0R2sBh|alRMUpB#|8WS5A?@2~&Vezz)a zP0q|+D;F8xCK+eD_FV{)umj$=nkb>?t*R=B3;4BH&tV^BfU}k`qNT0?lic%73!` zIauRRa&lIw!uF~?QqTLB&0rOnYc+kU**znlpG+s7@S=3795|4=R4f8a@Lm;|L8vp9 bvgzCZR3r99yf<9fKm!7vu6{1-oD!M<>_~M? literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-material_dark.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-material_dark.png index 515f5e0b8e4d7f4556b46d24114fe018aa7f3c19..cf7891232a9a52d0356ddd01f3094e2383291524 100644 GIT binary patch literal 3406 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 JWt~$(695vUDE9yW literal 4033 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 diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-material_dark@2x.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-material_dark@2x.png index 1967a363dc0442a5f060d9941df73c53b5247872..b353dfa6d9d5f3a563c14a2a7d477fc647ef2743 100644 GIT binary patch literal 5410 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

lp{I)^oyjRXH-RD(};Z9Q{Vui@KOt@4Ma9U3bjQ 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 diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-material_light@2x.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-material_light@2x.png index 03c1ae660371485ddcc6b4fc50e3b3b93f0a3aa3..2d3c7c53b6bac0d4454f1710627c2e2f79ffb347 100644 GIT binary patch literal 5467 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 K&t;ucLK6T8UghKf diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-universal_dark.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-universal_dark.png index 339342bd913366419260329a356125363cb85e84..9a9988e91d64db18afd94128bb2f60d09e0f94e1 100644 GIT binary patch literal 3338 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 literal 3887 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 diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-universal_dark@2x.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-universal_dark@2x.png index 2ec60f0453c118761d9d2ed782395bf6ba56af99..bd778aaa071467fdbf27d39451f83aaa22405a87 100644 GIT binary patch literal 5417 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 WRri*@%Vc0+VDNPHb6Mw<&;$T_D#g11 literal 9579 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 delta 2477 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 Qfq{X+)78&qol`;+0CSy~UjP6A diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-universal_light@2x.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-universal_light@2x.png index 22e200c0d70c575cb58746874e6b3e8efd6d8399..80239a95a80776f154fb545c2ee1ae53027986fb 100644 GIT binary patch literal 5297 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 AC;$Ke diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-universal_system.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-universal_system.png index 65fbae504ff0cab00516f3b3e1a2fef051915d2e..08872abd229c3bc4637b1762805fd58e78e2823b 100644 GIT binary patch literal 3354 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 B(eD5N literal 3395 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 diff --git a/share/qtcreator/qmldesigner/newprojectdialog/image/style-universal_system@2x.png b/share/qtcreator/qmldesigner/newprojectdialog/image/style-universal_system@2x.png index 5d05168537dfd6781f6d712aafa4bb4b2c2cb047..5b06ca298744938c13377d07f2effdf1dae40c61 100644 GIT binary patch literal 5172 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 FO#qjYQNREI diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml index d5c37651dce..97a5ac2bf9e 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Details.qml @@ -31,16 +31,13 @@ import QtQuick.Layouts import StudioControls as SC import StudioTheme as StudioTheme +import BackendApi + Item { width: DialogValues.detailsPaneWidth - Component.onCompleted: { - dialogBox.detailsLoaded = true; - } - - Component.onDestruction: { - dialogBox.detailsLoaded = false; - } + Component.onCompleted: BackendApi.detailsLoaded = true + Component.onDestruction: BackendApi.detailsLoaded = false Rectangle { color: DialogValues.darkPaneColor @@ -53,13 +50,13 @@ Item { Column { anchors.fill: parent - spacing: DialogValues.defaultPadding + spacing: 5 Text { id: detailsHeading text: qsTr("Details") height: DialogValues.paneTitleTextHeight - width: parent.width; + width: parent.width font.weight: Font.DemiBold font.pixelSize: DialogValues.paneTitlePixelSize lineHeight: DialogValues.paneTitleLineHeight @@ -71,39 +68,36 @@ Item { Flickable { width: parent.width height: parent.height - detailsHeading.height - DialogValues.defaultPadding - + - savePresetButton.height contentWidth: parent.width contentHeight: scrollContent.height boundsBehavior: Flickable.StopAtBounds clip: true - ScrollBar.vertical: SC.VerticalScrollBar { - } + ScrollBar.vertical: SC.VerticalScrollBar {} Column { id: scrollContent width: parent.width - DialogValues.detailsPanePadding - height: DialogValues.detailsScrollableContentHeight spacing: DialogValues.defaultPadding SC.TextField { id: projectNameTextField actionIndicatorVisible: false translationIndicatorVisible: false - text: dialogBox.projectName + text: BackendApi.projectName width: parent.width color: DialogValues.textColor selectByMouse: true + font.pixelSize: DialogValues.defaultPixelSize onEditingFinished: { text = text.charAt(0).toUpperCase() + text.slice(1) } - - font.pixelSize: DialogValues.defaultPixelSize } Binding { - target: dialogBox + target: BackendApi property: "projectName" value: projectNameTextField.text } @@ -118,14 +112,14 @@ Item { id: projectLocationTextField actionIndicatorVisible: false translationIndicatorVisible: false - text: dialogBox.projectLocation + text: BackendApi.projectLocation color: DialogValues.textColor selectByMouse: true font.pixelSize: DialogValues.defaultPixelSize } Binding { - target: dialogBox + target: BackendApi property: "projectLocation" value: projectLocationTextField.text } @@ -138,7 +132,7 @@ Item { iconFont: StudioTheme.Constants.font onClicked: { - var newLocation = dialogBox.chooseProjectLocation() + var newLocation = BackendApi.chooseProjectLocation() if (newLocation) projectLocationTextField.text = newLocation } @@ -159,7 +153,7 @@ Item { Text { id: statusMessage - text: dialogBox.statusMessage + text: BackendApi.statusMessage font.pixelSize: DialogValues.defaultPixelSize lineHeight: DialogValues.defaultLineHeight lineHeightMode: Text.FixedHeight @@ -172,7 +166,7 @@ Item { states: [ State { name: "warning" - when: dialogBox.statusType === "warning" + when: BackendApi.statusType === "warning" PropertyChanges { target: statusMessage color: DialogValues.textWarning @@ -185,7 +179,7 @@ Item { State { name: "error" - when: dialogBox.statusType === "error" + when: BackendApi.statusType === "error" PropertyChanges { target: statusMessage color: DialogValues.textError @@ -208,7 +202,7 @@ Item { } Binding { - target: dialogBox + target: BackendApi property: "saveAsDefaultLocation" value: defaultLocationCheckbox.checked } @@ -219,25 +213,25 @@ Item { id: screenSizeComboBox actionIndicatorVisible: false currentIndex: -1 - model: screenSizeModel + model: BackendApi.screenSizeModel textRole: "display" width: parent.width font.pixelSize: DialogValues.defaultPixelSize onActivated: (index) => { - dialogBox.setScreenSizeIndex(index); + BackendApi.setScreenSizeIndex(index); - var size = screenSizeModel.screenSizes(index); + var size = BackendApi.screenSizeModel.screenSizes(index); widthField.realValue = size.width; heightField.realValue = size.height; } Connections { - target: screenSizeModel + target: BackendApi.screenSizeModel function onModelReset() { var newIndex = screenSizeComboBox.currentIndex > -1 ? screenSizeComboBox.currentIndex - : dialogBox.screenSizeIndex() + : BackendApi.screenSizeIndex() screenSizeComboBox.currentIndex = newIndex screenSizeComboBox.activated(newIndex) @@ -248,10 +242,8 @@ Item { GridLayout { // orientation + width + height width: parent.width height: 85 - columns: 4 rows: 2 - columnSpacing: 10 rowSpacing: 10 @@ -295,10 +287,7 @@ Item { font.pixelSize: DialogValues.defaultPixelSize onRealValueChanged: { - var height = heightField.realValue - var width = realValue - - if (width >= height) + if (widthField.realValue >= heightField.realValue) orientationButton.setHorizontal() else orientationButton.setVertical() @@ -306,7 +295,7 @@ Item { } // Width Text Field Binding { - target: dialogBox + target: BackendApi property: "customWidth" value: widthField.realValue } @@ -323,10 +312,7 @@ Item { font.pixelSize: DialogValues.defaultPixelSize onRealValueChanged: { - var height = realValue - var width = widthField.realValue - - if (width >= height) + if (widthField.realValue >= heightField.realValue) orientationButton.setHorizontal() else orientationButton.setVertical() @@ -334,7 +320,7 @@ Item { } // Height Text Field Binding { - target: dialogBox + target: BackendApi property: "customHeight" value: heightField.realValue } @@ -345,7 +331,6 @@ Item { id: orientationButton implicitWidth: 100 implicitHeight: 50 - checked: false hoverEnabled: false background: Rectangle { @@ -384,19 +369,19 @@ Item { onClicked: { if (widthField.realValue && heightField.realValue) { - [widthField.realValue, heightField.realValue] = [heightField.realValue, widthField.realValue]; - checked = !checked + [widthField.realValue, heightField.realValue] = [heightField.realValue, widthField.realValue] + orientationButton.checked = !orientationButton.checked } } function setHorizontal() { - checked = false + orientationButton.checked = false horizontalBar.color = DialogValues.textColorInteraction verticalBar.color = "white" } function setVertical() { - checked = true + orientationButton.checked = true horizontalBar.color = "white" verticalBar.color = DialogValues.textColorInteraction } @@ -404,23 +389,27 @@ Item { } // GridLayout: orientation + width + height - Rectangle { width: parent.width; height: 1; color: DialogValues.dividerlineColor } + Rectangle { + width: parent.width + height: 1 + color: DialogValues.dividerlineColor + } SC.CheckBox { id: useQtVirtualKeyboard actionIndicatorVisible: false text: qsTr("Use Qt Virtual Keyboard") font.pixelSize: DialogValues.defaultPixelSize - checked: dialogBox.useVirtualKeyboard - visible: dialogBox.haveVirtualKeyboard + checked: BackendApi.useVirtualKeyboard + visible: BackendApi.haveVirtualKeyboard } RowLayout { // Target Qt Version width: parent.width - visible: dialogBox.haveTargetQtVersion + visible: BackendApi.haveTargetQtVersion Text { - text: "Target Qt Version:" + text: qsTr("Target Qt Version:") font.pixelSize: DialogValues.defaultPixelSize lineHeight: DialogValues.defaultLineHeight lineHeightMode: Text.FixedHeight @@ -432,33 +421,98 @@ Item { actionIndicatorVisible: false implicitWidth: 70 Layout.alignment: Qt.AlignRight - currentIndex: 1 + currentIndex: BackendApi.targetQtVersionIndex font.pixelSize: DialogValues.defaultPixelSize model: ListModel { - ListElement { - name: "Qt 5" - } - ListElement { - name: "Qt 6" - } + ListElement { name: "Qt 5" } + ListElement { name: "Qt 6" } } onActivated: (index) => { - dialogBox.setTargetQtVersion(index) + BackendApi.targetQtVersionIndex = index } } // Target Qt Version ComboBox + + Binding { + target: BackendApi + property: "targetQtVersionIndex" + value: qtVersionComboBox.currentIndex + } + } // RowLayout Binding { - target: dialogBox + target: BackendApi property: "useVirtualKeyboard" value: useQtVirtualKeyboard.checked } } // ScrollContent Column } // ScrollView - } // Column + + SC.AbstractButton { + id: savePresetButton + width: StudioTheme.Values.singleControlColumnWidth + buttonIcon: qsTr("Save Custom Preset") + iconFont: StudioTheme.Constants.font + iconSize: DialogValues.defaultPixelSize + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + + onClicked: savePresetDialog.open() + } + + PopupDialog { + id: savePresetDialog + title: qsTr("Save Preset") + standardButtons: Dialog.Save | Dialog.Cancel + modal: true + closePolicy: Popup.CloseOnEscape + anchors.centerIn: parent + width: DialogValues.popupDialogWidth + + onAccepted: BackendApi.savePresetDialogAccept() + + onOpened: { + presetNameTextField.selectAll() + presetNameTextField.forceActiveFocus() + } + + ColumnLayout { + width: parent.width + spacing: 10 + + Text { + text: qsTr("Preset name") + font.pixelSize: DialogValues.defaultPixelSize + color: DialogValues.textColor + } + + SC.TextField { + id: presetNameTextField + actionIndicatorVisible: false + translationIndicatorVisible: false + text: qsTr("MyPreset") + color: DialogValues.textColor + font.pixelSize: DialogValues.defaultPixelSize + Layout.fillWidth: true + maximumLength: 30 + validator: RegularExpressionValidator { regularExpression: /\w[\w ]*/ } + + onEditingFinished: { + presetNameTextField.text = text.trim() + presetNameTextField.text = text.replace(/\s+/g, " ") + } + } + + Binding { + target: BackendApi + property: "presetName" + value: presetNameTextField.text + } + } + } } // Item - } -} + } // Rectangle +} // root Item diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/DialogValues.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/DialogValues.qml index ae26727e07b..7c11f231fc7 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/DialogValues.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/DialogValues.qml @@ -29,39 +29,57 @@ import QtQml import StudioTheme as StudioTheme QtObject { + id: root + readonly property int dialogWidth: 1522 readonly property int dialogHeight: 940 readonly property int projectViewMinimumWidth: 600 - readonly property int projectViewMinimumHeight: projectViewHeight - readonly property int dialogContentHeight: projectViewHeight + 300 // i.e. dialog without header and footer - readonly property int loadedPanesWidth: detailsPaneWidth + stylesPaneWidth - readonly property int detailsPaneWidth: 330 + detailsPanePadding * 2 + readonly property int projectViewMinimumHeight: root.gridCellHeight + readonly property int dialogContentHeight: root.projectViewHeight + 300 // i.e. dialog without header and footer + readonly property int loadedPanesWidth: root.detailsPaneWidth + root.stylesPaneWidth + readonly property int detailsPaneWidth: 330 + root.detailsPanePadding * 2 readonly property int dialogTitleTextHeight: 85 readonly property int paneTitleTextHeight: 47 readonly property int logoWidth: 85 readonly property int logoHeight: 85 - /* detailsScrollableContentHeight - the full height that may need to be scrolled to be fully - visible, if the dialog box is too small. */ - readonly property int detailsScrollableContentHeight: 428 - readonly property int stylesPaneWidth: styleImageWidth + stylesPanePadding * 2 + styleImageBorderWidth * 2 // i.e. 240px + readonly property int stylesPaneWidth: root.styleImageWidth + root.stylesPanePadding * 2 + + root.styleImageBorderWidth * 2 // i.e. 240px readonly property int detailsPanePadding: 18 readonly property int stylesPanePadding: 18 readonly property int defaultPadding: 18 readonly property int dialogLeftPadding: 35 + readonly property int styleListItemHeight: root.styleImageHeight + root.styleTextHeight + + 2 * root.styleImageBorderWidth + + root.styleListItemBottomMargin + + root.styleListItemSpacing + readonly property int styleListItemBottomMargin: 10 + readonly property int styleListItemSpacing: 4 readonly property int styleImageWidth: 200 + readonly property int styleImageHeight: 262 readonly property int styleImageBorderWidth: 2 + readonly property int styleTextHeight: 18 + readonly property int footerHeight: 73 - readonly property int projectItemWidth: 90 - readonly property int projectItemHeight: 144 - readonly property int projectViewHeight: projectItemHeight * 2 + readonly property int projectItemWidth: 136 + readonly property int projectItemHeight: 110 + property int projectViewHeight: root.projectItemHeight * 2 + root.gridSpacing + root.gridMargins * 2 readonly property int projectViewHeaderHeight: 38 + readonly property int gridMargins: 20 + readonly property int gridCellWidth: root.projectItemWidth + root.gridSpacing + readonly property int gridCellHeight: root.projectItemHeight + root.gridSpacing + readonly property int gridSpacing: 2 + readonly property int dialogButtonWidth: 100 - readonly property int loadedPanesHeight: dialogContentHeight - readonly property int detailsPaneHeight: dialogContentHeight + // This is for internal popup dialogs + readonly property int popupDialogWidth: 270 + readonly property int popupDialogPadding: 12 + + readonly property int loadedPanesHeight: root.dialogContentHeight + readonly property int detailsPaneHeight: root.dialogContentHeight readonly property string darkPaneColor: StudioTheme.Values.themeBackgroundColorNormal readonly property string lightPaneColor: StudioTheme.Values.themeBackgroundColorAlternate @@ -71,6 +89,8 @@ QtObject { readonly property string dividerlineColor: StudioTheme.Values.themeTextColorDisabled readonly property string textError: StudioTheme.Values.themeError readonly property string textWarning: StudioTheme.Values.themeWarning + readonly property string presetItemBackgroundHover: StudioTheme.Values.themeControlBackgroundGlobalHover + readonly property string presetItemBackgroundHoverInteraction: StudioTheme.Values.themeControlBackgroundInteraction readonly property real defaultPixelSize: 14 readonly property real defaultLineHeight: 21 @@ -91,6 +111,6 @@ QtObject { item and spacing after it). So we have to subtract 2 x layout spacing before setting our own, narrower, spacing. */ - return -layoutSpacing -layoutSpacing + value + return -layoutSpacing - layoutSpacing + value } } diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml index e011057892b..997260747b3 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/NewProjectView.qml @@ -28,111 +28,252 @@ import QtQuick.Controls import QtQuick import QtQuick.Layouts +import StudioControls as SC import StudioTheme as StudioTheme -GridView { - id: projectView +import BackendApi + +ScrollView { + id: scrollView required property Item loader + required property string currentTabName - cellWidth: DialogValues.projectItemWidth - cellHeight: DialogValues.projectItemHeight - clip: true + property string backgroundHoverColor: DialogValues.presetItemBackgroundHover - boundsBehavior: Flickable.StopAtBounds + // selectLast: if true, it will select last item in the model after a model reset. + property bool selectLast: false - children: [ - Rectangle { - color: DialogValues.darkPaneColor - anchors.fill: parent - z: -1 - } - ] - - model: presetModel - - // called by onModelReset and when user clicks on an item, or when the header item is changed. - onCurrentIndexChanged: { - dialogBox.selectedPreset = projectView.currentIndex - var source = dialogBox.currentPresetQmlPath() - loader.source = source + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + ScrollBar.vertical: SC.VerticalScrollBar { + parent: scrollView + x: scrollView.width + (DialogValues.gridMargins + - StudioTheme.Values.scrollBarThickness) * 0.5 + y: scrollView.topPadding + height: scrollView.availableHeight } - Connections { - target: presetModel + contentWidth: gridView.contentItem.childrenRect.width + contentHeight: gridView.contentItem.childrenRect.height - // called when data is set (setWizardFactories) - function onModelReset() { - currentIndex = 0 - currentIndexChanged() - } - } + GridView { + id: gridView - delegate: ItemDelegate { - id: delegate + clip: true + anchors.fill: parent + cellWidth: DialogValues.gridCellWidth + cellHeight: DialogValues.gridCellHeight + rightMargin: -DialogValues.gridSpacing + bottomMargin: -DialogValues.gridSpacing + boundsBehavior: Flickable.StopAtBounds + model: BackendApi.presetModel - width: DialogValues.projectItemWidth - height: DialogValues.projectItemHeight - background: null - - function fontIconCode(index) { - var code = presetModel.fontIconCode(index) - return code ? code : StudioTheme.Constants.wizardsUnknown + // called by onModelReset and when user clicks on an item, or when the header item is changed. + onCurrentIndexChanged: { + BackendApi.selectedPreset = gridView.currentIndex + var source = BackendApi.currentPresetQmlPath() + scrollView.loader.source = source } - Column { - width: parent.width - height: parent.height + Connections { + target: BackendApi.presetModel - Label { - id: projectTypeIcon - text: fontIconCode(index) - color: DialogValues.textColor - width: parent.width - height: DialogValues.projectItemHeight / 2 - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignBottom - renderType: Text.NativeRendering - font.pixelSize: 65 - font.family: StudioTheme.Constants.iconFont.family + // called when data is set (setWizardFactories) + function onModelReset() { + if (scrollView.selectLast) { + gridView.currentIndex = BackendApi.presetModel.rowCount() - 1 + scrollView.selectLast = false + } else { + gridView.currentIndex = 0 + } + + // This will load Details.qml and Styles.qml by setting "source" on the Loader. + gridView.currentIndexChanged() } + } + + delegate: ItemDelegate { + id: delegate + + property bool hover: delegate.hovered || removeMouseArea.containsMouse + + width: DialogValues.projectItemWidth + height: DialogValues.projectItemHeight + + onClicked: delegate.GridView.view.currentIndex = index + + background: Rectangle { + id: delegateBackground + width: parent.width + height: parent.height + color: delegate.hover ? scrollView.backgroundHoverColor : "transparent" + border.color: delegate.hover ? projectTypeName.color : "transparent" + } + + function fontIconCode(index) { + var code = BackendApi.presetModel.fontIconCode(index) + return code ? code : StudioTheme.Constants.wizardsUnknown + } + + contentItem: Item { + anchors.fill: parent + + ColumnLayout { + spacing: 0 + anchors.top: parent.top + anchors.topMargin: -1 + anchors.horizontalCenter: parent.horizontalCenter + + Label { + id: projectTypeIcon + text: delegate.fontIconCode(index) + color: DialogValues.textColor + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignBottom + renderType: Text.NativeRendering + font.pixelSize: 65 + font.family: StudioTheme.Constants.iconFont.family + Layout.alignment: Qt.AlignHCenter + } // Preset type icon Label + + Text { + id: projectTypeName + color: DialogValues.textColor + text: name + font.pixelSize: DialogValues.defaultPixelSize + lineHeight: DialogValues.defaultLineHeight + lineHeightMode: Text.FixedHeight + width: DialogValues.projectItemWidth - 16 + elide: Text.ElideRight + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignTop + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: projectTypeName.width + Layout.minimumWidth: projectTypeName.width + Layout.maximumWidth: projectTypeName.width + + ToolTip { + id: toolTip + y: -toolTip.height + visible: delegate.hovered && projectTypeName.truncated + text: name + delay: 1000 + height: 20 + + background: Rectangle { + color: StudioTheme.Values.themeToolTipBackground + border.color: StudioTheme.Values.themeToolTipOutline + border.width: StudioTheme.Values.border + } + + contentItem: Text { + color: StudioTheme.Values.themeToolTipText + text: toolTip.text + font.pixelSize: DialogValues.defaultPixelSize + verticalAlignment: Text.AlignVCenter + } + } + } + + Text { + id: projectTypeResolution + color: DialogValues.textColor + text: resolution + font.pixelSize: DialogValues.defaultPixelSize + lineHeight: DialogValues.defaultLineHeight + lineHeightMode: Text.FixedHeight + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignTop + Layout.alignment: Qt.AlignHCenter + } + + } // ColumnLayout + + Item { + id: removePresetButton + width: 20 + height: 20 + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: 4 + visible: isUserPreset === true + && delegate.hover + && scrollView.currentTabName !== "Recents" + + Text { + anchors.fill: parent + text: StudioTheme.Constants.closeCross + color: DialogValues.textColor + horizontalAlignment: Qt.AlignHCenter + verticalAlignment: Qt.AlignVCenter + font.family: StudioTheme.Constants.iconFont.family + font.pixelSize: StudioTheme.Values.myIconFontSize + } + + MouseArea { + id: removeMouseArea + anchors.fill: parent + hoverEnabled: true + cursorShape: removeMouseArea.containsMouse ? Qt.PointingHandCursor + : Qt.ArrowCursor + + onClicked: { + removePresetDialog.presetName = projectTypeName.text + removePresetDialog.open() + } + } + } // Delete preset button Item + } // Item + + states: [ + State { + name: "current" + when: delegate.GridView.isCurrentItem + + PropertyChanges { + target: projectTypeName + color: DialogValues.textColorInteraction + } + PropertyChanges { + target: projectTypeResolution + color: DialogValues.textColorInteraction + } + PropertyChanges { + target: projectTypeIcon + color: DialogValues.textColorInteraction + } + PropertyChanges { + target: scrollView + backgroundHoverColor: DialogValues.presetItemBackgroundHoverInteraction + } + } // State + ] + } // ItemDelegate + + PopupDialog { + id: removePresetDialog + + property string presetName + + title: qsTr("Delete Custom Preset") + standardButtons: Dialog.Yes | Dialog.No + modal: true + closePolicy: Popup.CloseOnEscape + anchors.centerIn: parent + width: DialogValues.popupDialogWidth + + onAccepted: BackendApi.removeCurrentPreset() Text { - id: projectTypeLabel + text: qsTr("Are you sure you want to delete \"" + removePresetDialog.presetName + "\" ?") color: DialogValues.textColor - - text: name font.pixelSize: DialogValues.defaultPixelSize - lineHeight: DialogValues.defaultLineHeight - lineHeightMode: Text.FixedHeight - width: parent.width - height: DialogValues.projectItemHeight / 2 - wrapMode: Text.Wrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignTop + wrapMode: Text.WordWrap + + width: DialogValues.popupDialogWidth - 2 * DialogValues.popupDialogPadding } - } // Column - MouseArea { - anchors.fill: parent - onClicked: { - delegate.GridView.view.currentIndex = index - } - } - - states: [ - State { - when: delegate.GridView.isCurrentItem - PropertyChanges { - target: projectTypeLabel - color: DialogValues.textColorInteraction - } - - PropertyChanges { - target: projectTypeIcon - color: DialogValues.textColorInteraction - } - } // State - ] - } // ItemDelegate -} // GridView + } // Dialog + } // GridView +} // ScrollView diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialog.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialog.qml new file mode 100644 index 00000000000..2c6b3084617 --- /dev/null +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialog.qml @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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 General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import StudioTheme as StudioTheme + +import BackendApi + +Dialog { + id: root + padding: DialogValues.popupDialogPadding + + background: Rectangle { + color: DialogValues.darkPaneColor + border.color: StudioTheme.Values.themeInteraction + border.width: StudioTheme.Values.border + } + + header: Label { + text: root.title + visible: root.title + elide: Label.ElideRight + font.bold: true + font.pixelSize: DialogValues.defaultPixelSize + padding: DialogValues.popupDialogPadding + color: DialogValues.textColor + horizontalAlignment: Text.AlignHCenter + + background: Rectangle { + x: 1 + y: 1 + width: parent.width - 2 + height: parent.height - 1 + color: DialogValues.darkPaneColor + } + } + + footer: PopupDialogButtonBox { + visible: count > 0 + } +} diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialogButton.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialogButton.qml new file mode 100644 index 00000000000..ee64eb90783 --- /dev/null +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialogButton.qml @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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 General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick +import QtQuick.Controls +import StudioTheme as StudioTheme + +Button { + id: root + + implicitWidth: Math.max( + background ? background.implicitWidth : 0, + textItem.implicitWidth + leftPadding + rightPadding) + implicitHeight: Math.max( + background ? background.implicitHeight : 0, + textItem.implicitHeight + topPadding + bottomPadding) + leftPadding: 4 + rightPadding: 4 + + background: Rectangle { + id: background + implicitWidth: 80 + implicitHeight: StudioTheme.Values.height + color: StudioTheme.Values.themeControlBackground + border.color: StudioTheme.Values.themeControlOutline + anchors.fill: parent + } + + contentItem: Text { + id: textItem + text: root.text + font.family: StudioTheme.Constants.font.family + font.pixelSize: DialogValues.defaultPixelSize + color: StudioTheme.Values.themeTextColor + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + renderType: Text.QtRendering + anchors.fill: parent + } + + states: [ + State { + name: "default" + when: !root.hovered && !root.checked && !root.pressed + + PropertyChanges { + target: background + color: StudioTheme.Values.themeControlBackground + border.color: StudioTheme.Values.themeControlOutline + } + PropertyChanges { + target: textItem + color: StudioTheme.Values.themeTextColor + } + }, + State { + name: "hover" + when: root.hovered && !root.checked && !root.pressed + + PropertyChanges { + target: background + color: StudioTheme.Values.themeControlBackgroundHover + border.color: StudioTheme.Values.themeControlOutline + } + PropertyChanges { + target: textItem + color: StudioTheme.Values.themeTextColor + } + }, + State { + name: "press" + when: root.hovered && root.pressed + + PropertyChanges { + target: background + color: StudioTheme.Values.themeInteraction + border.color: StudioTheme.Values.themeInteraction + } + PropertyChanges { + target: textItem + color: StudioTheme.Values.themeIconColor + } + } + ] +} diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialogButtonBox.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialogButtonBox.qml new file mode 100644 index 00000000000..d4d867f862d --- /dev/null +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/PopupDialogButtonBox.qml @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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 General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick +import QtQuick.Controls + +DialogButtonBox { + id: root + padding: DialogValues.popupDialogPadding + alignment: Qt.AlignRight | Qt.AlignBottom + + background: Rectangle { + implicitHeight: 40 + x: 1 + y: 1 + width: parent.width - 2 + height: parent.height - 2 + color: DialogValues.darkPaneColor + } + + delegate: PopupDialogButton { + width: root.count === 1 ? root.availableWidth / 2 : undefined + } +} diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Styles.qml b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Styles.qml index e6955bb21b7..72be983e33a 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Styles.qml +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/Styles.qml @@ -23,20 +23,21 @@ ** ****************************************************************************/ +import QtQuick import QtQuick.Window import QtQuick.Controls - -import QtQuick import QtQuick.Layouts import StudioControls as SC import StudioTheme as StudioTheme +import BackendApi + Item { width: DialogValues.stylesPaneWidth Component.onCompleted: { - dialogBox.stylesLoaded = true; + BackendApi.stylesLoaded = true /* * TODO: roleNames is called before the backend model (in the proxy class StyleModel) is @@ -47,7 +48,7 @@ Item { } Component.onDestruction: { - dialogBox.stylesLoaded = false; + BackendApi.stylesLoaded = false } Rectangle { @@ -57,116 +58,120 @@ Item { Item { x: DialogValues.stylesPanePadding - width: parent.width - DialogValues.stylesPanePadding * 2 + styleScrollBar.width + width: parent.width - DialogValues.stylesPanePadding * 2 height: parent.height - ColumnLayout { - anchors.fill: parent - spacing: 5 + Text { + id: styleTitleText + text: qsTr("Style") + height: DialogValues.paneTitleTextHeight + width: parent.width + font.weight: Font.DemiBold + font.pixelSize: DialogValues.paneTitlePixelSize + lineHeight: DialogValues.paneTitleLineHeight + lineHeightMode: Text.FixedHeight + color: DialogValues.textColor + verticalAlignment: Qt.AlignVCenter + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right - Text { - id: styleTitleText - text: qsTr("Style") - Layout.minimumHeight: DialogValues.paneTitleTextHeight - font.weight: Font.DemiBold - font.pixelSize: DialogValues.paneTitlePixelSize - lineHeight: DialogValues.paneTitleLineHeight - lineHeightMode: Text.FixedHeight - color: DialogValues.textColor - verticalAlignment: Qt.AlignVCenter + function refresh() { + styleTitleText.text = qsTr("Style") + " (" + BackendApi.styleModel.rowCount() + ")" + } + } - function refresh() { - text = qsTr("Style") + " (" + styleModel.rowCount() + ")" - } + SC.ComboBox { // Style Filter ComboBox + id: styleComboBox + actionIndicatorVisible: false + currentIndex: 0 + textRole: "text" + valueRole: "value" + font.pixelSize: DialogValues.defaultPixelSize + width: parent.width + + anchors.top: styleTitleText.bottom + anchors.topMargin: 5 + + model: ListModel { + ListElement { text: qsTr("All"); value: "all" } + ListElement { text: qsTr("Light"); value: "light" } + ListElement { text: qsTr("Dark"); value: "dark" } } - SC.ComboBox { // Style Filter ComboBox - actionIndicatorVisible: false - currentIndex: 0 - textRole: "text" - valueRole: "value" - font.pixelSize: DialogValues.defaultPixelSize + onActivated: (index) => { + BackendApi.styleModel.filter(currentValue.toLowerCase()) + styleTitleText.refresh() + } + } // Style Filter ComboBox - model: ListModel { - ListElement { text: qsTr("All"); value: "all" } - ListElement { text: qsTr("Light"); value: "light" } - ListElement { text: qsTr("Dark"); value: "dark" } - } + ScrollView { + id: scrollView - implicitWidth: parent.width + anchors.top: styleComboBox.bottom + anchors.topMargin: 11 + anchors.bottom: parent.bottom + anchors.bottomMargin: DialogValues.stylesPanePadding + width: parent.width - onActivated: (index) => { - styleModel.filter(currentValue.toLowerCase()); - styleTitleText.refresh(); - } - } // Style Filter ComboBox - - Item { implicitWidth: 1; implicitHeight: 9 } + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + ScrollBar.vertical: SC.VerticalScrollBar { + id: styleScrollBar + x: stylesList.width + (DialogValues.stylesPanePadding + - StudioTheme.Values.scrollBarThickness) * 0.5 + } ListView { id: stylesList - Layout.fillWidth: true - Layout.fillHeight: true - clip: true - model: styleModel - - MouseArea { - id: listViewMouseArea - anchors.fill: parent - hoverEnabled: true - propagateComposedEvents: true - } - + anchors.fill: parent focus: true + clip: true + model: BackendApi.styleModel boundsBehavior: Flickable.StopAtBounds - highlightFollowsCurrentItem: false - - ScrollBar.vertical: SC.VerticalScrollBar { - id: styleScrollBar - property int extraPadding: 0 - bottomInset: extraPadding - bottomPadding: bottomInset + 16 - viewMouseArea: listViewMouseArea - } // ScrollBar + bottomMargin: -DialogValues.styleListItemBottomMargin onCurrentIndexChanged: { - if (styleModel.rowCount() > 0) - dialogBox.styleIndex = stylesList.currentIndex; + if (BackendApi.styleModel.rowCount() > 0) + BackendApi.styleIndex = stylesList.currentIndex } delegate: ItemDelegate { id: delegateId - height: styleImage.height + DialogValues.styleImageBorderWidth + styleText.height + extraPadding.height + 1 - width: stylesList.width - styleScrollBar.width + width: stylesList.width + height: DialogValues.styleListItemHeight - Component.onCompleted: { - styleScrollBar.extraPadding = styleText.height + extraPadding.height - } + onClicked: stylesList.currentIndex = index - Rectangle { + background: Rectangle { anchors.fill: parent color: DialogValues.lightPaneColor + } + + contentItem: Item { + anchors.fill: parent Column { - spacing: 0 anchors.fill: parent + spacing: DialogValues.styleListItemSpacing Rectangle { - border.color: index == stylesList.currentIndex ? DialogValues.textColorInteraction : "transparent" - border.width: index == stylesList.currentIndex ? DialogValues.styleImageBorderWidth : 0 + width: DialogValues.styleImageWidth + + 2 * DialogValues.styleImageBorderWidth + height: DialogValues.styleImageHeight + + 2 * DialogValues.styleImageBorderWidth + border.color: index === stylesList.currentIndex ? DialogValues.textColorInteraction : "transparent" + border.width: index === stylesList.currentIndex ? DialogValues.styleImageBorderWidth : 0 color: "transparent" - width: parent.width - height: parent.height - styleText.height - extraPadding.height Image { id: styleImage - asynchronous: false - source: "image://newprojectdialog_library/" + styleModel.iconId(model.index) - width: 200 - height: 262 x: DialogValues.styleImageBorderWidth y: DialogValues.styleImageBorderWidth + width: DialogValues.styleImageWidth + height: DialogValues.styleImageHeight + asynchronous: false + source: "image://newprojectdialog_library/" + BackendApi.styleModel.iconId(model.index) } } // Rectangle @@ -175,35 +180,26 @@ Item { text: model.display font.pixelSize: DialogValues.defaultPixelSize lineHeight: DialogValues.defaultLineHeight - height: 18 + height: DialogValues.styleTextHeight lineHeightMode: Text.FixedHeight horizontalAlignment: Text.AlignHCenter width: parent.width color: DialogValues.textColor } - - Item { id: extraPadding; width: 1; height: 10 } } // Column - } // Rectangle - - MouseArea { - anchors.fill: parent - onClicked: { - stylesList.currentIndex = index - } } } Connections { - target: styleModel + target: BackendApi.styleModel function onModelReset() { - stylesList.currentIndex = dialogBox.styleIndex; - stylesList.currentIndexChanged(); - styleTitleText.refresh(); + stylesList.currentIndex = BackendApi.styleIndex + stylesList.currentIndexChanged() + styleTitleText.refresh() } } } // ListView - } // ColumnLayout + } // ScrollView } // Parent Item } // Rectangle } diff --git a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/qmldir b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/qmldir index d7c1562164f..996b9ec3561 100644 --- a/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/qmldir +++ b/share/qtcreator/qmldesigner/newprojectdialog/imports/NewProjectDialog/qmldir @@ -1,4 +1,7 @@ -singleton DialogValues 1.0 DialogValues.qml +PopupDialog 1.0 PopupDialog.qml +PopupDialogButton 1.0 PopupDialogButton.qml +PopupDialogButtonBox 1.0 PopupDialogButtonBox.qml Details 1.0 Details.qml -Styles 1.0 Styles.qml +singleton DialogValues 1.0 DialogValues.qml NewProjectView 1.0 NewProjectView.qml +Styles 1.0 Styles.qml diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/VerticalScrollBar.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/VerticalScrollBar.qml index 4b344130959..b0e6f82bc17 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/VerticalScrollBar.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/VerticalScrollBar.qml @@ -35,37 +35,26 @@ ScrollBar { implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, implicitContentHeight + topPadding + bottomPadding) - property bool scrollBarVisible: parent.childrenRect.height > parent.height - // viewMouseArea: if set, the scrollbar will be visible only on hover over the view containing - // the mouse area item. - property MouseArea viewMouseArea: null - - minimumSize: orientation == Qt.Horizontal ? height / width : width / height + property bool scrollBarVisible: parent.contentHeight > scrollBar.height + minimumSize: scrollBar.width / scrollBar.height orientation: Qt.Vertical - policy: computePolicy() - x: parent.width - width - y: 0 + policy: scrollBar.scrollBarVisible ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff + height: parent.availableHeight - (parent.bothVisible ? parent.horizontalThickness : 0) - padding: 0 + padding: scrollBar.active ? StudioTheme.Values.scrollBarActivePadding + : StudioTheme.Values.scrollBarInactivePadding background: Rectangle { + implicitWidth: StudioTheme.Values.scrollBarThickness + implicitHeight: StudioTheme.Values.scrollBarThickness color: StudioTheme.Values.themeScrollBarTrack } contentItem: Rectangle { - implicitWidth: StudioTheme.Values.scrollBarThickness + implicitWidth: StudioTheme.Values.scrollBarThickness - 2 * scrollBar.padding + implicitHeight: StudioTheme.Values.scrollBarThickness - 2 * scrollBar.padding color: StudioTheme.Values.themeScrollBarHandle } - - function computePolicy() { - if (!scrollBar.scrollBarVisible) - return ScrollBar.AlwaysOff; - - if (scrollBar.viewMouseArea) - return scrollBar.viewMouseArea.containsMouse ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff - else - return ScrollBar.AlwaysOn; - } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml index 29d0edb14db..f63aa36ab14 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml @@ -89,6 +89,8 @@ QtObject { property real typeLabelVerticalShift: Math.round(6 * values.scaleFactor) property real scrollBarThickness: 10 + property real scrollBarActivePadding: 1 + property real scrollBarInactivePadding: 2 property real toolTipHeight: 25 property int toolTipDelay: 1000 diff --git a/src/plugins/studiowelcome/CMakeLists.txt b/src/plugins/studiowelcome/CMakeLists.txt index a8b92ab1f8b..209bb80b01c 100644 --- a/src/plugins/studiowelcome/CMakeLists.txt +++ b/src/plugins/studiowelcome/CMakeLists.txt @@ -14,6 +14,7 @@ add_qtc_plugin(StudioWelcome createproject.cpp createproject.h wizardhandler.cpp wizardhandler.h recentpresets.cpp recentpresets.h + userpresets.cpp userpresets.h screensizemodel.h algorithm.h stylemodel.h stylemodel.cpp diff --git a/src/plugins/studiowelcome/presetmodel.cpp b/src/plugins/studiowelcome/presetmodel.cpp index b8db0503f24..e9d7438139d 100644 --- a/src/plugins/studiowelcome/presetmodel.cpp +++ b/src/plugins/studiowelcome/presetmodel.cpp @@ -25,22 +25,30 @@ #include "presetmodel.h" #include -#include #include "algorithm.h" using namespace StudioWelcome; +constexpr int NameRole = Qt::UserRole; +constexpr int ScreenSizeRole = Qt::UserRole + 1; +constexpr int IsUserPresetRole = Qt::UserRole + 2; + +static const QString RecentsTabName = QObject::tr("Recents"); +static const QString CustomTabName = QObject::tr("Custom"); + /****************** PresetData ******************/ void PresetData::setData(const PresetsByCategory &presetsByCategory, - const std::vector &loadedRecents) + const std::vector &userPresetsData, + const std::vector &loadedRecentsData) { - QTC_ASSERT(!presetsByCategory.empty(), return); - m_recents = loadedRecents; + QTC_ASSERT(!presetsByCategory.empty(), return ); + m_recents = loadedRecentsData; + m_userPresets = userPresetsData; if (!m_recents.empty()) { - m_categories.push_back("Recents"); + m_categories.push_back(RecentsTabName); m_presets.push_back({}); } @@ -49,28 +57,95 @@ void PresetData::setData(const PresetsByCategory &presetsByCategory, m_presets.push_back(category.items); } - PresetItems presets = Utils::flatten(m_presets); + PresetItems wizardPresets = Utils::flatten(m_presets); - std::vector recentPresets = makeRecentPresets(presets); - - if (!m_recents.empty()) + PresetItems recentPresets = makeRecentPresets(wizardPresets); + if (!m_recents.empty()) { m_presets[0] = recentPresets; + } + + PresetItems userPresetItems = makeUserPresets(wizardPresets); + if (!userPresetItems.empty()) { + m_categories.push_back(CustomTabName); + m_presets.push_back(userPresetItems); + } + + m_presetsByCategory = presetsByCategory; } -std::vector PresetData::makeRecentPresets(const PresetItems &wizardPresets) +void PresetData::reload(const std::vector &userPresetsData, + const std::vector &loadedRecentsData) { - static const PresetItem empty; + m_categories.clear(); + m_presets.clear(); + m_recents.clear(); + m_userPresets.clear(); + setData(m_presetsByCategory, userPresetsData, loadedRecentsData); +} +std::shared_ptr PresetData::findPresetItemForUserPreset(const UserPresetData &preset, + const PresetItems &wizardPresets) +{ + return Utils::findOrDefault(wizardPresets, [&preset](const std::shared_ptr &item) { + return item->wizardName == preset.wizardName && item->categoryId == preset.categoryId; + }); +} + +PresetItems PresetData::makeUserPresets(const PresetItems &wizardPresets) +{ PresetItems result; - for (const RecentPreset &recent : m_recents) { - auto item = Utils::findOptional(wizardPresets, [&recent](const PresetItem &item) { - return item.categoryId == std::get<0>(recent) && item.name == std::get<1>(recent); - }); + for (const UserPresetData &userPresetData : m_userPresets) { + std::shared_ptr foundPreset = findPresetItemForUserPreset(userPresetData, + wizardPresets); + if (!foundPreset) + continue; - if (item) { - item->screenSizeName = std::get<2>(recent); - result.push_back(item.value()); + auto presetItem = std::make_shared(); + + presetItem->categoryId = userPresetData.categoryId; + presetItem->wizardName = userPresetData.wizardName; + presetItem->screenSizeName = userPresetData.screenSize; + + presetItem->userName = userPresetData.name; + presetItem->qtVersion = userPresetData.qtVersion; + presetItem->styleName = userPresetData.styleName; + presetItem->useQtVirtualKeyboard = userPresetData.useQtVirtualKeyboard; + + presetItem->create = foundPreset->create; + presetItem->description = foundPreset->description; + presetItem->fontIconCode = foundPreset->fontIconCode; + presetItem->qmlPath = foundPreset->qmlPath; + + result.push_back(presetItem); + } + + return result; +} + +std::shared_ptr PresetData::findPresetItemForRecent(const RecentPresetData &recent, const PresetItems &wizardPresets) +{ + return Utils::findOrDefault(wizardPresets, [&recent](const std::shared_ptr &item) { + bool sameName = item->categoryId == recent.category + && item->displayName() == recent.presetName; + + bool sameType = (recent.isUserPreset ? item->isUserPreset() : !item->isUserPreset()); + + return sameName && sameType; + }); +} + +PresetItems PresetData::makeRecentPresets(const PresetItems &wizardPresets) +{ + PresetItems result; + + for (const RecentPresetData &recent : m_recents) { + std::shared_ptr preset = findPresetItemForRecent(recent, wizardPresets); + + if (preset) { + auto clone = std::shared_ptr{preset->clone()}; + clone->screenSizeName = recent.sizeName; + result.push_back(clone); } } @@ -86,8 +161,8 @@ BasePresetModel::BasePresetModel(const PresetData *data, QObject *parent) QHash BasePresetModel::roleNames() const { - QHash roleNames; - roleNames[Qt::UserRole] = "name"; + static QHash roleNames{{NameRole, "name"}, + {ScreenSizeRole, "resolution"}}; return roleNames; } @@ -97,8 +172,9 @@ PresetCategoryModel::PresetCategoryModel(const PresetData *data, QObject *parent : BasePresetModel(data, parent) {} -int PresetCategoryModel::rowCount(const QModelIndex &) const +int PresetCategoryModel::rowCount(const QModelIndex &parent) const { + Q_UNUSED(parent) return static_cast(m_data->categories().size()); } @@ -116,9 +192,9 @@ PresetModel::PresetModel(const PresetData *data, QObject *parent) QHash PresetModel::roleNames() const { - QHash roleNames; - roleNames[Qt::UserRole] = "name"; - roleNames[Qt::UserRole + 1] = "size"; + static QHash roleNames{{NameRole, "name"}, + {ScreenSizeRole, "resolution"}, + {IsUserPresetRole, "isUserPreset"}}; return roleNames; } @@ -132,9 +208,16 @@ int PresetModel::rowCount(const QModelIndex &) const QVariant PresetModel::data(const QModelIndex &index, int role) const { - Q_UNUSED(role) - PresetItem preset = presetsOfCurrentCategory().at(index.row()); - return QVariant::fromValue(preset.name + "\n" + preset.screenSizeName); + std::shared_ptr preset = presetsOfCurrentCategory().at(index.row()); + + if (role == NameRole) + return preset->displayName(); + else if (role == ScreenSizeRole) + return preset->screenSize(); + else if (role == IsUserPresetRole) + return preset->isUserPreset(); + else + return {}; } void PresetModel::setPage(int index) @@ -148,7 +231,7 @@ void PresetModel::setPage(int index) QString PresetModel::fontIconCode(int index) const { - Utils::optional presetItem = preset(index); + std::shared_ptr presetItem = preset(index); if (!presetItem) return {}; diff --git a/src/plugins/studiowelcome/presetmodel.h b/src/plugins/studiowelcome/presetmodel.h index a1c9b0e7d27..5bc19755885 100644 --- a/src/plugins/studiowelcome/presetmodel.h +++ b/src/plugins/studiowelcome/presetmodel.h @@ -31,8 +31,10 @@ #include #include +#include #include "recentpresets.h" +#include "userpresets.h" namespace Utils { class Wizard; @@ -40,38 +42,115 @@ class Wizard; namespace StudioWelcome { +struct UserPresetItem; + struct PresetItem { - QString name; + PresetItem() = default; + PresetItem(const QString &wizardName, const QString &category, const QString &sizeName = "") + : wizardName{wizardName} + , categoryId{category} + , screenSizeName{sizeName} + {} + + virtual ~PresetItem() {} + virtual QString displayName() const { return wizardName; } + virtual QString screenSize() const { return screenSizeName; } + virtual std::unique_ptr clone() const + { + return std::unique_ptr{new PresetItem{*this}}; + } + + virtual bool isUserPreset() const { return false; } + virtual UserPresetItem *asUserPreset() { return nullptr; } + std::function create; + +public: + QString wizardName; QString categoryId; QString screenSizeName; QString description; QUrl qmlPath; QString fontIconCode; - std::function create; }; +struct UserPresetItem : public PresetItem +{ + UserPresetItem() = default; + UserPresetItem(const QString &userName, + const QString &wizardName, + const QString &category, + const QString &sizeName = "") + : PresetItem{wizardName, category, sizeName} + , userName{userName} + {} + + QString displayName() const override { return userName; } + std::unique_ptr clone() const override + { + return std::unique_ptr{new UserPresetItem{*this}}; + } + + bool isUserPreset() const override { return true; } + UserPresetItem *asUserPreset() override { return this; } + + bool isValid() const + { + return !categoryId.isEmpty() && !wizardName.isEmpty() && !userName.isEmpty(); + } + +public: + QString userName; + bool useQtVirtualKeyboard; + QString qtVersion; + QString styleName; +}; + +inline QDebug &operator<<(QDebug &d, const UserPresetItem &item); + inline QDebug &operator<<(QDebug &d, const PresetItem &item) { - d << "name=" << item.name; + d << "wizardName=" << item.wizardName; d << "; category = " << item.categoryId; d << "; size = " << item.screenSizeName; + if (item.isUserPreset()) + d << (UserPresetItem &) item; + + return d; +} + +inline QDebug &operator<<(QDebug &d, const UserPresetItem &item) +{ + d << "userName=" << item.userName; + return d; } inline bool operator==(const PresetItem &lhs, const PresetItem &rhs) { - return lhs.categoryId == rhs.categoryId && lhs.name == rhs.name; + return lhs.categoryId == rhs.categoryId && lhs.wizardName == rhs.wizardName; } +using PresetItems = std::vector>; + struct WizardCategory { QString id; QString name; - std::vector items; + PresetItems items; }; +inline QDebug &operator<<(QDebug &d, const std::shared_ptr &preset) +{ + if (preset) + d << *preset; + else + d << "(null)"; + + return d; +} + inline QDebug &operator<<(QDebug &d, const WizardCategory &cat) { d << "id=" << cat.id; @@ -82,7 +161,6 @@ inline QDebug &operator<<(QDebug &d, const WizardCategory &cat) } using PresetsByCategory = std::map; -using PresetItems = std::vector; using Categories = std::vector; /****************** PresetData ******************/ @@ -90,18 +168,28 @@ using Categories = std::vector; class PresetData { public: - void setData(const PresetsByCategory &presets, const std::vector &recents); + void reload(const std::vector &userPresets, + const std::vector &loadedRecents); + void setData(const PresetsByCategory &presets, + const std::vector &userPresets, + const std::vector &recents); const std::vector &presets() const { return m_presets; } const Categories &categories() const { return m_categories; } private: - std::vector makeRecentPresets(const PresetItems &wizardPresets); + PresetItems makeRecentPresets(const PresetItems &wizardPresets); + PresetItems makeUserPresets(const PresetItems &wizardPresets); + + std::shared_ptr findPresetItemForUserPreset(const UserPresetData &preset, const PresetItems &wizardPresets); + std::shared_ptr findPresetItemForRecent(const RecentPresetData &recent, const PresetItems &wizardPresets); private: std::vector m_presets; Categories m_categories; - std::vector m_recents; + std::vector m_recents; + std::vector m_userPresets; + PresetsByCategory m_presetsByCategory; }; /****************** PresetCategoryModel ******************/ @@ -149,14 +237,14 @@ public: int page() const { return static_cast(m_page); } - Utils::optional preset(size_t selection) const + const std::shared_ptr preset(size_t selection) const { auto presets = m_data->presets(); if (presets.empty()) return {}; if (m_page < presets.size()) { - const std::vector presetsOfCategory = presets.at(m_page); + const PresetItems presetsOfCategory = presets.at(m_page); if (selection < presetsOfCategory.size()) return presets.at(m_page).at(selection); } @@ -166,8 +254,10 @@ public: bool empty() const { return m_data->presets().empty(); } private: - const std::vector presetsOfCurrentCategory() const + const PresetItems presetsOfCurrentCategory() const { + QTC_ASSERT(m_page < m_data->presets().size(), return {}); + return m_data->presets().at(m_page); } diff --git a/src/plugins/studiowelcome/qdsnewdialog.cpp b/src/plugins/studiowelcome/qdsnewdialog.cpp index 0324a7de93c..88b7b0fa55f 100644 --- a/src/plugins/studiowelcome/qdsnewdialog.cpp +++ b/src/plugins/studiowelcome/qdsnewdialog.cpp @@ -76,22 +76,14 @@ QdsNewDialog::QdsNewDialog(QWidget *parent) { setParent(m_dialog); - m_dialog->rootContext()->setContextProperties(QVector{ - {{"categoryModel"}, QVariant::fromValue(m_categoryModel.data())}, - {{"presetModel"}, QVariant::fromValue(m_presetModel.data())}, - {{"screenSizeModel"}, QVariant::fromValue(m_screenSizeModel.data())}, - {{"styleModel"}, QVariant::fromValue(m_styleModel.data())}, - {{"dialogBox"}, QVariant::fromValue(this)}, - }); - m_dialog->setResizeMode(QQuickWidget::SizeRootObjectToView); // SizeViewToRootObject m_dialog->engine()->addImageProvider(QStringLiteral("newprojectdialog_library"), new Internal::NewProjectDialogImageProvider()); QmlDesigner::Theme::setupTheme(m_dialog->engine()); + qmlRegisterSingletonInstance("BackendApi", 1, 0, "BackendApi", this); m_dialog->engine()->addImportPath(Core::ICore::resourcePath("qmldesigner/propertyEditorQmlSources/imports").toString()); m_dialog->engine()->addImportPath(Core::ICore::resourcePath("qmldesigner/newprojectdialog/imports").toString()); - QString sourcesPath = qmlPath(); - m_dialog->setSource(QUrl::fromLocalFile(sourcesPath)); + m_dialog->setSource(QUrl::fromLocalFile(qmlPath())); m_dialog->setWindowModality(Qt::ApplicationModal); m_dialog->setWindowFlags(Qt::Dialog); @@ -114,7 +106,7 @@ QdsNewDialog::QdsNewDialog(QWidget *parent) }); QObject::connect(m_styleModel.data(), &StyleModel::modelAboutToBeReset, this, [this]() { - this->m_qmlStyleIndex = -1; + m_qmlStyleIndex = -1; }); } @@ -188,18 +180,47 @@ void QdsNewDialog::onWizardCreated(QStandardItemModel *screenSizeModel, QStandar m_screenSizeModel->setBackendModel(screenSizeModel); m_styleModel->setBackendModel(styleModel); + auto userPreset = m_currentPreset->asUserPreset(); + if (m_qmlDetailsLoaded) { - updateScreenSizes(); + if (m_currentPreset->isUserPreset()) { + if (m_wizard.haveVirtualKeyboard()) + setUseVirtualKeyboard(userPreset->useQtVirtualKeyboard); + + if (m_wizard.haveTargetQtVersion()) { + int index = m_wizard.targetQtVersionIndex(userPreset->qtVersion); + if (index != -1) + setTargetQtVersionIndex(index); + } + } else { + if (m_wizard.haveTargetQtVersion()) { + int index = m_wizard.targetQtVersionIndex(); + if (index != -1) + setTargetQtVersionIndex(index); + } + } emit haveVirtualKeyboardChanged(); emit haveTargetQtVersionChanged(); + updateScreenSizes(); + setProjectName(m_qmlProjectName); setProjectLocation(m_qmlProjectLocation.toString()); } - if (m_qmlStylesLoaded) + if (m_qmlStylesLoaded && m_wizard.haveStyleModel()) { + if (m_currentPreset->isUserPreset()) { + int index = m_wizard.styleIndex(userPreset->styleName); + if (index != -1) + setStyleIndex(index); + } else { + /* NOTE: For a builtin preset, we don't need to set style index. That's because defaults + * will be loaded from the backend Wizard. + */ + } m_styleModel->reset(); + } } QString QdsNewDialog::currentPresetQmlPath() const @@ -221,10 +242,19 @@ int QdsNewDialog::screenSizeIndex() const return m_wizard.screenSizeIndex(); } -void QdsNewDialog::setTargetQtVersion(int index) +void QdsNewDialog::setTargetQtVersionIndex(int index) { - m_wizard.setTargetQtVersionIndex(index); - m_qmlTargetQtVersionIndex = index; + if (m_qmlTargetQtVersionIndex != index) { + m_wizard.setTargetQtVersionIndex(index); + m_qmlTargetQtVersionIndex = index; + + emit targetQtVersionIndexChanged(); + } +} + +int QdsNewDialog::getTargetQtVersionIndex() const +{ + return m_qmlTargetQtVersionIndex; } void QdsNewDialog::setStyleIndex(int index) @@ -267,6 +297,14 @@ int QdsNewDialog::getStyleIndex() const return m_styleModel->actualIndex(m_qmlStyleIndex); } +void QdsNewDialog::setUseVirtualKeyboard(bool value) +{ + if (m_qmlUseVirtualKeyboard != value) { + m_qmlUseVirtualKeyboard = value; + emit useVirtualKeyboardChanged(); + } +} + void QdsNewDialog::setWizardFactories(QList factories_, const Utils::FilePath &defaultLocation, const QVariantMap &) @@ -275,8 +313,9 @@ void QdsNewDialog::setWizardFactories(QList factories_, WizardFactories factories{factories_, m_dialog, platform}; - std::vector recents = m_recentsStore.fetchAll(); - m_presetData.setData(factories.presetsGroupedByCategory(), recents); + std::vector recents = m_recentsStore.fetchAll(); + std::vector userPresets = m_userPresetsStore.fetchAll(); + m_presetData.setData(factories.presetsGroupedByCategory(), userPresets, recents); m_categoryModel->reset(); m_presetModel->reset(); @@ -296,12 +335,45 @@ void QdsNewDialog::setWizardFactories(QList factories_, m_qmlProjectLocation = Utils::FilePath::fromString(QDir::toNativeSeparators(projectLocation.toString())); emit projectLocationChanged(); // So that QML knows to update the field + /* NOTE: + * Here we expect that details are loaded && that styles are loaded. We use the + * functionality below to update the state of the first item that is selected right when + * the dialog pops up. Otherwise, relying solely on onWizardCreated is not useful, since + * for the dialog popup, that wizard is created before details & styles are loaded. + * + * It might be a better alternative to receive notifications from QML in the cpp file, that + * style is loaded, and that details is loaded, and do updates from there. But, if we handle + * those events, they may be called before the wizard is created - so we would need to make + * sure that all events have occurred before we go ahead and configure the wizard. + */ + + auto userPreset = m_currentPreset->asUserPreset(); + if (m_qmlDetailsLoaded) { updateScreenSizes(); + + if (m_wizard.haveTargetQtVersion()) { + int index = (userPreset ? m_wizard.targetQtVersionIndex(userPreset->qtVersion) + : m_wizard.targetQtVersionIndex()); + if (index != -1) + setTargetQtVersionIndex(index); + } + + if (m_wizard.haveVirtualKeyboard() && userPreset) + setUseVirtualKeyboard(userPreset->useQtVirtualKeyboard); + + emit haveVirtualKeyboardChanged(); + emit haveTargetQtVersionChanged(); } - if (m_qmlStylesLoaded) + if (m_qmlStylesLoaded && m_wizard.haveStyleModel()) { + if (userPreset) { + int index = m_wizard.styleIndex(userPreset->styleName); + if (index != -1) + setStyleIndex(index); + } m_styleModel->reset(); + } } QString QdsNewDialog::qmlPath() const @@ -338,10 +410,10 @@ void QdsNewDialog::accept() .withTargetQtVersion(m_qmlTargetQtVersionIndex) .execute(); - PresetItem item = m_wizard.preset(); + std::shared_ptr item = m_wizard.preset(); QString customSizeName = m_qmlCustomWidth + " x " + m_qmlCustomHeight; - m_recentsStore.add(item.categoryId, item.name, customSizeName); + m_recentsStore.add(item->categoryId, item->displayName(), customSizeName, item->isUserPreset()); m_dialog->close(); m_dialog->deleteLater(); @@ -355,6 +427,7 @@ void QdsNewDialog::reject() m_wizard.destroyWizard(); m_dialog->close(); + m_dialog = nullptr; } QString QdsNewDialog::chooseProjectLocation() @@ -375,7 +448,76 @@ void QdsNewDialog::setSelectedPreset(int selection) setProjectDescription(m_currentPreset->description); m_presetPage = m_presetModel->page(); - m_wizard.reset(m_currentPreset.value(), m_qmlSelectedPreset); + m_wizard.reset(m_currentPreset, m_qmlSelectedPreset); } } } + +void QdsNewDialog::savePresetDialogAccept() +{ + QString screenSize = m_qmlCustomWidth + " x " + m_qmlCustomHeight; + QString targetQtVersion = ""; + QString styleName = ""; + bool useVirtualKeyboard = false; + + if (m_wizard.haveTargetQtVersion()) + targetQtVersion = m_wizard.targetQtVersionName(m_qmlTargetQtVersionIndex); + + if (m_wizard.haveStyleModel()) + styleName = m_wizard.styleName(m_qmlStyleIndex); + + if (m_wizard.haveVirtualKeyboard()) + useVirtualKeyboard = m_qmlUseVirtualKeyboard; + + UserPresetData preset = {m_currentPreset->categoryId, + m_currentPreset->wizardName, + m_qmlPresetName, + screenSize, + useVirtualKeyboard, + targetQtVersion, + styleName}; + + if (!m_userPresetsStore.save(preset)) { + QMessageBox::warning(m_dialog, + tr("Save Preset"), + tr("A preset with this name already exists.")); + return; + } + + // reload model + std::vector recents = m_recentsStore.fetchAll(); + std::vector userPresets = m_userPresetsStore.fetchAll(); + m_presetData.reload(userPresets, recents); + + m_categoryModel->reset(); + + emit userPresetSaved(); +} + +void QdsNewDialog::removeCurrentPreset() +{ + if (!m_currentPreset->isUserPreset()) { + qWarning() << "Will not attempt to remove non-user preset"; + return; + } + + // remove preset & reload model + std::vector recents = m_recentsStore.remove(m_currentPreset->categoryId, + m_currentPreset->displayName()); + + auto userPreset = m_currentPreset->asUserPreset(); + m_userPresetsStore.remove(userPreset->categoryId, userPreset->displayName()); + std::vector userPresets = m_userPresetsStore.fetchAll(); + m_presetData.reload(userPresets, recents); + + m_qmlSelectedPreset = -1; + m_presetPage = -1; + + if (userPresets.size() == 0) { + m_presetModel->setPage(0); + emit lastUserPresetRemoved(); + } + + m_categoryModel->reset(); + m_presetModel->reset(); +} diff --git a/src/plugins/studiowelcome/qdsnewdialog.h b/src/plugins/studiowelcome/qdsnewdialog.h index a4afa69e927..bb5e44343fd 100644 --- a/src/plugins/studiowelcome/qdsnewdialog.h +++ b/src/plugins/studiowelcome/qdsnewdialog.h @@ -29,13 +29,13 @@ #include #include -#include #include "wizardhandler.h" #include "presetmodel.h" #include "screensizemodel.h" #include "stylemodel.h" #include "recentpresets.h" +#include "userpresets.h" QT_BEGIN_NAMESPACE class QStandardItemModel; @@ -57,22 +57,31 @@ public: Q_PROPERTY(bool useVirtualKeyboard MEMBER m_qmlUseVirtualKeyboard READ getUseVirtualKeyboard WRITE setUseVirtualKeyboard NOTIFY useVirtualKeyboardChanged) Q_PROPERTY(bool haveVirtualKeyboard MEMBER m_qmlHaveVirtualKeyboard READ getHaveVirtualKeyboard NOTIFY haveVirtualKeyboardChanged) Q_PROPERTY(bool haveTargetQtVersion MEMBER m_qmlHaveTargetQtVersion READ getHaveTargetQtVersion NOTIFY haveTargetQtVersionChanged) + Q_PROPERTY(int targetQtVersionIndex MEMBER m_qmlTargetQtVersionIndex READ getTargetQtVersionIndex WRITE setTargetQtVersionIndex NOTIFY targetQtVersionIndexChanged) Q_PROPERTY(bool saveAsDefaultLocation MEMBER m_qmlSaveAsDefaultLocation WRITE setSaveAsDefaultLocation) Q_PROPERTY(QString statusMessage MEMBER m_qmlStatusMessage READ getStatusMessage NOTIFY statusMessageChanged) Q_PROPERTY(QString statusType MEMBER m_qmlStatusType READ getStatusType NOTIFY statusTypeChanged) Q_PROPERTY(bool fieldsValid MEMBER m_qmlFieldsValid READ getFieldsValid NOTIFY fieldsValidChanged) + Q_PROPERTY(QString presetName MEMBER m_qmlPresetName) Q_PROPERTY(bool detailsLoaded MEMBER m_qmlDetailsLoaded) Q_PROPERTY(bool stylesLoaded MEMBER m_qmlStylesLoaded) + Q_INVOKABLE void removeCurrentPreset(); Q_INVOKABLE QString currentPresetQmlPath() const; // TODO: screen size index should better be a property Q_INVOKABLE void setScreenSizeIndex(int index); // called when ComboBox item is "activated" Q_INVOKABLE int screenSizeIndex() const; - Q_INVOKABLE void setTargetQtVersion(int index); Q_INVOKABLE QString chooseProjectLocation(); + Q_PROPERTY(QAbstractListModel *categoryModel MEMBER m_categoryModel CONSTANT); + Q_PROPERTY(QAbstractListModel *presetModel MEMBER m_presetModel CONSTANT); + Q_PROPERTY(QAbstractListModel *screenSizeModel MEMBER m_screenSizeModel CONSTANT); + Q_PROPERTY(QAbstractListModel *styleModel MEMBER m_styleModel CONSTANT); + + /*********************/ + explicit QdsNewDialog(QWidget *parent); QWidget *widget() override { return m_dialog; } @@ -85,7 +94,11 @@ public: void setStyleIndex(int index); int getStyleIndex() const; - void setUseVirtualKeyboard(bool value) { m_qmlUseVirtualKeyboard = value; } + + void setTargetQtVersionIndex(int index); + int getTargetQtVersionIndex() const; + + void setUseVirtualKeyboard(bool value); bool getUseVirtualKeyboard() const { return m_qmlUseVirtualKeyboard; } bool getFieldsValid() const { return m_qmlFieldsValid; } @@ -101,6 +114,8 @@ public slots: void accept(); void reject(); + void savePresetDialogAccept(); + signals: void projectNameChanged(); void projectLocationChanged(); @@ -111,6 +126,9 @@ signals: void statusMessageChanged(); void statusTypeChanged(); void fieldsValidChanged(); + void targetQtVersionIndexChanged(); + void userPresetSaved(); + void lastUserPresetRemoved(); private slots: void onStatusMessageChanged(Utils::InfoLabel::InfoType type, const QString &message); @@ -160,6 +178,7 @@ private: bool m_qmlFieldsValid = false; QString m_qmlStatusMessage; QString m_qmlStatusType; + QString m_qmlPresetName; int m_presetPage = -1; // i.e. the page in the Presets View @@ -169,10 +188,11 @@ private: bool m_qmlDetailsLoaded = false; bool m_qmlStylesLoaded = false; - Utils::optional m_currentPreset; + std::shared_ptr m_currentPreset; WizardHandler m_wizard; RecentPresetsStore m_recentsStore; + UserPresetsStore m_userPresetsStore; }; } //namespace StudioWelcome diff --git a/src/plugins/studiowelcome/recentpresets.cpp b/src/plugins/studiowelcome/recentpresets.cpp index f6e1335b479..cad2846d757 100644 --- a/src/plugins/studiowelcome/recentpresets.cpp +++ b/src/plugins/studiowelcome/recentpresets.cpp @@ -32,19 +32,27 @@ #include #include -using Core::ICore; -using Utils::QtcSettings; - using namespace StudioWelcome; constexpr char GROUP_NAME[] = "RecentPresets"; constexpr char WIZARDS[] = "Wizards"; -void RecentPresetsStore::add(const QString &categoryId, const QString &name, const QString &sizeName) +void RecentPresetsStore::add(const QString &categoryId, + const QString &name, + const QString &sizeName, + bool isUserPreset) { - std::vector existing = fetchAll(); - QStringList encodedRecents = addRecentToExisting(RecentPreset{categoryId, name, sizeName}, - existing); + std::vector existing = fetchAll(); + + std::vector recents + = addRecentToExisting(RecentPresetData{categoryId, name, sizeName, isUserPreset}, existing); + + save(recents); +} + +void RecentPresetsStore::save(const std::vector &recents) +{ + QStringList encodedRecents = encodeRecentPresets(recents); m_settings->beginGroup(GROUP_NAME); m_settings->setValue(WIZARDS, encodedRecents); @@ -52,8 +60,26 @@ void RecentPresetsStore::add(const QString &categoryId, const QString &name, con m_settings->sync(); } -QStringList RecentPresetsStore::addRecentToExisting(const RecentPreset &preset, - std::vector &recents) +std::vector RecentPresetsStore::remove(const QString &categoryId, const QString &presetName) +{ + std::vector recents = fetchAll(); + size_t countBefore = recents.size(); + + /* NOTE: when removing one preset, it may happen that there are more than one recent for that + * preset. In that case, we need to remove all associated recents, for the preset.*/ + + Utils::erase(recents, [&](const RecentPresetData &p) { + return p.category == categoryId && p.presetName == presetName; + }); + + if (recents.size() < countBefore) + save(recents); + + return recents; +} + +std::vector RecentPresetsStore::addRecentToExisting( + const RecentPresetData &preset, std::vector &recents) { Utils::erase_one(recents, preset); Utils::prepend(recents, preset); @@ -61,48 +87,64 @@ QStringList RecentPresetsStore::addRecentToExisting(const RecentPreset &preset, if (int(recents.size()) > m_max) recents.pop_back(); - return encodeRecentPresets(recents); + return recents; } -std::vector RecentPresetsStore::fetchAll() const +std::vector RecentPresetsStore::fetchAll() const { m_settings->beginGroup(GROUP_NAME); QVariant value = m_settings->value(WIZARDS); m_settings->endGroup(); - std::vector result; + std::vector result; if (value.type() == QVariant::String) result.push_back(decodeOneRecentPreset(value.toString())); else if (value.type() == QVariant::StringList) Utils::concat(result, decodeRecentPresets(value.toList())); - const RecentPreset empty; - return Utils::filtered(result, [&empty](const RecentPreset &recent) { return recent != empty; }); + const RecentPresetData empty; + return Utils::filtered(result, [&empty](const RecentPresetData &recent) { return recent != empty; }); } -QStringList RecentPresetsStore::encodeRecentPresets(const std::vector &recents) +QStringList RecentPresetsStore::encodeRecentPresets(const std::vector &recents) { - return Utils::transform(recents, [](const RecentPreset &p) -> QString { - return std::get<0>(p) + "/" + std::get<1>(p) + ":" + std::get<2>(p); + return Utils::transform(recents, [](const RecentPresetData &p) -> QString { + QString name = p.presetName; + if (p.isUserPreset) + name.prepend("[U]"); + + return p.category + "/" + name + ":" + p.sizeName; }); } -RecentPreset RecentPresetsStore::decodeOneRecentPreset(const QString &encoded) +RecentPresetData RecentPresetsStore::decodeOneRecentPreset(const QString &encoded) { - QRegularExpression pattern{R"(^(\S+)/(.+):(\d+ x \d+))"}; + QRegularExpression pattern{R"(^(\S+)/(.+):(\d+ x \d+)$)"}; auto m = pattern.match(encoded); if (!m.hasMatch()) - return RecentPreset{}; + return RecentPresetData{}; QString category = m.captured(1); QString name = m.captured(2); QString size = m.captured(3); + bool isUserPreset = name.startsWith("[U]"); + if (isUserPreset) + name = name.split("[U]")[1]; - return std::make_tuple(category, name, size); + if (!QRegularExpression{R"(^\w[\w ]*$)"}.match(name).hasMatch()) + return RecentPresetData{}; + + RecentPresetData result; + result.category = category; + result.presetName = name; + result.sizeName = size; + result.isUserPreset = isUserPreset; + + return result; } -std::vector RecentPresetsStore::decodeRecentPresets(const QVariantList &values) +std::vector RecentPresetsStore::decodeRecentPresets(const QVariantList &values) { return Utils::transform(values, [](const QVariant &value) { return decodeOneRecentPreset(value.toString()); diff --git a/src/plugins/studiowelcome/recentpresets.h b/src/plugins/studiowelcome/recentpresets.h index 3c223d8df55..83ab5fb8cc5 100644 --- a/src/plugins/studiowelcome/recentpresets.h +++ b/src/plugins/studiowelcome/recentpresets.h @@ -31,8 +31,43 @@ namespace StudioWelcome { -// preset category, preset name, size name -using RecentPreset = std::tuple; +struct RecentPresetData +{ + RecentPresetData() = default; + RecentPresetData(const QString &category, + const QString &name, + const QString &size, + bool isUserPreset = false) + : category{category} + , presetName{name} + , sizeName{size} + , isUserPreset{isUserPreset} + {} + + QString category; + QString presetName; + QString sizeName; + bool isUserPreset = false; +}; + +inline bool operator==(const RecentPresetData &lhs, const RecentPresetData &rhs) +{ + return lhs.category == rhs.category && lhs.presetName == rhs.presetName + && lhs.sizeName == rhs.sizeName && lhs.isUserPreset == rhs.isUserPreset; +} + +inline bool operator!=(const RecentPresetData &lhs, const RecentPresetData &rhs) +{ + return !(lhs == rhs); +} + +inline QDebug &operator<<(QDebug &d, const RecentPresetData &preset) +{ + d << "RecentPreset{category=" << preset.category << "; name=" << preset.presetName + << "; size=" << preset.sizeName << "; isUserPreset=" << preset.isUserPreset << "}"; + + return d; +} class RecentPresetsStore { @@ -42,14 +77,21 @@ public: {} void setMaximum(int n) { m_max = n; } - void add(const QString &categoryId, const QString &name, const QString &sizeName); - std::vector fetchAll() const; + void add(const QString &categoryId, + const QString &name, + const QString &sizeName, + bool isUserPreset = false); + + std::vector remove(const QString &categoryId, const QString &presetName); + std::vector fetchAll() const; private: - QStringList addRecentToExisting(const RecentPreset &preset, std::vector &recents); - static QStringList encodeRecentPresets(const std::vector &recents); - static std::vector decodeRecentPresets(const QVariantList &values); - static RecentPreset decodeOneRecentPreset(const QString &encoded); + std::vector addRecentToExisting(const RecentPresetData &preset, + std::vector &recents); + static QStringList encodeRecentPresets(const std::vector &recents); + static std::vector decodeRecentPresets(const QVariantList &values); + static RecentPresetData decodeOneRecentPreset(const QString &encoded); + void save(const std::vector &recents); private: QSettings *m_settings = nullptr; diff --git a/src/plugins/studiowelcome/studiowelcome.qbs b/src/plugins/studiowelcome/studiowelcome.qbs index cc655ea5a23..9648eda14d3 100644 --- a/src/plugins/studiowelcome/studiowelcome.qbs +++ b/src/plugins/studiowelcome/studiowelcome.qbs @@ -38,7 +38,9 @@ QtcPlugin { "wizardhandler.cpp", "wizardhandler.h", "recentpresets.cpp", - "recentpresets.h" + "recentpresets.h", + "userpresets.cpp", + "userpresets.h" ] Group { diff --git a/src/plugins/studiowelcome/userpresets.cpp b/src/plugins/studiowelcome/userpresets.cpp new file mode 100644 index 00000000000..d468c3522eb --- /dev/null +++ b/src/plugins/studiowelcome/userpresets.cpp @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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 General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "userpresets.h" + +#include +#include +#include + +using namespace StudioWelcome; + +constexpr char PREFIX[] = "UserPresets"; + +UserPresetsStore::UserPresetsStore() +{ + m_settings = std::make_unique(fullFilePath(), QSettings::IniFormat); +} + +UserPresetsStore::UserPresetsStore(std::unique_ptr &&settings) + : m_settings{std::move(settings)} +{} + +void UserPresetsStore::savePresets(const std::vector &presets) +{ + m_settings->beginWriteArray(PREFIX, static_cast(presets.size())); + + for (size_t i = 0; i < presets.size(); ++i) { + m_settings->setArrayIndex(static_cast(i)); + const auto &preset = presets[i]; + + m_settings->setValue("categoryId", preset.categoryId); + m_settings->setValue("wizardName", preset.wizardName); + m_settings->setValue("name", preset.name); + m_settings->setValue("screenSize", preset.screenSize); + m_settings->setValue("useQtVirtualKeyboard", preset.useQtVirtualKeyboard); + m_settings->setValue("qtVersion", preset.qtVersion); + m_settings->setValue("styleName", preset.styleName); + } + m_settings->endArray(); + m_settings->sync(); + +} + +bool UserPresetsStore::save(const UserPresetData &newPreset) +{ + QTC_ASSERT(newPreset.isValid(), return false); + + std::vector presetItems = fetchAll(); + if (Utils::anyOf(presetItems, + [&newPreset](const UserPresetData &p) { return p.name == newPreset.name; })) { + return false; + } + + presetItems.push_back(newPreset); + savePresets(presetItems); + + return true; +} + +void UserPresetsStore::remove(const QString &category, const QString &name) +{ + std::vector presetItems = fetchAll(); + auto item = Utils::take(presetItems, [&](const UserPresetData &p) { + return p.categoryId == category && p.name == name; + }); + + if (!item) + return; + + savePresets(presetItems); +} + +std::vector UserPresetsStore::fetchAll() const +{ + std::vector result; + int size = m_settings->beginReadArray(PREFIX); + if (size >= 0) + result.reserve(static_cast(size) + 1); + + for (int i = 0; i < size; ++i) { + m_settings->setArrayIndex(i); + + UserPresetData preset; + preset.categoryId = m_settings->value("categoryId").toString(); + preset.wizardName = m_settings->value("wizardName").toString(); + preset.name = m_settings->value("name").toString(); + preset.screenSize = m_settings->value("screenSize").toString(); + preset.useQtVirtualKeyboard = m_settings->value("useQtVirtualKeyboard").toBool(); + preset.qtVersion = m_settings->value("qtVersion").toString(); + preset.styleName = m_settings->value("styleName").toString(); + + if (preset.isValid()) + result.push_back(std::move(preset)); + } + m_settings->endArray(); + + return result; +} + +QString UserPresetsStore::fullFilePath() const +{ + return Core::ICore::userResourcePath("UserPresets.ini").toString(); +} diff --git a/src/plugins/studiowelcome/userpresets.h b/src/plugins/studiowelcome/userpresets.h new file mode 100644 index 00000000000..4f6053ef260 --- /dev/null +++ b/src/plugins/studiowelcome/userpresets.h @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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 General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include +#include + +namespace StudioWelcome { + +struct UserPresetData +{ + QString categoryId; + QString wizardName; + QString name; + QString screenSize; + + bool useQtVirtualKeyboard; + QString qtVersion; + QString styleName; + + bool isValid() const + { + return !categoryId.isEmpty() + && !wizardName.isEmpty() + && !name.isEmpty(); + } +}; + +inline QDebug &operator<<(QDebug &d, const UserPresetData &preset) +{ + d << "UserPreset{category = " << preset.categoryId; + d << "; wizardName = " << preset.wizardName; + d << "; name = " << preset.name; + d << "; screenSize = " << preset.screenSize; + d << "; keyboard = " << preset.useQtVirtualKeyboard; + d << "; qt = " << preset.qtVersion; + d << "; style = " << preset.styleName; + d << "}"; + + return d; +} + +inline bool operator==(const UserPresetData &lhs, const UserPresetData &rhs) +{ + return lhs.categoryId == rhs.categoryId && lhs.wizardName == rhs.wizardName + && lhs.name == rhs.name && lhs.screenSize == rhs.screenSize + && lhs.useQtVirtualKeyboard == rhs.useQtVirtualKeyboard && lhs.qtVersion == rhs.qtVersion + && lhs.styleName == rhs.styleName; +} + +class UserPresetsStore +{ +public: + UserPresetsStore(); + UserPresetsStore(std::unique_ptr &&settings); + + bool save(const UserPresetData &preset); + void remove(const QString &category, const QString &name); + std::vector fetchAll() const; + +private: + QString fullFilePath() const; + void savePresets(const std::vector &presets); + + std::unique_ptr m_settings; +}; + +} // namespace StudioWelcome diff --git a/src/plugins/studiowelcome/wizardfactories.cpp b/src/plugins/studiowelcome/wizardfactories.cpp index d374a5258c8..e271d5572e4 100644 --- a/src/plugins/studiowelcome/wizardfactories.cpp +++ b/src/plugins/studiowelcome/wizardfactories.cpp @@ -76,7 +76,7 @@ void WizardFactories::filter() m_factories = acceptedFactories; } -PresetItem WizardFactories::makePresetItem(JsonWizardFactory *f, QWidget *parent, +std::shared_ptr WizardFactories::makePresetItem(JsonWizardFactory *f, QWidget *parent, const Utils::Id &platform) { using namespace std::placeholders; @@ -89,16 +89,17 @@ PresetItem WizardFactories::makePresetItem(JsonWizardFactory *f, QWidget *parent else sizeName = screenSizes[index]; - return { - /*.name =*/f->displayName(), - /*.categoryId =*/f->category(), - /*.screenSizeName=*/sizeName, - /*.description =*/f->description(), - /*.qmlPath =*/f->detailsPageQmlPath(), - /*.fontIconCode =*/m_getIconUnicode(f->fontIconName()), - /*.create =*/ std::bind(&JsonWizardFactory::runWizard, f, _1, parent, platform, - QVariantMap(), false), - }; + auto result = std::make_shared(); + result->wizardName = f->displayName(); + result->categoryId = f->category(); + result->screenSizeName=sizeName; + result->description = f->description(); + result->qmlPath = f->detailsPageQmlPath(); + result->fontIconCode = m_getIconUnicode(f->fontIconName()); + result->create + = std::bind(&JsonWizardFactory::runWizard, f, _1, parent, platform, QVariantMap(), false); + + return result; } std::map WizardFactories::makePresetItemsGroupedByCategory() diff --git a/src/plugins/studiowelcome/wizardfactories.h b/src/plugins/studiowelcome/wizardfactories.h index aa209362de6..c98fd5e1027 100644 --- a/src/plugins/studiowelcome/wizardfactories.h +++ b/src/plugins/studiowelcome/wizardfactories.h @@ -64,7 +64,7 @@ private: void sortByCategoryAndId(); void filter(); - PresetItem makePresetItem(JsonWizardFactory *f, QWidget *parent, const Utils::Id &platform); + std::shared_ptr makePresetItem(JsonWizardFactory *f, QWidget *parent, const Utils::Id &platform); std::map makePresetItemsGroupedByCategory(); private: diff --git a/src/plugins/studiowelcome/wizardhandler.cpp b/src/plugins/studiowelcome/wizardhandler.cpp index cd176707ac9..56c53fcad92 100644 --- a/src/plugins/studiowelcome/wizardhandler.cpp +++ b/src/plugins/studiowelcome/wizardhandler.cpp @@ -38,7 +38,7 @@ using namespace StudioWelcome; -void WizardHandler::reset(const PresetItem &presetInfo, int presetSelection) +void WizardHandler::reset(const std::shared_ptr &presetInfo, int presetSelection) { m_preset = presetInfo; m_selectedPreset = presetSelection; @@ -67,7 +67,7 @@ void WizardHandler::destroyWizard() void WizardHandler::setupWizard() { - m_wizard = m_preset.create(m_projectLocation); + m_wizard = m_preset->create(m_projectLocation); if (!m_wizard) { emit wizardCreationFailed(); return; @@ -142,6 +142,11 @@ QStandardItemModel *WizardHandler::getScreenFactorModel(ProjectExplorer::JsonFie return cbfield->model(); } +bool WizardHandler::haveStyleModel() const +{ + return m_wizard->hasField("ControlsStyle"); +} + QStandardItemModel *WizardHandler::getStyleModel(ProjectExplorer::JsonFieldPage *page) { auto *field = page->jsonField("ControlsStyle"); @@ -229,6 +234,47 @@ bool WizardHandler::haveTargetQtVersion() const return m_wizard->hasField("TargetQtVersion"); } +QString WizardHandler::targetQtVersionName(int index) const +{ + auto *field = m_detailsPage->jsonField("TargetQtVersion"); + auto *cbfield = dynamic_cast(field); + QTC_ASSERT(cbfield, return ""); + + QStandardItemModel *model = cbfield->model(); + if (index < 0 || index >= model->rowCount()) + return {}; + + QString text = model->item(index)->text(); + return text; +} + +int WizardHandler::targetQtVersionIndex(const QString &qtVersionName) const +{ + auto *field = m_detailsPage->jsonField("TargetQtVersion"); + auto *cbfield = dynamic_cast(field); + QTC_ASSERT(cbfield, return -1); + + const QStandardItemModel *model = cbfield->model(); + for (int i = 0; i < model->rowCount(); ++i) { + const QStandardItem *item = model->item(i, 0); + const QString text = item->text(); + + if (text == qtVersionName) + return i; + } + + return -1; +} + +int WizardHandler::targetQtVersionIndex() const +{ + auto *field = m_detailsPage->jsonField("TargetQtVersion"); + auto *cbfield = dynamic_cast(field); + QTC_ASSERT(cbfield, return -1); + + return cbfield->selectedRow(); +} + void WizardHandler::setStyleIndex(int index) { auto *field = m_detailsPage->jsonField("ControlsStyle"); @@ -247,6 +293,38 @@ int WizardHandler::styleIndex() const return cbfield->selectedRow(); } +int WizardHandler::styleIndex(const QString &styleName) const +{ + auto *field = m_detailsPage->jsonField("ControlsStyle"); + auto *cbfield = dynamic_cast(field); + QTC_ASSERT(cbfield, return -1); + + const QStandardItemModel *model = cbfield->model(); + for (int i = 0; i < model->rowCount(); ++i) { + const QStandardItem *item = model->item(i, 0); + const QString text = item->text(); + + if (text == styleName) + return i; + } + + return -1; +} + +QString WizardHandler::styleName(int index) const +{ + auto *field = m_detailsPage->jsonField("ControlsStyle"); + auto *cbfield = dynamic_cast(field); + QTC_ASSERT(cbfield, return ""); + + QStandardItemModel *model = cbfield->model(); + if (index < 0 || index >= model->rowCount()) + return {}; + + QString text = model->item(index)->text(); + return text; +} + void WizardHandler::setUseVirtualKeyboard(bool value) { auto *field = m_detailsPage->jsonField("UseVirtualKeyboard"); diff --git a/src/plugins/studiowelcome/wizardhandler.h b/src/plugins/studiowelcome/wizardhandler.h index 112accfb158..ce13b77572f 100644 --- a/src/plugins/studiowelcome/wizardhandler.h +++ b/src/plugins/studiowelcome/wizardhandler.h @@ -47,15 +47,23 @@ class WizardHandler: public QObject Q_OBJECT public: - void reset(const PresetItem &presetInfo, int presetSelection); + void reset(const std::shared_ptr &presetInfo, int presetSelection); void setScreenSizeIndex(int index); int screenSizeIndex(const QString &sizeName) const; QString screenSizeName(int index) const; int screenSizeIndex() const; + int targetQtVersionIndex() const; + int targetQtVersionIndex(const QString &qtVersionName) const; void setTargetQtVersionIndex(int index); bool haveTargetQtVersion() const; + QString targetQtVersionName(int index) const; + void setStyleIndex(int index); int styleIndex() const; + int styleIndex(const QString &styleName) const; + QString styleName(int index) const; + bool haveStyleModel() const; + void destroyWizard(); void setUseVirtualKeyboard(bool value); @@ -66,7 +74,7 @@ public: void run(const std::function &processPage); - PresetItem preset() const { return m_preset; } + std::shared_ptr preset() const { return m_preset; } signals: void deletingWizard(); @@ -93,7 +101,7 @@ private: int m_selectedPreset = -1; - PresetItem m_preset; + std::shared_ptr m_preset; Utils::FilePath m_projectLocation; }; diff --git a/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt b/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt index 0606be1a550..c5040112efd 100644 --- a/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt +++ b/tests/auto/qml/qmldesigner/wizard/CMakeLists.txt @@ -18,12 +18,14 @@ add_qtc_test(tst_qml_wizard wizardfactories-test.cpp stylemodel-test.cpp recentpresets-test.cpp + userpresets-test.cpp presetmodel-test.cpp test-utilities.h test-main.cpp "${StudioWelcomeDir}/wizardfactories.cpp" "${StudioWelcomeDir}/stylemodel.cpp" "${StudioWelcomeDir}/recentpresets.cpp" + "${StudioWelcomeDir}/userpresets.cpp" "${StudioWelcomeDir}/presetmodel.cpp" ) diff --git a/tests/auto/qml/qmldesigner/wizard/presetmodel-test.cpp b/tests/auto/qml/qmldesigner/wizard/presetmodel-test.cpp index dc855b67a33..f2233eee855 100644 --- a/tests/auto/qml/qmldesigner/wizard/presetmodel-test.cpp +++ b/tests/auto/qml/qmldesigner/wizard/presetmodel-test.cpp @@ -33,10 +33,18 @@ using ::testing::ElementsAreArray; using ::testing::PrintToString; namespace StudioWelcome { + +void PrintTo(const UserPresetItem &item, std::ostream *os); + void PrintTo(const PresetItem &item, std::ostream *os) { + if (typeid(item) == typeid(UserPresetItem)) { + PrintTo((UserPresetItem &) item, os); + return; + } + *os << "{categId: " << item.categoryId << ", " - << "name: " << item.name; + << "name: " << item.wizardName; if (!item.screenSizeName.isEmpty()) *os << ", size: " << item.screenSizeName; @@ -44,6 +52,26 @@ void PrintTo(const PresetItem &item, std::ostream *os) *os << "}"; } +void PrintTo(const UserPresetItem &item, std::ostream *os) +{ + *os << "{categId: " << item.categoryId << ", " + << "name: " << item.wizardName << ", " + << "user name: " << item.userName; + + if (!item.screenSizeName.isEmpty()) + *os << ", size: " << item.screenSizeName; + + *os << "}"; +} + +void PrintTo(const std::shared_ptr &p, std::ostream *os) +{ + if (p) + PrintTo(*p, os); + else + *os << "{null}"; +} + } // namespace StudioWelcome namespace { @@ -51,20 +79,47 @@ std::pair aCategory(const QString &categId, const QString &categName, const std::vector &names) { - std::vector items = Utils::transform(names, [&categId](const QString &name) { - return PresetItem{name, categId}; - }); + std::vector> items + = Utils::transform(names, [&categId](const QString &name) { + std::shared_ptr item{new PresetItem}; + item->wizardName = name; + item->categoryId = categId; + + return item; + }); return std::make_pair(categId, WizardCategory{categId, categName, items}); } +UserPresetData aUserPreset(const QString &categId, const QString &wizardName, const QString &userName) +{ + UserPresetData preset; + preset.categoryId = categId; + preset.wizardName = wizardName; + preset.name = userName; + + return preset; +} + MATCHER_P2(PresetIs, category, name, PrintToString(PresetItem{name, category})) { - return arg.categoryId == category && arg.name == name; + return arg->categoryId == category && arg->wizardName == name; +} + +MATCHER_P3(UserPresetIs, + category, + wizardName, + userName, + PrintToString(UserPresetItem{wizardName, userName, category})) +{ + auto userPreset = dynamic_cast(arg.get()); + + return userPreset->categoryId == category && userPreset->wizardName == wizardName + && userPreset->userName == userName; } MATCHER_P3(PresetIs, category, name, size, PrintToString(PresetItem{name, category, size})) { - return arg.categoryId == category && arg.name == name && size == arg.screenSizeName; + return arg->categoryId == category && arg->wizardName == name && size == arg->screenSizeName; } } // namespace @@ -88,6 +143,7 @@ TEST(QdsPresetModel, haveSameArraySizeForPresetsAndCategories) aCategory("A.categ", "A", {"item a", "item b"}), aCategory("B.categ", "B", {"item c", "item d"}), }, + {/*user presets*/}, {/*recents*/}); ASSERT_THAT(data.presets(), SizeIs(2)); @@ -105,6 +161,7 @@ TEST(QdsPresetModel, haveWizardPresetsNoRecents) aCategory("A.categ", "A", {"item a", "item b"}), aCategory("B.categ", "B", {"item c", "item d"}), }, + {/*user presets*/}, {/*recents*/}); // Then @@ -115,11 +172,30 @@ TEST(QdsPresetModel, haveWizardPresetsNoRecents) ElementsAre(PresetIs("B.categ", "item c"), PresetIs("B.categ", "item d"))); } +TEST(QdsPresetModel, whenHaveUserPresetsButNoWizardPresetsReturnEmpty) +{ + // Given + PresetData data; + + // When + data.setData({/*builtin presets*/}, + { + aUserPreset("A.Mobile", "Scroll", "iPhone5"), + aUserPreset("B.Desktop", "Launcher", "MacBook"), + }, + {/*recents*/}); + + // Then + ASSERT_THAT(data.categories(), IsEmpty()); + ASSERT_THAT(data.presets(), IsEmpty()); +} + TEST(QdsPresetModel, haveRecentsNoWizardPresets) { PresetData data; data.setData({/*wizardPresets*/}, + {/*user presets*/}, { {"A.categ", "Desktop", "640 x 480"}, {"B.categ", "Mobile", "800 x 600"}, @@ -129,7 +205,7 @@ TEST(QdsPresetModel, haveRecentsNoWizardPresets) ASSERT_THAT(data.presets(), IsEmpty()); } -TEST(QdsPresetModel, recentsAddedBeforeWizardPresets) +TEST(QdsPresetModel, recentsAddedWithWizardPresets) { // Given PresetData data; @@ -141,6 +217,7 @@ TEST(QdsPresetModel, recentsAddedBeforeWizardPresets) aCategory("A.categ", "A", {"Desktop", "item b"}), aCategory("B.categ", "B", {"item c", "Mobile"}), }, + {/*user presets*/}, /*recents*/ { {"A.categ", "Desktop", "800 x 600"}, @@ -158,7 +235,98 @@ TEST(QdsPresetModel, recentsAddedBeforeWizardPresets) ElementsAre(PresetIs("B.categ", "item c"), PresetIs("B.categ", "Mobile"))})); } -TEST(QdsPresetModel, recentsShouldNotSorted) +TEST(QdsPresetModel, userPresetsAddedWithWizardPresets) +{ + // Given + PresetData data; + + // When + data.setData( + /*wizard presets*/ + { + aCategory("A.categ", "A", {"Desktop", "item b"}), + aCategory("B.categ", "B", {"Mobile"}), + }, + { + aUserPreset("A.categ", "Desktop", "Windows10"), + }, + {/*recents*/}); + + // Then + ASSERT_THAT(data.categories(), ElementsAre("A", "B", "Custom")); + ASSERT_THAT(data.presets(), + ElementsAre(ElementsAre(PresetIs("A.categ", "Desktop"), + PresetIs("A.categ", "item b")), + ElementsAre(PresetIs("B.categ", "Mobile")), + ElementsAre(UserPresetIs("A.categ", "Desktop", "Windows10")))); +} + +TEST(QdsPresetModel, doesNotAddUserPresetsOfNonExistingCategory) +{ + // Given + PresetData data; + + // When + data.setData( + /*wizard presets*/ + { + aCategory("A.categ", "A", {"Desktop"}), // Only category "A.categ" exists + }, + { + aUserPreset("Bad.Categ", "Desktop", "Windows8"), // Bad.Categ does not exist + }, + {/*recents*/}); + + // Then + ASSERT_THAT(data.categories(), ElementsAre("A")); + ASSERT_THAT(data.presets(), ElementsAre(ElementsAre(PresetIs("A.categ", "Desktop")))); +} + +TEST(QdsPresetModel, doesNotAddUserPresetIfWizardPresetItRefersToDoesNotExist) +{ + // Given + PresetData data; + + // When + data.setData( + /*wizard presets*/ + { + aCategory("A.categ", "A", {"Desktop"}), + }, + { + aUserPreset("B.categ", "BadWizard", "Tablet"), // BadWizard referenced does not exist + }, + {/*recents*/}); + + // Then + ASSERT_THAT(data.categories(), ElementsAre("A")); + ASSERT_THAT(data.presets(), ElementsAre(ElementsAre(PresetIs("A.categ", "Desktop")))); +} + +TEST(QdsPresetModel, userPresetWithSameNameAsWizardPreset) +{ + // Given + PresetData data; + + // When + data.setData( + /*wizard presets*/ + { + aCategory("A.categ", "A", {"Desktop"}), + }, + { + aUserPreset("A.categ", "Desktop", "Desktop"), + }, + {/*recents*/}); + + // Then + ASSERT_THAT(data.categories(), ElementsAre("A", "Custom")); + ASSERT_THAT(data.presets(), + ElementsAre(ElementsAre(PresetIs("A.categ", "Desktop")), + ElementsAre(UserPresetIs("A.categ", "Desktop", "Desktop")))); +} + +TEST(QdsPresetModel, recentsShouldNotBeSorted) { // Given PresetData data; @@ -171,6 +339,7 @@ TEST(QdsPresetModel, recentsShouldNotSorted) aCategory("B.categ", "B", {"item c", "Mobile"}), aCategory("Z.categ", "Z", {"Z.desktop"}), }, + {/*user presets*/}, /*recents*/ { {"Z.categ", "Z.desktop", "200 x 300"}, @@ -197,6 +366,7 @@ TEST(QdsPresetModel, recentsOfSameWizardProjectButDifferentSizesAreRecognizedAsD aCategory("A.categ", "A", {"Desktop"}), aCategory("B.categ", "B", {"Mobile"}), }, + {/*user presets*/}, /*recents*/ { {"B.categ", "Mobile", "400 x 400"}, @@ -223,6 +393,7 @@ TEST(QdsPresetModel, outdatedRecentsAreNotShown) aCategory("A.categ", "A", {"Desktop"}), aCategory("B.categ", "B", {"Mobile"}), }, + {/*user presets*/}, /*recents*/ { {"B.categ", "NoLongerExists", "400 x 400"}, diff --git a/tests/auto/qml/qmldesigner/wizard/recentpresets-test.cpp b/tests/auto/qml/qmldesigner/wizard/recentpresets-test.cpp index b1bb0e06260..745462f5c1b 100644 --- a/tests/auto/qml/qmldesigner/wizard/recentpresets-test.cpp +++ b/tests/auto/qml/qmldesigner/wizard/recentpresets-test.cpp @@ -38,6 +38,16 @@ using namespace StudioWelcome; constexpr char GROUP_NAME[] = "RecentPresets"; constexpr char ITEMS[] = "Wizards"; +namespace StudioWelcome { +void PrintTo(const RecentPresetData &recent, std::ostream *os) +{ + *os << "{categId: " << recent.category << ", name: " << recent.presetName + << ", size: " << recent.sizeName << ", isUser: " << recent.isUserPreset; + + *os << "}"; +} +} // namespace StudioWelcome + class QdsRecentPresets : public ::testing::Test { protected: @@ -73,7 +83,7 @@ TEST_F(QdsRecentPresets, readFromEmptyStore) { RecentPresetsStore store{&settings}; - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); ASSERT_THAT(recents, IsEmpty()); } @@ -82,7 +92,7 @@ TEST_F(QdsRecentPresets, readEmptyRecentPresets) { RecentPresetsStore store = aStoreWithOne(""); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); ASSERT_THAT(recents, IsEmpty()); } @@ -91,25 +101,34 @@ TEST_F(QdsRecentPresets, readOneRecentPresetAsList) { RecentPresetsStore store = aStoreWithRecents({"category/preset:640 x 480"}); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); - ASSERT_THAT(recents, ElementsAre(RecentPreset("category", "preset", "640 x 480"))); + ASSERT_THAT(recents, ElementsAre(RecentPresetData("category", "preset", "640 x 480"))); } TEST_F(QdsRecentPresets, readOneRecentPresetAsString) { RecentPresetsStore store = aStoreWithOne("category/preset:200 x 300"); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); - ASSERT_THAT(recents, ElementsAre(RecentPreset("category", "preset", "200 x 300"))); + ASSERT_THAT(recents, ElementsAre(RecentPresetData("category", "preset", "200 x 300"))); +} + +TEST_F(QdsRecentPresets, readOneRecentUserPresetAsString) +{ + RecentPresetsStore store = aStoreWithOne("category/[U]preset:200 x 300"); + + std::vector recents = store.fetchAll(); + + ASSERT_THAT(recents, ElementsAre(RecentPresetData("category", "preset", "200 x 300", true))); } TEST_F(QdsRecentPresets, readBadRecentPresetAsString) { RecentPresetsStore store = aStoreWithOne("no_category_only_preset"); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); ASSERT_THAT(recents, IsEmpty()); } @@ -118,24 +137,32 @@ TEST_F(QdsRecentPresets, readBadRecentPresetAsInt) { RecentPresetsStore store = aStoreWithOne(32); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); ASSERT_THAT(recents, IsEmpty()); } TEST_F(QdsRecentPresets, readBadRecentPresetsInList) { - RecentPresetsStore store = aStoreWithRecents({"bad1", // no category, no size - "categ/name:800 x 600", // good - "categ/bad2", //no size - "categ/bad3:", //no size - "categ 1/bad4:200 x 300", // category has space - "categ/bad5: 400 x 300", // size starts with space - "categ/bad6:400"}); // bad size + RecentPresetsStore store = aStoreWithRecents({ + "bad1", // no category, no size + "categ/name:800 x 600", // good + "categ/bad2", //no size + "categ/bad3:", //no size + "categ 1/bad4:200 x 300", // category has space + "categ/bad5: 400 x 300", // size starts with space + "categ/bad6:400", // bad size + "categ/[U]user:300 x 200", // good + "categ/[u]user2:300 x 200", // small cap "U" + "categ/[x]user3:300 x 200", // must be letter "U" + "categ/[U] user4:300 x 200", // space + }); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); - ASSERT_THAT(recents, ElementsAre(RecentPreset("categ", "name", "800 x 600"))); + ASSERT_THAT(recents, + ElementsAre(RecentPresetData("categ", "name", "800 x 600", false), + RecentPresetData("categ", "user", "300 x 200", true))); } TEST_F(QdsRecentPresets, readTwoRecentPresets) @@ -143,11 +170,23 @@ TEST_F(QdsRecentPresets, readTwoRecentPresets) RecentPresetsStore store = aStoreWithRecents( {"category_1/preset 1:640 x 480", "category_2/preset 2:320 x 200"}); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); ASSERT_THAT(recents, - ElementsAre(RecentPreset("category_1", "preset 1", "640 x 480"), - RecentPreset("category_2", "preset 2", "320 x 200"))); + ElementsAre(RecentPresetData("category_1", "preset 1", "640 x 480"), + RecentPresetData("category_2", "preset 2", "320 x 200"))); +} + +TEST_F(QdsRecentPresets, readRecentsToDifferentKindsOfPresets) +{ + RecentPresetsStore store = aStoreWithRecents( + {"category_1/preset 1:640 x 480", "category_2/[U]preset 2:320 x 200"}); + + std::vector recents = store.fetchAll(); + + ASSERT_THAT(recents, + ElementsAre(RecentPresetData("category_1", "preset 1", "640 x 480", false), + RecentPresetData("category_2", "preset 2", "320 x 200", true))); } TEST_F(QdsRecentPresets, addFirstRecentPreset) @@ -155,19 +194,44 @@ TEST_F(QdsRecentPresets, addFirstRecentPreset) RecentPresetsStore store{&settings}; store.add("A.Category", "Normal Application", "400 x 600"); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); - ASSERT_THAT(recents, ElementsAre(RecentPreset("A.Category", "Normal Application", "400 x 600"))); + ASSERT_THAT(recents, ElementsAre(RecentPresetData("A.Category", "Normal Application", "400 x 600"))); +} + +TEST_F(QdsRecentPresets, addFirstRecentUserPreset) +{ + RecentPresetsStore store{&settings}; + + store.add("A.Category", "Normal Application", "400 x 600", /*user preset*/ true); + std::vector recents = store.fetchAll(); + + ASSERT_THAT(recents, + ElementsAre(RecentPresetData("A.Category", "Normal Application", "400 x 600", true))); } TEST_F(QdsRecentPresets, addExistingFirstRecentPreset) { - RecentPresetsStore store = aStoreWithRecents({"category/preset"}); + RecentPresetsStore store = aStoreWithRecents({"category/preset:200 x 300"}); + ASSERT_THAT(store.fetchAll(), ElementsAre(RecentPresetData("category", "preset", "200 x 300"))); store.add("category", "preset", "200 x 300"); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); - ASSERT_THAT(recents, ElementsAre(RecentPreset("category", "preset", "200 x 300"))); + ASSERT_THAT(recents, ElementsAre(RecentPresetData("category", "preset", "200 x 300"))); +} + +TEST_F(QdsRecentPresets, addRecentUserPresetWithSameNameAsExistingRecentNormalPreset) +{ + RecentPresetsStore store = aStoreWithRecents({"category/preset:200 x 300"}); + ASSERT_THAT(store.fetchAll(), ElementsAre(RecentPresetData("category", "preset", "200 x 300"))); + + store.add("category", "preset", "200 x 300", /*user preset*/ true); + std::vector recents = store.fetchAll(); + + ASSERT_THAT(recents, + ElementsAre(RecentPresetData("category", "preset", "200 x 300", true), + RecentPresetData("category", "preset", "200 x 300", false))); } TEST_F(QdsRecentPresets, addSecondRecentPreset) @@ -175,11 +239,11 @@ TEST_F(QdsRecentPresets, addSecondRecentPreset) RecentPresetsStore store = aStoreWithRecents({"A.Category/Preset 1:800 x 600"}); store.add("A.Category", "Preset 2", "640 x 480"); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); ASSERT_THAT(recents, - ElementsAre(RecentPreset("A.Category", "Preset 2", "640 x 480"), - RecentPreset("A.Category", "Preset 1", "800 x 600"))); + ElementsAre(RecentPresetData("A.Category", "Preset 2", "640 x 480"), + RecentPresetData("A.Category", "Preset 1", "800 x 600"))); } TEST_F(QdsRecentPresets, addSecondRecentPresetSameKindButDifferentSize) @@ -187,11 +251,11 @@ TEST_F(QdsRecentPresets, addSecondRecentPresetSameKindButDifferentSize) RecentPresetsStore store = aStoreWithRecents({"A.Category/Preset:800 x 600"}); store.add("A.Category", "Preset", "640 x 480"); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); ASSERT_THAT(recents, - ElementsAre(RecentPreset("A.Category", "Preset", "640 x 480"), - RecentPreset("A.Category", "Preset", "800 x 600"))); + ElementsAre(RecentPresetData("A.Category", "Preset", "640 x 480"), + RecentPresetData("A.Category", "Preset", "800 x 600"))); } TEST_F(QdsRecentPresets, fetchesRecentPresetsInTheReverseOrderTheyWereAdded) @@ -201,12 +265,12 @@ TEST_F(QdsRecentPresets, fetchesRecentPresetsInTheReverseOrderTheyWereAdded) store.add("A.Category", "Preset 1", "640 x 480"); store.add("A.Category", "Preset 2", "640 x 480"); store.add("A.Category", "Preset 3", "800 x 600"); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); ASSERT_THAT(recents, - ElementsAre(RecentPreset("A.Category", "Preset 3", "800 x 600"), - RecentPreset("A.Category", "Preset 2", "640 x 480"), - RecentPreset("A.Category", "Preset 1", "640 x 480"))); + ElementsAre(RecentPresetData("A.Category", "Preset 3", "800 x 600"), + RecentPresetData("A.Category", "Preset 2", "640 x 480"), + RecentPresetData("A.Category", "Preset 1", "640 x 480"))); } TEST_F(QdsRecentPresets, addingAnExistingRecentPresetMakesItTheFirst) @@ -216,12 +280,12 @@ TEST_F(QdsRecentPresets, addingAnExistingRecentPresetMakesItTheFirst) "A.Category/Preset 3:640 x 480"}); store.add("A.Category", "Preset 3", "640 x 480"); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); ASSERT_THAT(recents, - ElementsAre(RecentPreset("A.Category", "Preset 3", "640 x 480"), - RecentPreset("A.Category", "Preset 1", "200 x 300"), - RecentPreset("A.Category", "Preset 2", "200 x 300"))); + ElementsAre(RecentPresetData("A.Category", "Preset 3", "640 x 480"), + RecentPresetData("A.Category", "Preset 1", "200 x 300"), + RecentPresetData("A.Category", "Preset 2", "200 x 300"))); } TEST_F(QdsRecentPresets, addingTooManyRecentPresetsRemovesTheOldestOne) @@ -231,9 +295,9 @@ TEST_F(QdsRecentPresets, addingTooManyRecentPresetsRemovesTheOldestOne) store.setMaximum(2); store.add("A.Category", "Preset 3", "200 x 300"); - std::vector recents = store.fetchAll(); + std::vector recents = store.fetchAll(); ASSERT_THAT(recents, - ElementsAre(RecentPreset("A.Category", "Preset 3", "200 x 300"), - RecentPreset("A.Category", "Preset 2", "200 x 300"))); + ElementsAre(RecentPresetData("A.Category", "Preset 3", "200 x 300"), + RecentPresetData("A.Category", "Preset 2", "200 x 300"))); } diff --git a/tests/auto/qml/qmldesigner/wizard/userpresets-test.cpp b/tests/auto/qml/qmldesigner/wizard/userpresets-test.cpp new file mode 100644 index 00000000000..8fa73402c08 --- /dev/null +++ b/tests/auto/qml/qmldesigner/wizard/userpresets-test.cpp @@ -0,0 +1,308 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** 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 General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "test-utilities.h" +#include "userpresets.h" + +#include +#include + +namespace StudioWelcome { + +void PrintTo(const UserPresetData &preset, std::ostream *os) +{ + *os << "UserPresetData{category = " << preset.categoryId; + *os << "; wizardName = " << preset.wizardName; + *os << "; name = " << preset.name; + *os << "; screenSize = " << preset.screenSize; + *os << "; keyboard = " << preset.useQtVirtualKeyboard; + *os << "; qt = " << preset.qtVersion; + *os << "; style = " << preset.styleName; + *os << "}"; +} + +void PrintTo(const std::vector &presets, std::ostream *os) +{ + if (presets.size() == 0) { + *os << "{}" << std::endl; + } else { + *os << "{" << std::endl; + for (size_t i = 0; i < presets.size(); ++i) { + *os << "#" << i << ": "; + PrintTo(presets[i], os); + *os << std::endl; + } + *os << "}" << std::endl; + } +} + +} // namespace StudioWelcome + +using namespace StudioWelcome; + +constexpr char ARRAY_NAME[] = "UserPresets"; + +class QdsUserPresets : public ::testing::Test +{ +protected: + void SetUp() + { + settings = std::make_unique(tempDir.filePath("test").toString(), + QSettings::IniFormat); + } + + UserPresetsStore anEmptyStore() { return UserPresetsStore{std::move(settings)}; } + + UserPresetsStore aStoreWithZeroItems() + { + settings->beginWriteArray(ARRAY_NAME, 0); + settings->endArray(); + + return UserPresetsStore{std::move(settings)}; + } + + UserPresetsStore aStoreWithOne(const UserPresetData &preset) + { + settings->beginWriteArray(ARRAY_NAME, 1); + settings->setArrayIndex(0); + + settings->setValue("categoryId", preset.categoryId); + settings->setValue("wizardName", preset.wizardName); + settings->setValue("name", preset.name); + settings->setValue("screenSize", preset.screenSize); + settings->setValue("useQtVirtualKeyboard", preset.useQtVirtualKeyboard); + settings->setValue("qtVersion", preset.qtVersion); + settings->setValue("styleName", preset.styleName); + + settings->endArray(); + + return UserPresetsStore{std::move(settings)}; + } + + UserPresetsStore aStoreWithPresets(const std::vector &presets) + { + settings->beginWriteArray(ARRAY_NAME, presets.size()); + + for (size_t i = 0; i < presets.size(); ++i) { + settings->setArrayIndex(i); + const auto &preset = presets[i]; + + settings->setValue("categoryId", preset.categoryId); + settings->setValue("wizardName", preset.wizardName); + settings->setValue("name", preset.name); + settings->setValue("screenSize", preset.screenSize); + settings->setValue("useQtVirtualKeyboard", preset.useQtVirtualKeyboard); + settings->setValue("qtVersion", preset.qtVersion); + settings->setValue("styleName", preset.styleName); + } + settings->endArray(); + + return UserPresetsStore{std::move(settings)}; + } + + Utils::TemporaryDirectory tempDir{"userpresets-XXXXXX"}; + std::unique_ptr settings; + +private: + QString settingsPath; +}; + +/******************* TESTS *******************/ + +TEST_F(QdsUserPresets, readEmptyUserPresets) +{ + auto store = anEmptyStore(); + + auto presets = store.fetchAll(); + + ASSERT_THAT(presets, IsEmpty()); +} + +TEST_F(QdsUserPresets, readEmptyArrayOfUserPresets) +{ + auto store = aStoreWithZeroItems(); + + auto presets = store.fetchAll(); + + ASSERT_THAT(presets, IsEmpty()); +} + +TEST_F(QdsUserPresets, readOneUserPreset) +{ + UserPresetData preset{"A.categ", "3D App", "iPhone7", "400 x 20", true, "Qt 5", "Material Dark"}; + auto store = aStoreWithOne(preset); + + auto presets = store.fetchAll(); + + ASSERT_THAT(presets, ElementsAreArray({preset})); +} + +TEST_F(QdsUserPresets, readOneIncompleteUserPreset) +{ + // A preset entry that has the required entries, but not the others. + UserPresetData preset{"A.categ", "3D App", "iPhone7", "", false, "", ""}; + auto store = aStoreWithOne(preset); + + auto presets = store.fetchAll(); + + ASSERT_THAT(presets, ElementsAreArray({preset})); +} + +TEST_F(QdsUserPresets, doesNotReadPresetsThatLackRequiredEntries) +{ + // Required entries are: Category id, wizard name, preset name. + auto presetsInStore = std::vector{ + UserPresetData{"", "3D App", "iPhone7", "400 x 20", true, "Qt 5", "Material Dark"}, + UserPresetData{"A.categ", "", "iPhone7", "400 x 20", true, "Qt 5", "Material Dark"}, + UserPresetData{"A.categ", "3D App", "", "400 x 20", true, "Qt 5", "Material Dark"}, + }; + auto store = aStoreWithPresets(presetsInStore); + + auto presets = store.fetchAll(); + + ASSERT_THAT(presets, IsEmpty()); +} + +TEST_F(QdsUserPresets, readSeveralUserPresets) +{ + auto presetsInStore = std::vector{ + UserPresetData{"A.categ", "3D App", "iPhone7", "400 x 20", true, "Qt 5", "Material Dark"}, + UserPresetData{"B.categ", "2D App", "iPhone6", "200 x 50", false, "Qt 6", "Fusion"}, + UserPresetData{"C.categ", "Empty", "Some Other", "60 x 30", true, "Qt 7", "Material Light"}, + }; + auto store = aStoreWithPresets(presetsInStore); + + auto presets = store.fetchAll(); + + ASSERT_THAT(presets, ElementsAreArray(presetsInStore)); +} + +TEST_F(QdsUserPresets, cannotSaveInvalidPreset) +{ + // an invalid preset is a preset that lacks required fields. + UserPresetData invalidPreset{"", "3D App", "iPhone7", "400 x 20", true, "Qt 5", "Material Dark"}; + auto store = anEmptyStore(); + + bool saved = store.save(invalidPreset); + + auto presets = store.fetchAll(); + ASSERT_THAT(presets, IsEmpty()); + ASSERT_FALSE(saved); +} + +TEST_F(QdsUserPresets, savePresetInEmptyStore) +{ + UserPresetData preset{"B.categ", "3D App", "iPhone7", "400 x 20", true, "Qt 5", "Material Dark"}; + auto store = anEmptyStore(); + + store.save(preset); + + auto presets = store.fetchAll(); + ASSERT_THAT(presets, ElementsAre(preset)); +} + +TEST_F(QdsUserPresets, saveIncompletePreset) +{ + UserPresetData preset{"C.categ", "2D App", "Android", "", false, "", ""}; + auto store = anEmptyStore(); + + store.save(preset); + + auto presets = store.fetchAll(); + ASSERT_THAT(presets, ElementsAre(preset)); +} + +TEST_F(QdsUserPresets, cannotSavePresetWithSameName) +{ + UserPresetData existing{"B.categ", "3D App", "Same Name", "400 x 20", true, "Qt 5", "Material Dark"}; + auto store = aStoreWithOne(existing); + + UserPresetData newPreset{"C.categ", "Empty", "Same Name", "100 x 30", false, "Qt 6", "Fusion"}; + bool saved = store.save(newPreset); + + ASSERT_FALSE(saved); + ASSERT_THAT(store.fetchAll(), ElementsAreArray({existing})); +} + +TEST_F(QdsUserPresets, saveNewPreset) +{ + UserPresetData existing{"A.categ", "3D App", "iPhone7", "400 x 20", true, "Qt 5", "Material Dark"}; + auto store = aStoreWithOne(existing); + + UserPresetData newPreset{"A.categ", "Empty", "Huawei", "100 x 30", true, "Qt 6", "Fusion"}; + store.save(newPreset); + + auto presets = store.fetchAll(); + ASSERT_THAT(presets, ElementsAre(existing, newPreset)); +} + +TEST_F(QdsUserPresets, removeUserPresetFromEmptyStore) +{ + UserPresetData preset{"C.categ", "2D App", "Android", "", false, "", ""}; + auto store = anEmptyStore(); + + store.remove("A.categ", "User preset name"); + + auto presets = store.fetchAll(); + ASSERT_THAT(presets, IsEmpty()); +} + +TEST_F(QdsUserPresets, removeExistingUserPreset) +{ + UserPresetData existing{"A.categ", "3D App", "iPhone7", "400 x 20", true, "Qt 5", "Material Dark"}; + auto store = aStoreWithOne(existing); + + store.remove("A.categ", "iPhone7"); + + auto presets = store.fetchAll(); + ASSERT_THAT(presets, IsEmpty()); +} + +TEST_F(QdsUserPresets, removeNonExistingUserPreset) +{ + UserPresetData existing{"A.categ", "3D App", "iPhone7", "400 x 20", true, "Qt 5", "Material Dark"}; + auto store = aStoreWithOne(existing); + + store.remove("A.categ", "Android"); + + auto presets = store.fetchAll(); + ASSERT_THAT(presets, ElementsAre(existing)); +} + +TEST_F(QdsUserPresets, removeExistingUserPresetInStoreWithManyPresets) +{ + auto presetsInStore = std::vector{ + UserPresetData{"A.categ", "3D App", "iPhone7", "400 x 20", true, "Qt 5", "Material Dark"}, + UserPresetData{"B.categ", "2D App", "iPhone6", "200 x 50", false, "Qt 6", "Fusion"}, + UserPresetData{"C.categ", "Empty", "Some Other", "60 x 30", true, "Qt 7", "Material Light"}, + }; + auto store = aStoreWithPresets(presetsInStore); + + store.remove("B.categ", "iPhone6"); + + auto presets = store.fetchAll(); + ASSERT_THAT(presets, ElementsAre(presetsInStore[0], presetsInStore[2])); +} + diff --git a/tests/auto/qml/qmldesigner/wizard/wizardfactories-test.cpp b/tests/auto/qml/qmldesigner/wizard/wizardfactories-test.cpp index 30c79e9090d..6541e7a1637 100644 --- a/tests/auto/qml/qmldesigner/wizard/wizardfactories-test.cpp +++ b/tests/auto/qml/qmldesigner/wizard/wizardfactories-test.cpp @@ -151,7 +151,7 @@ private: QStringList presetNames(const WizardCategory &cat) { - QStringList result = Utils::transform(cat.items, &PresetItem::name); + QStringList result = Utils::transform(cat.items, &PresetItem::wizardName); return result; } @@ -319,9 +319,9 @@ TEST_F(QdsWizardFactories, createsPresetItemAndCategoryCorrectlyFromWizardFactor ASSERT_EQ("myDisplayCategory", category.name); auto presetItem = presets["myCategoryId"].items[0]; - ASSERT_EQ("myName", presetItem.name); - ASSERT_EQ("myDescription", presetItem.description); - ASSERT_EQ("qrc:/my/qml/path", presetItem.qmlPath.toString()); - ASSERT_EQ("\uABCD", presetItem.fontIconCode); + ASSERT_EQ("myName", presetItem->wizardName); + ASSERT_EQ("myDescription", presetItem->description); + ASSERT_EQ("qrc:/my/qml/path", presetItem->qmlPath.toString()); + ASSERT_EQ("\uABCD", presetItem->fontIconCode); }