From 7dfe423205c72e9ec463a05488fe95e78312eeb9 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 4 Oct 2022 13:20:44 +0200 Subject: [PATCH 001/104] Perforce: Remove apparently unused promptdialog.ui Change-Id: I1f2e9d13948956397c35d2cdc6ae0e81f88bf74c Reviewed-by: Alessandro Portale Reviewed-by: Qt CI Bot Reviewed-by: --- src/plugins/perforce/CMakeLists.txt | 1 - src/plugins/perforce/promptdialog.ui | 128 --------------------------- 2 files changed, 129 deletions(-) delete mode 100644 src/plugins/perforce/promptdialog.ui diff --git a/src/plugins/perforce/CMakeLists.txt b/src/plugins/perforce/CMakeLists.txt index 75bb790b6a0..bc1f8b90329 100644 --- a/src/plugins/perforce/CMakeLists.txt +++ b/src/plugins/perforce/CMakeLists.txt @@ -10,6 +10,5 @@ add_qtc_plugin(Perforce perforcesettings.cpp perforcesettings.h perforcesubmiteditor.cpp perforcesubmiteditor.h perforcesubmiteditorwidget.cpp perforcesubmiteditorwidget.h - promptdialog.ui submitpanel.ui ) diff --git a/src/plugins/perforce/promptdialog.ui b/src/plugins/perforce/promptdialog.ui deleted file mode 100644 index aecf8d33378..00000000000 --- a/src/plugins/perforce/promptdialog.ui +++ /dev/null @@ -1,128 +0,0 @@ - - Perforce::Internal::PromptDialog - - - - 0 - 0 - 308 - 113 - - - - Perforce Prompt - - - - 9 - - - 6 - - - - - - 0 - 0 - - - - - - - Qt::AutoText - - - - - - - 0 - - - 6 - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 30 - - - - - - - - 0 - - - 6 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - OK - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - okButton - clicked() - Perforce::Internal::PromptDialog - accept() - - - 278 - 253 - - - 96 - 254 - - - - - From b11490142e72c6b88bafc6227ea8bff8c26c1372 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 5 Oct 2022 06:29:31 +0200 Subject: [PATCH 002/104] Squish: Remove unused capture Change-Id: I3e54eabc7829d7e69471406235a0065b4e0aec6c Reviewed-by: David Schulz --- src/plugins/squish/squishfilehandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/squish/squishfilehandler.cpp b/src/plugins/squish/squishfilehandler.cpp index 85fdb85c596..747e6c7fa40 100644 --- a/src/plugins/squish/squishfilehandler.cpp +++ b/src/plugins/squish/squishfilehandler.cpp @@ -68,7 +68,7 @@ public: connect(buttons->button(QDialogButtonBox::Cancel), &QPushButton::clicked, this, &QDialog::reject); connect(&aut, &QComboBox::currentIndexChanged, - this, [this, okButton] (int index) { + this, [okButton] (int index) { okButton->setEnabled(index > 0); }); setWindowTitle(Tr::tr("Recording Settings")); From 6a720c5bba1fc91cd9517f1f39fc722627fa19b7 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 4 Oct 2022 12:09:20 +0200 Subject: [PATCH 003/104] Squish: Fix script generation Change-Id: If9c9ef2c3f8e6da14da282554becd075de761d6e Reviewed-by: David Schulz --- src/plugins/squish/scripthelper.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/squish/scripthelper.cpp b/src/plugins/squish/scripthelper.cpp index 18c605b3d81..916a3c99fa9 100644 --- a/src/plugins/squish/scripthelper.cpp +++ b/src/plugins/squish/scripthelper.cpp @@ -24,9 +24,10 @@ static QByteArray startApplication(Language language, parameters << QString(args).replace('"', "\\\""); switch (language) { - case Language::Python: case Language::Perl: case Language::JavaScript: + return QByteArray("startApplication(\"" + parameters.join(' ').toUtf8() + "\");"); + case Language::Python: case Language::Ruby: return QByteArray("startApplication(\"" + parameters.join(' ').toUtf8() + "\")"); case Language::Tcl: From 718086dea8e7f9a70e337eb9d6ef16140f13fc60 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 21 Sep 2022 11:22:20 +0200 Subject: [PATCH 004/104] LanguageClient: Allow to pre-set the new symbol name ... when renaming. There are contexts which provide the new name in advance. Change-Id: I4bda689405060c343c0654d0aca274f10ee22752 Reviewed-by: David Schulz Reviewed-by: --- .../languageclient/languageclientsymbolsupport.cpp | 8 +++++--- src/plugins/languageclient/languageclientsymbolsupport.h | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index d86ac58ba93..defa368f1e3 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -288,14 +288,16 @@ bool SymbolSupport::supportsRename(TextEditor::TextDocument *document) return LanguageClient::supportsRename(m_client, document, prepareSupported); } -void SymbolSupport::renameSymbol(TextEditor::TextDocument *document, const QTextCursor &cursor) +void SymbolSupport::renameSymbol(TextEditor::TextDocument *document, const QTextCursor &cursor, + const QString &newSymbolName) { const TextDocumentPositionParams params = generateDocPosParams(document, cursor); QTextCursor tc = cursor; tc.select(QTextCursor::WordUnderCursor); const QString oldSymbolName = tc.selectedText(); - const QString placeholder = m_defaultSymbolMapper ? m_defaultSymbolMapper(oldSymbolName) - : oldSymbolName; + QString placeholder = newSymbolName; + if (placeholder.isEmpty()) + placeholder = m_defaultSymbolMapper ? m_defaultSymbolMapper(oldSymbolName) : oldSymbolName; bool prepareSupported; if (!LanguageClient::supportsRename(m_client, document, prepareSupported)) { diff --git a/src/plugins/languageclient/languageclientsymbolsupport.h b/src/plugins/languageclient/languageclientsymbolsupport.h index 79b250ffcc4..3fde3c58d01 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.h +++ b/src/plugins/languageclient/languageclientsymbolsupport.h @@ -42,7 +42,8 @@ public: const ResultHandler &handler = {}); bool supportsRename(TextEditor::TextDocument *document); - void renameSymbol(TextEditor::TextDocument *document, const QTextCursor &cursor); + void renameSymbol(TextEditor::TextDocument *document, const QTextCursor &cursor, + const QString &newSymbolName = {}); static Core::Search::TextRange convertRange(const LanguageServerProtocol::Range &range); static QStringList getFileContents(const Utils::FilePath &filePath); From 6a4b3e67e0ffce1da332c43537a911a970edfdda Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 4 Oct 2022 12:55:09 +0200 Subject: [PATCH 005/104] Squish: Expect file changes when recording Expect the object map to change in general and the test script file to change on successful recording to avoid unneeded confirmation by the user. Change-Id: I72fe4534fdc7b6b7064222f7c9b0e0989cc17976 Reviewed-by: David Schulz --- src/plugins/squish/squishtools.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/squish/squishtools.cpp b/src/plugins/squish/squishtools.cpp index 463109eda60..d9a51b1e798 100644 --- a/src/plugins/squish/squishtools.cpp +++ b/src/plugins/squish/squishtools.cpp @@ -12,6 +12,7 @@ #include // TODO remove +#include #include #include #include @@ -637,6 +638,8 @@ void SquishTools::setupAndStartRecorder() m_recorderProcess.setCommand({toolsSettings.runnerPath, args}); qCDebug(LOG) << "Recorder starting:" << m_recorderProcess.commandLine().toUserOutput(); + if (m_suiteConf.objectMapPath().isReadableFile()) + Core::DocumentManager::expectFileChange(m_suiteConf.objectMapPath()); m_recorderProcess.start(); } @@ -737,6 +740,7 @@ void SquishTools::onRecorderFinished() const ScriptHelper helper(m_suiteConf.language()); const Utils::FilePath testFile = m_currentTestCasePath.pathAppended( "test" + m_suiteConf.scriptExtension()); + Core::DocumentManager::expectFileChange(testFile); bool result = helper.writeScriptFile(testFile, m_currentRecorderSnippetFile, m_suiteConf.aut(), m_suiteConf.arguments()); From e70bb187dc167ad1266e83dc3d414bf028a158ee Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 5 Oct 2022 08:53:14 +0200 Subject: [PATCH 006/104] Squish: Save modified files before running a test Change-Id: Iaf15c05ea057e871d0facb60cbb036a1497dd038 Reviewed-by: David Schulz --- src/plugins/squish/squishfilehandler.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/squish/squishfilehandler.cpp b/src/plugins/squish/squishfilehandler.cpp index 747e6c7fa40..3ba58757f55 100644 --- a/src/plugins/squish/squishfilehandler.cpp +++ b/src/plugins/squish/squishfilehandler.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -342,6 +343,7 @@ void SquishFileHandler::runTestCase(const QString &suiteName, const QString &tes return; } + ProjectExplorer::ProjectExplorerPlugin::saveModifiedFiles(); SquishTools::instance()->runTestCases(suitePath.absolutePath(), QStringList(testCaseName)); } @@ -371,6 +373,7 @@ void SquishFileHandler::runTestSuite(const QString &suiteName) .arg(suiteName)); return; } + ProjectExplorer::ProjectExplorerPlugin::saveModifiedFiles(); SquishTools::instance()->runTestCases(suitePath.absolutePath(), testCases); } From 94ab264d4599aed3f3697d521c81f89cc8110526 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 30 Sep 2022 15:26:05 +0200 Subject: [PATCH 007/104] Doc: Describe create cursors at the ends of selected lines ...by pressing Alt+Shift+I Task-number: QTCREATORBUG-27876 Change-Id: Ibdf25f97ec4c705b62e0c0f78239c9004cc45fce Reviewed-by: David Schulz --- doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc b/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc index 2f9a511a412..72546bc48fe 100644 --- a/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc +++ b/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc @@ -151,6 +151,8 @@ Press and hold \key Alt and double-click strings to select several strings simultaneously. + Press \key {Alt+Shift+I} to create cursors at the ends of selected lines. + Press \key Esc to remove all the cursors and selections. \section1 Splitting the Editor View From 9accbdac0214e696cc1d4965ba4555675c8404c1 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 4 Oct 2022 15:23:05 +0200 Subject: [PATCH 008/104] Doc: Update info about Clang and clangd preferences And the Show Preprocessed Source action in the code editor context menu. Task-number: QTCREATORBUG-27876 Change-Id: I43ca26d6ee7bb5e0441a37aeb1f7eecbb4ba8fde Reviewed-by: Christian Kandeler --- .../qtcreator-clang-code-model-options.png | Bin 4144 -> 4700 bytes .../qtcreator-code-style-clang-format.png | Bin 27364 -> 20662 bytes ...qtcreator-code-style-settings-edit-cpp.png | Bin 18348 -> 18757 bytes ...eator-code-style-settings-edit-qtquick.png | Bin 14629 -> 12603 bytes .../images/qtcreator-options-clangd.png | Bin 12308 -> 16621 bytes .../images/qtcreator-projects-code-style.png | Bin 12932 -> 11211 bytes .../creator-clang-static-analyzer.qdoc | 12 ++++---- .../src/editors/creator-code-syntax.qdoc | 19 ++++++++++++ .../creator-only/creator-clang-codemodel.qdoc | 27 ++++++++++++++---- .../creator-projects-settings-code-style.qdoc | 12 ++++---- 10 files changed, 53 insertions(+), 17 deletions(-) diff --git a/doc/qtcreator/images/qtcreator-clang-code-model-options.png b/doc/qtcreator/images/qtcreator-clang-code-model-options.png index 126f393c5d24ac00b9e3691cfd1fa4c03c400fb7..7bc9edcafdf95b861863af0e2b98a29c9c5dcd2b 100644 GIT binary patch delta 4175 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 delta 3615 zcmcbkvOz($Gr-TCmrII^fq{Y7)59f*fq_Ysfq`KW2Qvc$!@;ccD;OAqXopkN0m`=v1MZ z_4!d|{~iT>t|^CDwb*p4n%qRVJr++F>JeL&TjRY#w<%2I+;p>@3Z3~4^V*ceCQ0?O z>VEmAUwp4Ttvo;f`!}#)J+>-d^7c(VbEC zjY&uQ=GBIVpYIbreXxOD^tAN!Q2*Z3vscZUH#hHaU+nDU3+rTgH;Pm+@``DmbgP@J zB6oAzyLHnp-IlA|G3#aKOSLMqoY2XTA)N*jW8@Tb|p47Y6D`bDXI3oG`_Y;}h-^9*Wv|ea# z>QV^V!V`V%?%!LD*Dfknt7k@j|LryBvsU2i8L5%2+pL|dPF&k~Q>f7MKto8*965FQ z_4QL0B|W+($>z=)lH$>s9?SMoOIQ2jmcudkKJDF*YWH(>$0~+XOAfC5u%9J8wj$u7 z*<5A$``Utw->$VQx?~qLuj`^>`H5>6>!0j-%$BEZHb=g^j73d!`tlQLm#u{tt~?R& zYV+n*6^9g5y-sUAe_gweRlj^;n&_!N-phoJTAZ&7O{1IP3nT|!#k({G)(7^*V6cYgvWkL?`)Hf@=V(^ zq7%8M)_+~`VSkH4$Oos+X@Xi*ow3W)NO=i8<^0)ihls&&C-_GF|eX=>!Kea?7 zI$`;yEgMxP_(WUQUn&r*I3Rx^-{^Tz$Q>IEHi5^n((mUils0Nxuyt={mpNPWlOt!( z`_K8v_0ZXM(*313_xF7)i;;4fI&IrA%Wn@2uK%@L`=aFe_3ytkc(T?-7XDP3#1nET z!RS9zui~3yMT_rmowvR8%kIOhRns?}NvW)H$iBv#H{(WTCcoCbJNj1j>t%9fU#bPC zxO$7Z@J~%XdHGU$@uC|io8IqmVhL7!8~d;J&AWdpnyHg!O^UVpd#qURdf0}y4=h?+ zLQHeT)>!(nTAEn+ZI@H5S#jb+)Jc&eZx{0@d7ob8dqviI_QoZRDHo6WExfr;@kT4> zWKTew$r04Fi zWO5R#8tbpKb;m9LZ*yvW60*_Xd&ZS*jX$nEdzEZ+T(r+>`d_Y}`ySp|ZO*@IY3V z{WkNa`WbUJwNIYCMswF!uE3i+nx;>)Q+aZPU4LO%q4Tr8!rFr?3_h8!kl1bd+O^dn zYgq~Zqg^c*LN?5KQBm5Hx8IN(-o9Vo-B!O*U;>xuq~r7T_%7ys>@ycl ztrD<1qw-$+M4Mf0-liuJLEjW&rR!`CY?D*`GtY5Tio;!_9Q$UE=AN!go1`P_HmI|e zX0CcsbbNCFW$iFRmlU?_+FKjkEykrggM7Oh3-W-jco-oV8fq#+Qfs@Nl%yuwT zc$jN1-<*2$_?jJx^~;#QDU@lwQPAX+T>9sGX}(sz-Brz^b7B>wm$O6O?aD ztUMv5&-;9G*RIOPbH7&TM_Y>O9#&0Uch2>adcopA7SXGImvSG?`tx35#fc5-)3IA}{SdxM3FV*%H7{wm)tuTm%Va)GxzKBwg3N$ zg8Jzi z3I@@}l^Odl$?JwcOgNHul0(MoL1OTcg`MZm38@MO2=;Xux#^Z##l*U-xX_nrBkEOr*%{e)dKI zC57U+y$7Ekny{{ZP36mXKGFYeR$GeAdVct_(8V`v<_jnO%#;j1drrtmFd$G-^qY_R zw;c7ilkY^<7J12qlq-GC++V(6atKeandaVGx79zdy!WW1sQUc!mhIL*U(XRP%yh9_ z-R0x$`Z)6RhCf^GEZ)3%iIx{jNXWIYo)bUwdRF?MI6KRnKWJrSz?S+98-=yo%dUoP zsGhBUU|HbIptXBug|;qNU37Eji4Bjo+%Ue?CD7T>^&;d&@caww?%15rc0bd!$n`Pf z-xUg%Gdkp4W`k5~hn!v-{!Q}9mOI5g+D&RqT8n}g`qnz_6O^9K{_^kYG{=i-9uFB^ zwf$DF-+ZE4ASk(}|JtPNFwu$i(=z^ijj4Kjxu|~&=PzTA3oZ_>CR!&p-DtFYkUc@jQE#@sUYSGEZh`WlK(*Kdt&!&Za~m zM$xM^+an()&%5^9+0@Ck<9}bM$I*nDD;F+2>hAjGy6?aDGcRQ67s4{YfqH`lOd$^F z>4GD~!PJlSkB?*PY_1BCCN6ocYj0Ua7aa0DDxSVCQrA9M-!k0xiFLuxs5>Dw56ZXC z>zT}z9^2d%wcyc>GoO7IFokGn?fdd?*|OvRe=OIv61`;qWlhv~lYHwLpYFe&?YI2z zq2Ix5Ukj{qr`P+Td|036m$(1lZ~j*yQ@*f>^v%)SetBilv&(bYc$Wu1 z{h}G@Vi3ve*ngm_GspMH6zyr|8Bx9qPLF}+*ZonOCYXK~uI^w+cY zR0-s^G2T5mW$RzQ<-u#&ciw&fwnXc%!&W(#cMH3}OFk*SzFW5VZh^e-+3L*}i>zlX zvzg=fQbwavcg5+KAwL_v_ycyd>%CLI94nW<=kH%Gl?$T(|>dQPw)SStQAE69Iy!}oFla1*`u$QONu)K3O{~XwYA>vm2azV zfZ(~`Gp@158ue8RZLU|IC0_J<$tTS#ectU4pLc8)DEyvy_rjESMLN@$h4!62l{?c) z)>`b!+w_mmmlSV`aQnVybMoVmnyC*9K0XgW`RrnSTuR6V`vAd4uI=A9E^w+4+I;W8 z2dA*L4P|%AB=!|O>e_Z+dp(?Rb2 z7Q3>(cIy{t$<^N8%zkrCru+(yr?qERSg7Ci4qj%hQLbdV>QaHkv(uihLO7-;?=)Ha z_RuP8+1=O9UA=SuOlpa(+w5!!t|jV`)o+ExZ|-<>cku$HDE>#E?8F{-T?qNGuwyot zp^G5*)vS;VzvJt+7Mp6FNiEqs&#^CFwLWCc-fveva?4Bz&Hn%BW^+mAD@IU2M&6z~ zecq8M-rMVrvWYG`ykR%{M7h&@XT9F|cH0`=Nvo@6vO{K^eo+Kc+(f0MWsw*P? zUSiGH>idvBL3zQVH^v=@e^*>e>b`i&HIr98u`1z$TyEcs?3Yr;YZjz~Z|7Dd>NPte?5{FiOQSMLoH)iS9NdLO~>~Y9>o5N<+ z4o4sT^sh1%-?z4hOEIAFet3bF-J(qM6$kP+&Iz&Exi^wAM8{Jr%tmBV*WGQ~^y3+| zK1k>PIkr0vwN6GapeA=Yw=b-^rs%Jw;1Te#{#w9~Yx{rJ=P@uaFnGH9xvX@oXoO$&l+|m)k|8N)>wSgn;ok< zsdR$Ca}Lc{hu4U_eZ{E zSMPq!`MWFqnf3bp|9(}!-&_9i(NXWo-5GN;7H7PCc(}cvA?1_X*@qlVUrv{|C_a1k ztk2(SQSYLq?EG>fdUIyY`Zax-(k;1vrWZccEzo{ZFJ%|8RXw;RXU)XpooFk_{_LW?=? z_x*m?KdUQa_Y204$72uwR$Q!I7g1~>n)$vtPDvS?AC)r_01<@vRO4!6HE=Czlf|J2(Ut zm7XZMv~)}e76c2qf`pbUDdo)Kn7)12-i~+IiWd6bnyVD)x~{`-_ZlNX#l`$ePePVF z?AYKV$R;#pR@A*)S<_XV_CMM2V8x9$YmX@$y1Lxfv;6a^{&hKJ&HtN2A3EK8<{$ob z%AK`A6L#NQ-+f_y<0Wxdi8a$F%@w`ldn~T2tRg;kVM)v4XGeGCbr>tI)l!`=d(~F- z_ly5)R;A51%M}0jud5(MJ!t-PpTn*zPOZ}C@;E(lDVLH=TFckZCA(iOjrtX7y{_9} z2Scj!x}3aq(@Fzd_ok$9yD!q}y6}Q?|Dub#r_}D;y{^aDQGRate6gZW9>H+$^}nX6y6nBmp5Dbvnmiacd^6Wx5$B6I!co!cItXn4z% z`ffjmdARxRR|%osg1@Fea9HenF|O)Yi1|W~>R(?nSzTYe=+yqmSoThP?dvvsVKzIB zQnAFa|Nh%J+{={|4>7vDnAiOCQkTdRYt1t%!p#1vorQvL`$8jBw%kaIN;BQMnALCd zX`S#E&#p~gZQ4D;rl%ICOzk%MvFMz7*y2SlQ9-M==5E;V^GZ+qQE8UfZnnRyolIZd zU)4A3$(Kp%_l4$W6n`t&U#%J4l4ZJ;?a#lJ#u3wRl}e^JU2L1ur(F^-#m~b&@k-7k z{Yf9z#;p$BTY9ryEwy~{+yC0XHkQRMPiwwvvva$_A(2$Rc`1gw4Zpg`pEaFfzC=Vu z48dK?VopD6Ia|Lt(ztA@QK8S={U>iv$ogPxnD}T{-6@^Natlj8Mugvb75tay z)R{LYE^ii}dZGXIuB+Epi6`AuDw)3g$kHvlmzVi|s`lh7y!dX*H@;odC%L|m>3j69 z@U8ah*Foo4lGl{;{&hQ9B;fs)DqlU5m&z_repkQy*0)%@muAzWjrD3K zPLL5@Eq%G~I>-8hXB3xSaJcyW#X(!A=^4L-6Zfrr6mu)~zy_P8SN@%nx!M!3yKw%$ z^3;;b7n-+X^Pi{A$qrsB^_M-N{cm=NfB&o(Ydj~$1syZaeIc2p|9FPrvkrsz{FR@5 z4B8fLnRrrXXM(!OyVXk1mw&#nWZucgZ|a|yzT$8#xqJRVO3aU6ESKILtDE;ptK2Q( z%LGgPId<;-$Lvj|?(Ez=Ps-G3@y9D?Wu<&8k1X9Qs;+)9^lzcW{l>X|;d7OrO|?`L zT=thWqb+sbx?9nf?+rqIS~7dz_y_LXE0Uv`zmiYQsk~&@uJ0VO=}j^TR}(ghW*L`- zZxHTE)vl=Pi*IrLy?+76+4h@kLW!rQ2IggyOc3T2?E6yOlBKa}^{LapG7|sn@ji9f z$W0=+)@s>W)s^{c)6;K%l%COaHg;KrN3a>oCzz{eX_PKdY*o3 zq2x@C&A;LUThC09mMRT1{C&vWY4JNTv6{B!J=q)9E4E(9n8zV5E?ys#+q58?^J&Ml zzGsOu=S06dOyJfj$0LlYJX1Ege@pyk^y|D} zmVAOorQ4y4rPnr#ot&9q^EttmX=0i2>8~O_RT(Dgvuo>CtvzjLvRE|H?f>a}6Z&PO zrxxD(wwe9^pZ3%*s!Q*@c^vxBbVi-hSJQwmmQ@Oe{wnXW{qeZ4Yr{N|x^?sNr)e(K zzS3!T;eT@W4+(ZImk3$*HplBlU9)op(_9n<6=NO$U;a?X&gEh;(`OM!uyTKoT?y-7 z|HJK)8UmowbBT7tzvT}*3Y=Uk{{8tWZzg?_`BBa?`4?Qj=C|<&!?##t z7Y+u74gm%R20VPD*u++`_W8?f=5- z+t!Az@tD3SkfGs|>kGMvw}RoaTOTXlk2jg#bTRtm%1W2C;CB;#c78n9H= z?DUsrTkSSwq?;~sJ$`rhm%E)TYqPxC%8p-}Uc9qlx{?z^!^iU+qH}Mmbxb#1xXjx5 zer(Q!7=MxV{lOo?YCo-Bctf|myeqSJ=Q7jJrv(xZ>aj936uHi*?hjb!&-ScVG|{j2 zlu+WF#Sh*k{e3yxV)^wB0fq%pN>>gQJ?vO#YdWjvKorMC**o6+u36T>Ns~NzHf-Q1 ze)af9VB>`qJg#o6s-3Ro%U1>Ue&JJe0>xjl(8K<(8S{Qx9(vNq`_aPt*a}_ej#l|; zFV$sch0d=y|IK90g~LX-^qSJkt{mDld;QxJ_dIr+zKS>}ws19PhX6x@ijvOsE5G}G zyIg&B`HUI^gNb`fSxQ0u%Bb2|H(3}OI>i@?@~$}`v&!phW|}YqgOsH*EH#u0JUlzw z+@6VnVTG#Vrho}gO z&82R(pI1N3^6;8zls>^Qb|S0G3laZW9Pd>pUe)+|t1RgG-0Dpe=FZKVAdpk1e@gkD z`pv7cTDMP^@15Iz>XYqeuiMscmYx?6?vkmM(kqD)5M**lb-i)r<1TNA#2_;VzJ z_n?}QrC<2A%{sHqltYYn%8d3dy2e7UL{dz)s` zny9;<@am9``7=P zykWtQa2@N<9qXK17y^DuF0_B+IluGjHIbDEHf?b(6pZRzq_!z5_j`}QVxM&9IjLI0 z?zNvH0$Oe+y>@R&oI6$YWtwmNHLLv#IMyE7usG=Uj8}*5|Nr+rQ_Q7>;ev$VDIuY^ zA@MCUzpb9gk;>V5>X`bW7y(6wD~>H`E{2@OVq%Gtma(e*7Ei3pFtNY$DyzfTWYzR} zl2TW9-#xdgB2?^6&dSZ7w!ZkoC>Yz$!MNa;QiyZw-xlYuh88!XY~mK**%_SgWFZwyycJT=^F(}EfXqRiQ+5_>EE ze!b2wZ&&l|%*>xZf3j-yywJOtx#;!1ipRX?lo%XZzPj-|O^PaJ_~lX}CB{O0g#gaT zf_)J!Z_9q4X6ne1;b&l&;ULI$QdYC!#IcVI3=L_WAI_TJ7kR4e#K4fTf+PRVj*nlj z$N&GfeZMa(>#e?+xhO0w_K*B7e&N{ccK2!g3=ET%4!y7c|GWP0>-gPw*ZnZOS|Zq& z_~m`M{>`7=Q_SX-F)}!8b=|RPlhU&0`X7hoFF7v;6+CJlE%tw3`rog5y|&=zjg86m z|9{{A|FOS*jz!@jd%<6hhdTVC(_WYCa&+3@X${T`lbcfZT)iLHxv%WjtG=s;7W=wJ zUQ{a*|F}zK_PqOgQMVsIS89(D&y8B}XKkOPUYy^j{KQCx2Cc3S;`@KNTKpI0Khd#$ ze%-H?720-26MtS=QPyuD&^BLart@yy@HuQ8}B+EaURE4!`hp39FIN=cwSw3I%xe%r74%V)zbeJ&3U4CEh->w-Lp9tbQA;g zlyW2GSNE>ls~+k-+l`swz`pK)f>&2o?*IEXKmPciH|h4Lf6F}NaMAEC=sIhVsIgo@ zMJqKpre*Gw_Z%0#Nr? zJ)`ci%hl}EaJ=ZZ{IO7|n@b4qjkIm2?@!i<-Q6j%K^}--$Ep4lUfp(7bkO^`eNChV{YryO!7XtY5(K^~H*~9UI;M@}+%x)Bn>U zU>8T~p6TtW3=FIEoDSZ(BNM+dts<~KrIcfGYHJE3LxR1_iRpRIS9=TJ4^TS8ae|5A zz`qWGP0RCbkJnzP3!Ns{!iu+XgTJ0auD<^82s1D!98z@2_;0X&vf6(GeNfX0)Nbmy zaOD5auPs`C-&Os&z4IUcqi@mc7uGfGyW$kY#rHePEH~vh6N5twtBXaOVnxH=8?#09 zmz+}iVw&;ykS(NskXCWp9RbSe8-kR+IF|{2ymR#YwU;H$EeVs$rnv9%-=xlZvSRiA zy+XC7%bbebKXzFx-M#hd#Y1gjimltu-kG_0re^Dn-=|({*JrzLiQJ~-kzfAiLdL6o zXGE*ie`h~s^Q@FKWoK|`Id(yYf11}Dzulcvd9H%X^ztKrVwm?{KKRy8hb^@D*tRT1 z*6mkylB`eOJoAN1<@YIlmx-ZK^DSmi+o!+r*xOAN!m7@DW&{>9Fu2SxQ{J*n?Ae5< zl$$etJ~?as^h(gPQ&U_n=HBh~%3ZcupgNxUTPUO8vp1{LS6zJbBx3)wk_nceiny>V zVA_NZRo|9rbAAaVPRuCJz+g@W(AlWJOB zSKM82im!KBn>KfgTX)WCNfqN&nQca2xt7?Tx)dHSDv)?>U&&)@E6W)5cTdzloz~}N zU=U1W*Zs}ee#<}ONAsp4X2aJ%`9E_CyiSx{J;CYrtV>>%5pE~n=p4CsU7*H{LZji45_!(7)B=M5Mc92UEt z;Q!3Tz@Sv}`PuCJu1|uB3=AeAE#`T5e*Aj9zW(>^`)QpU?!G))vVEF&#+OfF*8?Zr z@ICnG@7u3jqW8CPcr{n2PO~mL)YUDuyLyL8o6eoUlSTaU3<`%1DgF8PegFUK`~Pjd z{r23sbIZCe$ZwnEn6>0__Qs0_6B3r|-p||Wu6W3>=k(I|N9{xAmL1K0y+%ce#i8Z5 z%Au)KMGa;D9G3q#K~C!H*2TQhVTUT(Z*94&d?+w{w~HX3Fb@NRi^Uv{`d^pl@B4Z! z`r)UI$;bbJEPO2g-=gr5%PJ1pdxD;UA>Qjeju}dB<_Z6$Z8f)mD_zf>Iew34dG={P z6LtQTQqx#ZZAhD97_s%L;o~{y{-*Vu_OdWr*LZaiESbL)4PLZ9t$EF{rH$+CY7*%@3c_HfjH?2d2wZ2z&Lr{ed^<@39? zKT;Ns^zUuER=g{)C-&5d>xPdezx6Y+I<1mxDap7vsfqD|l-S}TqgRuc>E()FI(==@ zrugF(viYl6zHG6Mj(UAXRx8Skt>pTP_2uhz`Jb$5yvRlSEtFHIv&a1Dn+z_ds_;gLzQu7V{vEuoe@1C{p-q@d~sc@*rnV+F! z!;}jzRt7Ks_ig+BTG`K==l|7tU)&P;onx{>rpX3N9n%dQm)j2PsctFStM!Jf!(e%m zsBq%PJe~NK8~hA{eL*cv#m~>Riv2kq|4-KnS{Nudo6(^~S#05hW_~+?!iztD{#Oq_$K* zxe>L0yI_~np32Y9+!+`cwz_uYXn^{}J_ew+1hjHM^j1J!xq| zH*)zOx1->pNQh`*$q_>#_f;F)`{fp}zi8}{b7(oNly+yje!Ly$RW}*s!X>k6e!O6; zYLN4I&FB)*#Bp?q^yLtl!k$ZQ4Q(=ZRSj|r*e_Kv2u?Fru3=y0`|bXrFATO0{3biu z!Cf4lrY{V(4WOae6pjTT7cdBli9P%jwq5+<-Kce~YyN2UuUfY#diu0!elKF~*Io6# zv9n%@-+up@WjTMde*fxRxMRO@jpXD83%5+?hT0#$mY;DBn=B`g9v1)nhs!)>)7LFQ z)ec+sinZ?z;Qyit>+j1=+)W@# zx63aMe5m0X@lSDeH^<}8UY18^s~-xCiCO&X^VTpW8Bg^oN>1_3bH7!n6_yG;TaP>C`*MuPJ5oZ%n?&yg2*EieHEj4!)Q2DI%_?1I{%6(@K85;7WC1RY1$W+9D;*>KPT{R=O5Wf_*P0T=j0r+M2rh za9XCXnCHo=n*o~_U-D1B{xw)t@K-!chJy2KZ`D&k$YsJS$M_W^+R z?gvM1)sJ6kA?<5wPQ7D%yFOIa@Lk`7NmpjA(b2m5_?3qH{2Qw8tNCBdRhX?THi>OV zU&XJTiqSWu*K|I9!x%1onZMB0N^vc_o3(O@g=giJW2U!@^49rsyv>Y>3#{CFiDkWt zShd6noA#LINO`4_zLu(8$r%@f9#8gP=OepT{bcL@|9{_K*0G2Z?0Yids#A+&>D6gb z)0f;!xn7jz{<8Lw#!e-rEq#$+j&Dxif2oqw3P0l+IKBME-PHcrY?6ARX(YZ(Keaq=vQ?oRk!F3D`ISSJ1su8 z&&YYP+y0kVgXFiAPFv(Y=dP_z_KK2io8-UdGwru2bPm%rHeGgC;fSG^G*jE(A2~nU z&)CI!SA1IiM()I3#h^cvwpeSuoV+Cd?WENOd^e7(?pZ$RPGq6n$1TN+AKWngaWWu_ ze?{&Y`y-++Teir(_+Q+T)#J1|T4K|SCucZ%g)Tjw894D+uhnBgsm&U>+NqZL^KSXc z&F_?-X87%DKgZe?Yt8O&na8ln=INWnnJcc^SFoJC>VNEaq3xU7E`rnQPh_b(J)OMk z=(=}PZmVWV_x5L5>V3=V2-th>fB!Y!kMS4!l;;)Y?O^LVDUcXywa`Y;&+Ko#lS|3! zAEo`tk~JTWKd31G|HHAW?aS1cHJ3a!gV(&MG0J%<+y+WN4(A?fPi|_@X{uh3`P|`^ zVE(1hfQ5dbGV90VFDueKm2?{3pW4TMXv$@8@%!rkLLN^}?p=OKN#^u@tquXu^iYJs zhO6agTuWXbI&|n_t%Akgb*nVPn|Cgs$YJ+LVks|UvQ5qJ$`h+DGW%Myzfrz-VD$p0 zxf8B2cN9d-GVU|rxWxR0!Pa0RsQ7()VWG3JvGL~3n@=p;)UjB(Z=yv|uWb#uTuk}G zpd>TxdVKxg4-XHgpPMst{`~j`NGbhDV(-Ue(r0a;3coWb=`dd0{Ahg-b3o{kizh99 z&n|!z#3$Y{f|~pdNaI?l!=$`+>KEQ0-oXIs=ZiG&`*G)K_4~c*b+sJ!@Ix+!?^aeAI;F|H=+N!MjSozJGan`T6hITnzbk*0H!wZ$^U9SgXI~m>Jx)*!-veT8AIbvUtUCC=%1CG=z@8}GD@IaejQ1mUQYC-U*+k{(}#BOzSxT_y} zx;9UL(eABpmT$5CcuAncN#(G3JBOg+)}^{z#0C2tS{hlbbAOhtj$OoYe8GOZZ-v^>HRoPB|3PH>%k3HUAr?h~Vs8&`><*Z6tM=EH)$d9ggp=>D zn||=zmWMvu_5VH=Nt~1PS9kK)azAI+8P6P#>R}9M>$z$M-l#ZUx6My|&UCifTNc|q zs-0x3>9M|FsJ3)lvV&k>%A(R7&diP zfr++~)AyWHWf9RAqjO~IFUD|PS^DIPjp}CBpDEia(hsVgy4KapdvWXL66+-##x_ca zdlTCp_}r?=Y72?Ed1U^zhtZPTI?95!ad2O?KbdIm*txo8=BMb~+@N0{RK%vf^Lp>& zUb>b=+j-?fmvqyVuf3UhS2!jneP0-OUg37u6tf!)*ZiZCn6uP;wDNtf9oEXt%0Bzr zY4!e$z)O4HaHro%pS3#k+1H}f58Uc@rNRDA-+xT7JE3uRUeQAp?X$r_{jBMIQLgR# zg4XZjItv^vdPiHr;OsPSBQHSx|)&vmojoZF%t9rjmLbE+s3*uJ`qv+j2Ya`hC-)Df&*y`ax9(*JyO5-%8FtW_wZS zQ2Ei@i*EU^><+zp=Vy{%(*Nt%Z~S|5YG+*A?gAsfLu)=N?!GOZ!wYME9jVs)oGAHtp|`HvM5~YbGtLSgmOdD~*z1l`&iQAnWM7@+cqY-w8g2Vc za^Yg*yMnIiXM>ziJnam)+r57Qi|c&5+ALFLa}z5)!Ch`|M0l69y8RYUbUnA_N;Ict zJr_^K!zFWCEFU|UZRa=C^q&{hsu$j!_bk07Z_{Sg z?Xr{EFS~!Xbb9_=AvNjS1d;9c_UxT|H7j@Wr{}8YxNgsVS#|5civ6z{XHUGNT+(tY zXMOsYg@H$YxMWP1>po!mXuX=hPY$1{@}1|#XRpqWynebs-0zj=3|qUD^4+^Ff5msc z+@8Z0pRKid&Fb~XlzQed&Sek`MjOX#Mx`Z+9UIsBa{0rt4l<#;5_^Kf9+pg2$ZBU zAuYkd!Qy%`4t1Q%{pLnRL|7C(Il;)lu!8e&*M~bhi+}iwg68^OOm<~pSiyX_Yr+K$ z28Jtt)5JitdAMd`kVm+Xx;z-diG`@sey5zLXlm~La>)Aq7Vf8V<*bYh3G-bfJOWN7 zR%WlZwG!+*sJCwKkKCTw5i1%&6JDB1A)izxhAb*Ud=R^58pPjl_v z#7P_s7mi3Se58Nd?P0K1-2nGe>ic+ z-YU|PklK29ZC1vWc^1!fpNHt*JRde^(v!=ZfAWcZSH1gINr{WW;G)u>jdBbopuRHm z@po&f4@T|p-c*i^woLnp3-`lIt$l&0})6+BU_wC!sq6=3X5oBm! zD|m5XVYgv7mw1v`(vbr%WOVP_RrQ1)ygp%XF9#!oo9dyL45bn_V#Ov5g3~k(HC9Ut zGBGGPfm0W_&&j~BSoq;_#*P9Tr8ld$3o0@kIN_?n_Vho`j?&j+N-|qHe!tCi;b1U` z5>$J<$;wLkkYHy)!#%ea1_ou3g@$_Si;b0JS~=KXgB5+ckYUMx`pnw@pFg##+sFT( zJFDW?_5XVoFBhr%`|j}npZBdFT|NHnpc?bLbw{q>y+7xE^^eKBZFHC~2=K|<>8$(A z9H8x{c<6rZj~^%RtpES>bNqB|(aUR6pI>MBwt9ZWe#@(`$`2Q($NhOWW#W#Hs!A*w zJ*-Ff7Z(?=4SUUXrG1m@kNmsV58vok9M#*hyhJ{(?$7>mxpMm&nI-n`;`Ryn%lu#a z`}6-!A^Vy;bBnuu{eJxETz2PT`}FJoCExs-FW*(P=#Tt4*UtaiL4M+a4`yE5`QfeR z`-eaG>Yv~H;lJ(XhyL%+RbTi2v3lM7%8yI`m-$!dovHb&{_pmWuaCmjg#@eiTZ*g9 zb8cY}mP-^C6S*%~%9V9gBdulM#+LbZf40BToHZeG%JUMV+C3Mht`j}Xe0#qC--i+v`^-}oh8y0jx4)A0b@lpP@%3L%7uc1b`u*w7G0W^p-!FvE4@Wk$-8)Y6}yo=y%hcl#K-xYhN?kCT~qQ`W8R z>JB(#B>U(~?+Txw_bS%9M#@w2cK@DzVB*K<`}NnJ=EdGBynK)L9q@u3Hm7atr9d|DY;>?d|dx#!(yTh4s0V~Ll3 z$Sth*J|8|eyZC9@f*t#Ryw2ORv##I3XyYFD7t5s=UVL+%Q-994zt2Lx{8=uq`E_|i z`QzJl_wwt6?pXAE%2#=LaP5%n+9^go9Y*EX#bv7lf{IrMFVXwe$8bvc;iXHLI8XkadvEpI*Xoyo z&Rl);_uStH`{On&D6IV*dR~Y36r-Thp+;AU-6@5&+hs(xQhz0R$2@(n;2o32Dt7&P zcu{CO$3h{cp0nwDK7Zy|!&}`UAgFX`Ro4cS^(s#zvd)&RP5$2@@Xfttx?Zf6-p=ip zU+2YJ&zn`0yZiR-o$BGOr|ag;ox5(^()~rpwIG%)bkz_`_KXztx}R{9)AQ83UsWN? zoU4^I@5FAnU+T|4GwZXv?uu8ntEP%xy*1<9G^zWnE)g*;t2l-E-725_R*0U_1R6qG z^TO6CT5)5hi2JQyJ;g4OOsYqfOw@BarJMh@NuTgtdO<{ax9!`^#^Bv{49=YfI}b76 znj2T1U1_D9TDe+!pSZSFu5Q0ir_s%&j+P2eE)l0}ol5hTow>H;PS4A5oq)5I+OFv> znTj_T)Z`yMCpO#IE4V!5pRs)dM|Zcuv=}89RsT6+(%`j(5qGOwHttw*z+`{xu8YPI zP1;rc2G8%M%n6JZedlsBw5^cwnD(K7^4z1%M*SPPz}?Hgk_*+0d;>SO^vtewzq2sV z_|3|^r$P@;?fP1?@|{Qh_j%j1rLU~xKMeheOrvLff5a=GqMY1uA*=6~G0+Glg)ye`R~v5N{Vp7-a?(>Lah=hE+; zRQWqiT(v8F(*2nkd)_VaVRWss@U7YR@-AnMq|W{i|M%_{^!c&Jx>#DNf5Y9$XA7KO zzI2sT%IP%P&wDy%_wBB4LVNbgPJKVUlY?=V`I0Vw;ZKb%R&_N>DS;22d_Hv^UZfL+m8RJv^IZ?^cE2jQank+L^yTySPI+fDYpTSay04+%U$3u|JaN*JHRo>K$0y5# zp5M8X!PJzpQZ zQO^H%v3c^%PS>=Sszno)uHSy6?^5?dj=w+WR6F~&JbdE6ugPiB+I@GoJa6g{Ncbek zymZ5Y84h!rq7?b=?Em+A|38h%@@yg^4^O&xa;%^C=Zy95o2#0P)h%A(%IjS()Jwa5m=Dear)J# zr>E5y=1tK%bfDlP@1f}M#|P4EK677kmgQQi*;&2t-jq2(b?1)US?;#9Ytrw^i!r%+ zd)l{uf0FjWWktdAjwxLdFZWk}vptkB)%NG)?;J5c%-Iyd7zTdZq3z{_x+%uWTZ(E+t11RqXR){Z+L zeKKnI?tM4T3vAl4Z}$F94YP&kKm9(o{=$RZT-jP?I#={&$O!7`>du{T=l;a>ocCA1 zeHE5$sVp{RbN+Q^}$V}q2E&X%`JQGeduD%-xj z`27xH+jPZAzHB$dOav5_WP(}_F4+I>rQ;EWLRBt3FZB}zi|<_feCTGl2EXc$m+6LP z1>FI8!Y{pbuk8)qd+3*+vCWDW@5eHcOONJ1w$fLV-PET!Tf^yU%fF-!j~&xp0)#i8 zoSJ6Y_CMub$Vnz8mzKri3l~Y48p^!d>Y{n-h~zA5@v}L*CT((FoW)tT@s?k#XjsY9 zX;XwgOxb;2+jo8F4l4mAr8z!=YT*?QyDz`a(^bz0Ew%QG_RlYGQdM5Qap$gUekFO_ zwFXLpUHL}0tM%$RnyxQ7&mr5qZ|Vx4<&QK&?`>OVc%?m6#96A?;JV71^K*BBI=FZK z)y>k6c6zgAqY}@(Urr$(?yh()^8S&glG2*>9Ns@KD!EuxDw(iM-o3VDW~%IM|IVyU zYp3nLEF!GrBoWkdvc({>;MtVy<}0FR0a3{8QQU@}a3&8~?r!=`7ds z@0D73(Q%f4M#&@B74cyU7fniiXufmK8iQiB?tOw!gSM=_V{&r&J61MOLAaV+ltF?32WvG0;{AcQunNo7oGW$5Hy(R=lE_QRT zJ-X7U`+BMM+;vIEHHwdai{D~&O((>m<7LDGOD>V)EZ5XyPf$Ap?2H*LoltH1x2r>)Y znilK}Z&^P7?cDlr2mI#$d-L>X{eca1yppXP zi)Ti@*+02TBqW97{byC~s&gJKebtRsi#94dE$$FVnE!G8Ec5%1LU)J1R1z^fW3j3- zw8eIDs^#I&!p@DX{`*e2lyX`8otf@^&co-_NAv%nLQhM{rG=qm!u5aMAHHm!zWHM9 zZrjTF@52hR4R+T4$hcac@@2Nl^V6F>8%*w*`S6E6_u-LSVQBtbP7yTOz2{qa%jBP1 z)FBHmxH}3oXMNM0Y!=rcz##Z3D*d2Q2X6V^Fo{m-)- z)YzJ%BKS*=M=eBI?sRSRjD4b+^Pcmn9;(ZJJKNuQj!%I1>(wbPHxvZBUM|?aaU(>B zg5WVW6JLoVI?PGA5t?aDAMaI2-#Qe2ziV6eQKcg8qoIY5-u>F8zIfWhwycWFk$om} z3O4+|_Gv*-?~*P4UngyrUe^-oE*IDKSM1@@-n;+zJ^tU#A^0$1{WahBKa)Qi{@j~y zZoV%<`|06N zTDz=nrp(&{*Nd~Wq>KZ1&ff88Cbwp1;?XM!E0Ukh-eH*PHsg}O-kP))UxA0J|KIHV zA*STg(!4LP%0F+r(D9m$k&m_?%dwI7Ygv0+f8L#v>3b|+Dw(`hpS$>c-W^S@q@^G4 zbpMp-`Lx12hu_!!m)@eSv$p44-FYQ7{LCC3tMrzaN+nyhx7N&15#)O4+WvEYc+-Lx z?~X0ikQG!q#28l|w5&nNc8;3e{V(rW_VG-M|MCCcJr1>+dvka4PISNV?qr(9!Y^MI z@d$2nnR&l0b=}?EllnQrtZq+#r)vG&f8)x%x<5a=k0$gU!B#n z`PDsJyduu?WQhqbR2GrQa_X&nweVtujdtflH$|t#Nm<(%-wU2aDP_7)S4}_Il-CE6y-%J#V9tKWE`Z7eD3}x66xnJY!y%^=wXi>Xf#WY5c8)xEg8!D;cK zKKb+No$L30yLGUconLgpE2S;R^HaAet9QRr=L(u9X*f@+Gri%Ou=c4fKA{u;PUwE9 z`~0wx<-s#+E-d}cIQ>g?%gTPkI#!kyQ*k=f? z`glqI+8+J9W8B5Rw2t<%rnNYKGrO(Lpm?Zo|Dwz}|F%4@+bf{Rp!B4bL;9~1s2~zol6hik zSmX*}yR>u&BsfLJ#{Lz`;(*i-QoIlv)Mz;FU2}m+kcmOz(6TOrA1^=)z#Ljag%UqJ zUDW({Mev7@M;;s(d>VdxN8KK$|3+pm91Is^1gCv_Ev&3%{5e!(`G09~|2*%9OaE51 zequH05MXGKeE6ir?W}(I=^r1tTsSTW9LZnX`T7sT6)u;ESscN2dzvn2I5g{M{F^&_ zcJ|h&@C9}S{RI=MTaNXIAF+2x{9nP!f11HW`;eNBMqScxkt-0rj+8=!NDk?sPyDJsQh99 z_d1jgF}mz{^tI|<*Srn8_fK-`%`)ESEh>T-@kO_!9B0fmk;#1wg_t<@}90Idwu7&yKnR2x&QZGe)smv zl=2PtuXwabKbpPftjm9GTfv8Qod(;crmao+VV35XSWpxjz589HqxWtf$*w!G|F0M~ zO)5P3v3h@m;oL9xt+q@Tk$O|By7KCxB(KdTt0#HwK9aPBJ#~Lp@6&(1i>}5MZA(2W zZS{xisz73n!`YTj4pHSUo`a0<^YXK^kM7oxEmm@Ji7*xP3SX(V#Z`lO_Q8OBP6yta zXH#bG+w+Lk+shzie#oofLkaI6MoAi$PEQLB+Uq{U!i)P*RIrt`mh`%y*td7AjSv0m z{P5^#_hqfq(Rbfn+qBQb_U^kchf+%yUe9#@S>=^9MeDlr&nu6vt8a3>;neb5$tl$2 zR7YN?LHWKFI?t!RoR^^$c4}Ya^79;1t$zO8S@tKMy8Z5o+@vOW zby*P`ws6mr-vxdv)&+N{%^HYxZEn(f83j=>I?tErq7_qXB<48q=+vcUaGEyET&W!55P!^u! z6y36rtGPXC+cqmu5B*T*-?W)Ub_Wb>e6}ToD2ePpSd!ym_ha#fr|QQOYCc#xxmef< zTFqbU($c^YYA0xX_?^7{0l$t3`O{`92u3N|yKqd_KGfRUy12REYk%xdhqLPLiEBWU z1=I7G-|XgK1h*9f>iOhsER2nft*yJG1QZWBw=np+#5`>0m$xf^cIMBYKTKEHT|kXd zhfE(|-_FX1j4MRH3O&5Lb?)Bd^S^(!HIklfT|N8lltsVva#x(Puk7JqWLRY}b^Z08 zg5=HdrL|9Xx>#gnp5b6*5O{dQ^~SFspT+;Z$$frw)`qAx>!j!JzrmAMI-7s5^skza zf49xI|1@9!(C%#h=AZYS-#`AzBe*Tk#rl@;%lFH#9{>O6(Y?=S#sBT!ZvIE#y7tXo zPP=mz>2Hq~|6d#N`mU$lza7t>i^x~j6bTD5fp(!h{rjs$e^1%#zaAk$rP=bDh3DF( z-%BTXt2N129;!EY`hT{2&O%dJC6Ux))>Xf2>pzD@O^wj@oVe~_rr`dT&zCY;jO#Gq0Fc7rj@yP1^l8HME>c2m3um0Ba;cw-~H$Dp` z6Th9-bV_Rhjlb)B=XgB3{^Z|1$BRx$JQw-SbbDSz#P1XP3p4I3^W-Zzi>a? z`YHRoXL}yZoByNs$cyU&e?2k@Ie_{BY~Pji+R!_8;L`>z7zHL*?_7-T4{QI6zCoJl?(U z5YBqOZ{DY@-@iClh?oj3{ISdEqv~~Cmk32cuG?>`?yb|B9?`=5SfjXtTW#sey0Dhl z>c{_qI^2@`6rH~_`*d)`@2y(83N(=Uu&&|d&s(u+EmMUSzF+h8=!g58SRQD7K2Z>N zb$Nx6*D}TPz4&%vT?0RwklJA&x76S zJ&x!Y4mMRz>x zCnpzY3$InYb5^?Xmf#RXA zu7F)$Tc_zdNjCDhl|Su^F)|E3G)Xfx>!VNhD$)1ef8?i&=vpnC)+ycV8T~|VX~Pz- z8@*fKcP#rE^jge)ruMx3OH5c^sUGSU*Z1=V4~bglF1((}zH{34UErcuefE#;k3v&C zebZWsrTxvmPq|;_(DGZ~Db(=Pp3_2!?`i@g&uL%YG~IChWG2qqM;$#{)`hP6%+gV_ z&P12JS=zyIR&w(kX03Xo11=o~5nuL-E&uVU+eRaN)z7VSxQdiBW^v3E4D)O8`r_aH zkXQN89i!ZOm0(}rrKjw=?<$w9k>AWAD}3NW{}~>2mzIgY*n}0oIk$9dXi_p!O*$@J z?7VoI^rzE4m4{q;eQxp3&6C}mzeS2t%!Izm!+Pkyd+addjEL&eeSW z6*c3w{PSjmI^!?hK#q8?S`+V!a1)cf1%>MH^E#v){`Ce|UU zQu(VhFBO^xK63#TU>m%Yw!HhJ8hpSZbM^B4SYNgJM#1%5%5Jky#{n*me{VNBa`qW5{@uM#^XL)K z9u@`gs0gE)_(w~p!nvOtS?uf@IRq6QoOO{Jqu`)t^y=Qg$=xNtz=9PzA`-y&Xw$Bm zpPxKeNdJ)otsG)l+8My&`jJZsRG=-mXnd%A0Vwt$txk}bAQNa>Aye?)mwmN=9(7x~ zL|6*0tJphl`y%x>>-6O;H|^Lbt@ovOf9jD0)+yfgydQr%zn`$gGc<#zC#J>Q+gn}b zd-;){8;axoE4SAEWeMr}b%rCq>U_TPp{~vVo)5d{ZC}mzaU%!&_P$3GkAD3+wN~;1 zTVCt_hws*H%uR52xe*|^uj;E;D9EiH1)E%6R2S45{@KnW_)F?b*eZhsysA!*{h960 zeztMB!6O*AtK{X5C-?l;@2<_?ef#ddWy@l$`KB%svp+ngV?!&)YL!Db8fI|{w`%Bh zHqYJt`t_|_rT*OwX%zvS(~nuksA~LNloQr8b%~XJOx(w+SLY77>@7O!miE(=^VPdU zQ!?~7m6Sfq4)wfYQuRDz_u|liSi!j9x65_nZofO`UiN(6r21-gpDBl?SU&Cv;1`_s zf7kCPAMb6?E*DG;bTTYwbUbH9Bd3ly=(c-OTw`C_6t?1zRdRl8r zl#@PX+13{wUqABgu2J5+%ExxjD% zbM>D;<*2N>y7|#tP+9nJ)%4}l7wudy-}l_BrW{AV`fcBPW2!%Go__Im`n{7WRuao< z7K;{rx_H_k_1jGGcSq~*M&4e1KwVH!k- z)00W_-OoK~k=h!0_f=%#!4(?k`DV_mQTeKN%FyV?Y>lOJ>%KHdg7%tAZ0C4tWA9&iBDc1)Y~@@ zJaydSY;^e^0YwL8f%(cJ*Dd8eGQJ#FuTXSqP>T-uV{LAJJ!|Vahgxtan`w#|Xmxz)m@b%+!{XaKvpX)YF+!_&UZdboi z^2{qU`6}}-KOgbK_yF}BrhfI4I#r0FE z=Ig7etDIbJXbAp$wff!l_`jC|jyiPi`*3URcjZ9Ot7~hQ9I=$o+mqj+JCmdC3FrU2 z9DmLAi`uT0bOcP1eE;I@_rGVOe}3Jfw9a2{e?`&nJZ-78c)p&+F~i2d~6jZiwJ2;(r+*x^`Tzl+#+Pc(+P_bW2u7$o&A}h50vSpNgK` zx_|c!e>3x_<30Mn{o;hx4ppqU-u5RYA=K@L#f_c2_pMti`u++>MjQLog3LLGLz^b) zpGs4W@La`t=&9)X1^~QpH+TRF}QG9N2d;$US)h z3!*BxyT91~$_<`lYR%;5MvN3f0ibGd!pj`Z^!_veeBKPNIvknfL0zoJvA zn?>e#j;9Xm`F?KWc=~r!!h)%tMKykJ9?YAgQGVyiTa$3kq=S`*jUs$@mS%Pvs0M1< z#BDk4|59vm(#o$ocfu1FZL+&HdD_7h(NUI~Q(GEcKsy#PJ;4)I%XPn4y;ZpWDJbl~EKHt}u;QHm+{M{z$+h2$p-|zEi z`Md2(pr?i}N`tzjcmA&VMTcwG6~=Vl(*#X-1!^yQzRFjK=gM-6vW$@VXVb#1S>XB=kw6V&I^6l7;9TWV-$xv#TP1DaeleF zq^lq?@u9{QUY8DzpO0sJ>R|hoPFPiIkgH^uhH(HHPhwv5n`~)xG|FHKyD%S&aGELS+NV;;lC2z^6iDrv8Rn`E&s%Gy4DLjSKl-~ z#0awHN`l)DzAL=S5z~9lJ=|fFk@00&_#4erZS8L0b$AUNiBFVx+|v&heCLQ&+Ov7v z^&c}IftUITDE2tFq}u2_?%r@zWCJJv={0zp(#ndjB+5CX{OU`u^*xF^>)%o<23-jy zTUb*5?zJZ92#p3W!$r&84zItqr~8juOiR+6dtdj&mRiW=mGG%(9No2J-@Z-y%(o7# z4KVw1`_bAZVz;mB2_)9K{&;m&JG8Z9gQZf*8IHimEL|7AKlqjOBVTgyW@p*oE|N+m zB266X@kk4z?%#e_wtf9d&Fg*6OC{!Ve4Sz`r#jb0@EF?_pBX*pj@{AVVE_*s=rYZE z=%^Ya^}Jx}f+xX;CjBZ)o209*n(^{Ehw#@^s?sx`YA@|Pn$g^oWSllx^Qe{8<%=FG zCUC4@`7Ky%eQx<<<0O=}v;mXgv>&mH^91ijRv(N#e5>~Qi-k!w-*?})%i)m4Q_4cpG!e6ovK@+9d zLR!APh}p$)+$<_AzGd-?T+m!8XkOm1E1+h>#~DpOdV4k`W-U6Qd@KJ6OGBezxUiB= zc1Bpc+T-nYSNP=PT7DZvg}n-qjLv_*nPc+eZVpC)L|NC2{?p1r4=dbGcXb!I?A`lc ziKkx=N%V*3kaI6-TvLN#g*eWKSOFGhquhE?tm_i@2OkX%;GqH z;dZj!`74a^Jgq8a2N)O_7(8A5 KT-G@yGywoS_Cm4% literal 27364 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�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 B+gShr literal 18348 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 diff --git a/doc/qtcreator/images/qtcreator-code-style-settings-edit-qtquick.png b/doc/qtcreator/images/qtcreator-code-style-settings-edit-qtquick.png index e0f5e44e7c943543aa3ffd27f981f9645f954799..34473e4bd89893c317f6e3e4f8d2fdd68e589f57 100644 GIT binary patch literal 12603 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 Sz=(l?fx*+&&t;ucLK6VjwqxM{ diff --git a/doc/qtcreator/images/qtcreator-options-clangd.png b/doc/qtcreator/images/qtcreator-options-clangd.png index b03a9e4d70dd7deb43a63c55a3d1bebf4832ef9c..a4251e7be8f09933d2dbef50a41ac04ad5b080ed 100644 GIT binary patch literal 16621 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 literal 12308 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 E08zi&CIA2c diff --git a/doc/qtcreator/images/qtcreator-projects-code-style.png b/doc/qtcreator/images/qtcreator-projects-code-style.png index 6063a2c211d56f0999fb7a76b031c516750901ad..f29aab6ab3ed35faf0205e9e6a77ab8185ce3d70 100644 GIT binary patch literal 11211 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 literal 12932 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 A)c^nh diff --git a/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc b/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc index 473977c2b6d..673b9096b39 100644 --- a/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc +++ b/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc @@ -132,10 +132,14 @@ to run in parallel to make the analysis faster on multi-core processors. - \li In the \uicontrol {Diagnostic Configuration} group, select - \uicontrol Manage to create or edit a custom configuration. + \li The \uicontrol {Diagnostic configuration} field shows the + checks to perform. Click the value of the field to open the + \uicontrol {Diagnostic Configurations} dialog, where you can + select and edit the checks to perform. - \li Select \uicontrol Copy to create a custom Clang configuration. + \image qtcreator-clang-tools-diagnostics-configuration.png "Diagnostics Configuration dialog" + + \li Select \uicontrol Copy to copy the selected diagnostics for editing. \image qtcreator-clang-copy-diagnostic-configuration.png "Copy Diagnostic Configuration dialog" @@ -148,8 +152,6 @@ system to the Clang code model for displaying annotations in the code editor. - \image qtcreator-clang-tools-diagnostics-configuration.png "Diagnostics Configuration dialog" - \li In the \uicontrol {Clang-Tidy Checks} tab, select \uicontrol {Select Checks} to select the checks to perform. To filter the checks, enter a string in the diff --git a/doc/qtcreator/src/editors/creator-code-syntax.qdoc b/doc/qtcreator/src/editors/creator-code-syntax.qdoc index ddd90d8139a..ae86067e9f8 100644 --- a/doc/qtcreator/src/editors/creator-code-syntax.qdoc +++ b/doc/qtcreator/src/editors/creator-code-syntax.qdoc @@ -716,4 +716,23 @@ \uicontrol {Enable auto format on file save}. \image qtcreator-qml-js-editing.png "QML/JS Editing preferences" + + \if defined(qtcreator) + \section1 Inspecting Preprocessed C++ Code + + To analyze the causes of compile errors or errors caused by wrong includes + pulled in by dependencies or C++ macros expanding to something unexpected, + select \uicontrol {Show Preprocessed Source} in the editor context menu. + + This action expands all C++ macros to their actual code and removes code that + is guarded by a currently inactive \c {#ifdef} statements. If you deselect + the \uicontrol {Use built-in preprocessor to show pre-processed files} check + box in \uicontrol Edit > \uicontrol Preferences > \uicontrol C++ > + \uicontrol {Code Model}, this action also expands all + \c {"#include "} statements to their actual contents. + + \image qtcreator-clang-code-model-options.png "C++ Code Model preferences" + + \endif + */ diff --git a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc index a95639febf4..d01eb5455ee 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc @@ -114,6 +114,14 @@ \li To process precompiled headers, deselect the \uicontrol {Ignore precompiled headers} check box. + \li When you select \uicontrol {Show Preprocessed Source} in the code + editor context menu, the built-in preprocessor is used to show the + pre-processed source file in the editor. To invoke the actual + compiler for showing the code, deselect the + \uicontrol {Use built-in preprocessor to show pre-processed files} + check box. For more information, see + \l {Inspecting Preprocessed C++ Code}. + \li To avoid out-of-memory crashes caused by indexing huge source files that are typically auto-generated by scripts or code, the size of files to index is limited to 5MB by default. To adjust the limit, @@ -132,6 +140,11 @@ re-scanning is incremental, so nothing is lost by closing and re-starting \QC. + By default, \QC runs one clangd process per project. If you have created + \l{Managing Sessions}{sessions} that contain related projects, you can + specify that the projects in the session should be managed by a single + clangd process. + The document outline in the \l{Viewing Defined Types and Symbols} {Outline} view is backed by clangd's document symbol support, which makes the results more reliable than before. @@ -144,11 +157,11 @@ \image qtcreator-options-clangd.png "clangd preferences" \li In \uicontrol {Path to executable}, enter the path to clangd version 14, or later. - \li For more accurate results during global symbol searches, select - \uicontrol {Enable background indexing}. However, this increases the - CPU load the first time you open the project. If clangd background - indexing is disabled, \QC falls back to a faster, but less accurate - built-in indexer. + \li In the \uicontrol {Background indexing} field, select \uicontrol Off + to use a faster, but less accurate built-in indexer than the one used + by default. You can set the indexing priority depending on whether + the accuracy of results or speed is more important to you during + global symbol searches. \li By default, clangd attempts to use all unused cores. You can set a fixed number of cores to use in \uicontrol {Worker thread count}. Background indexing also uses this many worker threads. @@ -164,10 +177,12 @@ \li Select \uicontrol {Ignore files greater than} to make parsing faster by ignoring big files. Specify the maximum size of files to parse in the field next to the check box. - \li The \uicontrol {Diagnostic Configuration} field shows the Clang + \li The \uicontrol {Diagnostic configuration} field shows the Clang checks to perform. Click the value of the field to open the \uicontrol {Diagnostic Configurations} dialog, where you can select and edit the checks to perform. + \li Select \uicontrol Add to select sessions that should use a single + clangd process for indexing. \endlist \section1 Clang Checks diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-code-style.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-code-style.qdoc index 58b2ddcc14e..1a57d2bdb9a 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-code-style.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-code-style.qdoc @@ -38,9 +38,15 @@ To specify global code style settings sets for C++ files, select \uicontrol Edit > \uicontrol Preferences > \uicontrol C++. + \image qtcreator-code-style-settings-edit-cpp.png "Edit Code Style Settings dialog" + To specify global code style settings sets for QML files, select \uicontrol Edit > \uicontrol Preferences > \uicontrol {Qt Quick}. + \image qtcreator-code-style-settings-edit-qtquick.png "Edit Code Style Settings view" + + Only \uicontrol General settings are available for QML files. + To configure the editor behavior for the current project: \list 1 @@ -58,12 +64,6 @@ \li Click \uicontrol Edit to specify code style settings for the project. - \image qtcreator-code-style-settings-edit-cpp.png "Edit Code Style Settings dialog" - - \note Only \uicontrol General settings are available for QML files. - - \image qtcreator-code-style-settings-edit-qtquick.png "Edit Code Style Settings view" - \endlist For more information about the settings, see \l{Indenting Text or Code}. From ebcc51ecbfa477a5a274ef89b08e25ffae266b6c Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 13:13:48 +0200 Subject: [PATCH 009/104] Help plugin: Replace foreach with ranged for loop Change-Id: Idf7a7182e88aba35dff57ef92e1c873b33cb42a1 Reviewed-by: Eike Ziller --- src/plugins/help/docsettingspage.cpp | 5 +++-- src/plugins/help/generalsettingspage.cpp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/help/docsettingspage.cpp b/src/plugins/help/docsettingspage.cpp index 56f692206d8..40223ea5d29 100644 --- a/src/plugins/help/docsettingspage.cpp +++ b/src/plugins/help/docsettingspage.cpp @@ -250,7 +250,7 @@ void DocSettingsPageWidget::addDocumentation() QSet values = Utils::toSet(m_filesToUnregister.values(nameSpace)); values.remove(filePath); m_filesToUnregister.remove(nameSpace); - foreach (const QString &value, values) + for (const QString &value : qAsConst(values)) m_filesToUnregister.insert(nameSpace, value); } } @@ -259,7 +259,8 @@ void DocSettingsPageWidget::addDocumentation() if (docsUnableToRegister.contains("UnknownNamespace")) { formatedFail += QString::fromLatin1("
  • %1") .arg(Tr::tr("Invalid documentation file:")); - foreach (const QString &value, docsUnableToRegister.values("UnknownNamespace")) + const QStringList values = docsUnableToRegister.values("UnknownNamespace"); + for (const QString &value : values) formatedFail += QString::fromLatin1("
    • %2
    ").arg(value); formatedFail += "
"; docsUnableToRegister.remove("UnknownNamespace"); diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp index 04fa8bbd2aa..47ba717fd73 100644 --- a/src/plugins/help/generalsettingspage.cpp +++ b/src/plugins/help/generalsettingspage.cpp @@ -425,7 +425,7 @@ void GeneralSettingsPage::updateFontSizeSelector() // try to maintain selection or select closest. if (!pointSizes.empty()) { QString n; - foreach (int pointSize, pointSizes) + for (int pointSize : qAsConst(pointSizes)) m_widget->sizeComboBox->addItem(n.setNum(pointSize), QVariant(pointSize)); const int closestIndex = closestPointSizeIndex(m_font.pointSize()); if (closestIndex != -1) @@ -446,7 +446,7 @@ void GeneralSettingsPage::updateFontStyleSelector() if (!styles.empty()) { int normalIndex = -1; const QString normalStyle = "Normal"; - foreach (const QString &style, styles) { + for (const QString &style : styles) { // try to maintain selection or select 'normal' preferably const int newIndex = m_widget->styleComboBox->count(); m_widget->styleComboBox->addItem(style); From 3667b5ea18081560f41701d63c908de2b3a4d813 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 30 Sep 2022 15:06:29 +0200 Subject: [PATCH 010/104] Doc: Describe Text Editor > Font & Folors > Line spacing Update screenshot. Task-number: QTCREATORBUG-27876 Change-Id: If5eef7243e94492551480f790286d0538d552cd7 Reviewed-by: David Schulz --- .../images/qtcreator-font-colors.png | Bin 16366 -> 20037 bytes .../editors/creator-editors-options-text.qdoc | 3 +++ 2 files changed, 3 insertions(+) diff --git a/doc/qtcreator/images/qtcreator-font-colors.png b/doc/qtcreator/images/qtcreator-font-colors.png index 1cfe802c33ed56d95dcbc2c06649f94c242e8ef8..3fbcc52f49d80ef6b1ee60e9cc958cc393194fb9 100644 GIT binary patch literal 20037 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 is2r36?bz| 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ૄq1+IN&CtzNd9%V)M! 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 L>gTe~DWM4fy3?nh diff --git a/doc/qtcreator/src/editors/creator-editors-options-text.qdoc b/doc/qtcreator/src/editors/creator-editors-options-text.qdoc index 3ba1ce00676..54849b96825 100644 --- a/doc/qtcreator/src/editors/creator-editors-options-text.qdoc +++ b/doc/qtcreator/src/editors/creator-editors-options-text.qdoc @@ -39,6 +39,9 @@ \uicontrol Behavior and deselect the \uicontrol {Enable scroll wheel zooming} check box. + To improve the readability of text in the editor, adjust the line spacing in + the \uicontrol {Line spacing} field. + Antialiasing is used by default to make text look smoother and more readable on the screen. Deselect the \uicontrol Antialias check box to turn off antialiasing. From 378d8137978cb26b77cadd517989c002378f1181 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 5 Oct 2022 14:00:49 +0200 Subject: [PATCH 011/104] Core: Restore object name for dialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit And adapt usage inside tests. Amends f5c725cf23a06730a16f22a896b57cef947c64b4. Change-Id: I8f1e47ea206e34a242988373fa569d547d8d637d Reviewed-by: Robert Löhning --- src/plugins/coreplugin/dialogs/newdialogwidget.cpp | 1 + tests/system/objects.map | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/dialogs/newdialogwidget.cpp b/src/plugins/coreplugin/dialogs/newdialogwidget.cpp index 962255eb379..634a36128d2 100644 --- a/src/plugins/coreplugin/dialogs/newdialogwidget.cpp +++ b/src/plugins/coreplugin/dialogs/newdialogwidget.cpp @@ -167,6 +167,7 @@ NewDialogWidget::NewDialogWidget(QWidget *parent) , m_templateDescription(new QTextBrowser) { + setObjectName("Core.NewDialog"); setAttribute(Qt::WA_DeleteOnClose); ICore::registerWindow(this, Context("Core.NewDialog")); resize(880, 520); diff --git a/tests/system/objects.map b/tests/system/objects.map index 7922cacca2c..5fbccd28b03 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -95,7 +95,7 @@ :New.comboBox_QComboBox {name='comboBox' type='QComboBox' visible='1' window=':New_Core::Internal::NewDialog'} :New.frame_QFrame {name='frame' type='QFrame' visible='1' window=':New_Core::Internal::NewDialog'} :New.templateCategoryView_QTreeView {name='templateCategoryView' type='QTreeView' visible='1' window=':New_Core::Internal::NewDialog'} -:New_Core::Internal::NewDialog {name='Core__Internal__NewDialog' type='Core::Internal::NewDialogWidget' visible='1' windowTitle?='New*'} +:New_Core::Internal::NewDialog {name='Core.NewDialog' type='Core::Internal::NewDialogWidget' visible='1' windowTitle?='New*'} :New_ProjectExplorer::JsonWizard {type='ProjectExplorer::JsonWizard' unnamed='1' visible='1'} :Next_QPushButton {text~='(Next.*|Continue)' type='QPushButton' visible='1'} :No valid kits found._QLabel {text?='*No suitable kits found.*' type='QLabel' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} From c46e5cef2d9360336464070fc3f77b547ac913c5 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 21 Sep 2022 12:21:57 +0200 Subject: [PATCH 012/104] LanguageClient: Offer to rename matching files along with symbols Like we already do in CppEditor and ClangCodeModel. Change-Id: I9cd292950e40c499d99cc561fbf0ad99af477803 Reviewed-by: Reviewed-by: David Schulz --- .../languageclientsymbolsupport.cpp | 145 +++++++++++++++--- .../languageclientsymbolsupport.h | 16 +- 2 files changed, 129 insertions(+), 32 deletions(-) diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index defa368f1e3..b55dd61808e 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -10,17 +10,63 @@ #include #include +#include #include #include +#include #include +#include #include using namespace LanguageServerProtocol; namespace LanguageClient { +namespace { +class ReplaceWidget : public QWidget +{ + Q_OBJECT +public: + ReplaceWidget() + { + m_infoLabel.setText(tr("Search Again to update results and re-enable Replace")); + m_infoLabel.setVisible(false); + m_renameFilesCheckBox.setVisible(false); + const auto layout = new QHBoxLayout(this); + layout->addWidget(&m_infoLabel); + layout->addWidget(&m_renameFilesCheckBox); + } + + void showLabel(bool show) + { + m_infoLabel.setVisible(show); + if (show) + updateCheckBox({}); + } + + void updateCheckBox(const Utils::FilePaths &filesToRename) + { + if (filesToRename.isEmpty()) { + m_renameFilesCheckBox.hide(); + return; + } + m_renameFilesCheckBox.setText(tr("Re&name %n files", nullptr, filesToRename.size())); + const auto filesForUser = Utils::transform(filesToRename, + [](const Utils::FilePath &fp) { return fp.toUserOutput(); }); + m_renameFilesCheckBox.setToolTip(tr("Files:\n%1").arg(filesForUser.join('\n'))); + m_renameFilesCheckBox.setVisible(true); + } + + bool shouldRenameFiles() const { return m_renameFilesCheckBox.isChecked(); } + +private: + QLabel m_infoLabel; + QCheckBox m_renameFilesCheckBox; +}; +} // anonymous namespace + SymbolSupport::SymbolSupport(Client *client) : m_client(client) {} @@ -169,14 +215,29 @@ QList generateSearchResultItems( bool limitToProjects = false) { QList result; + const bool renaming = search && search->supportsReplace(); + QString oldSymbolName; + QVariantList userData; + if (renaming) { + userData = search->userData().toList(); + oldSymbolName = userData.first().toString(); + } + Utils::FilePaths fileRenameCandidates; for (auto it = rangesInDocument.begin(); it != rangesInDocument.end(); ++it) { const Utils::FilePath &filePath = it.key(); Core::SearchResultItem item; item.setFilePath(filePath); item.setUseTextEditorFont(true); - if (search && search->supportsReplace() && limitToProjects) - item.setSelectForReplacement(ProjectExplorer::SessionManager::projectForFile(filePath)); + if (renaming && limitToProjects) { + const bool fileBelongsToProject + = ProjectExplorer::SessionManager::projectForFile(filePath); + item.setSelectForReplacement(fileBelongsToProject); + if (fileBelongsToProject && filePath.baseName().compare(oldSymbolName, + Qt::CaseInsensitive) == 0) { + fileRenameCandidates << filePath; + } + } QStringList lines = SymbolSupport::getFileContents(filePath); for (const ItemData &data : it.value()) { @@ -187,6 +248,12 @@ QList generateSearchResultItems( result << item; } } + if (renaming) { + userData.append(Utils::transform(fileRenameCandidates, &Utils::FilePath::toString)); + search->setUserData(userData); + const auto extraWidget = qobject_cast(search->additionalReplaceWidget()); + extraWidget->updateCheckBox(fileRenameCandidates); + } return result; } @@ -289,7 +356,7 @@ bool SymbolSupport::supportsRename(TextEditor::TextDocument *document) } void SymbolSupport::renameSymbol(TextEditor::TextDocument *document, const QTextCursor &cursor, - const QString &newSymbolName) + const QString &newSymbolName, bool preferLowerCaseFileNames) { const TextDocumentPositionParams params = generateDocPosParams(document, cursor); QTextCursor tc = cursor; @@ -302,34 +369,40 @@ void SymbolSupport::renameSymbol(TextEditor::TextDocument *document, const QText bool prepareSupported; if (!LanguageClient::supportsRename(m_client, document, prepareSupported)) { const QString error = tr("Renaming is not supported with %1").arg(m_client->name()); - createSearch(params, placeholder)->finishSearch(true, error); + createSearch(params, placeholder, {}, {})->finishSearch(true, error); } else if (prepareSupported) { - requestPrepareRename(generateDocPosParams(document, cursor), placeholder); + requestPrepareRename(generateDocPosParams(document, cursor), placeholder, oldSymbolName, + preferLowerCaseFileNames); } else { - startRenameSymbol(generateDocPosParams(document, cursor), placeholder); + startRenameSymbol(generateDocPosParams(document, cursor), placeholder, oldSymbolName, + preferLowerCaseFileNames); } } -void SymbolSupport::requestPrepareRename(const TextDocumentPositionParams ¶ms, - const QString &placeholder) +void SymbolSupport::requestPrepareRename( + const TextDocumentPositionParams ¶ms, + const QString &placeholder, + const QString &oldSymbolName, + bool preferLowerCaseFileNames) { PrepareRenameRequest request(params); - request.setResponseCallback([this, params, placeholder]( + request.setResponseCallback([this, params, placeholder, oldSymbolName, preferLowerCaseFileNames]( const PrepareRenameRequest::Response &response) { const std::optional &error = response.error(); if (error.has_value()) { m_client->log(*error); - createSearch(params, placeholder)->finishSearch(true, error->toString()); + createSearch(params, placeholder, {}, {})->finishSearch(true, error->toString()); } const std::optional &result = response.result(); if (result.has_value()) { if (std::holds_alternative(*result)) { auto placeHolderResult = std::get(*result); - startRenameSymbol(params, placeHolderResult.placeHolder()); + startRenameSymbol(params, placeHolderResult.placeHolder(), oldSymbolName, + preferLowerCaseFileNames); } else if (std::holds_alternative(*result)) { auto range = std::get(*result); - startRenameSymbol(params, placeholder); + startRenameSymbol(params, placeholder, oldSymbolName, preferLowerCaseFileNames); } } }); @@ -375,8 +448,11 @@ QList generateReplaceItems(const WorkspaceEdit &edits, return generateSearchResultItems(rangesInDocument, search, limitToProjects); } -Core::SearchResult *SymbolSupport::createSearch(const TextDocumentPositionParams &positionParams, - const QString &placeholder) +Core::SearchResult *SymbolSupport::createSearch( + const TextDocumentPositionParams &positionParams, + const QString &placeholder, + const QString &oldSymbolName, + bool preferLowerCaseFileNames) { Core::SearchResult *search = Core::SearchResultWindow::instance()->startNewSearch( tr("Find References with %1 for:").arg(m_client->name()), @@ -384,14 +460,16 @@ Core::SearchResult *SymbolSupport::createSearch(const TextDocumentPositionParams placeholder, Core::SearchResultWindow::SearchAndReplace); search->setSearchAgainSupported(true); - auto label = new QLabel(tr("Search Again to update results and re-enable Replace")); - label->setVisible(false); - search->setAdditionalReplaceWidget(label); + search->setUserData(QVariantList{oldSymbolName, preferLowerCaseFileNames}); + const auto extraWidget = new ReplaceWidget; + search->setAdditionalReplaceWidget(extraWidget); + QObject::connect(search, &Core::SearchResult::activated, [](const Core::SearchResultItem &item) { Core::EditorManager::openEditorAtSearchResult(item); }); - QObject::connect(search, &Core::SearchResult::replaceTextChanged, [search]() { - search->additionalReplaceWidget()->setVisible(true); + QObject::connect(search, &Core::SearchResult::replaceTextChanged, [search, extraWidget]() { + extraWidget->showLabel(true); + search->setUserData(search->userData().toList().first(2)); search->setSearchAgainEnabled(true); search->setReplaceEnabled(false); }); @@ -403,18 +481,20 @@ Core::SearchResult *SymbolSupport::createSearch(const TextDocumentPositionParams }); QObject::connect(search, &Core::SearchResult::replaceButtonClicked, - [this, positionParams](const QString & /*replaceText*/, + [this, positionParams, search](const QString & /*replaceText*/, const QList &checkedItems) { - applyRename(checkedItems); + applyRename(checkedItems, search); }); return search; } void SymbolSupport::startRenameSymbol(const TextDocumentPositionParams &positionParams, - const QString &placeholder) + const QString &placeholder, const QString &oldSymbolName, + bool preferLowerCaseFileNames) { - requestRename(positionParams, placeholder, createSearch(positionParams, placeholder)); + requestRename(positionParams, placeholder, createSearch( + positionParams, placeholder, oldSymbolName, preferLowerCaseFileNames)); } void SymbolSupport::handleRenameResponse(Core::SearchResult *search, @@ -431,7 +511,7 @@ void SymbolSupport::handleRenameResponse(Core::SearchResult *search, if (edits.has_value()) { search->addResults(generateReplaceItems(*edits, search, m_limitRenamingToProjects), Core::SearchResult::AddOrdered); - search->additionalReplaceWidget()->setVisible(false); + qobject_cast(search->additionalReplaceWidget())->showLabel(false); search->setReplaceEnabled(true); search->setSearchAgainEnabled(false); search->finishSearch(false); @@ -440,7 +520,8 @@ void SymbolSupport::handleRenameResponse(Core::SearchResult *search, } } -void SymbolSupport::applyRename(const QList &checkedItems) +void SymbolSupport::applyRename(const QList &checkedItems, + Core::SearchResult *search) { QMap> editsForDocuments; for (const Core::SearchResultItem &item : checkedItems) { @@ -452,6 +533,18 @@ void SymbolSupport::applyRename(const QList &checkedItem for (auto it = editsForDocuments.begin(), end = editsForDocuments.end(); it != end; ++it) applyTextEdits(m_client, it.key(), it.value()); + + const auto extraWidget = qobject_cast(search->additionalReplaceWidget()); + QTC_ASSERT(extraWidget, return); + if (!extraWidget->shouldRenameFiles()) + return; + const QVariantList userData = search->userData().toList(); + QTC_ASSERT(userData.size() == 3, return); + const Utils::FilePaths filesToRename = Utils::transform(userData.at(2).toStringList(), + [](const QString &f) { return Utils::FilePath::fromString(f); }); + ProjectExplorer::ProjectExplorerPlugin::renameFilesForSymbol( + userData.at(0).toString(), search->textToReplace(), + filesToRename, userData.at(1).toBool()); } Core::Search::TextRange SymbolSupport::convertRange(const Range &range) @@ -468,3 +561,5 @@ void SymbolSupport::setDefaultRenamingSymbolMapper(const SymbolMapper &mapper) } } // namespace LanguageClient + +#include diff --git a/src/plugins/languageclient/languageclientsymbolsupport.h b/src/plugins/languageclient/languageclientsymbolsupport.h index 3fde3c58d01..92d0bdcf977 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.h +++ b/src/plugins/languageclient/languageclientsymbolsupport.h @@ -43,7 +43,7 @@ public: bool supportsRename(TextEditor::TextDocument *document); void renameSymbol(TextEditor::TextDocument *document, const QTextCursor &cursor, - const QString &newSymbolName = {}); + const QString &newSymbolName = {}, bool preferLowerCaseFileNames = true); static Core::Search::TextRange convertRange(const LanguageServerProtocol::Range &range); static QStringList getFileContents(const Utils::FilePath &filePath); @@ -60,17 +60,19 @@ private: const ResultHandler &handler); void requestPrepareRename(const LanguageServerProtocol::TextDocumentPositionParams ¶ms, - const QString &placeholder); + const QString &placeholder, const QString &oldSymbolName, + bool preferLowerCaseFileNames); void requestRename(const LanguageServerProtocol::TextDocumentPositionParams &positionParams, const QString &newName, Core::SearchResult *search); - Core::SearchResult *createSearch( - const LanguageServerProtocol::TextDocumentPositionParams &positionParams, - const QString &placeholder); + Core::SearchResult *createSearch(const LanguageServerProtocol::TextDocumentPositionParams &positionParams, + const QString &placeholder, const QString &oldSymbolName, + bool preferLowerCaseFileNames); void startRenameSymbol(const LanguageServerProtocol::TextDocumentPositionParams ¶ms, - const QString &placeholder); + const QString &placeholder, const QString &oldSymbolName, + bool preferLowerCaseFileNames); void handleRenameResponse(Core::SearchResult *search, const LanguageServerProtocol::RenameRequest::Response &response); - void applyRename(const QList &checkedItems); + void applyRename(const QList &checkedItems, Core::SearchResult *search); Client *m_client = nullptr; SymbolMapper m_defaultSymbolMapper; From f0834e87259a4d9787dba3c8276cc986cf98222b Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 4 Oct 2022 18:10:24 +0200 Subject: [PATCH 013/104] Meson: Inline mesonbuildsettingswidget.ui Change-Id: Ib927f8166f9c43f10c4dd0feae912e3cb4cb153f Reviewed-by: hjk Reviewed-by: Alessandro Portale --- .../mesonprojectmanager/CMakeLists.txt | 1 - .../mesonprojectmanager.qbs | 1 - .../buildoptions/mesonbuildsettingswidget.cpp | 151 ++++++++++------- .../buildoptions/mesonbuildsettingswidget.h | 10 +- .../buildoptions/mesonbuildsettingswidget.ui | 158 ------------------ 5 files changed, 97 insertions(+), 224 deletions(-) delete mode 100644 src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.ui diff --git a/src/plugins/mesonprojectmanager/CMakeLists.txt b/src/plugins/mesonprojectmanager/CMakeLists.txt index cea74e07510..d11468c7579 100644 --- a/src/plugins/mesonprojectmanager/CMakeLists.txt +++ b/src/plugins/mesonprojectmanager/CMakeLists.txt @@ -60,7 +60,6 @@ add_qtc_plugin(MesonProjectManager project/mesonbuildconfiguration.cpp project/ninjabuildstep.h project/ninjabuildstep.cpp - project/buildoptions/mesonbuildsettingswidget.ui project/buildoptions/mesonbuildsettingswidget.h project/buildoptions/mesonbuildsettingswidget.cpp project/buildoptions/optionsmodel/buildoptionsmodel.h diff --git a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs index 2499ac3f9c0..f4495b103ae 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs +++ b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs @@ -49,7 +49,6 @@ Project { "mesonprojectplugin.h", "project/buildoptions/mesonbuildsettingswidget.cpp", "project/buildoptions/mesonbuildsettingswidget.h", - "project/buildoptions/mesonbuildsettingswidget.ui", "project/buildoptions/optionsmodel/arrayoptionlineedit.cpp", "project/buildoptions/optionsmodel/arrayoptionlineedit.h", "project/buildoptions/optionsmodel/buildoptionsmodel.cpp", diff --git a/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.cpp b/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.cpp index 5b593b0a5cd..c3852917310 100644 --- a/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.cpp +++ b/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.cpp @@ -5,7 +5,6 @@ #include "../mesonbuildconfiguration.h" #include "../mesonbuildsystem.h" -#include "ui_mesonbuildsettingswidget.h" #include @@ -14,119 +13,157 @@ #include #include +#include #include +#include + +#include +#include using namespace Utils; -namespace MesonProjectManager { -namespace Internal { +namespace MesonProjectManager::Internal { MesonBuildSettingsWidget::MesonBuildSettingsWidget(MesonBuildConfiguration *buildCfg) : ProjectExplorer::NamedWidget{tr("Meson")} - , ui{new Ui::MesonBuildSettingsWidget} - , m_progressIndicator(Utils::ProgressIndicatorSize::Large) + , m_progressIndicator(ProgressIndicatorSize::Large) { - ui->setupUi(this); - ui->container->setState(Utils::DetailsWidget::NoSummary); - ui->container->setWidget(ui->details); + auto configureButton = new QPushButton(tr("Apply Configuration Changes")); + configureButton->setEnabled(false); + configureButton->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - Layouting::Form buildDirWBuilder; + auto wipeButton = new QPushButton(tr("Wipe Project")); + wipeButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + wipeButton->setIcon(Utils::Icons::WARNING.icon()); + wipeButton->setToolTip(tr("Wipes build directory and reconfigures using previous command " + "line options.\nUseful if build directory is corrupted or when " + "rebuilding with a newer version of Meson.")); + + auto container = new DetailsWidget; + + auto details = new QWidget; + + container->setState(DetailsWidget::NoSummary); + container->setWidget(details); + + auto parametersLineEdit = new QLineEdit; + + auto buildDirWidget = new QWidget; + + auto optionsFilterLineEdit = new FancyLineEdit; + + auto optionsTreeView = new TreeView; + optionsTreeView->setMinimumHeight(300); + optionsTreeView->setFrameShape(QFrame::NoFrame); + optionsTreeView->setSelectionBehavior(QAbstractItemView::SelectItems); + optionsTreeView->setUniformRowHeights(true); + optionsTreeView->setSortingEnabled(true); + + using namespace Layouting; + + Column { + Form { tr("Parameters"), parametersLineEdit, br, }, + buildDirWidget, + optionsFilterLineEdit, + optionsTreeView, + }.attachTo(details, WithoutMargins); + + Column { + container, + Row { configureButton, wipeButton, } + }.attachTo(this, WithoutMargins); + + Form buildDirWBuilder; buildCfg->buildDirectoryAspect()->addToLayout(buildDirWBuilder); - buildDirWBuilder.attachTo(ui->buildDirWidget); + buildDirWBuilder.attachTo(buildDirWidget, WithoutMargins); - ui->parametersLineEdit->setText(buildCfg->parameters()); - ui->optionsFilterLineEdit->setFiltering(true); + parametersLineEdit->setText(buildCfg->parameters()); + optionsFilterLineEdit->setFiltering(true); - ui->optionsTreeView->sortByColumn(0, Qt::AscendingOrder); + optionsTreeView->sortByColumn(0, Qt::AscendingOrder); QFrame *findWrapper - = Core::ItemViewFind::createSearchableWrapper(ui->optionsTreeView, + = Core::ItemViewFind::createSearchableWrapper(optionsTreeView, Core::ItemViewFind::LightColored); findWrapper->setFrameStyle(QFrame::StyledPanel); m_progressIndicator.attachToWidget(findWrapper); m_progressIndicator.raise(); m_progressIndicator.hide(); - ui->details->layout()->addWidget(findWrapper); + details->layout()->addWidget(findWrapper); m_showProgressTimer.setSingleShot(true); m_showProgressTimer.setInterval(50); // don't show progress for < 50ms tasks connect(&m_showProgressTimer, &QTimer::timeout, [this]() { m_progressIndicator.show(); }); - connect(&m_optionsModel, &BuidOptionsModel::configurationChanged, this, [this]() { - ui->configureButton->setEnabled(true); + connect(&m_optionsModel, &BuidOptionsModel::configurationChanged, this, [configureButton] { + configureButton->setEnabled(true); }); m_optionsFilter.setSourceModel(&m_optionsModel); m_optionsFilter.setSortRole(Qt::DisplayRole); m_optionsFilter.setFilterKeyColumn(-1); - ui->optionsTreeView->setModel(&m_optionsFilter); + optionsTreeView->setModel(&m_optionsFilter); + optionsTreeView->setItemDelegate(new BuildOptionDelegate{optionsTreeView}); - ui->optionsTreeView->setItemDelegate(new BuildOptionDelegate{ui->optionsTreeView}); MesonBuildSystem *bs = static_cast(buildCfg->buildSystem()); - connect(buildCfg->target(), - &ProjectExplorer::Target::parsingFinished, - this, - [this, bs](bool success) { + connect(buildCfg->target(), &ProjectExplorer::Target::parsingFinished, + this, [this, bs, optionsTreeView](bool success) { if (success) { m_optionsModel.setConfiguration(bs->buildOptions()); } else { m_optionsModel.clear(); } - ui->optionsTreeView->expandAll(); - ui->optionsTreeView->resizeColumnToContents(0); - ui->optionsTreeView->setEnabled(true); + optionsTreeView->expandAll(); + optionsTreeView->resizeColumnToContents(0); + optionsTreeView->setEnabled(true); m_showProgressTimer.stop(); m_progressIndicator.hide(); }); - connect(bs, &MesonBuildSystem::parsingStarted, this, [this]() { + connect(bs, &MesonBuildSystem::parsingStarted, this, [this, optionsTreeView] { if (!m_showProgressTimer.isActive()) { - ui->optionsTreeView->setEnabled(false); + optionsTreeView->setEnabled(false); m_showProgressTimer.start(); } }); - connect(&m_optionsModel, &BuidOptionsModel::dataChanged, this, [bs, this]() { + connect(&m_optionsModel, &BuidOptionsModel::dataChanged, this, [bs, this] { bs->setMesonConfigArgs(this->m_optionsModel.changesAsMesonArgs()); }); - connect(&m_optionsFilter, &QAbstractItemModel::modelReset, this, [this]() { - ui->optionsTreeView->expandAll(); - ui->optionsTreeView->resizeColumnToContents(0); + connect(&m_optionsFilter, &QAbstractItemModel::modelReset, this, [optionsTreeView] { + optionsTreeView->expandAll(); + optionsTreeView->resizeColumnToContents(0); }); - connect(ui->optionsFilterLineEdit, - &QLineEdit::textChanged, - &m_optionsFilter, - [this](const QString &txt) { - m_optionsFilter.setFilterRegularExpression( - QRegularExpression(QRegularExpression::escape(txt), - QRegularExpression::CaseInsensitiveOption)); - }); - connect(ui->optionsTreeView, + + connect(optionsFilterLineEdit, &QLineEdit::textChanged, &m_optionsFilter, [this](const QString &txt) { + m_optionsFilter.setFilterRegularExpression( + QRegularExpression(QRegularExpression::escape(txt), + QRegularExpression::CaseInsensitiveOption)); + }); + + connect(optionsTreeView, &Utils::TreeView::activated, - ui->optionsTreeView, - [tree = ui->optionsTreeView](const QModelIndex &idx) { tree->edit(idx); }); - connect(ui->configureButton, &QPushButton::clicked, [bs, this]() { - ui->optionsTreeView->setEnabled(false); - ui->configureButton->setEnabled(false); + optionsTreeView, + [tree = optionsTreeView](const QModelIndex &idx) { tree->edit(idx); }); + + connect(configureButton, &QPushButton::clicked, [this, bs, configureButton, optionsTreeView] { + optionsTreeView->setEnabled(false); + configureButton->setEnabled(false); m_showProgressTimer.start(); bs->configure(); }); - connect(ui->wipeButton, &QPushButton::clicked, [bs, this]() { - ui->optionsTreeView->setEnabled(false); - ui->configureButton->setEnabled(false); + connect(wipeButton, &QPushButton::clicked, [this, bs, configureButton, optionsTreeView] { + optionsTreeView->setEnabled(false); + configureButton->setEnabled(false); m_showProgressTimer.start(); bs->wipe(); }); - connect(ui->parametersLineEdit, &QLineEdit::editingFinished, this, [this, buildCfg] { - buildCfg->setParameters(ui->parametersLineEdit->text()); + connect(parametersLineEdit, &QLineEdit::editingFinished, this, [ buildCfg, parametersLineEdit] { + buildCfg->setParameters(parametersLineEdit->text()); }); bs->triggerParsing(); } -MesonBuildSettingsWidget::~MesonBuildSettingsWidget() -{ - delete ui; -} +MesonBuildSettingsWidget::~MesonBuildSettingsWidget() = default; -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.h b/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.h index 91d2955d0df..52752285350 100644 --- a/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.h +++ b/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.h @@ -12,12 +12,10 @@ #include -namespace MesonProjectManager { -namespace Internal { - -namespace Ui { class MesonBuildSettingsWidget; } +namespace MesonProjectManager::Internal { class MesonBuildConfiguration; + class MesonBuildSettingsWidget : public ProjectExplorer::NamedWidget { Q_OBJECT @@ -27,12 +25,10 @@ public: ~MesonBuildSettingsWidget(); private: - Ui::MesonBuildSettingsWidget *ui; BuidOptionsModel m_optionsModel; Utils::CategorySortFilterModel m_optionsFilter; Utils::ProgressIndicator m_progressIndicator; QTimer m_showProgressTimer; }; -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.ui b/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.ui deleted file mode 100644 index 214101daaae..00000000000 --- a/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.ui +++ /dev/null @@ -1,158 +0,0 @@ - - - MesonProjectManager::Internal::MesonBuildSettingsWidget - - - - 0 - 0 - 400 - 300 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - false - - - - 0 - 0 - - - - Apply Configuration Changes - - - - - - - - 0 - 0 - - - - Wipes build directory and reconfigures using previous command line options. -Useful if build directory is corrupted or when rebuilding with a newer version of Meson. - - - Wipe Project - - - - - - - - - - - - 10 - 20 - 371 - 211 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - Parameters - - - - - - - - - - - - - - - Filter - - - - - - - - 0 - 300 - - - - QFrame::NoFrame - - - QAbstractItemView::SelectItems - - - true - - - true - - - - - - - - - - - - Utils::DetailsWidget - QWidget -
utils/detailswidget.h
- 1 -
- - Utils::FancyLineEdit - QLineEdit -
utils/fancylineedit.h
-
- - Utils::TreeView - QTreeView -
utils/itemviews.h
-
-
- - -
From 392585f76d2e2e0373e4631a9fa76f221e2327d7 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 13:59:53 +0200 Subject: [PATCH 014/104] FakeVim: Replace foreach with ranged for loop Change-Id: I0de9620ebf837be25e153bfd282b6564d4d2b115 Reviewed-by: hjk --- src/plugins/fakevim/fakevimhandler.cpp | 12 ++++++------ src/plugins/fakevim/fakevimplugin.cpp | 19 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index fa52d2aba2c..a280edd32f2 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -1002,7 +1002,7 @@ QDebug operator<<(QDebug ts, const ExCommand &cmd) QDebug operator<<(QDebug ts, const QList &sels) { - foreach (const QTextEdit::ExtraSelection &sel, sels) + for (const QTextEdit::ExtraSelection &sel : sels) ts << "SEL: " << sel.cursor.anchor() << sel.cursor.position(); return ts; } @@ -3049,7 +3049,7 @@ void FakeVimHandler::Private::clearPendingInput() void FakeVimHandler::Private::waitForMapping() { g.currentCommand.clear(); - foreach (const Input &input, g.currentMap.currentInputs()) + for (const Input &input : g.currentMap.currentInputs()) g.currentCommand.append(input.toString()); // wait for user to press any key or trigger complete mapping after interval @@ -6070,13 +6070,13 @@ bool FakeVimHandler::Private::handleExMapCommand(const ExCommand &cmd0) // :map //qDebug() << "MAPPING: " << modes << lhs << rhs; switch (type) { case Unmap: - foreach (char c, modes) + for (char c : qAsConst(modes)) MappingsIterator(&g.mappings, c, key).remove(); break; case Map: Q_FALLTHROUGH(); case Noremap: { - Inputs inputs(rhs, type == Noremap, silent); - foreach (char c, modes) + const Inputs inputs(rhs, type == Noremap, silent); + for (char c : qAsConst(modes)) MappingsIterator(&g.mappings, c).setInputs(key, inputs, unique); break; } @@ -6094,7 +6094,7 @@ bool FakeVimHandler::Private::handleExHistoryCommand(const ExCommand &cmd) QString info; info += "# command history\n"; int i = 0; - foreach (const QString &item, g.commandBuffer.historyItems()) { + for (const QString &item : g.commandBuffer.historyItems()) { ++i; info += QString("%1 %2\n").arg(i, -8).arg(item); } diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 0cb7916b55c..cde11c1c220 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -689,7 +689,8 @@ void FakeVimExCommandsWidget::initialize() { QMap sections; - foreach (Command *c, ActionManager::commands()) { + const QList commands = ActionManager::commands(); + for (Command *c : commands) { if (c->action() && c->action()->isSeparator()) continue; @@ -1881,7 +1882,7 @@ void FakeVimPluginPrivate::documentRenamed( void FakeVimPluginPrivate::renameFileNameInEditors(const FilePath &oldPath, const FilePath &newPath) { - foreach (FakeVimHandler *handler, m_editorToHandler.values()) { + for (FakeVimHandler *handler : m_editorToHandler) { if (handler->currentFileName() == oldPath.toString()) handler->setCurrentFileName(newPath.toString()); } @@ -1902,16 +1903,16 @@ void FakeVimPluginPrivate::setUseFakeVimInternal(bool on) //ICore *core = ICore::instance(); //core->updateAdditionalContexts(Context(FAKEVIM_CONTEXT), // Context()); - foreach (IEditor *editor, m_editorToHandler.keys()) - m_editorToHandler[editor]->setupWidget(); + for (FakeVimHandler *handler : m_editorToHandler) + handler->setupWidget(); } else { //ICore *core = ICore::instance(); //core->updateAdditionalContexts(Context(), // Context(FAKEVIM_CONTEXT)); resetCommandBuffer(); - foreach (IEditor *editor, m_editorToHandler.keys()) { - if (auto textDocument = qobject_cast(editor->document())) - m_editorToHandler[editor]->restoreWidget(textDocument->tabSettings().m_tabSize); + for (auto it = m_editorToHandler.constBegin(); it != m_editorToHandler.constEnd(); ++it) { + if (auto textDocument = qobject_cast(it.key()->document())) + it.value()->restoreWidget(textDocument->tabSettings().m_tabSize); } } } @@ -1919,8 +1920,8 @@ void FakeVimPluginPrivate::setUseFakeVimInternal(bool on) void FakeVimPluginPrivate::setShowRelativeLineNumbers(bool on) { if (on && fakeVimSettings()->useFakeVim.value()) { - foreach (IEditor *editor, m_editorToHandler.keys()) - createRelativeNumberWidget(editor); + for (auto it = m_editorToHandler.constBegin(); it != m_editorToHandler.constEnd(); ++it) + createRelativeNumberWidget(it.key()); } } From c4e6493ff1c3f601b38b3a67993d48e725efb04f Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 13:17:43 +0200 Subject: [PATCH 015/104] RemoteLinux: Replace foreach with ranged for loop Change-Id: Iee251639c20131c8fc2fd2e182b131a9786411c7 Reviewed-by: Reviewed-by: Christian Kandeler --- src/plugins/remotelinux/remotelinuxenvironmentaspect.cpp | 3 ++- src/plugins/remotelinux/tarpackagecreationstep.cpp | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/remotelinux/remotelinuxenvironmentaspect.cpp b/src/plugins/remotelinux/remotelinuxenvironmentaspect.cpp index 886249d2753..207c092458a 100644 --- a/src/plugins/remotelinux/remotelinuxenvironmentaspect.cpp +++ b/src/plugins/remotelinux/remotelinuxenvironmentaspect.cpp @@ -43,7 +43,8 @@ QString RemoteLinuxEnvironmentAspect::userEnvironmentChangesAsString() const { QString env; QString placeHolder = QLatin1String("%1=%2 "); - foreach (const Utils::EnvironmentItem &item, userEnvironmentChanges()) + const Utils::EnvironmentItems items = userEnvironmentChanges(); + for (const Utils::EnvironmentItem &item : items) env.append(placeHolder.arg(item.name, item.value)); return env.mid(0, env.size() - 1); } diff --git a/src/plugins/remotelinux/tarpackagecreationstep.cpp b/src/plugins/remotelinux/tarpackagecreationstep.cpp index 1098896bdc0..ca9c0001a2a 100644 --- a/src/plugins/remotelinux/tarpackagecreationstep.cpp +++ b/src/plugins/remotelinux/tarpackagecreationstep.cpp @@ -379,9 +379,9 @@ bool TarPackageCreationStep::appendFile(QFile &tarFile, const QFileInfo &fileInf return false; } if (fileInfo.isDir()) { - QDir dir(fileInfo.absoluteFilePath()); - foreach (const QString &fileName, - dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)) { + const QDir dir(fileInfo.absoluteFilePath()); + const QStringList files = dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); + for (const QString &fileName : files) { const QString thisLocalFilePath = dir.path() + QLatin1Char('/') + fileName; const QString thisRemoteFilePath = remoteFilePath + QLatin1Char('/') + fileName; if (!appendFile(tarFile, QFileInfo(thisLocalFilePath), thisRemoteFilePath)) From 26d9e6900eceec23049e0c2b8016464f60d4fa1c Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 5 Oct 2022 16:26:45 +0200 Subject: [PATCH 016/104] ProjectExplorer: Don't try to fix remote build paths Change-Id: Ia8a980fcb5154cfbfb412b3d7c4b565e9d200b15 Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/buildaspects.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/projectexplorer/buildaspects.cpp b/src/plugins/projectexplorer/buildaspects.cpp index 5f80e50eabb..02cc62b69e2 100644 --- a/src/plugins/projectexplorer/buildaspects.cpp +++ b/src/plugins/projectexplorer/buildaspects.cpp @@ -113,6 +113,8 @@ void BuildDirectoryAspect::addToLayout(LayoutBuilder &builder) FilePath BuildDirectoryAspect::fixupDir(const FilePath &dir) { + if (dir.needsDevice()) + return dir; if (HostOsInfo::isWindowsHost() && !dir.startsWithDriveLetter()) return {}; const QString dirString = dir.toString().toLower(); From 772d3d7c795dda0cc3b8c9c2ab8db89a37780cec Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 4 Oct 2022 17:44:50 +0200 Subject: [PATCH 017/104] NickNameDialog: Use more FilePath Change-Id: Id7677a636977343ab6cef72ad0267f27981c640a Reviewed-by: Reviewed-by: Orgad Shaneh --- src/plugins/vcsbase/nicknamedialog.cpp | 7 +++---- src/plugins/vcsbase/nicknamedialog.h | 7 +++++-- src/plugins/vcsbase/vcsplugin.cpp | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/plugins/vcsbase/nicknamedialog.cpp b/src/plugins/vcsbase/nicknamedialog.cpp index 1a5a529950c..c0caec23042 100644 --- a/src/plugins/vcsbase/nicknamedialog.cpp +++ b/src/plugins/vcsbase/nicknamedialog.cpp @@ -10,7 +10,6 @@ #include #include -#include #include #include #include @@ -227,7 +226,7 @@ QStandardItemModel *NickNameDialog::createModel(QObject *parent) return model; } -bool NickNameDialog::populateModelFromMailCapFile(const QString &fileName, +bool NickNameDialog::populateModelFromMailCapFile(const FilePath &fileName, QStandardItemModel *model, QString *errorMessage) { @@ -236,7 +235,7 @@ bool NickNameDialog::populateModelFromMailCapFile(const QString &fileName, if (fileName.isEmpty()) return true; FileReader reader; - if (!reader.fetch(FilePath::fromString(fileName), QIODevice::Text, errorMessage)) + if (!reader.fetch(fileName, QIODevice::Text, errorMessage)) return false; // Split into lines and read NickNameEntry entry; @@ -247,7 +246,7 @@ bool NickNameDialog::populateModelFromMailCapFile(const QString &fileName, model->appendRow(entry.toModelRow()); } else { qWarning("%s: Invalid mail cap entry at line %d: '%s'\n", - qPrintable(QDir::toNativeSeparators(fileName)), + qPrintable(fileName.toUserOutput()), i + 1, qPrintable(lines.at(i))); } } diff --git a/src/plugins/vcsbase/nicknamedialog.h b/src/plugins/vcsbase/nicknamedialog.h index 6ca5e0e704e..29c4a85d430 100644 --- a/src/plugins/vcsbase/nicknamedialog.h +++ b/src/plugins/vcsbase/nicknamedialog.h @@ -13,7 +13,10 @@ class QSortFilterProxyModel; class QStandardItemModel; QT_END_NAMESPACE -namespace Utils { class TreeView; } +namespace Utils { +class FilePath; +class TreeView; +} namespace VcsBase::Internal { @@ -29,7 +32,7 @@ public: // Utilities to initialize/populate the model static QStandardItemModel *createModel(QObject *parent); - static bool populateModelFromMailCapFile(const QString &file, + static bool populateModelFromMailCapFile(const Utils::FilePath &file, QStandardItemModel *model, QString *errorMessage); diff --git a/src/plugins/vcsbase/vcsplugin.cpp b/src/plugins/vcsbase/vcsplugin.cpp index 60343d27a8e..29f84088c03 100644 --- a/src/plugins/vcsbase/vcsplugin.cpp +++ b/src/plugins/vcsbase/vcsplugin.cpp @@ -138,7 +138,7 @@ QStandardItemModel *VcsPlugin::nickNameModel() void VcsPlugin::populateNickNameModel() { QString errorMessage; - if (!NickNameDialog::populateModelFromMailCapFile(settings().nickNameMailMap.value(), + if (!NickNameDialog::populateModelFromMailCapFile(settings().nickNameMailMap.filePath(), d->m_nickNameModel, &errorMessage)) { qWarning("%s", qPrintable(errorMessage)); From 3e69ea863f8b6a0e7e43bf7b495f38479c8f9d0e Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 09:48:03 +0200 Subject: [PATCH 018/104] Subversion: Remove FullySynchronously flag from vcsMove() This flag is no-op since NoFullySync isn't passed and we are always running vcsMove() from UI thread, so it will run fullySynchronous anyway. See VcsCommandPrivate::isFullySynchronous() condition. Change-Id: I257cd925c08e7b2406f32889e1086cc36a0473dc Reviewed-by: Reviewed-by: Orgad Shaneh --- src/plugins/subversion/subversionplugin.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 3419e9212ed..d23979f97a3 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -1084,8 +1084,7 @@ bool SubversionPluginPrivate::vcsMove(const FilePath &workingDir, const QString args << SubversionClient::addAuthenticationOptions(m_settings); args << QDir::toNativeSeparators(SubversionClient::escapeFile(from)) << QDir::toNativeSeparators(SubversionClient::escapeFile(to)); - const auto response = runSvn(workingDir, args, - VcsCommand::ShowStdOut | VcsCommand::FullySynchronously); + const auto response = runSvn(workingDir, args, VcsCommand::ShowStdOut); return !response.error; } From f4233a1c223659f9eacb9c658d1c68c771ba364a Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 11:14:41 +0200 Subject: [PATCH 019/104] VcsCommand: Change the default logic for fully sync Remove VcsCommand::FullySynchronous flag. Rename VcsCommand::NoFullySync into UseEventLoop. By default the command will run fully synchronous (i.e. without nested event loop). Only when UseEventLoop is specified, and the command runs in main thread, the nested event loop will be used. This change should preserve the current behavior on all code paths. Change-Id: Id4bbaf68402ceed5e3fcc6f294521e87eb0b8d4d Reviewed-by: Orgad Shaneh --- src/plugins/clearcase/clearcaseplugin.cpp | 49 +++++++++++---------- src/plugins/git/gitclient.cpp | 2 +- src/plugins/subversion/subversionclient.cpp | 2 +- src/plugins/vcsbase/vcscommand.cpp | 14 +++--- src/plugins/vcsbase/vcscommand.h | 8 ++-- 5 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index 3de8dcca259..aac5fc457b5 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -103,9 +103,6 @@ const char CMD_ID_UPDATE_VIEW[] = "ClearCase.UpdateView"; const char CMD_ID_CHECKIN_ALL[] = "ClearCase.CheckInAll"; const char CMD_ID_STATUS[] = "ClearCase.Status"; -const int s_silentRun = VcsCommand::NoOutput | VcsCommand::FullySynchronously; -const int s_verboseRun = VcsCommand::ShowStdOut | VcsCommand::FullySynchronously; - const VcsBaseEditorParameters logEditorParameters { LogOutput, "ClearCase File Log Editor", // id @@ -381,8 +378,8 @@ QStringList ClearCasePluginPrivate::getVobList() const { QStringList args(QLatin1String("lsvob")); args << QLatin1String("-s"); - const CommandResult result = - runCleartool(currentState().topLevel(), args, m_settings.timeOutS, s_silentRun); + const CommandResult result = runCleartool(currentState().topLevel(), args, m_settings.timeOutS, + VcsCommand::NoOutput); return result.cleanedStdOut().split(QLatin1Char('\n'), Qt::SkipEmptyParts); } @@ -504,7 +501,8 @@ FileStatus::Status ClearCasePluginPrivate::getFileStatus(const QString &fileName QString ClearCasePluginPrivate::ccManagesDirectory(const FilePath &directory) const { QStringList args(QLatin1String("pwv")); - const CommandResult result = runCleartool(directory, args, m_settings.timeOutS, s_silentRun); + const CommandResult result = runCleartool(directory, args, m_settings.timeOutS, + VcsCommand::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; @@ -549,10 +547,9 @@ QString ClearCasePluginPrivate::ccViewRoot(const FilePath &directory) const { QStringList args(QLatin1String("pwv")); args << QLatin1String("-root"); - const CommandResult result = runCleartool(directory, args, m_settings.timeOutS, s_silentRun); - + const CommandResult result = runCleartool(directory, args, m_settings.timeOutS, + VcsCommand::NoOutput); QString root = result.cleanedStdOut().trimmed(); - if (root.isEmpty()) { if (HostOsInfo::isWindowsHost()) root = getDriveLetterOfPath(directory.toString()); @@ -825,8 +822,8 @@ QString ClearCasePluginPrivate::ccGetPredecessor(const QString &version) const { QStringList args(QLatin1String("describe")); args << QLatin1String("-fmt") << QLatin1String("%En@@%PSn") << version; - const CommandResult result = - runCleartool(currentState().topLevel(), args, m_settings.timeOutS, s_silentRun); + const CommandResult result = runCleartool(currentState().topLevel(), args, m_settings.timeOutS, + VcsCommand::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess || result.cleanedStdOut().endsWith(QLatin1Char('@'))) {// @@ return {}; @@ -841,8 +838,8 @@ QStringList ClearCasePluginPrivate::ccGetActiveVobs() const QStringList args(QLatin1String("lsvob")); const QString theViewRoot = viewRoot(); - const CommandResult result = - runCleartool(FilePath::fromString(theViewRoot), args, m_settings.timeOutS, s_silentRun); + const CommandResult result = runCleartool(FilePath::fromString(theViewRoot), args, + m_settings.timeOutS, VcsCommand::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; @@ -895,7 +892,7 @@ QString ClearCasePluginPrivate::ccGetFileActivity(const FilePath &workingDir, co QStringList args(QLatin1String("lscheckout")); args << QLatin1String("-fmt") << QLatin1String("%[activity]p"); args << file; - return runCleartool(workingDir, args, m_settings.timeOutS, s_silentRun).cleanedStdOut(); + return runCleartool(workingDir, args, m_settings.timeOutS, VcsCommand::NoOutput).cleanedStdOut(); } ClearCaseSubmitEditor *ClearCasePluginPrivate::openClearCaseSubmitEditor(const FilePath &filePath, bool isUcm) @@ -1110,7 +1107,8 @@ bool ClearCasePluginPrivate::vcsUndoCheckOut(const FilePath &workingDir, const Q args << QLatin1String(keep ? "-keep" : "-rm"); args << QDir::toNativeSeparators(fileName); - const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, s_verboseRun); + const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, + VcsCommand::ShowStdOut); if (result.result() != ProcessResult::FinishedWithSuccess) return false; @@ -1140,7 +1138,8 @@ bool ClearCasePluginPrivate::vcsUndoHijack(const FilePath &workingDir, const QSt args << QLatin1String("/dev/null"); args << QDir::toNativeSeparators(fileName); - const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, s_verboseRun); + const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, + VcsCommand::ShowStdOut); if (result.result() == ProcessResult::FinishedWithSuccess) return false; @@ -1248,7 +1247,8 @@ QStringList ClearCasePluginPrivate::ccGetActivityVersions(const FilePath &workin { QStringList args(QLatin1String("lsactivity")); args << QLatin1String("-fmt") << QLatin1String("%[versions]Cp") << activity; - const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, s_silentRun); + const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, + VcsCommand::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; QStringList versions = result.cleanedStdOut().split(QLatin1String(", ")); @@ -1648,7 +1648,7 @@ void ClearCasePluginPrivate::commitFromEditor() QString ClearCasePluginPrivate::runCleartoolSync(const FilePath &workingDir, const QStringList &arguments) const { - return runCleartool(workingDir, arguments, m_settings.timeOutS, s_silentRun).cleanedStdOut(); + return runCleartool(workingDir, arguments, m_settings.timeOutS, VcsCommand::NoOutput).cleanedStdOut(); } CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir, @@ -1781,7 +1781,7 @@ bool ClearCasePluginPrivate::vcsOpen(const FilePath &workingDir, const QString & } args << file; CommandResult result = runCleartool(topLevel, args, m_settings.timeOutS, - s_verboseRun | VcsCommand::SuppressStdErr); + VcsCommand::ShowStdOut | VcsCommand::SuppressStdErr); if (result.result() != ProcessResult::FinishedWithSuccess) { if (result.cleanedStdErr().contains(QLatin1String("Versions other than the selected version"))) { VersionSelector selector(file, result.cleanedStdErr()); @@ -1790,7 +1790,7 @@ bool ClearCasePluginPrivate::vcsOpen(const FilePath &workingDir, const QString & ccUpdate(workingDir, QStringList(file)); else args.removeOne(QLatin1String("-query")); - result = runCleartool(topLevel, args, m_settings.timeOutS, s_verboseRun); + result = runCleartool(topLevel, args, m_settings.timeOutS, VcsCommand::ShowStdOut); } } else { VcsOutputWindow::append(result.cleanedStdOut()); @@ -1935,7 +1935,7 @@ bool ClearCasePluginPrivate::ccFileOp(const FilePath &workingDir, const QString QStringList args; args << QLatin1String("checkout") << commentArg << dirName; const CommandResult coResult = runCleartool(workingDir, args, m_settings.timeOutS, - s_verboseRun); + VcsCommand::ShowStdOut); if (coResult.result() != ProcessResult::FinishedWithSuccess) { if (coResult.cleanedStdErr().contains(QLatin1String("already checked out"))) noCheckout = true; @@ -1949,7 +1949,7 @@ bool ClearCasePluginPrivate::ccFileOp(const FilePath &workingDir, const QString if (!file2.isEmpty()) args << QDir::toNativeSeparators(file2); const CommandResult opResult = runCleartool(workingDir, args, m_settings.timeOutS, - s_verboseRun); + VcsCommand::ShowStdOut); if (opResult.result() != ProcessResult::FinishedWithSuccess) { // on failure - undo checkout for the directory if (!noCheckout) @@ -1964,7 +1964,7 @@ bool ClearCasePluginPrivate::ccFileOp(const FilePath &workingDir, const QString args.clear(); args << QLatin1String("checkin") << commentArg << dirName; const CommandResult ciResult = runCleartool(workingDir, args, m_settings.timeOutS, - s_verboseRun); + VcsCommand::ShowStdOut); return ciResult.result() == ProcessResult::FinishedWithSuccess; } @@ -2244,7 +2244,8 @@ QString ClearCasePluginPrivate::getFile(const QString &nativeFile, const QString } QStringList args(QLatin1String("get")); args << QLatin1String("-to") << tempFile << nativeFile; - const CommandResult result = runCleartool(m_topLevel, args, m_settings.timeOutS, s_silentRun); + const CommandResult result = runCleartool(m_topLevel, args, m_settings.timeOutS, + VcsCommand::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; QFile::setPermissions(tempFile, QFile::ReadOwner | QFile::ReadUser | diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index d5c3775c93f..88168dc645b 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -2967,7 +2967,7 @@ bool GitClient::addAndCommit(const FilePath &repositoryDirectory, } const CommandResult result = vcsSynchronousExec(repositoryDirectory, arguments, - VcsCommand::NoFullySync); + VcsCommand::UseEventLoop); if (result.result() == ProcessResult::FinishedWithSuccess) { VcsOutputWindow::appendMessage(msgCommitted(amendSHA1, commitCount)); GitPlugin::updateCurrentBranch(); diff --git a/src/plugins/subversion/subversionclient.cpp b/src/plugins/subversion/subversionclient.cpp index 8e614c0430a..ecdddd354db 100644 --- a/src/plugins/subversion/subversionclient.cpp +++ b/src/plugins/subversion/subversionclient.cpp @@ -69,7 +69,7 @@ bool SubversionClient::doCommit(const FilePath &repositoryRoot, << commitMessageFile << escapeFiles(files); const CommandResult result = vcsSynchronousExec(repositoryRoot, args, - VcsCommand::ShowStdOut | VcsCommand::NoFullySync); + VcsCommand::ShowStdOut | VcsCommand::UseEventLoop); return result.result() == ProcessResult::FinishedWithSuccess; } diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index 671da3c263d..82ae1a4d278 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -86,7 +86,7 @@ public: void cleanup(); void setupProcess(QtcProcess *process, const Job &job); void installStdCallbacks(QtcProcess *process); - bool isFullySynchronous() const; + EventLoopMode eventLoopMode() const; void handleDone(QtcProcess *process); void startAll(); void startNextJob(); @@ -214,10 +214,11 @@ void VcsCommandPrivate::installStdCallbacks(QtcProcess *process) // m_process->setTimeOutMessageBoxEnabled(true); } -bool VcsCommandPrivate::isFullySynchronous() const +EventLoopMode VcsCommandPrivate::eventLoopMode() const { - return (m_flags & VcsCommand::FullySynchronously) || (!(m_flags & VcsCommand::NoFullySync) - && QThread::currentThread() == QCoreApplication::instance()->thread()); + if ((m_flags & VcsCommand::UseEventLoop) && QThread::currentThread() == qApp->thread()) + return EventLoopMode::On; + return EventLoopMode::Off; } void VcsCommandPrivate::handleDone(QtcProcess *process) @@ -392,9 +393,8 @@ CommandResult VcsCommand::runCommand(const CommandLine &command, int timeoutS) d->setupProcess(&process, {command, timeoutS, d->m_defaultWorkingDirectory, {}}); - EventLoopMode eventLoopMode = EventLoopMode::Off; - if (!d->isFullySynchronous()) { - eventLoopMode = EventLoopMode::On; + const EventLoopMode eventLoopMode = d->eventLoopMode(); + if (eventLoopMode == EventLoopMode::On) { connect(this, &VcsCommand::terminate, &process, [&process] { process.stop(); process.waitForFinished(); diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h index bd5816874af..552cd1225aa 100644 --- a/src/plugins/vcsbase/vcscommand.h +++ b/src/plugins/vcsbase/vcscommand.h @@ -90,11 +90,9 @@ public: SuppressCommandLogging = 0x10, // No command log entry. ShowSuccessMessage = 0x20, // Show message about successful completion of command. ForceCLocale = 0x40, // Force C-locale for commands whose output is parsed. - FullySynchronously = 0x80, // Suppress local event loop (in case UI actions are - // triggered by file watchers). - SilentOutput = 0x100, // Suppress user notifications about the output happening. - NoFullySync = 0x200, // Avoid fully synchronous execution even in UI thread. - ExpectRepoChanges = 0x400, // Expect changes in repository by the command + SilentOutput = 0x80, // Suppress user notifications about the output happening. + UseEventLoop = 0x100, // Use event loop when executed in UI thread. + ExpectRepoChanges = 0x200, // Expect changes in repository by the command NoOutput = SuppressStdErr | SuppressFailMessage | SuppressCommandLogging }; From 688ec935cd7d495f8c86af84826fe75397ed4fbb Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 11:40:45 +0200 Subject: [PATCH 020/104] VcsCommand: Remove internal terminate() signal This signal was emitted only from cancel() method and used only when runCommand() was called. However, with just 2 public usages of cancel() no-one was used in conjunction with runCommand(). So, this signal is no-op. Change-Id: I2541c6498928d313faafc2fbe47ab609393486d1 Reviewed-by: Orgad Shaneh --- src/plugins/vcsbase/vcscommand.cpp | 10 +--------- src/plugins/vcsbase/vcscommand.h | 2 -- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index 82ae1a4d278..01351f65faf 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -363,11 +363,9 @@ void VcsCommand::cancel() // TODO: we may want to call cancel here... d->m_process->stop(); // TODO: we may want to not wait here... - // However, VcsBaseDiffEditorController::runCommand() relies on getting finished() signal d->m_process->waitForFinished(); d->m_process.reset(); } - emit terminate(); } QString VcsCommand::cleanedStdOut() const @@ -394,13 +392,7 @@ CommandResult VcsCommand::runCommand(const CommandLine &command, int timeoutS) d->setupProcess(&process, {command, timeoutS, d->m_defaultWorkingDirectory, {}}); const EventLoopMode eventLoopMode = d->eventLoopMode(); - if (eventLoopMode == EventLoopMode::On) { - connect(this, &VcsCommand::terminate, &process, [&process] { - process.stop(); - process.waitForFinished(); - }); - process.setTimeOutMessageBoxEnabled(true); - } + process.setTimeOutMessageBoxEnabled(eventLoopMode == EventLoopMode::On); process.runBlocking(eventLoopMode); d->handleDone(&process); diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h index 552cd1225aa..d4e5697624d 100644 --- a/src/plugins/vcsbase/vcscommand.h +++ b/src/plugins/vcsbase/vcscommand.h @@ -125,8 +125,6 @@ signals: void stdErrText(const QString &); void done(); - void terminate(); // Internal - void append(const QString &text); void appendSilently(const QString &text); void appendError(const QString &text); From 7591b2f56d557536731c07edcd45e24a36253265 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 12:38:09 +0200 Subject: [PATCH 021/104] VcsCommand: Make runCommand() a static method And rename it to runBlocking() in order to conform a bit more to QtcProcess API. In case of blocking run there is no need to instantiate VcsCommand on user side. This nicely draw a line between async usages (i.e. when start() is called and we need an instance) and blocking ones (i.e. when runBlocking() is called). Change-Id: I1ba94ee36c92956d5044236cb9e2dd896bf3cfcf Reviewed-by: hjk Reviewed-by: Orgad Shaneh --- src/plugins/clearcase/clearcaseplugin.cpp | 12 ++++-------- src/plugins/vcsbase/vcsbaseclient.cpp | 7 ++----- src/plugins/vcsbase/vcscommand.cpp | 13 ++++++++++++- src/plugins/vcsbase/vcscommand.h | 6 +++++- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index aac5fc457b5..acd54e53690 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -41,7 +41,6 @@ #include #include -#include #include #include #include @@ -258,7 +257,7 @@ private: QString runCleartoolSync(const FilePath &workingDir, const QStringList &arguments) const; CommandResult runCleartool(const FilePath &workingDir, const QStringList &arguments, int timeOutS, unsigned flags = 0, - QTextCodec *outputCodec = nullptr) const; + QTextCodec *codec = nullptr) const; static void sync(QFutureInterface &future, QStringList files); void history(const FilePath &workingDir, @@ -1655,16 +1654,13 @@ CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir, const QStringList &arguments, int timeOutS, unsigned flags, - QTextCodec *outputCodec) const + QTextCodec *codec) const { if (m_settings.ccBinaryPath.isEmpty()) return CommandResult(ProcessResult::StartFailed, Tr::tr("No ClearCase executable specified.")); - std::unique_ptr command; - command.reset(VcsBaseClient::createVcsCommand(workingDir, Environment::systemEnvironment())); - command->addFlags(flags); - command->setCodec(outputCodec); - return command->runCommand({m_settings.ccBinaryPath, arguments}, timeOutS); + return VcsCommand::runBlocking(workingDir, Environment::systemEnvironment(), + {m_settings.ccBinaryPath, arguments}, flags, timeOutS, codec); } IEditor *ClearCasePluginPrivate::showOutputInEditor(const QString& title, const QString &output, diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index a2ea4b9ef89..6c5354a99ef 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -137,11 +137,8 @@ CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir, CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir, const CommandLine &cmdLine, unsigned flags, int timeoutS, QTextCodec *codec) const { - VcsCommand command(workingDir, processEnvironment()); - command.addFlags(flags); - if (codec) - command.setCodec(codec); - return command.runCommand(cmdLine, timeoutS > 0 ? timeoutS : vcsTimeoutS()); + return VcsCommand::runBlocking(workingDir, processEnvironment(), cmdLine, flags, + timeoutS > 0 ? timeoutS : vcsTimeoutS(), codec); } void VcsBaseClientImpl::resetCachedVcsInfo(const FilePath &workingDir) diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index 01351f65faf..813bb865ebe 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -383,7 +383,18 @@ ProcessResult VcsCommand::result() const return d->m_result; } -CommandResult VcsCommand::runCommand(const CommandLine &command, int timeoutS) +CommandResult VcsCommand::runBlocking(const Utils::FilePath &workingDirectory, + const Utils::Environment &environment, + const Utils::CommandLine &command, unsigned flags, + int timeoutS, QTextCodec *codec) +{ + VcsCommand vcsCommand(workingDirectory, environment); + vcsCommand.addFlags(flags); + vcsCommand.setCodec(codec); + return vcsCommand.runBlockingHelper(command, timeoutS); +} + +CommandResult VcsCommand::runBlockingHelper(const CommandLine &command, int timeoutS) { QtcProcess process; if (command.executable().isEmpty()) diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h index d4e5697624d..45ebf117628 100644 --- a/src/plugins/vcsbase/vcscommand.h +++ b/src/plugins/vcsbase/vcscommand.h @@ -113,7 +113,10 @@ public: void setProgressParser(ProgressParser *parser); void setProgressiveOutput(bool progressive); - CommandResult runCommand(const Utils::CommandLine &command, int timeoutS = 10); + static CommandResult runBlocking(const Utils::FilePath &workingDirectory, + const Utils::Environment &environmentconst, + const Utils::CommandLine &command, unsigned flags, + int timeoutS, QTextCodec *codec); void cancel(); QString cleanedStdOut() const; @@ -134,6 +137,7 @@ signals: void runCommandFinished(const Utils::FilePath &workingDirectory); private: + CommandResult runBlockingHelper(const Utils::CommandLine &command, int timeoutS); void postRunCommand(const Utils::FilePath &workingDirectory); class Internal::VcsCommandPrivate *const d; From 4bcdfa6b19ee78cb9f457dfc6f153ae1297240b0 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 16:21:22 +0200 Subject: [PATCH 022/104] ClearCasePlugin: Replace timeout with timeout multiplier Give it default value of 1. Move this arg as the last one (only 2 non-default usages). Change-Id: I8c0bee7988436b899c8ae5cb7b96b7fe534d265f Reviewed-by: Orgad Shaneh --- src/plugins/clearcase/clearcaseplugin.cpp | 75 ++++++++++------------- src/plugins/clearcase/clearcasesettings.h | 2 - 2 files changed, 32 insertions(+), 45 deletions(-) diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index acd54e53690..c2e7376ea95 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -256,8 +256,8 @@ private: const QString &source, QTextCodec *codec) const; QString runCleartoolSync(const FilePath &workingDir, const QStringList &arguments) const; CommandResult runCleartool(const FilePath &workingDir, const QStringList &arguments, - int timeOutS, unsigned flags = 0, - QTextCodec *codec = nullptr) const; + unsigned flags = 0, QTextCodec *codec = nullptr, + int timeoutMultiplier = 1) const; static void sync(QFutureInterface &future, QStringList files); void history(const FilePath &workingDir, @@ -377,7 +377,7 @@ QStringList ClearCasePluginPrivate::getVobList() const { QStringList args(QLatin1String("lsvob")); args << QLatin1String("-s"); - const CommandResult result = runCleartool(currentState().topLevel(), args, m_settings.timeOutS, + const CommandResult result = runCleartool(currentState().topLevel(), args, VcsCommand::NoOutput); return result.cleanedStdOut().split(QLatin1Char('\n'), Qt::SkipEmptyParts); } @@ -500,8 +500,7 @@ FileStatus::Status ClearCasePluginPrivate::getFileStatus(const QString &fileName QString ClearCasePluginPrivate::ccManagesDirectory(const FilePath &directory) const { QStringList args(QLatin1String("pwv")); - const CommandResult result = runCleartool(directory, args, m_settings.timeOutS, - VcsCommand::NoOutput); + const CommandResult result = runCleartool(directory, args, VcsCommand::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; @@ -546,8 +545,7 @@ QString ClearCasePluginPrivate::ccViewRoot(const FilePath &directory) const { QStringList args(QLatin1String("pwv")); args << QLatin1String("-root"); - const CommandResult result = runCleartool(directory, args, m_settings.timeOutS, - VcsCommand::NoOutput); + const CommandResult result = runCleartool(directory, args, VcsCommand::NoOutput); QString root = result.cleanedStdOut().trimmed(); if (root.isEmpty()) { if (HostOsInfo::isWindowsHost()) @@ -821,7 +819,7 @@ QString ClearCasePluginPrivate::ccGetPredecessor(const QString &version) const { QStringList args(QLatin1String("describe")); args << QLatin1String("-fmt") << QLatin1String("%En@@%PSn") << version; - const CommandResult result = runCleartool(currentState().topLevel(), args, m_settings.timeOutS, + const CommandResult result = runCleartool(currentState().topLevel(), args, VcsCommand::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess || result.cleanedStdOut().endsWith(QLatin1Char('@'))) {// @@ @@ -838,7 +836,7 @@ QStringList ClearCasePluginPrivate::ccGetActiveVobs() const const QString theViewRoot = viewRoot(); const CommandResult result = runCleartool(FilePath::fromString(theViewRoot), args, - m_settings.timeOutS, VcsCommand::NoOutput); + VcsCommand::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; @@ -891,7 +889,7 @@ QString ClearCasePluginPrivate::ccGetFileActivity(const FilePath &workingDir, co QStringList args(QLatin1String("lscheckout")); args << QLatin1String("-fmt") << QLatin1String("%[activity]p"); args << file; - return runCleartool(workingDir, args, m_settings.timeOutS, VcsCommand::NoOutput).cleanedStdOut(); + return runCleartool(workingDir, args, VcsCommand::NoOutput).cleanedStdOut(); } ClearCaseSubmitEditor *ClearCasePluginPrivate::openClearCaseSubmitEditor(const FilePath &filePath, bool isUcm) @@ -1075,9 +1073,7 @@ void ClearCasePluginPrivate::undoCheckOutCurrent() args << QLatin1String("-diff_format") << QLatin1String("-predecessor"); args << fileName; - const CommandResult result = - runCleartool(state.currentFileTopLevel(), args, m_settings.timeOutS); - + const CommandResult result = runCleartool(state.currentFileTopLevel(), args); bool keep = false; if (result.exitCode()) { // return value is 1 if there is any difference UndoCheckOutDialog dialog; @@ -1106,8 +1102,7 @@ bool ClearCasePluginPrivate::vcsUndoCheckOut(const FilePath &workingDir, const Q args << QLatin1String(keep ? "-keep" : "-rm"); args << QDir::toNativeSeparators(fileName); - const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, - VcsCommand::ShowStdOut); + const CommandResult result = runCleartool(workingDir, args, VcsCommand::ShowStdOut); if (result.result() != ProcessResult::FinishedWithSuccess) return false; @@ -1137,8 +1132,7 @@ bool ClearCasePluginPrivate::vcsUndoHijack(const FilePath &workingDir, const QSt args << QLatin1String("/dev/null"); args << QDir::toNativeSeparators(fileName); - const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, - VcsCommand::ShowStdOut); + const CommandResult result = runCleartool(workingDir, args, VcsCommand::ShowStdOut); if (result.result() == ProcessResult::FinishedWithSuccess) return false; @@ -1246,8 +1240,7 @@ QStringList ClearCasePluginPrivate::ccGetActivityVersions(const FilePath &workin { QStringList args(QLatin1String("lsactivity")); args << QLatin1String("-fmt") << QLatin1String("%[versions]Cp") << activity; - const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, - VcsCommand::NoOutput); + const CommandResult result = runCleartool(workingDir, args, VcsCommand::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; QStringList versions = result.cleanedStdOut().split(QLatin1String(", ")); @@ -1477,7 +1470,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir, for (const QString &file : files) args.append(QDir::toNativeSeparators(file)); - const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, 0, codec); + const CommandResult result = runCleartool(workingDir, args, 0, codec); if (result.result() != ProcessResult::FinishedWithSuccess) return; @@ -1537,8 +1530,8 @@ void ClearCasePluginPrivate::ccUpdate(const FilePath &workingDir, const QStringL args << QLatin1String("-noverwrite"); if (!relativePaths.isEmpty()) args.append(relativePaths); - const CommandResult result = - runCleartool(workingDir, args, m_settings.longTimeOutS(), VcsCommand::ShowStdOut); + const CommandResult result = runCleartool(workingDir, args, VcsCommand::ShowStdOut, nullptr, + 10); if (result.result() == ProcessResult::FinishedWithSuccess) emit repositoryChanged(workingDir); } @@ -1570,7 +1563,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const args << QLatin1String("-out") << QLatin1String("-"); args.append(QDir::toNativeSeparators(id)); - const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS, 0, codec); + const CommandResult result = runCleartool(workingDir, args, 0, codec); if (result.result() != ProcessResult::FinishedWithSuccess) return; @@ -1619,7 +1612,7 @@ void ClearCasePluginPrivate::vcsDescribe(const FilePath &source, const QString & QStringList args(QLatin1String("describe")); args.push_back(id); QTextCodec *codec = VcsBaseEditor::getCodec(source.toString()); - const CommandResult result = runCleartool(topLevel, args, m_settings.timeOutS, 0, codec); + const CommandResult result = runCleartool(topLevel, args, 0, codec); description = result.cleanedStdOut(); if (m_settings.extDiffAvailable) description += diffExternal(id); @@ -1647,20 +1640,21 @@ void ClearCasePluginPrivate::commitFromEditor() QString ClearCasePluginPrivate::runCleartoolSync(const FilePath &workingDir, const QStringList &arguments) const { - return runCleartool(workingDir, arguments, m_settings.timeOutS, VcsCommand::NoOutput).cleanedStdOut(); + return runCleartool(workingDir, arguments, VcsCommand::NoOutput).cleanedStdOut(); } CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir, const QStringList &arguments, - int timeOutS, unsigned flags, - QTextCodec *codec) const + QTextCodec *codec, + int timeoutMultiplier) const { if (m_settings.ccBinaryPath.isEmpty()) return CommandResult(ProcessResult::StartFailed, Tr::tr("No ClearCase executable specified.")); + const int timeoutS = m_settings.timeOutS * timeoutMultiplier; return VcsCommand::runBlocking(workingDir, Environment::systemEnvironment(), - {m_settings.ccBinaryPath, arguments}, flags, timeOutS, codec); + {m_settings.ccBinaryPath, arguments}, flags, timeoutS, codec); } IEditor *ClearCasePluginPrivate::showOutputInEditor(const QString& title, const QString &output, @@ -1776,7 +1770,7 @@ bool ClearCasePluginPrivate::vcsOpen(const FilePath &workingDir, const QString & vcsUndoHijack(topLevel, relFile, false); // don't keep, we've already kept a copy } args << file; - CommandResult result = runCleartool(topLevel, args, m_settings.timeOutS, + CommandResult result = runCleartool(topLevel, args, VcsCommand::ShowStdOut | VcsCommand::SuppressStdErr); if (result.result() != ProcessResult::FinishedWithSuccess) { if (result.cleanedStdErr().contains(QLatin1String("Versions other than the selected version"))) { @@ -1786,7 +1780,7 @@ bool ClearCasePluginPrivate::vcsOpen(const FilePath &workingDir, const QString & ccUpdate(workingDir, QStringList(file)); else args.removeOne(QLatin1String("-query")); - result = runCleartool(topLevel, args, m_settings.timeOutS, VcsCommand::ShowStdOut); + result = runCleartool(topLevel, args, VcsCommand::ShowStdOut); } } else { VcsOutputWindow::append(result.cleanedStdOut()); @@ -1815,8 +1809,7 @@ bool ClearCasePluginPrivate::vcsSetActivity(const FilePath &workingDir, const QS { QStringList args; args << QLatin1String("setactivity") << activity; - const CommandResult result = - runCleartool(workingDir, args, m_settings.timeOutS, VcsCommand::ShowStdOut); + const CommandResult result = runCleartool(workingDir, args, VcsCommand::ShowStdOut); if (result.result() != ProcessResult::FinishedWithSuccess) { QMessageBox::warning(ICore::dialogParent(), title, Tr::tr("Set current activity failed: %1") .arg(result.exitMessage()), QMessageBox::Ok); @@ -1862,8 +1855,8 @@ bool ClearCasePluginPrivate::vcsCheckIn(const FilePath &messageFile, const QStri FilePath::fromString(QFileInfo(m_checkInView.toString(), fileName).canonicalFilePath()))); blockers.append(fcb); } - const CommandResult result = - runCleartool(m_checkInView, args, m_settings.longTimeOutS(), VcsCommand::ShowStdOut); + const CommandResult result = runCleartool(m_checkInView, args, VcsCommand::ShowStdOut, nullptr, + 10); const QRegularExpression checkedIn("Checked in \\\"([^\"]*)\\\""); QRegularExpressionMatch match = checkedIn.match(result.cleanedStdOut()); bool anySucceeded = false; @@ -1930,8 +1923,7 @@ bool ClearCasePluginPrivate::ccFileOp(const FilePath &workingDir, const QString // check out directory QStringList args; args << QLatin1String("checkout") << commentArg << dirName; - const CommandResult coResult = runCleartool(workingDir, args, m_settings.timeOutS, - VcsCommand::ShowStdOut); + const CommandResult coResult = runCleartool(workingDir, args, VcsCommand::ShowStdOut); if (coResult.result() != ProcessResult::FinishedWithSuccess) { if (coResult.cleanedStdErr().contains(QLatin1String("already checked out"))) noCheckout = true; @@ -1944,8 +1936,7 @@ bool ClearCasePluginPrivate::ccFileOp(const FilePath &workingDir, const QString args << opArgs << commentArg << file; if (!file2.isEmpty()) args << QDir::toNativeSeparators(file2); - const CommandResult opResult = runCleartool(workingDir, args, m_settings.timeOutS, - VcsCommand::ShowStdOut); + const CommandResult opResult = runCleartool(workingDir, args, VcsCommand::ShowStdOut); if (opResult.result() != ProcessResult::FinishedWithSuccess) { // on failure - undo checkout for the directory if (!noCheckout) @@ -1959,8 +1950,7 @@ bool ClearCasePluginPrivate::ccFileOp(const FilePath &workingDir, const QString // check in the directory args.clear(); args << QLatin1String("checkin") << commentArg << dirName; - const CommandResult ciResult = runCleartool(workingDir, args, m_settings.timeOutS, - VcsCommand::ShowStdOut); + const CommandResult ciResult = runCleartool(workingDir, args, VcsCommand::ShowStdOut); return ciResult.result() == ProcessResult::FinishedWithSuccess; } @@ -2096,7 +2086,7 @@ bool ClearCasePluginPrivate::newActivity() args << QLatin1String("-headline") << headline; } - const CommandResult result = runCleartool(workingDir, args, m_settings.timeOutS); + const CommandResult result = runCleartool(workingDir, args); if (result.result() != ProcessResult::FinishedWithSuccess) return false; @@ -2240,8 +2230,7 @@ QString ClearCasePluginPrivate::getFile(const QString &nativeFile, const QString } QStringList args(QLatin1String("get")); args << QLatin1String("-to") << tempFile << nativeFile; - const CommandResult result = runCleartool(m_topLevel, args, m_settings.timeOutS, - VcsCommand::NoOutput); + const CommandResult result = runCleartool(m_topLevel, args, VcsCommand::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; QFile::setPermissions(tempFile, QFile::ReadOwner | QFile::ReadUser | diff --git a/src/plugins/clearcase/clearcasesettings.h b/src/plugins/clearcase/clearcasesettings.h index b8a050b25ca..ef584fda557 100644 --- a/src/plugins/clearcase/clearcasesettings.h +++ b/src/plugins/clearcase/clearcasesettings.h @@ -28,8 +28,6 @@ public: void fromSettings(QSettings *); void toSettings(QSettings *) const; - inline int longTimeOutS() const { return timeOutS * 10; } - bool equals(const ClearCaseSettings &s) const; friend bool operator==(const ClearCaseSettings &p1, const ClearCaseSettings &p2) From 0b7ee3220266388dbd3ce80673ec6c8b6f64e06e Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 16:59:07 +0200 Subject: [PATCH 023/104] ClearCasePlugin: Introduce runCleartoolProc Don't use VcsCommand when the only passed flag is NoOutput as in this case VcsCommand is the same as QtcProcess. Add runCleartoolProc and implement it using QtcProcess. Use it whenever NoOutput has been passed to runCommand. Some codepath, like runCleartoolSync() or ccGetActiveVobs() has been called from non-GUI thread - be on the safe side and use QtcProcess in these cases. Change-Id: I2d29947393bd43af193a53e3f8e89e1b6b4b86fa Reviewed-by: Orgad Shaneh --- src/plugins/clearcase/clearcaseplugin.cpp | 57 ++++++++++++----------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index c2e7376ea95..eccdead5546 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -255,6 +255,8 @@ private: IEditor *showOutputInEditor(const QString& title, const QString &output, Id id, const QString &source, QTextCodec *codec) const; QString runCleartoolSync(const FilePath &workingDir, const QStringList &arguments) const; + CommandResult runCleartoolProc(const FilePath &workingDir, + const QStringList &arguments) const; CommandResult runCleartool(const FilePath &workingDir, const QStringList &arguments, unsigned flags = 0, QTextCodec *codec = nullptr, int timeoutMultiplier = 1) const; @@ -375,10 +377,7 @@ bool ClearCasePluginPrivate::isCheckInEditorOpen() const /// Files in this directories are under ClearCase control QStringList ClearCasePluginPrivate::getVobList() const { - QStringList args(QLatin1String("lsvob")); - args << QLatin1String("-s"); - const CommandResult result = runCleartool(currentState().topLevel(), args, - VcsCommand::NoOutput); + const CommandResult result = runCleartoolProc(currentState().topLevel(), {"lsvob", "-s"}); return result.cleanedStdOut().split(QLatin1Char('\n'), Qt::SkipEmptyParts); } @@ -499,8 +498,7 @@ FileStatus::Status ClearCasePluginPrivate::getFileStatus(const QString &fileName /// \returns The ClearCase topLevel/VOB directory for this directory QString ClearCasePluginPrivate::ccManagesDirectory(const FilePath &directory) const { - QStringList args(QLatin1String("pwv")); - const CommandResult result = runCleartool(directory, args, VcsCommand::NoOutput); + const CommandResult result = runCleartoolProc(directory, {"pwv"}); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; @@ -543,9 +541,7 @@ QString ClearCasePluginPrivate::ccManagesDirectory(const FilePath &directory) co /// Find the root path of a clearcase view. Precondition: This is a clearcase managed dir QString ClearCasePluginPrivate::ccViewRoot(const FilePath &directory) const { - QStringList args(QLatin1String("pwv")); - args << QLatin1String("-root"); - const CommandResult result = runCleartool(directory, args, VcsCommand::NoOutput); + const CommandResult result = runCleartoolProc(directory, {"pwv", "-root"}); QString root = result.cleanedStdOut().trimmed(); if (root.isEmpty()) { if (HostOsInfo::isWindowsHost()) @@ -817,10 +813,8 @@ static void setWorkingDirectory(IEditor *editor, const FilePath &wd) //! retrieve full location of predecessor of \a version QString ClearCasePluginPrivate::ccGetPredecessor(const QString &version) const { - QStringList args(QLatin1String("describe")); - args << QLatin1String("-fmt") << QLatin1String("%En@@%PSn") << version; - const CommandResult result = runCleartool(currentState().topLevel(), args, - VcsCommand::NoOutput); + const CommandResult result = runCleartoolProc(currentState().topLevel(), + {"describe", "-fmt", "%En@@%PSn", version}); if (result.result() != ProcessResult::FinishedWithSuccess || result.cleanedStdOut().endsWith(QLatin1Char('@'))) {// @@ return {}; @@ -832,11 +826,9 @@ QString ClearCasePluginPrivate::ccGetPredecessor(const QString &version) const //! Paths are relative to viewRoot QStringList ClearCasePluginPrivate::ccGetActiveVobs() const { - QStringList args(QLatin1String("lsvob")); const QString theViewRoot = viewRoot(); - const CommandResult result = runCleartool(FilePath::fromString(theViewRoot), args, - VcsCommand::NoOutput); + const CommandResult result = runCleartoolProc(FilePath::fromString(theViewRoot), {"lsvob"}); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; @@ -886,10 +878,7 @@ FileStatus ClearCasePluginPrivate::vcsStatus(const QString &file) const QString ClearCasePluginPrivate::ccGetFileActivity(const FilePath &workingDir, const QString &file) { - QStringList args(QLatin1String("lscheckout")); - args << QLatin1String("-fmt") << QLatin1String("%[activity]p"); - args << file; - return runCleartool(workingDir, args, VcsCommand::NoOutput).cleanedStdOut(); + return runCleartoolProc(workingDir, {"lscheckout", "-fmt", "%[activity]p", file}).cleanedStdOut(); } ClearCaseSubmitEditor *ClearCasePluginPrivate::openClearCaseSubmitEditor(const FilePath &filePath, bool isUcm) @@ -1238,9 +1227,8 @@ void ClearCasePluginPrivate::ccDiffWithPred(const FilePath &workingDir, const QS QStringList ClearCasePluginPrivate::ccGetActivityVersions(const FilePath &workingDir, const QString &activity) { - QStringList args(QLatin1String("lsactivity")); - args << QLatin1String("-fmt") << QLatin1String("%[versions]Cp") << activity; - const CommandResult result = runCleartool(workingDir, args, VcsCommand::NoOutput); + const CommandResult result = runCleartoolProc(workingDir, {"lsactivity", "-fmt", + "%[versions]Cp", activity}); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; QStringList versions = result.cleanedStdOut().split(QLatin1String(", ")); @@ -1640,7 +1628,24 @@ void ClearCasePluginPrivate::commitFromEditor() QString ClearCasePluginPrivate::runCleartoolSync(const FilePath &workingDir, const QStringList &arguments) const { - return runCleartool(workingDir, arguments, VcsCommand::NoOutput).cleanedStdOut(); + return runCleartoolProc(workingDir, arguments).cleanedStdOut(); +} + +CommandResult ClearCasePluginPrivate::runCleartoolProc(const FilePath &workingDir, + const QStringList &arguments) const +{ + if (m_settings.ccBinaryPath.isEmpty()) + return CommandResult(ProcessResult::StartFailed, Tr::tr("No ClearCase executable specified.")); + + QtcProcess process; + Environment env = Environment::systemEnvironment(); + VcsBase::setProcessEnvironment(&env); + process.setEnvironment(env); + process.setCommand({m_settings.ccBinaryPath, arguments}); + process.setWorkingDirectory(workingDir); + process.setTimeoutS(m_settings.timeOutS); + process.runBlocking(); + return CommandResult(&process); } CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir, @@ -2228,9 +2233,7 @@ QString ClearCasePluginPrivate::getFile(const QString &nativeFile, const QString bool res = QFile::copy(QDir(m_topLevel.toString()).absoluteFilePath(file), tempFile); return res ? tempFile : QString(); } - QStringList args(QLatin1String("get")); - args << QLatin1String("-to") << tempFile << nativeFile; - const CommandResult result = runCleartool(m_topLevel, args, VcsCommand::NoOutput); + const CommandResult result = runCleartoolProc(m_topLevel, {"get", "-to", tempFile, nativeFile}); if (result.result() != ProcessResult::FinishedWithSuccess) return {}; QFile::setPermissions(tempFile, QFile::ReadOwner | QFile::ReadUser | From 6644927c4eb9b1acbcd3b17186fec2b6f9ac23cf Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 17:22:09 +0200 Subject: [PATCH 024/104] ClearCasePlugin: Remove runCleartoolSync() Replace it with runCleartoolProc(). Change-Id: I04172aa1506cbe20e9c8d870b697b899cfcca7bf Reviewed-by: Orgad Shaneh --- src/plugins/clearcase/clearcaseplugin.cpp | 59 +++++++---------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index eccdead5546..b4030c63a51 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -254,7 +254,6 @@ private: QString findTopLevel(const FilePath &directory) const; IEditor *showOutputInEditor(const QString& title, const QString &output, Id id, const QString &source, QTextCodec *codec) const; - QString runCleartoolSync(const FilePath &workingDir, const QStringList &arguments) const; CommandResult runCleartoolProc(const FilePath &workingDir, const QStringList &arguments) const; CommandResult runCleartool(const FilePath &workingDir, const QStringList &arguments, @@ -428,12 +427,8 @@ FileStatus::Status ClearCasePluginPrivate::getFileStatus(const QString &fileName QTC_CHECK(!fileName.isEmpty()); const QDir viewRootDir = QFileInfo(fileName).dir(); - const QString viewRoot = viewRootDir.path(); - - QStringList args(QLatin1String("ls")); - args << fileName; - QString buffer = runCleartoolSync(FilePath::fromString(viewRoot), args); - + const QString buffer = runCleartoolProc(FilePath::fromString(viewRootDir.path()), + {"ls", fileName}).cleanedStdOut(); const int atatpos = buffer.indexOf(QLatin1String("@@")); if (atatpos != -1) { // probably a managed file const QString absFile = @@ -1142,8 +1137,8 @@ void ClearCasePluginPrivate::undoHijackCurrent() bool keep = false; bool askKeep = true; if (m_settings.extDiffAvailable) { - QString diffres = diffExternal(ccGetFileVersion(state.topLevel(), fileName), fileName); - if (diffres.at(0) == QLatin1Char('F')) // Files are identical + const QString result = diffExternal(ccGetFileVersion(state.topLevel(), fileName), fileName); + if (!result.isEmpty() && result.front() == QLatin1Char('F')) // Files are identical askKeep = false; } if (askKeep) { @@ -1165,9 +1160,7 @@ void ClearCasePluginPrivate::undoHijackCurrent() QString ClearCasePluginPrivate::ccGetFileVersion(const FilePath &workingDir, const QString &file) const { - QStringList args(QLatin1String("ls")); - args << QLatin1String("-short") << file; - return runCleartoolSync(workingDir, args).trimmed(); + return runCleartoolProc(workingDir, {"ls", "-short", file}).cleanedStdOut().trimmed(); } void ClearCasePluginPrivate::ccDiffWithPred(const FilePath &workingDir, const QStringList &files) @@ -1625,12 +1618,6 @@ void ClearCasePluginPrivate::commitFromEditor() EditorManager::closeDocuments({submitEditor()->document()}); } -QString ClearCasePluginPrivate::runCleartoolSync(const FilePath &workingDir, - const QStringList &arguments) const -{ - return runCleartoolProc(workingDir, arguments).cleanedStdOut(); -} - CommandResult ClearCasePluginPrivate::runCleartoolProc(const FilePath &workingDir, const QStringList &arguments) const { @@ -2007,10 +1994,8 @@ bool ClearCasePluginPrivate::managesDirectory(const FilePath &directory, FilePat QString ClearCasePluginPrivate::ccGetCurrentActivity() const { - QStringList args(QLatin1String("lsactivity")); - args << QLatin1String("-cact"); - args << QLatin1String("-fmt") << QLatin1String("%n"); - return runCleartoolSync(currentState().topLevel(), args); + return runCleartoolProc(currentState().topLevel(), {"lsactivity", "-cact", "-fmt", "%n"}) + .cleanedStdOut(); } QList ClearCasePluginPrivate::ccGetActivities() const @@ -2020,9 +2005,8 @@ QList ClearCasePluginPrivate::ccGetActivities() const QStringPair rebaseAct; QStringPair deliverAct; // Retrieve all activities - QStringList args(QLatin1String("lsactivity")); - args << QLatin1String("-fmt") << QLatin1String("%n\\t%[headline]p\\n"); - const QString response = runCleartoolSync(currentState().topLevel(), args); + const QString response = runCleartoolProc(currentState().topLevel(), + {"lsactivity", "-fmt", "%n\\t%[headline]p\\n"}).cleanedStdOut(); const QStringList acts = response.split(QLatin1Char('\n'), Qt::SkipEmptyParts); for (const QString &activity : acts) { QStringList act = activity.split(QLatin1Char('\t')); @@ -2102,10 +2086,8 @@ bool ClearCasePluginPrivate::newActivity() // check if the view is UCM bool ClearCasePluginPrivate::ccCheckUcm(const QString &viewname, const FilePath &workingDir) const { - QStringList catcsArgs(QLatin1String("catcs")); - catcsArgs << QLatin1String("-tag") << viewname; - QString catcsData = runCleartoolSync(workingDir, catcsArgs); - + const QString catcsData = runCleartoolProc(workingDir, + {"catcs", "-tag", viewname}).cleanedStdOut(); // check output for the word "ucm" return catcsData.indexOf(QRegularExpression("(^|\\n)ucm\\n")) != -1; } @@ -2124,9 +2106,7 @@ ViewData ClearCasePluginPrivate::ccGetView(const FilePath &workingDir) const bool inCache = viewCache.contains(workingDir); ViewData &res = viewCache[workingDir]; if (!inCache) { - QStringList args(QLatin1String("lsview")); - args << QLatin1String("-cview"); - QString data = runCleartoolSync(workingDir, args); + const QString data = runCleartoolProc(workingDir, {"lsview", "-cview"}).cleanedStdOut(); res.isDynamic = !data.isEmpty() && (data.at(0) == QLatin1Char('*')); res.name = data.mid(2, data.indexOf(QLatin1Char(' '), 2) - 2); res.isUcm = ccCheckUcm(res.name, workingDir); @@ -2138,20 +2118,17 @@ ViewData ClearCasePluginPrivate::ccGetView(const FilePath &workingDir) const QString ClearCasePluginPrivate::ccGetComment(const FilePath &workingDir, const QString &fileName) const { - QStringList args(QLatin1String("describe")); - args << QLatin1String("-fmt") << QLatin1String("%c") << fileName; - return runCleartoolSync(workingDir, args); + return runCleartoolProc(workingDir, {"describe", "-fmt", "%c", fileName}).cleanedStdOut(); } void ClearCasePluginPrivate::updateStreamAndView() { - QStringList args(QLatin1String("lsstream")); - args << QLatin1String("-fmt") << QLatin1String("%n\\t%[def_deliver_tgt]Xp"); - const QString sresponse = runCleartoolSync(m_topLevel, args); - int tabPos = sresponse.indexOf(QLatin1Char('\t')); - m_stream = sresponse.left(tabPos); + const QString result = runCleartoolProc(m_topLevel, + {"lsstream", "-fmt", "%n\\t%[def_deliver_tgt]Xp"}).cleanedStdOut(); + const int tabPos = result.indexOf(QLatin1Char('\t')); + m_stream = result.left(tabPos); const QRegularExpression intStreamExp("stream:([^@]*)"); - const QRegularExpressionMatch match = intStreamExp.match(sresponse.mid(tabPos + 1)); + const QRegularExpressionMatch match = intStreamExp.match(result.mid(tabPos + 1)); if (match.hasMatch()) m_intStream = match.captured(1); m_viewData = ccGetView(m_topLevel); From ab7a472b946cc84e6f4695dd6fb78b3b5a0377be Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 30 Sep 2022 15:01:58 +0200 Subject: [PATCH 025/104] CMakePM: update CMakePresets macro replacement function Moved to a handcrafted function instead of using regex. This way the Visual C++ Ninja only preset can be processed. Change-Id: I9b303ee1765db05544d81db7d3b8d9e5223f5f42 Reviewed-by: Reviewed-by: Alessandro Portale --- .../cmakeprojectmanager/presetsmacros.cpp | 91 ++++++++++++------- tests/manual/cmakepresets/CMakePresets.json | 32 +++++++ tests/manual/cmakepresets/mainwindow.ui | 32 ++++++- 3 files changed, 122 insertions(+), 33 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/presetsmacros.cpp b/src/plugins/cmakeprojectmanager/presetsmacros.cpp index 37ef043c12e..2623a0cfed1 100644 --- a/src/plugins/cmakeprojectmanager/presetsmacros.cpp +++ b/src/plugins/cmakeprojectmanager/presetsmacros.cpp @@ -8,8 +8,6 @@ #include #include -#include - namespace CMakeProjectManager::Internal::CMakePresets::Macros { QString getHostSystemName() @@ -61,6 +59,48 @@ void expandAllButEnv(const PresetsDetails::BuildPreset &preset, value.replace("${presetName}", preset.name); } +QString expandMacroEnv(const QString ¯oPrefix, + const QString &value, + const std::function &op) +{ + const QString startToken = QString("$%1{").arg(macroPrefix); + const QString endToken = QString("}"); + + auto findMacro = [startToken, + endToken](const QString &str, qsizetype *pos, QString *ret) -> qsizetype { + forever { + qsizetype openPos = str.indexOf(startToken, *pos); + if (openPos < 0) + return 0; + + qsizetype varPos = openPos + startToken.length(); + qsizetype endPos = str.indexOf(endToken, varPos + 1); + if (endPos < 0) + return 0; + + *ret = str.mid(varPos, endPos - varPos); + *pos = openPos; + + return endPos - openPos + endToken.length(); + } + }; + + QString result = value; + QString macroName; + + bool done = true; + do { + done = true; + for (qsizetype pos = 0; int len = findMacro(result, &pos, ¯oName);) { + result.replace(pos, len, op(macroName)); + pos += macroName.length(); + done = false; + } + } while (!done); + + return result; +} + template void expand(const PresetType &preset, Utils::Environment &env, @@ -73,14 +113,9 @@ void expand(const PresetType &preset, QString value = it->second; expandAllButEnv(preset, sourceDirectory, value); - - QRegularExpression envRegex(R"((\$env\{(\w+)\}))"); - for (const QRegularExpressionMatch &match : envRegex.globalMatch(value)) { - if (match.captured(2) != key) - value.replace(match.captured(1), presetEnv.value(match.captured(2))); - else - value.replace(match.captured(1), ""); - } + value = expandMacroEnv("env", value, [presetEnv](const QString ¯oName) { + return presetEnv.value(macroName); + }); QString sep; bool append = true; @@ -92,9 +127,9 @@ void expand(const PresetType &preset, value.replace("$penv{PATH}", "", Qt::CaseInsensitive); } - QRegularExpression penvRegex(R"((\$penv\{(\w+)\}))"); - for (const QRegularExpressionMatch &match : penvRegex.globalMatch(value)) - value.replace(match.captured(1), env.value(match.captured(2))); + value = expandMacroEnv("penv", value, [env](const QString ¯oName) { + return env.value(macroName); + }); if (append) env.appendOrSet(key, value, sep); @@ -116,14 +151,9 @@ void expand(const PresetType &preset, QString value = it->second; expandAllButEnv(preset, sourceDirectory, value); - - QRegularExpression envRegex(R"((\$env\{(\w+)\}))"); - for (const QRegularExpressionMatch &match : envRegex.globalMatch(value)) { - if (match.captured(2) != key) - value.replace(match.captured(1), presetEnv.value(match.captured(2))); - else - value.replace(match.captured(1), ""); - } + value = expandMacroEnv("env", value, [presetEnv](const QString ¯oName) { + return presetEnv.value(macroName); + }); auto operation = Utils::EnvironmentItem::Operation::SetEnabled; if (key.compare("PATH", Qt::CaseInsensitive) == 0) { @@ -134,9 +164,9 @@ void expand(const PresetType &preset, value.replace("$penv{PATH}", "", Qt::CaseInsensitive); } - QRegularExpression penvRegex(R"((\$penv\{(\w+)\}))"); - for (const QRegularExpressionMatch &match : penvRegex.globalMatch(value)) - value.replace(match.captured(1), QString("${%1}").arg(match.captured(2))); + value = expandMacroEnv("penv", value, [](const QString ¯oName) { + return QString("${%1}").arg(macroName); + }); envItems.emplace_back(Utils::EnvironmentItem(key, value, operation)); } @@ -153,13 +183,13 @@ void expand(const PresetType &preset, const QHash presetEnv = preset.environment ? preset.environment.value() : QHash(); - QRegularExpression envRegex(R"((\$env\{(\w+)\}))"); - for (const QRegularExpressionMatch &match : envRegex.globalMatch(value)) - value.replace(match.captured(1), presetEnv.value(match.captured(2))); + value = expandMacroEnv("env", value, [presetEnv](const QString ¯oName) { + return presetEnv.value(macroName); + }); - QRegularExpression penvRegex(R"((\$penv\{(\w+)\}))"); - for (const QRegularExpressionMatch &match : penvRegex.globalMatch(value)) - value.replace(match.captured(1), env.value(match.captured(2))); + value = expandMacroEnv("penv", value, [env](const QString ¯oName) { + return env.value(macroName); + }); } void updateToolchainFile( @@ -261,7 +291,6 @@ bool evaluatePresetCondition(const PresetType &preset, const Utils::FilePath &so return condition.evaluate(); } - // Expand for PresetsDetails::ConfigurePreset template void expand(const PresetsDetails::ConfigurePreset &preset, Utils::Environment &env, diff --git a/tests/manual/cmakepresets/CMakePresets.json b/tests/manual/cmakepresets/CMakePresets.json index 64e5a6bc965..5e9d149b8bb 100644 --- a/tests/manual/cmakepresets/CMakePresets.json +++ b/tests/manual/cmakepresets/CMakePresets.json @@ -54,6 +54,34 @@ "HOST_SYSTEM_NAME": "Windows" } }, + { + "name": "visualc-ninja", + "displayName": "Visual C++ 2019 x64 Ninja", + "generator": "Ninja", + "binaryDir": "${sourceDir}/build-${presetName}", + "toolchainFile" : "c:/Qt/6.3.2/msvc2019_64/lib/cmake/Qt6/qt.toolchain.cmake", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Windows" + }, + "environment" : { + "VCToolsVersion": "14.29.30133", + "WindowsSDKVersion" : "10.0.22000.0", + "VCArch": "x64", + "VCToolsInstallDir": "$penv{ProgramFiles(x86)}/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/$env{VCToolsVersion}", + "WindowsSdkDir" : "$penv{ProgramFiles(x86)}/Windows Kits/10", + "WindowsSdkIncVerDir": "$env{WindowsSdkDir}/Include/$env{WindowsSDKVersion}", + "WindowsSdkLibVerDir": "$env{WindowsSdkDir}/Lib/$env{WindowsSDKVersion}", + + "INCLUDE": "$env{VCToolsInstallDir}/ATLMFC/include;$env{VCToolsInstallDir}/include;$env{WindowsSdkIncVerDir}/ucrt;$env{WindowsSdkIncVerDir}/shared;$env{WindowsSdkIncVerDir}/um;$env{WindowsSdkIncVerDir}/winrt;$env{WindowsSdkIncVerDir}/cppwinrt", + "LIB": "$env{VCToolsInstallDir}/ATLMFC/lib/$env{VCArch};$env{VCToolsInstallDir}/lib/$env{VCArch};$env{WindowsSdkLibVerDir}/ucrt/$env{VCArch};$env{WindowsSdkLibVerDir}/um/$env{VCArch}", + "PATH": "$env{VCToolsInstallDir}/bin/HostX64/$env{VCArch};$env{WindowsSdkDir}/bin/$env{WindowsSDKVersion}/$env{VCArch};$penv{PATH}" + } + }, { "name": "linux-gcc", "displayName": "Linux GCC", @@ -95,6 +123,10 @@ "name": "visualc-relwithdebinfo", "inherits": "visualc-debug", "configuration": "RelWithDebInfo" + }, + { + "name": "visualc-ninja", + "configurePreset": "visualc-ninja" } ] } diff --git a/tests/manual/cmakepresets/mainwindow.ui b/tests/manual/cmakepresets/mainwindow.ui index b232854ba81..a736849d4e7 100644 --- a/tests/manual/cmakepresets/mainwindow.ui +++ b/tests/manual/cmakepresets/mainwindow.ui @@ -13,8 +13,36 @@ MainWindow - - + + + + + 140 + 200 + 441 + 81 + + + + + 22 + + + + CMakePresets are cool! + + + + + + + 0 + 0 + 800 + 22 + + + From 64db0009d551fa7147974c36502686605dacf3f7 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 4 Oct 2022 15:13:46 +0200 Subject: [PATCH 026/104] VcsManager: Use more FilePath Change-Id: I255372c47e6d3ea55e5f8060c3c2fdd9bd155c75 Reviewed-by: Orgad Shaneh --- src/plugins/coreplugin/vcsmanager.cpp | 45 +++++++++++++------------ src/plugins/coreplugin/vcsmanager.h | 2 +- src/plugins/git/gerrit/gerritplugin.cpp | 25 ++++++-------- src/plugins/git/gerrit/gerritplugin.h | 2 +- 4 files changed, 36 insertions(+), 38 deletions(-) diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index de63fd0c4e2..b64e84927ce 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -45,7 +45,7 @@ public: class VcsInfo { public: IVersionControl *versionControl = nullptr; - QString topLevel; + FilePath topLevel; }; std::optional findInCache(const QString &dir) const @@ -77,18 +77,19 @@ public: } } - void cache(IVersionControl *vc, const QString &topLevel, const QString &dir) + void cache(IVersionControl *vc, const FilePath &topLevel, const QString &dir) { QTC_ASSERT(QDir(dir).isAbsolute(), return); QTC_ASSERT(!dir.endsWith(QLatin1Char('/')), return); QTC_ASSERT(QDir::fromNativeSeparators(dir) == dir, return); - QTC_ASSERT(dir.startsWith(topLevel + QLatin1Char('/')) - || topLevel == dir || topLevel.isEmpty(), return); + const QString topLevelString = topLevel.toString(); + QTC_ASSERT(FilePath::fromString(dir).isChildOf(topLevel) + || topLevelString == dir || topLevel.isEmpty(), return); QTC_ASSERT((topLevel.isEmpty() && !vc) || (!topLevel.isEmpty() && vc), return); QString tmpDir = dir; const QChar slash = QLatin1Char('/'); - while (tmpDir.count() >= topLevel.count() && !tmpDir.isEmpty()) { + while (tmpDir.count() >= topLevelString.count() && !tmpDir.isEmpty()) { m_cachedMatches.insert(tmpDir, {vc, topLevel}); // if no vc was found, this might mean we're inside a repo internal directory (.git) // Cache only input directory, not parents @@ -188,8 +189,8 @@ void VcsManager::resetVersionControlForDirectory(const FilePath &inputDirectory) IVersionControl* VcsManager::findVersionControlForDirectory(const FilePath &inputDirectory, FilePath *topLevelDirectory) { - using StringVersionControlPair = QPair; - using StringVersionControlPairs = QList; + using FilePathVersionControlPair = QPair; + using FilePathVersionControlPairs = QList; if (inputDirectory.isEmpty()) { if (topLevelDirectory) topLevelDirectory->clear(); @@ -207,29 +208,29 @@ IVersionControl* VcsManager::findVersionControlForDirectory(const FilePath &inpu auto cachedData = d->findInCache(directory); if (cachedData) { if (topLevelDirectory) - *topLevelDirectory = FilePath::fromString(cachedData->topLevel); + *topLevelDirectory = cachedData->topLevel; return cachedData->versionControl; } // Nothing: ask the IVersionControls directly. - StringVersionControlPairs allThatCanManage; + FilePathVersionControlPairs allThatCanManage; const QList versionControlList = versionControls(); for (IVersionControl *versionControl : versionControlList) { FilePath topLevel; if (versionControl->managesDirectory(FilePath::fromString(directory), &topLevel)) - allThatCanManage.push_back(StringVersionControlPair(topLevel.toString(), versionControl)); + allThatCanManage.push_back({topLevel, versionControl}); } // To properly find a nested repository (say, git checkout inside SVN), // we need to select the version control with the longest toplevel pathname. - Utils::sort(allThatCanManage, [](const StringVersionControlPair &l, - const StringVersionControlPair &r) { - return l.first.size() > r.first.size(); + Utils::sort(allThatCanManage, [](const FilePathVersionControlPair &l, + const FilePathVersionControlPair &r) { + return l.first.toString().size() > r.first.toString().size(); }); if (allThatCanManage.isEmpty()) { - d->cache(nullptr, QString(), directory); // register that nothing was found! + d->cache(nullptr, {}, directory); // register that nothing was found! // report result; if (topLevelDirectory) @@ -248,13 +249,13 @@ IVersionControl* VcsManager::findVersionControlForDirectory(const FilePath &inpu // In this case, don't cache it. if (!tmpDir.isEmpty()) { const QChar slash = QLatin1Char('/'); - const StringVersionControlPairs::const_iterator cend = allThatCanManage.constEnd(); - for (StringVersionControlPairs::const_iterator i = allThatCanManage.constBegin(); i != cend; ++i) { + for (auto i = allThatCanManage.constBegin(); i != allThatCanManage.constEnd(); ++i) { + const QString firstString = i->first.toString(); // If topLevel was already cached for another VC, skip this one - if (tmpDir.count() < i->first.count()) + if (tmpDir.count() < firstString.count()) continue; d->cache(i->second, i->first, tmpDir); - tmpDir = i->first; + tmpDir = firstString; const int slashPos = tmpDir.lastIndexOf(slash); if (slashPos >= 0) tmpDir.truncate(slashPos); @@ -263,7 +264,7 @@ IVersionControl* VcsManager::findVersionControlForDirectory(const FilePath &inpu // return result if (topLevelDirectory) - *topLevelDirectory = FilePath::fromString(allThatCanManage.first().first); + *topLevelDirectory = allThatCanManage.first().first; IVersionControl *versionControl = allThatCanManage.first().second; const bool isVcsConfigured = versionControl->isConfigured(); if (!isVcsConfigured || d->m_unconfiguredVcs) { @@ -303,11 +304,11 @@ FilePath VcsManager::findTopLevelForDirectory(const FilePath &directory) return result; } -QStringList VcsManager::repositories(const IVersionControl *vc) +FilePaths VcsManager::repositories(const IVersionControl *versionControl) { - QStringList result; + FilePaths result; for (auto it = d->m_cachedMatches.constBegin(); it != d->m_cachedMatches.constEnd(); ++it) { - if (it.value().versionControl == vc) + if (it.value().versionControl == versionControl) result.append(it.value().topLevel); } return result; diff --git a/src/plugins/coreplugin/vcsmanager.h b/src/plugins/coreplugin/vcsmanager.h index 952d0e34e37..bd93dd6e5b7 100644 --- a/src/plugins/coreplugin/vcsmanager.h +++ b/src/plugins/coreplugin/vcsmanager.h @@ -46,7 +46,7 @@ public: Utils::FilePath *topLevelDirectory = nullptr); static Utils::FilePath findTopLevelForDirectory(const Utils::FilePath &directory); - static QStringList repositories(const IVersionControl *); + static Utils::FilePaths repositories(const IVersionControl *versionControl); // Shows a confirmation dialog, whether the files should also be deleted // from revision control. Calls vcsDelete on the files. Returns the list diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp index e14a1da2c6b..6d1431aac6c 100644 --- a/src/plugins/git/gerrit/gerritplugin.cpp +++ b/src/plugins/git/gerrit/gerritplugin.cpp @@ -10,7 +10,6 @@ #include "../gitplugin.h" #include "../gitclient.h" -#include "../gitconstants.h" #include #include @@ -418,8 +417,7 @@ void GerritPlugin::fetch(const QSharedPointer &change, int mode) // Ask the user for a repository to retrieve the change. const QString title = tr("Enter Local Repository for \"%1\" (%2)").arg(change->project, change->branch); - const FilePath suggestedRespository = - FilePath::fromString(findLocalRepository(change->project, change->branch)); + const FilePath suggestedRespository = findLocalRepository(change->project, change->branch); repository = FileUtils::getExistingDirectory(m_dialog.data(), title, suggestedRespository); } @@ -433,35 +431,34 @@ void GerritPlugin::fetch(const QSharedPointer &change, int mode) } // Try to find a matching repository for a project by asking the VcsManager. -QString GerritPlugin::findLocalRepository(QString project, const QString &branch) const +FilePath GerritPlugin::findLocalRepository(const QString &project, const QString &branch) const { - const QStringList gitRepositories = VcsManager::repositories(GitPlugin::versionControl()); + const FilePaths gitRepositories = VcsManager::repositories(GitPlugin::versionControl()); // Determine key (file name) to look for (qt/qtbase->'qtbase'). const int slashPos = project.lastIndexOf('/'); - if (slashPos != -1) - project.remove(0, slashPos + 1); + const QString fixedProject = (slashPos < 0) ? project : project.mid(slashPos + 1); // When looking at branch 1.7, try to check folders // "qtbase_17", 'qtbase1.7' with a semi-smart regular expression. QScopedPointer branchRegexp; if (!branch.isEmpty() && branch != "master") { QString branchPattern = branch; branchPattern.replace('.', "[\\.-_]?"); - const QString pattern = '^' + project + const QString pattern = '^' + fixedProject + "[-_]?" + branchPattern + '$'; branchRegexp.reset(new QRegularExpression(pattern)); if (!branchRegexp->isValid()) branchRegexp.reset(); // Oops. } - for (const QString &repository : gitRepositories) { - const QString fileName = Utils::FilePath::fromString(repository).fileName(); + for (const FilePath &repository : gitRepositories) { + const QString fileName = repository.fileName(); if ((!branchRegexp.isNull() && branchRegexp->match(fileName).hasMatch()) - || fileName == project) { + || fileName == fixedProject) { // Perform a check on the branch. if (branch.isEmpty()) { return repository; } else { - const QString repositoryBranch = GerritPlugin::branch(FilePath::fromString(repository)); + const QString repositoryBranch = GerritPlugin::branch(repository); if (repositoryBranch.isEmpty() || repositoryBranch == branch) return repository; } // !branch.isEmpty() @@ -469,9 +466,9 @@ QString GerritPlugin::findLocalRepository(QString project, const QString &branch } // for repositories // No match, do we have a projects folder? if (DocumentManager::useProjectsDirectory()) - return DocumentManager::projectsDirectory().toString(); + return DocumentManager::projectsDirectory(); - return QDir::currentPath(); + return FilePath::currentWorkingPath(); } } // namespace Internal diff --git a/src/plugins/git/gerrit/gerritplugin.h b/src/plugins/git/gerrit/gerritplugin.h index 4d39b139f79..46431b2761a 100644 --- a/src/plugins/git/gerrit/gerritplugin.h +++ b/src/plugins/git/gerrit/gerritplugin.h @@ -50,7 +50,7 @@ private: void openView(); void push(); - QString findLocalRepository(QString project, const QString &branch) const; + Utils::FilePath findLocalRepository(const QString &project, const QString &branch) const; void fetch(const QSharedPointer &change, int mode); QSharedPointer m_parameters; From 42377c21e4132427b294c6c5711d3c413e67a983 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 4 Oct 2022 16:05:16 +0200 Subject: [PATCH 027/104] VcsManager: Use even more FilePath Change-Id: Ia9dd3de67eb9dc8f5c0331ec9ffe44c993395c33 Reviewed-by: Orgad Shaneh --- src/plugins/coreplugin/vcsmanager.cpp | 95 +++++++++++---------------- 1 file changed, 39 insertions(+), 56 deletions(-) diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index b64e84927ce..dbc36158ed5 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -48,11 +48,9 @@ public: FilePath topLevel; }; - std::optional findInCache(const QString &dir) const + std::optional findInCache(const FilePath &dir) const { - QTC_ASSERT(QDir(dir).isAbsolute(), return std::nullopt); - QTC_ASSERT(!dir.endsWith(QLatin1Char('/')), return std::nullopt); - QTC_ASSERT(QDir::fromNativeSeparators(dir) == dir, return std::nullopt); + QTC_ASSERT(dir.isAbsolutePath(), return std::nullopt); const auto it = m_cachedMatches.constFind(dir); return it == m_cachedMatches.constEnd() ? std::nullopt : std::make_optional(it.value()); @@ -63,48 +61,38 @@ public: m_cachedMatches.clear(); } - void resetCache(const QString &dir) + void resetCache(const FilePath &dir) { - QTC_ASSERT(QDir(dir).isAbsolute(), return); - QTC_ASSERT(!dir.endsWith(QLatin1Char('/')), return); - QTC_ASSERT(QDir::fromNativeSeparators(dir) == dir, return); + QTC_ASSERT(dir.isAbsolutePath(), return); - const QString dirSlash = dir + QLatin1Char('/'); - const QList keys = m_cachedMatches.keys(); - for (const QString &key : keys) { - if (key == dir || key.startsWith(dirSlash)) + const FilePaths keys = m_cachedMatches.keys(); + for (const FilePath &key : keys) { + if (key == dir || key.isChildOf(dir)) m_cachedMatches.remove(key); } } - void cache(IVersionControl *vc, const FilePath &topLevel, const QString &dir) + void cache(IVersionControl *vc, const FilePath &topLevel, const FilePath &dir) { - QTC_ASSERT(QDir(dir).isAbsolute(), return); - QTC_ASSERT(!dir.endsWith(QLatin1Char('/')), return); - QTC_ASSERT(QDir::fromNativeSeparators(dir) == dir, return); + QTC_ASSERT(dir.isAbsolutePath(), return); + const QString topLevelString = topLevel.toString(); - QTC_ASSERT(FilePath::fromString(dir).isChildOf(topLevel) - || topLevelString == dir || topLevel.isEmpty(), return); + QTC_ASSERT(dir.isChildOf(topLevel) || topLevel == dir || topLevel.isEmpty(), return); QTC_ASSERT((topLevel.isEmpty() && !vc) || (!topLevel.isEmpty() && vc), return); - QString tmpDir = dir; - const QChar slash = QLatin1Char('/'); - while (tmpDir.count() >= topLevelString.count() && !tmpDir.isEmpty()) { + FilePath tmpDir = dir; + while (tmpDir.toString().count() >= topLevelString.count() && !tmpDir.isEmpty()) { m_cachedMatches.insert(tmpDir, {vc, topLevel}); // if no vc was found, this might mean we're inside a repo internal directory (.git) // Cache only input directory, not parents if (!vc) break; - const int slashPos = tmpDir.lastIndexOf(slash); - if (slashPos >= 0) - tmpDir.truncate(slashPos); - else - tmpDir.clear(); + tmpDir = tmpDir.parentDir(); } } QList m_versionControlList; - QMap m_cachedMatches; + QMap m_cachedMatches; IVersionControl *m_unconfiguredVcs = nullptr; FilePaths m_cachedAdditionalToolsPaths; @@ -168,24 +156,29 @@ IVersionControl *VcsManager::versionControl(Id id) return Utils::findOrDefault(versionControls(), Utils::equal(&Core::IVersionControl::id, id)); } -static QString absoluteWithNoTrailingSlash(const QString &directory) -{ - QString res = QDir(directory).absolutePath(); - if (res.endsWith(QLatin1Char('/'))) - res.chop(1); - return res; -} - void VcsManager::resetVersionControlForDirectory(const FilePath &inputDirectory) { if (inputDirectory.isEmpty()) return; - const QString directory = absoluteWithNoTrailingSlash(inputDirectory.toString()); + const FilePath directory = inputDirectory.absolutePath(); d->resetCache(directory); - emit m_instance->repositoryChanged(FilePath::fromString(directory)); + emit m_instance->repositoryChanged(directory); } +static FilePath fixedDir(const FilePath &directory) +{ +#ifdef WITH_TESTS + const QString directoryString = directory.toString(); + if (!directoryString.isEmpty() && directoryString[0].isLetter() + && directoryString.indexOf(QLatin1Char(':') + QLatin1String(TEST_PREFIX)) == 1) { + return FilePath::fromString(directoryString.mid(2)); + } +#endif + return directory; +} + + IVersionControl* VcsManager::findVersionControlForDirectory(const FilePath &inputDirectory, FilePath *topLevelDirectory) { @@ -198,13 +191,7 @@ IVersionControl* VcsManager::findVersionControlForDirectory(const FilePath &inpu } // Make sure we an absolute path: - QString directory = absoluteWithNoTrailingSlash(inputDirectory.toString()); -#ifdef WITH_TESTS - if (!directory.isEmpty() && directory[0].isLetter() - && directory.indexOf(QLatin1Char(':') + QLatin1String(TEST_PREFIX)) == 1) { - directory = directory.mid(2); - } -#endif + const FilePath directory = fixedDir(inputDirectory.absolutePath()); auto cachedData = d->findInCache(directory); if (cachedData) { if (topLevelDirectory) @@ -218,7 +205,7 @@ IVersionControl* VcsManager::findVersionControlForDirectory(const FilePath &inpu const QList versionControlList = versionControls(); for (IVersionControl *versionControl : versionControlList) { FilePath topLevel; - if (versionControl->managesDirectory(FilePath::fromString(directory), &topLevel)) + if (versionControl->managesDirectory(directory, &topLevel)) allThatCanManage.push_back({topLevel, versionControl}); } @@ -239,26 +226,22 @@ IVersionControl* VcsManager::findVersionControlForDirectory(const FilePath &inpu } // Register Vcs(s) with the cache - QString tmpDir = absoluteWithNoTrailingSlash(directory); + FilePath tmpDir = directory.absolutePath(); #if defined WITH_TESTS // Force caching of test directories (even though they do not exist): - if (directory.startsWith(QLatin1String(TEST_PREFIX))) + if (directory.startsWith(TEST_PREFIX)) tmpDir = directory; #endif // directory might refer to a historical directory which doesn't exist. // In this case, don't cache it. if (!tmpDir.isEmpty()) { - const QChar slash = QLatin1Char('/'); for (auto i = allThatCanManage.constBegin(); i != allThatCanManage.constEnd(); ++i) { const QString firstString = i->first.toString(); // If topLevel was already cached for another VC, skip this one - if (tmpDir.count() < firstString.count()) + if (tmpDir.toString().count() < firstString.count()) continue; d->cache(i->second, i->first, tmpDir); - tmpDir = firstString; - const int slashPos = tmpDir.lastIndexOf(slash); - if (slashPos >= 0) - tmpDir.truncate(slashPos); + tmpDir = i->first.parentDir(); } } @@ -441,10 +424,10 @@ void VcsManager::emitRepositoryChanged(const FilePath &repository) void VcsManager::clearVersionControlCache() { - const QStringList repoList = d->m_cachedMatches.keys(); + const FilePaths repoList = d->m_cachedMatches.keys(); d->clearCache(); - for (const QString &repo : repoList) - emit m_instance->repositoryChanged(FilePath::fromString(repo)); + for (const FilePath &repo : repoList) + emit m_instance->repositoryChanged(repo); } void VcsManager::handleConfigurationChanges(IVersionControl *vc) From 1748c6e80be30c02975ab3f5547dd8aeaa3962d2 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 5 Oct 2022 23:13:50 +0300 Subject: [PATCH 028/104] VcsManager: Fix detection of top level Amends 42377c21e4132427b294c6c5711d3c413e67a983. Fixes: QTCREATORBUG-28253 Change-Id: Ia10b88790ad02e9be4ff3c84b67c36239c3adf7d Reviewed-by: Orgad Shaneh --- src/plugins/coreplugin/vcsmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index dbc36158ed5..735a813137e 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -191,7 +191,7 @@ IVersionControl* VcsManager::findVersionControlForDirectory(const FilePath &inpu } // Make sure we an absolute path: - const FilePath directory = fixedDir(inputDirectory.absolutePath()); + const FilePath directory = fixedDir(inputDirectory.absoluteFilePath()); auto cachedData = d->findInCache(directory); if (cachedData) { if (topLevelDirectory) From 8d80623a0f6885810bbfe8448128d5fbc7cc9ddb Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 29 Sep 2022 10:11:28 +0200 Subject: [PATCH 029/104] CMake: Delay restoration until devices load If the devices have not loaded yet, trying to restore a remote cmake will result in errors. Change-Id: I08a802441d64b203388334e5cbb6b962d1f0d213 Reviewed-by: Cristian Adam Reviewed-by: --- src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp index 0178164b39c..1551030ce0b 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp @@ -31,6 +31,8 @@ #include #include +#include + using namespace Core; using namespace ProjectExplorer; using namespace Utils; @@ -118,8 +120,8 @@ bool CMakeProjectPlugin::initialize(const QStringList & /*arguments*/, QString * void CMakeProjectPlugin::extensionsInitialized() { - //restore the cmake tools before loading the kits - CMakeToolManager::restoreCMakeTools(); + // Delay the restoration to allow the devices to load first. + QTimer::singleShot(0, this, [] { CMakeToolManager::restoreCMakeTools(); }); } void CMakeProjectPlugin::updateContextActions(Node *node) From 1f5eb9e62fb79f0fd79480461074b34091ac867d Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 4 Oct 2022 10:10:58 +0200 Subject: [PATCH 030/104] Mercurial: Inline authenticationdialog.ui Change-Id: I235c8aaf7d2dd8e49e8a22b81523a322b5f596bc Reviewed-by: Alessandro Portale --- src/plugins/mercurial/CMakeLists.txt | 2 +- .../mercurial/authenticationdialog.cpp | 52 +++++++---- src/plugins/mercurial/authenticationdialog.h | 14 +-- src/plugins/mercurial/authenticationdialog.ui | 92 ------------------- src/plugins/mercurial/mercurial.qbs | 1 - 5 files changed, 43 insertions(+), 118 deletions(-) delete mode 100644 src/plugins/mercurial/authenticationdialog.ui diff --git a/src/plugins/mercurial/CMakeLists.txt b/src/plugins/mercurial/CMakeLists.txt index 915b9a8cdf0..277dd230f0c 100644 --- a/src/plugins/mercurial/CMakeLists.txt +++ b/src/plugins/mercurial/CMakeLists.txt @@ -2,7 +2,7 @@ add_qtc_plugin(Mercurial PLUGIN_DEPENDS Core TextEditor VcsBase SOURCES annotationhighlighter.cpp annotationhighlighter.h - authenticationdialog.cpp authenticationdialog.h authenticationdialog.ui + authenticationdialog.cpp authenticationdialog.h commiteditor.cpp commiteditor.h constants.h mercurialclient.cpp mercurialclient.h diff --git a/src/plugins/mercurial/authenticationdialog.cpp b/src/plugins/mercurial/authenticationdialog.cpp index e79e3d1a84e..c04fb34d655 100644 --- a/src/plugins/mercurial/authenticationdialog.cpp +++ b/src/plugins/mercurial/authenticationdialog.cpp @@ -2,39 +2,55 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "authenticationdialog.h" -#include "ui_authenticationdialog.h" -namespace Mercurial { -namespace Internal { +#include -AuthenticationDialog::AuthenticationDialog(const QString &username, const QString &password, QWidget *parent) : - QDialog(parent), - ui(new Ui::AuthenticationDialog) +#include +#include + +namespace Mercurial::Internal { + +AuthenticationDialog::AuthenticationDialog(const QString &username, const QString &password, QWidget *parent) + : QDialog(parent) { - ui->setupUi(this); - ui->username->setText(username); - ui->password->setText(password); + resize(312, 116); + + m_username = new QLineEdit(username); + + m_password = new QLineEdit(password); + m_password->setEchoMode(QLineEdit::Password); + + auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); + + using namespace Utils::Layouting; + + Column { + Form { + tr("Username:"), m_username, br, + tr("Password:"), m_password + }, + buttonBox + }.attachTo(this); + + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); } -AuthenticationDialog::~AuthenticationDialog() -{ - delete ui; -} +AuthenticationDialog::~AuthenticationDialog() = default; void AuthenticationDialog::setPasswordEnabled(bool enabled) { - ui->password->setEnabled(enabled); + m_password->setEnabled(enabled); } QString AuthenticationDialog::getUserName() { - return ui->username->text(); + return m_username->text(); } QString AuthenticationDialog::getPassword() { - return ui->password->text(); + return m_password->text(); } -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/authenticationdialog.h b/src/plugins/mercurial/authenticationdialog.h index 30537f141ac..2b6eb454401 100644 --- a/src/plugins/mercurial/authenticationdialog.h +++ b/src/plugins/mercurial/authenticationdialog.h @@ -5,10 +5,11 @@ #include -namespace Mercurial { -namespace Internal { +QT_BEGIN_NAMESPACE +class QLineEdit; +QT_END_NAMESPACE -namespace Ui { class AuthenticationDialog; } +namespace Mercurial::Internal { class AuthenticationDialog : public QDialog { @@ -18,13 +19,14 @@ public: explicit AuthenticationDialog(const QString &username, const QString &password, QWidget *parent = nullptr); ~AuthenticationDialog() override; + void setPasswordEnabled(bool enabled); QString getUserName(); QString getPassword(); private: - Ui::AuthenticationDialog *ui; + QLineEdit *m_username; + QLineEdit *m_password; }; -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/authenticationdialog.ui b/src/plugins/mercurial/authenticationdialog.ui deleted file mode 100644 index 3d12e2c1f7e..00000000000 --- a/src/plugins/mercurial/authenticationdialog.ui +++ /dev/null @@ -1,92 +0,0 @@ - - - Mercurial::Internal::AuthenticationDialog - - - - 0 - 0 - 312 - 116 - - - - Dialog - - - - - - - - Username: - - - - - - - - - - Password: - - - - - - - QLineEdit::Password - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - Mercurial::Internal::AuthenticationDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Mercurial::Internal::AuthenticationDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/src/plugins/mercurial/mercurial.qbs b/src/plugins/mercurial/mercurial.qbs index 0f8b5613bf1..f657f7bc5ed 100644 --- a/src/plugins/mercurial/mercurial.qbs +++ b/src/plugins/mercurial/mercurial.qbs @@ -16,7 +16,6 @@ QtcPlugin { "annotationhighlighter.h", "authenticationdialog.cpp", "authenticationdialog.h", - "authenticationdialog.ui", "commiteditor.cpp", "commiteditor.h", "constants.h", From d843e96be8592e8b8409e3d7648316a560ffd847 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 4 Oct 2022 10:41:50 +0200 Subject: [PATCH 031/104] Mercurial: Inline mercurialcommitpanel.ui Also remove a few translated placeholder strings that were immediately overwritten. Change-Id: Ia2aecefcb798e191d1407e6a00bdb584430bbe3c Reviewed-by: Alessandro Portale Reviewed-by: --- src/plugins/mercurial/CMakeLists.txt | 1 - src/plugins/mercurial/mercurial.qbs | 1 - src/plugins/mercurial/mercurialcommitpanel.ui | 107 ------------------ .../mercurial/mercurialcommitwidget.cpp | 84 +++++++++++--- src/plugins/mercurial/mercurialcommitwidget.h | 18 ++- 5 files changed, 74 insertions(+), 137 deletions(-) delete mode 100644 src/plugins/mercurial/mercurialcommitpanel.ui diff --git a/src/plugins/mercurial/CMakeLists.txt b/src/plugins/mercurial/CMakeLists.txt index 277dd230f0c..730bac7a1d4 100644 --- a/src/plugins/mercurial/CMakeLists.txt +++ b/src/plugins/mercurial/CMakeLists.txt @@ -6,7 +6,6 @@ add_qtc_plugin(Mercurial commiteditor.cpp commiteditor.h constants.h mercurialclient.cpp mercurialclient.h - mercurialcommitpanel.ui mercurialcommitwidget.cpp mercurialcommitwidget.h mercurialeditor.cpp mercurialeditor.h mercurialplugin.cpp mercurialplugin.h diff --git a/src/plugins/mercurial/mercurial.qbs b/src/plugins/mercurial/mercurial.qbs index f657f7bc5ed..6af83d249d9 100644 --- a/src/plugins/mercurial/mercurial.qbs +++ b/src/plugins/mercurial/mercurial.qbs @@ -21,7 +21,6 @@ QtcPlugin { "constants.h", "mercurialclient.cpp", "mercurialclient.h", - "mercurialcommitpanel.ui", "mercurialcommitwidget.cpp", "mercurialcommitwidget.h", "mercurialeditor.cpp", diff --git a/src/plugins/mercurial/mercurialcommitpanel.ui b/src/plugins/mercurial/mercurialcommitpanel.ui deleted file mode 100644 index eadd4953e0d..00000000000 --- a/src/plugins/mercurial/mercurialcommitpanel.ui +++ /dev/null @@ -1,107 +0,0 @@ - - - Mercurial::Internal::MercurialCommitPanel - - - - 0 - 0 - 374 - 229 - - - - - 0 - - - - - General Information - - - - QFormLayout::ExpandingFieldsGrow - - - - - Repository: - - - - - - - repository - - - - - - - Branch: - - - - - - - branch - - - - - - - - - - Commit Information - - - - - - - - Author: - - - - - - - - - - Email: - - - - - - - - - - - - Qt::Horizontal - - - - 161 - 20 - - - - - - - - - - - - diff --git a/src/plugins/mercurial/mercurialcommitwidget.cpp b/src/plugins/mercurial/mercurialcommitwidget.cpp index 5b42a74fb6e..993a3dbdfda 100644 --- a/src/plugins/mercurial/mercurialcommitwidget.cpp +++ b/src/plugins/mercurial/mercurialcommitwidget.cpp @@ -7,7 +7,9 @@ #include #include #include + #include +#include #include #include @@ -16,8 +18,18 @@ //see the git submit widget for details of the syntax Highlighter -namespace Mercurial { -namespace Internal { +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Mercurial::Internal { // Highlighter for Mercurial submit messages. Make the first line bold, indicates // comments as such (retrieving the format from the text editor) and marks up @@ -85,11 +97,50 @@ void MercurialSubmitHighlighter::highlightBlock(const QString &text) } } - -MercurialCommitWidget::MercurialCommitWidget() : - mercurialCommitPanel(new QWidget) +class MercurialCommitPanel : public QWidget +{ + Q_DECLARE_TR_FUNCTIONS(Mercurial::Internal::MercurialCommitPanel) + +public: + MercurialCommitPanel() + { + m_repositoryLabel = new QLabel; + m_branchLabel = new QLabel; + + m_authorLineEdit = new QLineEdit; + m_emailLineEdit = new QLineEdit; + + using namespace Utils::Layouting; + + Column { + Group { + title(tr("General Information")), + Form { + tr("Repository:"), m_repositoryLabel, br, + tr("Branch:"), m_branchLabel, + } + }, + Group { + title(tr("Commit Information")), + Row { + Form { + tr("Author:"), m_authorLineEdit, br, + tr("Email:"), m_emailLineEdit, + }, + } + } + }.attachTo(this, Utils::Layouting::WithoutMargins); + } + + QLabel *m_repositoryLabel; + QLabel *m_branchLabel; + QLineEdit *m_authorLineEdit; + QLineEdit *m_emailLineEdit; +}; + +MercurialCommitWidget::MercurialCommitWidget() + : mercurialCommitPanel(new MercurialCommitPanel) { - mercurialCommitPanelUi.setupUi(mercurialCommitPanel); insertTopWidget(mercurialCommitPanel); new MercurialSubmitHighlighter(descriptionEdit()); } @@ -97,16 +148,16 @@ MercurialCommitWidget::MercurialCommitWidget() : void MercurialCommitWidget::setFields(const QString &repositoryRoot, const QString &branch, const QString &userName, const QString &email) { - mercurialCommitPanelUi.repositoryLabel->setText(repositoryRoot); - mercurialCommitPanelUi.branchLabel->setText(branch); - mercurialCommitPanelUi.authorLineEdit->setText(userName); - mercurialCommitPanelUi.emailLineEdit->setText(email); + mercurialCommitPanel->m_repositoryLabel->setText(repositoryRoot); + mercurialCommitPanel->m_branchLabel->setText(branch); + mercurialCommitPanel->m_authorLineEdit->setText(userName); + mercurialCommitPanel->m_emailLineEdit->setText(email); } -QString MercurialCommitWidget::committer() +QString MercurialCommitWidget::committer() const { - const QString author = mercurialCommitPanelUi.authorLineEdit->text(); - const QString email = mercurialCommitPanelUi.emailLineEdit->text(); + const QString author = mercurialCommitPanel->m_authorLineEdit->text(); + const QString email = mercurialCommitPanel->m_emailLineEdit->text(); if (author.isEmpty()) return QString(); @@ -119,9 +170,9 @@ QString MercurialCommitWidget::committer() return user; } -QString MercurialCommitWidget::repoRoot() +QString MercurialCommitWidget::repoRoot() const { - return mercurialCommitPanelUi.repositoryLabel->text(); + return mercurialCommitPanel->m_repositoryLabel->text(); } QString MercurialCommitWidget::cleanupDescription(const QString &input) const @@ -133,5 +184,4 @@ QString MercurialCommitWidget::cleanupDescription(const QString &input) const return message; } -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/mercurialcommitwidget.h b/src/plugins/mercurial/mercurialcommitwidget.h index 0bf0cb99785..ccd462edd05 100644 --- a/src/plugins/mercurial/mercurialcommitwidget.h +++ b/src/plugins/mercurial/mercurialcommitwidget.h @@ -3,12 +3,11 @@ #pragma once -#include "ui_mercurialcommitpanel.h" - #include -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { + +class MercurialCommitPanel; /*submit editor widget based on git SubmitEditor Some extra fields have been added to the standard SubmitEditorWidget, @@ -22,16 +21,13 @@ public: void setFields(const QString &repositoryRoot, const QString &branch, const QString &userName, const QString &email); - QString committer(); - QString repoRoot(); + QString committer() const; + QString repoRoot() const; protected: QString cleanupDescription(const QString &input) const override; -private: - QWidget *mercurialCommitPanel; - Ui::MercurialCommitPanel mercurialCommitPanelUi; + MercurialCommitPanel *mercurialCommitPanel; }; -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal From bad664163fe7f036f8bb6d315570201a5a0fe6c9 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 4 Oct 2022 11:32:15 +0200 Subject: [PATCH 032/104] Mercurial: Inline revertdialog.ui Change-Id: I1da46c20c1c504d482ef580520f239c789f05dcc Reviewed-by: Alessandro Portale Reviewed-by: --- src/plugins/mercurial/CMakeLists.txt | 2 +- src/plugins/mercurial/mercurial.qbs | 1 - src/plugins/mercurial/revertdialog.cpp | 51 +++++++++---- src/plugins/mercurial/revertdialog.h | 14 ++-- src/plugins/mercurial/revertdialog.ui | 99 -------------------------- 5 files changed, 46 insertions(+), 121 deletions(-) delete mode 100644 src/plugins/mercurial/revertdialog.ui diff --git a/src/plugins/mercurial/CMakeLists.txt b/src/plugins/mercurial/CMakeLists.txt index 730bac7a1d4..e5326a816f0 100644 --- a/src/plugins/mercurial/CMakeLists.txt +++ b/src/plugins/mercurial/CMakeLists.txt @@ -10,6 +10,6 @@ add_qtc_plugin(Mercurial mercurialeditor.cpp mercurialeditor.h mercurialplugin.cpp mercurialplugin.h mercurialsettings.cpp mercurialsettings.h - revertdialog.cpp revertdialog.h revertdialog.ui + revertdialog.cpp revertdialog.h srcdestdialog.cpp srcdestdialog.h srcdestdialog.ui ) diff --git a/src/plugins/mercurial/mercurial.qbs b/src/plugins/mercurial/mercurial.qbs index 6af83d249d9..4c56a350969 100644 --- a/src/plugins/mercurial/mercurial.qbs +++ b/src/plugins/mercurial/mercurial.qbs @@ -31,7 +31,6 @@ QtcPlugin { "mercurialsettings.h", "revertdialog.cpp", "revertdialog.h", - "revertdialog.ui", "srcdestdialog.cpp", "srcdestdialog.h", "srcdestdialog.ui", diff --git a/src/plugins/mercurial/revertdialog.cpp b/src/plugins/mercurial/revertdialog.cpp index e7af41d5148..fb89bb238bf 100644 --- a/src/plugins/mercurial/revertdialog.cpp +++ b/src/plugins/mercurial/revertdialog.cpp @@ -3,25 +3,50 @@ #include "revertdialog.h" -namespace Mercurial { -namespace Internal { +#include -RevertDialog::RevertDialog(QWidget *parent) : - QDialog(parent), - m_ui(new Ui::RevertDialog) +#include +#include +#include + +using namespace Utils; + +namespace Mercurial::Internal { + +RevertDialog::RevertDialog(QWidget *parent) + : QDialog(parent) { - m_ui->setupUi(this); + resize(400, 162); + setWindowTitle(tr("Revert")); + + auto groupBox = new QGroupBox(tr("Specify a revision other than the default?")); + groupBox->setCheckable(true); + groupBox->setChecked(false); + + m_revisionLineEdit = new QLineEdit; + + auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); + + using namespace Layouting; + + Form { + tr("Revision:"), m_revisionLineEdit, + }.attachTo(groupBox, WithMargins); + + Column { + groupBox, + buttonBox + }.attachTo(this); + + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); } -RevertDialog::~RevertDialog() -{ - delete m_ui; -} +RevertDialog::~RevertDialog() = default; QString RevertDialog::revision() const { - return m_ui->revisionLineEdit->text(); + return m_revisionLineEdit->text(); } -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/revertdialog.h b/src/plugins/mercurial/revertdialog.h index 0c58b01f5d7..d480f0a8191 100644 --- a/src/plugins/mercurial/revertdialog.h +++ b/src/plugins/mercurial/revertdialog.h @@ -3,12 +3,13 @@ #pragma once -#include "ui_revertdialog.h" - #include -namespace Mercurial { -namespace Internal { +QT_BEGIN_NAMESPACE +class QLineEdit; +QT_END_NAMESPACE + +namespace Mercurial::Internal { class RevertDialog : public QDialog { @@ -21,8 +22,7 @@ public: QString revision() const; private: - Ui::RevertDialog *m_ui; + QLineEdit *m_revisionLineEdit; }; -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/revertdialog.ui b/src/plugins/mercurial/revertdialog.ui deleted file mode 100644 index 66876dc6f93..00000000000 --- a/src/plugins/mercurial/revertdialog.ui +++ /dev/null @@ -1,99 +0,0 @@ - - - Mercurial::Internal::RevertDialog - - - - 0 - 0 - 400 - 162 - - - - Revert - - - - - - Specify a revision other than the default? - - - true - - - false - - - - - 10 - 30 - 361 - 51 - - - - - - - Revision: - - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - Mercurial::Internal::RevertDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Mercurial::Internal::RevertDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - From a5803ae5552362e3431af53b36ddd497f1661a95 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 4 Oct 2022 17:49:00 +0200 Subject: [PATCH 033/104] Meson: Inline toolitemsettings.ui Change-Id: Ib305c45354e63142587593401fda45d03d42d207 Reviewed-by: Alessandro Portale --- .../mesonprojectmanager/CMakeLists.txt | 1 - .../mesonprojectmanager.qbs | 1 - .../settings/tools/toolitemsettings.cpp | 53 ++++++++++--------- .../settings/tools/toolitemsettings.h | 24 +++++---- .../settings/tools/toolitemsettings.ui | 46 ---------------- 5 files changed, 44 insertions(+), 81 deletions(-) delete mode 100644 src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.ui diff --git a/src/plugins/mesonprojectmanager/CMakeLists.txt b/src/plugins/mesonprojectmanager/CMakeLists.txt index d11468c7579..afc73cbb9df 100644 --- a/src/plugins/mesonprojectmanager/CMakeLists.txt +++ b/src/plugins/mesonprojectmanager/CMakeLists.txt @@ -14,7 +14,6 @@ add_qtc_plugin(MesonProjectManager settings/tools/toolssettingswidget.cpp settings/tools/toolssettingspage.cpp settings/tools/toolssettingspage.h - settings/tools/toolitemsettings.ui settings/tools/toolitemsettings.cpp settings/tools/toolitemsettings.h settings/tools/tooltreeitem.cpp diff --git a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs index f4495b103ae..1749a697bb9 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs +++ b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs @@ -88,7 +88,6 @@ Project { "settings/tools/kitaspect/toolkitaspectwidget.h", "settings/tools/toolitemsettings.cpp", "settings/tools/toolitemsettings.h", - "settings/tools/toolitemsettings.ui", "settings/tools/toolsmodel.cpp", "settings/tools/toolsmodel.h", "settings/tools/toolssettingsaccessor.cpp", diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.cpp b/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.cpp index 5492183a07d..918231b198f 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.cpp +++ b/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.cpp @@ -4,38 +4,44 @@ #include "toolitemsettings.h" #include "tooltreeitem.h" -#include "ui_toolitemsettings.h" -namespace MesonProjectManager { -namespace Internal { +#include +#include + +#include + +using namespace Utils; + +namespace MesonProjectManager::Internal { ToolItemSettings::ToolItemSettings(QWidget *parent) : QWidget(parent) - , ui(new Ui::ToolItemSettings) { - ui->setupUi(this); - ui->mesonPathChooser->setExpectedKind(Utils::PathChooser::ExistingCommand); - ui->mesonPathChooser->setHistoryCompleter(QLatin1String("Meson.Command.History")); - connect(ui->mesonPathChooser, - &Utils::PathChooser::rawPathChanged, - this, - &ToolItemSettings::store); - connect(ui->mesonNameLineEdit, &QLineEdit::textChanged, this, &ToolItemSettings::store); -} + m_mesonNameLineEdit = new QLineEdit; -ToolItemSettings::~ToolItemSettings() -{ - delete ui; + m_mesonPathChooser = new PathChooser; + m_mesonPathChooser->setExpectedKind(PathChooser::ExistingCommand); + m_mesonPathChooser->setHistoryCompleter(QLatin1String("Meson.Command.History")); + + using namespace Layouting; + + Form { + tr("Name:"), m_mesonNameLineEdit, br, + tr("Path:"), m_mesonPathChooser, br, + }.attachTo(this, WithoutMargins); + + connect(m_mesonPathChooser, &PathChooser::rawPathChanged, this, &ToolItemSettings::store); + connect(m_mesonNameLineEdit, &QLineEdit::textChanged, this, &ToolItemSettings::store); } void ToolItemSettings::load(ToolTreeItem *item) { if (item) { m_currentId = std::nullopt; - ui->mesonNameLineEdit->setDisabled(item->isAutoDetected()); - ui->mesonNameLineEdit->setText(item->name()); - ui->mesonPathChooser->setDisabled(item->isAutoDetected()); - ui->mesonPathChooser->setFilePath(item->executable()); + m_mesonNameLineEdit->setDisabled(item->isAutoDetected()); + m_mesonNameLineEdit->setText(item->name()); + m_mesonPathChooser->setDisabled(item->isAutoDetected()); + m_mesonPathChooser->setFilePath(item->executable()); m_currentId = item->id(); } else { m_currentId = std::nullopt; @@ -46,9 +52,8 @@ void ToolItemSettings::store() { if (m_currentId) emit applyChanges(*m_currentId, - ui->mesonNameLineEdit->text(), - ui->mesonPathChooser->filePath()); + m_mesonNameLineEdit->text(), + m_mesonPathChooser->filePath()); } -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.h b/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.h index 3d1407622fb..649accf18f8 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.h +++ b/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.h @@ -4,16 +4,21 @@ #pragma once #include -#include #include #include -namespace MesonProjectManager { -namespace Internal { +QT_BEGIN_NAMESPACE +class QLineEdit; +QT_END_NAMESPACE -namespace Ui { class ToolItemSettings; } +namespace Utils { +class FilePath; +class PathChooser; +} + +namespace MesonProjectManager::Internal { class ToolTreeItem; @@ -23,15 +28,16 @@ class ToolItemSettings : public QWidget public: explicit ToolItemSettings(QWidget *parent = nullptr); - ~ToolItemSettings(); void load(ToolTreeItem *item); void store(); - Q_SIGNAL void applyChanges(Utils::Id itemId, const QString &name, const Utils::FilePath &exe); + +signals: + void applyChanges(Utils::Id itemId, const QString &name, const Utils::FilePath &exe); private: - Ui::ToolItemSettings *ui; std::optional m_currentId{std::nullopt}; + QLineEdit *m_mesonNameLineEdit; + Utils::PathChooser *m_mesonPathChooser; }; -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.ui b/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.ui deleted file mode 100644 index 36b0828aec9..00000000000 --- a/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.ui +++ /dev/null @@ -1,46 +0,0 @@ - - - MesonProjectManager::Internal::ToolItemSettings - - - - 0 - 0 - 409 - 70 - - - - - - - Name: - - - - - - - - - - Path: - - - - - - - - - - - Utils::PathChooser - QWidget -
utils/pathchooser.h
- 1 -
-
- - -
From 49378ced3c998a7975c7973ee168f475bc1510a6 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 16 Sep 2022 16:56:09 +0200 Subject: [PATCH 034/104] Doc: Describe Squish plugin Fixes: QTCREATORBUG-27890 Change-Id: Icc203a96f08c785f016130480c45c988d26ac371 Reviewed-by: Reviewed-by: Christian Stenger --- doc/qtcreator/images/icons/jumpto.png | Bin 0 -> 399 bytes doc/qtcreator/images/icons/objectsmap.png | Bin 0 -> 140 bytes ...or-squish-control-bar-record-test-case.png | Bin 0 -> 1630 bytes ...eator-squish-control-bar-run-test-case.png | Bin 0 -> 1309 bytes ...qtcreator-squish-create-test-suite-aut.png | Bin 0 -> 8685 bytes ...ator-squish-create-test-suite-language.png | Bin 0 -> 10275 bytes ...ator-squish-create-test-suite-location.png | Bin 0 -> 9447 bytes ...creator-squish-create-test-suite-setup.png | Bin 0 -> 12787 bytes .../qtcreator-squish-create-test-suite.png | Bin 0 -> 10932 bytes .../qtcreator-squish-debugging-view.png | Bin 0 -> 1438 bytes .../images/qtcreator-squish-locals.png | Bin 0 -> 1588 bytes ...reator-squish-output-runner-server-log.png | Bin 0 -> 6459 bytes .../qtcreator-squish-output-test-results.png | Bin 0 -> 24332 bytes .../images/qtcreator-squish-preferences.png | Bin 0 -> 7325 bytes ...ish-server-settings-add-attachable-aut.png | Bin 0 -> 3943 bytes .../qtcreator-squish-server-settings.png | Bin 0 -> 12923 bytes .../qtcreator-squish-symbolic-names.png | Bin 0 -> 13392 bytes .../qtcreator-squish-test-script-edit.png | Bin 0 -> 6548 bytes ...creator-squish-view-open-squish-suites.png | Bin 0 -> 7104 bytes .../images/qtcreator-squish-view.png | Bin 0 -> 3405 bytes .../howto/creator-only/creator-autotest.qdoc | 2 +- .../howto/creator-only/creator-squish.qdoc | 330 ++++++++++++++++++ .../creator-only/creator-advanced.qdoc | 2 +- .../creator-only/creator-testing.qdoc | 6 +- .../creator-projects-creating.qdoc | 5 + doc/qtcreator/src/qtcreator-toc.qdoc | 1 + doc/qtcreator/src/qtcreator.qdoc | 1 + .../src/user-interface/creator-ui.qdoc | 6 +- 28 files changed, 349 insertions(+), 4 deletions(-) create mode 100644 doc/qtcreator/images/icons/jumpto.png create mode 100644 doc/qtcreator/images/icons/objectsmap.png create mode 100644 doc/qtcreator/images/qtcreator-squish-control-bar-record-test-case.png create mode 100644 doc/qtcreator/images/qtcreator-squish-control-bar-run-test-case.png create mode 100644 doc/qtcreator/images/qtcreator-squish-create-test-suite-aut.png create mode 100644 doc/qtcreator/images/qtcreator-squish-create-test-suite-language.png create mode 100644 doc/qtcreator/images/qtcreator-squish-create-test-suite-location.png create mode 100644 doc/qtcreator/images/qtcreator-squish-create-test-suite-setup.png create mode 100644 doc/qtcreator/images/qtcreator-squish-create-test-suite.png create mode 100644 doc/qtcreator/images/qtcreator-squish-debugging-view.png create mode 100644 doc/qtcreator/images/qtcreator-squish-locals.png create mode 100644 doc/qtcreator/images/qtcreator-squish-output-runner-server-log.png create mode 100644 doc/qtcreator/images/qtcreator-squish-output-test-results.png create mode 100644 doc/qtcreator/images/qtcreator-squish-preferences.png create mode 100644 doc/qtcreator/images/qtcreator-squish-server-settings-add-attachable-aut.png create mode 100644 doc/qtcreator/images/qtcreator-squish-server-settings.png create mode 100644 doc/qtcreator/images/qtcreator-squish-symbolic-names.png create mode 100644 doc/qtcreator/images/qtcreator-squish-test-script-edit.png create mode 100644 doc/qtcreator/images/qtcreator-squish-view-open-squish-suites.png create mode 100644 doc/qtcreator/images/qtcreator-squish-view.png create mode 100644 doc/qtcreator/src/howto/creator-only/creator-squish.qdoc diff --git a/doc/qtcreator/images/icons/jumpto.png b/doc/qtcreator/images/icons/jumpto.png new file mode 100644 index 0000000000000000000000000000000000000000..a913b47d8c1b9ce43932f4fa9d0311ef987cb5c6 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QURXy zJ9qBFg$tK1UAl7R%C&3PZrr$W>(;G1ckbM~ckj`oM^BzSdG_qtix)5c{Q2|$|NjX_ zjV~D(80LGrIEF|_vK~CB#~diaaH07A?#nAfnmObzY_eJk6qo>@!{Wu4fnd%uNJ$z!ttuj{JL{lU(I{$~9zWh={< zlh1s+1PyZSzQ&9;6IYZ rR$US5X5{?*UZ=yP+uecTALHS()+K#EUvV-pFfe$!`njxgN@xNA-AT}A literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/icons/objectsmap.png b/doc/qtcreator/images/icons/objectsmap.png new file mode 100644 index 0000000000000000000000000000000000000000..ca01cdc91134b29a0a5c82fc1811f550758b3499 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0y~yU;weXSeO|Y80uv%^)WCo2nG0rxc>kDzoDU_wY9aa zt!?7Oi5oU-@T|7=XJBApED7=pW^j0RBaMN9LBrFbP0l+XkKQR659 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-control-bar-record-test-case.png b/doc/qtcreator/images/qtcreator-squish-control-bar-record-test-case.png new file mode 100644 index 0000000000000000000000000000000000000000..85093103b7eb400a75923a1b262d648d45f16818 GIT binary patch literal 1630 zcmeAS@N?(olHy`uVBq!ia0y~yU^v0Rz|hRW%)r3#UvddE0|Vos0G|+7b#)C5O-&8W zbWJTSEp2T*eFHsxe?9$dJ-=4Htoix|hK7blhDOFlM#g4l=4R&RX66>=78d3fmKK&) zmR8o*HnujlcD8o*cJ>bT4vr3vPEO7)&MvMlu5K=FZmw?buI}z0o?c!)KHk25zWN5f ztviB3LW4uYLc_z8l2S7D4Kn9nC@m{5E2}6guPiUGsBdg)Xl!n5YH9H^Xlb3_vVBL( z_6z+JCQg_*Y4Vh5Q>V?CK6BPg5Li8P=AN0W_sm>X|cF&s@EF=APB7&#gXpZuPl$+gts&x3+HI-n#w5{OuQZY`<_}=kC3`_Uzrg zci$d}S*us?*|U1jzWsad{olL)!2YGn_b*$%f7y!t%U2v&zT&`&l?M(TK6v=Z!NW%n z9XNF8$kD?GLHxr5y*)GU{r~^4zW(Xc zr_ZXYo>f;rtEqWjUHvvQ^WC}C@BaUP|Ni~guV4S)+w=e3x&Qy~{r~^&|Ns9d{%)vc zU|1??K<7i7S`nL#+bdrb!GLPz{PdaR)PGJ{*BXPO3cEybu>r0I1{9d=^DeK8Em+lz(bDynId99Xj@Oi1eVp^BuhE4*W$vREpY%<1KQ zYP4MFW`xD`ce5UJ%Xe$7eyz<1uskTL3YD-_woz`+BX?52Pg;h$NaSW@PxlViUn$YE=*~esS9jj6>iKQ%_1|B1N-FTJU*+-Zi1|{p+d*5d`t{$~J#A`O z))W~n9sSIkT1va-q&eEp<=kq#G-9)Q5#Rb36aB(O{{EQ1+2KcZ%eze;?oryEa$<>p zwi##MtXi^W+RL{-Pqfm1Tw~&JU|^as%dmlANsvNrX%Z;#9sjJ|ryE_fwr+d#k20Cv zA3r?oO}4K2+?8Dz;oG?7O?^r3pU=-fX7_)4>YJl({584w&*KfV6ecR{t1Z7@^YGiZ ze{uKkD6F2VusWOl$p6#KCmmJzxBZUgeq>$sw0qP3{vR>imuh})<^A+(ecJV=oWA-k zj%tskW4Sje+GRG^bgeJfJu%DvSnh=9;@5VFrM!KZDE*}Bc+~fIQTF$%vkUk1=a;@; z_cVU%^KaG%KfXJ+PX6w1xywYCc`wyxP1zcHg?Qdlhomp00njqvG|mqkX>G z*Ul=hN%d^rq`LLXTGv-ual0y>o;vD1JNB1s|9=5SrU{k~TcC-rQ1S#n10yI@1R#kK zley%OLbuYg%(CfHk6v<`er?Z^U!uOG(*3q~^O?i3DIukfUjBz%74C`O-m;8w@~cY~ z9WQ&%y?pWVXYH1`e&@fo*t~h)kSR4wO~#~fQc94^#s&9(sLnhgkP@yHd9rExX7@=+ zj(go6D>m!qwaDF<|K!3`CnfP%VWP_91tlkhIyCYxt?M|Uux{%8?2zS3zO`@naHLI| zdvVd`KK`Dh3FLKC4LrL{xcj|IqPLZnWQfR0|SGntDnm{r-UW| D`Ia7^ literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-control-bar-run-test-case.png b/doc/qtcreator/images/qtcreator-squish-control-bar-run-test-case.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d06933766298ec7fbd4921e046bc49b1a7f7f3 GIT binary patch literal 1309 zcmeAS@N?(olHy`uVBq!ia0y~yU^v0Rz|hRW%)r3#UvddE0|TRGfKP}k0|-bnFz7QF zI5C9kGlY6DgodaxFsL#}t1{@TR-~${YiMa}>**VqTUc1z*g7~mIXXEzF)%nWNINm; zJB3O+%_wtradmU|aQE;G3VV?{}ve)9T^=R6&({56B}c|5EBy{ zQ=uO-!zpHaSwdoBLSj-vVsc_~a#B)CX(&VK)sWJwsijxTdMl)RuZHwqEt?4ft7p#K zGjsKxnXAvu+;eZq4E-hBot9h;S#mXX$T~b*Kvb_@ zy=TwrJ@@{fTRrpK>ec7Y?KyYv|G9VnZ{K}*Z_mto51-xp|Np_`XAkS^pFVy1>h;@q z=T^V_|NlJ*e0cxi^XJc>|KHp5|J}L&|L^_(|L*_){|bESVGIn+>pfi@Ln>~)oz5LC zuIppOn%~hear&aGS2u_W1zceg)>b+-rR(xGwY`5o2dtwSu*EO zsb02#+hctz$ANFZyJRldzR7J`p_}*4`0kcIyBTQ{J2h@wS)IGGCXRcF6mD`a= zFYBL`YI!%z5q&!Cc4BuDb61fRzs~+u6?=QGynb_8Tlr6vuJ_Lft)efdq%0S>&P=;C zX~K=1se;ljsY?zCJ5&Z-)??Z0=k}^=v3KtmPN%~w&#!B>zuHmjaN}|wPf^tSvMf`d zx;-Cip zqvbxUoJ+n68^4-1-@a9~hJOO5`iYiqhed5q6oiytB~JJ;X`znbcRi1Y_>GR!zHUf& zRBFp>e&KdRUg5kg&m-x~)<>MuPfjlK@4Mey$=}=}_J;jY({%ZcH=?Q=*StR6+1ol{ zyQ9-Z*Ke10SlqvF{rHD->f_1pm=c#4u-LC*U=q0BWb>($kwt;wXS@TKonZq53)mar zgoDW}daW>9YV(7w%unQ1?oOI`_vI4%B~P^{+Cb8*r&y}3c6Oe<;AUG(PYX zQ>?{|QU|2XlC#zw*xTsjmvb;S&E@aLw^x~z6yK;FH=liF`^vI-?kDceISv!fpX*<$ z^ZxG1E!-z&+zF{nZhW(rOW@_bWqH?j2(*Mno!~9}TOe#66y@la&>1j+r83#myXr23 zQ}z10lOJ)ONV@(mcw>I>#`9Uz4(*uT#<#pe`Keh-`qi`kW&Cq4FdXz&cEAw^Oacu% buGKLrHry~_lL+_^D&{<0{an^LB{Ts53uR|d literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-create-test-suite-aut.png b/doc/qtcreator/images/qtcreator-squish-create-test-suite-aut.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c90866549118b65fbfb577d18e0c192e76bdb6 GIT binary patch literal 8685 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-create-test-suite-location.png b/doc/qtcreator/images/qtcreator-squish-create-test-suite-location.png new file mode 100644 index 0000000000000000000000000000000000000000..601bdd7b2274002a74726ff1854ab1d7b2828f3f GIT binary patch literal 9447 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 l9wR!*m literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-create-test-suite.png b/doc/qtcreator/images/qtcreator-squish-create-test-suite.png new file mode 100644 index 0000000000000000000000000000000000000000..61fdd85a72a9b953435e79a6a6e3de8dd6228da7 GIT binary patch literal 10932 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 A;{X5v literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-debugging-view.png b/doc/qtcreator/images/qtcreator-squish-debugging-view.png new file mode 100644 index 0000000000000000000000000000000000000000..32572eaf765996b9a913d44bfa3d09fd619b3df6 GIT binary patch literal 1438 zcmeAS@N?(olHy`uVBq!ia0y~yU|P?>z#z!M%)r2KTkzN*MGScy`6!9g~8LsF(l*O z+gbnPFF8mY4>USixT$f*%&D32x`#JCE%*9$sLLoa^O#BZAGYp-zyIyO*p%~_Srj;b zTv|GRdXB}hjnC(OpZEKYV}nfa`I9R>ie7xNkA0D&uxXEs#lr5&j#ckgMRi?@opkb} zQ%Olu*~H>GAI?wzXQ9Fw$GYAw^vki=PCe)2-&|~-cyL8|oU>n?bJO+zbHk5rI;HtN z`)}mjx8cSzG2grARm_!tQ2$}=?tgk)RM$sxm(2KhV@lS{Rh20{v-B)pv#eiruqs?r zwPvP+`T9@aMJC?=eE-PftvmMTGvA(deWs(+qd9KrZGIENcii>4ezWxdE|Hram7Ref zZb`;HUF$Mgrl3Gq=7yGsUR<>5jKkWGvOu~z1)b8^-wN(4tGQ_UX?L{zyczLI|Nb;Q z_`2tVSM{#Yx;d^{&zG;AJE8l!$GHUS)q9c>CVx0!FOm86-&Ov~(*>p?DW49!?tS?% zViMEqYj+$juij%*U#oD-t#<0?jLeYJMpL`21L{(}{e6F}O3FI(!J%UsU-P7In&~sQ zd^b65^hP35dV_AQ$eyxe`xhxTBsEALj!9&@AiczR!d9z(fm^&KhOA|G_cTr1TyjIg zBd<5SO8!f_H|H1b+_n4@E~ayze3IfUySIFEX6;_%W0rL$>n$#5sI8ti^>;X9)>N+b z0`t;td=;(KU9J>w=w{^*nzUxi#LJA42eZ>FTJ4UBIQU8IJdjsqEqt@$rbSQtHzyUI zd!|0~udd~Hn5Oia^U3~WtLK}J3KND2($cm@Nf+`dvUYh@(0V3KkG(m=w`1KT`%w^@mSx)ZH>`0 z@;T$I4{M*B6k%jyrGMo^^(m zRr8f!-o3Q)Q`NJ)*oDP2mk9r;6%*XU#TnPyQnBYB>mAMZu0`5>g$xV~44$rjF6*2U FngEG-ww?e0 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-locals.png b/doc/qtcreator/images/qtcreator-squish-locals.png new file mode 100644 index 0000000000000000000000000000000000000000..7968d75432e0410c47715ea520107f2ec69a8166 GIT binary patch literal 1588 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 HDWM4fM#aH5 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-preferences.png b/doc/qtcreator/images/qtcreator-squish-preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..02a5b8f284ff46df8c1d6e50cd1b23ffa26ae993 GIT binary patch literal 7325 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 DyB64w literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-server-settings-add-attachable-aut.png b/doc/qtcreator/images/qtcreator-squish-server-settings-add-attachable-aut.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae743706db0f084a99cfbf99e89618c58f4a5ae GIT binary patch literal 3943 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 HoD!M<(`iU? literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-symbolic-names.png b/doc/qtcreator/images/qtcreator-squish-symbolic-names.png new file mode 100644 index 0000000000000000000000000000000000000000..30427675f04c87e144d432f782416eee03ed1a70 GIT binary patch literal 13392 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-view-open-squish-suites.png b/doc/qtcreator/images/qtcreator-squish-view-open-squish-suites.png new file mode 100644 index 0000000000000000000000000000000000000000..b473e4f6da935c47c1b84ca1133cf98cd172ed08 GIT binary patch literal 7104 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 V&XtW)9t;c&44$rjF6*2UngC`ag$4is literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-squish-view.png b/doc/qtcreator/images/qtcreator-squish-view.png new file mode 100644 index 0000000000000000000000000000000000000000..1165c642128f68751d6a7475a3b5fc137143f52f GIT binary patch literal 3405 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 Jvd$@?2>^8pwYLBO literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/howto/creator-only/creator-autotest.qdoc b/doc/qtcreator/src/howto/creator-only/creator-autotest.qdoc index 6069a7eb5a2..68fd18875c6 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-autotest.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-autotest.qdoc @@ -4,7 +4,7 @@ /*! \previouspage creator-ctf-visualizer.html \page creator-autotest.html - \nextpage creator-advanced.html + \nextpage creator-squish.html \title Running Autotests diff --git a/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc b/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc new file mode 100644 index 00000000000..85d7e273e78 --- /dev/null +++ b/doc/qtcreator/src/howto/creator-only/creator-squish.qdoc @@ -0,0 +1,330 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \previouspage creator-autotest.html + \page creator-squish.html + \nextpage creator-advanced.html + + \title Using Squish + + \l{https://doc.froglogic.com/squish/latest/}{Squish} is an automated GUI + testing framework for testing Android, iOS, Java, Qt, Tk, Windows, and + XView applications, as well as HTML-based web applications running in + browsers, such as Apple Safari, Mozilla Firefox, Google Chrome, and + Microsoft Internet Explorer and Edge. + + The experimental Squish plugin integrates Squish into \QC. You can: + + \list + \li Open existing Squish test suites. + \li Create new test suites and test cases. + \li Record test cases (in a very limited way compared to what you can do + inside the Squish IDE). + \li Use Squish Runner and Server to run test suites or cases and view + the results in the \uicontrol Squish \l{Viewing Output}{output}. + \li Set breakpoints before running tests to stop at certain locations and + inspect the local variables, similarly to when debugging a test. + \endlist + + When running test suites or cases, the Squish Runner instructs the Squish + Server to start the application under test (AUT). The server can be running + on multiple machines, and the AUT can be located on a different path on each + of them. Therefore, you must either map AUTs to their corresponding paths or + specify AUT paths to search from in the server settings. + + In addition, you can test an already running application by attaching to it. + This enables you to test your application using a Squish Server running on + another machine. However, you can have only one server attached to your + application at a time. Also, the attached application is not closed when the + test case is completed. + + To use the plugin, you must download and install Squish, create a connection + to the Squish Server, and specify AUTs to run. + + \section1 Enabling the Squish Plugin + + To enable the Squish plugin: + + \list 1 + \li Select \uicontrol Help > \uicontrol {About Plugins} > + \uicontrol Utilities > \uicontrol Squish to enable the plugin. + \li Select \uicontrol {Restart Now} to restart \QC and load the plugin. + \endlist + + \section1 Specifying a Squish Server + + To specify a Squish Server to run: + + \list 1 + \li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Squish. + \image qtcreator-squish-preferences.png "Squish general preferences" + \li In the \uicontrol {Squish path} field, specify the path to the Squish + installation directory. + \li In the \uicontrol {License path} field, specify the path to your + Squish license file if it is not located in your home folder. For + example, if you have a global installation with several users, where + the license key is installed in the global folder. + \li Select the \uicontrol {Local server} check box to use a locally + installed \c {squishserver.exe}. To use a server running in another + machine, deselect the check box and specify the server address in the + \uicontrol {Server host} field and the port number in the + \uicontrol {Server port} field. If no port is specified, \QC starts + \c squishserver in a way that enables it to automatically select an + open port. + \li Select the \uicontrol {Verbose log} check box to include additional + logging levels in the log output. + \li Select the \uicontrol {Minimize IDE} check box to automatically + minimize \QC when running or recording test cases. + \endlist + + \section1 Specifying AUTs + + To specify applications to test using Squish, select \uicontrol {Tools} > + \uicontrol {Squish} > \uicontrol {Server Settings}. + + \image qtcreator-squish-server-settings.png "Squish Server Settings" + + \section2 Mapping AUTs + + To specify the path to an AUT to run, select \uicontrol {Mapped AUTs} > + \uicontrol Add and locate the AUT. + + The Squish server checks whether the name of the AUT to run is mapped to a + path and starts the AUT using the mapped path. This way, it does not need + to search from all the specified AUT paths. + + Mapping AUTs prevents the server from accidentally executing the wrong AUT + if two different executables have the same name, as the server executes the + first matching AUT it finds in the \uicontrol {AUT Paths} list. + + To change the path to the selected AUT, select \uicontrol {Edit}. + + To remove the mapping to the selected AUT, select \uicontrol {Remove}. + + \section2 Specifying AUT Paths + + To specify a path to search AUTs from, select \uicontrol {AUT Paths} > + \uicontrol Add. + + The Squish Server searches for the executable to run from the specified + AUT paths and runs the first one with the specified name that it finds in + any path. + + To change the selected AUT path, select \uicontrol {Edit}. + + To remove the selected AUT path, select \uicontrol {Remove}. + + \section2 Adding Attachable AUTs + + To specify the path to a running AUT, select \uicontrol {Attachable AUTs} > + \uicontrol Add. In the \uicontrol {Add Attachable AUT} dialog, specify a + connection to a running application to register an attachable AUT. + + \image qtcreator-squish-server-settings-add-attachable-aut.png "Add Attachable AUT dialog" + + To change the connection to the selected AUT, select \uicontrol {Edit}. + + To remove the connection to the selected AUT, select \uicontrol {Remove}. + + \section1 Managing Test Suites and Cases + + You can manage Squish test suites and cases in the \uicontrol Squish + \l {Working with Sidebars}{view}. + + \image qtcreator-squish-view.png "Squish sidebar view" + + To show existing test suites in \uicontrol {Test Suites}, select + \uicontrol {Open Squish Suites} in the context menu. + + \image qtcreator-squish-view-open-squish-suites.png "Open Squish Test Suites dialog" + + You can open the \uicontrol {Squish Test Suite} wizard for creating a new + test suite by selecting \uicontrol {Create New Test Suite} in the context + menu. + + To add a test case to a test suite, select it and then select + \uicontrol {Add New Test Case} in the context menu. + + To close all test suites, select \uicontrol {Close All Test Suites} in the + context menu. + + To add a shared folder to \uicontrol {Shared Folders}, select + \uicontrol {Add Shared Folder} in the context menu. To remove all + shared folders, select \uicontrol {Remove All Shared Folders}. + + Double-click a test suite in \uicontrol {Test Suites} to open the + \c {suite.conf} configuration file for editing. + + \section2 Creating Test Suites + + To create a new test suite: + + \list 1 + \li Select \uicontrol File > \uicontrol {New Project} + > \uicontrol {Squish} > \uicontrol {Squish Test Suite} > + \uicontrol Choose. + \image qtcreator-squish-create-test-suite.png "Create Squish Test Suite wizard" + \li On the \uicontrol {Location} page, in \uicontrol {Test Suite Name}, + enter a name for the test suite. + \image qtcreator-squish-create-test-suite-location.png "Location page" + \li In \uicontrol {Test Suite folder's parent folder}, enter the path to + the folder to create the test suite folder, and then select + \uicontrol Next. + \li On the \uicontrol Setup page, select the GUI toolkit used by the AUT, + and then select \uicontrol Next. + \image qtcreator-squish-create-test-suite-setup.png "Setup page" + Currently, only desktop GUI toolkits are supported. + \li On the \uicontrol {Script Language} page, select the scripting + language to use for the test suite's test script, and then select + \uicontrol Next. + \image qtcreator-squish-create-test-suite-language.png "Languages page" + \li On the \uicontrol {AUT} page, select the AUT to test, and then select + \uicontrol Next. + \image qtcreator-squish-create-test-suite-aut.png "AUT page" + \li On the \uicontrol {Summary} page review the test suite settings, and + then select \uicontrol Finish to create the test suite. + \endlist + + The test suite is listed in \uicontrol {Test Suites} in the \uicontrol Squish + sidebar view. + + \section2 Recording Test Cases + + Squish records tests using the scripting language that you specified for the + test suite. Recordings are made into existing test cases. + + In \uicontrol {Test Suites}, select the \inlineimage icons/recordfill.png + (\uicontrol {Record Test Case}) button next to the test case name. The AUT + that you selected for the test suite is displayed and you can start recording + the test case. + + \image qtcreator-squish-control-bar-record-test-case.png "Squish control bar for recording test cases" + + When you are done, select the \inlineimage icons/stop_small.png + (\uicontrol {Stop}) button in the \uicontrol {Control Bar}. + + You can edit recorded test scripts or copy parts of them into manually + created test scripts. + + \image qtcreator-squish-test-script-edit.png "A test script open in the editor" + + \section2 Running Test Suites + + You can run a recorded test case to have Squish repeat all the actions that + you applied when recording the test, but without the pauses that humans are + prone to but which computers don't need. + To run a test case, select the \inlineimage icons/run_small.png + (\uicontrol {Run}) button next to the test case in \uicontrol {Test Suites}. + + \image qtcreator-squish-control-bar-run-test-case.png "Squish control bar for running test cases" + + While the test is running, you can view test results as well as interrupt and + stop tests in the \uicontrol {Control Bar}. + + \section2 Mapping Symbolic Names + + When Squish records a test, it uses \e {symbolic names} to identify the UI + elements. Symbolic names are stored in an object map that can be either + text-based or script-based. Text-based symbolic names are plain strings + starting with a colon (:), whereas script-based symbolic names are script + variables. + + Squish generates symbolic names programmatically, but you can use them in + hand-written code, or when you edit test cases or use extracts from recorded + test cases. + + Symbolic names have one major advantage over real names: if a property + that a real name depends on changes in the AUT, the real name becomes + invalid, and you must update all occurrences of it in test scripts. + When using symbolic names, you only need to update the real name in the + object map. You do not need to make any changes to the tests. + + To edit the object map of a test suite, select the + \inlineimage icons/objectsmap.png + button next to the test suite in \uicontrol {Test Suites}. + + \image qtcreator-squish-symbolic-names.png "Symbolic Names view" + + You can filter the symbolic names in the \uicontrol {Symbolic Names} view. + To edit a symbolic name or the names or values of its properties, + double-click the name or value in the view and enter a new one. + + To add a new symbolic name, select \uicontrol New. Double-click the + placeholder for the name and enter a new name. Then select \uicontrol New + next to \uicontrol Properties to enter properties for the symbolic name. + + To remove the selected symbolic name or property, select \uicontrol Remove. + + To jump to the symbolic name associated to the selected + property, select \inlineimage icons/jumpto.png + . + + \section2 Inspecting Local Variables + + If you set breakpoints in the test code before running the test, the test + execution is automatically interrupted when a breakpoint is hit. You can + inspect the contents of local variables in the \uicontrol {Squish Locals} + view. + + \image qtcreator-squish-locals.png "Squish Locals view" + + Use the \uicontrol {Step Into}, \uicontrol {Step Over}, and + \uicontrol {Step Out} buttons in the \uicontrol Squish debugging + view to step through the code. + + \image qtcreator-squish-debugging-view.png "Squish debugging view" + + \section2 Specifying Settings for Running Tests + + To specify settings for running tests, select \uicontrol Tools > + \uicontrol Squish > \uicontrol {Server Settings}: + + \list + \li In the \uicontrol {Maximum startup time} field, set the maximum time + to wait for the AUT to start before throwing an error. + \li In the \uicontrol {Maximum response time} field, set the maximum time + to wait for the AUT to respond before throwing an error. + \li In the \uicontrol {Maximum post-mortem wait time} field, set the + maximum time to wait after the main AUT has exited. This is useful + for AUTs invoked through launcher applications, such as shell scripts + or batch files. + \li Select the \uicontrol {Animate mouse cursor} check box to to animate + the mouse cursor when playing back a test. + \endlist + + \section1 Viewing Test Results + + Squish uses compare, verify, and exception functions to record the results of + tests applied to a running AUT in the test log as \e {passes} or \e {fails}. + In addition, any kind of test results can be recorded in the test log. + + You can view the test log in the \uicontrol Squish output, + \uicontrol {Test Results} tab. + + \image qtcreator-squish-output-test-results.png "Test Results output" + + The \uicontrol Result column displays the time when each test run started + and finished, log information and warnings, and test result status: + + \list + \li \uicontrol Pass - The test passed. + \li \uicontrol Fail - The test failed. + \li \uicontrol ExpectedFail - The test failed, as expected. For example, + a known bug in the AUT caused a comparison or verification to fail. + \li \uicontrol UnexpectedPass - The test passed unexpectedly. For + example, a comparison or verification succeeded even though it was + expected to fail. + \endlist + + The \uicontrol Message column displays log messages and information about + the type of the operation that was performed: comparison, verification, or + exception. + + \section1 Viewing Squish Runner and Server Logs + + You can view the Squish Runner and Server logs in the \uicontrol Squish + output, \uicontrol {Runner/Server Log} tab. + + \image qtcreator-squish-output-runner-server-log.png "Runner and Server Log output" +*/ diff --git a/doc/qtcreator/src/overview/creator-only/creator-advanced.qdoc b/doc/qtcreator/src/overview/creator-only/creator-advanced.qdoc index 08be6d3130e..3dfe546f60b 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-advanced.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-advanced.qdoc @@ -8,7 +8,7 @@ // ********************************************************************** /*! - \previouspage creator-autotest.html + \previouspage creator-squish.html \page creator-advanced.html \nextpage creator-os-supported-platforms.html diff --git a/doc/qtcreator/src/overview/creator-only/creator-testing.qdoc b/doc/qtcreator/src/overview/creator-only/creator-testing.qdoc index a5f88bcbc0c..0f704f59bcf 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-testing.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-testing.qdoc @@ -37,9 +37,13 @@ \li \l{Running Autotests} - You can create, build and run Qt tests, Qt Quick tests, Google + Create, build and run Qt tests, Qt Quick tests, Google tests, and Boost tests using \QC. + \li \l{Using Squish} + + Map AUTs to \QC and run Squish test suites and cases from it. + \endlist */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc index c4ae027d2e3..8b2f050adc8 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc @@ -208,6 +208,11 @@ \li Imports an existing project that does not use any of the supported build systems: qmake, Qbs, CMake, or Autotools. This enables you to use \QC as a code editor. + \row + \li Squish + \li Squish Test Suite + \li Creates a new \l {Using Squish}{Squish test suite}. + \endtable To create a new project, select \uicontrol File > \uicontrol{New Project} and diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 17aa8fdf4a9..7a491e0312c 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -187,6 +187,7 @@ \li \l{Visualizing Chrome Trace Events} \endlist \li \l{Running Autotests} + \li \l{Using Squish} \endlist \li \l{Advanced Use} \list diff --git a/doc/qtcreator/src/qtcreator.qdoc b/doc/qtcreator/src/qtcreator.qdoc index a0050fe74d2..fe7e2c788d1 100644 --- a/doc/qtcreator/src/qtcreator.qdoc +++ b/doc/qtcreator/src/qtcreator.qdoc @@ -87,6 +87,7 @@ \li \l{Debugging} \li \l{Analyzing Code} \li \l{Running Autotests} + \li \l{Using Squish} \endlist \li \b {\l{Advanced Use}} \list diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index bd9285df447..dd429ef8ac2 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -379,9 +379,13 @@ \li \uicontrol{Version Control} \if defined(qtcreator) - \li \uicontrol{Test Results} + \li \l{Running Autotests}{Test Results} + + \li \l{Using Squish}{Squish} test results and Squish Server and + Runner logs \li \uicontrol {To-Do Entries} + \endif \endlist From 729805e7fd0522426718da5d73c636a681c9c290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Wed, 5 Oct 2022 22:33:07 +0200 Subject: [PATCH 035/104] Git: Restore object names for dialog Amends ffcf85958feaae416fc5b6cb5aed0c22695cb901 Change-Id: Ia48b114137d722df5f72add818d5729adff94110 Reviewed-by: Christian Stenger --- src/plugins/git/changeselectiondialog.cpp | 4 ++++ tests/system/objects.map | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/git/changeselectiondialog.cpp b/src/plugins/git/changeselectiondialog.cpp index 9d274942d25..d4e9587a85a 100644 --- a/src/plugins/git/changeselectiondialog.cpp +++ b/src/plugins/git/changeselectiondialog.cpp @@ -42,15 +42,18 @@ ChangeSelectionDialog::ChangeSelectionDialog(const FilePath &workingDirectory, I resize(550, 350); setWindowTitle(tr("Select a Git Commit")); + setObjectName("Git.ChangeSelectionDialog"); m_workingDirectoryChooser = new PathChooser(this); m_changeNumberEdit = new CompletingLineEdit(this); + m_changeNumberEdit->setObjectName("changeNumberEdit"); m_changeNumberEdit->setText(tr("HEAD")); m_changeNumberEdit->setFocus(); m_changeNumberEdit->selectAll(); m_detailsText = new QPlainTextEdit(this); + m_detailsText->setObjectName("detailsText"); m_detailsText->setUndoRedoEnabled(false); m_detailsText->setLineWrapMode(QPlainTextEdit::NoWrap); m_detailsText->setReadOnly(true); @@ -63,6 +66,7 @@ ChangeSelectionDialog::ChangeSelectionDialog(const FilePath &workingDirectory, I m_revertButton = new QPushButton(tr("&Revert")); m_cherryPickButton = new QPushButton(tr("Cherry &Pick")); m_showButton = new QPushButton(tr("&Show")); + m_showButton->setObjectName("showButton"); m_workingDirectoryChooser->setExpectedKind(PathChooser::ExistingDirectory); m_workingDirectoryChooser->setPromptDialogTitle(tr("Select Git Directory")); diff --git a/tests/system/objects.map b/tests/system/objects.map index 5fbccd28b03..50733e2adfc 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -184,7 +184,7 @@ :Select a Git Commit.changeNumberEdit_Utils::CompletingLineEdit {name='changeNumberEdit' type='Utils::CompletingLineEdit' visible='1' window=':Select a Git Commit_Git::Internal::ChangeSelectionDialog'} :Select a Git Commit.detailsText_QPlainTextEdit {name='detailsText' type='QPlainTextEdit' visible='1' window=':Select a Git Commit_Git::Internal::ChangeSelectionDialog'} :Select a Git Commit.workingDirectoryEdit_QLineEdit {type='Utils::FancyLineEdit' unnamed='1' visible='1' window=':Select a Git Commit_Git::Internal::ChangeSelectionDialog'} -:Select a Git Commit_Git::Internal::ChangeSelectionDialog {name='Git__Internal__ChangeSelectionDialog' type='Git::Internal::ChangeSelectionDialog' visible='1' windowTitle='Select a Git Commit'} +:Select a Git Commit_Git::Internal::ChangeSelectionDialog {name='Git.ChangeSelectionDialog' type='Git::Internal::ChangeSelectionDialog' visible='1' windowTitle='Select a Git Commit'} :Select signal.signalList_QTreeView {container=':Go to slot.Select signal_QGroupBox' name='signalList' type='QTreeView' visible='1'} :Send to Codepaster.Cancel_QPushButton {text='Cancel' type='QPushButton' unnamed='1' visible='1' window=':Send to Codepaster_CodePaster::PasteView'} :Send to Codepaster.Description:_QLabel {name='descriptionLabel' text='Description:' type='QLabel' visible='1' window=':Send to Codepaster_CodePaster::PasteView'} From faa38e5eb80f01c5df65dc678ab018e784f54df1 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 13 Sep 2022 15:26:11 +0200 Subject: [PATCH 036/104] Locator: Show actions shortcuts in locator widget Change-Id: Ib4d1e55e6335e691ee9ee85735e69a86b9276f15 Reviewed-by: Reviewed-by: Eike Ziller --- src/libs/utils/highlightingitemdelegate.cpp | 19 +++++++++++++++++-- src/libs/utils/highlightingitemdelegate.h | 4 +++- src/plugins/coreplugin/actionsfilter.cpp | 1 + .../coreplugin/locator/ilocatorfilter.h | 2 ++ .../coreplugin/locator/locatorwidget.cpp | 10 ++++++++++ 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/libs/utils/highlightingitemdelegate.cpp b/src/libs/utils/highlightingitemdelegate.cpp index 306ee22e086..7282578c81f 100644 --- a/src/libs/utils/highlightingitemdelegate.cpp +++ b/src/libs/utils/highlightingitemdelegate.cpp @@ -139,8 +139,24 @@ void HighlightingItemDelegate::drawText(QPainter *painter, QVector searchTermLengths = index.model()->data(index, int(HighlightingItemRole::Length)).value>(); + QVector formats; + + const QString extraText + = index.model()->data(index, int(HighlightingItemRole::DisplayExtra)).toString(); + if (!extraText.isEmpty()) { + if (!option.state.testFlag(QStyle::State_Selected)) { + int start = text.length(); + auto dataType = int(HighlightingItemRole::DisplayExtraForeground); + const QColor highlightForeground = index.model()->data(index, dataType).value(); + QTextCharFormat extraFormat; + extraFormat.setForeground(highlightForeground); + formats.append({start, int(extraText.length()), extraFormat}); + } + text.append(extraText); + } + if (searchTermStarts.isEmpty()) { - drawDisplay(painter, option, rect, text.replace('\t', m_tabString), {}); + drawDisplay(painter, option, rect, text.replace('\t', m_tabString), formats); return; } @@ -175,7 +191,6 @@ void HighlightingItemDelegate::drawText(QPainter *painter, highlightFormat.setForeground(highlightForeground); highlightFormat.setBackground(highlightBackground); - QVector formats; for (int i = 0, size = searchTermStarts.size(); i < size; ++i) formats.append({searchTermStarts.at(i), searchTermLengths.at(i), highlightFormat}); diff --git a/src/libs/utils/highlightingitemdelegate.h b/src/libs/utils/highlightingitemdelegate.h index 8b9c529ad74..363fee70da8 100644 --- a/src/libs/utils/highlightingitemdelegate.h +++ b/src/libs/utils/highlightingitemdelegate.h @@ -16,7 +16,9 @@ enum class HighlightingItemRole { Length, Foreground, Background, - User + User, + DisplayExtra, + DisplayExtraForeground }; class QTCREATOR_UTILS_EXPORT HighlightingItemDelegate : public QItemDelegate diff --git a/src/plugins/coreplugin/actionsfilter.cpp b/src/plugins/coreplugin/actionsfilter.cpp index 68a48c6fdfa..3c3153cdd42 100644 --- a/src/plugins/coreplugin/actionsfilter.cpp +++ b/src/plugins/coreplugin/actionsfilter.cpp @@ -245,6 +245,7 @@ void ActionsFilter::collectEntriesForCommands() const QStringList path = identifier.split(QLatin1Char('.')); const ActionFilterEntryData data{action, command->id()}; LocatorFilterEntry filterEntry(this, text, QVariant::fromValue(data), action->icon()); + filterEntry.displayExtra = command->keySequence().toString(QKeySequence::NativeText); if (path.size() >= 2) filterEntry.extraInfo = path.mid(0, path.size() - 1).join(" > "); updateEntry(action, filterEntry); diff --git a/src/plugins/coreplugin/locator/ilocatorfilter.h b/src/plugins/coreplugin/locator/ilocatorfilter.h index cc7a2124ed3..c8c558b7bc4 100644 --- a/src/plugins/coreplugin/locator/ilocatorfilter.h +++ b/src/plugins/coreplugin/locator/ilocatorfilter.h @@ -79,6 +79,8 @@ struct LocatorFilterEntry ILocatorFilter *filter = nullptr; /* displayed string */ QString displayName; + /* extra information displayed in parentheses and light-gray next to display name (optional)*/ + QString displayExtra; /* extra information displayed in light-gray in a second column (optional) */ QString extraInfo; /* additional tooltip */ diff --git a/src/plugins/coreplugin/locator/locatorwidget.cpp b/src/plugins/coreplugin/locator/locatorwidget.cpp index 71c0d5f90ce..08835179fac 100644 --- a/src/plugins/coreplugin/locator/locatorwidget.cpp +++ b/src/plugins/coreplugin/locator/locatorwidget.cpp @@ -213,6 +213,16 @@ QVariant LocatorModel::data(const QModelIndex &index, int role) const } break; } + case int(HighlightingItemRole::DisplayExtra): { + if (index.column() == LocatorFilterEntry::HighlightInfo::DisplayName) { + LocatorFilterEntry &entry = mEntries[index.row()]; + if (!entry.displayExtra.isEmpty()) + return QString(" (" + entry.displayExtra + ')'); + } + break; + } + case int(HighlightingItemRole::DisplayExtraForeground): + return QColor(Qt::darkGray); case int(HighlightingItemRole::Background): return mBackgroundColor; case int(HighlightingItemRole::Foreground): From f8f94a0ce1f364b19c78291f75ef060ae4f89997 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 25 Aug 2022 09:05:53 +0200 Subject: [PATCH 037/104] QmlJSTools: Convert to using Tr::tr Change-Id: I40595e560fb2499226bd2c914a0b78ed68f830ab Reviewed-by: hjk --- share/qtcreator/translations/qtcreator_cs.ts | 38 ++----------------- share/qtcreator/translations/qtcreator_da.ts | 12 ------ share/qtcreator/translations/qtcreator_de.ts | 9 ++--- share/qtcreator/translations/qtcreator_fr.ts | 35 ++--------------- share/qtcreator/translations/qtcreator_hr.ts | 13 +------ share/qtcreator/translations/qtcreator_ja.ts | 14 +------ share/qtcreator/translations/qtcreator_pl.ts | 9 ++--- share/qtcreator/translations/qtcreator_ru.ts | 12 ------ share/qtcreator/translations/qtcreator_sl.ts | 17 +-------- share/qtcreator/translations/qtcreator_uk.ts | 33 +--------------- .../qtcreator/translations/qtcreator_zh_CN.ts | 25 +----------- .../qtcreator/translations/qtcreator_zh_TW.ts | 16 +------- .../qmljstools/qmljscodestylesettingspage.cpp | 5 ++- .../qmljscodestylesettingswidget.cpp | 6 +-- .../qmljstools/qmljsfunctionfilter.cpp | 4 +- src/plugins/qmljstools/qmljstoolsplugin.cpp | 13 ++++--- src/plugins/qmljstools/qmljstoolssettings.cpp | 9 +++-- 17 files changed, 42 insertions(+), 228 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_cs.ts b/share/qtcreator/translations/qtcreator_cs.ts index 31bbd36f7af..ef0a6913417 100644 --- a/share/qtcreator/translations/qtcreator_cs.ts +++ b/share/qtcreator/translations/qtcreator_cs.ts @@ -36343,7 +36343,7 @@ a vlastností součástek QML přímo. - QmlJSTools::Internal::FunctionFilter + QmlJSTools Methods and functions Metody a funkce @@ -36360,16 +36360,10 @@ a vlastností součástek QML přímo. QML Functions Funkce QML - - - QmlJSTools::Internal::ModelManager Indexing Rejstříkování - - - QmlJSTools::Internal::PluginDumper Type dump of QML plugin in %1 failed. Errors: @@ -36492,9 +36486,6 @@ Please build the debugging helpers on the Qt version options page. Pomocný program ke sdělení informací o typu přídavného modulu C++ se nepodařilo najít. Vytvořte, prosím, součástky pomocné knihovny pro výstup dat o ladění na stránce pro nastavení verzí Qt. - - - QmlJSTools Code Style Styl kódování @@ -36503,9 +36494,6 @@ Vytvořte, prosím, součástky pomocné knihovny pro výstup dat o ladění na Qt Quick Qt Quick - - - QmlJSTools::Internal::QmlJSToolsPlugin &QML/JS &QML/JS @@ -36514,9 +36502,6 @@ Vytvořte, prosím, součástky pomocné knihovny pro výstup dat o ladění na Reset Code Model Nastavit model kódu znovu - - - QmlJSTools::QmlJSToolsSettings Global Qt Quick Settings @@ -51783,7 +51768,7 @@ Vzdálený chybový výstup byl: '%1' - QmlJSTools::FindExportedCppTypes + QmlJSTools The type will only be available in Qt Creator's QML editors when the type name is a string literal Tento typ bude v editoru QML Qt Creatoru viditelný jen tehdy, když je název typu řetězec znaků tvořený písmeny (literal) @@ -54958,7 +54943,7 @@ Commit now? - QmlJSTools::Internal::QmlConsoleEdit + QmlJSTools Cu&t Vyj&mout @@ -54979,16 +54964,10 @@ Commit now? C&lear Sma&zat - - - QmlJSTools::Internal::QmlConsoleModel Can only evaluate during a QML debug session. Vyhodnocovat lze jen během sezení ladění QML. - - - QmlJSTools::Internal::QmlConsolePane Show debug, log, and info messages. Ukázat ladění, záznamy a informační zprávy. @@ -54997,21 +54976,10 @@ Commit now? QML/JS Console Konzole QML/JS - - - QmlJSTools::Internal::QmlConsoleView - - &Copy - &Kopírovat - &Show in Editor &Ukázat v editoru - - C&lear - Sma&zat - QmlApplicationWizard diff --git a/share/qtcreator/translations/qtcreator_da.ts b/share/qtcreator/translations/qtcreator_da.ts index d1484ae1368..11295348df2 100644 --- a/share/qtcreator/translations/qtcreator_da.ts +++ b/share/qtcreator/translations/qtcreator_da.ts @@ -32093,9 +32093,6 @@ Se "Checking Code Syntax"-dokumentation for mere information.Qt Quick Qt Quick - - - QmlJSTools::FindExportedCppTypes The type will only be available in the QML editors when the type name is a string literal Typen er kun tilgængelig i QML-redigeringerne når typenavnet er en streng-literal @@ -32112,16 +32109,10 @@ QML-redigeringen skal kende til en sandsynlig URI. must be a string literal to be available in the QML editor skal være en streng-literal for at være tilgængelig i QML-redigeringen - - - QmlJSTools::Internal::FunctionFilter QML Functions QML-funktioner - - - QmlJSTools::Internal::QmlJSToolsPlugin &QML/JS &QML/JS @@ -32130,9 +32121,6 @@ QML-redigeringen skal kende til en sandsynlig URI. Reset Code Model Nulstil kodemodel - - - QmlJSTools::QmlJSToolsSettings Global Settings diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 3f62d54795a..b8c545084c1 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -12972,7 +12972,7 @@ Soll es noch einmal versucht werden? - QmlJSTools::Internal::FunctionFilter + QmlJSTools QML Functions QML-Funktionen @@ -15258,9 +15258,6 @@ Bei vollständiger Cache-Simulation werden weitere Ereigniszähler aktiviert: Qt Quick Qt Quick - - - QmlJSTools::QmlJSToolsSettings Global Settings @@ -16026,7 +16023,7 @@ Zusätzlich wird die Verbindung zum Gerät getestet. - QmlJSTools::Internal::QmlJSToolsPlugin + QmlJSTools &QML/JS &QML/JS @@ -19908,7 +19905,7 @@ gehören nicht zu den verifizierten Remotes in %3. Anderes Verzeichnis angeben?< - QmlJSTools::FindExportedCppTypes + QmlJSTools The type will only be available in the QML editors when the type name is a string literal Dieser Typ wird im QML Editor nur sichtbar sein, wenn der Typname ein Zeichenketten-Literal ist diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index 477a51b6798..2f5ad8d111b 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -35669,7 +35669,7 @@ QML component instance objects and properties directly. - QmlJSTools::Internal::FunctionFilter + QmlJSTools Functions Fonctions @@ -35690,9 +35690,6 @@ QML component instance objects and properties directly. QML Functions Fonctions QML - - - QmlJSTools::Internal::ModelManager Indexing Indexation @@ -35701,9 +35698,6 @@ QML component instance objects and properties directly. Qml import scan Analyse de l'import Qml - - - QmlJSTools::Internal::PluginDumper Type dump of QML plugin in %1 failed. Errors: @@ -39172,9 +39166,6 @@ These files are preserved. Code Style Style de code - - - QmlJSTools::Internal::QmlJSToolsPlugin &QML/JS &QML/JS @@ -39183,9 +39174,6 @@ These files are preserved. Reset Code Model Restaurer le modèle de code - - - QmlJSTools::QmlJSToolsSettings Global Qt Quick Settings @@ -50203,7 +50191,7 @@ Remote stderr was: %1 - QmlJSTools::FindExportedCppTypes + QmlJSTools The type will only be available in Qt Creator's QML editors when the type name is a string literal Le type sera disponible dans l'éditeur QML de Qt Creator lorsque le nom du type est une chaîne de caractères @@ -54625,7 +54613,7 @@ Distant : %4 - QmlJSTools::Internal::QmlConsoleEdit + QmlJSTools Cu&t Co&uper @@ -54646,16 +54634,10 @@ Distant : %4 C&lear &Effacer - - - QmlJSTools::Internal::QmlConsoleModel Can only evaluate during a QML debug session. Ne peut être évalué que dans une session de débogage QML. - - - QmlJSTools::Internal::QmlConsolePane Show debug, log, and info messages. Montrer les messages de débogage, de log et d'information. @@ -54664,21 +54646,10 @@ Distant : %4 QML/JS Console Console QML/JS - - - QmlJSTools::Internal::QmlConsoleView - - &Copy - &Copier - &Show in Editor Montrer dans l'éditeur (&S) - - C&lear - &Effacer - QmlApplicationWizard diff --git a/share/qtcreator/translations/qtcreator_hr.ts b/share/qtcreator/translations/qtcreator_hr.ts index aa0101eeb40..0daf6ffa57c 100644 --- a/share/qtcreator/translations/qtcreator_hr.ts +++ b/share/qtcreator/translations/qtcreator_hr.ts @@ -12156,7 +12156,7 @@ will also disable the following plugins: - QmlJSTools::FindExportedCppTypes + QmlJSTools The type will only be available in the QML editors when the type name is a string literal @@ -35020,14 +35020,11 @@ ID oznake moraju započeti malim slovom. - QmlJSTools::Internal::FunctionFilter + QmlJSTools QML Functions - - - QmlJSTools Code Style @@ -35036,9 +35033,6 @@ ID oznake moraju započeti malim slovom. Qt Quick - - - QmlJSTools::Internal::QmlJSToolsPlugin Reset Code Model @@ -35047,9 +35041,6 @@ ID oznake moraju započeti malim slovom. &QML/JS - - - QmlJSTools::QmlJSToolsSettings Global Settings diff --git a/share/qtcreator/translations/qtcreator_ja.ts b/share/qtcreator/translations/qtcreator_ja.ts index 3c5af372adc..25c5cd6a553 100644 --- a/share/qtcreator/translations/qtcreator_ja.ts +++ b/share/qtcreator/translations/qtcreator_ja.ts @@ -29271,7 +29271,7 @@ Ids must begin with a lowercase letter. - QmlJSTools::FindExportedCppTypes + QmlJSTools The type will only be available in Qt Creator's QML editors when the type name is a string literal この型は型名が文字列リテラルであるため、Qt Creator の QML エディタでのみ利用可能できます @@ -29298,16 +29298,10 @@ the QML editor know about a likely URI. must be a string literal to be available in the QML editor QML エディタ内では文字列リテラルでなければなりません - - - QmlJSTools::Internal::FunctionFilter QML Functions QML 関数 - - - QmlJSTools Code Style コードスタイル @@ -29316,9 +29310,6 @@ the QML editor know about a likely URI. Qt Quick Qt Quick - - - QmlJSTools::Internal::QmlJSToolsPlugin &QML/JS &QML/JS @@ -29327,9 +29318,6 @@ the QML editor know about a likely URI. Reset Code Model コードモデルのリセット - - - QmlJSTools::QmlJSToolsSettings Global Settings diff --git a/share/qtcreator/translations/qtcreator_pl.ts b/share/qtcreator/translations/qtcreator_pl.ts index 23080705b2f..7e3fa2d64c4 100644 --- a/share/qtcreator/translations/qtcreator_pl.ts +++ b/share/qtcreator/translations/qtcreator_pl.ts @@ -15998,7 +15998,7 @@ Ponowić próbę? - QmlJSTools::Internal::FunctionFilter + QmlJSTools QML Functions Funkcje QML @@ -17474,9 +17474,6 @@ With cache simulation, further event counters are enabled: Qt Quick Qt Quick - - - QmlJSTools::QmlJSToolsSettings Global Settings @@ -18085,7 +18082,7 @@ Kiedy zostaje wykryty problem, aplikacja jest zatrzymywana i może zostać zdebu - QmlJSTools::Internal::QmlJSToolsPlugin + QmlJSTools &QML/JS &QML/JS @@ -22328,7 +22325,7 @@ were not verified among remotes in %3. Select different folder? - QmlJSTools::FindExportedCppTypes + QmlJSTools The type will only be available in Qt Creator's QML editors when the type name is a string literal Typ będzie tylko wtedy dostępny w edytorach QML, gdy jego nazwa będzie literałem łańcuchowym diff --git a/share/qtcreator/translations/qtcreator_ru.ts b/share/qtcreator/translations/qtcreator_ru.ts index 0e7fd60b4f9..8f8b850c6d4 100644 --- a/share/qtcreator/translations/qtcreator_ru.ts +++ b/share/qtcreator/translations/qtcreator_ru.ts @@ -41654,9 +41654,6 @@ For more information, see the "Checking Code Syntax" documentation.
Qt Quick - - - QmlJSTools::FindExportedCppTypes The type will only be available in the QML editors when the type name is a string literal Имя типа должно быть строковым литералом, чтобы он был доступен в редакторах QML @@ -41673,16 +41670,10 @@ the QML editor know about a likely URI. must be a string literal to be available in the QML editor должен быть строковым литералом, чтобы быть доступным в редакторе QML - - - QmlJSTools::Internal::FunctionFilter QML Functions Функции QML - - - QmlJSTools::Internal::QmlJSToolsPlugin &QML/JS @@ -41691,9 +41682,6 @@ the QML editor know about a likely URI. Reset Code Model Сбросить модель кода - - - QmlJSTools::QmlJSToolsSettings Global Settings diff --git a/share/qtcreator/translations/qtcreator_sl.ts b/share/qtcreator/translations/qtcreator_sl.ts index da207332c60..edd214d9eb5 100644 --- a/share/qtcreator/translations/qtcreator_sl.ts +++ b/share/qtcreator/translations/qtcreator_sl.ts @@ -25531,21 +25531,15 @@ neposredno dostopati do objektov izvodov komponent QML in lastnosti. - QmlJSTools::Internal::FunctionFilter + QmlJSTools Methods and functions Metode in funkcije - - - QmlJSTools::Internal::ModelManager Indexing Indeksiranje - - - QmlJSTools::Internal::PluginDumper Type dump of QML plugin in %1 failed. Errors: @@ -25592,9 +25586,6 @@ Please build the debugging helpers on the Qt version options page. Pomožnega programa za odlaganje podatkov o tipih iz vstavkov C++ ni bilo moč najti. S strani z možnostmi za različice Qt zgradite razhroščevalne pomočnike. - - - QmlJSTools Code Style Slog kode @@ -25603,9 +25594,6 @@ S strani z možnostmi za različice Qt zgradite razhroščevalne pomočnike.Qt Quick Qt Quick - - - QmlJSTools::Internal::QmlJSToolsPlugin &QML/JS &QML/JS @@ -25614,9 +25602,6 @@ S strani z možnostmi za različice Qt zgradite razhroščevalne pomočnike.Reset Code Model Ponastavi model kode - - - QmlJSTools::QmlJSToolsSettings Global Qt Quick Settings diff --git a/share/qtcreator/translations/qtcreator_uk.ts b/share/qtcreator/translations/qtcreator_uk.ts index d1eac66034b..a4e4fd22fe9 100644 --- a/share/qtcreator/translations/qtcreator_uk.ts +++ b/share/qtcreator/translations/qtcreator_uk.ts @@ -17896,9 +17896,6 @@ For qmlproject projects, use the importPaths property to add import paths.Qt Quick Qt Quick - - - QmlJSTools::Internal::FunctionFilter QML Methods and Functions Методи та функції QML @@ -17907,16 +17904,10 @@ For qmlproject projects, use the importPaths property to add import paths.QML Functions Функцій QML - - - QmlJSTools::Internal::ModelManager Indexing Індексування - - - QmlJSTools::Internal::PluginDumper "%1" crashed. "%1" завершився аварійно. @@ -17925,9 +17916,6 @@ For qmlproject projects, use the importPaths property to add import paths.Arguments: %1 Аргументи: %1 - - - QmlJSTools::Internal::QmlJSToolsPlugin &QML/JS &QML/JS @@ -17936,9 +17924,6 @@ For qmlproject projects, use the importPaths property to add import paths.Reset Code Model Скинути модель коду - - - QmlJSTools::QmlJSToolsSettings Global Settings @@ -32135,7 +32120,7 @@ Remote stderr was: %1 - QmlJSTools::FindExportedCppTypes + QmlJSTools The type will only be available in Qt Creator's QML editors when the type name is a string literal @@ -34936,7 +34921,7 @@ Remote: %4 - QmlJSTools::Internal::QmlConsoleEdit + QmlJSTools Cu&t Вирі&зати @@ -34957,9 +34942,6 @@ Remote: %4 C&lear &Очистити - - - QmlJSTools::Internal::QmlConsolePane Show debug, log, and info messages. Показувати зневаджувальні, журналу та інформаційні повідомлення. @@ -34976,21 +34958,10 @@ Remote: %4 QML/JS Console Консоль QML/JS - - - QmlJSTools::Internal::QmlConsoleView - - &Copy - &Копіювати - &Show in Editor &Показати в редакторі - - C&lear - &Очистити - QmlApplicationWizard diff --git a/share/qtcreator/translations/qtcreator_zh_CN.ts b/share/qtcreator/translations/qtcreator_zh_CN.ts index 9c5aea526b5..7be070daae5 100644 --- a/share/qtcreator/translations/qtcreator_zh_CN.ts +++ b/share/qtcreator/translations/qtcreator_zh_CN.ts @@ -33688,7 +33688,7 @@ QML component instance objects and properties directly. - QmlJSTools::Internal::FunctionFilter + QmlJSTools Functions 功能 @@ -33701,16 +33701,10 @@ QML component instance objects and properties directly. Methods and Functions 方法和函数 - - - QmlJSTools::Internal::ModelManager Indexing 索引中 - - - QmlJSTools::Internal::PluginDumper Type dump of QML plugin in %1 failed. Errors: @@ -36382,9 +36376,6 @@ These files are preserved. Qt Quick Qt Quick - - - QmlJSTools::Internal::QmlJSToolsPlugin &QML/JS &QML/JS @@ -36393,9 +36384,6 @@ These files are preserved. Reset Code Model 重置代码模型 - - - QmlJSTools::QmlJSToolsSettings Global Qt Quick Settings @@ -46974,7 +46962,7 @@ Remote stderr was: %1 - QmlJSTools::Internal::QmlConsoleEdit + QmlJSTools Cu&t 剪切 @@ -46983,23 +46971,14 @@ Remote stderr was: %1 Select &All 全选 - - - QmlJSTools::Internal::QmlConsolePane Console 控制台 - - - QmlJSTools::Internal::QmlConsoleView &Show in Editor 在编辑器中显示(&S) - - - QmlJSTools::FindExportedCppTypes The type will only be available in Qt Creator's QML editors when the type name is a string literal 仅在类型名称为字符串时该类型才能在Qt Creator 中的 QML编辑器中使用 diff --git a/share/qtcreator/translations/qtcreator_zh_TW.ts b/share/qtcreator/translations/qtcreator_zh_TW.ts index 0cff87067cb..5a0f90b9fa6 100644 --- a/share/qtcreator/translations/qtcreator_zh_TW.ts +++ b/share/qtcreator/translations/qtcreator_zh_TW.ts @@ -20629,21 +20629,15 @@ QML component instance objects and properties directly. - QmlJSTools::Internal::FunctionFilter + QmlJSTools Methods and Functions 方法和函式 - - - QmlJSTools::Internal::ModelManager Indexing 建索引中 - - - QmlJSTools::Internal::PluginDumper QML module does not contain information about components contained in plugins @@ -22724,9 +22718,6 @@ These files are preserved. Qt Quick Qt Quick - - - QmlJSTools::Internal::QmlJSToolsPlugin &QML/JS QML/JS(&Q) @@ -22735,9 +22726,6 @@ These files are preserved. Reset Code Model 重置代碼模型 - - - QmlJSTools::QmlJSToolsSettings Global Settings @@ -32616,7 +32604,7 @@ Remote stderr was: %1 - QmlJSTools::FindExportedCppTypes + QmlJSTools The type will only be available in Qt Creator's QML editors when the type name is a string literal 此種類型名稱字串字面常數僅在 Qt Creator 中的 QML編輯器時可使用 diff --git a/src/plugins/qmljstools/qmljscodestylesettingspage.cpp b/src/plugins/qmljstools/qmljscodestylesettingspage.cpp index edb7b942468..da4101fc5b3 100644 --- a/src/plugins/qmljstools/qmljscodestylesettingspage.cpp +++ b/src/plugins/qmljstools/qmljscodestylesettingspage.cpp @@ -9,6 +9,7 @@ #include "qmljsqtstylecodeformatter.h" #include "qmljstoolsconstants.h" #include "qmljstoolssettings.h" +#include "qmljstoolstr.h" #include #include @@ -124,9 +125,9 @@ void QmlJSCodeStylePreferencesWidget::updatePreview() QmlJSCodeStyleSettingsPage::QmlJSCodeStyleSettingsPage() { setId(Constants::QML_JS_CODE_STYLE_SETTINGS_ID); - setDisplayName(QCoreApplication::translate("QmlJSTools", Constants::QML_JS_CODE_STYLE_SETTINGS_NAME)); + setDisplayName(Tr::tr(Constants::QML_JS_CODE_STYLE_SETTINGS_NAME)); setCategory(QmlJSEditor::Constants::SETTINGS_CATEGORY_QML); - setDisplayCategory(QCoreApplication::translate("QmlJSEditor", "Qt Quick")); + setDisplayCategory(Tr::tr("Qt Quick")); setCategoryIconPath(":/qmljstools/images/settingscategory_qml.png"); } diff --git a/src/plugins/qmljstools/qmljscodestylesettingswidget.cpp b/src/plugins/qmljstools/qmljscodestylesettingswidget.cpp index 0e6ece1934d..b9e3a34a66e 100644 --- a/src/plugins/qmljstools/qmljscodestylesettingswidget.cpp +++ b/src/plugins/qmljstools/qmljscodestylesettingswidget.cpp @@ -2,8 +2,8 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "qmljscodestylesettingswidget.h" - #include "qmljscodestylesettings.h" +#include "qmljstoolstr.h" #include @@ -22,9 +22,9 @@ QmlJSCodeStyleSettingsWidget::QmlJSCodeStyleSettingsWidget(QWidget *parent) using namespace Utils::Layouting; Column { Group { - title(tr("Qml JS Code Style")), + title(Tr::tr("Qml JS Code Style")), Form { - tr("&Line length:"), m_lineLengthSpinBox, br, + Tr::tr("&Line length:"), m_lineLengthSpinBox, br, } } }.attachTo(this, WithoutMargins); diff --git a/src/plugins/qmljstools/qmljsfunctionfilter.cpp b/src/plugins/qmljstools/qmljsfunctionfilter.cpp index d115da8bbfd..70d129da972 100644 --- a/src/plugins/qmljstools/qmljsfunctionfilter.cpp +++ b/src/plugins/qmljstools/qmljsfunctionfilter.cpp @@ -2,8 +2,8 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "qmljsfunctionfilter.h" - #include "qmljslocatordata.h" +#include "qmljstoolstr.h" #include #include @@ -21,7 +21,7 @@ FunctionFilter::FunctionFilter(LocatorData *data, QObject *parent) , m_data(data) { setId("Functions"); - setDisplayName(tr("QML Functions")); + setDisplayName(Tr::tr("QML Functions")); setDefaultShortcutString("m"); setDefaultIncludedByDefault(false); } diff --git a/src/plugins/qmljstools/qmljstoolsplugin.cpp b/src/plugins/qmljstools/qmljstoolsplugin.cpp index f611f2ad127..650d0b5ec8f 100644 --- a/src/plugins/qmljstools/qmljstoolsplugin.cpp +++ b/src/plugins/qmljstools/qmljstoolsplugin.cpp @@ -1,14 +1,15 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "qmljstoolsplugin.h" -#include "qmljsmodelmanager.h" +#include "qmljsbundleprovider.h" +#include "qmljscodestylesettingspage.h" #include "qmljsfunctionfilter.h" #include "qmljslocatordata.h" -#include "qmljscodestylesettingspage.h" +#include "qmljsmodelmanager.h" #include "qmljstoolsconstants.h" +#include "qmljstoolsplugin.h" #include "qmljstoolssettings.h" -#include "qmljsbundleprovider.h" +#include "qmljstoolstr.h" #include #include @@ -34,7 +35,7 @@ public: QmlJSToolsSettings settings; ModelManager modelManager; - QAction resetCodeModelAction{QmlJSToolsPlugin::tr("Reset Code Model"), nullptr}; + QAction resetCodeModelAction{Tr::tr("Reset Code Model"), nullptr}; LocatorData locatorData; FunctionFilter functionFilter{&locatorData}; @@ -70,7 +71,7 @@ QmlJSToolsPluginPrivate::QmlJSToolsPluginPrivate() ActionContainer *mtools = ActionManager::actionContainer(Core::Constants::M_TOOLS); ActionContainer *mqmljstools = ActionManager::createMenu(Constants::M_TOOLS_QMLJS); QMenu *menu = mqmljstools->menu(); - menu->setTitle(QmlJSToolsPlugin::tr("&QML/JS")); + menu->setTitle(Tr::tr("&QML/JS")); menu->setEnabled(true); mtools->addMenu(mqmljstools); diff --git a/src/plugins/qmljstools/qmljstoolssettings.cpp b/src/plugins/qmljstools/qmljstoolssettings.cpp index f1e6bbcc087..817529924c8 100644 --- a/src/plugins/qmljstools/qmljstoolssettings.cpp +++ b/src/plugins/qmljstools/qmljstoolssettings.cpp @@ -1,10 +1,11 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "qmljstoolssettings.h" -#include "qmljstoolsconstants.h" #include "qmljscodestylepreferences.h" #include "qmljscodestylepreferencesfactory.h" +#include "qmljstoolsconstants.h" +#include "qmljstoolssettings.h" +#include "qmljstoolstr.h" #include #include @@ -48,7 +49,7 @@ QmlJSToolsSettings::QmlJSToolsSettings() // Qt style auto qtCodeStyle = new QmlJSCodeStylePreferences; qtCodeStyle->setId("qt"); - qtCodeStyle->setDisplayName(tr("Qt")); + qtCodeStyle->setDisplayName(Tr::tr("Qt")); qtCodeStyle->setReadOnly(true); TabSettings qtTabSettings; qtTabSettings.m_tabPolicy = TabSettings::SpacesOnlyTabPolicy; @@ -98,7 +99,7 @@ QmlJSToolsSettings::QmlJSToolsSettings() // create custom code style out of old settings ICodeStylePreferences *oldCreator = pool->createCodeStyle( - "legacy", legacyTabSettings, QVariant(), tr("Old Creator")); + "legacy", legacyTabSettings, QVariant(), Tr::tr("Old Creator")); // change the current delegate and save m_globalCodeStyle->setCurrentDelegate(oldCreator); From c68a42925e446a2df79fcba529bcb70e0a588459 Mon Sep 17 00:00:00 2001 From: Pranta Dastider Date: Wed, 28 Sep 2022 13:31:10 +0200 Subject: [PATCH 038/104] QmlDesigner: Add new comment to document Here the document is exclusive for the Enterprise Version of Qt Design Studio. So, I have added a comment at the top, to keep it clear for the users of other Qt Design Studio version. Task-number: QDS-7814 Change-Id: I2fdf56ce6bb46e4b0103631747cc57c9d722a603 Reviewed-by: Leena Miettinen --- doc/qtdesignstudio/src/qtbridge/qtbridge-figma-setup.qdoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/qtdesignstudio/src/qtbridge/qtbridge-figma-setup.qdoc b/doc/qtdesignstudio/src/qtbridge/qtbridge-figma-setup.qdoc index c2d00f2727b..6f354aed634 100644 --- a/doc/qtdesignstudio/src/qtbridge/qtbridge-figma-setup.qdoc +++ b/doc/qtdesignstudio/src/qtbridge/qtbridge-figma-setup.qdoc @@ -29,6 +29,8 @@ \nextpage qtbridge-figma-using.html \title Setting Up \QBF + \note \QBF is included in the + \l{https://www.qt.io/pricing}{\QDS Enterprise license}. \QBF is delivered with \QDS as a developer plugin that you can install to the Desktop version of Figma. To install the plugin, open the Plugin Manager From 55a5216e256f4c701db0b96cd861e27206c78069 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 21 Sep 2022 17:36:53 +0200 Subject: [PATCH 039/104] LanguageClient: Inform document manager about renames So that interested partied can react accordingly. Change-Id: I0233413aa960b83965428671cebeb591d5ca12b9 Reviewed-by: Reviewed-by: David Schulz --- .../languageclient/languageclientsymbolsupport.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index b55dd61808e..5bed7bc164d 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -7,12 +7,14 @@ #include "dynamiccapabilities.h" #include "languageclientutils.h" +#include #include #include #include #include +#include #include #include @@ -523,17 +525,25 @@ void SymbolSupport::handleRenameResponse(Core::SearchResult *search, void SymbolSupport::applyRename(const QList &checkedItems, Core::SearchResult *search) { + QSet affectedNonOpenFilePaths; QMap> editsForDocuments; for (const Core::SearchResultItem &item : checkedItems) { - auto uri = DocumentUri::fromFilePath(Utils::FilePath::fromString(item.path().value(0))); + const auto filePath = Utils::FilePath::fromString(item.path().value(0)); + if (!m_client->documentForFilePath(filePath)) + affectedNonOpenFilePaths << filePath; TextEdit edit(item.userData().toJsonObject()); if (edit.isValid()) - editsForDocuments[uri] << edit; + editsForDocuments[DocumentUri::fromFilePath(filePath)] << edit; } for (auto it = editsForDocuments.begin(), end = editsForDocuments.end(); it != end; ++it) applyTextEdits(m_client, it.key(), it.value()); + if (!affectedNonOpenFilePaths.isEmpty()) { + Core::DocumentManager::notifyFilesChangedInternally( + Utils::toList(affectedNonOpenFilePaths)); + } + const auto extraWidget = qobject_cast(search->additionalReplaceWidget()); QTC_ASSERT(extraWidget, return); if (!extraWidget->shouldRenameFiles()) From 74e260a40d4d950ebb6e657505f111f0257b8fcc Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 4 Oct 2022 11:57:36 +0200 Subject: [PATCH 040/104] Mercurial: Inline srcdestdialog.ui Change-Id: I6866ffbe708600e47dd136e627a6c59207b50815 Reviewed-by: Alessandro Portale --- src/plugins/mercurial/CMakeLists.txt | 2 +- src/plugins/mercurial/mercurial.qbs | 3 +- src/plugins/mercurial/srcdestdialog.cpp | 87 ++++++++---- src/plugins/mercurial/srcdestdialog.h | 23 +++- src/plugins/mercurial/srcdestdialog.ui | 170 ------------------------ 5 files changed, 79 insertions(+), 206 deletions(-) delete mode 100644 src/plugins/mercurial/srcdestdialog.ui diff --git a/src/plugins/mercurial/CMakeLists.txt b/src/plugins/mercurial/CMakeLists.txt index e5326a816f0..37cccb62544 100644 --- a/src/plugins/mercurial/CMakeLists.txt +++ b/src/plugins/mercurial/CMakeLists.txt @@ -11,5 +11,5 @@ add_qtc_plugin(Mercurial mercurialplugin.cpp mercurialplugin.h mercurialsettings.cpp mercurialsettings.h revertdialog.cpp revertdialog.h - srcdestdialog.cpp srcdestdialog.h srcdestdialog.ui + srcdestdialog.cpp srcdestdialog.h ) diff --git a/src/plugins/mercurial/mercurial.qbs b/src/plugins/mercurial/mercurial.qbs index 4c56a350969..58fb641cb4d 100644 --- a/src/plugins/mercurial/mercurial.qbs +++ b/src/plugins/mercurial/mercurial.qbs @@ -32,7 +32,6 @@ QtcPlugin { "revertdialog.cpp", "revertdialog.h", "srcdestdialog.cpp", - "srcdestdialog.h", - "srcdestdialog.ui", + "srcdestdialog.h" ] } diff --git a/src/plugins/mercurial/srcdestdialog.cpp b/src/plugins/mercurial/srcdestdialog.cpp index a2b0c5a6052..792eb41cc4d 100644 --- a/src/plugins/mercurial/srcdestdialog.cpp +++ b/src/plugins/mercurial/srcdestdialog.cpp @@ -3,49 +3,85 @@ #include "authenticationdialog.h" #include "srcdestdialog.h" -#include "ui_srcdestdialog.h" +#include + +#include +#include +#include +#include #include #include +using namespace Utils; using namespace VcsBase; -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { SrcDestDialog::SrcDestDialog(const VcsBasePluginState &state, Direction dir, QWidget *parent) : QDialog(parent), - m_ui(new Ui::SrcDestDialog), m_direction(dir), m_state(state) { - m_ui->setupUi(this); - m_ui->localPathChooser->setExpectedKind(Utils::PathChooser::ExistingDirectory); - m_ui->localPathChooser->setHistoryCompleter(QLatin1String("Hg.SourceDir.History")); - QUrl repoUrl(getRepoUrl()); - if (repoUrl.isEmpty()) - return; + resize(400, 187); + + m_defaultButton = new QRadioButton(tr("Default Location")); + m_defaultButton->setChecked(true); + + m_localButton = new QRadioButton(tr("Local filesystem:")); + + auto urlButton = new QRadioButton(tr("Specify URL:")); + urlButton->setToolTip(tr("For example: 'https://[user[:pass]@]host[:port]/[path]'.")); + + m_localPathChooser = new Utils::PathChooser; + m_localPathChooser->setEnabled(false); + m_localPathChooser->setExpectedKind(PathChooser::ExistingDirectory); + m_localPathChooser->setHistoryCompleter("Hg.SourceDir.History"); + + m_urlLineEdit = new QLineEdit; + m_urlLineEdit->setToolTip(tr("For example: 'https://[user[:pass]@]host[:port]/[path]'.", nullptr)); + m_urlLineEdit->setEnabled(false); + + QUrl repoUrl = getRepoUrl(); if (!repoUrl.password().isEmpty()) repoUrl.setPassword(QLatin1String("***")); - m_ui->defaultPath->setText(repoUrl.toString()); - m_ui->promptForCredentials->setChecked(!repoUrl.scheme().isEmpty() && repoUrl.scheme() != QLatin1String("file")); + + m_promptForCredentials = new QCheckBox(tr("Prompt for credentials")); + m_promptForCredentials->setChecked(!repoUrl.scheme().isEmpty() && repoUrl.scheme() != QLatin1String("file")); + + auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); + + using namespace Layouting; + + Column { + Form { + m_defaultButton, Column { repoUrl.toString(), m_promptForCredentials }, br, + m_localButton, m_localPathChooser, br, + urlButton, m_urlLineEdit, br, + }, + st, + buttonBox + }.attachTo(this); + + connect(urlButton, &QRadioButton::toggled, m_urlLineEdit, &QLineEdit::setEnabled); + connect(m_localButton, &QAbstractButton::toggled, m_localPathChooser, &QWidget::setEnabled); + + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); } -SrcDestDialog::~SrcDestDialog() -{ - delete m_ui; -} +SrcDestDialog::~SrcDestDialog() = default; void SrcDestDialog::setPathChooserKind(Utils::PathChooser::Kind kind) { - m_ui->localPathChooser->setExpectedKind(kind); + m_localPathChooser->setExpectedKind(kind); } QString SrcDestDialog::getRepositoryString() const { - if (m_ui->defaultButton->isChecked()) { + if (m_defaultButton->isChecked()) { QUrl repoUrl(getRepoUrl()); - if (m_ui->promptForCredentials->isChecked() && !repoUrl.scheme().isEmpty() && repoUrl.scheme() != QLatin1String("file")) { + if (m_promptForCredentials->isChecked() && !repoUrl.scheme().isEmpty() && repoUrl.scheme() != QLatin1String("file")) { QScopedPointer authDialog(new AuthenticationDialog(repoUrl.userName(), repoUrl.password())); authDialog->setPasswordEnabled(repoUrl.scheme() != QLatin1String("ssh")); if (authDialog->exec()== 0) @@ -63,14 +99,14 @@ QString SrcDestDialog::getRepositoryString() const } return repoUrl.toString(); } - if (m_ui->localButton->isChecked()) - return m_ui->localPathChooser->filePath().toString(); - return m_ui->urlLineEdit->text(); + if (m_localButton->isChecked()) + return m_localPathChooser->filePath().toString(); + return m_urlLineEdit->text(); } -Utils::FilePath SrcDestDialog::workingDir() const +FilePath SrcDestDialog::workingDir() const { - return Utils::FilePath::fromString(m_workingdir); + return FilePath::fromString(m_workingdir); } QUrl SrcDestDialog::getRepoUrl() const @@ -92,5 +128,4 @@ QUrl SrcDestDialog::getRepoUrl() const return url; } -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/srcdestdialog.h b/src/plugins/mercurial/srcdestdialog.h index 8afcaccef11..b448af2ba81 100644 --- a/src/plugins/mercurial/srcdestdialog.h +++ b/src/plugins/mercurial/srcdestdialog.h @@ -4,13 +4,18 @@ #pragma once #include + #include + #include -namespace Mercurial { -namespace Internal { +QT_BEGIN_NAMESPACE +class QCheckBox; +class QLineEdit; +class QRadioButton; +QT_END_NAMESPACE -namespace Ui { class SrcDestDialog; } +namespace Mercurial::Internal { class SrcDestDialog : public QDialog { @@ -18,6 +23,7 @@ class SrcDestDialog : public QDialog public: enum Direction { outgoing, incoming }; + explicit SrcDestDialog(const VcsBase::VcsBasePluginState &state, Direction dir, QWidget *parent = nullptr); ~SrcDestDialog() override; @@ -28,12 +34,15 @@ public: private: QUrl getRepoUrl() const; -private: - Ui::SrcDestDialog *m_ui; Direction m_direction; mutable QString m_workingdir; VcsBase::VcsBasePluginState m_state; + + QRadioButton *m_defaultButton; + QRadioButton *m_localButton; + Utils::PathChooser *m_localPathChooser; + QLineEdit *m_urlLineEdit; + QCheckBox *m_promptForCredentials; }; -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/srcdestdialog.ui b/src/plugins/mercurial/srcdestdialog.ui deleted file mode 100644 index b560d4857dc..00000000000 --- a/src/plugins/mercurial/srcdestdialog.ui +++ /dev/null @@ -1,170 +0,0 @@ - - - Mercurial::Internal::SrcDestDialog - - - - 0 - 0 - 400 - 187 - - - - Dialog - - - - - - - - Default Location - - - true - - - - - - - Local filesystem: - - - - - - - For example: 'https://[user[:pass]@]host[:port]/[path]'. - - - Specify URL: - - - - - - - false - - - - - - - false - - - For example: 'https://[user[:pass]@]host[:port]/[path]'. - - - - - - - - - - - - - - - - Prompt for credentials - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - Utils::PathChooser - QWidget -
utils/pathchooser.h
- 1 -
-
- - - - buttonBox - accepted() - Mercurial::Internal::SrcDestDialog - accept() - - - 257 - 177 - - - 157 - 274 - - - - - buttonBox - rejected() - Mercurial::Internal::SrcDestDialog - reject() - - - 325 - 177 - - - 286 - 274 - - - - - urlButton - toggled(bool) - urlLineEdit - setEnabled(bool) - - - 80 - 121 - - - 332 - 123 - - - - - localButton - toggled(bool) - localPathChooser - setEnabled(bool) - - - 112 - 81 - - - 346 - 81 - - - - -
From e489a947a8ebf7cbb049be9973c583450966780b Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 30 Sep 2022 14:56:15 +0200 Subject: [PATCH 041/104] PE: Delay initialization of wizards Other plugins may provide additional wizard search paths, so wait until they had a chance to register them. Amends 1cf6b031cfdf7344eb2ce6a403aa1029b7b8f75e. Change-Id: I268a42ab22d9c4f48d03589986220781e3623f46 Reviewed-by: Eike Ziller --- src/plugins/projectexplorer/projectexplorer.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 8ef24d8ed30..43d193819ff 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -832,10 +832,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er ToolChainManager::registerLanguage(Constants::CXX_LANGUAGE_ID, tr("C++")); IWizardFactory::registerFeatureProvider(new KitFeatureProvider); - IWizardFactory::registerFactoryCreator([] { return new SimpleProjectWizard; }); - CustomWizard::createWizards(); - JsonWizardFactory::createWizardFactories(); connect(&dd->m_welcomePage, &ProjectWelcomePage::manageSessions, dd, &ProjectExplorerPluginPrivate::showSessionManager); @@ -894,7 +891,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er JsonWizardFactory::registerPageFactory(new KitsPageFactory); JsonWizardFactory::registerPageFactory(new ProjectPageFactory); JsonWizardFactory::registerPageFactory(new SummaryPageFactory); - JsonWizardFactory::registerGeneratorFactory(new FileGeneratorFactory); JsonWizardFactory::registerGeneratorFactory(new ScannerGeneratorFactory); @@ -2197,6 +2193,9 @@ void ProjectExplorerPluginPrivate::closeAllProjects() void ProjectExplorerPlugin::extensionsInitialized() { + CustomWizard::createWizards(); + JsonWizardFactory::createWizardFactories(); + // Register factories for all project managers QStringList allGlobPatterns; From 5cdb9368548f87313541a12233ea41cdd47b565c Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 4 Oct 2022 17:25:18 +0200 Subject: [PATCH 042/104] QmlDesigner: Inline openuiqmlfiledialog.ui Also replace the grid by a suitable vbox. Still leaves potential improvements, like getting button order right used QDialogButtonBox. Change-Id: Icd294350ad3b6ff137fcd3c7bec4d607a5a1c0c7 Reviewed-by: Alessandro Portale --- src/plugins/qmldesigner/CMakeLists.txt | 2 +- .../qmldesigner/openuiqmlfiledialog.cpp | 52 ++++++++++----- src/plugins/qmldesigner/openuiqmlfiledialog.h | 10 +-- .../qmldesigner/openuiqmlfiledialog.ui | 64 ------------------- src/plugins/qmldesigner/qmldesignerplugin.qbs | 1 - 5 files changed, 42 insertions(+), 87 deletions(-) delete mode 100644 src/plugins/qmldesigner/openuiqmlfiledialog.ui diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index b748886cfbe..78da7fa5ded 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -37,7 +37,7 @@ add_qtc_plugin(QmlDesigner documentwarningwidget.cpp documentwarningwidget.h dynamiclicensecheck.h generateresource.cpp generateresource.h - openuiqmlfiledialog.cpp openuiqmlfiledialog.h openuiqmlfiledialog.ui + openuiqmlfiledialog.cpp openuiqmlfiledialog.h qmldesignerconstants.h qmldesignericons.h qmldesignerplugin.cpp qmldesignerplugin.h diff --git a/src/plugins/qmldesigner/openuiqmlfiledialog.cpp b/src/plugins/qmldesigner/openuiqmlfiledialog.cpp index 536f813f736..bcfbd96d4f9 100644 --- a/src/plugins/qmldesigner/openuiqmlfiledialog.cpp +++ b/src/plugins/qmldesigner/openuiqmlfiledialog.cpp @@ -2,46 +2,66 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "openuiqmlfiledialog.h" -#include "ui_openuiqmlfiledialog.h" #include +#include + +#include #include +#include +#include namespace QmlDesigner { OpenUiQmlFileDialog::OpenUiQmlFileDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::OpenUiQmlFileDialog) + QDialog(parent) { - ui->setupUi(this); + resize(600, 300); + setModal(true); + setWindowTitle(tr("Open ui.qml file")); - connect(ui->cancelButton, &QPushButton::clicked, this, &QDialog::close); - connect(ui->openButton, &QPushButton::clicked, [this] { - QListWidgetItem *item = ui->listWidget->currentItem(); + auto checkBox = new QCheckBox(tr("Do not show this dialog again")); + + auto openButton = new QPushButton(tr("Open ui.qml file")); + auto cancelButton = new QPushButton(tr("Cancel")); + + cancelButton->setDefault(true); + + m_listWidget = new QListWidget; + + using namespace Utils::Layouting; + + Column { + tr("You are opening a .qml file in the designer. Do you want to open a .ui.qml file instead?"), + m_listWidget, + checkBox, + Row { st, openButton, cancelButton } // FIXME: Use QDialogButtonBox to get order right? + }.attachTo(this); + + connect(cancelButton, &QPushButton::clicked, this, &QDialog::close); + connect(openButton, &QPushButton::clicked, [this] { + QListWidgetItem *item = m_listWidget->currentItem(); if (item) { m_uiFileOpened = true; m_uiQmlFile = item->data(Qt::UserRole).toString(); } close(); }); - connect(ui->listWidget, &QListWidget::itemDoubleClicked, [this](QListWidgetItem *item) { + connect(m_listWidget, &QListWidget::itemDoubleClicked, [this](QListWidgetItem *item) { if (item) { m_uiFileOpened = true; m_uiQmlFile = item->data(Qt::UserRole).toString(); } close(); }); - connect(ui->checkBox, &QCheckBox::toggled, this, [](bool b){ + connect(checkBox, &QCheckBox::toggled, this, [](bool b){ QmlDesignerPlugin::settings().insert( DesignerSettingsKey::WARNING_FOR_QML_FILES_INSTEAD_OF_UIQML_FILES, !b); }); } -OpenUiQmlFileDialog::~OpenUiQmlFileDialog() -{ - delete ui; -} +OpenUiQmlFileDialog::~OpenUiQmlFileDialog() = default; bool OpenUiQmlFileDialog::uiFileOpened() const { @@ -53,11 +73,11 @@ void OpenUiQmlFileDialog::setUiQmlFiles(const QString &projectPath, const QStrin QDir projectDir(projectPath); for (const QString &fileName : stringList) { - QListWidgetItem *item = new QListWidgetItem(projectDir.relativeFilePath(fileName), ui->listWidget); + QListWidgetItem *item = new QListWidgetItem(projectDir.relativeFilePath(fileName), m_listWidget); item->setData(Qt::UserRole, fileName); - ui->listWidget->addItem(item); + m_listWidget->addItem(item); } - ui->listWidget->setCurrentItem(ui->listWidget->item(0)); + m_listWidget->setCurrentItem(m_listWidget->item(0)); } QString OpenUiQmlFileDialog::uiQmlFile() const diff --git a/src/plugins/qmldesigner/openuiqmlfiledialog.h b/src/plugins/qmldesigner/openuiqmlfiledialog.h index 5f629faa4f2..87e3988fc8d 100644 --- a/src/plugins/qmldesigner/openuiqmlfiledialog.h +++ b/src/plugins/qmldesigner/openuiqmlfiledialog.h @@ -5,11 +5,11 @@ #include -namespace QmlDesigner { +QT_BEGIN_NAMESPACE +class QListWidget; +QT_END_NAMESPACE -namespace Ui { -class OpenUiQmlFileDialog; -} +namespace QmlDesigner { class OpenUiQmlFileDialog : public QDialog { @@ -23,7 +23,7 @@ public: QString uiQmlFile() const; private: - Ui::OpenUiQmlFileDialog *ui; + QListWidget *m_listWidget; bool m_uiFileOpened = false; QString m_uiQmlFile; }; diff --git a/src/plugins/qmldesigner/openuiqmlfiledialog.ui b/src/plugins/qmldesigner/openuiqmlfiledialog.ui deleted file mode 100644 index 062abe692df..00000000000 --- a/src/plugins/qmldesigner/openuiqmlfiledialog.ui +++ /dev/null @@ -1,64 +0,0 @@ - - - QmlDesigner::OpenUiQmlFileDialog - - - - 0 - 0 - 600 - 300 - - - - Open ui.qml file - - - true - - - - - - You are opening a .qml file in the designer. Do you want to open a .ui.qml file instead? - - - - - - - Do not show this dialog again - - - - - - - Open ui.qml file - - - - - - - Cancel - - - true - - - - - - - - - - listWidget - checkBox - openButton - cancelButton - - - - diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 4ed6ba61ec2..6ebaaa8ef3f 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -1147,7 +1147,6 @@ Project { "editorproxy.cpp", "openuiqmlfiledialog.cpp", "openuiqmlfiledialog.h", - "openuiqmlfiledialog.ui", "qmldesignerconstants.h", "qmldesignericons.h", "qmldesignerplugin.cpp", From 96d60713bf19747b414f6ed9b44b6368ea36f55c Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 30 Sep 2022 14:37:58 +0200 Subject: [PATCH 043/104] Squish: Fix up wizard resource Change-Id: Ie923744ef44d3588abb0930c241dbb26d7589de1 Reviewed-by: David Schulz --- src/plugins/squish/squish.qrc | 2 +- src/plugins/squish/wizard/{ => suite}/wizard.json | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/plugins/squish/wizard/{ => suite}/wizard.json (100%) diff --git a/src/plugins/squish/squish.qrc b/src/plugins/squish/squish.qrc index 830a60d5aa7..1a62ee1c1c6 100644 --- a/src/plugins/squish/squish.qrc +++ b/src/plugins/squish/squish.qrc @@ -8,6 +8,6 @@ images/jumpTo@2x.png images/data.png images/data@2x.png - wizard/wizard.json + wizard/suite/wizard.json diff --git a/src/plugins/squish/wizard/wizard.json b/src/plugins/squish/wizard/suite/wizard.json similarity index 100% rename from src/plugins/squish/wizard/wizard.json rename to src/plugins/squish/wizard/suite/wizard.json From 7dc2c6b3b32f433cb0b0e26e2559079782f99efb Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 20 Sep 2022 16:41:44 +0200 Subject: [PATCH 044/104] ClangCodeModel: Rename via LSP facilities Contrary to our original expectation, clangd's textDocument/rename does not necessarily yield the same locations as /references. Instead, it can find fewer or more occurrences, depending on server-side logic about what constitutes a reference vs what should be renamed. Therefore, we need to use /rename for proper behavior. Fixes: QTCREATORBUG-27978 Fixes: QTCREATORBUG-28109 Change-Id: I27d092e807a4aa59dc0674111429c77ca13010e9 Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 23 +++-- .../clangcodemodel/clangdfindreferences.cpp | 93 +------------------ .../clangcodemodel/clangdfindreferences.h | 2 +- 3 files changed, 19 insertions(+), 99 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 0474d1d6ed4..e43ca885c50 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -260,7 +260,7 @@ public: : q(q), settings(CppEditor::ClangdProjectSettings(project).settings()) {} void findUsages(TextDocument *document, const QTextCursor &cursor, - const QString &searchTerm, const std::optional &replacement, + const QString &searchTerm, bool categorize); void handleDeclDefSwitchReplies(); @@ -339,6 +339,9 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir) setLogTarget(LogTarget::Console); setCompletionAssistProvider(new ClangdCompletionAssistProvider(this)); setQuickFixAssistProvider(new ClangdQuickFixProvider(this)); + symbolSupport().setDefaultRenamingSymbolMapper( + [](const QString &oldSymbol) { return oldSymbol + "_new"; }); + symbolSupport().setLimitRenamingToProjects(true); if (!project) { QJsonObject initOptions; const Utils::FilePath includeDir @@ -459,25 +462,31 @@ void ClangdClient::findUsages(TextDocument *document, const QTextCursor &cursor, if (searchTerm.isEmpty()) return; + if (replacement) { + symbolSupport().renameSymbol(document, adjustedCursor, *replacement, + CppEditor::preferLowerCaseFileNames()); + return; + } + const bool categorize = CppEditor::codeModelSettings()->categorizeFindReferences(); // If it's a "normal" symbol, go right ahead. if (searchTerm != "operator" && Utils::allOf(searchTerm, [](const QChar &c) { return c.isLetterOrNumber() || c == '_'; })) { - d->findUsages(document, adjustedCursor, searchTerm, replacement, categorize); + d->findUsages(document, adjustedCursor, searchTerm, categorize); return; } // Otherwise get the proper spelling of the search term from clang, so we can put it into the // search widget. - const auto symbolInfoHandler = [this, doc = QPointer(document), adjustedCursor, replacement, categorize] + const auto symbolInfoHandler = [this, doc = QPointer(document), adjustedCursor, categorize] (const QString &name, const QString &, const MessageId &) { if (!doc) return; if (name.isEmpty()) return; - d->findUsages(doc.data(), adjustedCursor, name, replacement, categorize); + d->findUsages(doc.data(), adjustedCursor, name, categorize); }; requestSymbolInfo(document->filePath(), Range(adjustedCursor).start(), symbolInfoHandler); } @@ -633,11 +642,9 @@ QVersionNumber ClangdClient::versionNumber() const CppEditor::ClangdSettings::Data ClangdClient::settingsData() const { return d->settings; } void ClangdClient::Private::findUsages(TextDocument *document, - const QTextCursor &cursor, const QString &searchTerm, - const std::optional &replacement, bool categorize) + const QTextCursor &cursor, const QString &searchTerm, bool categorize) { - const auto findRefs = new ClangdFindReferences(q, document, cursor, searchTerm, replacement, - categorize); + const auto findRefs = new ClangdFindReferences(q, document, cursor, searchTerm, categorize); if (isTesting) { connect(findRefs, &ClangdFindReferences::foundReferences, q, &ClangdClient::foundReferences); diff --git a/src/plugins/clangcodemodel/clangdfindreferences.cpp b/src/plugins/clangcodemodel/clangdfindreferences.cpp index c48c0caebea..fde197f277e 100644 --- a/src/plugins/clangcodemodel/clangdfindreferences.cpp +++ b/src/plugins/clangcodemodel/clangdfindreferences.cpp @@ -44,25 +44,12 @@ public: ClangdAstNode ast; }; -class ReplacementData { -public: - QString oldSymbolName; - QString newSymbolName; - QSet fileRenameCandidates; -}; - class ClangdFindReferences::Private { public: Private(ClangdFindReferences *q) : q(q) {} ClangdClient *client() const { return qobject_cast(q->parent()); } - static void handleRenameRequest( - const SearchResult *search, - const ReplacementData &replacementData, - const QString &newSymbolName, - const QList &checkedItems, - bool preserveCase); void handleFindUsagesResult(const QList &locations); void finishSearch(); void reportAllSearchResultsAndFinish(); @@ -74,50 +61,24 @@ public: QMap fileData; QList pendingAstRequests; QPointer search; - std::optional replacementData; bool canceled = false; bool categorize = false; }; ClangdFindReferences::ClangdFindReferences(ClangdClient *client, TextDocument *document, - const QTextCursor &cursor, const QString &searchTerm, - const std::optional &replacement, bool categorize) + const QTextCursor &cursor, const QString &searchTerm, bool categorize) : QObject(client), d(new ClangdFindReferences::Private(this)) { d->categorize = categorize; - if (replacement) { - ReplacementData replacementData; - replacementData.oldSymbolName = searchTerm; - replacementData.newSymbolName = *replacement; - if (replacementData.newSymbolName.isEmpty()) - replacementData.newSymbolName = replacementData.oldSymbolName; - d->replacementData = replacementData; - } - d->search = SearchResultWindow::instance()->startNewSearch( tr("C++ Usages:"), {}, searchTerm, - replacement ? SearchResultWindow::SearchAndReplace : SearchResultWindow::SearchOnly, + SearchResultWindow::SearchOnly, SearchResultWindow::PreserveCaseDisabled, "CppEditor"); if (categorize) d->search->setFilter(new CppSearchResultFilter); - if (d->replacementData) { - d->search->setTextToReplace(d->replacementData->newSymbolName); - const auto renameFilesCheckBox = new QCheckBox; - renameFilesCheckBox->setVisible(false); - d->search->setAdditionalReplaceWidget(renameFilesCheckBox); - const auto renameHandler = - [search = d->search](const QString &newSymbolName, - const QList &checkedItems, - bool preserveCase) { - const auto replacementData = search->userData().value(); - Private::handleRenameRequest(search, replacementData, newSymbolName, checkedItems, - preserveCase); - }; - connect(d->search, &SearchResult::replaceButtonClicked, renameHandler); - } connect(d->search, &SearchResult::activated, [](const SearchResultItem& item) { EditorManager::openEditorAtSearchResult(item); }); @@ -151,31 +112,6 @@ ClangdFindReferences::~ClangdFindReferences() delete d; } -void ClangdFindReferences::Private::handleRenameRequest( - const SearchResult *search, - const ReplacementData &replacementData, - const QString &newSymbolName, - const QList &checkedItems, - bool preserveCase) -{ - const Utils::FilePaths filePaths = BaseFileFind::replaceAll(newSymbolName, checkedItems, - preserveCase); - if (!filePaths.isEmpty()) { - DocumentManager::notifyFilesChangedInternally(filePaths); - SearchResultWindow::instance()->hide(); - } - - const auto renameFilesCheckBox = qobject_cast(search->additionalReplaceWidget()); - QTC_ASSERT(renameFilesCheckBox, return); - if (!renameFilesCheckBox->isChecked()) - return; - - ProjectExplorerPlugin::renameFilesForSymbol( - replacementData.oldSymbolName, newSymbolName, - Utils::toList(replacementData.fileRenameCandidates), - CppEditor::preferLowerCaseFileNames()); -} - void ClangdFindReferences::Private::handleFindUsagesResult(const QList &locations) { if (!search || canceled) { @@ -218,7 +154,7 @@ void ClangdFindReferences::Private::handleFindUsagesResult(const QList } qCDebug(clangdLog) << "document count is" << fileData.size(); - if (replacementData || !categorize) { + if (!categorize) { qCDebug(clangdLog) << "skipping AST retrieval"; reportAllSearchResultsAndFinish(); return; @@ -262,18 +198,6 @@ void ClangdFindReferences::Private::finishSearch() if (!client()->testingEnabled() && search) { search->finishSearch(canceled); search->disconnect(q); - if (replacementData) { - const auto renameCheckBox = qobject_cast( - search->additionalReplaceWidget()); - QTC_CHECK(renameCheckBox); - const QSet files = replacementData->fileRenameCandidates; - renameCheckBox->setText(tr("Re&name %n files", nullptr, files.size())); - const QStringList filesForUser = Utils::transform(files, - [](const Utils::FilePath &fp) { return fp.toUserOutput(); }); - renameCheckBox->setToolTip(tr("Files:\n%1").arg(filesForUser.join('\n'))); - renameCheckBox->setVisible(true); - search->setUserData(QVariant::fromValue(*replacementData)); - } } emit q->done(); q->deleteLater(); @@ -307,15 +231,6 @@ void ClangdFindReferences::Private::addSearchResultsForFile(const FilePath &file item.setUseTextEditorFont(true); item.setLineText(rangeWithText.second); item.setContainingFunctionName(getContainingFunctionName(astPath, range)); - - if (search->supportsReplace()) { - const bool fileInSession = SessionManager::projectForFile(file); - item.setSelectForReplacement(fileInSession); - if (fileInSession && file.baseName().compare(replacementData->oldSymbolName, - Qt::CaseInsensitive) == 0) { - replacementData->fileRenameCandidates << file; - } - } items << item; } if (client()->testingEnabled()) @@ -569,5 +484,3 @@ void ClangdFindLocalReferences::Private::finish() } } // namespace ClangCodeModel::Internal - -Q_DECLARE_METATYPE(ClangCodeModel::Internal::ReplacementData) diff --git a/src/plugins/clangcodemodel/clangdfindreferences.h b/src/plugins/clangcodemodel/clangdfindreferences.h index f45a61b25e4..27d25a293ca 100644 --- a/src/plugins/clangcodemodel/clangdfindreferences.h +++ b/src/plugins/clangcodemodel/clangdfindreferences.h @@ -25,7 +25,7 @@ class ClangdFindReferences : public QObject public: explicit ClangdFindReferences(ClangdClient *client, TextEditor::TextDocument *document, const QTextCursor &cursor, const QString &searchTerm, - const std::optional &replacement, bool categorize); + bool categorize); ~ClangdFindReferences(); signals: From 3811236903d80932cab624fc4ec342c0e54d1f42 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 6 Oct 2022 09:46:50 +0200 Subject: [PATCH 045/104] macOS: Fix opening terminal The scripts executable flag went missing Amends a7956df3ca45579c62b496621a7d3b55d73c98b8 Fixes: QTCREATORBUG-28251 Change-Id: I9773dee3967edc2ebb0eb49c539b37796a48cf5a Reviewed-by: Reviewed-by: Christian Stenger --- share/qtcreator/scripts/openTerminal.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 share/qtcreator/scripts/openTerminal.py diff --git a/share/qtcreator/scripts/openTerminal.py b/share/qtcreator/scripts/openTerminal.py old mode 100644 new mode 100755 From eec0679234ed528e488ee12e928a0d778a710961 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 19:08:53 +0200 Subject: [PATCH 046/104] VcsBase: Move RunFlags into separate header It is going to be used outside of VcsCommand, too. Use RunFlags enum as an argument to several functions instead of unsigned. Change-Id: I355c80a845a9b5982108fbde3412754392dce702 Reviewed-by: Orgad Shaneh --- src/plugins/clearcase/clearcaseplugin.cpp | 33 +++--- src/plugins/cvs/cvsplugin.cpp | 36 +++---- src/plugins/git/branchmodel.cpp | 4 +- src/plugins/git/gerrit/gerritserver.cpp | 4 +- src/plugins/git/gitclient.cpp | 100 +++++++++--------- src/plugins/git/gitclient.h | 4 +- src/plugins/git/gitplugin.cpp | 2 +- src/plugins/git/logchangedialog.cpp | 4 +- src/plugins/mercurial/mercurialclient.cpp | 6 +- src/plugins/subversion/subversionclient.cpp | 6 +- src/plugins/subversion/subversionplugin.cpp | 22 ++-- src/plugins/vcsbase/CMakeLists.txt | 1 + src/plugins/vcsbase/vcsbase.qbs | 1 + src/plugins/vcsbase/vcsbaseclient.cpp | 14 +-- src/plugins/vcsbase/vcsbaseclient.h | 8 +- .../vcsbase/vcsbasediffeditorcontroller.cpp | 2 +- .../vcsbase/vcsbasediffeditorcontroller.h | 3 +- src/plugins/vcsbase/vcscommand.cpp | 38 +++---- src/plugins/vcsbase/vcscommand.h | 20 +--- src/plugins/vcsbase/vcsenums.h | 47 ++++++++ 20 files changed, 196 insertions(+), 159 deletions(-) create mode 100644 src/plugins/vcsbase/vcsenums.h diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index b4030c63a51..2e82b77c4e2 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -257,8 +257,8 @@ private: CommandResult runCleartoolProc(const FilePath &workingDir, const QStringList &arguments) const; CommandResult runCleartool(const FilePath &workingDir, const QStringList &arguments, - unsigned flags = 0, QTextCodec *codec = nullptr, - int timeoutMultiplier = 1) const; + VcsBase::RunFlags flags = VcsBase::RunFlags::None, + QTextCodec *codec = nullptr, int timeoutMultiplier = 1) const; static void sync(QFutureInterface &future, QStringList files); void history(const FilePath &workingDir, @@ -1086,7 +1086,7 @@ bool ClearCasePluginPrivate::vcsUndoCheckOut(const FilePath &workingDir, const Q args << QLatin1String(keep ? "-keep" : "-rm"); args << QDir::toNativeSeparators(fileName); - const CommandResult result = runCleartool(workingDir, args, VcsCommand::ShowStdOut); + const CommandResult result = runCleartool(workingDir, args, RunFlags::ShowStdOut); if (result.result() != ProcessResult::FinishedWithSuccess) return false; @@ -1116,7 +1116,7 @@ bool ClearCasePluginPrivate::vcsUndoHijack(const FilePath &workingDir, const QSt args << QLatin1String("/dev/null"); args << QDir::toNativeSeparators(fileName); - const CommandResult result = runCleartool(workingDir, args, VcsCommand::ShowStdOut); + const CommandResult result = runCleartool(workingDir, args, RunFlags::ShowStdOut); if (result.result() == ProcessResult::FinishedWithSuccess) return false; @@ -1451,7 +1451,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir, for (const QString &file : files) args.append(QDir::toNativeSeparators(file)); - const CommandResult result = runCleartool(workingDir, args, 0, codec); + const CommandResult result = runCleartool(workingDir, args, RunFlags::None, codec); if (result.result() != ProcessResult::FinishedWithSuccess) return; @@ -1511,8 +1511,7 @@ void ClearCasePluginPrivate::ccUpdate(const FilePath &workingDir, const QStringL args << QLatin1String("-noverwrite"); if (!relativePaths.isEmpty()) args.append(relativePaths); - const CommandResult result = runCleartool(workingDir, args, VcsCommand::ShowStdOut, nullptr, - 10); + const CommandResult result = runCleartool(workingDir, args, RunFlags::ShowStdOut, nullptr, 10); if (result.result() == ProcessResult::FinishedWithSuccess) emit repositoryChanged(workingDir); } @@ -1544,7 +1543,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const args << QLatin1String("-out") << QLatin1String("-"); args.append(QDir::toNativeSeparators(id)); - const CommandResult result = runCleartool(workingDir, args, 0, codec); + const CommandResult result = runCleartool(workingDir, args, RunFlags::None, codec); if (result.result() != ProcessResult::FinishedWithSuccess) return; @@ -1593,7 +1592,7 @@ void ClearCasePluginPrivate::vcsDescribe(const FilePath &source, const QString & QStringList args(QLatin1String("describe")); args.push_back(id); QTextCodec *codec = VcsBaseEditor::getCodec(source.toString()); - const CommandResult result = runCleartool(topLevel, args, 0, codec); + const CommandResult result = runCleartool(topLevel, args, RunFlags::None, codec); description = result.cleanedStdOut(); if (m_settings.extDiffAvailable) description += diffExternal(id); @@ -1637,7 +1636,7 @@ CommandResult ClearCasePluginPrivate::runCleartoolProc(const FilePath &workingDi CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir, const QStringList &arguments, - unsigned flags, + RunFlags flags, QTextCodec *codec, int timeoutMultiplier) const { @@ -1763,7 +1762,7 @@ bool ClearCasePluginPrivate::vcsOpen(const FilePath &workingDir, const QString & } args << file; CommandResult result = runCleartool(topLevel, args, - VcsCommand::ShowStdOut | VcsCommand::SuppressStdErr); + RunFlags::ShowStdOut | RunFlags::SuppressStdErr); if (result.result() != ProcessResult::FinishedWithSuccess) { if (result.cleanedStdErr().contains(QLatin1String("Versions other than the selected version"))) { VersionSelector selector(file, result.cleanedStdErr()); @@ -1772,7 +1771,7 @@ bool ClearCasePluginPrivate::vcsOpen(const FilePath &workingDir, const QString & ccUpdate(workingDir, QStringList(file)); else args.removeOne(QLatin1String("-query")); - result = runCleartool(topLevel, args, VcsCommand::ShowStdOut); + result = runCleartool(topLevel, args, RunFlags::ShowStdOut); } } else { VcsOutputWindow::append(result.cleanedStdOut()); @@ -1801,7 +1800,7 @@ bool ClearCasePluginPrivate::vcsSetActivity(const FilePath &workingDir, const QS { QStringList args; args << QLatin1String("setactivity") << activity; - const CommandResult result = runCleartool(workingDir, args, VcsCommand::ShowStdOut); + const CommandResult result = runCleartool(workingDir, args, RunFlags::ShowStdOut); if (result.result() != ProcessResult::FinishedWithSuccess) { QMessageBox::warning(ICore::dialogParent(), title, Tr::tr("Set current activity failed: %1") .arg(result.exitMessage()), QMessageBox::Ok); @@ -1847,7 +1846,7 @@ bool ClearCasePluginPrivate::vcsCheckIn(const FilePath &messageFile, const QStri FilePath::fromString(QFileInfo(m_checkInView.toString(), fileName).canonicalFilePath()))); blockers.append(fcb); } - const CommandResult result = runCleartool(m_checkInView, args, VcsCommand::ShowStdOut, nullptr, + const CommandResult result = runCleartool(m_checkInView, args, RunFlags::ShowStdOut, nullptr, 10); const QRegularExpression checkedIn("Checked in \\\"([^\"]*)\\\""); QRegularExpressionMatch match = checkedIn.match(result.cleanedStdOut()); @@ -1915,7 +1914,7 @@ bool ClearCasePluginPrivate::ccFileOp(const FilePath &workingDir, const QString // check out directory QStringList args; args << QLatin1String("checkout") << commentArg << dirName; - const CommandResult coResult = runCleartool(workingDir, args, VcsCommand::ShowStdOut); + const CommandResult coResult = runCleartool(workingDir, args, RunFlags::ShowStdOut); if (coResult.result() != ProcessResult::FinishedWithSuccess) { if (coResult.cleanedStdErr().contains(QLatin1String("already checked out"))) noCheckout = true; @@ -1928,7 +1927,7 @@ bool ClearCasePluginPrivate::ccFileOp(const FilePath &workingDir, const QString args << opArgs << commentArg << file; if (!file2.isEmpty()) args << QDir::toNativeSeparators(file2); - const CommandResult opResult = runCleartool(workingDir, args, VcsCommand::ShowStdOut); + const CommandResult opResult = runCleartool(workingDir, args, RunFlags::ShowStdOut); if (opResult.result() != ProcessResult::FinishedWithSuccess) { // on failure - undo checkout for the directory if (!noCheckout) @@ -1942,7 +1941,7 @@ bool ClearCasePluginPrivate::ccFileOp(const FilePath &workingDir, const QString // check in the directory args.clear(); args << QLatin1String("checkin") << commentArg << dirName; - const CommandResult ciResult = runCleartool(workingDir, args, VcsCommand::ShowStdOut); + const CommandResult ciResult = runCleartool(workingDir, args, RunFlags::ShowStdOut); return ciResult.result() == ProcessResult::FinishedWithSuccess; } diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 6318f5eb5a6..17e67565978 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -285,7 +285,7 @@ private: CvsResponse runCvs(const FilePath &workingDirectory, const QStringList &arguments, int timeOutS, - unsigned flags = 0, + RunFlags flags = RunFlags::None, QTextCodec *outputCodec = nullptr) const; void annotate(const FilePath &workingDir, const QString &file, @@ -848,7 +848,7 @@ void CvsPluginPrivate::revertAll() QStringList args; args << QLatin1String("update") << QLatin1String("-C") << state.topLevel().toString(); const auto revertResponse = runCvs(state.topLevel(), args, m_settings.timeout.value(), - VcsCommand::ShowStdOut); + RunFlags::ShowStdOut); if (revertResponse.result == CvsResponse::Ok) emit repositoryChanged(state.topLevel()); else @@ -863,7 +863,7 @@ void CvsPluginPrivate::revertCurrentFile() QStringList args; args << QLatin1String("diff") << state.relativeCurrentFile(); const CvsResponse diffResponse = - runCvs(state.currentFileTopLevel(), args, m_settings.timeout.value(), 0); + runCvs(state.currentFileTopLevel(), args, m_settings.timeout.value()); switch (diffResponse.result) { case CvsResponse::Ok: return; // Not modified, diff exit code 0 @@ -885,7 +885,7 @@ void CvsPluginPrivate::revertCurrentFile() args.clear(); args << QLatin1String("update") << QLatin1String("-C") << state.relativeCurrentFile(); const auto revertResponse = runCvs(state.currentFileTopLevel(), args, - m_settings.timeout.value(), VcsCommand::ShowStdOut); + m_settings.timeout.value(), RunFlags::ShowStdOut); if (revertResponse.result == CvsResponse::Ok) emit filesChanged(QStringList(state.currentFile())); } @@ -949,7 +949,7 @@ void CvsPluginPrivate::startCommit(const FilePath &workingDir, const QString &fi // where we are, so, have stdout/stderr channels merged. QStringList args = QStringList(QLatin1String("status")); const CvsResponse response = - runCvs(workingDir, args, m_settings.timeout.value(), VcsCommand::MergeOutputChannels); + runCvs(workingDir, args, m_settings.timeout.value(), RunFlags::MergeOutputChannels); if (response.result != CvsResponse::Ok) return; // Get list of added/modified/deleted files and purge out undesired ones @@ -995,7 +995,7 @@ bool CvsPluginPrivate::commit(const QString &messageFile, args << QLatin1String("-F") << messageFile; args.append(fileList); const auto response = runCvs(m_commitRepository, args, 10 * m_settings.timeout.value(), - VcsCommand::ShowStdOut); + RunFlags::ShowStdOut); return response.result == CvsResponse::Ok ; } @@ -1032,7 +1032,7 @@ void CvsPluginPrivate::filelog(const FilePath &workingDir, args << QLatin1String("log"); args.append(file); const CvsResponse response = - runCvs(workingDir, args, m_settings.timeout.value(), 0, codec); + runCvs(workingDir, args, m_settings.timeout.value(), RunFlags::None, codec); if (response.result != CvsResponse::Ok) return; @@ -1071,7 +1071,7 @@ bool CvsPluginPrivate::update(const FilePath &topLevel, const QString &file) args.push_back(QLatin1String("-dR")); if (!file.isEmpty()) args.append(file); - const auto response = runCvs(topLevel, args, 10 * m_settings.timeout.value(), VcsCommand::ShowStdOut); + const auto response = runCvs(topLevel, args, 10 * m_settings.timeout.value(), RunFlags::ShowStdOut); const bool ok = response.result == CvsResponse::Ok; if (ok) emit repositoryChanged(topLevel); @@ -1116,7 +1116,7 @@ bool CvsPluginPrivate::edit(const FilePath &topLevel, const QStringList &files) { QStringList args(QLatin1String("edit")); args.append(files); - const auto response = runCvs(topLevel, args, m_settings.timeout.value(), VcsCommand::ShowStdOut); + const auto response = runCvs(topLevel, args, m_settings.timeout.value(), RunFlags::ShowStdOut); return response.result == CvsResponse::Ok; } @@ -1127,7 +1127,7 @@ bool CvsPluginPrivate::diffCheckModified(const FilePath &topLevel, const QString QStringList args(QLatin1String("-q")); args << QLatin1String("diff"); args.append(files); - const CvsResponse response = runCvs(topLevel, args, m_settings.timeout.value(), 0); + const CvsResponse response = runCvs(topLevel, args, m_settings.timeout.value()); if (response.result == CvsResponse::OtherError) return false; *modified = response.result == CvsResponse::NonNullExitCode; @@ -1154,7 +1154,7 @@ bool CvsPluginPrivate::unedit(const FilePath &topLevel, const QStringList &files if (modified) args.append(QLatin1String("-y")); args.append(files); - const auto response = runCvs(topLevel, args, m_settings.timeout.value(), VcsCommand::ShowStdOut); + const auto response = runCvs(topLevel, args, m_settings.timeout.value(), RunFlags::ShowStdOut); return response.result == CvsResponse::Ok; } @@ -1171,7 +1171,8 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file, if (!revision.isEmpty()) args << QLatin1String("-r") << revision; args << file; - const CvsResponse response = runCvs(workingDir, args, m_settings.timeout.value(), 0, codec); + const CvsResponse response = runCvs(workingDir, args, m_settings.timeout.value(), + RunFlags::None, codec); if (response.result != CvsResponse::Ok) return; @@ -1198,8 +1199,7 @@ bool CvsPluginPrivate::status(const FilePath &topLevel, const QString &file, con QStringList args(QLatin1String("status")); if (!file.isEmpty()) args.append(file); - const CvsResponse response = - runCvs(topLevel, args, m_settings.timeout.value(), 0); + const CvsResponse response = runCvs(topLevel, args, m_settings.timeout.value()); const bool ok = response.result == CvsResponse::Ok; if (ok) showOutputInEditor(title, response.stdOut, commandLogEditorParameters.id, topLevel.toString(), nullptr); @@ -1346,7 +1346,7 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath, << QLatin1String("-r") << previousRev << QLatin1String("-r") << it->revisions.front().revision << it->file; const CvsResponse diffResponse = - runCvs(repositoryPath, args, m_settings.timeout.value(), 0, codec); + runCvs(repositoryPath, args, m_settings.timeout.value(), RunFlags::None, codec); switch (diffResponse.result) { case CvsResponse::Ok: case CvsResponse::NonNullExitCode: // Diff exit code != 0 @@ -1391,7 +1391,7 @@ void CvsPluginPrivate::commitFromEditor() CvsResponse CvsPluginPrivate::runCvs(const FilePath &workingDirectory, const QStringList &arguments, int timeOutS, - unsigned flags, + RunFlags flags, QTextCodec *outputCodec) const { const FilePath executable = m_settings.binaryPath.filePath(); @@ -1451,7 +1451,7 @@ bool CvsPluginPrivate::vcsAdd(const FilePath &workingDir, const QString &rawFile { QStringList args; args << QLatin1String("add") << rawFileName; - const auto response = runCvs(workingDir, args, m_settings.timeout.value(), VcsCommand::ShowStdOut); + const auto response = runCvs(workingDir, args, m_settings.timeout.value(), RunFlags::ShowStdOut); return response.result == CvsResponse::Ok; } @@ -1459,7 +1459,7 @@ bool CvsPluginPrivate::vcsDelete(const FilePath &workingDir, const QString &rawF { QStringList args; args << QLatin1String("remove") << QLatin1String("-f") << rawFileName; - const auto response = runCvs(workingDir, args, m_settings.timeout.value(), VcsCommand::ShowStdOut); + const auto response = runCvs(workingDir, args, m_settings.timeout.value(), RunFlags::ShowStdOut); return response.result == CvsResponse::Ok; } diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index 66a776fa0b6..b33b4ab277f 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -670,7 +670,7 @@ QModelIndex BranchModel::addBranch(const QString &name, bool track, const QModel } else { const QStringList arguments({"-n1", "--format=%H %ct"}); if (d->client->synchronousLog(d->workingDirectory, arguments, &output, &errorMessage, - VcsCommand::SuppressCommandLogging)) { + RunFlags::SuppressCommandLogging)) { const QStringList values = output.split(' '); startSha = values[0]; branchDateTime = QDateTime::fromSecsSinceEpoch(values[1].toLongLong()); @@ -919,7 +919,7 @@ QString BranchModel::toolTip(const QString &sha) const QStringList arguments("-n1"); arguments << sha; if (!d->client->synchronousLog(d->workingDirectory, arguments, &output, &errorMessage, - VcsCommand::SuppressCommandLogging)) { + RunFlags::SuppressCommandLogging)) { return errorMessage; } return output; diff --git a/src/plugins/git/gerrit/gerritserver.cpp b/src/plugins/git/gerrit/gerritserver.cpp index f502408ddf6..571ba61ae08 100644 --- a/src/plugins/git/gerrit/gerritserver.cpp +++ b/src/plugins/git/gerrit/gerritserver.cpp @@ -323,7 +323,7 @@ bool GerritServer::resolveVersion(const GerritParameters &p, bool forceReload) arguments << p.portFlag << QString::number(port); arguments << hostArgument() << "gerrit" << "version"; const CommandResult result = client->vcsSynchronousExec({}, {p.ssh, arguments}, - VcsCommand::NoOutput); + RunFlags::NoOutput); QString stdOut = result.cleanedStdOut().trimmed(); stdOut.remove("gerrit version "); version = stdOut; @@ -332,7 +332,7 @@ bool GerritServer::resolveVersion(const GerritParameters &p, bool forceReload) } else { const QStringList arguments = curlArguments() << (url(RestUrl) + versionUrlC); const CommandResult result = client->vcsSynchronousExec({}, {curlBinary, arguments}, - VcsCommand::NoOutput); + RunFlags::NoOutput); // REST endpoint for version is only available from 2.8 and up. Do not consider invalid // if it fails. if (result.result() == ProcessResult::FinishedWithSuccess) { diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 88168dc645b..7b7f1215800 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -90,9 +90,9 @@ namespace Internal { static GitClient *m_instance = nullptr; // Suppress git diff warnings about "LF will be replaced by CRLF..." on Windows. -static unsigned diffExecutionFlags() +static RunFlags diffExecutionFlags() { - return HostOsInfo::isWindowsHost() ? unsigned(VcsCommand::SuppressStdErr) : 0u; + return HostOsInfo::isWindowsHost() ? RunFlags::SuppressStdErr : RunFlags::None; } static QString branchesDisplay(const QString &prefix, QStringList *branches, bool *first) @@ -728,7 +728,7 @@ public: auto handler = new ConflictHandler(workingDirectory, abortCommand); handler->setParent(command); // delete when command goes out of scope - command->addFlags(VcsCommand::ExpectRepoChanges); + command->addFlags(RunFlags::ExpectRepoChanges); connect(command, &VcsCommand::done, handler, [handler, command] { handler->readStdOut(command->cleanedStdOut()); handler->readStdErr(command->cleanedStdErr()); @@ -905,7 +905,7 @@ QString GitClient::findGitDirForRepository(const FilePath &repositoryDir) const bool GitClient::managesFile(const FilePath &workingDirectory, const QString &fileName) const { const CommandResult result = vcsSynchronousExec(workingDirectory, - {"ls-files", "--error-unmatch", fileName}, VcsCommand::NoOutput); + {"ls-files", "--error-unmatch", fileName}, RunFlags::NoOutput); return result.result() == ProcessResult::FinishedWithSuccess; } @@ -920,7 +920,7 @@ FilePaths GitClient::unmanagedFiles(const FilePaths &filePaths) const QStringList args({"ls-files", "-z"}); const QDir wd(it.key().toString()); args << transform(it.value(), [&wd](const QString &fp) { return wd.relativeFilePath(fp); }); - const CommandResult result = vcsSynchronousExec(it.key(), args, VcsCommand::NoOutput); + const CommandResult result = vcsSynchronousExec(it.key(), args, RunFlags::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) return filePaths; const QStringList managedFilePaths @@ -1375,7 +1375,7 @@ VcsCommand *GitClient::checkout(const FilePath &workingDirectory, const QString QStringList arguments = setupCheckoutArguments(workingDirectory, ref); VcsCommand *command = vcsExec( workingDirectory, arguments, nullptr, true, - VcsCommand::ExpectRepoChanges | VcsCommand::ShowSuccessMessage); + RunFlags::ExpectRepoChanges | RunFlags::ShowSuccessMessage); connect(command, &VcsCommand::done, this, [this, workingDirectory, stashMode, command] { if (stashMode == StashMode::TryStash) endStashScope(workingDirectory); @@ -1464,7 +1464,7 @@ void GitClient::reset(const FilePath &workingDirectory, const QString &argument, if (!commit.isEmpty()) arguments << commit; - unsigned flags = VcsCommand::ShowSuccessMessage; + RunFlags flags = RunFlags::ShowSuccessMessage; if (argument == "--hard") { if (gitStatus(workingDirectory, StatusMode(NoUntracked | NoSubmodules)) != StatusUnchanged) { if (QMessageBox::question( @@ -1475,7 +1475,7 @@ void GitClient::reset(const FilePath &workingDirectory, const QString &argument, return; } } - flags |= VcsCommand::ExpectRepoChanges; + flags |= RunFlags::ExpectRepoChanges; } vcsExec(workingDirectory, arguments, nullptr, true, flags); } @@ -1485,7 +1485,7 @@ void GitClient::removeStaleRemoteBranches(const FilePath &workingDirectory, cons const QStringList arguments = {"remote", "prune", remote}; VcsCommand *command = vcsExec(workingDirectory, arguments, nullptr, true, - VcsCommand::ShowSuccessMessage); + RunFlags::ShowSuccessMessage); connect(command, &VcsCommand::done, this, [workingDirectory, command] { if (command->result() == ProcessResult::FinishedWithSuccess) @@ -1496,7 +1496,7 @@ void GitClient::removeStaleRemoteBranches(const FilePath &workingDirectory, cons void GitClient::recoverDeletedFiles(const FilePath &workingDirectory) { const CommandResult result = vcsSynchronousExec(workingDirectory, {"ls-files", "--deleted"}, - VcsCommand::SuppressCommandLogging); + RunFlags::SuppressCommandLogging); if (result.result() == ProcessResult::FinishedWithSuccess) { const QString stdOut = result.cleanedStdOut().trimmed(); if (stdOut.isEmpty()) { @@ -1515,7 +1515,7 @@ void GitClient::addFile(const FilePath &workingDirectory, const QString &fileNam } bool GitClient::synchronousLog(const FilePath &workingDirectory, const QStringList &arguments, - QString *output, QString *errorMessageIn, unsigned flags) + QString *output, QString *errorMessageIn, RunFlags flags) { QStringList allArguments = {"log", noColorOption}; @@ -1622,7 +1622,7 @@ bool GitClient::synchronousCheckoutFiles(const FilePath &workingDirectory, QStri arguments << revision; arguments << "--" << files; const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, - VcsCommand::ExpectRepoChanges); + RunFlags::ExpectRepoChanges); if (result.result() == ProcessResult::FinishedWithSuccess) return true; @@ -1673,7 +1673,7 @@ bool GitClient::synchronousRevListCmd(const FilePath &workingDirectory, const QS QString *output, QString *errorMessage) const { const QStringList arguments = QStringList({"rev-list", noColorOption}) + extraArguments; - const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, VcsCommand::NoOutput); + const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, RunFlags::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) { msgCannotRun(arguments, workingDirectory, result.cleanedStdErr(), errorMessage); return false; @@ -1737,7 +1737,7 @@ QString GitClient::synchronousCurrentLocalBranch(const FilePath &workingDirector { QString branch; const CommandResult result = vcsSynchronousExec(workingDirectory, {"symbolic-ref", HEAD}, - VcsCommand::NoOutput); + RunFlags::NoOutput); if (result.result() == ProcessResult::FinishedWithSuccess) { branch = result.cleanedStdOut().trimmed(); } else { @@ -1761,7 +1761,7 @@ bool GitClient::synchronousHeadRefs(const FilePath &workingDirectory, QStringLis QString *errorMessage) const { const QStringList arguments = {"show-ref", "--head", "--abbrev=10", "--dereference"}; - const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, VcsCommand::NoOutput); + const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, RunFlags::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) { msgCannotRun(arguments, workingDirectory, result.cleanedStdErr(), errorMessage); return false; @@ -1810,7 +1810,7 @@ QString GitClient::synchronousTopic(const FilePath &workingDirectory) const // No tag or remote branch - try git describe const CommandResult result = vcsSynchronousExec(workingDirectory, QStringList{"describe"}, - VcsCommand::NoOutput); + RunFlags::NoOutput); if (result.result() == ProcessResult::FinishedWithSuccess) { const QString stdOut = result.cleanedStdOut().trimmed(); if (!stdOut.isEmpty()) @@ -1823,7 +1823,7 @@ bool GitClient::synchronousRevParseCmd(const FilePath &workingDirectory, const Q QString *output, QString *errorMessage) const { const QStringList arguments = {"rev-parse", ref}; - const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, VcsCommand::NoOutput); + const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, RunFlags::NoOutput); *output = result.cleanedStdOut().trimmed(); if (result.result() == ProcessResult::FinishedWithSuccess) return true; @@ -1835,7 +1835,7 @@ bool GitClient::synchronousRevParseCmd(const FilePath &workingDirectory, const Q QString GitClient::synchronousTopRevision(const FilePath &workingDirectory, QDateTime *dateTime) { const QStringList arguments = {"show", "-s", "--pretty=format:%H:%ct", HEAD}; - const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, VcsCommand::NoOutput); + const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, RunFlags::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) return QString(); const QStringList output = result.cleanedStdOut().trimmed().split(':'); @@ -1850,14 +1850,14 @@ QString GitClient::synchronousTopRevision(const FilePath &workingDirectory, QDat bool GitClient::isRemoteCommit(const FilePath &workingDirectory, const QString &commit) { const CommandResult result = vcsSynchronousExec(workingDirectory, - {"branch", "-r", "--contains", commit}, VcsCommand::NoOutput); + {"branch", "-r", "--contains", commit}, RunFlags::NoOutput); return !result.rawStdOut().isEmpty(); } bool GitClient::isFastForwardMerge(const FilePath &workingDirectory, const QString &branch) { const CommandResult result = vcsSynchronousExec(workingDirectory, - {"merge-base", HEAD, branch}, VcsCommand::NoOutput); + {"merge-base", HEAD, branch}, RunFlags::NoOutput); return result.cleanedStdOut().trimmed() == synchronousTopRevision(workingDirectory); } @@ -1867,7 +1867,7 @@ QString GitClient::synchronousShortDescription(const FilePath &workingDirectory, { const QStringList arguments = {"log", noColorOption, ("--pretty=format:" + format), "--max-count=1", revision}; - const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, VcsCommand::NoOutput); + const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, RunFlags::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) { VcsOutputWindow::appendSilently(tr("Cannot describe revision \"%1\" in \"%2\": %3") .arg(revision, workingDirectory.toUserOutput(), result.cleanedStdErr())); @@ -1944,9 +1944,9 @@ bool GitClient::executeSynchronousStash(const FilePath &workingDirectory, arguments << "--keep-index"; if (!message.isEmpty()) arguments << message; - const unsigned flags = VcsCommand::ShowStdOut - | VcsCommand::ExpectRepoChanges - | VcsCommand::ShowSuccessMessage; + const RunFlags flags = RunFlags::ShowStdOut + | RunFlags::ExpectRepoChanges + | RunFlags::ShowSuccessMessage; const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, flags); if (result.result() == ProcessResult::FinishedWithSuccess) return true; @@ -2008,7 +2008,7 @@ bool GitClient::synchronousForEachRefCmd(const FilePath &workingDirectory, QStri QString *output, QString *errorMessage) const { args.push_front("for-each-ref"); - const CommandResult result = vcsSynchronousExec(workingDirectory, args, VcsCommand::NoOutput); + const CommandResult result = vcsSynchronousExec(workingDirectory, args, RunFlags::NoOutput); *output = result.cleanedStdOut(); if (result.result() == ProcessResult::FinishedWithSuccess) return true; @@ -2021,7 +2021,7 @@ bool GitClient::synchronousRemoteCmd(const FilePath &workingDirectory, QStringLi { remoteArgs.push_front("remote"); const CommandResult result = vcsSynchronousExec(workingDirectory, remoteArgs, - silent ? VcsCommand::NoOutput : 0); + silent ? RunFlags::NoOutput : RunFlags::None); const QString stdErr = result.cleanedStdErr(); *errorMessage = stdErr; *output = result.cleanedStdOut(); @@ -2063,7 +2063,7 @@ QStringList GitClient::synchronousSubmoduleStatus(const FilePath &workingDirecto { // get submodule status const CommandResult result = vcsSynchronousExec(workingDirectory, {"submodule", "status"}, - VcsCommand::NoOutput); + RunFlags::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) { msgCannotRun(tr("Cannot retrieve submodule status of \"%1\": %2") @@ -2136,7 +2136,7 @@ SubmoduleDataMap GitClient::submoduleList(const FilePath &workingDirectory) cons } QByteArray GitClient::synchronousShow(const FilePath &workingDirectory, const QString &id, - unsigned flags) const + RunFlags flags) const { if (!canShow(id)) { VcsOutputWindow::appendError(msgCannotShow(id)); @@ -2158,7 +2158,7 @@ bool GitClient::cleanList(const FilePath &workingDirectory, const QString &modul const FilePath directory = workingDirectory.pathAppended(modulePath); const QStringList arguments = {"clean", "--dry-run", flag}; - const CommandResult result = vcsSynchronousExec(directory, arguments, VcsCommand::ForceCLocale); + const CommandResult result = vcsSynchronousExec(directory, arguments, RunFlags::ForceCLocale); if (result.result() != ProcessResult::FinishedWithSuccess) { msgCannotRun(arguments, directory, result.cleanedStdErr(), errorMessage); return false; @@ -2315,7 +2315,7 @@ void GitClient::updateSubmodulesIfNeeded(const FilePath &workingDirectory, bool } VcsCommand *cmd = vcsExec(workingDirectory, {"submodule", "update"}, nullptr, true, - VcsCommand::ExpectRepoChanges); + RunFlags::ExpectRepoChanges); connect(cmd, &VcsCommand::done, this, &GitClient::finishSubmoduleUpdate); } @@ -2339,7 +2339,7 @@ GitClient::StatusResult GitClient::gitStatus(const FilePath &workingDirectory, S arguments << "--ignore-submodules=all"; arguments << "--porcelain" << "-b"; - const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, VcsCommand::NoOutput); + const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, RunFlags::NoOutput); const QString stdOut = result.cleanedStdOut(); if (output) @@ -2483,7 +2483,7 @@ QStringList GitClient::synchronousRepositoryBranches(const QString &repositoryUR { const CommandResult result = vcsSynchronousExec(workingDirectory, {"ls-remote", repositoryURL, HEAD, "refs/heads/*"}, - VcsCommand::SuppressStdErr | VcsCommand::SuppressFailMessage); + RunFlags::SuppressStdErr | RunFlags::SuppressFailMessage); QStringList branches; branches << tr(""); QString headSha; @@ -2708,7 +2708,7 @@ bool GitClient::readDataFromCommit(const FilePath &repoDirectory, const QString { // Get commit data as "SHA1authoremailmessage". const QStringList arguments = {"log", "--max-count=1", "--pretty=format:%h\n%an\n%ae\n%B", commit}; - const CommandResult result = vcsSynchronousExec(repoDirectory, arguments, VcsCommand::NoOutput); + const CommandResult result = vcsSynchronousExec(repoDirectory, arguments, RunFlags::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) { if (errorMessage) { @@ -2756,7 +2756,7 @@ bool GitClient::getCommitData(const FilePath &workingDirectory, QString output; if (commitData.commitType == FixupCommit) { synchronousLog(repoDirectory, {HEAD, "--not", "--remotes", "-n1"}, &output, errorMessage, - VcsCommand::SuppressCommandLogging); + RunFlags::SuppressCommandLogging); if (output.isEmpty()) { *errorMessage = msgNoCommits(false); return false; @@ -2967,7 +2967,7 @@ bool GitClient::addAndCommit(const FilePath &repositoryDirectory, } const CommandResult result = vcsSynchronousExec(repositoryDirectory, arguments, - VcsCommand::UseEventLoop); + RunFlags::UseEventLoop); if (result.result() == ProcessResult::FinishedWithSuccess) { VcsOutputWindow::appendMessage(msgCommitted(amendSHA1, commitCount)); GitPlugin::updateCurrentBranch(); @@ -3091,7 +3091,7 @@ void GitClient::fetch(const FilePath &workingDirectory, const QString &remote) { QStringList const arguments = {"fetch", (remote.isEmpty() ? "--all" : remote)}; VcsCommand *command = vcsExec(workingDirectory, arguments, nullptr, true, - VcsCommand::ShowSuccessMessage); + RunFlags::ShowSuccessMessage); connect(command, &VcsCommand::done, this, [workingDirectory, command] { if (command->result() == ProcessResult::FinishedWithSuccess) GitPlugin::updateBranches(workingDirectory); @@ -3102,9 +3102,9 @@ bool GitClient::executeAndHandleConflicts(const FilePath &workingDirectory, const QStringList &arguments, const QString &abortCommand) const { - const unsigned flags = VcsCommand::ShowStdOut - | VcsCommand::ExpectRepoChanges - | VcsCommand::ShowSuccessMessage; + const RunFlags flags = RunFlags::ShowStdOut + | RunFlags::ExpectRepoChanges + | RunFlags::ShowSuccessMessage; const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, flags); // Notify about changed files or abort the rebase. ConflictHandler::handleResponse(result, workingDirectory, abortCommand); @@ -3140,7 +3140,7 @@ void GitClient::synchronousAbortCommand(const FilePath &workingDir, const QStrin } const CommandResult result = vcsSynchronousExec(workingDir, {abortCommand, "--abort"}, - VcsCommand::ExpectRepoChanges | VcsCommand::ShowSuccessMessage); + RunFlags::ExpectRepoChanges | RunFlags::ShowSuccessMessage); VcsOutputWindow::append(result.cleanedStdOut()); } @@ -3225,7 +3225,7 @@ void GitClient::addFuture(const QFuture &future) void GitClient::synchronousSubversionFetch(const FilePath &workingDirectory) const { vcsSynchronousExec(workingDirectory, {"svn", "fetch"}, - VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage); + RunFlags::ShowStdOut | RunFlags::ShowSuccessMessage); } void GitClient::subversionLog(const FilePath &workingDirectory) const @@ -3247,7 +3247,7 @@ void GitClient::subversionLog(const FilePath &workingDirectory) const void GitClient::subversionDeltaCommit(const FilePath &workingDirectory) const { - vcsExec(workingDirectory, {"svn", "dcommit"}, nullptr, true, VcsCommand::ShowSuccessMessage); + vcsExec(workingDirectory, {"svn", "dcommit"}, nullptr, true, RunFlags::ShowSuccessMessage); } class PushHandler : public QObject @@ -3257,7 +3257,7 @@ public: : m_gitClient(gitClient) { VcsCommand *command = gitClient->vcsExec(workingDir, QStringList({"push"}) + pushArgs, - nullptr, true, VcsCommand::ShowSuccessMessage); + nullptr, true, RunFlags::ShowSuccessMessage); // Make command a parent of this in order to delete this when command is deleted setParent(command); connect(command, &VcsCommand::done, this, [=] { @@ -3284,7 +3284,7 @@ public: } VcsCommand *rePushCommand = m_gitClient->vcsExec(workingDir, QStringList({"push", "--force-with-lease"}) + pushArgs, - nullptr, true, VcsCommand::ShowSuccessMessage); + nullptr, true, RunFlags::ShowSuccessMessage); connect(rePushCommand, &VcsCommand::done, this, [rePushCommand] { if (rePushCommand->result() == ProcessResult::FinishedWithSuccess) GitPlugin::updateCurrentBranch(); @@ -3306,7 +3306,7 @@ public: const QStringList fallbackCommandParts = pushFallbackCommand.split(' ', Qt::SkipEmptyParts); VcsCommand *rePushCommand = m_gitClient->vcsExec(workingDir, - fallbackCommandParts.mid(1), nullptr, true, VcsCommand::ShowSuccessMessage); + fallbackCommandParts.mid(1), nullptr, true, RunFlags::ShowSuccessMessage); connect(rePushCommand, &VcsCommand::done, this, [workingDir, rePushCommand] { if (rePushCommand->result() == ProcessResult::FinishedWithSuccess) GitPlugin::updateBranches(workingDir); @@ -3398,7 +3398,7 @@ VcsCommand *GitClient::vcsExecAbortable(const FilePath &workingDirectory, if (abortCommand.isEmpty()) abortCommand = arguments.at(0); VcsCommand *command = createCommand(workingDirectory, nullptr, VcsWindowOutputBind); - command->addFlags(VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage); + command->addFlags(RunFlags::ShowStdOut | RunFlags::ShowSuccessMessage); // For rebase, Git might request an editor (which means the process keeps running until the // user closes it), so run without timeout. command->addJob({vcsBinary(), arguments}, isRebase ? 0 : vcsTimeoutS()); @@ -3464,7 +3464,7 @@ void GitClient::stashPop(const FilePath &workingDirectory, const QString &stash) if (!stash.isEmpty()) arguments << stash; VcsCommand *cmd = vcsExec(workingDirectory, arguments, nullptr, true, - VcsCommand::ExpectRepoChanges); + RunFlags::ExpectRepoChanges); ConflictHandler::attachToCommand(cmd, workingDirectory); } @@ -3508,7 +3508,7 @@ bool GitClient::synchronousStashList(const FilePath &workingDirectory, QListsynchronousLog(workingDirectory, {"-n", "1", "--format=%s", target}, - &subject, nullptr, VcsCommand::NoOutput); + &subject, nullptr, RunFlags::NoOutput); initialName = subject.trimmed(); } QString suggestedName = initialName; diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index f20b5bc45a5..dae7d19194d 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -159,7 +159,7 @@ public: void addFile(const Utils::FilePath &workingDirectory, const QString &fileName); bool synchronousLog(const Utils::FilePath &workingDirectory, const QStringList &arguments, QString *output, QString *errorMessage = nullptr, - unsigned flags = 0); + VcsBase::RunFlags flags = VcsBase::RunFlags::None); bool synchronousAdd(const Utils::FilePath &workingDirectory, const QStringList &files, const QStringList &extraOptions = {}); bool synchronousDelete(const Utils::FilePath &workingDirectory, @@ -218,7 +218,7 @@ public: QString *errorMessage = nullptr) const; SubmoduleDataMap submoduleList(const Utils::FilePath &workingDirectory) const; QByteArray synchronousShow(const Utils::FilePath &workingDirectory, const QString &id, - unsigned flags = 0) const; + VcsBase::RunFlags flags = VcsBase::RunFlags::None) const; bool synchronousRevListCmd(const Utils::FilePath &workingDirectory, const QStringList &extraArguments, QString *output, QString *errorMessage = nullptr) const; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 328db5009b8..83446e1f04b 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -1867,7 +1867,7 @@ VcsCommand *GitPluginPrivate::createInitialCheckoutCommand(const QString &url, args << extraArgs << url << localName; auto command = VcsBaseClient::createVcsCommand(baseDirectory, m_gitClient.processEnvironment()); - command->addFlags(VcsCommand::SuppressStdErr); + command->addFlags(RunFlags::SuppressStdErr); command->addJob({m_gitClient.vcsBinary(), args}, -1); return command; } diff --git a/src/plugins/git/logchangedialog.cpp b/src/plugins/git/logchangedialog.cpp index 8198257d899..ac8c9feb45e 100644 --- a/src/plugins/git/logchangedialog.cpp +++ b/src/plugins/git/logchangedialog.cpp @@ -46,7 +46,7 @@ public: if (it != m_descriptions.constEnd()) return *it; const QString desc = QString::fromUtf8(GitClient::instance()->synchronousShow( - m_workingDirectory, revision, VcsCommand::NoOutput)); + m_workingDirectory, revision, RunFlags::NoOutput)); m_descriptions[revision] = desc; return desc; } @@ -169,7 +169,7 @@ bool LogChangeWidget::populateLog(const FilePath &repository, const QString &com arguments << "--"; QString output; if (!GitClient::instance()->synchronousLog( - repository, arguments, &output, nullptr, VcsCommand::NoOutput)) { + repository, arguments, &output, nullptr, RunFlags::NoOutput)) { return false; } const QStringList lines = output.split('\n'); diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index 338308378e1..ee43b9ef96e 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -50,7 +50,7 @@ public: void MercurialDiffEditorController::runCommand(const QList &args, QTextCodec *codec) { // at this moment, don't ignore any errors - VcsBaseDiffEditorController::runCommand(args, 0u, codec); + VcsBaseDiffEditorController::runCommand(args, RunFlags::None, codec); } QStringList MercurialDiffEditorController::addConfigurationArguments(const QStringList &args) const @@ -96,7 +96,7 @@ bool MercurialClient::synchronousClone(const FilePath &workingDirectory, { Q_UNUSED(srcLocation) Q_UNUSED(extraOptions) - const unsigned flags = VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage; + const RunFlags flags = RunFlags::ShowStdOut | RunFlags::ShowSuccessMessage; if (workingDirectory.exists()) { // Let's make first init @@ -142,7 +142,7 @@ bool MercurialClient::synchronousPull(const FilePath &workingDir, const QString args << vcsCommandString(PullCommand) << extraOptions << srcLocation; const CommandResult result = vcsSynchronousExec(workingDir, args, - VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage | VcsCommand::ForceCLocale); + RunFlags::ShowStdOut | RunFlags::ShowSuccessMessage | RunFlags::ForceCLocale); parsePullOutput(result.cleanedStdOut().trimmed()); return result.result() == ProcessResult::FinishedWithSuccess; diff --git a/src/plugins/subversion/subversionclient.cpp b/src/plugins/subversion/subversionclient.cpp index ecdddd354db..104488f789e 100644 --- a/src/plugins/subversion/subversionclient.cpp +++ b/src/plugins/subversion/subversionclient.cpp @@ -69,7 +69,7 @@ bool SubversionClient::doCommit(const FilePath &repositoryRoot, << commitMessageFile << escapeFiles(files); const CommandResult result = vcsSynchronousExec(repositoryRoot, args, - VcsCommand::ShowStdOut | VcsCommand::UseEventLoop); + RunFlags::ShowStdOut | RunFlags::UseEventLoop); return result.result() == ProcessResult::FinishedWithSuccess; } @@ -197,7 +197,7 @@ void SubversionDiffEditorController::requestDescription() args << m_authenticationOptions; args << QLatin1String("-r"); args << QString::number(m_changeNumber); - runCommand(QList() << args, 0); + runCommand(QList() << args, RunFlags::None); } void SubversionDiffEditorController::requestDiff() @@ -216,7 +216,7 @@ void SubversionDiffEditorController::requestDiff() } else { args << m_filesList; } - runCommand(QList() << args, 0); + runCommand(QList() << args, RunFlags::None); } void SubversionDiffEditorController::processCommandOutput(const QString &output) diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index d23979f97a3..3ded484a40b 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -223,7 +223,7 @@ public: QString monitorFile(const FilePath &repository) const; QString synchronousTopic(const FilePath &repository) const; SubversionResponse runSvn(const FilePath &workingDir, const QStringList &arguments, - unsigned flags = 0, int defaultTimeoutMutiplier = 1, + RunFlags flags = RunFlags::None, int defaultTimeoutMutiplier = 1, QTextCodec *outputCodec = nullptr) const; void vcsAnnotateHelper(const FilePath &workingDir, const QString &file, const QString &revision = {}, int lineNumber = -1); @@ -670,7 +670,7 @@ void SubversionPluginPrivate::revertAll() args << QLatin1String("revert"); args << SubversionClient::addAuthenticationOptions(m_settings); args << QLatin1String("--recursive") << state.topLevel().toString(); - const auto revertResponse = runSvn(state.topLevel(), args, VcsCommand::ShowStdOut); + const auto revertResponse = runSvn(state.topLevel(), args, RunFlags::ShowStdOut); if (revertResponse.error) QMessageBox::warning(ICore::dialogParent(), title, tr("Revert failed: %1").arg(revertResponse.message), QMessageBox::Ok); @@ -707,7 +707,7 @@ void SubversionPluginPrivate::revertCurrentFile() args << SubversionClient::addAuthenticationOptions(m_settings); args << SubversionClient::escapeFile(state.relativeCurrentFile()); - const auto revertResponse = runSvn(state.currentFileTopLevel(), args, VcsCommand::ShowStdOut); + const auto revertResponse = runSvn(state.currentFileTopLevel(), args, RunFlags::ShowStdOut); if (!revertResponse.error) emit filesChanged(QStringList(state.currentFile())); @@ -851,7 +851,7 @@ void SubversionPluginPrivate::svnStatus(const FilePath &workingDir, const QStrin if (!relativePath.isEmpty()) args.append(SubversionClient::escapeFile(relativePath)); VcsOutputWindow::setRepository(workingDir); - runSvn(workingDir, args, VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage); + runSvn(workingDir, args, RunFlags::ShowStdOut | RunFlags::ShowSuccessMessage); VcsOutputWindow::clearRepository(); } @@ -876,7 +876,7 @@ void SubversionPluginPrivate::svnUpdate(const FilePath &workingDir, const QStrin args.push_back(QLatin1String(Constants::NON_INTERACTIVE_OPTION)); if (!relativePath.isEmpty()) args.append(relativePath); - const auto response = runSvn(workingDir, args, VcsCommand::ShowStdOut, 10); + const auto response = runSvn(workingDir, args, RunFlags::ShowStdOut, 10); if (!response.error) emit repositoryChanged(workingDir); } @@ -904,7 +904,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons args.push_back(QLatin1String("-v")); args.append(QDir::toNativeSeparators(SubversionClient::escapeFile(file))); - const auto response = runSvn(workingDir, args, VcsCommand::ForceCLocale, 1, codec); + const auto response = runSvn(workingDir, args, RunFlags::ForceCLocale, 1, codec); if (response.error) return; @@ -984,7 +984,7 @@ void SubversionPluginPrivate::commitFromEditor() SubversionResponse SubversionPluginPrivate::runSvn(const FilePath &workingDir, const QStringList &arguments, - unsigned flags, int defaultTimeoutMutiplier, + RunFlags flags, int defaultTimeoutMutiplier, QTextCodec *outputCodec) const { SubversionResponse response; @@ -1061,7 +1061,7 @@ bool SubversionPluginPrivate::vcsAdd(const FilePath &workingDir, const QString & args << QLatin1String("add") << SubversionClient::addAuthenticationOptions(m_settings) << QLatin1String("--parents") << file; - const auto response = runSvn(workingDir, args, VcsCommand::ShowStdOut); + const auto response = runSvn(workingDir, args, RunFlags::ShowStdOut); return !response.error; } @@ -1074,7 +1074,7 @@ bool SubversionPluginPrivate::vcsDelete(const FilePath &workingDir, const QStrin args << SubversionClient::addAuthenticationOptions(m_settings) << QLatin1String("--force") << file; - const auto response = runSvn(workingDir, args, VcsCommand::ShowStdOut); + const auto response = runSvn(workingDir, args, RunFlags::ShowStdOut); return !response.error; } @@ -1084,7 +1084,7 @@ bool SubversionPluginPrivate::vcsMove(const FilePath &workingDir, const QString args << SubversionClient::addAuthenticationOptions(m_settings); args << QDir::toNativeSeparators(SubversionClient::escapeFile(from)) << QDir::toNativeSeparators(SubversionClient::escapeFile(to)); - const auto response = runSvn(workingDir, args, VcsCommand::ShowStdOut); + const auto response = runSvn(workingDir, args, RunFlags::ShowStdOut); return !response.error; } @@ -1110,7 +1110,7 @@ bool SubversionPluginPrivate::vcsCheckout(const FilePath &directory, const QByte args << QLatin1String(tempUrl.toEncoded()) << directory.toString(); - const auto response = runSvn(directory, args, 0, 10); + const auto response = runSvn(directory, args, RunFlags::None, 10); return !response.error; } diff --git a/src/plugins/vcsbase/CMakeLists.txt b/src/plugins/vcsbase/CMakeLists.txt index 327e872b5f7..04ff2241621 100644 --- a/src/plugins/vcsbase/CMakeLists.txt +++ b/src/plugins/vcsbase/CMakeLists.txt @@ -26,6 +26,7 @@ add_qtc_plugin(VcsBase vcsbaseplugin.cpp vcsbaseplugin.h vcsbasesubmiteditor.cpp vcsbasesubmiteditor.h vcscommand.cpp vcscommand.h + vcsenums.h vcsoutputformatter.cpp vcsoutputformatter.h vcsoutputwindow.cpp vcsoutputwindow.h vcsplugin.cpp vcsplugin.h diff --git a/src/plugins/vcsbase/vcsbase.qbs b/src/plugins/vcsbase/vcsbase.qbs index 8c91a54af1a..0c2f08abd58 100644 --- a/src/plugins/vcsbase/vcsbase.qbs +++ b/src/plugins/vcsbase/vcsbase.qbs @@ -60,6 +60,7 @@ QtcPlugin { "vcsbasesubmiteditor.h", "vcscommand.cpp", "vcscommand.h", + "vcsenums.h", "vcsoutputformatter.cpp", "vcsoutputformatter.h", "vcsoutputwindow.cpp", diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 6c5354a99ef..59936e8d560 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -79,9 +79,9 @@ VcsCommand *VcsBaseClientImpl::createCommand(const FilePath &workingDirectory, if (editor) editor->setCommand(cmd); if (mode == VcsWindowOutputBind) { - cmd->addFlags(VcsCommand::ShowStdOut); + cmd->addFlags(RunFlags::ShowStdOut); if (editor) // assume that the commands output is the important thing - cmd->addFlags(VcsCommand::SilentOutput); + cmd->addFlags(RunFlags::SilentOutput); } else if (editor) { connect(cmd, &VcsCommand::done, editor, [editor, cmd] { if (cmd->result() != ProcessResult::FinishedWithSuccess) { @@ -129,13 +129,13 @@ QString VcsBaseClientImpl::stripLastNewline(const QString &in) } CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir, - const QStringList &args, unsigned flags, int timeoutS, QTextCodec *codec) const + const QStringList &args, RunFlags flags, int timeoutS, QTextCodec *codec) const { return vcsSynchronousExec(workingDir, {vcsBinary(), args}, flags, timeoutS, codec); } CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir, - const CommandLine &cmdLine, unsigned flags, int timeoutS, QTextCodec *codec) const + const CommandLine &cmdLine, RunFlags flags, int timeoutS, QTextCodec *codec) const { return VcsCommand::runBlocking(workingDir, processEnvironment(), cmdLine, flags, timeoutS > 0 ? timeoutS : vcsTimeoutS(), codec); @@ -162,7 +162,7 @@ void VcsBaseClientImpl::annotateRevisionRequested(const FilePath &workingDirecto VcsCommand *VcsBaseClientImpl::vcsExec(const FilePath &workingDirectory, const QStringList &arguments, VcsBaseEditorWidget *editor, bool useOutputToWindow, - unsigned additionalFlags) const + RunFlags additionalFlags) const { VcsCommand *command = createCommand(workingDirectory, editor, useOutputToWindow ? VcsWindowOutputBind : NoOutputBind); @@ -288,7 +288,7 @@ bool VcsBaseClient::synchronousPull(const FilePath &workingDir, { QStringList args; args << vcsCommandString(PullCommand) << extraOptions << srcLocation; - const unsigned flags = VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage; + const RunFlags flags = RunFlags::ShowStdOut | RunFlags::ShowSuccessMessage; const bool ok = vcsSynchronousExec(workingDir, args, flags).result() == ProcessResult::FinishedWithSuccess; if (ok) @@ -302,7 +302,7 @@ bool VcsBaseClient::synchronousPush(const FilePath &workingDir, { QStringList args; args << vcsCommandString(PushCommand) << extraOptions << dstLocation; - const unsigned flags = VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage; + const RunFlags flags = RunFlags::ShowStdOut | RunFlags::ShowSuccessMessage; return vcsSynchronousExec(workingDir, args, flags).result() == ProcessResult::FinishedWithSuccess; } diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h index 40f7db25319..ed8c799ee9c 100644 --- a/src/plugins/vcsbase/vcsbaseclient.h +++ b/src/plugins/vcsbase/vcsbaseclient.h @@ -4,6 +4,7 @@ #pragma once #include "vcsbase_global.h" +#include "vcsenums.h" #include "vcsbaseclientsettings.h" @@ -77,10 +78,11 @@ public: // Fully synchronous VCS execution (QProcess-based) CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir, - const QStringList &args, unsigned flags = 0, + const QStringList &args, RunFlags flags = RunFlags::None, int timeoutS = -1, QTextCodec *codec = nullptr) const; CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir, - const Utils::CommandLine &cmdLine, unsigned flags = 0, + const Utils::CommandLine &cmdLine, + RunFlags flags = RunFlags::None, int timeoutS = -1, QTextCodec *codec = nullptr) const; // Simple helper to execute a single command using createCommand and enqueueJob. @@ -88,7 +90,7 @@ public: const QStringList &arguments, VcsBaseEditorWidget *editor = nullptr, bool useOutputToWindow = false, - unsigned additionalFlags = 0) const; + RunFlags additionalFlags = RunFlags::None) const; protected: void resetCachedVcsInfo(const Utils::FilePath &workingDir); diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp index ebb3d8ca407..b1c1ecc3bc2 100644 --- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp +++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp @@ -134,7 +134,7 @@ VcsBaseDiffEditorController::~VcsBaseDiffEditorController() delete d; } -void VcsBaseDiffEditorController::runCommand(const QList &args, unsigned flags, QTextCodec *codec) +void VcsBaseDiffEditorController::runCommand(const QList &args, RunFlags flags, QTextCodec *codec) { // Cancel the possible ongoing reload without the commandFinished() nor // processingFinished() notifications, as right after that diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.h b/src/plugins/vcsbase/vcsbasediffeditorcontroller.h index d8975bd3645..b5c1f2b86bc 100644 --- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.h +++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.h @@ -4,6 +4,7 @@ #pragma once #include "vcsbase_global.h" +#include "vcsenums.h" #include @@ -36,7 +37,7 @@ public: void setWorkingDirectory(const Utils::FilePath &workingDir); protected: - void runCommand(const QList &args, unsigned flags, QTextCodec *codec = nullptr); + void runCommand(const QList &args, RunFlags flags, QTextCodec *codec = nullptr); virtual void processCommandOutput(const QString &output); Utils::FilePath workingDirectory() const; diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index 813bb865ebe..7a8a15a1b6c 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -71,7 +71,7 @@ public: Environment environment() { - if (!(m_flags & VcsCommand::ForceCLocale)) + if (!(m_flags & RunFlags::ForceCLocale)) return m_environment; m_environment.set("LANG", "C"); @@ -109,7 +109,7 @@ public: ProcessResult m_result = ProcessResult::StartFailed; QFutureInterface m_futureInterface; - unsigned m_flags = 0; + RunFlags m_flags = RunFlags::None; bool m_progressiveOutput = false; }; @@ -140,7 +140,7 @@ int VcsCommandPrivate::timeoutS() const void VcsCommandPrivate::setup() { m_futureInterface.reportStarted(); - if (m_flags & VcsCommand::ExpectRepoChanges) { + if (m_flags & RunFlags::ExpectRepoChanges) { QMetaObject::invokeMethod(GlobalFileChangeBlocker::instance(), [] { GlobalFileChangeBlocker::instance()->forceBlocked(true); }); @@ -153,7 +153,7 @@ void VcsCommandPrivate::cleanup() { QTC_ASSERT(m_futureInterface.isRunning(), return); m_futureInterface.reportFinished(); - if (m_flags & VcsCommand::ExpectRepoChanges) { + if (m_flags & RunFlags::ExpectRepoChanges) { QMetaObject::invokeMethod(GlobalFileChangeBlocker::instance(), [] { GlobalFileChangeBlocker::instance()->forceBlocked(false); }); @@ -169,12 +169,12 @@ void VcsCommandPrivate::setupProcess(QtcProcess *process, const Job &job) process->setTimeoutS(job.timeoutS); if (!job.workingDirectory.isEmpty()) process->setWorkingDirectory(job.workingDirectory); - if (!(m_flags & VcsCommand::SuppressCommandLogging)) + if (!(m_flags & RunFlags::SuppressCommandLogging)) emit q->appendCommand(job.workingDirectory, job.command); process->setCommand(job.command); process->setDisableUnixTerminal(); process->setEnvironment(environment()); - if (m_flags & VcsCommand::MergeOutputChannels) + if (m_flags & RunFlags::MergeOutputChannels) process->setProcessChannelMode(QProcess::MergedChannels); if (m_codec) process->setCodec(m_codec); @@ -184,24 +184,24 @@ void VcsCommandPrivate::setupProcess(QtcProcess *process, const Job &job) void VcsCommandPrivate::installStdCallbacks(QtcProcess *process) { - if (!(m_flags & VcsCommand::MergeOutputChannels) - && (m_progressiveOutput || !(m_flags & VcsCommand::SuppressStdErr))) { + if (!(m_flags & RunFlags::MergeOutputChannels) + && (m_progressiveOutput || !(m_flags & RunFlags::SuppressStdErr))) { process->setStdErrCallback([this](const QString &text) { if (m_progressParser) m_progressParser->parseProgress(text); - if (!(m_flags & VcsCommand::SuppressStdErr)) + if (!(m_flags & RunFlags::SuppressStdErr)) emit q->appendError(text); if (m_progressiveOutput) emit q->stdErrText(text); }); } // connect stdout to the output window if desired - if (m_progressParser || m_progressiveOutput || (m_flags & VcsCommand::ShowStdOut)) { + if (m_progressParser || m_progressiveOutput || (m_flags & RunFlags::ShowStdOut)) { process->setStdOutCallback([this](const QString &text) { if (m_progressParser) m_progressParser->parseProgress(text); - if (m_flags & VcsCommand::ShowStdOut) { - if (m_flags & VcsCommand::SilentOutput) + if (m_flags & RunFlags::ShowStdOut) { + if (m_flags & RunFlags::SilentOutput) emit q->appendSilently(text); else emit q->append(text); @@ -216,7 +216,7 @@ void VcsCommandPrivate::installStdCallbacks(QtcProcess *process) EventLoopMode VcsCommandPrivate::eventLoopMode() const { - if ((m_flags & VcsCommand::UseEventLoop) && QThread::currentThread() == qApp->thread()) + if ((m_flags & RunFlags::UseEventLoop) && QThread::currentThread() == qApp->thread()) return EventLoopMode::On; return EventLoopMode::Off; } @@ -225,9 +225,9 @@ void VcsCommandPrivate::handleDone(QtcProcess *process) { // Success/Fail message in appropriate window? if (process->result() == ProcessResult::FinishedWithSuccess) { - if (m_flags & VcsCommand::ShowSuccessMessage) + if (m_flags & RunFlags::ShowSuccessMessage) emit q->appendMessage(process->exitMessage()); - } else if (!(m_flags & VcsCommand::SuppressFailMessage)) { + } else if (!(m_flags & RunFlags::SuppressFailMessage)) { emit q->appendError(process->exitMessage()); } emit q->runCommandFinished(process->workingDirectory()); @@ -303,7 +303,7 @@ VcsCommand::VcsCommand(const FilePath &workingDirectory, const Environment &envi void VcsCommand::postRunCommand(const FilePath &workingDirectory) { - if (!(d->m_flags & VcsCommand::ExpectRepoChanges)) + if (!(d->m_flags & RunFlags::ExpectRepoChanges)) return; // TODO tell the document manager that the directory now received all expected changes // Core::DocumentManager::unexpectDirectoryChange(d->m_workingDirectory); @@ -324,7 +324,7 @@ void VcsCommand::setDisplayName(const QString &name) d->m_displayName = name; } -void VcsCommand::addFlags(unsigned f) +void VcsCommand::addFlags(RunFlags f) { d->m_flags |= f; } @@ -345,7 +345,7 @@ void VcsCommand::start() d->startAll(); d->m_watcher.setFuture(d->m_futureInterface.future()); - if ((d->m_flags & VcsCommand::SuppressCommandLogging)) + if ((d->m_flags & RunFlags::SuppressCommandLogging)) return; const QString name = d->displayName(); @@ -385,7 +385,7 @@ ProcessResult VcsCommand::result() const CommandResult VcsCommand::runBlocking(const Utils::FilePath &workingDirectory, const Utils::Environment &environment, - const Utils::CommandLine &command, unsigned flags, + const Utils::CommandLine &command, RunFlags flags, int timeoutS, QTextCodec *codec) { VcsCommand vcsCommand(workingDirectory, environment); diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h index 45ebf117628..fb3a2a499a9 100644 --- a/src/plugins/vcsbase/vcscommand.h +++ b/src/plugins/vcsbase/vcscommand.h @@ -4,6 +4,7 @@ #pragma once #include "vcsbase_global.h" +#include "vcsenums.h" #include #include @@ -81,21 +82,6 @@ class VCSBASE_EXPORT VcsCommand final : public QObject Q_OBJECT public: - // Convenience to synchronously run commands - enum RunFlags { - ShowStdOut = 0x1, // Show standard output. - MergeOutputChannels = 0x2, // see QProcess: Merge stderr/stdout. - SuppressStdErr = 0x4, // Suppress standard error output. - SuppressFailMessage = 0x8, // No message about command failure. - SuppressCommandLogging = 0x10, // No command log entry. - ShowSuccessMessage = 0x20, // Show message about successful completion of command. - ForceCLocale = 0x40, // Force C-locale for commands whose output is parsed. - SilentOutput = 0x80, // Suppress user notifications about the output happening. - UseEventLoop = 0x100, // Use event loop when executed in UI thread. - ExpectRepoChanges = 0x200, // Expect changes in repository by the command - NoOutput = SuppressStdErr | SuppressFailMessage | SuppressCommandLogging - }; - VcsCommand(const Utils::FilePath &workingDirectory, const Utils::Environment &environment); ~VcsCommand() override; @@ -106,7 +92,7 @@ public: const Utils::ExitCodeInterpreter &interpreter = {}); void start(); - void addFlags(unsigned f); + void addFlags(RunFlags f); void setCodec(QTextCodec *codec); @@ -115,7 +101,7 @@ public: static CommandResult runBlocking(const Utils::FilePath &workingDirectory, const Utils::Environment &environmentconst, - const Utils::CommandLine &command, unsigned flags, + const Utils::CommandLine &command, RunFlags flags, int timeoutS, QTextCodec *codec); void cancel(); diff --git a/src/plugins/vcsbase/vcsenums.h b/src/plugins/vcsbase/vcsenums.h new file mode 100644 index 00000000000..1ae5e2735dd --- /dev/null +++ b/src/plugins/vcsbase/vcsenums.h @@ -0,0 +1,47 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "vcsbase_global.h" + +namespace VcsBase { + +enum class RunFlags { + None = 0, // Empty + ShowStdOut = (1 << 0), // Show standard output. + MergeOutputChannels = (1 << 1), // See QProcess: Merge stderr/stdout. + SuppressStdErr = (1 << 2), // Suppress standard error output. + SuppressFailMessage = (1 << 3), // No message about command failure. + SuppressCommandLogging = (1 << 4), // No command log entry. + ShowSuccessMessage = (1 << 5), // Show message about successful completion of command. + ForceCLocale = (1 << 6), // Force C-locale for commands whose output is parsed. + SilentOutput = (1 << 7), // Suppress user notifications about the output happening. + UseEventLoop = (1 << 8), // Use event loop when executed in UI thread. + ExpectRepoChanges = (1 << 9), // Expect changes in repository by the command + NoOutput = SuppressStdErr | SuppressFailMessage | SuppressCommandLogging +}; + +inline void VCSBASE_EXPORT operator|=(RunFlags &p, RunFlags r) +{ + p = RunFlags(int(p) | int(r)); +} + +inline RunFlags VCSBASE_EXPORT operator|(RunFlags p, RunFlags r) +{ + return RunFlags(int(p) | int(r)); +} + +inline void VCSBASE_EXPORT operator&=(RunFlags &p, RunFlags r) +{ + p = RunFlags(int(p) & int(r)); +} + +// Note, that it returns bool, not RunFlags. +// It's only meant for testing whether a specific bit is set. +inline bool VCSBASE_EXPORT operator&(RunFlags p, RunFlags r) +{ + return bool(int(p) & int(r)); +} + +} // namespace VcsBase From 87a32429fe9c4cc15815e4f4dc90a7e4639ec049 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 10:18:44 +0200 Subject: [PATCH 047/104] Cvs: Replace timeout with timeout multiplier Give it default value of 1. Move this arg as the last one. This is similar change to 4bcdfa6b19ee78cb9f457dfc6f153ae1297240b0. Change-Id: Idb83d47d2412c495ac227f5663d3256b1870d437 Reviewed-by: Orgad Shaneh Reviewed-by: --- src/plugins/cvs/cvsplugin.cpp | 58 +++++++++++++++-------------------- 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 17e67565978..7ded447dc64 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -284,9 +284,9 @@ private: CvsResponse runCvs(const FilePath &workingDirectory, const QStringList &arguments, - int timeOutS, RunFlags flags = RunFlags::None, - QTextCodec *outputCodec = nullptr) const; + QTextCodec *outputCodec = nullptr, + int timeoutMultiplier = 1) const; void annotate(const FilePath &workingDir, const QString &file, const QString &revision = QString(), int lineNumber= -1); @@ -847,8 +847,7 @@ void CvsPluginPrivate::revertAll() return; QStringList args; args << QLatin1String("update") << QLatin1String("-C") << state.topLevel().toString(); - const auto revertResponse = runCvs(state.topLevel(), args, m_settings.timeout.value(), - RunFlags::ShowStdOut); + const auto revertResponse = runCvs(state.topLevel(), args, RunFlags::ShowStdOut); if (revertResponse.result == CvsResponse::Ok) emit repositoryChanged(state.topLevel()); else @@ -862,8 +861,7 @@ void CvsPluginPrivate::revertCurrentFile() QTC_ASSERT(state.hasFile(), return); QStringList args; args << QLatin1String("diff") << state.relativeCurrentFile(); - const CvsResponse diffResponse = - runCvs(state.currentFileTopLevel(), args, m_settings.timeout.value()); + const CvsResponse diffResponse = runCvs(state.currentFileTopLevel(), args); switch (diffResponse.result) { case CvsResponse::Ok: return; // Not modified, diff exit code 0 @@ -884,8 +882,7 @@ void CvsPluginPrivate::revertCurrentFile() // revert args.clear(); args << QLatin1String("update") << QLatin1String("-C") << state.relativeCurrentFile(); - const auto revertResponse = runCvs(state.currentFileTopLevel(), args, - m_settings.timeout.value(), RunFlags::ShowStdOut); + const auto revertResponse = runCvs(state.currentFileTopLevel(), args, RunFlags::ShowStdOut); if (revertResponse.result == CvsResponse::Ok) emit filesChanged(QStringList(state.currentFile())); } @@ -948,8 +945,7 @@ void CvsPluginPrivate::startCommit(const FilePath &workingDir, const QString &fi // We need the "Examining " stderr output to tell // where we are, so, have stdout/stderr channels merged. QStringList args = QStringList(QLatin1String("status")); - const CvsResponse response = - runCvs(workingDir, args, m_settings.timeout.value(), RunFlags::MergeOutputChannels); + const CvsResponse response = runCvs(workingDir, args, RunFlags::MergeOutputChannels); if (response.result != CvsResponse::Ok) return; // Get list of added/modified/deleted files and purge out undesired ones @@ -994,8 +990,7 @@ bool CvsPluginPrivate::commit(const QString &messageFile, QStringList args = QStringList(QLatin1String("commit")); args << QLatin1String("-F") << messageFile; args.append(fileList); - const auto response = runCvs(m_commitRepository, args, 10 * m_settings.timeout.value(), - RunFlags::ShowStdOut); + const auto response = runCvs(m_commitRepository, args, RunFlags::ShowStdOut, nullptr, 10); return response.result == CvsResponse::Ok ; } @@ -1031,8 +1026,7 @@ void CvsPluginPrivate::filelog(const FilePath &workingDir, QStringList args; args << QLatin1String("log"); args.append(file); - const CvsResponse response = - runCvs(workingDir, args, m_settings.timeout.value(), RunFlags::None, codec); + const CvsResponse response = runCvs(workingDir, args, RunFlags::None, codec); if (response.result != CvsResponse::Ok) return; @@ -1071,7 +1065,7 @@ bool CvsPluginPrivate::update(const FilePath &topLevel, const QString &file) args.push_back(QLatin1String("-dR")); if (!file.isEmpty()) args.append(file); - const auto response = runCvs(topLevel, args, 10 * m_settings.timeout.value(), RunFlags::ShowStdOut); + const auto response = runCvs(topLevel, args, RunFlags::ShowStdOut, nullptr, 10); const bool ok = response.result == CvsResponse::Ok; if (ok) emit repositoryChanged(topLevel); @@ -1116,7 +1110,7 @@ bool CvsPluginPrivate::edit(const FilePath &topLevel, const QStringList &files) { QStringList args(QLatin1String("edit")); args.append(files); - const auto response = runCvs(topLevel, args, m_settings.timeout.value(), RunFlags::ShowStdOut); + const auto response = runCvs(topLevel, args, RunFlags::ShowStdOut); return response.result == CvsResponse::Ok; } @@ -1127,7 +1121,7 @@ bool CvsPluginPrivate::diffCheckModified(const FilePath &topLevel, const QString QStringList args(QLatin1String("-q")); args << QLatin1String("diff"); args.append(files); - const CvsResponse response = runCvs(topLevel, args, m_settings.timeout.value()); + const CvsResponse response = runCvs(topLevel, args); if (response.result == CvsResponse::OtherError) return false; *modified = response.result == CvsResponse::NonNullExitCode; @@ -1154,7 +1148,7 @@ bool CvsPluginPrivate::unedit(const FilePath &topLevel, const QStringList &files if (modified) args.append(QLatin1String("-y")); args.append(files); - const auto response = runCvs(topLevel, args, m_settings.timeout.value(), RunFlags::ShowStdOut); + const auto response = runCvs(topLevel, args, RunFlags::ShowStdOut); return response.result == CvsResponse::Ok; } @@ -1171,8 +1165,7 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file, if (!revision.isEmpty()) args << QLatin1String("-r") << revision; args << file; - const CvsResponse response = runCvs(workingDir, args, m_settings.timeout.value(), - RunFlags::None, codec); + const CvsResponse response = runCvs(workingDir, args, RunFlags::None, codec); if (response.result != CvsResponse::Ok) return; @@ -1199,7 +1192,7 @@ bool CvsPluginPrivate::status(const FilePath &topLevel, const QString &file, con QStringList args(QLatin1String("status")); if (!file.isEmpty()) args.append(file); - const CvsResponse response = runCvs(topLevel, args, m_settings.timeout.value()); + const CvsResponse response = runCvs(topLevel, args); const bool ok = response.result == CvsResponse::Ok; if (ok) showOutputInEditor(title, response.stdOut, commandLogEditorParameters.id, topLevel.toString(), nullptr); @@ -1272,7 +1265,7 @@ bool CvsPluginPrivate::describe(const FilePath &toplevel, const QString &file, c // Run log to obtain commit id and details QStringList args; args << QLatin1String("log") << (QLatin1String("-r") + changeNr) << file; - const CvsResponse logResponse = runCvs(toplevel, args, m_settings.timeout.value()); + const CvsResponse logResponse = runCvs(toplevel, args); if (logResponse.result != CvsResponse::Ok) { *errorMessage = logResponse.message; return false; @@ -1293,7 +1286,7 @@ bool CvsPluginPrivate::describe(const FilePath &toplevel, const QString &file, c args.clear(); args << QLatin1String("log") << QLatin1String("-d") << (dateS + QLatin1Char('<') + nextDayS); - const CvsResponse repoLogResponse = runCvs(toplevel, args, 10 * m_settings.timeout.value()); + const CvsResponse repoLogResponse = runCvs(toplevel, args, RunFlags::None, nullptr, 10); if (repoLogResponse.result != CvsResponse::Ok) { *errorMessage = repoLogResponse.message; return false; @@ -1329,7 +1322,7 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath, // Run log QStringList args(QLatin1String("log")); args << (QLatin1String("-r") + it->revisions.front().revision) << it->file; - const CvsResponse logResponse = runCvs(repositoryPath, args, m_settings.timeout.value()); + const CvsResponse logResponse = runCvs(repositoryPath, args); if (logResponse.result != CvsResponse::Ok) { *errorMessage = logResponse.message; return false; @@ -1345,8 +1338,7 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath, args << m_settings.diffOptions.value() << QLatin1String("-r") << previousRev << QLatin1String("-r") << it->revisions.front().revision << it->file; - const CvsResponse diffResponse = - runCvs(repositoryPath, args, m_settings.timeout.value(), RunFlags::None, codec); + const CvsResponse diffResponse = runCvs(repositoryPath, args, RunFlags::None, codec); switch (diffResponse.result) { case CvsResponse::Ok: case CvsResponse::NonNullExitCode: // Diff exit code != 0 @@ -1390,9 +1382,9 @@ void CvsPluginPrivate::commitFromEditor() // the working directory (see above). CvsResponse CvsPluginPrivate::runCvs(const FilePath &workingDirectory, const QStringList &arguments, - int timeOutS, RunFlags flags, - QTextCodec *outputCodec) const + QTextCodec *outputCodec, + int timeoutMultiplier) const { const FilePath executable = m_settings.binaryPath.filePath(); CvsResponse response; @@ -1402,9 +1394,10 @@ CvsResponse CvsPluginPrivate::runCvs(const FilePath &workingDirectory, return response; } + const int timeoutS = m_settings.timeout.value() * timeoutMultiplier; const CommandResult result = m_client->vcsSynchronousExec(workingDirectory, {executable, m_settings.addOptions(arguments)}, - flags, timeOutS, outputCodec); + flags, timeoutS, outputCodec); response.result = CvsResponse::OtherError; response.stdErr = result.cleanedStdErr(); response.stdOut = result.cleanedStdOut(); @@ -1451,7 +1444,7 @@ bool CvsPluginPrivate::vcsAdd(const FilePath &workingDir, const QString &rawFile { QStringList args; args << QLatin1String("add") << rawFileName; - const auto response = runCvs(workingDir, args, m_settings.timeout.value(), RunFlags::ShowStdOut); + const auto response = runCvs(workingDir, args, RunFlags::ShowStdOut); return response.result == CvsResponse::Ok; } @@ -1459,7 +1452,7 @@ bool CvsPluginPrivate::vcsDelete(const FilePath &workingDir, const QString &rawF { QStringList args; args << QLatin1String("remove") << QLatin1String("-f") << rawFileName; - const auto response = runCvs(workingDir, args, m_settings.timeout.value(), RunFlags::ShowStdOut); + const auto response = runCvs(workingDir, args, RunFlags::ShowStdOut); return response.result == CvsResponse::Ok; } @@ -1498,8 +1491,7 @@ bool CvsPluginPrivate::managesFile(const FilePath &workingDirectory, const QStri { QStringList args; args << QLatin1String("status") << fileName; - const CvsResponse response = - runCvs(workingDirectory, args, m_settings.timeout.value()); + const CvsResponse response = runCvs(workingDirectory, args); if (response.result != CvsResponse::Ok) return false; return !response.stdOut.contains(QLatin1String("Status: Unknown")); From 1b2fecd5a5aeb7fd1e8386895704d17511cf2e09 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 10:26:51 +0200 Subject: [PATCH 048/104] Svn: Move timeoutMultiplier arg as the last one Make the API similar to runCleartool() and runCvs(). Change-Id: Ib6e93daab4a98537e62802e0689f6516086191d0 Reviewed-by: Orgad Shaneh Reviewed-by: --- src/plugins/subversion/subversionplugin.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 3ded484a40b..78a1b26468c 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -223,8 +223,8 @@ public: QString monitorFile(const FilePath &repository) const; QString synchronousTopic(const FilePath &repository) const; SubversionResponse runSvn(const FilePath &workingDir, const QStringList &arguments, - RunFlags flags = RunFlags::None, int defaultTimeoutMutiplier = 1, - QTextCodec *outputCodec = nullptr) const; + RunFlags flags = RunFlags::None, QTextCodec *outputCodec = nullptr, + int timeoutMutiplier = 1) const; void vcsAnnotateHelper(const FilePath &workingDir, const QString &file, const QString &revision = {}, int lineNumber = -1); @@ -876,7 +876,7 @@ void SubversionPluginPrivate::svnUpdate(const FilePath &workingDir, const QStrin args.push_back(QLatin1String(Constants::NON_INTERACTIVE_OPTION)); if (!relativePath.isEmpty()) args.append(relativePath); - const auto response = runSvn(workingDir, args, RunFlags::ShowStdOut, 10); + const auto response = runSvn(workingDir, args, RunFlags::ShowStdOut, nullptr, 10); if (!response.error) emit repositoryChanged(workingDir); } @@ -904,7 +904,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons args.push_back(QLatin1String("-v")); args.append(QDir::toNativeSeparators(SubversionClient::escapeFile(file))); - const auto response = runSvn(workingDir, args, RunFlags::ForceCLocale, 1, codec); + const auto response = runSvn(workingDir, args, RunFlags::ForceCLocale, codec); if (response.error) return; @@ -984,8 +984,8 @@ void SubversionPluginPrivate::commitFromEditor() SubversionResponse SubversionPluginPrivate::runSvn(const FilePath &workingDir, const QStringList &arguments, - RunFlags flags, int defaultTimeoutMutiplier, - QTextCodec *outputCodec) const + RunFlags flags, QTextCodec *outputCodec, + int timeoutMutiplier) const { SubversionResponse response; if (m_settings.binaryPath.value().isEmpty()) { @@ -994,8 +994,9 @@ SubversionResponse SubversionPluginPrivate::runSvn(const FilePath &workingDir, return response; } + const int timeoutS = m_settings.timeout.value() * timeoutMutiplier; const CommandResult result = m_client->vcsSynchronousExec(workingDir, arguments, flags, - m_settings.timeout.value() * defaultTimeoutMutiplier, outputCodec); + timeoutS, outputCodec); response.error = result.result() != ProcessResult::FinishedWithSuccess; if (response.error) @@ -1110,7 +1111,7 @@ bool SubversionPluginPrivate::vcsCheckout(const FilePath &directory, const QByte args << QLatin1String(tempUrl.toEncoded()) << directory.toString(); - const auto response = runSvn(directory, args, RunFlags::None, 10); + const auto response = runSvn(directory, args, RunFlags::None, nullptr, 10); return !response.error; } From 520e7b3b690204d20c52072f4efe0585f35822fe Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 11:08:08 +0200 Subject: [PATCH 049/104] Svn: Reuse CommandResult Get rid of SubversionResponse. Change-Id: I171c421d1128b3f98ecfc446a16a9793d90c1be2 Reviewed-by: Reviewed-by: Orgad Shaneh --- src/plugins/subversion/subversionplugin.cpp | 96 ++++++++------------- 1 file changed, 37 insertions(+), 59 deletions(-) diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 78a1b26468c..f093b066491 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -86,14 +86,6 @@ const char CMD_ID_UPDATE[] = "Subversion.Update"; const char CMD_ID_COMMIT_PROJECT[] = "Subversion.CommitProject"; const char CMD_ID_DESCRIBE[] = "Subversion.Describe"; -struct SubversionResponse -{ - bool error = false; - QString stdOut; - QString stdErr; - QString message; -}; - const VcsBaseSubmitEditorParameters submitParameters { Constants::SUBVERSION_SUBMIT_MIMETYPE, Constants::SUBVERSION_COMMIT_EDITOR_ID, @@ -222,9 +214,9 @@ public: QString monitorFile(const FilePath &repository) const; QString synchronousTopic(const FilePath &repository) const; - SubversionResponse runSvn(const FilePath &workingDir, const QStringList &arguments, - RunFlags flags = RunFlags::None, QTextCodec *outputCodec = nullptr, - int timeoutMutiplier = 1) const; + CommandResult runSvn(const FilePath &workingDir, const QStringList &arguments, + RunFlags flags = RunFlags::None, QTextCodec *outputCodec = nullptr, + int timeoutMutiplier = 1) const; void vcsAnnotateHelper(const FilePath &workingDir, const QString &file, const QString &revision = {}, int lineNumber = -1); @@ -671,11 +663,12 @@ void SubversionPluginPrivate::revertAll() args << SubversionClient::addAuthenticationOptions(m_settings); args << QLatin1String("--recursive") << state.topLevel().toString(); const auto revertResponse = runSvn(state.topLevel(), args, RunFlags::ShowStdOut); - if (revertResponse.error) - QMessageBox::warning(ICore::dialogParent(), title, - tr("Revert failed: %1").arg(revertResponse.message), QMessageBox::Ok); - else - emit repositoryChanged(state.topLevel()); + if (revertResponse.result() != ProcessResult::FinishedWithSuccess) { + QMessageBox::warning(ICore::dialogParent(), title, tr("Revert failed: %1") + .arg(revertResponse.exitMessage()), QMessageBox::Ok); + return; + } + emit repositoryChanged(state.topLevel()); } void SubversionPluginPrivate::revertCurrentFile() @@ -688,16 +681,15 @@ void SubversionPluginPrivate::revertCurrentFile() args.push_back(SubversionClient::escapeFile(state.relativeCurrentFile())); const auto diffResponse = runSvn(state.currentFileTopLevel(), args); - if (diffResponse.error) + if (diffResponse.result() != ProcessResult::FinishedWithSuccess) return; - - if (diffResponse.stdOut.isEmpty()) + if (diffResponse.cleanedStdOut().isEmpty()) return; if (QMessageBox::warning(ICore::dialogParent(), QLatin1String("svn revert"), tr("The file has been changed. Do you want to revert it?"), - QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) + QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) { return; - + } FileChangeBlocker fcb(FilePath::fromString(state.currentFile())); @@ -708,8 +700,7 @@ void SubversionPluginPrivate::revertCurrentFile() args << SubversionClient::escapeFile(state.relativeCurrentFile()); const auto revertResponse = runSvn(state.currentFileTopLevel(), args, RunFlags::ShowStdOut); - - if (!revertResponse.error) + if (revertResponse.result() == ProcessResult::FinishedWithSuccess) emit filesChanged(QStringList(state.currentFile())); } @@ -772,11 +763,11 @@ void SubversionPluginPrivate::startCommit(const FilePath &workingDir, const QStr args += SubversionClient::escapeFiles(files); const auto response = runSvn(workingDir, args); - if (response.error) + if (response.result() != ProcessResult::FinishedWithSuccess) return; // Get list of added/modified/deleted files - const StatusList statusOutput = parseStatusOutput(response.stdOut); + const StatusList statusOutput = parseStatusOutput(response.cleanedStdOut()); if (statusOutput.empty()) { VcsOutputWindow::appendWarning(tr("There are no modified files.")); return; @@ -877,7 +868,7 @@ void SubversionPluginPrivate::svnUpdate(const FilePath &workingDir, const QStrin if (!relativePath.isEmpty()) args.append(relativePath); const auto response = runSvn(workingDir, args, RunFlags::ShowStdOut, nullptr, 10); - if (!response.error) + if (response.result() == ProcessResult::FinishedWithSuccess) emit repositoryChanged(workingDir); } @@ -905,7 +896,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons args.append(QDir::toNativeSeparators(SubversionClient::escapeFile(file))); const auto response = runSvn(workingDir, args, RunFlags::ForceCLocale, codec); - if (response.error) + if (response.result() != ProcessResult::FinishedWithSuccess) return; // Re-use an existing view if possible to support @@ -917,12 +908,13 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons const QString id = VcsBaseEditor::getTitleId(workingDir, files, revision); const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir.toString(), files); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { - editor->document()->setContents(response.stdOut.toUtf8()); + editor->document()->setContents(response.cleanedStdOut().toUtf8()); VcsBaseEditor::gotoLineOfEditor(editor, lineNumber); EditorManager::activateEditor(editor); } else { const QString title = QString::fromLatin1("svn annotate %1").arg(id); - IEditor *newEditor = showOutputInEditor(title, response.stdOut, blameEditorParameters.id, source, codec); + IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(), + blameEditorParameters.id, source, codec); VcsBaseEditor::tagEditor(newEditor, tag); VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber); } @@ -982,28 +974,15 @@ void SubversionPluginPrivate::commitFromEditor() EditorManager::closeDocuments({submitEditor()->document()}); } -SubversionResponse SubversionPluginPrivate::runSvn(const FilePath &workingDir, - const QStringList &arguments, - RunFlags flags, QTextCodec *outputCodec, - int timeoutMutiplier) const +CommandResult SubversionPluginPrivate::runSvn(const FilePath &workingDir, + const QStringList &arguments, RunFlags flags, + QTextCodec *outputCodec, int timeoutMutiplier) const { - SubversionResponse response; - if (m_settings.binaryPath.value().isEmpty()) { - response.error = true; - response.message =tr("No subversion executable specified."); - return response; - } + if (m_settings.binaryPath.value().isEmpty()) + return CommandResult(ProcessResult::StartFailed, tr("No subversion executable specified.")); const int timeoutS = m_settings.timeout.value() * timeoutMutiplier; - const CommandResult result = m_client->vcsSynchronousExec(workingDir, arguments, flags, - timeoutS, outputCodec); - - response.error = result.result() != ProcessResult::FinishedWithSuccess; - if (response.error) - response.message = result.exitMessage(); - response.stdErr = result.cleanedStdErr(); - response.stdOut = result.cleanedStdOut(); - return response; + return m_client->vcsSynchronousExec(workingDir, arguments, flags, timeoutS, outputCodec); } IEditor *SubversionPluginPrivate::showOutputInEditor(const QString &title, const QString &output, @@ -1062,8 +1041,8 @@ bool SubversionPluginPrivate::vcsAdd(const FilePath &workingDir, const QString & args << QLatin1String("add") << SubversionClient::addAuthenticationOptions(m_settings) << QLatin1String("--parents") << file; - const auto response = runSvn(workingDir, args, RunFlags::ShowStdOut); - return !response.error; + return runSvn(workingDir, args, RunFlags::ShowStdOut).result() + == ProcessResult::FinishedWithSuccess; } bool SubversionPluginPrivate::vcsDelete(const FilePath &workingDir, const QString &rawFileName) @@ -1075,8 +1054,8 @@ bool SubversionPluginPrivate::vcsDelete(const FilePath &workingDir, const QStrin args << SubversionClient::addAuthenticationOptions(m_settings) << QLatin1String("--force") << file; - const auto response = runSvn(workingDir, args, RunFlags::ShowStdOut); - return !response.error; + return runSvn(workingDir, args, RunFlags::ShowStdOut).result() + == ProcessResult::FinishedWithSuccess; } bool SubversionPluginPrivate::vcsMove(const FilePath &workingDir, const QString &from, const QString &to) @@ -1085,8 +1064,8 @@ bool SubversionPluginPrivate::vcsMove(const FilePath &workingDir, const QString args << SubversionClient::addAuthenticationOptions(m_settings); args << QDir::toNativeSeparators(SubversionClient::escapeFile(from)) << QDir::toNativeSeparators(SubversionClient::escapeFile(to)); - const auto response = runSvn(workingDir, args, RunFlags::ShowStdOut); - return !response.error; + return runSvn(workingDir, args, RunFlags::ShowStdOut).result() + == ProcessResult::FinishedWithSuccess; } bool SubversionPluginPrivate::vcsCheckout(const FilePath &directory, const QByteArray &url) @@ -1111,9 +1090,8 @@ bool SubversionPluginPrivate::vcsCheckout(const FilePath &directory, const QByte args << QLatin1String(tempUrl.toEncoded()) << directory.toString(); - const auto response = runSvn(directory, args, RunFlags::None, nullptr, 10); - return !response.error; - + return runSvn(directory, args, RunFlags::None, nullptr, 10).result() + == ProcessResult::FinishedWithSuccess; } bool SubversionPluginPrivate::managesDirectory(const FilePath &directory, FilePath *topLevel /* = 0 */) const @@ -1145,8 +1123,8 @@ bool SubversionPluginPrivate::managesFile(const FilePath &workingDirectory, cons args << QLatin1String("status"); args << SubversionClient::addAuthenticationOptions(m_settings) << QDir::toNativeSeparators(SubversionClient::escapeFile(fileName)); - const auto response = runSvn(workingDirectory, args); - return response.stdOut.isEmpty() || response.stdOut.at(0) != QLatin1Char('?'); + const QString output = runSvn(workingDirectory, args).cleanedStdOut(); + return output.isEmpty() || output.front() != QLatin1Char('?'); } // Check whether SVN management subdirs exist. From 9d4017400e437739b19694b6b5461d08a8df6fe4 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 11:41:26 +0200 Subject: [PATCH 050/104] Cvs: Reuse CommandResult Get rid of CvsResponse. Change-Id: I4f1bf6dfad56f730140a0841769b7246a22aa757 Reviewed-by: Orgad Shaneh Reviewed-by: --- src/plugins/cvs/cvsplugin.cpp | 304 ++++++++++++++-------------------- 1 file changed, 123 insertions(+), 181 deletions(-) diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 7ded447dc64..b21b3a12eb9 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -92,17 +92,6 @@ const char CVS_SUBMIT_MIMETYPE[] = "text/vnd.qtcreator.cvs.submit"; const char CVSCOMMITEDITOR_ID[] = "CVS Commit Editor"; const char CVSCOMMITEDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("VCS", "CVS Commit Editor"); -class CvsResponse -{ -public: - enum Result { Ok, NonNullExitCode, OtherError }; - - Result result = Ok; - QString stdOut; - QString stdErr; - QString message; -}; - const VcsBaseSubmitEditorParameters submitParameters { CVS_SUBMIT_MIMETYPE, CVSCOMMITEDITOR_ID, @@ -140,10 +129,10 @@ const VcsBaseEditorParameters diffEditorParameters { static inline bool messageBoxQuestion(const QString &title, const QString &question) { - return QMessageBox::question(ICore::dialogParent(), title, question, QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes; + return QMessageBox::question(ICore::dialogParent(), title, question, + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes; } - // Parameter widget controlling whitespace diff mode, associated with a parameter class CvsDiffConfig : public VcsBaseEditorConfig { @@ -279,29 +268,28 @@ private: bool isCommitEditorOpen() const; Core::IEditor *showOutputInEditor(const QString& title, const QString &output, - Utils::Id id, const QString &source, - QTextCodec *codec); + Utils::Id id, const QString &source, QTextCodec *codec); - CvsResponse runCvs(const FilePath &workingDirectory, - const QStringList &arguments, - RunFlags flags = RunFlags::None, - QTextCodec *outputCodec = nullptr, - int timeoutMultiplier = 1) const; + CommandResult runCvs(const FilePath &workingDirectory, const QStringList &arguments, + RunFlags flags = RunFlags::None, QTextCodec *outputCodec = nullptr, + int timeoutMultiplier = 1) const; void annotate(const FilePath &workingDir, const QString &file, - const QString &revision = QString(), int lineNumber= -1); + const QString &revision = {}, int lineNumber = -1); bool describe(const QString &source, const QString &changeNr, QString *errorMessage); - bool describe(const Utils::FilePath &toplevel, const QString &source, const QString &changeNr, QString *errorMessage); - bool describe(const Utils::FilePath &repository, QList entries, QString *errorMessage); - void filelog(const Utils::FilePath &workingDir, - const QString &file = {}, + bool describe(const Utils::FilePath &toplevel, const QString &source, + const QString &changeNr, QString *errorMessage); + bool describe(const Utils::FilePath &repository, QList entries, + QString *errorMessage); + void filelog(const Utils::FilePath &workingDir, const QString &file = {}, bool enableAnnotationContextMenu = false); bool unedit(const Utils::FilePath &topLevel, const QStringList &files); bool status(const Utils::FilePath &topLevel, const QString &file, const QString &title); bool update(const Utils::FilePath &topLevel, const QString &file); bool checkCVSDirectory(const QDir &directory) const; // Quick check if files are modified - bool diffCheckModified(const Utils::FilePath &topLevel, const QStringList &files, bool *modified); + bool diffCheckModified(const Utils::FilePath &topLevel, const QStringList &files, + bool *modified); QString findTopLevelForDirectoryI(const QString &directory) const; void startCommit(const Utils::FilePath &workingDir, const QString &file = {}); bool commit(const QString &messageFile, const QStringList &subVersionFileList); @@ -441,7 +429,7 @@ bool CvsPluginPrivate::vcsCreateRepository(const FilePath &) void CvsPluginPrivate::vcsAnnotate(const FilePath &filePath, int line) { - vcsAnnotate(filePath.parentDir(), filePath.fileName(), QString(), line); + vcsAnnotate(filePath.parentDir(), filePath.fileName(), {}, line); } QString CvsPluginPrivate::vcsOpenText() const @@ -845,31 +833,29 @@ void CvsPluginPrivate::revertAll() const QString title = Tr::tr("Revert Repository"); if (!messageBoxQuestion(title, Tr::tr("Revert all pending changes to the repository?"))) return; - QStringList args; - args << QLatin1String("update") << QLatin1String("-C") << state.topLevel().toString(); - const auto revertResponse = runCvs(state.topLevel(), args, RunFlags::ShowStdOut); - if (revertResponse.result == CvsResponse::Ok) - emit repositoryChanged(state.topLevel()); - else - Core::AsynchronousMessageBox::warning(title, - Tr::tr("Revert failed: %1").arg(revertResponse.message)); + const auto revertResponse = runCvs(state.topLevel(), {"update", "-C", + state.topLevel().toString()}, RunFlags::ShowStdOut); + if (revertResponse.result() != ProcessResult::FinishedWithSuccess) { + Core::AsynchronousMessageBox::warning(title, Tr::tr("Revert failed: %1") + .arg(revertResponse.exitMessage())); + return; + } + emit repositoryChanged(state.topLevel()); } void CvsPluginPrivate::revertCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); - QStringList args; - args << QLatin1String("diff") << state.relativeCurrentFile(); - const CvsResponse diffResponse = runCvs(state.currentFileTopLevel(), args); - switch (diffResponse.result) { - case CvsResponse::Ok: + const auto diffRes = runCvs(state.currentFileTopLevel(), {"diff", state.relativeCurrentFile()}); + switch (diffRes.result()) { + case ProcessResult::FinishedWithSuccess: return; // Not modified, diff exit code 0 - case CvsResponse::NonNullExitCode: // Diff exit code != 0 - if (diffResponse.stdOut.isEmpty()) // Paranoia: Something else failed? + case ProcessResult::FinishedWithError: // Diff exit code != 0 + if (diffRes.cleanedStdOut().isEmpty()) // Paranoia: Something else failed? return; break; - case CvsResponse::OtherError: + default: return; } @@ -880,10 +866,9 @@ void CvsPluginPrivate::revertCurrentFile() FileChangeBlocker fcb(FilePath::fromString(state.currentFile())); // revert - args.clear(); - args << QLatin1String("update") << QLatin1String("-C") << state.relativeCurrentFile(); - const auto revertResponse = runCvs(state.currentFileTopLevel(), args, RunFlags::ShowStdOut); - if (revertResponse.result == CvsResponse::Ok) + const auto revertRes = runCvs(state.currentFileTopLevel(), + {"update", "-C", state.relativeCurrentFile()}, RunFlags::ShowStdOut); + if (revertRes.result() == ProcessResult::FinishedWithSuccess) emit filesChanged(QStringList(state.currentFile())); } @@ -893,7 +878,7 @@ void CvsPluginPrivate::diffProject() QTC_ASSERT(state.hasProject(), return); const QString relativeProject = state.relativeCurrentProject(); m_client->diff(state.currentProjectTopLevel(), - relativeProject.isEmpty() ? QStringList() : QStringList(relativeProject)); + relativeProject.isEmpty() ? QStringList() : QStringList(relativeProject)); } void CvsPluginPrivate::diffCurrentFile() @@ -934,7 +919,6 @@ void CvsPluginPrivate::startCommit(const FilePath &workingDir, const QString &fi { if (!promptBeforeCommit()) return; - if (raiseSubmitEditor()) return; if (isCommitEditorOpen()) { @@ -944,13 +928,12 @@ void CvsPluginPrivate::startCommit(const FilePath &workingDir, const QString &fi // We need the "Examining " stderr output to tell // where we are, so, have stdout/stderr channels merged. - QStringList args = QStringList(QLatin1String("status")); - const CvsResponse response = runCvs(workingDir, args, RunFlags::MergeOutputChannels); - if (response.result != CvsResponse::Ok) + const auto response = runCvs(workingDir, {"status"}, RunFlags::MergeOutputChannels); + if (response.result() != ProcessResult::FinishedWithSuccess) return; // Get list of added/modified/deleted files and purge out undesired ones // (do not run status with relative arguments as it will omit the directories) - StateList statusOutput = parseStatusOutput(QString(), response.stdOut); + StateList statusOutput = parseStatusOutput({}, response.cleanedStdOut()); if (!file.isEmpty()) { for (StateList::iterator it = statusOutput.begin(); it != statusOutput.end() ; ) { if (file == it->second) @@ -987,11 +970,10 @@ void CvsPluginPrivate::startCommit(const FilePath &workingDir, const QString &fi bool CvsPluginPrivate::commit(const QString &messageFile, const QStringList &fileList) { - QStringList args = QStringList(QLatin1String("commit")); - args << QLatin1String("-F") << messageFile; - args.append(fileList); - const auto response = runCvs(m_commitRepository, args, RunFlags::ShowStdOut, nullptr, 10); - return response.result == CvsResponse::Ok ; + const QStringList args{"commit", "-F", messageFile}; + const auto response = runCvs(m_commitRepository, args + fileList, RunFlags::ShowStdOut, nullptr, + 10); + return response.result() == ProcessResult::FinishedWithSuccess; } void CvsPluginPrivate::filelogCurrentFile() @@ -1023,22 +1005,20 @@ void CvsPluginPrivate::filelog(const FilePath &workingDir, // no need for temp file const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(file)); const QString source = VcsBaseEditor::getSource(workingDir, file); - QStringList args; - args << QLatin1String("log"); - args.append(file); - const CvsResponse response = runCvs(workingDir, args, RunFlags::None, codec); - if (response.result != CvsResponse::Ok) + const auto response = runCvs(workingDir, {"log", file}, RunFlags::None, codec); + if (response.result() != ProcessResult::FinishedWithSuccess) return; // Re-use an existing view if possible to support // the common usage pattern of continuously changing and diffing a file const QString tag = VcsBaseEditor::editorTag(LogOutput, workingDir.toString(), QStringList(file)); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { - editor->document()->setContents(response.stdOut.toUtf8()); + editor->document()->setContents(response.cleanedStdOut().toUtf8()); EditorManager::activateEditor(editor); } else { const QString title = QString::fromLatin1("cvs log %1").arg(id); - IEditor *newEditor = showOutputInEditor(title, response.stdOut, logEditorParameters.id, source, codec); + IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(), + logEditorParameters.id, source, codec); VcsBaseEditor::tagEditor(newEditor, tag); if (enableAnnotationContextMenu) VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true); @@ -1049,7 +1029,7 @@ void CvsPluginPrivate::updateDirectory() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); - update(state.currentFileDirectory(), QString()); + update(state.currentFileDirectory(), {}); } void CvsPluginPrivate::updateProject() @@ -1061,12 +1041,11 @@ void CvsPluginPrivate::updateProject() bool CvsPluginPrivate::update(const FilePath &topLevel, const QString &file) { - QStringList args(QLatin1String("update")); - args.push_back(QLatin1String("-dR")); + QStringList args{"update", "-dR"}; if (!file.isEmpty()) args.append(file); const auto response = runCvs(topLevel, args, RunFlags::ShowStdOut, nullptr, 10); - const bool ok = response.result == CvsResponse::Ok; + const bool ok = response.result() == ProcessResult::FinishedWithSuccess; if (ok) emit repositoryChanged(topLevel); return ok; @@ -1108,23 +1087,22 @@ void CvsPluginPrivate::vcsAnnotate(const FilePath &workingDirectory, const QStri bool CvsPluginPrivate::edit(const FilePath &topLevel, const QStringList &files) { - QStringList args(QLatin1String("edit")); - args.append(files); - const auto response = runCvs(topLevel, args, RunFlags::ShowStdOut); - return response.result == CvsResponse::Ok; + const QStringList args{"edit"}; + const auto response = runCvs(topLevel, args + files, RunFlags::ShowStdOut); + return response.result() == ProcessResult::FinishedWithSuccess; } -bool CvsPluginPrivate::diffCheckModified(const FilePath &topLevel, const QStringList &files, bool *modified) +bool CvsPluginPrivate::diffCheckModified(const FilePath &topLevel, const QStringList &files, + bool *modified) { // Quick check for modified files using diff *modified = false; - QStringList args(QLatin1String("-q")); - args << QLatin1String("diff"); - args.append(files); - const CvsResponse response = runCvs(topLevel, args); - if (response.result == CvsResponse::OtherError) + const QStringList args{"-q", "diff"}; + const auto result = runCvs(topLevel, args + files).result(); + if (result != ProcessResult::FinishedWithSuccess && result != ProcessResult::FinishedWithError) return false; - *modified = response.result == CvsResponse::NonNullExitCode; + + *modified = result == ProcessResult::FinishedWithError; return true; } @@ -1142,14 +1120,13 @@ bool CvsPluginPrivate::unedit(const FilePath &topLevel, const QStringList &files return false; } - QStringList args(QLatin1String("unedit")); + QStringList args{"unedit"}; // Note: Option '-y' to force 'yes'-answer to CVS' 'undo change' prompt, // exists in CVSNT only as of 6.8.2010. Standard CVS will otherwise prompt if (modified) args.append(QLatin1String("-y")); - args.append(files); - const auto response = runCvs(topLevel, args, RunFlags::ShowStdOut); - return response.result == CvsResponse::Ok; + const auto response = runCvs(topLevel, args + files, RunFlags::ShowStdOut); + return response.result() == ProcessResult::FinishedWithSuccess; } void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file, @@ -1160,13 +1137,12 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file, QTextCodec *codec = VcsBaseEditor::getCodec(workingDir, files); const QString id = VcsBaseEditor::getTitleId(workingDir, files, revision); const QString source = VcsBaseEditor::getSource(workingDir, file); - QStringList args; - args << QLatin1String("annotate"); + QStringList args{"annotate"}; if (!revision.isEmpty()) - args << QLatin1String("-r") << revision; + args << "-r" << revision; args << file; - const CvsResponse response = runCvs(workingDir, args, RunFlags::None, codec); - if (response.result != CvsResponse::Ok) + const auto response = runCvs(workingDir, args, RunFlags::None, codec); + if (response.result() != ProcessResult::FinishedWithSuccess) return; // Re-use an existing view if possible to support @@ -1176,12 +1152,13 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file, const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir.toString(), QStringList(file), revision); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { - editor->document()->setContents(response.stdOut.toUtf8()); + editor->document()->setContents(response.cleanedStdOut().toUtf8()); VcsBaseEditor::gotoLineOfEditor(editor, lineNumber); EditorManager::activateEditor(editor); } else { const QString title = QString::fromLatin1("cvs annotate %1").arg(id); - IEditor *newEditor = showOutputInEditor(title, response.stdOut, annotateEditorParameters.id, source, codec); + IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(), + annotateEditorParameters.id, source, codec); VcsBaseEditor::tagEditor(newEditor, tag); VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber); } @@ -1189,13 +1166,15 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file, bool CvsPluginPrivate::status(const FilePath &topLevel, const QString &file, const QString &title) { - QStringList args(QLatin1String("status")); + QStringList args{"status"}; if (!file.isEmpty()) args.append(file); - const CvsResponse response = runCvs(topLevel, args); - const bool ok = response.result == CvsResponse::Ok; - if (ok) - showOutputInEditor(title, response.stdOut, commandLogEditorParameters.id, topLevel.toString(), nullptr); + const auto response = runCvs(topLevel, args); + const bool ok = response.result() == ProcessResult::FinishedWithSuccess; + if (ok) { + showOutputInEditor(title, response.cleanedStdOut(), commandLogEditorParameters.id, + topLevel.toString(), nullptr); + } return ok; } @@ -1224,14 +1203,14 @@ void CvsPluginPrivate::statusRepository() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - status(state.topLevel(), QString(), Tr::tr("Repository status")); + status(state.topLevel(), {}, Tr::tr("Repository status")); } void CvsPluginPrivate::updateRepository() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - update(state.topLevel(), QString()); + update(state.topLevel(), {}); } @@ -1247,8 +1226,8 @@ bool CvsPluginPrivate::describe(const QString &file, const QString &changeNr, QS return describe(toplevel, QDir(toplevel.toString()).relativeFilePath(file), changeNr, errorMessage); } -bool CvsPluginPrivate::describe(const FilePath &toplevel, const QString &file, const - QString &changeNr, QString *errorMessage) +bool CvsPluginPrivate::describe(const FilePath &toplevel, const QString &file, + const QString &changeNr, QString *errorMessage) { // In CVS, revisions of files are normally unrelated, there is @@ -1263,14 +1242,12 @@ bool CvsPluginPrivate::describe(const FilePath &toplevel, const QString &file, c return false; } // Run log to obtain commit id and details - QStringList args; - args << QLatin1String("log") << (QLatin1String("-r") + changeNr) << file; - const CvsResponse logResponse = runCvs(toplevel, args); - if (logResponse.result != CvsResponse::Ok) { - *errorMessage = logResponse.message; + const auto logResponse = runCvs(toplevel, {"log", QString("-r%1").arg(changeNr), file}); + if (logResponse.result() != ProcessResult::FinishedWithSuccess) { + *errorMessage = logResponse.exitMessage(); return false; } - const QList fileLog = parseLogEntries(logResponse.stdOut); + const QList fileLog = parseLogEntries(logResponse.cleanedStdOut()); if (fileLog.empty() || fileLog.front().revisions.empty()) { *errorMessage = Tr::tr("Parsing of the log output failed."); return false; @@ -1283,16 +1260,15 @@ bool CvsPluginPrivate::describe(const FilePath &toplevel, const QString &file, c const QString dateS = fileLog.front().revisions.front().date; const QDate date = QDate::fromString(dateS, Qt::ISODate); const QString nextDayS = date.addDays(1).toString(Qt::ISODate); - args.clear(); - args << QLatin1String("log") << QLatin1String("-d") << (dateS + QLatin1Char('<') + nextDayS); - - const CvsResponse repoLogResponse = runCvs(toplevel, args, RunFlags::None, nullptr, 10); - if (repoLogResponse.result != CvsResponse::Ok) { - *errorMessage = repoLogResponse.message; + const QStringList args{"log", "-d", dateS + '<' + nextDayS}; + const auto repoLogResponse = runCvs(toplevel, args, RunFlags::None, nullptr, 10); + if (repoLogResponse.result() != ProcessResult::FinishedWithSuccess) { + *errorMessage = repoLogResponse.exitMessage(); return false; } // Describe all files found, pass on dir to obtain correct absolute paths. - const QList repoEntries = parseLogEntries(repoLogResponse.stdOut, QString(), commitId); + const QList repoEntries = parseLogEntries(repoLogResponse.cleanedStdOut(), + {}, commitId); if (repoEntries.empty()) { *errorMessage = Tr::tr("Could not find commits of id \"%1\" on %2.").arg(commitId, dateS); return false; @@ -1320,38 +1296,35 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath, if (!codec) codec = VcsBaseEditor::getCodec(repositoryPath, QStringList(it->file)); // Run log - QStringList args(QLatin1String("log")); - args << (QLatin1String("-r") + it->revisions.front().revision) << it->file; - const CvsResponse logResponse = runCvs(repositoryPath, args); - if (logResponse.result != CvsResponse::Ok) { - *errorMessage = logResponse.message; + const QStringList args{"log", "-r", it->revisions.front().revision, it->file}; + const auto logResponse = runCvs(repositoryPath, args); + if (logResponse.result() != ProcessResult::FinishedWithSuccess) { + *errorMessage = logResponse.exitMessage(); return false; } - output += logResponse.stdOut; + output += logResponse.cleanedStdOut(); } // Collect diffs relative to repository for (QList::iterator it = entries.begin(); it != lend; ++it) { const QString &revision = it->revisions.front().revision; if (!isFirstRevision(revision)) { - const QString previousRev = previousRevision(revision); - QStringList args(QLatin1String("diff")); - args << m_settings.diffOptions.value() - << QLatin1String("-r") << previousRev << QLatin1String("-r") - << it->revisions.front().revision << it->file; - const CvsResponse diffResponse = runCvs(repositoryPath, args, RunFlags::None, codec); - switch (diffResponse.result) { - case CvsResponse::Ok: - case CvsResponse::NonNullExitCode: // Diff exit code != 0 - if (diffResponse.stdOut.isEmpty()) { - *errorMessage = diffResponse.message; + const QStringList args{"diff", m_settings.diffOptions.value(), + "-r", previousRevision(revision), + "-r", it->revisions.front().revision, it->file}; + const auto diffResponse = runCvs(repositoryPath, args, RunFlags::None, codec); + switch (diffResponse.result()) { + case ProcessResult::FinishedWithSuccess: + case ProcessResult::FinishedWithError: // Diff exit code != 0 + if (diffResponse.cleanedStdOut().isEmpty()) { + *errorMessage = diffResponse.exitMessage(); return false; // Something else failed. } break; - case CvsResponse::OtherError: - *errorMessage = diffResponse.message; + default: + *errorMessage = diffResponse.exitMessage(); return false; } - output += fixDiffOutput(diffResponse.stdOut); + output += fixDiffOutput(diffResponse.cleanedStdOut()); } } @@ -1364,7 +1337,8 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath, setDiffBaseDirectory(editor, repositoryPath); } else { const QString title = QString::fromLatin1("cvs describe %1").arg(commitId); - IEditor *newEditor = showOutputInEditor(title, output, diffEditorParameters.id, entries.front().file, codec); + IEditor *newEditor = showOutputInEditor(title, output, diffEditorParameters.id, + entries.front().file, codec); VcsBaseEditor::tagEditor(newEditor, commitId); setDiffBaseDirectory(newEditor, repositoryPath); } @@ -1380,44 +1354,18 @@ void CvsPluginPrivate::commitFromEditor() // Run CVS. At this point, file arguments must be relative to // the working directory (see above). -CvsResponse CvsPluginPrivate::runCvs(const FilePath &workingDirectory, - const QStringList &arguments, - RunFlags flags, - QTextCodec *outputCodec, - int timeoutMultiplier) const +CommandResult CvsPluginPrivate::runCvs(const FilePath &workingDirectory, + const QStringList &arguments, RunFlags flags, + QTextCodec *outputCodec, int timeoutMultiplier) const { const FilePath executable = m_settings.binaryPath.filePath(); - CvsResponse response; - if (executable.isEmpty()) { - response.result = CvsResponse::OtherError; - response.message = Tr::tr("No CVS executable specified."); - return response; - } + if (executable.isEmpty()) + return CommandResult(ProcessResult::StartFailed, Tr::tr("No CVS executable specified.")); const int timeoutS = m_settings.timeout.value() * timeoutMultiplier; - const CommandResult result = m_client->vcsSynchronousExec(workingDirectory, - {executable, m_settings.addOptions(arguments)}, - flags, timeoutS, outputCodec); - response.result = CvsResponse::OtherError; - response.stdErr = result.cleanedStdErr(); - response.stdOut = result.cleanedStdOut(); - switch (result.result()) { - case ProcessResult::FinishedWithSuccess: - response.result = CvsResponse::Ok; - break; - case ProcessResult::FinishedWithError: - response.result = CvsResponse::NonNullExitCode; - break; - case ProcessResult::TerminatedAbnormally: - case ProcessResult::StartFailed: - case ProcessResult::Hang: - break; - } - - if (response.result != CvsResponse::Ok) - response.message = result.exitMessage(); - - return response; + return m_client->vcsSynchronousExec(workingDirectory, + {executable, m_settings.addOptions(arguments)}, + flags, timeoutS, outputCodec); } IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QString &output, @@ -1442,18 +1390,14 @@ IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QStrin bool CvsPluginPrivate::vcsAdd(const FilePath &workingDir, const QString &rawFileName) { - QStringList args; - args << QLatin1String("add") << rawFileName; - const auto response = runCvs(workingDir, args, RunFlags::ShowStdOut); - return response.result == CvsResponse::Ok; + const auto response = runCvs(workingDir, {"add", rawFileName}, RunFlags::ShowStdOut); + return response.result() == ProcessResult::FinishedWithSuccess; } bool CvsPluginPrivate::vcsDelete(const FilePath &workingDir, const QString &rawFileName) { - QStringList args; - args << QLatin1String("remove") << QLatin1String("-f") << rawFileName; - const auto response = runCvs(workingDir, args, RunFlags::ShowStdOut); - return response.result == CvsResponse::Ok; + const auto response = runCvs(workingDir, {"remove", "-f", rawFileName}, RunFlags::ShowStdOut); + return response.result() == ProcessResult::FinishedWithSuccess; } /* CVS has a "CVS" directory in each directory it manages. The top level @@ -1489,12 +1433,10 @@ bool CvsPluginPrivate::managesDirectory(const FilePath &directory, FilePath *top bool CvsPluginPrivate::managesFile(const FilePath &workingDirectory, const QString &fileName) const { - QStringList args; - args << QLatin1String("status") << fileName; - const CvsResponse response = runCvs(workingDirectory, args); - if (response.result != CvsResponse::Ok) + const auto response = runCvs(workingDirectory, {"status", fileName}); + if (response.result() != ProcessResult::FinishedWithSuccess) return false; - return !response.stdOut.contains(QLatin1String("Status: Unknown")); + return !response.cleanedStdOut().contains(QLatin1String("Status: Unknown")); } bool CvsPluginPrivate::checkCVSDirectory(const QDir &directory) const From b8efc2f14de4859409fef57f58e2b813e72bc510 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 12:51:50 +0200 Subject: [PATCH 051/104] VcsBase: Use FilePath in editorTag() Change-Id: I4093fa46a51767afd00a8de2f94986c708dc1efa Reviewed-by: Orgad Shaneh --- src/plugins/clearcase/clearcaseplugin.cpp | 8 ++++---- src/plugins/cvs/cvsplugin.cpp | 4 ++-- src/plugins/perforce/perforceplugin.cpp | 2 +- src/plugins/subversion/subversionclient.cpp | 22 ++++++++++----------- src/plugins/subversion/subversionplugin.cpp | 2 +- src/plugins/vcsbase/vcsbaseeditor.cpp | 8 +++----- src/plugins/vcsbase/vcsbaseeditor.h | 4 ++-- 7 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index 2e82b77c4e2..117c5de6cbf 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -1197,7 +1197,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const FilePath &workingDir, const QS // diff of a single file? re-use an existing view if possible to support // the common usage pattern of continuously changing and diffing a file - const QString tag = VcsBaseEditor::editorTag(DiffOutput, workingDir.toString(), files); + const QString tag = VcsBaseEditor::editorTag(DiffOutput, workingDir, files); if (files.count() == 1) { // Show in the same editor if diff has been executed before if (IEditor *existingEditor = VcsBaseEditor::locateEditorByTag(tag)) { @@ -1459,7 +1459,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir, // the common usage pattern of continuously changing and diffing a file const QString id = VcsBaseEditor::getTitleId(workingDir, files); - const QString tag = VcsBaseEditor::editorTag(LogOutput, workingDir.toString(), files); + const QString tag = VcsBaseEditor::editorTag(LogOutput, workingDir, files); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(result.cleanedStdOut().toUtf8()); EditorManager::activateEditor(editor); @@ -1563,7 +1563,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const stream << result.cleanedStdOut().mid(dataStart) << headerSep << QLatin1Char('\n') << headerSep << QLatin1Char('\n') << result.cleanedStdOut().left(pos); const QStringList files = QStringList(file); - const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir.toString(), files); + const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir, files); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(res.toUtf8()); VcsBaseEditor::gotoLineOfEditor(editor, lineNumber); @@ -1599,7 +1599,7 @@ void ClearCasePluginPrivate::vcsDescribe(const FilePath &source, const QString & // Re-use an existing view if possible to support // the common usage pattern of continuously changing and diffing a file - const QString tag = VcsBaseEditor::editorTag(DiffOutput, source.toString(), QStringList(), changeNr); + const QString tag = VcsBaseEditor::editorTag(DiffOutput, source, {}, changeNr); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(description.toUtf8()); EditorManager::activateEditor(editor); diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index b21b3a12eb9..a004be3b6d5 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -1011,7 +1011,7 @@ void CvsPluginPrivate::filelog(const FilePath &workingDir, // Re-use an existing view if possible to support // the common usage pattern of continuously changing and diffing a file - const QString tag = VcsBaseEditor::editorTag(LogOutput, workingDir.toString(), QStringList(file)); + const QString tag = VcsBaseEditor::editorTag(LogOutput, workingDir, {file}); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(response.cleanedStdOut().toUtf8()); EditorManager::activateEditor(editor); @@ -1150,7 +1150,7 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file, if (lineNumber < 1) lineNumber = VcsBaseEditor::lineNumberOfCurrentEditor(file); - const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir.toString(), QStringList(file), revision); + const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir, {file}, revision); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(response.cleanedStdOut().toUtf8()); VcsBaseEditor::gotoLineOfEditor(editor, lineNumber); diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp index bcf419edb5d..15202625682 100644 --- a/src/plugins/perforce/perforceplugin.cpp +++ b/src/plugins/perforce/perforceplugin.cpp @@ -1462,7 +1462,7 @@ void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p) QTextCodec *codec = VcsBaseEditor::getCodec(p.workingDir, p.files); const QString id = VcsBaseEditor::getTitleId(p.workingDir, p.files); // Reuse existing editors for that id - const QString tag = VcsBaseEditor::editorTag(DiffOutput, p.workingDir.toString(), p.files); + const QString tag = VcsBaseEditor::editorTag(DiffOutput, p.workingDir, p.files); IEditor *existingEditor = VcsBaseEditor::locateEditorByTag(tag); // Split arguments according to size QStringList args; diff --git a/src/plugins/subversion/subversionclient.cpp b/src/plugins/subversion/subversionclient.cpp index 104488f789e..0262e6358c5 100644 --- a/src/plugins/subversion/subversionclient.cpp +++ b/src/plugins/subversion/subversionclient.cpp @@ -253,7 +253,8 @@ SubversionDiffEditorController *SubversionClient::findOrCreateDiffEditor(const Q return controller; } -void SubversionClient::diff(const FilePath &workingDirectory, const QStringList &files, const QStringList &extraOptions) +void SubversionClient::diff(const FilePath &workingDirectory, const QStringList &files, + const QStringList &extraOptions) { Q_UNUSED(extraOptions) @@ -268,10 +269,8 @@ void SubversionClient::diff(const FilePath &workingDirectory, const QStringList controller->requestReload(); } -void SubversionClient::log(const FilePath &workingDir, - const QStringList &files, - const QStringList &extraOptions, - bool enableAnnotationContextMenu) +void SubversionClient::log(const FilePath &workingDir, const QStringList &files, + const QStringList &extraOptions, bool enableAnnotationContextMenu) { auto &settings = static_cast(this->settings()); const int logCount = settings.logCount.value(); @@ -285,16 +284,15 @@ void SubversionClient::log(const FilePath &workingDir, VcsBaseClient::log(workingDir, escapeFiles(files), svnExtraOptions, enableAnnotationContextMenu); } -void SubversionClient::describe(const FilePath &workingDirectory, int changeNumber, const QString &title) +void SubversionClient::describe(const FilePath &workingDirectory, int changeNumber, + const QString &title) { const QString documentId = QLatin1String(Constants::SUBVERSION_PLUGIN) - + QLatin1String(".Describe.") + VcsBaseEditor::editorTag(DiffOutput, - workingDirectory.toString(), - QStringList(), - QString::number(changeNumber)); + + QLatin1String(".Describe.") + VcsBaseEditor::editorTag(DiffOutput, + workingDirectory, {}, QString::number(changeNumber)); - SubversionDiffEditorController *controller = - findOrCreateDiffEditor(documentId, workingDirectory.toString(), title, workingDirectory); + SubversionDiffEditorController *controller = findOrCreateDiffEditor(documentId, + workingDirectory.toString(), title, workingDirectory); controller->setChangeNumber(changeNumber); controller->requestReload(); } diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index f093b066491..da5f67e68cd 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -906,7 +906,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons // Determine id const QStringList files = QStringList(file); const QString id = VcsBaseEditor::getTitleId(workingDir, files, revision); - const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir.toString(), files); + const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir, files); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(response.cleanedStdOut().toUtf8()); VcsBaseEditor::gotoLineOfEditor(editor, lineNumber); diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 2ca4c01d2c5..f6ecadc253b 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -1595,10 +1595,8 @@ void VcsBaseEditorWidget::slotApplyDiffChunk(const DiffChunk &chunk, PatchAction } // Tagging of editors for re-use. -QString VcsBaseEditor::editorTag(EditorContentType t, - const QString &workingDirectory, - const QStringList &files, - const QString &revision) +QString VcsBaseEditor::editorTag(EditorContentType t, const FilePath &workingDirectory, + const QStringList &files, const QString &revision) { const QChar colon = QLatin1Char(':'); QString rc = QString::number(t); @@ -1607,7 +1605,7 @@ QString VcsBaseEditor::editorTag(EditorContentType t, rc += revision; rc += colon; } - rc += workingDirectory; + rc += workingDirectory.toString(); if (!files.isEmpty()) { rc += colon; rc += files.join(QString(colon)); diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h index a79df047553..3cdbc3c343e 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.h +++ b/src/plugins/vcsbase/vcsbaseeditor.h @@ -104,8 +104,8 @@ public: * the editor, they get a 'tag' containing type and parameters (dynamic property string). */ static void tagEditor(Core::IEditor *e, const QString &tag); static Core::IEditor* locateEditorByTag(const QString &tag); - static QString editorTag(EditorContentType t, const QString &workingDirectory, const QStringList &files, - const QString &revision = QString()); + static QString editorTag(EditorContentType t, const Utils::FilePath &workingDirectory, + const QStringList &files, const QString &revision = {}); void finalizeInitialization() override; }; From 928a7d2087406abef2b076705ba4aa51b8ef3c92 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 6 Oct 2022 14:05:43 +0200 Subject: [PATCH 052/104] Git: Convert to Tr::tr Change-Id: I7fb1753109a9263c70c01713f5f4895db6b73662 Reviewed-by: Alessandro Portale --- share/qtcreator/translations/qtcreator_cs.ts | 364 +--------- share/qtcreator/translations/qtcreator_da.ts | 244 +------ share/qtcreator/translations/qtcreator_de.ts | 243 +------ share/qtcreator/translations/qtcreator_es.ts | 46 +- share/qtcreator/translations/qtcreator_fr.ts | 300 +------- share/qtcreator/translations/qtcreator_hr.ts | 244 +------ share/qtcreator/translations/qtcreator_hu.ts | 46 +- share/qtcreator/translations/qtcreator_it.ts | 42 +- share/qtcreator/translations/qtcreator_ja.ts | 659 +----------------- share/qtcreator/translations/qtcreator_pl.ts | 221 +----- share/qtcreator/translations/qtcreator_ru.ts | 273 +------- share/qtcreator/translations/qtcreator_sl.ts | 116 +-- share/qtcreator/translations/qtcreator_uk.ts | 262 +------ .../qtcreator/translations/qtcreator_zh_CN.ts | 203 +----- .../qtcreator/translations/qtcreator_zh_TW.ts | 140 +--- src/plugins/git/branchadddialog.cpp | 27 +- src/plugins/git/branchadddialog.h | 10 +- src/plugins/git/branchcheckoutdialog.cpp | 24 +- src/plugins/git/branchcheckoutdialog.h | 8 +- src/plugins/git/branchmodel.cpp | 17 +- src/plugins/git/branchmodel.h | 19 +- src/plugins/git/branchview.cpp | 79 ++- src/plugins/git/branchview.h | 12 +- src/plugins/git/changeselectiondialog.cpp | 43 +- src/plugins/git/changeselectiondialog.h | 7 +- src/plugins/git/commitdata.cpp | 32 +- src/plugins/git/commitdata.h | 15 +- .../git/gerrit/authenticationdialog.cpp | 14 +- src/plugins/git/gerrit/gerritdialog.cpp | 23 +- src/plugins/git/gerrit/gerritmodel.cpp | 47 +- src/plugins/git/gerrit/gerritoptionspage.cpp | 19 +- src/plugins/git/gerrit/gerritplugin.cpp | 24 +- src/plugins/git/gerrit/gerritpushdialog.cpp | 21 +- .../git/gerrit/gerritremotechooser.cpp | 5 +- src/plugins/git/gitclient.cpp | 297 ++++---- src/plugins/git/gitclient.h | 8 +- src/plugins/git/giteditor.cpp | 61 +- src/plugins/git/giteditor.h | 6 +- src/plugins/git/gitgrep.cpp | 34 +- src/plugins/git/gitgrep.h | 11 +- src/plugins/git/githighlighters.cpp | 8 +- src/plugins/git/githighlighters.h | 7 +- src/plugins/git/gitplugin.cpp | 193 +++-- src/plugins/git/gitplugin.h | 6 +- src/plugins/git/gitsettings.cpp | 40 +- src/plugins/git/gitsettings.h | 8 +- src/plugins/git/gitsubmiteditor.cpp | 14 +- src/plugins/git/gitsubmiteditor.h | 6 +- src/plugins/git/gitsubmiteditorwidget.cpp | 55 +- src/plugins/git/gitsubmiteditorwidget.h | 7 +- src/plugins/git/gitutils.cpp | 6 +- src/plugins/git/gitutils.h | 9 +- src/plugins/git/logchangedialog.cpp | 20 +- src/plugins/git/logchangedialog.h | 8 +- src/plugins/git/mergetool.cpp | 50 +- src/plugins/git/mergetool.h | 8 +- src/plugins/git/remotedialog.cpp | 33 +- src/plugins/git/remotedialog.h | 8 +- src/plugins/git/remotemodel.cpp | 11 +- src/plugins/git/remotemodel.h | 7 +- src/plugins/git/stashdialog.cpp | 43 +- src/plugins/git/stashdialog.h | 8 +- 62 files changed, 776 insertions(+), 4045 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_cs.ts b/share/qtcreator/translations/qtcreator_cs.ts index ef0a6913417..6fa44c2b0a6 100644 --- a/share/qtcreator/translations/qtcreator_cs.ts +++ b/share/qtcreator/translations/qtcreator_cs.ts @@ -6602,7 +6602,7 @@ více času, než je nastaveno. V takovém případě by se měla hodnota zvýš
- Git::Internal::BranchDialog + Git Checkout Načíst (checkout) @@ -6615,14 +6615,6 @@ více času, než je nastaveno. V takovém případě by se měla hodnota zvýš Unable to find the repository directory for '%1'. Adresář skladiště pro '%1' se nepodařilo najít. - - Diff - Rozdíly (diff) - - - Refresh - Obnovit - Delete... Smazat... @@ -6715,30 +6707,14 @@ více času, než je nastaveno. V takovém případě by se měla hodnota zvýš General information Obecné informace - - Repository: - Skladiště: - Remote branches Vzdálené větve - - Remote Branches - Vzdálené větve - - - Re&fresh - &Obnovit - &Add... Přid&at... - - &Remove - Odst&ranit - &Diff Roz&díly @@ -6780,17 +6756,10 @@ více času, než je nastaveno. V takovém případě by se měla hodnota zvýš &Track &Sledovat - - Reset - - Set current branch to track the selected one. - - - Git::Internal::ChangeSelectionDialog Select a Git commit Vyberte odeslání do Git @@ -6807,10 +6776,6 @@ více času, než je nastaveno. V takovém případě by se měla hodnota zvýš Select Git Repository Vyberte skladiště Git - - Error - Chyba - Selected directory is not a Git repository. Vybraný adresář není skladištěm Git. @@ -6827,10 +6792,6 @@ více času, než je nastaveno. V takovém případě by se měla hodnota zvýš &Show Uká&zat - - Cherry &Pick - Cherry-&Pick - &Revert &Vrátit @@ -6887,9 +6848,6 @@ více času, než je nastaveno. V takovém případě by se měla hodnota zvýš HEAD HEAD - - - Git::Internal::GitClient Note that the git plugin for QtCreator is not able to interact with the server so far. Thus, manual ssh-identification etc. will not work. Upozornění: přídavný modul Git pro QtCreator zatím ještě není schopen spolupracovat se serverem. Tudíž nebude pracovat ani ruční rozpoznání ssh a tak dále. @@ -7083,10 +7041,6 @@ více času, než je nastaveno. V takovém případě by se měla hodnota zvýš Unable to run show: %1: %2 Příkaz pro ukázání (show) se nepodařilo provést: %1: %2 - - Changes - Změny - You have modified files. Would you like to stash your changes? Soubory byly změněny. Chcete provést příkaz pro ulití (stash) těchto změn? @@ -7345,18 +7299,10 @@ Chcete nyní zapsat? What would you like to do with local changes in: Co chcete dělat s následujícími místními změnami: - - Stash && Pop - - Stash local changes and pop when %1 finishes. - - Stash - Odložit (stash) - Stash local changes and execute %1. Odložit místní změny a provést %1. @@ -7377,10 +7323,6 @@ Chcete nyní zapsat? Stash local changes and continue. Odložit místní změny a pokračovat. - - Discard - Odmítnout - Discard (reset) local changes and continue. Zahodit (reset) místní změny a pokračovat. @@ -7448,10 +7390,6 @@ Chcete nyní zapsat? Commit now? Pro dokončení vrácení změn je nutno provést zápis. Chcete nyní zapsat? - - Commit - Použít - Create Local Branch Vytvořit místní větev @@ -7545,10 +7483,6 @@ Commit now? - - Revert - Vrátit změny (revert) - The file has been changed. Do you want to revert it? Soubor byl změněn. Chcete vrátit změny? @@ -7605,9 +7539,6 @@ Commit now? Cannot determine git version: %1 Používanou verzi Gitu se nepodařilo určit. %1 - - - Git::Internal::GitPlugin &Git &Git @@ -7752,18 +7683,10 @@ Commit now? Abort Revert Zrušit vrácení změn - - Continue Rebase - Pokračovat v přeskládání - Continue Cherry Pick Pokračovat ve výběrovém slučování - - Continue Revert - Pokračovat ve vracení změn - Diff &Selected Files Rozdíly pro &vybrané soubory @@ -7902,10 +7825,6 @@ Commit now? Undo Project Changes Změny v projektu vrátit zpět - - Stash - Odložit (stash) - Saves the current state of your work. Uloží nynější stav vaší práce. @@ -8229,23 +8148,10 @@ Commit now? The commit message check failed. Do you want to commit the change? Ověření popisu týkajícího se odeslání se nezdařilo. Přesto chcete odeslání změn provést? - - - Git::Internal::GitSettings The binary '%1' could not be located in the path '%2' Spustitelný soubor '%1' se v cestě '%2' nepodařilo najít - - - Git::Internal::GitSubmitEditor - - Git Commit - Git Commit - - - - Git::Internal::GitSubmitPanel General Information Obecné informace @@ -8282,9 +8188,6 @@ Commit now? By&pass hooks O&bejít podmíněné akce (hooks) - - - Git::Internal::LocalBranchModel <New branch> <Nová větev> @@ -8293,9 +8196,6 @@ Commit now? Type to create a new branch Zadejte název pro novou větev - - - Git::Internal::SettingsPage Git Git @@ -8384,10 +8284,6 @@ Commit now? Set "HOME" environment variable Nastavit proměnnou prostředí "HOME" - - Gitk - Gitk - Arguments: Argumenty: @@ -8428,13 +8324,6 @@ Commit now? Show diff side-by-side Ukázat změny vedle sebe - - Repository Browser - Prohlížeč skladiště - - - - GitCommand '%1' failed (exit code %2). @@ -19055,7 +18944,7 @@ Toho se dosáhne vložením této zkratky v zadávacím poli vyhledávače, nás - Git::Internal::CloneWizard + Git Clones a project from a git repository. Vytvoří přesnou kopii projektu ze skladiště jménem Git. @@ -19076,9 +18965,6 @@ Toho se dosáhne vložením této zkratky v zadávacím poli vyhledávače, nás Git Repository Clone Klon skladiště Git - - - Git::CloneWizardPage Location Umístění @@ -21089,7 +20975,7 @@ S60 emulator run configuration default display name, %1 is base pro-File name - Git::Internal::StashDialog + Git Stashes Odložené změny @@ -21110,10 +20996,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameDelete all... Smazat vše... - - Delete... - Smazat... - Show Ukázat @@ -21176,10 +21058,6 @@ S60 emulator run configuration default display name, %1 is base pro-File name&Delete... S&mazat... - - &Show - Uká&zat - R&estore... &Obnovit... @@ -21189,10 +21067,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameRestore a git stash to new branch to be created Obnovit jako &větev... - - Re&fresh - &Obnovit - Delete Stashes Smazat odložené změny @@ -21219,10 +21093,6 @@ Můžete si vybrat mezi odložením změn nebo jejich vyhozením. Restore Stash to Branch Použít odloženou jako větev - - Branch: - Větev: - Stash Restore Použití odložené změny @@ -24706,28 +24576,15 @@ Proces Pdb po určité době od úspěšného spuštění spadl. - Git::Internal::RemoteBranchModel + Git (no branch) <žádná větev> - - - GitClient - - Unable to determine the repository for %1. - Skladiště pro %1 se nepodařilo určit. - - - - Git::Internal::GitCommand Error: Git timed out after %1s. Chyba: Překročení času u Gitu po %1s. - - - Git::Internal::GitEditor Blame %1 Anotace (blame) pro %1 @@ -29519,7 +29376,7 @@ Při GDB může být zadána posloupnost příkazů oddělená oddělovačem &ap - Git::Internal::BranchAddDialog + Git Dialog Dialog @@ -29528,10 +29385,6 @@ Při GDB může být zadána posloupnost příkazů oddělená oddělovačem &ap Branch Name: Název větve: - - CheckBox - Zaškrtávací okénko - Add Branch Přidat větev @@ -29548,9 +29401,6 @@ Při GDB může být zadána posloupnost příkazů oddělená oddělovačem &ap Track local branch '%1' Sledovat místní větev '%1' - - - Git::Internal::RemoteAdditionDialog Add Remote Přidat vzdálené @@ -29563,9 +29413,6 @@ Při GDB může být zadána posloupnost příkazů oddělená oddělovačem &ap URL: Adresa (URL): - - - Git::Internal::RemoteDialog Remotes Vzdálené (Remotes) @@ -29574,10 +29421,6 @@ Při GDB může být zadána posloupnost příkazů oddělená oddělovačem &ap Re&fresh O&bnovit - - &Add... - Přid&at... - F&etch &Přivést (fetch) @@ -34971,7 +34814,7 @@ Tyto soubory jsou zachovány. - Git::Internal::BranchModel + Git Local Branches Místní větve @@ -34984,9 +34827,6 @@ Tyto soubory jsou zachovány. Tags Značky - - - Git::Internal::BaseGitDiffArgumentsWidget Use the patience algorithm for calculating the differences. Použít algoritmus "patience diff" pro výpočet rozdílů. @@ -35003,9 +34843,6 @@ Tyto soubory jsou zachovány. Ignore Whitespace Nevšímat si bílých znaků - - - Git::Internal::GitShowArgumentsWidget Select the pretty printing format. Vybrat výstupní formát. @@ -35038,9 +34875,6 @@ Tyto soubory jsou zachovány. raw nezpracovaný - - - Git::Internal::GitBlameArgumentsWidget Hide the date of a change from the output. Datum změny ve výstupu neukazovat. @@ -35049,17 +34883,6 @@ Tyto soubory jsou zachovány. Omit Date Vynechat datum - - Ignore whitespace only changes. - Nevšímat si změn bílých znaků. - - - Ignore Whitespace - Nevšímat si bílých znaků - - - - Git::Internal::SettingsPageWidget Set the environment variable HOME to '%1' (%2). @@ -48095,7 +47918,7 @@ Nainstalujte, prosím, alespoň jedno SDK. - Git::Internal::CommitData + Git untracked neverzováno @@ -48140,9 +47963,6 @@ Nainstalujte, prosím, alespoň jedno SDK. updated aktualizováno - - - Gerrit::Internal::GerritDialog Gerrit %1@%2 Gerrit %1@%2 @@ -48195,18 +48015,10 @@ Nainstalujte, prosím, alespoň jedno SDK. &Checkout... Načíst (checkout)... - - &Show - Uká&zat - Cherry &Pick &Výběrově sloučit - - &Checkout - &Načíst (checkout) - Diff... Rozdíly... @@ -48215,21 +48027,10 @@ Nainstalujte, prosím, alespoň jedno SDK. Apply... Použít... - - Checkout... - Načíst (checkout)... - - - Refresh - Obnovit - Fetching "%1"... Natahuje se "%1"... - - - Gerrit::Internal::GerritModel Subject: %1 Number: %2 Id: %3 @@ -48278,10 +48079,6 @@ Schválení: %12 Approvals Schválení - - Status - Stav - Parse error: '%1' -> %2 Chyba ve zpracování: '%1' -> %2 @@ -48294,9 +48091,6 @@ Schválení: %12 Parse error in line '%1' Chyba ve zpracování na řádku: '%1' - - - Gerrit::Internal::QueryContext Gerrit Gerrit @@ -48333,16 +48127,6 @@ Chcete jej ukončit? Keep Running Pokračovat - - - Gerrit::Internal::GerritOptionsPage - - Gerrit - Gerrit - - - - Gerrit::Internal::GerritOptionsWidget HTTPS HTTPS @@ -48423,25 +48207,10 @@ asked to confirm the repository path. "canonicalWebUrl"není nastavena v souboru "gerrit.config". - - - Gerrit::Internal::FetchContext Gerrit Fetch Gerrit Fetch (přivedení) - - %1 crashed. - %1 spadl. - - - %1 returned %2. - %1 vrátil %2. - - - Error running %1: %2 - Chyba při spouštění %1: %2 - Error writing to temporary file. Chyba při zápisu do dočasného souboru. @@ -48454,9 +48223,6 @@ asked to confirm the repository path. Cherry-picking %1... Vybírá se %1... - - - Gerrit::Internal::GerritPlugin Gerrit... Gerrit... @@ -48507,9 +48273,6 @@ nepatří k ověřeným Remotes v %3. Vybrat jinou složku? Enter Local Repository for '%1' (%2) Vstoupit do místního skladiště pro '%1' (%2) - - - Git::Internal::GitLogArgumentsWidget Show Diff Ukázat rozdíly @@ -48527,39 +48290,6 @@ nepatří k ověřeným Remotes v %3. Vybrat jinou složku? Ukázat graf jako text. - - Git::Internal::ResetDialog - - Sha1 - Sha1 - - - Subject - Předmět - - - Reset to: - Nastavit znovu na: - - - Reset type: - XXX: neověřeno za běhu - Druh znovunastavení: - - - Hard Reset - XXX: Včetně pracovního stromu (lepší, ale asi moc dlouhé?); Napevno (hard) - I pracovní strom (hard) - - - Soft Reset - Pouze HEAD (soft) - - - Undo Changes to %1 - Změny pro %1 vrátit zpět - - Locator::Internal::ExecuteFilter @@ -51221,11 +50951,7 @@ Zasáhnutí do modulu nebo nastavení bodů přerušení podle souboru, a oček - Git::Internal::GitSubmitEditorWidget - - Detached HEAD - Odpojená HEAD - + Git Select Change Vybrat změnu @@ -52582,11 +52308,7 @@ nelze najít v cestě. - Git::Internal::BranchCheckoutDialog - - Dialog - Dialog - + Git Local Changes Found. Choose Action: Nalezeny místní změny. Vyberte úkon: @@ -54252,11 +53974,7 @@ nelze najít v cestě. - Git::Internal::MergeTool - - Error - Chyba - + Git File input for the merge tool requires Git 1.7.8, or later. XXX: ověřit? @@ -54339,52 +54057,10 @@ Vzdálený: %4 Merge tool process finished successfully. Nástroj pro slučování doběhl úspěšně. - - No changes found. - Beze změn. - - - Skip - Přeskočit - Merge tool process finished successully. Nástroj pro slučování doběhl úspěšně. - - Continue Rebase - Pokračovat v přeskládání - - - Continue rebase? - Pokračovat v přeskládání? - - - Continue - Pokračovat - - - Continue Revert - Pokračovat ve vracení změn - - - You need to commit changes to finish revert. -Commit now? - Pro dokončení vrácení změn je nutno provést zápis. Chcete nyní zapsat? - - - Commit - Zapsat (commit) - - - Continue Cherry-Picking - Pokračovat ve výběrovém slučování - - - You need to commit changes to finish cherry-picking. -Commit now? - Pro dokončení výběrového slučování je nutno provést zápis. Chcete nyní zapsat? - Merge tool process terminated with exit code %1 Proces slučovacího nástroje ukončen, vrácená hodnota %1 @@ -55565,7 +55241,7 @@ Chcete je nyní načíst? - Gerrit::Internal::GerritPushDialog + Git Push to Gerrit Odvést do Gerritu... @@ -56681,7 +56357,7 @@ Lze používat části jmen, pokud jsou jednoznačné. - Git::Internal::GitDiffHandler + Git Working tree Pracovní kopie @@ -56690,24 +56366,10 @@ Lze používat části jmen, pokud jsou jednoznačné. Index Index - - Waiting for data... - Čeká se na data... - - - - Git::Internal::LogChangeWidget Sha1 Sha1 - - Subject - Předmět - - - - Git::Internal::LogChangeDialog Reset to: Nastavit znovu na: @@ -58911,7 +58573,7 @@ Soubory ve zdrojovém adresáři balíčku pro Android jsou zkopírovány do adr - Git::Internal::GitDiffSwitcher + Git Switch to Text Diff Editor Přepnout na editor rozdílů v textu diff --git a/share/qtcreator/translations/qtcreator_da.ts b/share/qtcreator/translations/qtcreator_da.ts index 11295348df2..d37a777ea3a 100644 --- a/share/qtcreator/translations/qtcreator_da.ts +++ b/share/qtcreator/translations/qtcreator_da.ts @@ -16521,7 +16521,7 @@ Se også Google-test-indstillinger. - Gerrit::Internal::AuthenticationDialog + Git Authentication Autentifikation @@ -16546,9 +16546,6 @@ Se også Google-test-indstillinger. Anonymous Anonym - - - Gerrit::Internal::FetchContext Fetching from Gerrit Henter fra Gerrit @@ -16565,9 +16562,6 @@ Se også Google-test-indstillinger. Error running %1: %2 Fejl ved kørsel af %1: %2 - - - Gerrit::Internal::GerritDialog Changes Ændringer @@ -16624,17 +16618,10 @@ Note: This can expose you to man-in-the-middle attack. Vil du deaktivere SSL-verifikation for denne server? Bemærk: Dette kan udsætte dig for man-in-the-middle-angreb. - - - Gerrit::Internal::GerritModel (Draft) (kladde) - - Subject - Emne - Owner Ejer @@ -16683,16 +16670,6 @@ Bemærk: Dette kan udsætte dig for man-in-the-middle-angreb. Parse error: "%1" Parse-fejl: "%1" - - - Gerrit::Internal::GerritOptionsPage - - Gerrit - Gerrit - - - - Gerrit::Internal::GerritOptionsWidget HTTPS HTTPS @@ -16701,10 +16678,6 @@ Bemærk: Dette kan udsætte dig for man-in-the-middle-angreb. &Host: &Vært: - - &User: - &Bruger: - &ssh: &ssh: @@ -16729,9 +16702,6 @@ Bemærk: Dette kan udsætte dig for man-in-the-middle-angreb. "canonicalWebUrl" ikke er konfigureret i filen "gerrit.config". - - - Gerrit::Internal::GerritPlugin Gerrit... Gerrit... @@ -16774,9 +16744,6 @@ blev ikke verificeret blandt fjerne i %3. Vælg anden mappe? Enter Local Repository for "%1" (%2) Indtast lokal repository for "%1" (%2) - - - Gerrit::Internal::GerritPushDialog Push to Gerrit Push til Gerrit @@ -16883,9 +16850,6 @@ Delvist tilvalg - Ændr ikke aktuelle tilstand. &Work-in-progress &Igangværende arbejde - - - Gerrit::Internal::GerritRemoteChooser Refresh Remote Servers Genopfrisk fjern-servere @@ -16894,25 +16858,10 @@ Delvist tilvalg - Ændr ikke aktuelle tilstand. Fallback Fallback - - - Gerrit::Internal::QueryContext Querying Gerrit Anmoder Gerrit - - Error running %1: %2 - Fejl ved kørsel af %1: %2 - - - %1 crashed. - %1 holdt op med at virke. - - - %1 returned %2. - %1 returnerede %2. - Timeout Timeout @@ -16933,9 +16882,6 @@ Vil du terminere den? Keep Running Fortsæt kørsel - - - Git::Internal::BaseGitDiffArgumentsWidget Patience Patience @@ -16952,9 +16898,6 @@ Vil du terminere den? Ignore whitespace only changes. Ignorer ændringer som kun består af mellemrum. - - - Git::Internal::BranchAddDialog Branch Name: Grennavn: @@ -16979,9 +16922,6 @@ Vil du terminere den? Track local branch '%1' Spor lokal grenen '%1' - - - Git::Internal::BranchCheckoutDialog Local Changes Found. Choose Action: Lokale ændringer fundet. Vælg handling: @@ -16994,10 +16934,6 @@ Vil du terminere den? Discard Local Changes Forkast lokale ændringer - - CheckBox - Afkrydsningsboks - Checkout branch "%1" Checkout grenen "%1" @@ -17018,9 +16954,6 @@ Vil du terminere den? Create Branch Stash for Current Branch Opret gren-stash for aktuel gren - - - Git::Internal::BranchDialog Branches Grene @@ -17092,21 +17025,10 @@ Vil du terminere den? Include ta&gs Inkluder &tags - - C&heckout - C&heckout - Re&set &Nulstil - - Cherry &Pick - Cherry &pick - - - - Git::Internal::BranchModel Local Branches Lokale grene @@ -17119,9 +17041,6 @@ Vil du terminere den? Tags Tags - - - Git::Internal::ChangeSelectionDialog Select a Git Commit Vælg et Git-commit @@ -17154,14 +17073,6 @@ Vil du terminere den? &Revert &Tilbagefør - - Cherry &Pick - Cherry &pick - - - &Show - &Vis - Select Git Directory Vælg Git-mappe @@ -17186,9 +17097,6 @@ Vil du terminere den? Fetching commit data... Henter commit-data... - - - Git::Internal::CommitData untracked untracked @@ -17233,9 +17141,6 @@ Vil du terminere den? by them af dem - - - Git::Internal::GitBlameArgumentsWidget Omit Date Udelad dato @@ -17244,21 +17149,10 @@ Vil du terminere den? Hide the date of a change from the output. Skjul ændringsdatoen fra outputtet. - - Ignore Whitespace - Ignorer blanktegn - - - Ignore whitespace only changes. - Ignorer ændringer som kun består af mellemrum. - Reload Genindlæs - - - Git::Internal::GitClient Cannot determine the repository for "%1". Kan ikke beslutte repository'et for "%1". @@ -17647,9 +17541,6 @@ Commit nu? Cancel %1. Annuller %1. - - - Git::Internal::GitEditorWidget &Blame %1 &Blame %1 @@ -17658,10 +17549,6 @@ Commit nu? Blame &Parent Revision %1 Blame &forælder revision %1 - - Chunk successfully staged - Bid staged - Stage Chunk... Stage bid... @@ -17702,9 +17589,6 @@ Commit nu? &Soft &Blødt - - - Git::Internal::GitLogArgumentsWidget Show Diff Vis forskel @@ -17729,13 +17613,6 @@ Commit nu? Show textual graph log. Vis textual graph log. - - Reload - Genindlæs - - - - Git::Internal::GitPlugin <No repository> <intet repository> @@ -17912,10 +17789,6 @@ Commit nu? Clean... Clean... - - Status - Status - Commit... Commit... @@ -17968,10 +17841,6 @@ Commit nu? Abort Revert Afbryd revert - - Continue Rebase - Fortsæt rebase - Skip Rebase Spring rebase over @@ -17980,10 +17849,6 @@ Commit nu? Continue Cherry Pick Fortsæt cherry pick - - Continue Revert - Fortsæt revert - Branches... Grene... @@ -18012,10 +17877,6 @@ Commit nu? Stashes... Stashes... - - Stash - Stash - Saves the current state of your work and resets the repository. Gemmer den aktuelle tilstand af dit arbejde og nulstiller repository'et. @@ -18136,10 +17997,6 @@ Commit nu? Create Repository... Opret repository... - - Commit - Commit - Diff &Selected Files Diff &valgte filer @@ -18216,31 +18073,18 @@ Commit nu? Patch %1 successfully applied to %2 Patch %1 anvendt på %2 med succes - - - Git::Internal::GitSettings The binary "%1" could not be located in the path "%2" Binæren "%1" kunne ikke findes i stien "%2" - - - Git::Internal::GitSubmitEditor Refreshing Commit Data Genindlæser commit-data - - - Git::Internal::GitSubmitEditorWidget Provide a valid email to commit. Giv en gyldig e-mail for at commit. - - Detached HEAD - Afkoblet HEAD - Select Change Vælg ændring @@ -18269,9 +18113,6 @@ Commit nu? &Commit &Commit - - - Git::Internal::GitSubmitPanel General Information Generel information @@ -18312,9 +18153,6 @@ Commit nu? Sign off Sign off - - - Git::Internal::LogChangeDialog Reset to: Nulstil til: @@ -18339,9 +18177,6 @@ Commit nu? Soft Blødt - - - Git::Internal::LogChangeWidget Sha1 Sha1 @@ -18350,9 +18185,6 @@ Commit nu? Subject Subjekt - - - Git::Internal::MergeTool Normal Normal @@ -18441,9 +18273,6 @@ Fjern: %4 Merge tool process terminated with exit code %1 Merge-værktøj-proces termineret med afslutningskode %1 - - - Git::Internal::RemoteAdditionDialog Add Remote Tilføj fjern @@ -18456,21 +18285,10 @@ Fjern: %4 URL: URL: - - - Git::Internal::RemoteDialog Remotes Fjern - - Re&fresh - &Genindlæs - - - &Add... - &Tilføj... - F&etch &Hent @@ -18479,10 +18297,6 @@ Fjern: %4 &Push &Push - - &Remove - &Fjern - A remote with the name "%1" already exists. En fjern med navnet "%1" findes allerede. @@ -18499,20 +18313,10 @@ Fjern: %4 Would you like to delete the remote "%1"? Vil du slette fjernen "%1"? - - - Git::Internal::RemoteModel Name Navn - - URL - URL - - - - Git::Internal::SettingsPage Configuration Konfiguration @@ -18557,18 +18361,10 @@ Fjern: %4 Note that huge amount of commits might take some time. Bemærk at kæmpe mængder af commits kan tage noget tid. - - Gitk - Gitk - Arguments: Argumenter: - - Repository Browser - Repositorybrowser - Command: Kommando: @@ -18581,9 +18377,6 @@ Fjern: %4 Git Settings Git-indstillinger - - - Git::Internal::SettingsPageWidget Set the environment variable HOME to "%1" (%2). @@ -18606,17 +18399,10 @@ i stedet for i dens installationsmappe når der køres udenfor git bash.Git Repository Browser Command Git repositorybrowser-kommando - - - Git::Internal::StashDialog Stashes Stashes - - Name - Navn - Branch Gren @@ -18633,10 +18419,6 @@ i stedet for i dens installationsmappe når der køres udenfor git bash.&Delete... &Slet... - - &Show - &Vis - R&estore... &Genskab... @@ -18646,10 +18428,6 @@ i stedet for i dens installationsmappe når der køres udenfor git bash.Restore a git stash to new branch to be created Genskab til &gren... - - Re&fresh - &Genindlæs - Delete Stashes Slet stashes @@ -18675,22 +18453,10 @@ You can choose between stashing the changes or discarding them. %1 kan ikke genskabes eftersom repository'et er ændret. Du kan vælge mellem stashing af ændringerne eller forkaste dem. - - Stash - Stash - - - Discard - Forkast - Restore Stash to Branch Genskab stash til gren - - Branch: - Gren: - Stash Restore Stash-genskab @@ -18703,9 +18469,6 @@ Du kan vælge mellem stashing af ændringerne eller forkaste dem. Error restoring %1 Fejl ved genskabelse af %1 - - - GitGrep Tree (optional) Træ (valgfrit) @@ -43281,7 +43044,7 @@ Kopiér stien til kildefilerne til udklipsholderen? - Git::Internal::BranchUtils + Git Checkout Checkout @@ -43322,9 +43085,6 @@ Kopiér stien til kildefilerne til udklipsholderen? Hard reset branch "%1" to "%2"? Hard reset gren "%1" til "%2"? - - - Git::Internal::GitDiffEditorController <None> <intet> diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index b8c545084c1..e67d8ec8351 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -4101,7 +4101,7 @@ Grund: %3 - Git::Internal::ChangeSelectionDialog + Git Browse &History... Von &History... @@ -4170,9 +4170,6 @@ Grund: %3 &Archive... &Archiv erzeugen... - - - Git::Internal::GitClient Invalid revision Ungültige Revision @@ -4261,10 +4258,6 @@ Jetzt Commit ausführen? Stash local changes and execute %1. Stash der lokalen Änderungen anlegen und %1 ausführen. - - Discard - Verwerfen - Git SVN Log Git SVN Log @@ -4671,9 +4664,6 @@ Jetzt Commit ausführen? What would you like to do with local changes in: Wie möchten Sie die folgenden lokalen Änderungen behandeln: - - - Git::Internal::GitPlugin <No repository> <Kein Repository> @@ -4682,16 +4672,10 @@ Jetzt Commit ausführen? Repository: %1 Repository: %1 - - - Git::Internal::GitSettings The binary "%1" could not be located in the path "%2" Die ausführbare Datei "%1" konnte nicht im Pfad "%2" gefunden werden - - - Git::Internal::GitSubmitPanel General Information Allgemeine Informationen @@ -4732,9 +4716,6 @@ Jetzt Commit ausführen? Sign off Unterschreiben - - - Git::Internal::SettingsPage <b>Note:</b> <b>Hinweis:</b> @@ -4791,10 +4772,6 @@ Jetzt Commit ausführen? Command: Kommando: - - Repository Browser - Repository Browser - Help @@ -8576,7 +8553,7 @@ Was möchten Sie tun? - Git::Internal::StashDialog + Git Stashes Stashes @@ -8612,10 +8589,6 @@ Was möchten Sie tun? &Delete... &Löschen... - - &Show - &Anzeigen - R&estore... &Wiederherstellen... @@ -8643,10 +8616,6 @@ You can choose between stashing the changes or discarding them. %1 kann nicht wiederhergestellt werden, da Änderungen im Repository vorhanden sind. Sie können die Änderungen in einem Stash ablegen oder zurücksetzen. - - Stash - Stash - Discard Zurücksetzen @@ -8655,10 +8624,6 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Restore Stash to Branch Als Branch wiederherstellen - - Branch: - Branch: - Stash Restore Stash wiederherstellen @@ -11590,7 +11555,7 @@ Wenn Sie %2 aus den Quelltexten erstellen und eine ausführbare CDB-Datei mit ei - Git::Internal::SettingsPageWidget + Git Set the environment variable HOME to "%1" (%2). @@ -12743,7 +12708,7 @@ Soll es noch einmal versucht werden? - Git::Internal::BaseGitDiffArgumentsWidget + Git Use the patience algorithm for calculating the differences. "patience diff"-Algorithmus verwenden. @@ -12760,9 +12725,6 @@ Soll es noch einmal versucht werden? Ignore Whitespace Leerzeichen ignorieren - - - Git::Internal::GitBlameArgumentsWidget Hide the date of a change from the output. Datum der Änderung in Ausgabe nicht anzeigen. @@ -12771,10 +12733,6 @@ Soll es noch einmal versucht werden? Omit Date Datum weglassen - - Ignore whitespace only changes. - Änderungen der Leerzeichen ignorieren. - No Move Detection Keine verschobenen Daten erkennen @@ -12795,10 +12753,6 @@ Soll es noch einmal versucht werden? Move detection Verschobene Daten erkennen - - Ignore Whitespace - Leerzeichen ignorieren - GLSLEditor @@ -14262,7 +14216,7 @@ Gibt an, wie sich die Rücktaste bezüglich Einrückung verhält. - Git::Internal::RemoteAdditionDialog + Git Add Remote Git Remote hinzufügen @@ -14275,17 +14229,10 @@ Gibt an, wie sich die Rücktaste bezüglich Einrückung verhält. URL: URL: - - - Git::Internal::RemoteDialog Remotes Git Remotes - - Re&fresh - &Aktualisieren - &Add... &Hinzufügen... @@ -15958,7 +15905,7 @@ Zusätzlich wird die Verbindung zum Gerät getestet. - Git::Internal::BranchAddDialog + Git Branch Name: Branch: @@ -16004,7 +15951,7 @@ Zusätzlich wird die Verbindung zum Gerät getestet. - Git::Internal::BranchModel + Git Local Branches Lokale Branches @@ -16013,10 +15960,6 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Remote Branches Remote Branches - - Detached HEAD - Detached HEAD - Tags Tags @@ -18151,7 +18094,7 @@ should a repository require SSH-authentication (see documentation on SSH and the - Git::Internal::CommitData + Git untracked nicht unter Versionskontrolle @@ -18196,9 +18139,6 @@ should a repository require SSH-authentication (see documentation on SSH and the by them von ihnen - - - Git::Internal::GitLogArgumentsWidget First Parent Erster Eltern-Commit @@ -19324,7 +19264,7 @@ manuellen Herunterladen im Browser des System zu öffnen. - Gerrit::Internal::GerritDialog + Git Changes Änderungen @@ -19349,14 +19289,6 @@ manuellen Herunterladen im Browser des System zu öffnen. &Refresh &Aktualisieren - - &Show - An&zeigen - - - Cherry &Pick - Cherry-&Pick - Fetching "%1"... Hole "%1"... @@ -19381,9 +19313,6 @@ Note: This can expose you to man-in-the-middle attack. Möchten Sie die SSL-Verifikation für diesen Server abschalten? Hinweis: Dies macht Sie anfällig für Man-in-the-middle-Angriffe. - - - Gerrit::Internal::GerritModel (Draft) (Entwurf) @@ -19440,9 +19369,6 @@ Hinweis: Dies macht Sie anfällig für Man-in-the-middle-Angriffe. Parse error: "%1" Fehler bei Auswertung: "%1" - - - Gerrit::Internal::QueryContext Querying Gerrit Anfrage an Gerrit @@ -19479,16 +19405,6 @@ Möchten Sie ihn beenden? Terminate Beenden - - - Gerrit::Internal::GerritOptionsPage - - Gerrit - Gerrit - - - - Gerrit::Internal::GerritOptionsWidget HTTPS HTTPS @@ -19525,28 +19441,10 @@ Möchten Sie ihn beenden? "canonicalWebUrl" in der Datei "gerrit.config" nicht konfiguriert ist. - - - Gerrit::Internal::FetchContext Fetching from Gerrit Hole von Gerrit - - %1 crashed. - %1 ist abgestürzt. - - - %1 returned %2. - %1 gab %2 zurück. - - - Error running %1: %2 - Fehler bei Ausführung von %1: %2 - - - - Gerrit::Internal::GerritPlugin Gerrit... Gerrit... @@ -19589,17 +19487,10 @@ gehören nicht zu den verifizierten Remotes in %3. Anderes Verzeichnis angeben?< Enter Local Repository for "%1" (%2) Geben Sie das lokale Repository für "%1" an (%2) - - - Git::Internal::GitSubmitEditorWidget Provide a valid email to commit. Geben Sie eine gültige Email-Adresse für Commits an. - - Detached HEAD - Detached HEAD - Select Change Änderung auswählen @@ -20621,7 +20512,7 @@ Sie können hier eine andere Verbindung wählen, beispielsweise eine serielle Ve - Git::Internal::BranchCheckoutDialog + Git Local Changes Found. Choose Action: Es wurden lokale Änderungen festgestellt: Wählen Sie eine Aktion: @@ -20829,7 +20720,7 @@ Sie können hier eine andere Verbindung wählen, beispielsweise eine serielle Ve - Git::Internal::MergeTool + Git Normal Normal @@ -22419,7 +22310,7 @@ Weitere Informationen finden Sie auf der Dokumentationsseite "Checking Code - Gerrit::Internal::GerritPushDialog + Git Push to Gerrit Push zu Gerrit @@ -22617,7 +22508,7 @@ Teilnamen können verwendet werden, sofern sie eindeutig sind. - Git::Internal::LogChangeDialog + Git Reset to: Zurücksetzen auf: @@ -22878,15 +22769,11 @@ Teilnamen können verwendet werden, sofern sie eindeutig sind. - Git::Internal::LogChangeWidget + Git Sha1 Sha1 - - Subject - Titel - CppEditor::Internal::InsertVirtualMethodsDialog @@ -27398,23 +27285,12 @@ Bitte installieren Sie ein Android-SDK der API-Version %1 oder neuer. - Git::Internal::GitSubmitEditor + Git Refreshing Commit Data Aktualisiere Commit-Daten - - Git::Internal::RemoteModel - - Name - Name - - - URL - URL - - Help @@ -30535,7 +30411,7 @@ Wählt eine für Desktop-Entwicklung geeignete Qt-Version aus, sofern sie verfü - Git::Internal::GitEditorWidget + Git &Blame %1 &Blame %1 @@ -30544,10 +30420,6 @@ Wählt eine für Desktop-Entwicklung geeignete Qt-Version aus, sofern sie verfü Blame &Parent Revision %1 Blame der über&geordneten Revision %1 - - Chunk successfully staged - Chunk wurde für Commit vorgesehen - Stage Chunk... Chunk für Commit vorsehen... @@ -35025,7 +34897,7 @@ Dies könnte Probleme während der Ausführung verursachen. - GitGrep + Git Tree (optional) Baum (optional) @@ -36532,7 +36404,7 @@ Warnung: Reinem Text fehlen manche Informationen, etwa die Dauer. - Gerrit::Internal::AuthenticationDialog + Git Authentication Authentifizierung @@ -36541,10 +36413,6 @@ Warnung: Reinem Text fehlen manche Informationen, etwa die Dauer. <html><head/><body><p>Gerrit server with HTTP was detected, but you need to set up credentials for it.</p><p>To get your password, <a href="LINK_PLACEHOLDER"><span style=" text-decoration: underline; color:#007af4;">click here</span></a> (sign in if needed). Click Generate Password if the password is blank, and copy the user name and password to this form.</p><p>Choose Anonymous if you do not want authentication for this server. In this case, changes that require authentication (like draft changes or private projects) will not be displayed.</p></body></html> <html><head/><body><p>Ein Gerrit-Server mit HTTP wurde erkannt, aber Sie müssen Zugangsdaten angeben.</p><p>Um Ihr Passwort zu erhalten, <a href="LINK_PLACEHOLDER"><span style=" text-decoration: underline; color:#007af4;">klicken Sie hier</span></a>. (Melden Sie sich an, wenn nötig.). Wenn das Passwortfeld leer ist, klicken Sie "Generate Password" und kopieren den Benutzernamen und das Passwort in dieses Formular.</p><p>Wählen Sie "Anonym", wenn Sie keine Authentifizierung für diesen Server wünschen. In diesem Fall werden Änderungen, die eine Authentifizierung benötigen (wie "Drafts" oder private Projekte), nicht angezeigt.</p></body></html> - - &User: - &Benutzer: - &Password: &Passwort: @@ -37947,7 +37815,7 @@ Einzelschritt in das Modul und das Setzen von Haltepunkten nach Datei und Zeilen - Gerrit::Internal::GerritRemoteChooser + Git Refresh Remote Servers Remote-Server aktualisieren @@ -42068,7 +41936,7 @@ Die Dateien aus dem Quellverzeichnis des Android-Pakets werden in das Verzeichni - Git::Internal::BranchView + Git Include Old Entries Alte Einträge einschließen @@ -42088,10 +41956,6 @@ Die Dateien aus dem Quellverzeichnis des Android-Pakets werden in das Verzeichni Branches und Tags einschließen, die seit %n Tagen nicht benutzt wurden. - - <No repository> - <Kein Repository> - Create Git Repository... Git-Repository erzeugen... @@ -42100,10 +41964,6 @@ Die Dateien aus dem Quellverzeichnis des Android-Pakets werden in das Verzeichni Add Branch... Branch hinzufügen... - - &Add... - &Hinzufügen... - &Fetch &Fetch @@ -42136,18 +41996,6 @@ Die Dateien aus dem Quellverzeichnis des Android-Pakets werden in das Verzeichni Re&set Zurück&setzen - - &Hard - &Hard - - - &Mixed - &Mixed - - - &Soft - &Soft - &Merge (Fast-Forward) &Merge (Fast-Forward) @@ -42164,18 +42012,10 @@ Die Dateien aus dem Quellverzeichnis des Android-Pakets werden in das Verzeichni &Rebase &Rebase - - Cherry &Pick - Cherry-&Pick - &Track &Folgen - - &Push - &Push - Would you like to delete the tag "%1"? Möchten Sie das Tag "%1" löschen? @@ -42200,9 +42040,6 @@ Die Dateien aus dem Quellverzeichnis des Android-Pakets werden in das Verzeichni Git Reset Git Reset - - - Git::Internal::BranchViewFactory Git Branches Git Branches @@ -46328,7 +46165,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e - Git::Internal::BaseGitLogArgumentsWidget + Git Diff Diff @@ -46337,13 +46174,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Show difference. Änderung anzeigen. - - Filter - Filter - - - - Git::Internal::GitLogFilterWidget Filter: Filter: @@ -46352,9 +46182,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Case Sensitive Groß-/Kleinschreibung - - - Git::Internal::GitPluginPrivate &Copy "%1" "%1" &Kopieren @@ -46519,10 +46346,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e &Local Repository &Lokales Repository - - Diff - Diff - Log Log @@ -46535,10 +46358,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Clean... Repository bereinigen... - - Status - Status - Commit... Commit... @@ -46591,10 +46410,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Abort Revert Revert abbrechen - - Continue Rebase - Rebase fortsetzen - Skip Rebase Rebase überspringen @@ -46603,10 +46418,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Continue Cherry Pick Cherry-Pick fortsetzen - - Continue Revert - Revert fortsetzen - Branches... Branches... @@ -46635,10 +46446,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Stashes... Stashes... - - Stash - Stash - Saves the current state of your work and resets the repository. Speichert den gegenwärtigen Stand der Arbeit und setzt das Repository zurück. @@ -46727,10 +46534,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Git &Tools Git-&Werkzeuge - - Gitk - Gitk - Gitk Current File Gitk mit Datei @@ -46755,10 +46558,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Repository Browser Repository-Browser - - Merge Tool - Merge-Tool - Git Bash Git Bash diff --git a/share/qtcreator/translations/qtcreator_es.ts b/share/qtcreator/translations/qtcreator_es.ts index 87c605a567b..5db41c08c69 100644 --- a/share/qtcreator/translations/qtcreator_es.ts +++ b/share/qtcreator/translations/qtcreator_es.ts @@ -5247,7 +5247,7 @@ Razón: %3 - Git::Internal::BranchDialog + Git Checkout Recuperar (Checkout) @@ -5311,9 +5311,6 @@ Razón: %3 Remote branches Ramas remotas - - - Git::Internal::ChangeSelectionDialog Select a Git commit Seleccione un commit de Git @@ -5330,9 +5327,6 @@ Razón: %3 Selected directory is not a Git repository El directorio seleccionado no es un repositorio de Git - - - Git::Internal::GitClient Note that the git plugin for QtCreator is not able to interact with the server so far. Thus, manual ssh-identification etc. will not work. Tenga en cuenta que el plugin Git para Qt Creator no es capaz de interactuar con un servidor Git por ahora. Por lo tanto, identificación manual mediante ssh etc. no funcionará. @@ -5465,16 +5459,10 @@ Razón: %3 There are no modified files. No hay archivos modificados. - - - Git::Internal::GitOutputWindow Git Output Salida de Git - - - Git::Internal::GitPlugin &Git @@ -5663,10 +5651,6 @@ Razón: %3 Could not find working directory No se pudo encontrar el directorio de trabajo - - Revert - Revertir - Would you like to revert all pending changes to the project? @@ -5695,32 +5679,18 @@ Razón: %3 The commit message check failed. Do you want to commit the change? La comprobación del mensaje de commit ha fallado. ¿Quiere realizar un commit con los cambios de todos modos? - - - Git::Internal::GitSettings The binary '%1' could not be located in the path '%2' El binario '%1' no pudo ser localizado en la ruta '%2' - - - Git::Internal::GitSubmitEditor Git Commit Commit de Git - - - Git::Internal::GitSubmitPanel General Information Información general - - - Repository: - Repositorio: - repository @@ -5751,9 +5721,6 @@ Razón: %3 Email: Email: - - - Git::Internal::LocalBranchModel <New branch> <Nueva rama> @@ -5762,9 +5729,6 @@ Razón: %3 Type to create a new branch Nombre para la nueva rama - - - Git::Internal::SettingsPage Git @@ -5822,9 +5786,6 @@ Razón: %3 Omit date from annotation output - - - GitCommand '%1' failed (exit code %2). @@ -12672,7 +12633,7 @@ p, li { white-space: pre-wrap; } - Git::Internal::CloneWizard + Git Clones a project from a git repository. @@ -12681,9 +12642,6 @@ p, li { white-space: pre-wrap; } Git Repository Clone - - - Git::CloneWizardPage Specify repository URL, checkout directory and path. diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index 2f5ad8d111b..b69d5ba75b8 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -7289,7 +7289,7 @@ Ajouter, modifier et supprimer des filtres de documents, qui détermine l'e - Git::Internal::BranchDialog + Git Branches Branches @@ -7298,10 +7298,6 @@ Ajouter, modifier et supprimer des filtres de documents, qui détermine l'e General information Informations générales - - Repository: - Dépôt : - Remote branches traduction de remote ici ? @@ -7319,14 +7315,6 @@ Ajouter, modifier et supprimer des filtres de documents, qui détermine l'e Unable to find the repository directory for '%1'. Impossible de trouver le dépôt de "%1". - - Diff - Diff - - - Log - Log - Refresh Rafraîchir @@ -7400,10 +7388,6 @@ Ajouter, modifier et supprimer des filtres de documents, qui détermine l'e tracking branch ? Échec de la création d'une branche de suivi - - Remote Branches - Branches distantes - Re&fresh Ra&fraîchir @@ -7424,10 +7408,6 @@ Ajouter, modifier et supprimer des filtres de documents, qui détermine l'e &Log &Log - - &Checkout - Import (&C) - Re&name Re&nommer @@ -7456,9 +7436,6 @@ Ajouter, modifier et supprimer des filtres de documents, qui détermine l'e &Track &Suivre - - - Git::Internal::ChangeSelectionDialog Select a Git commit Sélectionner un commit Git @@ -7479,10 +7456,6 @@ Ajouter, modifier et supprimer des filtres de documents, qui détermine l'e &Show &Montrer - - Cherry &Pick - I&mportation sélective - &Revert &Rétablir @@ -7551,9 +7524,6 @@ Ajouter, modifier et supprimer des filtres de documents, qui détermine l'e HEAD HEAD - - - Git::Internal::GitClient Note that the git plugin for QtCreator is not able to interact with the server so far. Thus, manual ssh-identification etc. will not work. marchera ou marcheront ? Le etc laisse sous-entendre qu'il y aurait d'autres choses qui ne marcheraient pas. @@ -7773,10 +7743,6 @@ Ajouter, modifier et supprimer des filtres de documents, qui détermine l'e Unable to run show: %1: %2 Impossible d'exécuter show : %1 : %2 - - Changes - Modifications - You have modified files. Would you like to stash your changes? Vous avez modifié des fichiers. Souhaitez-vous mettre vos changements dans le stash ? @@ -7933,10 +7899,6 @@ Ajouter, modifier et supprimer des filtres de documents, qui détermine l'e MERGING FUSIONNEMENT - - Detached HEAD - HEAD détaché - Cannot retrieve top revision of "%1": %2 Impossible d'obtenir la dernière révision dans "%1" : %2 @@ -8112,10 +8074,6 @@ Valider maintenant ? Stash local changes and pop when %1 finishes. Remiser les changements locaux, puis les récupérer lorsque %1 est terminé. - - Stash - Remise - Stash local changes and continue. Remiser les changements locaux et continuer. @@ -8223,10 +8181,6 @@ Valider maintenant ? - - Revert - Rétablir - The file has been changed. Do you want to revert it? Le fichier a été modifié. Voulez-vous le rétablir ? @@ -8283,9 +8237,6 @@ Valider maintenant ? Cannot determine git version: %1 Impossible de déterminer la version de git : %1 - - - Git::Internal::GitPlugin &Git &Git @@ -8567,18 +8518,10 @@ Valider maintenant ? Abort Revert Annuler le rétablissement - - Continue Rebase - Continuer le rebasement - Continue Cherry Pick Continuer l'importation sélective - - Continue Revert - Continuer le rétablissement - &Patch &Patch @@ -8820,14 +8763,6 @@ Valider maintenant ? Actions on Commits... Actions sur les soumissions... - - Commit - Faire un commit - - - Undo Changes to %1 - Annuler les changements jusqu'à %1 - Interactive Rebase Changement de base interactif @@ -8862,10 +8797,6 @@ Valider maintenant ? Git Fixup Commit Soumission de correction Git - - Git Commit - Soumission Git - Closing Git Editor Fermer l'éditeur Git @@ -8914,23 +8845,14 @@ Valider maintenant ? The commit message check failed. Do you want to commit the change? La vérification du message de commit a échoué. Voulez-vous soumettre vos modifications ? - - - Git::Internal::GitSettings The binary '%1' could not be located in the path '%2' Le binaire '%1' n'a pas pu être trouvé dans le chemin "%2" - - - Git::Internal::GitSubmitEditor Git Commit Git commit - - - Git::Internal::GitSubmitPanel General Information Informations générales @@ -8968,9 +8890,6 @@ Valider maintenant ? contexte ? -> Les hooks dans git (ou SVN) sont des checks faites avant et après un commit. D'ailleurs, le projet Qt utilise les hooks :P . Dans le livre suivant, j'ai trouvé : http://git-scm.com/book/fr/Personnalisation-de-Git-Crochets-Git &Éviter les crochets - - - Git::Internal::LocalBranchModel <New branch> <Nouvelle branche> @@ -8980,9 +8899,6 @@ Valider maintenant ? Type pas facile à traduire dans ce contexte... Taper ? Saisir pour créer une nouvelle branche - - - Git::Internal::SettingsPage Environment variables Variables d'environnement @@ -9075,10 +8991,6 @@ Valider maintenant ? Ignore whitespace changes in annotation and diff Ignorer les changements relatifs aux espaces dans les annotations et le diff - - Gitk - Gitk - Arguments: Arguments : @@ -9115,13 +9027,6 @@ Valider maintenant ? Show tags in Branches dialog Montrer les tags dans le dialogue des branches - - Repository Browser - Explorateur de dépôt - - - - GitCommand '%1' failed (exit code %2). @@ -19620,7 +19525,7 @@ p, li { white-space: pre-wrap; } - Git::Internal::CloneWizard + Git Clones a project from a git repository. Clone un projet à partir d'un dépôt git. @@ -19641,9 +19546,6 @@ p, li { white-space: pre-wrap; } Git Repository Clone Clone du dépôt git - - - Git::CloneWizardPage Location Emplacement @@ -21281,7 +21183,7 @@ S60 emulator run configuration default display name, %1 is base pro-File name - Git::Internal::StashDialog + Git Stashes Remises @@ -21302,10 +21204,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameDelete all... Tout supprimer... - - Delete... - Supprimer… - Show Afficher @@ -21319,10 +21217,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameRestore a git stash to new branch to be created Restaurer la branche... - - Refresh - Rafraîchir - <No repository> <Aucun dépôt> @@ -21367,10 +21261,6 @@ S60 emulator run configuration default display name, %1 is base pro-File name&Delete... &Supprimer... - - &Show - &Montrer - R&estore... R&estaurer... @@ -21380,10 +21270,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameRestore a git stash to new branch to be created Restaurer dans la &branche... - - Re&fresh - Ra&fraîchir - Delete Stashes Supprimer les remises @@ -21398,22 +21284,10 @@ You can choose between stashing the changes or discarding them. %1 ne peut pas être restauré depuis que le dépôt a été modifié. Vous pouvez choisir entre mettre les changements dans une remise ou de les abandonner. - - Stash - Remise - - - Discard - Abandonner - Restore Stash to Branch Restaurer la remise dans la branche - - Branch: - Branche : - Stash Restore Restauration de la remise @@ -24790,28 +24664,15 @@ avec un mot de passe, que vous pouvez renseigner ci-dessus. - Git::Internal::RemoteBranchModel + Git (no branch) (aucune banche) - - - GitClient - - Unable to determine the repository for %1. - Impossible de déterminer le dépôt de %1. - - - - Git::Internal::GitCommand Error: Git timed out after %1s. Erreur :Git est arrivé à échéance après %1s. - - - Git::Internal::GitEditor Blame %1 Blame %1 @@ -29891,7 +29752,7 @@ Details: %3 - Git::Internal::SettingsPageWidget + Git Set the environment variable HOME to '%1' (%2). @@ -35036,7 +34897,7 @@ Do you want to retry? - Git::Internal::BaseGitDiffArgumentsWidget + Git Use the patience algorithm for calculating the diff Utiliser l'algorithme patience pour calculer le diff @@ -35061,9 +34922,6 @@ Do you want to retry? Ignore Whitespace Ignorer les espaces - - - Git::Internal::GitShowArgumentsWidget Select the pretty printing format Sélectionner le format d'affichage @@ -35100,9 +34958,6 @@ Do you want to retry? raw brut - - - Git::Internal::GitBlameArgumentsWidget Do not show the date a change was made in the output Ne pas afficher à qu'elle date un changement a été fait sur la sortie @@ -35115,18 +34970,6 @@ Do you want to retry? Omit Date Omettre la date - - Ignore whitespace only changes. - Ignorer les changement relatifs aux espaces. - - - Ignore whitespace only changes - Ignorer les changement relatifs aux espaces - - - Ignore Whitespace - Ignorer les espaces - GLSLEditor::Internal::FunctionArgumentWidget @@ -37036,7 +36879,7 @@ if (a && - Git::Internal::BranchAddDialog + Git Dialog Boîte de dialogue @@ -37065,9 +36908,6 @@ if (a && Track local branch '%1' Pister la branche locale "%1" - - - Git::Internal::RemoteAdditionDialog Add Remote Ajouter distant @@ -37080,29 +36920,14 @@ if (a && URL: URL : - - - Git::Internal::RemoteDialog Remotes Distants - - Re&fresh - Ra&fraîchir - - - &Add... - &Ajouter... - F&etch Récupér&er - - &Remove - &Supprimer - Delete Remote Supprimer le distant @@ -38805,7 +38630,7 @@ These files are preserved. - Git::Internal::BranchModel + Git Local Branches Branches locales @@ -45297,7 +45122,7 @@ si un dépôt requiert une authentification SSH (voir la documentation sur SSH e - Git::Internal::CommitData + Git untracked non suivi @@ -45343,9 +45168,6 @@ si un dépôt requiert une authentification SSH (voir la documentation sur SSH e updated mis à jour - - - Git::Internal::GitLogArgumentsWidget Show Diff Montrer les différences @@ -49370,7 +49192,7 @@ Le pas à pas dans le module ou la définition de points d'arrêt par fichi - Gerrit::Internal::GerritDialog + Git Apply in: Appliquer dans : @@ -49416,10 +49238,6 @@ Le pas à pas dans le module ou la définition de points d'arrêt par fichi &Checkout... &Importer... - - &Show - &Afficher - Cherry &Pick Im&porter la sélection @@ -49440,17 +49258,6 @@ Le pas à pas dans le module ou la définition de points d'arrêt par fichi Apply... Appliquer... - - Checkout... - Importer... - - - Refresh - Rafraîchir - - - - Gerrit::Internal::GerritModel <html><head/><body><table><tr><td>Subject</td><td>%1</td></tr><tr><td>Number</td><td><a href="%11">%2</a></td></tr><tr><td>Owner</td><td>%3 <a href="mailto:%4">%4</a></td></tr><tr><td>Project</td><td>%5 (%6)</td></tr><tr><td>Status</td><td>%7, %8</td></tr><tr><td>Patch set</td><td>%9</td></tr>%10<tr><td>URL</td><td><a href="%11">%11</a></td></tr></table></body></html> <html><head/><body><table><tr><td>Sujet</td><td>%1</td></tr><tr><td>Numéro</td><td><a href="%11">%2</a></td></tr><tr><td>Propriétaire</td><td>%3 <a href="mailto:%4">%4</a></td></tr><tr><td>Projet</td><td>%5 (%6)</td></tr><tr><td>Statut</td><td>%7, %8</td></tr><tr><td>Ensemble de patchs</td><td>%9</td></tr>%10<tr><td>URL</td><td><a href="%11">%11</a></td></tr></table></body></html> @@ -49475,10 +49282,6 @@ Le pas à pas dans le module ou la définition de points d'arrêt par fichi Approvals Approbations - - Status - Statut - Parse error: '%1' -> %2 Erreur d'analyse : "%1" -> %2 @@ -49491,9 +49294,6 @@ Le pas à pas dans le module ou la définition de points d'arrêt par fichi Parse error in line '%1' Erreur d'analyse à la ligne "%1" - - - Gerrit::Internal::QueryContext Gerrit Gerrit @@ -49530,16 +49330,6 @@ Souhaitez-vous le terminer ? Keep Running Continuer l'exécution - - - Gerrit::Internal::GerritOptionsPage - - Gerrit - Gerrit - - - - Gerrit::Internal::GerritOptionsWidget HTTPS HTTPS @@ -49594,26 +49384,11 @@ asked to confirm the repository path. dans le cas où "canonicalWebUrl" n'est pas configuré dans le fichier "gerrit.config". - - - Gerrit::Internal::FetchContext Gerrit Fetch Traduire fetch ? Gerrit fetch - - %1 crashed. - %1 a crashé. - - - %1 returned %2. - %1 a retourné %2. - - - Error running %1: %2 - Erreur lors de l'exécution de %1 : %2 - Error writing to temporary file. Erreur lors de l'écriture dans le fichier temporaire. @@ -49626,9 +49401,6 @@ dans le fichier "gerrit.config". Cherry-picking %1... Sélectionner %1... - - - Gerrit::Internal::GerritPlugin Gerrit... Gerrit... @@ -49672,9 +49444,6 @@ were not verified among remotes in %3. Select different folder? Enter Local Repository for '%1' (%2) Entrer un dépôt local pour "%1" (%2) - - - Git::Internal::GitSubmitEditorWidget Detached HEAD HEAD détachée @@ -49707,21 +49476,6 @@ were not verified among remotes in %3. Select different folder? &Commit &Soumettre - - - Git::Internal::ResetDialog - - Sha1 - SHA1 - - - Subject - Sujet - - - Reset to: - Réinitaliser à : - Undo Changes to %1 Annuler les changements jusqu'à %1 @@ -51130,7 +50884,7 @@ Souhaitez-vous les importer maintenant ? - Git::Internal::BranchCheckoutDialog + Git Local Changes Found. Choose Action: Changements locaux trouvés. Choisissez une action : @@ -51143,10 +50897,6 @@ Souhaitez-vous les importer maintenant ? Discard Local Changes Annuler les changements locaux - - CheckBox - Case à cocher - Checkout branch "%1" Importer la branche "%1" @@ -51167,9 +50917,6 @@ Souhaitez-vous les importer maintenant ? Create Branch Stash for Current Branch Créer une branche remise pour la branche courante - - - Gerrit::Internal::GerritPushDialog Push to Gerrit Pousser sur Gerrit @@ -53674,7 +53421,7 @@ Les noms partiels peuvent êtres utilisé s'ils ne sont pas ambigües. - Git::Internal::GitDiffHandler + Git Working tree Arbre de travail @@ -53683,24 +53430,10 @@ Les noms partiels peuvent êtres utilisé s'ils ne sont pas ambigües.Index Index - - Waiting for data... - En attente de données... - - - - Git::Internal::LogChangeWidget Sha1 SHA1 - - Subject - Sujet - - - - Git::Internal::LogChangeDialog Reset to: Réinitaliser à : @@ -53725,13 +53458,6 @@ Les noms partiels peuvent êtres utilisé s'ils ne sont pas ambigües.Soft Soft - - - Git::Internal::MergeTool - - Error - Erreur - File input for the merge tool requires Git 1.7.8, or later. Le fichier d'entrée pour l'outil de fusion nécessite Git 1.7.8 ou supérieur. @@ -56882,7 +56608,7 @@ réinitialisation du moniteur - Git::Internal::GitDiffSwitcher + Git Switch to Text Diff Editor Basculer vers l'éditeur texte de différences diff --git a/share/qtcreator/translations/qtcreator_hr.ts b/share/qtcreator/translations/qtcreator_hr.ts index 0daf6ffa57c..9a53446af43 100644 --- a/share/qtcreator/translations/qtcreator_hr.ts +++ b/share/qtcreator/translations/qtcreator_hr.ts @@ -3830,7 +3830,7 @@ Ti se predznaci koriste kao dodatak trenutačnom direktoriju na Switch zaglavlju - Git::Internal::BranchAddDialog + Git Branch Name: Naziv grane: @@ -3859,9 +3859,6 @@ Ti se predznaci koriste kao dodatak trenutačnom direktoriju na Switch zaglavlju Track local branch '%1' Prati lokalnu granu '%1' - - - Git::Internal::BranchCheckoutDialog Local Changes Found. Choose Action: Nađene su lokalne promjene. Odaberi radnju: @@ -3874,10 +3871,6 @@ Ti se predznaci koriste kao dodatak trenutačnom direktoriju na Switch zaglavlju Discard Local Changes Zanemari lokalne promjene - - CheckBox - Potvrdni kvadratić - Checkout branch "%1" Odjavi granu "%1" @@ -3898,9 +3891,6 @@ Ti se predznaci koriste kao dodatak trenutačnom direktoriju na Switch zaglavlju Create Branch Stash for Current Branch Stvori skladište grane za trenutačnu granu - - - Git::Internal::ChangeSelectionDialog Select a Git Commit Odaberi Git obvezu @@ -3965,9 +3955,6 @@ Ti se predznaci koriste kao dodatak trenutačnom direktoriju na Switch zaglavlju Fetching commit data... Dohvaćanje podataka obveze … - - - Gerrit::Internal::AuthenticationDialog Authentication Autentifikacija @@ -3992,9 +3979,6 @@ Ti se predznaci koriste kao dodatak trenutačnom direktoriju na Switch zaglavlju Anonymous Anonimno - - - Gerrit::Internal::GerritDialog Gerrit Gerrit @@ -4019,14 +4003,6 @@ Ti se predznaci koriste kao dodatak trenutačnom direktoriju na Switch zaglavlju Details Detalji - - &Show - &Prikaži - - - Cherry &Pick - - C&heckout &Odjava @@ -4051,9 +4027,6 @@ Note: This can expose you to man-in-the-middle attack. Želiš li deaktivirati potvrdu SSL-a za ovaj poslužitelj? Napomena: To te može izložiti napadu čovjeka-u-sredini. - - - Gerrit::Internal::GerritPushDialog Push to Gerrit Gurni na Gerrit @@ -4161,9 +4134,6 @@ Deaktivirano – Promjena nije skica. ... Include older branches ... … Uključi starije grane … - - - Git::Internal::GitSubmitPanel General Information Opće informacije @@ -4204,9 +4174,6 @@ Deaktivirano – Promjena nije skica. Sign off Odjavi se - - - Git::Internal::RemoteAdditionDialog Add Remote Dodaj udaljeni @@ -4219,9 +4186,6 @@ Deaktivirano – Promjena nije skica. URL: URL: - - - Git::Internal::RemoteDialog Remotes Udaljeni @@ -4262,9 +4226,6 @@ Deaktivirano – Promjena nije skica. Would you like to delete the remote "%1"? Želiš li ukloniti udaljeni „%1”? - - - Git::Internal::SettingsPage Configuration Konfiguracija @@ -4333,9 +4294,6 @@ Deaktivirano – Promjena nije skica. Git Settings Git postavke - - - Git::Internal::StashDialog Stashes Skladišta @@ -4360,10 +4318,6 @@ Deaktivirano – Promjena nije skica. &Delete... &Ukloni … - - &Show - &Prikaži - R&estore... Vrati izvorno stanj&e … @@ -4373,10 +4327,6 @@ Deaktivirano – Promjena nije skica. Restore a git stash to new branch to be created Vrati izvorno stanje u &granu … - - Re&fresh - &Aktualiziraj - Delete Stashes Izbriši skladišta @@ -4403,10 +4353,6 @@ You can choose between stashing the changes or discarding them. %1 se ne može vratiti na izvorno stanje nakon promjene spremišta. Možeš birati između skladištenja promjena ili njihovih odbacivanja. - - Stash - Skladište - Discard Odbaci @@ -4415,10 +4361,6 @@ Možeš birati između skladištenja promjena ili njihovih odbacivanja.Restore Stash to Branch Vrati izvorno stanje skladišta u granu - - Branch: - Grana: - Stash Restore Vraćanje izvornog stanja skladišta @@ -24491,7 +24433,7 @@ Možda će ponovna gradnja projekta pomoći. - Git::Internal::BranchModel + Git Local Branches Lokalne grane @@ -24508,9 +24450,6 @@ Možda će ponovna gradnja projekta pomoći. Tags Oznake - - - Git::Internal::BranchView Include Old Entries Uključi stare unose @@ -24543,10 +24482,6 @@ Možda će ponovna gradnja projekta pomoći. Add Branch... Dodaj granu … - - &Add... - &Dodaj … - &Fetch D&ohvati @@ -24595,18 +24530,10 @@ Možda će ponovna gradnja projekta pomoći. &Rebase - - Cherry &Pick - Izabrano &biranje - &Track &Prati - - &Push - &Gurni - Would you like to delete the tag "%1"? Želiš li ukloniti oznaku"%1"? @@ -24639,9 +24566,6 @@ Možda će ponovna gradnja projekta pomoći. Hard reset branch "%1" to "%2"? Svakako resetiraj granu "%1" na "%2"? - - - Git::Internal::BranchViewFactory Git Branches Git grane @@ -24650,9 +24574,6 @@ Možda će ponovna gradnja projekta pomoći. Filter Filtar - - - Git::Internal::CommitData untracked nepraćeno @@ -24697,9 +24618,6 @@ Možda će ponovna gradnja projekta pomoći. by them od njih - - - Gerrit::Internal::GerritModel (Draft) (koncept) @@ -24756,9 +24674,6 @@ Možda će ponovna gradnja projekta pomoći. Parse error: "%1" Greška u obradi: "%1" - - - Gerrit::Internal::QueryContext Querying Gerrit Pretraživanje Gerrita @@ -24795,16 +24710,6 @@ Najvjerojatniji uzrok tome su problemi s SSH autentifikacijom. Keep Running Nastavi s pokretanjem - - - Gerrit::Internal::GerritOptionsPage - - Gerrit - Gerrit - - - - Gerrit::Internal::GerritOptionsWidget HTTPS HTTPS @@ -24813,10 +24718,6 @@ Najvjerojatniji uzrok tome su problemi s SSH autentifikacijom. &Host: &Glavno računalo: - - &User: - K&orisnik: - &ssh: &ssh: @@ -24839,28 +24740,10 @@ Najvjerojatniji uzrok tome su problemi s SSH autentifikacijom. "gerrit.config". - - - Gerrit::Internal::FetchContext Fetching from Gerrit Dohvaćanje od Gerrita - - %1 crashed. - %1 se urušio. - - - %1 returned %2. - %1 je vratio %2. - - - Error running %1: %2 - Greška u pokretanju %1: %2 - - - - Gerrit::Internal::GerritPlugin Gerrit... Gerrit … @@ -24903,9 +24786,6 @@ nisu provjereni između daljinskih u %3. Odabrati jednu drugu mapu?Enter Local Repository for "%1" (%2) Uđi u lokalno spremište za "%1" (%2) - - - Gerrit::Internal::GerritRemoteChooser Refresh Remote Servers Obnovi udaljene poslužitelje @@ -24914,9 +24794,6 @@ nisu provjereni između daljinskih u %3. Odabrati jednu drugu mapu?Fallback Rezerva - - - Git::Internal::GitClient and %n more Displayed after the untranslated message "Branches: branch1, branch2 'and %n more'" @@ -25048,10 +24925,6 @@ nisu provjereni između daljinskih u %3. Odabrati jednu drugu mapu?Invalid revision Neispravna revizija - - Detached HEAD - Odvojeni HEAD - Cannot describe revision "%1" in "%2": %3 Nije moguće opisati reviziju "%1" u "%2": %3 @@ -25135,10 +25008,6 @@ Commit now? Commit - - Continue Revert - - You need to commit changes to finish revert. Commit now? @@ -25291,10 +25160,6 @@ Commit now? Stash local changes and execute %1. - - Discard - Odbaci - Discard (reset) local changes and execute %1. @@ -25307,16 +25172,10 @@ Commit now? Cancel %1. - - - Git::Internal::GitDiffEditorController <None> <bez> - - - Git::Internal::BaseGitDiffArgumentsWidget Patience Patience @@ -25325,17 +25184,6 @@ Commit now? Use the patience algorithm for calculating the differences. Koristi patience algoritam za izračunavanje razlika. - - Ignore Whitespace - Zanemari bjeline - - - Ignore whitespace only changes. - Zanemari promjene samo u bjelinama. - - - - Git::Internal::GitBlameArgumentsWidget Omit Date Zanemari datum @@ -25372,9 +25220,6 @@ Commit now? Reload Učitaj ponovo - - - Git::Internal::GitLogArgumentsWidget Show Diff Prikaži razlike @@ -25399,13 +25244,6 @@ Commit now? Show textual graph log. Prikaži log-zapis tekstovnim dijagramom. - - Reload - Učitaj ponovo - - - - Git::Internal::GitEditorWidget &Blame %1 @@ -25414,10 +25252,6 @@ Commit now? Blame &Parent Revision %1 - - Chunk successfully staged - - Stage Chunk... @@ -25458,9 +25292,6 @@ Commit now? &Soft - - - GitGrep Tree (optional) @@ -25483,13 +25314,6 @@ Leave empty to search through the file system. Git Show %1:%2 - - - Git::Internal::GitPlugin - - <No repository> - <Nema spremišta> - Repository: %1 Spremište: %1 @@ -25662,10 +25486,6 @@ Leave empty to search through the file system. Clean... - - Status - Stanje - Commit... @@ -25718,10 +25538,6 @@ Leave empty to search through the file system. Abort Revert Prekini obnavljanje - - Continue Rebase - - Skip Rebase @@ -25762,10 +25578,6 @@ Leave empty to search through the file system. Stashes... - - Stash - - Saves the current state of your work and resets the repository. @@ -25850,10 +25662,6 @@ Leave empty to search through the file system. Git &Tools Git ala&ti - - Gitk - Gitk - Gitk Current File Gitk trenutačna datoteka @@ -25874,10 +25682,6 @@ Leave empty to search through the file system. Git Gui - - Repository Browser - Preglednik spremišta - Merge Tool Alat za sjedinjavanje @@ -25942,31 +25746,18 @@ Leave empty to search through the file system. Patch %1 successfully applied to %2 Zakrpa %1 uspješno primijenjena na %2 - - - Git::Internal::GitSettings The binary "%1" could not be located in the path "%2" - - - Git::Internal::GitSubmitEditor Refreshing Commit Data - - - Git::Internal::GitSubmitEditorWidget Provide a valid email to commit. - - Detached HEAD - Odvojeni HEAD - Select Change Odaberi promjenu @@ -26007,20 +25798,10 @@ Leave empty to search through the file system. &Commit - - - Git::Internal::LogChangeWidget Sha1 - - Subject - Predmet - - - - Git::Internal::LogChangeDialog Reset to: Resetiraj na: @@ -26045,9 +25826,6 @@ Leave empty to search through the file system. Soft Meko - - - Git::Internal::MergeTool Normal Normalna @@ -26128,10 +25906,6 @@ Udaljeni: %4 Continue merging other unresolved paths? - - Merge Tool - Alat za sjedinjavanje - Merge tool is not configured. Alat za sjedinjavanje nije konfiguriran. @@ -26148,20 +25922,6 @@ Udaljeni: %4 Merge tool process terminated with exit code %1 Proces alata za sjedinjavanje je prekinut s izlaznim kodom %1 - - - Git::Internal::RemoteModel - - Name - Naziv - - - URL - URL - - - - Git::Internal::SettingsPageWidget Set the environment variable HOME to "%1" (%2). diff --git a/share/qtcreator/translations/qtcreator_hu.ts b/share/qtcreator/translations/qtcreator_hu.ts index 191fbb524f5..9f2faeca741 100644 --- a/share/qtcreator/translations/qtcreator_hu.ts +++ b/share/qtcreator/translations/qtcreator_hu.ts @@ -7129,7 +7129,7 @@ on slow machines. In this case, the value should be increased. - Git::CloneWizardPage + Git Specify repository URL, checkout directory and path. Határozza meg a tároló URL-t, megnézési könyvtárat és útvonalat. @@ -7138,9 +7138,6 @@ on slow machines. In this case, the value should be increased. Clone URL: Klón URL: - - - Git::Internal::0 Checkout Megnézés @@ -7677,9 +7674,6 @@ on slow machines. In this case, the value should be increased. Timeout (seconds): Időtúllépés (másodpercek): - - - Git::Internal::BranchDialog Branches Elágazások @@ -7740,9 +7734,6 @@ on slow machines. In this case, the value should be increased. Failed to create a tracking branch Nem sikerült létrehozni egy követő elágazást - - - Git::Internal::ChangeSelectionDialog Select a Git commit Egy Git kommit kiválasztása @@ -7759,9 +7750,6 @@ on slow machines. In this case, the value should be increased. Selected directory is not a Git repository A kiválaszott könyvtár nem egy Git tároló - - - Git::Internal::CloneWizard Clones a project from a git repository. Egy projekt klónozása egy git tárolóból. @@ -7770,9 +7758,6 @@ on slow machines. In this case, the value should be increased. Git Repository Clone Git Tároló Klónozása - - - Git::Internal::GitClient Note that the git plugin for QtCreator is not able to interact with the server so far. Thus, manual ssh-identification etc. will not work. Ne felejtse el, hogy a git beépülő modul a QtCreatorban nem képes még együttmáködni a szerverel. Így, a manuális ssh azonosítás, stb. nem fog működni. @@ -7886,9 +7871,6 @@ on slow machines. In this case, the value should be increased. There are no modified files. Nincsenek módosítások. - - - Git::Internal::GitPlugin &Git &Git @@ -8065,10 +8047,6 @@ on slow machines. In this case, the value should be increased. &Redo &Helyrehozás - - Revert - Visszatérés - Would you like to revert all pending changes to the project? Vissza szeretné állítani minden függőben levő változtatását a projektre? @@ -8093,31 +8071,18 @@ on slow machines. In this case, the value should be increased. The commit message check failed. Do you want to commit the change? A kommit üzenet ellenőrzése nem sikerült. Kommitolni szeretné a változtatásokat? - - - Git::Internal::GitSettings The binary '%1' could not be located in the path '%2' A(z) '%1' binarás nincs telepítve a(z) '%2' útvonalon - - - Git::Internal::GitSubmitEditor Git Commit Git kommit - - - Git::Internal::GitSubmitPanel General Information Általános információ - - Repository: - Tároló: - repository tároló @@ -8142,9 +8107,6 @@ on slow machines. In this case, the value should be increased. Email: EMail: - - - Git::Internal::LocalBranchModel <New branch> <Új elágazás> @@ -8153,9 +8115,6 @@ on slow machines. In this case, the value should be increased. Type to create a new branch Gépelje be az új elágazás létrehozásához - - - Git::Internal::SettingsPage Environment variables Környezeti változók @@ -8204,9 +8163,6 @@ on slow machines. In this case, the value should be increased. Git Settings Git beállítások - - - GitCommand '%1' failed (exit code %2). diff --git a/share/qtcreator/translations/qtcreator_it.ts b/share/qtcreator/translations/qtcreator_it.ts index 98c5e2e5c14..b475a4a7235 100644 --- a/share/qtcreator/translations/qtcreator_it.ts +++ b/share/qtcreator/translations/qtcreator_it.ts @@ -5152,7 +5152,7 @@ Causa: %3 - Git::Internal::BranchDialog + Git Branches Rami @@ -5216,9 +5216,6 @@ Causa: %3 Failed to create a tracking branch Creazione del ramo con traccia non riuscita - - - Git::Internal::ChangeSelectionDialog Select a Git commit Selezionare un commit Git @@ -5235,9 +5232,6 @@ Causa: %3 Selected directory is not a Git repository La cartella selezionata non è un deposito Git - - - Git::Internal::GitClient Note that the git plugin for QtCreator is not able to interact with the server so far. Thus, manual ssh-identification etc. will not work. Il plugin git di Qt Creator non è ancora in grado di interagire con il server. Perciò l'identificazione ssh manuale e cose simili non funzioneranno. @@ -5368,9 +5362,6 @@ Causa: %3 There are no modified files. Non ci sono file modificati. - - - Git::Internal::GitOutputWindow Git Output Output di Git @@ -5379,9 +5370,6 @@ Causa: %3 Git Git - - - Git::Internal::GitPlugin &Git &Git @@ -5602,32 +5590,18 @@ Causa: %3 The commit message check failed. Do you want to commit the change? Il controllo sul messaggio della nuova revisione è fallito. Vuoi creare la revisione? - - - Git::Internal::GitSettings The binary '%1' could not be located in the path '%2' Impossibile trovare il binario '%1' nel percorso '%2' - - - Git::Internal::GitSubmitEditor Git Commit Nuova revisione git - - - Git::Internal::GitSubmitPanel General Information Informazioni Generali - - - Repository: - Deposito: - repository @@ -5658,9 +5632,6 @@ Causa: %3 Email: Email: - - - Git::Internal::LocalBranchModel <New branch> <nuovo branch> @@ -5669,9 +5640,6 @@ Causa: %3 Type to create a new branch Scrivi il nome del nuovo ramo - - - Git::Internal::SettingsPage Environment variables Variabili d'ambiente @@ -5728,9 +5696,6 @@ Causa: %3 Omit date from annotation output - - - GitCommand '%1' failed (exit code %2). @@ -12438,7 +12403,7 @@ p, li { white-space: pre-wrap; } - Git::Internal::CloneWizard + Git Clones a project from a git repository. @@ -12447,9 +12412,6 @@ p, li { white-space: pre-wrap; } Git Repository Clone - - - Git::CloneWizardPage Specify repository URL, checkout directory and path. diff --git a/share/qtcreator/translations/qtcreator_ja.ts b/share/qtcreator/translations/qtcreator_ja.ts index 25c5cd6a553..cb9da2d5444 100644 --- a/share/qtcreator/translations/qtcreator_ja.ts +++ b/share/qtcreator/translations/qtcreator_ja.ts @@ -2842,7 +2842,7 @@ These prefixes are used in addition to current file name on Switch Header/Source - Git::Internal::BranchAddDialog + Git Branch Name: ブランチ名: @@ -2887,9 +2887,6 @@ These prefixes are used in addition to current file name on Switch Header/Source Checkout new branch 新しいブランチをチェックアウト - - - Git::Internal::BranchCheckoutDialog Local Changes Found. Choose Action: ローカルの変更が見つかりました。以下のアクションから選択してください: @@ -2902,10 +2899,6 @@ These prefixes are used in addition to current file name on Switch Header/Source Discard Local Changes ローカルの変更を破棄する - - CheckBox - チェックボックス - Checkout branch "%1" "%1" ブランチをチェックアウト @@ -2926,9 +2919,6 @@ These prefixes are used in addition to current file name on Switch Header/Source Create Branch Stash for Current Branch 現在のブランチをスタッシュする - - - Git::Internal::BranchDialog Branches ブランチ @@ -3011,14 +3001,6 @@ These prefixes are used in addition to current file name on Switch Header/Source Delete Tag タグを削除 - - Delete Branch - ブランチの削除 - - - Rename Tag - タグ名の変更 - Git Reset Git リセット @@ -3047,9 +3029,6 @@ These prefixes are used in addition to current file name on Switch Header/Source &Include old entries 古いエントリを含む(&I) - - - Git::Internal::ChangeSelectionDialog Working directory: 作業ディレクトリ: @@ -3118,9 +3097,6 @@ These prefixes are used in addition to current file name on Switch Header/Source &Archive... アーカイブする(&A)... - - - Gerrit::Internal::GerritPushDialog Push to Gerrit Gerrit へプッシュ @@ -3231,9 +3207,6 @@ Partially checked - Do not change current state. &Work-in-progress 作業中(&WIP) - - - Git::Internal::GitSubmitPanel General Information 概要 @@ -3279,9 +3252,6 @@ Partially checked - Do not change current state. Sign off サインオフ - - - Git::Internal::RemoteAdditionDialog Add Remote リモートを追加 @@ -3294,21 +3264,10 @@ Partially checked - Do not change current state. URL: URL: - - - Git::Internal::RemoteDialog Remotes リモート - - Re&fresh - 更新(&F) - - - &Add... - 追加(&A)... - F&etch フェッチ(&E) @@ -3317,10 +3276,6 @@ Partially checked - Do not change current state. &Push プッシュ(&P) - - &Remove - 削除(&R) - A remote with the name "%1" already exists. "%1" という名前のリモートは既に存在します。 @@ -3337,9 +3292,6 @@ Partially checked - Do not change current state. Would you like to delete the remote "%1"? リモート "%1" を削除しますか? - - - Git::Internal::SettingsPage Configuration 設定 @@ -3388,10 +3340,6 @@ Partially checked - Do not change current state. Show tags in Branches dialog ブランチダイアログにタグを表示する - - Gitk - Gitk - Arguments: 引数: @@ -3412,9 +3360,6 @@ Partially checked - Do not change current state. Git Settings Git の設定 - - - Git::Internal::StashDialog Stashes スタッシュ @@ -3439,10 +3384,6 @@ Partially checked - Do not change current state. &Delete... 削除(&D)... - - &Show - 表示(&S) - R&estore... 復元(&E)... @@ -3452,10 +3393,6 @@ Partially checked - Do not change current state. Restore a git stash to new branch to be created ブランチに復元(&B)... - - Re&fresh - 更新(&F) - <No repository> <リポジトリなし> @@ -3488,10 +3425,6 @@ You can choose between stashing the changes or discarding them. リポジトリが変更されている為、%1 を復元できません。 変更内容をスタッシュするか破棄するかを選択してください。 - - Stash - スタッシュ - Discard 破棄 @@ -3500,10 +3433,6 @@ You can choose between stashing the changes or discarding them. Restore Stash to Branch スタッシュをブランチに復元 - - Branch: - ブランチ: - Stash Restore スタッシュの復元 @@ -20246,7 +20175,7 @@ Rebuilding the project might help. - Git::Internal::BranchModel + Git Local Branches ローカルブランチ @@ -20263,9 +20192,6 @@ Rebuilding the project might help. Tags タグ - - - Git::Internal::CommitData untracked 未トラック @@ -20310,9 +20236,6 @@ Rebuilding the project might help. by them リモート側 - - - Gerrit::Internal::GerritDialog Apply in: 適用先: @@ -20345,14 +20268,6 @@ Rebuilding the project might help. &Refresh 更新(&R) - - &Show - 表示(&S) - - - Cherry &Pick - チェリーピック(&P) - Fetching "%1"... "%1 を取得中... @@ -20377,9 +20292,6 @@ Note: This can expose you to man-in-the-middle attack. このサーバーの SSL 認証を無効にしますか? 注意:これにより、中間者攻撃(man-in-the-middle attack)を受ける可能性があります。 - - - Gerrit::Internal::GerritModel (Draft) (下書き) @@ -20404,10 +20316,6 @@ Note: This can expose you to man-in-the-middle attack. Approvals 承認者 - - Status - ステータス - Number 番号 @@ -20436,9 +20344,6 @@ Note: This can expose you to man-in-the-middle attack. Parse error: "%1" 解析エラー: "%1" - - - Gerrit::Internal::QueryContext Querying Gerrit Gerrit へ問い合わせ中 @@ -20475,16 +20380,6 @@ Would you like to terminate it? Keep Running そのままにする - - - Gerrit::Internal::GerritOptionsPage - - Gerrit - Gerrit - - - - Gerrit::Internal::GerritOptionsWidget HTTPS HTTPS @@ -20523,28 +20418,10 @@ Would you like to terminate it? "gerrit.config". "gerrit.config" ファイルに "canonicalWebUrl" が設定されていない場合に、URL に使用されるプロトコルを指定します。 - - - Gerrit::Internal::FetchContext Fetching from Gerrit Gerrit から取得中 - - %1 crashed. - %1 がクラッシュしました。 - - - %1 returned %2. - %1 は %2 で終了しました。 - - - Error running %1: %2 - %1 実行中のエラー: %2 - - - - Gerrit::Internal::GerritPlugin Gerrit... Gerrit... @@ -20591,9 +20468,6 @@ were not verified among remotes in %3. Select different folder? Enter Local Repository for "%1" (%2) "%1" (%2) のローカルリポジトリを入力 - - - Git::Internal::BaseGitDiffArgumentsWidget Patience Patience @@ -20610,9 +20484,6 @@ were not verified among remotes in %3. Select different folder? Ignore whitespace only changes. 空白だけの変更を無視します。 - - - Git::Internal::GitBlameArgumentsWidget Omit Date 日付を省略 @@ -20621,14 +20492,6 @@ were not verified among remotes in %3. Select different folder? Hide the date of a change from the output. 変更点を出力する際に日付を表示しません。 - - Ignore Whitespace - 空白を無視 - - - Ignore whitespace only changes. - 空白だけの変更を無視します。 - No Move Detection 移動検出なし @@ -20649,9 +20512,6 @@ were not verified among remotes in %3. Select different folder? Move detection 移動検出 - - - Git::Internal::GitLogArgumentsWidget Show Diff 差分表示 @@ -20692,9 +20552,6 @@ were not verified among remotes in %3. Select different folder? Show log also for previous names of the file. 以前のファイル名についてもログを表示する。 - - - Git::Internal::GitClient Cannot determine the repository for "%1". "%1" のリポジトリを特定できません。 @@ -20821,10 +20678,6 @@ were not verified among remotes in %3. Select different folder? Invalid revision 不正なリビジョン - - Detached HEAD - デタッチされた HEAD - Cannot describe revision "%1" in "%2": %3 "%2" (リビジョン: "%1") を表示できません: %3 @@ -20906,10 +20759,6 @@ Commit now? マージを完了させるには変更のコミットが必要です。 コミットしますか? - - Commit - コミット - Continue Revert コミットの打ち消しの続行 @@ -20970,10 +20819,6 @@ Commit now? Cherr&y-Pick Change %1 コミット %1 をチェリーピック(&Y) - - Re&vert Change %1 - コミット %1 をリバート(&V) - C&heckout Change %1 コミット %1 をチェックアウト(&H) @@ -21191,18 +21036,10 @@ Would you like to create the branch "%1" on the remote and set it as u Stash local changes and pop when %1 finishes. ローカルの変更をスタッシュして %1 の完了後に復元します。 - - Stash - スタッシュ - Stash local changes and execute %1. ローカルの変更をスタッシュして %1 を実行します。 - - Discard - 破棄 - Discard (reset) local changes and execute %1. ローカルの変更を破棄(リセット)して %1 を実行します。 @@ -21215,13 +21052,6 @@ Would you like to create the branch "%1" on the remote and set it as u Cancel %1. %1 をキャンセルします。 - - Reset - リセット - - - - Git::Internal::GitPlugin &Git &Git @@ -21442,18 +21272,10 @@ Would you like to create the branch "%1" on the remote and set it as u Abort Revert コミット打ち消しの中止 - - Continue Rebase - リベースの続行 - Continue Cherry Pick チェリーピックの続行 - - Continue Revert - コミットの打ち消しの続行 - Branches... ブランチ (Branch)... @@ -21474,10 +21296,6 @@ Would you like to create the branch "%1" on the remote and set it as u Apply from File... ファイルから適用... - - &Stash - スタッシュ (&Stash) - Stashes... スタッシュ (Stash)... @@ -21590,10 +21408,6 @@ Would you like to create the branch "%1" on the remote and set it as u Git Gui Git GUI - - Repository Browser - リポジトリブラウザ - Merge Tool マージツール @@ -21686,32 +21500,14 @@ Would you like to create the branch "%1" on the remote and set it as u Patch %1 successfully applied to %2 パッチ %1 を %2 に適用しました - - <No repository> - <リポジトリなし> - - - Repository: %1 - リポジトリ: %1 - - - - Git::Internal::GitSettings The binary "%1" could not be located in the path "%2" パス "%2" から実行ファイル "%1" が見つかりませんでした - - - Git::Internal::GitSubmitEditorWidget Provide a valid email to commit. コミットするには有効なメールアドレスが必要です。 - - Detached HEAD - デタッチされた HEAD - Select Change 変更の選択 @@ -21752,20 +21548,10 @@ Would you like to create the branch "%1" on the remote and set it as u &Commit コミット(&C) - - - Git::Internal::LogChangeWidget Sha1 SHA1 - - Subject - 件名 - - - - Git::Internal::LogChangeDialog Reset to: リセット: @@ -21790,9 +21576,6 @@ Would you like to create the branch "%1" on the remote and set it as u Soft ソフト - - - Git::Internal::MergeTool Normal ノーマル @@ -21873,10 +21656,6 @@ Remote: %4 Continue merging other unresolved paths? 他の未解決なパスのマージを継続しますか? - - Merge Tool - マージツール - Merge tool is not configured. マージツールが設定されていません。 @@ -21893,9 +21672,6 @@ Remote: %4 Merge tool process terminated with exit code %1 マージツールプロセスは終了コード %1 で終了しました - - - Git::Internal::SettingsPageWidget Set the environment variable HOME to "%1" (%2). @@ -21928,10 +21704,6 @@ instead of its installation directory when run outside git bash. Git Repository Browser Command Git リポジトリブラウザコマンド - - Git - Git - GLSLEditor @@ -35551,23 +35323,12 @@ API バージョンが %1 以上の SDK をインストールしてください - Git::Internal::GitSubmitEditor + Git Refreshing Commit Data コミットデータのリフレッシュ中 - - Git::Internal::RemoteModel - - Name - 名前 - - - URL - URL - - Help @@ -42178,7 +41939,7 @@ Preselects a desktop Qt for building the application if available. - Git::Internal::GitEditorWidget + Git &Blame %1 "%1" の編集者を表示(&B) @@ -42187,10 +41948,6 @@ Preselects a desktop Qt for building the application if available. Blame &Parent Revision %1 親リビジョン %1 の編集者を表示(&P) - - Chunk successfully staged - チャンクをステージに追加しました - Stage Chunk... チャンクをステージに追加... @@ -42199,41 +41956,10 @@ Preselects a desktop Qt for building the application if available. Unstage Chunk... チャンクをステージから削除... - - Cherr&y-Pick Change %1 - コミット %1 をチェリーピック(&Y) - Re&vert Change %1 コミット %1 を打ち消す(&V) - - C&heckout Change %1 - コミット %1 をチェックアウト(&H) - - - &Log for Change %1 - コミット %1 のログ(&L) - - - &Reset to Change %1 - コミット %1 へリセット(&R) - - - &Hard - ハード(&H) - - - &Mixed - 混在(&M) - - - &Soft - ソフト(&S) - - - - GitGrep &Use Git Grep Git Grep を使用する(&U) @@ -42262,10 +41988,6 @@ Leave empty to search through the file system. リファレンス: %1 %2 - - Git Show %1:%2 - Git Show %1:%2 - GlslEditor::Internal::GlslEditorPlugin @@ -46332,15 +46054,11 @@ Output: - Gerrit::Internal::AuthenticationDialog + Git Authentication 認証情報 - - &User: - ユーザー(&U): - &Password: パスワード(&P): @@ -50078,162 +49796,41 @@ Stepping into the module or setting breakpoints by file and line is expected to - Git::Internal::BranchView + Git Refresh 更新 - - Include branches and tags that have not been active for %n days. - - 直近の %n 日にアクティブではないブランチやタグを含みます。 - - - - <No repository> - <リポジトリなし> - - - &Add... - 追加(&A)... - - - &Checkout - チェックアウト(&C) - - - &Diff - 差分表示(&D) - - - &Log - ログ表示(&L) - - - &Hard - ハード(&H) - - - &Mixed - 混在(&M) - - - &Soft - ソフト(&S) - - - Cherry &Pick - チェリーピック(&P) - - - &Track - トラック(&T) - - - &Push - プッシュ(&P) - - - Would you like to delete the tag "%1"? - タグ "%1" を削除しますか? - - - Would you like to delete the branch "%1"? - ブランチ "%1" を削除しますか? - - - Would you like to delete the <b>unmerged</b> branch "%1"? - <b>マージされていない</b>ブランチ ”%1" を削除しますか? - - - Delete Tag - タグを削除 - Delete Branch ブランチを削除する - - Git Reset - Git リセット - - - - Git::Internal::BranchViewFactory Filter フィルタ - - - Git::Internal::GitBaseDiffEditorController <None> <なし> - - - Git::Internal::BaseGitLogArgumentsWidget - - Show difference. - 差分を表示します。 - - - Filter - フィルタ - - - - Git::Internal::GitLogFilterWidget Filter: フィルタ: - - - Git::Internal::GitPluginPrivate &Describe Change %1 変更 %1 の説明(&D) - - Git Settings - Git の設定 - - - &Git - &Git - - - Current &File - 現在のファイル(&F) - Diff of "%1" Avoid translating "Diff" "%1" の差分表示 (Diff) - - Meta+G,Meta+D - Meta+G,Meta+D - - - Alt+G,Alt+D - Alt+G,Alt+D - Log of "%1" Avoid translating "Log" "%1" のログ (Log) - - Meta+G,Meta+L - Meta+G,Meta+L - - - Alt+G,Alt+L - Alt+G,Alt+L - Blame Current File Avoid translating "Blame" @@ -50244,87 +49841,11 @@ Stepping into the module or setting breakpoints by file and line is expected to Avoid translating "Blame" "%1" の編集者を表示 (Blame) - - Meta+G,Meta+B - Meta+G,Meta+B - - - Alt+G,Alt+B - Alt+G,Alt+B - - - Stage File for Commit - ファイルをステージ(コミット予定)に追加 (Add) - - - Stage "%1" for Commit - "%1" をステージ(コミット予定)に追加 (Add) - - - Meta+G,Meta+A - Meta+G,Meta+A - - - Alt+G,Alt+A - Alt+G,Alt+A - - - Unstage File from Commit - ファイルをステージ(コミット予定)から削除 (Reset) - - - Unstage "%1" from Commit - "%1" をステージ(コミット予定)から削除 (Reset) - - - Undo Unstaged Changes - ステージに無い変更を元に戻す - - - Undo Unstaged Changes for "%1" - "%1" のステージに無い変更を元に戻す - - - Undo Uncommitted Changes - コミットされていない変更を元に戻す - - - Undo Uncommitted Changes for "%1" - "%1" のコミットされていない変更を元に戻す - - - Meta+G,Meta+U - Meta+G,Meta+U - - - Alt+G,Alt+U - Alt+G,Alt+U - - - Current &Project - 現在のプロジェクト(&P) - Diff Current Project Avoid translating "Diff" 現在のプロジェクトの差分表示 (Diff) - - Meta+G,Meta+Shift+D - Meta+G,Meta+Shift+D - - - Alt+G,Alt+Shift+D - Alt+G,Alt+Shift+D - - - Meta+G,Meta+K - Meta+G,Meta+K - - - Alt+G,Alt+K - Alt+G,Alt+K - Clean Project... Avoid translating "Clean" @@ -50335,18 +49856,6 @@ Stepping into the module or setting breakpoints by file and line is expected to Avoid translating "Clean" プロジェクト "%1" をクリーン (Clean)... - - &Local Repository - ローカルリポジトリ(&L) - - - Meta+G,Meta+C - Meta+G,Meta+C - - - Alt+G,Alt+C - Alt+G,Alt+C - Amend Last Commit... Avoid translating "Commit" @@ -50362,10 +49871,6 @@ Stepping into the module or setting breakpoints by file and line is expected to Avoid translating "Rebase" 対話的なリベース (Rebase)... - - Update Submodules - サブモジュールを更新 - Abort Merge Avoid translating "Merge" @@ -50386,172 +49891,20 @@ Stepping into the module or setting breakpoints by file and line is expected to Avoid translating "Revert" コミット打ち消しの中止 - - Continue Rebase - リベースの続行 - - - Continue Cherry Pick - チェリーピックの続行 - - - Continue Revert - コミットの打ち消しの続行 - - - Branches... - ブランチ (Branch)... - - - &Patch - パッチ(&P) - - - Apply from Editor - エディタから適用 - - - Apply "%1" - "%1" の適用 - - - Apply from File... - ファイルから適用... - &Stash スタッシュ (&Stash) - - Saves the current state of your work and resets the repository. - 現在の状態を保持し、リポジトリを元の状態に戻します。 - Stash Unstaged Files Avoid translating "Stash" ステージにないファイルをスタッシュ (Stash) - - Saves the current state of your unstaged files and resets the repository to its staged state. - ステージにないファイルの現在の状態を保存してリポジトリをステージ状態にリセットします。 - - - Take Snapshot... - スナップショットを取る... - - - Saves the current state of your work. - 現在の作業状況を保存します。 - Stash Pop Avoid translating "Stash" スタッシュのポップ (Stash Pop) - - Restores changes saved to the stash list using "Stash". - "スタッシュ (Stash)"で保存させた作業状況を復元します。 - - - &Remote Repository - リモートリポジトリ(&R) - - - &Subversion - &Subversion - - - Manage Remotes... - リモートの管理... - - - Git &Tools - Git ツール(&T) - - - Gitk Current File - 現在のファイルを Gitk で表示する - - - Gitk of "%1" - "%1" を Gitk で表示する - - - Gitk for folder of Current File - 現在のファイルのフォルダーを Gitk で表示する - - - Gitk for folder of "%1" - "%1" のフォルダーを Gitk で表示する - - - Git Gui - Git GUI - - - Repository Browser - リポジトリブラウザ - - - Merge Tool - マージツール - - - Actions on Commits... - コミット時のアクション... - - - Create Repository... - リポジトリの作成... - - - Undo Changes to %1 - コミット %1 まで元に戻す - - - Interactive Rebase - 対話的なリベース - - - Another submit is currently being executed. - 別のサブミットが実行中です。 - - - Unsupported version of Git found. Git %1 or later required. - サポート対象外のバージョンの Git が見つかりました。Git %1 以降が必要です。 - - - Amend %1 - %1 のログを修正する - - - Git Fixup Commit - Git コミットの Fixup - - - Git Commit - Git コミット - - - Repository Clean - リポジトリをクリーン - - - The repository is clean. - リポジトリは変更されていません。 - - - Patches (*.patch *.diff) - パッチ (*.patch *.diff) - - - Choose Patch - パッチの選択 - - - Patch %1 successfully applied to %2 - パッチ %1 を %2 に適用しました - Help diff --git a/share/qtcreator/translations/qtcreator_pl.ts b/share/qtcreator/translations/qtcreator_pl.ts index 7e3fa2d64c4..44c66c74a04 100644 --- a/share/qtcreator/translations/qtcreator_pl.ts +++ b/share/qtcreator/translations/qtcreator_pl.ts @@ -402,7 +402,7 @@ - Git::Internal::BranchDialog + Git Branches Gałęzie @@ -527,9 +527,6 @@ Cherry &Pick - - - Git::Internal::GitSubmitPanel General Information Ogólne informacje @@ -570,9 +567,6 @@ Sign off - - - Git::Internal::SettingsPage <b>Note:</b> <b>Uwaga:</b> @@ -5541,7 +5535,7 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. - Git::Internal::ChangeSelectionDialog + Git Browse &History... Przeglądaj &historię... @@ -5550,10 +5544,6 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. &Show &Pokaż - - Cherry &Pick - - &Revert Odw&róć @@ -5606,9 +5596,6 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. HEAD HEAD - - - Git::Internal::GitClient Would you like to create a local branch? Czy utworzyć lokalną gałąź? @@ -5695,10 +5682,6 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. MERGING SCALANIE - - Detached HEAD - Odłączony HEAD - Reset @@ -5809,14 +5792,6 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Stash local changes and pop when %1 finishes. - - Stash - Odłóż zmiany - - - Discard - Porzuć - There were warnings while applying "%1" to "%2": %3 @@ -5996,9 +5971,6 @@ Commit now? Cancel %1. Anuluj %1. - - - Git::Internal::GitPlugin &Git &Git @@ -6251,10 +6223,6 @@ Commit now? Abort Revert Przerwij odwracanie - - Continue Rebase - - Skip Rebase @@ -6263,10 +6231,6 @@ Commit now? Continue Cherry Pick - - Continue Revert - Kontynuuj odwracanie - &Patch Ła&ty @@ -6323,10 +6287,6 @@ Commit now? Git &Tools Narzędzia Gi&ta - - Gitk - Gitk - Gitk Current File Gitk dla bieżącego pliku @@ -6347,10 +6307,6 @@ Commit now? Git Gui Git Gui - - Repository Browser - Przeglądarka repozytorium - Merge Tool Narzędzie scalania @@ -6455,10 +6411,6 @@ Commit now? Meta+G,Meta+C Meta+G,Meta+C - - Commit - Utwórz poprawkę - &Undo &Cofnij @@ -6475,9 +6427,6 @@ Commit now? Do you want to commit the change? Czy utworzyć poprawkę? - - - Git::Internal::GitSettings The binary "%1" could not be located in the path "%2" Nie można odnaleźć pliku binarnego "%1" w ścieżce "%2" @@ -10095,7 +10044,7 @@ Nie zostanie zastosowane do białych znaków w komentarzach i ciągach znakowych - Git::Internal::StashDialog + Git Stashes Odłożone zmiany @@ -10132,10 +10081,6 @@ Nie zostanie zastosowane do białych znaków w komentarzach i ciągach znakowych &Delete... &Usuń... - - &Show - &Pokaż - R&estore... P&rzywróć... @@ -10145,10 +10090,6 @@ Nie zostanie zastosowane do białych znaków w komentarzach i ciągach znakowych Restore a git stash to new branch to be created Przywróć do &gałęzi... - - Re&fresh - &Odśwież - Delete Stashes Usuń odłożone zmiany @@ -10163,10 +10104,6 @@ You can choose between stashing the changes or discarding them. Nie można przywrócić %1, ponieważ repozytorium zostało zmodyfikowane. Możesz odłożyć zmiany lub je porzucić. - - Stash - Odłóż zmiany - Discard Odrzuć @@ -10175,10 +10112,6 @@ Możesz odłożyć zmiany lub je porzucić. Restore Stash to Branch Przywróć odłożone zmiany w gałęzi - - Branch: - Gałąź: - Stash Restore Przywróć odłożone zmiany @@ -13406,7 +13339,7 @@ Możesz zostać poproszony o podzielenie się zawartością tego loga podczas tw - Git::Internal::SettingsPageWidget + Git Set the environment variable HOME to "%1" (%2). @@ -15713,7 +15646,7 @@ Ponowić próbę? - Git::Internal::BaseGitDiffArgumentsWidget + Git Use the patience algorithm for calculating the differences. Użyj algorytmu "patience" przy pokazywaniu różnic. @@ -15730,9 +15663,6 @@ Ponowić próbę? Ignore Whitespace Ignoruj białe znaki - - - Git::Internal::GitBlameArgumentsWidget Hide the date of a change from the output. Ukrywa datę zmiany na wyjściu. @@ -15741,14 +15671,6 @@ Ponowić próbę? Omit Date Pomiń datę - - Ignore whitespace only changes. - Ignoruj zmiany w białych znakach. - - - Ignore Whitespace - Ignoruj białe znaki - GLSLEditor @@ -16382,7 +16304,7 @@ if (a && - Git::Internal::RemoteAdditionDialog + Git Add Remote Dodaj zdalne repozytorium @@ -16403,29 +16325,14 @@ if (a && The URL may not be valid. Podany URL może nie być poprawny. - - - Git::Internal::RemoteDialog Remotes Zdalne repozytoria - - Re&fresh - &Odśwież - - - &Add... - &Dodaj... - F&etch Po&bierz - - &Remove - &Usuń - Delete Remote Usuń zdalne repozytorium @@ -17982,7 +17889,7 @@ Kiedy zostaje wykryty problem, aplikacja jest zatrzymywana i może zostać zdebu - Git::Internal::BranchAddDialog + Git Branch Name: Nazwa gałęzi: @@ -18067,7 +17974,7 @@ Kiedy zostaje wykryty problem, aplikacja jest zatrzymywana i może zostać zdebu - Git::Internal::BranchModel + Git Local Branches Lokalne gałęzie @@ -21691,7 +21598,7 @@ Wersje Qt można dodać w: Opcje > Budowanie i uruchamianie > Wersje Qt. - Git::Internal::CommitData + Git untracked nieśledzony @@ -21736,9 +21643,6 @@ Wersje Qt można dodać w: Opcje > Budowanie i uruchamianie > Wersje Qt. by them przez nich - - - Gerrit::Internal::GerritDialog Changes Zmiany @@ -21755,22 +21659,10 @@ Wersje Qt można dodać w: Opcje > Budowanie i uruchamianie > Wersje Qt.Details Szczegóły - - C&heckout - - &Refresh &Odśwież - - &Show - &Pokaż - - - Cherry &Pick - - Fetching "%1"... Pobieranie "%1"... @@ -21793,9 +21685,6 @@ Do you want to disable SSL verification for this server? Note: This can expose you to man-in-the-middle attack. - - - Gerrit::Internal::GerritModel (Draft) (wersja robocza) @@ -21820,10 +21709,6 @@ Note: This can expose you to man-in-the-middle attack. Approvals Zatwierdzenia - - Status - Stan - Number Numer @@ -21852,9 +21737,6 @@ Note: This can expose you to man-in-the-middle attack. Parse error: "%1" Błąd parsowania: "%1" - - - Gerrit::Internal::QueryContext Querying Gerrit Komunikacja z Gerritem @@ -21891,16 +21773,6 @@ Czy zakończyć proces? Keep Running Pozostaw uruchomionym - - - Gerrit::Internal::GerritOptionsPage - - Gerrit - Gerrit - - - - Gerrit::Internal::GerritOptionsWidget HTTPS HTTPS @@ -21935,28 +21807,10 @@ Czy zakończyć proces? "gerrit.config". Określa protokół użyty do formowania URL w przypadku braku konfiguracji "canonicalWebUrl" w pliku "gerrit.config". - - - Gerrit::Internal::FetchContext Fetching from Gerrit Pobieranie danych z Gerrita - - %1 crashed. - %1 przerwał pracę. - - - %1 returned %2. - %1 zwrócił %2. - - - Error running %1: %2 - Błąd podczas uruchamiania %1: %2 - - - - Gerrit::Internal::GerritPlugin Gerrit... Gerrit... @@ -22000,9 +21854,6 @@ were not verified among remotes in %3. Select different folder? Enter Local Repository for "%1" (%2) Podaj lokalne repozytorium dla "%1" (%2) - - - Git::Internal::GitLogArgumentsWidget Show Diff Pokaż różnice @@ -22027,9 +21878,6 @@ were not verified among remotes in %3. Select different folder? Show textual graph log. Pokazuj log grafu tekstowego. - - - Git::Internal::GitSubmitEditorWidget Provide a valid email to commit. Podaj poprawny e-mail używany przy tworzeniu poprawek. @@ -23874,7 +23722,7 @@ You can choose another communication channel here, such as a serial line or cust - Git::Internal::BranchCheckoutDialog + Git Local Changes Found. Choose Action: Wykryto lokalne zmiany. Wybierz akcję: @@ -23887,10 +23735,6 @@ You can choose another communication channel here, such as a serial line or cust Discard Local Changes Porzuć lokalne zmiany - - CheckBox - Przycisk wyboru - Checkout branch "%1" Kopia robocza gałęzi "%1" @@ -23911,9 +23755,6 @@ You can choose another communication channel here, such as a serial line or cust Create Branch Stash for Current Branch Utwórz gałąź z odłożoną zmianą dla bieżącej gałęzi - - - Gerrit::Internal::GerritPushDialog Push to Gerrit Wyślij do Gerrita @@ -25440,18 +25281,11 @@ Więcej informacji w dokumentacji "Checking Code Syntax". - Git::Internal::LogChangeWidget + Git Sha1 Sha1 - - Subject - Temat - - - - Git::Internal::LogChangeDialog Reset to: Zresetuj do: @@ -25476,9 +25310,6 @@ Więcej informacji w dokumentacji "Checking Code Syntax".Soft Soft - - - Git::Internal::MergeTool Normal Normalny @@ -32446,7 +32277,7 @@ Use this only if you are prototyping. You cannot create a full application with - Git::Internal::GitEditorWidget + Git &Blame %1 @@ -32455,10 +32286,6 @@ Use this only if you are prototyping. You cannot create a full application with Blame &Parent Revision %1 - - Chunk successfully staged - - Stage Chunk... @@ -32499,25 +32326,11 @@ Use this only if you are prototyping. You cannot create a full application with &Soft - - - Git::Internal::GitSubmitEditor Refreshing Commit Data Odświeżanie danych poprawki - - Git::Internal::RemoteModel - - Name - Nazwa - - - URL - URL - - GlslEditor::Internal::GlslEditorPlugin @@ -37986,7 +37799,7 @@ Ustaw prawdziwy plik wykonywalny Clang. - GitGrep + Git Tree (optional) Drzewo (opcjonalnie) @@ -40977,7 +40790,7 @@ Wiersz: %4, kolumna: %5 - Gerrit::Internal::AuthenticationDialog + Git Authentication Autoryzacja @@ -40986,10 +40799,6 @@ Wiersz: %4, kolumna: %5 <html><head/><body><p>Gerrit server with HTTP was detected, but you need to set up credentials for it.</p><p>To get your password, <a href="LINK_PLACEHOLDER"><span style=" text-decoration: underline; color:#007af4;">click here</span></a> (sign in if needed). Click Generate Password if the password is blank, and copy the user name and password to this form.</p><p>Choose Anonymous if you do not want authentication for this server. In this case, changes that require authentication (like draft changes or private projects) will not be displayed.</p></body></html> - - &User: - &Użytkownik: - &Password: H&asło: @@ -42605,7 +42414,7 @@ Błąd: %5 - Gerrit::Internal::GerritRemoteChooser + Git Refresh Remote Servers Odśwież zdalne serwery diff --git a/share/qtcreator/translations/qtcreator_ru.ts b/share/qtcreator/translations/qtcreator_ru.ts index 8f8b850c6d4..8512f1b870f 100644 --- a/share/qtcreator/translations/qtcreator_ru.ts +++ b/share/qtcreator/translations/qtcreator_ru.ts @@ -20694,7 +20694,7 @@ See also Google Test settings. - Gerrit::Internal::AuthenticationDialog + Git Authentication Авторизация @@ -20719,9 +20719,6 @@ See also Google Test settings. Anonymous Анонимно - - - Gerrit::Internal::FetchContext Fetching from Gerrit Загрузка из Gerrit @@ -20738,9 +20735,6 @@ See also Google Test settings. Error running %1: %2 Ошибка выполнения %1: %2 - - - Gerrit::Internal::GerritDialog Changes Изменения @@ -20797,9 +20791,6 @@ Note: This can expose you to man-in-the-middle attack. Отключить SSL проверку для этого сервера? Внимание: Это может повлечь атаку «человек посередине». - - - Gerrit::Internal::GerritModel (Draft) (черновик) @@ -20856,16 +20847,6 @@ Note: This can expose you to man-in-the-middle attack. Parse error: "%1" Ошибка разбора: «%1» - - - Gerrit::Internal::GerritOptionsPage - - Gerrit - Gerrit - - - - Gerrit::Internal::GerritOptionsWidget HTTPS HTTPS @@ -20874,10 +20855,6 @@ Note: This can expose you to man-in-the-middle attack. &Host: &Сервер: - - &User: - Поль&зователь: - &ssh: &ssh: @@ -20902,9 +20879,6 @@ Note: This can expose you to man-in-the-middle attack. создания URL в случае, если «canonicalWebUrl» не настроен в «gerrit.config». - - - Gerrit::Internal::GerritPlugin Gerrit... Gerrit... @@ -20947,9 +20921,6 @@ were not verified among remotes in %3. Select different folder? Enter Local Repository for "%1" (%2) Ввод локального хранилища для «%1» (%2) - - - Gerrit::Internal::GerritPushDialog Push to Gerrit Отправка в Gerrit @@ -21052,9 +21023,6 @@ Partially checked - Do not change current state. &Work-in-progress В р&аботе - - - Gerrit::Internal::GerritRemoteChooser Refresh Remote Servers Обновить внешние хранилища @@ -21063,25 +21031,10 @@ Partially checked - Do not change current state. Fallback Резервный - - - Gerrit::Internal::QueryContext Querying Gerrit Запрос к Gerrit - - Error running %1: %2 - Ошибка выполнения %1: %2 - - - %1 crashed. - %1 аварийно завершился. - - - %1 returned %2. - %1 возвратил %2. - Timeout Время вышло @@ -21102,9 +21055,6 @@ Would you like to terminate it? Terminate Завершить - - - Git::Internal::BaseGitDiffArgumentsWidget Use the patience algorithm for calculating the differences. Использовать устойчивый алгоритм для расчёта различий. @@ -21121,28 +21071,14 @@ Would you like to terminate it? Ignore Whitespace Игнорировать пробелы - - - Git::Internal::BaseGitLogArgumentsWidget - - Diff - Сравнить - Show difference. Показать изменения. - - Filter - Фильтровать - Filter commits by message or content. Отбирать фиксации по сообщению или содержимому. - - - Git::Internal::BranchAddDialog Branch Name: Название ветки: @@ -21179,9 +21115,6 @@ Would you like to terminate it? Checkout new branch Выгрузить новую ветку - - - Git::Internal::BranchCheckoutDialog Local Changes Found. Choose Action: Имеются локальные изменения. Следует: @@ -21218,9 +21151,6 @@ Would you like to terminate it? Create Branch Stash for Current Branch Спрятать изменения текущей ветки - - - Git::Internal::BranchModel Local Branches Локальные ветки @@ -21229,17 +21159,10 @@ Would you like to terminate it? Remote Branches Внешние ветки - - Detached HEAD - Отцеплённая HEAD - Tags Метки - - - Git::Internal::BranchView Include Old Entries Включать старые элементы @@ -21316,18 +21239,10 @@ Would you like to terminate it? Re&set С&бросить - - &Hard - Жё&стко (--hard) - &Mixed С&мешанно - - &Soft - &Мягко (--soft) - &Merge (Fast-Forward) О&бъединить (промотать) @@ -21344,18 +21259,10 @@ Would you like to terminate it? &Rebase Переба&зировать - - Cherry &Pick - Перенести &изменения - &Track С&вязать - - &Push - О&тправить (push) - Would you like to delete the tag "%1"? Удалить метку «%1»? @@ -21384,9 +21291,6 @@ Would you like to terminate it? Git Reset Git: Сброс изменений - - - Git::Internal::BranchViewFactory Git Branches Ветки Git @@ -21395,21 +21299,10 @@ Would you like to terminate it? Filter Фильтр - - - Git::Internal::ChangeSelectionDialog Browse &History... Открыть &историю... - - &Show - &Показать - - - Cherry &Pick - Перенести &изменения - &Revert &Откатить @@ -21466,9 +21359,6 @@ Would you like to terminate it? &Archive... &Сжать... - - - Git::Internal::CommitData untracked не контролируется @@ -21513,16 +21403,10 @@ Would you like to terminate it? by them ими - - - Git::Internal::GitBaseDiffEditorController <None> <Нет> - - - Git::Internal::GitBlameArgumentsWidget Hide the date of a change from the output. Скрывать дату изменений в выводе. @@ -21531,10 +21415,6 @@ Would you like to terminate it? Omit Date Пропускать дату - - Ignore whitespace only changes. - Игнорировать изменения пробелов. - No Move Detection Без обнаружения перемещений @@ -21555,13 +21435,6 @@ Would you like to terminate it? Move detection Определение перемещений - - Ignore Whitespace - Игнорировать пробелы - - - - Git::Internal::GitClient Invalid revision Некорректная ревизия @@ -21781,10 +21654,6 @@ Commit now? MERGING ОБЪЕДИНЕНИЕ - - Detached HEAD - Отцеплённая HEAD - Cannot reset %n files in "%1": %2 @@ -21832,10 +21701,6 @@ Commit now? Continue Продолжить - - Continue Revert - Продолжить откат - You need to commit changes to finish revert. Commit now? @@ -22008,14 +21873,6 @@ Would you like to create the branch "%1" on the remote and set it as u Stash local changes and pop when %1 finishes. Спрятать локальные изменения и восстановить после завершения %1. - - Stash - Спрятать - - - Discard - Отменить - Cherr&y-Pick Change %1 &Внести изменение %1 @@ -22048,10 +21905,6 @@ Would you like to create the branch "%1" on the remote and set it as u &Hard Жё&стко - - &Mixed - С&мешанно - &Soft &Мягко @@ -22068,9 +21921,6 @@ Would you like to create the branch "%1" on the remote and set it as u &Save for Diff С&охранить для сравнения - - - Git::Internal::GitEditorWidget &Blame %1 &Аннотация %1 @@ -22079,10 +21929,6 @@ Would you like to create the branch "%1" on the remote and set it as u Blame &Parent Revision %1 Аннотация &родительской ревизии %1 - - Chunk successfully staged - Фрагмент успешно применён - Stage Chunk... Применить фрагмент... @@ -22091,9 +21937,6 @@ Would you like to create the branch "%1" on the remote and set it as u Unstage Chunk... Отменить фрагмент... - - - Git::Internal::GitLogArgumentsWidget First Parent Первый родитель @@ -22126,9 +21969,6 @@ Would you like to create the branch "%1" on the remote and set it as u Show log also for previous names of the file. Показывать историю до переименования файла. - - - Git::Internal::GitLogFilterWidget Filter by message Отбор по сообщению @@ -22153,20 +21993,10 @@ Would you like to create the branch "%1" on the remote and set it as u Case Sensitive Учитывать регистр - - - Git::Internal::GitPlugin - - <No repository> - <Нет хранилища> - Repository: %1 Хранилище: %1 - - - Git::Internal::GitPluginPrivate &Copy "%1" &Копировать «%1» @@ -22373,11 +22203,6 @@ Would you like to create the branch "%1" on the remote and set it as u Очистить... Clean... - - Status - Состояние - Status - Commit... Фиксировать... @@ -22441,11 +22266,6 @@ Would you like to create the branch "%1" on the remote and set it as u Прервать откат Abort Revert - - Continue Rebase - Продолжение перебазирования - Continue Rebase - Skip Rebase Пропустить перебазирование @@ -22613,10 +22433,6 @@ Would you like to create the branch "%1" on the remote and set it as u Git &Tools Сре&дства Git - - Gitk - Gitk - Gitk Current File Открыть текущий файл в Gitk @@ -22642,16 +22458,6 @@ Would you like to create the branch "%1" on the remote and set it as u Интерфейс Git Git Gui - - Repository Browser - Обозреватель хранилища - Repository Browser - - - Merge Tool - Программа объединения - Merge Tool - Actions on Commits... Действия при фиксации... @@ -22709,9 +22515,6 @@ Would you like to create the branch "%1" on the remote and set it as u Patch %1 successfully applied to %2 Исправление %1 успешно наложено на %2 - - - Git::Internal::GitRefLogArgumentsWidget Show Date Показывать дату @@ -22720,23 +22523,14 @@ Would you like to create the branch "%1" on the remote and set it as u Show date instead of sequence. Показывать дату вместо последовательности. - - - Git::Internal::GitSettings The binary "%1" could not be located in the path "%2" Программа «%1» отсутствует в «%2» - - - Git::Internal::GitSubmitEditor Refreshing Commit Data Обновление данных фиксации - - - Git::Internal::GitSubmitEditorWidget Provide a valid email to commit. Для фиксации необходим рабочий адрес электронной почты. @@ -22785,9 +22579,6 @@ Would you like to create the branch "%1" on the remote and set it as u &Commit &Фиксировать - - - Git::Internal::GitSubmitPanel General Information Основная информация @@ -22828,9 +22619,6 @@ Would you like to create the branch "%1" on the remote and set it as u Sign off Выходить - - - Git::Internal::LogChangeDialog Reset to: Сбросить до: @@ -22855,20 +22643,10 @@ Would you like to create the branch "%1" on the remote and set it as u Soft Мягкий (--soft) - - - Git::Internal::LogChangeWidget Sha1 Sha1 - - Subject - Описание - - - - Git::Internal::MergeTool Normal Обычный @@ -22969,9 +22747,6 @@ Remote: %4 Merge tool process terminated with exit code %1 Процесс объединения завершился с кодом %1 - - - Git::Internal::RemoteAdditionDialog Add Remote Добавление внешнего хранилища @@ -22984,9 +22759,6 @@ Remote: %4 URL: - - - Git::Internal::RemoteDialog Remotes Внешние хранилища @@ -23011,10 +22783,6 @@ Remote: %4 Re&fresh &Обновить - - &Add... - &Добавить... - F&etch &Получить @@ -23027,20 +22795,6 @@ Remote: %4 &Push О&тправить - - - Git::Internal::RemoteModel - - Name - Имя - - - URL - URL - - - - Git::Internal::SettingsPage <b>Note:</b> <b>Внимание:</b> @@ -23102,9 +22856,6 @@ Perl через переменные среды окружения.Repository Browser Обозреватель хранилища - - - Git::Internal::SettingsPageWidget Set the environment variable HOME to "%1" (%2). @@ -23131,9 +22882,6 @@ instead of its installation directory when run outside git bash. Git Git - - - Git::Internal::StashDialog Stashes Спрятанное @@ -23170,10 +22918,6 @@ instead of its installation directory when run outside git bash. &Delete... &Удалить... - - &Show - &Показать - R&estore... &Восстановить... @@ -23183,10 +22927,6 @@ instead of its installation directory when run outside git bash. Restore a git stash to new branch to be created Восстановить в в&етку... - - Re&fresh - &Обновить - Delete Stashes Удалить спрятанное @@ -23201,10 +22941,6 @@ You can choose between stashing the changes or discarding them. Невозможно восстановить %1, так как хранилище изменилось. Вы можете выбрать между скрытием изменений или отказа от них. - - Stash - Спрятать - Discard Отказаться @@ -23213,10 +22949,6 @@ You can choose between stashing the changes or discarding them. Restore Stash to Branch Восстановить спрятанное в ветку - - Branch: - Ветка: - Stash Restore Восстановление спрятанного @@ -23229,9 +22961,6 @@ You can choose between stashing the changes or discarding them. Error restoring %1 Ошибка восстановления %1 - - - GitGrep Tree (optional) Дерево (опционально) diff --git a/share/qtcreator/translations/qtcreator_sl.ts b/share/qtcreator/translations/qtcreator_sl.ts index edd214d9eb5..e58c95cb9ef 100644 --- a/share/qtcreator/translations/qtcreator_sl.ts +++ b/share/qtcreator/translations/qtcreator_sl.ts @@ -5119,7 +5119,7 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr - Git::Internal::BranchDialog + Git Would you like to delete the <b>unmerged</b> branch '%1'? Ali želite izbrisati <b>nezdruženo</b> vejo »%1«? @@ -5170,18 +5170,6 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr Checkout Prevzemi - - Diff - Razlike - - - Refresh - Osveži - - - Delete... - Izbriši … - Failed to delete branch Izbris veje ni uspel @@ -5214,9 +5202,6 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr Remote Branches Oddaljene veje - - - Git::Internal::ChangeSelectionDialog Select a Git Commit Izberite zapis Git @@ -5233,9 +5218,6 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr Selected directory is not a Git repository Izbrana mapa ni skladišče Git - - - Git::Internal::GitClient Waiting for data... Čakanje na podatke … @@ -5463,10 +5445,6 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr %n datotek ni moč zapisati: %1 - - Revert - Povrni - The file has been changed. Do you want to revert it? Datoteka je bila spremenjena. Ali jo želite povrniti? @@ -5698,9 +5676,6 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr - - - Git::Internal::GitPlugin &Git &Git @@ -5847,10 +5822,6 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr Amend %1 Sprememba %1 - - Git Commit - Zapis v Git - Closing Git Editor Zapiranje urejevalnika Git @@ -6073,16 +6044,10 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr Undo Changes for "%1" Razveljavi spremembe v »%1« - - - Git::Internal::GitSettings The binary '%1' could not be located in the path '%2' Izvršljive datoteke »%1« na poti »%2« ni bilo moč najti - - - Git::Internal::GitSubmitPanel General Information Splošni podatki @@ -6097,11 +6062,6 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr repository skladišče - - - Branch: - Veja: - branch @@ -6122,9 +6082,6 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr Email: E-pošta: - - - Git::Internal::SettingsPage Git Git @@ -6219,9 +6176,6 @@ enojen »Vstopi« za oddajo signala pa vas bo privedel neposredno do ustrezne pr Use "patience diff" algorithm Uporabi algoritem za razlike po pasjansi - - - GitCommand '%1' failed (exit code %2). @@ -12714,7 +12668,7 @@ Za uporabo v polje Iskalnika vtipkajte to bližnjico in presledek ter nato iskan - Git::Internal::CloneWizard + Git Clones a Git repository and tries to load the contained project. Sklonira skladišče Git in poskusi naložiti vsebovani projekt. @@ -12723,9 +12677,6 @@ Za uporabo v polje Iskalnika vtipkajte to bližnjico in presledek ter nato iskan Git Repository Clone Klon skladišča Git - - - Git::CloneWizardPage Location Mesto @@ -13623,7 +13574,7 @@ Razlog: %2 - Git::Internal::StashDialog + Git Stashes Zapisi na strani @@ -13701,10 +13652,6 @@ You can choose between stashing the changes or discarding them. %1 ni moč obnoviti, ker je bilo skladišče spremenjeno. Spremembe lahko zapišete na stran ali pa jih zavržete. - - Stash - Zapiši na stran - Discard Zavrzi @@ -16057,14 +16004,11 @@ Desetiška predznačena vrednost (najprej veliki konec): %4 - Git::Internal::GitCommand + Git Error: Git timed out after %1s. Napaka: po %1 s je Git-u potekel čas. - - - Git::Internal::GitEditor Blame %1 Odgovornost za %1 @@ -19361,7 +19305,7 @@ GDB omogoča navedbo zaporedja ukazov, ki so ločeni z »\n«. - Git::Internal::BranchAddDialog + Git Dialog Pogovorno okno @@ -19384,9 +19328,6 @@ GDB omogoča navedbo zaporedja ukazov, ki so ločeni z »\n«. Track local branch '%1' Spremljaj krajevno vejo »%1« - - - Git::Internal::RemoteAdditionDialog Add Remote Dodajanje oddaljene @@ -19401,33 +19342,15 @@ GDB omogoča navedbo zaporedja ukazov, ki so ločeni z »\n«. URL: URL: - - - Git::Internal::RemoteDialog Remotes Oddaljene - - - Re&fresh - Os&veži - - - - &Add... - &Dodaj ... - F&etch &Pridobi - - - &Remove - &Odstrani - Delete Remote Izbriši oddaljeno @@ -24415,14 +24338,11 @@ Datoteke se ohrani. - Git::Internal::BranchModel + Git Local Branches Krajevne veje - - - Git::Internal::BaseGitDiffArgumentsWidget Use the patience algorithm for calculating the differences. Za ugotovitev razlik uporabi potrpežljiv algoritem. @@ -24439,9 +24359,6 @@ Datoteke se ohrani. Ignore Whitespace Prezri praznine - - - Git::Internal::GitShowArgumentsWidget Select the pretty printing format. Izberite obliko lepega izpisa. @@ -24474,9 +24391,6 @@ Datoteke se ohrani. raw surovo - - - Git::Internal::GitBlameArgumentsWidget Hide the date of a change from the output. V izhodu skrij datum spremembe. @@ -24485,17 +24399,6 @@ Datoteke se ohrani. Omit Date Izpusti datum - - Ignore whitespace only changes. - Prezri spremembe s samimi prazninami. - - - Ignore Whitespace - Prezri praznine - - - - Git::Internal::SettingsPageWidget Set the environment variable HOME to '%1' (%2). @@ -30144,14 +30047,11 @@ Preverite pravice za dostop do mape. - Git::Internal::GitSubmitEditor + Git Git Commit Git – zapis - - - Git::Internal::LocalBranchModel <New branch> <nova veja> @@ -32317,7 +32217,7 @@ Preverite, ali je telefon priključen in ali App TRK teče. - Git::Internal::RemoteBranchModel + Git (no branch) (brez vej) diff --git a/share/qtcreator/translations/qtcreator_uk.ts b/share/qtcreator/translations/qtcreator_uk.ts index a4e4fd22fe9..7a5c6ab9962 100644 --- a/share/qtcreator/translations/qtcreator_uk.ts +++ b/share/qtcreator/translations/qtcreator_uk.ts @@ -9377,7 +9377,7 @@ These files are preserved. - Git::CloneWizardPage + Git Location Розташування @@ -9390,9 +9390,6 @@ These files are preserved. Recursive Рекурсивно - - - Git::Internal::BaseGitDiffArgumentsWidget Patience @@ -9409,9 +9406,6 @@ These files are preserved. Ignore whitespace only changes. Ігнорувати зміни в пропусках. - - - Git::Internal::BranchAddDialog Branch Name: Назва гілки: @@ -9436,9 +9430,6 @@ These files are preserved. Track local branch '%1' Відстежувати локальну гілку '%1' - - - Git::Internal::BranchDialog Branches Гілки @@ -9555,10 +9546,6 @@ These files are preserved. &Track &Стежити - - Reset - Скинути - Set current branch to track the selected one. Встановити, щоб поточна гілка стежила за вибраною. @@ -9567,9 +9554,6 @@ These files are preserved. &Include old entries - - - Git::Internal::BranchModel Local Branches Локальні гілки @@ -9582,9 +9566,6 @@ These files are preserved. Tags Теги - - - Git::Internal::ChangeSelectionDialog Browse &Directory... Оглянути &теку... @@ -9653,9 +9634,6 @@ These files are preserved. Select a Git Commit - - - Git::Internal::CloneWizard Cloning Клонування @@ -9672,9 +9650,6 @@ These files are preserved. Git Repository Clone Клонування сховища Git - - - Git::Internal::GitBlameArgumentsWidget Omit Date Пропускати дату @@ -9683,17 +9658,6 @@ These files are preserved. Hide the date of a change from the output. Приховати дату зміни у виведенні. - - Ignore Whitespace - Ігнорувати пропуски - - - Ignore whitespace only changes. - Ігнорувати зміни в пропусках. - - - - Git::Internal::GitClient Waiting for data... Очікування на дані... @@ -9844,14 +9808,6 @@ These files are preserved. Git Diff Project Зміни в проекті (Git) - - Reset - - - - All changes in working directory will be discarded. Are you sure? - Усі зміни в робочій теці будуть відкинуті. Ви впевнені? - Cannot describe revision "%1" in "%2": %3 @@ -10014,10 +9970,6 @@ Commit now? Cannot obtain status: %1 Неможливо отримати статус: %1 - - Continue Rebase - Продовження перебазування - Continue Продовжити @@ -10097,9 +10049,6 @@ Commit now? There are no modified files. Немає змінених файлів. - - - Git::Internal::GitEditor Reset Скидання @@ -10108,9 +10057,6 @@ Commit now? All changes in working directory will be discarded. Are you sure? Усі зміни в робочій теці будуть відкинуті. Ви впевнені? - - - Git::Internal::GitPlugin &Git &Git @@ -10295,10 +10241,6 @@ Commit now? Saves the current state of your work. Зберігає поточний стан вашої праці. - - Stash - - Saves the current state of your work and resets the repository. @@ -10355,10 +10297,6 @@ Commit now? Continue Cherry Pick - - Continue Revert - - Apply from Editor Накласти з редактора @@ -10423,14 +10361,6 @@ Commit now? Fetch Отримати (fetch) - - Clones a Git repository and tries to load the contained project. - Клонує сховище Git та намагається завантажити з нього проект. - - - Git Repository Clone - Клонування сховища Git - Reflog @@ -10523,10 +10453,6 @@ Commit now? Actions on Commits... - - Commit - - &Undo &Повернути @@ -10583,9 +10509,6 @@ Commit now? Patch %1 successfully applied to %2 Латку %1 було успішно накладено на %2 - - - Git::Internal::GitSettings The binary '%1' could not be located in the path '%2' Не вдалось знайти виконуваний модуль '%1' в шляху '%2' @@ -10594,9 +10517,6 @@ Commit now? The binary "%1" could not be located in the path "%2" Не вдалось знайти виконуваний модуль "%1" в шляху "%2" - - - Git::Internal::GitSubmitPanel General Information Загальна інформація @@ -10633,9 +10553,6 @@ Commit now? By&pass hooks: - - - Git::Internal::RemoteAdditionDialog Add Remote Додавання віддаленого сховища @@ -10648,29 +10565,14 @@ Commit now? URL: URL: - - - Git::Internal::RemoteDialog Remotes Віддалені сховища - - Re&fresh - &Оновити - - - &Add... - &Додати... - F&etch &Отримати - - &Remove - &Видалити - Delete Remote Видалення віддаленого сховища @@ -10683,9 +10585,6 @@ Commit now? &Push - - - Git::Internal::SettingsPage <b>Note:</b> <b>Примітка:</b> @@ -10722,10 +10621,6 @@ Commit now? Set "HOME" environment variable Встановити змінну середовища "HOME" - - Gitk - Gitk - Arguments: Аргументи: @@ -10754,13 +10649,6 @@ Commit now? Show tags in Branches dialog Показувати теги в діалозі "Гілки" - - Repository Browser - Оглядач сховища - - - - Git::Internal::SettingsPageWidget Set the environment variable HOME to "%1" (%2). @@ -10787,9 +10675,6 @@ instead of its installation directory when run outside git bash. Git Repository Browser Command Команда оглядача сховища Git - - - Git::Internal::StashDialog Stashes @@ -10834,10 +10719,6 @@ instead of its installation directory when run outside git bash. &Delete... Ви&далити... - - &Show - &Показати - R&estore... @@ -10847,10 +10728,6 @@ instead of its installation directory when run outside git bash. Restore a git stash to new branch to be created - - Re&fresh - &Оновити - Delete Stashes @@ -10864,22 +10741,10 @@ instead of its installation directory when run outside git bash. You can choose between stashing the changes or discarding them. - - Stash - - - - Discard - Відкинути - Restore Stash to Branch - - Branch: - Гілка: - Stash Restore @@ -26849,7 +26714,7 @@ should a repository require SSH-authentication (see documentation on SSH and the - Git::Internal::CommitData + Git untracked @@ -26890,9 +26755,6 @@ should a repository require SSH-authentication (see documentation on SSH and the by them - - - Git::Internal::GitLogArgumentsWidget Show Diff Показати зміни @@ -31126,7 +30988,7 @@ Stepping into the module or setting breakpoints by file and is expected to work. - Gerrit::Internal::GerritDialog + Git Apply in: Застосувати в: @@ -31163,21 +31025,10 @@ Stepping into the module or setting breakpoints by file and is expected to work. &Show... &Показати... - - &Show - &Показати - - - Cherry &Pick - - Fetching "%1"... Отримання "%1"... - - - Gerrit::Internal::GerritModel <html><head/><body><table><tr><td>Subject</td><td>%1</td></tr><tr><td>Number</td><td><a href="%11">%2</a></td></tr><tr><td>Owner</td><td>%3 <a href="mailto:%4">%4</a></td></tr><tr><td>Project</td><td>%5 (%6)</td></tr><tr><td>Status</td><td>%7, %8</td></tr><tr><td>Patch set</td><td>%9</td></tr>%10<tr><td>URL</td><td><a href="%11">%11</a></td></tr></table></body></html> <html><head/><body><table><tr><td>Тема</td><td>%1</td></tr><tr><td>Номер</td><td><a href="%11">%2</a></td></tr><tr><td>Власник</td><td>%3 <a href="mailto:%4">%4</a></td></tr><tr><td>Проект</td><td>%5 (%6)</td></tr><tr><td>Статус</td><td>%7, %8</td></tr><tr><td>Набір латок</td><td>%9</td></tr>%10<tr><td>URL</td><td><a href="%11">%11</a></td></tr></table></body></html> @@ -31202,10 +31053,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Approvals Схвалення - - Status - Статус - Number Номер @@ -31250,13 +31097,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Parse error in line '%1' Помилка розбору в рядку'%1' - - - Gerrit::Internal::QueryContext - - Gerrit - Gerrit - Querying Gerrit Опитування Gerrit @@ -31301,16 +31141,10 @@ Would you like to terminate it? Keep Running Продовжувати виконання - - - Gerrit::Internal::GerritOptionsPage Gerrit Gerrit - - - Gerrit::Internal::GerritOptionsWidget HTTPS HTTPS @@ -31355,9 +31189,6 @@ Would you like to terminate it? для формування URL у випадку, якщо "canonicalWebUrl" не налаштовано в файлі"gerrit.config". - - - Gerrit::Internal::FetchContext Gerrit Fetch Отримати з Gerrit @@ -31366,21 +31197,6 @@ Would you like to terminate it? Fetching from Gerrit Отримання з Gerrit - - %1 crashed. - %1 завершився аварійно. - - - %1 returned %2. - %1 повернув %2. - - - Error running %1: %2 - Помилка запуску %1: %2 - - - - Gerrit::Internal::GerritPlugin Gerrit... Gerrit... @@ -31428,17 +31244,10 @@ were not verified among remotes in %3. Select different folder? Enter Local Repository for '%1' (%2) Введіть локальне сховище для '%1' (%2) - - - Git::Internal::GitSubmitEditorWidget Provide a valid email to commit. - - Detached HEAD - - Select Change Оберіть зміну @@ -32775,7 +32584,7 @@ cannot be found in the path. - Git::Internal::BranchCheckoutDialog + Git Local Changes Found. Choose Action: Знайдені локальні зміни. Оберіть дію: @@ -32788,10 +32597,6 @@ cannot be found in the path. Discard Local Changes Відкинути локальні зміни - - CheckBox - Прапорець - Checkout branch "%1" @@ -34095,11 +33900,7 @@ cannot be found in the path. - Git::Internal::MergeTool - - Error - Помилка - + Git Normal Звичайний @@ -35238,7 +35039,7 @@ See details for a complete list of files. - Gerrit::Internal::GerritPushDialog + Git Push to Gerrit @@ -36088,7 +35889,7 @@ Partial names can be used if they are unambiguous. - Git::Internal::GitDiffHandler + Git Working tree Робоче дерево @@ -36097,24 +35898,10 @@ Partial names can be used if they are unambiguous. Index Покажчик - - Waiting for data... - Очікування на дані... - - - - Git::Internal::LogChangeWidget Sha1 Sha1 - - Subject - Тема - - - - Git::Internal::LogChangeDialog Reset to: Скинути до: @@ -42395,15 +42182,7 @@ Install an SDK of at least API version %1. - Git::Internal::CloneWizardFactory - - Clones a Git repository and tries to load the contained project. - Клонує сховище Git та намагається завантажити з нього проект. - - - Git Repository Clone - Клонування сховища Git - + Git Gitorious::Internal::GitoriousCloneWizardFactory @@ -42417,23 +42196,12 @@ Install an SDK of at least API version %1. - Git::Internal::GitSubmitEditor + Git Refreshing Commit Data - - Git::Internal::RemoteModel - - Name - Назва - - - URL - URL - - Help @@ -45701,7 +45469,7 @@ Preselects a desktop Qt for building the application if available. - Git::Internal::GitEditorWidget + Git &Blame %1 @@ -45710,14 +45478,6 @@ Preselects a desktop Qt for building the application if available. Blame &Parent Revision %1 - - All changes in working directory will be discarded. Are you sure? - Усі зміни в робочій теці будуть відкинуті. Ви впевнені? - - - Chunk successfully staged - - Stage Chunk... @@ -51650,7 +51410,7 @@ Please set a real Clang executable. - GitGrep + Git &Use Git Grep diff --git a/share/qtcreator/translations/qtcreator_zh_CN.ts b/share/qtcreator/translations/qtcreator_zh_CN.ts index 7be070daae5..bcfb18f37b0 100644 --- a/share/qtcreator/translations/qtcreator_zh_CN.ts +++ b/share/qtcreator/translations/qtcreator_zh_CN.ts @@ -7192,35 +7192,11 @@ on slow machines. In this case, the value should be increased. - Git::Internal::BranchDialog + Git Checkout Checkout - - Delete - 删除 - - - Unable to find the repository directory for '%1'. - 无法找到仓库目录'%1' - - - Diff - Diff - - - Log - 日志 - - - Refresh - 刷新 - - - Delete... - 删除... - Checkout branch? 检出分支吗? @@ -7270,10 +7246,6 @@ on slow machines. In this case, the value should be increased. General information 概要 - - Repository: - 仓库: - Remote branches 远程 branches @@ -7306,9 +7278,6 @@ on slow machines. In this case, the value should be increased. &Checkout 检出(&C) - - - Git::Internal::ChangeSelectionDialog Select a Git commit 选择一个 Git commit @@ -7349,17 +7318,10 @@ on slow machines. In this case, the value should be increased. Change: 更改: - - - Git::Internal::GitClient Note that the git plugin for QtCreator is not able to interact with the server so far. Thus, manual ssh-identification etc. will not work. 请注意 git 插件无法与服务器交互,所以类似于“手动ssh身份认证”之类将无法工作。 - - Unable to determine the repository for %1. - 无法为%1定位代码仓库. - Waiting for data... 等待数据... @@ -7716,10 +7678,6 @@ on slow machines. In this case, the value should be increased. - - Revert - 还原 - The file has been changed. Do you want to revert it? 文件被改变,您想要还原它吗? @@ -7764,9 +7722,6 @@ on slow machines. In this case, the value should be increased. Cannot determine git version: %1 无法确定git 的版本: %1 - - - Git::Internal::GitPlugin &Git &Git @@ -7885,10 +7840,6 @@ on slow machines. In this case, the value should be increased. Amend %1 增订 %1 - - Git Commit - Git Commit - Closing Git Editor 关闭 git 编辑器 @@ -8201,23 +8152,14 @@ on slow machines. In this case, the value should be increased. Do you want to commit the change? 您想提交此修改吗? - - - Git::Internal::GitSettings The binary '%1' could not be located in the path '%2' 无法在路径 '%2' 定位二进制档 '%1' - - - Git::Internal::GitSubmitEditor Git Commit Git Commit - - - Git::Internal::GitSubmitPanel General Information 概要信息 @@ -8230,10 +8172,6 @@ on slow machines. In this case, the value should be increased. repository 代码仓库 - - Branch: - 分支: - branch 分支 @@ -8254,9 +8192,6 @@ on slow machines. In this case, the value should be increased. By&pass hooks 跳过hook(&P) - - - Git::Internal::LocalBranchModel <New branch> <新的分支> @@ -8265,9 +8200,6 @@ on slow machines. In this case, the value should be increased. Type to create a new branch 创建新分支 - - - Git::Internal::SettingsPage Environment variables 环境变量 @@ -8388,9 +8320,6 @@ on slow machines. In this case, the value should be increased. Command: 命令: - - - GitCommand '%1' failed (exit code %2). @@ -18220,7 +18149,7 @@ Will not be applied to whitespace in comments and strings. - Git::Internal::CloneWizard + Git Clones a project from a git repository. 从 Git 仓库中 clone 一个项目。 @@ -18233,9 +18162,6 @@ Will not be applied to whitespace in comments and strings. Git Repository Clone Git仓库的克隆 - - - Git::CloneWizardPage Location 位置 @@ -20525,7 +20451,7 @@ S60 emulator run configuration default display name, %1 is base pro-File name - Git::Internal::StashDialog + Git Stashes Stash列表 @@ -20616,10 +20542,6 @@ You can choose between stashing the changes or discarding them. %1 不能被还原,因为仓库已经变更。 您可以选择 stash 修改的内容或者丢弃修改。 - - Stash - Stash - Discard 丢弃 @@ -22520,28 +22442,19 @@ Previous decimal signed value (big endian): %4 - Git::Internal::RemoteBranchModel + Git (no branch) (没有分支) - - - GitClient Unable to determine the repository for %1. 无法为 %1 决定仓库。 - - - Git::Internal::GitCommand Error: Git timed out after %1s. 错误: Git 在 %1秒后超时. - - - Git::Internal::GitEditor Blame %1 Blame %1 @@ -28618,7 +28531,7 @@ Setting breakpoints by file name and line number may fail. - Git::Internal::SettingsPageWidget + Git Set the environment variable HOME to '%1' (%2). @@ -33021,7 +32934,7 @@ Do you want to retry? - Git::Internal::BaseGitDiffArgumentsWidget + Git Use the patience algorithm for calculating the diff 使用耐心算法来计算差异 @@ -33046,9 +32959,6 @@ Do you want to retry? Ignore Whitespace 忽略空白 - - - Git::Internal::GitShowArgumentsWidget Select the pretty printing format 选择一个漂亮的输出格式 @@ -33085,9 +32995,6 @@ Do you want to retry? raw raw - - - Git::Internal::GitBlameArgumentsWidget Do not show the date a change was made in the output 输出改变了不要显示日期 @@ -33100,18 +33007,6 @@ Do you want to retry? Omit Date 忽略日期 - - Ignore whitespace only changes. - 忽略仅为空白的修改。 - - - Ignore whitespace only changes - 忽略空白仅关注改变 - - - Ignore Whitespace - 忽略空白 - GLSLEditor::Internal::FunctionArgumentWidget @@ -35026,7 +34921,7 @@ if (a && - Git::Internal::BranchAddDialog + Git Dialog 对话框 @@ -35047,9 +34942,6 @@ if (a && Track local branch '%1' 跟踪本地分支'%1' - - - Git::Internal::RemoteAdditionDialog Add Remote 添加远程 @@ -35062,29 +34954,14 @@ if (a && URL: URL: - - - Git::Internal::RemoteDialog Remotes 远程 - - Re&fresh - 刷新(&F) - - - &Add... - 添加(&A)... - F&etch F&etch - - &Remove - 删除(&R) - Delete Remote 删除远程 @@ -36064,7 +35941,7 @@ These files are preserved. - Git::Internal::BranchModel + Git Local Branches 本地分支 @@ -46052,7 +45929,7 @@ Stepping into the module or setting breakpoints by file and is expected to work. - Git::Internal::CommitData + Git untracked untracked @@ -46085,17 +45962,10 @@ Stepping into the module or setting breakpoints by file and is expected to work. updated 已更新 - - - Gerrit::Internal::GerritDialog Gerrit %1@%2 Gerrit %1@%2 - - Changes - 修改 - &Query: 查询(&Query): @@ -46120,13 +45990,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Checkout... Checkout... - - Refresh - 刷新 - - - - Gerrit::Internal::GerritModel <html><head/><body><table><tr><td>Subject</td><td>%1</td></tr><tr><td>Number</td><td><a href="%11">%2</a></td></tr><tr><td>Owner</td><td>%3 <a href="mailto:%4">%4</a></td></tr><tr><td>Project</td><td>%5 (%6)</td></tr><tr><td>Status</td><td>%7, %8</td></tr><tr><td>Patch set</td><td>%9</td></tr>%10<tr><td>URL</td><td><a href="%11">%11</a></td></tr></table></body></html> <html><head/><body><table><tr><td>标题</td><td>%1</td></tr><tr><td>数字</td><td><a href="%11">%2</a></td></tr><tr><td>所有者</td><td>%3 <a href="mailto:%4">%4</a></td></tr><tr><td>项目</td><td>%5 (%6)</td></tr><tr><td>状态</td><td>%7, %8</td></tr><tr><td>补丁集</td><td>%9</td></tr>%10<tr><td>URL</td><td><a href="%11">%11</a></td></tr></table></body></html> @@ -46151,10 +46014,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Approvals 审批 - - Status - 状态 - Parse error: '%1' -> %2 解析错误: '%1' -> %2 @@ -46167,9 +46026,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Parse error in line '%1' 在行 '%1'发生解析错误 - - - Gerrit::Internal::QueryContext Gerrit Gerrit @@ -46186,16 +46042,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. %1 returned %2. %1 返回了 %2。 - - - Gerrit::Internal::GerritOptionsPage - - Gerrit - Gerrit - - - - Gerrit::Internal::GerritOptionsWidget HTTPS HTTPS @@ -46227,25 +46073,10 @@ Stepping into the module or setting breakpoints by file and is expected to work. 当文件"gerrit.config"没有配置"canonicalWebUrl"时 从URL推测使用的协议。 - - - Gerrit::Internal::FetchContext Gerrit Fetch Gerrit Fetch - - %1 crashed. - "%1" 崩溃。 - - - %1 returned %2. - %1 返回了 %2。 - - - Error running %1: %2 - 运行%1发生错误: %2 - Error writing to temporary file. 写入临时文件发生错误。 @@ -46258,9 +46089,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Cherry-picking %1... 正在cherry-pick %1... - - - Gerrit::Internal::GerritPlugin Gerrit... Gerrit... @@ -46273,9 +46101,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Enter Local Repository for '%1' (%2) 输入 '%1' (%2) 的本地代码仓库 - - - Git::Internal::GitLogArgumentsWidget Show Diff 显示Diff @@ -46284,24 +46109,14 @@ Stepping into the module or setting breakpoints by file and is expected to work. Show difference. 显示差异。 - - - Git::Internal::GitSubmitEditorWidget Detached HEAD 已经detach HEAD - - - Git::Internal::ResetDialog Sha1 Sha1 - - Subject - 标题 - Reset to: 重置为: diff --git a/share/qtcreator/translations/qtcreator_zh_TW.ts b/share/qtcreator/translations/qtcreator_zh_TW.ts index 5a0f90b9fa6..8f3568db07b 100644 --- a/share/qtcreator/translations/qtcreator_zh_TW.ts +++ b/share/qtcreator/translations/qtcreator_zh_TW.ts @@ -4875,7 +4875,7 @@ Reason: %3 - Git::Internal::BranchDialog + Git Checkout 取出 @@ -4924,9 +4924,6 @@ Reason: %3 &Checkout 取出(&C) - - - Git::Internal::ChangeSelectionDialog Select a Git Commit 選擇一個 Git 提交紀錄 @@ -4955,9 +4952,6 @@ Reason: %3 Change: 變更: - - - Git::Internal::GitClient Waiting for data... 等待資料中... @@ -5207,9 +5201,6 @@ Reason: %3 Cannot determine git version: %1 無法決定 git 的版本:%1 - - - Git::Internal::GitPlugin &Git Git(&G) @@ -5549,16 +5540,10 @@ Reason: %3 Do you want to commit the change? 您要提交此變更嗎? - - - Git::Internal::GitSettings The binary '%1' could not be located in the path '%2' 在路徑 '%2' 中找不到執行檔 '%1' - - - Git::Internal::GitSubmitPanel General Information 一般資訊 @@ -5595,9 +5580,6 @@ Reason: %3 By&pass hooks - - - Git::Internal::SettingsPage <b>Note:</b> <b>注意:</b> @@ -11104,7 +11086,7 @@ Will not be applied to whitespace in comments and strings. - Git::Internal::CloneWizard + Git Clones a Git repository and tries to load the contained project. 複製一個 Git 主目錄,並試著載入裡面包含的專案。 @@ -11113,9 +11095,6 @@ Will not be applied to whitespace in comments and strings. Git Repository Clone Git 主目錄複製 - - - Git::CloneWizardPage Location 位置 @@ -12503,7 +12482,7 @@ Reason: %2 - Git::Internal::StashDialog + Git Stashes 暫存檔 @@ -12577,10 +12556,6 @@ You can choose between stashing the changes or discarding them. %1 無法還原,因為主目錄已被變更。 您可以選擇要暫存或是丟棄變更。 - - Stash - 暫存 - Discard 丟棄 @@ -12589,10 +12564,6 @@ You can choose between stashing the changes or discarding them. Restore Stash to Branch 還原暫存內容到分支 - - Branch: - 分支: - Stash Restore 暫存還原 @@ -13281,7 +13252,7 @@ For qmlproject projects, use the importPaths property to add import paths. - Git::Internal::GitEditor + Git Blame %1 "%1" 的提交紀錄 @@ -16830,7 +16801,7 @@ Setting breakpoints by file name and line number may fail. - Git::Internal::SettingsPageWidget + Git Set the environment variable HOME to '%1' (%2). @@ -20126,7 +20097,7 @@ Do you want to retry? - Git::Internal::BaseGitDiffArgumentsWidget + Git Use the patience algorithm for calculating the differences. 使用 patience 演算法來計算差異。 @@ -20143,9 +20114,6 @@ Do you want to retry? Ignore Whitespace 忽略空白 - - - Git::Internal::GitShowArgumentsWidget oneline 一行 @@ -20174,9 +20142,6 @@ Do you want to retry? raw 原始 - - - Git::Internal::GitBlameArgumentsWidget Hide the date of a change from the output. 在輸出隱藏變更日期。 @@ -20185,14 +20150,6 @@ Do you want to retry? Omit Date 省略日期 - - Ignore whitespace only changes. - 忽略只有空白的變更。 - - - Ignore Whitespace - 忽略空白 - GLSLEditor @@ -21764,7 +21721,7 @@ if (a && - Git::Internal::BranchAddDialog + Git Dialog 對話框 @@ -21785,9 +21742,6 @@ if (a && Track local branch '%1' 追蹤本地分支 '%1' - - - Git::Internal::RemoteAdditionDialog Add Remote 新增遠端 @@ -21800,29 +21754,14 @@ if (a && URL: 網址: - - - Git::Internal::RemoteDialog Remotes 遠端 - - Re&fresh - 刷新(&F) - - - &Add... - 新增(&A)... - F&etch 抓取(&E) - - &Remove - 移除(&R) - Delete Remote 移除遠端 @@ -22417,7 +22356,7 @@ These files are preserved. - Git::Internal::BranchModel + Git Local Branches 本地分支 @@ -28431,7 +28370,7 @@ should a repository require SSH-authentication (see documentation on SSH and the - Git::Internal::CommitData + Git untracked 未追蹤的 @@ -28464,9 +28403,6 @@ should a repository require SSH-authentication (see documentation on SSH and the updated 已更新 - - - Git::Internal::GitLogArgumentsWidget Show Diff 顯示差異 @@ -31877,15 +31813,11 @@ Stepping into the module or setting breakpoints by file and is expected to work. - Gerrit::Internal::GerritDialog + Git Gerrit %1@%2 - - Changes - 變更 - &Query: @@ -31910,13 +31842,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Checkout... - - Refresh - 刷新 - - - - Gerrit::Internal::GerritModel <html><head/><body><table><tr><td>Subject</td><td>%1</td></tr><tr><td>Number</td><td><a href="%11">%2</a></td></tr><tr><td>Owner</td><td>%3 <a href="mailto:%4">%4</a></td></tr><tr><td>Project</td><td>%5 (%6)</td></tr><tr><td>Status</td><td>%7, %8</td></tr><tr><td>Patch set</td><td>%9</td></tr>%10<tr><td>URL</td><td><a href="%11">%11</a></td></tr></table></body></html> @@ -31941,10 +31866,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Approvals - - Status - 狀態 - Parse error: '%1' -> %2 @@ -31957,9 +31878,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Parse error in line '%1' - - - Gerrit::Internal::QueryContext Gerrit @@ -31976,16 +31894,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. %1 returned %2. - - - Gerrit::Internal::GerritOptionsPage - - Gerrit - - - - - Gerrit::Internal::GerritOptionsWidget HTTPS @@ -32016,25 +31924,10 @@ Stepping into the module or setting breakpoints by file and is expected to work. "gerrit.config". - - - Gerrit::Internal::FetchContext Gerrit Fetch - - %1 crashed. - - - - %1 returned %2. - - - - Error running %1: %2 - - Error writing to temporary file. @@ -32047,9 +31940,6 @@ Stepping into the module or setting breakpoints by file and is expected to work. Cherry-picking %1... - - - Gerrit::Internal::GerritPlugin Gerrit... @@ -32062,24 +31952,14 @@ Stepping into the module or setting breakpoints by file and is expected to work. Enter Local Repository for '%1' (%2) - - - Git::Internal::GitSubmitEditorWidget Detached HEAD - - - Git::Internal::ResetDialog Sha1 - - Subject - - Reset to: diff --git a/src/plugins/git/branchadddialog.cpp b/src/plugins/git/branchadddialog.cpp index 8c988b42a60..2ba6b371317 100644 --- a/src/plugins/git/branchadddialog.cpp +++ b/src/plugins/git/branchadddialog.cpp @@ -5,6 +5,7 @@ #include "branchmodel.h" #include "gitplugin.h" +#include "gittr.h" #include #include @@ -19,8 +20,7 @@ #include #include -namespace Git { -namespace Internal { +namespace Git::Internal { /*! * \brief The BranchNameValidator class validates the corresponding string as @@ -94,12 +94,12 @@ BranchAddDialog::BranchAddDialog(const QStringList &localBranches, Type type, QW { resize(590, 138); - auto branchNameLabel = new QLabel(tr("Branch Name:")); + auto branchNameLabel = new QLabel(Tr::tr("Branch Name:")); m_branchNameEdit = new QLineEdit(this); m_branchNameEdit->setValidator(new BranchNameValidator(localBranches, this)); - m_checkoutCheckBox = new QCheckBox(tr("Checkout new branch")); + m_checkoutCheckBox = new QCheckBox(Tr::tr("Checkout new branch")); m_trackingCheckBox = new QCheckBox(this); m_trackingCheckBox->setVisible(false); @@ -110,18 +110,18 @@ BranchAddDialog::BranchAddDialog(const QStringList &localBranches, Type type, QW switch (type) { case BranchAddDialog::AddBranch: - setWindowTitle(tr("Add Branch")); + setWindowTitle(Tr::tr("Add Branch")); break; case BranchAddDialog::RenameBranch: - setWindowTitle(tr("Rename Branch")); + setWindowTitle(Tr::tr("Rename Branch")); break; case BranchAddDialog::AddTag: - setWindowTitle(tr("Add Tag")); - branchNameLabel->setText(tr("Tag name:")); + setWindowTitle(Tr::tr("Add Tag")); + branchNameLabel->setText(Tr::tr("Tag name:")); break; case BranchAddDialog::RenameTag: - setWindowTitle(tr("Rename Tag")); - branchNameLabel->setText(tr("Tag name:")); + setWindowTitle(Tr::tr("Rename Tag")); + branchNameLabel->setText(Tr::tr("Tag name:")); break; } @@ -159,8 +159,8 @@ void BranchAddDialog::setTrackedBranchName(const QString &name, bool remote) m_trackingCheckBox->setVisible(false); m_trackingCheckBox->setChecked(false); } else { - m_trackingCheckBox->setText(remote ? tr("Track remote branch \"%1\"").arg(name) - : tr("Track local branch \"%1\"").arg(name)); + m_trackingCheckBox->setText(remote ? Tr::tr("Track remote branch \"%1\"").arg(name) + : Tr::tr("Track local branch \"%1\"").arg(name)); m_trackingCheckBox->setVisible(true); m_trackingCheckBox->setChecked(remote); } @@ -188,5 +188,4 @@ void BranchAddDialog::updateButtonStatus() m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(m_branchNameEdit->hasAcceptableInput()); } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/branchadddialog.h b/src/plugins/git/branchadddialog.h index ec4a4b667da..bbcf52070c5 100644 --- a/src/plugins/git/branchadddialog.h +++ b/src/plugins/git/branchadddialog.h @@ -10,10 +10,9 @@ QT_BEGIN_NAMESPACE class QCheckBox; class QDialogButtonBox; class QLineEdit; -QT_BEGIN_NAMESPACE +QT_END_NAMESPACE -namespace Git { -namespace Internal { +namespace Git::Internal { class BranchModel; @@ -30,8 +29,6 @@ private: class BranchAddDialog : public QDialog { - Q_OBJECT - public: enum Type { AddBranch, @@ -62,5 +59,4 @@ private: QDialogButtonBox *m_buttonBox; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/branchcheckoutdialog.cpp b/src/plugins/git/branchcheckoutdialog.cpp index 67dcd30b42c..a6819bb58bc 100644 --- a/src/plugins/git/branchcheckoutdialog.cpp +++ b/src/plugins/git/branchcheckoutdialog.cpp @@ -3,16 +3,16 @@ #include "branchcheckoutdialog.h" +#include "gittr.h" + #include -#include #include #include #include #include -namespace Git { -namespace Internal { +namespace Git::Internal { BranchCheckoutDialog::BranchCheckoutDialog(QWidget *parent, const QString ¤tBranch, @@ -22,24 +22,24 @@ BranchCheckoutDialog::BranchCheckoutDialog(QWidget *parent, setWindowModality(Qt::WindowModal); resize(394, 199); setModal(true); - setWindowTitle(tr("Checkout branch \"%1\"").arg(nextBranch)); + setWindowTitle(Tr::tr("Checkout branch \"%1\"").arg(nextBranch)); - m_localChangesGroupBox = new QGroupBox(tr("Local Changes Found. Choose Action:")); + m_localChangesGroupBox = new QGroupBox(Tr::tr("Local Changes Found. Choose Action:")); - m_moveChangesRadioButton = new QRadioButton(tr("Move Local Changes to \"%1\"").arg(nextBranch)); + m_moveChangesRadioButton = new QRadioButton(Tr::tr("Move Local Changes to \"%1\"").arg(nextBranch)); - m_discardChangesRadioButton = new QRadioButton(tr("Discard Local Changes")); + m_discardChangesRadioButton = new QRadioButton(Tr::tr("Discard Local Changes")); m_discardChangesRadioButton->setEnabled(true); - m_popStashCheckBox = new QCheckBox(tr("Pop Stash of \"%1\"").arg(nextBranch)); + m_popStashCheckBox = new QCheckBox(Tr::tr("Pop Stash of \"%1\"").arg(nextBranch)); m_popStashCheckBox->setEnabled(false); m_makeStashRadioButton = new QRadioButton; m_makeStashRadioButton->setChecked(true); if (!currentBranch.isEmpty()) { - m_makeStashRadioButton->setText(tr("Create Branch Stash for \"%1\"").arg(currentBranch)); + m_makeStashRadioButton->setText(Tr::tr("Create Branch Stash for \"%1\"").arg(currentBranch)); } else { - m_makeStashRadioButton->setText(tr("Create Branch Stash for Current Branch")); + m_makeStashRadioButton->setText(Tr::tr("Create Branch Stash for Current Branch")); foundNoLocalChanges(); } @@ -119,6 +119,4 @@ void BranchCheckoutDialog::updatePopStashCheckBox(bool moveChangesChecked) m_popStashCheckBox->setEnabled(!moveChangesChecked && m_foundStashForNextBranch); } -} // namespace Internal -} // namespace Git - +} // Git::Internal diff --git a/src/plugins/git/branchcheckoutdialog.h b/src/plugins/git/branchcheckoutdialog.h index 2b58e7a4546..44be2f56690 100644 --- a/src/plugins/git/branchcheckoutdialog.h +++ b/src/plugins/git/branchcheckoutdialog.h @@ -11,13 +11,10 @@ class QGroupBox; class QRadioButton; QT_END_NAMESPACE -namespace Git { -namespace Internal { +namespace Git::Internal { class BranchCheckoutDialog : public QDialog { - Q_OBJECT - public: explicit BranchCheckoutDialog(QWidget *parent, const QString ¤tBranch, const QString &nextBranch); @@ -47,5 +44,4 @@ private: QCheckBox *m_popStashCheckBox; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index b33b4ab277f..c262f07c0bc 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -2,8 +2,10 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "branchmodel.h" + #include "gitclient.h" #include "gitconstants.h" +#include "gittr.h" #include #include @@ -22,8 +24,7 @@ using namespace Utils; using namespace VcsBase; -namespace Git { -namespace Internal { +namespace Git::Internal { enum RootNodes { LocalBranches = 0, @@ -254,8 +255,8 @@ BranchModel::BranchModel(GitClient *client, QObject *parent) : QTC_CHECK(d->client); // Abuse the sha field for ref prefix - d->rootNode->append(new BranchNode(tr("Local Branches"), "refs/heads")); - d->rootNode->append(new BranchNode(tr("Remote Branches"), "refs/remotes")); + d->rootNode->append(new BranchNode(Tr::tr("Local Branches"), "refs/heads")); + d->rootNode->append(new BranchNode(Tr::tr("Remote Branches"), "refs/remotes")); connect(&d->fsWatcher, &Utils::FileSystemWatcher::fileChanged, this, [this] { QString errorMessage; refresh(d->workingDirectory, &errorMessage); @@ -440,7 +441,7 @@ bool BranchModel::refresh(const FilePath &workingDirectory, QString *errorMessag } if (!d->currentBranch) { BranchNode *local = d->rootNode->children.at(LocalBranches); - d->currentBranch = d->headNode = new BranchNode(tr("Detached HEAD"), "HEAD", QString(), + d->currentBranch = d->headNode = new BranchNode(Tr::tr("Detached HEAD"), "HEAD", QString(), d->currentDateTime); local->prepend(d->headNode); } @@ -796,7 +797,7 @@ void BranchModel::Private::parseOutputLine(const QString &line, bool force) oldEntriesRoot = root->append(new BranchNode(remoteName)); } else if (showTags && nameParts.first() == "tags") { if (!hasTags()) // Tags is missing, add it - rootNode->append(new BranchNode(tr("Tags"), "refs/tags")); + rootNode->append(new BranchNode(Tr::tr("Tags"), "refs/tags")); rootType = Tags; } else { return; @@ -925,6 +926,4 @@ QString BranchModel::toolTip(const QString &sha) const return output; } -} // namespace Internal -} // namespace Git - +} // Git::Internal diff --git a/src/plugins/git/branchmodel.h b/src/plugins/git/branchmodel.h index 4fa8794a7b7..122ed2480b8 100644 --- a/src/plugins/git/branchmodel.h +++ b/src/plugins/git/branchmodel.h @@ -6,26 +6,18 @@ #include #include -#include #include namespace VcsBase { class VcsCommand; } -namespace Git { -namespace Internal { - -class GitClient; +namespace Git::Internal { class BranchNode; +class GitClient; -// -------------------------------------------------------------------------- -// BranchModel: -// -------------------------------------------------------------------------- - -class BranchModel : public QAbstractItemModel { - Q_OBJECT - +class BranchModel : public QAbstractItemModel +{ public: explicit BranchModel(GitClient *client, QObject *parent = nullptr); ~BranchModel() override; @@ -80,5 +72,4 @@ private: Private *d; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/branchview.cpp b/src/plugins/git/branchview.cpp index 58a137dacb9..eb8d5ad86e7 100644 --- a/src/plugins/git/branchview.cpp +++ b/src/plugins/git/branchview.cpp @@ -9,6 +9,7 @@ #include "gitclient.h" #include "gitconstants.h" #include "gitplugin.h" +#include "gittr.h" #include "gitutils.h" #include @@ -24,7 +25,6 @@ #include #include -#include #include #include #include @@ -39,13 +39,13 @@ using namespace Core; using namespace Utils; using namespace VcsBase; -namespace Git { -namespace Internal { +namespace Git::Internal { class BranchFilterModel : public QSortFilterProxyModel { public: BranchFilterModel(QObject *parent) : QSortFilterProxyModel(parent) {} + protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override { @@ -70,8 +70,8 @@ struct SetInContext }; BranchView::BranchView() - : m_includeOldEntriesAction(new QAction(tr("Include Old Entries"), this)) - , m_includeTagsAction(new QAction(tr("Include Tags"), this)) + : m_includeOldEntriesAction(new QAction(Tr::tr("Include Old Entries"), this)) + , m_includeTagsAction(new QAction(Tr::tr("Include Tags"), this)) , m_addAction(new QAction(this)) , m_refreshAction(new QAction(this)) , m_repositoryLabel(new ElidingLabel(this)) @@ -83,7 +83,7 @@ BranchView::BranchView() connect(m_addAction, &QAction::triggered, this, &BranchView::add); m_refreshAction->setIcon(Utils::Icons::RELOAD_TOOLBAR.icon()); - m_refreshAction->setToolTip(tr("Refresh")); + m_refreshAction->setToolTip(Tr::tr("Refresh")); connect(m_refreshAction, &QAction::triggered, this, &BranchView::refreshCurrentRepository); m_branchView->setHeaderHidden(true); @@ -108,7 +108,7 @@ BranchView::BranchView() m_includeOldEntriesAction->setCheckable(true); m_includeOldEntriesAction->setToolTip( - tr("Include branches and tags that have not been active for %n days.", nullptr, + Tr::tr("Include branches and tags that have not been active for %n days.", nullptr, Constants::OBSOLETE_COMMIT_AGE_IN_DAYS)); connect(m_includeOldEntriesAction, &QAction::toggled, this, &BranchView::setIncludeOldEntries); @@ -146,13 +146,13 @@ void BranchView::refresh(const FilePath &repository, bool force) m_repository = repository; if (m_repository.isEmpty()) { - m_repositoryLabel->setText(tr("")); - m_addAction->setToolTip(tr("Create Git Repository...")); + m_repositoryLabel->setText(Tr::tr("")); + m_addAction->setToolTip(Tr::tr("Create Git Repository...")); m_branchView->setEnabled(false); } else { m_repositoryLabel->setText(m_repository.toUserOutput()); m_repositoryLabel->setToolTip(GitPlugin::msgRepositoryLabel(m_repository)); - m_addAction->setToolTip(tr("Add Branch...")); + m_addAction->setToolTip(Tr::tr("Add Branch...")); m_branchView->setEnabled(true); } @@ -179,7 +179,7 @@ QList BranchView::createToolButtons() { auto filter = new QToolButton; filter->setIcon(Utils::Icons::FILTER.icon()); - filter->setToolTip(tr("Filter")); + filter->setToolTip(Tr::tr("Filter")); filter->setPopupMode(QToolButton::InstantPopup); filter->setProperty("noArrow", true); @@ -227,75 +227,75 @@ void BranchView::slotCustomContextMenu(const QPoint &point) const bool currentLocal = m_model->isLocal(currentBranch); QMenu contextMenu; - contextMenu.addAction(tr("&Add..."), this, &BranchView::add); + contextMenu.addAction(Tr::tr("&Add..."), this, &BranchView::add); const std::optional remote = m_model->remoteName(index); if (remote.has_value()) { - contextMenu.addAction(tr("&Fetch"), this, [this, &remote]() { + contextMenu.addAction(Tr::tr("&Fetch"), this, [this, &remote]() { GitClient::instance()->fetch(m_repository, *remote); }); contextMenu.addSeparator(); if (!remote->isEmpty()) { - contextMenu.addAction(tr("Remove &Stale Branches"), this, [this, &remote]() { + contextMenu.addAction(Tr::tr("Remove &Stale Branches"), this, [this, &remote]() { GitClient::instance()->removeStaleRemoteBranches(m_repository, *remote); }); contextMenu.addSeparator(); } - contextMenu.addAction(tr("Manage &Remotes..."), this, [] { + contextMenu.addAction(Tr::tr("Manage &Remotes..."), this, [] { GitPlugin::manageRemotes(); }); } if (hasActions) { if (!currentSelected && (isLocal || isTag)) - contextMenu.addAction(tr("Rem&ove..."), this, &BranchView::remove); + contextMenu.addAction(Tr::tr("Rem&ove..."), this, &BranchView::remove); if (isLocal || isTag) - contextMenu.addAction(tr("Re&name..."), this, &BranchView::rename); + contextMenu.addAction(Tr::tr("Re&name..."), this, &BranchView::rename); if (!currentSelected) - contextMenu.addAction(tr("&Checkout"), this, &BranchView::checkout); + contextMenu.addAction(Tr::tr("&Checkout"), this, &BranchView::checkout); contextMenu.addSeparator(); - contextMenu.addAction(tr("&Diff"), this, [this] { + contextMenu.addAction(Tr::tr("&Diff"), this, [this] { const QString fullName = m_model->fullName(selectedIndex(), true); if (!fullName.isEmpty()) { SetInContext block(m_blockRefresh); GitClient::instance()->diffBranch(m_repository, fullName); } }); - contextMenu.addAction(tr("&Log"), this, [this] { log(selectedIndex()); }); - contextMenu.addAction(tr("Reflo&g"), this, [this] { reflog(selectedIndex()); }); + contextMenu.addAction(Tr::tr("&Log"), this, [this] { log(selectedIndex()); }); + contextMenu.addAction(Tr::tr("Reflo&g"), this, [this] { reflog(selectedIndex()); }); contextMenu.addSeparator(); if (!currentSelected) { - auto resetMenu = new QMenu(tr("Re&set"), &contextMenu); - resetMenu->addAction(tr("&Hard"), this, [this] { reset("hard"); }); - resetMenu->addAction(tr("&Mixed"), this, [this] { reset("mixed"); }); - resetMenu->addAction(tr("&Soft"), this, [this] { reset("soft"); }); + auto resetMenu = new QMenu(Tr::tr("Re&set"), &contextMenu); + resetMenu->addAction(Tr::tr("&Hard"), this, [this] { reset("hard"); }); + resetMenu->addAction(Tr::tr("&Mixed"), this, [this] { reset("mixed"); }); + resetMenu->addAction(Tr::tr("&Soft"), this, [this] { reset("soft"); }); contextMenu.addMenu(resetMenu); QString mergeTitle; if (isFastForwardMerge()) { - contextMenu.addAction(tr("&Merge \"%1\" into \"%2\" (Fast-Forward)") + contextMenu.addAction(Tr::tr("&Merge \"%1\" into \"%2\" (Fast-Forward)") .arg(indexName, currentName), this, [this] { merge(true); }); - mergeTitle = tr("Merge \"%1\" into \"%2\" (No &Fast-Forward)") + mergeTitle = Tr::tr("Merge \"%1\" into \"%2\" (No &Fast-Forward)") .arg(indexName, currentName); } else { - mergeTitle = tr("&Merge \"%1\" into \"%2\"") + mergeTitle = Tr::tr("&Merge \"%1\" into \"%2\"") .arg(indexName, currentName); } contextMenu.addAction(mergeTitle, this, [this] { merge(false); }); - contextMenu.addAction(tr("&Rebase \"%1\" on \"%2\"") + contextMenu.addAction(Tr::tr("&Rebase \"%1\" on \"%2\"") .arg(currentName, indexName), this, &BranchView::rebase); contextMenu.addSeparator(); - contextMenu.addAction(tr("Cherry &Pick"), this, &BranchView::cherryPick); + contextMenu.addAction(Tr::tr("Cherry &Pick"), this, &BranchView::cherryPick); } if (!currentSelected && !isTag) { if (currentLocal) { - contextMenu.addAction(tr("&Track"), this, [this] { + contextMenu.addAction(Tr::tr("&Track"), this, [this] { m_model->setRemoteTracking(selectedIndex()); }); } if (!isLocal) { contextMenu.addSeparator(); - contextMenu.addAction(tr("&Push"), this, &BranchView::push); + contextMenu.addAction(Tr::tr("&Push"), this, &BranchView::push); } } } @@ -459,13 +459,13 @@ bool BranchView::remove() const bool wasMerged = isTag ? true : m_model->branchIsMerged(selected); QString message; if (isTag) - message = tr("Would you like to delete the tag \"%1\"?").arg(branchName); + message = Tr::tr("Would you like to delete the tag \"%1\"?").arg(branchName); else if (wasMerged) - message = tr("Would you like to delete the branch \"%1\"?").arg(branchName); + message = Tr::tr("Would you like to delete the branch \"%1\"?").arg(branchName); else - message = tr("Would you like to delete the unmerged branch \"%1\"?").arg(branchName); + message = Tr::tr("Would you like to delete the unmerged branch \"%1\"?").arg(branchName); - if (QMessageBox::question(this, isTag ? tr("Delete Tag") : tr("Delete Branch"), + if (QMessageBox::question(this, isTag ? Tr::tr("Delete Tag") : Tr::tr("Delete Branch"), message, QMessageBox::Yes | QMessageBox::No, wasMerged ? QMessageBox::Yes : QMessageBox::No) == QMessageBox::Yes) { if (isTag) @@ -517,7 +517,7 @@ bool BranchView::reset(const QByteArray &resetType) if (currentName.isEmpty() || branchName.isEmpty()) return false; - if (QMessageBox::question(this, tr("Git Reset"), tr("Reset branch \"%1\" to \"%2\"?") + if (QMessageBox::question(this, Tr::tr("Git Reset"), Tr::tr("Reset branch \"%1\" to \"%2\"?") .arg(currentName, branchName), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { GitClient::instance()->reset(m_repository, QLatin1String("--" + resetType), branchName); @@ -610,7 +610,7 @@ void BranchView::push() BranchViewFactory::BranchViewFactory() { - setDisplayName(tr("Git Branches")); + setDisplayName(Tr::tr("Git Branches")); setPriority(500); setId(Constants::GIT_BRANCH_VIEW_ID); } @@ -626,5 +626,4 @@ BranchView *BranchViewFactory::view() const return m_view; } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/branchview.h b/src/plugins/git/branchview.h index 3fb79d9a9ca..5ff8df715fa 100644 --- a/src/plugins/git/branchview.h +++ b/src/plugins/git/branchview.h @@ -20,18 +20,15 @@ QT_END_NAMESPACE; namespace Utils { class ElidingLabel; class NavigationTreeView; -} +} // Utils -namespace Git { -namespace Internal { +namespace Git::Internal { class BranchModel; class BranchFilterModel; class BranchView : public QWidget { - Q_OBJECT - public: explicit BranchView(); @@ -80,8 +77,6 @@ private: class BranchViewFactory : public Core::INavigationWidgetFactory { - Q_OBJECT - public: BranchViewFactory(); @@ -93,5 +88,4 @@ private: QPointer m_view; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/changeselectiondialog.cpp b/src/plugins/git/changeselectiondialog.cpp index d4e9587a85a..1ef50c08fd5 100644 --- a/src/plugins/git/changeselectiondialog.cpp +++ b/src/plugins/git/changeselectiondialog.cpp @@ -5,6 +5,7 @@ #include "logchangedialog.h" #include "gitclient.h" +#include "gittr.h" #include @@ -14,9 +15,7 @@ #include #include -#include #include -#include #include #include #include @@ -30,8 +29,7 @@ using namespace Utils; using namespace VcsBase; -namespace Git { -namespace Internal { +namespace Git::Internal { ChangeSelectionDialog::ChangeSelectionDialog(const FilePath &workingDirectory, Id id, QWidget *parent) : @@ -41,14 +39,14 @@ ChangeSelectionDialog::ChangeSelectionDialog(const FilePath &workingDirectory, I m_gitEnvironment = GitClient::instance()->processEnvironment(); resize(550, 350); - setWindowTitle(tr("Select a Git Commit")); + setWindowTitle(Tr::tr("Select a Git Commit")); setObjectName("Git.ChangeSelectionDialog"); m_workingDirectoryChooser = new PathChooser(this); m_changeNumberEdit = new CompletingLineEdit(this); m_changeNumberEdit->setObjectName("changeNumberEdit"); - m_changeNumberEdit->setText(tr("HEAD")); + m_changeNumberEdit->setText(Tr::tr("HEAD")); m_changeNumberEdit->setFocus(); m_changeNumberEdit->selectAll(); @@ -58,25 +56,25 @@ ChangeSelectionDialog::ChangeSelectionDialog(const FilePath &workingDirectory, I m_detailsText->setLineWrapMode(QPlainTextEdit::NoWrap); m_detailsText->setReadOnly(true); - auto selectFromHistoryButton = new QPushButton(tr("Browse &History...")); - auto closeButton = new QPushButton(tr("&Close")); - auto archiveButton = new QPushButton(tr("&Archive...")); + auto selectFromHistoryButton = new QPushButton(Tr::tr("Browse &History...")); + auto closeButton = new QPushButton(Tr::tr("&Close")); + auto archiveButton = new QPushButton(Tr::tr("&Archive...")); - m_checkoutButton = new QPushButton(tr("Check&out")); - m_revertButton = new QPushButton(tr("&Revert")); - m_cherryPickButton = new QPushButton(tr("Cherry &Pick")); - m_showButton = new QPushButton(tr("&Show")); + m_checkoutButton = new QPushButton(Tr::tr("Check&out")); + m_revertButton = new QPushButton(Tr::tr("&Revert")); + m_cherryPickButton = new QPushButton(Tr::tr("Cherry &Pick")); + m_showButton = new QPushButton(Tr::tr("&Show")); m_showButton->setObjectName("showButton"); m_workingDirectoryChooser->setExpectedKind(PathChooser::ExistingDirectory); - m_workingDirectoryChooser->setPromptDialogTitle(tr("Select Git Directory")); + m_workingDirectoryChooser->setPromptDialogTitle(Tr::tr("Select Git Directory")); m_workingDirectoryChooser->setFilePath(workingDirectory); using namespace Layouting; Column { Grid { - tr("Working directory:"), m_workingDirectoryChooser, br, - tr("Change:"), m_changeNumberEdit, selectFromHistoryButton, + Tr::tr("Working directory:"), m_workingDirectoryChooser, br, + Tr::tr("Change:"), m_changeNumberEdit, selectFromHistoryButton, }, m_detailsText, Row { @@ -143,7 +141,7 @@ void ChangeSelectionDialog::selectCommitFromRecentHistory() if (tilde != -1) commit.truncate(tilde); LogChangeDialog dialog(false, this); - dialog.setWindowTitle(tr("Select Commit")); + dialog.setWindowTitle(Tr::tr("Select Commit")); dialog.runDialog(workingDir, commit, LogChangeWidget::IncludeRemotes); @@ -184,9 +182,9 @@ void ChangeSelectionDialog::setDetails() palette.setColor(QPalette::Text, theme->color(Theme::TextColorNormal)); m_changeNumberEdit->setPalette(palette); } else if (m_process->result() == ProcessResult::StartFailed) { - m_detailsText->setPlainText(tr("Error: Could not start Git.")); + m_detailsText->setPlainText(Tr::tr("Error: Could not start Git.")); } else { - m_detailsText->setPlainText(tr("Error: Unknown reference")); + m_detailsText->setPlainText(Tr::tr("Error: Unknown reference")); palette.setColor(QPalette::Text, theme->color(Theme::TextColorError)); m_changeNumberEdit->setPalette(palette); enableButtons(false); @@ -231,7 +229,7 @@ void ChangeSelectionDialog::recalculateDetails() const FilePath workingDir = workingDirectory(); if (workingDir.isEmpty()) { - m_detailsText->setPlainText(tr("Error: Bad working directory.")); + m_detailsText->setPlainText(Tr::tr("Error: Bad working directory.")); return; } @@ -247,7 +245,7 @@ void ChangeSelectionDialog::recalculateDetails() m_process->setEnvironment(m_gitEnvironment); m_process->setCommand({m_gitExecutable, {"show", "--decorate", "--stat=80", ref}}); m_process->start(); - m_detailsText->setPlainText(tr("Fetching commit data...")); + m_detailsText->setPlainText(Tr::tr("Fetching commit data...")); } void ChangeSelectionDialog::changeTextChanged(const QString &text) @@ -261,5 +259,4 @@ void ChangeSelectionDialog::changeTextChanged(const QString &text) recalculateDetails(); } -} // Internal -} // Git +} // Git::Internal diff --git a/src/plugins/git/changeselectiondialog.h b/src/plugins/git/changeselectiondialog.h index 9c43a2cfcb5..c75239213e7 100644 --- a/src/plugins/git/changeselectiondialog.h +++ b/src/plugins/git/changeselectiondialog.h @@ -21,8 +21,7 @@ class PathChooser; class QtcProcess; } // Utils -namespace Git { -namespace Internal { +namespace Git::Internal { enum ChangeCommand { NoCommand, @@ -35,7 +34,6 @@ enum ChangeCommand { class ChangeSelectionDialog : public QDialog { - Q_OBJECT public: ChangeSelectionDialog(const Utils::FilePath &workingDirectory, Utils::Id id, QWidget *parent); ~ChangeSelectionDialog() override; @@ -71,5 +69,4 @@ private: QPushButton *m_showButton; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/commitdata.cpp b/src/plugins/git/commitdata.cpp index 9c6b948ac15..78e70a5ee48 100644 --- a/src/plugins/git/commitdata.cpp +++ b/src/plugins/git/commitdata.cpp @@ -3,13 +3,12 @@ #include "commitdata.h" +#include "gittr.h" + #include #include -#include - -namespace Git { -namespace Internal { +namespace Git::Internal { void GitSubmitEditorPanelInfo::clear() { @@ -175,32 +174,31 @@ QString CommitData::stateDisplayName(const FileStates &state) { QString resultState; if (state == UntrackedFile) - return tr("untracked"); + return Tr::tr("untracked"); if (state & StagedFile) - resultState = tr("staged + "); + resultState = Tr::tr("staged + "); if (state & ModifiedFile) - resultState.append(tr("modified")); + resultState.append(Tr::tr("modified")); else if (state & AddedFile) - resultState.append(tr("added")); + resultState.append(Tr::tr("added")); else if (state & DeletedFile) - resultState.append(tr("deleted")); + resultState.append(Tr::tr("deleted")); else if (state & RenamedFile) - resultState.append(tr("renamed")); + resultState.append(Tr::tr("renamed")); else if (state & CopiedFile) - resultState.append(tr("copied")); + resultState.append(Tr::tr("copied")); else if (state & TypeChangedFile) - resultState.append(tr("typechange")); + resultState.append(Tr::tr("typechange")); if (state & UnmergedUs) { if (state & UnmergedThem) - resultState.append(tr(" by both")); + resultState.append(Tr::tr(" by both")); else - resultState.append(tr(" by us")); + resultState.append(Tr::tr(" by us")); } else if (state & UnmergedThem) { - resultState.append(tr(" by them")); + resultState.append(Tr::tr(" by them")); } return resultState; } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/commitdata.h b/src/plugins/git/commitdata.h index c425016b679..8d6c14ca918 100644 --- a/src/plugins/git/commitdata.h +++ b/src/plugins/git/commitdata.h @@ -7,7 +7,6 @@ #include -#include #include #include @@ -15,8 +14,7 @@ QT_BEGIN_NAMESPACE class QTextCodec; QT_END_NAMESPACE -namespace Git { -namespace Internal { +namespace Git::Internal { // Read-only class GitSubmitEditorPanelInfo @@ -69,8 +67,6 @@ Q_DECLARE_FLAGS(FileStates, FileState) class CommitData { - Q_DECLARE_TR_FUNCTIONS(Git::Internal::CommitData) - public: CommitData(CommitType type = SimpleCommit); // A pair of state string/file name ('modified', 'file.cpp'). @@ -101,17 +97,14 @@ private: bool checkLine(const QString &stateInfo, const QString &file); }; -} // namespace Internal -} // namespace Git +} // Git::Internal Q_DECLARE_OPERATORS_FOR_FLAGS(Git::Internal::FileStates) -namespace Git { -namespace Internal { +namespace Git::Internal { // Must appear after Q_DECLARE_OPERATORS_FOR_FLAGS bool operator<(const CommitData::StateFilePair &a, const CommitData::StateFilePair &b); -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/gerrit/authenticationdialog.cpp b/src/plugins/git/gerrit/authenticationdialog.cpp index a12c62f2b08..3dacd0d2712 100644 --- a/src/plugins/git/gerrit/authenticationdialog.cpp +++ b/src/plugins/git/gerrit/authenticationdialog.cpp @@ -5,6 +5,8 @@ #include "gerritserver.h" +#include "../gittr.h" + #include #include #include @@ -52,11 +54,11 @@ static bool replaceEntry(QString &line, const QString &type, const QString &valu AuthenticationDialog::AuthenticationDialog(GerritServer *server) : m_server(server) { - setWindowTitle(tr("Authentication")); + setWindowTitle(Git::Tr::tr("Authentication")); resize(400, 334); // FIXME: Take html out of this translatable string. - const QString desc = tr( + const QString desc = Git::Tr::tr( "

Gerrit server with HTTP was detected, but you need " "to set up credentials for it.

%1

\n

%2

").arg( - tr("Merge tool is not configured."), - tr("Run git config --global merge.tool <tool> " + Tr::tr("Merge tool is not configured."), + Tr::tr("Run git config --global merge.tool <tool> " "to configure it, then try again."))); m_process.stop(); } else { @@ -234,5 +235,4 @@ void MergeTool::write(const QString &str) VcsOutputWindow::append(str); } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/mergetool.h b/src/plugins/git/mergetool.h index 71e1eb646a8..76adc00f5d0 100644 --- a/src/plugins/git/mergetool.h +++ b/src/plugins/git/mergetool.h @@ -12,13 +12,10 @@ QT_BEGIN_NAMESPACE class QMessageBox; QT_END_NAMESPACE -namespace Git { -namespace Internal { +namespace Git::Internal { class MergeTool : public QObject { - Q_OBJECT - enum FileState { UnknownState, ModifiedState, @@ -62,5 +59,4 @@ private: QString m_unfinishedLine; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/remotedialog.cpp b/src/plugins/git/remotedialog.cpp index b06083a61b1..3c3cdb6640e 100644 --- a/src/plugins/git/remotedialog.cpp +++ b/src/plugins/git/remotedialog.cpp @@ -5,6 +5,7 @@ #include "gitclient.h" #include "gitplugin.h" +#include "gittr.h" #include "remotemodel.h" #include @@ -27,8 +28,7 @@ using namespace Utils; -namespace Git { -namespace Internal { +namespace Git::Internal { // -------------------------------------------------------------------------- // RemoteAdditionDialog: @@ -65,7 +65,7 @@ public: if (m_remoteNames.contains(input)) { if (errorMessage) - *errorMessage = RemoteDialog::tr("A remote with the name \"%1\" already exists.").arg(input); + *errorMessage = Tr::tr("A remote with the name \"%1\" already exists.").arg(input); return false; } @@ -81,7 +81,7 @@ public: const GitRemote r(edit->text()); if (!r.isValid && errorMessage) - *errorMessage = RemoteDialog::tr("The URL may not be valid."); + *errorMessage = Tr::tr("The URL may not be valid."); return r.isValid; }); @@ -91,8 +91,8 @@ public: using namespace Layouting; Grid { - tr("Name:"), m_nameEdit, br, - tr("URL:"), m_urlEdit, br, + Tr::tr("Name:"), m_nameEdit, br, + Tr::tr("URL:"), m_urlEdit, br, Span(2, buttonBox) }.attachTo(this); @@ -134,11 +134,11 @@ RemoteDialog::RemoteDialog(QWidget *parent) : { setModal(false); setAttribute(Qt::WA_DeleteOnClose, true); // Do not update unnecessarily - setWindowTitle(tr("Remotes")); + setWindowTitle(Tr::tr("Remotes")); m_repositoryLabel = new QLabel; - auto refreshButton = new QPushButton(tr("Re&fresh")); + auto refreshButton = new QPushButton(Tr::tr("Re&fresh")); refreshButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); m_remoteView = new QTreeView; @@ -151,14 +151,14 @@ RemoteDialog::RemoteDialog(QWidget *parent) : m_remoteView->setModel(m_remoteModel); new HeaderViewStretcher(m_remoteView->header(), 1); - m_addButton = new QPushButton(tr("&Add...")); + m_addButton = new QPushButton(Tr::tr("&Add...")); m_addButton->setAutoDefault(false); - m_fetchButton = new QPushButton(tr("F&etch")); + m_fetchButton = new QPushButton(Tr::tr("F&etch")); - m_pushButton = new QPushButton(tr("&Push")); + m_pushButton = new QPushButton(Tr::tr("&Push")); - m_removeButton = new QPushButton(tr("&Remove")); + m_removeButton = new QPushButton(Tr::tr("&Remove")); m_removeButton->setAutoDefault(false); auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); @@ -169,7 +169,7 @@ RemoteDialog::RemoteDialog(QWidget *parent) : Row { m_repositoryLabel, refreshButton } }, Group { - title(tr("Remotes")), + title(Tr::tr("Remotes")), Column { m_remoteView, Row { st, m_addButton, m_fetchButton, m_pushButton, m_removeButton } @@ -233,8 +233,8 @@ void RemoteDialog::removeRemote() int row = indexList.at(0).row(); const QString remoteName = m_remoteModel->remoteName(row); - if (QMessageBox::question(this, tr("Delete Remote"), - tr("Would you like to delete the remote \"%1\"?").arg(remoteName), + if (QMessageBox::question(this, Tr::tr("Delete Remote"), + Tr::tr("Would you like to delete the remote \"%1\"?").arg(remoteName), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { m_remoteModel->removeRemote(row); @@ -274,5 +274,4 @@ void RemoteDialog::updateButtonState() m_removeButton->setEnabled(haveSelection); } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/remotedialog.h b/src/plugins/git/remotedialog.h index 9475405c7b2..20365f9b25d 100644 --- a/src/plugins/git/remotedialog.h +++ b/src/plugins/git/remotedialog.h @@ -12,15 +12,12 @@ QT_END_NAMESPACE namespace Utils { class FilePath; } -namespace Git { -namespace Internal { +namespace Git::Internal { class RemoteModel; class RemoteDialog : public QDialog { - Q_OBJECT - public: explicit RemoteDialog(QWidget *parent = nullptr); ~RemoteDialog() override; @@ -46,5 +43,4 @@ private: QPushButton *m_removeButton; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/remotemodel.cpp b/src/plugins/git/remotemodel.cpp index 1ba984ec5db..8129c8893fe 100644 --- a/src/plugins/git/remotemodel.cpp +++ b/src/plugins/git/remotemodel.cpp @@ -2,16 +2,16 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "remotemodel.h" + #include "gitclient.h" +#include "gittr.h" #include using namespace Utils; -namespace Git { -namespace Internal { +namespace Git::Internal { -// ------ RemoteModel RemoteModel::RemoteModel(QObject *parent) : QAbstractTableModel(parent) { } @@ -120,7 +120,7 @@ QVariant RemoteModel::headerData(int section, Qt::Orientation orientation, int r if (role != Qt::DisplayRole || orientation != Qt::Horizontal) return QVariant(); - return (section == 0) ? tr("Name") : tr("URL"); + return (section == 0) ? Tr::tr("Name") : Tr::tr("URL"); } bool RemoteModel::setData(const QModelIndex &index, const QVariant &value, int role) @@ -190,6 +190,5 @@ int RemoteModel::findRemoteByName(const QString &name) const return -1; } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/remotemodel.h b/src/plugins/git/remotemodel.h index 35d1d386e9d..61428849451 100644 --- a/src/plugins/git/remotemodel.h +++ b/src/plugins/git/remotemodel.h @@ -9,12 +9,12 @@ #include #include -namespace Git { -namespace Internal { +namespace Git::Internal { class RemoteModel : public QAbstractTableModel { Q_OBJECT + public: explicit RemoteModel(QObject *parent = nullptr); @@ -62,5 +62,4 @@ private: RemoteList m_remotes; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/stashdialog.cpp b/src/plugins/git/stashdialog.cpp index 835e3f3598b..12692b01b0d 100644 --- a/src/plugins/git/stashdialog.cpp +++ b/src/plugins/git/stashdialog.cpp @@ -5,6 +5,7 @@ #include "gitclient.h" #include "gitplugin.h" +#include "gittr.h" #include "gitutils.h" #include @@ -63,9 +64,7 @@ private: StashModel::StashModel(QObject *parent) : QStandardItemModel(0, ColumnCount, parent) { - QStringList headers; - headers << StashDialog::tr("Name") << StashDialog::tr("Branch") << StashDialog::tr("Message"); - setHorizontalHeaderLabels(headers); + setHorizontalHeaderLabels({Tr::tr("Name"), Tr::tr("Branch"), Tr::tr("Message")}); } void StashModel::setStashes(const QList &stashes) @@ -81,16 +80,16 @@ void StashModel::setStashes(const QList &stashes) StashDialog::StashDialog(QWidget *parent) : QDialog(parent), m_model(new StashModel), m_proxyModel(new QSortFilterProxyModel), - m_deleteAllButton(new QPushButton(tr("Delete &All..."))), - m_deleteSelectionButton(new QPushButton(tr("&Delete..."))), - m_showCurrentButton(new QPushButton(tr("&Show"))), - m_restoreCurrentButton(new QPushButton(tr("R&estore..."))), + m_deleteAllButton(new QPushButton(Tr::tr("Delete &All..."))), + m_deleteSelectionButton(new QPushButton(Tr::tr("&Delete..."))), + m_showCurrentButton(new QPushButton(Tr::tr("&Show"))), + m_restoreCurrentButton(new QPushButton(Tr::tr("R&estore..."))), //: Restore a git stash to new branch to be created - m_restoreCurrentInBranchButton(new QPushButton(tr("Restore to &Branch..."))), - m_refreshButton(new QPushButton(tr("Re&fresh"))) + m_restoreCurrentInBranchButton(new QPushButton(Tr::tr("Restore to &Branch..."))), + m_refreshButton(new QPushButton(Tr::tr("Re&fresh"))) { setAttribute(Qt::WA_DeleteOnClose, true); // Do not update unnecessarily - setWindowTitle(tr("Stashes")); + setWindowTitle(Tr::tr("Stashes")); resize(599, 485); @@ -184,8 +183,8 @@ void StashDialog::refresh(const FilePath &repository, bool force) void StashDialog::deleteAll() { - const QString title = tr("Delete Stashes"); - if (!ask(title, tr("Do you want to delete all stashes?"))) + const QString title = Tr::tr("Delete Stashes"); + if (!ask(title, Tr::tr("Do you want to delete all stashes?"))) return; QString errorMessage; if (GitClient::instance()->synchronousStashRemove(m_repository, QString(), &errorMessage)) @@ -198,8 +197,8 @@ void StashDialog::deleteSelection() { const QList rows = selectedRows(); QTC_ASSERT(!rows.isEmpty(), return); - const QString title = tr("Delete Stashes"); - if (!ask(title, tr("Do you want to delete %n stash(es)?", nullptr, rows.size()))) + const QString title = Tr::tr("Delete Stashes"); + if (!ask(title, Tr::tr("Do you want to delete %n stash(es)?", nullptr, rows.size()))) return; QString errorMessage; QStringList errors; @@ -252,12 +251,12 @@ static inline QString nextStash(const QString &stash) StashDialog::ModifiedRepositoryAction StashDialog::promptModifiedRepository(const QString &stash) { QMessageBox box(QMessageBox::Question, - tr("Repository Modified"), - tr("%1 cannot be restored since the repository is modified.\n" + Tr::tr("Repository Modified"), + Tr::tr("%1 cannot be restored since the repository is modified.\n" "You can choose between stashing the changes or discarding them.").arg(stash), QMessageBox::Cancel, this); - QPushButton *stashButton = box.addButton(tr("Stash"), QMessageBox::AcceptRole); - QPushButton *discardButton = box.addButton(tr("Discard"), QMessageBox::AcceptRole); + QPushButton *stashButton = box.addButton(Tr::tr("Stash"), QMessageBox::AcceptRole); + QPushButton *discardButton = box.addButton(Tr::tr("Discard"), QMessageBox::AcceptRole); box.exec(); const QAbstractButton *clickedButton = box.clickedButton(); if (clickedButton == stashButton) @@ -307,19 +306,19 @@ bool StashDialog::promptForRestore(QString *stash, // Prompt for branch or just ask. if (branch) { *branch = stashRestoreDefaultBranch(*stash); - if (!inputText(this, tr("Restore Stash to Branch"), tr("Branch:"), branch) + if (!inputText(this, Tr::tr("Restore Stash to Branch"), Tr::tr("Branch:"), branch) || branch->isEmpty()) return false; } else { - if (!modifiedPromptShown && !ask(tr("Stash Restore"), tr("Would you like to restore %1?").arg(stashIn))) + if (!modifiedPromptShown && !ask(Tr::tr("Stash Restore"), Tr::tr("Would you like to restore %1?").arg(stashIn))) return false; } return true; } -static inline QString msgRestoreFailedTitle(const QString &stash) +static QString msgRestoreFailedTitle(const QString &stash) { - return StashDialog::tr("Error restoring %1").arg(stash); + return Tr::tr("Error restoring %1").arg(stash); } void StashDialog::restoreCurrent() diff --git a/src/plugins/git/stashdialog.h b/src/plugins/git/stashdialog.h index b21249798c5..49c2833b1b6 100644 --- a/src/plugins/git/stashdialog.h +++ b/src/plugins/git/stashdialog.h @@ -15,8 +15,7 @@ QT_END_NAMESPACE namespace Utils { class TreeView; } -namespace Git { -namespace Internal { +namespace Git::Internal { class StashModel; @@ -27,8 +26,6 @@ class StashModel; class StashDialog : public QDialog { - Q_OBJECT - public: explicit StashDialog(QWidget *parent = nullptr); ~StashDialog() override; @@ -72,5 +69,4 @@ private: Utils::TreeView *m_stashView; }; -} // namespace Internal -} // namespace Git +} // Git::Internal From fc72461b3d7b5b6c58b33b17dab0800111136107 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 6 Oct 2022 09:03:32 +0200 Subject: [PATCH 053/104] Meson: Inline toolssettingswidget.ui Change-Id: Iaacc703195fe66200fe64a95f704ba90b7e66504 Reviewed-by: Alessandro Portale --- .../mesonprojectmanager/CMakeLists.txt | 1 - .../mesonprojectmanager.qbs | 1 - .../settings/tools/toolsmodel.h | 1 - .../settings/tools/toolssettingswidget.cpp | 90 ++++++++++++------ .../settings/tools/toolssettingswidget.h | 17 ++-- .../settings/tools/toolssettingswidget.ui | 93 ------------------- 6 files changed, 70 insertions(+), 133 deletions(-) delete mode 100644 src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.ui diff --git a/src/plugins/mesonprojectmanager/CMakeLists.txt b/src/plugins/mesonprojectmanager/CMakeLists.txt index afc73cbb9df..3e2a55dfe54 100644 --- a/src/plugins/mesonprojectmanager/CMakeLists.txt +++ b/src/plugins/mesonprojectmanager/CMakeLists.txt @@ -10,7 +10,6 @@ add_qtc_plugin(MesonProjectManager mesonactionsmanager/mesonactionsmanager.cpp settings/tools/toolsmodel.cpp settings/tools/toolssettingswidget.h - settings/tools/toolssettingswidget.ui settings/tools/toolssettingswidget.cpp settings/tools/toolssettingspage.cpp settings/tools/toolssettingspage.h diff --git a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs index 1749a697bb9..bc7e9361947 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs +++ b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs @@ -96,7 +96,6 @@ Project { "settings/tools/toolssettingspage.h", "settings/tools/toolssettingswidget.cpp", "settings/tools/toolssettingswidget.h", - "settings/tools/toolssettingswidget.ui", "settings/tools/tooltreeitem.cpp", "settings/tools/tooltreeitem.h", "versionhelper.h", diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolsmodel.h b/src/plugins/mesonprojectmanager/settings/tools/toolsmodel.h index 29d5d720efd..0e13a234f28 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/toolsmodel.h +++ b/src/plugins/mesonprojectmanager/settings/tools/toolsmodel.h @@ -4,7 +4,6 @@ #pragma once #include "exewrappers/mesontools.h" -#include "toolssettingspage.h" #include diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.cpp b/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.cpp index 65bee591d53..e7bda909709 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.cpp +++ b/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.cpp @@ -5,47 +5,80 @@ #include "toolsmodel.h" #include "tooltreeitem.h" -#include "ui_toolssettingswidget.h" -namespace MesonProjectManager { -namespace Internal { +#include +#include + +#include +#include +#include + +using namespace Utils; + +namespace MesonProjectManager::Internal { ToolsSettingsWidget::ToolsSettingsWidget() : Core::IOptionsPageWidget() - , ui(new Ui::ToolsSettingsWidget) { - ui->setupUi(this); - ui->mesonDetails->setState(Utils::DetailsWidget::NoSummary); - ui->mesonDetails->setVisible(false); + m_mesonList = new QTreeView; + m_mesonList->setModel(&m_model); + m_mesonList->expandAll(); + m_mesonList->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); + m_mesonList->header()->setSectionResizeMode(1, QHeaderView::Stretch); + m_itemSettings = new ToolItemSettings; - ui->mesonDetails->setWidget(m_itemSettings); - ui->mesonList->setModel(&m_model); - ui->mesonList->expandAll(); - ui->mesonList->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); - ui->mesonList->header()->setSectionResizeMode(1, QHeaderView::Stretch); + m_mesonDetails = new DetailsWidget; + m_mesonDetails->setState(DetailsWidget::NoSummary); + m_mesonDetails->setVisible(false); + m_mesonDetails->setWidget(m_itemSettings); - connect(ui->mesonList->selectionModel(), - &QItemSelectionModel::currentChanged, - this, - &ToolsSettingsWidget::currentMesonToolChanged); + auto addButton = new QPushButton(tr("Add")); + + m_cloneButton = new QPushButton(tr("Clone")); + m_cloneButton->setEnabled(false); + + m_removeButton = new QPushButton(tr("Remove")); + m_removeButton->setEnabled(false); + + auto makeDefaultButton = new QPushButton(tr("Make Default")); + makeDefaultButton->setEnabled(false); + makeDefaultButton->setVisible(false); + makeDefaultButton->setToolTip(tr("Set as the default Meson executable to use " + "when creating a new kit or when no value is set.")); + + using namespace Layouting; + + Row { + Column { + m_mesonList, + m_mesonDetails + }, + Column { + addButton, + m_cloneButton, + m_removeButton, + makeDefaultButton, + st + } + }.attachTo(this); + + connect(m_mesonList->selectionModel(), &QItemSelectionModel::currentChanged, + this, &ToolsSettingsWidget::currentMesonToolChanged); connect(m_itemSettings, &ToolItemSettings::applyChanges, &m_model, &ToolsModel::updateItem); - connect(ui->addButton, &QPushButton::clicked, &m_model, QOverload<>::of(&ToolsModel::addMesonTool)); - connect(ui->cloneButton, &QPushButton::clicked, this, &ToolsSettingsWidget::cloneMesonTool); - connect(ui->removeButton, &QPushButton::clicked, this, &ToolsSettingsWidget::removeMesonTool); + connect(addButton, &QPushButton::clicked, &m_model, QOverload<>::of(&ToolsModel::addMesonTool)); + connect(m_cloneButton, &QPushButton::clicked, this, &ToolsSettingsWidget::cloneMesonTool); + connect(m_removeButton, &QPushButton::clicked, this, &ToolsSettingsWidget::removeMesonTool); } -ToolsSettingsWidget::~ToolsSettingsWidget() -{ - delete ui; -} +ToolsSettingsWidget::~ToolsSettingsWidget() = default; void ToolsSettingsWidget::cloneMesonTool() { if (m_currentItem) { auto newItem = m_model.cloneMesonTool(m_currentItem); - ui->mesonList->setCurrentIndex(newItem->index()); + m_mesonList->setCurrentIndex(newItem->index()); } } @@ -60,9 +93,9 @@ void ToolsSettingsWidget::currentMesonToolChanged(const QModelIndex &newCurrent) { m_currentItem = m_model.mesoneToolTreeItem(newCurrent); m_itemSettings->load(m_currentItem); - ui->mesonDetails->setVisible(m_currentItem); - ui->cloneButton->setEnabled(m_currentItem); - ui->removeButton->setEnabled(m_currentItem && !m_currentItem->isAutoDetected()); + m_mesonDetails->setVisible(m_currentItem); + m_cloneButton->setEnabled(m_currentItem); + m_removeButton->setEnabled(m_currentItem && !m_currentItem->isAutoDetected()); } void ToolsSettingsWidget::apply() @@ -70,5 +103,4 @@ void ToolsSettingsWidget::apply() m_model.apply(); } -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.h b/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.h index d68c9a7eeb6..f6ef2f28d6f 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.h +++ b/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.h @@ -3,19 +3,16 @@ #pragma once -#include "exewrappers/mesonwrapper.h" #include "toolitemsettings.h" #include "toolsmodel.h" #include #include -#include -namespace MesonProjectManager { -namespace Internal { +namespace Utils { class DetailsWidget; } -namespace Ui { class ToolsSettingsWidget; } +namespace MesonProjectManager::Internal { class ToolTreeItem; class ToolsSettingsWidget final : public Core::IOptionsPageWidget @@ -31,11 +28,15 @@ private: void cloneMesonTool(); void removeMesonTool(); void currentMesonToolChanged(const QModelIndex &newCurrent); - Ui::ToolsSettingsWidget *ui; + ToolsModel m_model; ToolItemSettings *m_itemSettings; ToolTreeItem *m_currentItem = nullptr; + + QTreeView *m_mesonList; + Utils::DetailsWidget *m_mesonDetails; + QPushButton *m_cloneButton; + QPushButton *m_removeButton; }; -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.ui b/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.ui deleted file mode 100644 index 137bfced8f3..00000000000 --- a/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.ui +++ /dev/null @@ -1,93 +0,0 @@ - - - MesonProjectManager::Internal::ToolsSettingsWidget - - - - 0 - 0 - 625 - 349 - - - - - - - - - - - - - - - - - - - Add - - - - - - - false - - - Clone - - - - - - - false - - - Remove - - - - - - - false - - - Set as the default Meson executable to use when creating a new kit or when no value is set. - - - Make Default - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - Utils::DetailsWidget - QWidget -
utils/detailswidget.h
- 1 -
-
- - -
From 98c4e342f880a5e21a321b8164ab1e98f5b0fde4 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 14:39:49 +0200 Subject: [PATCH 054/104] RunFlags: Group flags into QtcProcess related Some flags directly relate to QtcProcess setup. Group them together. Reorder other flags to keep related next to each other. Modify some descriptions. Change-Id: I8694fb5ca0edd7e770a084d7d1d890d48a13a347 Reviewed-by: Orgad Shaneh --- src/plugins/vcsbase/vcsenums.h | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/plugins/vcsbase/vcsenums.h b/src/plugins/vcsbase/vcsenums.h index 1ae5e2735dd..e6addf9b9b0 100644 --- a/src/plugins/vcsbase/vcsenums.h +++ b/src/plugins/vcsbase/vcsenums.h @@ -8,18 +8,21 @@ namespace VcsBase { enum class RunFlags { - None = 0, // Empty - ShowStdOut = (1 << 0), // Show standard output. - MergeOutputChannels = (1 << 1), // See QProcess: Merge stderr/stdout. - SuppressStdErr = (1 << 2), // Suppress standard error output. - SuppressFailMessage = (1 << 3), // No message about command failure. - SuppressCommandLogging = (1 << 4), // No command log entry. - ShowSuccessMessage = (1 << 5), // Show message about successful completion of command. - ForceCLocale = (1 << 6), // Force C-locale for commands whose output is parsed. - SilentOutput = (1 << 7), // Suppress user notifications about the output happening. - UseEventLoop = (1 << 8), // Use event loop when executed in UI thread. + None = 0, // Empty. + // QtcProcess related + MergeOutputChannels = (1 << 0), // See QProcess::ProcessChannelMode::MergedChannels. + ForceCLocale = (1 << 1), // Force C-locale, sets LANG and LANGUAGE env vars to "C". + UseEventLoop = (1 << 2), // Use event loop when executed in UI thread with + // runBlocking(). + // Decorator related + SuppressStdErr = (1 << 3), // Suppress standard error output. + SuppressFailMessage = (1 << 4), // No message about command failure. + SuppressCommandLogging = (1 << 5), // No starting command log entry. + ShowSuccessMessage = (1 << 6), // Show message about successful completion of command. + ShowStdOut = (1 << 7), // Show standard output. + SilentOutput = (1 << 8), // Only when ShowStdOut is set to true, outputs silently. ExpectRepoChanges = (1 << 9), // Expect changes in repository by the command - NoOutput = SuppressStdErr | SuppressFailMessage | SuppressCommandLogging + NoOutput = SuppressStdErr | SuppressFailMessage | SuppressCommandLogging }; inline void VCSBASE_EXPORT operator|=(RunFlags &p, RunFlags r) From 363731a8c8471dce6f45dc0571e450086b464ec6 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 15:06:09 +0200 Subject: [PATCH 055/104] RunFlags: Add ProgressiveOutput flag It replaces VcsCommand::setProgressiveOutput() property. Change-Id: Icebd2205a5b489f60ded1eeee21e2deacbfde1fe Reviewed-by: Orgad Shaneh --- src/plugins/gitlab/gitlabclonedialog.cpp | 2 +- src/plugins/vcsbase/vcscommand.cpp | 18 +++++---------- src/plugins/vcsbase/vcscommand.h | 1 - src/plugins/vcsbase/vcsenums.h | 23 ++++++++++--------- src/plugins/vcsbase/wizard/vcscommandpage.cpp | 10 ++++---- 5 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/plugins/gitlab/gitlabclonedialog.cpp b/src/plugins/gitlab/gitlabclonedialog.cpp index 2ac647aade0..669a587c14e 100644 --- a/src/plugins/gitlab/gitlabclonedialog.cpp +++ b/src/plugins/gitlab/gitlabclonedialog.cpp @@ -138,7 +138,7 @@ void GitLabCloneDialog::cloneProject() m_pathChooser->absoluteFilePath(), m_directoryLE->text(), extraArgs); const FilePath workingDirectory = m_pathChooser->absoluteFilePath(); - m_command->setProgressiveOutput(true); + m_command->addFlags(RunFlags::ProgressiveOutput); connect(m_command, &VcsCommand::stdOutText, this, [this](const QString &text) { m_cloneOutput->appendPlainText(text); }); diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index 7a8a15a1b6c..b7097c873dc 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -110,8 +110,6 @@ public: QFutureInterface m_futureInterface; RunFlags m_flags = RunFlags::None; - - bool m_progressiveOutput = false; }; QString VcsCommandPrivate::displayName() const @@ -184,19 +182,20 @@ void VcsCommandPrivate::setupProcess(QtcProcess *process, const Job &job) void VcsCommandPrivate::installStdCallbacks(QtcProcess *process) { - if (!(m_flags & RunFlags::MergeOutputChannels) - && (m_progressiveOutput || !(m_flags & RunFlags::SuppressStdErr))) { + if (!(m_flags & RunFlags::MergeOutputChannels) && (m_flags & RunFlags::ProgressiveOutput + || !(m_flags & RunFlags::SuppressStdErr))) { process->setStdErrCallback([this](const QString &text) { if (m_progressParser) m_progressParser->parseProgress(text); if (!(m_flags & RunFlags::SuppressStdErr)) emit q->appendError(text); - if (m_progressiveOutput) + if (m_flags & RunFlags::ProgressiveOutput) emit q->stdErrText(text); }); } // connect stdout to the output window if desired - if (m_progressParser || m_progressiveOutput || (m_flags & RunFlags::ShowStdOut)) { + if (m_progressParser || m_flags & RunFlags::ProgressiveOutput + || m_flags & RunFlags::ShowStdOut) { process->setStdOutCallback([this](const QString &text) { if (m_progressParser) m_progressParser->parseProgress(text); @@ -206,7 +205,7 @@ void VcsCommandPrivate::installStdCallbacks(QtcProcess *process) else emit q->append(text); } - if (m_progressiveOutput) + if (m_flags & RunFlags::ProgressiveOutput) emit q->stdOutText(text); }); } @@ -422,11 +421,6 @@ void VcsCommand::setProgressParser(ProgressParser *parser) d->m_progressParser = parser; } -void VcsCommand::setProgressiveOutput(bool progressive) -{ - d->m_progressiveOutput = progressive; -} - ProgressParser::ProgressParser() : m_futureMutex(new QMutex) { } diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h index fb3a2a499a9..f26cf53f963 100644 --- a/src/plugins/vcsbase/vcscommand.h +++ b/src/plugins/vcsbase/vcscommand.h @@ -97,7 +97,6 @@ public: void setCodec(QTextCodec *codec); void setProgressParser(ProgressParser *parser); - void setProgressiveOutput(bool progressive); static CommandResult runBlocking(const Utils::FilePath &workingDirectory, const Utils::Environment &environmentconst, diff --git a/src/plugins/vcsbase/vcsenums.h b/src/plugins/vcsbase/vcsenums.h index e6addf9b9b0..16037af04ad 100644 --- a/src/plugins/vcsbase/vcsenums.h +++ b/src/plugins/vcsbase/vcsenums.h @@ -10,18 +10,19 @@ namespace VcsBase { enum class RunFlags { None = 0, // Empty. // QtcProcess related - MergeOutputChannels = (1 << 0), // See QProcess::ProcessChannelMode::MergedChannels. - ForceCLocale = (1 << 1), // Force C-locale, sets LANG and LANGUAGE env vars to "C". - UseEventLoop = (1 << 2), // Use event loop when executed in UI thread with - // runBlocking(). + MergeOutputChannels = (1 << 0), // See QProcess::ProcessChannelMode::MergedChannels. + ForceCLocale = (1 << 1), // Force C-locale, sets LANG and LANGUAGE env vars to "C". + UseEventLoop = (1 << 2), // Use event loop when executed in UI thread with + // runBlocking(). // Decorator related - SuppressStdErr = (1 << 3), // Suppress standard error output. - SuppressFailMessage = (1 << 4), // No message about command failure. - SuppressCommandLogging = (1 << 5), // No starting command log entry. - ShowSuccessMessage = (1 << 6), // Show message about successful completion of command. - ShowStdOut = (1 << 7), // Show standard output. - SilentOutput = (1 << 8), // Only when ShowStdOut is set to true, outputs silently. - ExpectRepoChanges = (1 << 9), // Expect changes in repository by the command + SuppressStdErr = (1 << 3), // Suppress standard error output. + SuppressFailMessage = (1 << 4), // No message about command failure. + SuppressCommandLogging = (1 << 5), // No starting command log entry. + ShowSuccessMessage = (1 << 6), // Show message about successful completion of command. + ShowStdOut = (1 << 7), // Show standard output. + SilentOutput = (1 << 8), // Only when ShowStdOut is set to true, outputs silently. + ProgressiveOutput = (1 << 9), // Emit stdOutText() and stdErrText() signals. + ExpectRepoChanges = (1 << 10), // Expect changes in repository by the command. NoOutput = SuppressStdErr | SuppressFailMessage | SuppressCommandLogging }; diff --git a/src/plugins/vcsbase/wizard/vcscommandpage.cpp b/src/plugins/vcsbase/wizard/vcscommandpage.cpp index 4a4a1999b4b..476d2ab0b5d 100644 --- a/src/plugins/vcsbase/wizard/vcscommandpage.cpp +++ b/src/plugins/vcsbase/wizard/vcscommandpage.cpp @@ -358,14 +358,14 @@ void VcsCommandPage::start(VcsCommand *command) QTC_ASSERT(m_state != Running, return); m_command = command; - command->setProgressiveOutput(true); - connect(command, &VcsCommand::stdOutText, this, [this](const QString &text) { + m_command->addFlags(RunFlags::ProgressiveOutput); + connect(m_command, &VcsCommand::stdOutText, this, [this](const QString &text) { m_formatter->appendMessage(text, StdOutFormat); }); - connect(command, &VcsCommand::stdErrText, this, [this](const QString &text) { + connect(m_command, &VcsCommand::stdErrText, this, [this](const QString &text) { m_formatter->appendMessage(text, StdErrFormat); }); - connect(command, &VcsCommand::done, this, [this] { + connect(m_command, &VcsCommand::done, this, [this] { finished(m_command->result() == ProcessResult::FinishedWithSuccess); }); QApplication::setOverrideCursor(Qt::WaitCursor); @@ -374,7 +374,7 @@ void VcsCommandPage::start(VcsCommand *command) m_statusLabel->setText(m_startedStatus); m_statusLabel->setPalette(QPalette()); m_state = Running; - command->start(); + m_command->start(); wizard()->button(QWizard::BackButton)->setEnabled(false); } From db5e3555ac6d6381c70d2616be36be09318e2d72 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 15:33:15 +0200 Subject: [PATCH 056/104] QtcProcess: Add starting() signal Will be useful for VcsCommand controlling. Change-Id: I6e0199c7a45948526cfd916907b098472b78219c Reviewed-by: hjk --- src/libs/utils/qtcprocess.cpp | 8 ++++++++ src/libs/utils/qtcprocess.h | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index a60419b5410..b8a31b2a28a 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -704,6 +704,7 @@ public: void handleDone(const ProcessResultData &data); void clearForRun(); + void emitStarting(); void emitStarted(); void emitDone(); void emitReadyReadStandardOutput(); @@ -1149,6 +1150,7 @@ void QtcProcess::start() // Pass a dynamic property with info about blocking type d->m_process->setProperty(QTC_PROCESS_BLOCKING_TYPE, property(QTC_PROCESS_BLOCKING_TYPE)); } + d->emitStarting(); d->m_process->start(); } @@ -2031,6 +2033,12 @@ void QtcProcessPrivate::handleDone(const ProcessResultData &data) m_applicationMainThreadId = 0; } +void QtcProcessPrivate::emitStarting() +{ + GuardLocker locker(m_guard); + emit q->starting(); +} + void QtcProcessPrivate::emitStarted() { GuardLocker locker(m_guard); diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index 37dcadd2b76..2a131881289 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -177,8 +177,9 @@ public: QString toStandaloneCommandLine() const; signals: - void started(); - void done(); + void starting(); // On NotRunning -> Starting state transition + void started(); // On Starting -> Running state transition + void done(); // On Starting | Running -> NotRunning state transition void readyReadStandardOutput(); void readyReadStandardError(); From 75e5f6084879ba5b1b740b93b0a8538a78315d5b Mon Sep 17 00:00:00 2001 From: Pranta Dastider Date: Fri, 23 Sep 2022 15:41:11 +0200 Subject: [PATCH 057/104] QmlDesigner: Qt Bridge documentation fix Here the documentation mentioning reverse importing assets from Qt Design Studio to external UI design tools were removed to make the information relevant and less misleading considering the current state. Fixes: QDS-7708 Change-Id: Ifc484af4c95b82f01ca9f74cc7dba529bd7eaa61 Reviewed-by: Leena Miettinen --- ...tdesignstudio-exporting-and-importing.qdoc | 36 +++++-------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/doc/qtdesignstudio/src/qtdesignstudio-exporting-and-importing.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-exporting-and-importing.qdoc index 986bdfafbe1..1b67beafef4 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-exporting-and-importing.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-exporting-and-importing.qdoc @@ -30,35 +30,24 @@ \title Asset Creation with Other Tools - Typically, you as a designer would design a UI using imaging and design - tools, such as Adobe Photoshop, Sketch, Figma, Blender, or Maya, and then - send your design to a developer for implementation. You can use the \QB - export tool to convert 2D assets into a metadata format supported by \QDS. - You can use the export functionality of 3D graphics tools to save your 3D - assets in a format that can be imported into \QDS. + Typically, you as a designer would like to use specialized UI design tools, + such as Adobe Photoshop, Sketch, Figma, Blender, or Maya, and then send the + design to a developer for functionality implementation. Here you can use the + \QB export tool to convert 2D or 3D assets for \QDS. - You can import the 2D and 3D assets into \QDS for editing before you - submit the UI to the developer for adding the functionality to the + You can import the assets into \QDS. There you can also edit them more if needed. You + can then submit the UI to the developer for adding further functionality to the application. - If you want to make further changes to your components in the design tool, - you can export the UI files back into the metadata format, which you can - then import back into the design tool by using \QB. For example, you could - create components in a design tool and export them to \QDS before you start - making instances of them. In \QDS, you can add functionality to the - components, such as button states and then bring them back to the design - tool as assets. If you use functional \QDS components in the design tool, - you will find it easier to merge new iterations of the design to \QDS and - continue to build the components there. - - The following image describes the workflow using \QBPS and \QDS: + The following image describes the workflow in a basic way using \QBPS and \QDS: \image studio-workflow.png The workflow consists of the following steps: \list 1 - \li Export your design from a design tool into the metadata format. + \li Export your design from a design tool into a metadata + format supported by \QDS. \li \l{Creating Projects}{Create a project} in \QDS and import the metadata file to it. \li Edit the imported components and create more components in @@ -68,9 +57,6 @@ \li Create interactions in \l States and \l {Connections}. \li \l{Validating with Target Hardware}{Preview} your design in real time, on the desktop or on a mobile or an embedded device. - \li Optionally, export your components back into the metadata format - that you can import back into the design tool by using \QB. You - can continue to iterate your design this way until it is ready. \endlist For more information, watch a video that shows how to perform the tasks @@ -87,9 +73,5 @@ Import assets that you exported from design tools to a \QDS project and edit them in the \uicontrol Design mode to create a UI. - \li \l {Exporting Components} - - Export UI files (.ui.qml) back to the metadata format and PNG assets - to generate native file formats in design tools using \QB. \endlist */ From 47e5997e57af2f17c599d0c67c5801c0c042e7fd Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 6 Oct 2022 13:08:30 +0200 Subject: [PATCH 058/104] Mercurial: Convert to Tr::tr Change-Id: I2a6ecd17091ffa0100f982848afbf941c6997db7 Reviewed-by: Alessandro Portale --- share/qtcreator/translations/qtcreator_cs.ts | 53 +------------ share/qtcreator/translations/qtcreator_da.ts | 43 +---------- share/qtcreator/translations/qtcreator_de.ts | 34 +-------- share/qtcreator/translations/qtcreator_fr.ts | 53 +------------ share/qtcreator/translations/qtcreator_hr.ts | 39 +--------- share/qtcreator/translations/qtcreator_ja.ts | 49 +----------- share/qtcreator/translations/qtcreator_pl.ts | 39 ++-------- share/qtcreator/translations/qtcreator_ru.ts | 37 +-------- share/qtcreator/translations/qtcreator_sl.ts | 46 +----------- share/qtcreator/translations/qtcreator_uk.ts | 57 +------------- .../qtcreator/translations/qtcreator_zh_CN.ts | 46 +----------- .../qtcreator/translations/qtcreator_zh_TW.ts | 43 +---------- .../mercurial/annotationhighlighter.cpp | 6 +- src/plugins/mercurial/annotationhighlighter.h | 7 +- .../mercurial/authenticationdialog.cpp | 6 +- src/plugins/mercurial/authenticationdialog.h | 2 - src/plugins/mercurial/commiteditor.cpp | 16 ++-- src/plugins/mercurial/commiteditor.h | 12 ++- src/plugins/mercurial/constants.h | 6 +- src/plugins/mercurial/mercurialclient.cpp | 22 +++--- src/plugins/mercurial/mercurialclient.h | 6 +- .../mercurial/mercurialcommitwidget.cpp | 29 +++---- src/plugins/mercurial/mercurialeditor.cpp | 13 ++-- src/plugins/mercurial/mercurialeditor.h | 7 +- src/plugins/mercurial/mercurialplugin.cpp | 75 +++++++++---------- src/plugins/mercurial/mercurialplugin.h | 6 +- src/plugins/mercurial/mercurialsettings.cpp | 27 ++++--- src/plugins/mercurial/mercurialsettings.h | 12 +-- src/plugins/mercurial/revertdialog.cpp | 8 +- src/plugins/mercurial/revertdialog.h | 2 - src/plugins/mercurial/srcdestdialog.cpp | 14 ++-- src/plugins/mercurial/srcdestdialog.h | 2 - 32 files changed, 163 insertions(+), 654 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_cs.ts b/share/qtcreator/translations/qtcreator_cs.ts index 6fa44c2b0a6..d4274350844 100644 --- a/share/qtcreator/translations/qtcreator_cs.ts +++ b/share/qtcreator/translations/qtcreator_cs.ts @@ -21107,7 +21107,7 @@ Můžete si vybrat mezi odložením změn nebo jejich vyhozením. - Mercurial::Internal::MercurialCommitPanel + Mercurial General Information Obecné informace @@ -21140,9 +21140,6 @@ Můžete si vybrat mezi odložením změn nebo jejich vyhozením. Email: E-mailová adresa: - - - Mercurial::Internal::OptionsPage Form Formulář @@ -21199,17 +21196,10 @@ Můžete si vybrat mezi odložením změn nebo jejich vyhozením. Prompt on submit Ptát se na potvrzení - - Mercurial - Mercurial - The number of recent commit logs to show, choose 0 to see all entries. Počet nedávných záznamů které se vypisují v historii změn. Při volbě 0 budou vidět všechny záznamy. - - - Mercurial::Internal::RevertDialog Revert Vrátit @@ -21222,9 +21212,6 @@ Můžete si vybrat mezi odložením změn nebo jejich vyhozením. Revision: Revize: - - - Mercurial::Internal::SrcDestDialog Dialog Dialog @@ -24663,7 +24650,7 @@ Proces Pdb po určité době od úspěšného spuštění spadl. - Mercurial::Internal::CloneWizard + Mercurial Cloning Klonování @@ -24680,9 +24667,6 @@ Proces Pdb po určité době od úspěšného spuštění spadl. Mercurial Clone Klon Mercurialu - - - Mercurial::Internal::CloneWizardPage Location Umístění @@ -24695,16 +24679,10 @@ Proces Pdb po určité době od úspěšného spuštění spadl. Clone URL: Klonovat z adresy (URL): - - - Mercurial::Internal::CommitEditor Commit Editor Editor zápisu (commit) - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 Nadřazenou revizi %1 ve skladišti %2 se nepodařilo určit: %3 @@ -24737,16 +24715,6 @@ Proces Pdb po určité době od úspěšného spuštění spadl. Working... Pracuje... - - - Mercurial::Internal::MercurialControl - - Mercurial - Mercurial - - - - Mercurial::Internal::MercurialEditor Annotate %1 Vypsat anotace pro %1 @@ -24755,9 +24723,6 @@ Proces Pdb po určité době od úspěšného spuštění spadl. Annotate parent revision %1 Vypsat anotace nadřazené revize "%1" - - - Mercurial::Internal::MercurialJobRunner Executing: %1 %2 @@ -24772,9 +24737,6 @@ Proces Pdb po určité době od úspěšného spuštění spadl. Timed out after %1s waiting for mercurial process to finish. Překročení času %1s při čekání na ukončení Procesu Mercurialu. - - - Mercurial::Internal::MercurialPlugin Mercurial Mercurial @@ -24991,9 +24953,6 @@ Proces Pdb po určité době od úspěšného spuštění spadl. Message check failed. Do you want to proceed? Ověření popisu se nezdařilo. Přesto chcete pokračovat? - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Příkaz 'Mercurial' @@ -35134,7 +35093,7 @@ když bude zavolán mimo git bash. - Mercurial::Internal::MercurialDiffParameterWidget + Mercurial Ignore whitespace Nevšímat si bílých znaků @@ -55320,11 +55279,7 @@ Lze používat části jmen, pokud jsou jednoznačné. - Mercurial::Internal::AuthenticationDialog - - Dialog - Dialog - + Mercurial User name: Uživatelské jméno: diff --git a/share/qtcreator/translations/qtcreator_da.ts b/share/qtcreator/translations/qtcreator_da.ts index d37a777ea3a..23ed9c91805 100644 --- a/share/qtcreator/translations/qtcreator_da.ts +++ b/share/qtcreator/translations/qtcreator_da.ts @@ -20641,7 +20641,7 @@ Fejl: %5 - Mercurial::Internal::AuthenticationDialog + Mercurial Dialog Dialog @@ -20654,16 +20654,10 @@ Fejl: %5 Password: Adgangskode: - - - Mercurial::Internal::CommitEditor Commit Editor Commit-redigering - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 Kunne ikke finde forælder revisioner af %1 i %2: %3 @@ -20680,9 +20674,6 @@ Fejl: %5 Hg outgoing %1 Hg udgående %1 - - - Mercurial::Internal::MercurialCommitPanel General Information Generel information @@ -20715,16 +20706,10 @@ Fejl: %5 Email: E-mail: - - - Mercurial::Internal::MercurialControl Mercurial Mercurial - - - Mercurial::Internal::MercurialDiffConfig Ignore Whitespace Ignorer blanktegn @@ -20733,9 +20718,6 @@ Fejl: %5 Ignore Blank Lines Ignorer tomme linjer - - - Mercurial::Internal::MercurialEditorWidget &Annotate %1 &Annotate %1 @@ -20744,9 +20726,6 @@ Fejl: %5 Annotate &parent revision %1 Annotate &forælder revision %1 - - - Mercurial::Internal::MercurialPlugin Me&rcurial Me&rcurial @@ -20943,9 +20922,6 @@ Fejl: %5 Message check failed. Do you want to proceed? Meddelelsestjek mislykkedes. Vil du fortsætte? - - - Mercurial::Internal::OptionsPage Configuration Konfiguration @@ -20994,20 +20970,10 @@ Fejl: %5 Log count: Log antal: - - Mercurial - Mercurial - - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Mercurial-kommando - - - Mercurial::Internal::RevertDialog Revert Tilbagefør @@ -21020,13 +20986,6 @@ Fejl: %5 Revision: Revision: - - - Mercurial::Internal::SrcDestDialog - - Dialog - Dialog - Default Location Standard placering diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index e67d8ec8351..d1ef5e2ff29 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -8638,7 +8638,7 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen. - Mercurial::Internal::MercurialCommitPanel + Mercurial General Information Allgemeine Informationen @@ -8671,9 +8671,6 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Email: E-Mail-Adresse: - - - Mercurial::Internal::OptionsPage Configuration Konfiguration @@ -8722,9 +8719,6 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.The number of recent commit logs to show, choose 0 to see all entries. Zahl der anzuzeigenden Logeinträge, 0 für unbegrenzt. - - - Mercurial::Internal::RevertDialog Revert Rückgängig machen @@ -8737,9 +8731,6 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Revision: Revision: - - - Mercurial::Internal::SrcDestDialog Dialog Dialog @@ -9185,14 +9176,11 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen. - Mercurial::Internal::CommitEditor + Mercurial Commit Editor Commit-Editor - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 Die übergeordnete Revision von %1 im Repository %2 konnte nicht bestimmt werden: %3 @@ -9217,9 +9205,6 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Mercurial Diff "%1" Mercurial Diff für "%1" - - - Mercurial::Internal::MercurialPlugin Me&rcurial Me&rcurial @@ -9392,17 +9377,10 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.Mercurial Mercurial - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Ausführbare Datei - - Mercurial - Mercurial - Perforce::Internal::PerforceChecker @@ -23088,11 +23066,7 @@ Teilnamen können verwendet werden, sofern sie eindeutig sind. - Mercurial::Internal::AuthenticationDialog - - Dialog - Dialog - + Mercurial Password: Passwort: @@ -30445,7 +30419,7 @@ Wählt eine für Desktop-Entwicklung geeignete Qt-Version aus, sofern sie verfü - Mercurial::Internal::MercurialEditorWidget + Mercurial &Annotate %1 &Annotate %1 diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index b69d5ba75b8..a04e2d9c68a 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -21302,7 +21302,7 @@ Vous pouvez choisir entre mettre les changements dans une remise ou de les aband - Mercurial::Internal::MercurialCommitPanel + Mercurial General Information Informations générales @@ -21335,9 +21335,6 @@ Vous pouvez choisir entre mettre les changements dans une remise ou de les aband Email: Email : - - - Mercurial::Internal::OptionsPage Form Formulaire @@ -21394,17 +21391,10 @@ Vous pouvez choisir entre mettre les changements dans une remise ou de les aband Prompt on submit Invite lors du submit - - Mercurial - Mercurial - The number of recent commit logs to show, choose 0 to see all entries. Le nombre de logs de commit récents à afficher, 0 pour tout afficher. - - - Mercurial::Internal::RevertDialog Revert Rétablir @@ -21417,9 +21407,6 @@ Vous pouvez choisir entre mettre les changements dans une remise ou de les aband Revision: Révision : - - - Mercurial::Internal::SrcDestDialog Dialog Boîte de dialogue @@ -24738,7 +24725,7 @@ avec un mot de passe, que vous pouvez renseigner ci-dessus. - Mercurial::Internal::CloneWizard + Mercurial Cloning Cloner @@ -24755,9 +24742,6 @@ avec un mot de passe, que vous pouvez renseigner ci-dessus. Mercurial Clone Clone de Mercurial - - - Mercurial::Internal::CloneWizardPage Location Emplacement @@ -24770,16 +24754,10 @@ avec un mot de passe, que vous pouvez renseigner ci-dessus. Clone URL: URL de clone : - - - Mercurial::Internal::CommitEditor Commit Editor Faire un commit de l'éditeur - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 Impossible de trouver la révision parente de %1 dans %2 : %3 @@ -24812,16 +24790,6 @@ avec un mot de passe, que vous pouvez renseigner ci-dessus. Working... Travail en cours... - - - Mercurial::Internal::MercurialControl - - Mercurial - Mercurial - - - - Mercurial::Internal::MercurialEditor Annotate %1 Annoter %1 @@ -24830,9 +24798,6 @@ avec un mot de passe, que vous pouvez renseigner ci-dessus. Annotate parent revision %1 Annoter la révision parente %1 - - - Mercurial::Internal::MercurialJobRunner Executing: %1 %2 @@ -24847,9 +24812,6 @@ avec un mot de passe, que vous pouvez renseigner ci-dessus. Timed out after %1s waiting for mercurial process to finish. Interruption après %1s d'attente que le processus mercurial se termine. - - - Mercurial::Internal::MercurialPlugin Mercurial Mercurial @@ -25066,9 +25028,6 @@ avec un mot de passe, que vous pouvez renseigner ci-dessus. Message check failed. Do you want to proceed? Vérification du message échouée. Voulez-vous continuer ? - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Commande Mercurial @@ -38664,7 +38623,7 @@ These files are preserved. - Mercurial::Internal::MercurialDiffParameterWidget + Mercurial Ignore whitespace Ignorer les espaces @@ -50983,11 +50942,7 @@ Les noms partiels peuvent êtres utilisé s'ils ne sont pas ambigües. - Mercurial::Internal::AuthenticationDialog - - Dialog - Boîte de dialogue - + Mercurial User name: Nom d'utilisateur : diff --git a/share/qtcreator/translations/qtcreator_hr.ts b/share/qtcreator/translations/qtcreator_hr.ts index 9a53446af43..e9ce06e3fe0 100644 --- a/share/qtcreator/translations/qtcreator_hr.ts +++ b/share/qtcreator/translations/qtcreator_hr.ts @@ -5027,7 +5027,7 @@ Greška: %5 - Mercurial::Internal::AuthenticationDialog + Mercurial Dialog Dijalog @@ -5040,9 +5040,6 @@ Greška: %5 Password: Lozinka: - - - Mercurial::Internal::MercurialCommitPanel General Information Opće informacije @@ -5075,9 +5072,6 @@ Greška: %5 Email: E-pošta: - - - Mercurial::Internal::OptionsPage Configuration Konfiguracija @@ -5126,13 +5120,6 @@ Greška: %5 Log count: Broj zapisa: - - Mercurial - Mercurial - - - - Mercurial::Internal::RevertDialog Revert Vrati natrag @@ -5145,13 +5132,6 @@ Greška: %5 Revision: Revizija: - - - Mercurial::Internal::SrcDestDialog - - Dialog - Dijalog - Default Location Zadano mjesto @@ -26913,14 +26893,11 @@ Rok upotrebe: %3 - Mercurial::Internal::CommitEditor + Mercurial Commit Editor - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 @@ -26945,16 +26922,10 @@ Rok upotrebe: %3 Mercurial Diff "%1" - - - Mercurial::Internal::MercurialControl Mercurial - - - Mercurial::Internal::MercurialEditorWidget &Annotate %1 @@ -26963,9 +26934,6 @@ Rok upotrebe: %3 Annotate &parent revision %1 - - - Mercurial::Internal::MercurialPlugin Me&rcurial @@ -27134,9 +27102,6 @@ Rok upotrebe: %3 Commit changes for "%1". - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Mercurial naredba diff --git a/share/qtcreator/translations/qtcreator_ja.ts b/share/qtcreator/translations/qtcreator_ja.ts index cb9da2d5444..080025c14a9 100644 --- a/share/qtcreator/translations/qtcreator_ja.ts +++ b/share/qtcreator/translations/qtcreator_ja.ts @@ -3836,7 +3836,7 @@ Add, modify, and remove document filters, which determine the documentation set - Mercurial::Internal::AuthenticationDialog + Mercurial Dialog ダイアログ @@ -3849,9 +3849,6 @@ Add, modify, and remove document filters, which determine the documentation set Username: ユーザー名: - - - Mercurial::Internal::MercurialCommitPanel General Information 概要 @@ -3884,9 +3881,6 @@ Add, modify, and remove document filters, which determine the documentation set Email: メールアドレス: - - - Mercurial::Internal::OptionsPage Form フォーム @@ -3943,9 +3937,6 @@ Add, modify, and remove document filters, which determine the documentation set Mercurial Mercurial - - - Mercurial::Internal::RevertDialog Revert 元に戻す @@ -3958,13 +3949,6 @@ Add, modify, and remove document filters, which determine the documentation set Revision: リビジョン: - - - Mercurial::Internal::SrcDestDialog - - Dialog - ダイアログ - Default Location 既定のパス @@ -22288,14 +22272,11 @@ instead of its installation directory when run outside git bash. - Mercurial::Internal::CommitEditor + Mercurial Commit Editor コミットエディタ - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 %2 (リビジョン: %1) の親リビジョンが見つかりません: %3 @@ -22320,9 +22301,6 @@ instead of its installation directory when run outside git bash. Mercurial Diff "%1" Mercurial 差分 "%1" - - - Mercurial::Internal::MercurialDiffParameterWidget Ignore Whitespace 空白を無視 @@ -22331,16 +22309,6 @@ instead of its installation directory when run outside git bash. Ignore Blank Lines 空行を無視 - - - Mercurial::Internal::MercurialControl - - Mercurial - Mercurial - - - - Mercurial::Internal::MercurialPlugin Me&rcurial Me&rcurial @@ -22497,10 +22465,6 @@ instead of its installation directory when run outside git bash. Incoming Source サーバーとの差分検出 - - Mercurial - Mercurial - Commit コミット @@ -22541,17 +22505,10 @@ instead of its installation directory when run outside git bash. Message check failed. Do you want to proceed? メッセージチェックに失敗しました。続けて処理しますか? - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Mercurial コマンド - - Mercurial - Mercurial - Perforce::Internal::PerforceChecker @@ -42101,7 +42058,7 @@ Would you like to overwrite it? - Mercurial::Internal::MercurialEditorWidget + Mercurial &Annotate %1 %1 のアノテーション(&A) diff --git a/share/qtcreator/translations/qtcreator_pl.ts b/share/qtcreator/translations/qtcreator_pl.ts index 44c66c74a04..4d075e89137 100644 --- a/share/qtcreator/translations/qtcreator_pl.ts +++ b/share/qtcreator/translations/qtcreator_pl.ts @@ -10126,7 +10126,7 @@ Możesz odłożyć zmiany lub je porzucić. - Mercurial::Internal::MercurialCommitPanel + Mercurial General Information Ogólne informacje @@ -10159,9 +10159,6 @@ Możesz odłożyć zmiany lub je porzucić. Email: E-mail: - - - Mercurial::Internal::OptionsPage Form Formularz @@ -10218,9 +10215,6 @@ Możesz odłożyć zmiany lub je porzucić. The number of recent commit logs to show, choose 0 to see all entries. Liczba ostatnich poprawek, wyświetlanych w logu. Wybierz 0 aby ujrzeć wszystkie zmiany. - - - Mercurial::Internal::RevertDialog Revert Odwróć zmiany @@ -10233,9 +10227,6 @@ Możesz odłożyć zmiany lub je porzucić. Revision: Wersja: - - - Mercurial::Internal::SrcDestDialog Dialog Dialog @@ -11109,14 +11100,11 @@ Dla projektów CMake, upewnij się, że zmienna QML_IMPORT_PATH jest obecna w CM - Mercurial::Internal::CommitEditor + Mercurial Commit Editor Edytor poprawek - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 Nie można odnaleźć macierzystej wersji dla %1 w %2: %3 @@ -11133,16 +11121,6 @@ Dla projektów CMake, upewnij się, że zmienna QML_IMPORT_PATH jest obecna w CM Hg outgoing %1 Hg outgoing %1 - - - Mercurial::Internal::MercurialControl - - Mercurial - Mercurial - - - - Mercurial::Internal::MercurialPlugin Me&rcurial Me&rcurial @@ -11339,9 +11317,6 @@ Dla projektów CMake, upewnij się, że zmienna QML_IMPORT_PATH jest obecna w CM Message check failed. Do you want to proceed? Błąd sprawdzania opisu. Czy kontynuować? - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Komenda Mercurial @@ -23825,11 +23800,7 @@ Można używać nazw częściowych, jeśli są one unikalne. - Mercurial::Internal::AuthenticationDialog - - Dialog - Dialog - + Mercurial Password: Hasło: @@ -32459,7 +32430,7 @@ Use this only if you are prototyping. You cannot create a full application with - Mercurial::Internal::MercurialEditorWidget + Mercurial &Annotate %1 Dołącz &adnotację do %1 @@ -41758,7 +41729,7 @@ Termin wygaśnięcia: %3 - Mercurial::Internal::MercurialDiffConfig + Mercurial Ignore Whitespace Ignoruj białe znaki diff --git a/share/qtcreator/translations/qtcreator_ru.ts b/share/qtcreator/translations/qtcreator_ru.ts index 8512f1b870f..d262e9e999a 100644 --- a/share/qtcreator/translations/qtcreator_ru.ts +++ b/share/qtcreator/translations/qtcreator_ru.ts @@ -26411,11 +26411,7 @@ Error: %5 - Mercurial::Internal::AuthenticationDialog - - Dialog - - + Mercurial Password: Пароль: @@ -26424,16 +26420,10 @@ Error: %5 Username: Имя пользователя: - - - Mercurial::Internal::CommitEditor Commit Editor Редактор фиксаций - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 Не удалось найти родительскую ревизию для %1 в %2: %3 @@ -26458,9 +26448,6 @@ Error: %5 Mercurial Diff "%1" Сравнение Mercurial «%1» - - - Mercurial::Internal::MercurialCommitPanel General Information Основная информация @@ -26493,9 +26480,6 @@ Error: %5 Email: Email: - - - Mercurial::Internal::MercurialEditorWidget &Annotate %1 &Аннотация %1 @@ -26504,9 +26488,6 @@ Error: %5 Annotate &parent revision %1 Аннотация &родительской ревизии %1 - - - Mercurial::Internal::MercurialPlugin Me&rcurial Me&rcurial @@ -26679,9 +26660,6 @@ Error: %5 Mercurial Mercurial - - - Mercurial::Internal::OptionsPage Configuration Настройка @@ -26731,20 +26709,10 @@ Error: %5 Количество отображаемых последних сообщений о фиксации, выберите 0, чтобы видеть все. - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Команда Mercurial - - Mercurial - Mercurial - - - - Mercurial::Internal::RevertDialog Revert Откатить @@ -26757,9 +26725,6 @@ Error: %5 Revision: Ревизия: - - - Mercurial::Internal::SrcDestDialog Dialog Диалог diff --git a/share/qtcreator/translations/qtcreator_sl.ts b/share/qtcreator/translations/qtcreator_sl.ts index e58c95cb9ef..a73fc184003 100644 --- a/share/qtcreator/translations/qtcreator_sl.ts +++ b/share/qtcreator/translations/qtcreator_sl.ts @@ -13696,7 +13696,7 @@ Spremembe lahko zapišete na stran ali pa jih zavržete. - Mercurial::Internal::MercurialCommitPanel + Mercurial General Information Splošni podatki @@ -13736,9 +13736,6 @@ Spremembe lahko zapišete na stran ali pa jih zavržete. Email: E-pošta: - - - Mercurial::Internal::OptionsPage Form Obrazec @@ -13812,9 +13809,6 @@ Spremembe lahko zapišete na stran ali pa jih zavržete. Mercurial Mercurial - - - Mercurial::Internal::RevertDialog Revert Povrni @@ -13829,9 +13823,6 @@ Spremembe lahko zapišete na stran ali pa jih zavržete. Revision: Revizija: - - - Mercurial::Internal::SrcDestDialog Dialog Pogovorno okno @@ -16034,7 +16025,7 @@ Desetiška predznačena vrednost (najprej veliki konec): %4 - Mercurial::Internal::CloneWizard + Mercurial Clones a Mercurial repository and tries to load the contained project. Sklonira skladišče Mercurial in poskusi naložiti vsebovani projekt. @@ -16043,9 +16034,6 @@ Desetiška predznačena vrednost (najprej veliki konec): %4 Mercurial Clone Klon skladišča Mercurial - - - Mercurial::Internal::CloneWizardPage Location Mesto @@ -16058,16 +16046,10 @@ Desetiška predznačena vrednost (najprej veliki konec): %4 Clone URL: URL za kloniranje: - - - Mercurial::Internal::CommitEditor Commit Editor Urejevalnik zapisov - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 Ni moč najti starševskih revizij za %1 v %2: %3 @@ -16100,16 +16082,6 @@ Desetiška predznačena vrednost (najprej veliki konec): %4 Working... Delam … - - - Mercurial::Internal::MercurialControl - - Mercurial - Mercurial - - - - Mercurial::Internal::MercurialEditor Annotate %1 Dodaj opombo za %1 @@ -16118,13 +16090,6 @@ Desetiška predznačena vrednost (najprej veliki konec): %4 Annotate parent revision %1 Dodaj opombo za starševsko revizijo %1 - - - Mercurial::Internal::MercurialPlugin - - Mercurial - Mercurial - Annotate Current File Dodaj opombo za trenutno datoteko @@ -16317,9 +16282,6 @@ Desetiška predznačena vrednost (najprej veliki konec): %4 Close commit editor Zapri urejevalnik za zapise - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Ukaz Mercurial @@ -24616,7 +24578,7 @@ ključe SSH išče na tem mestu in ne v mapi, kjer je nameščen. - Mercurial::Internal::MercurialDiffParameterWidget + Mercurial Ignore whitespace Prezri presledke @@ -32237,7 +32199,7 @@ Preverite, ali je telefon priključen in ali App TRK teče. - Mercurial::Internal::MercurialJobRunner + Mercurial Executing: %1 %2 diff --git a/share/qtcreator/translations/qtcreator_uk.ts b/share/qtcreator/translations/qtcreator_uk.ts index 7a5c6ab9962..65c04d2d502 100644 --- a/share/qtcreator/translations/qtcreator_uk.ts +++ b/share/qtcreator/translations/qtcreator_uk.ts @@ -12239,7 +12239,7 @@ To do this, you type this shortcut and a space in the Locator entry field, and t - Mercurial::Internal::CloneWizard + Mercurial Cloning Клонування @@ -12252,9 +12252,6 @@ To do this, you type this shortcut and a space in the Locator entry field, and t Clones a Mercurial repository and tries to load the contained project. Клонує сховище Mercurial та намагається завантажити з нього проект. - - - Mercurial::Internal::CloneWizardPage Location Розташування @@ -12263,16 +12260,10 @@ To do this, you type this shortcut and a space in the Locator entry field, and t Clone URL: URL для клонування: - - - Mercurial::Internal::CommitEditor Commit Editor - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 @@ -12289,9 +12280,6 @@ To do this, you type this shortcut and a space in the Locator entry field, and t Hg outgoing %1 - - - Mercurial::Internal::MercurialCommitPanel General Information Загальна інформація @@ -12324,16 +12312,10 @@ To do this, you type this shortcut and a space in the Locator entry field, and t Email: Email: - - - Mercurial::Internal::MercurialControl Mercurial Mercurial - - - Mercurial::Internal::MercurialDiffParameterWidget Ignore whitespace Ігнорувати пропуски @@ -12350,13 +12332,6 @@ To do this, you type this shortcut and a space in the Locator entry field, and t Ignore Blank Lines Ігнорувати порожні рядки - - - Mercurial::Internal::MercurialPlugin - - Clones a Mercurial repository and tries to load the contained project. - Клонує сховище Mercurial та намагається завантажити з нього проект. - Me&rcurial Me&rcurial @@ -12569,9 +12544,6 @@ To do this, you type this shortcut and a space in the Locator entry field, and t Message check failed. Do you want to proceed? - - - Mercurial::Internal::OptionsPage Form Форма @@ -12620,24 +12592,14 @@ To do this, you type this shortcut and a space in the Locator entry field, and t s с - - Mercurial - Mercurial - The number of recent commit logs to show, choose 0 to see all entries. - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Команда Mercurial - - - Mercurial::Internal::RevertDialog Revert @@ -12650,9 +12612,6 @@ To do this, you type this shortcut and a space in the Locator entry field, and t Revision: Ревізія: - - - Mercurial::Internal::SrcDestDialog Dialog Діалог @@ -36445,11 +36404,7 @@ This wizard will guide you through the essential steps to deploy a ready-to-go d - Mercurial::Internal::AuthenticationDialog - - Dialog - Діалог - + Mercurial User name: Ім'я користувача: @@ -42314,11 +42269,7 @@ Install an SDK of at least API version %1. - Mercurial::Internal::CloneWizardFactory - - Clones a Mercurial repository and tries to load the contained project. - Клонує сховище Mercurial та намагається завантажити з нього проект. - + Mercurial ProjectExplorer::DeploymentDataModel @@ -47562,7 +47513,7 @@ Setting breakpoints by file name and line number may fail. - Mercurial::Internal::MercurialEditorWidget + Mercurial &Annotate %1 diff --git a/share/qtcreator/translations/qtcreator_zh_CN.ts b/share/qtcreator/translations/qtcreator_zh_CN.ts index bcfb18f37b0..5317dd6902f 100644 --- a/share/qtcreator/translations/qtcreator_zh_CN.ts +++ b/share/qtcreator/translations/qtcreator_zh_CN.ts @@ -19596,7 +19596,7 @@ S60 emulator run configuration default display name, %1 is base pro-File name - Mercurial::Internal::MercurialCommitPanel + Mercurial General Information 概要信息 @@ -19629,9 +19629,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameEmail: 电子邮件: - - - Mercurial::Internal::OptionsPage Form 界面 @@ -19700,9 +19697,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameThe number of recent commit logs to show, choose 0 to see all entries. 要显示的最近提交的日志数, 选择0 来查看所有项. - - - Mercurial::Internal::RevertDialog Revert 还原 @@ -19715,9 +19709,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameRevision: 修订版本: - - - Mercurial::Internal::SrcDestDialog Dialog 对话框 @@ -19847,7 +19838,7 @@ S60 emulator run configuration default display name, %1 is base pro-File name - Mercurial::Internal::CloneWizard + Mercurial Clone a Mercurial repository 克隆一个 Mercurial 仓库 @@ -19860,9 +19851,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameMercurial Clone Mercurial 克隆 - - - Mercurial::Internal::CloneWizardPage Location 位置 @@ -19875,16 +19863,10 @@ S60 emulator run configuration default display name, %1 is base pro-File nameClone URL: 克隆 URL: - - - Mercurial::Internal::CommitEditor Commit Editor Commit编辑器 - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 无法在 %2 找到 %1 的父修订版本: %3 @@ -19906,16 +19888,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameWorking... 工作中... - - - Mercurial::Internal::MercurialControl - - Mercurial - Mercurial - - - - Mercurial::Internal::MercurialJobRunner Executing: %1 %2 @@ -19930,13 +19902,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameTimed out after %1s waiting for mercurial process to finish. 等待 mercurial 进程结束,等待%1 秒后超时。 - - - Mercurial::Internal::MercurialPlugin - - Mercurial - Mercurial - Annotate Current File Annotate 当前文件 @@ -20145,9 +20110,6 @@ S60 emulator run configuration default display name, %1 is base pro-File nameMessage check failed. Do you want to proceed? 信息检查失败,您想要继续吗? - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Mercurial 命令 @@ -22488,7 +22450,7 @@ Previous decimal signed value (big endian): %4 - Mercurial::Internal::MercurialEditor + Mercurial Annotate %1 注释 "%1" @@ -35967,7 +35929,7 @@ These files are preserved. - Mercurial::Internal::MercurialDiffParameterWidget + Mercurial Ignore whitespace 忽略空白 diff --git a/share/qtcreator/translations/qtcreator_zh_TW.ts b/share/qtcreator/translations/qtcreator_zh_TW.ts index 8f3568db07b..179f6d3a3d3 100644 --- a/share/qtcreator/translations/qtcreator_zh_TW.ts +++ b/share/qtcreator/translations/qtcreator_zh_TW.ts @@ -11870,7 +11870,7 @@ Reason: %2 - Mercurial::Internal::MercurialCommitPanel + Mercurial General Information 一般資訊 @@ -11903,9 +11903,6 @@ Reason: %2 Email: 電子郵件: - - - Mercurial::Internal::OptionsPage Form 表單 @@ -11966,9 +11963,6 @@ Reason: %2 The number of recent commit logs to show, choose 0 to see all entries. 要顯示的最近提交的紀錄數。選擇 0 表示看全部的紀錄。 - - - Mercurial::Internal::RevertDialog Revert 復原 @@ -11981,9 +11975,6 @@ Reason: %2 Revision: 版本: - - - Mercurial::Internal::SrcDestDialog Dialog 對話框 @@ -12101,7 +12092,7 @@ Reason: %2 - Mercurial::Internal::CloneWizard + Mercurial Clones a Mercurial repository and tries to load the contained project. 複製一個 Mercurial 主目錄,並試著載入裡面包含的專案。 @@ -12110,9 +12101,6 @@ Reason: %2 Mercurial Clone Mercurial 複製 - - - Mercurial::Internal::CloneWizardPage Location 位置 @@ -12125,16 +12113,10 @@ Reason: %2 Clone URL: 複製網址: - - - Mercurial::Internal::CommitEditor Commit Editor 提交編輯器 - - - Mercurial::Internal::MercurialClient Unable to find parent revisions of %1 in %2: %3 無法在 %2 找到 %1 的父版本:%3 @@ -12151,20 +12133,6 @@ Reason: %2 Hg outgoing %1 Hg 傳出 %1 - - - Mercurial::Internal::MercurialControl - - Mercurial - Mercurial - - - - Mercurial::Internal::MercurialPlugin - - Mercurial - Mercurial - Annotate Current File 目前檔案最後註記 @@ -12361,9 +12329,6 @@ Reason: %2 Message check failed. Do you want to proceed? 訊息檢查失敗。您要繼續嗎? - - - Mercurial::Internal::OptionsPageWidget Mercurial Command Mercurial 指令 @@ -13286,7 +13251,7 @@ For qmlproject projects, use the importPaths property to add import paths. - Mercurial::Internal::MercurialEditor + Mercurial Annotate %1 最後註記 %1 @@ -22378,7 +22343,7 @@ These files are preserved. - Mercurial::Internal::MercurialDiffParameterWidget + Mercurial Ignore whitespace 忽略空白 diff --git a/src/plugins/mercurial/annotationhighlighter.cpp b/src/plugins/mercurial/annotationhighlighter.cpp index 7135f0c010b..a63eb9f2eb1 100644 --- a/src/plugins/mercurial/annotationhighlighter.cpp +++ b/src/plugins/mercurial/annotationhighlighter.cpp @@ -4,8 +4,7 @@ #include "annotationhighlighter.h" #include "constants.h" -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { MercurialAnnotationHighlighter::MercurialAnnotationHighlighter(const ChangeNumbers &changeNumbers, QTextDocument *document) @@ -22,5 +21,4 @@ QString MercurialAnnotationHighlighter::changeNumber(const QString &block) const return QString(); } -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/annotationhighlighter.h b/src/plugins/mercurial/annotationhighlighter.h index 4d6c9438afd..08846f8e267 100644 --- a/src/plugins/mercurial/annotationhighlighter.h +++ b/src/plugins/mercurial/annotationhighlighter.h @@ -4,10 +4,10 @@ #pragma once #include + #include -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { class MercurialAnnotationHighlighter : public VcsBase::BaseAnnotationHighlighter { @@ -20,5 +20,4 @@ private: const QRegularExpression changeset; }; -} //namespace Internal -}// namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/authenticationdialog.cpp b/src/plugins/mercurial/authenticationdialog.cpp index c04fb34d655..f64be98b7e9 100644 --- a/src/plugins/mercurial/authenticationdialog.cpp +++ b/src/plugins/mercurial/authenticationdialog.cpp @@ -3,6 +3,8 @@ #include "authenticationdialog.h" +#include "mercurialtr.h" + #include #include @@ -26,8 +28,8 @@ AuthenticationDialog::AuthenticationDialog(const QString &username, const QStrin Column { Form { - tr("Username:"), m_username, br, - tr("Password:"), m_password + Tr::tr("Username:"), m_username, br, + Tr::tr("Password:"), m_password }, buttonBox }.attachTo(this); diff --git a/src/plugins/mercurial/authenticationdialog.h b/src/plugins/mercurial/authenticationdialog.h index 2b6eb454401..b1f6108e74a 100644 --- a/src/plugins/mercurial/authenticationdialog.h +++ b/src/plugins/mercurial/authenticationdialog.h @@ -13,8 +13,6 @@ namespace Mercurial::Internal { class AuthenticationDialog : public QDialog { - Q_OBJECT - public: explicit AuthenticationDialog(const QString &username, const QString &password, QWidget *parent = nullptr); diff --git a/src/plugins/mercurial/commiteditor.cpp b/src/plugins/mercurial/commiteditor.cpp index dacfb9f89ab..3288d63389e 100644 --- a/src/plugins/mercurial/commiteditor.cpp +++ b/src/plugins/mercurial/commiteditor.cpp @@ -2,7 +2,9 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "commiteditor.h" + #include "mercurialcommitwidget.h" +#include "mercurialtr.h" #include #include @@ -11,16 +13,15 @@ using namespace VcsBase; -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { CommitEditor::CommitEditor() : VcsBaseSubmitEditor(new MercurialCommitWidget) { - document()->setPreferredDisplayName(tr("Commit Editor")); + document()->setPreferredDisplayName(Tr::tr("Commit Editor")); } -MercurialCommitWidget *CommitEditor::commitWidget() +MercurialCommitWidget *CommitEditor::commitWidget() const { return static_cast(widget()); } @@ -59,15 +60,14 @@ void CommitEditor::setFields(const QFileInfo &repositoryRoot, const QString &bra setFileModel(fileModel); } -QString CommitEditor::committerInfo() +QString CommitEditor::committerInfo() const { return commitWidget()->committer(); } -QString CommitEditor::repoRoot() +QString CommitEditor::repoRoot() const { return commitWidget()->repoRoot(); } -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/commiteditor.h b/src/plugins/mercurial/commiteditor.h index f94fec5ca13..867775da984 100644 --- a/src/plugins/mercurial/commiteditor.h +++ b/src/plugins/mercurial/commiteditor.h @@ -10,8 +10,7 @@ namespace VcsBase { class SubmitFileModel; } -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { class MercurialCommitWidget; @@ -26,13 +25,12 @@ public: const QString &userName, const QString &email, const QList &repoStatus); - QString committerInfo(); - QString repoRoot(); + QString committerInfo() const; + QString repoRoot() const; private: - MercurialCommitWidget *commitWidget(); + MercurialCommitWidget *commitWidget() const; VcsBase::SubmitFileModel *fileModel = nullptr; }; -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/constants.h b/src/plugins/mercurial/constants.h index 677136a04a3..6e5cf9d1b8d 100644 --- a/src/plugins/mercurial/constants.h +++ b/src/plugins/mercurial/constants.h @@ -5,8 +5,7 @@ #include -namespace Mercurial { -namespace Constants { +namespace Mercurial::Constants { enum { debug = 0 }; const char MERCURIAL_PLUGIN[] = "MercurialPlugin"; @@ -65,5 +64,4 @@ const char OUTGOING[] = "Mercurial.Action.Outgoing"; const char COMMIT[] = "Mercurial.Action.Commit"; const char CREATE_REPOSITORY[] = "Mercurial.Action.CreateRepository"; -} // namespace Constants -} // namespace mercurial +} // Mercurial::Constants diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index ee43b9ef96e..265320b98bc 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -2,7 +2,9 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "mercurialclient.h" + #include "constants.h" +#include "mercurialtr.h" #include @@ -31,8 +33,7 @@ using namespace DiffEditor; using namespace Utils; using namespace VcsBase; -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { class MercurialDiffEditorController : public VcsBaseDiffEditorController { @@ -163,13 +164,13 @@ static QString msgParentRevisionFailed(const FilePath &workingDirectory, const QString &revision, const QString &why) { - return MercurialClient::tr("Unable to find parent revisions of %1 in %2: %3"). + return Tr::tr("Unable to find parent revisions of %1 in %2: %3"). arg(revision, workingDirectory.toUserOutput(), why); } static inline QString msgParseParentsOutputFailed(const QString &output) { - return MercurialClient::tr("Cannot parse output: %1").arg(output); + return Tr::tr("Cannot parse output: %1").arg(output); } QStringList MercurialClient::parentRevisionsSync(const FilePath &workingDirectory, @@ -257,7 +258,7 @@ void MercurialClient::incoming(const FilePath &repositoryRoot, const QString &re if (!repository.isEmpty()) id += QLatin1Char('/') + repository; - const QString title = tr("Hg incoming %1").arg(id); + const QString title = Tr::tr("Hg incoming %1").arg(id); VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot.toString(), VcsBaseEditor::getCodec(repositoryRoot.toString()), @@ -270,7 +271,7 @@ void MercurialClient::outgoing(const FilePath &repositoryRoot) QStringList args; args << QLatin1String("outgoing") << QLatin1String("-g") << QLatin1String("-p"); - const QString title = tr("Hg outgoing %1").arg(repositoryRoot.toUserOutput()); + const QString title = Tr::tr("Hg outgoing %1").arg(repositoryRoot.toUserOutput()); VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot.toString(), VcsBaseEditor::getCodec(repositoryRoot.toString()), @@ -304,20 +305,20 @@ void MercurialClient::diff(const FilePath &workingDir, const QStringList &files, QString fileName; if (files.empty()) { - const QString title = tr("Mercurial Diff"); + const QString title = Tr::tr("Mercurial Diff"); const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString documentId = QString(Constants::MERCURIAL_PLUGIN) + ".DiffRepo." + sourceFile; requestReload(documentId, sourceFile, title, workingDir, {"diff"}); } else if (files.size() == 1) { fileName = files.at(0); - const QString title = tr("Mercurial Diff \"%1\"").arg(fileName); + const QString title = Tr::tr("Mercurial Diff \"%1\"").arg(fileName); const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString documentId = QString(Constants::MERCURIAL_PLUGIN) + ".DiffFile." + sourceFile; requestReload(documentId, sourceFile, title, workingDir, {"diff", fileName}); } else { - const QString title = tr("Mercurial Diff \"%1\"").arg(workingDir.toString()); + const QString title = Tr::tr("Mercurial Diff \"%1\"").arg(workingDir.toString()); const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString documentId = QString(Constants::MERCURIAL_PLUGIN) + ".DiffFile." + workingDir.toString(); @@ -443,5 +444,4 @@ void MercurialClient::parsePullOutput(const QString &output) emit needMerge(); } -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h index 9b85a1c2e6c..2351d3e7610 100644 --- a/src/plugins/mercurial/mercurialclient.h +++ b/src/plugins/mercurial/mercurialclient.h @@ -9,8 +9,7 @@ namespace VcsBase { class VcsBaseDiffEditorController; } -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { class MercurialDiffEditorController; @@ -74,5 +73,4 @@ private: void parsePullOutput(const QString &output); }; -} //namespace Internal -} //namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/mercurialcommitwidget.cpp b/src/plugins/mercurial/mercurialcommitwidget.cpp index 993a3dbdfda..3299508eba3 100644 --- a/src/plugins/mercurial/mercurialcommitwidget.cpp +++ b/src/plugins/mercurial/mercurialcommitwidget.cpp @@ -3,6 +3,8 @@ #include "mercurialcommitwidget.h" +#include "mercurialtr.h" + #include #include #include @@ -12,23 +14,14 @@ #include #include +#include +#include #include #include #include //see the git submit widget for details of the syntax Highlighter -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - namespace Mercurial::Internal { // Highlighter for Mercurial submit messages. Make the first line bold, indicates @@ -99,8 +92,6 @@ void MercurialSubmitHighlighter::highlightBlock(const QString &text) class MercurialCommitPanel : public QWidget { - Q_DECLARE_TR_FUNCTIONS(Mercurial::Internal::MercurialCommitPanel) - public: MercurialCommitPanel() { @@ -114,18 +105,18 @@ public: Column { Group { - title(tr("General Information")), + title(Tr::tr("General Information")), Form { - tr("Repository:"), m_repositoryLabel, br, - tr("Branch:"), m_branchLabel, + Tr::tr("Repository:"), m_repositoryLabel, br, + Tr::tr("Branch:"), m_branchLabel, } }, Group { - title(tr("Commit Information")), + title(Tr::tr("Commit Information")), Row { Form { - tr("Author:"), m_authorLineEdit, br, - tr("Email:"), m_emailLineEdit, + Tr::tr("Author:"), m_authorLineEdit, br, + Tr::tr("Email:"), m_emailLineEdit, }, } } diff --git a/src/plugins/mercurial/mercurialeditor.cpp b/src/plugins/mercurial/mercurialeditor.cpp index c267da174cf..7682b9a9556 100644 --- a/src/plugins/mercurial/mercurialeditor.cpp +++ b/src/plugins/mercurial/mercurialeditor.cpp @@ -2,10 +2,11 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "mercurialeditor.h" + #include "annotationhighlighter.h" #include "constants.h" -#include "mercurialplugin.h" #include "mercurialclient.h" +#include "mercurialtr.h" #include #include @@ -19,8 +20,7 @@ using namespace Utils; -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { // use QRegularExpression::anchoredPattern() when minimum Qt is raised to 5.12+ MercurialEditorWidget::MercurialEditorWidget(MercurialClient *client) : @@ -31,8 +31,8 @@ MercurialEditorWidget::MercurialEditorWidget(MercurialClient *client) : { setDiffFilePattern(Constants::DIFFIDENTIFIER); setLogEntryPattern("^changeset:\\s+(\\S+)$"); - setAnnotateRevisionTextFormat(tr("&Annotate %1")); - setAnnotatePreviousRevisionTextFormat(tr("Annotate &parent revision %1")); + setAnnotateRevisionTextFormat(Tr::tr("&Annotate %1")); + setAnnotatePreviousRevisionTextFormat(Tr::tr("Annotate &parent revision %1")); setAnnotationEntryPattern(Constants::CHANGESETID12); } @@ -71,5 +71,4 @@ QStringList MercurialEditorWidget::annotationPreviousVersions(const QString &rev return m_client->parentRevisionsSync(FilePath::fromString(workingDirectory), fi.fileName(), revision); } -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/mercurialeditor.h b/src/plugins/mercurial/mercurialeditor.h index 291718b4e9a..6dbcf4206b7 100644 --- a/src/plugins/mercurial/mercurialeditor.h +++ b/src/plugins/mercurial/mercurialeditor.h @@ -7,14 +7,12 @@ #include -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { class MercurialClient; class MercurialEditorWidget : public VcsBase::VcsBaseEditorWidget { - Q_OBJECT public: explicit MercurialEditorWidget(MercurialClient *client); @@ -32,5 +30,4 @@ private: MercurialClient *m_client; }; -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp index 5ac0181f240..389accbd641 100644 --- a/src/plugins/mercurial/mercurialplugin.cpp +++ b/src/plugins/mercurial/mercurialplugin.cpp @@ -8,6 +8,7 @@ #include "mercurialclient.h" #include "mercurialeditor.h" #include "mercurialsettings.h" +#include "mercurialtr.h" #include "revertdialog.h" #include "srcdestdialog.h" @@ -49,8 +50,7 @@ using namespace VcsBase; using namespace Utils; using namespace std::placeholders; -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { class MercurialTopicCache : public Core::IVersionControl::TopicCache { @@ -102,8 +102,6 @@ const VcsBaseSubmitEditorParameters submitEditorParameters { class MercurialPluginPrivate final : public VcsBase::VcsBasePluginPrivate { - Q_DECLARE_TR_FUNCTIONS(Mercurial::Internal::MercurialPlugin) - public: MercurialPluginPrivate(); @@ -256,7 +254,7 @@ MercurialPluginPrivate::MercurialPluginPrivate() const QString prefix = QLatin1String("hg"); m_commandLocator = new Core::CommandLocator("Mercurial", prefix, prefix, this); - m_commandLocator->setDescription(tr("Triggers a Mercurial version control operation.")); + m_commandLocator->setDescription(Tr::tr("Triggers a Mercurial version control operation.")); createMenu(context); @@ -268,7 +266,7 @@ void MercurialPluginPrivate::createMenu(const Core::Context &context) // Create menu item for Mercurial m_mercurialContainer = Core::ActionManager::createMenu("Mercurial.MercurialMenu"); QMenu *menu = m_mercurialContainer->menu(); - menu->setTitle(tr("Me&rcurial")); + menu->setTitle(Tr::tr("Me&rcurial")); createFileActions(context); m_mercurialContainer->addSeparator(context); @@ -287,54 +285,54 @@ void MercurialPluginPrivate::createFileActions(const Core::Context &context) { Core::Command *command; - annotateFile = new ParameterAction(tr("Annotate Current File"), tr("Annotate \"%1\""), ParameterAction::EnabledWithParameter, this); + annotateFile = new ParameterAction(Tr::tr("Annotate Current File"), Tr::tr("Annotate \"%1\""), ParameterAction::EnabledWithParameter, this); command = Core::ActionManager::registerAction(annotateFile, Utils::Id(Constants::ANNOTATE), context); command->setAttribute(Core::Command::CA_UpdateText); connect(annotateFile, &QAction::triggered, this, &MercurialPluginPrivate::annotateCurrentFile); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - diffFile = new ParameterAction(tr("Diff Current File"), tr("Diff \"%1\""), ParameterAction::EnabledWithParameter, this); + diffFile = new ParameterAction(Tr::tr("Diff Current File"), Tr::tr("Diff \"%1\""), ParameterAction::EnabledWithParameter, this); command = Core::ActionManager::registerAction(diffFile, Utils::Id(Constants::DIFF), context); command->setAttribute(Core::Command::CA_UpdateText); - command->setDefaultKeySequence(QKeySequence(Core::useMacShortcuts ? tr("Meta+H,Meta+D") : tr("Alt+G,Alt+D"))); + command->setDefaultKeySequence(QKeySequence(Core::useMacShortcuts ? Tr::tr("Meta+H,Meta+D") : Tr::tr("Alt+G,Alt+D"))); connect(diffFile, &QAction::triggered, this, &MercurialPluginPrivate::diffCurrentFile); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - logFile = new ParameterAction(tr("Log Current File"), tr("Log \"%1\""), ParameterAction::EnabledWithParameter, this); + logFile = new ParameterAction(Tr::tr("Log Current File"), Tr::tr("Log \"%1\""), ParameterAction::EnabledWithParameter, this); command = Core::ActionManager::registerAction(logFile, Utils::Id(Constants::LOG), context); command->setAttribute(Core::Command::CA_UpdateText); - command->setDefaultKeySequence(QKeySequence(Core::useMacShortcuts ? tr("Meta+H,Meta+L") : tr("Alt+G,Alt+L"))); + command->setDefaultKeySequence(QKeySequence(Core::useMacShortcuts ? Tr::tr("Meta+H,Meta+L") : Tr::tr("Alt+G,Alt+L"))); connect(logFile, &QAction::triggered, this, &MercurialPluginPrivate::logCurrentFile); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - statusFile = new ParameterAction(tr("Status Current File"), tr("Status \"%1\""), ParameterAction::EnabledWithParameter, this); + statusFile = new ParameterAction(Tr::tr("Status Current File"), Tr::tr("Status \"%1\""), ParameterAction::EnabledWithParameter, this); command = Core::ActionManager::registerAction(statusFile, Utils::Id(Constants::STATUS), context); command->setAttribute(Core::Command::CA_UpdateText); - command->setDefaultKeySequence(QKeySequence(Core::useMacShortcuts ? tr("Meta+H,Meta+S") : tr("Alt+G,Alt+S"))); + command->setDefaultKeySequence(QKeySequence(Core::useMacShortcuts ? Tr::tr("Meta+H,Meta+S") : Tr::tr("Alt+G,Alt+S"))); connect(statusFile, &QAction::triggered, this, &MercurialPluginPrivate::statusCurrentFile); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); m_mercurialContainer->addSeparator(context); - m_addAction = new ParameterAction(tr("Add"), tr("Add \"%1\""), ParameterAction::EnabledWithParameter, this); + m_addAction = new ParameterAction(Tr::tr("Add"), Tr::tr("Add \"%1\""), ParameterAction::EnabledWithParameter, this); command = Core::ActionManager::registerAction(m_addAction, Utils::Id(Constants::ADD), context); command->setAttribute(Core::Command::CA_UpdateText); connect(m_addAction, &QAction::triggered, this, &MercurialPluginPrivate::addCurrentFile); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - m_deleteAction = new ParameterAction(tr("Delete..."), tr("Delete \"%1\"..."), ParameterAction::EnabledWithParameter, this); + m_deleteAction = new ParameterAction(Tr::tr("Delete..."), Tr::tr("Delete \"%1\"..."), ParameterAction::EnabledWithParameter, this); command = Core::ActionManager::registerAction(m_deleteAction, Utils::Id(Constants::DELETE), context); command->setAttribute(Core::Command::CA_UpdateText); connect(m_deleteAction, &QAction::triggered, this, &MercurialPluginPrivate::promptToDeleteCurrentFile); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - revertFile = new ParameterAction(tr("Revert Current File..."), tr("Revert \"%1\"..."), ParameterAction::EnabledWithParameter, this); + revertFile = new ParameterAction(Tr::tr("Revert Current File..."), Tr::tr("Revert \"%1\"..."), ParameterAction::EnabledWithParameter, this); command = Core::ActionManager::registerAction(revertFile, Utils::Id(Constants::REVERT), context); command->setAttribute(Core::Command::CA_UpdateText); connect(revertFile, &QAction::triggered, this, &MercurialPluginPrivate::revertCurrentFile); @@ -394,28 +392,28 @@ void MercurialPluginPrivate::statusCurrentFile() void MercurialPluginPrivate::createDirectoryActions(const Core::Context &context) { - auto action = new QAction(tr("Diff"), this); + auto action = new QAction(Tr::tr("Diff"), this); m_repositoryActionList.append(action); Core::Command *command = Core::ActionManager::registerAction(action, Utils::Id(Constants::DIFFMULTI), context); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::diffRepository); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - action = new QAction(tr("Log"), this); + action = new QAction(Tr::tr("Log"), this); m_repositoryActionList.append(action); command = Core::ActionManager::registerAction(action, Utils::Id(Constants::LOGMULTI), context); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::logRepository); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - action = new QAction(tr("Revert..."), this); + action = new QAction(Tr::tr("Revert..."), this); m_repositoryActionList.append(action); command = Core::ActionManager::registerAction(action, Utils::Id(Constants::REVERTMULTI), context); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::revertMulti); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - action = new QAction(tr("Status"), this); + action = new QAction(Tr::tr("Status"), this); m_repositoryActionList.append(action); command = Core::ActionManager::registerAction(action, Utils::Id(Constants::STATUSMULTI), context); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::statusMulti); @@ -458,57 +456,57 @@ void MercurialPluginPrivate::statusMulti() void MercurialPluginPrivate::createRepositoryActions(const Core::Context &context) { - auto action = new QAction(tr("Pull..."), this); + auto action = new QAction(Tr::tr("Pull..."), this); m_repositoryActionList.append(action); Core::Command *command = Core::ActionManager::registerAction(action, Utils::Id(Constants::PULL), context); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::pull); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - action = new QAction(tr("Push..."), this); + action = new QAction(Tr::tr("Push..."), this); m_repositoryActionList.append(action); command = Core::ActionManager::registerAction(action, Utils::Id(Constants::PUSH), context); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::push); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - action = new QAction(tr("Update..."), this); + action = new QAction(Tr::tr("Update..."), this); m_repositoryActionList.append(action); command = Core::ActionManager::registerAction(action, Utils::Id(Constants::UPDATE), context); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::update); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - action = new QAction(tr("Import..."), this); + action = new QAction(Tr::tr("Import..."), this); m_repositoryActionList.append(action); command = Core::ActionManager::registerAction(action, Utils::Id(Constants::IMPORT), context); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::import); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - action = new QAction(tr("Incoming..."), this); + action = new QAction(Tr::tr("Incoming..."), this); m_repositoryActionList.append(action); command = Core::ActionManager::registerAction(action, Utils::Id(Constants::INCOMING), context); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::incoming); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - action = new QAction(tr("Outgoing..."), this); + action = new QAction(Tr::tr("Outgoing..."), this); m_repositoryActionList.append(action); command = Core::ActionManager::registerAction(action, Utils::Id(Constants::OUTGOING), context); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::outgoing); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - action = new QAction(tr("Commit..."), this); + action = new QAction(Tr::tr("Commit..."), this); m_repositoryActionList.append(action); command = Core::ActionManager::registerAction(action, Utils::Id(Constants::COMMIT), context); - command->setDefaultKeySequence(QKeySequence(Core::useMacShortcuts ? tr("Meta+H,Meta+C") : tr("Alt+G,Alt+C"))); + command->setDefaultKeySequence(QKeySequence(Core::useMacShortcuts ? Tr::tr("Meta+H,Meta+C") : Tr::tr("Alt+G,Alt+C"))); connect(action, &QAction::triggered, this, &MercurialPluginPrivate::commit); m_mercurialContainer->addAction(command); m_commandLocator->appendCommand(command); - m_createRepositoryAction = new QAction(tr("Create Repository..."), this); + m_createRepositoryAction = new QAction(Tr::tr("Create Repository..."), this); command = Core::ActionManager::registerAction(m_createRepositoryAction, Utils::Id(Constants::CREATE_REPOSITORY), context); connect(m_createRepositoryAction, &QAction::triggered, this, &MercurialPluginPrivate::createRepository); m_mercurialContainer->addAction(command); @@ -520,7 +518,7 @@ void MercurialPluginPrivate::pull() QTC_ASSERT(state.hasTopLevel(), return); SrcDestDialog dialog(state, SrcDestDialog::incoming, Core::ICore::dialogParent()); - dialog.setWindowTitle(tr("Pull Source")); + dialog.setWindowTitle(Tr::tr("Pull Source")); if (dialog.exec() != QDialog::Accepted) return; m_client.synchronousPull(dialog.workingDir(), dialog.getRepositoryString()); @@ -532,7 +530,7 @@ void MercurialPluginPrivate::push() QTC_ASSERT(state.hasTopLevel(), return); SrcDestDialog dialog(state, SrcDestDialog::outgoing, Core::ICore::dialogParent()); - dialog.setWindowTitle(tr("Push Destination")); + dialog.setWindowTitle(Tr::tr("Push Destination")); if (dialog.exec() != QDialog::Accepted) return; m_client.synchronousPush(dialog.workingDir(), dialog.getRepositoryString()); @@ -544,7 +542,7 @@ void MercurialPluginPrivate::update() QTC_ASSERT(state.hasTopLevel(), return); RevertDialog updateDialog(Core::ICore::dialogParent()); - updateDialog.setWindowTitle(tr("Update")); + updateDialog.setWindowTitle(Tr::tr("Update")); if (updateDialog.exec() != QDialog::Accepted) return; m_client.update(state.topLevel(), updateDialog.revision()); @@ -572,7 +570,7 @@ void MercurialPluginPrivate::incoming() QTC_ASSERT(state.hasTopLevel(), return); SrcDestDialog dialog(state, SrcDestDialog::incoming, Core::ICore::dialogParent()); - dialog.setWindowTitle(tr("Incoming Source")); + dialog.setWindowTitle(Tr::tr("Incoming Source")); if (dialog.exec() != QDialog::Accepted) return; m_client.incoming(state.topLevel(), dialog.getRepositoryString()); @@ -608,7 +606,7 @@ void MercurialPluginPrivate::showCommitWidget(const QListsetCheckScriptWorkingDirectory(m_submitRepository); - const QString msg = tr("Commit changes for \"%1\".").arg(m_submitRepository.toUserOutput()); + const QString msg = Tr::tr("Commit changes for \"%1\".").arg(m_submitRepository.toUserOutput()); commitEditor->document()->setPreferredDisplayName(msg); const QString branch = vcsTopic(m_submitRepository); @@ -716,7 +714,7 @@ void MercurialPluginPrivate::updateActions(VcsBasePluginPrivate::ActionState as) QString MercurialPluginPrivate::displayName() const { - return tr("Mercurial"); + return Tr::tr("Mercurial"); } Utils::Id MercurialPluginPrivate::id() const @@ -896,5 +894,4 @@ void MercurialPlugin::testLogResolving() } #endif -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/mercurialplugin.h b/src/plugins/mercurial/mercurialplugin.h index be127f8d4aa..7bb45e48de3 100644 --- a/src/plugins/mercurial/mercurialplugin.h +++ b/src/plugins/mercurial/mercurialplugin.h @@ -5,8 +5,7 @@ #include -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { class MercurialPlugin final : public ExtensionSystem::IPlugin { @@ -27,5 +26,4 @@ private slots: }; -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/mercurialsettings.cpp b/src/plugins/mercurial/mercurialsettings.cpp index 08a82343aad..368e2ce416a 100644 --- a/src/plugins/mercurial/mercurialsettings.cpp +++ b/src/plugins/mercurial/mercurialsettings.cpp @@ -4,6 +4,7 @@ #include "mercurialsettings.h" #include "constants.h" +#include "mercurialtr.h" #include @@ -11,8 +12,7 @@ using namespace Utils; -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { MercurialSettings::MercurialSettings() { @@ -23,19 +23,19 @@ MercurialSettings::MercurialSettings() binaryPath.setDisplayStyle(StringAspect::PathChooserDisplay); binaryPath.setExpectedKind(PathChooser::ExistingCommand); binaryPath.setDefaultValue(Constants::MERCURIALDEFAULT); - binaryPath.setDisplayName(tr("Mercurial Command")); + binaryPath.setDisplayName(Tr::tr("Mercurial Command")); binaryPath.setHistoryCompleter("Bazaar.Command.History"); - binaryPath.setLabelText(tr("Command:")); + binaryPath.setLabelText(Tr::tr("Command:")); registerAspect(&userName); userName.setDisplayStyle(StringAspect::LineEditDisplay); - userName.setLabelText(tr("Default username:")); - userName.setToolTip(tr("Username to use by default on commit.")); + userName.setLabelText(Tr::tr("Default username:")); + userName.setToolTip(Tr::tr("Username to use by default on commit.")); registerAspect(&userEmail); userEmail.setDisplayStyle(StringAspect::LineEditDisplay); - userEmail.setLabelText(tr("Default email:")); - userEmail.setToolTip(tr("Email to use by default on commit.")); + userEmail.setLabelText(Tr::tr("Default email:")); + userEmail.setToolTip(Tr::tr("Email to use by default on commit.")); registerAspect(&diffIgnoreWhiteSpace); diffIgnoreWhiteSpace.setSettingsKey("diffIgnoreWhiteSpace"); @@ -49,7 +49,7 @@ MercurialSettings::MercurialSettings() MercurialSettingsPage::MercurialSettingsPage(MercurialSettings *settings) { setId(VcsBase::Constants::VCS_ID_MERCURIAL); - setDisplayName(MercurialSettings::tr("Mercurial")); + setDisplayName(Tr::tr("Mercurial")); setCategory(VcsBase::Constants::VCS_SETTINGS_CATEGORY); setSettings(settings); @@ -59,12 +59,12 @@ MercurialSettingsPage::MercurialSettingsPage(MercurialSettings *settings) Column { Group { - title(MercurialSettings::tr("Configuration")), + title(Tr::tr("Configuration")), Row { s.binaryPath } }, Group { - title(MercurialSettings::tr("User")), + title(Tr::tr("User")), Form { s.userName, s.userEmail @@ -72,7 +72,7 @@ MercurialSettingsPage::MercurialSettingsPage(MercurialSettings *settings) }, Group { - title(MercurialSettings::tr("Miscellaneous")), + title(Tr::tr("Miscellaneous")), Row { s.logCount, s.timeout, @@ -85,5 +85,4 @@ MercurialSettingsPage::MercurialSettingsPage(MercurialSettings *settings) }); } -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/mercurialsettings.h b/src/plugins/mercurial/mercurialsettings.h index 0a1482a6ca4..a09946838aa 100644 --- a/src/plugins/mercurial/mercurialsettings.h +++ b/src/plugins/mercurial/mercurialsettings.h @@ -7,18 +7,15 @@ #include -namespace Mercurial { -namespace Internal { +namespace Mercurial::Internal { class MercurialSettings : public VcsBase::VcsBaseSettings { - Q_DECLARE_TR_FUNCTIONS(Mercurial::Internal::MercurialSettings) - public: + MercurialSettings(); + Utils::StringAspect diffIgnoreWhiteSpace; Utils::StringAspect diffIgnoreBlankLines; - - MercurialSettings(); }; class MercurialSettingsPage final : public Core::IOptionsPage @@ -27,5 +24,4 @@ public: explicit MercurialSettingsPage(MercurialSettings *settings); }; -} // namespace Internal -} // namespace Mercurial +} // Mercurial::Internal diff --git a/src/plugins/mercurial/revertdialog.cpp b/src/plugins/mercurial/revertdialog.cpp index fb89bb238bf..27111f148bb 100644 --- a/src/plugins/mercurial/revertdialog.cpp +++ b/src/plugins/mercurial/revertdialog.cpp @@ -3,6 +3,8 @@ #include "revertdialog.h" +#include "mercurialtr.h" + #include #include @@ -17,9 +19,9 @@ RevertDialog::RevertDialog(QWidget *parent) : QDialog(parent) { resize(400, 162); - setWindowTitle(tr("Revert")); + setWindowTitle(Tr::tr("Revert")); - auto groupBox = new QGroupBox(tr("Specify a revision other than the default?")); + auto groupBox = new QGroupBox(Tr::tr("Specify a revision other than the default?")); groupBox->setCheckable(true); groupBox->setChecked(false); @@ -30,7 +32,7 @@ RevertDialog::RevertDialog(QWidget *parent) using namespace Layouting; Form { - tr("Revision:"), m_revisionLineEdit, + Tr::tr("Revision:"), m_revisionLineEdit, }.attachTo(groupBox, WithMargins); Column { diff --git a/src/plugins/mercurial/revertdialog.h b/src/plugins/mercurial/revertdialog.h index d480f0a8191..46e5321e006 100644 --- a/src/plugins/mercurial/revertdialog.h +++ b/src/plugins/mercurial/revertdialog.h @@ -13,8 +13,6 @@ namespace Mercurial::Internal { class RevertDialog : public QDialog { - Q_OBJECT - public: RevertDialog(QWidget *parent = nullptr); ~RevertDialog() override; diff --git a/src/plugins/mercurial/srcdestdialog.cpp b/src/plugins/mercurial/srcdestdialog.cpp index 792eb41cc4d..ffcac62f6a3 100644 --- a/src/plugins/mercurial/srcdestdialog.cpp +++ b/src/plugins/mercurial/srcdestdialog.cpp @@ -2,6 +2,8 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "authenticationdialog.h" + +#include "mercurialtr.h" #include "srcdestdialog.h" #include @@ -25,13 +27,13 @@ SrcDestDialog::SrcDestDialog(const VcsBasePluginState &state, Direction dir, QWi { resize(400, 187); - m_defaultButton = new QRadioButton(tr("Default Location")); + m_defaultButton = new QRadioButton(Tr::tr("Default Location")); m_defaultButton->setChecked(true); - m_localButton = new QRadioButton(tr("Local filesystem:")); + m_localButton = new QRadioButton(Tr::tr("Local filesystem:")); - auto urlButton = new QRadioButton(tr("Specify URL:")); - urlButton->setToolTip(tr("For example: 'https://[user[:pass]@]host[:port]/[path]'.")); + auto urlButton = new QRadioButton(Tr::tr("Specify URL:")); + urlButton->setToolTip(Tr::tr("For example: 'https://[user[:pass]@]host[:port]/[path]'.")); m_localPathChooser = new Utils::PathChooser; m_localPathChooser->setEnabled(false); @@ -39,14 +41,14 @@ SrcDestDialog::SrcDestDialog(const VcsBasePluginState &state, Direction dir, QWi m_localPathChooser->setHistoryCompleter("Hg.SourceDir.History"); m_urlLineEdit = new QLineEdit; - m_urlLineEdit->setToolTip(tr("For example: 'https://[user[:pass]@]host[:port]/[path]'.", nullptr)); + m_urlLineEdit->setToolTip(Tr::tr("For example: 'https://[user[:pass]@]host[:port]/[path]'.", nullptr)); m_urlLineEdit->setEnabled(false); QUrl repoUrl = getRepoUrl(); if (!repoUrl.password().isEmpty()) repoUrl.setPassword(QLatin1String("***")); - m_promptForCredentials = new QCheckBox(tr("Prompt for credentials")); + m_promptForCredentials = new QCheckBox(Tr::tr("Prompt for credentials")); m_promptForCredentials->setChecked(!repoUrl.scheme().isEmpty() && repoUrl.scheme() != QLatin1String("file")); auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); diff --git a/src/plugins/mercurial/srcdestdialog.h b/src/plugins/mercurial/srcdestdialog.h index b448af2ba81..78510ed454e 100644 --- a/src/plugins/mercurial/srcdestdialog.h +++ b/src/plugins/mercurial/srcdestdialog.h @@ -19,8 +19,6 @@ namespace Mercurial::Internal { class SrcDestDialog : public QDialog { - Q_OBJECT - public: enum Direction { outgoing, incoming }; From 0e3d1064e65a9ba336bf3fdd9ef8f7dc75f6fce4 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 5 Oct 2022 18:35:52 +0200 Subject: [PATCH 059/104] CMake: avoid running into some code path that breaks later When trying to configure a CMake project on a remote linux device, there's currently PATH=/some/local/dir/for/ninja added on the ssh command line, which won't work with the remote cmake. Change-Id: I97adb58e4c8b33f74edcc37a7b2cfb00c764b829 Reviewed-by: Cristian Adam --- src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 784ebe419b2..9afa4b8e21b 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -2079,6 +2079,11 @@ FilePath CMakeBuildConfiguration::sourceDirectory() const void CMakeBuildConfiguration::addToEnvironment(Utils::Environment &env) const { + const CMakeTool *tool = CMakeKitAspect::cmakeTool(kit()); + // The hack further down is only relevant for desktop + if (tool && tool->cmakeExecutable().needsDevice()) + return; + CMakeSpecificSettings *settings = CMakeProjectPlugin::projectTypeSpecificSettings(); if (!settings->ninjaPath.filePath().isEmpty()) { const Utils::FilePath ninja = settings->ninjaPath.filePath(); From 239788c1212be23a7acb55eac3d65ea01ccae8e5 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 15:59:16 +0200 Subject: [PATCH 060/104] QtcProcess: Simplify emitting guarded signals Avoid code repetition. Change-Id: I259cb3e9396c0c84dbc63e7929f949580070c382 Reviewed-by: hjk --- src/libs/utils/qtcprocess.cpp | 49 +++++++---------------------------- 1 file changed, 9 insertions(+), 40 deletions(-) diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index b8a31b2a28a..d56721fb956 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -704,11 +704,10 @@ public: void handleDone(const ProcessResultData &data); void clearForRun(); - void emitStarting(); - void emitStarted(); - void emitDone(); - void emitReadyReadStandardOutput(); - void emitReadyReadStandardError(); + void emitGuardedSignal(void (QtcProcess::* signalName)()) { + GuardLocker locker(m_guard); + emit (q->*signalName)(); + } ProcessResult interpretExitCode(int exitCode); @@ -1150,7 +1149,7 @@ void QtcProcess::start() // Pass a dynamic property with info about blocking type d->m_process->setProperty(QTC_PROCESS_BLOCKING_TYPE, property(QTC_PROCESS_BLOCKING_TYPE)); } - d->emitStarting(); + d->emitGuardedSignal(&QtcProcess::starting); d->m_process->start(); } @@ -1946,7 +1945,7 @@ void QtcProcessPrivate::handleStarted(qint64 processId, qint64 applicationMainTh m_processId = processId; m_applicationMainThreadId = applicationMainThreadId; - emitStarted(); + emitGuardedSignal(&QtcProcess::started); } void QtcProcessPrivate::handleReadyRead(const QByteArray &outputData, const QByteArray &errorData) @@ -1964,7 +1963,7 @@ void QtcProcessPrivate::handleReadyRead(const QByteArray &outputData, const QByt std::cout << outputData.constData() << std::flush; } else { m_stdOut.append(outputData); - emitReadyReadStandardOutput(); + emitGuardedSignal(&QtcProcess::readyReadStandardOutput); } } if (!errorData.isEmpty()) { @@ -1973,7 +1972,7 @@ void QtcProcessPrivate::handleReadyRead(const QByteArray &outputData, const QByt std::cerr << errorData.constData() << std::flush; } else { m_stdErr.append(errorData); - emitReadyReadStandardError(); + emitGuardedSignal(&QtcProcess::readyReadStandardError); } } } @@ -2028,41 +2027,11 @@ void QtcProcessPrivate::handleDone(const ProcessResultData &data) m_stdOut.handleRest(); m_stdErr.handleRest(); - emitDone(); + emitGuardedSignal(&QtcProcess::done); m_processId = 0; m_applicationMainThreadId = 0; } -void QtcProcessPrivate::emitStarting() -{ - GuardLocker locker(m_guard); - emit q->starting(); -} - -void QtcProcessPrivate::emitStarted() -{ - GuardLocker locker(m_guard); - emit q->started(); -} - -void QtcProcessPrivate::emitDone() -{ - GuardLocker locker(m_guard); - emit q->done(); -} - -void QtcProcessPrivate::emitReadyReadStandardOutput() -{ - GuardLocker locker(m_guard); - emit q->readyReadStandardOutput(); -} - -void QtcProcessPrivate::emitReadyReadStandardError() -{ - GuardLocker locker(m_guard); - emit q->readyReadStandardError(); -} - } // namespace Utils #include "qtcprocess.moc" From 512edfc60d0825008e04e7aedf1e93c57c015f20 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 16:51:07 +0200 Subject: [PATCH 061/104] QtcProcess: Consolidate the log debug code Reuse starting() signal for doing initial debug printout. Keep dynamic properties in QtcProcessPrivate only, so no need for passing it. Change-Id: I170ea96c37e1b9904037851799316de629bfb86e Reviewed-by: hjk --- src/libs/utils/qtcprocess.cpp | 145 ++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 70 deletions(-) diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index d56721fb956..d92efd3cd2a 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -201,33 +201,8 @@ private: bool ensureProgramExists(const QString &program); }; -static QString blockingMessage(const QVariant &variant) -{ - if (!variant.isValid()) - return "non blocking"; - if (variant.toInt() == int(EventLoopMode::On)) - return "blocking with event loop"; - return "blocking without event loop"; -} - void DefaultImpl::start() { - if (processLog().isDebugEnabled()) { - using namespace std::chrono; - const quint64 msSinceEpoc = - duration_cast(system_clock::now().time_since_epoch()).count(); - setProperty(QTC_PROCESS_STARTTIME, msSinceEpoc); - - static std::atomic_int startCounter = 0; - const int currentNumber = startCounter.fetch_add(1); - qCDebug(processLog).nospace().noquote() - << "Process " << currentNumber << " starting (" - << qPrintable(blockingMessage(property(QTC_PROCESS_BLOCKING_TYPE))) - << "): " - << m_setup.m_commandLine.toUserOutput(); - setProperty(QTC_PROCESS_NUMBER, currentNumber); - } - QString program; QStringList arguments; if (!dissolveCommand(&program, &arguments)) @@ -261,7 +236,7 @@ bool DefaultImpl::dissolveCommand(QString *program, QStringList *arguments) m_setup.m_nativeArguments = args; // Note: Arguments set with setNativeArgs will be appended to the ones // passed with start() below. - *arguments = QStringList(); + *arguments = {}; } else { if (!success) { const ProcessResultData result = {0, @@ -637,8 +612,12 @@ public: m_killTimer.stop(); sendControlSignal(ControlSignal::Kill); }); + setupDebugLog(); } + void setupDebugLog(); + void storeEventLoopDebugInfo(const QVariant &value); + ProcessInterface *createProcessInterface() { if (m_setup.m_terminalMode != TerminalMode::Off) @@ -1008,38 +987,6 @@ QtcProcess::QtcProcess(QObject *parent) static int qProcessProcessErrorMeta = qRegisterMetaType(); Q_UNUSED(qProcessExitStatusMeta) Q_UNUSED(qProcessProcessErrorMeta) - - if (processLog().isDebugEnabled()) { - connect(this, &QtcProcess::done, [this] { - if (!d->m_process.get()) - return; - const QVariant n = d->m_process.get()->property(QTC_PROCESS_NUMBER); - if (!n.isValid()) - return; - using namespace std::chrono; - const quint64 msSinceEpoc = - duration_cast(system_clock::now().time_since_epoch()).count(); - const quint64 msStarted = - d->m_process.get()->property(QTC_PROCESS_STARTTIME).toULongLong(); - const quint64 msElapsed = msSinceEpoc - msStarted; - - const int number = n.toInt(); - qCDebug(processLog).nospace() << "Process " << number << " finished: " - << "result=" << int(result()) - << ", ex=" << exitCode() - << ", " << cleanedStdOut().size() << " bytes stdout: " - << cleanedStdOut().left(20) - << ", " << cleanedStdErr().size() << " bytes stderr: " - << cleanedStdErr().left(1000) - << ", " << msElapsed << " ms elapsed"; - if (processStdoutLog().isDebugEnabled() && !cleanedStdOut().isEmpty()) - qCDebug(processStdoutLog).nospace() - << "Process " << number << " sdout: " << cleanedStdOut(); - if (processStderrLog().isDebugEnabled() && !cleanedStdErr().isEmpty()) - qCDebug(processStderrLog).nospace() - << "Process " << number << " stderr: " << cleanedStdErr(); - }); - } } QtcProcess::~QtcProcess() @@ -1145,10 +1092,6 @@ void QtcProcess::start() d->m_process->m_setup = d->m_setup; d->m_process->m_setup.m_commandLine = d->fullCommandLine(); d->m_process->m_setup.m_environment = d->fullEnvironment(); - if (processLog().isDebugEnabled()) { - // Pass a dynamic property with info about blocking type - d->m_process->setProperty(QTC_PROCESS_BLOCKING_TYPE, property(QTC_PROCESS_BLOCKING_TYPE)); - } d->emitGuardedSignal(&QtcProcess::starting); d->m_process->start(); } @@ -1840,16 +1783,14 @@ static bool isGuiThread() void QtcProcess::runBlocking(EventLoopMode eventLoopMode) { - if (processLog().isDebugEnabled()) { - // Attach a dynamic property with info about blocking type - setProperty(QTC_PROCESS_BLOCKING_TYPE, int(eventLoopMode)); - } + // Attach a dynamic property with info about blocking type + d->storeEventLoopDebugInfo(int(eventLoopMode)); QtcProcess::start(); - if (processLog().isDebugEnabled()) { - // Remove the dynamic property so that it's not reused in subseqent start() - setProperty(QTC_PROCESS_BLOCKING_TYPE, QVariant()); - } + + // Remove the dynamic property so that it's not reused in subseqent start() + d->storeEventLoopDebugInfo({}); + if (eventLoopMode == EventLoopMode::On) { // Start failure is triggered immediately if the executable cannot be found in the path. // In this case the process is left in NotRunning state. @@ -2032,6 +1973,70 @@ void QtcProcessPrivate::handleDone(const ProcessResultData &data) m_applicationMainThreadId = 0; } +static QString blockingMessage(const QVariant &variant) +{ + if (!variant.isValid()) + return "non blocking"; + if (variant.toInt() == int(EventLoopMode::On)) + return "blocking with event loop"; + return "blocking without event loop"; +} + +void QtcProcessPrivate::setupDebugLog() +{ + if (!processLog().isDebugEnabled()) + return; + + auto now = [] { + using namespace std::chrono; + return duration_cast(system_clock::now().time_since_epoch()).count(); + }; + + connect(q, &QtcProcess::starting, this, [=] { + const quint64 msNow = now(); + setProperty(QTC_PROCESS_STARTTIME, msNow); + + static std::atomic_int startCounter = 0; + const int currentNumber = startCounter.fetch_add(1); + qCDebug(processLog).nospace().noquote() + << "Process " << currentNumber << " starting (" + << qPrintable(blockingMessage(property(QTC_PROCESS_BLOCKING_TYPE))) + << "): " << m_setup.m_commandLine.toUserOutput(); + setProperty(QTC_PROCESS_NUMBER, currentNumber); + }); + + connect(q, &QtcProcess::done, this, [=] { + if (!m_process.get()) + return; + const QVariant n = property(QTC_PROCESS_NUMBER); + if (!n.isValid()) + return; + const quint64 msNow = now(); + const quint64 msStarted = property(QTC_PROCESS_STARTTIME).toULongLong(); + const quint64 msElapsed = msNow - msStarted; + + const int number = n.toInt(); + const QString stdOut = q->cleanedStdOut(); + const QString stdErr = q->cleanedStdErr(); + qCDebug(processLog).nospace() + << "Process " << number << " finished: result=" << int(m_result) + << ", ex=" << m_resultData.m_exitCode + << ", " << stdOut.size() << " bytes stdout: " << stdOut.left(20) + << ", " << stdErr.size() << " bytes stderr: " << stdErr.left(1000) + << ", " << msElapsed << " ms elapsed"; + if (processStdoutLog().isDebugEnabled() && !stdOut.isEmpty()) + qCDebug(processStdoutLog).nospace() << "Process " << number << " sdout: " << stdOut; + if (processStderrLog().isDebugEnabled() && !stdErr.isEmpty()) + qCDebug(processStderrLog).nospace() << "Process " << number << " stderr: " << stdErr; + }); +} + +void QtcProcessPrivate::storeEventLoopDebugInfo(const QVariant &value) +{ + if (processLog().isDebugEnabled()) + setProperty(QTC_PROCESS_BLOCKING_TYPE, value); +} + } // namespace Utils #include "qtcprocess.moc" From fa63c68fd9981e49637247079dd8d3a947ace73f Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 17:04:05 +0200 Subject: [PATCH 062/104] QtcProcess: Remove virtual leftover Change-Id: Ib4fa1a115353bf35b0ac310ea9ce4f775d2d1b0c Reviewed-by: hjk --- src/libs/utils/qtcprocess.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index 2a131881289..37a639dba6b 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -55,7 +55,7 @@ public: qint64 applicationMainThreadId() const; QProcess::ProcessState state() const; - virtual ProcessResultData resultData() const; + ProcessResultData resultData() const; int exitCode() const; QProcess::ExitStatus exitStatus() const; From b2ee86ba03c3245da69beb149814ccec7072395f Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 6 Oct 2022 17:06:36 +0200 Subject: [PATCH 063/104] QtcProcess: Small cleanup Change-Id: Ib3c913185b01ad3f81e883bd3013ccb95a863485 Reviewed-by: hjk --- src/libs/utils/qtcprocess.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index d92efd3cd2a..ac46cae9461 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -126,7 +126,7 @@ private: hitThisMainField, totalThisMainField, hitAllMainField, totalAllMainField); qDebug("%s", qPrintable(totalString)); } - static QString formatField(int number, int fieldWidth, const QString &suffix = QString()) + static QString formatField(int number, int fieldWidth, const QString &suffix = {}) { return QString("%1%2").arg(number, fieldWidth - suffix.count()).arg(suffix); } @@ -1338,10 +1338,10 @@ static QString checkBinary(const QDir &dir, const QString &binary) // Does the OS have some weird extension concept or does the // binary have a 3 letter extension? if (HostOsInfo::isAnyUnixHost() && !HostOsInfo::isMacHost()) - return QString(); + return {}; const int dotIndex = binary.lastIndexOf(QLatin1Char('.')); if (dotIndex != -1 && dotIndex == binary.size() - 4) - return QString(); + return {}; switch (HostOsInfo::hostOs()) { case OsTypeLinux: @@ -1373,7 +1373,7 @@ static QString checkBinary(const QDir &dir, const QString &binary) } break; } - return QString(); + return {}; } QString QtcProcess::locateBinary(const QString &path, const QString &binary) @@ -1392,7 +1392,7 @@ QString QtcProcess::locateBinary(const QString &path, const QString &binary) const QStringList paths = path.split(HostOsInfo::pathListSeparator()); if (paths.empty()) - return QString(); + return {}; const QStringList::const_iterator cend = paths.constEnd(); for (QStringList::const_iterator it = paths.constBegin(); it != cend; ++it) { const QDir dir(*it); @@ -1400,7 +1400,7 @@ QString QtcProcess::locateBinary(const QString &path, const QString &binary) if (!rc.isEmpty()) return rc; } - return QString(); + return {}; } Environment QtcProcess::systemEnvironmentForBinary(const FilePath &filePath) @@ -1584,7 +1584,7 @@ QString QtcProcess::exitMessage() const return QtcProcess::tr("The command \"%1\" did not respond within the timeout limit (%2 s).") .arg(fullCmd).arg(d->m_maxHangTimerCount); } - return QString(); + return {}; } QByteArray QtcProcess::allRawOutput() const From 7a1696a0acb94808fd2b70c1b9ce2729f4e829fc Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 5 Oct 2022 17:11:09 +0200 Subject: [PATCH 064/104] Utils: Add a convienience function FileFilter::asFindArguments Re-usable in a variety of unix-based devices. Change-Id: I480ad9b128336059752b99dc1f1ae3b4899a4077 Reviewed-by: Christian Kandeler --- src/libs/utils/filepath.cpp | 75 +++++++++++++++++++++++++++++++++++++ src/libs/utils/filepath.h | 2 + 2 files changed, 77 insertions(+) diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index 6ba842a9fed..0f9d245142c 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -1828,6 +1828,81 @@ FileFilter::FileFilter(const QStringList &nameFilters, { } +QStringList FileFilter::asFindArguments() const +{ + QStringList arguments; + + const QDir::Filters filters = fileFilters; + if (filters & QDir::NoSymLinks) + arguments.prepend("-H"); + else + arguments.prepend("-L"); + + arguments.append({"-mindepth", "1"}); + + if (!iteratorFlags.testFlag(QDirIterator::Subdirectories)) + arguments.append({"-maxdepth", "1"}); + + QStringList filterOptions; + + if (!(filters & QDir::Hidden)) + filterOptions << "!" << "-name" << ".*"; + + QStringList filterFilesAndDirs; + if (filters & QDir::Dirs) + filterFilesAndDirs << "-type" << "d"; + if (filters & QDir::Files) { + if (!filterFilesAndDirs.isEmpty()) + filterFilesAndDirs << "-o"; + filterFilesAndDirs << "-type" << "f"; + } + if (!filterFilesAndDirs.isEmpty()) + filterOptions << "(" << filterFilesAndDirs << ")"; + + QStringList accessOptions; + if (filters & QDir::Readable) + accessOptions << "-readable"; + if (filters & QDir::Writable) { + if (!accessOptions.isEmpty()) + accessOptions << "-o"; + accessOptions << "-writable"; + } + if (filters & QDir::Executable) { + if (!accessOptions.isEmpty()) + accessOptions << "-o"; + accessOptions << "-executable"; + } + + if (!accessOptions.isEmpty()) + filterOptions << "(" << accessOptions << ")"; + + QTC_CHECK(filters ^ QDir::AllDirs); + QTC_CHECK(filters ^ QDir::Drives); + QTC_CHECK(filters ^ QDir::NoDot); + QTC_CHECK(filters ^ QDir::NoDotDot); + QTC_CHECK(filters ^ QDir::System); + + const QString nameOption = (filters & QDir::CaseSensitive) ? QString{"-name"} + : QString{"-iname"}; + if (!nameFilters.isEmpty()) { + const QRegularExpression oneChar("\\[.*?\\]"); + bool addedFirst = false; + for (const QString ¤t : nameFilters) { + if (current.indexOf(oneChar) != -1) { + qDebug() << "Skipped" << current << "due to presence of [] wildcard"; + continue; + } + + if (addedFirst) + filterOptions << "-o"; + filterOptions << nameOption << current; + addedFirst = true; + } + } + arguments << filterOptions; + return arguments; +} + DeviceFileHooks &DeviceFileHooks::instance() { return s_deviceHooks; diff --git a/src/libs/utils/filepath.h b/src/libs/utils/filepath.h index 75491b96c62..325eaeabf2d 100644 --- a/src/libs/utils/filepath.h +++ b/src/libs/utils/filepath.h @@ -36,6 +36,8 @@ public: const QDir::Filters fileFilters = QDir::NoFilter, const QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags); + QStringList asFindArguments() const; + const QStringList nameFilters; const QDir::Filters fileFilters = QDir::NoFilter; const QDirIterator::IteratorFlags iteratorFlags = QDirIterator::NoIteratorFlags; From 0ba06e1b184f5b73b6730ce759b963cf2f2fad4a Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 5 Oct 2022 15:53:36 +0200 Subject: [PATCH 065/104] ProjectExplorer: Use more generous first approximation for isReachable() There's a correlation between files that a device wishes to handle and files it considers reachable. Change-Id: I485ce59c09d9155d5d4db41ddc52f675d6c5d225 Reviewed-by: Qt CI Bot Reviewed-by: hjk Reviewed-by: Marcus Tillmanns --- src/plugins/projectexplorer/devicesupport/idevice.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 47fe983f06f..7b723a2fcee 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -821,8 +821,7 @@ QString IDevice::defaultPublicKeyFilePath() bool IDevice::ensureReachable(const FilePath &other) const { - Q_UNUSED(other) - return false; + return handlesFile(other); // Some first approximation. } bool IDevice::prepareForBuild(const Target *target) From d267db91ea0a8a3e533f98578985350a582884ba Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 6 Oct 2022 17:39:41 +0200 Subject: [PATCH 066/104] Android: Fix compilation with clang-cl and Qt 6.4.0 Fixes the following error: C:\Projects\QtCreator\repo\src\plugins\android\androidrunnerworker.cpp(74,54): error: call to member function 'remove' is ambiguous const QStringList parts = tuple.simplified().remove('\0').split(':'); ~~~~~~~~~~~~~~~~~~~^~~~~~ C:\Qt\6.4.0\clang-cl_arm64\include\QtCore/qstring.h(704,14): note: candidate function QString &remove(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive); ^ C:\Qt\6.4.0\clang-cl_arm64\include\QtCore/qstring.h(705,14): note: candidate function QString &remove(QLatin1StringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive); Amends 2846bef5632 Change-Id: I03bf54e5a6c8d2cbc0c2842399c84bf12ffece56 Reviewed-by: Assam Boudjelthia Reviewed-by: --- src/plugins/android/androidrunnerworker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 491946661b6..b232847188c 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -71,7 +71,7 @@ static qint64 extractPID(const QString &output, const QString &packageName) qint64 pid = -1; for (const QString &tuple : output.split('\n')) { // Make sure to remove null characters which might be present in the provided output - const QStringList parts = tuple.simplified().remove('\0').split(':'); + const QStringList parts = tuple.simplified().remove(QChar('\0')).split(':'); if (parts.length() == 2 && parts.first() == packageName) { pid = parts.last().toLongLong(); break; From 708b119473a0e3b4ca1bfe58ea292e28aac0c74b Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 6 Oct 2022 17:59:20 +0200 Subject: [PATCH 067/104] Git: Fix include directive Change-Id: I35aff37fff00f020044c84ef288234146ebd5ade Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Orgad Shaneh Reviewed-by: Alessandro Portale --- src/plugins/git/gerrit/gerritoptionspage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/git/gerrit/gerritoptionspage.cpp b/src/plugins/git/gerrit/gerritoptionspage.cpp index af7774f905d..bd668a77eea 100644 --- a/src/plugins/git/gerrit/gerritoptionspage.cpp +++ b/src/plugins/git/gerrit/gerritoptionspage.cpp @@ -4,7 +4,7 @@ #include "gerritoptionspage.h" #include "gerritparameters.h" #include "gerritserver.h" -#include "gittr.h" +#include "../gittr.h" #include #include From 807dd17f75b9188ee5a0ac9b0375af5eb1c7983f Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 6 Oct 2022 18:04:22 +0200 Subject: [PATCH 068/104] Utils: Fix compilation on Windows Arm64 Amends 6b6358178e9 Change-Id: Ia94afaa833c4cfebb1b6792ccff289cdf76d1529 Reviewed-by: Reviewed-by: David Schulz --- src/libs/utils/qtcassert.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/qtcassert.cpp b/src/libs/utils/qtcassert.cpp index eb41143ff56..0c24ea0fc7f 100644 --- a/src/libs/utils/qtcassert.cpp +++ b/src/libs/utils/qtcassert.cpp @@ -37,7 +37,7 @@ void dumpBacktrace(int maxdepth) free(lines); #elif defined(_MSC_VER) DWORD machineType; -#if defined(Q_OS_WIN64) +#if defined(Q_OS_WIN64) && !defined(_ARM64_) machineType = IMAGE_FILE_MACHINE_AMD64; #else return; @@ -50,7 +50,7 @@ void dumpBacktrace(int maxdepth) RtlCaptureContext(&ctx); STACKFRAME64 frame; memset(&frame, 0, sizeof(STACKFRAME64)); -#if defined(Q_OS_WIN64) +#if defined(Q_OS_WIN64) && !defined(_ARM64_) frame.AddrPC.Offset = ctx.Rip; frame.AddrPC.Mode = AddrModeFlat; frame.AddrStack.Offset = ctx.Rsp; From 5bc5274a5bc18e46d7487812f221d21674375df5 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 19 Sep 2022 14:55:56 +0200 Subject: [PATCH 069/104] Take "Toggle Progress Details" immediately into effect When the progress details are visible, and the user clicks the button, the details should immediately vanish. Before this patch, the progress details stay visible until the user moves the mouse away from the button, so clicking the button doesn't have an immediate effect, which is pretty confusing. Task-number: QTCREATORBUG-28078 Change-Id: Ia80ab48fc0a012e8ae17dea454f83747e5717e72 Reviewed-by: Alessandro Portale --- src/plugins/coreplugin/progressmanager/progressmanager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/coreplugin/progressmanager/progressmanager.cpp b/src/plugins/coreplugin/progressmanager/progressmanager.cpp index 9ed188ecbdf..682cbb38e7d 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager.cpp +++ b/src/plugins/coreplugin/progressmanager/progressmanager.cpp @@ -664,6 +664,8 @@ void ProgressManagerPrivate::summaryProgressFinishedFading() void ProgressManagerPrivate::progressDetailsToggled(bool checked) { m_progressViewPinned = checked; + if (!checked) + m_hovered = false; // make it take effect immediately even though the mouse is on the button updateVisibility(); QtcSettings *settings = ICore::settings(); From 0c39484b600254f5ce50f222563991624575d129 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 13:41:21 +0200 Subject: [PATCH 070/104] Todo plugin: Replace foreach with ranged for loop Change-Id: Iff18b1dbc556fe48df6ba086774662e8b9231491 Reviewed-by: hjk Reviewed-by: --- src/plugins/todo/cpptodoitemsscanner.cpp | 3 ++- src/plugins/todo/lineparser.cpp | 2 +- src/plugins/todo/qmljstodoitemsscanner.cpp | 6 ++++-- src/plugins/todo/todoitemsprovider.cpp | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/plugins/todo/cpptodoitemsscanner.cpp b/src/plugins/todo/cpptodoitemsscanner.cpp index 8a3bf01a28e..47a020ff4fc 100644 --- a/src/plugins/todo/cpptodoitemsscanner.cpp +++ b/src/plugins/todo/cpptodoitemsscanner.cpp @@ -36,7 +36,8 @@ void CppTodoItemsScanner::scannerParamsChanged() CppEditor::CppModelManager *modelManager = CppEditor::CppModelManager::instance(); QSet filesToBeUpdated; - foreach (const CppEditor::ProjectInfo::ConstPtr &info, modelManager->projectInfos()) + const CppEditor::ProjectInfoList infoList = modelManager->projectInfos(); + for (const CppEditor::ProjectInfo::ConstPtr &info : infoList) filesToBeUpdated.unite(info->sourceFiles()); modelManager->updateSourceFiles(filesToBeUpdated); diff --git a/src/plugins/todo/lineparser.cpp b/src/plugins/todo/lineparser.cpp index 330ded81681..fbd2e415c97 100644 --- a/src/plugins/todo/lineparser.cpp +++ b/src/plugins/todo/lineparser.cpp @@ -136,7 +136,7 @@ QList LineParser::todoItemsFromKeywordEntries(const QList todoItems; - foreach (const KeywordEntry &entry, entries) { + for (const KeywordEntry &entry : entries) { TodoItem item; item.text = m_keywords.at(entry.keywordIndex).name + entry.text; item.color = m_keywords.at(entry.keywordIndex).color; diff --git a/src/plugins/todo/qmljstodoitemsscanner.cpp b/src/plugins/todo/qmljstodoitemsscanner.cpp index e9fd3f7d92b..e3857425853 100644 --- a/src/plugins/todo/qmljstodoitemsscanner.cpp +++ b/src/plugins/todo/qmljstodoitemsscanner.cpp @@ -26,7 +26,8 @@ QmlJsTodoItemsScanner::QmlJsTodoItemsScanner(const KeywordList &keywordList, QOb bool QmlJsTodoItemsScanner::shouldProcessFile(const Utils::FilePath &fileName) { QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); - foreach (const QmlJS::ModelManagerInterface::ProjectInfo &info, modelManager->projectInfos()) { + const QList infoList = modelManager->projectInfos(); + for (const QmlJS::ModelManagerInterface::ProjectInfo &info : infoList) { if (info.sourceFiles.contains(fileName)) return true; } @@ -58,7 +59,8 @@ void QmlJsTodoItemsScanner::processDocument(QmlJS::Document::Ptr doc) { QList itemList; - foreach (const QmlJS::SourceLocation &sourceLocation, doc->engine()->comments()) { + const QList sourceLocations = doc->engine()->comments(); + for (const QmlJS::SourceLocation &sourceLocation : sourceLocations) { QString source = doc->source().mid(sourceLocation.begin(), sourceLocation.length).trimmed(); // Process every line diff --git a/src/plugins/todo/todoitemsprovider.cpp b/src/plugins/todo/todoitemsprovider.cpp index bc49ec350df..52803e839f0 100644 --- a/src/plugins/todo/todoitemsprovider.cpp +++ b/src/plugins/todo/todoitemsprovider.cpp @@ -47,7 +47,7 @@ TodoItemsModel *TodoItemsProvider::todoItemsModel() void TodoItemsProvider::settingsChanged(const Settings &newSettings) { if (newSettings.keywords != m_settings.keywords) { - foreach (TodoItemsScanner *scanner, m_scanners) + for (TodoItemsScanner *scanner : qAsConst(m_scanners)) scanner->setParams(newSettings.keywords); } @@ -92,7 +92,7 @@ void TodoItemsProvider::createScanners() if (QmlJS::ModelManagerInterface::instance()) m_scanners << new QmlJsTodoItemsScanner(m_settings.keywords, this); - foreach (TodoItemsScanner *scanner, m_scanners) { + for (TodoItemsScanner *scanner : qAsConst(m_scanners)) { connect(scanner, &TodoItemsScanner::itemsFetched, this, &TodoItemsProvider::itemsFetched, Qt::QueuedConnection); } From bc4c1faf73d6ac9f79cc662dca695dd21ed9e6eb Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 30 Sep 2022 18:45:35 +0200 Subject: [PATCH 071/104] Fix logical XOR The '^' is the bitwise XOR, we should use logical XOR in these contexts. The operator!=() should serve for it. More info and reasoning: https://stackoverflow.com/questions/24542 Change-Id: I1bd70bdcab25455f409594f0f14c209d1de11d18 Reviewed-by: David Schulz Reviewed-by: hjk Reviewed-by: --- src/plugins/debugger/debuggermainwindow.cpp | 2 +- src/plugins/debugger/debuggertooltipmanager.cpp | 2 +- src/plugins/debugger/threadshandler.cpp | 4 ++-- src/plugins/fakevim/fakevimhandler.cpp | 2 +- src/plugins/texteditor/fontsettingspage.cpp | 4 ++-- src/plugins/texteditor/highlighter.cpp | 3 ++- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index d4543eb6f83..af1ab3ab194 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -999,7 +999,7 @@ void PerspectivePrivate::restoreLayout() if (op.operationType != Perspective::Raise) { op.ensureDockExists(); QTC_ASSERT(op.dock, continue); - const bool active = op.visibleByDefault ^ op.changedByUser(); + const bool active = op.visibleByDefault != op.changedByUser(); op.dock->setVisible(active); qCDebug(perspectivesLog) << "RESTORE DOCK " << op.name() << "ACTIVE: " << active << (active == op.visibleByDefault ? "DEFAULT USER" : "*** NON-DEFAULT USER"); diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp index b66a64ce6df..20021e9798c 100644 --- a/src/plugins/debugger/debuggertooltipmanager.cpp +++ b/src/plugins/debugger/debuggertooltipmanager.cpp @@ -1333,7 +1333,7 @@ bool DebuggerToolTipManagerPrivate::eventFilter(QObject *o, QEvent *e) const auto se = static_cast(e); const bool wasMinimized = se->oldState() & Qt::WindowMinimized; const bool isMinimized = static_cast(o)->windowState() & Qt::WindowMinimized; - if (wasMinimized ^ isMinimized) { + if (wasMinimized != isMinimized) { purgeClosedToolTips(); for (DebuggerToolTipHolder *tooltip : qAsConst(m_tooltips)) tooltip->widget->setVisible(!isMinimized); diff --git a/src/plugins/debugger/threadshandler.cpp b/src/plugins/debugger/threadshandler.cpp index 040f4f947bc..e353c09a0f3 100644 --- a/src/plugins/debugger/threadshandler.cpp +++ b/src/plugins/debugger/threadshandler.cpp @@ -244,9 +244,9 @@ void ThreadsHandler::sort(int column, Qt::SortOrder order) if (v1 == v2) return false; if (column == 0) - return (v1.toInt() < v2.toInt()) ^ (order == Qt::DescendingOrder); + return (v1.toInt() < v2.toInt()) != (order == Qt::DescendingOrder); // FIXME: Use correct toXXX(); - return (v1.toString() < v2.toString()) ^ (order == Qt::DescendingOrder); + return (v1.toString() < v2.toString()) != (order == Qt::DescendingOrder); }); } diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index a280edd32f2..bcde351b8c3 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -6519,7 +6519,7 @@ bool FakeVimHandler::Private::handleExMultiRepeatCommand(const ExCommand &cmd) const Range range(pos, pos, RangeLineMode); const QString lineContents = selectText(range); const QRegularExpressionMatch match = re.match(lineContents); - if (match.hasMatch() ^ negates) { + if (match.hasMatch() != negates) { QTextCursor tc(document()); tc.setPosition(pos); matches.append(tc); diff --git a/src/plugins/texteditor/fontsettingspage.cpp b/src/plugins/texteditor/fontsettingspage.cpp index 063f2047b69..bf1500d5eed 100644 --- a/src/plugins/texteditor/fontsettingspage.cpp +++ b/src/plugins/texteditor/fontsettingspage.cpp @@ -406,8 +406,8 @@ QColor FormatDescription::defaultBackground(TextStyle id) smallRatio = .05; largeRatio = .4; } - const qreal ratio = ((palette.color(QPalette::Text).value() < 128) - ^ (palette.color(QPalette::HighlightedText).value() < 128)) ? smallRatio : largeRatio; + const qreal ratio = ((palette.color(QPalette::Text).value() < 128) != + (palette.color(QPalette::HighlightedText).value() < 128)) ? smallRatio : largeRatio; const QColor &col = QColor::fromRgbF(fg.redF() * ratio + bg.redF() * (1 - ratio), fg.greenF() * ratio + bg.greenF() * (1 - ratio), diff --git a/src/plugins/texteditor/highlighter.cpp b/src/plugins/texteditor/highlighter.cpp index 3546a27e1da..9c25925486d 100644 --- a/src/plugins/texteditor/highlighter.cpp +++ b/src/plugins/texteditor/highlighter.cpp @@ -299,7 +299,8 @@ void Highlighter::highlightBlock(const QString &text) TextBlockUserData *data = TextDocumentLayout::userData(nextBlock); if (data->syntaxState() != state) { data->setSyntaxState(state); - setCurrentBlockState(currentBlockState() ^ 1); // force rehighlight of next block + // Toggles the LSB of current block's userState. It forces rehighlight of next block. + setCurrentBlockState(currentBlockState() ^ 1); } data->setFoldingIndent(TextDocumentLayout::braceDepth(block)); } From 9feeb818479f1ceac5d109cfb358488298f52390 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 13:47:56 +0200 Subject: [PATCH 072/104] Various plugins: Replace foreach with ranged for loop Change-Id: If212c5e277de671b3ddd67d26ad1bdbc69213174 Reviewed-by: hjk Reviewed-by: --- src/plugins/beautifier/abstractsettings.cpp | 2 +- src/plugins/bookmarks/bookmarkmanager.cpp | 6 +++--- src/plugins/genericprojectmanager/genericprojectwizard.cpp | 7 +++---- src/plugins/imageviewer/exportdialog.cpp | 3 ++- src/plugins/qbsprojectmanager/qbsbuildstep.cpp | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/plugins/beautifier/abstractsettings.cpp b/src/plugins/beautifier/abstractsettings.cpp index 8da36f47681..42371aec0bc 100644 --- a/src/plugins/beautifier/abstractsettings.cpp +++ b/src/plugins/beautifier/abstractsettings.cpp @@ -258,7 +258,7 @@ void AbstractSettings::save() return; // remove old files and possible subfolder - foreach (const QString &key, m_stylesToRemove) { + for (const QString &key : qAsConst(m_stylesToRemove)) { const QFileInfo fi(styleFileName(key)); QFile::remove(fi.absoluteFilePath()); if (fi.absoluteDir() != m_styleDir) diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp index 41a46590b66..121ea783190 100644 --- a/src/plugins/bookmarks/bookmarkmanager.cpp +++ b/src/plugins/bookmarks/bookmarkmanager.cpp @@ -377,7 +377,7 @@ QStringList BookmarkManager::mimeTypes() const QMimeData *BookmarkManager::mimeData(const QModelIndexList &indexes) const { auto data = new DropMimeData; - foreach (const QModelIndex &index, indexes) { + for (const QModelIndex &index : indexes) { if (!index.isValid() || index.column() != 0 || index.row() < 0 || index.row() >= m_bookmarksList.count()) continue; Bookmark *bookMark = m_bookmarksList.at(index.row()); @@ -748,7 +748,7 @@ QString BookmarkManager::bookmarkToString(const Bookmark *b) void BookmarkManager::saveBookmarks() { QStringList list; - foreach (const Bookmark *bookmark, m_bookmarksList) + for (const Bookmark *bookmark : qAsConst(m_bookmarksList)) list << bookmarkToString(bookmark); SessionManager::setValue(QLatin1String("Bookmarks"), list); @@ -759,7 +759,7 @@ void BookmarkManager::loadBookmarks() { removeAllBookmarks(); const QStringList &list = SessionManager::value(QLatin1String("Bookmarks")).toStringList(); - foreach (const QString &bookmarkString, list) + for (const QString &bookmarkString : list) addBookmark(bookmarkString); updateActionStatus(); diff --git a/src/plugins/genericprojectmanager/genericprojectwizard.cpp b/src/plugins/genericprojectmanager/genericprojectwizard.cpp index 2fe8ad6f1cd..d7376cb739d 100644 --- a/src/plugins/genericprojectmanager/genericprojectwizard.cpp +++ b/src/plugins/genericprojectmanager/genericprojectwizard.cpp @@ -107,10 +107,9 @@ Core::BaseFileWizard *GenericProjectWizard::create(QWidget *parent, const Core::WizardDialogParameters ¶meters) const { auto wizard = new GenericProjectWizardDialog(this, parent); - wizard->setFilePath(parameters.defaultPath()); - - foreach (QWizardPage *p, wizard->extensionPages()) + const QList pages = wizard->extensionPages(); + for (QWizardPage *p : pages) wizard->addPage(p); return wizard; @@ -138,7 +137,7 @@ Core::GeneratedFiles GenericProjectWizard::generateFiles(const QWizard *w, QStringList includePaths; const QDir dir(projectPath.toString()); - foreach (const QString &path, paths) { + for (const QString &path : paths) { QFileInfo fileInfo(path); QDir thisDir(fileInfo.absoluteFilePath()); diff --git a/src/plugins/imageviewer/exportdialog.cpp b/src/plugins/imageviewer/exportdialog.cpp index 2226a6e7e02..4dff0527428 100644 --- a/src/plugins/imageviewer/exportdialog.cpp +++ b/src/plugins/imageviewer/exportdialog.cpp @@ -35,7 +35,8 @@ QString ExportDialog::imageNameFilterString() if (result.isEmpty()) { QMimeDatabase mimeDatabase; const QString separator = ";;"; - foreach (const QByteArray &mimeType, QImageWriter::supportedMimeTypes()) { + const QList mimeTypes = QImageWriter::supportedMimeTypes(); + for (const QByteArray &mimeType : mimeTypes) { const QString filter = mimeDatabase.mimeTypeForName(QLatin1String(mimeType)).filterString(); if (!filter.isEmpty()) { if (mimeType == QByteArrayLiteral("image/png")) { diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index c5f96014000..10b10394a18 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -832,7 +832,7 @@ QbsBuildStep *QbsBuildStepConfigWidget::qbsStep() const bool QbsBuildStepConfigWidget::validateProperties(Utils::FancyLineEdit *edit, QString *errorMessage) { ProcessArgs::SplitError err; - QStringList argList = ProcessArgs::splitArgs(edit->text(), HostOsInfo::hostOs(), false, &err); + const QStringList argList = ProcessArgs::splitArgs(edit->text(), HostOsInfo::hostOs(), false, &err); if (err != ProcessArgs::SplitOk) { if (errorMessage) *errorMessage = QbsProjectManager::Tr::tr("Could not split properties."); From 43bc23557f5c4c5829e0e6b5aa5b89401b50f60d Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 13:27:13 +0200 Subject: [PATCH 073/104] ResourceFile: Don't derive from QList Add a static helper instead. Change-Id: Id9711355e3dacacd2764249080b608dbbe124565 Reviewed-by: hjk --- src/plugins/resourceeditor/qrceditor/resourcefile.cpp | 8 ++++---- src/plugins/resourceeditor/qrceditor/resourcefile_p.h | 6 +----- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/plugins/resourceeditor/qrceditor/resourcefile.cpp b/src/plugins/resourceeditor/qrceditor/resourcefile.cpp index ab2ecfff058..a5f70b24aef 100644 --- a/src/plugins/resourceeditor/qrceditor/resourcefile.cpp +++ b/src/plugins/resourceeditor/qrceditor/resourcefile.cpp @@ -66,9 +66,9 @@ void File::setExists(bool exists) ** FileList */ -bool FileList::containsFile(File *file) +static bool containsFile(const FileList &list, File *file) { - foreach (const File *tmpFile, *this) + for (const File *tmpFile : list) if (tmpFile->name == file->name && tmpFile->prefix() == file->prefix()) return true; return false; @@ -453,7 +453,7 @@ bool ResourceFile::contains(const QString &prefix, const QString &lang, const QS Prefix * const p = m_prefix_list.at(pref_idx); Q_ASSERT(p); File equalFile(p, absolutePath(file)); - return p->file_list.containsFile(&equalFile); + return containsFile(p->file_list, &equalFile); } bool ResourceFile::contains(int pref_idx, const QString &file) const @@ -461,7 +461,7 @@ bool ResourceFile::contains(int pref_idx, const QString &file) const Q_ASSERT(pref_idx >= 0 && pref_idx < m_prefix_list.count()); Prefix * const p = m_prefix_list.at(pref_idx); File equalFile(p, absolutePath(file)); - return p->file_list.containsFile(&equalFile); + return containsFile(p->file_list, &equalFile); } /*static*/ QString ResourceFile::fixPrefix(const QString &prefix) diff --git a/src/plugins/resourceeditor/qrceditor/resourcefile_p.h b/src/plugins/resourceeditor/qrceditor/resourcefile_p.h index e9d2a521440..3a811a98e9c 100644 --- a/src/plugins/resourceeditor/qrceditor/resourcefile_p.h +++ b/src/plugins/resourceeditor/qrceditor/resourcefile_p.h @@ -70,11 +70,7 @@ private: bool m_exists; }; -class FileList : public QList -{ -public: - bool containsFile(File *file); -}; +using FileList = QList; /*! \class Prefix From bbf55a881af3d23a5aae5a678bf7a1873cb21844 Mon Sep 17 00:00:00 2001 From: Mats Honkamaa Date: Fri, 7 Oct 2022 09:19:54 +0300 Subject: [PATCH 074/104] Doc: Mention that Translations is part of enterprise license Task-number: QDS-7872 Change-Id: Iff54117d0729411805e2e0f468a2195c5e834cbf Reviewed-by: Leena Miettinen --- doc/qtdesignstudio/src/views/studio-translations.qdoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/qtdesignstudio/src/views/studio-translations.qdoc b/doc/qtdesignstudio/src/views/studio-translations.qdoc index 5d9ee88ab96..0e6f24f94c1 100644 --- a/doc/qtdesignstudio/src/views/studio-translations.qdoc +++ b/doc/qtdesignstudio/src/views/studio-translations.qdoc @@ -30,6 +30,9 @@ \title Translations + The \uicontrol Translations view is included in the + \l{https://www.qt.io/pricing}{Qt Design Studio Enterprise license}. + You handle translations and multi-language support in the \uicontrol {Translations} view. From e1cc52bb8054479fdf857bd89c12a824bc6627b7 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 13:48:26 +0200 Subject: [PATCH 075/104] QbsProjectManager: Replace foreach with ranged for loop Change-Id: I7d11424d5ef6ffa62671eff597845b8b5c39f443 Reviewed-by: Reviewed-by: Christian Kandeler --- src/plugins/qbsprojectmanager/qbsbuildstep.cpp | 2 +- src/plugins/qbsprojectmanager/qbsprojectimporter.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 10b10394a18..80c137ca449 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -841,7 +841,7 @@ bool QbsBuildStepConfigWidget::validateProperties(Utils::FancyLineEdit *edit, QS QList properties; const MacroExpander * const expander = m_qbsStep->macroExpander(); - foreach (const QString &rawArg, argList) { + for (const QString &rawArg : argList) { int pos = rawArg.indexOf(':'); if (pos > 0) { const QString propertyName = rawArg.left(pos); diff --git a/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp b/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp index 0010aa53343..7ef50a4e30c 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp @@ -181,7 +181,7 @@ Kit *QbsProjectImporter::createKit(void *directoryData) const tcData << findOrCreateToolChains({bgData->cxxCompilerPath, Constants::CXX_LANGUAGE_ID}); if (!bgData->cCompilerPath.isEmpty()) tcData << findOrCreateToolChains({bgData->cCompilerPath, Constants::C_LANGUAGE_ID}); - foreach (const ToolChainData &tc, tcData) { + for (const ToolChainData &tc : qAsConst(tcData)) { if (!tc.tcs.isEmpty()) ToolChainKitAspect::setToolChain(k, tc.tcs.first()); } From 0b04a83ce310edfec16bfe2939ab9f65e329d4d0 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2022 13:30:53 +0200 Subject: [PATCH 076/104] ResourceEditor: Replace foreach with ranged for loop Change-Id: I49f59b6cb42b331613092b0aac82dd9bc4197cfe Reviewed-by: hjk --- .../resourceeditor/qrceditor/resourcefile.cpp | 28 +++++++++---------- src/plugins/resourceeditor/resourcenode.cpp | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/plugins/resourceeditor/qrceditor/resourcefile.cpp b/src/plugins/resourceeditor/qrceditor/resourcefile.cpp index a5f70b24aef..a937ce16740 100644 --- a/src/plugins/resourceeditor/qrceditor/resourcefile.cpp +++ b/src/plugins/resourceeditor/qrceditor/resourcefile.cpp @@ -183,8 +183,8 @@ QString ResourceFile::contents() const QDomElement root = doc.createElement(QLatin1String("RCC")); doc.appendChild(root); - foreach (const Prefix *pref, m_prefix_list) { - FileList file_list = pref->file_list; + for (const Prefix *pref : m_prefix_list) { + const FileList file_list = pref->file_list; const QString &name = pref->name; const QString &lang = pref->lang; @@ -194,7 +194,7 @@ QString ResourceFile::contents() const if (!lang.isEmpty()) relt.setAttribute(QLatin1String("lang"), lang); - foreach (const File *f, file_list) { + for (const File *f : file_list) { const File &file = *f; QDomElement felt = doc.createElement(QLatin1String("file")); relt.appendChild(felt); @@ -230,7 +230,7 @@ void ResourceFile::refresh() { for (int i = 0; i < prefixCount(); ++i) { const FileList &file_list = m_prefix_list.at(i)->file_list; - foreach (File *file, file_list) + for (File *file : file_list) file->checkExistence(); } } @@ -344,7 +344,7 @@ bool ResourceFile::renameFile(const QString &fileName, const QString &newFileNam FileList entries; for (int i = 0; i < prefixCount(); ++i) { const FileList &file_list = m_prefix_list.at(i)->file_list; - foreach (File *file, file_list) { + for (File *file : file_list) { if (file->name == fileName) entries.append(file); if (file->name == newFileName) @@ -356,15 +356,15 @@ bool ResourceFile::renameFile(const QString &fileName, const QString &newFileNam entries.at(0)->checkExistence(); if (entries.at(0)->exists()) { - foreach (File *file, entries) + for (File *file : qAsConst(entries)) file->setExists(true); success = Core::FileUtils::renameFile(Utils::FilePath::fromString(entries.at(0)->name), Utils::FilePath::fromString(newFileName)); } if (success) { - bool exists = QFile::exists(newFileName); - foreach (File *file, entries) { + const bool exists = QFile::exists(newFileName); + for (File *file : qAsConst(entries)) { file->name = newFileName; file->setExists(exists); } @@ -708,14 +708,14 @@ bool ResourceModel::iconFileExtension(const QString &path) static QStringList ext_list; if (ext_list.isEmpty()) { const QList _ext_list = QImageReader::supportedImageFormats(); - foreach (const QByteArray &ext, _ext_list) { + for (const QByteArray &ext : _ext_list) { QString dotExt = QString(QLatin1Char('.')); dotExt += QString::fromLatin1(ext); ext_list.append(dotExt); } } - foreach (const QString &ext, ext_list) { + for (const QString &ext : qAsConst(ext_list)) { if (path.endsWith(ext, Qt::CaseInsensitive)) return true; } @@ -936,7 +936,7 @@ QStringList ResourceModel::existingFilesSubtracted(int prefixIndex, const QStrin QStringList uniqueList; if (prefixModelIdx.isValid()) { - foreach (const QString &file, fileNames) { + for (const QString &file : fileNames) { if (!m_resource_file.contains(prefixIndex, file) && !uniqueList.contains(file)) uniqueList.append(file); } @@ -955,7 +955,7 @@ void ResourceModel::addFiles(int prefixIndex, const QStringList &fileNames, int if (!prefix_model_idx.isValid()) return; - QStringList unique_list = existingFilesSubtracted(prefixIndex, fileNames); + const QStringList unique_list = existingFilesSubtracted(prefixIndex, fileNames); if (unique_list.isEmpty()) return; @@ -963,7 +963,7 @@ void ResourceModel::addFiles(int prefixIndex, const QStringList &fileNames, int const int cnt = m_resource_file.fileCount(prefixIndex); beginInsertRows(prefix_model_idx, cnt, cnt + unique_list.count() - 1); // ### FIXME - foreach (const QString &file, unique_list) + for (const QString &file : unique_list) m_resource_file.addFile(prefixIndex, file); const QFileInfo fi(unique_list.last()); @@ -1186,7 +1186,7 @@ public: void PrefixEntryBackup::restore() const { m_model->insertPrefix(m_prefixIndex, m_name, m_language); - foreach (const FileEntryBackup &entry, m_files) { + for (const FileEntryBackup &entry : m_files) { entry.restore(); } } diff --git a/src/plugins/resourceeditor/resourcenode.cpp b/src/plugins/resourceeditor/resourcenode.cpp index e75e91f5751..f90ccbef008 100644 --- a/src/plugins/resourceeditor/resourcenode.cpp +++ b/src/plugins/resourceeditor/resourcenode.cpp @@ -321,7 +321,7 @@ void ResourceTopLevelNode::addInternalNodes() QString parentFolderName; PrefixFolderLang folderId(prefix, QString(), lang); QStringList currentPathList; - foreach (const QString &pathElement, pathList) { + for (const QString &pathElement : qAsConst(pathList)) { currentPathList << pathElement; const QString folderName = currentPathList.join(QLatin1Char('/')); folderId = PrefixFolderLang(prefix, folderName, lang); From 8dcb22d5e9d4cee0e05d152d35382bf3ad8e3105 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 6 Oct 2022 13:55:46 +0200 Subject: [PATCH 077/104] Editor: fix go to line start Do not try to find the first none space character of a block if we already handled the home key for a line that does not contain the start of the block. Fixes: QTCREATORBUG-28198 Change-Id: Ia2966baeae8f068cd21d716e097782ae3b5a1d86 Reviewed-by: Reviewed-by: Christian Stenger --- src/plugins/texteditor/texteditor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 1b4c0be2b34..aa542763e39 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -6080,6 +6080,7 @@ void TextEditorWidgetPrivate::handleHomeKey(bool anchor, bool block) if (QTextLayout *layout = c.block().layout(); layout->lineForTextPosition(initpos - pos).lineNumber() != 0) { c.movePosition(QTextCursor::StartOfLine, mode); + continue; } } From 88839fa2628db49f1a4a143546f677d51407a20e Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 4 Oct 2022 15:38:27 +0200 Subject: [PATCH 078/104] Squish: Proliferate FilePath Change-Id: I27049d4bef26ac8c88c7d0dc760febac994bc19b Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- src/plugins/squish/opensquishsuitesdialog.cpp | 19 ++- src/plugins/squish/opensquishsuitesdialog.h | 6 +- src/plugins/squish/squishfilehandler.cpp | 124 +++++++++--------- src/plugins/squish/squishfilehandler.h | 19 +-- src/plugins/squish/squishnavigationwidget.cpp | 10 +- src/plugins/squish/squishtesttreemodel.cpp | 19 +-- src/plugins/squish/squishtesttreemodel.h | 9 +- src/plugins/squish/squishtesttreeview.cpp | 4 +- src/plugins/squish/squishtools.cpp | 54 ++++---- src/plugins/squish/squishtools.h | 10 +- src/plugins/squish/squishxmloutputhandler.cpp | 11 +- src/plugins/squish/squishxmloutputhandler.h | 6 +- 12 files changed, 141 insertions(+), 150 deletions(-) diff --git a/src/plugins/squish/opensquishsuitesdialog.cpp b/src/plugins/squish/opensquishsuitesdialog.cpp index dc2ade8fe96..705591228b1 100644 --- a/src/plugins/squish/opensquishsuitesdialog.cpp +++ b/src/plugins/squish/opensquishsuitesdialog.cpp @@ -4,7 +4,6 @@ #include "opensquishsuitesdialog.h" #include "squishtr.h" -#include "suiteconf.h" #include #include @@ -84,16 +83,16 @@ void OpenSquishSuitesDialog::onDirectoryChanged() { m_suitesListWidget->clear(); m_buttonBox->button(QDialogButtonBox::Open)->setEnabled(false); - QDir baseDir(m_directoryLineEdit->filePath().toString()); - if (!baseDir.exists()) { - return; - } - const QFileInfoList subDirs = baseDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); - for (const QFileInfo &subDir : subDirs) { + const Utils::FilePath baseDir = m_directoryLineEdit->filePath(); + if (!baseDir.exists()) + return; + + const Utils::FilePaths subDirs = baseDir.dirEntries(QDir::Dirs | QDir::NoDotAndDotDot); + for (const Utils::FilePath &subDir : subDirs) { if (!subDir.baseName().startsWith("suite_")) continue; - if (Utils::FilePath::fromFileInfo(subDir).pathAppended("suite.conf").isReadableFile()) { + if (subDir.pathAppended("suite.conf").isReadableFile()) { QListWidgetItem *item = new QListWidgetItem(subDir.baseName(), m_suitesListWidget); item->setCheckState(Qt::Checked); connect(m_suitesListWidget, @@ -134,11 +133,11 @@ void OpenSquishSuitesDialog::deselectAll() void OpenSquishSuitesDialog::setChosenSuites() { const int count = m_suitesListWidget->count(); - const QDir baseDir(m_directoryLineEdit->filePath().toString()); + const Utils::FilePath baseDir = m_directoryLineEdit->filePath(); for (int row = 0; row < count; ++row) { QListWidgetItem *item = m_suitesListWidget->item(row); if (item->checkState() == Qt::Checked) - m_chosenSuites.append(QFileInfo(baseDir, item->text()).absoluteFilePath()); + m_chosenSuites.append(baseDir.pathAppended(item->text())); } } diff --git a/src/plugins/squish/opensquishsuitesdialog.h b/src/plugins/squish/opensquishsuitesdialog.h index 57bc2587c66..0ba434e23a4 100644 --- a/src/plugins/squish/opensquishsuitesdialog.h +++ b/src/plugins/squish/opensquishsuitesdialog.h @@ -3,6 +3,8 @@ #pragma once +#include + #include QT_BEGIN_NAMESPACE @@ -22,7 +24,7 @@ class OpenSquishSuitesDialog : public QDialog public: explicit OpenSquishSuitesDialog(QWidget *parent = nullptr); ~OpenSquishSuitesDialog() override; - QStringList chosenSuites() const { return m_chosenSuites; } + Utils::FilePaths chosenSuites() const { return m_chosenSuites; } private: void onDirectoryChanged(); @@ -31,7 +33,7 @@ private: void deselectAll(); void setChosenSuites(); - QStringList m_chosenSuites; + Utils::FilePaths m_chosenSuites; Utils::PathChooser *m_directoryLineEdit; QListWidget *m_suitesListWidget; diff --git a/src/plugins/squish/squishfilehandler.cpp b/src/plugins/squish/squishfilehandler.cpp index 3ba58757f55..5bc9a5be21b 100644 --- a/src/plugins/squish/squishfilehandler.cpp +++ b/src/plugins/squish/squishfilehandler.cpp @@ -23,9 +23,7 @@ #include #include #include -#include #include -#include #include #include #include @@ -134,7 +132,7 @@ static bool isIgnoredSuffix(const QString &suffix) static void addAllEntriesRecursively(SquishTestTreeItem *item, SharedType sharedType) { - const Utils::FilePath folder = Utils::FilePath::fromString(item->filePath()); + const Utils::FilePath folder = item->filePath(); for (const Utils::FilePath &file : folder.dirEntries(QDir::AllEntries | QDir::NoDotAndDotDot)) { const bool isDirectory = file.isDir(); @@ -149,7 +147,7 @@ static void addAllEntriesRecursively(SquishTestTreeItem *item, SharedType shared SquishTestTreeItem *child = new SquishTestTreeItem( file.fileName(), itemTypeForSharedType(sharedType, isDirectory)); - child->setFilePath(file.toString()); + child->setFilePath(file); if (isDirectory) addAllEntriesRecursively(child, sharedType); @@ -162,7 +160,7 @@ static void processSharedSubFolders(SquishTestTreeItem *item, const Utils::FileP { SquishTestTreeItem *sharedItem = new SquishTestTreeItem(directory.fileName(), SquishTestTreeItem::SquishSharedRoot); - sharedItem->setFilePath(directory.path()); + sharedItem->setFilePath(directory); addAllEntriesRecursively(sharedItem, sharedType); if (sharedItem->hasChildren()) item->appendChild(sharedItem); @@ -170,18 +168,18 @@ static void processSharedSubFolders(SquishTestTreeItem *item, const Utils::FileP delete sharedItem; } -SquishTestTreeItem *createSuiteTreeItem(const QString &name, - const QString &filePath, - const QStringList &cases) +static SquishTestTreeItem *createSuiteTreeItem(const QString &name, + const Utils::FilePath &suiteConf, + const QStringList &cases) { SquishTestTreeItem *item = new SquishTestTreeItem(name, SquishTestTreeItem::SquishSuite); - item->setFilePath(filePath); + item->setFilePath(suiteConf); for (const QString &testCase : cases) { const Utils::FilePath testCaseFP = Utils::FilePath::fromString(testCase); const Utils::FilePath testCaseDir = testCaseFP.parentDir(); SquishTestTreeItem *child = new SquishTestTreeItem(testCaseDir.fileName(), SquishTestTreeItem::SquishTestCase); - child->setFilePath(testCase); + child->setFilePath(testCaseFP); item->appendChild(child); if (const Utils::FilePath data = testCaseDir.pathAppended("testdata"); data.isDir()) @@ -197,7 +195,7 @@ SquishTestTreeItem *createSuiteTreeItem(const QString &name, = new SquishTestTreeItem(file.fileName(), isDir ? SquishTestTreeItem::SquishSharedFolder : SquishTestTreeItem::SquishSharedFile); - other->setFilePath(file.toString()); + other->setFilePath(file); if (isDir) addAllEntriesRecursively(other, SharedType::SharedFoldersAndFiles); @@ -205,7 +203,7 @@ SquishTestTreeItem *createSuiteTreeItem(const QString &name, } } - const Utils::FilePath baseDir = Utils::FilePath::fromString(filePath).absolutePath(); + const Utils::FilePath baseDir = suiteConf.parentDir(); if (const Utils::FilePath scripts = baseDir.pathAppended("shared/scripts"); scripts.isDir()) processSharedSubFolders(item, scripts, SharedType::SharedFoldersAndFiles); if (const Utils::FilePath data = baseDir.pathAppended("shared/testdata"); data.isDir()) @@ -215,12 +213,12 @@ SquishTestTreeItem *createSuiteTreeItem(const QString &name, } void SquishFileHandler::modifySuiteItem(const QString &suiteName, - const QString &filePath, + const Utils::FilePath &suiteConf, const QStringList &cases) { - SquishTestTreeItem *item = createSuiteTreeItem(suiteName, filePath, cases); + SquishTestTreeItem *item = createSuiteTreeItem(suiteName, suiteConf, cases); // TODO update file watcher - m_suites.insert(suiteName, filePath); + m_suites.insert(suiteName, suiteConf); emit suiteTreeItemModified(item, suiteName); } @@ -229,16 +227,15 @@ void SquishFileHandler::openTestSuites() OpenSquishSuitesDialog dialog; dialog.exec(); QMessageBox::StandardButton replaceSuite = QMessageBox::NoButton; - const QStringList chosenSuites = dialog.chosenSuites(); - for (const QString &suite : chosenSuites) { - const QDir suiteDir(suite); - const QString suiteName = suiteDir.dirName(); - const QStringList cases = SuiteConf::validTestCases(suite); - const QFileInfo suiteConf(suiteDir, "suite.conf"); + const Utils::FilePaths chosenSuites = dialog.chosenSuites(); + for (const Utils::FilePath &suiteDir : chosenSuites) { + const QString suiteName = suiteDir.fileName(); + const QStringList cases = SuiteConf::validTestCases(suiteDir.toString()); + const Utils::FilePath suiteConf = suiteDir.pathAppended("suite.conf"); if (m_suites.contains(suiteName)) { if (replaceSuite == QMessageBox::YesToAll) { - modifySuiteItem(suiteName, suiteConf.absoluteFilePath(), cases); + modifySuiteItem(suiteName, suiteConf, cases); } else if (replaceSuite != QMessageBox::NoToAll) { replaceSuite = QMessageBox::question(Core::ICore::dialogParent(), @@ -263,18 +260,17 @@ void SquishFileHandler::openTestSuites() } } emit suitesOpened(); - ProjectExplorer::SessionManager::setValue(SK_OpenSuites, m_suites.values()); + ProjectExplorer::SessionManager::setValue(SK_OpenSuites, suitePathsAsStringList()); } -void SquishFileHandler::openTestSuite(const Utils::FilePath &suitePath, bool isReopen) +void SquishFileHandler::openTestSuite(const Utils::FilePath &suiteConfPath, bool isReopen) { - const QString suiteName = suitePath.parentDir().fileName(); - const QString suitePathStr = suitePath.toString(); - const QStringList cases = SuiteConf::validTestCases(suitePath.parentDir().toString()); + const QString suiteName = suiteConfPath.parentDir().fileName(); + const QStringList cases = SuiteConf::validTestCases(suiteConfPath.parentDir().toString()); if (m_suites.contains(suiteName)) { if (isReopen) { - modifySuiteItem(suiteName, suitePathStr, cases); + modifySuiteItem(suiteName, suiteConfPath, cases); return; } QMessageBox::Button replaceSuite @@ -287,14 +283,14 @@ void SquishFileHandler::openTestSuite(const Utils::FilePath &suitePath, bool isR QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if (replaceSuite == QMessageBox::Yes) - modifySuiteItem(suiteName, suitePathStr, cases); + modifySuiteItem(suiteName, suiteConfPath, cases); } else { - SquishTestTreeItem *item = createSuiteTreeItem(suiteName, suitePathStr, cases); + SquishTestTreeItem *item = createSuiteTreeItem(suiteName, suiteConfPath, cases); // TODO add file watcher - m_suites.insert(suiteName, suitePathStr); + m_suites.insert(suiteName, suiteConfPath); emit testTreeItemCreated(item); } - ProjectExplorer::SessionManager::setValue(SK_OpenSuites, m_suites.values()); + ProjectExplorer::SessionManager::setValue(SK_OpenSuites, suitePathsAsStringList()); } void SquishFileHandler::closeTestSuite(const QString &suiteName) @@ -306,13 +302,13 @@ void SquishFileHandler::closeTestSuite(const QString &suiteName) // TODO remove file watcher m_suites.remove(suiteName); emit suiteTreeItemRemoved(suiteName); - ProjectExplorer::SessionManager::setValue(SK_OpenSuites, m_suites.values()); + ProjectExplorer::SessionManager::setValue(SK_OpenSuites, suitePathsAsStringList()); } void SquishFileHandler::closeAllTestSuites() { closeAllInternal(); - ProjectExplorer::SessionManager::setValue(SK_OpenSuites, m_suites.values()); + ProjectExplorer::SessionManager::setValue(SK_OpenSuites, suitePathsAsStringList()); } void SquishFileHandler::closeAllInternal() @@ -332,19 +328,19 @@ void SquishFileHandler::runTestCase(const QString &suiteName, const QString &tes if (SquishTools::instance()->state() != SquishTools::Idle) return; - const QDir suitePath = QFileInfo(m_suites.value(suiteName)).absoluteDir(); - if (!suitePath.exists() || !suitePath.isReadable()) { + const Utils::FilePath suitePath = m_suites.value(suiteName).parentDir(); + if (!suitePath.exists() || !suitePath.isReadableDir()) { QMessageBox::critical(Core::ICore::dialogParent(), Tr::tr("Test Suite Path Not Accessible"), Tr::tr("The path \"%1\" does not exist or is not accessible.\n" "Refusing to run test case \"%2\".") - .arg(QDir::toNativeSeparators(suitePath.absolutePath())) + .arg(suitePath.toUserOutput()) .arg(testCaseName)); return; } ProjectExplorer::ProjectExplorerPlugin::saveModifiedFiles(); - SquishTools::instance()->runTestCases(suitePath.absolutePath(), QStringList(testCaseName)); + SquishTools::instance()->runTestCases(suitePath, QStringList(testCaseName)); } void SquishFileHandler::runTestSuite(const QString &suiteName) @@ -354,14 +350,14 @@ void SquishFileHandler::runTestSuite(const QString &suiteName) if (SquishTools::instance()->state() != SquishTools::Idle) return; - const QString suiteConf = m_suites.value(suiteName); - const QDir suitePath = QFileInfo(suiteConf).absoluteDir(); - if (!suitePath.exists() || !suitePath.isReadable()) { + const Utils::FilePath suiteConf = m_suites.value(suiteName); + const Utils::FilePath suitePath = suiteConf.parentDir(); + if (!suitePath.exists() || !suitePath.isReadableDir()) { QMessageBox::critical(Core::ICore::dialogParent(), Tr::tr("Test Suite Path Not Accessible"), Tr::tr("The path \"%1\" does not exist or is not accessible.\n" "Refusing to run test cases.") - .arg(QDir::toNativeSeparators(suitePath.absolutePath()))); + .arg(suitePath.toUserOutput())); return; } @@ -374,7 +370,7 @@ void SquishFileHandler::runTestSuite(const QString &suiteName) return; } ProjectExplorer::ProjectExplorerPlugin::saveModifiedFiles(); - SquishTools::instance()->runTestCases(suitePath.absolutePath(), testCases); + SquishTools::instance()->runTestCases(suitePath, testCases); } void SquishFileHandler::recordTestCase(const QString &suiteName, const QString &testCaseName) @@ -384,19 +380,18 @@ void SquishFileHandler::recordTestCase(const QString &suiteName, const QString & if (SquishTools::instance()->state() != SquishTools::Idle) return; - const QDir suitePath = QFileInfo(m_suites.value(suiteName)).absoluteDir(); - if (!suitePath.exists() || !suitePath.isReadable()) { + const Utils::FilePath suitePath = m_suites.value(suiteName).parentDir(); + if (!suitePath.exists() || !suitePath.isReadableDir()) { QMessageBox::critical(Core::ICore::dialogParent(), Tr::tr("Test Suite Path Not Accessible"), Tr::tr("The path \"%1\" does not exist or is not accessible.\n" "Refusing to record test case \"%2\".") - .arg(QDir::toNativeSeparators(suitePath.absolutePath())) + .arg(suitePath.toUserOutput()) .arg(testCaseName)); return; } - SuiteConf conf = SuiteConf::readSuiteConf( - Utils::FilePath::fromString(m_suites.value(suiteName))); + SuiteConf conf = SuiteConf::readSuiteConf(m_suites.value(suiteName)); if (conf.aut().isEmpty()) { MappedAutDialog dialog; @@ -407,28 +402,25 @@ void SquishFileHandler::recordTestCase(const QString &suiteName, const QString & conf.setArguments(dialog.arguments.value()); } - SquishTools::instance()->recordTestCase(suitePath.absolutePath(), testCaseName, conf); + SquishTools::instance()->recordTestCase(suitePath, testCaseName, conf); } void addAllEntriesRecursively(SquishTestTreeItem *item) { - QDir folder(item->filePath()); - - const QFileInfoList entries = folder.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot); - for (const QFileInfo &info : entries) { - const QString &path = info.absoluteFilePath(); + const Utils::FilePaths entries = item->filePath().dirEntries(QDir::AllEntries | QDir::NoDotAndDotDot); + for (const Utils::FilePath &path : entries) { // TODO improve this later? Squish refuses directories containing Squish test suites - const bool isDir = info.isDir(); - if (!info.isFile() && !isDir) + const bool isDir = path.isDir(); + if (!path.isFile() && !isDir) continue; SquishTestTreeItem *child - = new SquishTestTreeItem(info.fileName(), + = new SquishTestTreeItem(path.fileName(), isDir ? SquishTestTreeItem::SquishSharedFolder : SquishTestTreeItem::SquishSharedFile); child->setFilePath(path); - if (info.isDir()) + if (isDir) addAllEntriesRecursively(child); item->appendChild(child); @@ -437,8 +429,8 @@ void addAllEntriesRecursively(SquishTestTreeItem *item) void SquishFileHandler::addSharedFolder() { - const QString &chosen = QFileDialog::getExistingDirectory(Core::ICore::dialogParent(), - Tr::tr("Select Global Script Folder")); + const Utils::FilePath chosen = Utils::FileUtils::getExistingDirectory( + Core::ICore::dialogParent(), Tr::tr("Select Global Script Folder")); if (chosen.isEmpty()) return; @@ -446,14 +438,14 @@ void SquishFileHandler::addSharedFolder() return; m_sharedFolders.append(chosen); - SquishTestTreeItem *item = new SquishTestTreeItem(chosen, + SquishTestTreeItem *item = new SquishTestTreeItem(chosen.toUserOutput(), SquishTestTreeItem::SquishSharedFolder); item->setFilePath(chosen); addAllEntriesRecursively(item); emit testTreeItemCreated(item); } -bool SquishFileHandler::removeSharedFolder(const QString &folder) +bool SquishFileHandler::removeSharedFolder(const Utils::FilePath &folder) { if (m_sharedFolders.contains(folder)) return m_sharedFolders.removeOne(folder); @@ -470,8 +462,7 @@ void SquishFileHandler::openObjectsMap(const QString &suiteName) { QTC_ASSERT(!suiteName.isEmpty(), return ); - const SuiteConf conf = SuiteConf::readSuiteConf( - Utils::FilePath::fromString(m_suites.value(suiteName))); + const SuiteConf conf = SuiteConf::readSuiteConf(m_suites.value(suiteName)); const Utils::FilePath objectsMapPath = conf.objectMapPath(); if (objectsMapPath.exists()) { if (!Core::EditorManager::openEditor(objectsMapPath, Constants::OBJECTSMAP_EDITOR_ID)) { @@ -499,5 +490,10 @@ void SquishFileHandler::onSessionLoaded() } } +QStringList SquishFileHandler::suitePathsAsStringList() const +{ + return Utils::transform(m_suites.values(), &Utils::FilePath::toString); +} + } // namespace Internal } // namespace Squish diff --git a/src/plugins/squish/squishfilehandler.h b/src/plugins/squish/squishfilehandler.h index e1ea6f29bb8..0a23f918efc 100644 --- a/src/plugins/squish/squishfilehandler.h +++ b/src/plugins/squish/squishfilehandler.h @@ -5,12 +5,12 @@ #include "squishtesttreemodel.h" +#include + #include #include #include -namespace Utils { class FilePath; } - namespace Squish { namespace Internal { @@ -22,33 +22,34 @@ public: ~SquishFileHandler() override = default; static SquishFileHandler *instance(); void openTestSuites(); - void openTestSuite(const Utils::FilePath &suitePath, bool isReopen = false); + void openTestSuite(const Utils::FilePath &suiteConfPath, bool isReopen = false); void closeTestSuite(const QString &suiteName); void closeAllTestSuites(); void runTestCase(const QString &suiteName, const QString &testCaseName); void runTestSuite(const QString &suiteName); void recordTestCase(const QString &suiteName, const QString &testCaseName); void addSharedFolder(); - bool removeSharedFolder(const QString &folder); + bool removeSharedFolder(const Utils::FilePath &folder); void removeAllSharedFolders(); void openObjectsMap(const QString &suiteName); signals: void testTreeItemCreated(SquishTestTreeItem *item); - void suiteTreeItemRemoved(const QString &filePath); + void suiteTreeItemRemoved(const QString &suiteName); void suiteTreeItemModified(SquishTestTreeItem *item, const QString &displayName); void suitesOpened(); private: void closeAllInternal(); void onSessionLoaded(); - - QMap m_suites; - QStringList m_sharedFolders; + QStringList suitePathsAsStringList() const; void modifySuiteItem(const QString &suiteName, - const QString &filePath, + const Utils::FilePath &suiteConf, const QStringList &cases); + + QMap m_suites; + Utils::FilePaths m_sharedFolders; }; } // namespace Internal diff --git a/src/plugins/squish/squishnavigationwidget.cpp b/src/plugins/squish/squishnavigationwidget.cpp index b7390fdb574..21becd62323 100644 --- a/src/plugins/squish/squishnavigationwidget.cpp +++ b/src/plugins/squish/squishnavigationwidget.cpp @@ -20,7 +20,6 @@ #include #include -#include #include #include #include @@ -251,9 +250,8 @@ void SquishNavigationWidget::onItemActivated(const QModelIndex &idx) break; } - auto filePath = Utils::FilePath::fromString(item->filePath()); - if (filePath.exists()) - Core::EditorManager::openEditor(filePath); + if (item->filePath().exists()) + Core::EditorManager::openEditor(item->filePath()); } void SquishNavigationWidget::onExpanded(const QModelIndex &idx) @@ -284,13 +282,13 @@ void SquishNavigationWidget::onRowsRemoved(const QModelIndex &parent, int, int) void SquishNavigationWidget::onRemoveSharedFolderTriggered(int row, const QModelIndex &parent) { - const QString folder = m_model->index(row, 0, parent).data().toString(); + const auto folder = Utils::FilePath::fromVariant(m_model->index(row, 0, parent).data(LinkRole)); QTC_ASSERT(!folder.isEmpty(), return ); if (QMessageBox::question(Core::ICore::dialogParent(), Tr::tr("Remove Shared Folder"), Tr::tr("Remove \"%1\" from the list of shared folders?") - .arg(QDir::toNativeSeparators(folder))) + .arg(folder.toUserOutput())) != QMessageBox::Yes) { return; } diff --git a/src/plugins/squish/squishtesttreemodel.cpp b/src/plugins/squish/squishtesttreemodel.cpp index b8d0fbd3686..8df29777363 100644 --- a/src/plugins/squish/squishtesttreemodel.cpp +++ b/src/plugins/squish/squishtesttreemodel.cpp @@ -64,15 +64,10 @@ QString SquishTestTreeItem::toolTip(int column) const if (column == 2) return Tr::tr("Record Test Case"); } - if (m_displayName == m_filePath) + if (m_displayName == m_filePath.toUserOutput()) return m_displayName; - return QString{m_displayName + '\n' + m_filePath}; -} - -void SquishTestTreeItem::setFilePath(const QString &filePath) -{ - m_filePath = filePath; + return QString{m_displayName + '\n' + m_filePath.toUserOutput()}; } void SquishTestTreeItem::setParentName(const QString &parentName) @@ -128,10 +123,9 @@ QString SquishTestTreeItem::generateTestCaseName() const { QTC_ASSERT(m_type == SquishSuite, return {}); - const auto suiteConfFilePath = Utils::FilePath::fromString(m_filePath); - const SuiteConf suiteConf = SuiteConf::readSuiteConf(suiteConfFilePath); + const SuiteConf suiteConf = SuiteConf::readSuiteConf(m_filePath); const QStringList used = suiteConf.usedTestCases(); - const auto suiteDir = suiteConfFilePath.parentDir(); + const auto suiteDir = m_filePath.parentDir(); const QString tmpl("tst_case"); for (int i = 1; i < 9999; ++i) { @@ -291,7 +285,7 @@ QVariant SquishTestTreeModel::data(const QModelIndex &idx, int role) const return QVariant(); return item->toolTip(idx.column()); case LinkRole: - return item->filePath(); + return item->filePath().toVariant(); case TypeRole: return type; case DisplayNameRole: @@ -408,7 +402,8 @@ void SquishTestTreeModel::removeAllSharedFolders() m_squishSharedFolders->removeChildren(); } -QStringList SquishTestTreeModel::getSelectedSquishTestCases(const QString &suiteConfPath) const +QStringList SquishTestTreeModel::getSelectedSquishTestCases( + const Utils::FilePath &suiteConfPath) const { QStringList result; const int count = m_squishSuitesRoot->childCount(); diff --git a/src/plugins/squish/squishtesttreemodel.h b/src/plugins/squish/squishtesttreemodel.h index 96e30cc87c2..3f60228cfb5 100644 --- a/src/plugins/squish/squishtesttreemodel.h +++ b/src/plugins/squish/squishtesttreemodel.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once +#include #include #include @@ -35,8 +36,8 @@ public: Qt::ItemFlags flags(int column) const override; QString displayName() const { return m_displayName; } QString toolTip(int column) const; - void setFilePath(const QString &filePath); - QString filePath() const { return m_filePath; } + void setFilePath(const Utils::FilePath &filePath) { m_filePath = filePath; } + Utils::FilePath filePath() const { return m_filePath; } void setParentName(const QString &parentName); QString parentName() const { return m_parentName; } Type type() const { return m_type; } @@ -51,7 +52,7 @@ private: void revalidateCheckState(); QString m_displayName; // holds suite or test case name - QString m_filePath; // holds suite.conf path for suites, test.* for test cases + Utils::FilePath m_filePath; // holds suite.conf path for suites, test.* for test cases Type m_type; QString m_parentName; // holds suite name for test cases, folder path for shared files Qt::CheckState m_checked; // suites and test cases can have a check state @@ -74,7 +75,7 @@ public: void removeTreeItem(int row, const QModelIndex &parent); void modifyTreeItem(int row, const QModelIndex &parent, const SquishTestTreeItem &modified); void removeAllSharedFolders(); - QStringList getSelectedSquishTestCases(const QString &suiteConfPath) const; + QStringList getSelectedSquishTestCases(const Utils::FilePath &suiteConfPath) const; private: SquishTestTreeItem *findSuite(const QString &displayName) const; diff --git a/src/plugins/squish/squishtesttreeview.cpp b/src/plugins/squish/squishtesttreeview.cpp index 3a1194e2881..7b43830f179 100644 --- a/src/plugins/squish/squishtesttreeview.cpp +++ b/src/plugins/squish/squishtesttreeview.cpp @@ -131,7 +131,7 @@ QWidget *SquishTestTreeItemDelegate::createEditor(QWidget *parent, const SquishTestTreeItem *suite = srcModel->itemForIndex(model->mapToSource(index.parent())); SquishTestTreeItem *testCaseItem = srcModel->itemForIndex(model->mapToSource(index)); - const SuiteConf suiteConf = SuiteConf::readSuiteConf(Utils::FilePath::fromString(suite->filePath())); + const SuiteConf suiteConf = SuiteConf::readSuiteConf(suite->filePath()); const QStringList inUse = suiteConf.usedTestCases(); Utils::FancyLineEdit *editor = new Utils::FancyLineEdit(parent); editor->setValidationFunction([inUse](Utils::FancyLineEdit *edit, QString *) { @@ -239,7 +239,7 @@ void SquishTestTreeItemDelegate::setModelData(QWidget *editor, QAbstractItemMode const QModelIndex parent = index.parent(); SquishTestTreeItem *suiteItem = sourceModel->itemForIndex(sortModel->mapToSource(parent)); - const auto suiteConfPath = Utils::FilePath::fromString(suiteItem->filePath()); + const auto suiteConfPath = suiteItem->filePath(); SuiteConf suiteConf = SuiteConf::readSuiteConf(suiteConfPath); const Utils::FilePath destination = suiteConfPath.parentDir().pathAppended(chosenName); bool ok = copyScriptTemplates(suiteConf, destination); diff --git a/src/plugins/squish/squishtools.cpp b/src/plugins/squish/squishtools.cpp index d9a51b1e798..b671606e3da 100644 --- a/src/plugins/squish/squishtools.cpp +++ b/src/plugins/squish/squishtools.cpp @@ -95,8 +95,8 @@ public: }; // make this configurable? -static const QString resultsDirectory = QFileInfo(QDir::home(), ".squishQC/Test Results") - .absoluteFilePath(); +static const Utils::FilePath resultsDirectory = Utils::FileUtils::homePath() + .pathAppended(".squishQC/Test Results"); static SquishTools *s_instance = nullptr; SquishTools::SquishTools(QObject *parent) @@ -215,7 +215,7 @@ struct SquishToolsSettings // make sure to execute setup() to populate with current settings before using it static SquishToolsSettings toolsSettings; -void SquishTools::runTestCases(const QString &suitePath, +void SquishTools::runTestCases(const FilePath &suitePath, const QStringList &testCases) { if (m_shutdownInitiated) @@ -229,7 +229,7 @@ void SquishTools::runTestCases(const QString &suitePath, return; } // create test results directory (if necessary) and return on fail - if (!QDir().mkpath(resultsDirectory)) { + if (!resultsDirectory.ensureWritableDir()) { QMessageBox::critical(Core::ICore::dialogParent(), Tr::tr("Error"), Tr::tr("Could not create test results folder. Canceling test run.")); @@ -237,16 +237,16 @@ void SquishTools::runTestCases(const QString &suitePath, } m_suitePath = suitePath; - m_suiteConf = SuiteConf::readSuiteConf(Utils::FilePath::fromString(suitePath).pathAppended("suite.conf")); + m_suiteConf = SuiteConf::readSuiteConf(suitePath.pathAppended("suite.conf")); m_testCases = testCases; m_reportFiles.clear(); const QString dateTimeString = QDateTime::currentDateTime().toString("yyyy-MM-ddTHH-mm-ss"); - m_currentResultsDirectory = QFileInfo(QDir(resultsDirectory), dateTimeString).absoluteFilePath(); + m_currentResultsDirectory = resultsDirectory.pathAppended(dateTimeString); m_additionalRunnerArguments.clear(); m_additionalRunnerArguments << "--interactive" << "--resultdir" - << QDir::toNativeSeparators(m_currentResultsDirectory); + << m_currentResultsDirectory.toUserOutput(); m_xmlOutputHandler.reset(new SquishXmlOutputHandler(this)); connect(this, &SquishTools::resultOutputCreated, @@ -277,7 +277,7 @@ void SquishTools::queryServerSettings() startSquishServer(RunnerQueryRequested); } -void SquishTools::recordTestCase(const QString &suitePath, const QString &testCaseName, +void SquishTools::recordTestCase(const FilePath &suitePath, const QString &testCaseName, const SuiteConf &suiteConf) { if (m_shutdownInitiated) @@ -397,7 +397,7 @@ void SquishTools::setState(SquishTools::State state) QString error; SquishXmlOutputHandler::mergeResultFiles(m_reportFiles, m_currentResultsDirectory, - QDir(m_suitePath).dirName(), + m_suitePath.fileName(), &error); if (!error.isEmpty()) QMessageBox::critical(Core::ICore::dialogParent(), Tr::tr("Error"), error); @@ -507,7 +507,7 @@ void SquishTools::setIdle() { QTC_ASSERT(m_state == Idle, return); m_request = None; - m_suitePath = QString(); + m_suitePath = {}; m_testCases.clear(); m_currentTestCasePath.clear(); m_reportFiles.clear(); @@ -623,7 +623,7 @@ void SquishTools::setupAndStartRecorder() args << "--port" << QString::number(m_serverPort); args << "--debugLog" << "alpw"; // TODO make this configurable? args << "--record"; - args << "--suitedir" << m_suitePath; + args << "--suitedir" << m_suitePath.toUserOutput(); Utils::TemporaryFile tmp("squishsnippetfile-XXXXXX"); // quick and dirty tmp.open(); @@ -1128,13 +1128,12 @@ void SquishTools::logrotateTestResults() { // make this configurable? const int maxNumberOfTestResults = 10; - const QStringList existing = QDir(resultsDirectory) - .entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); + const Utils::FilePaths existing = resultsDirectory.dirEntries({{}, QDir::Dirs | QDir::NoDotAndDotDot}, + QDir::Name); for (int i = 0, limit = existing.size() - maxNumberOfTestResults; i < limit; ++i) { - QDir current(resultsDirectory + QDir::separator() + existing.at(i)); - if (!current.removeRecursively()) - qWarning() << "could not remove" << current.absolutePath(); + if (!existing.at(i).removeRecursively()) + qWarning() << "could not remove" << existing.at(i).toUserOutput(); } } @@ -1296,7 +1295,7 @@ QStringList SquishTools::runnerArgumentsFromSettings() arguments << "--debugLog" << "alpw"; // TODO make this configurable? QTC_ASSERT(!m_testCases.isEmpty(), m_testCases.append("")); - m_currentTestCasePath = FilePath::fromString(m_suitePath) / m_testCases.takeFirst(); + m_currentTestCasePath = m_suitePath / m_testCases.takeFirst(); if (m_request == RecordTestRequested) { arguments << "--startapp"; // --record is triggered separately @@ -1307,7 +1306,7 @@ QStringList SquishTools::runnerArgumentsFromSettings() QTC_ASSERT(false, qDebug("Request %d", m_request)); } - arguments << "--suitedir" << m_suitePath; + arguments << "--suitedir" << m_suitePath.toUserOutput(); arguments << m_additionalRunnerArguments; @@ -1318,16 +1317,14 @@ QStringList SquishTools::runnerArgumentsFromSettings() } if (m_request == RunTestRequested) { - const QString caseReportFilePath - = QFileInfo(QString::fromLatin1("%1/%2/%3/results.xml") - .arg(m_currentResultsDirectory, - QDir(m_suitePath).dirName(), - m_currentTestCasePath.baseName())).absoluteFilePath(); + const Utils::FilePath caseReportFilePath + = m_currentResultsDirectory + / m_suitePath.fileName() / m_currentTestCasePath.fileName() / "results.xml"; m_reportFiles.append(caseReportFilePath); arguments << "--reportgen" - << QString::fromLatin1("xml2.2,%1").arg(caseReportFilePath); + << QString::fromLatin1("xml2.2,%1").arg(caseReportFilePath.toUserOutput()); - m_currentResultsXML = new QFile(caseReportFilePath); + m_currentResultsXML = new QFile(caseReportFilePath.toString()); } return arguments; } @@ -1398,11 +1395,10 @@ void SquishTools::setupAndStartSquishRunnerProcess(const QStringList &args) // set up the file system watcher for being able to read the results.xml file m_resultsFileWatcher = new QFileSystemWatcher; // on 2nd run this directory exists and won't emit changes, so use the current subdirectory - if (QDir(m_currentResultsDirectory).exists()) - m_resultsFileWatcher->addPath(m_currentResultsDirectory + QDir::separator() - + QDir(m_suitePath).dirName()); + if (m_currentResultsDirectory.exists()) + m_resultsFileWatcher->addPath(m_currentResultsDirectory.pathAppended(m_suitePath.fileName()).toString()); else - m_resultsFileWatcher->addPath(QFileInfo(m_currentResultsDirectory).absolutePath()); + m_resultsFileWatcher->addPath(m_currentResultsDirectory.toString()); connect(m_resultsFileWatcher, &QFileSystemWatcher::directoryChanged, diff --git a/src/plugins/squish/squishtools.h b/src/plugins/squish/squishtools.h index 688e2228629..505bd726f6f 100644 --- a/src/plugins/squish/squishtools.h +++ b/src/plugins/squish/squishtools.h @@ -62,9 +62,9 @@ public: }; State state() const { return m_state; } - void runTestCases(const QString &suitePath, + void runTestCases(const Utils::FilePath &suitePath, const QStringList &testCases = QStringList()); - void recordTestCase(const QString &suitePath, const QString &testCaseName, + void recordTestCase(const Utils::FilePath &suitePath, const QString &testCaseName, const SuiteConf &suiteConf); void queryServerSettings(); void writeServerSettingsChanges(const QList &changes); @@ -144,11 +144,11 @@ private: Request m_request = None; State m_state = Idle; RunnerState m_squishRunnerState = RunnerState::None; - QString m_suitePath; + Utils::FilePath m_suitePath; QStringList m_testCases; SuiteConf m_suiteConf; // holds information of current test suite e.g. while recording - QStringList m_reportFiles; - QString m_currentResultsDirectory; + Utils::FilePaths m_reportFiles; + Utils::FilePath m_currentResultsDirectory; QString m_fullRunnerOutput; // used when querying the server Utils::FilePath m_currentTestCasePath; Utils::FilePath m_currentRecorderSnippetFile; diff --git a/src/plugins/squish/squishxmloutputhandler.cpp b/src/plugins/squish/squishxmloutputhandler.cpp index fbdb7b3e48d..b628f205162 100644 --- a/src/plugins/squish/squishxmloutputhandler.cpp +++ b/src/plugins/squish/squishxmloutputhandler.cpp @@ -7,6 +7,7 @@ #include "squishresultmodel.h" #include "squishtr.h" +#include #include #include @@ -32,12 +33,12 @@ void SquishXmlOutputHandler::clearForNextRun() m_xmlReader.clear(); } -void SquishXmlOutputHandler::mergeResultFiles(const QStringList &reportFiles, - const QString &resultsDirectory, +void SquishXmlOutputHandler::mergeResultFiles(const Utils::FilePaths &reportFiles, + const Utils::FilePath &resultsDirectory, const QString &suiteName, QString *error) { - QFile resultsXML(QString::fromLatin1("%1/results.xml").arg(resultsDirectory)); + QFile resultsXML(resultsDirectory.pathAppended("results.xml").toString()); if (resultsXML.exists()) { if (error) *error = Tr::tr("Could not merge results into single results.xml.\n" @@ -59,8 +60,8 @@ void SquishXmlOutputHandler::mergeResultFiles(const QStringList &reportFiles, bool isFirstReport = true; bool isFirstTest = true; QString lastEpilogTime; - for (const QString &caseResult : reportFiles) { - QFile currentResultsFile(caseResult); + for (const Utils::FilePath &caseResult : reportFiles) { + QFile currentResultsFile(caseResult.toString()); if (!currentResultsFile.exists()) continue; if (!currentResultsFile.open(QFile::ReadOnly)) diff --git a/src/plugins/squish/squishxmloutputhandler.h b/src/plugins/squish/squishxmloutputhandler.h index 3c2ebe3c559..dfe6634199f 100644 --- a/src/plugins/squish/squishxmloutputhandler.h +++ b/src/plugins/squish/squishxmloutputhandler.h @@ -3,6 +3,8 @@ #pragma once +#include + #include #include @@ -18,8 +20,8 @@ public: explicit SquishXmlOutputHandler(QObject *parent = nullptr); void clearForNextRun(); - static void mergeResultFiles(const QStringList &reportFiles, - const QString &resultsDirectory, + static void mergeResultFiles(const Utils::FilePaths &reportFiles, + const Utils::FilePath &resultsDirectory, const QString &suiteName, QString *error = nullptr); From fcb79ee8108e8332e92e53884320623c0d6d5a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Fri, 7 Oct 2022 00:22:16 +0200 Subject: [PATCH 079/104] Git: VcsBase: Squish: Make tst_git_local run again Amends 1548eef10b8987142bf1cafa27278e5b816a11b7 Amends 69f4cb86dd7a4f5f72f6111702b2db9d5779e2da Amends 9ad5c4254d83b0adceed45fd8da84f8f9c271dd9 Amends e070d826e5f87fe48804dd14a04bae83c06f2764 Change-Id: I584b1b9b662144899d0292b887e8cb3386f80d4b Reviewed-by: Reviewed-by: Christian Stenger --- src/libs/utils/filewizardpage.cpp | 1 + src/plugins/git/gitsubmiteditorwidget.cpp | 4 ++++ src/plugins/projectexplorer/projectwizardpage.cpp | 2 ++ src/plugins/vcsbase/submiteditorwidget.cpp | 6 ++++++ tests/system/objects.map | 2 +- tests/system/shared/project.py | 2 +- 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/filewizardpage.cpp b/src/libs/utils/filewizardpage.cpp index 40052c89d64..a068f2bafad 100644 --- a/src/libs/utils/filewizardpage.cpp +++ b/src/libs/utils/filewizardpage.cpp @@ -49,6 +49,7 @@ FileWizardPage::FileWizardPage(QWidget *parent) : d->m_defaultSuffixLabel = new QLabel; d->m_nameLabel = new QLabel; d->m_nameLineEdit = new FileNameValidatingLineEdit; + d->m_nameLineEdit->setObjectName("nameLineEdit"); d->m_pathLabel = new QLabel; d->m_pathChooser = new PathChooser; diff --git a/src/plugins/git/gitsubmiteditorwidget.cpp b/src/plugins/git/gitsubmiteditorwidget.cpp index f81e22d1692..d3d2daf20ff 100644 --- a/src/plugins/git/gitsubmiteditorwidget.cpp +++ b/src/plugins/git/gitsubmiteditorwidget.cpp @@ -43,15 +43,19 @@ public: showHeadLabel = new QLabel(Tr::tr("Show HEAD")); // FIXME: Simplify string in tr() authorLineEdit = new QLineEdit; + authorLineEdit->setObjectName("authorLineEdit"); authorLineEdit->setMinimumSize(QSize(200, 0)); invalidAuthorLabel = new QLabel; + invalidAuthorLabel->setObjectName("invalidAuthorLabel"); invalidAuthorLabel->setMinimumSize(QSize(20, 20)); emailLineEdit = new QLineEdit; + emailLineEdit->setObjectName("emailLineEdit"); emailLineEdit->setMinimumSize(QSize(200, 0)); invalidEmailLabel = new QLabel; + invalidEmailLabel->setObjectName("invalidEmailLabel"); invalidEmailLabel->setMinimumSize(QSize(20, 20)); bypassHooksCheckBox = new QCheckBox(Tr::tr("By&pass hooks")); diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index eb2721eeacd..a5b81fb7bcd 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -268,7 +268,9 @@ ProjectWizardPage::ProjectWizardPage(QWidget *parent) : WizardPage(parent) { m_projectLabel = new QLabel; + m_projectLabel->setObjectName("projectLabel"); m_projectComboBox = new Utils::TreeViewComboBox; + m_projectComboBox->setObjectName("projectComboBox"); m_additionalInfo = new QLabel; m_addToVersionControlLabel = new QLabel(tr("Add to &version control:")); m_addToVersionControlComboBox = new QComboBox; diff --git a/src/plugins/vcsbase/submiteditorwidget.cpp b/src/plugins/vcsbase/submiteditorwidget.cpp index 782d8856aaf..6c0e2498a65 100644 --- a/src/plugins/vcsbase/submiteditorwidget.cpp +++ b/src/plugins/vcsbase/submiteditorwidget.cpp @@ -131,6 +131,7 @@ SubmitEditorWidget::SubmitEditorWidget() : scrollAreaWidgetContents->setMinimumSize(QSize(400, 400)); d->descriptionBox = new QGroupBox(tr("Descriptio&n")); + d->descriptionBox->setObjectName("descriptionBox"); d->descriptionBox->setFlat(true); d->descriptionHint = new QLabel(d->descriptionBox); @@ -140,6 +141,7 @@ SubmitEditorWidget::SubmitEditorWidget() : d->descriptionLayout->addWidget(d->descriptionHint); d->description = new CompletingTextEdit(d->descriptionBox); + d->description->setObjectName("description"); d->description->setAcceptRichText(false); d->description->setContextMenuPolicy(Qt::CustomContextMenu); d->description->setLineWrapMode(QTextEdit::NoWrap); @@ -148,12 +150,15 @@ SubmitEditorWidget::SubmitEditorWidget() : d->descriptionLayout->addWidget(d->description); auto groupBox = new QGroupBox(tr("F&iles")); + groupBox->setObjectName("groupBox"); groupBox->setFlat(true); d->checkAllCheckBox = new QCheckBox(tr("Select a&ll")); + d->checkAllCheckBox->setObjectName("checkAllCheckBox"); d->checkAllCheckBox->setTristate(false); d->fileView = new QTreeView(groupBox); + d->fileView->setObjectName("fileView"); d->fileView->setContextMenuPolicy(Qt::CustomContextMenu); d->fileView->setSelectionMode(QAbstractItemView::ExtendedSelection); d->fileView->setRootIsDecorated(false); @@ -163,6 +168,7 @@ SubmitEditorWidget::SubmitEditorWidget() : verticalLayout_2->addWidget(d->fileView); d->splitter = new Core::MiniSplitter(scrollAreaWidgetContents); + d->splitter->setObjectName("splitter"); d->splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); d->splitter->setOrientation(Qt::Horizontal); d->splitter->addWidget(d->descriptionBox); diff --git a/tests/system/objects.map b/tests/system/objects.map index 50733e2adfc..93c2c8a5af2 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -219,7 +219,7 @@ :scrollArea.Edit build configuration:_QLabel {text='Edit build configuration:' type='QLabel' unnamed='1' visible='1'} :scrollArea.Library not available_QLabel {name='qmlDebuggingWarningText' text?='Library not available*' type='QLabel' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :sourceFileLineEdit_Utils::FileNameValidatingLineEdit {name='SrcFileName' type='Utils::FancyLineEdit' visible='1' window=':New_ProjectExplorer::JsonWizard'} -:splitter.Commit File(s)_VcsBase::QActionPushButton {text~='(Commit .+/.+ File.*)' type='VcsBase::QActionPushButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:splitter.Commit File(s)_VcsBase::QActionPushButton {text~='(Commit .+/.+ File.*)' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :splitter.Description_QGroupBox {container=':Qt Creator.splitter_QSplitter' name='descriptionBox' title='Description' type='QGroupBox' visible='1'} :splitter.Files_QGroupBox {container=':Qt Creator.splitter_QSplitter' name='groupBox' title='Files' type='QGroupBox' visible='1'} :stackedWidget.plainTextEdit_QPlainTextEdit {container=':Send to Codepaster.stackedWidget_QStackedWidget' name='plainTextEdit' type='QPlainTextEdit' visible='1'} diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index 1aa4b8b78ae..bd2a80452e0 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -146,7 +146,7 @@ def __selectQtVersionDesktop__(buildSystem, checks, available=None): for target in checkedTargets: detailsWidget = waitForObject("{type='Utils::DetailsWidget' unnamed='1' visible='1' " "summaryText='%s'}" % Targets.getStringForTarget(target)) - detailsButton = getChildByClass(detailsWidget, "Utils::DetailsButton") + detailsButton = getChildByClass(detailsWidget, "QToolButton") if test.verify(detailsButton != None, "Verifying if 'Details' button could be found"): clickButton(detailsButton) cbObject = ("{type='QCheckBox' text='%s' unnamed='1' visible='1' " From c72a9197a46695439ba4e59043d7d71993c477bc Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 5 Oct 2022 13:07:07 +0200 Subject: [PATCH 080/104] build.py: Add option to call cpack Adds --with-cpack option. - macOS: does nothing (we already create a better, signed disk image) - Linux: creates qtcreator.deb in build directory - Windows: Checks for NSIS and WIX installation, creates qtcreator.exe and qtcreator.msi as appropriate Change-Id: Ie7816d04cb2e01e90795481e1519b0a6645f5cd3 Reviewed-by: Cristian Adam --- cmake/Utils.cmake | 14 ++++++++++---- packaging/CMakeLists.txt | 1 + scripts/build.py | 27 +++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/cmake/Utils.cmake b/cmake/Utils.cmake index 363c78ddaf5..e43674e4a35 100644 --- a/cmake/Utils.cmake +++ b/cmake/Utils.cmake @@ -22,16 +22,22 @@ function(setup_dependencies_component) set(_elfutils_arg "--elfutils \"${_elfutils_path}\"") endif() install(CODE " - set(_ide_app_target \"\${CMAKE_INSTALL_PREFIX}/${IDE_APP_PATH}/${IDE_APP_TARGET}${CMAKE_EXECUTABLE_SUFFIX}\") + # DESTDIR is set for e.g. the cpack DEB generator, but is empty in other situations + if(DEFINED ENV{DESTDIR}) + set(DESTDIR_WITH_SEP \"\$ENV{DESTDIR}/\") + else() + set(DESTDIR_WITH_SEP \"\") + endif() + set(_default_app_target \"\${DESTDIR_WITH_SEP}\${CMAKE_INSTALL_PREFIX}/${IDE_APP_PATH}/${IDE_APP_TARGET}${CMAKE_EXECUTABLE_SUFFIX}\") + set(_ide_app_target \"\${_default_app_target}\") if (NOT EXISTS \"\${_ide_app_target}\") # The component CPack generators (WIX, NSIS64, IFW) install every component with their own CMAKE_INSTALL_PREFIX # directory and since deployqt.py needs the path to IDE_APP_TARGET the line below is needeed string(REPLACE \"Dependencies\" \"${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME}\" _ide_app_target \"\${_ide_app_target}\") endif() if (NOT EXISTS \"\${_ide_app_target}\") - # On Linux with the DEB generator the CMAKE_INSTALL_PREFIX is relative and the DESTDIR environment variable is needed - # to point out to the IDE_APP_TARGET binary - set(_ide_app_target \"\$ENV{DESTDIR}/\${CMAKE_INSTALL_PREFIX}/${IDE_APP_PATH}/${IDE_APP_TARGET}${CMAKE_EXECUTABLE_SUFFIX}\") + # something went wrong, reset to default and hope for the best + set(_ide_app_target \"\${_default_app_target}\") endif() execute_process(COMMAND \"${Python3_EXECUTABLE}\" diff --git a/packaging/CMakeLists.txt b/packaging/CMakeLists.txt index ef89687621c..7c577462894 100644 --- a/packaging/CMakeLists.txt +++ b/packaging/CMakeLists.txt @@ -26,6 +26,7 @@ set(CPACK_DEBIAN_COMPRESSION_TYPE lzma) get_cmake_property(CPACK_COMPONENTS_ALL COMPONENTS) list(REMOVE_ITEM CPACK_COMPONENTS_ALL ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME}) list(REMOVE_ITEM CPACK_COMPONENTS_ALL libraries) # empty component, breaks WIX +list(REMOVE_ITEM CPACK_COMPONENTS_ALL DebugInfo) # exclude the huge debug info list(PREPEND CPACK_COMPONENTS_ALL ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME}) set(CPACK_COMPONENT_Dependencies_HIDDEN TRUE) diff --git a/scripts/build.py b/scripts/build.py index e9aecc01325..d69c6e12868 100755 --- a/scripts/build.py +++ b/scripts/build.py @@ -7,8 +7,8 @@ from __future__ import print_function import argparse import collections -import glob import os +import shutil import common @@ -70,6 +70,8 @@ def get_arguments(): action='store_true', default=False) parser.add_argument('--with-pch', help='Enable building with PCH', action='store_true', default=False) + parser.add_argument('--with-cpack', help='Create packages with cpack', + action='store_true', default=False) parser.add_argument('--add-path', help='Prepends a CMAKE_PREFIX_PATH to the build', action='append', dest='prefix_paths', default=[]) parser.add_argument('--add-module-path', help='Prepends a CMAKE_MODULE_PATH to the build', @@ -92,6 +94,23 @@ def get_arguments(): if not args.qt_path and not args.no_qtcreator: parser.error("argument --qt-path is required if --no-qtcreator is not given") + + if args.with_cpack: + if common.is_mac_platform(): + print('warning: --with-cpack is not supported on macOS, turning off') + args.with_cpack = False + elif common.is_linux_platform(): + args.cpack_generators = ['DEB'] + elif common.is_windows_platform(): + args.cpack_generators = [] + if shutil.which('makensis'): + args.cpack_generators += ['NSIS64'] + if shutil.which('candle') and shutil.which('torch'): + args.cpack_generators += ['WIX'] + else: + print('warning: could not find NSIS or WIX, turning cpack off') + args.with_cpack = False + return args def common_cmake_arguments(args): @@ -149,7 +168,6 @@ def build_qtcreator(args, paths): '-DBUILD_DEVELOPER_DOCS=' + cmake_option(not args.no_docs), '-DBUILD_EXECUTABLE_SDKTOOL=OFF', '-DQTC_FORCE_XCB=ON', - '-DCMAKE_INSTALL_PREFIX=' + common.to_posix_path(paths.install), '-DWITH_TESTS=' + cmake_option(args.with_tests)] cmake_args += common_cmake_arguments(args) @@ -168,6 +186,9 @@ def build_qtcreator(args, paths): cmake_args += ['-DWITH_SANITIZE=ON', '-DSANITIZE_FLAGS=' + ",".join(args.sanitize_flags)] + if args.with_cpack: + cmake_args += ['-DCPACK_PACKAGE_FILE_NAME=qtcreator' + args.zip_infix] + cmake_args += args.config_args common.check_print_call(cmake_args + [paths.src], paths.build) @@ -288,6 +309,8 @@ def package_qtcreator(args, paths): paths.src, paths.install], paths.result) + if args.with_cpack and args.cpack_generators: + common.check_print_call(['cpack', '-G', ';'.join(args.cpack_generators)], paths.build) def get_paths(args): From 0d13cfe652f8d6d52eccf94c289487a96f36dbc1 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 7 Oct 2022 11:42:29 +0200 Subject: [PATCH 081/104] CMake: Remove the restriction that the reply file cannot be remote It would be remote on "real remote" builds. Task-number: QTCREATORBUG-28242 Change-Id: Ic37e5c6ec30064aec825d2322d25843a526b6ac4 Reviewed-by: Cristian Adam --- src/plugins/cmakeprojectmanager/fileapireader.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp index debc22d4dff..87861fcb9b8 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.cpp +++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp @@ -230,7 +230,6 @@ void FileApiReader::endState(const FilePath &replyFilePath, bool restoredFromBac const FilePath buildDirectory = m_parameters.buildDirectory; const QString cmakeBuildType = m_parameters.cmakeBuildType == "Build" ? "" : m_parameters.cmakeBuildType; - QTC_CHECK(!replyFilePath.needsDevice()); m_lastReplyTimestamp = replyFilePath.lastModified(); m_future = runAsync(ProjectExplorerPlugin::sharedThreadPool(), From 8741ce6afcaf041d60cce553a8c929fed6ec3faf Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 30 Sep 2022 13:13:35 +0200 Subject: [PATCH 082/104] QMakeProjectManager: Replace foreach with ranged for loop Change-Id: Ibdb526ac3e0cfbb0568e17c21a1b73f7749a84ed Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/projectnodes.cpp | 2 +- .../customwidgetwizard/plugingenerator.cpp | 2 +- .../qmakeprojectmanager/externaleditors.cpp | 4 +- .../librarydetailscontroller.cpp | 3 +- .../qmakeprojectmanager/makefileparse.cpp | 13 ++- .../qmakebuildconfiguration.cpp | 5 +- .../qmakeprojectmanager/qmakeparsernodes.cpp | 100 +++++++++--------- .../qmakeprojectmanager/qmakeparsernodes.h | 2 +- .../qmakeprojectmanager/qmakeproject.cpp | 44 ++++---- .../qmakeprojectimporter.cpp | 4 +- 10 files changed, 92 insertions(+), 87 deletions(-) diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 78c42880dff..86766a586c8 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -557,7 +557,7 @@ const QList FolderNode::nodes() const return Utils::toRawPointer(m_nodes); } -QList FolderNode::fileNodes() const +QList FolderNode::fileNodes() const { QList result; for (const std::unique_ptr &n : m_nodes) { diff --git a/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp b/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp index 1ac96007e90..634b73507cf 100644 --- a/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp +++ b/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp @@ -247,7 +247,7 @@ QList PluginGenerator::generatePlugin(const GenerationPara // Copy icons that are not in the plugin source base directory yet (that is, // probably all), add them to the resource file QString iconFiles; - foreach (QString icon, pluginIcons) { + for (QString icon : qAsConst(pluginIcons)) { const QFileInfo qfi(icon); if (qfi.dir() != slashLessBaseDir) { const QString newIcon = baseDir + qfi.fileName(); diff --git a/src/plugins/qmakeprojectmanager/externaleditors.cpp b/src/plugins/qmakeprojectmanager/externaleditors.cpp index 4462fbb822f..e1f3ff7d2e7 100644 --- a/src/plugins/qmakeprojectmanager/externaleditors.cpp +++ b/src/plugins/qmakeprojectmanager/externaleditors.cpp @@ -111,10 +111,10 @@ ExternalQtEditor *ExternalQtEditor::createDesignerEditor() } } -static QString findFirstCommand(QVector qtVersions, +static QString findFirstCommand(const QVector &qtVersions, ExternalQtEditor::CommandForQtVersion command) { - foreach (QtSupport::QtVersion *qt, qtVersions) { + for (QtSupport::QtVersion *qt : qtVersions) { if (qt) { const QString binary = command(qt); if (!binary.isEmpty()) diff --git a/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp b/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp index 117a1cbe0e2..e7a991b3dfa 100644 --- a/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp +++ b/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp @@ -1029,7 +1029,8 @@ void InternalLibraryDetailsController::updateProFile() QTC_ASSERT(bs, return); QDir rootDir(m_rootProjectPath); - foreach (QmakeProFile *proFile, bs->rootProFile()->allProFiles()) { + const QList proFiles = bs->rootProFile()->allProFiles(); + for (QmakeProFile *proFile : proFiles) { QmakeProjectManager::ProjectType type = proFile->projectType(); if (type != ProjectType::SharedLibraryTemplate && type != ProjectType::StaticLibraryTemplate) continue; diff --git a/src/plugins/qmakeprojectmanager/makefileparse.cpp b/src/plugins/qmakeprojectmanager/makefileparse.cpp index 711d839131b..a01eb0e5afd 100644 --- a/src/plugins/qmakeprojectmanager/makefileparse.cpp +++ b/src/plugins/qmakeprojectmanager/makefileparse.cpp @@ -97,9 +97,8 @@ void MakeFileParse::parseArgs(const QString &args, const QString &project, void dumpQMakeAssignments(const QList &list) { - foreach (const QMakeAssignment &qa, list) { + for (const QMakeAssignment &qa : list) qCDebug(MakeFileParse::logging()) << " " << qa.variable << qa.op << qa.value; - } } QList MakeFileParse::parseAssignments(const QList &assignments) @@ -107,11 +106,11 @@ QList MakeFileParse::parseAssignments(const QList filteredAssignments; - foreach (const QMakeAssignment &qa, assignments) { + for (const QMakeAssignment &qa : assignments) { if (qa.variable == QLatin1String("CONFIG")) { - QStringList values = qa.value.split(QLatin1Char(' ')); + const QStringList values = qa.value.split(QLatin1Char(' ')); QStringList newValues; - foreach (const QString &value, values) { + for (const QString &value : values) { if (value == QLatin1String("debug")) { if (qa.op == QLatin1String("+=")) { m_qmakeBuildConfig.explicitDebug = true; @@ -345,11 +344,11 @@ void MakeFileParse::parseCommandLine(const QString &command, const QString &proj // Create command line of all unfiltered arguments const QList &assignmentsToUse = m_mode == Mode::FilterKnownConfigValues ? filteredAssignments : assignments; - foreach (const QMakeAssignment &qa, assignmentsToUse) + for (const QMakeAssignment &qa : assignmentsToUse) ProcessArgs::addArg(&m_unparsedArguments, qa.variable + qa.op + qa.value); if (!afterAssignments.isEmpty()) { ProcessArgs::addArg(&m_unparsedArguments, QLatin1String("-after")); - foreach (const QMakeAssignment &qa, afterAssignments) + for (const QMakeAssignment &qa : qAsConst(afterAssignments)) ProcessArgs::addArg(&m_unparsedArguments, qa.variable + qa.op + qa.value); } } diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp index 0d6e208fa5e..b809ae17402 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp @@ -271,13 +271,12 @@ void QmakeBuildConfiguration::updateProblemLabel() allGood = false; if (allGood) { - Tasks issues; - issues = version->reportIssues(proFileName, buildDirectory().toString()); + Tasks issues = version->reportIssues(proFileName, buildDirectory().toString()); Utils::sort(issues); if (!issues.isEmpty()) { QString text = QLatin1String(""); - foreach (const ProjectExplorer::Task &task, issues) { + for (const ProjectExplorer::Task &task : qAsConst(issues)) { QString type; switch (task.type) { case ProjectExplorer::Task::Error: diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index f05144e2b60..e8af0bef33e 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -163,7 +163,7 @@ QmakeProject *QmakePriFile::project() const return static_cast(m_buildSystem->project()); } -QVector QmakePriFile::children() const +const QVector QmakePriFile::children() const { return m_children; } @@ -255,7 +255,8 @@ QSet QmakePriFile::recursiveEnumerate(const QString &folder) QSet result; QDir dir(folder); dir.setFilter(dir.filter() | QDir::NoDotAndDotDot); - foreach (const QFileInfo &file, dir.entryInfoList()) { + const QFileInfoList entries = dir.entryInfoList(); + for (const QFileInfo &file : entries) { if (file.isDir() && !file.isSymLink()) result += recursiveEnumerate(file.absoluteFilePath()); else if (!Core::EditorManager::isAutoSaveFile(file.fileName())) @@ -271,7 +272,7 @@ static QStringList fileListForVar( const QVector &sources = sourceFiles[varName]; QStringList result; result.reserve(sources.size()); - foreach (const ProFileEvaluator::SourceFile &sf, sources) + for (const ProFileEvaluator::SourceFile &sf : sources) result << sf.fileName; return result; } @@ -280,7 +281,7 @@ void QmakePriFile::extractSources( QHash proToResult, QmakePriFileEvalResult *fallback, QVector sourceFiles, FileType type, bool cumulative) { - foreach (const ProFileEvaluator::SourceFile &source, sourceFiles) { + for (const ProFileEvaluator::SourceFile &source : qAsConst(sourceFiles)) { auto *result = proToResult.value(source.proFileId); if (!result) result = fallback; @@ -401,16 +402,11 @@ bool QmakePriFile::folderChanged(const QString &changedFolder, const QSet addedFiles = newFiles; - addedFiles.subtract(m_recursiveEnumerateFiles); - - QSet removedFiles = m_recursiveEnumerateFiles; - removedFiles.subtract(newFiles); - - foreach (const FilePath &file, removedFiles) { - if (!file.isChildOf(FilePath::fromString(changedFolder))) - removedFiles.remove(file); - } + const QSet addedFiles = newFiles - m_recursiveEnumerateFiles; + const QSet removedFiles = Utils::filtered(m_recursiveEnumerateFiles - newFiles, + [changedFolder](const FilePath &file) { + return file.isChildOf(FilePath::fromString(changedFolder)); + }); if (addedFiles.isEmpty() && removedFiles.isEmpty()) return false; @@ -420,8 +416,8 @@ bool QmakePriFile::folderChanged(const QString &changedFolder, const QSet(FileType::FileTypeSize); ++i) { auto type = static_cast(i); - QSet add = filterFilesRecursiveEnumerata(type, addedFiles); - QSet remove = filterFilesRecursiveEnumerata(type, removedFiles); + const QSet add = filterFilesRecursiveEnumerata(type, addedFiles); + const QSet remove = filterFilesRecursiveEnumerata(type, removedFiles); if (!add.isEmpty() || !remove.isEmpty()) { qCDebug(qmakeParse()) << "For type" << static_cast(type) <<"\n" @@ -451,7 +447,7 @@ bool QmakePriFile::deploysFolder(const QString &folder) const if (!f.endsWith(slash)) f.append(slash); - foreach (const QString &wf, m_watchedFolders) { + for (const QString &wf : qAsConst(m_watchedFolders)) { if (f.startsWith(wf) && (wf.endsWith(slash) || (wf.length() < f.length() && f.at(wf.length()) == slash))) @@ -538,10 +534,10 @@ bool QmakePriFile::addFiles(const FilePaths &filePaths, FilePaths *notAdded) } FilePaths failedFiles; - foreach (const QString &type, typeFileMap.keys()) { - const FilePaths typeFiles = typeFileMap.value(type); + for (auto it = typeFileMap.constBegin(); it != typeFileMap.constEnd(); ++it) { + const FilePaths &typeFiles = *it; FilePaths qrcFiles; // the list of qrc files referenced from ui files - if (type == QLatin1String(ProjectExplorer::Constants::RESOURCE_MIMETYPE)) { + if (it.key() == QLatin1String(ProjectExplorer::Constants::RESOURCE_MIMETYPE)) { for (const FilePath &formFile : typeFiles) { const FilePaths resourceFiles = formResources(formFile); for (const FilePath &resourceFile : resourceFiles) @@ -563,7 +559,7 @@ bool QmakePriFile::addFiles(const FilePaths &filePaths, FilePaths *notAdded) } FilePath::sort(uniqueFilePaths); - changeFiles(type, uniqueFilePaths, &failedFiles, AddToProFile); + changeFiles(it.key(), uniqueFilePaths, &failedFiles, AddToProFile); if (notAdded) *notAdded += failedFiles; changeFiles(QLatin1String(ProjectExplorer::Constants::RESOURCE_MIMETYPE), uniqueQrcFiles, &failedFiles, AddToProFile); @@ -583,7 +579,8 @@ bool QmakePriFile::removeFiles(const FilePaths &filePaths, FilePaths *notRemoved const MimeType mt = Utils::mimeTypeForFile(file); typeFileMap[mt.name()] << file; } - foreach (const QString &type, typeFileMap.keys()) { + const QStringList types = typeFileMap.keys(); + for (const QString &type : types) { const FilePaths typeFiles = typeFileMap.value(type); changeFiles(type, typeFiles, &failedFiles, RemoveFromProFile); if (notRemoved) @@ -950,10 +947,10 @@ QStringList QmakePriFile::varNames(FileType type, QtSupport::ProFileReader *read break; case FileType::Source: { vars << QLatin1String("SOURCES"); - QStringList listOfExtraCompilers = readerExact->values(QLatin1String("QMAKE_EXTRA_COMPILERS")); - foreach (const QString &var, listOfExtraCompilers) { - QStringList inputs = readerExact->values(var + QLatin1String(".input")); - foreach (const QString &input, inputs) + const QStringList listOfExtraCompilers = readerExact->values("QMAKE_EXTRA_COMPILERS"); + for (const QString &var : listOfExtraCompilers) { + const QStringList inputs = readerExact->values(var + QLatin1String(".input")); + for (const QString &input : inputs) // FORMS, RESOURCES, and STATECHARTS are handled below, HEADERS and SOURCES above if (input != "FORMS" && input != "STATECHARTS" @@ -1059,11 +1056,11 @@ QSet QmakePriFile::filterFilesProVariables(FileType fileType, const QS return files; QSet result; if (fileType == FileType::QML) { - foreach (const FilePath &file, files) + for (const FilePath &file : files) if (file.toString().endsWith(QLatin1String(".qml"))) result << file; } else { - foreach (const FilePath &file, files) + for (const FilePath &file : files) if (!file.toString().endsWith(QLatin1String(".qml"))) result << file; } @@ -1076,11 +1073,11 @@ QSet QmakePriFile::filterFilesRecursiveEnumerata(FileType fileType, co if (fileType != FileType::QML && fileType != FileType::Unknown) return result; if (fileType == FileType::QML) { - foreach (const FilePath &file, files) + for (const FilePath &file : files) if (file.toString().endsWith(QLatin1String(".qml"))) result << file; } else { - foreach (const FilePath &file, files) + for (const FilePath &file : files) if (!file.toString().endsWith(QLatin1String(".qml"))) result << file; } @@ -1123,7 +1120,8 @@ const QmakeProFile *QmakeProFile::findProFile(const FilePath &fileName) const QByteArray QmakeProFile::cxxDefines() const { QByteArray result; - foreach (const QString &def, variableValue(Variable::Defines)) { + const QStringList defs = variableValue(Variable::Defines); + for (const QString &def : defs) { // 'def' is shell input, so interpret it. ProcessArgs::SplitError error = ProcessArgs::SplitOk; const QStringList args = ProcessArgs::splitArgs(def, HostOsInfo::hostOs(), false, &error); @@ -1237,7 +1235,7 @@ QString QmakeProFile::singleVariableValue(const Variable var) const void QmakeProFile::setParseInProgressRecursive(bool b) { setParseInProgress(b); - foreach (QmakePriFile *c, children()) { + for (QmakePriFile *c : children()) { if (auto node = dynamic_cast(c)) node->setParseInProgressRecursive(b); } @@ -1253,7 +1251,7 @@ void QmakeProFile::setParseInProgress(bool b) void QmakeProFile::setValidParseRecursive(bool b) { m_validParse = b; - foreach (QmakePriFile *c, children()) { + for (QmakePriFile *c : children()) { if (auto *node = dynamic_cast(c)) node->setValidParseRecursive(b); } @@ -1396,10 +1394,11 @@ QmakeEvalResultPtr QmakeProFile::evaluate(const QmakeEvalInput &input) if (result->state == QmakeEvalResult::EvalOk) { if (result->projectType == ProjectType::SubDirsTemplate) { QStringList errors; - FilePaths subDirs = subDirsPaths(input.readerExact, input.projectDir, &result->subProjectsNotToDeploy, &errors); + const FilePaths subDirs = subDirsPaths(input.readerExact, input.projectDir, + &result->subProjectsNotToDeploy, &errors); result->errors.append(errors); - foreach (const FilePath &subDirName, subDirs) { + for (const FilePath &subDirName : subDirs) { auto subDir = new QmakeIncludedPriFile; subDir->proFile = nullptr; subDir->name = subDirName; @@ -1416,8 +1415,8 @@ QmakeEvalResultPtr QmakeProFile::evaluate(const QmakeEvalInput &input) QmakeIncludedPriFile *current = toBuild.takeFirst(); if (!current->proFile) continue; // Don't attempt to map subdirs here - QVector children = includeFiles.value(current->proFile); - foreach (ProFile *child, children) { + const QVector children = includeFiles.value(current->proFile); + for (ProFile *child : children) { const FilePath childName = FilePath::fromString(child->fileName()); auto it = current->children.find(childName); if (it == current->children.end()) { @@ -1452,8 +1451,8 @@ QmakeEvalResultPtr QmakeProFile::evaluate(const QmakeEvalInput &input) QmakeIncludedPriFile *current = toBuild.takeFirst(); if (!current->proFile) continue; // Don't attempt to map subdirs here - QVector children = includeFiles.value(current->proFile); - foreach (ProFile *child, children) { + const QVector children = includeFiles.value(current->proFile); + for (ProFile *child : children) { const FilePath childName = FilePath::fromString(child->fileName()); auto it = current->children.find(childName); if (it == current->children.end()) { @@ -1481,7 +1480,7 @@ QmakeEvalResultPtr QmakeProFile::evaluate(const QmakeEvalInput &input) for (int i = 0; i < static_cast(FileType::FileTypeSize); ++i) { const auto type = static_cast(i); const QStringList qmakeVariables = varNames(type, exactReader); - foreach (const QString &qmakeVariable, qmakeVariables) { + for (const QString &qmakeVariable : qmakeVariables) { QHash handled; if (result->state == QmakeEvalResult::EvalOk) { const QStringList vPathsExact = fullVPaths( @@ -1645,7 +1644,7 @@ void QmakeProFile::applyEvaluate(const QmakeEvalResultPtr &result) return; } - foreach (const QString &error, result->errors) + for (const QString &error : qAsConst(result->errors)) QmakeBuildSystem::proFileParseError(error, filePath()); // we are changing what is executed in that case @@ -1673,7 +1672,7 @@ void QmakeProFile::applyEvaluate(const QmakeEvalResultPtr &result) if (result->projectType != m_projectType) { // probably all subfiles/projects have changed anyway // delete files && folders && projects - foreach (QmakePriFile *c, children()) { + for (QmakePriFile *c : children()) { if (auto qmakeProFile = dynamic_cast(c)) { qmakeProFile->setValidParseRecursive(false); qmakeProFile->setParseInProgressRecursive(false); @@ -1815,7 +1814,8 @@ QStringList QmakeProFile::includePaths(QtSupport::ProFileReader *reader, const F { QStringList paths; bool nextIsAnIncludePath = false; - foreach (const QString &cxxflags, reader->values(QLatin1String("QMAKE_CXXFLAGS"))) { + const QStringList flagList = reader->values(QLatin1String("QMAKE_CXXFLAGS")); + for (const QString &cxxflags : flagList) { if (nextIsAnIncludePath) { nextIsAnIncludePath = false; paths.append(cxxflags); @@ -1833,9 +1833,9 @@ QStringList QmakeProFile::includePaths(QtSupport::ProFileReader *reader, const F const QString mocDir = mocDirPath(reader, buildDir); const QString uiDir = uiDirPath(reader, buildDir); - foreach (const ProFileEvaluator::SourceFile &el, - reader->fixifiedValues(QLatin1String("INCLUDEPATH"), projectDir, buildDir.toString(), - false)) { + const QVector elList = reader->fixifiedValues( + QLatin1String("INCLUDEPATH"), projectDir, buildDir.toString(), false); + for (const ProFileEvaluator::SourceFile &el : elList) { const QString sysrootifiedPath = sysrootify(el.fileName, sysroot.toString(), projectDir, buildDir.toString()); if (IoUtils::isAbsolutePath(sysrootifiedPath) @@ -1866,7 +1866,8 @@ QStringList QmakeProFile::includePaths(QtSupport::ProFileReader *reader, const F QStringList QmakeProFile::libDirectories(QtSupport::ProFileReader *reader) { QStringList result; - foreach (const QString &str, reader->values(QLatin1String("LIBS"))) { + const QStringList values = reader->values(QLatin1String("LIBS")); + for (const QString &str : values) { if (str.startsWith(QLatin1String("-L"))) result.append(str.mid(2)); } @@ -1881,8 +1882,7 @@ FilePaths QmakeProFile::subDirsPaths(QtSupport::ProFileReader *reader, FilePaths subProjectPaths; const QStringList subDirVars = reader->values(QLatin1String("SUBDIRS")); - - foreach (const QString &subDirVar, subDirVars) { + for (const QString &subDirVar : subDirVars) { // Special case were subdir is just an identifier: // "SUBDIR = subid // subid.subdir = realdir" @@ -1981,7 +1981,7 @@ InstallsList QmakeProFile::installsList(const QtSupport::ProFileReader *reader, reader->propertyValue(installPrefix + "/dev")}); } - foreach (const QString &item, itemList) { + for (const QString &item : itemList) { const QStringList config = reader->values(item + ".CONFIG"); const bool active = !config.contains("no_default_install"); const bool executable = config.contains("executable"); diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h index c723504246f..d481dda64ce 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.h +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.h @@ -119,7 +119,7 @@ public: QmakePriFile *parent() const; QmakeProject *project() const; - QVector children() const; + const QVector children() const; QmakePriFile *findPriFile(const Utils::FilePath &fileName); const QmakePriFile *findPriFile(const Utils::FilePath &fileName) const; diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 43d36b2e225..ac886ee1797 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -175,8 +175,8 @@ Project::RestoreResult QmakeProject::fromMap(const QVariantMap &map, QString *er // Prune targets without buildconfigurations: // This can happen esp. when updating from a old version of Qt Creator - QListts = targets(); - foreach (Target *t, ts) { + const QList ts = targets(); + for (Target *t : ts) { if (t->buildConfigurations().isEmpty()) { qWarning() << "Removing" << t->id().name() << "since it has no buildconfigurations!"; removeTarget(t); @@ -366,7 +366,8 @@ void QmakeBuildSystem::updateCppCodeModel() // Header paths ProjectExplorer::HeaderPaths headerPaths; - foreach (const QString &inc, pro->variableValue(Variable::IncludePath)) { + const QStringList includes = pro->variableValue(Variable::IncludePath); + for (const QString &inc : includes) { const auto headerPath = HeaderPath::makeUser(inc); if (!headerPaths.contains(headerPath)) headerPaths += headerPath; @@ -379,8 +380,8 @@ void QmakeBuildSystem::updateCppCodeModel() // Files and generators const QStringList cumulativeSourceFiles = pro->variableValue(Variable::CumulativeSource); QStringList fileList = pro->variableValue(Variable::ExactSource) + cumulativeSourceFiles; - QList proGenerators = pro->extraCompilers(); - foreach (ProjectExplorer::ExtraCompiler *ec, proGenerators) { + const QList proGenerators = pro->extraCompilers(); + for (ProjectExplorer::ExtraCompiler *ec : proGenerators) { ec->forEachTarget([&](const FilePath &generatedFile) { fileList += generatedFile.toString(); }); @@ -717,7 +718,7 @@ void QmakeBuildSystem::asyncUpdate() project()->updateExtraProjectFiles(docUpdater); rootProFile()->asyncUpdate(); } else { - foreach (QmakeProFile *file, m_partialEvaluate) + for (QmakeProFile *file : qAsConst(m_partialEvaluate)) file->asyncUpdate(); } @@ -763,13 +764,17 @@ Tasks QmakeProject::projectIssues(const Kit *k) const // Find the folder that contains a file with a certain name (recurse down) static FolderNode *folderOf(FolderNode *in, const FilePath &fileName) { - foreach (FileNode *fn, in->fileNodes()) + const QList fileNodeList = in->fileNodes(); + for (FileNode *fn : fileNodeList) { if (fn->filePath() == fileName) return in; - foreach (FolderNode *folder, in->folderNodes()) + } + const QList folderNodeList = in->folderNodes(); + for (FolderNode *folder : folderNodeList) { if (FolderNode *pn = folderOf(folder, fileName)) return pn; - return nullptr; + } + return {}; } // Find the QmakeProFileNode that contains a certain file. @@ -778,7 +783,8 @@ static FileNode *fileNodeOf(FolderNode *in, const FilePath &fileName) { for (FolderNode *folder = folderOf(in, fileName); folder; folder = folder->parentFolderNode()) { if (auto *proFile = dynamic_cast(folder)) { - foreach (FileNode *fileNode, proFile->fileNodes()) { + const QList fileNodeList = proFile->fileNodes(); + for (FileNode *fileNode : fileNodeList) { if (fileNode->filePath() == fileName) return fileNode; } @@ -972,8 +978,8 @@ QSet CentralizedFolderWatcher::recursiveDirs(const QString &folder) { QSet result; QDir dir(folder); - QStringList list = dir.entryList(QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot); - foreach (const QString &f, list) { + const QStringList list = dir.entryList(QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot); + for (const QString &f : list) { const QString a = folder + f + QLatin1Char('/'); result.insert(a); result += recursiveDirs(a); @@ -986,7 +992,7 @@ void CentralizedFolderWatcher::watchFolders(const QList &folders, Qmake m_watcher.addPaths(folders); const QChar slash = QLatin1Char('/'); - foreach (const QString &f, folders) { + for (const QString &f : folders) { QString folder = f; if (!folder.endsWith(slash)) folder.append(slash); @@ -1004,7 +1010,7 @@ void CentralizedFolderWatcher::watchFolders(const QList &folders, Qmake void CentralizedFolderWatcher::unwatchFolders(const QList &folders, QmakePriFile *file) { const QChar slash = QLatin1Char('/'); - foreach (const QString &f, folders) { + for (const QString &f : folders) { QString folder = f; if (!folder.endsWith(slash)) folder.append(slash); @@ -1018,7 +1024,7 @@ void CentralizedFolderWatcher::unwatchFolders(const QList &folders, Qma // where a given directory watcher actual comes from... QStringList toRemove; - foreach (const QString &rwf, m_recursiveWatchedFolders) { + for (const QString &rwf : qAsConst(m_recursiveWatchedFolders)) { if (rwf.startsWith(folder)) { // So the rwf is a subdirectory of a folder we aren't watching // but maybe someone else wants us to watch @@ -1037,7 +1043,7 @@ void CentralizedFolderWatcher::unwatchFolders(const QList &folders, Qma } } - foreach (const QString &tr, toRemove) + for (const QString &tr : qAsConst(toRemove)) m_recursiveWatchedFolders.remove(tr); } } @@ -1050,7 +1056,7 @@ void CentralizedFolderWatcher::folderChanged(const QString &folder) void CentralizedFolderWatcher::onTimer() { - foreach (const QString &folder, m_changedFolders) + for (const QString &folder : qAsConst(m_changedFolders)) delayedFolderChanged(folder); m_changedFolders.clear(); } @@ -1064,12 +1070,12 @@ void CentralizedFolderWatcher::delayedFolderChanged(const QString &folder) while (true) { if (!dir.endsWith(slash)) dir.append(slash); - QList files = m_map.values(dir); + const QList files = m_map.values(dir); if (!files.isEmpty()) { // Collect all the files QSet newFiles; newFiles += QmakePriFile::recursiveEnumerate(folder); - foreach (QmakePriFile *file, files) + for (QmakePriFile *file : files) newOrRemovedFiles = newOrRemovedFiles || file->folderChanged(folder, newFiles); } diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp index 666ede66d65..d0041571db0 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp @@ -87,10 +87,10 @@ QList QmakeProjectImporter::examineDirectory(const FilePath &importPath, QList result; const QLoggingCategory &logs = MakeFileParse::logging(); - QStringList makefiles = QDir(importPath.toString()).entryList(QStringList(QLatin1String("Makefile*"))); + const QStringList makefiles = QDir(importPath.toString()).entryList(QStringList(("Makefile*"))); qCDebug(logs) << " Makefiles:" << makefiles; - foreach (const QString &file, makefiles) { + for (const QString &file : makefiles) { std::unique_ptr data(new DirectoryData); data->makefile = file; data->buildDirectory = importPath; From 5c65115271a8674328afc6f3fc9f9846c056d0d1 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 6 Oct 2022 17:53:35 +0200 Subject: [PATCH 083/104] Android: Convert to using Tr::tr Change-Id: Ie9110093101b0f49808b4da7b13ac3f47c3bb994 Reviewed-by: hjk --- share/qtcreator/translations/qtcreator_cs.ts | 537 +----------- share/qtcreator/translations/qtcreator_da.ts | 255 +----- share/qtcreator/translations/qtcreator_de.ts | 202 +---- share/qtcreator/translations/qtcreator_fr.ts | 449 +--------- share/qtcreator/translations/qtcreator_hr.ts | 237 +----- share/qtcreator/translations/qtcreator_ja.ts | 521 +----------- share/qtcreator/translations/qtcreator_pl.ts | 241 +----- share/qtcreator/translations/qtcreator_ru.ts | 230 +----- share/qtcreator/translations/qtcreator_uk.ts | 780 +----------------- .../qtcreator/translations/qtcreator_zh_CN.ts | 162 +--- .../qtcreator/translations/qtcreator_zh_TW.ts | 161 +--- src/plugins/android/androidavdmanager.cpp | 27 +- src/plugins/android/androidavdmanager.h | 2 - src/plugins/android/androidbuildapkstep.cpp | 137 ++- src/plugins/android/androidconfigurations.cpp | 14 +- .../androidcreatekeystorecertificate.cpp | 62 +- src/plugins/android/androiddeployqtstep.cpp | 113 +-- src/plugins/android/androiddevice.cpp | 80 +- src/plugins/android/androiddevice.h | 2 - src/plugins/android/androiderrormessage.cpp | 21 +- src/plugins/android/androiderrormessage.h | 1 - src/plugins/android/androidmanager.cpp | 14 +- src/plugins/android/androidmanifesteditor.cpp | 11 +- .../android/androidmanifesteditorfactory.cpp | 7 +- ...droidmanifesteditoriconcontainerwidget.cpp | 28 +- .../androidmanifesteditoriconwidget.cpp | 7 +- .../android/androidmanifesteditorwidget.cpp | 89 +- .../androidpackageinstallationstep.cpp | 22 +- src/plugins/android/androidplugin.cpp | 21 +- src/plugins/android/androidpotentialkit.cpp | 11 +- .../android/androidqmlpreviewworker.cpp | 48 +- src/plugins/android/androidqtversion.cpp | 15 +- src/plugins/android/androidqtversion.h | 2 - .../android/androidrunconfiguration.cpp | 14 +- src/plugins/android/androidrunner.cpp | 6 +- src/plugins/android/androidrunnerworker.cpp | 36 +- src/plugins/android/androidsdkdownloader.cpp | 20 +- src/plugins/android/androidsdkmanager.cpp | 30 +- .../android/androidsdkmanagerwidget.cpp | 102 +-- src/plugins/android/androidsdkmodel.cpp | 14 +- src/plugins/android/androidservicewidget.cpp | 41 +- src/plugins/android/androidsettingswidget.cpp | 166 ++-- src/plugins/android/androidtoolchain.cpp | 9 +- src/plugins/android/androidtoolchain.h | 2 - src/plugins/android/avddialog.cpp | 26 +- .../android/createandroidmanifestwizard.cpp | 45 +- .../android/createandroidmanifestwizard.h | 2 - src/plugins/android/javalanguageserver.cpp | 13 +- .../android/splashscreencontainerwidget.cpp | 71 +- src/plugins/android/splashscreenwidget.cpp | 7 +- 50 files changed, 753 insertions(+), 4360 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_cs.ts b/share/qtcreator/translations/qtcreator_cs.ts index d4274350844..2af0850b712 100644 --- a/share/qtcreator/translations/qtcreator_cs.ts +++ b/share/qtcreator/translations/qtcreator_cs.ts @@ -42706,7 +42706,7 @@ Filtr: %2 - AddNewAVDDialog + Android Create new AVD Vytvořit nový AVD @@ -42731,9 +42731,6 @@ Filtr: %2 Kit: Sada: - - - AndroidCreateKeystoreCertificate Create a keystore and a cetificate Vytvořit úložiště pro klíč a certifikát @@ -42830,9 +42827,6 @@ Filtr: %2 Use Keystore password Použít heslo pro úložiště klíče - - - AndroidDeployStepWidget Form Formulář @@ -42977,9 +42971,6 @@ The APK will not be usable on any other device. Zkopíruje místní knihovny Qt na zařízení. Knihovny Qt musíte mít přeloženy pro tuto platformu. Toto APK nelze použít na žádném jiném zařízení. - - - AndroidPackageCreationWidget Manifest Manifest @@ -43148,30 +43139,6 @@ p, li { white-space: pre-wrap; } <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Ikona programu:</span></p></td></tr></table></body></html> - - Select low dpi icon - Vybrat ikonu s nízkým dpi - - - Select medium dpi icon - Vybrat ikonu se středním dpi - - - Select high dpi icon - Vybrat ikonu s vysokým dpi - - - Permissions - Oprávnění - - - Add - Přidat - - - Remove - Odstranit - Save Uložit @@ -43180,10 +43147,6 @@ p, li { white-space: pre-wrap; } Discard Zahodit - - Name: - Název: - android.permission.ACCESS_CHECKIN_PROPERTIES android.permission.ACCESS_CHECKIN_PROPERTIES @@ -43776,9 +43739,6 @@ p, li { white-space: pre-wrap; } Automatically check required Qt libraries from compiled application. Automaticky ověřit požadované knihovny Qt ze sestaveného programu. - - - AndroidSettingsWidget Android Configuration Nastavení pro Android @@ -43787,10 +43747,6 @@ p, li { white-space: pre-wrap; } Android SDK location: Umístění SDK pro Android: - - Browse - Procházet - Android NDK location: Umístění NDK pro Android: @@ -46234,7 +46190,7 @@ Jméno <E-mail> alias <E-mail>. - Android::Internal::AndroidConfigurations + Android Create AVD error Chyba při vytváření AVD @@ -46272,13 +46228,6 @@ Nainstalujte, prosím, jedno SDK s API verze alespoň %1. Android pro %1 (GCC %2, Qt %3) - - Android - - Android - Android - - QtSupport @@ -46323,11 +46272,7 @@ Nainstalujte, prosím, jedno SDK s API verze alespoň %1. - Android::Internal::AndroidCreateKeystoreCertificate - - <span style=" color:#ff0000;">Password is too short</span> - <span style=" color:#ff0000;">Heslo je příliš krátké</span> - + Android <span style=" color:#ff0000;">Passwords don't match</span> <span style=" color:#ff0000;">Heslo neodpovídá</span> @@ -46372,23 +46317,10 @@ Nainstalujte, prosím, jedno SDK s API verze alespoň %1. Error Chyba - - - Android::Internal::AndroidDeployConfiguration - - Deploy to Android device - Poslat na zařízení Android - - - - Android::Internal::AndroidDeployConfigurationFactory Deploy on Android Poslat na Android - - - Android::Internal::AndroidDeployStep Deploy to Android device AndroidDeployStep default display name @@ -46495,7 +46427,7 @@ Nainstalujte, prosím, jedno SDK s API verze alespoň %1. - Android::Internal::AndroidDeployStepWidget + Android <b>Deploy configurations</b> <b>Nastavení nasazení</b> @@ -46521,7 +46453,7 @@ Nainstalujte, prosím, jedno SDK s API verze alespoň %1. - Android::Internal::AndroidPackageCreationStep + Android Packaging for Android Vytvoření balíčku pro Android @@ -46562,10 +46494,6 @@ Please make sure your application is built successfully and is selected in Appli Nelze najít '%1'. Ujistěte se, prosím, že váš program je sestaven úspěšně a je vybrán na kartě s programy ('Volba pro spuštění'). - - Error - Chyba - Failed to run keytool Nepodařilo se spustit nástroj klíče @@ -46602,53 +46530,18 @@ Ujistěte se, prosím, že váš program je sestaven úspěšně a je vybrán na Package created. Soubor s balíčkem byl vytvořen. - - Package deploy: Running command '%1 %2'. - Nasazení balíčku: Spouští se příkaz '%1 %2'. - Packaging failed. Vytvoření balíčku se nezdařilo. - - Packaging error: Could not start command '%1 %2'. Reason: %3 - Chyba při vytváření balíčku: Nepodařilo se spustit příkaz '%1 %2': Důvod %3 - - - Packaging Error: Command '%1 %2' failed. - Chyba při vytváření balíčku: Příkaz '%1 %2' se nepodařilo provést. - - - Reason: %1 - Důvod: %1 - - - Reason: %1 - Důvod: %1 - - - Exit code: %1 - Kód ukončení: %1 - - - Keystore - Úložiště pro klíč - Keystore password: Heslo pro úložiště klíče: - - Certificate - Certifikát - Certificate password (%1): Heslo k certifikátu (%1): - - - Android::Internal::AndroidPackageCreationWidget Invalid package name Neplatný název balíčku @@ -46659,22 +46552,10 @@ Please choose a valid package name for your application (e.g. "org.example. Název balíčku '%1' není platný. Vyberte, prosím, platný název balíčku pro váš program (např. "org.example.myapplication"). - - Choose High DPI Icon - Vybrat ikonu s vysokým dpi - png images (*.png) Soubory s obrázky PNG (*.png) - - Choose Medium DPI Icon - Vybrat ikonu se středním dpi - - - Choose Low DPI Icon - Vybrat ikonu s nízkým dpi - < type or choose a permission > < napište nebo vyberte oprávnění > @@ -46683,10 +46564,6 @@ Vyberte, prosím, platný název balíčku pro váš program (např. "org.e Invalid Package Name Neplatný název balíčku - - PNG images (*.png) - Soubory s obrázky PNG (*.png) - < Type or choose a permission > < Napište nebo vyberte oprávnění > @@ -46699,10 +46576,6 @@ Vyberte, prosím, platný název balíčku pro váš program (např. "org.e Select keystore file Vybrat soubor úložiště klíče - - Keystore files (*.keystore *.jks) - Soubory úložiště klíče (*.keystore *.jks) - QmakeProjectManager @@ -46712,7 +46585,7 @@ Vyberte, prosím, platný název balíčku pro váš program (např. "org.e - Android::Internal::AndroidPackageInstallationStep + Android Copy application data Kopírovat data programu @@ -46725,9 +46598,6 @@ Vyberte, prosím, platný název balíčku pro váš program (např. "org.e Current target is not an android target Nynější cíl není cílem Android - - - Android::Internal::AndroidRunConfiguration The .pro file '%1' is currently being parsed. Soubor .pro '%1' se právě zpracovává. @@ -46736,9 +46606,6 @@ Vyberte, prosím, platný název balíčku pro váš program (např. "org.e Run on Android device Spustit na zařízení Android - - - Android::Internal::AndroidRunControl Starting remote process ... Spouští se vzdálený proces... @@ -46747,9 +46614,6 @@ Vyberte, prosím, platný název balíčku pro váš program (např. "org.e Starting remote process. Spouští se vzdálený proces. - - - Android::Internal::AndroidRunControlFactory Run on Android device/emulator Spustit na zařízení/emulátor Android @@ -46758,9 +46622,6 @@ Vyberte, prosím, platný název balíčku pro váš program (např. "org.e Run on Android device or emulator. Spustit na zařízení nebo emulátoru Androida. - - - Android::Internal::AndroidRunner @@ -46865,31 +46726,10 @@ Vyberte, prosím, platný název balíčku pro váš program (např. "org.e '%1' ukončen. - - - Android::Internal::AndroidSettingsPage Android Configurations Nastavení pro Android - - - Android::Internal::AVDModel - - AVD Name - Název AVD - - - AVD Target - Cíl AVD - - - CPU/ABI - CPU/ABI - - - - Android::Internal::AndroidSettingsWidget Android SDK Folder Složka SDK pro Android @@ -46994,38 +46834,6 @@ Pro přidání verzí Qt vyberte Volby -> Sestavení a spuštění -> Verz Select OpenJDK path Vybrat cestu pro OpenJDK - - - Android::Internal::AndroidTarget - - Error creating Android directory '%1'. - Chyba při vytváření adresáře Android '%1'. - - - No Qt for Android SDKs were found. -Please install at least one SDK. - Nepodařilo se najít žádné Qt pro SDK Android. -Nainstalujte, prosím, alespoň jedno SDK. - - - Android files have been updated automatically - Soubory Android byly zaktualizovány automaticky - - - Can't parse '%1' - Nelze zpracovat '%1' - - - Can't open '%1' - Nelze otevřít '%1' - - - Error creating Android templates - Chyba při vytváření předloh Android - - - - Android::Internal::AndroidTargetFactory Debug Ladění @@ -47034,9 +46842,6 @@ Nainstalujte, prosím, alespoň jedno SDK. Release Vydání - - - Android::Internal::AndroidToolChainFactory Android GCC GCC Android @@ -47053,9 +46858,6 @@ Nainstalujte, prosím, alespoň jedno SDK. Android GCC (%1-%2) GCC Android (%1-%2) - - - Android::Internal::AndroidToolChainConfigWidget NDK Root: %1 Kořen (root) NDK: %1 @@ -47064,9 +46866,6 @@ Nainstalujte, prosím, alespoň jedno SDK. NDK Root: Kořen (root) NDK: - - - AutotoolsProjectManager Autogen Display name for AutotoolsProjectManager::AutogenStep id. @@ -49817,32 +49616,15 @@ Je zapotřebí mít nějakou verzi Qt a sadu nástrojů, aby modely kódu C++ a - Android::Internal::AndroidDeployStepFactory - - Deploy to Android device or emulator - Nasadit na zařízení nebo emulátor Android. - - - - Android::Internal::AndroidDevice + Android Run on Android Spustit na Androidu - - Android - Android - - - - Android::Internal::AndroidDeviceFactory Android Device Zařízení Android - - - Android::Internal::AndroidManager Error creating Android directory '%1'. Chyba při vytváření adresáře Android '%1'. @@ -49897,23 +49679,14 @@ Nainstalujte, prosím, alespoň jedno SDK. Can't open '%1' Nelze otevřít '%1' - - - Android::Internal::AndroidPackageCreationFactory Create Android (.apk) Package Vytvořit balíček pro Android (*.apk) - - - Android::Internal::AndroidPackageInstallationFactory Deploy to device Nasadit na zařízení - - - Android::Internal::AndroidQtVersion Failed to detect the ABIs used by the Qt version. ABI(s) verze Qt se nepodařilo určit. @@ -49923,9 +49696,6 @@ Nainstalujte, prosím, alespoň jedno SDK. Qt Version is meant for Android Android - - - Android::Internal::AvdModel AVD Name AVD - Android Virtual Device @@ -53606,14 +53376,11 @@ nelze najít v cestě. - Android::Internal::AndroidGdbServerKitInformation + Android GDB server Server GDB: - - - Android::Internal::AndroidGdbServerKitInformationWidget Manage... Spravovat... @@ -55615,14 +55382,11 @@ Lze používat části jmen, pokud jsou jednoznačné. - Android::Internal::AndroidAnalyzeSupport + Android No analyzer tool selected. Nevybrán žádný nástroj pro rozbor. - - - Android::Internal::AndroidManifestEditor General Obecné @@ -55631,16 +55395,10 @@ Lze používat části jmen, pokud jsou jednoznačné. XML Source Zdroj XML - - - Android::Internal::AndroidManifestEditorFactory Android Manifest editor Editor manifestu pro Android - - - Android::Internal::AndroidManifestEditorWidget Package Balíček @@ -55695,10 +55453,6 @@ Lze používat části jmen, pokud jsou jednoznačné. Target SDK: SDK cíle: - - Application - Program - Application name: Název programu: @@ -55763,14 +55517,6 @@ Lze používat části jmen, pokud jsou jednoznačné. Permissions Oprávnění - - Remove - Odstranit - - - Add - Přidat - The structure of the android manifest file is corrupt. Expected a top level 'manifest' node. Stavba souboru s manifestem pro Android je neplatná. Očekáván uzel 'manifest' na nejhornější úrovni. @@ -55807,9 +55553,6 @@ Lze používat části jmen, pokud jsou jednoznačné. Choose High DPI Icon Vybrat ikonu s vysokým dpi - - - Android::AndroidPlugin Android Manifest file Soubor s manifestem pro Android @@ -56951,78 +56694,15 @@ Tento průvodce vás provede základními kroky, které jsou nutné pro nasazen - Android::Internal::AddNewAVDDialog - - Create new AVD - Vytvořit nový AVD - + Android Target API: Cílové API: - - Name: - Název: - - - SD card size: - Velikost karty SD: - - - MiB - MiB - ABI: ABI: - - - AndroidDeployQtWidget - - Form - Formulář - - - Sign package - Podepsat balíček - - - Keystore: - Úložiště pro klíč: - - - Create - Vytvoření - - - Browse - Procházet - - - Signing a debug package - Podepsání balíčku ladění - - - Certificate alias: - Alias certifikátu: - - - Advanced Actions - Pokročilé činnosti - - - Clean Temporary Libraries Directory on Device - Vyprázdnit adresář s dočasnými knihovnami na zařízení - - - Install Ministro from APK - Instalovat Ministro z APK - - - Reset Default Devices - Nastavit výchozí zařízení znovu - Open package location after build Otevřít umístění balíčku, když je sestaven @@ -57035,10 +56715,6 @@ Tento průvodce vás provede základními kroky, které jsou nutné pro nasazen Create AndroidManifest.xml Vytvořit AndroidManifest.xml - - Application - Program - Android target SDK: SDK pro Android: @@ -57051,36 +56727,6 @@ Tento průvodce vás provede základními kroky, které jsou nutné pro nasazen Qt no longer uses the folder "android" in the project's source directory. Qt už nadále nepoužívá složku "android" v adresáři projektu se zdroji. - - Qt Deployment - Nasazení Qt - - - Use the external Ministro application to download and maintain Qt libraries. - Použít externí program Ministro ke stažení a správě knihoven Qt. - - - Use Ministro service to install Qt - Použít službu Ministro k nainstalování Qt - - - Push local Qt libraries to device. You must have Qt libraries compiled for that platform. -The APK will not be usable on any other device. - Zkopírovat místní knihovny Qt na zařízení. Knihovny Qt musíte mít přeloženy pro tuto platformu. -Toto APK nelze použít na žádném jiném zařízení. - - - Deploy local Qt libraries to temporary directory - Zkopírovat místní knihovny Qt do dočasného adresáře - - - Creates a standalone APK. - Vytvoří samostatné APK. - - - Bundle Qt libraries in APK - Knihovny Qt zabalit do APK - Additional Libraries Dodatečné knihovny @@ -57093,18 +56739,10 @@ Toto APK nelze použít na žádném jiném zařízení. Select library to include in package. Vybrat knihovnu k zahrnutí v balíčku. - - Add - Přidat - Remove currently selected library from list. Odstranit nyní vybranou knihovnu ze seznamu. - - Remove - Odstranit - Create... Vytvořit... @@ -57113,23 +56751,6 @@ Toto APK nelze použít na žádném jiném zařízení. Android build SDK: SDK pro sestavení pro Android: - - Uses the external Ministro application to download and maintain Qt libraries. - Používá externí program Ministro ke stažení a správě knihoven Qt. - - - Pushes local Qt libraries to device. You must have Qt libraries compiled for that platform. -The APK will not be usable on any other device. - Zkopíruje místní knihovny Qt na zařízení. Knihovny Qt musíte mít přeloženy pro tuto platformu. -Toto APK nelze použít na žádném jiném zařízení. - - - Add... - Přidat... - - - - Android::Internal::AndroidDeviceDialog Select Android Device Vybrat zařízení Android @@ -57146,10 +56767,6 @@ Toto APK nelze použít na žádném jiném zařízení. Always use this device for architecture %1 Vždy používat toto zařízení pro architekturu %1 - - ABI: - ABI: - Compatible devices Slučitelná zařízení @@ -57983,19 +57600,11 @@ monitor reset - Android::Internal::AndroidDeployQtStepFactory + Android Deploy to Android device or emulator Nasadit na zařízení nebo emulátor Android - - - Android::Internal::AndroidDeployQtStep - - Deploy to Android device - AndroidDeployQtStep default display name - Poslat na zařízení Android - Found old folder "android" in source directory. Qt 5.2 does not use that folder by default. Ve zdrojovém adresáři nalezena stará složka "android". Qt 5.2 tuto složku nepoužívá jako výchozí. @@ -58004,10 +57613,6 @@ monitor reset No Android arch set by the .pro file. Podle souboru .pro nenastaven žádný archiv Android. - - Warning: Signing a debug package. - Varování: Podepsání balíčku ladění. - Internal Error: Could not find .pro file. Vnitřní chyba: Nepodařilo se najít soubor .pro. @@ -58016,34 +57621,6 @@ monitor reset Internal Error: Unknown Android deployment JSON file location. Vnitřní chyba: Neznámé umístění souboru JSON nasazení Androidu. - - Pulling files necessary for debugging. - Nahrávají se soubory nezbytné pro ladění. - - - Package deploy: Running command '%1 %2'. - Nasazení balíčku: Spouští se příkaz '%1 %2'. - - - Packaging error: Could not start command '%1 %2'. Reason: %3 - Chyba při vytváření balíčku: Nepodařilo se spustit příkaz '%1 %2': Důvod %3 - - - Packaging Error: Command '%1 %2' failed. - Chyba při vytváření balíčku: Příkaz '%1 %2' se nepodařilo provést. - - - Reason: %1 - Důvod: %1 - - - Exit code: %1 - Kód ukončení: %1 - - - Error - Chyba - Failed to run keytool. Nepodařilo se spustit nástroj klíče. @@ -58052,45 +57629,6 @@ monitor reset Invalid password. Neplatné heslo. - - Keystore - Úložiště pro klíč - - - Keystore password: - Heslo pro úložiště klíče: - - - Certificate - Certifikát - - - Certificate password (%1): - Heslo k certifikátu (%1): - - - - Android::Internal::AndroidDeployQtWidget - - <b>Deploy configurations</b> - <b>Nastavení nasazení</b> - - - Qt Android Smart Installer - Chytrý instalátor pro Qt Android - - - Android package (*.apk) - Balíček pro Android (*.apk) - - - Select keystore file - Vybrat soubor úložiště klíče - - - Keystore files (*.keystore *.jks) - Soubory úložiště klíče (*.keystore *.jks) - Select additional libraries Vybrat dodatečné knihovny @@ -58099,9 +57637,6 @@ monitor reset Libraries (*.so) Knihovny (*.so) - - - Android::Internal::AndroidErrorMessage Android: SDK installation error 0x%1 Android: Chyba při instalaci SDK 0x%1 @@ -58142,9 +57677,6 @@ monitor reset Android: Unknown error 0x%1 Android: Neznámá chyba 0x%1 - - - Android::Internal::AndroidPackageInstallationStepWidget <b>Make install</b> <b>Make install</b> @@ -58153,9 +57685,6 @@ monitor reset Make install Make install - - - Android::Internal::AndroidPotentialKitWidget Qt Creator needs additional settings to enable Android support.You can configure those settings in the Options dialog. Qt Creator potřebuje dodatečná nastavení pro povolení podpory pro Android. Tato nastavení můžete nastavit v dialogu s volbami. @@ -58168,9 +57697,6 @@ monitor reset Qt Creator needs additional settings to enable Android support. You can configure those settings in the Options dialog. Qt Creator potřebuje dodatečná nastavení pro povolení podpory pro Android. Tato nastavení můžete nastavit v dialogu s volbami. - - - Android::Internal::NoApplicationProFilePage No application .pro file found in this project. V tomto projektu nebyl nalezen žádný soubor .pro aplikace. @@ -58179,9 +57705,6 @@ monitor reset No Application .pro File Žádný soubor .pro aplikace - - - Android::Internal::ChooseProFilePage Select the .pro file for which you want to create an AndroidManifest.xml file. vyberte soubor .pro, pro který chcete vytvořit soubor AndroidManifest.xml. @@ -58194,9 +57717,6 @@ monitor reset Select a .pro File Vybrat soubor .pro - - - Android::Internal::ChooseDirectoryPage The Android package source directory can not be the same as the project directory. Zdrojový adresář balíčku pro Android nemůže být týž jako projektový adresář. @@ -58221,9 +57741,6 @@ Soubory ve zdrojovém adresáři balíčku pro Android jsou zkopírovány do adr The Android manifest file will be created in the ANDROID_PACKAGE_SOURCE_DIR set in the .pro file. Soubor s manifestem pro Android bude vytvořen v ANDROID_PACKAGE_SOURCE_DIR nastaveném v souboru .pro. - - - Android::Internal::CreateAndroidManifestWizard Create Android Manifest Wizard Vytvořit průvodce manifestem pro Android @@ -60266,45 +59783,15 @@ Vytvořte, prosím, aplikaci qmldump na stránce pro nastavení verze Qt. - AndroidConfiguration - - Could not run: %1 - Nepodařilo se spustit: %1 - - - No devices found in output of: %1 - Nenalezena žádná zařízení ve výstupu: %1 - - - - AndroidConfig - - Error Creating AVD - Chyba při vytváření AVD - - - Cannot create a new AVD. No sufficiently recent Android SDK available. -Please install an SDK of at least API version %1. - Nelze vytvořit nové AVD. Není dostupné dostačně nedávné SDK pro Android. -Nainstalujte, prosím, jedno SDK s API verze alespoň %1. - - - - Android::Internal::AndroidPotentialKit + Android Configure Android... Nastavit Android... - - - Android::Internal::JavaEditorFactory Java Editor Editor Javy - - - Android::Internal::JavaFileWizard Creates a Java file with boilerplate code. Vytvoří soubor Java s kódem se standardním textem. diff --git a/share/qtcreator/translations/qtcreator_da.ts b/share/qtcreator/translations/qtcreator_da.ts index 23ed9c91805..34b1c9bd369 100644 --- a/share/qtcreator/translations/qtcreator_da.ts +++ b/share/qtcreator/translations/qtcreator_da.ts @@ -2,7 +2,7 @@ - AdbCommandsWidget + Android Widget Widget @@ -152,7 +152,7 @@ - Android::AndroidBuildApkStep + Android Build Android APK AndroidBuildApkStep default display name @@ -192,9 +192,6 @@ Minimum API-niveauet krævet af kittet er %1. Failed to run keytool. Kunne ikke køre keytool. - - - Android::AndroidBuildApkWidget Keystore files (*.keystore *.jks) Keystore-filer (*.keystore *.jks) @@ -207,9 +204,6 @@ Minimum API-niveauet krævet af kittet er %1. <b>Build Android APK</b> <b>Byg Android APK</b> - - - Android::AndroidConfigurations Android Debugger for %1 Android-fejlretter for %1 @@ -218,9 +212,6 @@ Minimum API-niveauet krævet af kittet er %1. Android for %1 (GCC %2, %3) Android for %1 (GCC %2, %3) - - - Android::AndroidManager Unknown Android version. API Level: %1 Ukendt Android version. API-niveau: %1 @@ -237,9 +228,6 @@ Minimum API-niveauet krævet af kittet er %1. Starting Android virtual device failed. Start af Android virtuel-enhed mislykkedes. - - - Android::Internal::AddNewAVDDialog Create new AVD Opret ny AVD @@ -264,9 +252,6 @@ Minimum API-niveauet krævet af kittet er %1. MiB MiB - - - Android::Internal::AndroidCreateKeystoreCertificate Keystore password is too short. Keystore adgangskode er for kort. @@ -295,24 +280,6 @@ Minimum API-niveauet krævet af kittet er %1. Keystore Filename Keystore-filnavn - - Keystore files (*.keystore *.jks) - Keystore-filer (*.keystore *.jks) - - - Error - Fejl - - - - Android::Internal::AndroidDeployConfiguration - - Deploy to Android device - Udsend til Android-enhed - - - - Android::Internal::AndroidDeployQtStep Deploy to Android device AndroidDeployQtStep default display name @@ -394,16 +361,10 @@ Vil du afinstallere den eksisterende pakke? Package deploy: Running command "%1 %2". Pakkeudsendelse: kører kommandoen "%1 %2". - - - Android::Internal::AndroidDeployQtStepFactory Deploy to Android device or emulator Udsend til Android-enhed eller emulator - - - Android::Internal::AndroidDeployQtWidget <b>Deploy configurations</b> <b>Udsend-konfigurationer</b> @@ -416,20 +377,10 @@ Vil du afinstallere den eksisterende pakke? Android package (*.apk) Android-pakke (*.apk) - - - Android::Internal::AndroidDevice Run on Android Kør på Android - - Android - Android - - - - Android::Internal::AndroidDeviceDialog Select Android Device Vælg Android-enhed @@ -458,10 +409,6 @@ Vil du afinstallere den eksisterende pakke? Refresh Device List Genopfrisk enhedsliste - - ABI: - ABI: - Compatible devices Kompatible enheder @@ -502,16 +449,10 @@ Vil du afinstallere den eksisterende pakke? Looking for default device <b>%1</b>. Kig efter standardenhed <b>%1</b>. - - - Android::Internal::AndroidDeviceFactory Android Device Android-enhed - - - Android::Internal::AndroidDeviceModelDelegate OpenGL enabled OpenGL aktiveret @@ -520,9 +461,6 @@ Vil du afinstallere den eksisterende pakke? OpenGL disabled OpenGL deaktiveret - - - Android::Internal::AndroidErrorMessage Android: SDK installation error 0x%1 Android: SDK installationsfejl 0x%1 @@ -563,16 +501,10 @@ Vil du afinstallere den eksisterende pakke? Android: Unknown error 0x%1 Android: ukendt fejl 0x%1 - - - Android::Internal::AndroidGdbServerKitInformation GDB server GDB-server - - - Android::Internal::AndroidGdbServerKitInformationWidget Manage... Håndter... @@ -601,9 +533,6 @@ Vil du afinstallere den eksisterende pakke? GDB Server for "%1" GDB-server for "%1" - - - Android::Internal::AndroidManifestEditor General Generelt @@ -612,16 +541,10 @@ Vil du afinstallere den eksisterende pakke? XML Source XML-kilde - - - Android::Internal::AndroidManifestEditorFactory Android Manifest editor Android Manifest-redigering - - - Android::Internal::AndroidManifestEditorWidget Package Pakke @@ -758,23 +681,14 @@ Vil du afinstallere den eksisterende pakke? Choose High DPI Icon Vælg høj-DPI-ikon - - - Android::Internal::AndroidPotentialKit Configure Android... Konfigurer Android... - - - Android::Internal::AndroidPotentialKitWidget %1 needs additional settings to enable Android support. You can configure those settings in the Options dialog. %1 har brug for yderligere indstillinger for at aktivere Android-understøttelse. Kan du konfigurere sådanne indstillinger i dialogen Valgmuligheder. - - - Android::Internal::AndroidQtVersion Failed to detect the ABIs used by the Qt version. Kunne ikke detektere ABI'erne brugt af Qt versionen. @@ -784,16 +698,10 @@ Vil du afinstallere den eksisterende pakke? Qt Version is meant for Android Android - - - Android::Internal::AndroidRunner "%1" terminated. "%1" termineret. - - - Android::Internal::AndroidRunnerWorker No free ports available on host for QML debugging. Ingen ledige porte tilgængelige på vært til QML-fejlretning. @@ -838,9 +746,6 @@ Vil du afinstallere den eksisterende pakke? "%1" died. "%1" dødede. - - - Android::Internal::AndroidSdkManager The operation requires user interaction. Use the "sdkmanager" command-line tool. Handlingen kræver indgriben fra brugeren. Brug kommandolinjeværktøjet "sdkmanager". @@ -853,9 +758,6 @@ Vil du afinstallere den eksisterende pakke? - - - Android::Internal::AndroidSdkManagerWidget Android SDK Manager Android SDK manager @@ -900,10 +802,6 @@ Vil du afinstallere den eksisterende pakke? Native SDK Manager... Native SDK manager... - - Cancel - Annuller - Do you want to accept the Android SDK license? Vil du acceptere Android SDK-licensen? @@ -1011,13 +909,6 @@ Cancelling pending operations... Annullerer afventende handlinger... - - - Android::Internal::AndroidSdkModel - - Package - Pakke - Revision Revision @@ -1050,16 +941,6 @@ Annullerer afventende handlinger... Install Installation - - - Android::Internal::AndroidSettingsPage - - Android - Android - - - - Android::Internal::AndroidSettingsWidget JDK path exists. JDK-sti findes. @@ -1170,23 +1051,14 @@ Vælg Valgmuligheder > Byg & kør > Qt versioner, for at tilføje Qt v AVD manager UI tool is not available in the installed SDK tools(version %1). Use the command line tool "avdmanager" for advanced AVD management. AVD manager UI-værktøj er ikke tilgængelig i de installerede SDK-værktøjer (version %1). Brug kommandolinjeværktøjet "avdmanager" for avanceret håndtering af AVD. - - - Android::Internal::AndroidToolChainConfigWidget NDK Root: NDK-rod: - - - Android::Internal::AndroidToolChainFactory Android GCC Android GCC - - - Android::Internal::AvdDialog Cannot create a new AVD. No sufficiently recent Android SDK available. Install an SDK of at least API version %1. @@ -1201,9 +1073,6 @@ Installer en SDK af mindst API version %1. Allowed characters are: a-z A-Z 0-9 and . _ - Tilladte tegn er: a-z A-Z 0-9 og . _ - - - - Android::Internal::AvdModel AVD Name AVD - Android Virtual Device @@ -1217,16 +1086,10 @@ Installer en SDK af mindst API version %1. CPU/ABI CPU/ABI - - - Android::Internal::JavaEditorFactory Java Editor Java-redigering - - - Android::Internal::OptionsDialog SDK Manager Arguments SDK manager-argumenter @@ -1243,9 +1106,6 @@ Installer en SDK af mindst API version %1. Available arguments: Tilgængelige argumenter: - - - Android::PasswordInputDialog Incorrect password. Ukorrekt adgangskode. @@ -1266,9 +1126,6 @@ Installer en SDK af mindst API version %1. Enter certificate password Indtast certifikat-adgangskode - - - AndroidAvdManager Cannot create AVD. Invalid input. Kan ikke oprette AVD. Ugyldigt input. @@ -1285,9 +1142,6 @@ Installer en SDK af mindst API version %1. Cannot create AVD. Command timed out. Kan ikke oprette AVD. Kommando fik timeout. - - - AndroidBuildApkWidget Sign package Signér pakke @@ -1308,10 +1162,6 @@ Installer en SDK af mindst API version %1. Certificate alias: Certifikat alias: - - Application - Program - Android build SDK: Android-byg SDK: @@ -1344,16 +1194,10 @@ Installer en SDK af mindst API version %1. Add debug server Tilføj fejlret-server - - - AndroidConfig Error Creating AVD Fejl ved oprettelse af AVD - - - AndroidConfiguration Could not run: %1 Kunne ikke kører: %1 @@ -1362,9 +1206,6 @@ Installer en SDK af mindst API version %1. No devices found in output of: %1 Ingen enheder fundet i output af: %1 - - - AndroidCreateKeystoreCertificate Create a keystore and a certificate Opret en keystore og et certifikat @@ -1397,10 +1238,6 @@ Installer en SDK af mindst API version %1. Two-letter country code for this unit (e.g. RO): Sprogkode på to bogstaver for denne enhed (f.eks. RO): - - Certificate - Certifikat - Show password Vis adgangskode @@ -1429,13 +1266,6 @@ Installer en SDK af mindst API version %1. Use Keystore password Brug keystore adgangskode - - Keystore - Keystore - - - - AndroidDeployQtWidget Deploy options Udsend-valgmuligheder @@ -1456,9 +1286,6 @@ Installer en SDK af mindst API version %1. Install Ministro from APK Installer Ministro fra APK - - - AndroidSdkManager Updating installed packages. Opdaterer installerede pakker. @@ -1487,9 +1314,6 @@ Installer en SDK af mindst API version %1. Failed Mislykkedes - - - AndroidSettingsWidget Android Configuration Android-konfiguration @@ -1538,10 +1362,6 @@ Installer en SDK af mindst API version %1. Mb Mb - - Remove - Fjern - Add... Tilføj... @@ -1563,13 +1383,6 @@ Installer en SDK af mindst API version %1. SDK manager - - AndroidToolManager - - Could not start process "%1 %2" - Kunne ikke starte processen "%1 %2" - - Application @@ -2406,7 +2219,7 @@ Advarsel: dette er en eksperimentel facilitet og kan lede til at test-eksekverba - AutotoolsProjectManager + Android Autogen Autogen @@ -28394,7 +28207,7 @@ Udløbsdato: %3 - QmakeAndroidSupport::Internal::ChooseDirectoryPage + Android Android package source directory: Android-pakke kildemappe: @@ -28423,9 +28236,6 @@ Filerne i Android-pakke kildemappen kopieres til bygmappens Android-mappe og sta The Android template files will be created in the ANDROID_PACKAGE_SOURCE_DIR set in the .pro file. Android-skabelon-filerne vil blive oprettet i ANDROID_PACKAGE_SOURCE_DIR sæt i .pro-filen. - - - QmakeAndroidSupport::Internal::ChooseProFilePage Select the .pro file for which you want to create the Android template files. Vælg .pro-filen til hvilke du vil oprette Android-skabelon-filerne. @@ -28438,9 +28248,6 @@ Filerne i Android-pakke kildemappen kopieres til bygmappens Android-mappe og sta Select a .pro File Vælg en .pro-fil - - - QmakeAndroidSupport::Internal::CreateAndroidManifestWizard Create Android Template Files Wizard Opret Android-skabelon-filer-assistent @@ -28469,9 +28276,6 @@ Filerne i Android-pakke kildemappen kopieres til bygmappens Android-mappe og sta Could not update the .pro file %1. Kunne ikke opdatere .pro-filen %1. - - - QmakeAndroidSupport::Internal::NoApplicationProFilePage No application .pro file found in this project. Ingen program .pro-fil fundet i dette projekt. @@ -28480,13 +28284,6 @@ Filerne i Android-pakke kildemappen kopieres til bygmappens Android-mappe og sta No Application .pro File Ingen program .pro-fil - - - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkStep - - Found old folder "android" in source directory. Qt 5.2 does not use that folder by default. - Fandt gammel "android"-mappe i kildemappe. Qt 5.2 bruger ikke den mappe som standard. - Android build SDK not defined. Check Android settings. Android-byg SDK ikke defineret. Tjek Android-indstillinger. @@ -28495,24 +28292,6 @@ Filerne i Android-pakke kildemappen kopieres til bygmappens Android-mappe og sta No application .pro file found, not building an APK. Ingen program .pro-fil fundet, bygger ikke en APK. - - Starting: "%1" %2 - Starter: "%1" %2 - - - - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkStepFactory - - Build Android APK - Byg Android APK - - - - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkWidget - - Android - Android - Create Templates Opret skabeloner @@ -28529,18 +28308,10 @@ Filerne i Android-pakke kildemappen kopieres til bygmappens Android-mappe og sta Select library to include in package. Vælg bibliotek som skal inkluderes i pakke. - - Add... - Tilføj... - Remove currently selected library from list. Fjern aktuelt valgt bibliotek fra liste. - - Remove - Fjern - Select additional libraries Vælg yderligere biblioteker @@ -28549,10 +28320,6 @@ Filerne i Android-pakke kildemappen kopieres til bygmappens Android-mappe og sta Libraries (*.so) Biblioteker (*.so) - - <b>Build Android APK</b> - <b>Byg Android APK</b> - QmakeProjectManager @@ -42462,7 +42229,7 @@ Spordataene er tabt. - Android::Internal::AndroidAvdManager + Android AVD Start Error Fejl ved start af AVD @@ -42475,9 +42242,6 @@ Spordataene er tabt. Install the missing emulator tool (%1) to the installed Android SDK. Installer det manglende emulatorværktøj (%1) til det installerede Android SDK. - - - Android::AndroidPackageInstallationStep Copy application data Kopiér programdata @@ -42486,23 +42250,14 @@ Spordataene er tabt. Removing directory %1 Fjerner mappen %1 - - - Android::Internal::AndroidPackageInstallationStepWidget Make install Make install - - - Android::Internal::AndroidPackageInstallationFactory Deploy to device Udsend til enhed - - - Android::AndroidRunConfiguration Activity manager start options: Aktivitetshåndteringer start-valgmuligheder: diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index d1ef5e2ff29..12fcd683b25 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -17983,7 +17983,7 @@ should a repository require SSH-authentication (see documentation on SSH and the - AutotoolsProjectManager + Android Autogen Display name for AutotoolsProjectManager::AutogenStep id. @@ -18611,7 +18611,7 @@ should a repository require SSH-authentication (see documentation on SSH and the - AndroidCreateKeystoreCertificate + Android Keystore Keystore @@ -18680,9 +18680,6 @@ should a repository require SSH-authentication (see documentation on SSH and the Use Keystore password Keystore-Passwort verwenden - - - AndroidSettingsWidget Android Configuration Android-Konfiguration @@ -18926,7 +18923,7 @@ should a repository require SSH-authentication (see documentation on SSH and the - Android::Internal::AndroidCreateKeystoreCertificate + Android Keystore password is too short. Das Keystore-Passwort ist zu kurz. @@ -18963,16 +18960,10 @@ should a repository require SSH-authentication (see documentation on SSH and the Error Fehler - - - Android::Internal::AndroidRunner "%1" terminated. "%1" beendet. - - - Android::Internal::AndroidSettingsWidget Select JDK Path Pfad zum JDK auswählen @@ -19153,10 +19144,6 @@ manuellen Herunterladen im Browser des System zu öffnen. Missing Android SDK Packages Fehlende Android-SDK-Pakete - - Android - Android - Android settings are OK. Android-Einstellungen sind korrekt. @@ -19720,22 +19707,15 @@ gehören nicht zu den verifizierten Remotes in %3. Anderes Verzeichnis angeben?< - Android::Internal::AndroidDevice + Android Run on Android Ausführung auf Android-Gerät - - Android - Android - Android Device Android-Gerät - - - Android::Internal::AndroidQtVersion NDK is not configured in Devices > Android. In Geräte > Android ist kein NDK konfiguriert. @@ -20085,7 +20065,7 @@ hinzufügen, um dem QML-Editor den wahrscheinlichen URI mitzuteilen. - Android::Internal::AvdModel + Android AVD Name AVD - Android Virtual Device @@ -22824,7 +22804,7 @@ Teilnamen können verwendet werden, sofern sie eindeutig sind. - Android::Internal::AndroidManifestEditor + Android General Allgemein @@ -22833,9 +22813,6 @@ Teilnamen können verwendet werden, sofern sie eindeutig sind. XML Source XML-Quelle - - - Android::Internal::AndroidManifestEditorWidget Package Paket @@ -22932,10 +22909,6 @@ Teilnamen können verwendet werden, sofern sie eindeutig sind. Include default features for Qt modules. Standard-Features für Qt-Module einschließen. - - Remove - Entfernen - Add Hinzufügen @@ -23206,7 +23179,7 @@ Teilnamen können verwendet werden, sofern sie eindeutig sind. - Android::Internal::AndroidErrorMessage + Android Android: SDK installation error 0x%1 Android: Bei der SDK-Installation trat Fehler 0x%1 auf @@ -23393,7 +23366,7 @@ Bitte schließen Sie alle laufenden Instanzen Ihrer Anwendung vor dem Erstellen. - Android::Internal::AddNewAVDDialog + Android Create new AVD Android Virtual Device @@ -23427,9 +23400,6 @@ Bitte schließen Sie alle laufenden Instanzen Ihrer Anwendung vor dem Erstellen. Overwrite existing AVD name Bestehenden AVD-Namen überschreiben - - - Android::Internal::AndroidDeviceDialog Select Android Device Android-Gerät auswählen @@ -23494,10 +23464,6 @@ Bitte schließen Sie alle laufenden Instanzen Ihrer Anwendung vor dem Erstellen. <html><head/><body><p><a href="aaa"><span style=" text-decoration: underline; color:#0057ae;">My device is missing</span></a></p></body></html> <html><head/><body><p><a href="aaa"><span style=" text-decoration: underline; color:#0057ae;">Mein Gerät fehlt</span></a></p></body></html> - - Cancel - Abbrechen - This can be later reset in deployment settings in the Projects mode. Dies kann später in den Deploymenteinstellungen im Projektmodus zurückgesetzt werden. @@ -23803,7 +23769,7 @@ benötigt wird, was meist die Geschwindigkeit erhöht. - Android::Internal::AndroidDeployQtStep + Android No Android arch set by the .pro file. Die .pro-Datei setzt keine Android-Architektur. @@ -23913,9 +23879,6 @@ Möchten Sie das vorhandene Paket deinstallieren? Package deploy: Running command "%1". Paket-Deployment: Führe Kommando "%1" aus. - - - Android::Internal::AndroidPotentialKitWidget %1 needs additional settings to enable Android support. You can configure those settings in the Options dialog. %1 benötigt zusätzliche Einstellungen, um die Android-Unterstützung zu aktivieren. Sie können diese im Einstellungsdialog konfigurieren. @@ -25913,7 +25876,7 @@ Bitte erstellen Sie die Anwendung qmldump auf der Einstellungsseite der Qt-Versi - AndroidConfiguration + Android Could not run: %1 Keine Ausführung möglich: %1 @@ -25922,16 +25885,10 @@ Bitte erstellen Sie die Anwendung qmldump auf der Einstellungsseite der Qt-Versi No devices found in output of: %1 In der Ausgabe von %1 konnten keine Geräte festgestellt werden - - - AndroidConfig Error Creating AVD Fehler beim Erstellen des AVD - - - Android::Internal::AndroidPotentialKit Configure Android... Android konfigurieren... @@ -26980,7 +26937,7 @@ wirklich löschen? - Android::Internal::AvdDialog + Android Cannot create a new AVD. No sufficiently recent Android SDK available. Install an SDK of at least API version %1. @@ -27839,7 +27796,7 @@ Bitte installieren Sie ein Android-SDK der API-Version %1 oder neuer. - Android::AndroidBuildApkStep + Android Build Android APK AndroidBuildApkStep default display name @@ -27887,17 +27844,10 @@ Der vom Kit mindestens benötigte API-Level ist %1. Starting: "%1" %2 Starte: "%1" %2 - - Error - Fehler - Failed to run keytool. keytool konnte nicht ausgeführt werden. - - - Android::AndroidConfigurations Custom Android Debugger (%1, NDK %2) Benutzerdefinierter Android-Debugger (%1, NDK %2) @@ -27910,9 +27860,6 @@ Der vom Kit mindestens benötigte API-Level ist %1. Android %1 Clang %2 Android %1 Clang %2 - - - Android::AndroidManager Unknown Android version. API Level: %1 Unbekannte Android-Version. API-Level: %1 @@ -31456,7 +31403,7 @@ Senden selbst auch Zeit benötigt. - Android::Internal::AndroidDeviceModelDelegate + Android OpenGL enabled OpenGL aktiviert @@ -36211,7 +36158,7 @@ Siehe auch die Einstellungen für Google Test. - AdbCommandsWidget + Android Widget Widget @@ -37080,7 +37027,7 @@ Fehler: %5 - AndroidAvdManager + Android Cannot create AVD. Invalid input. AVD kann nicht erstellt werden. Ungültige Eingabe. @@ -37093,21 +37040,10 @@ Fehler: %5 Cannot create AVD. Command timed out. AVD kann nicht erstellt werden. Zeitüberschreitung des Kommandos. - - - Android::PasswordInputDialog Incorrect password. Ungültiges Passwort. - - Keystore - Keystore - - - Certificate - Zertifikat - Enter keystore password Geben Sie das Keystore-Passwort ein @@ -37116,9 +37052,6 @@ Fehler: %5 Enter certificate password Geben Sie das Zertifikatspasswort ein - - - Android::Internal::AndroidRunnerWorker No free ports available on host for QML debugging. Auf dem Host sind nicht genügend freie Ports für das QML-Debuggen vorhanden. @@ -39760,7 +39693,7 @@ Außer Leerzeichen innerhalb von Kommentaren und Zeichenketten. - Android::Internal::AndroidSdkManagerWidget + Android Android SDK Manager Android SDK-Manager @@ -39797,10 +39730,6 @@ Außer Leerzeichen innerhalb von Kommentaren und Zeichenketten. Advanced Options... Erweiterte Optionen... - - Cancel - Abbrechen - Do you want to accept the Android SDK license? Wollen Sie die Android SDK-Lizenz akzeptieren? @@ -39908,9 +39837,6 @@ Cancelling pending operations... Breche ausstehende Operationen ab... - - - Android::Internal::AndroidSdkManager The operation requires user interaction. Use the "sdkmanager" command-line tool. Die Operation benötigt Benutzereingaben. Benutzen Sie das Kommandozeilenwerkzeug "sdkmanager". @@ -39923,9 +39849,6 @@ Breche ausstehende Operationen ab... - - - AndroidSdkManager Updating installed packages. Aktualisiere installierte Pakete. @@ -39954,9 +39877,6 @@ Breche ausstehende Operationen ab... Failed Fehlgeschlagen - - - Android::Internal::OptionsDialog SDK Manager Arguments SDK-Manager-Argumente @@ -39973,21 +39893,10 @@ Breche ausstehende Operationen ab... Available arguments: Verfügbare Argumente: - - - Android::Internal::AndroidSdkModel - - Package - Paket - Revision Revision - - API - API - Operation Operation @@ -40203,7 +40112,7 @@ Breche ausstehende Operationen ab... - Android::AndroidPackageInstallationStep + Android Copy application data Anwendungsdaten kopieren @@ -40681,7 +40590,7 @@ Die Trace-Daten sind verloren. - Android::Internal::AndroidAvdManager + Android AVD Start Error Fehler beim Start von AVD @@ -40694,9 +40603,6 @@ Die Trace-Daten sind verloren. Install the missing emulator tool (%1) to the installed Android SDK. Installieren Sie den fehlenden Emulator (%1) im installierten Android-SDK. - - - Android::AndroidRunConfiguration Clean Environment Saubere Umgebung @@ -41634,7 +41540,7 @@ Speichern fehlgeschlagen. - Android::Internal::AndroidBuildApkWidget + Android Create Templates Vorlagen erstellen @@ -41647,18 +41553,10 @@ Speichern fehlgeschlagen. List of extra libraries to include in Android package and load on startup. Liste aller zusätzlichen Bibliotheken, die in das Paket aufgenommen und beim Start geladen werden. - - Add... - Hinzufügen... - Select library to include in package. Wählen Sie eine Bibliothek zur Aufnahme in das Paket aus. - - Remove - Entfernen - Remove currently selected library from list. Ausgewählte Bibliothek aus Liste entfernen. @@ -41667,10 +41565,6 @@ Speichern fehlgeschlagen. Select additional libraries Zusätzliche Bibliotheken auswählen - - Application - Anwendung - Android build SDK: Android-Build-SDK: @@ -41683,10 +41577,6 @@ Speichern fehlgeschlagen. Keystore: Keystore: - - Keystore files (*.keystore *.jks) - Keystore-Dateien (*.keystore *.jks) - Select Keystore File Keystore-Datei auswählen @@ -41739,13 +41629,6 @@ Speichern fehlgeschlagen. This is useful for apps that use SSL operations. The path can be defined in Tools > Options > Devices > Android. Dies ist nützlich für Apps, die SSL benutzen. Der Pfad kann in Extras > Einstellungen > Geräte > Android festgelegt werden. - - Build Android APK - Android-APK erstellen - - - - Android::NoApplicationProFilePage No application .pro file found in this project. Die .pro-Datei der Anwendung konnte in diesem Projekt nicht gefunden werden. @@ -41754,9 +41637,6 @@ Speichern fehlgeschlagen. No Application .pro File Keine .pro-Datei der Anwendung - - - Android::ChooseDirectoryPage Android package source directory: Quellverzeichnis des Android-Pakets: @@ -41785,9 +41665,6 @@ Die Dateien aus dem Quellverzeichnis des Android-Pakets werden in das Verzeichni The Android template files will be created in the ANDROID_PACKAGE_SOURCE_DIR set in the .pro file. Die Android-Vorlagendateien werden im in der .pro-Datei angegebenen ANDROID_PACKAGE_SOURCE_DIR angelegt. - - - Android::CreateAndroidManifestWizard Create Android Template Files Wizard Assistent zum Erzeugen von Android-Vorlagendateien @@ -42915,13 +42792,6 @@ Die Dateien aus dem Quellverzeichnis des Android-Pakets werden in das Verzeichni - - Android::Internal - - Deploy to Android Device - Deployment auf Android-Gerät - - ClangDiagnosticConfig @@ -44348,14 +44218,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e - Android::Internal::AndroidSdkDownloader - - Cancel - Abbrechen - - - - Android::ChooseProfilePage + Android Select the .pro file for which you want to create the Android template files. Wählen Sie die .pro-Datei, für die Sie die Android-Vorlagendateien erstellen wollen. @@ -44493,7 +44356,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e - AutotoolsProjectManager + Android Autotools Manager Autotools-Verwaltung @@ -48272,7 +48135,7 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e - Android::Internal::AndroidManifestEditorIconContainerWidget + Android Low DPI icon Symbol mit geringer Auflösung @@ -48297,32 +48160,11 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Select high DPI icon. Symbol für hohe Auflösung auswählen. - - - Android::Internal::AndroidServiceWidget - - Add - Hinzufügen - - - Remove - Entfernen - - - - Android::Internal::AndroidToolChain Android Clang Android Clang - - Android::Internal::SplashIconContainerWidget - - Splash screen - Startbildschirm - - CatchTreeItem diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index a04e2d9c68a..b0f6629fdf9 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -44717,7 +44717,7 @@ si un dépôt requiert une authentification SSH (voir la documentation sur SSH e - AutotoolsProjectManager + Android Autogen Display name for AutotoolsProjectManager::AutogenStep id. @@ -45791,7 +45791,7 @@ Les modèles de code C++ et QML ont besoin d'une version de Qt et d'un - AddNewAVDDialog + Android Create new AVD Créer un nouvel AVD @@ -45808,13 +45808,6 @@ Les modèles de code C++ et QML ont besoin d'une version de Qt et d'un SD card size: Taille de la carte SD : - - MiB - Mio - - - - AndroidCreateKeystoreCertificate Create a keystore and a certificate Crée un classeur de clés et un certificat @@ -45896,9 +45889,6 @@ Les modèles de code C++ et QML ont besoin d'une version de Qt et d'un Use Keystore password Utilise le mot de passe du trousseau de clés - - - AndroidDeployStepWidget Form Formulaire @@ -45944,14 +45934,6 @@ Cette option est utile lorsque vous voulez essayer votre applications sur les p Choose APK Choisir l'APK - - Qt Deployment - Déploiement Qt - - - Use the external Ministro application to download and maintain Qt libraries. - Utiliser l'application Ministro externe pour télécharger et maintenant les bibliothèques Qt. - Use Ministro service to install Qt Utiliser le service Ministro pour installer Qt @@ -45990,9 +45972,6 @@ Le fichier APL ne sera pas utilisable sur d'autres périphériques.Reset Default Devices Restaurer les périphériques par défaut - - - AndroidPackageCreationWidget Manifest Fichier manifest @@ -46043,30 +46022,6 @@ Le fichier APL ne sera pas utilisable sur d'autres périphériques.<b>Application icon:</b> <b>Icône de l'application :</b> - - Select low dpi icon - Sélectionner une icône basse résolution - - - Select medium dpi icon - Sélectionner une icône moyenne résolution - - - Select high dpi icon - Sélectionner une icône haute résolution - - - Permissions - Permissions - - - Add - Ajouter - - - Remove - Supprimer - Save Enregistrer @@ -46075,10 +46030,6 @@ Le fichier APL ne sera pas utilisable sur d'autres périphériques.Discard Abandonner - - Name: - Nom : - Libraries Bibliothèques @@ -46133,13 +46084,6 @@ Le fichier APL ne sera pas utilisable sur d'autres périphériques.Certificate alias: Alias de certificat : - - Signing a debug package - Authentification un paquet Debug - - - - AndroidSettingsWidget Android Configuration Configuration Android @@ -46148,10 +46092,6 @@ Le fichier APL ne sera pas utilisable sur d'autres périphériques.Android SDK location: Emplacement du SDK Android : - - Browse - Parcourir - Android NDK location: Emplacement du NDK Android : @@ -47000,7 +46940,7 @@ Le fichier APL ne sera pas utilisable sur d'autres périphériques. - Android::Internal::AndroidConfigurations + Android Could not run: %1 Impossible de démarrer : %1 @@ -47027,20 +46967,6 @@ Veuillez installer un SDK supérieur à la version %1. Android for %1 (GCC %2, Qt %3) Android pour %1 (GCC %2, Qt %3) - - - Android - - Android - Android - - - - Android::Internal::AndroidCreateKeystoreCertificate - - <span style=" color:#ff0000;">Password is too short</span> - <span style=" color:#ff0000;">Le mot de passe est trop court</span> - <span style=" color:#ff0000;">Passwords don't match</span> <span style=" color:#ff0000;">Les mots de passe ne correspondent pas</span> @@ -47085,23 +47011,10 @@ Veuillez installer un SDK supérieur à la version %1. Error Erreur - - - Android::Internal::AndroidDeployConfiguration - - Deploy to Android device - Déployer sur périphérique Android - - - - Android::Internal::AndroidDeployConfigurationFactory Deploy on Android Déployer sur Android - - - Android::Internal::AndroidDeployStep Deploy to Android device AndroidDeployStep default display name @@ -47127,10 +47040,6 @@ Veuillez installer un SDK supérieur à la version %1. adb finished with exit code %1. adb s'est terminé en retournant %1. - - Package deploy: Running command '%1 %2'. - Déployement de paquet : exécution de la commande "%1 %2". - Packaging error: Could not start command '%1 %2'. Reason: %3 ? @@ -47176,16 +47085,6 @@ Veuillez installer un SDK supérieur à la version %1. Pulling files necessary for debugging. Envoie des fichiers nécessaires au débogage. - - - Android::Internal::AndroidDeployStepFactory - - Deploy to Android device or emulator - Déploiement sur un périphérique Android ou un émulateur - - - - Android::Internal::AndroidDeployStepWidget <b>Deploy configurations</b> <b>Configurations de déploiement</b> @@ -47198,27 +47097,14 @@ Veuillez installer un SDK supérieur à la version %1. Android package (*.apk) Paquet Android (*.apk) - - - Android::Internal::AndroidDevice Run on Android Exécuter sur Android - - Android - Android - - - - Android::Internal::AndroidDeviceFactory Android Device Périphérique Android - - - Android::Internal::AndroidManager Error creating Android directory '%1'. Error lors de la création du répertoire Android "%1". @@ -47270,16 +47156,10 @@ Veuillez installer au moins un SDK. Can't open '%1' Impossible d'ouvrir "%1" - - - Android::Internal::AndroidPackageCreationFactory Create Android (.apk) Package Créer un paquet Android (.apk) - - - Android::Internal::AndroidPackageCreationStep Packaging for Android Paquetage pour Android @@ -47306,10 +47186,6 @@ Please make sure your application is built successfully and is selected in Appli Impossible de trouver "%1". Veuillez vous assurer que votre application est compilée et sélectionnée dans l'onglet Application ("Option d'exécution"). - - Error - Erreur - Failed to run keytool Échec d'exécution de keytool @@ -47354,45 +47230,14 @@ Veuillez vous assurer que votre application est compilée et sélectionnée dans Packaging failed. Échec lors de la création du paquet. - - Packaging error: Could not start command '%1 %2'. Reason: %3 - Erreur de paquetage : impossible de lancer la commande "%1 %2". Raison : %3 - - - Packaging Error: Command '%1 %2' failed. - Erreur de paquetage : la commande "%1 %2" a échoué. - - - Reason: %1 - Raison : %1 - - - Reason: %1 - Raison : %1 - - - Exit code: %1 - Code de sortie : %1 - - - Keystore - Trousseau de clés - Keystore password: Mot de passe du trousseau de clés : - - Certificate - Certificat - Certificate password (%1): Mot de passe du certificat (%1) : - - - Android::Internal::AndroidPackageCreationWidget Invalid Package Name Nom de paquet invalide @@ -47403,22 +47248,6 @@ Please choose a valid package name for your application (e.g. "org.example. Le nom du paquet "%1" n'est pas valide. Veuillez choisir un nom de paquet valide pour votre application (par exemple "org.exemple.monapplication"). - - Choose High DPI Icon - Choisir une icône haute résolution - - - PNG images (*.png) - Images PNG (*.png) - - - Choose Medium DPI Icon - Choisir une icône moyenne résolution - - - Choose Low DPI Icon - Choisir une icône basse résolution - < Type or choose a permission > < Tapez ou sélectionnez une permission > @@ -47431,20 +47260,10 @@ Veuillez choisir un nom de paquet valide pour votre application (par exemple &qu Select keystore file Sélectionner un fichier de trousseau de clés - - Keystore files (*.keystore *.jks) - Fichiers de trousseau de clés (*.keystore *.jks) - - - - Android::Internal::AndroidPackageInstallationFactory Deploy to device Déployer sur le périphérique - - - Android::Internal::AndroidPackageInstallationStep Copy application data Copie des données de l'application @@ -47453,9 +47272,6 @@ Veuillez choisir un nom de paquet valide pour votre application (par exemple &qu Removing directory %1 Supprimer le répertoire %1 - - - Android::Internal::AndroidQtVersion Failed to detect the ABIs used by the Qt version. Échec de la détection de l'ABI utilisée par la version de Qt. @@ -47465,9 +47281,6 @@ Veuillez choisir un nom de paquet valide pour votre application (par exemple &qu Qt Version is meant for Android Android - - - Android::Internal::AndroidRunConfiguration The .pro file '%1' is currently being parsed. Le fichier de projet "%1" est en cours d'analyse. @@ -47476,23 +47289,14 @@ Veuillez choisir un nom de paquet valide pour votre application (par exemple &qu Run on Android device Exécuter sur le périphérique Android - - - Android::Internal::AndroidRunControl Starting remote process. Démarrage des processus distants. - - - Android::Internal::AndroidRunControlFactory Run on Android device or emulator. Exécuter sur un périphérique Android ou un émulateur. - - - Android::Internal::AndroidRunner No free ports available on host for QML debugging. Aucun port libre n'est disponible sur l'hôte pour le débogage.QML. @@ -47550,16 +47354,10 @@ Veuillez choisir un nom de paquet valide pour votre application (par exemple &qu "%1" tué. - - - Android::Internal::AndroidSettingsPage Android Configurations Configurations Android - - - Android::Internal::AvdModel AVD Name AVD - Android Virtual Device @@ -47573,9 +47371,6 @@ Veuillez choisir un nom de paquet valide pour votre application (par exemple &qu CPU/ABI CPU/ABI - - - Android::Internal::AndroidSettingsWidget Android SDK Folder Dossier du SDK Android @@ -47632,9 +47427,6 @@ Veuillez choisir un nom de paquet valide pour votre application (par exemple &qu Select OpenJDK Path Sélectionner le chemin d'OpenJDK - - - Android::Internal::AndroidToolChainFactory Android GCC GCC Android @@ -47647,9 +47439,6 @@ Veuillez choisir un nom de paquet valide pour votre application (par exemple &qu Android GCC (%1-%2) GCC Android (%1 %2) - - - Android::Internal::AndroidToolChainConfigWidget NDK Root: Racine du NDK : @@ -52450,21 +52239,15 @@ Les noms partiels peuvent êtres utilisé s'ils ne sont pas ambigües. - Android::Internal::AndroidAnalyzeSupport + Android No analyzer tool selected. Pas d'outil d'analyse sélectionné. - - - Android::Internal::AndroidGdbServerKitInformation GDB server Serveur GDB - - - Android::Internal::AndroidGdbServerKitInformationWidget Manage... Gérer... @@ -52493,9 +52276,6 @@ Les noms partiels peuvent êtres utilisé s'ils ne sont pas ambigües.GDB Server for "%1" Le serveur GDB pour "%1" - - - Android::Internal::AndroidManifestEditor General Général @@ -52504,16 +52284,10 @@ Les noms partiels peuvent êtres utilisé s'ils ne sont pas ambigües.XML Source Source XML - - - Android::Internal::AndroidManifestEditorFactory Android Manifest editor Éditeur de manifest Android - - - Android::Internal::AndroidManifestEditorWidget Package Paquet @@ -52562,10 +52336,6 @@ Les noms partiels peuvent êtres utilisé s'ils ne sont pas ambigües.Target SDK: SDK cible : - - Application - Application - Application name: Nom de l'application : @@ -52626,14 +52396,6 @@ Les noms partiels peuvent êtres utilisé s'ils ne sont pas ambigües.Permissions Permissions - - Remove - Supprimer - - - Add - Ajouter - The structure of the android manifest file is corrupt. Expected a top level 'manifest' node. La structure du fichier manifest Android est corrompue. Un nœud de premier niveau "manifest" est attendu. @@ -52670,9 +52432,6 @@ Les noms partiels peuvent êtres utilisé s'ils ne sont pas ambigües.Choose High DPI Icon Choisir une icône haute résolution - - - Android::AndroidPlugin Android Manifest file Fichier manifest Android @@ -55061,23 +54820,11 @@ Cet assistant vous guidera à travers les étapes essentielles pour déployez un - Android::Internal::AddNewAVDDialog - - Create new AVD - Créer un nouvel AVD - + Android Target API: API cible : - - Name: - Nom : - - - SD card size: - Taille de la carte SD : - MiB Mio @@ -55086,53 +54833,10 @@ Cet assistant vous guidera à travers les étapes essentielles pour déployez un ABI: ABI : - - - AndroidDeployQtWidget - - Form - Formulaire - - - Sign package - Authentifier un paquet - - - Keystore: - Trousseau de clés : - - - Create - Créer - - - Browse - Parcourir - Signing a debug package Authentifier un paquet Debug - - Certificate alias: - Alias de certificat : - - - Advanced Actions - Actions avancées - - - Clean Temporary Libraries Directory on Device - Nettoyer le répertoire temporaire des bibliothèques sur le périphérique - - - Install Ministro from APK - Installer Ministro à partir du fichier APK - - - Reset Default Devices - Restaurer les périphériques par défaut - Open package location after build Ouvrir l'emplacement du paquet après la compilation @@ -55145,10 +54849,6 @@ Cet assistant vous guidera à travers les étapes essentielles pour déployez un Create AndroidManifest.xml Créer le fichier AndroidManifest.xml - - Application - Application - Android target SDK: SDK Android cible : @@ -55169,28 +54869,6 @@ Cet assistant vous guidera à travers les étapes essentielles pour déployez un Use the external Ministro application to download and maintain Qt libraries. Utiliser l'application externe Ministro pour télécharger et mettre à jour les bibliothèques Qt. - - Use Ministro service to install Qt - Utiliser le service Ministro pour installer Qt - - - Push local Qt libraries to device. You must have Qt libraries compiled for that platform. -The APK will not be usable on any other device. - Envoyer les bibliothèques Qt locales sur le périphérique. Vous devez avoir les bibliothèques Qt compilés pour cette plateforme. -Le fichier APL ne sera pas utilisable sur d'autres périphériques. - - - Deploy local Qt libraries to temporary directory - Déployer les bibliothèques Qt locales dans un répertoire temporaire - - - Creates a standalone APK. - Créer un standalone APK. - - - Bundle Qt libraries in APK - Empaqueter les bibliothèques Qt dans le fichier APK - Additional Libraries Bibliothèques supplémentaires @@ -55203,21 +54881,10 @@ Le fichier APL ne sera pas utilisable sur d'autres périphériques.Select library to include in package. Sélectionner la bibliothèque à inclure dans le paquet. - - Add - Ajouter - Remove currently selected library from list. Supprimer de la liste la bibliothèque actuellement sélectionnée. - - Remove - Supprimer - - - - Android::Internal::AndroidDeviceDialog Select Android Device Sélectionner un périphérique Android @@ -55234,10 +54901,6 @@ Le fichier APL ne sera pas utilisable sur d'autres périphériques.Always use this device for architecture %1 Toujours utiliser ce périphérique pour l'architecture %1 - - ABI: - ABI : - Compatible devices Périphériques compatibles @@ -56016,19 +55679,11 @@ réinitialisation du moniteur - Android::Internal::AndroidDeployQtStepFactory + Android Deploy to Android device or emulator Déployer sur un périphérique Android ou un émulateur - - - Android::Internal::AndroidDeployQtStep - - Deploy to Android device - AndroidDeployQtStep default display name - Déployer sur périphérique Android - Found old folder "android" in source directory. Qt 5.2 does not use that folder by default. Un ancien dossier "android" a été trouvé dans le répertoire des sources. Qt 5.2 n'utilise plus ce dossier par défaut. @@ -56037,38 +55692,6 @@ réinitialisation du moniteur No Android arch set by the .pro file. Aucun architecture Android n'est définie dans le fichier .pro. - - Warning: Signing a debug package. - Avertissement : authentification d'un paquet Debug. - - - Pulling files necessary for debugging. - Envoie des fichiers nécessaires au débogage. - - - Package deploy: Running command '%1 %2'. - Déployement de paquet : exécution de la commande "%1 %2". - - - Packaging error: Could not start command '%1 %2'. Reason: %3 - Erreur de paquetage : impossible de lancer la commande "%1 %2". Raison : %3 - - - Packaging Error: Command '%1 %2' failed. - Erreur de paquetage : la commande "%1 %2" a échoué. - - - Reason: %1 - Raison : %1 - - - Exit code: %1 - Code de sortie : %1 - - - Error - Erreur - Failed to run keytool. Échec d'exécution de keytool. @@ -56077,45 +55700,6 @@ réinitialisation du moniteur Invalid password. Mot de passe invalide. - - Keystore - Trousseau de clés - - - Keystore password: - Mot de passe du trousseau de clés : - - - Certificate - Certificat - - - Certificate password (%1): - Mot de passe du certificat (%1) : - - - - Android::Internal::AndroidDeployQtWidget - - <b>Deploy configurations</b> - <b>Configurations de déploiement</b> - - - Qt Android Smart Installer - Qt Android Smart Installer - - - Android package (*.apk) - Paquet Android (*.apk) - - - Select keystore file - Sélectionner un fichier de trousseau de clés - - - Keystore files (*.keystore *.jks) - Fichier de trousseau de clés (*.keystore *.jks) - Select additional libraries Sélectionner les bibliothèques supplémentaires @@ -56124,9 +55708,6 @@ réinitialisation du moniteur Libraries (*.so) Bibliothèques (*.so) - - - Android::Internal::AndroidErrorMessage Android: SDK installation error 0x%1 Android : erreur d'installation du SDK 0x%1 @@ -56167,9 +55748,6 @@ réinitialisation du moniteur Android: Unknown error 0x%1 Android : errreur inconnue 0x%1 - - - Android::Internal::AndroidPackageInstallationStepWidget <b>Make install</b> <b>Installation de make</b> @@ -56178,9 +55756,6 @@ réinitialisation du moniteur Make install Installation de make - - - Android::Internal::AndroidPotentialKitWidget Qt Creator needs additional settings to enable Android support.You can configure those settings in the Options dialog. Qt Creator a besoin de paramètres supplémentaires pour activer le support Android. Vous pouvez configurer ces paramètres dans le dialogue Options. @@ -56189,9 +55764,6 @@ réinitialisation du moniteur Open Settings Ouvrir les préférences - - - Android::Internal::NoApplicationProFilePage No application .pro file found in this project. Aucun fichier d'application .pro n'a été trouvé dans ce projet. @@ -56200,9 +55772,6 @@ réinitialisation du moniteur No Application .pro File Aucun ficher d'application .pro - - - Android::Internal::ChooseProFilePage Select the .pro file for which you want to create an AndroidManifest.xml file. Sélectionner un fichier .pro pour lequel vous souhaitez créer un fichier AndroidManifest.xml. @@ -56215,9 +55784,6 @@ réinitialisation du moniteur Select a .pro File Sélectionner un fichier .pro - - - Android::Internal::ChooseDirectoryPage Android package source directory: Répertoire des sources du paquet Android : @@ -56230,9 +55796,6 @@ réinitialisation du moniteur The Android manifest file will be created in the ANDROID_PACKAGE_SOURCE_DIR set in the .pro file. Le fichier manifest Android sera créé dans le répertoire défini dans le fichier .pro par le paramètre ANDROID_PACKAGE_SOURCE_DIR. - - - Android::Internal::CreateAndroidManifestWizard Create Android Manifest Wizard Créer l'assistant pour le manifest Android diff --git a/share/qtcreator/translations/qtcreator_hr.ts b/share/qtcreator/translations/qtcreator_hr.ts index e9ce06e3fe0..6097f03ad6f 100644 --- a/share/qtcreator/translations/qtcreator_hr.ts +++ b/share/qtcreator/translations/qtcreator_hr.ts @@ -646,14 +646,11 @@ - AdbCommandsWidget + Android Widget Programčić - - - Android::Internal::AddNewAVDDialog Create new AVD Stvori novi AVD @@ -678,9 +675,6 @@ MiB MiB - - - AndroidBuildApkWidget Sign package Potpiši paket @@ -737,9 +731,6 @@ Use Ministro service to install Qt Koristi Ministro uslugu za instaliranje Qt-a - - - AndroidCreateKeystoreCertificate Create a keystore and a certificate Stvori spremište ključeva i certifikat @@ -808,9 +799,6 @@ Keystore Spremište ključeva - - - Android::Internal::AndroidDeviceDialog Select Android Device Odaberi Android uređaj @@ -839,10 +827,6 @@ Refresh Device List Aktualiziraj popis uređaja - - ABI: - ABI: - Compatible devices Kompatibilni uređaji @@ -883,9 +867,6 @@ Looking for default device <b>%1</b>. Traženje zadanog uređaja <b>%1</b>. - - - Android::Internal::AndroidSdkManagerWidget Android SDK Manager Upravljač za Android SDK @@ -930,10 +911,6 @@ Native SDK Manager... Izvorni upravljač za SDK … - - Cancel - Odustani - Do you want to accept the Android SDK license? Želiš li prihvatiti licencu za Android SDK? @@ -1042,9 +1019,6 @@ Cancelling pending operations... Odustajanje od izvršavanja neriješenih operacija … - - - AndroidSettingsWidget Android Configuration Android konfiguracija @@ -13735,7 +13709,7 @@ To clear a variable, put its name on a line with nothing else on it. - AndroidAvdManager + Android Cannot create AVD. Invalid input. @@ -13744,17 +13718,10 @@ To clear a variable, put its name on a line with nothing else on it. Cannot create AVD. Cannot find system image for the ABI %1(%2). - - Could not start process "%1 %2" - - Cannot create AVD. Command timed out. - - - Android::Internal::AndroidAvdManager AVD Start Error @@ -13767,9 +13734,6 @@ To clear a variable, put its name on a line with nothing else on it. Install the missing emulator tool (%1) to the installed Android SDK. - - - Android::AndroidBuildApkStep Build Android APK AndroidBuildApkStep default display name @@ -13820,21 +13784,10 @@ The minimum API level required by the kit is %1. Failed to run keytool. - - - Android::PasswordInputDialog Incorrect password. - - Keystore - - - - Certificate - Certifikat - Enter keystore password @@ -13843,13 +13796,6 @@ The minimum API level required by the kit is %1. Enter certificate password - - - Android::Internal::AndroidBuildApkInnerWidget - - Build Android APK - - Keystore files (*.keystore *.jks) @@ -13858,17 +13804,6 @@ The minimum API level required by the kit is %1. Select Keystore File - - - Android::Internal::AndroidBuildApkWidget - - Build Android APK - - - - Android - - Create Templates @@ -13881,18 +13816,10 @@ The minimum API level required by the kit is %1. List of extra libraries to include in Android package and load on startup. - - Add... - Dodaj … - Select library to include in package. - - Remove - Ukloni - Remove currently selected library from list. @@ -13905,9 +13832,6 @@ The minimum API level required by the kit is %1. Libraries (*.so) - - - AndroidConfiguration Could not run: %1 @@ -13916,9 +13840,6 @@ The minimum API level required by the kit is %1. No devices found in output of: %1 - - - Android::AndroidConfigurations Android Debugger for %1 @@ -13927,9 +13848,6 @@ The minimum API level required by the kit is %1. Android for %1 (Clang %2) - - - Android::Internal::AndroidCreateKeystoreCertificate Keystore password is too short. @@ -13958,17 +13876,6 @@ The minimum API level required by the kit is %1. Keystore Filename - - Keystore files (*.keystore *.jks) - - - - Error - Greška - - - - Android::Internal::AndroidDeployQtStep Deploy to Android device or emulator @@ -14000,7 +13907,7 @@ The minimum API level required by the kit is %1. Deploy to Android device AndroidDeployQtStep default display name - + Implementiraj za Android uređaj No Android arch set by the .pro file. @@ -14034,10 +13941,6 @@ The minimum API level required by the kit is %1. Uninstall previous package %1. - - Starting: "%1" %2 - - The process "%1" exited normally. @@ -14078,20 +13981,10 @@ Do you want to uninstall the existing package? Package deploy: Running command "%1 %2". - - - Android::Internal::AndroidDevice Run on Android - - Android - - - - - Android::Internal::AndroidDeviceModelDelegate OpenGL enabled @@ -14100,23 +13993,14 @@ Do you want to uninstall the existing package? OpenGL disabled - - - AndroidConfig Error Creating AVD Greška prilikom stvaranja AVD-a - - - Android::Internal::AndroidDeviceFactory Android Device Android uređaj - - - Android::Internal::AndroidErrorMessage Android: SDK installation error 0x%1 @@ -14157,16 +14041,10 @@ Do you want to uninstall the existing package? Android: Unknown error 0x%1 - - - Android::Internal::AndroidGdbServerKitInformation GDB server GDB poslužitelj - - - Android::Internal::AndroidGdbServerKitInformationWidget Manage... @@ -14195,9 +14073,6 @@ Do you want to uninstall the existing package? GDB Server for "%1" GDB poslužitelj za "%1" - - - Android::AndroidManager Unknown Android version. API Level: %1 Neposznata Android verzija. API razina: %1 @@ -14224,9 +14099,6 @@ Do you want to uninstall the existing package? %1 - - - Android::Internal::AndroidManifestEditor General Opće @@ -14235,16 +14107,10 @@ Do you want to uninstall the existing package? XML Source XML izvor - - - Android::Internal::AndroidManifestEditorFactory Android Manifest editor - - - Android::Internal::AndroidManifestEditorWidget Package @@ -14289,10 +14155,6 @@ Do you want to uninstall the existing package? Target SDK: - - Application - Aplikacija - Application name: @@ -14333,10 +14195,6 @@ Do you want to uninstall the existing package? Include default features for Qt modules. - - Remove - Ukloni - Add Dodaj @@ -14381,9 +14239,6 @@ Do you want to uninstall the existing package? Choose High DPI Icon - - - Android::AndroidPackageInstallationStep Copy application data Kopiraj podatke aplikacije @@ -14396,37 +14251,18 @@ Do you want to uninstall the existing package? Deploy to device - - - Android::Internal::AndroidPackageInstallationStepWidget Make install - - - Android::Internal - - Deploy to Android device - Implementiraj za Android uređaj - - - - Android::Internal::AndroidPotentialKit Configure Android... - - - Android::Internal::AndroidPotentialKitWidget %1 needs additional settings to enable Android support. You can configure those settings in the Options dialog. - - - Android::Internal::AndroidQtVersion Failed to detect the ABIs used by the Qt version. @@ -14436,9 +14272,6 @@ Do you want to uninstall the existing package? Qt Version is meant for Android - - - Android::AndroidRunConfiguration Activity manager start options: @@ -14471,23 +14304,14 @@ Do you want to uninstall the existing package? The project file "%1" could not be parsed. - - - Android::AndroidRunEnvironmentAspect Clean Environment - - - Android::Internal::AndroidRunner "%1" terminated. - - - Android::Internal::AndroidRunnerWorker No free ports available on host for QML debugging. @@ -14532,9 +14356,6 @@ Do you want to uninstall the existing package? "%1" died. - - - Android::Internal::AndroidSdkManager The operation requires user interaction. Use the "sdkmanager" command-line tool. @@ -14545,9 +14366,6 @@ Do you want to uninstall the existing package? - - - AndroidSdkManager Updating installed packages. @@ -14574,9 +14392,6 @@ Do you want to uninstall the existing package? Failed - - - Android::Internal::OptionsDialog SDK Manager Arguments @@ -14593,13 +14408,6 @@ Do you want to uninstall the existing package? Available arguments: - - - Android::Internal::AndroidSdkModel - - Package - - Revision @@ -14632,16 +14440,6 @@ Do you want to uninstall the existing package? Install Instaliraj - - - Android::Internal::AndroidSettingsPage - - Android - - - - - Android::Internal::AvdModel AVD Name AVD - Android Virtual Device @@ -14655,9 +14453,6 @@ Do you want to uninstall the existing package? CPU/ABI - - - Android::Internal::AndroidSettingsWidget JDK path exists. @@ -14754,23 +14549,14 @@ Do you want to uninstall the existing package? AVD manager UI tool is not available in the installed SDK tools(version %1). Use the command line tool "avdmanager" for advanced AVD management. - - - Android::Internal::AndroidToolChainFactory Android Clang - - - AndroidToolManager Could not start process "%1 %2" Nije bilo moguće pokrenuti proces "%1 %2" - - - Android::Internal::AvdDialog Cannot create a new AVD. No sufficiently recent Android SDK available. Install an SDK of at least API version %1. @@ -14784,9 +14570,6 @@ Install an SDK of at least API version %1. Allowed characters are: a-z A-Z 0-9 and . _ - - - - Android::NoApplicationProFilePage No application .pro file found in this project. @@ -14795,9 +14578,6 @@ Install an SDK of at least API version %1. No Application .pro File - - - Android::ChooseProFilePage Select the .pro file for which you want to create the Android template files. @@ -14810,9 +14590,6 @@ Install an SDK of at least API version %1. Select a .pro File - - - Android::ChooseDirectoryPage Android package source directory: @@ -14839,9 +14616,6 @@ The files in the Android package source directory are copied to the build direct The Android template files will be created in the ANDROID_PACKAGE_SOURCE_DIR set in the .pro file. - - - Android::CreateAndroidManifestWizard Create Android Template Files Wizard @@ -14870,9 +14644,6 @@ The files in the Android package source directory are copied to the build direct Could not update the project file %1. - - - Android::Internal::JavaEditorFactory Java Editor @@ -15419,7 +15190,7 @@ Check the test environment. - AutotoolsProjectManager + Android Autogen Display name for AutotoolsProjectManager::AutogenStep id. diff --git a/share/qtcreator/translations/qtcreator_ja.ts b/share/qtcreator/translations/qtcreator_ja.ts index 080025c14a9..3f12196f92b 100644 --- a/share/qtcreator/translations/qtcreator_ja.ts +++ b/share/qtcreator/translations/qtcreator_ja.ts @@ -510,7 +510,7 @@ - Android::Internal::AddNewAVDDialog + Android Create new AVD 新しい AVD の作成 @@ -547,9 +547,6 @@ Overwrite existing AVD name 既存の AVD 名を上書きする - - - AndroidCreateKeystoreCertificate Create a keystore and a certificate キーストアと証明書の作成 @@ -618,9 +615,6 @@ Keystore キーストア - - - AndroidDeployQtWidget Form フォーム @@ -645,9 +639,6 @@ Uninstall previous package 古いパッケージをアンインストールする - - - Android::Internal::AndroidDeviceDialog Select Android Device Android デバイスの選択 @@ -660,10 +651,6 @@ Create Android Virtual Device Android 仮想デバイス(AVD)の作成 - - ABI: - ABI: - Compatible devices 互換性のあるデバイス @@ -728,9 +715,6 @@ Always use this device for architecture %1 for this project このプロジェクトの %1 アーキテクチャでは常にこのデバイスを使用する - - - AndroidSettingsWidget Android Configuration Android 設定 @@ -11271,13 +11255,6 @@ with a password, which you can enter below. Android - - Android - Android - - - - Android::Internal::AndroidCreateKeystoreCertificate Keystore password is too short. キーストアパスワードが短すぎます。 @@ -11320,30 +11297,14 @@ with a password, which you can enter below. Error エラー - - - Android::Internal::AndroidDeployConfiguration - - Deploy to Android device - Android デバイスにデプロイ - - - - Android::Internal::AndroidDeployConfigurationFactory Deploy on Android Android 上でデプロイ - - - Android::Internal::AndroidDeployQtStepFactory Deploy to Android device or emulator Android デバイスまたはエミュレータにデプロイ - - - Android::Internal::AndroidDeployQtStep Deploy to Android device AndroidDeployQtStep default display name @@ -11471,9 +11432,6 @@ Do you want to uninstall the existing package? Pulling files necessary for debugging. デバッグに必要なファイルを取得しています。 - - - Android::Internal::AndroidDeployQtWidget <b>Deploy configurations</b> <b>デプロイ設定</b> @@ -11482,35 +11440,14 @@ Do you want to uninstall the existing package? Qt Android Smart Installer Qt Android スマートインストーラ - - Android package (*.apk) - Android パッケージ (*.apk) - - - - Android::Internal::AndroidDevice Run on Android Android 上で実行 - - Android - Android - Android Device Android デバイス - - - Android::Internal::AndroidDeviceFactory - - Android Device - Android デバイス - - - - Android::Internal::AndroidErrorMessage Android: SDK installation error 0x%1 Android: SDK のインストールエラー 0x%1 @@ -11551,16 +11488,10 @@ Do you want to uninstall the existing package? Android: Unknown error 0x%1 Android: 未知のエラー 0x%1 - - - Android::Internal::AndroidGdbServerKitInformation GDB server GDB サーバー - - - Android::Internal::AndroidGdbServerKitInformationWidget Manage... 管理... @@ -11589,9 +11520,6 @@ Do you want to uninstall the existing package? GDB Server for "%1" "%1" 向け GDB サーバー - - - Android::Internal::AndroidManifestEditor General 一般 @@ -11600,16 +11528,10 @@ Do you want to uninstall the existing package? XML Source XML ソース - - - Android::Internal::AndroidManifestEditorFactory Android Manifest editor Android Manifest エディタ - - - Android::Internal::AndroidManifestEditorWidget Package パッケージ @@ -11698,10 +11620,6 @@ Do you want to uninstall the existing package? Include default features for Qt modules. Qt モジュール用の既定の機能を追加する。 - - Remove - 削除 - Add 追加 @@ -11786,13 +11704,6 @@ Do you want to uninstall the existing package? Choose High DPI Icon 高 DPI アイコンを選択 - - Android Manifest editor - Android Manifest エディタ - - - - Android::Internal::AndroidQtVersion Failed to detect the ABIs used by the Qt version. Qt で使用されている ABI の検出に失敗しました。 @@ -11814,16 +11725,10 @@ Do you want to uninstall the existing package? Qt Version is meant for Android Android - - - Android::Internal::AndroidRunControl Starting remote process. リモートプロセスを起動します。 - - - Android::Internal::AndroidRunner No free ports available on host for QML debugging. ホストに QML デバッグ用の空きポートがありません。 @@ -11860,16 +11765,10 @@ Do you want to uninstall the existing package? "%1" terminated. "%1" が終了しました。 - - - Android::Internal::AndroidSettingsPage Android Configurations Android 設定 - - - Android::Internal::AvdModel AVD Name AVD - Android Virtual Device @@ -11899,9 +11798,6 @@ Do you want to uninstall the existing package? CPU/ABI CPU/ABI - - - Android::Internal::AndroidSettingsWidget "%1" does not seem to be an Android SDK top folder. "%1" は Android SDK の最上位フォルダとは異なるようです。 @@ -12094,10 +11990,6 @@ in the system's browser for manual download. Cloning OpenSSL prebuilt libraries... OpenSSL のビルド済みライブラリを複製する... - - Cancel - キャンセル - OpenSSL prebuilt libraries cloning failed. OpenSSL のビルド済みライブラリの複製に失敗しました。 @@ -12142,10 +12034,6 @@ in the system's browser for manual download. Download and install Android SDK Tools to: %1? Android SDK Tools をダウンロードしてインストールするには: %1? - - Android - Android - Unsupported GDB サポート対象外の GDB @@ -12166,23 +12054,14 @@ in the system's browser for manual download. Select ant Script ant スクリプトの選択 - - - Android::Internal::AndroidToolChainFactory Android GCC Android GCC - - - Android::Internal::AndroidToolChainConfigWidget NDK Root: NDK ルート: - - - AutotoolsProjectManager Autogen Display name for AutotoolsProjectManager::AutogenStep id. @@ -33787,7 +33666,7 @@ Qt バージョンオプションページで qmldump アプリケーション - AndroidConfiguration + Android Could not run: %1 実行できません: %1 @@ -33796,9 +33675,6 @@ Qt バージョンオプションページで qmldump アプリケーション No devices found in output of: %1 以下のコマンドの出力からデバイスが見つかりません: %1 - - - AndroidConfig Error Creating AVD AVD 作成中のエラー @@ -33807,23 +33683,14 @@ Qt バージョンオプションページで qmldump アプリケーション Could not start process "%1 %2" プロセス "%1 %2" を起動できませんでした - - - Android::Internal::AndroidPotentialKit Configure Android... Android の設定... - - - Android::Internal::AndroidPotentialKitWidget Qt Creator needs additional settings to enable Android support. You can configure those settings in the Options dialog. Android サポートを有効にするには Qt Creator に追加の設定が必要です。オプションダイアログからそれらの設定を行うことができます。 - - - Android::Internal::JavaEditorFactory Java Editor Java エディタ @@ -35016,7 +34883,7 @@ Are you sure you want to continue? - Android::Internal::AvdDialog + Android Cannot create a new AVD. No sufficiently recent Android SDK available. Install an SDK of at least API version %1. @@ -35752,11 +35619,7 @@ API バージョンが %1 以上の SDK をインストールしてください - AndroidBuildApkWidget - - Form - フォーム - + Android Sign package パッケージに署名する @@ -35777,10 +35640,6 @@ API バージョンが %1 以上の SDK をインストールしてください Certificate alias: 証明書エイリアス: - - Application - アプリケーション - Android build SDK: Android SDK: @@ -36295,15 +36154,7 @@ Android 5 ではローカルの Qt ライブラリをデプロイできません - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkWidget - - Form - フォーム - - - Android - Android - + Android Create Templates テンプレートの作成 @@ -36320,18 +36171,10 @@ Android 5 ではローカルの Qt ライブラリをデプロイできません Select library to include in package. パッケージに同梱するライブラリを選択します。 - - Add... - 追加... - Remove currently selected library from list. 現在選択されているライブラリをリストから削除します。 - - Remove - 削除 - Select additional libraries 追加ライブラリの選択 @@ -37570,7 +37413,7 @@ the program. - Android::AndroidBuildApkStep + Android Build Android APK AndroidBuildApkStep default display name @@ -37580,10 +37423,6 @@ the program. Warning: Signing a debug or profile package. 警告: デバッグ用あるいはプロファイル用パッケージを署名しています。 - - Error - エラー - Failed to run keytool. keytool の実行に失敗しました。 @@ -37592,40 +37431,18 @@ the program. Invalid password. 無効なパスワードです。 - - Keystore - キーストア - Keystore password: キーストアパスワード: - - Certificate - 証明書 - Certificate password (%1): 証明書のパスワード(%1): - - - Android::AndroidBuildApkWidget - - Keystore files (*.keystore *.jks) - キーストアファイル (*.keystore *.jks) - Select Keystore File キーストアファイルの選択 - - <b>Build Android APK</b> - <b>Android APK のビルド</b> - - - - Android::AndroidConfigurations Android Debugger for %1 %1 向け Android デバッガ @@ -37634,9 +37451,6 @@ the program. Android for %1 (GCC %2, Qt %3) %1 向け Android (GCC %2, Qt %3) - - - Android::Internal::AndroidDeviceModelDelegate OpenGL enabled OpenGL 有効 @@ -37645,9 +37459,6 @@ the program. OpenGL disabled OpenGL 無効 - - - Android::AndroidManager Unknown Android version. API Level: %1 未知のバージョンの Android です。API レベル: %1 @@ -42972,14 +42783,11 @@ These files are preserved. - QmakeAndroidSupport::Internal::AndroidPackageInstallationFactory + Android Deploy to device デバイスにデプロイ - - - QmakeAndroidSupport::Internal::AndroidPackageInstallationStep Copy application data アプリケーションデータのコピー @@ -42988,9 +42796,6 @@ These files are preserved. Removing directory %1 ディレクトリ %1 を削除しています - - - QmakeAndroidSupport::Internal::AndroidPackageInstallationStepWidget <b>Make install</b> <b>Make install</b> @@ -42999,9 +42804,6 @@ These files are preserved. Make install Make install - - - QmakeAndroidSupport::Internal::NoApplicationProFilePage No application .pro file found in this project. このプロジェクトにアプリケーション .pro ファイルが見つかりません。 @@ -43010,9 +42812,6 @@ These files are preserved. No Application .pro File アプリケーション .pro ファイルが見つかりません - - - QmakeAndroidSupport::Internal::ChooseProFilePage Select the .pro file for which you want to create the Android template files. Android テンプレートファイルを作成したい .pro ファイルを選択してください。 @@ -43025,9 +42824,6 @@ These files are preserved. Select a .pro File .pro ファイルの選択 - - - QmakeAndroidSupport::Internal::ChooseDirectoryPage The Android package source directory cannot be the same as the project directory. Android パッケージソースディレクトリをプロジェクトのディレクトリと同じにすることはできません。 @@ -43056,9 +42852,6 @@ Android パッケージソースディレクトリのファイルはビルドデ Copy the Gradle files to Android directory Gradle のファイルを Android ディレクトリにコピーする - - - QmakeAndroidSupport::Internal::CreateAndroidManifestWizard Create Android Template Files Wizard Android テンプレートファイル作成ウィザード @@ -43087,31 +42880,10 @@ Android パッケージソースディレクトリのファイルはビルドデ Could not update the .pro file %1. .pro ファイル %1 を更新できませんでした。 - - - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkStepFactory - - Build Android APK - Android APK のビルド - - - - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkStep - - Found old folder "android" in source directory. Qt 5.2 does not use that folder by default. - ソースディレクトリに古い "android" フォルダを見つけました。Qt 5.2 は既定ではそのフォルダを使用しません。 - No application .pro file found, not building an APK. アプリケーション .pro ファイルが見つからないため、APK をビルドできません。 - - Starting: "%1" %2 - 起動中: "%1" %2 - - - - QmakeAndroidSupport::Internal::QmakeAndroidRunConfiguration The .pro file "%1" is currently being parsed. .pro ファイル "%1" を現在解析しています。 @@ -45606,7 +45378,7 @@ Output: - Android::Internal::AndroidSdkManagerWidget + Android Expand All すべて展開 @@ -45627,14 +45399,6 @@ Output: All すべて - - Advanced Options... - 詳細オプション... - - - Cancel - キャンセル - Autotest @@ -46983,180 +46747,11 @@ in "%2". - AndroidAvdManager - - Could not start process "%1 %2" - プロセス "%1 %2" を起動できませんでした - - - - Android::Internal::AndroidBuildApkStep - - Application - アプリケーション - - - Android build SDK: - Android SDK: - - - Create Templates - テンプレートの作成 - - - Keystore: - キーストア: - - - Keystore files (*.keystore *.jks) - キーストアファイル (*.keystore *.jks) - - - Select Keystore File - キーストアファイルの選択 - - - Create... - 作成... - - - Sign package - パッケージに署名する - - - Signing a debug package - デバッグパッケージに署名する - - - Certificate alias: - 証明書エイリアス: - - - Advanced Actions - 高度なアクション - - - Open package location after build - ビルド後にパッケージのパスを開く - - - Verbose output - 詳細出力 - - - Additional Libraries - 追加ライブラリ - - - List of extra libraries to include in Android package and load on startup. - Android のパッケージに同梱され起動時に読み込まれる追加ライブラリのリストです。 - - - Add... - 追加... - - - Select library to include in package. - パッケージに同梱するライブラリを選択します。 - - - Select additional libraries - 追加ライブラリの選択 - - - Libraries (*.so) - ライブラリ (*.so) - - - Remove - 削除 - - - Remove currently selected library from list. - 現在選択しているライブラリをリストから削除します。 - - - Build Android APK - Android APK のビルド - - - Warning: Signing a debug or profile package. - 警告: デバッグ用あるいはプロファイル用パッケージを署名しています。 - - - Starting: "%1" %2 - 起動中: "%1" %2 - - - Error - エラー - - - Failed to run keytool. - keytool の実行に失敗しました。 - - - Keystore - キーストア - - - Certificate - 証明書 - - - - Android::Internal::AndroidManifestEditorIconWidget - - Icon scaled up. - アイコンをスケールアップ。 - - - Click to select... - クリックして選択... - - - - Android::AndroidPackageInstallationStep - - Copy application data - アプリケーションデータのコピー - - - Removing directory %1 - ディレクトリ %1 を削除しています - - - Deploy to device - デバイスにデプロイ - - - - Android::AndroidRunConfiguration + Android Clean Environment 環境変数なし - - - Android::Internal::AndroidRunnerWorker - - No free ports available on host for QML debugging. - ホストに QML デバッグ用の空きポートがありません。 - - - "%1" died. - "%1" は異常終了しました。 - - - - Android::Internal::AndroidSdkDownloader - - Cancel - キャンセル - - - - AndroidSdkManager Failed. 失敗しました。 @@ -47165,96 +46760,10 @@ in "%2". Failed 失敗 - - - Android::Internal::AndroidSdkModel - - Package - パッケージ - - - API - API - Install インストールする - - - Android::NoApplicationProFilePage - - No application .pro file found in this project. - このプロジェクトにアプリケーション .pro ファイルが見つかりません。 - - - No Application .pro File - アプリケーション .pro ファイルが見つかりません - - - - Android::ChooseProfilePage - - Select the .pro file for which you want to create the Android template files. - Android テンプレートファイルを作成したい .pro ファイルを選択してください。 - - - .pro file: - .pro ファイル: - - - Select a .pro File - .pro ファイルの選択 - - - - Android::ChooseDirectoryPage - - Android package source directory: - Android パッケージソースディレクトリ: - - - The Android package source directory cannot be the same as the project directory. - Android パッケージソースディレクトリをプロジェクトのディレクトリと同じにすることはできません。 - - - Copy the Gradle files to Android directory - Gradle のファイルを Android ディレクトリにコピーする - - - It is highly recommended if you are planning to extend the Java part of your Qt application. - Qt アプリケーションの Java 部を拡張する際には有効にすることを強く推奨します。 - - - Select the Android package source directory. - -The files in the Android package source directory are copied to the build directory's Android directory and the default files are overwritten. - Android パッケージソースディレクトリを選択してください。 - -Android パッケージソースディレクトリのファイルはビルドディレクトリの Android ディレクトリに既定のファイルを上書きする形でコピーされます。 - - - The Android template files will be created in the ANDROID_PACKAGE_SOURCE_DIR set in the .pro file. - Android テンプレートファイルは .pro ファイルの ANDROID_PACKAGE_SOURCE_DIR 変数に設定されたパスに作成されます。 - - - - Android::CreateAndroidManifestWizard - - Create Android Template Files Wizard - Android テンプレートファイル作成ウィザード - - - Project File not Updated - プロジェクトファイルは未更新です - - - - JLSSettingsWidget - - Name: - 名前: - Java: Java: @@ -47267,16 +46776,6 @@ Android パッケージソースディレクトリのファイルはビルドデ Path to equinox launcher jar equinox launcher jarへのパス - - - Android::Internal::SplashScreenContainerWidget - - Splash screen - スプラッシュスクリーン - - - - Android::Internal::SplashScreenWidget Icon scaled up. アイコンをスケールアップ。 @@ -47544,7 +47043,7 @@ Android パッケージソースディレクトリのファイルはビルドデ - AutotoolsProjectManager + Android BuildConfiguration diff --git a/share/qtcreator/translations/qtcreator_pl.ts b/share/qtcreator/translations/qtcreator_pl.ts index 4d075e89137..5cd55977b44 100644 --- a/share/qtcreator/translations/qtcreator_pl.ts +++ b/share/qtcreator/translations/qtcreator_pl.ts @@ -19037,15 +19037,11 @@ Wykluczenia: %3 - AndroidCreateKeystoreCertificate + Android Create a keystore and a certificate - - Keystore - - Password: Hasło: @@ -19106,9 +19102,6 @@ Wykluczenia: %3 Use Keystore password - - - AndroidSettingsWidget Android Configuration Konfiguracja Androida @@ -20850,7 +20843,7 @@ Sprawdź dokumentację SSH i zmienną środowiskową SSH_ASKPASS. - Android::Internal::AndroidCreateKeystoreCertificate + Android Keystore password is too short. @@ -20887,41 +20880,18 @@ Sprawdź dokumentację SSH i zmienną środowiskową SSH_ASKPASS. Error Błąd - - - Android::Internal::AndroidDeployConfiguration - - Deploy to Android device - Zainstaluj na urządzeniu Android - - - - Android::Internal::AndroidDeployConfigurationFactory Deploy on Android Zainstaluj na urządzeniu Android - - - Android::Internal::AndroidDevice Run on Android Uruchom na androidzie - - Android - Android - - - - Android::Internal::AndroidDeviceFactory Android Device Urządzenie Android - - - Android::Internal::AndroidQtVersion Failed to detect the ABIs used by the Qt version. Nie można wykryć ABI użytych przez wersję Qt. @@ -20931,23 +20901,10 @@ Sprawdź dokumentację SSH i zmienną środowiskową SSH_ASKPASS. Qt Version is meant for Android Android - - - Android::Internal::AndroidRunner "%1" terminated. Zakończono "%1". - - - Android::Internal::AndroidSettingsPage - - Android - Android - - - - Android::Internal::AvdModel AVD Name AVD - Android Virtual Device @@ -20961,9 +20918,6 @@ Sprawdź dokumentację SSH i zmienną środowiskową SSH_ASKPASS. CPU/ABI CPU/ABI - - - Android::Internal::AndroidSettingsWidget "%1" does not seem to be an Android SDK top folder. "%1" nie wygląda na katalog główny SDK Androida. @@ -21050,16 +21004,10 @@ Wersje Qt można dodać w: Opcje > Budowanie i uruchamianie > Wersje Qt.Select ant Script Wybierz skrypt "ant" - - - Android::Internal::AndroidToolChainFactory Android GCC Android GCC - - - AutotoolsProjectManager Autogen Display name for AutotoolsProjectManager::AutogenStep id. @@ -22704,7 +22652,7 @@ poinstruuje Qt Creatora o URI. - Android::Internal::AndroidToolChainConfigWidget + Android NDK Root: Korzeń NDK: @@ -24644,14 +24592,11 @@ Więcej informacji w dokumentacji "Checking Code Syntax". - Android::Internal::AndroidGdbServerKitInformation + Android GDB server Serwer GDB - - - Android::Internal::AndroidGdbServerKitInformationWidget Manage... Zarządzaj... @@ -24680,9 +24625,6 @@ Więcej informacji w dokumentacji "Checking Code Syntax".GDB Server for "%1" Serwer GDB dla "%1" - - - Android::Internal::AndroidManifestEditor General Ogólne @@ -24691,16 +24633,10 @@ Więcej informacji w dokumentacji "Checking Code Syntax".XML Source Źródło XML - - - Android::Internal::AndroidManifestEditorFactory Android Manifest editor Edytor plików manifest Androida - - - Android::Internal::AndroidManifestEditorWidget Package Pakiet @@ -24801,10 +24737,6 @@ Więcej informacji w dokumentacji "Checking Code Syntax".Include default features for Qt modules. Ustaw domyślne funkcjonalności dla modułów Qt. - - Remove - Usuń - Add Dodaj @@ -26229,7 +26161,7 @@ Zdalny: %4 - Android::Internal::AddNewAVDDialog + Android Create new AVD Utwórz nowe AVD @@ -26254,9 +26186,6 @@ Zdalny: %4 ABI: ABI: - - - AndroidDeployQtWidget Form Formularz @@ -26281,9 +26210,6 @@ Zdalny: %4 Uninstall previous package Odinstaluj poprzedni pakiet - - - Android::Internal::AndroidDeviceDialog Select Android Device Wybierz urządzenie z Androidem @@ -26296,10 +26222,6 @@ Zdalny: %4 Create Android Virtual Device Utwórz wirtualne urządzenie Android - - ABI: - ABI: - Compatible devices Kompatybilne urządzenia @@ -26996,14 +26918,11 @@ Zdalny: %4 - Android::Internal::AndroidDeployQtStepFactory + Android Deploy to Android device or emulator Zainstaluj na urządzeniu lub emulatorze Android - - - Android::Internal::AndroidDeployQtStep Deploy to Android device AndroidDeployQtStep default display name @@ -27085,9 +27004,6 @@ Czy odinstalować istniejący pakiet? Pulling files necessary for debugging. - - - Android::Internal::AndroidDeployQtWidget <b>Deploy configurations</b> <b>Konfiguracje instalacji</b> @@ -27100,9 +27016,6 @@ Czy odinstalować istniejący pakiet? Android package (*.apk) Pakiet androida (*.apk) - - - Android::Internal::AndroidErrorMessage Android: SDK installation error 0x%1 Android: błąd instalacji SDK 0x%1 @@ -27143,9 +27056,6 @@ Czy odinstalować istniejący pakiet? Android: Unknown error 0x%1 Android: nieznany błąd 0x%1 - - - Android::Internal::AndroidPotentialKitWidget Qt Creator needs additional settings to enable Android support. You can configure those settings in the Options dialog. Qt Creator wymaga dodatkowych ustawień do obsługi Androida. Można je skonfigurować w dialogu z opcjami. @@ -28481,7 +28391,7 @@ Zbuduj aplikację qmldump na stronie z opcjami wersji Qt. - AndroidConfiguration + Android Could not run: %1 Nie można uruchomić: %1 @@ -28490,23 +28400,14 @@ Zbuduj aplikację qmldump na stronie z opcjami wersji Qt. No devices found in output of: %1 Brak urządzeń na wyjściu %1 - - - AndroidConfig Error Creating AVD Błąd w trakcie tworzenia AVD - - - Android::Internal::AndroidPotentialKit Configure Android... Konfiguruj Androida... - - - Android::Internal::JavaEditorFactory Java Editor Edytor Java @@ -29294,11 +29195,7 @@ Czy przerwać ją? - AndroidBuildApkWidget - - Form - Formularz - + Android Sign package Podpisz pakiet @@ -29320,10 +29217,6 @@ Czy przerwać ją? Certificate alias: Alias certyfikatu: - - Application - Aplikacja - Android build SDK: Wersja Android SDK: @@ -29381,10 +29274,6 @@ Instalowanie lokalnych bibliotek Qt nie jest kompatybilne z Androidem 5.Use Gradle (Ant builds are deprecated) Używaj Gradle (Ant jest przestarzały) - - Gradle builds are forced from Android SDK tools version 25.3.0 onwards as Ant scripts are no longer available. - Narzędzia Android SDK, począwszy od wersji 25.3.0, wymagają użycia Gradle, ponieważ skrypty Ant są już niedostępne. - Packages debug server with the APK to enable debugging. For the signed APK this option is unchecked by default. @@ -29421,15 +29310,7 @@ Instalowanie lokalnych bibliotek Qt nie jest kompatybilne z Androidem 5. - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkWidget - - Form - Formularz - - - Android - Android - + Android Create Templates Utwórz szablony @@ -29446,18 +29327,10 @@ Instalowanie lokalnych bibliotek Qt nie jest kompatybilne z Androidem 5.Select library to include in package. Wybierz bibliotekę, którą dołączyć do pakietu. - - Add... - Dodaj... - Remove currently selected library from list. Usuń zaznaczoną bibliotekę z listy. - - Remove - Usuń - Select additional libraries Wybierz dodatkowe biblioteki @@ -29919,7 +29792,7 @@ Czy kontynuować instalację? - Android::AndroidBuildApkStep + Android Build Android APK AndroidBuildApkStep default display name @@ -29946,32 +29819,14 @@ The minimum API level required by the kit is %1. Cannot sign the package. Certificate alias %1 does not exist. Nie można podpisać pakietu. Nie istnieje alias certyfikatu %1. - - Error - Błąd - Failed to run keytool. - - - Android::AndroidBuildApkWidget - - Keystore files (*.keystore *.jks) - Pliki z magazynami kluczy (*.keystore *.jks) - Select Keystore File Wybierz plik z magazynem kluczy - - <b>Build Android APK</b> - <b>Zbuduj Android APK</b> - - - - Android::AndroidConfigurations Android Debugger for %1 Debugger Androida dla %1 @@ -29980,9 +29835,6 @@ The minimum API level required by the kit is %1. Android for %1 (GCC %2, %3) Android dla %1 (GCC %2, %3) - - - Android::AndroidManager Unknown Android version. API Level: %1 Nieznana wersja Androida. Poziom API: %1 @@ -29999,9 +29851,6 @@ The minimum API level required by the kit is %1. Starting Android virtual device failed. Nie można uruchomić wirtualnego urządzenia Android. - - - Android::Internal::AvdDialog Cannot create a new AVD. No sufficiently recent Android SDK available. Install an SDK of at least API version %1. @@ -32920,14 +32769,11 @@ do projektu "%2". - QmakeAndroidSupport::Internal::AndroidPackageInstallationFactory + Android Deploy to device Zainstaluj na urządzeniu - - - QmakeAndroidSupport::Internal::AndroidPackageInstallationStep Copy application data Skopiuj dane aplikacji @@ -32936,9 +32782,6 @@ do projektu "%2". Removing directory %1 Usuwanie katalogu %1 - - - QmakeAndroidSupport::Internal::AndroidPackageInstallationStepWidget <b>Make install</b> @@ -32947,9 +32790,6 @@ do projektu "%2". Make install - - - QmakeAndroidSupport::Internal::NoApplicationProFilePage No application .pro file found in this project. Brak pliku .pro aplikacji w tym projekcie. @@ -32958,9 +32798,6 @@ do projektu "%2". No Application .pro File Brak pliku .pro aplikacji - - - QmakeAndroidSupport::Internal::ChooseProFilePage Select the .pro file for which you want to create the Android template files. Wybierz plik .pro dla którego utworzyć pliki szablonu Android. @@ -32973,9 +32810,6 @@ do projektu "%2". Select a .pro File Wybierz plik .pro - - - QmakeAndroidSupport::Internal::ChooseDirectoryPage The Android package source directory cannot be the same as the project directory. Katalog ze źródłami pakietu Android nie może być taki sam jak katalog projektu. @@ -33004,9 +32838,6 @@ Pliki z katalogu źródłowego pakietu Android są kopiowane do katalogu budowan Copy the Gradle files to Android directory Skopiuj pliki Gradle do katalogu Android - - - QmakeAndroidSupport::Internal::CreateAndroidManifestWizard Create Android Template Files Wizard Tworzenie kreatora plików szablonowych Androida @@ -33035,20 +32866,6 @@ Pliki z katalogu źródłowego pakietu Android są kopiowane do katalogu budowan Could not update the .pro file %1. Nie można uaktualnić pliku .pro %1. - - - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkStepFactory - - Build Android APK - Zbuduj Android APK - - - - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkStep - - Found old folder "android" in source directory. Qt 5.2 does not use that folder by default. - Odnaleziono folder "android" w katalogu źródłowym. Qt 5.2 domyślnie nie używa tego katalogu. - Android build SDK not defined. Check Android settings. @@ -33057,13 +32874,6 @@ Pliki z katalogu źródłowego pakietu Android są kopiowane do katalogu budowan No application .pro file found, not building an APK. Brak pliku .pro aplikacji, budowanie APK wstrzymane. - - Starting: "%1" %2 - Uruchamianie "%1" %2 - - - - QmakeAndroidSupport::Internal::QmakeAndroidRunConfiguration The .pro file "%1" is currently being parsed. Trwa parsowanie pliku .pro "%1". @@ -33575,7 +33385,7 @@ Pliki z katalogu źródłowego pakietu Android są kopiowane do katalogu budowan - Android::Internal::AndroidDeviceModelDelegate + Android OpenGL enabled OpenGL odblokowany @@ -39596,7 +39406,7 @@ Uwaga: podczas używania zwykłego formatu tekstowego może brakować niektóryc - Android::Internal::AndroidRunnerWorker + Android No free ports available on host for QML debugging. Brak wolnych portów w hoście do debugowania QML. @@ -41232,7 +41042,7 @@ Błąd: %2 - AndroidAvdManager + Android Cannot create AVD. Invalid input. Nie można utworzyć AVD. Niepoprawne wejście. @@ -41249,9 +41059,6 @@ Błąd: %2 Cannot create AVD. Command timed out. Nie można utworzyć AVD. Przekroczono limit czasu oczekiwania. - - - Android::PasswordInputDialog Incorrect password. Niepoprawne hasło. @@ -41260,10 +41067,6 @@ Błąd: %2 Keystore Magazyn kluczy - - Certificate - Certyfikat - Enter keystore password Podaj hasło magazynu kluczy @@ -41273,13 +41076,6 @@ Błąd: %2 Wprowadź hasło certyfikatu - - AndroidToolManager - - Could not start process "%1 %2" - Nie można uruchomić procesu "%1 %2" - - QtTestTreeItem @@ -42116,18 +41912,11 @@ Termin wygaśnięcia: %3 - AdbCommandsWidget + Android Widget Widżet - - - Android::Internal::AndroidRunConfigurationWidget - - Form - Formularz - Activity manager start options: diff --git a/share/qtcreator/translations/qtcreator_ru.ts b/share/qtcreator/translations/qtcreator_ru.ts index d262e9e999a..1e5357c56a2 100644 --- a/share/qtcreator/translations/qtcreator_ru.ts +++ b/share/qtcreator/translations/qtcreator_ru.ts @@ -184,7 +184,7 @@ - AdbCommandsWidget + Android Widget @@ -499,7 +499,7 @@ - Android::AndroidBuildApkStep + Android Build Android APK AndroidBuildApkStep default display name @@ -555,9 +555,6 @@ The minimum API level required by the kit is %1. Failed to run keytool. Не удалось запустить keytool. - - - Android::AndroidConfigurations Custom Android Debugger (%1, NDK %2) Особый отладчик Android (%1, NDK %2) @@ -570,9 +567,6 @@ The minimum API level required by the kit is %1. Android %1 Clang %2 Android %1 Clang %2 - - - Android::AndroidManager Unknown Android version. API Level: %1 Версия Android неизвестна. API Level: %1 @@ -595,9 +589,6 @@ The minimum API level required by the kit is %1. Не удалось установить пакет для Android. %1 - - - Android::AndroidPackageInstallationStep Copy application data Копирование данных приложения @@ -610,16 +601,10 @@ The minimum API level required by the kit is %1. Deploy to device Установка на устройство - - - Android::AndroidPackageInstallationStepWidget <b>Make install:</b> Copy App Files to %1 <b>Make install:</b> Копирование файлов приложения в %1 - - - Android::AndroidRunConfiguration Activity manager start options: Параметры запуска менеджера действий: @@ -642,9 +627,6 @@ Qt Creator использует: am start -n <имя_пакета>/<д Clean Environment Чистая среда - - - Android::ChooseDirectoryPage Android package source directory: Исходный каталог пакета Android: @@ -673,9 +655,6 @@ The files in the Android package source directory are copied to the build direct The Android template files will be created in the ANDROID_PACKAGE_SOURCE_DIR set in the .pro file. Шаблонные файлы для Android будут созданы в каталоге, заданном ANDROID_PACKAGE_SOURCE_DIR в файле .pro. - - - Android::ChooseProfilePage Select the .pro file for which you want to create the Android template files. Выберите файл .pro, для которого следует создать шаблоны для Android. @@ -688,9 +667,6 @@ The files in the Android package source directory are copied to the build direct Select a .pro File Выбор файла .pro - - - Android::CreateAndroidManifestWizard Create Android Template Files Wizard Мастер создания шаблонов для Android @@ -703,16 +679,6 @@ The files in the Android package source directory are copied to the build direct Could not update the project file %1. Не удалось обновить файл проекта %1. - - - Android::Internal - - Deploy to Android Device - Развёртывание на устройство Android - - - - Android::Internal::AddNewAVDDialog Create new AVD Создание AVD @@ -745,9 +711,6 @@ The files in the Android package source directory are copied to the build direct Overwrite existing AVD name Перезаписать существующее имя AVD - - - Android::Internal::AndroidAvdManager AVD Start Error Ошибка запуска AVD @@ -760,9 +723,6 @@ The files in the Android package source directory are copied to the build direct Install the missing emulator tool (%1) to the installed Android SDK. Установите утилиту эмуляции (%1) в установленный Android SDK. - - - Android::Internal::AndroidBuildApkWidget Create Templates Создать шаблоны @@ -783,10 +743,6 @@ The files in the Android package source directory are copied to the build direct Select library to include in package. Выбор библиотеки для включения в пакет. - - Remove - Убрать - Remove currently selected library from list. Удаление выбранной библиотеки из списка. @@ -879,13 +835,6 @@ The files in the Android package source directory are copied to the build direct This is useful for apps that use SSL operations. The path can be defined in Tools > Options > Devices > Android. Полезно для приложений, использующих операции SSL. Путь можно задать в Инструменты > Параметры > Устройства > Android. - - Build Android APK - Сборка Android APK - - - - Android::Internal::AndroidCreateKeystoreCertificate Keystore password is too short. Пароль связки ключей слишком короткий. @@ -914,17 +863,6 @@ The files in the Android package source directory are copied to the build direct Keystore Filename Имя файла связки ключей - - Keystore files (*.keystore *.jks) - Файлы связки ключей (*.keystore *.jks) - - - Error - Ошибка - - - - Android::Internal::AndroidDeployQtStep No Android arch set by the .pro file. Архитектура Android не прописана в файле .pro. @@ -1034,24 +972,14 @@ Do you want to uninstall the existing package? Package deploy: Running command "%1". Развёртывание пакета: выполняется команда «%1». - - - Android::Internal::AndroidDevice Run on Android Запуск на Android - - Android - Android - Android Device Устройство Android - - - Android::Internal::AndroidDeviceDialog Select Android Device Выбор устройства Android @@ -1128,9 +1056,6 @@ Do you want to uninstall the existing package? Always use this device for architecture %1 for this project Всегда использовать это устройство для архитектуры %1 в этом проекте - - - Android::Internal::AndroidDeviceModelDelegate OpenGL enabled OpenGL включён @@ -1139,9 +1064,6 @@ Do you want to uninstall the existing package? OpenGL disabled OpenGL выключен - - - Android::Internal::AndroidErrorMessage Android: SDK installation error 0x%1 Android: ошибка установки SDK 0x%1 @@ -1182,9 +1104,6 @@ Do you want to uninstall the existing package? Android: Unknown error 0x%1 Android: неизвестная ошибка 0x%1 - - - Android::Internal::AndroidManifestEditor General Основное @@ -1193,9 +1112,6 @@ Do you want to uninstall the existing package? XML Source Исходник XML - - - Android::Internal::AndroidManifestEditorIconContainerWidget Master icon Основной значок @@ -1228,9 +1144,6 @@ Do you want to uninstall the existing package? Select high DPI icon. Выбрать значок высокого разрешения. - - - Android::Internal::AndroidManifestEditorIconWidget Icon scaled up. Значок увеличен. @@ -1239,9 +1152,6 @@ Do you want to uninstall the existing package? Click to select... Щёлкните для выбора... - - - Android::Internal::AndroidManifestEditorWidget Package Пакет @@ -1298,10 +1208,6 @@ Do you want to uninstall the existing package? Sets the target SDK. Set this to the highest tested version. This disables compatibility behavior of the system for your application. Задаёт целевой SDK. Следует выбирать последнюю протестированную версию. Предотвращает включение системой режима совместимости для приложения. - - Application - Приложение - Application name: Имя приложения: @@ -1386,9 +1292,6 @@ Do you want to uninstall the existing package? Android Manifest editor Редактор Android Manifest - - - Android::Internal::AndroidPlugin Would you like to configure Android options? This will ensure Android kits can be usable and all essential packages are installed. To do it later, select Options > Devices > Android. Настроить Android? Предполагается, что комплекты Android доступны, а необходимые пакеты установлены. Чтобы сделать это позже перейдите в Параметры > Устройства > Android. @@ -1397,23 +1300,14 @@ Do you want to uninstall the existing package? Configure Android Настроить Android - - - Android::Internal::AndroidPotentialKit Configure Android... Настроить Android... - - - Android::Internal::AndroidPotentialKitWidget %1 needs additional settings to enable Android support. You can configure those settings in the Options dialog. Для включения поддержки Android в %1 требуются дополнительные настройки в диалоге Параметры. - - - Android::Internal::AndroidQtVersion NDK is not configured in Devices > Android. NDK не настроен в Устройства > Android. @@ -1431,16 +1325,10 @@ Do you want to uninstall the existing package? Qt Version is meant for Android Android - - - Android::Internal::AndroidRunner "%1" terminated. «%1» завершён. - - - Android::Internal::AndroidRunnerWorker No free ports available on host for QML debugging. Нет свободных портов на компьютере для отладки QML. @@ -1493,9 +1381,6 @@ Do you want to uninstall the existing package? "%1" died. «%1» аварийно завершился. - - - Android::Internal::AndroidSdkDownloader Encountered SSL errors, download is aborted. Возникла ошибка SSL, загрузка прервана. @@ -1508,10 +1393,6 @@ Do you want to uninstall the existing package? Downloading SDK Tools package... Загрузка пакета SDK Tools... - - Cancel - Отмена - Could not create the SDK folder %1. Не удалось создать каталог SDK %1. @@ -1536,9 +1417,6 @@ Do you want to uninstall the existing package? Writing and verifying the integrity of the downloaded file has failed. Не удалось записать и проверить целостность загруженных файлов. - - - Android::Internal::AndroidSdkManager The operation requires user interaction. Use the "sdkmanager" command-line tool. Операция требует вмешательства пользователя. Используйте «sdkmanager» в командной строке. @@ -1551,9 +1429,6 @@ Do you want to uninstall the existing package? - - - Android::Internal::AndroidSdkManagerWidget Android SDK Manager Android SDK Manager @@ -1590,10 +1465,6 @@ Do you want to uninstall the existing package? Advanced Options... Дополнительно... - - Cancel - Отмена - Do you want to accept the Android SDK license? Принимаете условия лицензии Android SDK? @@ -1704,13 +1575,6 @@ Cancelling pending operations... Отмена ожидающих операций... - - - Android::Internal::AndroidSdkModel - - Package - Пакет - Revision Ревизия @@ -1743,20 +1607,6 @@ Cancelling pending operations... Install Установить - - - Android::Internal::AndroidServiceWidget - - Add - Добавить - - - Remove - Удалить - - - - Android::Internal::AndroidServiceWidget::AndroidServiceModel The name of the class implementing the service. Имя класса, реализующего сервис. @@ -1823,9 +1673,6 @@ Prefix with : if the process is private, use a lowercase name if the process is The service arguments must be set for a service not run in an external library Необходимо задать параметры сервиса, не работающего во внешней библиотеке - - - Android::Internal::AndroidSettingsWidget Select JDK Path Выбор размещения JDK @@ -1846,10 +1693,6 @@ Prefix with : if the process is private, use a lowercase name if the process is Cloning OpenSSL prebuilt libraries... Клонирование собранных библиотек OpenSSL... - - Cancel - Отмена - Remove Android Virtual Device Удаление виртуального устройства Android @@ -1970,10 +1813,6 @@ Prefix with : if the process is private, use a lowercase name if the process is Download and install Android SDK Tools to %1? Загрузить и установить инструменты Android SDK в %1? - - Android - Android - Android settings are OK. Настройки Android в порядке. @@ -2024,16 +1863,10 @@ in the system's browser for manual download. Android SDK installation is missing necessary packages. Do you want to install the missing packages? В установленном Android SDK отсутствует ряд необходимых пакетов. Доустановить их? - - - Android::Internal::AndroidToolChain Android Clang Android Clang - - - Android::Internal::AvdDialog Cannot create a new AVD. No sufficiently recent Android SDK available. Install an SDK of at least API version %1. @@ -2048,18 +1881,11 @@ Install an SDK of at least API version %1. Allowed characters are: a-z A-Z 0-9 and . _ - Допустимы символы: a-z A-Z 0-9 . _ - - - - Android::Internal::AvdModel AVD Name AVD - Android Virtual Device Название AVD - - API - API - Device Type Тип устройства @@ -2076,9 +1902,6 @@ Install an SDK of at least API version %1. CPU/ABI Процессор/ABI - - - Android::Internal::OptionsDialog SDK Manager Arguments Параметры SDK Manager @@ -2095,13 +1918,6 @@ Install an SDK of at least API version %1. Available arguments: Доступные параметры: - - - Android::Internal::SplashIconContainerWidget - - Splash screen - Заставка - Select splash screen image Выбор картинки для заставки @@ -2168,9 +1984,6 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). Low DPI splash screen Заставка низкого разрешения - - - Android::NoApplicationProFilePage No application .pro file found in this project. Не найден файл .pro приложения в этом проекте. @@ -2179,9 +1992,6 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). No Application .pro File Нет файла .pro приложения - - - Android::PasswordInputDialog Incorrect password. Неверный пароль. @@ -2202,9 +2012,6 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). Enter certificate password Введите пароль сертификата - - - AndroidAvdManager Cannot create AVD. Invalid input. Не удалось создать AVD. Неверный ввод. @@ -2217,16 +2024,10 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). Cannot create AVD. Command timed out. Не удалось создать AVD. Время ожидания команды истекло. - - - AndroidConfig Error Creating AVD Ошибка создания AVD - - - AndroidConfiguration Could not run: %1 Невозможно запустить: %1 @@ -2235,13 +2036,6 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). No devices found in output of: %1 Устройства не обнаружены в выводе %1 - - - AndroidCreateKeystoreCertificate - - Keystore - Связка ключей - Password: Пароль: @@ -2254,10 +2048,6 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). Show password Отображать пароль - - Certificate - Сертификат - Alias name: Имя алиаса: @@ -2306,9 +2096,6 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). Use Keystore password Пароль для связки ключей - - - AndroidSdkManager Updating installed packages. Обновление установленных пакетов. @@ -2337,9 +2124,6 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). Failed Ошибка - - - AndroidSettingsWidget Android Configuration Конфигурация Android @@ -2360,10 +2144,6 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). Mb МБ - - Remove - Удалить - Automatically create kits for Android tool chains Автоматически создавать комплекты для инструментариев Android @@ -2376,10 +2156,6 @@ To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen(). Start... Запустить... - - Add... - Добавить... - Java Settings Настройки Java @@ -3543,7 +3319,7 @@ Warning: this is an experimental feature and might lead to failing to execute th - AutotoolsProjectManager + Android Autogen Display name for AutotoolsProjectManager::AutogenStep id. diff --git a/share/qtcreator/translations/qtcreator_uk.ts b/share/qtcreator/translations/qtcreator_uk.ts index 65c04d2d502..8ab54dce9bf 100644 --- a/share/qtcreator/translations/qtcreator_uk.ts +++ b/share/qtcreator/translations/qtcreator_uk.ts @@ -26069,7 +26069,7 @@ should a repository require SSH-authentication (see documentation on SSH and the - AutotoolsProjectManager + Android Autogen Display name for AutotoolsProjectManager::AutogenStep id. @@ -27568,30 +27568,11 @@ Do you want to kill it? - AddNewAVDDialog - - Create new AVD - Створити новий AVD - - - Name: - Назва: - + Android Kit: Комплект: - - SD card size: - Розмір карти SD: - - - MiB - Мб - - - - AndroidCreateKeystoreCertificate Create a keystore and a certificate Створення сховища ключів та сертифіката @@ -27672,81 +27653,10 @@ Do you want to kill it? Use Keystore password Пароль для сховища ключів - - - AndroidDeployStepWidget - - Form - Форма - - - Qt Deployment - Розгортання Qt - - - Use the external Ministro application to download and maintain Qt libraries. - Використовувати зовнішню програму Ministro для завантаження та підтримки бібліотек Qt. - - - Use Ministro service to install Qt - Використовувати службу Ministro для встановлення Qt - - - Push local Qt libraries to device. You must have Qt libraries compiled for that platform. -The APK will not be usable on any other device. - Надсилати локальні бібліотеки Qt до пристрою. Ви повинні мати бібліотеки Qt скомпільовані для цієї платформи. -Файл APK не можна буде використовувати на жодному іншому пристрої. - - - Deploy local Qt libraries to temporary directory - Розгортати локальні бібліотеки Qt до тимчасової теки - - - Creates a standalone APK. - Створює автономний APK. - - - Bundle Qt libraries in APK - Вкладати бібліотеки Qt до APK - - - Advanced Actions - Розширені дії - - - Clean Temporary Libraries Directory on Device - Очистити теку тимчасових -бібліотек на пристрої - - - Install Ministro from APK - Встановити Ministro з APK - - - Reset Default Devices - Скинути типові пристрої - - - Uses the external Ministro application to download and maintain Qt libraries. - Використовувати зовнішню програму Ministro для завантаження та підтримки бібліотек Qt. - - - Pushes local Qt libraries to device. You must have Qt libraries compiled for that platform. -The APK will not be usable on any other device. - Надсилати локальні бібліотеки Qt до пристрою. Ви повинні мати бібліотеки Qt скомпільовані для цієї платформи. -Файл APK не можна буде використовувати на жодному іншому пристрої. - - - - AndroidPackageCreationWidget <b>Android target SDK:</b> <b>SDK для Android:</b> - - Application - Програма - Libraries Бібліотеки @@ -27777,14 +27687,6 @@ The APK will not be usable on any other device. Down Вгору - - Sign package - Підпис пакунка - - - Keystore: - Сховище ключів: - Create Створити @@ -27797,21 +27699,10 @@ The APK will not be usable on any other device. Open package location after is complete Відкрити розташування пакунка після завершення - - Certificate alias: - Псевдонім сертифіката: - - - Signing a debug package - Підписання зневаджувального пакунка - Automatically check required Qt libraries from compiled application. Автоматично перевіряти необхідні бібліотеки Qt із скомпільованої програми. - - - AndroidSettingsWidget Android Configuration Конфігурація Android @@ -27820,10 +27711,6 @@ The APK will not be usable on any other device. Android SDK location: Розташування Android SDK: - - Browse - Огляд - Android NDK location: Розташування Android NDK: @@ -27852,10 +27739,6 @@ The APK will not be usable on any other device. Start Android AVD Manager Запустити управління AVD для Android - - Add - Додати - Remove Видалити @@ -28725,47 +28608,13 @@ The APK will not be usable on any other device. - Android::Internal::AndroidConfigurations - - Could not run: %1 - Не вдалось запустити: %1 - - - No devices found in output of: %1 - Не знайдено пристроїв у виведенні: %1 - - - Error Creating AVD - Помилка створення AVD - + Android Cannot create a new AVD. No sufficiently recent Android SDK available. Please install an SDK of at least API version %1. Неможливо створити новий AVD. Відсутній достатньо свіжий Android SDK. Будь ласка, встановіть SDK з версією API не нижче %1. - - Android Debugger for %1 - Зневаджувач Android для "%1" - - - Android for %1 (GCC %2, Qt %3) - Android для %1 (GCC %2, Qt %3) - - - - Android - - Android - Android - - - - Android::Internal::AndroidCreateKeystoreCertificate - - <span style=" color:#ff0000;">Password is too short</span> - <span style=" color:#ff0000;">Пароль закороткий</span> - <span style=" color:#ff0000;">Passwords don't match</span> <span style=" color:#ff0000;">Паролі не співпадають</span> @@ -28810,28 +28659,10 @@ Please install an SDK of at least API version %1. Error Помилка - - - Android::Internal::AndroidDeployConfiguration - - Deploy to Android device - Розгортання на пристрій Android - - - - Android::Internal::AndroidDeployConfigurationFactory Deploy on Android Розгортання на пристрій Android - - - Android::Internal::AndroidDeployStep - - Deploy to Android device - AndroidDeployStep default display name - Розгортання на пристрій Android - Please wait, searching for a suitable device for target:%1. Будь ласка, зачекайте, триває пошук відповідного пристрою для цілі: %1. @@ -28868,14 +28699,6 @@ Please install an SDK of at least API version %1. Reason: %1 Причина: %1 - - Reason: %1 - Причина: %1 - - - Exit code: %1 - Код завершення: %1 - Deploy Qt libraries. This may take some time, please wait. Розгортання бібліотек Qt. Це може зайняти деякий час, будь ласка, почекайте. @@ -28888,53 +28711,14 @@ Please install an SDK of at least API version %1. Package installation failed. Збій встановлення пакунка. - - Pulling files necessary for debugging. - Стягування файлів, що необхідні для зневадження. - - - - Android::Internal::AndroidDeployStepFactory - - Deploy to Android device or emulator - Розгортання на пристрій Android або емулятор - - - - Android::Internal::AndroidDeployStepWidget - - <b>Deploy configurations</b> - <b>Конфігурації розгортання</b> - - - Qt Android Smart Installer - Qt Android Smart Installer - - - Android package (*.apk) - Пакунок Android (*.apk) - - - - Android::Internal::AndroidDevice Run on Android Запустити на Android - - Android - Android - - - - Android::Internal::AndroidDeviceFactory Android Device Пристрій Android - - - Android::Internal::AndroidManager Error creating Android directory '%1'. Помилка створення теки '%1' для Android. @@ -28957,14 +28741,6 @@ Please install at least one SDK. Android files have been updated automatically. Файли Android були автоматично оновлені. - - Unknown Android version. API Level: %1 - Невідома версія Android. Рівень API: %1 - - - Cannot parse "%1". - Неможливо розібрати "%1". - Cannot open "%1". Неможливо відкрити "%1". @@ -28973,10 +28749,6 @@ Please install at least one SDK. Unknown Android version. Невідома версія Android. - - Error creating Android templates. - Помилка створення шаблонів Android. - Cannot parse '%1'. Неможливо розібрати '%1'. @@ -28985,10 +28757,6 @@ Please install at least one SDK. Cannot open '%1'. Неможливо відкрити '%1'. - - Starting Android virtual device failed. - Збій запуску віртуального пристрою Android. - Android files have been updated automatically Файли Android були автоматично оновлені @@ -29005,16 +28773,10 @@ Please install at least one SDK. Can't open '%1' Неможливо відкрити '%1' - - - Android::Internal::AndroidPackageCreationFactory Create Android (.apk) Package Створити пакунок Android (.apk) - - - Android::Internal::AndroidPackageCreationStep Packaging for Android Пакування для Android @@ -29041,10 +28803,6 @@ Please make sure your application is built successfully and is selected in Appli Неможливо знайти '%1'. Будь ласка, переконайтесь, що ваша програма була успішно зібрана та вибрана у вкладці Програма ('Параметри запуску'). - - Error - Помилка - Failed to run keytool Збій запуску keytool @@ -29091,53 +28849,6 @@ Please make sure your application is built successfully and is selected in Appli Package created. Пакунок створено. - - Package deploy: Running command '%1 %2'. - Розгортання пакунка: Виконання команди '%1 %2'. - - - Packaging failed. - Збій пакування. - - - Packaging error: Could not start command '%1 %2'. Reason: %3 - Помилка пакування: Не вдалось запустити команду '%1 %2'. Причина: %3 - - - Packaging Error: Command '%1 %2' failed. - Помилка пакування: Збій команди '%1 %2'. - - - Reason: %1 - Причина: %1 - - - Reason: %1 - Причина: %1 - - - Exit code: %1 - Код завершення: %1 - - - Keystore - Сховище ключів - - - Keystore password: - Пароль до сховища ключів: - - - Certificate - Сертифікат - - - Certificate password (%1): - Пароль сертифіката (%1): - - - - Android::Internal::AndroidPackageCreationWidget <b>Package configurations</b> <b>Конфігурації пакування</b> @@ -29146,31 +28857,6 @@ Please make sure your application is built successfully and is selected in Appli Select keystore file Виберіть файл сховища ключів - - Keystore files (*.keystore *.jks) - Файли сховищ ключів (*.keystore *.jks) - - - - Android::Internal::AndroidPackageInstallationFactory - - Deploy to device - Розгортання на пристрій - - - - Android::Internal::AndroidPackageInstallationStep - - Copy application data - Копіювання даних програми - - - Removing directory %1 - Видалення теки %1 - - - - Android::Internal::AndroidQtVersion Failed to detect the ABIs used by the Qt version. Збій визначення ABI, що використовуються версією Qt. @@ -29180,31 +28866,18 @@ Please make sure your application is built successfully and is selected in Appli Qt Version is meant for Android Android - - - Android::Internal::AndroidRunConfiguration The .pro file '%1' is currently being parsed. Здійснюється розбір файлу .pro '%1'. - - The .pro file "%1" is currently being parsed. - Здійснюється розбір файлу .pro "%1". - Run on Android device Запустити на пристрої Android - - - Android::Internal::AndroidRunControl Starting remote process. Запуск віддаленого процесу. - - - Android::Internal::AndroidRunner No free ports available on host for QML debugging. Немає вільних портів на вузлі для зневадження QML. @@ -29273,16 +28946,10 @@ Please make sure your application is built successfully and is selected in Appli '%1' завершився. - - - Android::Internal::AndroidSettingsPage Android Configurations Конфігурації Android - - - Android::Internal::AvdModel AVD Name AVD - Android Virtual Device @@ -29296,9 +28963,6 @@ Please make sure your application is built successfully and is selected in Appli CPU/ABI CPU/ABI - - - Android::Internal::AndroidSettingsWidget "%1" does not seem to be an Android SDK top folder. "%1" не схожа на кореневу теку Android SDK. @@ -29397,16 +29061,10 @@ To add the Qt versions, select Options > Build & Run > Qt Versions.Select OpenJDK Path Виберіть шлях до OpenJDK - - - Android::Internal::AndroidToolChainFactory Android GCC Android GCC - - - Android::Internal::AndroidToolChainConfigWidget NDK Root: Корінь NDK: @@ -33521,14 +33179,11 @@ cannot be found in the path. - Android::Internal::AndroidGdbServerKitInformation + Android GDB server Сервер GDB - - - Android::Internal::AndroidGdbServerKitInformationWidget Manage... Управління... @@ -35249,14 +34904,11 @@ Partial names can be used if they are unambiguous. - Android::Internal::AndroidAnalyzeSupport + Android No analyzer tool selected. Інструмент для аналізу не обрано. - - - Android::Internal::AndroidManifestEditor General Загальне @@ -35265,16 +34917,10 @@ Partial names can be used if they are unambiguous. XML Source Код XML - - - Android::Internal::AndroidManifestEditorFactory Android Manifest editor Редактор Android Manifest - - - Android::Internal::AndroidManifestEditorWidget Package Пакунок @@ -35411,10 +35057,6 @@ Partial names can be used if they are unambiguous. Include default features for Qt modules. Включати типові можливості для модулів Qt. - - Remove - Видалити - Add Додати @@ -35455,9 +35097,6 @@ Partial names can be used if they are unambiguous. Choose High DPI Icon Виберіть піктограму з високою DPI - - - Android::AndroidPlugin Android Manifest file Файл Android Manifest @@ -36531,7 +36170,7 @@ This wizard will guide you through the essential steps to deploy a ready-to-go d - Android::Internal::AddNewAVDDialog + Android Create new AVD Створити новий AVD @@ -36556,41 +36195,10 @@ This wizard will guide you through the essential steps to deploy a ready-to-go d ABI: ABI: - - - AndroidDeployQtWidget Form Форма - - Sign package - Підпис пакунка - - - Keystore: - Сховище ключів: - - - Create - Створити - - - Browse - Огляд - - - Signing a debug package - Підписання зневаджувального пакунка - - - Certificate alias: - Псевдонім сертифіката: - - - Advanced Actions - Розширені дії - Clean Temporary Libraries Directory on Device Очистити теку тимчасових @@ -36604,22 +36212,10 @@ This wizard will guide you through the essential steps to deploy a ready-to-go d Reset Default Devices Скинути типові пристрої - - Open package location after build - Відкрити розташування пакунка після збірки - - - Verbose output - Розширене виведення - Create AndroidManifest.xml Створити AndroidManifest.xml - - Application - Програма - Input file for androiddeployqt: Вхідний файл для androiddeployqt: @@ -36628,82 +36224,6 @@ This wizard will guide you through the essential steps to deploy a ready-to-go d Qt no longer uses the folder "android" in the project's source directory. Qt більше не використовує підтеку "android" з теки коду проекту. - - Qt Deployment - Розгортання Qt - - - Use the external Ministro application to download and maintain Qt libraries. - Використовувати зовнішню програму Ministro для завантаження та підтримки бібліотек Qt. - - - Use Ministro service to install Qt - Використовувати службу Ministro для встановлення Qt - - - Push local Qt libraries to device. You must have Qt libraries compiled for that platform. -The APK will not be usable on any other device. - Надсилати локальні бібліотеки Qt до пристрою. Ви повинні мати бібліотеки Qt скомпільовані для цієї платформи. -Файл APK не можна буде використовувати на жодному іншому пристрої. - - - Deploy local Qt libraries to temporary directory - Розгортати локальні бібліотеки Qt до тимчасової теки - - - Creates a standalone APK. - Створює автономний APK. - - - Bundle Qt libraries in APK - Вкладати бібліотеки Qt до APK - - - Additional Libraries - Додаткові бібліотеки - - - List of extra libraries to include in Android package and load on startup. - Список додаткових бібліотек для включення до пакунка Android та завантаження під час запуску. - - - Select library to include in package. - Виберіть бібліотеку для включення до пакунку. - - - Add - Додати - - - Remove currently selected library from list. - Видалити виділену бібліотеку зі списку. - - - Remove - Видалити - - - Create... - Створити... - - - Android build SDK: - Android SDK для збірки: - - - Uses the external Ministro application to download and maintain Qt libraries. - Використовувати зовнішню програму Ministro для завантаження та підтримки бібліотек Qt. - - - Pushes local Qt libraries to device. You must have Qt libraries compiled for that platform. -The APK will not be usable on any other device. - Надсилати локальні бібліотеки Qt до пристрою. Ви повинні мати бібліотеки Qt скомпільовані для цієї платформи. -Файл APK не можна буде використовувати на жодному іншому пристрої. - - - Add... - Додати... - Uses the external Ministro application to download and maintain Qt libraries.<br/><br/>Ministro is a third-party tool which provides the open source Qt libraries on demand. These libraries are compatible with the default open source binary package and will not always be up-to-date. Використовувати зовнішню програму Ministro для завантаження та підтримки бібліотек Qt.<br/><br/>Ministro є стороннім засобом, що надає бібліотеки з відкритим кодом Qt на вимогу. Ці бібліотеки є сумісними з типовим двійковим пакунком (для відкритого коду), однак не завжди останньої версії. @@ -36716,9 +36236,6 @@ The APK will not be usable on any other device. Uninstall previous package Деінсталювати попередній пакунок - - - Android::Internal::AndroidDeviceDialog Select Android Device Вибір пристрою Android @@ -36735,10 +36252,6 @@ The APK will not be usable on any other device. Always use this device for architecture %1 Завжди використовувати цей пристрій для архітектури %1 - - ABI: - ABI: - Compatible devices Сумісні пристрої @@ -37685,14 +37198,11 @@ monitor reset - Android::Internal::AndroidDeployQtStepFactory + Android Deploy to Android device or emulator Розгортання на пристрій Android або емулятор - - - Android::Internal::AndroidDeployQtStep Deploy to Android device AndroidDeployQtStep default display name @@ -37778,10 +37288,6 @@ Do you want to uninstall the existing package next time? Інша програма з таким самим ідентифікатором пакунка, але іншим сертифікатом підпису вже існує. Бажаєте деінсталювати існуючий пакунок наступного разу? - - Warning: Signing a debug package. - Попередження: Підписання зневаджувального пакунка. - Internal Error: Could not find .pro file. Внутрішня помилка: не вдалось знайти файл .pro. @@ -37794,18 +37300,6 @@ Do you want to uninstall the existing package next time? Pulling files necessary for debugging. Стягування файлів, що необхідні для зневадження. - - Package deploy: Running command '%1 %2'. - Розгортання пакунка: Виконання команди '%1 %2'. - - - Packaging error: Could not start command '%1 %2'. Reason: %3 - Помилка пакування: Не вдалось запустити команду '%1 %2'. Причина: %3 - - - Packaging Error: Command '%1 %2' failed. - Помилка пакування: Збій команди '%1 %2'. - Reason: %1 Причина: %1 @@ -37814,37 +37308,6 @@ Do you want to uninstall the existing package next time? Exit code: %1 Код завершення: %1 - - Error - Помилка - - - Failed to run keytool. - Збій запуску keytool. - - - Invalid password. - Неправильний пароль. - - - Keystore - Сховище ключів - - - Keystore password: - Пароль до сховища ключів: - - - Certificate - Сертифікат - - - Certificate password (%1): - Пароль сертифіката (%1): - - - - Android::Internal::AndroidDeployQtWidget <b>Deploy configurations</b> <b>Конфігурації розгортання</b> @@ -37857,25 +37320,6 @@ Do you want to uninstall the existing package next time? Android package (*.apk) Пакунок Android (*.apk) - - Select keystore file - Виберіть файл сховища ключів - - - Keystore files (*.keystore *.jks) - Файли сховищ ключів (*.keystore *.jks) - - - Select additional libraries - Виберіть додаткові бібліотеки - - - Libraries (*.so) - Бібліотеки (*.so) - - - - Android::Internal::AndroidErrorMessage Android: SDK installation error 0x%1 Android: помилка встановлення SDK 0x%1 @@ -37916,20 +37360,6 @@ Do you want to uninstall the existing package next time? Android: Unknown error 0x%1 Android: невідома помилка 0x%1 - - - Android::Internal::AndroidPackageInstallationStepWidget - - <b>Make install</b> - <b>Make install</b> - - - Make install - Make install - - - - Android::Internal::AndroidPotentialKitWidget Qt Creator needs additional settings to enable Android support.You can configure those settings in the Options dialog. Qt Creator потребує додаткових налаштувань, щоб увімкнути підтримку Android. Ви можете їх встановити в діалозі Опції. @@ -37942,62 +37372,18 @@ Do you want to uninstall the existing package next time? Qt Creator needs additional settings to enable Android support. You can configure those settings in the Options dialog. Qt Creator потребує додаткових налаштувань, щоб увімкнути підтримку Android. Ви можете їх встановити в діалозі Опції. - - - Android::Internal::NoApplicationProFilePage - - No application .pro file found in this project. - Не знайдено файл .pro програми в цьому проекті. - - - No Application .pro File - Немає файлу .pro програми - - - - Android::Internal::ChooseProFilePage Select the .pro file for which you want to create an AndroidManifest.xml file. Виберіть файл .pro, для якого Ви бажаєте створити файл AndroidManifest.xml. - - .pro file: - Файл .pro: - - - Select a .pro File - Виберіть файл .pro - - - - Android::Internal::ChooseDirectoryPage The Android package source directory can not be the same as the project directory. Тека джерел пакунка Android не може збігатись з текою проекту. - - The Android package source directory cannot be the same as the project directory. - Тека джерел пакунка Android не може збігатись з текою проекту. - - - Android package source directory: - Тека джерел пакунка Android: - - - Select the Android package source directory. - -The files in the Android package source directory are copied to the build directory's Android directory and the default files are overwritten. - Оберіть теку джерел пакунка Android. - -Файли в теці джерел пакунка Android будуть скопійовані до теки Android в теці збірки, а типові файли будуть перезаписані. - The Android manifest file will be created in the ANDROID_PACKAGE_SOURCE_DIR set in the .pro file. Файл маніфесту Android буде створено в теці, на яку вказує ANDROID_PACKAGE_SOURCE_DIR задана в файлі .pro. - - - Android::Internal::CreateAndroidManifestWizard Create Android Manifest Wizard Майстер створення маніфесту Android @@ -38018,22 +37404,10 @@ The files in the Android package source directory are copied to the build direct Could not remove file %1. Не вдалось видалити файл %1. - - File Creation Error - Помилка створення файлу - Could not create file %1. Не вдалось створити файл %1. - - Project File not Updated - Файл проекту не оновлено - - - Could not update the .pro file %1. - Не вдалось оновити файл .pro %1. - BareMetal::Internal::BareMetalDevice @@ -39932,7 +39306,7 @@ Please build the qmldump application on the Qt version options page. - AndroidConfiguration + Android Could not run: %1 Не вдалось запустити: %1 @@ -39941,40 +39315,22 @@ Please build the qmldump application on the Qt version options page. No devices found in output of: %1 Не знайдено пристроїв у виведенні: %1 - - - AndroidConfig Error Creating AVD Помилка створення AVD - - Cannot create a new AVD. No sufficiently recent Android SDK available. -Please install an SDK of at least API version %1. - Неможливо створити новий AVD. Відсутній достатньо свіжий Android SDK. -Будь ласка, встановіть SDK з версією API не нижче %1. - Could not start process "%1 %2" Не вдалось запустити процес "%1 %2" - - - Android::Internal::AndroidPotentialKit Configure Android... Налаштувати Android... - - - Android::Internal::JavaEditorFactory Java Editor Редактор Java - - - Android::Internal::JavaFileWizard Creates a Java file with boilerplate code. Створює файл Java з шаблонним кодом. @@ -41657,7 +41013,7 @@ Are you sure you want to continue? - Android::Internal::AvdDialog + Android Cannot create a new AVD. No sufficiently recent Android SDK available. Install an SDK of at least API version %1. @@ -43057,11 +42413,7 @@ Install an SDK of at least API version %1. - AndroidBuildApkWidget - - Form - Форма - + Android Sign package Підпис пакунка @@ -43086,10 +42438,6 @@ Install an SDK of at least API version %1. Signing an APK that uses "Deploy local Qt libraries" is not allowed Підписання APK при вживанні "Розгортати локальні бібліотеки Qt" не дозволяється - - Application - Програма - Android build SDK: Android SDK для збірки: @@ -43216,23 +42564,11 @@ Deploying local Qt libraries is incompatible with Android 5. - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkWidget - - Form - Форма - - - Android - Android - + Android Create Templates Створити шаблони - - Input file for androiddeployqt: - Вхідний файл для androiddeployqt: - Additional Libraries Додаткові бібліотеки @@ -43245,18 +42581,10 @@ Deploying local Qt libraries is incompatible with Android 5. Select library to include in package. Виберіть бібліотеку для включення до пакунку. - - Add... - Додати... - Remove currently selected library from list. Видалити виділену бібліотеку зі списку. - - Remove - Видалити - Select additional libraries Виберіть додаткові бібліотеки @@ -43431,24 +42759,16 @@ Deploying local Qt libraries is incompatible with Android 5. - Android::AndroidBuildApkStep + Android Build Android APK AndroidBuildApkStep default display name Збірка APK Android - - Warning: Signing a debug package. - Попередження: Підписання зневаджувального пакунка. - Warning: Signing a debug or profile package. Попередження: Підписання пакунка для зневадження або профілювання. - - Error - Помилка - Failed to run keytool. Збій запуску keytool. @@ -43457,40 +42777,18 @@ Deploying local Qt libraries is incompatible with Android 5. Invalid password. Неправильний пароль. - - Keystore - Сховище ключів - Keystore password: Пароль до сховища ключів: - - Certificate - Сертифікат - Certificate password (%1): Пароль сертифіката (%1): - - - Android::AndroidBuildApkWidget - - Keystore files (*.keystore *.jks) - Файли сховищ ключів (*.keystore *.jks) - Select Keystore File Виберіть файл сховища ключів - - <b>Build Android APK</b> - <b>Збірка APK Android</b> - - - - Android::AndroidConfigurations Android Debugger for %1 Зневаджувач Android для "%1" @@ -43499,9 +42797,6 @@ Deploying local Qt libraries is incompatible with Android 5. Android for %1 (GCC %2, Qt %3) Android для %1 (GCC %2, Qt %3) - - - Android::AndroidManager Unknown Android version. API Level: %1 Невідома версія Android. Рівень API: %1 @@ -45984,14 +45279,11 @@ to project "%2". - QmakeAndroidSupport::Internal::AndroidPackageInstallationFactory + Android Deploy to device Розгортання на пристрій - - - QmakeAndroidSupport::Internal::AndroidPackageInstallationStep Copy application data Копіювання даних програми @@ -46000,9 +45292,6 @@ to project "%2". Removing directory %1 Видалення теки %1 - - - QmakeAndroidSupport::Internal::AndroidPackageInstallationStepWidget <b>Make install</b> <b>Make install</b> @@ -46011,9 +45300,6 @@ to project "%2". Make install Make install - - - QmakeAndroidSupport::Internal::NoApplicationProFilePage No application .pro file found in this project. Не знайдено файл .pro програми в цьому проекті. @@ -46022,9 +45308,6 @@ to project "%2". No Application .pro File Немає файлу .pro програми - - - QmakeAndroidSupport::Internal::ChooseProFilePage Select the .pro file for which you want to create the Android template files. Виберіть файл .pro, для якого Ви бажаєте створити файли шаблонів Android. @@ -46037,9 +45320,6 @@ to project "%2". Select a .pro File Виберіть файл .pro - - - QmakeAndroidSupport::Internal::ChooseDirectoryPage The Android package source directory cannot be the same as the project directory. Тека джерел пакунка Android не може збігатись з текою проекту. @@ -46072,9 +45352,6 @@ The files in the Android package source directory are copied to the build direct It is highly recommended if you are plannig to extend the Java part of your Qt application. Настійливо рекомендовано, якщо ви плануєте розширювати Java-частину вашої програми Qt. - - - QmakeAndroidSupport::Internal::CreateAndroidManifestWizard Create Android Template Files Wizard Майстер створення файлів шаблонів Android @@ -46103,39 +45380,10 @@ The files in the Android package source directory are copied to the build direct Could not update the .pro file %1. Не вдалось оновити файл .pro %1. - - - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkStepFactory - - Build Android APK - Збірка APK Android - - - - QmakeAndroidSupport::Internal::QmakeAndroidBuildApkStep - - Found old folder "android" in source directory. Qt 5.2 does not use that folder by default. - Знайдено стару теку "android" серед кодів. Qt 5.2 типово не використовує цю теку. - - - Internal Error: Could not find .pro file. - Внутрішня помилка: не вдалось знайти файл .pro. - - - Internal Error: Unknown Android deployment JSON file location. - Внутрішня помилка: невідоме розташування JSON-файлу розгортання Android. - No application .pro file found, not building an APK. Не знайдено файл .pro програми, не будуємо APK. - - Starting: "%1" %2 - Запуск: "%1" %2 - - - - QmakeAndroidSupport::Internal::QmakeAndroidRunConfiguration The .pro file "%1" is currently being parsed. Здійснюється розбір файлу .pro "%1". @@ -48149,7 +47397,7 @@ Setting breakpoints by file name and line number may fail. - Android::Internal::AndroidDeviceModelDelegate + Android OpenGL enabled OpenGL увімкнено diff --git a/share/qtcreator/translations/qtcreator_zh_CN.ts b/share/qtcreator/translations/qtcreator_zh_CN.ts index 5317dd6902f..1b3cc3f8eb3 100644 --- a/share/qtcreator/translations/qtcreator_zh_CN.ts +++ b/share/qtcreator/translations/qtcreator_zh_CN.ts @@ -40796,7 +40796,7 @@ Filter: %2 - AddNewAVDDialog + Android Create new AVD 创建新AVD @@ -40817,9 +40817,6 @@ Filter: %2 MiB MiB - - - AndroidCreateKeystoreCertificate Create a keystore and a certificate 创建一个密钥存储库和一个证书 @@ -40897,9 +40894,6 @@ Filter: %2 >AA; >AA; - - - AndroidDeployStepWidget Form 界面 @@ -40944,9 +40938,6 @@ This option is useful when you want to try your application on devices which don Choose APK 选择APK - - - AndroidPackageCreationWidget Manifest Manifest @@ -41029,10 +41020,6 @@ This option is useful when you want to try your application on devices which don Discard 丢弃 - - Name: - 名称: - Libraries @@ -41087,9 +41074,6 @@ This option is useful when you want to try your application on devices which don Certificate alias: 证书别名: - - - AndroidSettingsWidget Android Configuration Android配置 @@ -41098,10 +41082,6 @@ This option is useful when you want to try your application on devices which don Android SDK location: Android SDK的路径: - - Browse - 浏览 - Android NDK location: Android NDK的路径: @@ -41154,14 +41134,6 @@ This option is useful when you want to try your application on devices which don Start Android AVD Manager 启动Android AVD管理器 - - Add - 添加 - - - Remove - 删除 - ClearCase @@ -43692,7 +43664,7 @@ should a repository require SSH-authentication (see documentation on SSH and the - Android::Internal::AndroidConfigurations + Android Error Creating AVD 创建AVD错误 @@ -43703,20 +43675,6 @@ Please install an SDK of at least API version %1. 无法创建一个新的AVD。没有足够新的Android SDK。 请安装API版本至少为 %1的 SDK。 - - - Android - - Android - Android - - - - Android::Internal::AndroidCreateKeystoreCertificate - - <span style=" color:#ff0000;">Password is too short</span> - <span style=" color:#ff0000;">密码太短</span> - <span style=" color:#ff0000;">Passwords don't match</span> <span style=" color:#ff0000;">密码不匹配</span> @@ -43737,23 +43695,10 @@ Please install an SDK of at least API version %1. Error 错误 - - - Android::Internal::AndroidDeployConfiguration - - Deploy to Android device - 部署到Android设备 - - - - Android::Internal::AndroidDeployConfigurationFactory Deploy on Android 部署到Android设备 - - - Android::Internal::AndroidDeployStep Deploy to Android device AndroidDeployStep default display name @@ -43771,14 +43716,6 @@ Please install an SDK of at least API version %1. Package deploy: Running command '%1 %2'. 包部署: 运行命令 '%1 %2'。 - - Packaging error: Could not start command '%1 %2'. Reason: %3 - 打包错误:无法执行命令'%1 %2'。原因'%3' - - - Packaging Error: Command '%1 %2' failed. - 打包错误:命令'%1 %2'失败.。 - Reason: %1 原因: %1 @@ -43811,16 +43748,10 @@ Please install an SDK of at least API version %1. Pulling files necessary for debugging. 正在读取调试需要的文件。 - - - Android::Internal::AndroidDeployStepFactory Deploy to Android device or emulator 部署到Android设备或模拟器 - - - Android::Internal::AndroidDeployStepWidget <b>Deploy configurations</b> <b>Deploy 配置</b> @@ -43833,27 +43764,14 @@ Please install an SDK of at least API version %1. Android package (*.apk) Android包 (*.apk) - - - Android::Internal::AndroidDevice Run on Android 在Android上运行 - - Android - Android - - - - Android::Internal::AndroidDeviceFactory Android Device Android设备 - - - Android::Internal::AndroidManager Error creating Android directory '%1'. 创建Android目录 '%1'失败。 @@ -43884,16 +43802,10 @@ Please install at least one SDK. Can't open '%1' 无法打开 '%1' - - - Android::Internal::AndroidPackageCreationFactory Create Android (.apk) Package 创建Android (.apk)包 - - - Android::Internal::AndroidPackageCreationStep Packaging for Android 正在为Android打包 @@ -43912,10 +43824,6 @@ Please make sure your application is built successfully and is selected in Appli 找不到 '%1'。 请确保您的程序构建成功,并且在“应用程序”标签("运行选项")中选中。 - - Error - 错误 - Failed to run keytool 运行keytool失败 @@ -43952,10 +43860,6 @@ Please make sure your application is built successfully and is selected in Appli Package created. 包创建完成。 - - Package deploy: Running command '%1 %2'. - 部署包: 运行命令 '%1 %2'。 - Packaging failed. 打包失败。 @@ -43968,33 +43872,14 @@ Please make sure your application is built successfully and is selected in Appli Packaging Error: Command '%1 %2' failed. 打包错误:命令'%1 %2'失败。 - - Reason: %1 - 原因 %1 - - - Exit code: %1 - 退出代码: %1 - - - Keystore - 密钥存储库 - Keystore password: 密钥存储库的密码: - - Certificate - 证书 - Certificate password (%1): 证书的密码(%1): - - - Android::Internal::AndroidPackageCreationWidget Invalid Package Name 非法的包名 @@ -44033,27 +43918,14 @@ Please choose a valid package name for your application (e.g. "org.example. Select keystore file 选择密钥存储库文件 - - Keystore files (*.keystore *.jks) - 密钥存储库文件 (*.keystore *.jks) - - - - Android::Internal::AndroidPackageInstallationFactory Deploy to device 部署到设备 - - - Android::Internal::AndroidPackageInstallationStep Copy application data 复制应用程序的数据 - - - Android::Internal::AndroidQtVersion Failed to detect the ABIs used by the Qt version. 检测Qt版本使用的ABI失败。 @@ -44063,30 +43935,18 @@ Please choose a valid package name for your application (e.g. "org.example. Qt Version is meant for Android Android - - - Android::Internal::AndroidRunConfiguration Run on Android device 在Android设备上运行 - - - Android::Internal::AndroidRunControl Starting remote process. 启动远端进程。 - - - Android::Internal::AndroidRunControlFactory Run on Android device or emulator. 在Android设备或模拟器上运行。 - - - Android::Internal::AndroidRunner @@ -44131,16 +43991,10 @@ Please choose a valid package name for your application (e.g. "org.example. '%1' 被杀死。 - - - Android::Internal::AndroidSettingsPage Android Configurations Android配置 - - - Android::Internal::AvdModel AVD Name AVD - Android Virtual Device @@ -44154,9 +44008,6 @@ Please choose a valid package name for your application (e.g. "org.example. CPU/ABI CPU/ABI - - - Android::Internal::AndroidSettingsWidget Android SDK Folder Android SDK的目录 @@ -44193,9 +44044,6 @@ Please choose a valid package name for your application (e.g. "org.example. Select OpenJDK Path 选择OpenJDK的路径 - - - Android::Internal::AndroidToolChainFactory Android GCC Android GCC @@ -44208,16 +44056,10 @@ Please choose a valid package name for your application (e.g. "org.example. Android GCC (%1-%2) Android GCC (%1-%2) - - - Android::Internal::AndroidToolChainConfigWidget NDK Root: NDK根目录: - - - AutotoolsProjectManager Autogen Display name for AutotoolsProjectManager::AutogenStep id. diff --git a/share/qtcreator/translations/qtcreator_zh_TW.ts b/share/qtcreator/translations/qtcreator_zh_TW.ts index 179f6d3a3d3..7e2757f30ce 100644 --- a/share/qtcreator/translations/qtcreator_zh_TW.ts +++ b/share/qtcreator/translations/qtcreator_zh_TW.ts @@ -27968,7 +27968,7 @@ should a repository require SSH-authentication (see documentation on SSH and the - AutotoolsProjectManager + Android Autogen Display name for AutotoolsProjectManager::AutogenStep id. @@ -28907,7 +28907,7 @@ references to elements in other files, loops, etc.) - AddNewAVDDialog + Android Create new AVD @@ -28928,9 +28928,6 @@ references to elements in other files, loops, etc.) MiB - - - AndroidCreateKeystoreCertificate Create a keystore and a certificate @@ -29007,9 +29004,6 @@ references to elements in other files, loops, etc.) >AA; - - - AndroidDeployStepWidget Form 表單 @@ -29052,9 +29046,6 @@ This option is useful when you want to try your application on devices which don Choose APK - - - AndroidPackageCreationWidget Manifest @@ -29134,10 +29125,6 @@ This option is useful when you want to try your application on devices which don Discard 丟棄 - - Name: - 名稱: - Libraries 函式庫 @@ -29191,9 +29178,6 @@ This option is useful when you want to try your application on devices which don Certificate alias: - - - AndroidSettingsWidget Android Configuration @@ -29202,10 +29186,6 @@ This option is useful when you want to try your application on devices which don Android SDK location: - - Browse - - Android NDK location: @@ -29258,14 +29238,6 @@ This option is useful when you want to try your application on devices which don Start Android AVD Manager - - Add - 新增 - - - Remove - 移除 - ClearCase @@ -30037,7 +30009,7 @@ This option is useful when you want to try your application on devices which don - Android::Internal::AndroidConfigurations + Android Error Creating AVD @@ -30047,20 +30019,6 @@ This option is useful when you want to try your application on devices which don Please install an SDK of at least API version %1. - - - Android - - Android - - - - - Android::Internal::AndroidCreateKeystoreCertificate - - <span style=" color:#ff0000;">Password is too short</span> - - <span style=" color:#ff0000;">Passwords don't match</span> @@ -30081,23 +30039,10 @@ Please install an SDK of at least API version %1. Error 錯誤 - - - Android::Internal::AndroidDeployConfiguration - - Deploy to Android device - - - - - Android::Internal::AndroidDeployConfigurationFactory Deploy on Android - - - Android::Internal::AndroidDeployStep Deploy to Android device AndroidDeployStep default display name @@ -30155,16 +30100,10 @@ Please install an SDK of at least API version %1. Pulling files necessary for debugging. - - - Android::Internal::AndroidDeployStepFactory Deploy to Android device or emulator - - - Android::Internal::AndroidDeployStepWidget <b>Deploy configurations</b> @@ -30177,27 +30116,14 @@ Please install an SDK of at least API version %1. Android package (*.apk) - - - Android::Internal::AndroidDevice Run on Android - - Android - - - - - Android::Internal::AndroidDeviceFactory Android Device - - - Android::Internal::AndroidManager Error creating Android directory '%1'. @@ -30227,16 +30153,10 @@ Please install at least one SDK. Can't open '%1' - - - Android::Internal::AndroidPackageCreationFactory Create Android (.apk) Package - - - Android::Internal::AndroidPackageCreationStep Packaging for Android @@ -30254,10 +30174,6 @@ Please install at least one SDK. Please make sure your application is built successfully and is selected in Application tab ('Run option'). - - Error - 錯誤 - Failed to run keytool @@ -30294,49 +30210,18 @@ Please make sure your application is built successfully and is selected in Appli Package created. 套件已建立。 - - Package deploy: Running command '%1 %2'. - - Packaging failed. 打包失敗。 - - Packaging error: Could not start command '%1 %2'. Reason: %3 - - - - Packaging Error: Command '%1 %2' failed. - 打包錯誤:指令 '%1' 失敗。 {1 %2'?} - - - Reason: %1 - 原因:%1 - - - Exit code: %1 - 離開代碼:%1 - - - Keystore - - Keystore password: - - Certificate - - Certificate password (%1): - - - Android::Internal::AndroidPackageCreationWidget Invalid Package Name @@ -30374,27 +30259,14 @@ Please choose a valid package name for your application (e.g. "org.example. Select keystore file - - Keystore files (*.keystore *.jks) - - - - - Android::Internal::AndroidPackageInstallationFactory Deploy to device - - - Android::Internal::AndroidPackageInstallationStep Copy application data - - - Android::Internal::AndroidQtVersion Failed to detect the ABIs used by the Qt version. @@ -30404,30 +30276,18 @@ Please choose a valid package name for your application (e.g. "org.example. Qt Version is meant for Android - - - Android::Internal::AndroidRunConfiguration Run on Android device - - - Android::Internal::AndroidRunControl Starting remote process. - - - Android::Internal::AndroidRunControlFactory Run on Android device or emulator. - - - Android::Internal::AndroidRunner @@ -30468,16 +30328,10 @@ Please choose a valid package name for your application (e.g. "org.example. '%1' killed. - - - Android::Internal::AndroidSettingsPage Android Configurations - - - Android::Internal::AvdModel AVD Name AVD - Android Virtual Device @@ -30491,9 +30345,6 @@ Please choose a valid package name for your application (e.g. "org.example. CPU/ABI - - - Android::Internal::AndroidSettingsWidget Android SDK Folder @@ -30530,9 +30381,6 @@ Please choose a valid package name for your application (e.g. "org.example. Select OpenJDK Path - - - Android::Internal::AndroidToolChainFactory Android GCC @@ -30545,9 +30393,6 @@ Please choose a valid package name for your application (e.g. "org.example. Android GCC (%1-%2) - - - Android::Internal::AndroidToolChainConfigWidget NDK Root: diff --git a/src/plugins/android/androidavdmanager.cpp b/src/plugins/android/androidavdmanager.cpp index 2e998efd499..7fdc9960c6d 100644 --- a/src/plugins/android/androidavdmanager.cpp +++ b/src/plugins/android/androidavdmanager.cpp @@ -2,7 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "androidavdmanager.h" - +#include "androidtr.h" #include "avdmanageroutputparser.h" #include @@ -72,8 +72,7 @@ static CreateAvdInfo createAvdCommand(const AndroidConfig &config, const CreateA if (!result.isValid()) { qCDebug(avdManagerLog) << "AVD Create failed. Invalid CreateAvdInfo" << result.name << result.systemImage->displayText() << result.systemImage->apiLevel(); - result.error = QApplication::translate("AndroidAvdManager", - "Cannot create AVD. Invalid input."); + result.error = Tr::tr("Cannot create AVD. Invalid input."); return result; } @@ -99,8 +98,7 @@ static CreateAvdInfo createAvdCommand(const AndroidConfig &config, const CreateA proc.setCommand({avdManagerTool, arguments}); proc.start(); if (!proc.waitForStarted()) { - result.error = QApplication::translate("AndroidAvdManager", - "Could not start process \"%1 %2\"") + result.error = Tr::tr("Could not start process \"%1 %2\"") .arg(avdManagerTool.toString(), arguments.join(' ')); return result; } @@ -131,10 +129,8 @@ static CreateAvdInfo createAvdCommand(const AndroidConfig &config, const CreateA break; // For a sane input and command, process should finish before timeout. - if (checkForTimeout(start, avdCreateTimeoutMs)) { - result.error = QApplication::translate("AndroidAvdManager", - "Cannot create AVD. Command timed out."); - } + if (checkForTimeout(start, avdCreateTimeoutMs)) + result.error = Tr::tr("Cannot create AVD. Command timed out."); } result.error = errorOutput; @@ -244,11 +240,10 @@ bool AndroidAvdManager::startAvdAsync(const QString &avdName) const if (!emulator.exists()) { QMetaObject::invokeMethod(Core::ICore::mainWindow(), [emulator] { QMessageBox::critical(Core::ICore::dialogParent(), - AndroidAvdManager::tr("Emulator Tool Is Missing"), - AndroidAvdManager::tr( - "Install the missing emulator tool (%1) to the" - " installed Android SDK.") - .arg(emulator.displayName())); + Tr::tr("Emulator Tool Is Missing"), + Tr::tr("Install the missing emulator tool (%1) to the" + " installed Android SDK.") + .arg(emulator.displayName())); }); return false; } @@ -263,9 +258,7 @@ bool AndroidAvdManager::startAvdAsync(const QString &avdName) const if (avdProcess->exitCode()) { const QString errorOutput = QString::fromLatin1(avdProcess->readAllStandardOutput()); QMetaObject::invokeMethod(Core::ICore::mainWindow(), [errorOutput] { - const QString title - = QCoreApplication::translate("Android::Internal::AndroidAvdManager", - "AVD Start Error"); + const QString title = Tr::tr("AVD Start Error"); QMessageBox::critical(Core::ICore::dialogParent(), title, errorOutput); }); } diff --git a/src/plugins/android/androidavdmanager.h b/src/plugins/android/androidavdmanager.h index 670016ed7f3..44a8454e65f 100644 --- a/src/plugins/android/androidavdmanager.h +++ b/src/plugins/android/androidavdmanager.h @@ -11,8 +11,6 @@ namespace Android::Internal { class AndroidAvdManager { - Q_DECLARE_TR_FUNCTIONS(Android::Internal::AndroidAvdManager) - public: AndroidAvdManager(const AndroidConfig& config = AndroidConfigurations::currentConfig()); ~AndroidAvdManager(); diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 47ac8a746b3..918a4e39770 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -3,7 +3,6 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "androidbuildapkstep.h" - #include "androidconfigurations.h" #include "androidconstants.h" #include "androidcreatekeystorecertificate.h" @@ -11,9 +10,9 @@ #include "androidmanager.h" #include "androidqtversion.h" #include "androidsdkmanager.h" +#include "androidtr.h" #include "certificatesmodel.h" #include "createandroidmanifestwizard.h" - #include "javaparser.h" #include @@ -76,8 +75,6 @@ const char VerboseOutputKey[] = "VerboseOutput"; class PasswordInputDialog : public QDialog { - Q_DECLARE_TR_FUNCTIONS(Android::Internal::AndroidBuildApkStep) - public: enum Context{ KeystorePassword = 1, @@ -95,7 +92,7 @@ private: std::function verifyCallback = [](const QString &) { return true; }; QLabel *inputContextlabel = new QLabel(this); QLineEdit *inputEdit = new QLineEdit(this); - Utils::InfoLabel *warningLabel = new Utils::InfoLabel(tr("Incorrect password."), + Utils::InfoLabel *warningLabel = new Utils::InfoLabel(::Android::Tr::tr("Incorrect password."), Utils::InfoLabel::Warning, this); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); @@ -105,8 +102,6 @@ private: class AndroidBuildApkWidget : public QWidget { - Q_DECLARE_TR_FUNCTIONS(Android::Internal::AndroidBuildApkStep) - public: explicit AndroidBuildApkWidget(AndroidBuildApkStep *step); @@ -162,7 +157,7 @@ QWidget *AndroidBuildApkWidget::createApplicationGroup() filteredSdkPlatforms(minApiSupported)); targets.removeDuplicates(); - auto group = new QGroupBox(tr("Application"), this); + auto group = new QGroupBox(Tr::tr("Application"), this); auto targetSDKComboBox = new QComboBox(); targetSDKComboBox->addItems(targets); @@ -175,17 +170,17 @@ QWidget *AndroidBuildApkWidget::createApplicationGroup() }); auto formLayout = new QFormLayout(group); - formLayout->addRow(tr("Android build platform SDK:"), targetSDKComboBox); + formLayout->addRow(Tr::tr("Android build platform SDK:"), targetSDKComboBox); - auto createAndroidTemplatesButton = new QPushButton(tr("Create Templates")); + auto createAndroidTemplatesButton = new QPushButton(Tr::tr("Create Templates")); createAndroidTemplatesButton->setToolTip( - tr("Create an Android package for Custom Java code, assets, and Gradle configurations.")); + Tr::tr("Create an Android package for Custom Java code, assets, and Gradle configurations.")); connect(createAndroidTemplatesButton, &QAbstractButton::clicked, this, [this] { CreateAndroidManifestWizard wizard(m_step->buildSystem()); wizard.exec(); }); - formLayout->addRow(tr("Android customization:"), createAndroidTemplatesButton); + formLayout->addRow(Tr::tr("Android customization:"), createAndroidTemplatesButton); return group; } @@ -196,9 +191,9 @@ QWidget *AndroidBuildApkWidget::createSignPackageGroup() sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); - auto group = new QGroupBox(tr("Application Signature"), this); + auto group = new QGroupBox(Tr::tr("Application Signature"), this); - auto keystoreLocationLabel = new QLabel(tr("Keystore:"), group); + auto keystoreLocationLabel = new QLabel(Tr::tr("Keystore:"), group); keystoreLocationLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); auto keystoreLocationChooser = new PathChooser(group); @@ -206,8 +201,8 @@ QWidget *AndroidBuildApkWidget::createSignPackageGroup() keystoreLocationChooser->lineEdit()->setReadOnly(true); keystoreLocationChooser->setFilePath(m_step->keystorePath()); keystoreLocationChooser->setInitialBrowsePathBackup(FileUtils::homePath()); - keystoreLocationChooser->setPromptDialogFilter(tr("Keystore files (*.keystore *.jks)")); - keystoreLocationChooser->setPromptDialogTitle(tr("Select Keystore File")); + keystoreLocationChooser->setPromptDialogFilter(Tr::tr("Keystore files (*.keystore *.jks)")); + keystoreLocationChooser->setPromptDialogTitle(Tr::tr("Select Keystore File")); connect(keystoreLocationChooser, &PathChooser::textChanged, this, [this, keystoreLocationChooser] { const FilePath file = keystoreLocationChooser->rawFilePath(); m_step->setKeystorePath(file); @@ -216,7 +211,7 @@ QWidget *AndroidBuildApkWidget::createSignPackageGroup() setCertificates(); }); - auto keystoreCreateButton = new QPushButton(tr("Create..."), group); + auto keystoreCreateButton = new QPushButton(Tr::tr("Create..."), group); connect(keystoreCreateButton, &QAbstractButton::clicked, this, [this, keystoreLocationChooser] { AndroidCreateKeystoreCertificate d; if (d.exec() != QDialog::Accepted) @@ -229,14 +224,14 @@ QWidget *AndroidBuildApkWidget::createSignPackageGroup() setCertificates(); }); - m_signPackageCheckBox = new QCheckBox(tr("Sign package"), group); + m_signPackageCheckBox = new QCheckBox(Tr::tr("Sign package"), group); m_signPackageCheckBox->setChecked(m_step->signPackage()); - m_signingDebugWarningLabel = new Utils::InfoLabel(tr("Signing a debug package"), + m_signingDebugWarningLabel = new Utils::InfoLabel(Tr::tr("Signing a debug package"), Utils::InfoLabel::Warning, group); m_signingDebugWarningLabel->hide(); - auto certificateAliasLabel = new QLabel(tr("Certificate alias:"), group); + auto certificateAliasLabel = new QLabel(Tr::tr("Certificate alias:"), group); certificateAliasLabel->setAlignment(Qt::AlignRight|Qt::AlignVCenter); m_certificatesAliasComboBox = new QComboBox(group); @@ -267,28 +262,28 @@ QWidget *AndroidBuildApkWidget::createSignPackageGroup() QWidget *AndroidBuildApkWidget::createAdvancedGroup() { - auto group = new QGroupBox(tr("Advanced Actions"), this); + auto group = new QGroupBox(Tr::tr("Advanced Actions"), this); - auto openPackageLocationCheckBox = new QCheckBox(tr("Open package location after build"), group); + auto openPackageLocationCheckBox = new QCheckBox(Tr::tr("Open package location after build"), group); openPackageLocationCheckBox->setChecked(m_step->openPackageLocation()); connect(openPackageLocationCheckBox, &QAbstractButton::toggled, this, [this](bool checked) { m_step->setOpenPackageLocation(checked); }); - m_addDebuggerCheckBox = new QCheckBox(tr("Add debug server"), group); + m_addDebuggerCheckBox = new QCheckBox(Tr::tr("Add debug server"), group); m_addDebuggerCheckBox->setEnabled(false); - m_addDebuggerCheckBox->setToolTip(tr("Packages debug server with " + m_addDebuggerCheckBox->setToolTip(Tr::tr("Packages debug server with " "the APK to enable debugging. For the signed APK this option is unchecked by default.")); m_addDebuggerCheckBox->setChecked(m_step->addDebugger()); connect(m_addDebuggerCheckBox, &QAbstractButton::toggled, m_step, &AndroidBuildApkStep::setAddDebugger); - auto verboseOutputCheckBox = new QCheckBox(tr("Verbose output"), group); + auto verboseOutputCheckBox = new QCheckBox(Tr::tr("Verbose output"), group); verboseOutputCheckBox->setChecked(m_step->verboseOutput()); auto vbox = new QVBoxLayout(group); QtSupport::QtVersion *version = QtSupport::QtKitAspect::qtVersion(m_step->kit()); if (version && version->qtVersion() >= QVersionNumber(5, 14)) { - auto buildAAB = new QCheckBox(tr("Build Android App Bundle (*.aab)"), group); + auto buildAAB = new QCheckBox(Tr::tr("Build Android App Bundle (*.aab)"), group); buildAAB->setChecked(m_step->buildAAB()); connect(buildAAB, &QAbstractButton::toggled, m_step, &AndroidBuildApkStep::setBuildAAB); vbox->addWidget(buildAAB); @@ -305,7 +300,7 @@ QWidget *AndroidBuildApkWidget::createAdvancedGroup() QWidget *AndroidBuildApkWidget::createAdditionalLibrariesGroup() { - auto group = new QGroupBox(tr("Additional Libraries")); + auto group = new QGroupBox(Tr::tr("Additional Libraries")); group->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); auto libsModel = new AndroidExtraLibraryListModel(m_step->buildSystem(), this); @@ -317,32 +312,32 @@ QWidget *AndroidBuildApkWidget::createAdditionalLibrariesGroup() auto libsView = new QListView; libsView->setSelectionMode(QAbstractItemView::ExtendedSelection); - libsView->setToolTip(tr("List of extra libraries to include in Android package and load on startup.")); + libsView->setToolTip(Tr::tr("List of extra libraries to include in Android package and load on startup.")); libsView->setModel(libsModel); auto addLibButton = new QPushButton; - addLibButton->setText(tr("Add...")); - addLibButton->setToolTip(tr("Select library to include in package.")); + addLibButton->setText(Tr::tr("Add...")); + addLibButton->setToolTip(Tr::tr("Select library to include in package.")); addLibButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); connect(addLibButton, &QAbstractButton::clicked, this, [this, libsModel] { QStringList fileNames = QFileDialog::getOpenFileNames(this, - tr("Select additional libraries"), + Tr::tr("Select additional libraries"), QDir::homePath(), - tr("Libraries (*.so)")); + Tr::tr("Libraries (*.so)")); if (!fileNames.isEmpty()) libsModel->addEntries(fileNames); }); auto removeLibButton = new QPushButton; - removeLibButton->setText(tr("Remove")); - removeLibButton->setToolTip(tr("Remove currently selected library from list.")); + removeLibButton->setText(Tr::tr("Remove")); + removeLibButton->setToolTip(Tr::tr("Remove currently selected library from list.")); connect(removeLibButton, &QAbstractButton::clicked, this, [libsModel, libsView] { QModelIndexList removeList = libsView->selectionModel()->selectedIndexes(); libsModel->removeEntries(removeList); }); - m_openSslCheckBox = new QCheckBox(tr("Include prebuilt OpenSSL libraries")); - m_openSslCheckBox->setToolTip(tr("This is useful for apps that use SSL operations. The path " + m_openSslCheckBox = new QCheckBox(Tr::tr("Include prebuilt OpenSSL libraries")); + m_openSslCheckBox->setToolTip(Tr::tr("This is useful for apps that use SSL operations. The path " "can be defined in Edit > Preferences > Devices > Android.")); connect(m_openSslCheckBox, &QAbstractButton::clicked, this, &AndroidBuildApkWidget::onOpenSslCheckBoxChanged); @@ -461,13 +456,13 @@ AndroidBuildApkStep::AndroidBuildApkStep(BuildStepList *parent, Utils::Id id) sdkManager()->latestAndroidSdkPlatform())) { setImmutable(true); - setDisplayName(tr("Build Android APK")); + setDisplayName(Tr::tr("Build Android APK")); } bool AndroidBuildApkStep::init() { if (!AbstractProcessStep::init()) { - reportWarningOrError(tr("\"%1\" step failed initialization.").arg(displayName()), + reportWarningOrError(Tr::tr("\"%1\" step failed initialization.").arg(displayName()), Task::Error); return false; } @@ -476,18 +471,18 @@ bool AndroidBuildApkStep::init() qCDebug(buildapkstepLog) << "Signing enabled"; // check keystore and certificate passwords if (!verifyKeystorePassword() || !verifyCertificatePassword()) { - reportWarningOrError(tr("Keystore/Certificate password verification failed."), + reportWarningOrError(Tr::tr("Keystore/Certificate password verification failed."), Task::Error); return false; } if (buildType() != BuildConfiguration::Release) - reportWarningOrError(tr("Warning: Signing a debug or profile package."), Task::Warning); + reportWarningOrError(Tr::tr("Warning: Signing a debug or profile package."), Task::Warning); } QtSupport::QtVersion *version = QtSupport::QtKitAspect::qtVersion(kit()); if (!version) { - reportWarningOrError(tr("The Qt version for kit %1 is invalid.").arg(kit()->displayName()), + reportWarningOrError(Tr::tr("The Qt version for kit %1 is invalid.").arg(kit()->displayName()), Task::Error); return false; } @@ -497,18 +492,18 @@ bool AndroidBuildApkStep::init() && AndroidConfigurations::currentConfig().preCmdlineSdkToolsInstalled()) { if (!version->sourcePath().pathAppended("src/3rdparty/gradle").exists()) { const QString error - = tr("The installed SDK tools version (%1) does not include Gradle " - "scripts. The minimum Qt version required for Gradle build to work " - "is %2") - .arg(sdkToolsVersion.toString()) - .arg("5.9.0/5.6.3"); + = Tr::tr("The installed SDK tools version (%1) does not include Gradle " + "scripts. The minimum Qt version required for Gradle build to work " + "is %2") + .arg(sdkToolsVersion.toString()) + .arg("5.9.0/5.6.3"); reportWarningOrError(error, Task::Error); return false; } } else if (version->qtVersion() < QVersionNumber(5, 4, 0)) { - const QString error = tr("The minimum Qt version required for Gradle build to work is %1. " - "It is recommended to install the latest Qt version.") - .arg("5.4.0"); + const QString error = Tr::tr("The minimum Qt version required for Gradle build to work is %1. " + "It is recommended to install the latest Qt version.") + .arg("5.4.0"); reportWarningOrError(error, Task::Error); return false; } @@ -516,9 +511,9 @@ bool AndroidBuildApkStep::init() const int minSDKForKit = AndroidManager::minimumSDK(kit()); if (AndroidManager::minimumSDK(target()) < minSDKForKit) { const QString error - = tr("The API level set for the APK is less than the minimum required by the kit." - "\nThe minimum API level required by the kit is %1.") - .arg(minSDKForKit); + = Tr::tr("The API level set for the APK is less than the minimum required by the kit." + "\nThe minimum API level required by the kit is %1.") + .arg(minSDKForKit); reportWarningOrError(error, Task::Error); return false; } @@ -542,14 +537,14 @@ bool AndroidBuildApkStep::init() m_inputFile = AndroidQtVersion::androidDeploymentSettings(target()); if (m_inputFile.isEmpty()) { m_skipBuilding = true; - reportWarningOrError(tr("No valid input file for \"%1\".").arg(target()->activeBuildKey()), + reportWarningOrError(Tr::tr("No valid input file for \"%1\".").arg(target()->activeBuildKey()), Task::Warning); return true; } m_skipBuilding = false; if (m_buildTargetSdk.isEmpty()) { - reportWarningOrError(tr("Android build SDK version is not defined. Check Android settings.") + reportWarningOrError(Tr::tr("Android build SDK version is not defined. Check Android settings.") , Task::Error); return false; } @@ -642,7 +637,7 @@ void AndroidBuildApkStep::processFinished(int exitCode, QProcess::ExitStatus sta bool AndroidBuildApkStep::verifyKeystorePassword() { if (!m_keystorePath.exists()) { - reportWarningOrError(tr("Cannot sign the package. Invalid keystore path (%1).") + reportWarningOrError(Tr::tr("Cannot sign the package. Invalid keystore path (%1).") .arg(m_keystorePath.toString()), Task::Error); return false; } @@ -662,7 +657,7 @@ bool AndroidBuildApkStep::verifyCertificatePassword() { if (!AndroidManager::checkCertificateExists(m_keystorePath.toString(), m_keystorePasswd, m_certificateAlias)) { - reportWarningOrError(tr("Cannot sign the package. Certificate alias %1 does not exist.") + reportWarningOrError(Tr::tr("Cannot sign the package. Certificate alias %1 does not exist.") .arg(m_certificateAlias), Task::Error); return false; } @@ -704,7 +699,7 @@ static bool copyFileIfNewer(const FilePath &sourceFilePath, void AndroidBuildApkStep::doRun() { if (m_skipBuilding) { - reportWarningOrError(tr("Android deploy settings file not found, not building an APK."), + reportWarningOrError(Tr::tr("Android deploy settings file not found, not building an APK."), Task::Error); emit finished(true); return; @@ -716,7 +711,7 @@ void AndroidBuildApkStep::doRun() QtSupport::QtVersion *version = QtSupport::QtKitAspect::qtVersion(kit()); if (!version) { - reportWarningOrError(tr("The Qt version for kit %1 is invalid.") + reportWarningOrError(Tr::tr("The Qt version for kit %1 is invalid.") .arg(kit()->displayName()), Task::Error); return false; } @@ -727,8 +722,8 @@ void AndroidBuildApkStep::doRun() FilePath androidLibsDir = androidBuildDir / "libs" / abi; if (!androidLibsDir.exists()) { if (!androidLibsDir.ensureWritableDir()) { - reportWarningOrError(tr("The Android build folder %1 was not found and could " - "not be created.").arg(androidLibsDir.toUserOutput()), + reportWarningOrError(Tr::tr("The Android build folder %1 was not found and could " + "not be created.").arg(androidLibsDir.toUserOutput()), Task::Error); return false; } else if (version->qtVersion() >= QVersionNumber(6, 0, 0) @@ -743,7 +738,7 @@ void AndroidBuildApkStep::doRun() continue; if (!from.copyFile(to)) { - reportWarningOrError(tr("Cannot copy the target's lib file %1 to the " + reportWarningOrError(Tr::tr("Cannot copy the target's lib file %1 to the " "Android build folder %2.") .arg(fileName, androidLibsDir.toUserOutput()), Task::Error); @@ -774,7 +769,7 @@ void AndroidBuildApkStep::doRun() for (const FilePath &target : targets) { if (!copyFileIfNewer(target, androidLibsDir.pathAppended(target.fileName()))) { reportWarningOrError( - tr("Cannot copy file \"%1\" to Android build libs folder \"%2\".") + Tr::tr("Cannot copy file \"%1\" to Android build libs folder \"%2\".") .arg(target.toUserOutput()).arg(androidLibsDir.toUserOutput()), Task::Error); return false; @@ -799,7 +794,7 @@ void AndroidBuildApkStep::doRun() const FilePath destination = androidLibsDir.pathAppended(target.fileName()); if (!copyFileIfNewer(target, destination)) { reportWarningOrError( - tr("Cannot copy file \"%1\" to Android build libs folder \"%2\".") + Tr::tr("Cannot copy file \"%1\" to Android build libs folder \"%2\".") .arg(target.toUserOutput()).arg(androidLibsDir.toUserOutput()), Task::Error); return false; @@ -831,7 +826,7 @@ void AndroidBuildApkStep::doRun() QFile f{m_inputFile.toString()}; if (!f.open(QIODevice::WriteOnly)) { - reportWarningOrError(tr("Cannot open androiddeployqt input file \"%1\" for writing.") + reportWarningOrError(Tr::tr("Cannot open androiddeployqt input file \"%1\" for writing.") .arg(m_inputFile.toUserOutput()), Task::Error); return false; } @@ -840,7 +835,7 @@ void AndroidBuildApkStep::doRun() }; if (!setup()) { - reportWarningOrError(tr("Cannot set up \"%1\", not building an APK.").arg(displayName()), + reportWarningOrError(Tr::tr("Cannot set up \"%1\", not building an APK.").arg(displayName()), Task::Error); emit finished(false); return; @@ -858,7 +853,7 @@ void AndroidBuildApkStep::reportWarningOrError(const QString &message, Task::Tas void AndroidBuildApkStep::processStarted() { - emit addOutput(tr("Starting: \"%1\" %2") + emit addOutput(Tr::tr("Starting: \"%1\" %2") .arg(m_command.toUserOutput(), m_argumentsPasswordConcealed), BuildStep::OutputFormat::NormalMessage); } @@ -1026,7 +1021,7 @@ QAbstractItemModel *AndroidBuildApkStep::keystoreCertificates() keytoolProc.setCommand({AndroidConfigurations::currentConfig().keytoolPath(), params}); keytoolProc.runBlocking(EventLoopMode::On); if (keytoolProc.result() > ProcessResult::FinishedWithError) - QMessageBox::critical(nullptr, tr("Error"), tr("Failed to run keytool.")); + QMessageBox::critical(nullptr, Tr::tr("Error"), Tr::tr("Failed to run keytool.")); else model = new CertificatesModel(keytoolProc.cleanedStdOut(), this); @@ -1067,13 +1062,13 @@ PasswordInputDialog::PasswordInputDialog(PasswordInputDialog::Context context, connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - setWindowTitle(context == KeystorePassword ? tr("Keystore") : tr("Certificate")); + setWindowTitle(context == KeystorePassword ? Tr::tr("Keystore") : Tr::tr("Certificate")); QString contextStr; if (context == KeystorePassword) - contextStr = tr("Enter keystore password"); + contextStr = Tr::tr("Enter keystore password"); else - contextStr = tr("Enter certificate password"); + contextStr = Tr::tr("Enter certificate password"); contextStr += extraContextStr.isEmpty() ? QStringLiteral(":") : QStringLiteral(" (%1):").arg(extraContextStr); @@ -1099,7 +1094,7 @@ AndroidBuildApkStepFactory::AndroidBuildApkStepFactory() registerStep(Constants::ANDROID_BUILD_APK_ID); setSupportedDeviceType(Constants::ANDROID_DEVICE_TYPE); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - setDisplayName(AndroidBuildApkStep::tr("Build Android APK")); + setDisplayName(Tr::tr("Build Android APK")); setRepeatable(false); } diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 4612f8b9fd6..dd55ccefa07 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -4,10 +4,11 @@ #include "androidconfigurations.h" #include "androidconstants.h" -#include "androidtoolchain.h" #include "androiddevice.h" #include "androidmanager.h" #include "androidqtversion.h" +#include "androidtoolchain.h" +#include "androidtr.h" #include "avddialog.h" #include @@ -658,8 +659,7 @@ QVector AndroidConfig::connectedDevices(QString *error) const adbProc.runBlocking(); if (adbProc.result() != ProcessResult::FinishedWithSuccess) { if (error) - *error = QApplication::translate("AndroidConfiguration", "Could not run: %1") - .arg(cmd.toUserOutput()); + *error = Tr::tr("Could not run: %1").arg(cmd.toUserOutput()); return devices; } QStringList adbDevs = adbProc.allOutput().split('\n', Qt::SkipEmptyParts); @@ -700,9 +700,7 @@ QVector AndroidConfig::connectedDevices(QString *error) const Utils::sort(devices); if (devices.isEmpty() && error) - *error = QApplication::translate("AndroidConfiguration", - "No devices found in output of: %1") - .arg(cmd.toUserOutput()); + *error = Tr::tr("No devices found in output of: %1").arg(cmd.toUserOutput()); return devices; } @@ -1276,7 +1274,7 @@ static QVariant findOrRegisterDebugger(ToolChain *tc, if (existingGdb) return existingGdb->id(); - const QString mainName = AndroidConfigurations::tr("Android Debugger (%1, NDK %2)"); + const QString mainName = Tr::tr("Android Debugger (%1, NDK %2)"); const QString custom = customDebugger ? QString{"Custom "} : QString{}; // debugger not found, register a new one // check lldb @@ -1424,7 +1422,7 @@ void AndroidConfigurations::updateAutomaticKitList() QString versionStr = QLatin1String("Qt %{Qt:Version}"); if (!qt->isAutodetected()) versionStr = QString("%1").arg(qt->displayName()); - k->setUnexpandedDisplayName(tr("Android %1 Clang %2") + k->setUnexpandedDisplayName(Tr::tr("Android %1 Clang %2") .arg(versionStr) .arg(getMultiOrSingleAbiString(abis))); k->setValueSilently(Constants::ANDROID_KIT_NDK, currentConfig().ndkLocation(qt).toString()); diff --git a/src/plugins/android/androidcreatekeystorecertificate.cpp b/src/plugins/android/androidcreatekeystorecertificate.cpp index 9a535aa4d8f..962a8cd2346 100644 --- a/src/plugins/android/androidcreatekeystorecertificate.cpp +++ b/src/plugins/android/androidcreatekeystorecertificate.cpp @@ -1,9 +1,9 @@ // Copyright (C) 2016 BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidcreatekeystorecertificate.h" - #include "androidconfigurations.h" +#include "androidcreatekeystorecertificate.h" +#include "androidtr.h" #include #include @@ -25,7 +25,7 @@ AndroidCreateKeystoreCertificate::AndroidCreateKeystoreCertificate(QWidget *pare : QDialog(parent) { resize(638, 473); - setWindowTitle(tr("Create a keystore and a certificate")); + setWindowTitle(Tr::tr("Create a keystore and a certificate")); m_commonNameLineEdit = new QLineEdit; @@ -44,7 +44,7 @@ AndroidCreateKeystoreCertificate::AndroidCreateKeystoreCertificate(QWidget *pare m_certificateRetypePassLineEdit = new QLineEdit; m_certificateRetypePassLineEdit->setEchoMode(QLineEdit::Password); - m_certificateShowPassCheckBox = new QCheckBox(tr("Show password")); + m_certificateShowPassCheckBox = new QCheckBox(Tr::tr("Show password")); m_validitySpinBox = new QSpinBox; m_validitySpinBox->setRange(10000, 100000); @@ -59,7 +59,7 @@ AndroidCreateKeystoreCertificate::AndroidCreateKeystoreCertificate(QWidget *pare m_keySizeSpinBox = new QSpinBox; m_keySizeSpinBox->setRange(2048, 2097152); - m_samePasswordCheckBox = new QCheckBox(tr("Use Keystore password")); + m_samePasswordCheckBox = new QCheckBox(Tr::tr("Use Keystore password")); m_keystorePassLineEdit = new QLineEdit; m_keystorePassLineEdit->setEchoMode(QLineEdit::Password); @@ -72,7 +72,7 @@ AndroidCreateKeystoreCertificate::AndroidCreateKeystoreCertificate(QWidget *pare m_infoLabel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); m_infoLabel->hide(); - auto keystoreShowPassCheckBox = new QCheckBox(tr("Show password")); + auto keystoreShowPassCheckBox = new QCheckBox(Tr::tr("Show password")); auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Close|QDialogButtonBox::Save); @@ -80,36 +80,36 @@ AndroidCreateKeystoreCertificate::AndroidCreateKeystoreCertificate(QWidget *pare Column { Group { - title(tr("Keystore")), + title(Tr::tr("Keystore")), Form { - tr("Password:"), m_keystorePassLineEdit, br, - tr("Retype password:"), m_keystoreRetypePassLineEdit, br, + Tr::tr("Password:"), m_keystorePassLineEdit, br, + Tr::tr("Retype password:"), m_keystoreRetypePassLineEdit, br, Span(2, keystoreShowPassCheckBox), br, } }, Group { - title(tr("Certificate")), + title(Tr::tr("Certificate")), Form { - tr("Alias name:"), m_certificateAliasLineEdit, br, - tr("Keysize:"), m_keySizeSpinBox, br, - tr("Validity (days):"), m_validitySpinBox, br, - tr("Password:"), m_certificatePassLineEdit, br, - tr("Retype password:"), m_certificateRetypePassLineEdit, br, + Tr::tr("Alias name:"), m_certificateAliasLineEdit, br, + Tr::tr("Keysize:"), m_keySizeSpinBox, br, + Tr::tr("Validity (days):"), m_validitySpinBox, br, + Tr::tr("Password:"), m_certificatePassLineEdit, br, + Tr::tr("Retype password:"), m_certificateRetypePassLineEdit, br, Span(2, m_samePasswordCheckBox), br, Span(2, m_certificateShowPassCheckBox), br, } }, Group { - title(tr("Certificate Distinguished Names")), + title(Tr::tr("Certificate Distinguished Names")), Form { - tr("First and last name:"), m_commonNameLineEdit, br, - tr("Organizational unit (e.g. Necessitas):"), m_organizationUnitLineEdit, br, - tr("Organization (e.g. KDE):"), m_organizationNameLineEdit, br, - tr("City or locality:"), m_localityNameLineEdit, br, - tr("State or province:"), m_stateNameLineEdit, br, - tr("Two-letter country code for this unit (e.g. RO):"), m_countryLineEdit, + Tr::tr("First and last name:"), m_commonNameLineEdit, br, + Tr::tr("Organizational unit (e.g. Necessitas):"), m_organizationUnitLineEdit, br, + Tr::tr("Organization (e.g. KDE):"), m_organizationNameLineEdit, br, + Tr::tr("City or locality:"), m_localityNameLineEdit, br, + Tr::tr("State or province:"), m_stateNameLineEdit, br, + Tr::tr("Two-letter country code for this unit (e.g. RO):"), m_countryLineEdit, } }, @@ -170,12 +170,12 @@ AndroidCreateKeystoreCertificate::PasswordStatus AndroidCreateKeystoreCertificat { if (m_keystorePassLineEdit->text().length() < 6) { m_infoLabel->show(); - m_infoLabel->setText(tr("Keystore password is too short.")); + m_infoLabel->setText(Tr::tr("Keystore password is too short.")); return Invalid; } if (m_keystorePassLineEdit->text() != m_keystoreRetypePassLineEdit->text()) { m_infoLabel->show(); - m_infoLabel->setText(tr("Keystore passwords do not match.")); + m_infoLabel->setText(Tr::tr("Keystore passwords do not match.")); return NoMatch; } @@ -190,12 +190,12 @@ AndroidCreateKeystoreCertificate::PasswordStatus AndroidCreateKeystoreCertificat if (m_certificatePassLineEdit->text().length() < 6) { m_infoLabel->show(); - m_infoLabel->setText(tr("Certificate password is too short.")); + m_infoLabel->setText(Tr::tr("Certificate password is too short.")); return Invalid; } if (m_certificatePassLineEdit->text() != m_certificateRetypePassLineEdit->text()) { m_infoLabel->show(); - m_infoLabel->setText(tr("Certificate passwords do not match.")); + m_infoLabel->setText(Tr::tr("Certificate passwords do not match.")); return NoMatch; } @@ -207,7 +207,7 @@ bool AndroidCreateKeystoreCertificate::checkCertificateAlias() { if (m_certificateAliasLineEdit->text().length() == 0) { m_infoLabel->show(); - m_infoLabel->setText(tr("Certificate alias is missing.")); + m_infoLabel->setText(Tr::tr("Certificate alias is missing.")); return false; } @@ -219,7 +219,7 @@ bool AndroidCreateKeystoreCertificate::checkCountryCode() { if (!m_countryLineEdit->text().contains(QRegularExpression("[A-Z]{2}"))) { m_infoLabel->show(); - m_infoLabel->setText(tr("Invalid country code.")); + m_infoLabel->setText(Tr::tr("Invalid country code.")); return false; } @@ -244,9 +244,9 @@ void AndroidCreateKeystoreCertificate::buttonBoxAccepted() if (!validateUserInput()) return; - m_keystoreFilePath = FileUtils::getSaveFilePath(this, tr("Keystore Filename"), + m_keystoreFilePath = FileUtils::getSaveFilePath(this, Tr::tr("Keystore Filename"), FileUtils::homePath() / "android_release.keystore", - tr("Keystore files (*.keystore *.jks)")); + Tr::tr("Keystore files (*.keystore *.jks)")); if (m_keystoreFilePath.isEmpty()) return; QString distinguishedNames(QString::fromLatin1("CN=%1, O=%2, L=%3, C=%4") @@ -277,7 +277,7 @@ void AndroidCreateKeystoreCertificate::buttonBoxAccepted() genKeyCertProc.runBlocking(EventLoopMode::On); if (genKeyCertProc.result() != ProcessResult::FinishedWithSuccess) { - QMessageBox::critical(this, tr("Error"), + QMessageBox::critical(this, Tr::tr("Error"), genKeyCertProc.exitMessage() + '\n' + genKeyCertProc.allOutput()); return; } diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index 128de01afea..70e8ec4c8ad 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -2,16 +2,17 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androiddeployqtstep.h" -#include "certificatesmodel.h" - -#include "javaparser.h" -#include "androidmanager.h" -#include "androidconstants.h" -#include "androidglobal.h" #include "androidavdmanager.h" -#include "androidqtversion.h" +#include "androidconstants.h" +#include "androiddeployqtstep.h" #include "androiddevice.h" +#include "androidglobal.h" +#include "androidmanager.h" +#include "androidqtversion.h" +#include "androidtr.h" +#include "androidtr.h" +#include "certificatesmodel.h" +#include "javaparser.h" #include #include @@ -71,7 +72,7 @@ AndroidDeployQtStep::AndroidDeployQtStep(BuildStepList *parent, Utils::Id id) m_uninstallPreviousPackage = addAspect(); m_uninstallPreviousPackage->setSettingsKey(UninstallPreviousPackageKey); - m_uninstallPreviousPackage->setLabel(tr("Uninstall the existing app before deployment"), + m_uninstallPreviousPackage->setLabel(Tr::tr("Uninstall the existing app before deployment"), BoolAspect::LabelPlacement::AtCheckBox); m_uninstallPreviousPackage->setValue(false); @@ -91,7 +92,7 @@ bool AndroidDeployQtStep::init() { QtSupport::QtVersion *version = QtSupport::QtKitAspect::qtVersion(kit()); if (!version) { - reportWarningOrError(tr("The Qt version for kit %1 is invalid.").arg(kit()->displayName()), + reportWarningOrError(Tr::tr("The Qt version for kit %1 is invalid.").arg(kit()->displayName()), Task::Error); return false; } @@ -100,19 +101,19 @@ bool AndroidDeployQtStep::init() m_androidABIs = AndroidManager::applicationAbis(target()); if (m_androidABIs.isEmpty()) { - reportWarningOrError(tr("No Android architecture (ABI) is set by the project."), + reportWarningOrError(Tr::tr("No Android architecture (ABI) is set by the project."), Task::Error); return false; } - emit addOutput(tr("Initializing deployment to Android device/simulator"), + emit addOutput(Tr::tr("Initializing deployment to Android device/simulator"), OutputFormat::NormalMessage); RunConfiguration *rc = target()->activeRunConfiguration(); - QTC_ASSERT(rc, reportWarningOrError(tr("The kit's run configuration is invalid."), Task::Error); + QTC_ASSERT(rc, reportWarningOrError(Tr::tr("The kit's run configuration is invalid."), Task::Error); return false); BuildConfiguration *bc = target()->activeBuildConfiguration(); - QTC_ASSERT(bc, reportWarningOrError(tr("The kit's build configuration is invalid."), + QTC_ASSERT(bc, reportWarningOrError(Tr::tr("The kit's build configuration is invalid."), Task::Error); return false); @@ -123,11 +124,11 @@ bool AndroidDeployQtStep::init() // Try to re-use user-provided information from an earlier step of the same type. BuildStepList *bsl = stepList(); - QTC_ASSERT(bsl, reportWarningOrError(tr("The kit's build steps list is invalid."), Task::Error); + QTC_ASSERT(bsl, reportWarningOrError(Tr::tr("The kit's build steps list is invalid."), Task::Error); return false); auto androidDeployQtStep = bsl->firstOfType(); QTC_ASSERT(androidDeployQtStep, - reportWarningOrError(tr("The kit's deploy configuration is invalid."), Task::Error); + reportWarningOrError(Tr::tr("The kit's deploy configuration is invalid."), Task::Error); return false); AndroidDeviceInfo info; if (androidDeployQtStep != this) @@ -147,7 +148,7 @@ bool AndroidDeployQtStep::init() const auto dev = static_cast(DeviceKitAspect::device(kit()).data()); if (!dev) { - reportWarningOrError(tr("No valid deployment device is set."), Task::Error); + reportWarningOrError(Tr::tr("No valid deployment device is set."), Task::Error); return false; } @@ -156,24 +157,24 @@ bool AndroidDeployQtStep::init() m_deviceInfo = info; // Keep around for later steps if (!info.isValid()) { - reportWarningOrError(tr("The deployment device \"%1\" is invalid.") + reportWarningOrError(Tr::tr("The deployment device \"%1\" is invalid.") .arg(dev->displayName()), Task::Error); return false; } const bool abiListNotEmpty = !selectedAbis.isEmpty() && !dev->supportedAbis().isEmpty(); if (abiListNotEmpty && !dev->canSupportAbis(selectedAbis)) { - const QString error = tr("The deployment device \"%1\" does not support the " - "architectures used by the kit.\n" - "The kit supports \"%2\", but the device uses \"%3\".") - .arg(dev->displayName()).arg(selectedAbis.join(", ")) - .arg(dev->supportedAbis().join(", ")); + const QString error = Tr::tr("The deployment device \"%1\" does not support the " + "architectures used by the kit.\n" + "The kit supports \"%2\", but the device uses \"%3\".") + .arg(dev->displayName()).arg(selectedAbis.join(", ")) + .arg(dev->supportedAbis().join(", ")); reportWarningOrError(error, Task::Error); return false; } if (!dev->canHandleDeployments()) { - reportWarningOrError(tr("The deployment device \"%1\" is disconnected.") + reportWarningOrError(Tr::tr("The deployment device \"%1\" is disconnected.") .arg(dev->displayName()), Task::Error); return false; } @@ -182,10 +183,10 @@ bool AndroidDeployQtStep::init() const QtSupport::QtVersion * const qt = QtSupport::QtKitAspect::qtVersion(kit()); if (qt && qt->supportsMultipleQtAbis() && !selectedAbis.contains(info.cpuAbi.first())) { TaskHub::addTask(DeploymentTask(Task::Warning, - tr("Android: The main ABI of the deployment device (%1) is not selected. The app " - "execution or debugging might not work properly. Add it from Projects > Build > " - "Build Steps > qmake > ABIs.") - .arg(info.cpuAbi.first()))); + Tr::tr("Android: The main ABI of the deployment device (%1) is not selected. The app " + "execution or debugging might not work properly. Add it from Projects > Build > " + "Build Steps > qmake > ABIs.") + .arg(info.cpuAbi.first()))); } m_avdName = info.avdName; @@ -198,7 +199,7 @@ bool AndroidDeployQtStep::init() gatherFilesToPull(); - emit addOutput(tr("Deploying to %1").arg(m_serialNumber), OutputFormat::NormalMessage); + emit addOutput(Tr::tr("Deploying to %1").arg(m_serialNumber), OutputFormat::NormalMessage); m_uninstallPreviousPackageRun = m_uninstallPreviousPackage->value(); if (m_uninstallPreviousPackageRun) @@ -209,7 +210,7 @@ bool AndroidDeployQtStep::init() const QString buildKey = target()->activeBuildKey(); const ProjectNode *node = target()->project()->findNodeForBuildKey(buildKey); if (!node) { - reportWarningOrError(tr("The deployment step's project node is invalid."), Task::Error); + reportWarningOrError(Tr::tr("The deployment step's project node is invalid."), Task::Error); return false; } m_apkPath = Utils::FilePath::fromString(node->data(Constants::AndroidApk).toString()); @@ -220,13 +221,13 @@ bool AndroidDeployQtStep::init() } else { QString jsonFile = AndroidQtVersion::androidDeploymentSettings(target()).toString(); if (jsonFile.isEmpty()) { - reportWarningOrError(tr("Cannot find the androiddeployqt input JSON file."), + reportWarningOrError(Tr::tr("Cannot find the androiddeployqt input JSON file."), Task::Error); return false; } m_command = version->hostBinPath(); if (m_command.isEmpty()) { - reportWarningOrError(tr("Cannot find the androiddeployqt tool."), Task::Error); + reportWarningOrError(Tr::tr("Cannot find the androiddeployqt tool."), Task::Error); return false; } m_command = m_command.pathAppended("androiddeployqt").withExecutableSuffix(); @@ -289,12 +290,12 @@ AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy() if (m_uninstallPreviousPackageRun) { packageName = AndroidManager::packageName(m_manifestName); if (packageName.isEmpty()) { - reportWarningOrError(tr("Cannot find the package name from the Android Manifest " - "file \"%1\".").arg(m_manifestName.toUserOutput()), + reportWarningOrError(Tr::tr("Cannot find the package name from the Android Manifest " + "file \"%1\".").arg(m_manifestName.toUserOutput()), Task::Error); return Failure; } - const QString msg = tr("Uninstalling the previous package \"%1\".").arg(packageName); + const QString msg = Tr::tr("Uninstalling the previous package \"%1\".").arg(packageName); qCDebug(deployStepLog) << msg; emit addOutput(msg, OutputFormat::NormalMessage); runCommand({m_adbPath, @@ -325,7 +326,7 @@ AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy() process.start(); - emit addOutput(tr("Starting: \"%1\"").arg(cmd.toUserOutput()), OutputFormat::NormalMessage); + emit addOutput(Tr::tr("Starting: \"%1\"").arg(cmd.toUserOutput()), OutputFormat::NormalMessage); while (!process.waitForFinished(200)) { if (process.state() == QProcess::NotRunning) @@ -341,14 +342,14 @@ AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy() const int exitCode = process.exitCode(); if (exitStatus == QProcess::NormalExit && exitCode == 0) { - emit addOutput(tr("The process \"%1\" exited normally.").arg(m_command.toUserOutput()), + emit addOutput(Tr::tr("The process \"%1\" exited normally.").arg(m_command.toUserOutput()), OutputFormat::NormalMessage); } else if (exitStatus == QProcess::NormalExit) { - const QString error = tr("The process \"%1\" exited with code %2.") - .arg(m_command.toUserOutput(), QString::number(exitCode)); + const QString error = Tr::tr("The process \"%1\" exited with code %2.") + .arg(m_command.toUserOutput(), QString::number(exitCode)); reportWarningOrError(error, Task::Error); } else { - const QString error = tr("The process \"%1\" crashed.").arg(m_command.toUserOutput()); + const QString error = Tr::tr("The process \"%1\" crashed.").arg(m_command.toUserOutput()); reportWarningOrError(error, Task::Error); } @@ -356,13 +357,13 @@ AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy() if (m_uninstallPreviousPackageRun) { deployError = Failure; // Even re-install failed. Set to Failure. reportWarningOrError( - tr("Installing the app failed even after uninstalling the previous one."), + Tr::tr("Installing the app failed even after uninstalling the previous one."), Task::Error); } } else if (exitCode != 0 || exitStatus != QProcess::NormalExit) { // Set the deployError to Failure when no deployError code was detected // but the adb tool failed otherwise relay the detected deployError. - reportWarningOrError(tr("Installing the app failed with an unknown error."), Task::Error); + reportWarningOrError(Tr::tr("Installing the app failed with an unknown error."), Task::Error); deployError = Failure; } @@ -373,7 +374,7 @@ void AndroidDeployQtStep::slotAskForUninstall(DeployErrorCode errorCode) { Q_ASSERT(errorCode > 0); - QString uninstallMsg = tr("Deployment failed with the following errors:\n\n"); + QString uninstallMsg = Tr::tr("Deployment failed with the following errors:\n\n"); uint errorCodeFlags = errorCode; uint mask = 1; while (errorCodeFlags) { @@ -397,9 +398,9 @@ void AndroidDeployQtStep::slotAskForUninstall(DeployErrorCode errorCode) mask <<= 1; } - uninstallMsg.append(tr("\nUninstalling the installed package may solve the issue.\n" - "Do you want to uninstall the existing package?")); - int button = QMessageBox::critical(nullptr, tr("Install failed"), uninstallMsg, + uninstallMsg.append(Tr::tr("\nUninstalling the installed package may solve the issue.\n" + "Do you want to uninstall the existing package?")); + int button = QMessageBox::critical(nullptr, Tr::tr("Install failed"), uninstallMsg, QMessageBox::Yes, QMessageBox::No); m_askForUninstall = button == QMessageBox::Yes; } @@ -410,7 +411,7 @@ bool AndroidDeployQtStep::runImpl() QString serialNumber = AndroidAvdManager().waitForAvd(m_avdName, cancelChecker()); qCDebug(deployStepLog) << "Deploying to AVD:" << m_avdName << serialNumber; if (serialNumber.isEmpty()) { - reportWarningOrError(tr("The deployment AVD \"%1\" cannot be started.") + reportWarningOrError(Tr::tr("The deployment AVD \"%1\" cannot be started.") .arg(m_avdName), Task::Error); return false; } @@ -429,7 +430,7 @@ bool AndroidDeployQtStep::runImpl() } if (!m_filesToPull.isEmpty()) - emit addOutput(tr("Pulling files necessary for debugging."), OutputFormat::NormalMessage); + emit addOutput(Tr::tr("Pulling files necessary for debugging."), OutputFormat::NormalMessage); // Note that values are not necessarily unique, e.g. app_process is looked up in several // directories @@ -442,9 +443,9 @@ bool AndroidDeployQtStep::runImpl() AndroidDeviceInfo::adbSelector(m_serialNumber) << "pull" << itr.key() << itr.value()}); if (!QFileInfo::exists(itr.value())) { - const QString error = tr("Package deploy: Failed to pull \"%1\" to \"%2\".") - .arg(itr.key()) - .arg(itr.value()); + const QString error = Tr::tr("Package deploy: Failed to pull \"%1\" to \"%2\".") + .arg(itr.key()) + .arg(itr.value()); reportWarningOrError(error, Task::Error); } } @@ -493,7 +494,7 @@ void AndroidDeployQtStep::runCommand(const CommandLine &command) { QtcProcess buildProc; buildProc.setTimeoutS(2 * 60); - emit addOutput(tr("Package deploy: Running command \"%1\".").arg(command.toUserOutput()), + emit addOutput(Tr::tr("Package deploy: Running command \"%1\".").arg(command.toUserOutput()), OutputFormat::NormalMessage); buildProc.setCommand(command); @@ -506,14 +507,14 @@ QWidget *AndroidDeployQtStep::createConfigWidget() { auto widget = new QWidget; auto installCustomApkButton = new QPushButton(widget); - installCustomApkButton->setText(tr("Install an APK File")); + installCustomApkButton->setText(Tr::tr("Install an APK File")); connect(installCustomApkButton, &QAbstractButton::clicked, this, [this, widget] { const FilePath packagePath = FileUtils::getOpenFilePath(widget, - tr("Qt Android Installer"), + Tr::tr("Qt Android Installer"), FileUtils::homePath(), - tr("Android package (*.apk)")); + Tr::tr("Android package (*.apk)")); if (!packagePath.isEmpty()) AndroidManager::installQASIPackage(target(), packagePath); }); @@ -582,7 +583,7 @@ AndroidDeployQtStepFactory::AndroidDeployQtStepFactory() setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); setSupportedDeviceType(Constants::ANDROID_DEVICE_TYPE); setRepeatable(false); - setDisplayName(AndroidDeployQtStep::tr("Deploy to Android device")); + setDisplayName(Tr::tr("Deploy to Android device")); } } // Internal diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 4a96b1ccc26..7600c9fd096 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -2,13 +2,13 @@ // Copyright (C) 2016 BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androiddevice.h" - #include "androidavdmanager.h" #include "androidconfigurations.h" #include "androidconstants.h" +#include "androiddevice.h" #include "androidmanager.h" #include "androidsignaloperation.h" +#include "androidtr.h" #include "avddialog.h" #include @@ -75,40 +75,40 @@ AndroidDeviceWidget::AndroidDeviceWidget(const IDevice::Ptr &device) if (!dev->isValid()) return; - formLayout->addRow(AndroidDevice::tr("Device name:"), new QLabel(dev->displayName())); - formLayout->addRow(AndroidDevice::tr("Device type:"), new QLabel(dev->deviceTypeName())); + formLayout->addRow(Tr::tr("Device name:"), new QLabel(dev->displayName())); + formLayout->addRow(Tr::tr("Device type:"), new QLabel(dev->deviceTypeName())); const QString serialNumber = dev->serialNumber(); - const QString printableSerialNumber = serialNumber.isEmpty() ? AndroidDevice::tr("Unknown") + const QString printableSerialNumber = serialNumber.isEmpty() ? Tr::tr("Unknown") : serialNumber; - formLayout->addRow(AndroidDevice::tr("Serial number:"), new QLabel(printableSerialNumber)); + formLayout->addRow(Tr::tr("Serial number:"), new QLabel(printableSerialNumber)); const QString abis = dev->supportedAbis().join(", "); - formLayout->addRow(AndroidDevice::tr("CPU architecture:"), new QLabel(abis)); + formLayout->addRow(Tr::tr("CPU architecture:"), new QLabel(abis)); const auto osString = QString("%1 (SDK %2)").arg(dev->androidVersion()).arg(dev->sdkLevel()); - formLayout->addRow(AndroidDevice::tr("OS version:"), new QLabel(osString)); + formLayout->addRow(Tr::tr("OS version:"), new QLabel(osString)); if (dev->machineType() == IDevice::Hardware) { const QString authorizedStr = dev->deviceState() == IDevice::DeviceReadyToUse - ? AndroidDevice::tr("Yes") - : AndroidDevice::tr("No"); - formLayout->addRow(AndroidDevice::tr("Authorized:"), new QLabel(authorizedStr)); + ? Tr::tr("Yes") + : Tr::tr("No"); + formLayout->addRow(Tr::tr("Authorized:"), new QLabel(authorizedStr)); } if (dev->machineType() == IDevice::Emulator) { const QString targetName = dev->androidTargetName(); - formLayout->addRow(AndroidDevice::tr("Android target flavor:"), new QLabel(targetName)); - formLayout->addRow(AndroidDevice::tr("SD card size:"), new QLabel(dev->sdcardSize())); - formLayout->addRow(AndroidDevice::tr("Skin type:"), new QLabel(dev->skinName())); + formLayout->addRow(Tr::tr("Android target flavor:"), new QLabel(targetName)); + formLayout->addRow(Tr::tr("SD card size:"), new QLabel(dev->sdcardSize())); + formLayout->addRow(Tr::tr("Skin type:"), new QLabel(dev->skinName())); const QString openGlStatus = dev->openGLStatus(); - formLayout->addRow(AndroidDevice::tr("OpenGL status:"), new QLabel(openGlStatus)); + formLayout->addRow(Tr::tr("OpenGL status:"), new QLabel(openGlStatus)); } } QString AndroidDeviceWidget::dialogTitle() { - return AndroidDevice::tr("Android Device Manager"); + return Tr::tr("Android Device Manager"); } bool AndroidDeviceWidget::messageDialog(const QString &msg, QMessageBox::Icon icon, QWidget *parent) @@ -152,13 +152,13 @@ AndroidDevice::AndroidDevice() { setupId(IDevice::AutoDetected, Constants::ANDROID_DEVICE_ID); setType(Constants::ANDROID_DEVICE_TYPE); - setDefaultDisplayName(tr("Run on Android")); - setDisplayType(tr("Android")); + setDefaultDisplayName(Tr::tr("Run on Android")); + setDisplayType(Tr::tr("Android")); setMachineType(IDevice::Hardware); setOsType(OsType::OsTypeOtherUnix); setDeviceState(DeviceDisconnected); - addDeviceAction({tr("Refresh"), [](const IDevice::Ptr &device, QWidget *parent) { + addDeviceAction({Tr::tr("Refresh"), [](const IDevice::Ptr &device, QWidget *parent) { Q_UNUSED(parent) AndroidDeviceManager::instance()->updateDeviceState(device); }}); @@ -166,10 +166,10 @@ AndroidDevice::AndroidDevice() void AndroidDevice::addActionsIfNotFound() { - static const QString startAvdAction = tr("Start AVD"); - static const QString eraseAvdAction = tr("Erase AVD"); - static const QString avdArgumentsAction = tr("AVD Arguments"); - static const QString setupWifi = tr("Setup Wi-Fi"); + static const QString startAvdAction = Tr::tr("Start AVD"); + static const QString eraseAvdAction = Tr::tr("Erase AVD"); + static const QString avdArgumentsAction = Tr::tr("AVD Arguments"); + static const QString setupWifi = Tr::tr("Setup Wi-Fi"); bool hasStartAction = false; bool hasEraseAction = false; @@ -351,32 +351,32 @@ QString AndroidDevice::androidVersion() const QString AndroidDevice::deviceTypeName() const { if (machineType() == Emulator) - return tr("Emulator for \"%1\"").arg(avdSettings()->value("hw.device.name").toString()); - return tr("Physical device"); + return Tr::tr("Emulator for \"%1\"").arg(avdSettings()->value("hw.device.name").toString()); + return Tr::tr("Physical device"); } QString AndroidDevice::skinName() const { const QString skin = avdSettings()->value("skin.name").toString(); - return skin.isEmpty() ? tr("None") : skin; + return skin.isEmpty() ? Tr::tr("None") : skin; } QString AndroidDevice::androidTargetName() const { const QString target = avdSettings()->value("tag.display").toString(); - return target.isEmpty() ? tr("Unknown") : target; + return target.isEmpty() ? Tr::tr("Unknown") : target; } QString AndroidDevice::sdcardSize() const { const QString size = avdSettings()->value("sdcard.size").toString(); - return size.isEmpty() ? tr("Unknown") : size; + return size.isEmpty() ? Tr::tr("Unknown") : size; } QString AndroidDevice::openGLStatus() const { const QString openGL = avdSettings()->value("hw.gpu.enabled").toString(); - return openGL.isEmpty() ? tr("Unknown") : openGL; + return openGL.isEmpty() ? Tr::tr("Unknown") : openGL; } IDevice::DeviceInfo AndroidDevice::deviceInformation() const @@ -475,7 +475,7 @@ void AndroidDeviceManager::eraseAvd(const IDevice::Ptr &device, QWidget *parent) const QString name = static_cast(device.data())->avdName(); const QString question - = AndroidDevice::tr("Erase the Android AVD \"%1\"?\nThis cannot be undone.").arg(name); + = Tr::tr("Erase the Android AVD \"%1\"?\nThis cannot be undone.").arg(name); if (!AndroidDeviceWidget::questionDialog(question, parent)) return; @@ -494,7 +494,7 @@ void AndroidDeviceManager::setupWifiForDevice(const IDevice::Ptr &device, QWidge { if (device->deviceState() != IDevice::DeviceReadyToUse) { AndroidDeviceWidget::infoDialog( - AndroidDevice::tr("The device has to be connected with ADB debugging " + Tr::tr("The device has to be connected with ADB debugging " "enabled to use this feature."), parent); return; } @@ -507,7 +507,7 @@ void AndroidDeviceManager::setupWifiForDevice(const IDevice::Ptr &device, QWidge const SdkToolResult result = AndroidManager::runAdbCommand(args); if (!result.success()) { AndroidDeviceWidget::criticalDialog( - AndroidDevice::tr("Opening connection port %1 failed.").arg(wifiDevicePort), + Tr::tr("Opening connection port %1 failed.").arg(wifiDevicePort), parent); return; } @@ -519,7 +519,7 @@ void AndroidDeviceManager::setupWifiForDevice(const IDevice::Ptr &device, QWidge const SdkToolResult ipRes = AndroidManager::runAdbCommand(args); if (!ipRes.success()) { AndroidDeviceWidget::criticalDialog( - AndroidDevice::tr("Retrieving the device IP address failed."), parent); + Tr::tr("Retrieving the device IP address failed."), parent); return; } @@ -533,7 +533,7 @@ void AndroidDeviceManager::setupWifiForDevice(const IDevice::Ptr &device, QWidge } if (!ipRegex.match(ipParts.last()).hasMatch()) { AndroidDeviceWidget::criticalDialog( - AndroidDevice::tr("The retrieved IP address is invalid."), parent); + Tr::tr("The retrieved IP address is invalid."), parent); return; } @@ -543,7 +543,7 @@ void AndroidDeviceManager::setupWifiForDevice(const IDevice::Ptr &device, QWidge const SdkToolResult connectRes = AndroidManager::runAdbCommand(args); if (!connectRes.success()) { AndroidDeviceWidget::criticalDialog( - AndroidDevice::tr("Connecting to to the device IP \"%1\" failed.").arg(ip), + Tr::tr("Connecting to to the device IP \"%1\" failed.").arg(ip), parent); return; } @@ -559,7 +559,7 @@ void AndroidDeviceManager::handleAvdRemoved() // Remove the device from QtC after it's been removed using avdmanager. DeviceManager::instance()->removeDevice(result.first->id()); } else { - AndroidDeviceWidget::criticalDialog(QObject::tr("An error occurred while removing the " + AndroidDeviceWidget::criticalDialog(Tr::tr("An error occurred while removing the " "Android AVD \"%1\" using avdmanager tool.").arg(name)); } } @@ -577,8 +577,8 @@ void AndroidDeviceManager::setEmulatorArguments(QWidget *parent) "https://developer.android.com/studio/run/emulator-commandline#startup-options"; QInputDialog dialog(parent ? parent : Core::ICore::dialogParent()); - dialog.setWindowTitle(AndroidDevice::tr("Emulator Command-line Startup Options")); - dialog.setLabelText(AndroidDevice::tr("Emulator command-line startup options " + dialog.setWindowTitle(Tr::tr("Emulator Command-line Startup Options")); + dialog.setLabelText(Tr::tr("Emulator command-line startup options " "(Help Web Page):") .arg(helpUrl)); dialog.setTextValue(m_androidConfig.emulatorArgs()); @@ -844,7 +844,7 @@ AndroidDeviceFactory::AndroidDeviceFactory() : IDeviceFactory(Constants::ANDROID_DEVICE_TYPE), m_androidConfig(AndroidConfigurations::currentConfig()) { - setDisplayName(AndroidDevice::tr("Android Device")); + setDisplayName(Tr::tr("Android Device")); setCombinedIcon(":/android/images/androiddevicesmall.png", ":/android/images/androiddevice.png"); @@ -861,7 +861,7 @@ AndroidDeviceFactory::AndroidDeviceFactory() qPrintable(androidDev->avdName())); } else { AndroidDeviceWidget::criticalDialog( - AndroidDevice::tr("The device info returned from AvdDialog is invalid.")); + Tr::tr("The device info returned from AvdDialog is invalid.")); } return IDevice::Ptr(dev); diff --git a/src/plugins/android/androiddevice.h b/src/plugins/android/androiddevice.h index 646cea80c1e..e19ffd96d6d 100644 --- a/src/plugins/android/androiddevice.h +++ b/src/plugins/android/androiddevice.h @@ -22,8 +22,6 @@ namespace Internal { class AndroidDevice final : public ProjectExplorer::IDevice { - Q_DECLARE_TR_FUNCTIONS(Android::Internal::AndroidDevice) - public: AndroidDevice(); diff --git a/src/plugins/android/androiderrormessage.cpp b/src/plugins/android/androiderrormessage.cpp index 3841d80493e..b1db1e7e0b3 100644 --- a/src/plugins/android/androiderrormessage.cpp +++ b/src/plugins/android/androiderrormessage.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "androiderrormessage.h" +#include "androidtr.h" #include @@ -13,34 +14,34 @@ QString AndroidErrorMessage::getMessage(ErrorCode errorCode, const QVariantList Q_UNUSED(parameters) switch (errorCode) { case SDKInstallationError: - return tr("Android: SDK installation error 0x%1").arg(errorCode, 0, 16); + return Tr::tr("Android: SDK installation error 0x%1").arg(errorCode, 0, 16); case NDKInstallationError: - return tr("Android: NDK installation error 0x%1").arg(errorCode, 0, 16); + return Tr::tr("Android: NDK installation error 0x%1").arg(errorCode, 0, 16); case JavaInstallationError: - return tr("Android: Java installation error 0x%1").arg(errorCode, 0, 16); + return Tr::tr("Android: Java installation error 0x%1").arg(errorCode, 0, 16); case AntInstallationError: - return tr("Android: ant installation error 0x%1").arg(errorCode, 0, 16); + return Tr::tr("Android: ant installation error 0x%1").arg(errorCode, 0, 16); case AdbInstallationError: - return tr("Android: adb installation error 0x%1").arg(errorCode, 0, 16); + return Tr::tr("Android: adb installation error 0x%1").arg(errorCode, 0, 16); case DeviceConnectionError: - return tr("Android: Device connection error 0x%1").arg(errorCode, 0, 16); + return Tr::tr("Android: Device connection error 0x%1").arg(errorCode, 0, 16); case DevicePermissionError: - return tr("Android: Device permission error 0x%1").arg(errorCode, 0, 16); + return Tr::tr("Android: Device permission error 0x%1").arg(errorCode, 0, 16); case DeviceAuthorizationError: - return tr("Android: Device authorization error 0x%1").arg(errorCode, 0, 16); + return Tr::tr("Android: Device authorization error 0x%1").arg(errorCode, 0, 16); case DeviceAPILevelError: - return tr("Android: Device API level not supported: error 0x%1").arg(errorCode, 0, 16); + return Tr::tr("Android: Device API level not supported: error 0x%1").arg(errorCode, 0, 16); default: - return tr("Android: Unknown error 0x%1").arg(errorCode, 0, 16); + return Tr::tr("Android: Unknown error 0x%1").arg(errorCode, 0, 16); } } diff --git a/src/plugins/android/androiderrormessage.h b/src/plugins/android/androiderrormessage.h index 5d5b90af4eb..4c7e45b539a 100644 --- a/src/plugins/android/androiderrormessage.h +++ b/src/plugins/android/androiderrormessage.h @@ -11,7 +11,6 @@ namespace Internal { class AndroidErrorMessage { - Q_DECLARE_TR_FUNCTIONS(Android::Internal::AndroidErrorMessage) public: enum ErrorCode { UnknownError = 0x3000, diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 3467e71fb42..65440bb502e 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -1,8 +1,6 @@ // Copyright (C) 2016 BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidmanager.h" - #include "androidavdmanager.h" #include "androidbuildapkstep.h" #include "androidconfigurations.h" @@ -10,10 +8,12 @@ #include "androiddeployqtstep.h" #include "androiddevice.h" #include "androidglobal.h" +#include "androidmanager.h" #include "androidqtversion.h" #include "androidrunconfiguration.h" #include "androidsdkmanager.h" #include "androidtoolchain.h" +#include "androidtr.h" #include #include @@ -505,13 +505,13 @@ QString AndroidManager::androidNameForApiLevel(int x) case 33: return QLatin1String("Android Tiramisu"); default: - return tr("Unknown Android version. API Level: %1").arg(x); + return Tr::tr("Unknown Android version. API Level: %1").arg(x); } } static void raiseError(const QString &reason) { - QMessageBox::critical(nullptr, AndroidManager::tr("Error creating Android templates."), reason); + QMessageBox::critical(nullptr, Tr::tr("Error creating Android templates."), reason); } static bool openXmlFile(QDomDocument &doc, const FilePath &fileName) @@ -521,7 +521,7 @@ static bool openXmlFile(QDomDocument &doc, const FilePath &fileName) return false; if (!doc.setContent(f.readAll())) { - raiseError(AndroidManager::tr("Cannot parse \"%1\".").arg(fileName.toUserOutput())); + raiseError(Tr::tr("Cannot parse \"%1\".").arg(fileName.toUserOutput())); return false; } return true; @@ -560,7 +560,7 @@ void AndroidManager::installQASIPackage(Target *target, const FilePath &packageP if (info.type == IDevice::Emulator) { deviceSerialNumber = AndroidAvdManager().startAvd(info.avdName); if (deviceSerialNumber.isEmpty()) - Core::MessageManager::writeDisrupting(tr("Starting Android virtual device failed.")); + Core::MessageManager::writeDisrupting(Tr::tr("Starting Android virtual device failed.")); } QStringList arguments = AndroidDeviceInfo::adbSelector(deviceSerialNumber); @@ -568,7 +568,7 @@ void AndroidManager::installQASIPackage(Target *target, const FilePath &packageP QString error; if (!runAdbCommandDetached(arguments, &error, true)) Core::MessageManager::writeDisrupting( - tr("Android package installation failed.\n%1").arg(error)); + Tr::tr("Android package installation failed.\n%1").arg(error)); } bool AndroidManager::checkKeystorePassword(const QString &keystorePath, const QString &keystorePasswd) diff --git a/src/plugins/android/androidmanifesteditor.cpp b/src/plugins/android/androidmanifesteditor.cpp index f0d48a5dd32..f45d52b4215 100644 --- a/src/plugins/android/androidmanifesteditor.cpp +++ b/src/plugins/android/androidmanifesteditor.cpp @@ -1,10 +1,11 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidmanifesteditor.h" -#include "androidmanifestdocument.h" -#include "androidmanifesteditorwidget.h" #include "androidconstants.h" +#include "androidmanifestdocument.h" +#include "androidmanifesteditor.h" +#include "androidmanifesteditorwidget.h" +#include "androidtr.h" #include @@ -23,12 +24,12 @@ AndroidManifestEditor::AndroidManifestEditor(AndroidManifestEditorWidget *editor connect(m_actionGroup, &QActionGroup::triggered, this, &AndroidManifestEditor::changeEditorPage); - QAction *generalAction = m_toolBar->addAction(tr("General")); + QAction *generalAction = m_toolBar->addAction(Tr::tr("General")); generalAction->setData(AndroidManifestEditorWidget::General); generalAction->setCheckable(true); m_actionGroup->addAction(generalAction); - QAction *sourceAction = m_toolBar->addAction(tr("XML Source")); + QAction *sourceAction = m_toolBar->addAction(Tr::tr("XML Source")); sourceAction->setData(AndroidManifestEditorWidget::Source); sourceAction->setCheckable(true); m_actionGroup->addAction(sourceAction); diff --git a/src/plugins/android/androidmanifesteditorfactory.cpp b/src/plugins/android/androidmanifesteditorfactory.cpp index 63cb02b4433..9de20831a39 100644 --- a/src/plugins/android/androidmanifesteditorfactory.cpp +++ b/src/plugins/android/androidmanifesteditorfactory.cpp @@ -1,10 +1,11 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidmanifesteditorfactory.h" #include "androidconstants.h" -#include "androidmanifesteditorwidget.h" #include "androidmanifesteditor.h" +#include "androidmanifesteditorfactory.h" +#include "androidmanifesteditorwidget.h" +#include "androidtr.h" #include @@ -18,7 +19,7 @@ AndroidManifestEditorFactory::AndroidManifestEditorFactory() [](Core::IEditor *editor) { return static_cast(editor)->textEditor(); }) { setId(Constants::ANDROID_MANIFEST_EDITOR_ID); - setDisplayName(AndroidManifestEditorWidget::tr("Android Manifest editor")); + setDisplayName(Tr::tr("Android Manifest editor")); addMimeType(Constants::ANDROID_MANIFEST_MIME_TYPE); setEditorCreator([] { auto androidManifestEditorWidget = new AndroidManifestEditorWidget; diff --git a/src/plugins/android/androidmanifesteditoriconcontainerwidget.cpp b/src/plugins/android/androidmanifesteditoriconcontainerwidget.cpp index 30770980dc3..5b8e4a5a739 100644 --- a/src/plugins/android/androidmanifesteditoriconcontainerwidget.cpp +++ b/src/plugins/android/androidmanifesteditoriconcontainerwidget.cpp @@ -3,6 +3,7 @@ #include "androidmanifesteditoriconcontainerwidget.h" #include "androidmanifesteditoriconwidget.h" +#include "androidtr.h" #include @@ -37,7 +38,8 @@ AndroidManifestEditorIconContainerWidget::AndroidManifestEditorIconContainerWidg auto masterIconButton = new AndroidManifestEditorIconWidget(this, lowDpiIconSize, lowDpiIconSize, - tr("Master icon"), tr("Select master icon.")); + Tr::tr("Master icon"), + Tr::tr("Select master icon.")); masterIconButton->setIcon(QIcon::fromTheme(QLatin1String("document-open"), Utils::Icons::OPENFILE.icon())); iconLayout->addWidget(masterIconButton); iconLayout->addStretch(1); @@ -53,8 +55,8 @@ AndroidManifestEditorIconContainerWidget::AndroidManifestEditorIconContainerWidg auto lIconButton = new AndroidManifestEditorIconWidget(this, lowDpiIconSize, lowDpiIconSize, - tr("LDPI icon"), - tr("Select an icon suitable for low-density (ldpi) screens (~120dpi)."), + Tr::tr("LDPI icon"), + Tr::tr("Select an icon suitable for low-density (ldpi) screens (~120dpi)."), textEditorWidget, lowDpiIconPath, iconFileName); @@ -65,8 +67,8 @@ AndroidManifestEditorIconContainerWidget::AndroidManifestEditorIconContainerWidg auto mIconButton = new AndroidManifestEditorIconWidget(this, mediumDpiIconSize, mediumDpiIconSize, - tr("MDPI icon"), - tr("Select an icon for medium-density (mdpi) screens (~160dpi)."), + Tr::tr("MDPI icon"), + Tr::tr("Select an icon for medium-density (mdpi) screens (~160dpi)."), textEditorWidget, mediumDpiIconPath, iconFileName); @@ -77,8 +79,8 @@ AndroidManifestEditorIconContainerWidget::AndroidManifestEditorIconContainerWidg auto hIconButton = new AndroidManifestEditorIconWidget(this, highDpiIconSize, highDpiIconSize, - tr("HDPI icon"), - tr("Select an icon for high-density (hdpi) screens (~240dpi)."), + Tr::tr("HDPI icon"), + Tr::tr("Select an icon for high-density (hdpi) screens (~240dpi)."), textEditorWidget, highDpiIconPath, iconFileName); @@ -89,8 +91,8 @@ AndroidManifestEditorIconContainerWidget::AndroidManifestEditorIconContainerWidg auto xhIconButton = new AndroidManifestEditorIconWidget(this, extraHighDpiIconSize, extraHighDpiIconSize, - tr("XHDPI icon"), - tr("Select an icon for extra-high-density (xhdpi) screens (~320dpi)."), + Tr::tr("XHDPI icon"), + Tr::tr("Select an icon for extra-high-density (xhdpi) screens (~320dpi)."), textEditorWidget, extraHighDpiIconPath, iconFileName); @@ -101,8 +103,8 @@ AndroidManifestEditorIconContainerWidget::AndroidManifestEditorIconContainerWidg auto xxhIconButton = new AndroidManifestEditorIconWidget(this, extraExtraHighDpiIconSize, extraExtraHighDpiIconSize, - tr("XXHDPI icon"), - tr("Select an icon for extra-extra-high-density (xxhdpi) screens (~480dpi)."), + Tr::tr("XXHDPI icon"), + Tr::tr("Select an icon for extra-extra-high-density (xxhdpi) screens (~480dpi)."), textEditorWidget, extraExtraHighDpiIconPath, iconFileName); @@ -113,8 +115,8 @@ AndroidManifestEditorIconContainerWidget::AndroidManifestEditorIconContainerWidg auto xxxhIconButton = new AndroidManifestEditorIconWidget(this, extraExtraExtraHighDpiIconSize, extraExtraExtraHighDpiIconSize, - tr("XXXHDPI icon"), - tr("Select an icon for extra-extra-extra-high-density (xxxhdpi) screens (~640dpi)."), + Tr::tr("XXXHDPI icon"), + Tr::tr("Select an icon for extra-extra-extra-high-density (xxxhdpi) screens (~640dpi)."), textEditorWidget, extraExtraExtraHighDpiIconPath, iconFileName); diff --git a/src/plugins/android/androidmanifesteditoriconwidget.cpp b/src/plugins/android/androidmanifesteditoriconwidget.cpp index 770baf761a4..037ed684ca3 100644 --- a/src/plugins/android/androidmanifesteditoriconwidget.cpp +++ b/src/plugins/android/androidmanifesteditoriconwidget.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "androidmanifesteditoriconwidget.h" +#include "androidtr.h" #include #include @@ -65,10 +66,10 @@ AndroidManifestEditorIconWidget::AndroidManifestEditorIconWidget( m_scaleWarningLabel->setMinimumSize(clearAndWarningSize); m_scaleWarningLabel->setMaximumSize(clearAndWarningSize); m_scaleWarningLabel->setPixmap(Utils::Icons::WARNING.icon().pixmap(clearAndWarningSize)); - m_scaleWarningLabel->setToolTip(tr("Icon scaled up.")); + m_scaleWarningLabel->setToolTip(Tr::tr("Icon scaled up.")); m_scaleWarningLabel->setVisible(false); } - auto label = new QLabel(tr("Click to select..."), parent); + auto label = new QLabel(Tr::tr("Click to select..."), parent); iconLayout->addWidget(iconTitle); iconLayout->setAlignment(iconTitle, Qt::AlignHCenter); iconLayout->addStretch(50); @@ -144,7 +145,7 @@ void AndroidManifestEditorIconWidget::selectIcon() { FilePath file = FileUtils::getOpenFilePath(this, m_iconSelectionText, FileUtils::homePath(), - tr("Images (*.png *.jpg *.jpeg *.webp *.svg)")); + Tr::tr("Images (*.png *.jpg *.jpeg *.webp *.svg)")); // TODO: See SplashContainterWidget if (file.isEmpty()) return; setIconFromPath(file); diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp index 04bd7446b52..83095383917 100644 --- a/src/plugins/android/androidmanifesteditorwidget.cpp +++ b/src/plugins/android/androidmanifesteditorwidget.cpp @@ -1,14 +1,15 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidmanifesteditorwidget.h" -#include "androidmanifesteditoriconcontainerwidget.h" -#include "androidmanifesteditor.h" #include "androidconfigurations.h" #include "androidconstants.h" -#include "androidmanifestdocument.h" #include "androidmanager.h" +#include "androidmanifestdocument.h" +#include "androidmanifesteditor.h" +#include "androidmanifesteditoriconcontainerwidget.h" +#include "androidmanifesteditorwidget.h" #include "androidservicewidget.h" +#include "androidtr.h" #include "splashscreencontainerwidget.h" #include @@ -116,15 +117,15 @@ AndroidManifestEditorWidget::AndroidManifestEditorWidget() QGroupBox *AndroidManifestEditorWidget::createPermissionsGroupBox(QWidget *parent) { auto permissionsGroupBox = new QGroupBox(parent); - permissionsGroupBox->setTitle(tr("Permissions")); + permissionsGroupBox->setTitle(Tr::tr("Permissions")); auto layout = new QGridLayout(permissionsGroupBox); m_defaultPermissonsCheckBox = new QCheckBox(this); - m_defaultPermissonsCheckBox->setText(tr("Include default permissions for Qt modules.")); + m_defaultPermissonsCheckBox->setText(Tr::tr("Include default permissions for Qt modules.")); layout->addWidget(m_defaultPermissonsCheckBox, 0, 0); m_defaultFeaturesCheckBox = new QCheckBox(this); - m_defaultFeaturesCheckBox->setText(tr("Include default features for Qt modules.")); + m_defaultFeaturesCheckBox->setText(Tr::tr("Include default features for Qt modules.")); layout->addWidget(m_defaultFeaturesCheckBox, 1, 0); m_permissionsComboBox = new QComboBox(permissionsGroupBox); @@ -264,7 +265,7 @@ QGroupBox *AndroidManifestEditorWidget::createPermissionsGroupBox(QWidget *paren layout->addWidget(m_permissionsComboBox, 2, 0); m_addPermissionButton = new QPushButton(permissionsGroupBox); - m_addPermissionButton->setText(tr("Add")); + m_addPermissionButton->setText(Tr::tr("Add")); layout->addWidget(m_addPermissionButton, 2, 1); m_permissionsModel = new PermissionsModel(this); @@ -274,7 +275,7 @@ QGroupBox *AndroidManifestEditorWidget::createPermissionsGroupBox(QWidget *paren layout->addWidget(m_permissionsListView, 3, 0, 3, 1); m_removePermissionButton = new QPushButton(permissionsGroupBox); - m_removePermissionButton->setText(tr("Remove")); + m_removePermissionButton->setText(Tr::tr("Remove")); layout->addWidget(m_removePermissionButton, 3, 1); permissionsGroupBox->setLayout(layout); @@ -297,11 +298,11 @@ QGroupBox *AndroidManifestEditorWidget::createPermissionsGroupBox(QWidget *paren QGroupBox *AndroidManifestEditorWidget::createPackageFormLayout(QWidget *parent) { auto packageGroupBox = new QGroupBox(parent); - packageGroupBox->setTitle(tr("Package")); + packageGroupBox->setTitle(Tr::tr("Package")); auto formLayout = new QFormLayout(); m_packageNameLineEdit = new QLineEdit(packageGroupBox); - m_packageNameLineEdit->setToolTip(tr( + m_packageNameLineEdit->setToolTip(Tr::tr( "

Please choose a valid package name for your application (for " "example, \"org.example.myapplication\").

Packages are usually " "defined using a hierarchical naming pattern, with levels in the hierarchy separated " @@ -313,10 +314,10 @@ QGroupBox *AndroidManifestEditorWidget::createPackageFormLayout(QWidget *parent) "conventions for disambiguating package names and rules for naming packages when the " "Internet domain name cannot be directly used as a package name are described in " "section 7.7 of the Java Language Specification.

")); - formLayout->addRow(tr("Package name:"), m_packageNameLineEdit); + formLayout->addRow(Tr::tr("Package name:"), m_packageNameLineEdit); m_packageNameWarning = new QLabel; - m_packageNameWarning->setText(tr("The package name is not valid.")); + m_packageNameWarning->setText(Tr::tr("The package name is not valid.")); m_packageNameWarning->setVisible(false); m_packageNameWarningIcon = new QLabel; @@ -332,25 +333,25 @@ QGroupBox *AndroidManifestEditorWidget::createPackageFormLayout(QWidget *parent) formLayout->addRow(QString(), warningRow); m_versionCodeLineEdit = new QLineEdit(packageGroupBox); - formLayout->addRow(tr("Version code:"), m_versionCodeLineEdit); + formLayout->addRow(Tr::tr("Version code:"), m_versionCodeLineEdit); m_versionNameLinedit = new QLineEdit(packageGroupBox); - formLayout->addRow(tr("Version name:"), m_versionNameLinedit); + formLayout->addRow(Tr::tr("Version name:"), m_versionNameLinedit); m_androidMinSdkVersion = new QComboBox(packageGroupBox); m_androidMinSdkVersion->setToolTip( - tr("Sets the minimum required version on which this application can be run.")); - m_androidMinSdkVersion->addItem(tr("Not set"), 0); + Tr::tr("Sets the minimum required version on which this application can be run.")); + m_androidMinSdkVersion->addItem(Tr::tr("Not set"), 0); - formLayout->addRow(tr("Minimum required SDK:"), m_androidMinSdkVersion); + formLayout->addRow(Tr::tr("Minimum required SDK:"), m_androidMinSdkVersion); m_androidTargetSdkVersion = new QComboBox(packageGroupBox); m_androidTargetSdkVersion->setToolTip( - tr("Sets the target SDK. Set this to the highest tested version. " - "This disables compatibility behavior of the system for your application.")); - m_androidTargetSdkVersion->addItem(tr("Not set"), 0); + Tr::tr("Sets the target SDK. Set this to the highest tested version. " + "This disables compatibility behavior of the system for your application.")); + m_androidTargetSdkVersion->addItem(Tr::tr("Not set"), 0); - formLayout->addRow(tr("Target SDK:"), m_androidTargetSdkVersion); + formLayout->addRow(Tr::tr("Target SDK:"), m_androidTargetSdkVersion); packageGroupBox->setLayout(formLayout); @@ -370,17 +371,17 @@ QGroupBox *AndroidManifestEditorWidget::createPackageFormLayout(QWidget *parent) QGroupBox *Android::Internal::AndroidManifestEditorWidget::createApplicationGroupBox(QWidget *parent) { auto applicationGroupBox = new QGroupBox(parent); - applicationGroupBox->setTitle(tr("Application")); + applicationGroupBox->setTitle(Tr::tr("Application")); auto formLayout = new QFormLayout(); m_appNameLineEdit = new QLineEdit(applicationGroupBox); - formLayout->addRow(tr("Application name:"), m_appNameLineEdit); + formLayout->addRow(Tr::tr("Application name:"), m_appNameLineEdit); m_activityNameLineEdit = new QLineEdit(applicationGroupBox); - formLayout->addRow(tr("Activity name:"), m_activityNameLineEdit); + formLayout->addRow(Tr::tr("Activity name:"), m_activityNameLineEdit); m_styleExtractMethod = new QComboBox(applicationGroupBox); - formLayout->addRow(tr("Style extraction:"), m_styleExtractMethod); + formLayout->addRow(Tr::tr("Style extraction:"), m_styleExtractMethod); const QList styleMethodsMap = { {"default", "In most cases this will be the same as \"full\", but it can also be something else " @@ -394,7 +395,7 @@ QGroupBox *Android::Internal::AndroidManifestEditorWidget::createApplicationGrou } m_screenOrientation = new QComboBox(applicationGroupBox); - formLayout->addRow(tr("Screen orientation:"), m_screenOrientation); + formLayout->addRow(Tr::tr("Screen orientation:"), m_screenOrientation); // https://developer.android.com/guide/topics/manifest/activity-element#screen const QList screenOrientationMap = { {"unspecified", "The default value. The system chooses the orientation. The policy it uses, and therefore the " @@ -443,19 +444,19 @@ QGroupBox *Android::Internal::AndroidManifestEditorWidget::createApplicationGrou QGroupBox *AndroidManifestEditorWidget::createAdvancedGroupBox(QWidget *parent) { auto otherGroupBox = new QGroupBox(parent); - otherGroupBox->setTitle(tr("Advanced")); + otherGroupBox->setTitle(Tr::tr("Advanced")); m_advanvedTabWidget = new QTabWidget(otherGroupBox); auto formLayout = new QFormLayout(); m_iconButtons = new AndroidManifestEditorIconContainerWidget(otherGroupBox, m_textEditorWidget); - m_advanvedTabWidget->addTab(m_iconButtons, tr("Application icon")); + m_advanvedTabWidget->addTab(m_iconButtons, Tr::tr("Application icon")); m_services = new AndroidServiceWidget(otherGroupBox); - m_advanvedTabWidget->addTab(m_services, tr("Android services")); + m_advanvedTabWidget->addTab(m_services, Tr::tr("Android services")); m_splashButtons = new SplashScreenContainerWidget(otherGroupBox, m_textEditorWidget); - m_advanvedTabWidget->addTab(m_splashButtons, tr("Splash screen")); + m_advanvedTabWidget->addTab(m_splashButtons, Tr::tr("Splash screen")); connect(m_services, &AndroidServiceWidget::servicesModified, this, [this] { setDirty(); }); connect(m_services, &AndroidServiceWidget::servicesModified, @@ -556,8 +557,8 @@ bool AndroidManifestEditorWidget::setActivePage(EditorPage page) if (page == Source) { if (!servicesValid(m_services->services())) { - QMessageBox::critical(nullptr, tr("Service Definition Invalid"), - tr("Cannot switch to source when there are invalid services.")); + QMessageBox::critical(nullptr, Tr::tr("Service Definition Invalid"), + Tr::tr("Cannot switch to source when there are invalid services.")); m_advanvedTabWidget->setCurrentIndex(1); return false; } @@ -583,8 +584,8 @@ void AndroidManifestEditorWidget::preSave() { if (activePage() != Source) { if (!servicesValid(m_services->services())) { - QMessageBox::critical(nullptr, tr("Service Definition Invalid"), - tr("Cannot save when there are invalid services.")); + QMessageBox::critical(nullptr, Tr::tr("Service Definition Invalid"), + Tr::tr("Cannot save when there are invalid services.")); return; } syncToEditor(); @@ -644,13 +645,13 @@ bool AndroidManifestEditorWidget::checkDocument(const QDomDocument &doc, QString { QDomElement manifest = doc.documentElement(); if (manifest.tagName() != QLatin1String("manifest")) { - *errorMessage = tr("The structure of the Android manifest file is corrupted. Expected a top level 'manifest' node."); + *errorMessage = Tr::tr("The structure of the Android manifest file is corrupted. Expected a top level 'manifest' node."); *errorLine = -1; *errorColumn = -1; return false; } else if (manifest.firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity")).isNull()) { // missing either application or activity element - *errorMessage = tr("The structure of the Android manifest file is corrupted. Expected an 'application' and 'activity' sub node."); + *errorMessage = Tr::tr("The structure of the Android manifest file is corrupted. Expected an 'application' and 'activity' sub node."); *errorLine = -1; *errorColumn = -1; return false; @@ -699,8 +700,8 @@ void AndroidManifestEditorWidget::updateSdkVersions() } for (int i = minSdk; i <= targetSdk; ++i) { - const QString apiStr = tr("API %1: %2").arg(i) - .arg(AndroidManager::androidNameForApiLevel(i)); + const QString apiStr = Tr::tr("API %1: %2").arg(i) + .arg(AndroidManager::androidNameForApiLevel(i)); m_androidMinSdkVersion->addItem(apiStr, i); m_androidTargetSdkVersion->addItem(apiStr, i); } @@ -711,11 +712,11 @@ void AndroidManifestEditorWidget::updateInfoBar(const QString &errorMessage, int Utils::InfoBar *infoBar = m_textEditorWidget->textDocument()->infoBar(); QString text; if (line < 0) - text = tr("Could not parse file: \"%1\".").arg(errorMessage); + text = Tr::tr("Could not parse file: \"%1\".").arg(errorMessage); else - text = tr("%2: Could not parse file: \"%1\".").arg(errorMessage).arg(line); + text = Tr::tr("%2: Could not parse file: \"%1\".").arg(errorMessage).arg(line); Utils::InfoBarEntry infoBarEntry(infoBarId, text); - infoBarEntry.addCustomButton(tr("Goto error"), [this] { + infoBarEntry.addCustomButton(Tr::tr("Goto error"), [this] { m_textEditorWidget->gotoLine(m_errorLine, m_errorColumn); }); infoBar->removeInfo(infoBarId); @@ -741,8 +742,8 @@ void AndroidManifestEditorWidget::setInvalidServiceInfo() if (m_textEditorWidget->textDocument()->infoBar()->containsInfo(id)) return; Utils::InfoBarEntry info(id, - tr("Services invalid. " - "Manifest cannot be saved. Correct the service definitions before saving.")); + Tr::tr("Services invalid. " + "Manifest cannot be saved. Correct the service definitions before saving.")); m_textEditorWidget->textDocument()->infoBar()->addInfo(info); } diff --git a/src/plugins/android/androidpackageinstallationstep.cpp b/src/plugins/android/androidpackageinstallationstep.cpp index 5757fa8a233..0cc5dc5539c 100644 --- a/src/plugins/android/androidpackageinstallationstep.cpp +++ b/src/plugins/android/androidpackageinstallationstep.cpp @@ -1,10 +1,10 @@ // Copyright (C) 2016 BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidpackageinstallationstep.h" - #include "androidconstants.h" #include "androidmanager.h" +#include "androidpackageinstallationstep.h" +#include "androidtr.h" #include #include @@ -39,8 +39,6 @@ namespace Internal { class AndroidPackageInstallationStep final : public AbstractProcessStep { - Q_DECLARE_TR_FUNCTIONS(Android::AndroidPackageInstallationStep) - public: AndroidPackageInstallationStep(BuildStepList *bsl, Id id); @@ -58,11 +56,11 @@ private: AndroidPackageInstallationStep::AndroidPackageInstallationStep(BuildStepList *bsl, Id id) : AbstractProcessStep(bsl, id) { - setDisplayName(tr("Copy application data")); + setDisplayName(Tr::tr("Copy application data")); setWidgetExpandedByDefault(false); setImmutable(true); setSummaryUpdater([this] { - return tr("Make install: Copy App Files to %1") + return Tr::tr("Make install: Copy App Files to %1") .arg(QDir::toNativeSeparators(nativeAndroidBuildPath())); }); setUseEnglishOutput(); @@ -71,13 +69,13 @@ AndroidPackageInstallationStep::AndroidPackageInstallationStep(BuildStepList *bs bool AndroidPackageInstallationStep::init() { if (!AbstractProcessStep::init()) { - reportWarningOrError(tr("\"%1\" step failed initialization.").arg(displayName()), + reportWarningOrError(Tr::tr("\"%1\" step failed initialization.").arg(displayName()), Task::TaskType::Error); return false; } ToolChain *tc = ToolChainKitAspect::cxxToolChain(kit()); - QTC_ASSERT(tc, reportWarningOrError(tr("\"%1\" step has an invalid C++ toolchain.") + QTC_ASSERT(tc, reportWarningOrError(Tr::tr("\"%1\" step has an invalid C++ toolchain.") .arg(displayName()), Task::TaskType::Error); return false); @@ -128,10 +126,10 @@ void AndroidPackageInstallationStep::doRun() for (const QString &dir : qAsConst(m_androidDirsToClean)) { FilePath androidDir = FilePath::fromString(dir); if (!dir.isEmpty() && androidDir.exists()) { - emit addOutput(tr("Removing directory %1").arg(dir), OutputFormat::NormalMessage); + emit addOutput(Tr::tr("Removing directory %1").arg(dir), OutputFormat::NormalMessage); if (!androidDir.removeRecursively(&error)) { - reportWarningOrError(tr("Failed to clean \"%1\" from the previous build, with " - "error:\n%2").arg(androidDir.toUserOutput()).arg(error), + reportWarningOrError(Tr::tr("Failed to clean \"%1\" from the previous build, with " + "error:\n%2").arg(androidDir.toUserOutput()).arg(error), Task::TaskType::Error); emit finished(false); return; @@ -183,7 +181,7 @@ AndroidPackageInstallationFactory::AndroidPackageInstallationFactory() setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); setSupportedDeviceType(Android::Constants::ANDROID_DEVICE_TYPE); setRepeatable(false); - setDisplayName(AndroidPackageInstallationStep::tr("Deploy to device")); + setDisplayName(Tr::tr("Deploy to device")); } } // namespace Internal diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp index 2a7a048ed1c..f3f92a5e56a 100644 --- a/src/plugins/android/androidplugin.cpp +++ b/src/plugins/android/androidplugin.cpp @@ -1,8 +1,6 @@ // Copyright (C) 2016 BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidplugin.h" - #include "androidconfigurations.h" #include "androidconstants.h" #include "androiddebugsupport.h" @@ -11,6 +9,7 @@ #include "androidmanager.h" #include "androidmanifesteditorfactory.h" #include "androidpackageinstallationstep.h" +#include "androidplugin.h" #include "androidpotentialkit.h" #include "androidqmlpreviewworker.h" #include "androidqmltoolingsupport.h" @@ -19,6 +18,7 @@ #include "androidruncontrol.h" #include "androidsettingswidget.h" #include "androidtoolchain.h" +#include "androidtr.h" #include "javaeditor.h" #include "javalanguageserver.h" @@ -58,8 +58,7 @@ public: { setConfigBaseId("Qt4ProjectManager.AndroidDeployConfiguration2"); addSupportedTargetDeviceType(Constants::ANDROID_DEVICE_TYPE); - setDefaultDisplayName(QCoreApplication::translate("Android::Internal", - "Deploy to Android Device")); + setDefaultDisplayName(Tr::tr("Deploy to Android Device")); addInitialStep(Constants::ANDROID_DEPLOY_QT_ID); } }; @@ -133,7 +132,7 @@ bool AndroidPlugin::initialize(const QStringList &arguments, QString *errorMessa this, &AndroidPlugin::kitsRestored); LanguageClient::LanguageClientSettings::registerClientType({Android::Constants::JLS_SETTINGS_ID, - tr("Java Language Server"), + Tr::tr("Java Language Server"), []() { return new JLSSettings; }}); return true; @@ -169,12 +168,12 @@ void AndroidPlugin::askUserAboutAndroidSetup() return; Utils::InfoBarEntry - info(kSetupAndroidSetting, - tr("Would you like to configure Android options? This will ensure " - "Android kits can be usable and all essential packages are installed. " - "To do it later, select Edit > Preferences > Devices > Android."), - Utils::InfoBarEntry::GlobalSuppression::Enabled); - info.addCustomButton(tr("Configure Android"), [this] { + info(kSetupAndroidSetting, + Tr::tr("Would you like to configure Android options? This will ensure " + "Android kits can be usable and all essential packages are installed. " + "To do it later, select Edit > Preferences > Devices > Android."), + Utils::InfoBarEntry::GlobalSuppression::Enabled); + info.addCustomButton(Tr::tr("Configure Android"), [this] { Core::ICore::infoBar()->removeInfo(kSetupAndroidSetting); Core::ICore::infoBar()->globallySuppressInfo(kSetupAndroidSetting); QTimer::singleShot(0, this, [this] { d->potentialKit.executeFromMenu(); }); diff --git a/src/plugins/android/androidpotentialkit.cpp b/src/plugins/android/androidpotentialkit.cpp index 09564f76625..d17ca19e8b3 100644 --- a/src/plugins/android/androidpotentialkit.cpp +++ b/src/plugins/android/androidpotentialkit.cpp @@ -1,9 +1,10 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidpotentialkit.h" -#include "androidconstants.h" #include "androidconfigurations.h" +#include "androidconstants.h" +#include "androidpotentialkit.h" +#include "androidtr.h" #include @@ -27,7 +28,7 @@ using namespace Android::Internal; QString AndroidPotentialKit::displayName() const { - return tr("Configure Android..."); + return Tr::tr("Configure Android..."); } void AndroidPotentialKit::executeFromMenu() @@ -68,8 +69,8 @@ AndroidPotentialKitWidget::AndroidPotentialKitWidget(QWidget *parent) auto layout = new QGridLayout(mainWidget); layout->setContentsMargins(0, 0, 0, 0); auto label = new QLabel; - label->setText(tr("%1 needs additional settings to enable Android support." - " You can configure those settings in the Options dialog.") + label->setText(Tr::tr("%1 needs additional settings to enable Android support." + " You can configure those settings in the Options dialog.") .arg(Core::Constants::IDE_DISPLAY_NAME)); label->setWordWrap(true); layout->addWidget(label, 0, 0, 1, 2); diff --git a/src/plugins/android/androidqmlpreviewworker.cpp b/src/plugins/android/androidqmlpreviewworker.cpp index 490ddc71afa..e89f87dfbca 100644 --- a/src/plugins/android/androidqmlpreviewworker.cpp +++ b/src/plugins/android/androidqmlpreviewworker.cpp @@ -1,12 +1,12 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidqmlpreviewworker.h" - #include "androidavdmanager.h" #include "androiddevice.h" #include "androiddeviceinfo.h" #include "androidmanager.h" +#include "androidqmlpreviewworker.h" +#include "androidtr.h" #include @@ -199,7 +199,7 @@ void AndroidQmlPreviewWorker::start() void AndroidQmlPreviewWorker::stop() { if (!isPreviewRunning(m_viewerPid) || stopPreviewApp()) - appendMessage(tr("%1 has been stopped.").arg(apkInfo()->name), NormalMessageFormat); + appendMessage(Tr::tr("%1 has been stopped.").arg(apkInfo()->name), NormalMessageFormat); m_viewerPid = -1; reportStopped(); } @@ -216,29 +216,29 @@ bool AndroidQmlPreviewWorker::ensureAvdIsRunning() using namespace ProjectExplorer; const IDevice *dev = DeviceKitAspect::device(m_rc->target()->kit()).data(); if (!dev) { - appendMessage(tr("Selected device is invalid."), ErrorMessageFormat); + appendMessage(Tr::tr("Selected device is invalid."), ErrorMessageFormat); return false; } if (dev->deviceState() == IDevice::DeviceDisconnected) { - appendMessage(tr("Selected device is disconnected."), ErrorMessageFormat); + appendMessage(Tr::tr("Selected device is disconnected."), ErrorMessageFormat); return false; } AndroidDeviceInfo devInfoLocal = AndroidDevice::androidDeviceInfoFromIDevice(dev); if (devInfoLocal.isValid()) { if (dev->machineType() == IDevice::Emulator) { - appendMessage(tr("Launching AVD."), NormalMessageFormat); + appendMessage(Tr::tr("Launching AVD."), NormalMessageFormat); devInfoLocal.serialNumber = avdMananager.startAvd(devInfoLocal.avdName); } if (devInfoLocal.serialNumber.isEmpty()) { - appendMessage(tr("Could not start AVD."), ErrorMessageFormat); + appendMessage(Tr::tr("Could not start AVD."), ErrorMessageFormat); } else { m_serialNumber = devInfoLocal.serialNumber; m_avdAbis = m_androidConfig.getAbis(m_serialNumber); } return !devInfoLocal.serialNumber.isEmpty(); } else { - appendMessage(tr("No valid AVD has been selected."), ErrorMessageFormat); + appendMessage(Tr::tr("No valid AVD has been selected."), ErrorMessageFormat); } return false; } @@ -249,7 +249,7 @@ bool AndroidQmlPreviewWorker::ensureAvdIsRunning() bool AndroidQmlPreviewWorker::checkAndInstallPreviewApp() { const QStringList command {"pm", "list", "packages", apkInfo()->appId}; - appendMessage(tr("Checking if %1 app is installed.").arg(apkInfo()->name), NormalMessageFormat); + appendMessage(Tr::tr("Checking if %1 app is installed.").arg(apkInfo()->name), NormalMessageFormat); const SdkToolResult res = runAdbShellCommand(command); if (!res.success()) { appendMessage(res.stdErr(), ErrorMessageFormat); @@ -258,19 +258,19 @@ bool AndroidQmlPreviewWorker::checkAndInstallPreviewApp() if (res.stdOut().isEmpty()) { if (m_avdAbis.isEmpty()) { - appendMessage(tr("ABI of the selected device is unknown. Cannot install APK."), + appendMessage(Tr::tr("ABI of the selected device is unknown. Cannot install APK."), ErrorMessageFormat); return false; } const FilePath apkPath = designViewerApkPath(m_avdAbis.first()); if (!apkPath.exists()) { - appendMessage(tr("Cannot install %1 app for %2 architecture. " - "The appropriate APK was not found in resources folders."). + appendMessage(Tr::tr("Cannot install %1 app for %2 architecture. " + "The appropriate APK was not found in resources folders."). arg(apkInfo()->name, m_avdAbis.first()), ErrorMessageFormat); return false; } - appendMessage(tr("Installing %1 APK.").arg(apkInfo()->name), NormalMessageFormat); + appendMessage(Tr::tr("Installing %1 APK.").arg(apkInfo()->name), NormalMessageFormat); const SdkToolResult res = runAdbCommand({"install", apkPath.toString()}); if (!res.success()) @@ -297,11 +297,11 @@ bool AndroidQmlPreviewWorker::preparePreviewArtefacts() }); if (filesToExport.size() > 1) { - appendMessage(tr("Too many .qmlproject files in your project. Open directly the " - ".qmlproject file you want to work with and then run the preview."), + appendMessage(Tr::tr("Too many .qmlproject files in your project. Open directly the " + ".qmlproject file you want to work with and then run the preview."), ErrorMessageFormat); } else if (filesToExport.size() < 1) { - appendMessage(tr("No .qmlproject file found among project files."), ErrorMessageFormat); + appendMessage(Tr::tr("No .qmlproject file found among project files."), ErrorMessageFormat); } else { const FilePath qmlprojectFile = filesToExport.first(); m_uploadInfo.uploadPackage = m_uploadInfo.projectFolder.resolvePath( @@ -310,7 +310,7 @@ bool AndroidQmlPreviewWorker::preparePreviewArtefacts() return true; } } - appendMessage(tr("Could not gather information on project files."), ErrorMessageFormat); + appendMessage(Tr::tr("Could not gather information on project files."), ErrorMessageFormat); return false; } @@ -332,7 +332,7 @@ FilePath AndroidQmlPreviewWorker::createQmlrcFile(const FilePath &workFolder, rccProcess.setCommand({rccBinary, args}); rccProcess.start(); if (!rccProcess.waitForStarted()) { - appendMessage(tr("Could not create file for %1 \"%2\""). + appendMessage(Tr::tr("Could not create file for %1 \"%2\""). arg(apkInfo()->name, rccProcess.commandLine().toUserOutput()), StdErrFormat); qrcPath.removeFile(); @@ -343,7 +343,7 @@ FilePath AndroidQmlPreviewWorker::createQmlrcFile(const FilePath &workFolder, if (!rccProcess.readDataFromProcess(&stdOut, &stdErr)) { rccProcess.stop(); rccProcess.waitForFinished(); - appendMessage(tr("A timeout occurred running \"%1\""). + appendMessage(Tr::tr("A timeout occurred running \"%1\""). arg(rccProcess.commandLine().toUserOutput()), StdErrFormat); qrcPath.removeFile(); return {}; @@ -355,14 +355,14 @@ FilePath AndroidQmlPreviewWorker::createQmlrcFile(const FilePath &workFolder, appendMessage(QString::fromLocal8Bit(stdErr), StdErrFormat); if (rccProcess.exitStatus() != QProcess::NormalExit) { - appendMessage(tr("Crash while creating file for %1 \"%2\""). + appendMessage(Tr::tr("Crash while creating file for %1 \"%2\""). arg(apkInfo()->name, rccProcess.commandLine().toUserOutput()), StdErrFormat); qrcPath.removeFile(); return {}; } if (rccProcess.exitCode() != 0) { - appendMessage(tr("Creating file for %1 failed. \"%2\" (exit code %3)."). + appendMessage(Tr::tr("Creating file for %1 failed. \"%2\" (exit code %3)."). arg(apkInfo()->name). arg(rccProcess.commandLine().toUserOutput()). arg(rccProcess.exitCode()), @@ -377,7 +377,7 @@ FilePath AndroidQmlPreviewWorker::createQmlrcFile(const FilePath &workFolder, bool AndroidQmlPreviewWorker::uploadPreviewArtefacts() { - appendMessage(tr("Uploading files."), NormalMessageFormat); + appendMessage(Tr::tr("Uploading files."), NormalMessageFormat); const FilePath qresPath = createQmlrcFile(m_uploadInfo.projectFolder, m_uploadInfo.uploadPackage.baseName()); if (!qresPath.exists()) @@ -400,7 +400,7 @@ bool AndroidQmlPreviewWorker::uploadPreviewArtefacts() bool AndroidQmlPreviewWorker::startPreviewApp() { stopPreviewApp(); - appendMessage(tr("Starting %1.").arg(apkInfo()->name), NormalMessageFormat); + appendMessage(Tr::tr("Starting %1.").arg(apkInfo()->name), NormalMessageFormat); const QDir destDir(apkInfo()->uploadDir); const QString qmlrcPath = destDir.filePath(m_uploadInfo.uploadPackage.baseName() + packageSuffix); @@ -414,7 +414,7 @@ bool AndroidQmlPreviewWorker::startPreviewApp() }; const SdkToolResult result = runAdbShellCommand(command); if (result.success()) - appendMessage(tr("%1 is running.").arg(apkInfo()->name), NormalMessageFormat); + appendMessage(Tr::tr("%1 is running.").arg(apkInfo()->name), NormalMessageFormat); else appendMessage(result.stdErr(), ErrorMessageFormat); diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp index 6a6cc4b0a11..d1aa4946205 100644 --- a/src/plugins/android/androidqtversion.cpp +++ b/src/plugins/android/androidqtversion.cpp @@ -1,10 +1,11 @@ // Copyright (C) 2016 BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidqtversion.h" -#include "androidconstants.h" #include "androidconfigurations.h" +#include "androidconstants.h" #include "androidmanager.h" +#include "androidqtversion.h" +#include "androidtr.h" #include #include @@ -56,12 +57,12 @@ QString AndroidQtVersion::invalidReason() const QString tmp = QtVersion::invalidReason(); if (tmp.isEmpty()) { if (AndroidConfigurations::currentConfig().ndkLocation(this).isEmpty()) - return tr("NDK is not configured in Devices > Android."); + return Tr::tr("NDK is not configured in Devices > Android."); if (AndroidConfigurations::currentConfig().sdkLocation().isEmpty()) - return tr("SDK is not configured in Devices > Android."); + return Tr::tr("SDK is not configured in Devices > Android."); if (qtAbis().isEmpty()) - return tr("Failed to detect the ABIs used by the Qt version. Check the settings in " - "Devices > Android for errors."); + return Tr::tr("Failed to detect the ABIs used by the Qt version. Check the settings in " + "Devices > Android for errors."); } return tmp; } @@ -98,7 +99,7 @@ void AndroidQtVersion::setupQmakeRunEnvironment(Utils::Environment &env) const QString AndroidQtVersion::description() const { //: Qt Version is meant for Android - return tr("Android"); + return Tr::tr("Android"); } const QStringList &AndroidQtVersion::androidAbis() const diff --git a/src/plugins/android/androidqtversion.h b/src/plugins/android/androidqtversion.h index 00a74c981db..c2cd89b0d5b 100644 --- a/src/plugins/android/androidqtversion.h +++ b/src/plugins/android/androidqtversion.h @@ -13,8 +13,6 @@ namespace Internal { class AndroidQtVersion : public QtSupport::QtVersion { - Q_DECLARE_TR_FUNCTIONS(Android::Internal::AndroidQtVersion) - public: AndroidQtVersion(); diff --git a/src/plugins/android/androidrunconfiguration.cpp b/src/plugins/android/androidrunconfiguration.cpp index 8e4bc401b61..1edf62b8490 100644 --- a/src/plugins/android/androidrunconfiguration.cpp +++ b/src/plugins/android/androidrunconfiguration.cpp @@ -1,12 +1,12 @@ // Copyright (C) 2016 BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidrunconfiguration.h" - #include "androidconstants.h" #include "androidglobal.h" -#include "androidtoolchain.h" #include "androidmanager.h" +#include "androidrunconfiguration.h" +#include "androidtoolchain.h" +#include "androidtr.h" #include @@ -51,7 +51,7 @@ AndroidRunConfiguration::AndroidRunConfiguration(Target *target, Utils::Id id) : RunConfiguration(target, id) { auto envAspect = addAspect(); - envAspect->addSupportedBaseEnvironment(tr("Clean Environment"), {}); + envAspect->addSupportedBaseEnvironment(Tr::tr("Clean Environment"), {}); auto extraAppArgsAspect = addAspect(macroExpander()); @@ -67,7 +67,7 @@ AndroidRunConfiguration::AndroidRunConfiguration(Target *target, Utils::Id id) auto amStartArgsAspect = addAspect(); amStartArgsAspect->setId(Constants::ANDROID_AM_START_ARGS); amStartArgsAspect->setSettingsKey("Android.AmStartArgsKey"); - amStartArgsAspect->setLabelText(tr("Activity manager start arguments:")); + amStartArgsAspect->setLabelText(Tr::tr("Activity manager start arguments:")); amStartArgsAspect->setDisplayStyle(StringAspect::LineEditDisplay); amStartArgsAspect->setHistoryCompleter("Android.AmStartArgs.History"); @@ -75,13 +75,13 @@ AndroidRunConfiguration::AndroidRunConfiguration(Target *target, Utils::Id id) preStartShellCmdAspect->setDisplayStyle(StringAspect::TextEditDisplay); preStartShellCmdAspect->setId(Constants::ANDROID_PRESTARTSHELLCMDLIST); preStartShellCmdAspect->setSettingsKey("Android.PreStartShellCmdListKey"); - preStartShellCmdAspect->setLabelText(tr("Pre-launch on-device shell commands:")); + preStartShellCmdAspect->setLabelText(Tr::tr("Pre-launch on-device shell commands:")); auto postStartShellCmdAspect = addAspect(); postStartShellCmdAspect->setDisplayStyle(StringAspect::TextEditDisplay); postStartShellCmdAspect->setId(Constants::ANDROID_POSTFINISHSHELLCMDLIST); postStartShellCmdAspect->setSettingsKey("Android.PostStartShellCmdListKey"); - postStartShellCmdAspect->setLabelText(tr("Post-quit on-device shell commands:")); + postStartShellCmdAspect->setLabelText(Tr::tr("Post-quit on-device shell commands:")); setUpdater([this, target] { const BuildTargetInfo bti = buildTargetInfo(); diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index 5325bd33a35..d0b8c389984 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -2,8 +2,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidrunner.h" - #include "androidavdmanager.h" #include "androidconfigurations.h" #include "androidconstants.h" @@ -11,7 +9,9 @@ #include "androiddevice.h" #include "androidmanager.h" #include "androidrunconfiguration.h" +#include "androidrunner.h" #include "androidrunnerworker.h" +#include "androidtr.h" #include #include @@ -107,7 +107,7 @@ void AndroidRunner::stop() { if (m_checkAVDTimer.isActive()) { m_checkAVDTimer.stop(); - appendMessage("\n\n" + tr("\"%1\" terminated.").arg(m_packageName), + appendMessage("\n\n" + Tr::tr("\"%1\" terminated.").arg(m_packageName), Utils::NormalMessageFormat); return; } diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index b232847188c..abbddb843ce 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -1,11 +1,11 @@ // Copyright (C) 2018 BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidrunnerworker.h" - #include "androidconfigurations.h" #include "androidconstants.h" #include "androidmanager.h" +#include "androidrunnerworker.h" +#include "androidtr.h" #include #include @@ -235,7 +235,7 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa qCDebug(androidRunWorkerLog) << "QML debugging enabled"; QTcpServer server; QTC_ASSERT(server.listen(QHostAddress::LocalHost), - qDebug() << tr("No free ports available on host for QML debugging.")); + qDebug() << Tr::tr("No free ports available on host for QML debugging.")); m_qmlServer.setScheme(Utils::urlTcpScheme()); m_qmlServer.setHost(server.serverAddress().toString()); m_qmlServer.setPort(server.serverPort()); @@ -537,7 +537,7 @@ void AndroidRunnerWorker::asyncStartHelper() QString packageDir; if (!runAdb({"shell", "run-as", m_packageName, "/system/bin/sh", "-c", "pwd"}, &packageDir)) { - emit remoteProcessFinished(tr("Failed to find application directory.")); + emit remoteProcessFinished(Tr::tr("Failed to find application directory.")); return; } @@ -546,9 +546,9 @@ void AndroidRunnerWorker::asyncStartHelper() runAdb({"shell", "run-as", m_packageName, "chmod", "a+x", packageDir.trimmed()}); if (!QFileInfo::exists(m_debugServerPath)) { - QString msg = tr("Cannot find C++ debug server in NDK installation."); + QString msg = Tr::tr("Cannot find C++ debug server in NDK installation."); if (m_useLldb) - msg += "\n" + tr("The lldb-server binary has not been found."); + msg += "\n" + Tr::tr("The lldb-server binary has not been found."); emit remoteProcessFinished(msg); return; } @@ -558,7 +558,7 @@ void AndroidRunnerWorker::asyncStartHelper() debugServerFile = "./lldb-server"; runAdb({"shell", "run-as", m_packageName, "killall", "lldb-server"}); if (!uploadDebugServer(debugServerFile)) { - emit remoteProcessFinished(tr("Cannot copy C++ debug server.")); + emit remoteProcessFinished(Tr::tr("Cannot copy C++ debug server.")); return; } } else { @@ -576,7 +576,7 @@ void AndroidRunnerWorker::asyncStartHelper() // Kill the previous instances of gdbserver. Do this before copying the gdbserver. runAdb({"shell", "run-as", m_packageName, "killall", "gdbserver"}); if (!uploadDebugServer("./gdbserver")) { - emit remoteProcessFinished(tr("Cannot copy C++ debug server.")); + emit remoteProcessFinished(Tr::tr("Cannot copy C++ debug server.")); return; } } @@ -594,7 +594,7 @@ void AndroidRunnerWorker::asyncStartHelper() QStringList removeForward{{"forward", "--remove", port}}; removeForwardPort(port); if (!runAdb({"forward", port, port})) { - emit remoteProcessFinished(tr("Failed to forward QML debugging ports.")); + emit remoteProcessFinished(Tr::tr("Failed to forward QML debugging ports.")); return; } m_afterFinishAdbCommands.push_back(removeForward.join(' ')); @@ -632,12 +632,12 @@ void AndroidRunnerWorker::asyncStartHelper() QString stdErr; const bool startResult = runAdb(args, nullptr, &stdErr); if (!startResult) { - emit remoteProcessFinished(tr("Failed to start the activity.")); + emit remoteProcessFinished(Tr::tr("Failed to start the activity.")); return; } if (!stdErr.isEmpty()) { - emit remoteErrorOutput(tr("Activity Manager threw the error: %1").arg(stdErr)); + emit remoteErrorOutput(Tr::tr("Activity Manager threw the error: %1").arg(stdErr)); return; } } @@ -658,7 +658,7 @@ bool AndroidRunnerWorker::startDebuggerServer(const QString &packageDir, if (!m_debugServerProcess) { qCDebug(androidRunWorkerLog) << "Debugger process failed to start" << lldbServerErr; if (errorStr) - *errorStr = tr("Failed to start debugger server."); + *errorStr = Tr::tr("Failed to start debugger server."); return false; } qCDebug(androidRunWorkerLog) << "Debugger process started"; @@ -677,7 +677,7 @@ bool AndroidRunnerWorker::startDebuggerServer(const QString &packageDir, if (!m_debugServerProcess) { qCDebug(androidRunWorkerLog) << "Debugger process failed to start" << gdbServerErr; if (errorStr) - *errorStr = tr("Failed to start debugger server."); + *errorStr = Tr::tr("Failed to start debugger server."); return false; } qCDebug(androidRunWorkerLog) << "Debugger process started"; @@ -689,7 +689,7 @@ bool AndroidRunnerWorker::startDebuggerServer(const QString &packageDir, if (!runAdb({"forward", port, "localfilesystem:" + gdbServerSocket})) { if (errorStr) - *errorStr = tr("Failed to forward C++ debugging ports."); + *errorStr = Tr::tr("Failed to forward C++ debugging ports."); return false; } m_afterFinishAdbCommands.push_back(removeForward.join(' ')); @@ -725,7 +725,7 @@ void AndroidRunnerWorker::handleJdbWaiting() removeForwardPort(port); if (!runAdb({"forward", port, "jdwp:" + QString::number(m_processPID)})) { - emit remoteProcessFinished(tr("Failed to forward JDB debugging ports.")); + emit remoteProcessFinished(Tr::tr("Failed to forward JDB debugging ports.")); return; } m_afterFinishAdbCommands.push_back(removeForward.join(' ')); @@ -742,7 +742,7 @@ void AndroidRunnerWorker::handleJdbWaiting() jdbProcess->setProcessChannelMode(QProcess::MergedChannels); jdbProcess->start(jdbPath.toString(), jdbArgs); if (!jdbProcess->waitForStarted()) { - emit remoteProcessFinished(tr("Failed to start JDB.")); + emit remoteProcessFinished(Tr::tr("Failed to start JDB.")); return; } m_jdbProcess = std::move(jdbProcess); @@ -783,7 +783,7 @@ void AndroidRunnerWorker::handleJdbSettled() } } } - emit remoteProcessFinished(tr("Cannot attach JDB to the running application.")); + emit remoteProcessFinished(Tr::tr("Cannot attach JDB to the running application.")); } void AndroidRunnerWorker::removeForwardPort(const QString &port) @@ -814,7 +814,7 @@ void AndroidRunnerWorker::onProcessIdChanged(qint64 pid) << "to:" << pid; m_processPID = pid; if (pid == -1) { - emit remoteProcessFinished(QLatin1String("\n\n") + tr("\"%1\" died.") + emit remoteProcessFinished(QLatin1String("\n\n") + Tr::tr("\"%1\" died.") .arg(m_packageName)); // App died/killed. Reset log, monitor, jdb & gdbserver/lldb-server processes. m_adbLogcatProcess.reset(); diff --git a/src/plugins/android/androidsdkdownloader.cpp b/src/plugins/android/androidsdkdownloader.cpp index a88e015e6a5..434b79c7c07 100644 --- a/src/plugins/android/androidsdkdownloader.cpp +++ b/src/plugins/android/androidsdkdownloader.cpp @@ -1,9 +1,9 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidsdkdownloader.h" - #include "androidconstants.h" +#include "androidsdkdownloader.h" +#include "androidtr.h" #include #include @@ -39,14 +39,14 @@ void AndroidSdkDownloader::sslErrors(const QList &sslErrors) { for (const QSslError &error : sslErrors) qCDebug(sdkDownloaderLog, "SSL error: %s\n", qPrintable(error.errorString())); - cancelWithError(tr("Encountered SSL errors, download is aborted.")); + cancelWithError(Tr::tr("Encountered SSL errors, download is aborted.")); } #endif void AndroidSdkDownloader::downloadAndExtractSdk() { if (m_androidConfig.sdkToolsUrl().isEmpty()) { - logError(tr("The SDK Tools download URL is empty.")); + logError(Tr::tr("The SDK Tools download URL is empty.")); return; } @@ -57,7 +57,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk() connect(m_reply, &QNetworkReply::sslErrors, this, &AndroidSdkDownloader::sslErrors); #endif - m_progressDialog = new QProgressDialog(tr("Downloading SDK Tools package..."), tr("Cancel"), + m_progressDialog = new QProgressDialog(Tr::tr("Downloading SDK Tools package..."), Tr::tr("Cancel"), 0, 100, Core::ICore::dialogParent()); m_progressDialog->setWindowModality(Qt::ApplicationModal); m_progressDialog->setWindowTitle(dialogTitle()); @@ -105,7 +105,7 @@ bool AndroidSdkDownloader::verifyFileIntegrity() QString AndroidSdkDownloader::dialogTitle() { - return tr("Download SDK Tools"); + return Tr::tr("Download SDK Tools"); } void AndroidSdkDownloader::cancel() @@ -154,7 +154,7 @@ bool AndroidSdkDownloader::saveToDisk(const FilePath &filename, QIODevice *data) { QFile file(filename.toString()); if (!file.open(QIODevice::WriteOnly)) { - logError(QString(tr("Could not open %1 for writing: %2.")) + logError(QString(Tr::tr("Could not open %1 for writing: %2.")) .arg(filename.toUserOutput(), file.errorString())); return false; } @@ -176,18 +176,18 @@ void AndroidSdkDownloader::downloadFinished(QNetworkReply *reply) { QUrl url = reply->url(); if (reply->error()) { - cancelWithError(QString(tr("Downloading Android SDK Tools from URL %1 has failed: %2.")) + cancelWithError(QString(Tr::tr("Downloading Android SDK Tools from URL %1 has failed: %2.")) .arg(url.toString(), reply->errorString())); } else { if (isHttpRedirect(reply)) { - cancelWithError(QString(tr("Download from %1 was redirected.")).arg(url.toString())); + cancelWithError(QString(Tr::tr("Download from %1 was redirected.")).arg(url.toString())); } else { m_sdkFilename = getSaveFilename(url); if (saveToDisk(m_sdkFilename, reply) && verifyFileIntegrity()) emit sdkPackageWriteFinished(); else cancelWithError( - tr("Writing and verifying the integrity of the downloaded file has failed.")); + Tr::tr("Writing and verifying the integrity of the downloaded file has failed.")); } } diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index 0fed77d2312..b82791db07b 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -1,11 +1,11 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidsdkmanager.h" - #include "androidconfigurations.h" #include "androidconstants.h" #include "androidmanager.h" +#include "androidsdkmanager.h" +#include "androidtr.h" #include "avdmanageroutputparser.h" #include @@ -166,9 +166,8 @@ static void sdkManagerCommand(const AndroidConfig &config, const QStringList &ar if (assertionFound) { output.success = false; output.stdOutput = proc.cleanedStdOut(); - output.stdError = QCoreApplication::translate("Android::Internal::AndroidSdkManager", - "The operation requires user interaction. " - "Use the \"sdkmanager\" command-line tool."); + output.stdError = Tr::tr("The operation requires user interaction. " + "Use the \"sdkmanager\" command-line tool."); } else { output.success = proc.result() == ProcessResult::FinishedWithSuccess; } @@ -910,8 +909,7 @@ void AndroidSdkManagerPrivate::updateInstalled(SdkCmdFutureInterface &fi) fi.setProgressValue(0); AndroidSdkManager::OperationOutput result; result.type = AndroidSdkManager::UpdateAll; - result.stdOutput = QCoreApplication::translate("AndroidSdkManager", - "Updating installed packages."); + result.stdOutput = Tr::tr("Updating installed packages."); fi.reportResult(result); QStringList args("--update"); args << m_config.sdkManagerToolArgs(); @@ -921,8 +919,8 @@ void AndroidSdkManagerPrivate::updateInstalled(SdkCmdFutureInterface &fi) qCDebug(sdkManagerLog) << "Update: Operation cancelled before start"; if (result.stdError.isEmpty() && !result.success) - result.stdError = QCoreApplication::translate("AndroidSdkManager", "Failed."); - result.stdOutput = QCoreApplication::translate("AndroidSdkManager", "Done\n\n"); + result.stdError = Tr::tr("Failed."); + result.stdOutput = Tr::tr("Done\n\n"); fi.reportResult(result); fi.setProgressValue(100); } @@ -935,8 +933,8 @@ void AndroidSdkManagerPrivate::update(SdkCmdFutureInterface &fi, const QStringLi double progressQuota = 100.0 / (install.count() + uninstall.count()); int currentProgress = 0; - QString installTag = QCoreApplication::translate("AndroidSdkManager", "Installing"); - QString uninstallTag = QCoreApplication::translate("AndroidSdkManager", "Uninstalling"); + QString installTag = Tr::tr("Installing"); + QString uninstallTag = Tr::tr("Uninstalling"); auto doOperation = [&](const QString& packagePath, const QStringList& args, bool isInstall) { @@ -952,8 +950,8 @@ void AndroidSdkManagerPrivate::update(SdkCmdFutureInterface &fi, const QStringLi currentProgress += progressQuota; fi.setProgressValue(currentProgress); if (result.stdError.isEmpty() && !result.success) - result.stdError = QCoreApplication::translate("AndroidSdkManager", "Failed"); - result.stdOutput = QCoreApplication::translate("AndroidSdkManager", "Done\n\n"); + result.stdError = Tr::tr("AndroidSdkManager", "Failed"); + result.stdOutput = Tr::tr("AndroidSdkManager", "Done\n\n"); fi.reportResult(result); return fi.isCanceled(); }; @@ -1052,10 +1050,8 @@ void AndroidSdkManagerPrivate::getPendingLicense(SdkCmdFutureInterface &fi) m_licenseTextCache.clear(); result.success = licenseCommand.exitStatus() == QProcess::NormalExit; - if (!result.success) { - result.stdError = QCoreApplication::translate("Android::Internal::AndroidSdkManager", - "License command failed.\n\n"); - } + if (!result.success) + result.stdError = Tr::tr("License command failed.\n\n"); fi.reportResult(result); fi.setProgressValue(100); } diff --git a/src/plugins/android/androidsdkmanagerwidget.cpp b/src/plugins/android/androidsdkmanagerwidget.cpp index c4c8d91f481..d17104e3271 100644 --- a/src/plugins/android/androidsdkmanagerwidget.cpp +++ b/src/plugins/android/androidsdkmanagerwidget.cpp @@ -1,11 +1,11 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidsdkmanagerwidget.h" - #include "androidconfigurations.h" #include "androidsdkmanager.h" +#include "androidsdkmanagerwidget.h" #include "androidsdkmodel.h" +#include "androidtr.h" #include @@ -52,7 +52,7 @@ AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidConfig &config, { QTC_CHECK(sdkManager); - setWindowTitle(tr("Android SDK Manager")); + setWindowTitle(Tr::tr("Android SDK Manager")); resize(664, 396); setModal(true); @@ -62,41 +62,41 @@ AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidConfig &config, packagesView->setIndentation(20); packagesView->header()->setCascadingSectionResizes(false); - auto updateInstalledButton = new QPushButton(tr("Update Installed")); + auto updateInstalledButton = new QPushButton(Tr::tr("Update Installed")); - auto applySelectionButton = new QPushButton(tr("Apply")); + auto applySelectionButton = new QPushButton(Tr::tr("Apply")); applySelectionButton->setEnabled(false); auto channelCheckbox = new QComboBox; - channelCheckbox->addItem(tr("Default")); - channelCheckbox->addItem(tr("Stable")); - channelCheckbox->addItem(tr("Beta")); - channelCheckbox->addItem(tr("Dev")); - channelCheckbox->addItem(tr("Canary")); + channelCheckbox->addItem(Tr::tr("Default")); + channelCheckbox->addItem(Tr::tr("Stable")); + channelCheckbox->addItem(Tr::tr("Beta")); + channelCheckbox->addItem(Tr::tr("Dev")); + channelCheckbox->addItem(Tr::tr("Canary")); - auto obsoleteCheckBox = new QCheckBox(tr("Include obsolete")); + auto obsoleteCheckBox = new QCheckBox(Tr::tr("Include obsolete")); - auto showAvailableRadio = new QRadioButton(tr("Available")); - auto showInstalledRadio = new QRadioButton(tr("Installed")); - auto showAllRadio = new QRadioButton(tr("All")); + auto showAvailableRadio = new QRadioButton(Tr::tr("Available")); + auto showInstalledRadio = new QRadioButton(Tr::tr("Installed")); + auto showAllRadio = new QRadioButton(Tr::tr("All")); showAllRadio->setChecked(true); - auto optionsButton = new QPushButton(tr("Advanced Options...")); + auto optionsButton = new QPushButton(Tr::tr("Advanced Options...")); auto searchField = new FancyLineEdit(m_packagesStack); searchField->setPlaceholderText("Filter"); - auto expandCheck = new QCheckBox(tr("Expand All")); + auto expandCheck = new QCheckBox(Tr::tr("Expand All")); m_outputStack = new QWidget; - auto cancelButton = new QPushButton(tr("Cancel")); + auto cancelButton = new QPushButton(Tr::tr("Cancel")); m_operationProgress = new QProgressBar(m_outputStack); m_outputEdit = new QPlainTextEdit(m_outputStack); m_outputEdit->setReadOnly(true); - m_sdkLicenseLabel = new QLabel(tr("Do you want to accept the Android SDK license?")); + m_sdkLicenseLabel = new QLabel(Tr::tr("Do you want to accept the Android SDK license?")); m_sdkLicenseLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); m_sdkLicenseLabel->hide(); @@ -133,9 +133,9 @@ AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidConfig &config, applySelectionButton, st, Group { - title(tr("Show Packages")), + title(Tr::tr("Show Packages")), Column { - Row { tr("Channel:"), channelCheckbox }, + Row { Tr::tr("Channel:"), channelCheckbox }, obsoleteCheckBox, hr, showAvailableRadio, @@ -280,21 +280,21 @@ void AndroidSdkManagerWidget::installEssentials() m_sdkModel->selectMissingEssentials(); if (!m_sdkModel->missingEssentials().isEmpty()) { QMessageBox::warning(this, - tr("Android SDK Changes"), - tr("%1 cannot find the following essential packages: \"%2\".\n" - "Install them manually after the current operation is done.\n") - .arg(Core::Constants::IDE_DISPLAY_NAME) - .arg(m_sdkModel->missingEssentials().join("\", \""))); + Tr::tr("Android SDK Changes"), + Tr::tr("%1 cannot find the following essential packages: \"%2\".\n" + "Install them manually after the current operation is done.\n") + .arg(Core::Constants::IDE_DISPLAY_NAME) + .arg(m_sdkModel->missingEssentials().join("\", \""))); } - onApplyButton(tr("Android SDK installation is missing necessary packages. " + onApplyButton(Tr::tr("Android SDK installation is missing necessary packages. " "Do you want to install the missing packages?")); } void AndroidSdkManagerWidget::beginLicenseCheck() { - m_formatter->appendMessage(tr("Checking pending licenses...\n"), NormalMessageFormat); - m_formatter->appendMessage(tr("The installation of Android SDK packages may fail if the " - "respective licenses are not accepted.\n"), + m_formatter->appendMessage(Tr::tr("Checking pending licenses...\n"), NormalMessageFormat); + m_formatter->appendMessage(Tr::tr("The installation of Android SDK packages may fail if the " + "respective licenses are not accepted.\n"), LogMessageFormat); addPackageFuture(m_sdkManager->checkPendingLicenses()); } @@ -304,7 +304,7 @@ void AndroidSdkManagerWidget::onApplyButton(const QString &extraMessage) QTC_ASSERT(m_currentView == PackageListing, return); if (m_sdkManager->isBusy()) { - m_formatter->appendMessage(tr("\nSDK Manager is busy."), StdErrFormat); + m_formatter->appendMessage(Tr::tr("\nSDK Manager is busy."), StdErrFormat); return; } @@ -321,15 +321,15 @@ void AndroidSdkManagerWidget::onApplyButton(const QString &extraMessage) installPackages << str; } - QString message = tr("%n Android SDK packages shall be updated.", "", packagesToUpdate.count()); + QString message = Tr::tr("%n Android SDK packages shall be updated.", "", packagesToUpdate.count()); if (!extraMessage.isEmpty()) message.prepend(extraMessage + "\n\n"); - QMessageBox messageDlg(QMessageBox::Information, tr("Android SDK Changes"), + QMessageBox messageDlg(QMessageBox::Information, Tr::tr("Android SDK Changes"), message, QMessageBox::Ok | QMessageBox::Cancel, this); QString details; if (!uninstallPackages.isEmpty()) - details = tr("[Packages to be uninstalled:]\n").append(uninstallPackages.join("\n")); + details = Tr::tr("[Packages to be uninstalled:]\n").append(uninstallPackages.join("\n")); if (!installPackages.isEmpty()) { if (!uninstallPackages.isEmpty()) @@ -358,7 +358,7 @@ void AndroidSdkManagerWidget::onApplyButton(const QString &extraMessage) void AndroidSdkManagerWidget::onUpdatePackages() { if (m_sdkManager->isBusy()) { - m_formatter->appendMessage(tr("\nSDK Manager is busy."), StdErrFormat); + m_formatter->appendMessage(Tr::tr("\nSDK Manager is busy."), StdErrFormat); return; } switchView(Operations); @@ -419,7 +419,7 @@ void AndroidSdkManagerWidget::addPackageFuture(const QFutureisBusy()) { - m_formatter->appendMessage(tr("SDK Manager is busy. Operation cancelled."), + m_formatter->appendMessage(Tr::tr("SDK Manager is busy. Operation cancelled."), StdErrFormat); } notifyOperationFinished(); @@ -442,11 +442,11 @@ void AndroidSdkManagerWidget::beginExecution() else installSdkPaths << package->sdkStylePath(); } - m_formatter->appendMessage(tr("Installing/Uninstalling selected packages...\n"), + m_formatter->appendMessage(Tr::tr("Installing/Uninstalling selected packages...\n"), NormalMessageFormat); - m_formatter->appendMessage(tr("Closing the %1 dialog will cancel the running and scheduled SDK " + m_formatter->appendMessage(Tr::tr("Closing the %1 dialog will cancel the running and scheduled SDK " "operations.\n").arg(HostOsInfo::isMacHost() ? - tr("preferences") : tr("options")), + Tr::tr("preferences") : Tr::tr("options")), LogMessageFormat); addPackageFuture(m_sdkManager->update(installSdkPaths, uninstallSdkPaths)); @@ -454,10 +454,10 @@ void AndroidSdkManagerWidget::beginExecution() void AndroidSdkManagerWidget::beginUpdate() { - m_formatter->appendMessage(tr("Updating installed packages...\n"), NormalMessageFormat); - m_formatter->appendMessage(tr("Closing the %1 dialog will cancel the running and scheduled SDK " + m_formatter->appendMessage(Tr::tr("Updating installed packages...\n"), NormalMessageFormat); + m_formatter->appendMessage(Tr::tr("Closing the %1 dialog will cancel the running and scheduled SDK " "operations.\n").arg(HostOsInfo::isMacHost() ? - tr("preferences") : tr("options")), + Tr::tr("preferences") : Tr::tr("options")), LogMessageFormat); addPackageFuture(m_sdkManager->updateAll()); } @@ -471,8 +471,8 @@ void AndroidSdkManagerWidget::beginLicenseWorkflow() void AndroidSdkManagerWidget::notifyOperationFinished() { if (!m_currentOperation || m_currentOperation->isFinished()) { - QMessageBox::information(this, tr("Android SDK Changes"), - tr("Android SDK operations finished."), QMessageBox::Ok); + QMessageBox::information(this, Tr::tr("Android SDK Changes"), + Tr::tr("Android SDK operations finished."), QMessageBox::Ok); m_operationProgress->setValue(0); // Once the update/install is done, let's hide the dialog. hide(); @@ -485,7 +485,7 @@ void AndroidSdkManagerWidget::packageFutureFinished() bool continueWorkflow = true; if (m_currentOperation->isCanceled()) { - m_formatter->appendMessage(tr("Operation cancelled.\n"), StdErrFormat); + m_formatter->appendMessage(Tr::tr("Operation cancelled.\n"), StdErrFormat); continueWorkflow = false; } m_operationProgress->setValue(100); @@ -524,12 +524,12 @@ void AndroidSdkManagerWidget::packageFutureFinished() void AndroidSdkManagerWidget::cancelPendingOperations() { if (!m_sdkManager->isBusy()) { - m_formatter->appendMessage(tr("\nNo pending operations to cancel...\n"), + m_formatter->appendMessage(Tr::tr("\nNo pending operations to cancel...\n"), NormalMessageFormat); switchView(PackageListing); return; } - m_formatter->appendMessage(tr("\nCancelling pending operations...\n"), + m_formatter->appendMessage(Tr::tr("\nCancelling pending operations...\n"), NormalMessageFormat); m_sdkManager->cancelOperatons(); } @@ -632,15 +632,15 @@ OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &a { QTC_CHECK(sdkManager); resize(800, 480); - setWindowTitle(tr("SDK Manager Arguments")); + setWindowTitle(Tr::tr("SDK Manager Arguments")); m_argumentDetailsEdit = new QPlainTextEdit(this); m_argumentDetailsEdit->setReadOnly(true); auto populateOptions = [this](const QString& options) { if (options.isEmpty()) { - m_argumentDetailsEdit->setPlainText(tr("Cannot load available arguments for " - "\"sdkmanager\" command.")); + m_argumentDetailsEdit->setPlainText(Tr::tr("Cannot load available arguments for " + "\"sdkmanager\" command.")); } else { m_argumentDetailsEdit->setPlainText(options); } @@ -657,9 +657,9 @@ OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &a m_argumentsEdit->setText(args.join(" ")); auto gridLayout = new QGridLayout(this); - gridLayout->addWidget(new QLabel(tr("SDK manager arguments:"), this), 0, 0, 1, 1); + gridLayout->addWidget(new QLabel(Tr::tr("SDK manager arguments:"), this), 0, 0, 1, 1); gridLayout->addWidget(m_argumentsEdit, 0, 1, 1, 1); - gridLayout->addWidget(new QLabel(tr("Available arguments:"), this), 1, 0, 1, 2); + gridLayout->addWidget(new QLabel(Tr::tr("Available arguments:"), this), 1, 0, 1, 2); gridLayout->addWidget(m_argumentDetailsEdit, 2, 0, 1, 2); gridLayout->addWidget(dialogButtons, 3, 0, 1, 2); } diff --git a/src/plugins/android/androidsdkmodel.cpp b/src/plugins/android/androidsdkmodel.cpp index 5e2182b4a3a..74e172d0118 100644 --- a/src/plugins/android/androidsdkmodel.cpp +++ b/src/plugins/android/androidsdkmodel.cpp @@ -1,8 +1,10 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidsdkmodel.h" + #include "androidmanager.h" #include "androidsdkmanager.h" +#include "androidsdkmodel.h" +#include "androidtr.h" #include #include @@ -44,13 +46,13 @@ QVariant AndroidSdkModel::headerData(int section, Qt::Orientation orientation, i if (role == Qt::DisplayRole) { switch (section) { case packageNameColumn: - data = tr("Package"); + data = Tr::tr("Package"); break; case packageRevisionColumn: - data = tr("Revision"); + data = Tr::tr("Revision"); break; case apiLevelColumn: - data = tr("API"); + data = Tr::tr("API"); break; default: break; @@ -141,7 +143,7 @@ QVariant AndroidSdkModel::data(const QModelIndex &index, int role) const // Top level tools if (index.row() == 0) { return role == Qt::DisplayRole && index.column() == packageNameColumn ? - QVariant(tr("Tools")) : QVariant(); + QVariant(Tr::tr("Tools")) : QVariant(); } // Top level platforms const SdkPlatform *platform = m_sdkPlatforms.at(index.row() - 1); @@ -171,7 +173,7 @@ QVariant AndroidSdkModel::data(const QModelIndex &index, int role) const switch (index.column()) { case packageNameColumn: return p->type() == AndroidSdkPackage::SdkPlatformPackage ? - tr("SDK Platform") : p->displayText(); + Tr::tr("SDK Platform") : p->displayText(); case packageRevisionColumn: return p->revision().toString(); case apiLevelColumn: diff --git a/src/plugins/android/androidservicewidget.cpp b/src/plugins/android/androidservicewidget.cpp index d71d92cbaa5..5e6c685bdcb 100644 --- a/src/plugins/android/androidservicewidget.cpp +++ b/src/plugins/android/androidservicewidget.cpp @@ -3,6 +3,7 @@ #include "androidservicewidget.h" #include "androidservicewidget_p.h" +#include "androidtr.h" #include @@ -182,31 +183,31 @@ QVariant AndroidServiceWidget::AndroidServiceModel::headerData(int section, Qt:: { if (role == Qt::ToolTipRole && orientation == Qt::Horizontal) { if (section == 0) - return tr("The name of the class implementing the service."); + return Tr::tr("The name of the class implementing the service."); else if (section == 1) - return tr("Checked if the service is run in an external process."); + return Tr::tr("Checked if the service is run in an external process."); else if (section == 2) - return tr("The name of the external process.\n" - "Prefix with : if the process is private, use a lowercase name if the process is global."); + return Tr::tr("The name of the external process.\n" + "Prefix with : if the process is private, use a lowercase name if the process is global."); else if (section == 3) - return tr("Checked if the service is in a separate dynamic library."); + return Tr::tr("Checked if the service is in a separate dynamic library."); else if (section == 4) - return tr("The name of the separate dynamic library."); + return Tr::tr("The name of the separate dynamic library."); else if (section == 5) - return tr("The arguments for telling the app to run the service instead of the main activity."); + return Tr::tr("The arguments for telling the app to run the service instead of the main activity."); } else if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { if (section == 0) - return tr("Service class name."); + return Tr::tr("Service class name."); else if (section == 1) - return tr("Run in external process."); + return Tr::tr("Run in external process."); else if (section == 2) - return tr("Process name."); + return Tr::tr("Process name."); else if (section == 3) - return tr("Run in external library."); + return Tr::tr("Run in external library."); else if (section == 4) - return tr("Library name."); + return Tr::tr("Library name."); else if (section == 5) - return tr("Service arguments."); + return Tr::tr("Service arguments."); } return {}; } @@ -225,22 +226,22 @@ QVariant AndroidServiceWidget::AndroidServiceModel::data(const QModelIndex &inde if (index.column() == 0) return m_services[index.row()].className(); else if (index.column() == 1) - return tr("Run in external process."); + return Tr::tr("Run in external process."); else if (index.column() == 2) return m_services[index.row()].externalProcessName(); else if (index.column() == 3) - return tr("Run in external library."); + return Tr::tr("Run in external library."); else if (index.column() == 4) return m_services[index.row()].externalLibraryName(); else if (index.column() == 5) return m_services[index.row()].serviceArguments(); } else if (role == Qt::ToolTipRole) { if (index.column() == 0 && m_services[index.row()].className().isEmpty()) - return tr("The class name must be set."); + return Tr::tr("The class name must be set."); else if (index.column() == 2 && m_services[index.row()].isRunInExternalProcess()) - return tr("The process name must be set for a service run in an external process."); + return Tr::tr("The process name must be set for a service run in an external process."); else if (index.column() == 4 && m_services[index.row()].isRunInExternalLibrary()) - return tr("The library name must be set for a service run in an external library."); + return Tr::tr("The library name must be set for a service run in an external library."); } else if (role == Qt::EditRole) { if (index.column() == 0) return m_services[index.row()].className(); @@ -317,10 +318,10 @@ AndroidServiceWidget::AndroidServiceWidget(QWidget *parent) : QWidget(parent), layout->addWidget(m_tableView, 1); auto buttonLayout = new QGridLayout(); auto addButton = new QPushButton(this); - addButton->setText(tr("Add")); + addButton->setText(Tr::tr("Add")); buttonLayout->addWidget(addButton, 0, 0); m_removeButton = new QPushButton(this); - m_removeButton->setText(tr("Remove")); + m_removeButton->setText(Tr::tr("Remove")); m_removeButton->setEnabled(false); buttonLayout->addWidget(m_removeButton, 1, 0); layout->addLayout(buttonLayout); diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 46effc4995a..148473ce605 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -1,13 +1,13 @@ // Copyright (C) 2016 BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidsettingswidget.h" - #include "androidconfigurations.h" #include "androidconstants.h" #include "androidsdkdownloader.h" #include "androidsdkmanager.h" #include "androidsdkmanagerwidget.h" +#include "androidsettingswidget.h" +#include "androidtr.h" #include @@ -139,8 +139,6 @@ private: class AndroidSettingsWidget final : public Core::IOptionsPageWidget { - Q_DECLARE_TR_FUNCTIONS(Android::Internal::AndroidSettingsWidget) - public: // Todo: This would be so much simpler if it just used Utils::PathChooser!!! AndroidSettingsWidget(); @@ -207,7 +205,7 @@ enum OpenSslValidation { AndroidSettingsWidget::AndroidSettingsWidget() { - setWindowTitle(tr("Android Configuration")); + setWindowTitle(Tr::tr("Android Configuration")); const QIcon downloadIcon = Icons::ONLINE.icon(); @@ -215,20 +213,20 @@ AndroidSettingsWidget::AndroidSettingsWidget() auto downloadSdkToolButton = new QToolButton; downloadSdkToolButton->setIcon(downloadIcon); - downloadSdkToolButton->setToolTip(tr("Open Android SDK download URL in the system's browser.")); + downloadSdkToolButton->setToolTip(Tr::tr("Open Android SDK download URL in the system's browser.")); - auto addCustomNdkButton = new QPushButton(tr("Add...")); - addCustomNdkButton->setToolTip(tr("Add the selected custom NDK. The toolchains " - "and debuggers will be created automatically.")); + auto addCustomNdkButton = new QPushButton(Tr::tr("Add...")); + addCustomNdkButton->setToolTip(Tr::tr("Add the selected custom NDK. The toolchains " + "and debuggers will be created automatically.")); - auto removeCustomNdkButton = new QPushButton(tr("Remove")); + auto removeCustomNdkButton = new QPushButton(Tr::tr("Remove")); removeCustomNdkButton->setEnabled(false); - removeCustomNdkButton->setToolTip(tr("Remove the selected NDK if it has been added manually.")); + removeCustomNdkButton->setToolTip(Tr::tr("Remove the selected NDK if it has been added manually.")); m_makeDefaultNdkButton = new QPushButton; - m_makeDefaultNdkButton->setToolTip(tr("Force a specific NDK installation to be used by all " - "Android kits.
Note that the forced NDK might not " - "be compatible with all registered Qt versions.")); + m_makeDefaultNdkButton->setToolTip(Tr::tr("Force a specific NDK installation to be used by all " + "Android kits.
Note that the forced NDK might not " + "be compatible with all registered Qt versions.")); auto androidDetailsWidget = new DetailsWidget; @@ -243,70 +241,70 @@ AndroidSettingsWidget::AndroidSettingsWidget() auto downloadOpenJdkToolButton = new QToolButton; downloadOpenJdkToolButton->setIcon(downloadIcon); - downloadOpenJdkToolButton->setToolTip(tr("Open JDK download URL in the system's browser.")); + downloadOpenJdkToolButton->setToolTip(Tr::tr("Open JDK download URL in the system's browser.")); - auto sdkToolsAutoDownloadButton = new QPushButton(tr("Set Up SDK")); + auto sdkToolsAutoDownloadButton = new QPushButton(Tr::tr("Set Up SDK")); sdkToolsAutoDownloadButton->setToolTip( - tr("Automatically download Android SDK Tools to selected location.\n\n" - "If the selected path contains no valid SDK Tools, the SDK Tools package is downloaded\n" - "from %1,\n" - "and extracted to the selected path.\n" - "After the SDK Tools are properly set up, you are prompted to install any essential\n" - "packages required for Qt to build for Android.") - .arg(m_androidConfig.sdkToolsUrl().toString())); + Tr::tr("Automatically download Android SDK Tools to selected location.\n\n" + "If the selected path contains no valid SDK Tools, the SDK Tools package is downloaded\n" + "from %1,\n" + "and extracted to the selected path.\n" + "After the SDK Tools are properly set up, you are prompted to install any essential\n" + "packages required for Qt to build for Android.") + .arg(m_androidConfig.sdkToolsUrl().toString())); - auto sdkManagerToolButton = new QPushButton(tr("SDK Manager")); + auto sdkManagerToolButton = new QPushButton(Tr::tr("SDK Manager")); auto downloadNdkToolButton = new QToolButton; - downloadNdkToolButton->setToolTip(tr("Open Android NDK download URL in the system's browser.")); + downloadNdkToolButton->setToolTip(Tr::tr("Open Android NDK download URL in the system's browser.")); - m_createKitCheckBox = new QCheckBox(tr("Automatically create kits for Android tool chains")); + m_createKitCheckBox = new QCheckBox(Tr::tr("Automatically create kits for Android tool chains")); m_createKitCheckBox->setChecked(true); auto openSslDetailsWidget = new DetailsWidget; m_openSslPathChooser = new PathChooser; - m_openSslPathChooser->setToolTip(tr("Select the path of the prebuilt OpenSSL binaries.")); + m_openSslPathChooser->setToolTip(Tr::tr("Select the path of the prebuilt OpenSSL binaries.")); - auto downloadOpenSslPrebuiltLibs = new QPushButton(tr("Download OpenSSL")); + auto downloadOpenSslPrebuiltLibs = new QPushButton(Tr::tr("Download OpenSSL")); downloadOpenSslPrebuiltLibs->setToolTip( - tr("Automatically download OpenSSL prebuilt libraries.\n\n" - "These libraries can be shipped with your application if any SSL operations\n" - "are performed. Find the checkbox under \"Projects > Build > Build Steps >\n" - "Build Android APK > Additional Libraries\".\n" - "If the automatic download fails, Qt Creator proposes to open the download URL\n" - "in the system's browser for manual download.")); + Tr::tr("Automatically download OpenSSL prebuilt libraries.\n\n" + "These libraries can be shipped with your application if any SSL operations\n" + "are performed. Find the checkbox under \"Projects > Build > Build Steps >\n" + "Build Android APK > Additional Libraries\".\n" + "If the automatic download fails, Qt Creator proposes to open the download URL\n" + "in the system's browser for manual download.")); m_sdkManagerWidget = new AndroidSdkManagerWidget(m_androidConfig, &m_sdkManager, this); const QMap androidValidationPoints = { - { SdkPathExistsAndWritableRow, tr("Android SDK path exists and is writable.") }, - { JavaPathExistsAndWritableRow, tr("JDK path exists and is writable.") }, - { SdkToolsInstalledRow, tr("SDK tools installed.") }, - { SdkManagerSuccessfulRow, tr("SDK manager runs.") }, - { PlatformToolsInstalledRow, tr("Platform tools installed.") }, + { SdkPathExistsAndWritableRow, Tr::tr("Android SDK path exists and is writable.") }, + { JavaPathExistsAndWritableRow, Tr::tr("JDK path exists and is writable.") }, + { SdkToolsInstalledRow, Tr::tr("SDK tools installed.") }, + { SdkManagerSuccessfulRow, Tr::tr("SDK manager runs.") }, + { PlatformToolsInstalledRow, Tr::tr("Platform tools installed.") }, { AllEssentialsInstalledRow, - tr( "All essential packages installed for all installed Qt versions.") }, - { BuildToolsInstalledRow, tr("Build tools installed.") }, - { PlatformSdkInstalledRow, tr("Platform SDK installed.") } + Tr::tr( "All essential packages installed for all installed Qt versions.") }, + { BuildToolsInstalledRow, Tr::tr("Build tools installed.") }, + { PlatformSdkInstalledRow, Tr::tr("Platform SDK installed.") } }; - m_androidSummary = new SummaryWidget(androidValidationPoints, tr("Android settings are OK."), - tr("Android settings have errors."), + m_androidSummary = new SummaryWidget(androidValidationPoints, Tr::tr("Android settings are OK."), + Tr::tr("Android settings have errors."), androidDetailsWidget); m_androidProgress = new ProgressIndicator(ProgressIndicatorSize::Medium, this); m_androidProgress->attachToWidget(androidDetailsWidget); m_androidProgress->hide(); const QMap openSslValidationPoints = { - { OpenSslPathExistsRow, tr("OpenSSL path exists.") }, - { OpenSslPriPathExists, tr("QMake include project (openssl.pri) exists.") }, - { OpenSslCmakeListsPathExists, tr("CMake include project (CMakeLists.txt) exists.") } + { OpenSslPathExistsRow, Tr::tr("OpenSSL path exists.") }, + { OpenSslPriPathExists, Tr::tr("QMake include project (openssl.pri) exists.") }, + { OpenSslCmakeListsPathExists, Tr::tr("CMake include project (CMakeLists.txt) exists.") } }; m_openSslSummary = new SummaryWidget(openSslValidationPoints, - tr("OpenSSL Settings are OK."), - tr("OpenSSL settings have errors."), + Tr::tr("OpenSSL Settings are OK."), + Tr::tr("OpenSSL settings have errors."), openSslDetailsWidget); connect(m_openJdkLocationPathChooser, &PathChooser::rawPathChanged, @@ -314,14 +312,14 @@ AndroidSettingsWidget::AndroidSettingsWidget() if (m_androidConfig.openJDKLocation().isEmpty()) m_androidConfig.setOpenJDKLocation(AndroidConfig::getJdkPath()); m_openJdkLocationPathChooser->setFilePath(m_androidConfig.openJDKLocation()); - m_openJdkLocationPathChooser->setPromptDialogTitle(tr("Select JDK Path")); + m_openJdkLocationPathChooser->setPromptDialogTitle(Tr::tr("Select JDK Path")); if (m_androidConfig.sdkLocation().isEmpty()) m_androidConfig.setSdkLocation(AndroidConfig::defaultSdkPath()); m_sdkLocationPathChooser->setFilePath(m_androidConfig.sdkLocation()); - m_sdkLocationPathChooser->setPromptDialogTitle(tr("Select Android SDK Folder")); + m_sdkLocationPathChooser->setPromptDialogTitle(Tr::tr("Select Android SDK Folder")); - m_openSslPathChooser->setPromptDialogTitle(tr("Select OpenSSL Include Project File")); + m_openSslPathChooser->setPromptDialogTitle(Tr::tr("Select OpenSSL Include Project File")); if (m_androidConfig.openSslLocation().isEmpty()) m_androidConfig.setOpenSslLocation(m_androidConfig.sdkLocation() / ("android_openssl")); m_openSslPathChooser->setFilePath(m_androidConfig.openSslLocation()); @@ -334,15 +332,15 @@ AndroidSettingsWidget::AndroidSettingsWidget() Column { Group { - title(tr("Android Settings")), + title(Tr::tr("Android Settings")), Grid { - tr("JDK location:"), + Tr::tr("JDK location:"), m_openJdkLocationPathChooser, empty, downloadOpenJdkToolButton, br, - tr("Android SDK location:"), + Tr::tr("Android SDK location:"), m_sdkLocationPathChooser, sdkToolsAutoDownloadButton, downloadSdkToolButton, @@ -350,7 +348,7 @@ AndroidSettingsWidget::AndroidSettingsWidget() empty, empty, sdkManagerToolButton, br, - Column { tr("Android NDK list:"), st }, + Column { Tr::tr("Android NDK list:"), st }, m_ndkListWidget, Column { addCustomNdkButton, @@ -366,9 +364,9 @@ AndroidSettingsWidget::AndroidSettingsWidget() } }, Group { - title(tr("Android OpenSSL settings (Optional)")), + title(Tr::tr("Android OpenSSL settings (Optional)")), Grid { - tr("OpenSSL binaries location:"), + Tr::tr("OpenSSL binaries location:"), m_openSslPathChooser, downloadOpenSslPrebuiltLibs, br, @@ -437,7 +435,7 @@ AndroidSettingsWidget::AndroidSettingsWidget() const FilePath sdkPath = m_androidConfig.sdkLocation(); if (!sdkPath.createDir()) { QMessageBox::warning(this, AndroidSdkDownloader::dialogTitle(), - tr("Failed to create the SDK Tools path %1.") + Tr::tr("Failed to create the SDK Tools path %1.") .arg("\n\"" + sdkPath.toUserOutput() + "\"")); } m_sdkManager.reloadPackages(true); @@ -501,7 +499,7 @@ void AndroidSettingsWidget::addCustomNdkItem() { const QString homePath = QStandardPaths::standardLocations(QStandardPaths::HomeLocation) .constFirst(); - const QString ndkPath = QFileDialog::getExistingDirectory(this, tr("Select an NDK"), homePath); + const QString ndkPath = QFileDialog::getExistingDirectory(this, Tr::tr("Select an NDK"), homePath); if (m_androidConfig.isValidNdk(ndkPath)) { m_androidConfig.addCustomNdk(ndkPath); @@ -510,12 +508,12 @@ void AndroidSettingsWidget::addCustomNdkItem() } } else if (!ndkPath.isEmpty()) { QMessageBox::warning( - this, - tr("Add Custom NDK"), - tr("The selected path has an invalid NDK. This might mean that the path contains space " - "characters, or that it does not have a \"toolchains\" sub-directory, or that the " - "NDK version could not be retrieved because of a missing \"source.properties\" or " - "\"RELEASE.TXT\" file")); + this, + Tr::tr("Add Custom NDK"), + Tr::tr("The selected path has an invalid NDK. This might mean that the path contains space " + "characters, or that it does not have a \"toolchains\" sub-directory, or that the " + "NDK version could not be retrieved because of a missing \"source.properties\" or " + "\"RELEASE.TXT\" file")); } } @@ -629,12 +627,12 @@ void AndroidSettingsWidget::openOpenJDKDownloadUrl() void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent) { const FilePath openSslPath = m_openSslPathChooser->filePath(); - const QString openSslCloneTitle(tr("OpenSSL Cloning")); + const QString openSslCloneTitle(Tr::tr("OpenSSL Cloning")); if (m_openSslSummary->allRowsOk()) { if (!silent) { QMessageBox::information(this, openSslCloneTitle, - tr("OpenSSL prebuilt libraries repository is already configured.")); + Tr::tr("OpenSSL prebuilt libraries repository is already configured.")); } return; } @@ -646,15 +644,15 @@ void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent) QMessageBox::information( this, openSslCloneTitle, - tr("The selected download path (%1) for OpenSSL already exists and the directory is " - "not empty. Select a different path or make sure it is an empty directory.") - .arg(QDir::toNativeSeparators(openSslPath.toString()))); + Tr::tr("The selected download path (%1) for OpenSSL already exists and the directory is " + "not empty. Select a different path or make sure it is an empty directory.") + .arg(QDir::toNativeSeparators(openSslPath.toString()))); return; } QProgressDialog *openSslProgressDialog - = new QProgressDialog(tr("Cloning OpenSSL prebuilt libraries..."), - tr("Cancel"), 0, 0); + = new QProgressDialog(Tr::tr("Cloning OpenSSL prebuilt libraries..."), + Tr::tr("Cancel"), 0, 0); openSslProgressDialog->setWindowModality(Qt::ApplicationModal); openSslProgressDialog->setWindowTitle(openSslCloneTitle); openSslProgressDialog->setFixedSize(openSslProgressDialog->sizeHint()); @@ -670,14 +668,14 @@ void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent) auto failDialog = [=](const QString &msgSuffix = {}) { QStringList sl; - sl << tr("OpenSSL prebuilt libraries cloning failed."); + sl << Tr::tr("OpenSSL prebuilt libraries cloning failed."); if (!msgSuffix.isEmpty()) sl << msgSuffix; - sl << tr("Opening OpenSSL URL for manual download."); + sl << Tr::tr("Opening OpenSSL URL for manual download."); QMessageBox msgBox; msgBox.setText(sl.join(" ")); - msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole); - QAbstractButton *openButton = msgBox.addButton(tr("Open Download URL"), QMessageBox::ActionRole); + msgBox.addButton(Tr::tr("Cancel"), QMessageBox::RejectRole); + QAbstractButton *openButton = msgBox.addButton(Tr::tr("Open Download URL"), QMessageBox::ActionRole); msgBox.exec(); if (msgBox.clickedButton() == openButton) @@ -689,7 +687,7 @@ void AndroidSettingsWidget::downloadOpenSslRepo(const bool silent) openSslProgressDialog->close(); if (gitCloner->error() != QProcess::UnknownError) { if (gitCloner->error() == QProcess::FailedToStart) { - failDialog(tr("The Git tool might not be installed properly on your system.")); + failDialog(Tr::tr("The Git tool might not be installed properly on your system.")); return; } else { failDialog(); @@ -720,7 +718,7 @@ void AndroidSettingsWidget::updateUI() const QListWidgetItem *currentItem = m_ndkListWidget->currentItem(); const FilePath currentNdk = FilePath::fromString(currentItem ? currentItem->text() : ""); - const QString infoText = tr("(SDK Version: %1, NDK Version: %2)") + const QString infoText = Tr::tr("(SDK Version: %1, NDK Version: %2)") .arg(m_androidConfig.sdkToolsVersion().toString()) .arg(currentNdk.isEmpty() ? "" : m_androidConfig.ndkVersion(currentNdk).toString()); m_androidSummary->setInfoText(androidSetupOk ? infoText : ""); @@ -741,20 +739,20 @@ void AndroidSettingsWidget::updateUI() } } - m_makeDefaultNdkButton->setText(isDefaultNdkSelected() ? tr("Unset Default") - : tr("Make Default")); + m_makeDefaultNdkButton->setText(isDefaultNdkSelected() ? Tr::tr("Unset Default") + : Tr::tr("Make Default")); } void AndroidSettingsWidget::downloadSdk() { if (m_androidConfig.sdkToolsOk()) { QMessageBox::warning(this, AndroidSdkDownloader::dialogTitle(), - tr("The selected path already has a valid SDK Tools package.")); + Tr::tr("The selected path already has a valid SDK Tools package.")); validateSdk(); return; } - const QString message = tr("Download and install Android SDK Tools to %1?") + const QString message = Tr::tr("Download and install Android SDK Tools to %1?") .arg("\n\"" + m_sdkLocationPathChooser->filePath().cleanPath().toUserOutput() + "\""); auto userInput = QMessageBox::information(this, AndroidSdkDownloader::dialogTitle(), @@ -768,7 +766,7 @@ void AndroidSettingsWidget::downloadSdk() AndroidSettingsPage::AndroidSettingsPage() { setId(Constants::ANDROID_SETTINGS_ID); - setDisplayName(AndroidSettingsWidget::tr("Android")); + setDisplayName(Tr::tr("Android")); setCategory(ProjectExplorer::Constants::DEVICE_SETTINGS_CATEGORY); setWidgetCreator([] { return new AndroidSettingsWidget; }); } diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index 7d3763c2fb8..853c7212f6b 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -1,9 +1,10 @@ // Copyright (C) 2016 BogDan Vatra // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "androidtoolchain.h" -#include "androidconstants.h" #include "androidconfigurations.h" +#include "androidconstants.h" +#include "androidtoolchain.h" +#include "androidtr.h" #include #include @@ -48,7 +49,7 @@ static ToolChain *findToolChain(FilePath &compilerPath, Id lang, const QString & AndroidToolChain::AndroidToolChain() : ClangToolChain(Constants::ANDROID_TOOLCHAIN_TYPEID) { - setTypeDisplayName(AndroidToolChain::tr("Android Clang")); + setTypeDisplayName(Tr::tr("Android Clang")); } FilePath AndroidToolChain::ndkLocation() const @@ -135,7 +136,7 @@ GccToolChain::DetectedAbisResult AndroidToolChain::detectSupportedAbis() const AndroidToolChainFactory::AndroidToolChainFactory() { - setDisplayName(AndroidToolChain::tr("Android Clang")); + setDisplayName(Tr::tr("Android Clang")); setSupportedToolChainType(Constants::ANDROID_TOOLCHAIN_TYPEID); setSupportedLanguages({ProjectExplorer::Constants::CXX_LANGUAGE_ID}); setToolchainConstructor([] { return new AndroidToolChain; }); diff --git a/src/plugins/android/androidtoolchain.h b/src/plugins/android/androidtoolchain.h index ec042e82e85..10a750c863b 100644 --- a/src/plugins/android/androidtoolchain.h +++ b/src/plugins/android/androidtoolchain.h @@ -14,8 +14,6 @@ using ToolChainList = QList; class AndroidToolChain : public ProjectExplorer::ClangToolChain { - Q_DECLARE_TR_FUNCTIONS(Android::Internal::AndroidToolChain) - public: ~AndroidToolChain() override; diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp index 1f8c3bd2734..4ea5748f594 100644 --- a/src/plugins/android/avddialog.cpp +++ b/src/plugins/android/avddialog.cpp @@ -2,7 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "avddialog.h" - +#include "androidtr.h" #include "androidavdmanager.h" #include "androidconstants.h" #include "androiddevice.h" @@ -43,7 +43,7 @@ AvdDialog::AvdDialog(const AndroidConfig &config, QWidget *parent) m_sdkManager(m_androidConfig) { resize(800, 0); - setWindowTitle(tr("Create new AVD")); + setWindowTitle(Tr::tr("Create new AVD")); m_abiComboBox = new QComboBox; m_abiComboBox->addItems({ @@ -54,7 +54,7 @@ AvdDialog::AvdDialog(const AndroidConfig &config, QWidget *parent) }); m_sdcardSizeSpinBox = new QSpinBox; - m_sdcardSizeSpinBox->setSuffix(tr(" MiB")); + m_sdcardSizeSpinBox->setSuffix(Tr::tr(" MiB")); m_sdcardSizeSpinBox->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); m_sdcardSizeSpinBox->setRange(0, 1000000); m_sdcardSizeSpinBox->setValue(512); @@ -73,7 +73,7 @@ AvdDialog::AvdDialog(const AndroidConfig &config, QWidget *parent) m_deviceDefinitionTypeComboBox = new QComboBox; - m_overwriteCheckBox = new QCheckBox(tr("Overwrite existing AVD name")); + m_overwriteCheckBox = new QCheckBox(Tr::tr("Overwrite existing AVD name")); m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); @@ -84,13 +84,13 @@ AvdDialog::AvdDialog(const AndroidConfig &config, QWidget *parent) Column { Form { - tr("Name:"), m_nameLineEdit, br, - tr("Device definition:"), + Tr::tr("Name:"), m_nameLineEdit, br, + Tr::tr("Device definition:"), Row { m_deviceDefinitionTypeComboBox, m_deviceDefinitionComboBox }, br, - tr("Architecture (ABI):"), m_abiComboBox, br, - tr("Target API:"), m_targetApiComboBox, br, + Tr::tr("Architecture (ABI):"), m_abiComboBox, br, + Tr::tr("Target API:"), m_targetApiComboBox, br, QString(), m_warningText, br, - tr("SD card size:"), m_sdcardSizeSpinBox, br, + Tr::tr("SD card size:"), m_sdcardSizeSpinBox, br, QString(), m_overwriteCheckBox, }, st, @@ -305,13 +305,13 @@ void AvdDialog::updateApiLevelComboBox() m_targetApiComboBox->setEnabled(false); m_warningText->setVisible(true); m_warningText->setText( - tr("Cannot create a new AVD. No suitable Android system image is installed.
" - "Install a system image for the intended Android version from the SDK Manager.")); + Tr::tr("Cannot create a new AVD. No suitable Android system image is installed.
" + "Install a system image for the intended Android version from the SDK Manager.")); m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); } else if (filteredList.isEmpty()) { m_targetApiComboBox->setEnabled(false); m_warningText->setVisible(true); - m_warningText->setText(tr("Cannot create an AVD for ABI %1.
Install a system " + m_warningText->setText(Tr::tr("Cannot create an AVD for ABI %1.
Install a system " "image for it from the SDK Manager tab first.") .arg(abi())); m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); @@ -330,7 +330,7 @@ bool AvdDialog::eventFilter(QObject *obj, QEvent *event) if (!key.isEmpty() && !m_allowedNameChars.match(key).hasMatch()) { QPoint position = m_nameLineEdit->parentWidget()->mapToGlobal(m_nameLineEdit->geometry().bottomLeft()); position -= Utils::ToolTip::offsetFromPosition(); - Utils::ToolTip::show(position, tr("Allowed characters are: a-z A-Z 0-9 and . _ -"), m_nameLineEdit); + Utils::ToolTip::show(position, Tr::tr("Allowed characters are: a-z A-Z 0-9 and . _ -"), m_nameLineEdit); m_hideTipTimer.start(); } else { m_hideTipTimer.stop(); diff --git a/src/plugins/android/createandroidmanifestwizard.cpp b/src/plugins/android/createandroidmanifestwizard.cpp index 30b2aa5c453..930ead0f576 100644 --- a/src/plugins/android/createandroidmanifestwizard.cpp +++ b/src/plugins/android/createandroidmanifestwizard.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 +#include "androidtr.h" #include "createandroidmanifestwizard.h" #include @@ -41,8 +42,6 @@ namespace Internal { class NoApplicationProFilePage : public QWizardPage { - Q_DECLARE_TR_FUNCTIONS(Android::NoApplicationProFilePage) - public: NoApplicationProFilePage(CreateAndroidManifestWizard *wizard); }; @@ -52,9 +51,9 @@ NoApplicationProFilePage::NoApplicationProFilePage(CreateAndroidManifestWizard * auto layout = new QVBoxLayout(this); auto label = new QLabel(this); label->setWordWrap(true); - label->setText(tr("No application .pro file found in this project.")); + label->setText(Tr::tr("No application .pro file found in this project.")); layout->addWidget(label); - setTitle(tr("No Application .pro File")); + setTitle(Tr::tr("No Application .pro File")); } @@ -64,8 +63,6 @@ NoApplicationProFilePage::NoApplicationProFilePage(CreateAndroidManifestWizard * class ChooseProFilePage : public QWizardPage { - Q_DECLARE_TR_FUNCTIONS(Android::ChooseProfilePage) - public: explicit ChooseProFilePage(CreateAndroidManifestWizard *wizard); @@ -82,7 +79,7 @@ ChooseProFilePage::ChooseProFilePage(CreateAndroidManifestWizard *wizard) auto fl = new QFormLayout(this); QLabel *label = new QLabel(this); label->setWordWrap(true); - label->setText(tr("Select the .pro file for which you want to create the Android template files.")); + label->setText(Tr::tr("Select the .pro file for which you want to create the Android template files.")); fl->addRow(label); BuildSystem *buildSystem = wizard->buildSystem(); @@ -99,8 +96,8 @@ ChooseProFilePage::ChooseProFilePage(CreateAndroidManifestWizard *wizard) nodeSelected(m_comboBox->currentIndex()); connect(m_comboBox, &QComboBox::currentIndexChanged, this, &ChooseProFilePage::nodeSelected); - fl->addRow(tr(".pro file:"), m_comboBox); - setTitle(tr("Select a .pro File")); + fl->addRow(Tr::tr(".pro file:"), m_comboBox); + setTitle(Tr::tr("Select a .pro File")); } void ChooseProFilePage::nodeSelected(int index) @@ -116,8 +113,6 @@ void ChooseProFilePage::nodeSelected(int index) class ChooseDirectoryPage : public QWizardPage { - Q_DECLARE_TR_FUNCTIONS(Android::ChooseDirectoryPage) - public: ChooseDirectoryPage(CreateAndroidManifestWizard *wizard); @@ -144,11 +139,11 @@ ChooseDirectoryPage::ChooseDirectoryPage(CreateAndroidManifestWizard *wizard) m_androidPackageSourceDir = new PathChooser(this); m_androidPackageSourceDir->setExpectedKind(PathChooser::Directory); - m_layout->addRow(tr("Android package source directory:"), m_androidPackageSourceDir); + m_layout->addRow(Tr::tr("Android package source directory:"), m_androidPackageSourceDir); m_sourceDirectoryWarning = - new InfoLabel(tr("The Android package source directory cannot be the same as " - "the project directory."), InfoLabel::Error, this); + new InfoLabel(Tr::tr("The Android package source directory cannot be the same as " + "the project directory."), InfoLabel::Error, this); m_sourceDirectoryWarning->setVisible(false); m_sourceDirectoryWarning->setElideMode(Qt::ElideNone); m_sourceDirectoryWarning->setWordWrap(true); @@ -162,8 +157,8 @@ ChooseDirectoryPage::ChooseDirectoryPage(CreateAndroidManifestWizard *wizard) auto checkBox = new QCheckBox(this); connect(checkBox, &QCheckBox::toggled, wizard, &CreateAndroidManifestWizard::setCopyGradle); checkBox->setChecked(false); - checkBox->setText(tr("Copy the Gradle files to Android directory")); - checkBox->setToolTip(tr("It is highly recommended if you are planning to extend the Java part of your Qt application.")); + checkBox->setText(Tr::tr("Copy the Gradle files to Android directory")); + checkBox->setToolTip(Tr::tr("It is highly recommended if you are planning to extend the Java part of your Qt application.")); m_layout->addRow(checkBox); } } @@ -201,9 +196,9 @@ void ChooseDirectoryPage::initializePage() androidPackageDir = FilePath::fromVariant(node->data(Android::Constants::AndroidPackageSourceDir)); if (androidPackageDir.isEmpty()) { - m_label->setText(tr("Select the Android package source directory.\n\n" - "The files in the Android package source directory are copied to the build directory's " - "Android directory and the default files are overwritten.")); + m_label->setText(Tr::tr("Select the Android package source directory.\n\n" + "The files in the Android package source directory are copied to the build directory's " + "Android directory and the default files are overwritten.")); const FilePath projectPath = bti.projectFilePath.isFile() ? bti.projectFilePath.parentDir() : bti.projectFilePath; @@ -212,8 +207,8 @@ void ChooseDirectoryPage::initializePage() connect(m_androidPackageSourceDir, &PathChooser::rawPathChanged, this, &ChooseDirectoryPage::checkPackageSourceDir); } else { - m_label->setText(tr("The Android template files will be created in the %1 set in the .pro " - "file.").arg(QLatin1String(Constants::ANDROID_PACKAGE_SOURCE_DIR))); + m_label->setText(Tr::tr("The Android template files will be created in the %1 set in the .pro " + "file.").arg(QLatin1String(Constants::ANDROID_PACKAGE_SOURCE_DIR))); m_androidPackageSourceDir->setFilePath(androidPackageDir); m_androidPackageSourceDir->setReadOnly(true); } @@ -228,7 +223,7 @@ void ChooseDirectoryPage::initializePage() CreateAndroidManifestWizard::CreateAndroidManifestWizard(BuildSystem *buildSystem) : m_buildSystem(buildSystem) { - setWindowTitle(tr("Create Android Template Files Wizard")); + setWindowTitle(Tr::tr("Create Android Template Files Wizard")); const QList buildTargets = buildSystem->applicationTargets(); QtSupport::QtVersion *version = QtSupport::QtKitAspect::qtVersion(buildSystem->kit()); @@ -319,9 +314,9 @@ void CreateAndroidManifestWizard::createAndroidTemplateFiles() if (!result) { QMessageBox::warning(this, - tr("Project File not Updated"), - tr("Could not update the project file %1.") - .arg(bti.projectFilePath.toUserOutput())); + Tr::tr("Project File not Updated"), + Tr::tr("Could not update the project file %1.") + .arg(bti.projectFilePath.toUserOutput())); } } } diff --git a/src/plugins/android/createandroidmanifestwizard.h b/src/plugins/android/createandroidmanifestwizard.h index 1436a589056..42deed00446 100644 --- a/src/plugins/android/createandroidmanifestwizard.h +++ b/src/plugins/android/createandroidmanifestwizard.h @@ -15,8 +15,6 @@ namespace Internal { class CreateAndroidManifestWizard : public Utils::Wizard { - Q_DECLARE_TR_FUNCTIONS(Android::CreateAndroidManifestWizard) - public: CreateAndroidManifestWizard(ProjectExplorer::BuildSystem *buildSystem); diff --git a/src/plugins/android/javalanguageserver.cpp b/src/plugins/android/javalanguageserver.cpp index 4201f92f33b..40fe85d5bcd 100644 --- a/src/plugins/android/javalanguageserver.cpp +++ b/src/plugins/android/javalanguageserver.cpp @@ -1,11 +1,11 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "javalanguageserver.h" - #include "androidconfigurations.h" #include "androidconstants.h" #include "androidmanager.h" +#include "androidtr.h" +#include "javalanguageserver.h" #include #include @@ -34,7 +34,6 @@ namespace Internal { class JLSSettingsWidget : public QWidget { - Q_DECLARE_TR_FUNCTIONS(JLSSettingsWidget) public: JLSSettingsWidget(const JLSSettings *settings, QWidget *parent); @@ -56,19 +55,19 @@ JLSSettingsWidget::JLSSettingsWidget(const JLSSettings *settings, QWidget *paren { int row = 0; auto *mainLayout = new QGridLayout; - mainLayout->addWidget(new QLabel(tr("Name:")), row, 0); + mainLayout->addWidget(new QLabel(Tr::tr("Name:")), row, 0); mainLayout->addWidget(m_name, row, 1); auto chooser = new VariableChooser(this); chooser->addSupportedWidget(m_name); - mainLayout->addWidget(new QLabel(tr("Java:")), ++row, 0); + mainLayout->addWidget(new QLabel(Tr::tr("Java:")), ++row, 0); m_java->setExpectedKind(PathChooser::ExistingCommand); m_java->setFilePath(settings->m_executable); mainLayout->addWidget(m_java, row, 1); - mainLayout->addWidget(new QLabel(tr("Java Language Server:")), ++row, 0); + mainLayout->addWidget(new QLabel(Tr::tr("Java Language Server:")), ++row, 0); m_ls->setExpectedKind(PathChooser::File); - m_ls->lineEdit()->setPlaceholderText(tr("Path to equinox launcher jar")); + m_ls->lineEdit()->setPlaceholderText(Tr::tr("Path to equinox launcher jar")); m_ls->setPromptDialogFilter("org.eclipse.equinox.launcher_*.jar"); m_ls->setFilePath(settings->m_languageServer); mainLayout->addWidget(m_ls, row, 1); diff --git a/src/plugins/android/splashscreencontainerwidget.cpp b/src/plugins/android/splashscreencontainerwidget.cpp index fb0acee615e..33092491aec 100644 --- a/src/plugins/android/splashscreencontainerwidget.cpp +++ b/src/plugins/android/splashscreencontainerwidget.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 +#include "androidtr.h" #include "splashscreencontainerwidget.h" #include "splashscreenwidget.h" @@ -42,7 +43,7 @@ const char splashscreenFileName[] = "logo"; const char splashscreenPortraitFileName[] = "logo_port"; const char splashscreenLandscapeFileName[] = "logo_land"; const char imageSuffix[] = ".png"; -const QString fileDialogImageFiles = QString(QWidget::tr("Images (*.png *.jpg *.jpeg)")); +const QString fileDialogImageFiles = QString(QWidget::tr("Images (*.png *.jpg *.jpeg)")); // TODO: Implement a centralized images filter string const QSize lowDpiImageSize{200, 320}; const QSize mediumDpiImageSize{320, 480}; const QSize highDpiImageSize{480, 800}; @@ -103,8 +104,8 @@ static QWidget *createPage(TextEditor::TextEditorWidget *textEditorWidget, auto pageLayout = new QHBoxLayout(page); auto genericWidget= addWidgetToPage(page, displaySize, size, - SplashScreenContainerWidget::tr("Splash screen"), - SplashScreenContainerWidget::tr("Select splash screen image") + Tr::tr("Splash screen"), + Tr::tr("Select splash screen image") + sizeToStr(size), textEditorWidget, path, @@ -114,8 +115,8 @@ static QWidget *createPage(TextEditor::TextEditorWidget *textEditorWidget, auto portraitWidget = addWidgetToPage(page, displaySize, portraitSize, - SplashScreenContainerWidget::tr("Portrait splash screen"), - SplashScreenContainerWidget::tr("Select portrait splash screen image") + Tr::tr("Portrait splash screen"), + Tr::tr("Select portrait splash screen image") + sizeToStr(portraitSize), textEditorWidget, path, @@ -125,8 +126,8 @@ static QWidget *createPage(TextEditor::TextEditorWidget *textEditorWidget, auto landscapeWidget = addWidgetToPage(page, landscapeDisplaySize, landscapeSize, - SplashScreenContainerWidget::tr("Landscape splash screen"), - SplashScreenContainerWidget::tr("Select landscape splash screen image") + Tr::tr("Landscape splash screen"), + Tr::tr("Select landscape splash screen image") + sizeToStr(landscapeSize), textEditorWidget, path, @@ -135,7 +136,7 @@ static QWidget *createPage(TextEditor::TextEditorWidget *textEditorWidget, landscapeWidgetContainer); auto clearButton = new QToolButton(page); - clearButton->setText(SplashScreenContainerWidget::tr("Clear All")); + clearButton->setText(Tr::tr("Clear All")); pageLayout->addWidget(clearButton); pageLayout->setAlignment(clearButton, Qt::AlignVCenter); SplashScreenContainerWidget::connect(clearButton, &QAbstractButton::clicked, @@ -163,12 +164,12 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( QTabWidget *tab = new QTabWidget(this); m_stickyCheck = new QCheckBox(this); - m_stickyCheck->setToolTip(tr("A non-sticky splash screen is hidden automatically when an activity is drawn.\n" - "To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen().")); - formLayout->addRow(tr("Sticky splash screen:"), m_stickyCheck); + m_stickyCheck->setToolTip(Tr::tr("A non-sticky splash screen is hidden automatically when an activity is drawn.\n" + "To hide a sticky splash screen, invoke QtAndroid::hideSplashScreen().")); + formLayout->addRow(Tr::tr("Sticky splash screen:"), m_stickyCheck); m_imageShowMode = new QComboBox(this); - formLayout->addRow(tr("Image show mode:"), m_imageShowMode); + formLayout->addRow(Tr::tr("Image show mode:"), m_imageShowMode); const QList imageShowModeMethodsMap = { {"center", "Place the object in the center of the screen in both the vertical and horizontal axis,\n" "not changing its size."}, @@ -179,26 +180,26 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( } m_backgroundColor = new QToolButton(this); - m_backgroundColor->setToolTip(tr("Background color of the splash screen.")); - formLayout->addRow(tr("Background color:"), m_backgroundColor); + m_backgroundColor->setToolTip(Tr::tr("Background color of the splash screen.")); + formLayout->addRow(Tr::tr("Background color:"), m_backgroundColor); m_masterImage = new QToolButton(this); - m_masterImage->setToolTip(tr("Select master image to use.")); + m_masterImage->setToolTip(Tr::tr("Select master image to use.")); m_masterImage->setIcon(QIcon::fromTheme(QLatin1String("document-open"), Utils::Icons::OPENFILE.icon())); - formLayout->addRow(tr("Master image:"), m_masterImage); + formLayout->addRow(Tr::tr("Master image:"), m_masterImage); m_portraitMasterImage = new QToolButton(this); - m_portraitMasterImage->setToolTip(tr("Select portrait master image to use.")); + m_portraitMasterImage->setToolTip(Tr::tr("Select portrait master image to use.")); m_portraitMasterImage->setIcon(QIcon::fromTheme(QLatin1String("document-open"), Utils::Icons::OPENFILE.icon())); - formLayout->addRow(tr("Portrait master image:"), m_portraitMasterImage); + formLayout->addRow(Tr::tr("Portrait master image:"), m_portraitMasterImage); m_landscapeMasterImage = new QToolButton(this); - m_landscapeMasterImage->setToolTip(tr("Select landscape master image to use.")); + m_landscapeMasterImage->setToolTip(Tr::tr("Select landscape master image to use.")); m_landscapeMasterImage->setIcon(QIcon::fromTheme(QLatin1String("document-open"), Utils::Icons::OPENFILE.icon())); - formLayout->addRow(tr("Landscape master image:"), m_landscapeMasterImage); + formLayout->addRow(Tr::tr("Landscape master image:"), m_landscapeMasterImage); auto clearAllButton = new QToolButton(this); - clearAllButton->setText(SplashScreenContainerWidget::tr("Clear All")); + clearAllButton->setText(Tr::tr("Clear All")); auto ldpiPage = createPage(textEditorWidget, m_imageWidgets, m_portraitImageWidgets, m_landscapeImageWidgets, @@ -207,7 +208,7 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( lowDpiImageSize, lowDpiImageSize.transposed(), lowDpiImagePath); - tab->addTab(ldpiPage, tr("LDPI")); + tab->addTab(ldpiPage, Tr::tr("LDPI")); auto mdpiPage = createPage(textEditorWidget, m_imageWidgets, m_portraitImageWidgets, m_landscapeImageWidgets, mediumDpiScalingRatio, @@ -215,7 +216,7 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( mediumDpiImageSize, mediumDpiImageSize.transposed(), mediumDpiImagePath); - tab->addTab(mdpiPage, tr("MDPI")); + tab->addTab(mdpiPage, Tr::tr("MDPI")); auto hdpiPage = createPage(textEditorWidget, m_imageWidgets, m_portraitImageWidgets, m_landscapeImageWidgets, highDpiScalingRatio, @@ -223,7 +224,7 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( highDpiImageSize, highDpiImageSize.transposed(), highDpiImagePath); - tab->addTab(hdpiPage, tr("HDPI")); + tab->addTab(hdpiPage, Tr::tr("HDPI")); auto xHdpiPage = createPage(textEditorWidget, m_imageWidgets, m_portraitImageWidgets, m_landscapeImageWidgets, extraHighDpiScalingRatio, @@ -231,7 +232,7 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( extraHighDpiImageSize, extraHighDpiImageSize.transposed(), extraHighDpiImagePath); - tab->addTab(xHdpiPage, tr("XHDPI")); + tab->addTab(xHdpiPage, Tr::tr("XHDPI")); auto xxHdpiPage = createPage(textEditorWidget, m_imageWidgets, m_portraitImageWidgets, m_landscapeImageWidgets, extraExtraHighDpiScalingRatio, @@ -239,7 +240,7 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( extraExtraHighDpiImageSize, extraExtraHighDpiImageSize.transposed(), extraExtraHighDpiImagePath); - tab->addTab(xxHdpiPage, tr("XXHDPI")); + tab->addTab(xxHdpiPage, Tr::tr("XXHDPI")); auto xxxHdpiPage = createPage(textEditorWidget, m_imageWidgets, m_portraitImageWidgets, m_landscapeImageWidgets, extraExtraExtraHighDpiScalingRatio, @@ -247,7 +248,7 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( extraExtraExtraHighDpiImageSize, extraExtraExtraHighDpiImageSize.transposed(), extraExtraExtraHighDpiImagePath); - tab->addTab(xxxHdpiPage, tr("XXXHDPI")); + tab->addTab(xxxHdpiPage, Tr::tr("XXXHDPI")); formLayout->setContentsMargins(10, 10, 10, 10); formLayout->setSpacing(10); settingsLayout->addLayout(formLayout); @@ -261,11 +262,11 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( auto warningLabel = new QLabel(this); warningLabel->setAlignment(Qt::AlignHCenter); - warningLabel->setText(tr("An image is used for the splashscreen. Qt Creator manages\n" - "splashscreen by using a different method which requires changing\n" - "the manifest file by overriding your settings. Allow override?")); + warningLabel->setText(Tr::tr("An image is used for the splashscreen. Qt Creator manages\n" + "splashscreen by using a different method which requires changing\n" + "the manifest file by overriding your settings. Allow override?")); m_convertSplashscreen = new QToolButton(this); - m_convertSplashscreen->setText(tr("Convert")); + m_convertSplashscreen->setText(Tr::tr("Convert")); noSplashscreenLayout->addStretch(); noSplashscreenLayout->addWidget(warningLabel); noSplashscreenLayout->addWidget(m_convertSplashscreen); @@ -314,7 +315,7 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( connect(m_backgroundColor, &QToolButton::clicked, this, [this] { const QColor color = QColorDialog::getColor(m_splashScreenBackgroundColor, this, - tr("Select background color")); + Tr::tr("Select background color")); if (color.isValid()) { setBackgroundColor(color); createSplashscreenThemes(); @@ -322,7 +323,7 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( } }); connect(m_masterImage, &QToolButton::clicked, this, [this] { - const FilePath file = FileUtils::getOpenFilePath(this, tr("Select master image"), + const FilePath file = FileUtils::getOpenFilePath(this, Tr::tr("Select master image"), FileUtils::homePath(), fileDialogImageFiles); if (!file.isEmpty()) { for (auto &&imageWidget : m_imageWidgets) @@ -332,7 +333,7 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( } }); connect(m_portraitMasterImage, &QToolButton::clicked, this, [this] { - const FilePath file = FileUtils::getOpenFilePath(this, tr("Select portrait master image"), + const FilePath file = FileUtils::getOpenFilePath(this, Tr::tr("Select portrait master image"), FileUtils::homePath(), fileDialogImageFiles); if (!file.isEmpty()) { for (auto &&imageWidget : m_portraitImageWidgets) @@ -342,7 +343,7 @@ SplashScreenContainerWidget::SplashScreenContainerWidget( } }); connect(m_landscapeMasterImage, &QToolButton::clicked, this, [this] { - const FilePath file = FileUtils::getOpenFilePath(this, tr("Select landscape master image"), + const FilePath file = FileUtils::getOpenFilePath(this, Tr::tr("Select landscape master image"), FileUtils::homePath(), fileDialogImageFiles); if (!file.isEmpty()) { for (auto &&imageWidget : m_landscapeImageWidgets) diff --git a/src/plugins/android/splashscreenwidget.cpp b/src/plugins/android/splashscreenwidget.cpp index 35bd714970f..d5a371c970b 100644 --- a/src/plugins/android/splashscreenwidget.cpp +++ b/src/plugins/android/splashscreenwidget.cpp @@ -1,6 +1,7 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 +#include "androidtr.h" #include "splashscreenwidget.h" #include @@ -64,10 +65,10 @@ SplashScreenWidget::SplashScreenWidget( m_scaleWarningLabel->setMinimumSize(clearAndWarningSize); m_scaleWarningLabel->setMaximumSize(clearAndWarningSize); m_scaleWarningLabel->setPixmap(Utils::Icons::WARNING.icon().pixmap(clearAndWarningSize)); - m_scaleWarningLabel->setToolTip(tr("Icon scaled up.")); + m_scaleWarningLabel->setToolTip(Tr::tr("Icon scaled up.")); m_scaleWarningLabel->setVisible(false); } - auto label = new QLabel(tr("Click to select..."), parent); + auto label = new QLabel(Tr::tr("Click to select..."), parent); splashLayout->addWidget(splashTitle); splashLayout->setAlignment(splashTitle, Qt::AlignHCenter); splashButtonLayout->setColumnMinimumWidth(0, 16); @@ -166,7 +167,7 @@ void SplashScreenWidget::selectImage() const FilePath file = FileUtils::getOpenFilePath(this, m_imageSelectionText, FileUtils::homePath(), QStringLiteral("%1 (*.png *.jpg *.jpeg)") - .arg(tr("Images"))); + .arg(Tr::tr("Images"))); if (file.isEmpty()) return; setImageFromPath(file, false); From a234443bee8a560e35f8acc113fd2864054808fc Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 5 Oct 2022 17:12:41 +0200 Subject: [PATCH 084/104] Docker: Use new FileFilter::asFindArguments function Change-Id: I7a4e02740f27cdb72d3a876985b0941ffedc1ff2 Reviewed-by: Qt CI Bot Reviewed-by: Christian Kandeler --- src/plugins/docker/dockerdevice.cpp | 71 +---------------------------- 1 file changed, 1 insertion(+), 70 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 64d1b1edf6e..260b857815b 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -902,77 +902,8 @@ void DockerDevice::iterateWithFind(const FilePath &filePath, QTC_ASSERT(callBack, return); QTC_CHECK(filePath.isAbsolutePath()); QStringList arguments{filePath.path()}; + arguments << filter.asFindArguments(); - const QDir::Filters filters = filter.fileFilters; - if (filters & QDir::NoSymLinks) - arguments.prepend("-H"); - else - arguments.prepend("-L"); - - arguments.append({"-mindepth", "1"}); - - if (!filter.iteratorFlags.testFlag(QDirIterator::Subdirectories)) - arguments.append({"-maxdepth", "1"}); - - QStringList filterOptions; - - if (!(filters & QDir::Hidden)) - filterOptions << "!" << "-name" << ".*"; - - QStringList filterFilesAndDirs; - if (filters & QDir::Dirs) - filterFilesAndDirs << "-type" << "d"; - if (filters & QDir::Files) { - if (!filterFilesAndDirs.isEmpty()) - filterFilesAndDirs << "-o"; - filterFilesAndDirs << "-type" << "f"; - } - if (!filterFilesAndDirs.isEmpty()) - filterOptions << "(" << filterFilesAndDirs << ")"; - - QStringList accessOptions; - if (filters & QDir::Readable) - accessOptions << "-readable"; - if (filters & QDir::Writable) { - if (!accessOptions.isEmpty()) - accessOptions << "-o"; - accessOptions << "-writable"; - } - if (filters & QDir::Executable) { - if (!accessOptions.isEmpty()) - accessOptions << "-o"; - accessOptions << "-executable"; - } - - if (!accessOptions.isEmpty()) - filterOptions << "(" << accessOptions << ")"; - - QTC_CHECK(filters ^ QDir::AllDirs); - QTC_CHECK(filters ^ QDir::Drives); - QTC_CHECK(filters ^ QDir::NoDot); - QTC_CHECK(filters ^ QDir::NoDotDot); - QTC_CHECK(filters ^ QDir::Hidden); - QTC_CHECK(filters ^ QDir::System); - - const QString nameOption = (filters & QDir::CaseSensitive) ? QString{"-name"} - : QString{"-iname"}; - if (!filter.nameFilters.isEmpty()) { - const QRegularExpression oneChar("\\[.*?\\]"); - bool addedFirst = false; - for (const QString ¤t : filter.nameFilters) { - if (current.indexOf(oneChar) != -1) { - qCDebug(dockerDeviceLog) - << "Skipped" << current << "due to presence of [] wildcard"; - continue; - } - - if (addedFirst) - filterOptions << "-o"; - filterOptions << nameOption << current; - addedFirst = true; - } - } - arguments << filterOptions; const QByteArray output = d->outputForRunInShell({"find", arguments}); const QString out = QString::fromUtf8(output.data(), output.size()); if (!output.isEmpty() && !out.startsWith(filePath.path())) { // missing find, unknown option From 714e6f5c8fd45b36f4af8bfc443f264e8aa2fcaf Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 5 Oct 2022 17:50:40 +0200 Subject: [PATCH 085/104] Utils: Make more unix find code re-usable Change-Id: I8fe95158ed77c8f9fb8c86a8e813b5c5de425b8a Reviewed-by: Christian Kandeler --- src/libs/utils/fileutils.cpp | 51 ++++++++++++++++++++++++++++- src/libs/utils/fileutils.h | 18 +++++++--- src/plugins/docker/dockerdevice.cpp | 47 ++------------------------ 3 files changed, 66 insertions(+), 50 deletions(-) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 417f74eb370..8d3efae79de 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -5,6 +5,7 @@ #include "savefile.h" #include "algorithm.h" +#include "commandline.h" #include "qtcassert.h" #include "hostosinfo.h" @@ -583,6 +584,8 @@ FilePath FileUtils::getOpenFilePathFromDevice(QWidget *parent, return {}; } +#endif // QT_WIDGETS_LIB + // Used on 'ls' output on unix-like systems. void FileUtils::iterateLsOutput(const FilePath &base, const QStringList &entries, @@ -619,7 +622,53 @@ void FileUtils::iterateLsOutput(const FilePath &base, } } -#endif // QT_WIDGETS_LIB +// returns whether 'find' could be used. +static bool iterateWithFind(const FilePath &filePath, + const FileFilter &filter, + const std::function &runInShell, + const std::function &callBack) +{ + QTC_CHECK(filePath.isAbsolutePath()); + QStringList arguments{filePath.path()}; + arguments << filter.asFindArguments(); + + const QByteArray output = runInShell({"find", arguments}); + const QString out = QString::fromUtf8(output.data(), output.size()); + if (!output.isEmpty() && !out.startsWith(filePath.path())) // missing find, unknown option + return false; + + const QStringList entries = out.split("\n", Qt::SkipEmptyParts); + for (const QString &entry : entries) { + if (entry.startsWith("find: ")) { + const FilePath fp = FilePath::fromString(entry); + if (!callBack(fp.onDevice(filePath))) + break; + } + } + return true; +} + +void FileUtils::iterateUnixDirectory(const FilePath &filePath, + const FileFilter &filter, + bool *useFind, + const std::function &runInShell, + const std::function &callBack) +{ + QTC_ASSERT(callBack, return); + + // We try to use 'find' first, because that can filter better directly. + // Unfortunately, it's not installed on all devices by default. + if (useFind && *useFind) { + if (iterateWithFind(filePath, filter, runInShell, callBack)) + return; + *useFind = false; // remember the failure for the next time and use the 'ls' fallback below. + } + + // if we do not have find - use ls as fallback + const QByteArray output = runInShell({"ls", {"-1", "-b", "--", filePath.path()}}); + const QStringList entries = QString::fromUtf8(output).split('\n', Qt::SkipEmptyParts); + FileUtils::iterateLsOutput(filePath, entries, filter, callBack); +} /*! Copies the directory specified by \a srcFilePath recursively to \a tgtFilePath. \a tgtFilePath will contain diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 8f4544a0fd1..09ba6ece639 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -31,6 +31,8 @@ QT_END_NAMESPACE namespace Utils { +class CommandLine; + class QTCREATOR_UTILS_EXPORT FileUtils { public: @@ -77,10 +79,18 @@ public: static FilePaths toFilePathList(const QStringList &paths); - static void iterateLsOutput(const FilePath &base, - const QStringList &entries, - const FileFilter &filter, - const std::function &callBack); + static void iterateLsOutput( + const FilePath &base, + const QStringList &entries, + const FileFilter &filter, + const std::function &callBack); + + static void iterateUnixDirectory( + const FilePath &base, + const FileFilter &filter, + bool *useFind, + const std::function &runInShell, + const std::function &callBack); static qint64 bytesAvailableFromDFOutput(const QByteArray &dfOutput); diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 260b857815b..d50e81ccbe6 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -143,16 +143,12 @@ public: QString repoAndTag() const { return m_data.repoAndTag(); } QString dockerImageId() const { return m_data.imageId; } - bool useFind() const { return m_useFind; } - void setUseFind(bool useFind) { m_useFind = useFind; } - Environment environment(); CommandLine withDockerExecCmd(const CommandLine &cmd, bool interactive = false); bool prepareForBuild(const Target *target); -private: bool createContainer(); void startContainer(); void stopCurrentContainer(); @@ -895,52 +891,13 @@ bool DockerDevice::ensureReachable(const FilePath &other) const return d->ensureReachable(other.parentDir()); } -void DockerDevice::iterateWithFind(const FilePath &filePath, - const std::function &callBack, - const FileFilter &filter) const -{ - QTC_ASSERT(callBack, return); - QTC_CHECK(filePath.isAbsolutePath()); - QStringList arguments{filePath.path()}; - arguments << filter.asFindArguments(); - - const QByteArray output = d->outputForRunInShell({"find", arguments}); - const QString out = QString::fromUtf8(output.data(), output.size()); - if (!output.isEmpty() && !out.startsWith(filePath.path())) { // missing find, unknown option - qCDebug(dockerDeviceLog) << "Setting 'do not use find'" << out.left(out.indexOf('\n')); - d->setUseFind(false); - return; - } - - const QStringList entries = out.split("\n", Qt::SkipEmptyParts); - for (const QString &entry : entries) { - if (entry.startsWith("find: ")) - continue; - const FilePath fp = FilePath::fromString(entry); - - if (!callBack(fp.onDevice(filePath))) - break; - } -} - void DockerDevice::iterateDirectory(const FilePath &filePath, const std::function &callBack, const FileFilter &filter) const { QTC_ASSERT(handlesFile(filePath), return); - - if (d->useFind()) { - iterateWithFind(filePath, callBack, filter); - // d->m_useFind will be set to false if 'find' is not found. In this - // case fall back to 'ls' below. - if (d->useFind()) - return; - } - - // if we do not have find - use ls as fallback - const QByteArray output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}}); - const QStringList entries = QString::fromUtf8(output).split('\n', Qt::SkipEmptyParts); - FileUtils::iterateLsOutput(filePath, entries, filter, callBack); + auto runInShell = [this](const CommandLine &cmd) { return d->outputForRunInShell(cmd); }; + FileUtils::iterateUnixDirectory(filePath, filter, &d->m_useFind, runInShell, callBack); } std::optional DockerDevice::fileContents(const FilePath &filePath, From d659ace47fa43c5189b2674e0f2ad8d505bfcfbc Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 4 Oct 2022 21:18:48 +0200 Subject: [PATCH 086/104] VersionSelector: Avoid potential leaks on early return Finish setting GUI before early return from c'tor. Fixes the warnings: Potential leak of memory pointed to by 'buttonBox', etc... Amends 7e93ab9a27074bad3d0b3c4bc62f2e84817f962f Change-Id: Ibdf0e2f97eda3494008cedb21d2cdbe2d5b38006 Reviewed-by: hjk --- src/plugins/clearcase/versionselector.cpp | 37 ++++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/plugins/clearcase/versionselector.cpp b/src/plugins/clearcase/versionselector.cpp index 1116ced6a05..09c9796630f 100644 --- a/src/plugins/clearcase/versionselector.cpp +++ b/src/plugins/clearcase/versionselector.cpp @@ -51,24 +51,6 @@ VersionSelector::VersionSelector(const QString &fileName, const QString &message + Tr::tr("Note: You will not be able to check in this file without merging " "the changes (not supported by the plugin)") + "

To get your password, " "addButton(tr("Anonymous"), QDialogButtonBox::AcceptRole); + QPushButton *anonymous = m_buttonBox->addButton(Git::Tr::tr("Anonymous"), QDialogButtonBox::AcceptRole); connect(m_buttonBox, &QDialogButtonBox::clicked, this, [this, anonymous](QAbstractButton *button) { if (button == anonymous) diff --git a/src/plugins/git/gerrit/gerritdialog.cpp b/src/plugins/git/gerrit/gerritdialog.cpp index 2abf25249f3..e6f83070137 100644 --- a/src/plugins/git/gerrit/gerritdialog.cpp +++ b/src/plugins/git/gerrit/gerritdialog.cpp @@ -8,6 +8,7 @@ #include "gerritremotechooser.h" #include "../gitplugin.h" +#include "../gittr.h" #include @@ -54,7 +55,7 @@ GerritDialog::GerritDialog(const QSharedPointer &p, , m_model(new GerritModel(p, this)) , m_queryModel(new QStringListModel(this)) { - setWindowTitle(tr("Gerrit")); + setWindowTitle(Git::Tr::tr("Gerrit")); resize(950, 706); m_repositoryLabel = new QLabel(this); @@ -64,12 +65,12 @@ GerritDialog::GerritDialog(const QSharedPointer &p, m_remoteComboBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); m_remoteComboBox->setMinimumSize(QSize(40, 0)); - auto changesGroup = new QGroupBox(tr("Changes")); + auto changesGroup = new QGroupBox(Git::Tr::tr("Changes")); changesGroup->setMinimumSize(QSize(0, 350)); m_queryLineEdit = new FancyLineEdit(changesGroup); m_queryLineEdit->setMinimumSize(QSize(400, 0)); - m_queryLineEdit->setPlaceholderText(tr("Change #, SHA-1, tr:id, owner:email or reviewer:email")); + m_queryLineEdit->setPlaceholderText(Git::Tr::tr("Change #, SHA-1, tr:id, owner:email or reviewer:email")); m_queryLineEdit->setSpecialCompleter(new QCompleter(m_queryModel, this)); m_queryLineEdit->setValidationFunction( [this](FancyLineEdit *, QString *) { return m_model->state() != GerritModel::Error; }); @@ -84,7 +85,7 @@ GerritDialog::GerritDialog(const QSharedPointer &p, m_treeView->setUniformRowHeights(true); m_treeView->setSortingEnabled(true); - auto detailsGroup = new QGroupBox(tr("Details")); + auto detailsGroup = new QGroupBox(Git::Tr::tr("Details")); detailsGroup->setMinimumSize(QSize(0, 175)); m_detailsBrowser = new QTextBrowser(detailsGroup); @@ -92,7 +93,7 @@ GerritDialog::GerritDialog(const QSharedPointer &p, m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); - auto queryLabel = new QLabel(tr("&Query:"), changesGroup); + auto queryLabel = new QLabel(Git::Tr::tr("&Query:"), changesGroup); queryLabel->setBuddy(m_queryLineEdit); m_remoteComboBox->setParameters(m_parameters); @@ -113,10 +114,10 @@ GerritDialog::GerritDialog(const QSharedPointer &p, m_progressIndicator->attachToWidget(m_treeView->viewport()); m_progressIndicator->hide(); - m_displayButton = addActionButton(tr("&Show"), [this]() { slotFetchDisplay(); }); - m_cherryPickButton = addActionButton(tr("Cherry &Pick"), [this]() { slotFetchCherryPick(); }); - m_checkoutButton = addActionButton(tr("C&heckout"), [this]() { slotFetchCheckout(); }); - m_refreshButton = addActionButton(tr("&Refresh"), [this]() { refresh(); }); + m_displayButton = addActionButton(Git::Tr::tr("&Show"), [this]() { slotFetchDisplay(); }); + m_cherryPickButton = addActionButton(Git::Tr::tr("Cherry &Pick"), [this]() { slotFetchCherryPick(); }); + m_checkoutButton = addActionButton(Git::Tr::tr("C&heckout"), [this]() { slotFetchCheckout(); }); + m_refreshButton = addActionButton(Git::Tr::tr("&Refresh"), [this]() { refresh(); }); m_refreshButton->setDefault(true); using namespace Layouting; @@ -142,7 +143,7 @@ GerritDialog::GerritDialog(const QSharedPointer &p, splitter->addWidget(detailsGroup); Column { - Row { m_repositoryLabel, st, tr("Remote:"), m_remoteComboBox }, + Row { m_repositoryLabel, st, Git::Tr::tr("Remote:"), m_remoteComboBox }, splitter, m_buttonBox }.attachTo(this); @@ -340,7 +341,7 @@ void GerritDialog::fetchStarted(const QSharedPointer &change) // Disable buttons to prevent parallel gerrit operations which can cause mix-ups. m_fetchRunning = true; updateButtons(); - const QString toolTip = tr("Fetching \"%1\"...").arg(change->title); + const QString toolTip = Git::Tr::tr("Fetching \"%1\"...").arg(change->title); m_displayButton->setToolTip(toolTip); m_cherryPickButton->setToolTip(toolTip); m_checkoutButton->setToolTip(toolTip); diff --git a/src/plugins/git/gerrit/gerritmodel.cpp b/src/plugins/git/gerrit/gerritmodel.cpp index 1f453f10e0d..9691a8266a4 100644 --- a/src/plugins/git/gerrit/gerritmodel.cpp +++ b/src/plugins/git/gerrit/gerritmodel.cpp @@ -3,6 +3,7 @@ #include "gerritmodel.h" #include "../gitclient.h" +#include "../gittr.h" #include #include @@ -195,7 +196,7 @@ QString GerritChange::fullTitle() const { QString res = title; if (status == "DRAFT") - res += GerritModel::tr(" (Draft)"); + res += Git::Tr::tr(" (Draft)"); return res; } @@ -293,7 +294,7 @@ QueryContext::~QueryContext() void QueryContext::start() { - Core::FutureProgress *fp = Core::ProgressManager::addTask(m_progress.future(), tr("Querying Gerrit"), + Core::FutureProgress *fp = Core::ProgressManager::addTask(m_progress.future(), Git::Tr::tr("Querying Gerrit"), "gerrit-query"); fp->setKeepOnFinish(Core::FutureProgress::HideOnFinish); m_progress.reportStarted(); @@ -326,11 +327,11 @@ void QueryContext::processDone() emit errorText(m_error); if (m_process.exitStatus() == QProcess::CrashExit) - errorTermination(tr("%1 crashed.").arg(m_binary.toUserOutput())); + errorTermination(Git::Tr::tr("%1 crashed.").arg(m_binary.toUserOutput())); else if (m_process.exitCode()) - errorTermination(tr("%1 returned %2.").arg(m_binary.toUserOutput()).arg(m_process.exitCode())); + errorTermination(Git::Tr::tr("%1 returned %2.").arg(m_binary.toUserOutput()).arg(m_process.exitCode())); else if (m_process.result() != ProcessResult::FinishedWithSuccess) - errorTermination(tr("Error running %1: %2").arg(m_binary.toUserOutput(), m_process.errorString())); + errorTermination(Git::Tr::tr("Error running %1: %2").arg(m_binary.toUserOutput(), m_process.errorString())); else emit resultRetrieved(m_output); @@ -346,13 +347,13 @@ void QueryContext::timeout() QWidget *parent = QApplication::activeModalWidget(); if (!parent) parent = QApplication::activeWindow(); - QMessageBox box(QMessageBox::Question, tr("Timeout"), - tr("The gerrit process has not responded within %1 s.\n" + QMessageBox box(QMessageBox::Question, Git::Tr::tr("Timeout"), + Git::Tr::tr("The gerrit process has not responded within %1 s.\n" "Most likely this is caused by problems with SSH authentication.\n" "Would you like to terminate it?"). arg(timeOutMS / 1000), QMessageBox::NoButton, parent); - QPushButton *terminateButton = box.addButton(tr("Terminate"), QMessageBox::YesRole); - box.addButton(tr("Keep Running"), QMessageBox::NoRole); + QPushButton *terminateButton = box.addButton(Git::Tr::tr("Terminate"), QMessageBox::YesRole); + box.addButton(Git::Tr::tr("Keep Running"), QMessageBox::NoRole); connect(&m_process, &QtcProcess::done, &box, &QDialog::reject); box.exec(); if (m_process.state() != QProcess::Running) @@ -368,9 +369,9 @@ GerritModel::GerritModel(const QSharedPointer &p, QObject *par , m_parameters(p) { QStringList headers; // Keep in sync with GerritChange::toHtml() - headers << "#" << tr("Subject") << tr("Owner") - << tr("Updated") << tr("Project") - << tr("Approvals") << tr("Status"); + headers << "#" << Git::Tr::tr("Subject") << Git::Tr::tr("Owner") + << Git::Tr::tr("Updated") << Git::Tr::tr("Project") + << Git::Tr::tr("Approvals") << Git::Tr::tr("Status"); setHorizontalHeaderLabels(headers); } @@ -413,15 +414,15 @@ QString GerritModel::dependencyHtml(const QString &header, const int changeNumbe QString GerritModel::toHtml(const QModelIndex& index) const { - static const QString subjectHeader = GerritModel::tr("Subject"); - static const QString numberHeader = GerritModel::tr("Number"); - static const QString ownerHeader = GerritModel::tr("Owner"); - static const QString projectHeader = GerritModel::tr("Project"); - static const QString statusHeader = GerritModel::tr("Status"); - static const QString patchSetHeader = GerritModel::tr("Patch set"); - static const QString urlHeader = GerritModel::tr("URL"); - static const QString dependsOnHeader = GerritModel::tr("Depends on"); - static const QString neededByHeader = GerritModel::tr("Needed by"); + static const QString subjectHeader = Git::Tr::tr("Subject"); + static const QString numberHeader = Git::Tr::tr("Number"); + static const QString ownerHeader = Git::Tr::tr("Owner"); + static const QString projectHeader = Git::Tr::tr("Project"); + static const QString statusHeader = Git::Tr::tr("Status"); + static const QString patchSetHeader = Git::Tr::tr("Patch set"); + static const QString urlHeader = Git::Tr::tr("URL"); + static const QString dependsOnHeader = Git::Tr::tr("Depends on"); + static const QString neededByHeader = Git::Tr::tr("Needed by"); if (!index.isValid()) return QString(); @@ -781,7 +782,7 @@ static bool parseOutput(const QSharedPointer ¶meters, QJsonParseError error; const QJsonDocument doc = QJsonDocument::fromJson(adaptedOutput, &error); if (doc.isNull()) { - QString errorMessage = GerritModel::tr("Parse error: \"%1\" -> %2") + QString errorMessage = Git::Tr::tr("Parse error: \"%1\" -> %2") .arg(QString::fromUtf8(output)) .arg(error.errorString()); qWarning() << errorMessage; @@ -806,7 +807,7 @@ static bool parseOutput(const QSharedPointer ¶meters, } else { const QByteArray jsonObject = QJsonDocument(object).toJson(); qWarning("%s: Parse error: '%s'.", Q_FUNC_INFO, jsonObject.constData()); - VcsOutputWindow::appendError(GerritModel::tr("Parse error: \"%1\"") + VcsOutputWindow::appendError(Git::Tr::tr("Parse error: \"%1\"") .arg(QString::fromUtf8(jsonObject))); res = false; } diff --git a/src/plugins/git/gerrit/gerritoptionspage.cpp b/src/plugins/git/gerrit/gerritoptionspage.cpp index 2a9ba514dcb..af7774f905d 100644 --- a/src/plugins/git/gerrit/gerritoptionspage.cpp +++ b/src/plugins/git/gerrit/gerritoptionspage.cpp @@ -4,6 +4,7 @@ #include "gerritoptionspage.h" #include "gerritparameters.h" #include "gerritserver.h" +#include "gittr.h" #include #include @@ -24,7 +25,7 @@ GerritOptionsPage::GerritOptionsPage(const QSharedPointer &p, , m_parameters(p) { setId("Gerrit"); - setDisplayName(tr("Gerrit")); + setDisplayName(Git::Tr::tr("Gerrit")); setCategory(VcsBase::Constants::VCS_SETTINGS_CATEGORY); } @@ -70,24 +71,24 @@ GerritOptionsWidget::GerritOptionsWidget(QWidget *parent) , m_sshChooser(new Utils::PathChooser) , m_curlChooser(new Utils::PathChooser) , m_portSpinBox(new QSpinBox(this)) - , m_httpsCheckBox(new QCheckBox(tr("HTTPS"))) + , m_httpsCheckBox(new QCheckBox(Git::Tr::tr("HTTPS"))) { auto formLayout = new QFormLayout(this); formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - formLayout->addRow(tr("&Host:"), m_hostLineEdit); - formLayout->addRow(tr("&User:"), m_userLineEdit); + formLayout->addRow(Git::Tr::tr("&Host:"), m_hostLineEdit); + formLayout->addRow(Git::Tr::tr("&User:"), m_userLineEdit); m_sshChooser->setExpectedKind(Utils::PathChooser::ExistingCommand); m_sshChooser->setCommandVersionArguments({"-V"}); m_sshChooser->setHistoryCompleter("Git.SshCommand.History"); - formLayout->addRow(tr("&ssh:"), m_sshChooser); + formLayout->addRow(Git::Tr::tr("&ssh:"), m_sshChooser); m_curlChooser->setExpectedKind(Utils::PathChooser::ExistingCommand); m_curlChooser->setCommandVersionArguments({"-V"}); - formLayout->addRow(tr("cur&l:"), m_curlChooser); + formLayout->addRow(Git::Tr::tr("cur&l:"), m_curlChooser); m_portSpinBox->setMinimum(1); m_portSpinBox->setMaximum(65535); - formLayout->addRow(tr("SSH &Port:"), m_portSpinBox); - formLayout->addRow(tr("P&rotocol:"), m_httpsCheckBox); - m_httpsCheckBox->setToolTip(tr( + formLayout->addRow(Git::Tr::tr("SSH &Port:"), m_portSpinBox); + formLayout->addRow(Git::Tr::tr("P&rotocol:"), m_httpsCheckBox); + m_httpsCheckBox->setToolTip(Git::Tr::tr( "Determines the protocol used to form a URL in case\n" "\"canonicalWebUrl\" is not configured in the file\n" "\"gerrit.config\".")); diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp index 6d1431aac6c..31e515636db 100644 --- a/src/plugins/git/gerrit/gerritplugin.cpp +++ b/src/plugins/git/gerrit/gerritplugin.cpp @@ -8,8 +8,10 @@ #include "gerritoptionspage.h" #include "gerritpushdialog.h" -#include "../gitplugin.h" #include "../gitclient.h" +#include "../gitplugin.h" +#include "../gittr.h" + #include #include @@ -139,7 +141,7 @@ FetchContext::~FetchContext() void FetchContext::start() { m_progress.setProgressRange(0, 2); - FutureProgress *fp = ProgressManager::addTask(m_progress.future(), tr("Fetching from Gerrit"), + FutureProgress *fp = ProgressManager::addTask(m_progress.future(), Git::Tr::tr("Fetching from Gerrit"), "gerrit-fetch"); fp->setKeepOnFinish(FutureProgress::HideOnFinish); m_progress.reportStarted(); @@ -237,14 +239,14 @@ void GerritPlugin::initialize(ActionContainer *ac) { m_parameters->fromSettings(ICore::settings()); - QAction *openViewAction = new QAction(tr("Gerrit..."), this); + QAction *openViewAction = new QAction(Git::Tr::tr("Gerrit..."), this); m_gerritCommand = ActionManager::registerAction(openViewAction, Constants::GERRIT_OPEN_VIEW); connect(openViewAction, &QAction::triggered, this, &GerritPlugin::openView); ac->addAction(m_gerritCommand); - QAction *pushAction = new QAction(tr("Push to Gerrit..."), this); + QAction *pushAction = new QAction(Git::Tr::tr("Push to Gerrit..."), this); m_pushToGerritCommand = ActionManager::registerAction(pushAction, Constants::GERRIT_PUSH); @@ -281,7 +283,7 @@ void GerritPlugin::push(const FilePath &topLevel) const QString initErrorMessage = dialog.initErrorMessage(); if (!initErrorMessage.isEmpty()) { - QMessageBox::warning(ICore::dialogParent(), tr("Initialization Failed"), initErrorMessage); + QMessageBox::warning(ICore::dialogParent(), Git::Tr::tr("Initialization Failed"), initErrorMessage); return; } @@ -303,8 +305,8 @@ void GerritPlugin::openView() { if (m_dialog.isNull()) { while (!m_parameters->isValid()) { - QMessageBox::warning(Core::ICore::dialogParent(), tr("Error"), - tr("Invalid Gerrit configuration. Host, user and ssh binary are mandatory.")); + QMessageBox::warning(Core::ICore::dialogParent(), Git::Tr::tr("Error"), + Git::Tr::tr("Invalid Gerrit configuration. Host, user and ssh binary are mandatory.")); if (!ICore::showOptionsDialog("Gerrit")) return; } @@ -352,7 +354,7 @@ void GerritPlugin::fetch(const QSharedPointer &change, int mode) // Locate git. const Utils::FilePath git = GitClient::instance()->vcsBinary(); if (git.isEmpty()) { - VcsBase::VcsOutputWindow::appendError(tr("Git is not available.")); + VcsBase::VcsOutputWindow::appendError(Git::Tr::tr("Git is not available.")); return; } @@ -392,8 +394,8 @@ void GerritPlugin::fetch(const QSharedPointer &change, int mode) if (!verifiedRepository) { QMessageBox::StandardButton answer = QMessageBox::question( - ICore::dialogParent(), tr("Remote Not Verified"), - tr("Change host %1\nand project %2\n\nwere not verified among remotes" + ICore::dialogParent(), Git::Tr::tr("Remote Not Verified"), + Git::Tr::tr("Change host %1\nand project %2\n\nwere not verified among remotes" " in %3. Select different folder?") .arg(m_server->host, change->project, @@ -416,7 +418,7 @@ void GerritPlugin::fetch(const QSharedPointer &change, int mode) if (!verifiedRepository) { // Ask the user for a repository to retrieve the change. const QString title = - tr("Enter Local Repository for \"%1\" (%2)").arg(change->project, change->branch); + Git::Tr::tr("Enter Local Repository for \"%1\" (%2)").arg(change->project, change->branch); const FilePath suggestedRespository = findLocalRepository(change->project, change->branch); repository = FileUtils::getExistingDirectory(m_dialog.data(), title, suggestedRespository); } diff --git a/src/plugins/git/gerrit/gerritpushdialog.cpp b/src/plugins/git/gerrit/gerritpushdialog.cpp index 00fd6836ffb..cbb29355310 100644 --- a/src/plugins/git/gerrit/gerritpushdialog.cpp +++ b/src/plugins/git/gerrit/gerritpushdialog.cpp @@ -7,6 +7,7 @@ #include "../gitclient.h" #include "../gitconstants.h" +#include "../gittr.h" #include #include @@ -120,7 +121,7 @@ GerritPushDialog::GerritPushDialog(const Utils::FilePath &workingDir, const QStr initRemoteBranches(); if (m_ui->remoteComboBox->isEmpty()) { - m_initErrorMessage = tr("Cannot find a Gerrit remote. Add one and try again."); + m_initErrorMessage = Git::Tr::tr("Cannot find a Gerrit remote. Add one and try again."); return; } @@ -190,14 +191,14 @@ void GerritPushDialog::setChangeRange() } m_ui->infoLabel->show(); const QString remote = selectedRemoteName() + '/' + remoteBranchName; - QString labelText = tr("Number of commits between %1 and %2: %3").arg(branch, remote, range); + QString labelText = Git::Tr::tr("Number of commits between %1 and %2: %3").arg(branch, remote, range); const int currentRange = range.toInt(); QPalette palette = QApplication::palette(); if (currentRange > ReasonableDistance) { const QColor errorColor = Utils::creatorTheme()->color(Utils::Theme::TextColorError); palette.setColor(QPalette::WindowText, errorColor); palette.setColor(QPalette::ButtonText, errorColor); - labelText.append("\n" + tr("Are you sure you selected the right target branch?")); + labelText.append("\n" + Git::Tr::tr("Are you sure you selected the right target branch?")); } m_ui->infoLabel->setPalette(palette); m_ui->targetBranchComboBox->setPalette(palette); @@ -226,21 +227,21 @@ void GerritPushDialog::onRemoteChanged(bool force) m_currentSupportsWip = supportsWip; m_ui->wipCheckBox->setEnabled(supportsWip); if (supportsWip) { - m_ui->wipCheckBox->setToolTip(tr("Checked - Mark change as WIP.\n" + m_ui->wipCheckBox->setToolTip(Git::Tr::tr("Checked - Mark change as WIP.\n" "Unchecked - Mark change as ready for review.\n" "Partially checked - Do not change current state.")); m_ui->draftCheckBox->setTristate(true); if (m_ui->draftCheckBox->checkState() != Qt::Checked) m_ui->draftCheckBox->setCheckState(Qt::PartiallyChecked); - m_ui->draftCheckBox->setToolTip(tr("Checked - Mark change as private.\n" + m_ui->draftCheckBox->setToolTip(Git::Tr::tr("Checked - Mark change as private.\n" "Unchecked - Remove mark.\n" "Partially checked - Do not change current state.")); } else { - m_ui->wipCheckBox->setToolTip(tr("Supported on Gerrit 2.15 and later.")); + m_ui->wipCheckBox->setToolTip(Git::Tr::tr("Supported on Gerrit 2.15 and later.")); m_ui->draftCheckBox->setTristate(false); if (m_ui->draftCheckBox->checkState() != Qt::Checked) m_ui->draftCheckBox->setCheckState(Qt::Unchecked); - m_ui->draftCheckBox->setToolTip(tr("Checked - The change is a draft.\n" + m_ui->draftCheckBox->setToolTip(Git::Tr::tr("Checked - The change is a draft.\n" "Unchecked - The change is not a draft.")); } } @@ -309,9 +310,9 @@ void GerritPushDialog::setRemoteBranches(bool includeOld) if (remoteBranches.isEmpty()) { m_ui->targetBranchComboBox->setEditable(true); m_ui->targetBranchComboBox->setToolTip( - tr("No remote branches found. This is probably the initial commit.")); + Git::Tr::tr("No remote branches found. This is probably the initial commit.")); if (QLineEdit *lineEdit = m_ui->targetBranchComboBox->lineEdit()) - lineEdit->setPlaceholderText(tr("Branch name")); + lineEdit->setPlaceholderText(Git::Tr::tr("Branch name")); } } @@ -331,7 +332,7 @@ void GerritPushDialog::setRemoteBranches(bool includeOld) } } if (excluded) - m_ui->targetBranchComboBox->addItem(tr("... Include older branches ..."), 1); + m_ui->targetBranchComboBox->addItem(Git::Tr::tr("... Include older branches ..."), 1); setChangeRange(); } validate(); diff --git a/src/plugins/git/gerrit/gerritremotechooser.cpp b/src/plugins/git/gerrit/gerritremotechooser.cpp index 4ccd0ae28d8..df628194ba9 100644 --- a/src/plugins/git/gerrit/gerritremotechooser.cpp +++ b/src/plugins/git/gerrit/gerritremotechooser.cpp @@ -5,6 +5,7 @@ #include "gerritparameters.h" #include "gerritserver.h" #include "../gitclient.h" +#include "../gittr.h" #include #include @@ -34,7 +35,7 @@ GerritRemoteChooser::GerritRemoteChooser(QWidget *parent) : horizontalLayout->setContentsMargins(0, 0, 0, 0); m_resetRemoteButton = new QToolButton(this); - m_resetRemoteButton->setToolTip(tr("Refresh Remote Servers")); + m_resetRemoteButton->setToolTip(Git::Tr::tr("Refresh Remote Servers")); horizontalLayout->addWidget(m_resetRemoteButton); @@ -92,7 +93,7 @@ bool GerritRemoteChooser::updateRemotes(bool forceReload) addRemote(server, mapIt.key()); } if (m_enableFallback) - addRemote(m_parameters->server, tr("Fallback")); + addRemote(m_parameters->server, Git::Tr::tr("Fallback")); m_remoteComboBox->setEnabled(m_remoteComboBox->count() > 1); m_updatingRemotes = false; handleRemoteChanged(); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 7b7f1215800..386549993ff 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -2,14 +2,15 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "gitclient.h" -#include "gitutils.h" +#include "branchadddialog.h" #include "commitdata.h" #include "gitconstants.h" #include "giteditor.h" #include "gitplugin.h" +#include "gittr.h" +#include "gitutils.h" #include "mergetool.h" -#include "branchadddialog.h" #include #include @@ -84,8 +85,7 @@ using namespace DiffEditor; using namespace Utils; using namespace VcsBase; -namespace Git { -namespace Internal { +namespace Git::Internal { static GitClient *m_instance = nullptr; @@ -117,7 +117,7 @@ static QString branchesDisplay(const QString &prefix, QStringList *branches, boo //: Displayed after the untranslated message "Branches: branch1, branch2 'and %n more'" // in git show. if (more > 0) - output += ' ' + GitClient::tr("and %n more", nullptr, more); + output += ' ' + Tr::tr("and %n more", nullptr, more); return output; } @@ -347,7 +347,7 @@ void GitBaseDiffEditorController::updateBranchList() } if (branches.isEmpty()) { if (previousRemote == localPrefix) - output += tr(""); + output += Tr::tr(""); } else { output += branchesDisplay(previousRemote, &branches, &first); } @@ -483,7 +483,7 @@ void ShowController::processDescription(const QString &output) int lastHeaderLine = modText.indexOf("\n\n") + 1; m_header = output.left(lastHeaderLine) + Constants::EXPAND_BRANCHES + '\n'; m_body = output.mid(lastHeaderLine + 1); - m_precedes = tr(""); + m_precedes = Tr::tr(""); m_follows.push_back(m_precedes); updateDescription(); const QString commit = modText.mid(7, 8); @@ -560,11 +560,11 @@ public: VcsBaseEditorConfig(toolBar) { m_patienceButton - = addToggleButton("--patience", tr("Patience"), - tr("Use the patience algorithm for calculating the differences.")); + = addToggleButton("--patience", Tr::tr("Patience"), + Tr::tr("Use the patience algorithm for calculating the differences.")); mapSetting(m_patienceButton, &settings.diffPatience); - m_ignoreWSButton = addToggleButton("--ignore-space-change", tr("Ignore Whitespace"), - tr("Ignore whitespace only changes.")); + m_ignoreWSButton = addToggleButton("--ignore-space-change", Tr::tr("Ignore Whitespace"), + Tr::tr("Ignore whitespace only changes.")); mapSetting(m_ignoreWSButton, &settings.ignoreSpaceChangesInDiff); } @@ -581,20 +581,20 @@ public: GitBlameArgumentsWidget(GitSettings &settings, QToolBar *toolBar) : VcsBaseEditorConfig(toolBar) { - mapSetting(addToggleButton(QString(), tr("Omit Date"), - tr("Hide the date of a change from the output.")), + mapSetting(addToggleButton(QString(), Tr::tr("Omit Date"), + Tr::tr("Hide the date of a change from the output.")), &settings.omitAnnotationDate); - mapSetting(addToggleButton("-w", tr("Ignore Whitespace"), - tr("Ignore whitespace only changes.")), + mapSetting(addToggleButton("-w", Tr::tr("Ignore Whitespace"), + Tr::tr("Ignore whitespace only changes.")), &settings.ignoreSpaceChangesInBlame); const QList logChoices = { - ChoiceItem(tr("No Move Detection"), ""), - ChoiceItem(tr("Detect Moves Within File"), "-M"), - ChoiceItem(tr("Detect Moves Between Files"), "-M -C"), - ChoiceItem(tr("Detect Moves and Copies Between Files"), "-M -C -C") + ChoiceItem(Tr::tr("No Move Detection"), ""), + ChoiceItem(Tr::tr("Detect Moves Within File"), "-M"), + ChoiceItem(Tr::tr("Detect Moves Between Files"), "-M -C"), + ChoiceItem(Tr::tr("Detect Moves and Copies Between Files"), "-M -C -C") }; - mapSetting(addChoices(tr("Move detection"), {}, logChoices), + mapSetting(addChoices(Tr::tr("Move detection"), {}, logChoices), &settings.blameMoveDetection); addReloadButton(); @@ -610,15 +610,15 @@ public: BaseGitDiffArgumentsWidget(settings, editor->toolBar()) { QToolBar *toolBar = editor->toolBar(); - QAction *diffButton = addToggleButton(patchOption, tr("Diff"), - tr("Show difference.")); + QAction *diffButton = addToggleButton(patchOption, Tr::tr("Diff"), + Tr::tr("Show difference.")); mapSetting(diffButton, &settings.logDiff); connect(diffButton, &QAction::toggled, m_patienceButton, &QAction::setVisible); connect(diffButton, &QAction::toggled, m_ignoreWSButton, &QAction::setVisible); m_patienceButton->setVisible(diffButton->isChecked()); m_ignoreWSButton->setVisible(diffButton->isChecked()); - auto filterAction = new QAction(tr("Filter"), toolBar); - filterAction->setToolTip(tr("Filter commits by message or content.")); + auto filterAction = new QAction(Tr::tr("Filter"), toolBar); + filterAction->setToolTip(Tr::tr("Filter commits by message or content.")); filterAction->setCheckable(true); connect(filterAction, &QAction::toggled, editor, &GitEditorWidget::toggleFilters); toolBar->addAction(filterAction); @@ -652,21 +652,21 @@ public: { QAction *firstParentButton = addToggleButton({"-m", "--first-parent"}, - tr("First Parent"), - tr("Follow only the first parent on merge commits.")); + Tr::tr("First Parent"), + Tr::tr("Follow only the first parent on merge commits.")); mapSetting(firstParentButton, &settings.firstParent); - QAction *graphButton = addToggleButton(graphArguments(), tr("Graph"), - tr("Show textual graph log.")); + QAction *graphButton = addToggleButton(graphArguments(), Tr::tr("Graph"), + Tr::tr("Show textual graph log.")); mapSetting(graphButton, &settings.graphLog); QAction *colorButton = addToggleButton(QStringList{colorOption}, - tr("Color"), tr("Use colors in log.")); + Tr::tr("Color"), Tr::tr("Use colors in log.")); mapSetting(colorButton, &settings.colorLog); if (fileRelated) { QAction *followButton = addToggleButton( - "--follow", tr("Follow"), - tr("Show log also for previous names of the file.")); + "--follow", Tr::tr("Follow"), + Tr::tr("Show log also for previous names of the file.")); mapSetting(followButton, &settings.followRenames); } @@ -711,8 +711,8 @@ public: { QAction *showDateButton = addToggleButton("--date=iso", - tr("Show Date"), - tr("Show date instead of sequence.")); + Tr::tr("Show Date"), + Tr::tr("Show date instead of sequence.")); mapSetting(showDateButton, &settings.refLogShowDate); addReloadButton(); @@ -815,17 +815,17 @@ private: static inline QString msgRepositoryNotFound(const FilePath &dir) { - return GitClient::tr("Cannot determine the repository for \"%1\".").arg(dir.toUserOutput()); + return Tr::tr("Cannot determine the repository for \"%1\".").arg(dir.toUserOutput()); } static inline QString msgParseFilesFailed() { - return GitClient::tr("Cannot parse the file output."); + return Tr::tr("Cannot parse the file output."); } static QString msgCannotLaunch(const FilePath &binary) { - return GitClient::tr("Cannot launch \"%1\".").arg(binary.toUserOutput()); + return Tr::tr("Cannot launch \"%1\".").arg(binary.toUserOutput()); } static inline void msgCannotRun(const QString &message, QString *errorMessage) @@ -839,7 +839,7 @@ static inline void msgCannotRun(const QString &message, QString *errorMessage) static inline void msgCannotRun(const QStringList &args, const FilePath &workingDirectory, const QString &error, QString *errorMessage) { - const QString message = GitClient::tr("Cannot run \"%1\" in \"%2\": %3") + const QString message = Tr::tr("Cannot run \"%1\" in \"%2\": %3") .arg("git " + args.join(' '), workingDirectory.toUserOutput(), error); @@ -963,25 +963,25 @@ void GitClient::chunkActionsRequested(DiffEditor::DiffEditorController *controll }; menu->addSeparator(); - QAction *stageChunkAction = menu->addAction(tr("Stage Chunk")); + QAction *stageChunkAction = menu->addAction(Tr::tr("Stage Chunk")); connect(stageChunkAction, &QAction::triggered, this, [stageChunk, diffController, fileIndex, chunkIndex] { stageChunk(diffController, fileIndex, chunkIndex, DiffEditorController::NoOption, DiffEditor::ChunkSelection()); }); - QAction *stageLinesAction = menu->addAction(tr("Stage Selection (%n Lines)", "", selection.selectedRowsCount())); + QAction *stageLinesAction = menu->addAction(Tr::tr("Stage Selection (%n Lines)", "", selection.selectedRowsCount())); connect(stageLinesAction, &QAction::triggered, this, [stageChunk, diffController, fileIndex, chunkIndex, selection] { stageChunk(diffController, fileIndex, chunkIndex, DiffEditorController::NoOption, selection); }); - QAction *unstageChunkAction = menu->addAction(tr("Unstage Chunk")); + QAction *unstageChunkAction = menu->addAction(Tr::tr("Unstage Chunk")); connect(unstageChunkAction, &QAction::triggered, this, [stageChunk, diffController, fileIndex, chunkIndex] { stageChunk(diffController, fileIndex, chunkIndex, DiffEditorController::Revert, DiffEditor::ChunkSelection()); }); - QAction *unstageLinesAction = menu->addAction(tr("Unstage Selection (%n Lines)", "", selection.selectedRowsCount())); + QAction *unstageLinesAction = menu->addAction(Tr::tr("Unstage Selection (%n Lines)", "", selection.selectedRowsCount())); connect(unstageLinesAction, &QAction::triggered, this, [stageChunk, diffController, fileIndex, chunkIndex, selection] { stageChunk(diffController, fileIndex, chunkIndex, @@ -1022,9 +1022,9 @@ void GitClient::stage(DiffEditor::DiffEditorController *diffController, &errorMessage, args)) { if (errorMessage.isEmpty()) { if (revert) - VcsOutputWindow::appendSilently(tr("Chunk successfully unstaged")); + VcsOutputWindow::appendSilently(Tr::tr("Chunk successfully unstaged")); else - VcsOutputWindow::appendSilently(tr("Chunk successfully staged")); + VcsOutputWindow::appendSilently(Tr::tr("Chunk successfully staged")); } else { VcsOutputWindow::appendError(errorMessage); } @@ -1069,7 +1069,7 @@ void GitClient::diffFiles(const FilePath &workingDirectory, const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DiffFiles.") + workingDirectory.toString(); requestReload(documentId, - workingDirectory.toString(), tr("Git Diff Files"), workingDirectory, + workingDirectory.toString(), Tr::tr("Git Diff Files"), workingDirectory, [stagedFileNames, unstagedFileNames](IDocument *doc) { return new FileListDiffController(doc, stagedFileNames, unstagedFileNames); }); @@ -1080,7 +1080,7 @@ void GitClient::diffProject(const FilePath &workingDirectory, const QString &pro const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DiffProject.") + workingDirectory.toString(); requestReload(documentId, - workingDirectory.toString(), tr("Git Diff Project"), workingDirectory, + workingDirectory.toString(), Tr::tr("Git Diff Project"), workingDirectory, [projectDirectory](IDocument *doc){ return new GitDiffEditorController(doc, {}, {}, {"--", projectDirectory}); }); @@ -1092,7 +1092,7 @@ void GitClient::diffRepository(const FilePath &workingDirectory, { const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DiffRepository.") + workingDirectory.toString(); - requestReload(documentId, workingDirectory.toString(), tr("Git Diff Repository"), workingDirectory, + requestReload(documentId, workingDirectory.toString(), Tr::tr("Git Diff Repository"), workingDirectory, [&leftCommit, &rightCommit](IDocument *doc) { return new GitDiffEditorController(doc, leftCommit, rightCommit, {}); }); @@ -1100,7 +1100,7 @@ void GitClient::diffRepository(const FilePath &workingDirectory, void GitClient::diffFile(const FilePath &workingDirectory, const QString &fileName) const { - const QString title = tr("Git Diff \"%1\"").arg(fileName); + const QString title = Tr::tr("Git Diff \"%1\"").arg(fileName); const QString sourceFile = VcsBaseEditor::getSource(workingDirectory, fileName); const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DifFile.") + sourceFile; @@ -1112,7 +1112,7 @@ void GitClient::diffFile(const FilePath &workingDirectory, const QString &fileNa void GitClient::diffBranch(const FilePath &workingDirectory, const QString &branchName) const { - const QString title = tr("Git Diff Branch \"%1\"").arg(branchName); + const QString title = Tr::tr("Git Diff Branch \"%1\"").arg(branchName); const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DiffBranch.") + branchName; requestReload(documentId, workingDirectory.toString(), title, workingDirectory, @@ -1169,7 +1169,7 @@ void GitClient::log(const FilePath &workingDirectory, const QString &fileName, msgArg = workingDirectory.toString(); // Creating document might change the referenced workingDirectory. Store a copy and use it. const FilePath workingDir = workingDirectory; - const QString title = tr("Git Log \"%1\"").arg(msgArg); + const QString title = Tr::tr("Git Log \"%1\"").arg(msgArg); const Id editorId = Git::Constants::GIT_LOG_EDITOR_ID; const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); GitEditorWidget *editor = static_cast( @@ -1224,7 +1224,7 @@ void GitClient::log(const FilePath &workingDirectory, const QString &fileName, void GitClient::reflog(const FilePath &workingDirectory, const QString &ref) { - const QString title = tr("Git Reflog \"%1\"").arg(workingDirectory.toUserOutput()); + const QString title = Tr::tr("Git Reflog \"%1\"").arg(workingDirectory.toUserOutput()); const Id editorId = Git::Constants::GIT_REFLOG_EDITOR_ID; // Creating document might change the referenced workingDirectory. Store a copy and use it. const FilePath workingDir = workingDirectory; @@ -1259,7 +1259,7 @@ static inline bool canShow(const QString &sha) static inline QString msgCannotShow(const QString &sha) { - return GitClient::tr("Cannot describe \"%1\".").arg(sha); + return Tr::tr("Cannot describe \"%1\".").arg(sha); } void GitClient::show(const QString &source, const QString &id, const QString &name) @@ -1269,7 +1269,7 @@ void GitClient::show(const QString &source, const QString &id, const QString &na return; } - const QString title = tr("Git Show \"%1\"").arg(name.isEmpty() ? id : name); + const QString title = Tr::tr("Git Show \"%1\"").arg(name.isEmpty() ? id : name); const QFileInfo sourceFi(source); FilePath workingDirectory = FilePath::fromString( sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath()); @@ -1309,7 +1309,7 @@ void GitClient::archive(const FilePath &workingDirectory, QString commit) FilePath archiveName = FileUtils::getSaveFilePath( nullptr, - tr("Generate %1 archive").arg(repoName), + Tr::tr("Generate %1 archive").arg(repoName), repoDirectory.pathAppended(QString("../%1-%2").arg(repoName).arg(commit.left(8))), filters.keys().join(";;"), &selectedFilter); @@ -1322,8 +1322,8 @@ void GitClient::archive(const FilePath &workingDirectory, QString commit) } if (archive.exists()) { - if (QMessageBox::warning(ICore::dialogParent(), tr("Overwrite?"), - tr("An item named \"%1\" already exists at this location. " + if (QMessageBox::warning(ICore::dialogParent(), Tr::tr("Overwrite?"), + Tr::tr("An item named \"%1\" already exists at this location. " "Do you want to overwrite it?").arg(QDir::toNativeSeparators(archive.absoluteFilePath())), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { return; @@ -1339,7 +1339,7 @@ VcsBaseEditorWidget *GitClient::annotate( { const Id editorId = Git::Constants::GIT_BLAME_EDITOR_ID; const QString id = VcsBaseEditor::getTitleId(workingDir, {file}, revision); - const QString title = tr("Git Blame \"%1\"").arg(id); + const QString title = Tr::tr("Git Blame \"%1\"").arg(id); const QString sourceFile = VcsBaseEditor::getSource(workingDir, file); VcsBaseEditorWidget *editor @@ -1397,8 +1397,8 @@ QStringList GitClient::setupCheckoutArguments(const FilePath &workingDirectory, if (Utils::CheckableMessageBox::doNotAskAgainQuestion( ICore::dialogParent() /*parent*/, - tr("Create Local Branch") /*title*/, - tr("Would you like to create a local branch?") /*message*/, + Tr::tr("Create Local Branch") /*title*/, + Tr::tr("Would you like to create a local branch?") /*message*/, ICore::settings(), "Git.CreateLocalBranchOnCheckout" /*setting*/, QDialogButtonBox::Yes | QDialogButtonBox::No /*buttons*/, QDialogButtonBox::No /*default button*/, @@ -1468,8 +1468,8 @@ void GitClient::reset(const FilePath &workingDirectory, const QString &argument, if (argument == "--hard") { if (gitStatus(workingDirectory, StatusMode(NoUntracked | NoSubmodules)) != StatusUnchanged) { if (QMessageBox::question( - Core::ICore::dialogParent(), tr("Reset"), - tr("All changes in working directory will be discarded. Are you sure?"), + Core::ICore::dialogParent(), Tr::tr("Reset"), + Tr::tr("All changes in working directory will be discarded. Are you sure?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) { return; @@ -1500,12 +1500,12 @@ void GitClient::recoverDeletedFiles(const FilePath &workingDirectory) if (result.result() == ProcessResult::FinishedWithSuccess) { const QString stdOut = result.cleanedStdOut().trimmed(); if (stdOut.isEmpty()) { - VcsOutputWindow::appendError(tr("Nothing to recover")); + VcsOutputWindow::appendError(Tr::tr("Nothing to recover")); return; } const QStringList files = stdOut.split('\n'); synchronousCheckoutFiles(workingDirectory, files, QString(), nullptr, false); - VcsOutputWindow::append(tr("Files recovered"), VcsOutputWindow::Message); + VcsOutputWindow::append(Tr::tr("Files recovered"), VcsOutputWindow::Message); } } @@ -1527,7 +1527,7 @@ bool GitClient::synchronousLog(const FilePath &workingDirectory, const QStringLi *output = result.cleanedStdOut(); return true; } - msgCannotRun(tr("Cannot obtain log of \"%1\": %2") + msgCannotRun(Tr::tr("Cannot obtain log of \"%1\": %2") .arg(workingDirectory.toUserOutput(), result.cleanedStdErr()), errorMessageIn); return false; } @@ -1583,7 +1583,7 @@ bool GitClient::synchronousReset(const FilePath &workingDirectory, if (files.isEmpty()) { msgCannotRun(arguments, workingDirectory, result.cleanedStdErr(), errorMessage); } else { - msgCannotRun(tr("Cannot reset %n files in \"%1\": %2", nullptr, files.size()) + msgCannotRun(Tr::tr("Cannot reset %n files in \"%1\": %2", nullptr, files.size()) .arg(workingDirectory.toUserOutput(), result.cleanedStdErr()), errorMessage); } @@ -1629,24 +1629,24 @@ bool GitClient::synchronousCheckoutFiles(const FilePath &workingDirectory, QStri const QString fileArg = files.join(", "); //: Meaning of the arguments: %1: revision, %2: files, %3: repository, //: %4: Error message - msgCannotRun(tr("Cannot checkout \"%1\" of %2 in \"%3\": %4") + msgCannotRun(Tr::tr("Cannot checkout \"%1\" of %2 in \"%3\": %4") .arg(revision, fileArg, workingDirectory.toUserOutput(), result.cleanedStdErr()), errorMessage); return false; } -static inline QString msgParentRevisionFailed(const FilePath &workingDirectory, +static QString msgParentRevisionFailed(const FilePath &workingDirectory, const QString &revision, const QString &why) { //: Failed to find parent revisions of a SHA1 for "annotate previous" - return GitClient::tr("Cannot find parent revisions of \"%1\" in \"%2\": %3") + return Tr::tr("Cannot find parent revisions of \"%1\" in \"%2\": %3") .arg(revision, workingDirectory.toUserOutput(), why); } -static inline QString msgInvalidRevision() +static QString msgInvalidRevision() { - return GitClient::tr("Invalid revision"); + return Tr::tr("Invalid revision"); } // Split a line of " ..." to obtain parents from "rev-list" or "log". @@ -1816,7 +1816,7 @@ QString GitClient::synchronousTopic(const FilePath &workingDirectory) const if (!stdOut.isEmpty()) return stdOut; } - return tr("Detached HEAD"); + return Tr::tr("Detached HEAD"); } bool GitClient::synchronousRevParseCmd(const FilePath &workingDirectory, const QString &ref, @@ -1869,7 +1869,7 @@ QString GitClient::synchronousShortDescription(const FilePath &workingDirectory, "--max-count=1", revision}; const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, RunFlags::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) { - VcsOutputWindow::appendSilently(tr("Cannot describe revision \"%1\" in \"%2\": %3") + VcsOutputWindow::appendSilently(Tr::tr("Cannot describe revision \"%1\" in \"%2\": %3") .arg(revision, workingDirectory.toUserOutput(), result.cleanedStdErr())); return revision; } @@ -1907,7 +1907,7 @@ QString GitClient::synchronousStash(const FilePath &workingDirectory, const QStr do { if ((flags & StashPromptDescription)) { if (!inputText(ICore::dialogParent(), - tr("Stash Description"), tr("Description:"), &message)) + Tr::tr("Stash Description"), Tr::tr("Description:"), &message)) break; } if (!executeSynchronousStash(workingDirectory, message)) @@ -1975,7 +1975,7 @@ bool GitClient::stashNameFromMessage(const FilePath &workingDirectory, } } //: Look-up of a stash via its descriptive message failed. - msgCannotRun(tr("Cannot resolve stash message \"%1\" in \"%2\".") + msgCannotRun(Tr::tr("Cannot resolve stash message \"%1\" in \"%2\".") .arg(message, workingDirectory.toUserOutput()), errorMessage); return false; } @@ -2066,7 +2066,7 @@ QStringList GitClient::synchronousSubmoduleStatus(const FilePath &workingDirecto RunFlags::NoOutput); if (result.result() != ProcessResult::FinishedWithSuccess) { - msgCannotRun(tr("Cannot retrieve submodule status of \"%1\": %2") + msgCannotRun(Tr::tr("Cannot retrieve submodule status of \"%1\": %2") .arg(workingDirectory.toUserOutput(), result.cleanedStdErr()), errorMessage); return {}; } @@ -2208,12 +2208,12 @@ bool GitClient::synchronousApplyPatch(const FilePath &workingDirectory, const QString stdErr = result.cleanedStdErr(); if (result.result() == ProcessResult::FinishedWithSuccess) { if (!stdErr.isEmpty()) - *errorMessage = tr("There were warnings while applying \"%1\" to \"%2\":\n%3") + *errorMessage = Tr::tr("There were warnings while applying \"%1\" to \"%2\":\n%3") .arg(file, workingDirectory.toUserOutput(), stdErr); return true; } - *errorMessage = tr("Cannot apply patch \"%1\" to \"%2\": %3") + *errorMessage = Tr::tr("Cannot apply patch \"%1\" to \"%2\": %3") .arg(QDir::toNativeSeparators(file), workingDirectory.toUserOutput(), stdErr); return false; } @@ -2289,8 +2289,8 @@ void GitClient::updateSubmodulesIfNeeded(const FilePath &workingDirectory, bool if (!updateNeeded) return; - if (prompt && QMessageBox::question(ICore::dialogParent(), tr("Submodules Found"), - tr("Would you like to update submodules?"), + if (prompt && QMessageBox::question(ICore::dialogParent(), Tr::tr("Submodules Found"), + Tr::tr("Would you like to update submodules?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { return; } @@ -2350,7 +2350,7 @@ GitClient::StatusResult GitClient::gitStatus(const FilePath &workingDirectory, S // Is it something really fatal? if (!statusRc && !branchKnown) { if (errorMessage) { - *errorMessage = tr("Cannot obtain status: %1").arg(result.cleanedStdErr()); + *errorMessage = Tr::tr("Cannot obtain status: %1").arg(result.cleanedStdErr()); } return StatusFailed; } @@ -2368,13 +2368,13 @@ QString GitClient::commandInProgressDescription(const FilePath &workingDirectory break; case Rebase: case RebaseMerge: - return tr("REBASING"); + return Tr::tr("REBASING"); case Revert: - return tr("REVERTING"); + return Tr::tr("REVERTING"); case CherryPick: - return tr("CHERRY-PICKING"); + return Tr::tr("CHERRY-PICKING"); case Merge: - return tr("MERGING"); + return Tr::tr("MERGING"); } return QString(); } @@ -2409,24 +2409,24 @@ void GitClient::continueCommandIfNeeded(const FilePath &workingDirectory, bool a switch (command) { case Rebase: case RebaseMerge: - continuePreviousGitCommand(workingDirectory, tr("Continue Rebase"), - tr("Rebase is in progress. What do you want to do?"), - tr("Continue"), "rebase", continueMode); + continuePreviousGitCommand(workingDirectory, Tr::tr("Continue Rebase"), + Tr::tr("Rebase is in progress. What do you want to do?"), + Tr::tr("Continue"), "rebase", continueMode); break; case Merge: - continuePreviousGitCommand(workingDirectory, tr("Continue Merge"), - tr("You need to commit changes to finish merge.\nCommit now?"), - tr("Commit"), "merge", continueMode); + continuePreviousGitCommand(workingDirectory, Tr::tr("Continue Merge"), + Tr::tr("You need to commit changes to finish merge.\nCommit now?"), + Tr::tr("Commit"), "merge", continueMode); break; case Revert: - continuePreviousGitCommand(workingDirectory, tr("Continue Revert"), - tr("You need to commit changes to finish revert.\nCommit now?"), - tr("Commit"), "revert", continueMode); + continuePreviousGitCommand(workingDirectory, Tr::tr("Continue Revert"), + Tr::tr("You need to commit changes to finish revert.\nCommit now?"), + Tr::tr("Commit"), "revert", continueMode); break; case CherryPick: - continuePreviousGitCommand(workingDirectory, tr("Continue Cherry-Picking"), - tr("You need to commit changes to finish cherry-picking.\nCommit now?"), - tr("Commit"), "cherry-pick", continueMode); + continuePreviousGitCommand(workingDirectory, Tr::tr("Continue Cherry-Picking"), + Tr::tr("You need to commit changes to finish cherry-picking.\nCommit now?"), + Tr::tr("Commit"), "cherry-pick", continueMode); break; default: break; @@ -2448,7 +2448,7 @@ void GitClient::continuePreviousGitCommand(const FilePath &workingDirectory, hasChanges = gitStatus(workingDirectory, StatusMode(NoUntracked | NoSubmodules)) == GitClient::StatusChanged; if (!hasChanges) - msgBoxText.prepend(tr("No changes found.") + ' '); + msgBoxText.prepend(Tr::tr("No changes found.") + ' '); break; case SkipOnly: hasChanges = false; @@ -2458,7 +2458,7 @@ void GitClient::continuePreviousGitCommand(const FilePath &workingDirectory, QMessageBox msgBox(QMessageBox::Question, msgBoxTitle, msgBoxText, QMessageBox::NoButton, ICore::dialogParent()); if (hasChanges || isRebase) - msgBox.addButton(hasChanges ? buttonName : tr("Skip"), QMessageBox::AcceptRole); + msgBox.addButton(hasChanges ? buttonName : Tr::tr("Skip"), QMessageBox::AcceptRole); msgBox.addButton(QMessageBox::Abort); msgBox.addButton(QMessageBox::Ignore); switch (msgBox.exec()) { @@ -2485,7 +2485,7 @@ QStringList GitClient::synchronousRepositoryBranches(const QString &repositoryUR {"ls-remote", repositoryURL, HEAD, "refs/heads/*"}, RunFlags::SuppressStdErr | RunFlags::SuppressFailMessage); QStringList branches; - branches << tr(""); + branches << Tr::tr(""); QString headSha; // split "82bfad2f51d34e98b18982211c82220b8db049brefs/heads/master" bool headFound = false; @@ -2712,7 +2712,7 @@ bool GitClient::readDataFromCommit(const FilePath &repoDirectory, const QString if (result.result() != ProcessResult::FinishedWithSuccess) { if (errorMessage) { - *errorMessage = tr("Cannot retrieve last commit data of repository \"%1\".") + *errorMessage = Tr::tr("Cannot retrieve last commit data of repository \"%1\".") .arg(repoDirectory.toUserOutput()); } return false; @@ -2748,7 +2748,7 @@ bool GitClient::getCommitData(const FilePath &workingDirectory, QString gitDir = findGitDirForRepository(repoDirectory); if (gitDir.isEmpty()) { - *errorMessage = tr("The repository \"%1\" is not initialized.").arg(repoDirectory.toString()); + *errorMessage = Tr::tr("The repository \"%1\" is not initialized.").arg(repoDirectory.toString()); return false; } @@ -2880,10 +2880,10 @@ bool GitClient::getCommitData(const FilePath &workingDirectory, static inline QString msgCommitted(const QString &amendSHA1, int fileCount) { if (amendSHA1.isEmpty()) - return GitClient::tr("Committed %n files.", nullptr, fileCount); + return Tr::tr("Committed %n files.", nullptr, fileCount); if (fileCount) - return GitClient::tr("Amended \"%1\" (%n files).", nullptr, fileCount).arg(amendSHA1); - return GitClient::tr("Amended \"%1\".").arg(amendSHA1); + return Tr::tr("Amended \"%1\" (%n files).", nullptr, fileCount).arg(amendSHA1); + return Tr::tr("Amended \"%1\".").arg(amendSHA1); } bool GitClient::addAndCommit(const FilePath &repositoryDirectory, @@ -2973,7 +2973,7 @@ bool GitClient::addAndCommit(const FilePath &repositoryDirectory, GitPlugin::updateCurrentBranch(); return true; } - VcsOutputWindow::appendError(tr("Cannot commit %n files\n", nullptr, commitCount)); + VcsOutputWindow::appendError(Tr::tr("Cannot commit %n files\n", nullptr, commitCount)); return false; } @@ -3047,8 +3047,8 @@ GitClient::RevertResult GitClient::revertI(QStringList files, // Ask to revert (to do: Handle lists with a selection dialog) const QMessageBox::StandardButton answer = QMessageBox::question(ICore::dialogParent(), - tr("Revert"), - tr("The file has been changed. Do you want to revert it?"), + Tr::tr("Revert"), + Tr::tr("The file has been changed. Do you want to revert it?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if (answer == QMessageBox::No) @@ -3077,7 +3077,7 @@ void GitClient::revertFiles(const QStringList &files, bool revertStaging) case RevertCanceled: break; case RevertUnchanged: { - const QString msg = (isDirectory || files.size() > 1) ? msgNoChangedFiles() : tr("The file is not modified."); + const QString msg = (isDirectory || files.size() > 1) ? msgNoChangedFiles() : Tr::tr("The file is not modified."); VcsOutputWindow::appendWarning(msg); } break; @@ -3174,7 +3174,7 @@ void GitClient::handleMergeConflicts(const FilePath &workingDir, const QString & { QString message; if (!commit.isEmpty()) { - message = tr("Conflicts detected with commit %1.").arg(commit); + message = Tr::tr("Conflicts detected with commit %1.").arg(commit); } else if (!files.isEmpty()) { QString fileList; QStringList partialFiles = files; @@ -3183,23 +3183,23 @@ void GitClient::handleMergeConflicts(const FilePath &workingDir, const QString & fileList = partialFiles.join('\n'); if (partialFiles.count() != files.count()) fileList += "\n..."; - message = tr("Conflicts detected with files:\n%1").arg(fileList); + message = Tr::tr("Conflicts detected with files:\n%1").arg(fileList); } else { - message = tr("Conflicts detected."); + message = Tr::tr("Conflicts detected."); } - QMessageBox mergeOrAbort(QMessageBox::Question, tr("Conflicts Detected"), message, + QMessageBox mergeOrAbort(QMessageBox::Question, Tr::tr("Conflicts Detected"), message, QMessageBox::NoButton, ICore::dialogParent()); - QPushButton *mergeToolButton = mergeOrAbort.addButton(tr("Run &Merge Tool"), + QPushButton *mergeToolButton = mergeOrAbort.addButton(Tr::tr("Run &Merge Tool"), QMessageBox::AcceptRole); const QString mergeTool = readConfigValue(workingDir, "merge.tool"); if (mergeTool.isEmpty() || mergeTool.startsWith("vimdiff")) { mergeToolButton->setEnabled(false); - mergeToolButton->setToolTip(tr("Only graphical merge tools are supported. " + mergeToolButton->setToolTip(Tr::tr("Only graphical merge tools are supported. " "Please configure merge.tool.")); } mergeOrAbort.addButton(QMessageBox::Ignore); if (abortCommand == "rebase") - mergeOrAbort.addButton(tr("&Skip"), QMessageBox::RejectRole); + mergeOrAbort.addButton(Tr::tr("&Skip"), QMessageBox::RejectRole); if (!abortCommand.isEmpty()) mergeOrAbort.addButton(QMessageBox::Abort); switch (mergeOrAbort.exec()) { @@ -3236,7 +3236,7 @@ void GitClient::subversionLog(const FilePath &workingDirectory) const arguments << ("--limit=" + QString::number(logCount)); // Create a command editor, no highlighting or interaction. - const QString title = tr("Git SVN Log"); + const QString title = Tr::tr("Git SVN Log"); const Id editorId = Git::Constants::GIT_SVN_LOG_EDITOR_ID; const QString sourceFile = VcsBaseEditor::getSource(workingDirectory, QStringList()); VcsBaseEditorWidget *editor = createVcsEditor(editorId, title, sourceFile, codecFor(CodecNone), @@ -3274,8 +3274,8 @@ public: if (pushFailure == NonFastForward) { const QColor warnColor = Utils::creatorTheme()->color(Theme::TextColorError); if (QMessageBox::question( - Core::ICore::dialogParent(), tr("Force Push"), - tr("Push failed. Would you like to force-push " + Core::ICore::dialogParent(), Tr::tr("Force Push"), + Tr::tr("Push failed. Would you like to force-push " "(rewrites remote history)?") .arg(QString::number(warnColor.rgba(), 16)), QMessageBox::Yes | QMessageBox::No, @@ -3293,8 +3293,8 @@ public: } // NoRemoteBranch case if (QMessageBox::question( - Core::ICore::dialogParent(), tr("No Upstream Branch"), - tr("Push failed because the local branch \"%1\" " + Core::ICore::dialogParent(), Tr::tr("No Upstream Branch"), + Tr::tr("Push failed because the local branch \"%1\" " "does not have an upstream branch on the remote.\n\n" "Would you like to create the branch \"%1\" on the " "remote and set it as upstream?") @@ -3364,7 +3364,7 @@ bool GitClient::canRebase(const FilePath &workingDirectory) const if (QFileInfo::exists(gitDir + "/rebase-apply") || QFileInfo::exists(gitDir + "/rebase-merge")) { VcsOutputWindow::appendError( - tr("Rebase, merge or am is in progress. Finish " + Tr::tr("Rebase, merge or am is in progress. Finish " "or abort it and then try again.")); return false; } @@ -3450,12 +3450,12 @@ void GitClient::interactiveRebase(const FilePath &workingDirectory, const QStrin QString GitClient::msgNoChangedFiles() { - return tr("There are no modified files."); + return Tr::tr("There are no modified files."); } QString GitClient::msgNoCommits(bool includeRemote) { - return includeRemote ? tr("No commits were found") : tr("No local commits were found"); + return includeRemote ? Tr::tr("No commits were found") : Tr::tr("No local commits were found"); } void GitClient::stashPop(const FilePath &workingDirectory, const QString &stash) @@ -3641,31 +3641,31 @@ bool GitClient::StashInfo::init(const FilePath &workingDirectory, const QString void GitClient::StashInfo::stashPrompt(const QString &command, const QString &statusOutput, QString *errorMessage) { - QMessageBox msgBox(QMessageBox::Question, tr("Uncommitted Changes Found"), - tr("What would you like to do with local changes in:") + "\n\n\"" + QMessageBox msgBox(QMessageBox::Question, Tr::tr("Uncommitted Changes Found"), + Tr::tr("What would you like to do with local changes in:") + "\n\n\"" + m_workingDir.toUserOutput() + '\"', QMessageBox::NoButton, ICore::dialogParent()); msgBox.setDetailedText(statusOutput); - QPushButton *stashAndPopButton = msgBox.addButton(tr("Stash && &Pop"), QMessageBox::AcceptRole); - stashAndPopButton->setToolTip(tr("Stash local changes and pop when %1 finishes.").arg(command)); + QPushButton *stashAndPopButton = msgBox.addButton(Tr::tr("Stash && &Pop"), QMessageBox::AcceptRole); + stashAndPopButton->setToolTip(Tr::tr("Stash local changes and pop when %1 finishes.").arg(command)); - QPushButton *stashButton = msgBox.addButton(tr("&Stash"), QMessageBox::AcceptRole); - stashButton->setToolTip(tr("Stash local changes and execute %1.").arg(command)); + QPushButton *stashButton = msgBox.addButton(Tr::tr("&Stash"), QMessageBox::AcceptRole); + stashButton->setToolTip(Tr::tr("Stash local changes and execute %1.").arg(command)); - QPushButton *discardButton = msgBox.addButton(tr("&Discard"), QMessageBox::AcceptRole); - discardButton->setToolTip(tr("Discard (reset) local changes and execute %1.").arg(command)); + QPushButton *discardButton = msgBox.addButton(Tr::tr("&Discard"), QMessageBox::AcceptRole); + discardButton->setToolTip(Tr::tr("Discard (reset) local changes and execute %1.").arg(command)); QPushButton *ignoreButton = nullptr; if (m_flags & AllowUnstashed) { ignoreButton = msgBox.addButton(QMessageBox::Ignore); - ignoreButton->setToolTip(tr("Execute %1 with local changes in working directory.") + ignoreButton->setToolTip(Tr::tr("Execute %1 with local changes in working directory.") .arg(command)); } QPushButton *cancelButton = msgBox.addButton(QMessageBox::Cancel); - cancelButton->setToolTip(tr("Cancel %1.").arg(command)); + cancelButton->setToolTip(Tr::tr("Cancel %1.").arg(command)); msgBox.exec(); @@ -3760,22 +3760,22 @@ void GitClient::addChangeActions(QMenu *menu, const QString &source, const QStri QTC_ASSERT(!change.isEmpty(), return); const FilePath &workingDir = fileWorkingDirectory(source); const bool isRange = change.contains(".."); - menu->addAction(tr("Cherr&y-Pick %1").arg(change), [workingDir, change] { + menu->addAction(Tr::tr("Cherr&y-Pick %1").arg(change), [workingDir, change] { m_instance->synchronousCherryPick(workingDir, change); }); - menu->addAction(tr("Re&vert %1").arg(change), [workingDir, change] { + menu->addAction(Tr::tr("Re&vert %1").arg(change), [workingDir, change] { m_instance->synchronousRevert(workingDir, change); }); if (!isRange) { - menu->addAction(tr("C&heckout %1").arg(change), [workingDir, change] { + menu->addAction(Tr::tr("C&heckout %1").arg(change), [workingDir, change] { m_instance->checkout(workingDir, change); }); - connect(menu->addAction(tr("&Interactive Rebase from %1...").arg(change)), + connect(menu->addAction(Tr::tr("&Interactive Rebase from %1...").arg(change)), &QAction::triggered, [workingDir, change] { GitPlugin::startRebaseFromCommit(workingDir, change); }); } - QAction *logAction = menu->addAction(tr("&Log for %1").arg(change), [workingDir, change] { + QAction *logAction = menu->addAction(Tr::tr("&Log for %1").arg(change), [workingDir, change] { m_instance->log(workingDir, QString(), false, {change}); }); if (isRange) { @@ -3783,12 +3783,12 @@ void GitClient::addChangeActions(QMenu *menu, const QString &source, const QStri } else { const FilePath filePath = FilePath::fromString(source); if (!filePath.isDir()) { - menu->addAction(tr("Sh&ow file \"%1\" on revision %2").arg(filePath.fileName()).arg(change), + menu->addAction(Tr::tr("Sh&ow file \"%1\" on revision %2").arg(filePath.fileName()).arg(change), [workingDir, change, source] { m_instance->openShowEditor(workingDir, change, source); }); } - menu->addAction(tr("Add &Tag for %1...").arg(change), [workingDir, change] { + menu->addAction(Tr::tr("Add &Tag for %1...").arg(change), [workingDir, change] { QString output; QString errorMessage; m_instance->synchronousTagCmd(workingDir, QStringList(), &output, &errorMessage); @@ -3809,26 +3809,26 @@ void GitClient::addChangeActions(QMenu *menu, const QString &source, const QStri auto resetChange = [workingDir, change](const QByteArray &resetType) { m_instance->reset(workingDir, QLatin1String("--" + resetType), change); }; - auto resetMenu = new QMenu(tr("&Reset to Change %1").arg(change), menu); - resetMenu->addAction(tr("&Hard"), std::bind(resetChange, "hard")); - resetMenu->addAction(tr("&Mixed"), std::bind(resetChange, "mixed")); - resetMenu->addAction(tr("&Soft"), std::bind(resetChange, "soft")); + auto resetMenu = new QMenu(Tr::tr("&Reset to Change %1").arg(change), menu); + resetMenu->addAction(Tr::tr("&Hard"), std::bind(resetChange, "hard")); + resetMenu->addAction(Tr::tr("&Mixed"), std::bind(resetChange, "mixed")); + resetMenu->addAction(Tr::tr("&Soft"), std::bind(resetChange, "soft")); menu->addMenu(resetMenu); } - menu->addAction((isRange ? tr("Di&ff %1") : tr("Di&ff Against %1")).arg(change), + menu->addAction((isRange ? Tr::tr("Di&ff %1") : Tr::tr("Di&ff Against %1")).arg(change), [workingDir, change] { m_instance->diffRepository(workingDir, change, {}); }); if (!isRange) { if (!m_instance->m_diffCommit.isEmpty()) { - menu->addAction(tr("Diff &Against Saved %1").arg(m_instance->m_diffCommit), + menu->addAction(Tr::tr("Diff &Against Saved %1").arg(m_instance->m_diffCommit), [workingDir, change] { m_instance->diffRepository(workingDir, m_instance->m_diffCommit, change); m_instance->m_diffCommit.clear(); }); } - menu->addAction(tr("&Save for Diff"), [change] { + menu->addAction(Tr::tr("&Save for Diff"), [change] { m_instance->m_diffCommit = change; }); } @@ -3868,7 +3868,7 @@ IEditor *GitClient::openShowEditor(const FilePath &workingDirectory, const QStri const QString documentId = QLatin1String(Git::Constants::GIT_PLUGIN) + QLatin1String(".GitShow.") + topLevelString + QLatin1String(".") + relativePath; - QString title = tr("Git Show %1:%2").arg(ref).arg(relativePath); + QString title = Tr::tr("Git Show %1:%2").arg(ref).arg(relativePath); IEditor *editor = EditorManager::openEditorWithContents(Id(), &title, content, documentId, EditorManager::DoNotSwitchToDesignMode); editor->document()->setTemporary(true); @@ -3876,7 +3876,6 @@ IEditor *GitClient::openShowEditor(const FilePath &workingDirectory, const QStri return editor; } -} // namespace Internal -} // namespace Git +} // Git::Internal #include "gitclient.moc" diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index dae7d19194d..6ff835d0b99 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -37,8 +37,7 @@ class VcsBaseEditorWidget; class VcsCommand; } -namespace Git { -namespace Internal { +namespace Git::Internal { class CommitData; class GitBaseDiffEditorController; @@ -80,8 +79,6 @@ public: class GITSHARED_EXPORT GitClient : public VcsBase::VcsBaseClientImpl { - Q_OBJECT - public: enum CommandInProgress { NoCommand, Revert, CherryPick, Rebase, Merge, RebaseMerge }; @@ -406,5 +403,4 @@ public: GitRemote(const QString &location); }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index 305d4f1198c..415d1622983 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -5,9 +5,10 @@ #include "annotationhighlighter.h" #include "gitclient.h" -#include "gitsettings.h" #include "gitconstants.h" #include "githighlighters.h" +#include "gitsettings.h" +#include "gittr.h" #include #include @@ -34,40 +35,37 @@ using namespace Core; using namespace Utils; using namespace VcsBase; -namespace Git { -namespace Internal { +namespace Git::Internal { class GitLogFilterWidget : public QToolBar { - Q_DECLARE_TR_FUNCTIONS(Git::Internal::GitLogFilterWidget); - public: GitLogFilterWidget(GitEditorWidget *editor) { auto addLineEdit = [](const QString &placeholder, const QString &tooltip, GitEditorWidget *editor) { - auto lineEdit = new Utils::FancyLineEdit; + auto lineEdit = new FancyLineEdit; lineEdit->setFiltering(true); lineEdit->setToolTip(tooltip); lineEdit->setPlaceholderText(placeholder); lineEdit->setMaximumWidth(200); connect(lineEdit, &QLineEdit::returnPressed, editor, &GitEditorWidget::refresh); - connect(lineEdit, &Utils::FancyLineEdit::rightButtonClicked, + connect(lineEdit, &FancyLineEdit::rightButtonClicked, editor, &GitEditorWidget::refresh); return lineEdit; }; - grepLineEdit = addLineEdit(tr("Filter by message"), - tr("Filter log entries by text in the commit message."), + grepLineEdit = addLineEdit(Tr::tr("Filter by message"), + Tr::tr("Filter log entries by text in the commit message."), editor); - pickaxeLineEdit = addLineEdit(tr("Filter by content"), - tr("Filter log entries by added or removed string."), + pickaxeLineEdit = addLineEdit(Tr::tr("Filter by content"), + Tr::tr("Filter log entries by added or removed string."), editor); - authorLineEdit = addLineEdit(tr("Filter by author"), - tr("Filter log entries by author."), + authorLineEdit = addLineEdit(Tr::tr("Filter by author"), + Tr::tr("Filter log entries by author."), editor); - addWidget(new QLabel(tr("Filter:"))); + addWidget(new QLabel(Tr::tr("Filter:"))); addSeparator(); addWidget(grepLineEdit); addSeparator(); @@ -75,7 +73,7 @@ public: addSeparator(); addWidget(authorLineEdit); addSeparator(); - caseAction = new QAction(tr("Case Sensitive"), this); + caseAction = new QAction(Tr::tr("Case Sensitive"), this); caseAction->setCheckable(true); caseAction->setChecked(true); connect(caseAction, &QAction::toggled, editor, &GitEditorWidget::refresh); @@ -84,9 +82,9 @@ public: connect(editor, &GitEditorWidget::toggleFilters, this, &QWidget::setVisible); } - Utils::FancyLineEdit *grepLineEdit; - Utils::FancyLineEdit *pickaxeLineEdit; - Utils::FancyLineEdit *authorLineEdit; + FancyLineEdit *grepLineEdit; + FancyLineEdit *pickaxeLineEdit; + FancyLineEdit *authorLineEdit; QAction *caseAction; }; @@ -102,8 +100,8 @@ GitEditorWidget::GitEditorWidget() : */ setDiffFilePattern("^(?:diff --git a/|index |[+-]{3} (?:/dev/null|[ab]/(.+$)))"); setLogEntryPattern("^commit ([0-9a-f]{8})[0-9a-f]{32}"); - setAnnotateRevisionTextFormat(tr("&Blame %1")); - setAnnotatePreviousRevisionTextFormat(tr("Blame &Parent Revision %1")); + setAnnotateRevisionTextFormat(Tr::tr("&Blame %1")); + setAnnotatePreviousRevisionTextFormat(Tr::tr("Blame &Parent Revision %1")); setAnnotationEntryPattern("^(" CHANGE_PATTERN ") "); } @@ -189,9 +187,8 @@ void GitEditorWidget::setPlainText(const QString &text) switch (contentType()) { case LogOutput: { - Utils::AnsiEscapeCodeHandler handler; - const QList formattedTextList - = handler.parseText(Utils::FormattedText(text)); + AnsiEscapeCodeHandler handler; + const QList formattedTextList = handler.parseText(FormattedText(text)); clear(); QTextCursor cursor = textCursor(); @@ -215,7 +212,7 @@ void GitEditorWidget::setPlainText(const QString &text) void GitEditorWidget::applyDiffChunk(const DiffChunk& chunk, PatchAction patchAction) { - Utils::TemporaryFile patchFile("git-apply-chunk"); + TemporaryFile patchFile("git-apply-chunk"); if (!patchFile.open()) return; @@ -230,7 +227,7 @@ void GitEditorWidget::applyDiffChunk(const DiffChunk& chunk, PatchAction patchAc QString errorMessage; if (GitClient::instance()->synchronousApplyPatch(baseDir, patchFile.fileName(), &errorMessage, args)) { if (errorMessage.isEmpty()) - VcsOutputWindow::append(tr("Chunk successfully staged")); + VcsOutputWindow::append(Tr::tr("Chunk successfully staged")); else VcsOutputWindow::append(errorMessage); if (patchAction == PatchAction::Revert) @@ -243,7 +240,7 @@ void GitEditorWidget::applyDiffChunk(const DiffChunk& chunk, PatchAction patchAc void GitEditorWidget::init() { VcsBaseEditorWidget::init(); - Utils::Id editorId = textDocument()->id(); + Id editorId = textDocument()->id(); const bool isCommitEditor = editorId == Git::Constants::GIT_COMMIT_TEXT_EDITOR_ID; const bool isRebaseEditor = editorId == Git::Constants::GIT_REBASE_EDITOR_ID; if (!isCommitEditor && !isRebaseEditor) @@ -259,22 +256,21 @@ void GitEditorWidget::addDiffActions(QMenu *menu, const DiffChunk &chunk) { menu->addSeparator(); - QAction *stageAction = menu->addAction(tr("Stage Chunk...")); + QAction *stageAction = menu->addAction(Tr::tr("Stage Chunk...")); connect(stageAction, &QAction::triggered, this, [this, chunk] { applyDiffChunk(chunk, PatchAction::Apply); }); - QAction *unstageAction = menu->addAction(tr("Unstage Chunk...")); + QAction *unstageAction = menu->addAction(Tr::tr("Unstage Chunk...")); connect(unstageAction, &QAction::triggered, this, [this, chunk] { applyDiffChunk(chunk, PatchAction::Revert); }); } -void GitEditorWidget::aboutToOpen(const Utils::FilePath &filePath, - const Utils::FilePath &realFilePath) +void GitEditorWidget::aboutToOpen(const FilePath &filePath, const FilePath &realFilePath) { Q_UNUSED(realFilePath) - Utils::Id editorId = textDocument()->id(); + Id editorId = textDocument()->id(); if (editorId == Git::Constants::GIT_COMMIT_TEXT_EDITOR_ID || editorId == Git::Constants::GIT_REBASE_EDITOR_ID) { const FilePath gitPath = filePath.absolutePath(); @@ -392,5 +388,4 @@ bool GitEditorWidget::caseSensitive() const return m_logFilterWidget && m_logFilterWidget->caseAction->isChecked(); } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h index 8c92a6da659..79ec42299ca 100644 --- a/src/plugins/git/giteditor.h +++ b/src/plugins/git/giteditor.h @@ -12,8 +12,7 @@ class FancyLineEdit; class FilePath; } // Utils -namespace Git { -namespace Internal { +namespace Git::Internal { class GitLogFilterWidget; @@ -57,5 +56,4 @@ private: GitLogFilterWidget *m_logFilterWidget = nullptr; }; -} // namespace Git -} // namespace Internal +} // Git::Internal diff --git a/src/plugins/git/gitgrep.cpp b/src/plugins/git/gitgrep.cpp index abcea246bf6..1e0fc3f1312 100644 --- a/src/plugins/git/gitgrep.cpp +++ b/src/plugins/git/gitgrep.cpp @@ -2,7 +2,9 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "gitgrep.h" + #include "gitclient.h" +#include "gittr.h" #include @@ -25,8 +27,13 @@ #include #include -namespace Git { -namespace Internal { +using namespace Core; +using namespace Utils; +using namespace VcsBase; + +namespace Git::Internal { + +const char GitGrepRef[] = "GitGrepRef"; class GitGrepParameters { @@ -36,14 +43,6 @@ public: QString id() const { return recurseSubmodules ? ref + ".Rec" : ref; } }; -using namespace Core; -using namespace Utils; -using namespace VcsBase; - -namespace { - -const char GitGrepRef[] = "GitGrepRef"; - class GitGrepRunner { using FutureInterfaceType = QFutureInterface; @@ -192,8 +191,6 @@ private: Environment m_environment; }; -} // namespace - static bool isGitDirectory(const FilePath &path) { static IVersionControl *gitVc = VcsManager::versionControl(VcsBase::Constants::VCS_ID_GIT); @@ -208,8 +205,8 @@ GitGrep::GitGrep(GitClient *client) auto layout = new QHBoxLayout(m_widget); layout->setContentsMargins(0, 0, 0, 0); m_treeLineEdit = new FancyLineEdit; - m_treeLineEdit->setPlaceholderText(tr("Tree (optional)")); - m_treeLineEdit->setToolTip(tr("Can be HEAD, tag, local or remote branch, or a commit hash.\n" + m_treeLineEdit->setPlaceholderText(Tr::tr("Tree (optional)")); + m_treeLineEdit->setToolTip(Tr::tr("Can be HEAD, tag, local or remote branch, or a commit hash.\n" "Leave empty to search through the file system.")); const QRegularExpression refExpression("[\\S]*"); m_treeLineEdit->setValidator(new QRegularExpressionValidator(refExpression, this)); @@ -219,7 +216,7 @@ GitGrep::GitGrep(GitClient *client) this, [this, pLayout = QPointer(layout)](unsigned version) { if (version >= 0x021300 && pLayout) { - m_recurseSubmodules = new QCheckBox(tr("Recurse submodules")); + m_recurseSubmodules = new QCheckBox(Tr::tr("Recurse submodules")); pLayout->addWidget(m_recurseSubmodules); } }); @@ -240,14 +237,14 @@ GitGrep::~GitGrep() QString GitGrep::title() const { - return tr("Git Grep"); + return Tr::tr("Git Grep"); } QString GitGrep::toolTip() const { const QString ref = m_treeLineEdit->text(); if (!ref.isEmpty()) - return tr("Ref: %1\n%2").arg(ref); + return Tr::tr("Ref: %1\n%2").arg(ref); return QLatin1String("%1"); } @@ -296,7 +293,6 @@ IEditor *GitGrep::openEditor(const SearchResultItem &item, return editor; } -} // Internal -} // Git +} // Git::Internal Q_DECLARE_METATYPE(Git::Internal::GitGrepParameters) diff --git a/src/plugins/git/gitgrep.h b/src/plugins/git/gitgrep.h index 41310c8b65b..405f1bc50f0 100644 --- a/src/plugins/git/gitgrep.h +++ b/src/plugins/git/gitgrep.h @@ -5,24 +5,20 @@ #include -#include - QT_FORWARD_DECLARE_CLASS(QCheckBox); namespace Utils { class FancyLineEdit; } -namespace Git { -namespace Internal { +namespace Git::Internal { class GitClient; class GitGrep : public TextEditor::SearchEngine { - Q_DECLARE_TR_FUNCTIONS(GitGrep) - public: explicit GitGrep(GitClient *client); ~GitGrep() override; + QString title() const override; QString toolTip() const override; QWidget *widget() const override; @@ -42,5 +38,4 @@ private: QCheckBox *m_recurseSubmodules = nullptr; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/githighlighters.cpp b/src/plugins/git/githighlighters.cpp index 3b98221741e..a3b7547f080 100644 --- a/src/plugins/git/githighlighters.cpp +++ b/src/plugins/git/githighlighters.cpp @@ -8,10 +8,9 @@ #include "gitconstants.h" #include "githighlighters.h" -namespace Git { -namespace Internal { +namespace Git::Internal { -static const char CHANGE_PATTERN[] = "\\b[a-f0-9]{7,40}\\b"; +const char CHANGE_PATTERN[] = "\\b[a-f0-9]{7,40}\\b"; GitSubmitHighlighter::GitSubmitHighlighter(QChar commentChar, QTextEdit * parent) : TextEditor::SyntaxHighlighter(parent), @@ -159,5 +158,4 @@ void GitRebaseHighlighter::highlightBlock(const QString &text) formatSpaces(text); } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/githighlighters.h b/src/plugins/git/githighlighters.h index 3feb11373bc..81fb8327d88 100644 --- a/src/plugins/git/githighlighters.h +++ b/src/plugins/git/githighlighters.h @@ -7,8 +7,7 @@ #include -namespace Git { -namespace Internal { +namespace Git::Internal { enum Format { Format_Comment, @@ -35,6 +34,7 @@ class GitSubmitHighlighter : public TextEditor::SyntaxHighlighter { public: explicit GitSubmitHighlighter(QChar commentChar = QChar(), QTextEdit *parent = nullptr); + void highlightBlock(const QString &text) override; QChar commentChar() const; void setCommentChar(QChar commentChar); @@ -66,5 +66,4 @@ private: QList m_actions; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 83446e1f04b..4a19145300b 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -9,12 +9,13 @@ #include "gitclient.h" #include "gitconstants.h" #include "giteditor.h" +#include "gitgrep.h" #include "gitsubmiteditor.h" +#include "gittr.h" +#include "gitutils.h" +#include "logchangedialog.h" #include "remotedialog.h" #include "stashdialog.h" -#include "logchangedialog.h" -#include "gitutils.h" -#include "gitgrep.h" #include "gerrit/gerritplugin.h" @@ -80,8 +81,7 @@ using namespace Utils; using namespace VcsBase; using namespace std::placeholders; -namespace Git { -namespace Internal { +namespace Git::Internal { using GitClientMemberFunc = void (GitClient::*)(const FilePath &) const; @@ -242,9 +242,9 @@ public: const FilePath &workingDirectory, const QString &reference) final { - menu->addAction(tr("&Copy \"%1\"").arg(reference), + menu->addAction(Tr::tr("&Copy \"%1\"").arg(reference), [reference] { setClipboardAndSelection(reference); }); - QAction *action = menu->addAction(tr("&Describe Change %1").arg(reference), + QAction *action = menu->addAction(Tr::tr("&Describe Change %1").arg(reference), [=] { vcsDescribe(workingDirectory, reference); }); menu->setDefaultAction(action); GitClient::addChangeActions(menu, workingDirectory.toString(), reference); @@ -457,7 +457,7 @@ void GitPluginPrivate::onApplySettings() m_settings.gitExecutable(&gitFoundOk, &errorMessage); if (!gitFoundOk) { QTimer::singleShot(0, this, [errorMessage] { - AsynchronousMessageBox::warning(tr("Git Settings"), errorMessage); + AsynchronousMessageBox::warning(Tr::tr("Git Settings"), errorMessage); }); } } @@ -498,8 +498,8 @@ const VcsBasePluginState &GitPlugin::currentState() QString GitPlugin::msgRepositoryLabel(const FilePath &repository) { return repository.isEmpty() ? - tr("") : - tr("Repository: %1").arg(repository.toUserOutput()); + Tr::tr("") : + Tr::tr("Repository: %1").arg(repository.toUserOutput()); } // Returns a regular expression pattern with characters not allowed @@ -644,79 +644,79 @@ GitPluginPrivate::GitPluginPrivate() const QString prefix = "git"; m_commandLocator = new CommandLocator("Git", prefix, prefix, this); - m_commandLocator->setDescription(tr("Triggers a Git version control operation.")); + m_commandLocator->setDescription(Tr::tr("Triggers a Git version control operation.")); //register actions ActionContainer *toolsContainer = ActionManager::actionContainer(Core::Constants::M_TOOLS); ActionContainer *gitContainer = ActionManager::createMenu("Git"); - gitContainer->menu()->setTitle(tr("&Git")); + gitContainer->menu()->setTitle(Tr::tr("&Git")); toolsContainer->addMenu(gitContainer); m_menuAction = gitContainer->menu()->menuAction(); /* "Current File" menu */ ActionContainer *currentFileMenu = ActionManager::createMenu("Git.CurrentFileMenu"); - currentFileMenu->menu()->setTitle(tr("Current &File")); + currentFileMenu->menu()->setTitle(Tr::tr("Current &File")); gitContainer->addMenu(currentFileMenu); - createFileAction(currentFileMenu, tr("Diff Current File", "Avoid translating \"Diff\""), - tr("Diff of \"%1\"", "Avoid translating \"Diff\""), + createFileAction(currentFileMenu, Tr::tr("Diff Current File", "Avoid translating \"Diff\""), + Tr::tr("Diff of \"%1\"", "Avoid translating \"Diff\""), "Git.Diff", context, true, std::bind(&GitPluginPrivate::diffCurrentFile, this), - QKeySequence(useMacShortcuts ? tr("Meta+G,Meta+D") : tr("Alt+G,Alt+D"))); + QKeySequence(useMacShortcuts ? Tr::tr("Meta+G,Meta+D") : Tr::tr("Alt+G,Alt+D"))); - createFileAction(currentFileMenu, tr("Log Current File", "Avoid translating \"Log\""), - tr("Log of \"%1\"", "Avoid translating \"Log\""), + createFileAction(currentFileMenu, Tr::tr("Log Current File", "Avoid translating \"Log\""), + Tr::tr("Log of \"%1\"", "Avoid translating \"Log\""), "Git.Log", context, true, std::bind(&GitPluginPrivate::logFile, this), - QKeySequence(useMacShortcuts ? tr("Meta+G,Meta+L") : tr("Alt+G,Alt+L"))); + QKeySequence(useMacShortcuts ? Tr::tr("Meta+G,Meta+L") : Tr::tr("Alt+G,Alt+L"))); - createFileAction(currentFileMenu, tr("Blame Current File", "Avoid translating \"Blame\""), - tr("Blame for \"%1\"", "Avoid translating \"Blame\""), + createFileAction(currentFileMenu, Tr::tr("Blame Current File", "Avoid translating \"Blame\""), + Tr::tr("Blame for \"%1\"", "Avoid translating \"Blame\""), "Git.Blame", context, true, std::bind(&GitPluginPrivate::blameFile, this), - QKeySequence(useMacShortcuts ? tr("Meta+G,Meta+B") : tr("Alt+G,Alt+B"))); + QKeySequence(useMacShortcuts ? Tr::tr("Meta+G,Meta+B") : Tr::tr("Alt+G,Alt+B"))); currentFileMenu->addSeparator(context); - createFileAction(currentFileMenu, tr("Stage File for Commit"), tr("Stage \"%1\" for Commit"), + createFileAction(currentFileMenu, Tr::tr("Stage File for Commit"), Tr::tr("Stage \"%1\" for Commit"), "Git.Stage", context, true, std::bind(&GitPluginPrivate::stageFile, this), - QKeySequence(useMacShortcuts ? tr("Meta+G,Meta+A") : tr("Alt+G,Alt+A"))); + QKeySequence(useMacShortcuts ? Tr::tr("Meta+G,Meta+A") : Tr::tr("Alt+G,Alt+A"))); - createFileAction(currentFileMenu, tr("Unstage File from Commit"), tr("Unstage \"%1\" from Commit"), + createFileAction(currentFileMenu, Tr::tr("Unstage File from Commit"), Tr::tr("Unstage \"%1\" from Commit"), "Git.Unstage", context, true, std::bind(&GitPluginPrivate::unstageFile, this)); - createFileAction(currentFileMenu, tr("Undo Unstaged Changes"), tr("Undo Unstaged Changes for \"%1\""), + createFileAction(currentFileMenu, Tr::tr("Undo Unstaged Changes"), Tr::tr("Undo Unstaged Changes for \"%1\""), "Git.UndoUnstaged", context, true, std::bind(&GitPluginPrivate::undoFileChanges, this, false)); - createFileAction(currentFileMenu, tr("Undo Uncommitted Changes"), tr("Undo Uncommitted Changes for \"%1\""), + createFileAction(currentFileMenu, Tr::tr("Undo Uncommitted Changes"), Tr::tr("Undo Uncommitted Changes for \"%1\""), "Git.Undo", context, true, std::bind(&GitPluginPrivate::undoFileChanges, this, true), - QKeySequence(useMacShortcuts ? tr("Meta+G,Meta+U") : tr("Alt+G,Alt+U"))); + QKeySequence(useMacShortcuts ? Tr::tr("Meta+G,Meta+U") : Tr::tr("Alt+G,Alt+U"))); /* "Current Project" menu */ ActionContainer *currentProjectMenu = ActionManager::createMenu("Git.CurrentProjectMenu"); - currentProjectMenu->menu()->setTitle(tr("Current &Project")); + currentProjectMenu->menu()->setTitle(Tr::tr("Current &Project")); gitContainer->addMenu(currentProjectMenu); - createProjectAction(currentProjectMenu, tr("Diff Current Project", "Avoid translating \"Diff\""), - tr("Diff Project \"%1\"", "Avoid translating \"Diff\""), + createProjectAction(currentProjectMenu, Tr::tr("Diff Current Project", "Avoid translating \"Diff\""), + Tr::tr("Diff Project \"%1\"", "Avoid translating \"Diff\""), "Git.DiffProject", context, true, &GitPluginPrivate::diffCurrentProject, - QKeySequence(useMacShortcuts ? tr("Meta+G,Meta+Shift+D") : tr("Alt+G,Alt+Shift+D"))); + QKeySequence(useMacShortcuts ? Tr::tr("Meta+G,Meta+Shift+D") : Tr::tr("Alt+G,Alt+Shift+D"))); - createProjectAction(currentProjectMenu, tr("Log Project", "Avoid translating \"Log\""), - tr("Log Project \"%1\"", "Avoid translating \"Log\""), + createProjectAction(currentProjectMenu, Tr::tr("Log Project", "Avoid translating \"Log\""), + Tr::tr("Log Project \"%1\"", "Avoid translating \"Log\""), "Git.LogProject", context, true, &GitPluginPrivate::logProject, - QKeySequence(useMacShortcuts ? tr("Meta+G,Meta+K") : tr("Alt+G,Alt+K"))); + QKeySequence(useMacShortcuts ? Tr::tr("Meta+G,Meta+K") : Tr::tr("Alt+G,Alt+K"))); - createProjectAction(currentProjectMenu, tr("Clean Project...", "Avoid translating \"Clean\""), - tr("Clean Project \"%1\"...", "Avoid translating \"Clean\""), + createProjectAction(currentProjectMenu, Tr::tr("Clean Project...", "Avoid translating \"Clean\""), + Tr::tr("Clean Project \"%1\"...", "Avoid translating \"Clean\""), "Git.CleanProject", context, true, &GitPluginPrivate::cleanProject); /* "Local Repository" menu */ ActionContainer *localRepositoryMenu = ActionManager::createMenu("Git.LocalRepositoryMenu"); - localRepositoryMenu->menu()->setTitle(tr("&Local Repository")); + localRepositoryMenu->menu()->setTitle(Tr::tr("&Local Repository")); gitContainer->addMenu(localRepositoryMenu); createRepositoryAction(localRepositoryMenu, "Diff", "Git.DiffRepository", @@ -739,16 +739,16 @@ GitPluginPrivate::GitPluginPrivate() createRepositoryAction(localRepositoryMenu, "Commit...", "Git.Commit", context, true, std::bind(&GitPluginPrivate::startCommit, this, SimpleCommit), - QKeySequence(useMacShortcuts ? tr("Meta+G,Meta+C") : tr("Alt+G,Alt+C"))); + QKeySequence(useMacShortcuts ? Tr::tr("Meta+G,Meta+C") : Tr::tr("Alt+G,Alt+C"))); createRepositoryAction(localRepositoryMenu, - tr("Amend Last Commit...", "Avoid translating \"Commit\""), + Tr::tr("Amend Last Commit...", "Avoid translating \"Commit\""), "Git.AmendCommit", context, true, std::bind(&GitPluginPrivate::startCommit, this, AmendCommit)); m_fixupCommitAction = createRepositoryAction(localRepositoryMenu, - tr("Fixup Previous Commit...", "Avoid translating \"Commit\""), + Tr::tr("Fixup Previous Commit...", "Avoid translating \"Commit\""), "Git.FixupCommit", context, true, std::bind(&GitPluginPrivate::startCommit, this, FixupCommit)); @@ -758,18 +758,18 @@ GitPluginPrivate::GitPluginPrivate() createRepositoryAction(localRepositoryMenu, "Reset...", "Git.Reset", context, true, std::bind(&GitPluginPrivate::resetRepository, this)); - createRepositoryAction(localRepositoryMenu, tr("Recover Deleted Files"), "Git.RecoverDeleted", + createRepositoryAction(localRepositoryMenu, Tr::tr("Recover Deleted Files"), "Git.RecoverDeleted", context, true, std::bind(&GitPluginPrivate::recoverDeletedFiles, this)); m_interactiveRebaseAction = createRepositoryAction(localRepositoryMenu, - tr("Interactive Rebase...", "Avoid translating \"Rebase\""), + Tr::tr("Interactive Rebase...", "Avoid translating \"Rebase\""), "Git.InteractiveRebase", context, true, std::bind(&GitPluginPrivate::startRebase, this)); m_submoduleUpdateAction = createRepositoryAction(localRepositoryMenu, - tr("Update Submodules"), "Git.SubmoduleUpdate", + Tr::tr("Update Submodules"), "Git.SubmoduleUpdate", context, true, std::bind(&GitPluginPrivate::updateSubmodules, this)); auto createAction = [=](const QString &text, Id id, @@ -787,34 +787,34 @@ GitPluginPrivate::GitPluginPrivate() return createRepositoryAction(localRepositoryMenu, text, id, context, true, actionHandler); }; - m_abortMergeAction = createAction(tr("Abort Merge", "Avoid translating \"Merge\""), "Git.MergeAbort", + m_abortMergeAction = createAction(Tr::tr("Abort Merge", "Avoid translating \"Merge\""), "Git.MergeAbort", std::bind(&GitClient::synchronousMerge, &m_gitClient, _1, QString("--abort"), true)); - m_abortRebaseAction = createAction(tr("Abort Rebase", "Avoid translating \"Rebase\""), "Git.RebaseAbort", + m_abortRebaseAction = createAction(Tr::tr("Abort Rebase", "Avoid translating \"Rebase\""), "Git.RebaseAbort", std::bind(&GitClient::rebase, &m_gitClient, _1, QString("--abort"))); - m_continueRebaseAction = createAction(tr("Continue Rebase"), "Git.RebaseContinue", + m_continueRebaseAction = createAction(Tr::tr("Continue Rebase"), "Git.RebaseContinue", std::bind(&GitClient::rebase, &m_gitClient, _1, QString("--continue"))); - m_skipRebaseAction = createAction(tr("Skip Rebase"), "Git.RebaseSkip", + m_skipRebaseAction = createAction(Tr::tr("Skip Rebase"), "Git.RebaseSkip", std::bind(&GitClient::rebase, &m_gitClient, _1, QString("--skip"))); - m_abortCherryPickAction = createAction(tr("Abort Cherry Pick", "Avoid translating \"Cherry Pick\""), "Git.CherryPickAbort", + m_abortCherryPickAction = createAction(Tr::tr("Abort Cherry Pick", "Avoid translating \"Cherry Pick\""), "Git.CherryPickAbort", std::bind(&GitClient::synchronousCherryPick, &m_gitClient, _1, QString("--abort"))); - m_continueCherryPickAction = createAction(tr("Continue Cherry Pick"), "Git.CherryPickContinue", + m_continueCherryPickAction = createAction(Tr::tr("Continue Cherry Pick"), "Git.CherryPickContinue", std::bind(&GitClient::cherryPick, &m_gitClient, _1, QString("--continue"))); - m_abortRevertAction = createAction(tr("Abort Revert", "Avoid translating \"Revert\""), "Git.RevertAbort", + m_abortRevertAction = createAction(Tr::tr("Abort Revert", "Avoid translating \"Revert\""), "Git.RevertAbort", std::bind(&GitClient::synchronousRevert, &m_gitClient, _1, QString("--abort"))); - m_continueRevertAction = createAction(tr("Continue Revert"), "Git.RevertContinue", + m_continueRevertAction = createAction(Tr::tr("Continue Revert"), "Git.RevertContinue", std::bind(&GitClient::revert, &m_gitClient, _1, QString("--continue"))); // -------------- localRepositoryMenu->addSeparator(context); - createRepositoryAction(localRepositoryMenu, tr("Branches..."), "Git.BranchList", + createRepositoryAction(localRepositoryMenu, Tr::tr("Branches..."), "Git.BranchList", context, true, std::bind(&GitPluginPrivate::branchList, this)); // -------------- @@ -822,21 +822,21 @@ GitPluginPrivate::GitPluginPrivate() // "Patch" menu ActionContainer *patchMenu = ActionManager::createMenu("Git.PatchMenu"); - patchMenu->menu()->setTitle(tr("&Patch")); + patchMenu->menu()->setTitle(Tr::tr("&Patch")); localRepositoryMenu->addMenu(patchMenu); // Apply current file as patch is handled specially. m_applyCurrentFilePatchAction = createParameterAction(patchMenu, - tr("Apply from Editor"), tr("Apply \"%1\""), + Tr::tr("Apply from Editor"), Tr::tr("Apply \"%1\""), "Git.ApplyCurrentFilePatch", context, true, std::bind(&GitPluginPrivate::applyCurrentFilePatch, this)); - createRepositoryAction(patchMenu, tr("Apply from File..."), "Git.ApplyPatch", + createRepositoryAction(patchMenu, Tr::tr("Apply from File..."), "Git.ApplyPatch", context, true, std::bind(&GitPluginPrivate::promptApplyPatch, this)); // "Stash" menu ActionContainer *stashMenu = ActionManager::createMenu("Git.StashMenu"); - stashMenu->menu()->setTitle(tr("&Stash")); + stashMenu->menu()->setTitle(Tr::tr("&Stash")); localRepositoryMenu->addMenu(stashMenu); createRepositoryAction(stashMenu, "Stashes...", "Git.StashList", @@ -846,24 +846,24 @@ GitPluginPrivate::GitPluginPrivate() QAction *action = createRepositoryAction(stashMenu, "Stash", "Git.Stash", context, true, std::bind(&GitPluginPrivate::stash, this, false)); - action->setToolTip(tr("Saves the current state of your work and resets the repository.")); + action->setToolTip(Tr::tr("Saves the current state of your work and resets the repository.")); - action = createRepositoryAction(stashMenu, tr("Stash Unstaged Files", "Avoid translating \"Stash\""), + action = createRepositoryAction(stashMenu, Tr::tr("Stash Unstaged Files", "Avoid translating \"Stash\""), "Git.StashUnstaged", context, true, std::bind(&GitPluginPrivate::stashUnstaged, this)); - action->setToolTip(tr("Saves the current state of your unstaged files and resets the repository " + action->setToolTip(Tr::tr("Saves the current state of your unstaged files and resets the repository " "to its staged state.")); - action = createRepositoryAction(stashMenu, tr("Take Snapshot..."), "Git.StashSnapshot", + action = createRepositoryAction(stashMenu, Tr::tr("Take Snapshot..."), "Git.StashSnapshot", context, true, std::bind(&GitPluginPrivate::stashSnapshot, this)); - action->setToolTip(tr("Saves the current state of your work.")); + action->setToolTip(Tr::tr("Saves the current state of your work.")); stashMenu->addSeparator(context); - action = createRepositoryAction(stashMenu, tr("Stash Pop", "Avoid translating \"Stash\""), + action = createRepositoryAction(stashMenu, Tr::tr("Stash Pop", "Avoid translating \"Stash\""), "Git.StashPop", context, true, std::bind(&GitPluginPrivate::stashPop, this)); - action->setToolTip(tr("Restores changes saved to the stash list using \"Stash\".")); + action->setToolTip(Tr::tr("Restores changes saved to the stash list using \"Stash\".")); /* \"Local Repository" menu */ @@ -872,7 +872,7 @@ GitPluginPrivate::GitPluginPrivate() /* "Remote Repository" menu */ ActionContainer *remoteRepositoryMenu = ActionManager::createMenu("Git.RemoteRepositoryMenu"); - remoteRepositoryMenu->menu()->setTitle(tr("&Remote Repository")); + remoteRepositoryMenu->menu()->setTitle(Tr::tr("&Remote Repository")); gitContainer->addMenu(remoteRepositoryMenu); createRepositoryAction(remoteRepositoryMenu, "Fetch", "Git.Fetch", @@ -889,7 +889,7 @@ GitPluginPrivate::GitPluginPrivate() // "Subversion" menu ActionContainer *subversionMenu = ActionManager::createMenu("Git.Subversion"); - subversionMenu->menu()->setTitle(tr("&Subversion")); + subversionMenu->menu()->setTitle(Tr::tr("&Subversion")); remoteRepositoryMenu->addMenu(subversionMenu); createRepositoryAction(subversionMenu, "Log", "Git.Subversion.Log", @@ -898,13 +898,13 @@ GitPluginPrivate::GitPluginPrivate() createRepositoryAction(subversionMenu, "Fetch", "Git.Subversion.Fetch", context, false, &GitClient::synchronousSubversionFetch); - createRepositoryAction(subversionMenu, tr("DCommit"), "Git.Subversion.DCommit", + createRepositoryAction(subversionMenu, Tr::tr("DCommit"), "Git.Subversion.DCommit", context, false, &GitClient::subversionDeltaCommit); // -------------- remoteRepositoryMenu->addSeparator(context); - createRepositoryAction(remoteRepositoryMenu, tr("Manage Remotes..."), "Git.RemoteList", + createRepositoryAction(remoteRepositoryMenu, Tr::tr("Manage Remotes..."), "Git.RemoteList", context, false, std::bind(&GitPluginPrivate::manageRemotes, this)); /* \"Remote Repository" menu */ @@ -916,7 +916,7 @@ GitPluginPrivate::GitPluginPrivate() createChangeRelatedRepositoryAction("Revert...", "Git.Revert", context); createChangeRelatedRepositoryAction("Cherry Pick...", "Git.CherryPick", context); createChangeRelatedRepositoryAction("Checkout...", "Git.Checkout", context); - createChangeRelatedRepositoryAction(tr("Archive..."), "Git.Archive", context); + createChangeRelatedRepositoryAction(Tr::tr("Archive..."), "Git.Archive", context); createRepositoryAction(nullptr, "Rebase...", "Git.Rebase", context, true, std::bind(&GitPluginPrivate::branchList, this)); @@ -928,22 +928,22 @@ GitPluginPrivate::GitPluginPrivate() /* "Git Tools" menu */ ActionContainer *gitToolsMenu = ActionManager::createMenu("Git.GitToolsMenu"); - gitToolsMenu->menu()->setTitle(tr("Git &Tools")); + gitToolsMenu->menu()->setTitle(Tr::tr("Git &Tools")); gitContainer->addMenu(gitToolsMenu); - createRepositoryAction(gitToolsMenu, tr("Gitk"), "Git.LaunchGitK", + createRepositoryAction(gitToolsMenu, Tr::tr("Gitk"), "Git.LaunchGitK", context, true, &GitClient::launchGitK); - createFileAction(gitToolsMenu, tr("Gitk Current File"), tr("Gitk of \"%1\""), + createFileAction(gitToolsMenu, Tr::tr("Gitk Current File"), Tr::tr("Gitk of \"%1\""), "Git.GitkFile", context, true, std::bind(&GitPluginPrivate::gitkForCurrentFile, this)); - createFileAction(gitToolsMenu, tr("Gitk for folder of Current File"), tr("Gitk for folder of \"%1\""), + createFileAction(gitToolsMenu, Tr::tr("Gitk for folder of Current File"), Tr::tr("Gitk for folder of \"%1\""), "Git.GitkFolder", context, true, std::bind(&GitPluginPrivate::gitkForCurrentFolder, this)); // -------------- gitToolsMenu->addSeparator(context); - createRepositoryAction(gitToolsMenu, tr("Git Gui"), "Git.GitGui", + createRepositoryAction(gitToolsMenu, Tr::tr("Git Gui"), "Git.GitGui", context, true, std::bind(&GitPluginPrivate::gitGui, this)); // -------------- @@ -951,18 +951,18 @@ GitPluginPrivate::GitPluginPrivate() m_repositoryBrowserAction = createRepositoryAction(gitToolsMenu, - tr("Repository Browser"), "Git.LaunchRepositoryBrowser", + Tr::tr("Repository Browser"), "Git.LaunchRepositoryBrowser", context, true, &GitClient::launchRepositoryBrowser); m_mergeToolAction - = createRepositoryAction(gitToolsMenu, tr("Merge Tool"), "Git.MergeTool", + = createRepositoryAction(gitToolsMenu, Tr::tr("Merge Tool"), "Git.MergeTool", context, true, std::bind(&GitPluginPrivate::startMergeTool, this)); // -------------- if (HostOsInfo::isWindowsHost()) { gitToolsMenu->addSeparator(context); - createRepositoryAction(gitToolsMenu, tr("Git Bash"), "Git.GitBash", + createRepositoryAction(gitToolsMenu, Tr::tr("Git Bash"), "Git.GitBash", context, true, std::bind(&GitPluginPrivate::gitBash, this)); } @@ -971,14 +971,14 @@ GitPluginPrivate::GitPluginPrivate() // -------------- gitContainer->addSeparator(context); - QAction *actionsOnCommitsAction = new QAction(tr("Actions on Commits..."), this); + QAction *actionsOnCommitsAction = new QAction(Tr::tr("Actions on Commits..."), this); Command *actionsOnCommitsCommand = ActionManager::registerAction( actionsOnCommitsAction, "Git.ChangeActions"); connect(actionsOnCommitsAction, &QAction::triggered, this, [this] { startChangeRelatedAction("Git.ChangeActions"); }); gitContainer->addAction(actionsOnCommitsCommand); - QAction *createRepositoryAction = new QAction(tr("Create Repository..."), this); + QAction *createRepositoryAction = new QAction(Tr::tr("Create Repository..."), this); Command *createRepositoryCommand = ActionManager::registerAction( createRepositoryAction, "Git.CreateRepository"); connect(createRepositoryAction, &QAction::triggered, this, &GitPluginPrivate::createRepository); @@ -1131,7 +1131,7 @@ void GitPluginPrivate::resetRepository() LogChangeDialog dialog(true, ICore::dialogParent()); ResetItemDelegate delegate(dialog.widget()); - dialog.setWindowTitle(tr("Undo Changes to %1").arg(topLevel.toUserOutput())); + dialog.setWindowTitle(Tr::tr("Undo Changes to %1").arg(topLevel.toUserOutput())); if (dialog.runDialog(topLevel, {}, LogChangeWidget::IncludeRemotes)) m_gitClient.reset(topLevel, dialog.resetFlag(), dialog.commit()); } @@ -1164,7 +1164,7 @@ void GitPluginPrivate::startRebaseFromCommit(const FilePath &workingDirectory, Q if (commit.isEmpty()) { LogChangeDialog dialog(false, ICore::dialogParent()); RebaseItemDelegate delegate(dialog.widget()); - dialog.setWindowTitle(tr("Interactive Rebase")); + dialog.setWindowTitle(Tr::tr("Interactive Rebase")); if (!dialog.runDialog(workingDirectory)) return; commit = dialog.commit(); @@ -1299,7 +1299,7 @@ void GitPluginPrivate::startCommit(CommitType commitType) if (raiseSubmitEditor()) return; if (isCommitEditorOpen()) { - VcsOutputWindow::appendWarning(tr("Another submit is currently being executed.")); + VcsOutputWindow::appendWarning(Tr::tr("Another submit is currently being executed.")); return; } @@ -1344,7 +1344,7 @@ void GitPluginPrivate::updateVersionWarning() return; infoBar->addInfo( InfoBarEntry(gitVersionWarning, - tr("Unsupported version of Git found. Git %1 or later required.") + Tr::tr("Unsupported version of Git found. Git %1 or later required.") .arg(versionString(minimumRequiredVersion)), InfoBarEntry::GlobalSuppression::Enabled)); }); @@ -1362,13 +1362,13 @@ IEditor *GitPluginPrivate::openSubmitEditor(const QString &fileName, const Commi QString title; switch (cd.commitType) { case AmendCommit: - title = tr("Amend %1").arg(cd.amendSHA1); + title = Tr::tr("Amend %1").arg(cd.amendSHA1); break; case FixupCommit: - title = tr("Git Fixup Commit"); + title = Tr::tr("Git Fixup Commit"); break; default: - title = tr("Git Commit"); + title = Tr::tr("Git Commit"); } IDocument *document = submitEditor->document(); document->setPreferredDisplayName(title); @@ -1518,12 +1518,12 @@ void GitPluginPrivate::cleanRepository(const FilePath &directory) QApplication::restoreOverrideCursor(); if (!gotFiles) { - AsynchronousMessageBox::warning(tr("Unable to Retrieve File List"), errorMessage); + AsynchronousMessageBox::warning(Tr::tr("Unable to Retrieve File List"), errorMessage); return; } if (files.isEmpty() && ignoredFiles.isEmpty()) { - AsynchronousMessageBox::information(tr("Repository Clean"), - tr("The repository is clean.")); + AsynchronousMessageBox::information(Tr::tr("Repository Clean"), + Tr::tr("The repository is clean.")); return; } @@ -1571,8 +1571,8 @@ void GitPluginPrivate::applyPatch(const FilePath &workingDirectory, QString file return; // Prompt for file if (file.isEmpty()) { - const QString filter = tr("Patches (*.patch *.diff)"); - file = QFileDialog::getOpenFileName(ICore::dialogParent(), tr("Choose Patch"), {}, filter); + const QString filter = Tr::tr("Patches (*.patch *.diff)"); + file = QFileDialog::getOpenFileName(ICore::dialogParent(), Tr::tr("Choose Patch"), {}, filter); if (file.isEmpty()) { m_gitClient.endStashScope(workingDirectory); return; @@ -1582,7 +1582,7 @@ void GitPluginPrivate::applyPatch(const FilePath &workingDirectory, QString file QString errorMessage; if (m_gitClient.synchronousApplyPatch(workingDirectory, file, &errorMessage)) { if (errorMessage.isEmpty()) - VcsOutputWindow::appendMessage(tr("Patch %1 successfully applied to %2") + VcsOutputWindow::appendMessage(Tr::tr("Patch %1 successfully applied to %2") .arg(file, workingDirectory.toUserOutput())); else VcsOutputWindow::appendError(errorMessage); @@ -2099,13 +2099,11 @@ public: bool m_isValid = true; }; -} // namespace Internal -} // namespace Git +} // Git::Internal Q_DECLARE_METATYPE(Git::Internal::RemoteTest) -namespace Git { -namespace Internal { +namespace Git::Internal { void GitPlugin::testGitRemote_data() { @@ -2189,7 +2187,6 @@ void GitPlugin::testGitRemote() #endif -} // namespace Internal -} // namespace Git +} // Git::Internal #include "gitplugin.moc" diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h index c6b7edec0f7..b7a3aadf927 100644 --- a/src/plugins/git/gitplugin.h +++ b/src/plugins/git/gitplugin.h @@ -16,8 +16,7 @@ namespace VcsBase { class VcsBasePluginState; } -namespace Git { -namespace Internal { +namespace Git::Internal { class GitClient; @@ -67,5 +66,4 @@ private slots: }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/gitsettings.cpp b/src/plugins/git/gitsettings.cpp index b1f3103a7e4..4e2432941ad 100644 --- a/src/plugins/git/gitsettings.cpp +++ b/src/plugins/git/gitsettings.cpp @@ -3,6 +3,8 @@ #include "gitsettings.h" +#include "gittr.h" + #include #include @@ -13,22 +15,21 @@ using namespace Utils; using namespace VcsBase; -namespace Git { -namespace Internal { +namespace Git::Internal { GitSettings::GitSettings() { setSettingsGroup("Git"); path.setDisplayStyle(StringAspect::LineEditDisplay); - path.setLabelText(tr("Prepend to PATH:")); + path.setLabelText(Tr::tr("Prepend to PATH:")); registerAspect(&binaryPath); binaryPath.setDefaultValue("git"); registerAspect(&pullRebase); pullRebase.setSettingsKey("PullRebase"); - pullRebase.setLabelText(tr("Pull with rebase")); + pullRebase.setLabelText(Tr::tr("Pull with rebase")); registerAspect(&showTags); showTags.setSettingsKey("ShowTags"); @@ -55,16 +56,16 @@ GitSettings::GitSettings() registerAspect(&winSetHomeEnvironment); winSetHomeEnvironment.setSettingsKey("WinSetHomeEnvironment"); winSetHomeEnvironment.setDefaultValue(true); - winSetHomeEnvironment.setLabelText(tr("Set \"HOME\" environment variable")); + winSetHomeEnvironment.setLabelText(Tr::tr("Set \"HOME\" environment variable")); if (HostOsInfo::isWindowsHost()) { const QString currentHome = qtcEnvironmentVariable("HOME"); const QString toolTip - = tr("Set the environment variable HOME to \"%1\"\n(%2).\n" + = Tr::tr("Set the environment variable HOME to \"%1\"\n(%2).\n" "This causes Git to look for the SSH-keys in that location\n" "instead of its installation directory when run outside git bash.") .arg(QDir::homePath(), - currentHome.isEmpty() ? tr("not currently set") - : tr("currently set to \"%1\"").arg(currentHome)); + currentHome.isEmpty() ? Tr::tr("not currently set") + : Tr::tr("currently set to \"%1\"").arg(currentHome)); winSetHomeEnvironment.setToolTip(toolTip); } else { winSetHomeEnvironment.setVisible(false); @@ -73,19 +74,19 @@ GitSettings::GitSettings() registerAspect(&gitkOptions); gitkOptions.setDisplayStyle(StringAspect::LineEditDisplay); gitkOptions.setSettingsKey("GitKOptions"); - gitkOptions.setLabelText(tr("Arguments:")); + gitkOptions.setLabelText(Tr::tr("Arguments:")); registerAspect(&logDiff); logDiff.setSettingsKey("LogDiff"); - logDiff.setToolTip(tr("Note that huge amount of commits might take some time.")); + logDiff.setToolTip(Tr::tr("Note that huge amount of commits might take some time.")); registerAspect(&repositoryBrowserCmd); repositoryBrowserCmd.setDisplayStyle(StringAspect::PathChooserDisplay); repositoryBrowserCmd.setSettingsKey("RepositoryBrowserCmd"); repositoryBrowserCmd.setExpectedKind(PathChooser::ExistingCommand); repositoryBrowserCmd.setHistoryCompleter("Git.RepoCommand.History"); - repositoryBrowserCmd.setDisplayName(tr("Git Repository Browser Command")); - repositoryBrowserCmd.setLabelText(tr("Command:")); + repositoryBrowserCmd.setDisplayName(Tr::tr("Git Repository Browser Command")); + repositoryBrowserCmd.setLabelText(Tr::tr("Command:")); registerAspect(&graphLog); graphLog.setSettingsKey("GraphLog"); @@ -126,7 +127,7 @@ FilePath GitSettings::gitExecutable(bool *ok, QString *errorMessage) const if (ok) *ok = false; if (errorMessage) - *errorMessage = tr("The binary \"%1\" could not be located in the path \"%2\"") + *errorMessage = Tr::tr("The binary \"%1\" could not be located in the path \"%2\"") .arg(binaryPath.value(), path.value()); } return binPath; @@ -137,7 +138,7 @@ FilePath GitSettings::gitExecutable(bool *ok, QString *errorMessage) const GitSettingsPage::GitSettingsPage(GitSettings *settings) { setId(VcsBase::Constants::VCS_ID_GIT); - setDisplayName(GitSettings::tr("Git")); + setDisplayName(Tr::tr("Git")); setCategory(VcsBase::Constants::VCS_SETTINGS_CATEGORY); setSettings(settings); @@ -147,7 +148,7 @@ GitSettingsPage::GitSettingsPage(GitSettings *settings) Column { Group { - title(GitSettings::tr("Configuration")), + title(Tr::tr("Configuration")), Column { Row { s.path }, s.winSetHomeEnvironment, @@ -155,7 +156,7 @@ GitSettingsPage::GitSettingsPage(GitSettings *settings) }, Group { - title(GitSettings::tr("Miscellaneous")), + title(Tr::tr("Miscellaneous")), Column { Row { s.logCount, s.timeout, st }, s.pullRebase @@ -163,12 +164,12 @@ GitSettingsPage::GitSettingsPage(GitSettings *settings) }, Group { - title(GitSettings::tr("Gitk")), + title(Tr::tr("Gitk")), Row { s.gitkOptions } }, Group { - title(GitSettings::tr("Repository Browser")), + title(Tr::tr("Repository Browser")), Row { s.repositoryBrowserCmd } }, @@ -177,5 +178,4 @@ GitSettingsPage::GitSettingsPage(GitSettings *settings) }); } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/gitsettings.h b/src/plugins/git/gitsettings.h index 6ac00afe887..0bf4e68fa50 100644 --- a/src/plugins/git/gitsettings.h +++ b/src/plugins/git/gitsettings.h @@ -6,8 +6,7 @@ #include #include -namespace Git { -namespace Internal { +namespace Git::Internal { enum CommitType { @@ -19,8 +18,6 @@ enum CommitType // Todo: Add user name and password? class GitSettings : public VcsBase::VcsBaseSettings { - Q_DECLARE_TR_FUNCTIONS(Git::Internal::GitSettings) - public: GitSettings(); @@ -51,5 +48,4 @@ public: explicit GitSettingsPage(GitSettings *settings); }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp index 09ce7214b3f..4614f7293d2 100644 --- a/src/plugins/git/gitsubmiteditor.cpp +++ b/src/plugins/git/gitsubmiteditor.cpp @@ -2,9 +2,11 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "gitsubmiteditor.h" + #include "gitclient.h" #include "gitplugin.h" #include "gitsubmiteditorwidget.h" +#include "gittr.h" #include #include @@ -19,13 +21,12 @@ #include #include -static const char TASK_UPDATE_COMMIT[] = "Git.UpdateCommit"; - using namespace Utils; using namespace VcsBase; -namespace Git { -namespace Internal { +namespace Git::Internal { + +const char TASK_UPDATE_COMMIT[] = "Git.UpdateCommit"; class GitSubmitFileModel : public SubmitFileModel { @@ -206,7 +207,7 @@ void GitSubmitEditor::updateFileModel() w->setUpdateInProgress(true); m_fetchWatcher.setFuture(Utils::runAsync(&CommitDataFetchResult::fetch, m_commitType, m_workingDirectory)); - Core::ProgressManager::addTask(m_fetchWatcher.future(), tr("Refreshing Commit Data"), + Core::ProgressManager::addTask(m_fetchWatcher.future(), Tr::tr("Refreshing Commit Data"), TASK_UPDATE_COMMIT); GitClient::instance()->addFuture(QFuture(m_fetchWatcher.future())); @@ -262,5 +263,4 @@ QByteArray GitSubmitEditor::fileContents() const return text.toUtf8(); } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/gitsubmiteditor.h b/src/plugins/git/gitsubmiteditor.h index 8798072465e..3b82870d8dc 100644 --- a/src/plugins/git/gitsubmiteditor.h +++ b/src/plugins/git/gitsubmiteditor.h @@ -14,8 +14,7 @@ namespace VcsBase { class SubmitFileModel; } -namespace Git { -namespace Internal { +namespace Git::Internal { class GitSubmitEditorWidget; class GitSubmitEditorPanelData; @@ -65,5 +64,4 @@ private: QFutureWatcher m_fetchWatcher; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/gitsubmiteditorwidget.cpp b/src/plugins/git/gitsubmiteditorwidget.cpp index 57d5528079d..f81e22d1692 100644 --- a/src/plugins/git/gitsubmiteditorwidget.cpp +++ b/src/plugins/git/gitsubmiteditorwidget.cpp @@ -6,6 +6,7 @@ #include "commitdata.h" #include "gitconstants.h" #include "githighlighters.h" +#include "gittr.h" #include "logchangedialog.h" #include @@ -18,8 +19,6 @@ #include #include -#include -#include #include #include #include @@ -30,8 +29,7 @@ using namespace Utils; -namespace Git { -namespace Internal { +namespace Git::Internal { class GitSubmitPanel : public QWidget { @@ -40,9 +38,9 @@ public: { resize(364, 269); - repositoryLabel = new QLabel(tr("repository")); - branchLabel = new QLabel(tr("branch")); // FIXME: Isn't this overwritten soon? - showHeadLabel = new QLabel(tr("Show HEAD")); // FIXME: Simplify string in tr() + repositoryLabel = new QLabel(Tr::tr("repository")); + branchLabel = new QLabel(Tr::tr("branch")); // FIXME: Isn't this overwritten soon? + showHeadLabel = new QLabel(Tr::tr("Show HEAD")); // FIXME: Simplify string in tr() authorLineEdit = new QLineEdit; authorLineEdit->setMinimumSize(QSize(200, 0)); @@ -56,25 +54,25 @@ public: invalidEmailLabel = new QLabel; invalidEmailLabel->setMinimumSize(QSize(20, 20)); - bypassHooksCheckBox = new QCheckBox(tr("By&pass hooks")); + bypassHooksCheckBox = new QCheckBox(Tr::tr("By&pass hooks")); - signOffCheckBox = new QCheckBox(tr("Sign off")); + signOffCheckBox = new QCheckBox(Tr::tr("Sign off")); using namespace Layouting; - editGroup = new QGroupBox(tr("Commit Information")); + editGroup = new QGroupBox(Tr::tr("Commit Information")); Grid { - tr("Author:"), authorLineEdit, invalidAuthorLabel, st, br, - tr("Email:"), emailLineEdit, invalidEmailLabel, br, + Tr::tr("Author:"), authorLineEdit, invalidAuthorLabel, st, br, + Tr::tr("Email:"), emailLineEdit, invalidEmailLabel, br, empty, Row { bypassHooksCheckBox, signOffCheckBox, st } }.attachTo(editGroup); Column { Group { - title(tr("General Information")), + title(Tr::tr("General Information")), Form { - tr("Repository:"), repositoryLabel, br, - tr("Branch:"), branchLabel, br, + Tr::tr("Repository:"), repositoryLabel, br, + Tr::tr("Branch:"), branchLabel, br, Span(2, showHeadLabel) } }, @@ -103,7 +101,7 @@ GitSubmitEditorWidget::GitSubmitEditorWidget() : m_emailValidator = new QRegularExpressionValidator(QRegularExpression("[^@ ]+@[^@ ]+\\.[a-zA-Z]+"), this); const QPixmap error = Utils::Icons::CRITICAL.pixmap(); m_gitSubmitPanel->invalidAuthorLabel->setPixmap(error); - m_gitSubmitPanel->invalidEmailLabel->setToolTip(tr("Provide a valid email to commit.")); + m_gitSubmitPanel->invalidEmailLabel->setToolTip(Tr::tr("Provide a valid email to commit.")); m_gitSubmitPanel->invalidEmailLabel->setPixmap(error); connect(m_gitSubmitPanel->authorLineEdit, &QLineEdit::textChanged, @@ -121,7 +119,7 @@ void GitSubmitEditorWidget::setPanelInfo(const GitSubmitEditorPanelInfo &info) const QString errorColor = Utils::creatorTheme()->color(Utils::Theme::TextColorError).name(); m_gitSubmitPanel->branchLabel->setText(QString::fromLatin1("%2") - .arg(errorColor, tr("Detached HEAD"))); + .arg(errorColor, Tr::tr("Detached HEAD"))); } else { m_gitSubmitPanel->branchLabel->setText(info.branch); } @@ -145,7 +143,7 @@ void GitSubmitEditorWidget::initialize(const FilePath &repository, const CommitD if (data.commitType != AmendCommit) m_gitSubmitPanel->showHeadLabel->hide(); if (data.commitType == FixupCommit) { - auto logChangeGroupBox = new QGroupBox(tr("Select Change")); + auto logChangeGroupBox = new QGroupBox(Tr::tr("Select Change")); auto logChangeLayout = new QVBoxLayout; logChangeGroupBox->setLayout(logChangeLayout); m_logChangeWidget = new LogChangeWidget; @@ -166,11 +164,11 @@ void GitSubmitEditorWidget::initialize(const FilePath &repository, const CommitD if (data.enablePush) { auto menu = new QMenu(this); - connect(menu->addAction(tr("&Commit only")), &QAction::triggered, + connect(menu->addAction(Tr::tr("&Commit only")), &QAction::triggered, this, &GitSubmitEditorWidget::commitOnlySlot); - connect(menu->addAction(tr("Commit and &Push")), &QAction::triggered, + connect(menu->addAction(Tr::tr("Commit and &Push")), &QAction::triggered, this, &GitSubmitEditorWidget::commitAndPushSlot); - connect(menu->addAction(tr("Commit and Push to &Gerrit")), &QAction::triggered, + connect(menu->addAction(Tr::tr("Commit and Push to &Gerrit")), &QAction::triggered, this, &GitSubmitEditorWidget::commitAndPushToGerritSlot); addSubmitButtonMenu(menu); } @@ -212,17 +210,17 @@ bool GitSubmitEditorWidget::canSubmit(QString *whyNot) const { if (m_gitSubmitPanel->invalidAuthorLabel->isVisible()) { if (whyNot) - *whyNot = tr("Invalid author"); + *whyNot = Tr::tr("Invalid author"); return false; } if (m_gitSubmitPanel->invalidEmailLabel->isVisible()) { if (whyNot) - *whyNot = tr("Invalid email"); + *whyNot = Tr::tr("Invalid email"); return false; } if (m_hasUnmerged) { if (whyNot) - *whyNot = tr("Unresolved merge conflicts"); + *whyNot = Tr::tr("Unresolved merge conflicts"); return false; } return SubmitEditorWidget::canSubmit(whyNot); @@ -250,11 +248,11 @@ QString GitSubmitEditorWidget::cleanupDescription(const QString &input) const QString GitSubmitEditorWidget::commitName() const { if (m_pushAction == NormalPush) - return tr("&Commit and Push"); + return Tr::tr("&Commit and Push"); else if (m_pushAction == PushToGerrit) - return tr("&Commit and Push to Gerrit"); + return Tr::tr("&Commit and Push to Gerrit"); - return tr("&Commit"); + return Tr::tr("&Commit"); } void GitSubmitEditorWidget::authorInformationChanged() @@ -295,5 +293,4 @@ bool GitSubmitEditorWidget::emailIsValid() const return m_emailValidator->validate(text, pos) == QValidator::Acceptable; } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/gitsubmiteditorwidget.h b/src/plugins/git/gitsubmiteditorwidget.h index ba5542c6630..a6d27beaf73 100644 --- a/src/plugins/git/gitsubmiteditorwidget.h +++ b/src/plugins/git/gitsubmiteditorwidget.h @@ -3,7 +3,6 @@ #pragma once -#include "gitsettings.h" #include "commitdata.h" #include @@ -16,8 +15,7 @@ QT_BEGIN_NAMESPACE class QValidator; QT_END_NAMESPACE -namespace Git { -namespace Internal { +namespace Git::Internal { class GitSubmitPanel; class GitSubmitEditorPanelInfo; @@ -75,5 +73,4 @@ private: bool m_isInitialized = false; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/gitutils.cpp b/src/plugins/git/gitutils.cpp index 5ca8abbd9b5..6b9a288a65e 100644 --- a/src/plugins/git/gitutils.cpp +++ b/src/plugins/git/gitutils.cpp @@ -6,8 +6,7 @@ #include #include -namespace Git { -namespace Internal { +namespace Git::Internal { void Stash::clear() { @@ -72,5 +71,4 @@ QString versionString(unsigned ver) .arg(versionPart(ver)); } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/gitutils.h b/src/plugins/git/gitutils.h index b24812fad1c..c8d0900314c 100644 --- a/src/plugins/git/gitutils.h +++ b/src/plugins/git/gitutils.h @@ -9,10 +9,10 @@ QT_BEGIN_NAMESPACE class QWidget; QT_END_NAMESPACE -namespace Git { -namespace Internal { +namespace Git::Internal { -class Stash { +class Stash +{ public: void clear(); bool parseStashLine(const QString &l); @@ -33,5 +33,4 @@ inline unsigned version(unsigned major, unsigned minor, unsigned patch) QString versionString(unsigned ver); -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/logchangedialog.cpp b/src/plugins/git/logchangedialog.cpp index ac8c9feb45e..41c620ab6fe 100644 --- a/src/plugins/git/logchangedialog.cpp +++ b/src/plugins/git/logchangedialog.cpp @@ -2,7 +2,9 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "logchangedialog.h" + #include "gitclient.h" +#include "gittr.h" #include #include @@ -23,8 +25,7 @@ using namespace Utils; using namespace VcsBase; -namespace Git { -namespace Internal { +namespace Git::Internal { enum Columns { @@ -65,7 +66,7 @@ LogChangeWidget::LogChangeWidget(QWidget *parent) , m_hasCustomDelegate(false) { QStringList headers; - headers << tr("Sha1")<< tr("Subject"); + headers << Tr::tr("Sha1")<< Tr::tr("Subject"); m_model->setHorizontalHeaderLabels(headers); setModel(m_model); setMinimumWidth(300); @@ -214,15 +215,15 @@ LogChangeDialog::LogChangeDialog(bool isReset, QWidget *parent) : , m_dialogButtonBox(new QDialogButtonBox(this)) { auto layout = new QVBoxLayout(this); - layout->addWidget(new QLabel(isReset ? tr("Reset to:") : tr("Select change:"), this)); + layout->addWidget(new QLabel(isReset ? Tr::tr("Reset to:") : Tr::tr("Select change:"), this)); layout->addWidget(m_widget); auto popUpLayout = new QHBoxLayout; if (isReset) { - popUpLayout->addWidget(new QLabel(tr("Reset type:"), this)); + popUpLayout->addWidget(new QLabel(Tr::tr("Reset type:"), this)); m_resetTypeComboBox = new QComboBox(this); - m_resetTypeComboBox->addItem(tr("Hard"), "--hard"); - m_resetTypeComboBox->addItem(tr("Mixed"), "--mixed"); - m_resetTypeComboBox->addItem(tr("Soft"), "--soft"); + m_resetTypeComboBox->addItem(Tr::tr("Hard"), "--hard"); + m_resetTypeComboBox->addItem(Tr::tr("Mixed"), "--mixed"); + m_resetTypeComboBox->addItem(Tr::tr("Soft"), "--soft"); m_resetTypeComboBox->setCurrentIndex(GitClient::settings().lastResetIndex.value()); popUpLayout->addWidget(m_resetTypeComboBox); popUpLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored)); @@ -306,5 +307,4 @@ void IconItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti QStyledItemDelegate::paint(painter, o, index); } -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/logchangedialog.h b/src/plugins/git/logchangedialog.h index 09fce4dfa18..483968271f8 100644 --- a/src/plugins/git/logchangedialog.h +++ b/src/plugins/git/logchangedialog.h @@ -18,8 +18,7 @@ class QStandardItemModel; class QStandardItem; QT_END_NAMESPACE -namespace Git { -namespace Internal { +namespace Git::Internal { class LogChangeModel; @@ -65,8 +64,6 @@ private: class LogChangeDialog : public QDialog { - Q_OBJECT - public: LogChangeDialog(bool isReset, QWidget *parent); @@ -109,5 +106,4 @@ private: QIcon m_icon; }; -} // namespace Internal -} // namespace Git +} // Git::Internal diff --git a/src/plugins/git/mergetool.cpp b/src/plugins/git/mergetool.cpp index 19077d4d45a..88bed0dd257 100644 --- a/src/plugins/git/mergetool.cpp +++ b/src/plugins/git/mergetool.cpp @@ -2,8 +2,10 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "mergetool.h" + #include "gitclient.h" #include "gitplugin.h" +#include "gittr.h" #include #include @@ -17,8 +19,7 @@ using namespace Utils; using namespace VcsBase; -namespace Git { -namespace Internal { +namespace Git::Internal { MergeTool::MergeTool(QObject *parent) : QObject(parent) { @@ -88,10 +89,10 @@ static MergeTool::MergeType mergeType(const QString &type) QString MergeTool::mergeTypeName() { switch (m_mergeType) { - case NormalMerge: return tr("Normal"); - case SubmoduleMerge: return tr("Submodule"); - case DeletedMerge: return tr("Deleted"); - case SymbolicLinkMerge: return tr("Symbolic link"); + case NormalMerge: return Tr::tr("Normal"); + case SubmoduleMerge: return Tr::tr("Submodule"); + case DeletedMerge: return Tr::tr("Deleted"); + case SymbolicLinkMerge: return Tr::tr("Symbolic link"); } return QString(); } @@ -99,11 +100,11 @@ QString MergeTool::mergeTypeName() QString MergeTool::stateName(MergeTool::FileState state, const QString &extraInfo) { switch (state) { - case ModifiedState: return tr("Modified"); - case CreatedState: return tr("Created"); - case DeletedState: return tr("Deleted"); - case SubmoduleState: return tr("Submodule commit %1").arg(extraInfo); - case SymbolicLinkState: return tr("Symbolic link -> %1").arg(extraInfo); + case ModifiedState: return Tr::tr("Modified"); + case CreatedState: return Tr::tr("Created"); + case DeletedState: return Tr::tr("Deleted"); + case SubmoduleState: return Tr::tr("Submodule commit %1").arg(extraInfo); + case SymbolicLinkState: return Tr::tr("Symbolic link -> %1").arg(extraInfo); default: break; } return QString(); @@ -114,25 +115,25 @@ void MergeTool::chooseAction() if (m_mergeType == NormalMerge) return; QMessageBox msgBox; - msgBox.setWindowTitle(tr("Merge Conflict")); + msgBox.setWindowTitle(Tr::tr("Merge Conflict")); msgBox.setIcon(QMessageBox::Question); msgBox.setStandardButtons(QMessageBox::Abort); - msgBox.setText(tr("%1 merge conflict for \"%2\"\nLocal: %3\nRemote: %4") + msgBox.setText(Tr::tr("%1 merge conflict for \"%2\"\nLocal: %3\nRemote: %4") .arg(mergeTypeName(), m_fileName, stateName(m_localState, m_localInfo), stateName(m_remoteState, m_remoteInfo))); switch (m_mergeType) { case SubmoduleMerge: case SymbolicLinkMerge: - addButton(&msgBox, tr("&Local"), 'l'); - addButton(&msgBox, tr("&Remote"), 'r'); + addButton(&msgBox, Tr::tr("&Local"), 'l'); + addButton(&msgBox, Tr::tr("&Remote"), 'r'); break; case DeletedMerge: if (m_localState == CreatedState || m_remoteState == CreatedState) - addButton(&msgBox, tr("&Created"), 'c'); + addButton(&msgBox, Tr::tr("&Created"), 'c'); else - addButton(&msgBox, tr("&Modified"), 'm'); - addButton(&msgBox, tr("&Deleted"), 'd'); + addButton(&msgBox, Tr::tr("&Modified"), 'm'); + addButton(&msgBox, Tr::tr("&Deleted"), 'd'); break; default: break; @@ -182,15 +183,15 @@ void MergeTool::readData() data = data.mid(index + 1); } if (data.startsWith("Was the merge successful")) { - prompt(tr("Unchanged File"), tr("Was the merge successful?")); + prompt(Tr::tr("Unchanged File"), Tr::tr("Was the merge successful?")); } else if (data.startsWith("Continue merging")) { - prompt(tr("Continue Merging"), tr("Continue merging other unresolved paths?")); + prompt(Tr::tr("Continue Merging"), Tr::tr("Continue merging other unresolved paths?")); } else if (data.startsWith("Hit return")) { QMessageBox::warning( - Core::ICore::dialogParent(), tr("Merge Tool"), + Core::ICore::dialogParent(), Tr::tr("Merge Tool"), QString("

"); - m_stream = new QTextStream(message.toLocal8Bit(), QIODevice::ReadOnly | QIODevice::Text); - QString line; - while (!m_stream->atEnd() && !line.contains(QLatin1String("1) Loaded version"))) - line = m_stream->readLine(); - if (!readValues()) - return; - loadedLabel->setText(m_versionID); - loadedCreatedByLabel->setText(m_createdBy); - loadedCreatedOnLabel->setText(m_createdOn); - loadedText->insertPlainText(m_message + QLatin1Char(' ')); - - line = m_stream->readLine(); // 2) Version after update - if (!readValues()) - return; - updatedLabel->setText(m_versionID); - updatedCreatedByLabel->setText(m_createdBy); - updatedCreatedOnLabel->setText(m_createdOn); - updatedText->setPlainText(m_message); using namespace Utils::Layouting; @@ -91,6 +73,25 @@ VersionSelector::VersionSelector(const QString &fileName, const QString &message connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); + + m_stream = new QTextStream(message.toLocal8Bit(), QIODevice::ReadOnly | QIODevice::Text); + QString line; + while (!m_stream->atEnd() && !line.contains(QLatin1String("1) Loaded version"))) + line = m_stream->readLine(); + if (!readValues()) + return; + loadedLabel->setText(m_versionID); + loadedCreatedByLabel->setText(m_createdBy); + loadedCreatedOnLabel->setText(m_createdOn); + loadedText->insertPlainText(m_message + QLatin1Char(' ')); + + line = m_stream->readLine(); // 2) Version after update + if (!readValues()) + return; + updatedLabel->setText(m_versionID); + updatedCreatedByLabel->setText(m_createdBy); + updatedCreatedOnLabel->setText(m_createdOn); + updatedText->setPlainText(m_message); } VersionSelector::~VersionSelector() From eb590279203f9c18196f72445bedd6c716dc26c8 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 7 Oct 2022 13:25:53 +0200 Subject: [PATCH 087/104] ClangCodeModel: Save some disk space and unneeded allocations ... when writing out compile_commands.json files. Change-Id: I8b2298eee87609a90ebb4dbd58b38bd6f36c5a7b Reviewed-by: hjk --- src/plugins/clangcodemodel/clangutils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index 57698608494..9a37e805304 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -185,12 +185,12 @@ GenerateCompilationDbResult generateCompilationDB(QList p optionsBuilder.isClStyle()); if (compileCommandsFile.size() > 1) compileCommandsFile.write(","); - compileCommandsFile.write('\n' + QJsonDocument(json).toJson().trimmed()); + compileCommandsFile.write(QJsonDocument(json).toJson(QJsonDocument::Compact)); } } } - compileCommandsFile.write("\n]"); + compileCommandsFile.write("]"); compileCommandsFile.close(); return GenerateCompilationDbResult(compileCommandsFile.fileName(), QString()); } From cb5815c619466f690d130a8816dd84c605d3c4bc Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 7 Oct 2022 12:04:31 +0200 Subject: [PATCH 088/104] RemoteLinux: Use common FileUtils::iterateUnixDirector function This now uses 'find' when available. Change-Id: I5ebf05a808f69559c25cd33eb6d36ab931fb076f Reviewed-by: Christian Kandeler --- src/plugins/remotelinux/linuxdevice.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index ce97e2a5a73..95c9f4dbbb1 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -370,6 +370,7 @@ public: ShellThreadHandler *m_handler = nullptr; mutable QMutex m_shellMutex; QList m_terminals; + bool m_useFind = true; }; // SshProcessImpl @@ -1315,11 +1316,10 @@ void LinuxDevice::iterateDirectory(const FilePath &filePath, const FileFilter &filter) const { QTC_ASSERT(handlesFile(filePath), return); - // if we do not have find - use ls as fallback - const QByteArray output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}}) - .value_or(QByteArray()); - const QStringList entries = QString::fromUtf8(output).split('\n', Qt::SkipEmptyParts); - FileUtils::iterateLsOutput(filePath, entries, filter, callBack); + auto runInShell = [this](const CommandLine &cmd) { + return d->outputForRunInShell(cmd).value_or(QByteArray()); + }; + FileUtils::iterateUnixDirectory(filePath, filter, &d->m_useFind, runInShell, callBack); } std::optional LinuxDevice::fileContents(const FilePath &filePath, From 435c5848c5afded9d52985be5308f39d4d0650e0 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 7 Oct 2022 11:34:41 +0200 Subject: [PATCH 089/104] PE: Fix wording on summary page ..if there is only one file to create. Change-Id: I0bfc84a3fbac2debe7f3491d3b1ae8f4d48b2303 Reviewed-by: Eike Ziller --- src/plugins/projectexplorer/projectwizardpage.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index a5b81fb7bcd..8da18e1fdf4 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -528,15 +528,17 @@ IVersionControl *ProjectWizardPage::currentVersionControl() void ProjectWizardPage::setFiles(const FilePaths &files) { m_commonDirectory = FileUtils::commonPath(files); + const bool hasNoCommonDirectory = m_commonDirectory.isEmpty() || files.size() < 2; + QString fileMessage; { QTextStream str(&fileMessage); str << "" - << (m_commonDirectory.isEmpty() ? tr("Files to be added:") : tr("Files to be added in")) + << (hasNoCommonDirectory ? tr("Files to be added:") : tr("Files to be added in")) << "
";
 
         QStringList formattedFiles;
-        if (m_commonDirectory.isEmpty()) {
+        if (hasNoCommonDirectory) {
             formattedFiles = Utils::transform(files, &FilePath::toString);
         } else {
             str << m_commonDirectory.toUserOutput() << ":\n\n";

From fe63b5a897ad25405670ab45cbba1189b1a91018 Mon Sep 17 00:00:00 2001
From: Christian Stenger 
Date: Fri, 7 Oct 2022 11:36:56 +0200
Subject: [PATCH 090/104] Squish: Fix wizard file generator

Remove former dummy entry that is no more needed.
Handle the git integration correctly and provide a
.gitignore as other project wizards do.

Change-Id: I33372293990d3b5d7927acee01a2bb77e12e4b2e
Reviewed-by: David Schulz 
---
 src/plugins/squish/squishwizardpages.cpp | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/plugins/squish/squishwizardpages.cpp b/src/plugins/squish/squishwizardpages.cpp
index 8287482bf24..43559d1d7b5 100644
--- a/src/plugins/squish/squishwizardpages.cpp
+++ b/src/plugins/squish/squishwizardpages.cpp
@@ -9,6 +9,8 @@
 #include "squishtools.h"
 #include "squishtr.h"
 
+#include 
+
 #include 
 #include 
 
@@ -334,12 +336,23 @@ Core::GeneratedFiles SquishFileGenerator::fileList(Utils::MacroExpander *expande
     const QString toolkit = expander->expand(QString{"%{Toolkit}"});;
     const Utils::FilePath suiteConf = projectDir.pathAppended("suite.conf");
 
+    Core::GeneratedFiles result;
+    if (expander->expand(QString{"%{VersionControl}"}) == "G.Git") {
+        Core::GeneratedFile gitignore(projectDir.pathAppended(".gitignore"));
+        const Utils::FilePath orig = Core::ICore::resourcePath()
+                .pathAppended("templates/wizards/projects/git.ignore");
+
+        if (QTC_GUARD(orig.exists())) {
+            gitignore.setBinaryContents(orig.fileContents().value());
+            result.append(gitignore);
+        }
+    }
+
     Core::GeneratedFile file(suiteConf);
     file.setAttributes(Core::GeneratedFile::OpenEditorAttribute);
     file.setContents(generateSuiteConf(aut, lang, toolkit));
-    Core::GeneratedFile base(projectDir);
-    base.setAttributes(Core::GeneratedFile::CustomGeneratorAttribute);
-    return {base, file};
+    result.append(file);
+    return result;
 }
 
 bool SquishFileGenerator::writeFile(const ProjectExplorer::JsonWizard *,

From b1af1502a0ac836ca4ee55a0d678118fa9ecfd3b Mon Sep 17 00:00:00 2001
From: Leena Miettinen 
Date: Thu, 6 Oct 2022 17:17:15 +0200
Subject: [PATCH 091/104] Doc: Describe following symbol under cursor for QRC
 files

Task-number: QTCREATORBUG-27876
Change-Id: If4fa6235fe450617753e5f4a753ca491a92a0613
Reviewed-by: Christian Kandeler 
---
 doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc | 4 ++++
 doc/qtcreator/src/widgets/qtdesigner-overview.qdoc      | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc b/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc
index 72546bc48fe..e75de83bfd9 100644
--- a/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc
+++ b/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc
@@ -284,6 +284,10 @@
     supported for namespaces, classes, functions, variables, include statements,
     and macros.
 
+    When the cursor is on a string literal and the string is a QRC file path,
+    following the symbol opens the specified resource file for editing in the
+    \uicontrol {Resource Browser}.
+
     To switch between the definition and declaration of a function, place the
     cursor on either and press \key {Shift+F2} or right-click and select
     \uicontrol {Switch Between Function Declaration/Definition} or
diff --git a/doc/qtcreator/src/widgets/qtdesigner-overview.qdoc b/doc/qtcreator/src/widgets/qtdesigner-overview.qdoc
index 2c43e24fee7..4b48650b590 100644
--- a/doc/qtcreator/src/widgets/qtdesigner-overview.qdoc
+++ b/doc/qtcreator/src/widgets/qtdesigner-overview.qdoc
@@ -43,6 +43,10 @@
     is de-activated and the image resources are displayed in the \QD
     \uicontrol {Resource Browser}.
 
+    To open resource files from the code editor, select
+    \uicontrol {Follow Symbol Under Cursor} in the context menu
+    or press \key F2 when the cursor is over a string literal.
+
     \section1 Specifying Settings for Qt Designer
 
     You can drag and drop the views in \QD to new positions on the screen.

From e0d81084a999cd3ed546b012d841dc394b492f41 Mon Sep 17 00:00:00 2001
From: hjk 
Date: Fri, 7 Oct 2022 14:09:04 +0200
Subject: [PATCH 092/104] Utils: Fix find logic

We are more interested in the files than the error message.

Task-number: QTCREATORBUG-28242
Change-Id: Ifc5724764797d2488c7fa231ff5b1cf2292418ed
Reviewed-by: Christian Kandeler 
---
 src/libs/utils/fileutils.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp
index 8d3efae79de..2e147fa43de 100644
--- a/src/libs/utils/fileutils.cpp
+++ b/src/libs/utils/fileutils.cpp
@@ -639,7 +639,7 @@ static bool iterateWithFind(const FilePath &filePath,
 
     const QStringList entries = out.split("\n", Qt::SkipEmptyParts);
     for (const QString &entry : entries) {
-        if (entry.startsWith("find: ")) {
+        if (!entry.startsWith("find: ")) {
             const FilePath fp = FilePath::fromString(entry);
             if (!callBack(fp.onDevice(filePath)))
                 break;

From 90de29d530dfc2921d5179977b3393c11a3cc238 Mon Sep 17 00:00:00 2001
From: hjk 
Date: Fri, 7 Oct 2022 13:56:02 +0200
Subject: [PATCH 093/104] RemoteLinux: Re-enable categorized logging for shell
 access

Task-number: QTCREATORBUG-28242
Change-Id: Iea56465576ade76b92948766c94e458d45e81191
Reviewed-by: Christian Kandeler 
---
 src/plugins/remotelinux/linuxdevice.cpp | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp
index 95c9f4dbbb1..e137a420035 100644
--- a/src/plugins/remotelinux/linuxdevice.cpp
+++ b/src/plugins/remotelinux/linuxdevice.cpp
@@ -54,11 +54,8 @@ const QByteArray s_pidMarker = "__qtc";
 const char Delimiter0[] = "x--";
 const char Delimiter1[] = "---";
 
-//static Q_LOGGING_CATEGORY(linuxDeviceLog, "qtc.remotelinux.device", QtWarningMsg);
-//#define LOG(x) qCDebug(linuxDeviceLog) << x << '\n'
-//#define DEBUG(x) qDebug() << x;
-//#define DEBUG(x) LOG(x)
-#define DEBUG(x)
+static Q_LOGGING_CATEGORY(linuxDeviceLog, "qtc.remotelinux.device", QtWarningMsg);
+#define DEBUG(x) qCDebug(linuxDeviceLog) << x << '\n'
 
 class SshSharedConnection : public QObject
 {

From 8eb4d52342fe3a6ede1c1dce3174d95bfa0cea88 Mon Sep 17 00:00:00 2001
From: Marc Mutz 
Date: Fri, 7 Oct 2022 14:46:06 +0200
Subject: [PATCH 094/104] Port from qAsConst() to std::as_const()

We've been requiring C++17 since Qt 6.0, and our qAsConst use finally
starts to bother us (QTBUG-99313), so time to port away from it
now.

Since qAsConst has exactly the same semantics as std::as_const (down
to rvalue treatment, constexpr'ness and noexcept'ness), there's really
nothing more to it than a global search-and-replace.

Task-number: QTBUG-99313
Change-Id: I88edd91395849574436299b8badda21bb93bea39
Reviewed-by: hjk 
---
 .../instances/nodeinstanceclientproxy.cpp     |  2 +-
 .../qml2puppet/editor3d/generalhelper.cpp     | 16 ++--
 .../editor3d/selectionboxgeometry.cpp         |  8 +-
 .../qt5informationnodeinstanceserver.cpp      | 12 +--
 .../qt5previewnodeinstanceserver.cpp          |  2 +-
 src/app/main.cpp                              |  2 +-
 src/libs/3rdparty/cplusplus/Bind.cpp          |  2 +-
 .../dockareatitlebar.cpp                      |  2 +-
 .../dockcontainerwidget.cpp                   | 14 ++--
 .../advanceddockingsystem/dockmanager.cpp     | 16 ++--
 .../advanceddockingsystem/dockoverlay.cpp     |  2 +-
 src/libs/aggregation/aggregate.cpp            |  2 +-
 src/libs/aggregation/aggregate.h              |  4 +-
 .../AlreadyConsideredClassContainer.h         |  2 +-
 src/libs/cplusplus/CppDocument.cpp            |  8 +-
 src/libs/cplusplus/FindUsages.cpp             |  4 +-
 src/libs/cplusplus/LookupContext.cpp          |  4 +-
 src/libs/cplusplus/Macro.cpp                  |  2 +-
 src/libs/cplusplus/MatchingText.cpp           |  2 +-
 src/libs/extensionsystem/optionsparser.cpp    |  6 +-
 src/libs/extensionsystem/pluginmanager.cpp    | 20 ++---
 src/libs/extensionsystem/pluginspec.cpp       |  2 +-
 src/libs/extensionsystem/pluginview.cpp       |  2 +-
 .../diagram_controller/diagramcontroller.cpp  |  2 +-
 .../qmt/diagram_scene/diagramscenemodel.cpp   | 10 +--
 src/libs/qmljs/qmljsimportdependencies.cpp    |  2 +-
 src/libs/qmljs/qmljsinterpreter.cpp           |  2 +-
 src/libs/qmljs/qmljslink.cpp                  |  4 +-
 src/libs/qmljs/qmljsmodelmanagerinterface.cpp | 50 ++++++------
 src/libs/qmljs/qmljsplugindumper.cpp          |  2 +-
 src/libs/tracing/timelinetracemanager.cpp     |  6 +-
 src/libs/utils/aspects.cpp                    | 34 ++++-----
 src/libs/utils/codegeneration.cpp             |  2 +-
 src/libs/utils/fancylineedit.cpp              |  2 +-
 src/libs/utils/fancymainwindow.cpp            |  2 +-
 src/libs/utils/filesystemmodel.cpp            | 10 +--
 src/libs/utils/filesystemwatcher.cpp          |  6 +-
 src/libs/utils/futuresynchronizer.cpp         |  2 +-
 src/libs/utils/infobar.cpp                    |  8 +-
 src/libs/utils/json.cpp                       |  4 +-
 src/libs/utils/launchersocket.cpp             |  6 +-
 src/libs/utils/mapreduce.h                    |  4 +-
 src/libs/utils/mimetypes/mimedatabase.cpp     |  4 +-
 src/libs/utils/mimetypes/mimeprovider.cpp     | 20 ++---
 src/libs/utils/mimetypes/mimetype.cpp         |  2 +-
 src/libs/utils/mimetypes2/mimedatabase.cpp    |  2 +-
 src/libs/utils/mimetypes2/mimeprovider.cpp    |  8 +-
 src/libs/utils/mimetypes2/mimetype.cpp        |  4 +-
 src/libs/utils/minimizableinfobars.cpp        |  2 +-
 src/libs/utils/namevaluemodel.cpp             |  2 +-
 src/libs/utils/outputformatter.cpp            | 16 ++--
 src/libs/utils/portlist.cpp                   |  6 +-
 src/libs/utils/qtcprocess.cpp                 |  4 +-
 src/libs/utils/wizard.cpp                     |  2 +-
 src/plugins/android/androidavdmanager.cpp     |  4 +-
 src/plugins/android/androidconfigurations.cpp |  4 +-
 .../android/androidmanifesteditorwidget.cpp   |  2 +-
 .../androidpackageinstallationstep.cpp        |  2 +-
 src/plugins/android/androidrunnerworker.cpp   |  6 +-
 src/plugins/android/androidsdkmanager.cpp     |  6 +-
 src/plugins/android/androidsdkmodel.cpp       |  2 +-
 src/plugins/android/androidsdkpackage.cpp     |  2 +-
 src/plugins/android/avddialog.cpp             |  4 +-
 .../autotest/boost/boosttesttreeitem.cpp      |  2 +-
 src/plugins/autotest/catch/catchtreeitem.cpp  |  4 +-
 src/plugins/autotest/gtest/gtesttreeitem.cpp  |  6 +-
 .../autotest/projectsettingswidget.cpp        |  2 +-
 src/plugins/autotest/qtest/qttestparser.cpp   |  2 +-
 .../autotest/quick/quicktestparser.cpp        |  2 +-
 src/plugins/autotest/testcodeparser.cpp       |  6 +-
 src/plugins/autotest/testconfiguration.cpp    |  2 +-
 src/plugins/autotest/testframeworkmanager.cpp |  8 +-
 src/plugins/autotest/testresultmodel.cpp      |  2 +-
 src/plugins/autotest/testrunner.cpp           |  4 +-
 src/plugins/autotest/testtreemodel.cpp        |  2 +-
 .../autotoolsbuildsystem.cpp                  |  2 +-
 .../makefileparser.cpp                        |  2 +-
 .../baremetal/debugserverprovidermanager.cpp  |  6 +-
 .../debugserverproviderssettingspage.cpp      |  4 +-
 .../baremetal/debugservers/uvsc/uvproject.cpp |  4 +-
 .../debugservers/uvsc/uvtargetdevicemodel.cpp |  2 +-
 .../uvsc/uvtargetdeviceselection.cpp          |  4 +-
 .../debugservers/uvsc/uvtargetdrivermodel.cpp |  4 +-
 src/plugins/baremetal/iarewtoolchain.cpp      |  2 +-
 src/plugins/baremetal/keiltoolchain.cpp       |  2 +-
 src/plugins/baremetal/sdcctoolchain.cpp       |  2 +-
 src/plugins/bazaar/bazaarplugin.cpp           |  2 +-
 src/plugins/beautifier/abstractsettings.cpp   |  2 +-
 .../artisticstyle/artisticstylesettings.cpp   |  2 +-
 src/plugins/bineditor/bineditorwidget.cpp     |  4 +-
 src/plugins/clangcodemodel/clangdast.cpp      |  2 +-
 .../clangcodemodel/clangdcompletion.cpp       |  4 +-
 .../clangcodemodel/clangdfindreferences.cpp   |  2 +-
 .../clangcodemodel/clangdfollowsymbol.cpp     | 14 ++--
 .../clangcodemodel/clangdlocatorfilters.cpp   |  2 +-
 .../clangdsemantichighlighting.cpp            |  2 +-
 src/plugins/clangcodemodel/clangutils.cpp     |  2 +-
 .../clangcodemodel/test/clangdtests.cpp       |  4 +-
 src/plugins/clangtools/clangtool.cpp          | 12 +--
 .../clangtools/clangtoolruncontrol.cpp        |  2 +-
 .../clangtools/clangtoolsdiagnosticmodel.cpp  |  8 +-
 src/plugins/clangtools/clangtoolsplugin.cpp   |  2 +-
 .../clangtools/clangtoolsprojectsettings.cpp  |  2 +-
 src/plugins/clangtools/clangtoolsutils.cpp    |  2 +-
 .../clangtools/documentclangtoolrunner.cpp    |  6 +-
 .../clangtools/documentquickfixfactory.cpp    |  2 +-
 src/plugins/clangtools/filterdialog.cpp       |  2 +-
 .../clangtools/virtualfilesystemoverlay.cpp   |  4 +-
 src/plugins/clearcase/clearcaseplugin.cpp     |  2 +-
 .../cmakeprojectmanager/cmakebuildstep.cpp    |  2 +-
 .../cmakeprojectmanager/cmakebuildsystem.cpp  |  4 +-
 .../cmakekitinformation.cpp                   |  2 +-
 .../cmakeprojectimporter.cpp                  |  6 +-
 .../cmakeprojectmanager/cmakesettingspage.cpp |  4 +-
 .../cmakeprojectmanager/cmaketoolmanager.cpp  |  2 +-
 .../cmaketoolsettingsaccessor.cpp             |  4 +-
 .../configmodelitemdelegate.cpp               |  2 +-
 .../actionmanager/actioncontainer.cpp         |  8 +-
 .../actionmanager/actionmanager.cpp           |  2 +-
 .../coreplugin/actionmanager/commandsfile.cpp |  2 +-
 src/plugins/coreplugin/actionsfilter.cpp      |  6 +-
 src/plugins/coreplugin/basefilewizard.cpp     |  8 +-
 .../coreplugin/basefilewizardfactory.cpp      | 12 +--
 src/plugins/coreplugin/designmode.cpp         |  4 +-
 .../coreplugin/dialogs/codecselector.cpp      |  6 +-
 .../coreplugin/dialogs/externaltoolconfig.cpp |  2 +-
 .../coreplugin/dialogs/newdialogwidget.cpp    |  4 +-
 .../dialogs/readonlyfilesdialog.cpp           |  8 +-
 .../coreplugin/dialogs/saveitemsdialog.cpp    |  2 +-
 .../coreplugin/dialogs/settingsdialog.cpp     | 14 ++--
 .../coreplugin/dialogs/shortcutsettings.cpp   | 10 +--
 src/plugins/coreplugin/documentmanager.cpp    | 16 ++--
 .../editormanager/documentmodel.cpp           |  2 +-
 .../editormanager/editormanager.cpp           | 26 +++----
 src/plugins/coreplugin/fancytabwidget.cpp     |  4 +-
 src/plugins/coreplugin/find/findplugin.cpp    |  2 +-
 .../coreplugin/find/findtoolwindow.cpp        |  4 +-
 .../find/highlightscrollbarcontroller.cpp     |  2 +-
 .../coreplugin/find/searchresulttreemodel.cpp |  2 +-
 .../coreplugin/find/searchresultwindow.cpp    |  6 +-
 .../coreplugin/foldernavigationwidget.cpp     |  2 +-
 src/plugins/coreplugin/generalsettings.cpp    |  2 +-
 src/plugins/coreplugin/iwizardfactory.cpp     | 10 +--
 .../coreplugin/locator/commandlocator.cpp     |  2 +-
 .../coreplugin/locator/executefilter.cpp      |  2 +-
 src/plugins/coreplugin/locator/locator.cpp    |  4 +-
 .../coreplugin/locator/locator_test.cpp       |  2 +-
 .../locator/locatorfiltersfilter.cpp          |  2 +-
 .../locator/locatorsettingspage.cpp           |  6 +-
 src/plugins/coreplugin/loggingmanager.cpp     |  4 +-
 src/plugins/coreplugin/mainwindow.cpp         |  4 +-
 src/plugins/coreplugin/mimetypesettings.cpp   |  2 +-
 src/plugins/coreplugin/modemanager.cpp        |  4 +-
 .../coreplugin/navigationsubwidget.cpp        |  4 +-
 src/plugins/coreplugin/navigationwidget.cpp   |  8 +-
 src/plugins/coreplugin/outputpane.cpp         |  2 +-
 src/plugins/coreplugin/outputwindow.cpp       |  2 +-
 .../progressmanager/progressmanager.cpp       |  6 +-
 src/plugins/coreplugin/sidebar.cpp            | 14 ++--
 src/plugins/coreplugin/sidebarwidget.cpp      |  4 +-
 src/plugins/coreplugin/statusbarmanager.cpp   |  2 +-
 src/plugins/coreplugin/themechooser.cpp       |  2 +-
 src/plugins/coreplugin/vcsmanager.cpp         |  2 +-
 src/plugins/cpaster/cpasterplugin.cpp         |  2 +-
 src/plugins/cppcheck/cppchecktool.cpp         |  2 +-
 .../cppeditor/builtineditordocumentparser.cpp |  6 +-
 .../cppeditor/builtinindexingsupport.cpp      |  2 +-
 .../cppeditor/compileroptionsbuilder.cpp      |  6 +-
 src/plugins/cppeditor/cppchecksymbols.cpp     |  2 +-
 src/plugins/cppeditor/cppcodeformatter.cpp    |  2 +-
 .../cppeditor/cppcodemodelinspectordialog.cpp |  4 +-
 .../cppeditor/cppcodemodelinspectordumper.cpp |  6 +-
 .../cppeditor/cppcodemodelsettingspage.cpp    |  2 +-
 .../cppeditor/cppcodestylesettingspage.cpp    |  6 +-
 src/plugins/cppeditor/cppcompletion_test.cpp  |  2 +-
 src/plugins/cppeditor/cppcompletionassist.cpp | 14 ++--
 src/plugins/cppeditor/cppeditorplugin.cpp     |  4 +-
 .../cppeditor/cppinsertvirtualmethods.cpp     | 20 ++---
 src/plugins/cppeditor/cpplocatordata.cpp      |  2 +-
 src/plugins/cppeditor/cppmodelmanager.cpp     | 16 ++--
 .../cppeditor/cppmodelmanager_test.cpp        | 20 ++---
 src/plugins/cppeditor/cppprojectupdater.cpp   |  4 +-
 src/plugins/cppeditor/cppquickfix_test.cpp    | 18 ++---
 src/plugins/cppeditor/cppquickfixes.cpp       | 22 +++---
 .../cppeditor/cppquickfixsettingswidget.cpp   |  2 +-
 src/plugins/cppeditor/cpptoolstestcase.cpp    |  2 +-
 .../cppeditor/fileandtokenactions_test.cpp    |  6 +-
 src/plugins/cppeditor/includeutils.cpp        | 18 ++---
 src/plugins/cppeditor/indexitem.h             |  2 +-
 .../cppeditor/modelmanagertesthelper.cpp      |  2 +-
 src/plugins/cppeditor/projectinfo.cpp         |  4 +-
 src/plugins/cppeditor/projectpart.cpp         |  2 +-
 src/plugins/cppeditor/symbolfinder.cpp        |  2 +-
 .../cppeditor/typehierarchybuilder_test.cpp   |  2 +-
 src/plugins/ctfvisualizer/ctftracemanager.cpp |  6 +-
 src/plugins/debugger/breakhandler.cpp         |  2 +-
 src/plugins/debugger/cdb/cdbengine.cpp        |  4 +-
 src/plugins/debugger/cdb/cdboptionspage.cpp   |  4 +-
 src/plugins/debugger/debuggerengine.cpp       |  4 +-
 src/plugins/debugger/debuggeritemmanager.cpp  |  4 +-
 src/plugins/debugger/debuggermainwindow.cpp   |  4 +-
 src/plugins/debugger/debuggerplugin.cpp       |  4 +-
 src/plugins/debugger/debuggerruncontrol.cpp   |  2 +-
 .../debugger/debuggertooltipmanager.cpp       | 22 +++---
 src/plugins/debugger/disassembleragent.cpp    |  2 +-
 src/plugins/debugger/gdb/gdbengine.cpp        | 10 +--
 .../debugger/peripheralregisterhandler.cpp    |  2 +-
 src/plugins/debugger/qml/qmlengine.cpp        | 18 ++---
 .../debugger/qml/qmlinspectoragent.cpp        |  8 +-
 src/plugins/debugger/threadshandler.cpp       |  2 +-
 src/plugins/debugger/uvsc/uvscclient.cpp      |  2 +-
 src/plugins/debugger/uvsc/uvscengine.cpp      |  2 +-
 src/plugins/debugger/watchhandler.cpp         | 14 ++--
 src/plugins/designer/formeditorplugin.cpp     |  2 +-
 src/plugins/designer/formeditorstack.cpp      |  4 +-
 src/plugins/designer/gotoslot_test.cpp        |  2 +-
 src/plugins/designer/qtcreatorintegration.cpp |  4 +-
 src/plugins/designer/resourcehandler.cpp      |  2 +-
 src/plugins/designer/settingspage.cpp         |  2 +-
 src/plugins/diffeditor/diffutils.cpp          |  2 +-
 .../diffeditor/unifieddiffeditorwidget.cpp    |  2 +-
 src/plugins/docker/dockerdevice.cpp           |  4 +-
 src/plugins/fakevim/fakevimhandler.cpp        |  4 +-
 src/plugins/fakevim/fakevimplugin.cpp         |  4 +-
 .../genericprojectmanager/genericproject.cpp  |  6 +-
 src/plugins/git/branchmodel.cpp               |  4 +-
 src/plugins/git/branchview.cpp                |  4 +-
 src/plugins/git/gerrit/gerritmodel.cpp        |  2 +-
 .../git/gerrit/gerritremotechooser.cpp        |  2 +-
 src/plugins/git/gitclient.cpp                 |  6 +-
 src/plugins/git/gitgrep.cpp                   |  2 +-
 src/plugins/git/githighlighters.cpp           |  2 +-
 src/plugins/git/gitplugin.cpp                 |  6 +-
 src/plugins/gitlab/gitlabdialog.cpp           |  2 +-
 src/plugins/help/docsettingspage.cpp          |  2 +-
 src/plugins/help/helpindexfilter.cpp          |  2 +-
 src/plugins/help/helpwidget.cpp               |  2 +-
 src/plugins/ios/iosconfigurations.cpp         |  6 +-
 src/plugins/ios/iosdevice.cpp                 |  2 +-
 src/plugins/ios/iosprobe.cpp                  |  2 +-
 src/plugins/languageclient/client.cpp         |  4 +-
 .../languageclient/diagnosticmanager.cpp      |  2 +-
 .../languageclient/documentsymbolcache.cpp    |  2 +-
 .../languageclientcompletionassist.cpp        |  2 +-
 .../languageclientfunctionhint.cpp            |  2 +-
 .../languageclient/languageclientmanager.cpp  | 12 +--
 .../languageclientsymbolsupport.cpp           |  2 +-
 .../languageclient/languageclientutils.cpp    |  2 +-
 src/plugins/languageclient/locatorfilter.cpp  |  2 +-
 .../semantichighlightsupport.cpp              |  8 +-
 src/plugins/macros/macro.cpp                  |  2 +-
 src/plugins/macros/macromanager.cpp           |  6 +-
 src/plugins/macros/macrooptionswidget.cpp     |  2 +-
 src/plugins/marketplace/productlistmodel.cpp  |  6 +-
 src/plugins/mcusupport/mcukitmanager.cpp      | 12 +--
 src/plugins/mcusupport/mcusupportoptions.cpp  |  2 +-
 .../mcusupport/mcusupportoptionspage.cpp      |  4 +-
 src/plugins/mercurial/commiteditor.cpp        |  2 +-
 src/plugins/mercurial/mercurialplugin.cpp     |  2 +-
 src/plugins/modeleditor/modeleditor.cpp       |  4 +-
 src/plugins/modeleditor/modelsmanager.cpp     |  8 +-
 .../nim/project/nimcompilerbuildstep.cpp      |  2 +-
 src/plugins/perforce/perforcesubmiteditor.cpp |  2 +-
 src/plugins/perfprofiler/perfconfigwidget.cpp |  2 +-
 .../perfprofilerflamegraphmodel.cpp           |  2 +-
 src/plugins/perfprofiler/perfprofilertool.cpp |  2 +-
 .../perfprofiler/perftimelinemodelmanager.cpp |  4 +-
 src/plugins/projectexplorer/abi.cpp           |  2 +-
 src/plugins/projectexplorer/appoutputpane.cpp | 16 ++--
 .../projectexplorer/buildconfiguration.cpp    | 10 +--
 src/plugins/projectexplorer/buildmanager.cpp  |  2 +-
 src/plugins/projectexplorer/buildstep.cpp     |  4 +-
 src/plugins/projectexplorer/customparser.cpp  |  6 +-
 .../customparserssettingspage.cpp             |  2 +-
 .../customwizard/customwizard.cpp             |  2 +-
 .../customwizard/customwizardpage.cpp         | 10 +--
 .../customwizardscriptgenerator.cpp           |  2 +-
 .../projectexplorer/deployconfiguration.cpp   |  2 +-
 .../devicesupport/devicemanager.cpp           | 14 ++--
 .../projectexplorer/editorconfiguration.cpp   |  2 +-
 .../projectexplorer/environmentwidget.cpp     |  2 +-
 src/plugins/projectexplorer/extracompiler.cpp |  2 +-
 src/plugins/projectexplorer/gcctoolchain.cpp  |  8 +-
 src/plugins/projectexplorer/gnumakeparser.cpp |  6 +-
 src/plugins/projectexplorer/ioutputparser.cpp |  2 +-
 .../projectexplorer/journaldwatcher.cpp       |  2 +-
 .../jsonwizard/jsonfieldpage.cpp              |  8 +-
 .../projectexplorer/jsonwizard/jsonwizard.cpp |  2 +-
 .../jsonwizard/jsonwizardfactory.cpp          | 12 +--
 .../jsonwizard/jsonwizardfilegenerator.cpp    |  4 +-
 .../jsonwizard/jsonwizardgeneratorfactory.cpp |  6 +-
 .../jsonwizard/jsonwizardscannergenerator.cpp |  2 +-
 src/plugins/projectexplorer/kit.cpp           |  4 +-
 .../projectexplorer/kitinformation.cpp        |  2 +-
 .../kitmanagerconfigwidget.cpp                |  8 +-
 src/plugins/projectexplorer/kitmodel.cpp      |  2 +-
 .../miniprojecttargetselector.cpp             |  2 +-
 src/plugins/projectexplorer/msvctoolchain.cpp | 10 +--
 src/plugins/projectexplorer/project.cpp       |  6 +-
 .../projectexplorer/projectexplorer.cpp       |  8 +-
 .../projectexplorer/projectimporter.cpp       | 14 ++--
 src/plugins/projectexplorer/projectnodes.cpp  |  2 +-
 src/plugins/projectexplorer/projecttree.cpp   |  2 +-
 .../projectexplorer/projecttreewidget.cpp     |  2 +-
 .../projectexplorer/projectwizardpage.cpp     |  6 +-
 .../projectexplorer/runconfiguration.cpp      |  6 +-
 .../runconfigurationaspects.cpp               |  2 +-
 src/plugins/projectexplorer/runcontrol.cpp    | 22 +++---
 .../runsettingspropertiespage.cpp             |  2 +-
 .../projectexplorer/selectablefilesmodel.cpp  | 10 +--
 src/plugins/projectexplorer/session.cpp       |  8 +-
 src/plugins/projectexplorer/target.cpp        | 12 +--
 .../projectexplorer/targetsetuppage.cpp       | 12 +--
 .../projectexplorer/targetsetupwidget.cpp     |  2 +-
 src/plugins/projectexplorer/taskfile.cpp      |  2 +-
 src/plugins/projectexplorer/taskmodel.cpp     |  2 +-
 src/plugins/projectexplorer/taskwindow.cpp    |  6 +-
 src/plugins/projectexplorer/toolchain.cpp     |  4 +-
 .../projectexplorer/toolchainmanager.cpp      |  4 +-
 .../projectexplorer/toolchainoptionspage.cpp  | 14 ++--
 .../projectexplorer/userfileaccessor.cpp      |  4 +-
 .../projectexplorer/windebuginterface.cpp     |  2 +-
 src/plugins/python/pythonproject.cpp          |  4 +-
 src/plugins/python/pythonrunconfiguration.cpp |  2 +-
 src/plugins/python/pythonsettings.cpp         |  2 +-
 .../qbsprojectmanager/qbsbuildstep.cpp        |  4 +-
 .../qbsprojectmanager/qbsprofilemanager.cpp   |  2 +-
 .../qbsprofilessettingspage.cpp               |  2 +-
 src/plugins/qbsprojectmanager/qbsproject.cpp  |  8 +-
 .../qmakeprojectmanager/qmakemakestep.cpp     |  2 +-
 .../qmakenodetreebuilder.cpp                  |  2 +-
 .../qmakeprojectmanager/qmakeparsernodes.cpp  | 20 ++---
 .../qmakeprojectmanager/qmakeproject.cpp      |  2 +-
 src/plugins/qmakeprojectmanager/qmakestep.cpp |  6 +-
 .../assetexporterplugin/assetexporter.cpp     |  2 +-
 .../assetslibrary/assetslibrarywidget.cpp     |  4 +-
 .../bindingeditor/actioneditordialog.cpp      | 18 ++---
 .../bindingeditor/bindingeditordialog.cpp     |  2 +-
 .../componentcore/addsignalhandlerdialog.cpp  |  2 +-
 .../componentcore/changestyleaction.cpp       |  4 +-
 .../componentcore/designeractionmanager.cpp   | 12 +--
 .../componentcore/layoutingridlayout.cpp      | 14 ++--
 .../componentcore/modelnodecontextmenu.cpp    |  2 +-
 .../componentcore/modelnodeoperations.cpp     |  4 +-
 .../dynamicpropertiesmodel.cpp                |  2 +-
 .../components/curveeditor/animationcurve.cpp |  2 +-
 .../curveeditor/detail/curveitem.cpp          | 12 +--
 .../curveeditor/detail/graphicsscene.cpp      | 28 +++----
 .../contentnoteditableindicator.cpp           |  6 +-
 .../components/formeditor/dragtool.cpp        |  2 +-
 .../components/formeditor/formeditorview.cpp  |  2 +-
 .../components/formeditor/movemanipulator.cpp | 24 +++---
 .../formeditor/onedimensionalcluster.cpp      |  2 +-
 .../components/formeditor/resizeindicator.cpp |  4 +-
 .../formeditor/resizemanipulator.cpp          |  2 +-
 .../formeditor/rotationindicator.cpp          |  4 +-
 .../formeditor/rotationmanipulator.cpp        |  2 +-
 .../formeditor/selectionindicator.cpp         |  8 +-
 .../components/formeditor/snapper.cpp         |  2 +-
 .../components/integration/designdocument.cpp |  8 +-
 .../integration/designdocumentview.cpp        |  2 +-
 .../assetimportupdatetreemodel.cpp            |  4 +-
 .../itemlibraryassetimportdialog.cpp          | 12 +--
 .../itemlibrary/itemlibraryassetimporter.cpp  |  4 +-
 .../itemlibrarycategoriesmodel.cpp            |  2 +-
 .../itemlibrary/itemlibrarymodel.cpp          |  4 +-
 .../materialbrowser/bundleimporter.cpp        |  4 +-
 .../materialbrowser/materialbrowserview.cpp   |  2 +-
 .../choosefrompropertylistdialog.cpp          |  2 +-
 .../components/pathtool/pathitem.cpp          |  6 +-
 .../pathtool/pathselectionmanipulator.cpp     |  6 +-
 .../propertyeditor/aligndistribute.cpp        | 10 +--
 .../propertyeditorcontextobject.cpp           |  4 +-
 .../propertyeditor/qmlanchorbindingproxy.cpp  |  4 +-
 .../stateseditor/stateseditorview.cpp         |  2 +-
 .../stateseditornew/stateseditorview.cpp      |  2 +-
 .../timelineeditor/easingcurvedialog.cpp      |  2 +-
 .../timelineeditor/timelineactions.cpp        |  2 +-
 .../timelineeditor/timelinegraphicsscene.cpp  |  2 +-
 .../timelineeditor/timelineselectiontool.cpp  |  2 +-
 .../timelineeditor/timelinetoolbar.cpp        |  2 +-
 .../transitioneditortoolbar.cpp               |  2 +-
 .../transitioneditor/transitioneditorview.cpp |  2 +-
 .../designercore/include/forwardview.h        | 42 +++++-----
 .../instances/nodeinstanceview.cpp            |  8 +-
 .../designercore/metainfo/itemlibraryinfo.cpp |  2 +-
 .../designercore/metainfo/metainfo.cpp        |  2 +-
 .../designercore/metainfo/nodemetainfo.cpp    | 10 +--
 .../metainfo/subcomponentmanager.cpp          |  4 +-
 .../model/internalnodelistproperty.cpp        |  2 +-
 .../model/modelnodepositionrecalculator.cpp   |  4 +-
 .../designercore/model/modeltotextmerger.cpp  |  6 +-
 .../designercore/model/qmlobjectnode.cpp      |  4 +-
 .../designercore/model/qmltextgenerator.cpp   |  4 +-
 .../model/rewriteactioncompressor.cpp         | 20 ++---
 .../designercore/model/texttomodelmerger.cpp  |  4 +-
 src/plugins/qmldesigner/designmodewidget.cpp  |  4 +-
 .../qmlpreviewplugin/qmlpreviewactions.cpp    |  4 +-
 .../qmljseditor/qmljscompletionassist.cpp     |  4 +-
 .../qmljscomponentfromobjectdef.cpp           |  6 +-
 src/plugins/qmljseditor/qmljseditor.cpp       |  2 +-
 .../qmljseditor/qmljseditordocument.cpp       |  4 +-
 .../qmljseditor/qmljsfindreferences.cpp       |  4 +-
 src/plugins/qmljseditor/qmloutlinemodel.cpp   |  4 +-
 src/plugins/qmljseditor/qmltaskmanager.cpp    |  2 +-
 src/plugins/qmljstools/qmljsmodelmanager.cpp  |  2 +-
 src/plugins/qmljstools/qmljssemanticinfo.cpp  |  2 +-
 src/plugins/qmlprofiler/flamegraphmodel.cpp   |  2 +-
 src/plugins/qmlprofiler/pixmapcachemodel.cpp  |  2 +-
 .../qmlprofiler/qmlprofilermodelmanager.cpp   |  2 +-
 .../qmlprofiler/qmlprofilertextmark.cpp       |  4 +-
 .../fileformat/filefilteritems.cpp            |  8 +-
 .../qmlprojectmanager/qmlmainfileaspect.cpp   |  4 +-
 src/plugins/qnx/qnxconfiguration.cpp          |  2 +-
 src/plugins/qnx/qnxconfigurationmanager.cpp   |  4 +-
 src/plugins/qnx/qnxdeviceprocesslist.cpp      |  2 +-
 src/plugins/qnx/qnxqtversion.cpp              |  2 +-
 src/plugins/qnx/qnxsettingspage.cpp           |  4 +-
 src/plugins/qtsupport/baseqtversion.cpp       |  4 +-
 src/plugins/qtsupport/qtversionmanager.cpp    | 10 +--
 .../qtsupport/translationwizardpage.cpp       |  2 +-
 .../genericdirectuploadservice.cpp            |  4 +-
 src/plugins/remotelinux/linuxdevice.cpp       |  4 +-
 src/plugins/remotelinux/rsyncdeploystep.cpp   |  2 +-
 .../remotelinux/tarpackagecreationstep.cpp    |  4 +-
 .../resourceeditor/qrceditor/resourcefile.cpp |  2 +-
 .../resourceeditor/resourceeditorplugin.cpp   |  2 +-
 src/plugins/scxmleditor/common/structure.cpp  |  2 +-
 .../scxmleditor/outputpane/warningmodel.cpp   |  2 +-
 .../plugin_interface/connectableitem.cpp      | 18 ++---
 .../plugin_interface/graphicsscene.cpp        | 76 +++++++++----------
 .../plugin_interface/parallelitem.cpp         |  6 +-
 .../plugin_interface/sceneutils.cpp           |  2 +-
 .../scxmleditor/plugin_interface/sceneutils.h |  2 +-
 .../plugin_interface/scxmldocument.cpp        | 10 +--
 .../scxmleditor/plugin_interface/scxmltag.cpp | 10 +--
 .../plugin_interface/scxmltagutils.cpp        |  2 +-
 src/plugins/scxmleditor/scxmleditorstack.cpp  |  2 +-
 .../serialterminal/serialterminalsettings.cpp |  2 +-
 .../findinfilessilversearcher.cpp             |  4 +-
 src/plugins/squish/objectsmapdocument.cpp     |  2 +-
 src/plugins/squish/objectsmaptreeitem.cpp     |  2 +-
 src/plugins/squish/squishsettings.cpp         |  6 +-
 src/plugins/squish/squishtools.cpp            |  2 +-
 src/plugins/squish/squishxmloutputhandler.cpp |  2 +-
 src/plugins/subversion/subversionplugin.cpp   |  2 +-
 src/plugins/texteditor/basefilefind.cpp       |  4 +-
 .../codeassist/genericproposalmodel.cpp       |  2 +-
 src/plugins/texteditor/codecchooser.cpp       |  2 +-
 src/plugins/texteditor/fontsettingspage.cpp   |  2 +-
 src/plugins/texteditor/formattexteditor.cpp   |  2 +-
 src/plugins/texteditor/outlinefactory.cpp     |  2 +-
 src/plugins/texteditor/refactoroverlay.cpp    |  2 +-
 .../texteditor/snippets/snippetprovider.cpp   |  2 +-
 .../snippets/snippetscollection.cpp           |  4 +-
 src/plugins/texteditor/syntaxhighlighter.cpp  |  2 +-
 src/plugins/texteditor/tabsettings.cpp        |  2 +-
 src/plugins/texteditor/textdocument.cpp       |  2 +-
 src/plugins/texteditor/textdocumentlayout.cpp |  4 +-
 src/plugins/texteditor/texteditor.cpp         | 16 ++--
 .../texteditor/texteditoractionhandler.cpp    |  2 +-
 src/plugins/texteditor/textmark.cpp           |  4 +-
 src/plugins/todo/optionsdialog.cpp            |  2 +-
 src/plugins/todo/todooutputpane.cpp           |  4 +-
 .../callgrind/callgrindcycledetection.cpp     |  2 +-
 .../valgrind/callgrind/callgrindfunction.cpp  |  8 +-
 .../valgrind/callgrind/callgrindparsedata.cpp |  2 +-
 .../valgrind/callgrind/callgrindparser.cpp    |  4 +-
 src/plugins/valgrind/callgrindtool.cpp        |  2 +-
 .../valgrind/callgrindvisualisation.cpp       |  2 +-
 src/plugins/valgrind/memchecktool.cpp         | 10 +--
 src/plugins/valgrind/suppressiondialog.cpp    |  8 +-
 src/plugins/valgrind/valgrindsettings.cpp     |  2 +-
 src/plugins/valgrind/xmlprotocol/error.cpp    |  2 +-
 .../valgrind/xmlprotocol/modelhelpers.cpp     |  2 +-
 .../valgrind/xmlprotocol/suppression.cpp      |  2 +-
 src/plugins/vcsbase/submiteditorwidget.cpp    |  4 +-
 src/plugins/vcsbase/submitfieldwidget.cpp     |  6 +-
 src/plugins/vcsbase/vcsbaseclient.cpp         |  2 +-
 src/plugins/vcsbase/vcsbaseeditor.cpp         |  2 +-
 src/plugins/vcsbase/wizard/vcscommandpage.cpp |  4 +-
 src/plugins/welcome/welcomeplugin.cpp         |  2 +-
 src/shared/proparser/prowriter.cpp            |  2 +-
 .../cplusplus-ast2png/cplusplus-ast2png.cpp   |  6 +-
 .../cplusplus-mkvisitor.cpp                   | 14 ++--
 .../cplusplus-update-frontend.cpp             | 12 +--
 src/tools/iostool/iosdevicemanager.cpp        |  4 +-
 .../qtcreatorcrashhandler/crashhandler.cpp    |  4 +-
 src/tools/qtpromaker/main.cpp                 |  6 +-
 src/tools/sdktool/addcmakeoperation.cpp       |  4 +-
 src/tools/sdktool/adddebuggeroperation.cpp    |  2 +-
 src/tools/sdktool/addkitoperation.cpp         |  2 +-
 src/tools/sdktool/addqtoperation.cpp          |  2 +-
 src/tools/sdktool/addtoolchainoperation.cpp   |  4 +-
 src/tools/sdktool/findvalueoperation.cpp      |  2 +-
 src/tools/sdktool/getoperation.cpp            |  2 +-
 tests/auto/debugger/tst_dumpers.cpp           |  6 +-
 .../utils/deviceshell/tst_deviceshell.cpp     |  6 +-
 498 files changed, 1270 insertions(+), 1270 deletions(-)

diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp
index b673da14417..0e349f7b86e 100644
--- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp
+++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp
@@ -413,7 +413,7 @@ void NodeInstanceClientProxy::readDataStream()
             break;
     }
 
-    for (const QVariant &command : qAsConst(commandList))
+    for (const QVariant &command : std::as_const(commandList))
         dispatchCommand(command);
 }
 
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
index e805255520d..7109bddae0f 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
@@ -206,7 +206,7 @@ QVector4D GeneralHelper::focusNodesToCamera(QQuick3DCamera *camera, float defaul
         totalMinBound = {-halfExtent, -halfExtent, -halfExtent};
         totalMaxBound = {halfExtent, halfExtent, halfExtent};
     }
-    for (const auto node : qAsConst(nodeList)) {
+    for (const auto node : std::as_const(nodeList)) {
         auto model = qobject_cast(node);
         qreal maxExtent = defaultExtent;
         QVector3D center = node->scenePosition();
@@ -345,7 +345,7 @@ void GeneralHelper::alignCameras(QQuick3DCamera *camera, const QVariant &nodes)
             nodeList.append(cameraNode);
     }
 
-    for (QQuick3DCamera *node : qAsConst(nodeList)) {
+    for (QQuick3DCamera *node : std::as_const(nodeList)) {
         node->setPosition(camera->position());
         node->setRotation(camera->rotation());
     }
@@ -587,7 +587,7 @@ void GeneralHelper::setMultiSelectionTargets(QQuick3DNode *multiSelectRootNode,
     // Filter selection to contain only topmost parent nodes in the selection
     m_multiSelDataMap.clear();
     m_multiSelNodes.clear();
-    for (auto &connection : qAsConst(m_multiSelectConnections))
+    for (auto &connection : std::as_const(m_multiSelectConnections))
         disconnect(connection);
     m_multiSelectConnections.clear();
     m_multiSelectRootNode = multiSelectRootNode;
@@ -599,7 +599,7 @@ void GeneralHelper::setMultiSelectionTargets(QQuick3DNode *multiSelectRootNode,
         if (node)
             selNodes.insert(node);
     }
-    for (const auto selNode : qAsConst(selNodes)) {
+    for (const auto selNode : std::as_const(selNodes)) {
         bool found = false;
         QQuick3DNode *parent = selNode->parentNode();
         while (parent) {
@@ -617,7 +617,7 @@ void GeneralHelper::setMultiSelectionTargets(QQuick3DNode *multiSelectRootNode,
                 // The new selection should be notified by creator immediately after anyway.
                 m_multiSelDataMap.clear();
                 m_multiSelNodes.clear();
-                for (auto &connection : qAsConst(m_multiSelectConnections))
+                for (auto &connection : std::as_const(m_multiSelectConnections))
                     disconnect(connection);
                 m_multiSelectConnections.clear();
             }));
@@ -643,7 +643,7 @@ void GeneralHelper::resetMultiSelectionNode()
 
     m_multiSelNodeData = {};
     if (!m_multiSelDataMap.isEmpty()) {
-        for (const auto &data : qAsConst(m_multiSelDataMap))
+        for (const auto &data : std::as_const(m_multiSelDataMap))
             m_multiSelNodeData.startScenePos += data.startScenePos;
         m_multiSelNodeData.startScenePos /= m_multiSelDataMap.size();
     }
@@ -880,9 +880,9 @@ bool GeneralHelper::getBounds(QQuick3DViewport *view3D, QQuick3DNode *node, QVec
     };
 
     // Combine all child bounds
-    for (const auto &newBounds : qAsConst(minBoundsVec))
+    for (const auto &newBounds : std::as_const(minBoundsVec))
         combineMinBounds(localMinBounds, newBounds);
-    for (const auto &newBounds : qAsConst(maxBoundsVec))
+    for (const auto &newBounds : std::as_const(maxBoundsVec))
         combineMaxBounds(localMaxBounds, newBounds);
 
     if (qobject_cast(node)) {
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp
index 6df12f5563b..11980478484 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp
@@ -31,7 +31,7 @@ SelectionBoxGeometry::SelectionBoxGeometry()
 
 SelectionBoxGeometry::~SelectionBoxGeometry()
 {
-    for (auto &connection : qAsConst(m_connections))
+    for (auto &connection : std::as_const(m_connections))
         QObject::disconnect(connection);
     m_connections.clear();
 }
@@ -145,7 +145,7 @@ void SelectionBoxGeometry::doUpdateGeometry()
 
     GeometryBase::doUpdateGeometry();
 
-    for (auto &connection : qAsConst(m_connections))
+    for (auto &connection : std::as_const(m_connections))
         QObject::disconnect(connection);
     m_connections.clear();
 
@@ -278,9 +278,9 @@ void SelectionBoxGeometry::getBounds(
     };
 
     // Combine all child bounds
-    for (const auto &newBounds : qAsConst(minBoundsVec))
+    for (const auto &newBounds : std::as_const(minBoundsVec))
         combineMinBounds(localMinBounds, newBounds);
-    for (const auto &newBounds : qAsConst(maxBoundsVec))
+    for (const auto &newBounds : std::as_const(maxBoundsVec))
         combineMaxBounds(localMaxBounds, newBounds);
 
     if (qobject_cast(node)) {
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
index 608354aa4a6..1021a56823f 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp
@@ -1424,9 +1424,9 @@ Qt5InformationNodeInstanceServer::~Qt5InformationNodeInstanceServer()
     if (m_editView3DData.rootItem)
         m_editView3DData.rootItem->disconnect(this);
 
-    for (auto view : qAsConst(m_view3Ds))
+    for (auto view : std::as_const(m_view3Ds))
         view->disconnect();
-    for (auto node : qAsConst(m_3DSceneMap))
+    for (auto node : std::as_const(m_3DSceneMap))
         node->disconnect();
 
     if (m_editView3DData.rootItem)
@@ -1720,7 +1720,7 @@ QObject *Qt5InformationNodeInstanceServer::findView3DForInstance(
     // If no ancestor View3D was found, check if the scene root is specified as importScene in
     // some View3D.
     QObject *sceneRoot = find3DSceneRoot(instance);
-    for (const auto &view3D : qAsConst(m_view3Ds)) {
+    for (const auto &view3D : std::as_const(m_view3Ds)) {
         auto view = qobject_cast(view3D);
         if (view && sceneRoot == view->importScene())
             return view3D;
@@ -1740,7 +1740,7 @@ QObject *Qt5InformationNodeInstanceServer::findView3DForSceneRoot(
         return findView3DForInstance(instanceForObject(sceneRoot));
     } else {
         // No instance, so the scene root must be scene property of one of the views
-        for (const auto &view3D : qAsConst(m_view3Ds)) {
+        for (const auto &view3D : std::as_const(m_view3Ds)) {
             auto view = qobject_cast(view3D);
             if (view && sceneRoot == view->scene())
                 return view3D;
@@ -1825,7 +1825,7 @@ QObject *Qt5InformationNodeInstanceServer::find3DSceneRoot([[maybe_unused]] QObj
         return find3DSceneRoot(instanceForObject(obj));
 
     // If there is no instance, obj could be a scene in a View3D
-    for (const auto &viewObj : qAsConst(m_view3Ds)) {
+    for (const auto &viewObj : std::as_const(m_view3Ds)) {
         const auto view = qobject_cast(viewObj);
         if (view && view->scene() == obj)
             return obj;
@@ -2684,7 +2684,7 @@ void Qt5InformationNodeInstanceServer::handlePickTarget(
         return;
     }
 
-    for (auto childItem : qAsConst(childItems)) {
+    for (auto childItem : std::as_const(childItems)) {
         if (!hasInstanceForObject(childItem)) {
             // Children of components do not have instances, but will still need to be pickable
             // and redirect their pick to the component
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp
index df6c7b27f5b..6f3fced1b78 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5previewnodeinstanceserver.cpp
@@ -63,7 +63,7 @@ void Qt5PreviewNodeInstanceServer::collectItemChangesAndSendChangeCommands()
               stateInstances.append(instance.stateInstances());
           }
 
-          for (ServerNodeInstance instance : qAsConst(stateInstances)) {
+          for (ServerNodeInstance instance : std::as_const(stateInstances)) {
               instance.activateState();
               QImage previewImage = renderPreviewImage();
               if (!previewImage.isNull())
diff --git a/src/app/main.cpp b/src/app/main.cpp
index 35e3ccb7629..db8ce6bde89 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -584,7 +584,7 @@ int main(int argc, char **argv)
     if (!overrideLanguage.isEmpty())
         uiLanguages.prepend(overrideLanguage);
     const QString &creatorTrPath = resourcePath() + "/translations";
-    for (QString locale : qAsConst(uiLanguages)) {
+    for (QString locale : std::as_const(uiLanguages)) {
         locale = QLocale(locale).name();
         if (translator.load("qtcreator_" + locale, creatorTrPath)) {
             const QString &qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp
index e7d5bf78bad..4ad562eb0c6 100644
--- a/src/libs/3rdparty/cplusplus/Bind.cpp
+++ b/src/libs/3rdparty/cplusplus/Bind.cpp
@@ -2019,7 +2019,7 @@ bool Bind::visit(SimpleDeclarationAST *ast)
             }
         }
 
-        for (const auto &nameAndLoc : qAsConst(namesAndLocations)) {
+        for (const auto &nameAndLoc : std::as_const(namesAndLocations)) {
             const int sourceLocation = nameAndLoc.second;
             Declaration *decl = control()->newDeclaration(sourceLocation, nameAndLoc.first);
             if (const Type * const t = declTy.type(); t && declTy.isTypedef() && t->asClassType()
diff --git a/src/libs/advanceddockingsystem/dockareatitlebar.cpp b/src/libs/advanceddockingsystem/dockareatitlebar.cpp
index acc79de1422..039b33eaaf4 100644
--- a/src/libs/advanceddockingsystem/dockareatitlebar.cpp
+++ b/src/libs/advanceddockingsystem/dockareatitlebar.cpp
@@ -381,7 +381,7 @@ namespace ADS
     {
         DockWidget* dockWidget = d->m_tabBar->currentTab()->dockWidget();
         if (!d->m_dockWidgetActionsButtons.isEmpty()) {
-            for (auto button : qAsConst(d->m_dockWidgetActionsButtons)) {
+            for (auto button : std::as_const(d->m_dockWidgetActionsButtons)) {
                 d->m_layout->removeWidget(button);
                 delete button;
             }
diff --git a/src/libs/advanceddockingsystem/dockcontainerwidget.cpp b/src/libs/advanceddockingsystem/dockcontainerwidget.cpp
index f0c6211a65d..eff53f33186 100644
--- a/src/libs/advanceddockingsystem/dockcontainerwidget.cpp
+++ b/src/libs/advanceddockingsystem/dockcontainerwidget.cpp
@@ -204,7 +204,7 @@ namespace ADS
                 return;
 
             m_visibleDockAreaCount = 0;
-            for (auto dockArea : qAsConst(m_dockAreas))
+            for (auto dockArea : std::as_const(m_dockAreas))
                 m_visibleDockAreaCount += dockArea->isHidden() ? 0 : 1;
         }
 
@@ -1110,7 +1110,7 @@ namespace ADS
 
     DockAreaWidget *DockContainerWidget::dockAreaAt(const QPoint &globalPosition) const
     {
-        for (auto dockArea : qAsConst(d->m_dockAreas)) {
+        for (auto dockArea : std::as_const(d->m_dockAreas)) {
             if (dockArea->isVisible()
                 && dockArea->rect().contains(dockArea->mapFromGlobal(globalPosition)))
                 return dockArea;
@@ -1131,7 +1131,7 @@ namespace ADS
     int DockContainerWidget::visibleDockAreaCount() const
     {
         int result = 0;
-        for (auto dockArea : qAsConst(d->m_dockAreas))
+        for (auto dockArea : std::as_const(d->m_dockAreas))
             result += dockArea->isHidden() ? 0 : 1;
 
         return result;
@@ -1221,7 +1221,7 @@ namespace ADS
     QList DockContainerWidget::openedDockAreas() const
     {
         QList result;
-        for (auto dockArea : qAsConst(d->m_dockAreas)) {
+        for (auto dockArea : std::as_const(d->m_dockAreas)) {
             if (!dockArea->isHidden())
                 result.append(dockArea);
         }
@@ -1361,7 +1361,7 @@ namespace ADS
     QList DockContainerWidget::dockWidgets() const
     {
         QList result;
-        for (const auto dockArea : qAsConst(d->m_dockAreas))
+        for (const auto dockArea : std::as_const(d->m_dockAreas))
             result.append(dockArea->dockWidgets());
 
         return result;
@@ -1370,7 +1370,7 @@ namespace ADS
     DockWidget::DockWidgetFeatures DockContainerWidget::features() const
     {
         DockWidget::DockWidgetFeatures features(DockWidget::AllDockWidgetFeatures);
-        for (const auto dockArea : qAsConst(d->m_dockAreas))
+        for (const auto dockArea : std::as_const(d->m_dockAreas))
             features &= dockArea->features();
 
         return features;
@@ -1383,7 +1383,7 @@ namespace ADS
 
     void DockContainerWidget::closeOtherAreas(DockAreaWidget *keepOpenArea)
     {
-        for (const auto dockArea : qAsConst(d->m_dockAreas)) {
+        for (const auto dockArea : std::as_const(d->m_dockAreas)) {
             if (dockArea == keepOpenArea)
                 continue;
 
diff --git a/src/libs/advanceddockingsystem/dockmanager.cpp b/src/libs/advanceddockingsystem/dockmanager.cpp
index edd4b7d9bdb..5771241dc33 100644
--- a/src/libs/advanceddockingsystem/dockmanager.cpp
+++ b/src/libs/advanceddockingsystem/dockmanager.cpp
@@ -106,13 +106,13 @@ namespace ADS
         void hideFloatingWidgets()
         {
             // Hide updates of floating widgets from user
-            for (auto floatingWidget : qAsConst(m_floatingWidgets))
+            for (auto floatingWidget : std::as_const(m_floatingWidgets))
                 floatingWidget->hide();
         }
 
         void markDockWidgetsDirty()
         {
-            for (auto dockWidget : qAsConst(m_dockWidgetsMap))
+            for (auto dockWidget : std::as_const(m_dockWidgetsMap))
                 dockWidget->setProperty("dirty", true);
         }
 
@@ -216,7 +216,7 @@ namespace ADS
         // function are invisible to the user now and have no assigned dock area
         // They do not belong to any dock container, until the user toggles the
         // toggle view action the next time
-        for (auto dockWidget : qAsConst(m_dockWidgetsMap)) {
+        for (auto dockWidget : std::as_const(m_dockWidgetsMap)) {
             if (dockWidget->property(internal::dirtyProperty).toBool()) {
                 dockWidget->flagAsUnassigned();
                 emit dockWidget->viewToggled(false);
@@ -233,7 +233,7 @@ namespace ADS
         // The dock areas because the previous toggleView() action has changed
         // the dock area index
         int count = 0;
-        for (auto dockContainer : qAsConst(m_containers)) {
+        for (auto dockContainer : std::as_const(m_containers)) {
             count++;
             for (int i = 0; i < dockContainer->dockAreaCount(); ++i) {
                 DockAreaWidget *dockArea = dockContainer->dockArea(i);
@@ -259,7 +259,7 @@ namespace ADS
     {
         // Finally we need to send the topLevelChanged() signals for all dock
         // widgets if top level changed
-        for (auto dockContainer : qAsConst(m_containers)) {
+        for (auto dockContainer : std::as_const(m_containers)) {
             DockWidget *topLevelDockWidget = dockContainer->topLevelDockWidget();
             if (topLevelDockWidget) {
                 topLevelDockWidget->emitTopLevelChanged(true);
@@ -329,7 +329,7 @@ namespace ADS
         // Using a temporal vector since the destructor of
         // FloatingDockWidgetContainer alters d->m_floatingWidgets.
         std::vector aboutToDeletes;
-        for (auto floatingWidget : qAsConst(d->m_floatingWidgets)) {
+        for (auto floatingWidget : std::as_const(d->m_floatingWidgets)) {
             if (floatingWidget)
                 aboutToDeletes.push_back(floatingWidget);
         }
@@ -483,7 +483,7 @@ namespace ADS
         stream.writeAttribute("version", QString::number(CurrentVersion));
         stream.writeAttribute("userVersion", QString::number(version));
         stream.writeAttribute("containers", QString::number(d->m_containers.count()));
-        for (auto container : qAsConst(d->m_containers))
+        for (auto container : std::as_const(d->m_containers))
             container->saveState(stream);
 
         stream.writeEndElement();
@@ -527,7 +527,7 @@ namespace ADS
         if (d->m_uninitializedFloatingWidgets.empty())
             return;
 
-        for (auto floatingWidget : qAsConst(d->m_uninitializedFloatingWidgets))
+        for (auto floatingWidget : std::as_const(d->m_uninitializedFloatingWidgets))
             floatingWidget->show();
 
         d->m_uninitializedFloatingWidgets.clear();
diff --git a/src/libs/advanceddockingsystem/dockoverlay.cpp b/src/libs/advanceddockingsystem/dockoverlay.cpp
index 012a5e80e3a..7b680abea90 100644
--- a/src/libs/advanceddockingsystem/dockoverlay.cpp
+++ b/src/libs/advanceddockingsystem/dockoverlay.cpp
@@ -592,7 +592,7 @@ namespace ADS {
         if (windowHandle()->devicePixelRatio() == d->m_lastDevicePixelRatio) // TODO
             return;
 
-        for (auto widget : qAsConst(d->m_dropIndicatorWidgets))
+        for (auto widget : std::as_const(d->m_dropIndicatorWidgets))
             d->updateDropIndicatorIcon(widget);
 
         d->m_lastDevicePixelRatio = devicePixelRatioF();
diff --git a/src/libs/aggregation/aggregate.cpp b/src/libs/aggregation/aggregate.cpp
index 0da4ebd8b7f..26924d50926 100644
--- a/src/libs/aggregation/aggregate.cpp
+++ b/src/libs/aggregation/aggregate.cpp
@@ -176,7 +176,7 @@ Aggregate::~Aggregate()
     QList components;
     {
         QWriteLocker locker(&lock());
-        for (QObject *component : qAsConst(m_components)) {
+        for (QObject *component : std::as_const(m_components)) {
             disconnect(component, &QObject::destroyed, this, &Aggregate::deleteSelf);
             aggregateMap().remove(component);
         }
diff --git a/src/libs/aggregation/aggregate.h b/src/libs/aggregation/aggregate.h
index ef7b4e69ba1..a640822d46f 100644
--- a/src/libs/aggregation/aggregate.h
+++ b/src/libs/aggregation/aggregate.h
@@ -26,7 +26,7 @@ public:
 
     template  T *component() {
         QReadLocker locker(&lock());
-        for (QObject *component : qAsConst(m_components)) {
+        for (QObject *component : std::as_const(m_components)) {
             if (T *result = qobject_cast(component))
                 return result;
         }
@@ -36,7 +36,7 @@ public:
     template  QList components() {
         QReadLocker locker(&lock());
         QList results;
-        for (QObject *component : qAsConst(m_components)) {
+        for (QObject *component : std::as_const(m_components)) {
             if (T *result = qobject_cast(component)) {
                 results << result;
             }
diff --git a/src/libs/cplusplus/AlreadyConsideredClassContainer.h b/src/libs/cplusplus/AlreadyConsideredClassContainer.h
index f7a0cd84298..a4571dd720e 100644
--- a/src/libs/cplusplus/AlreadyConsideredClassContainer.h
+++ b/src/libs/cplusplus/AlreadyConsideredClassContainer.h
@@ -26,7 +26,7 @@ public:
             return true;
 
         SafeMatcher matcher;
-        for (const T *existingItem : qAsConst(_container)) {
+        for (const T *existingItem : std::as_const(_container)) {
             if (Matcher::match(existingItem, item, &matcher))
                 return true;
         }
diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 6cc7c49da5e..a121594c8e1 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -299,7 +299,7 @@ void Document::setLastModified(const QDateTime &lastModified)
 QStringList Document::includedFiles() const
 {
     QStringList files;
-    for (const Include &i : qAsConst(_resolvedIncludes))
+    for (const Include &i : std::as_const(_resolvedIncludes))
         files.append(i.resolvedFileName());
     files.removeDuplicates();
     return files;
@@ -488,7 +488,7 @@ Symbol *Document::lastVisibleSymbolAt(int line, int column) const
 
 const Macro *Document::findMacroDefinitionAt(int line) const
 {
-    for (const Macro ¯o : qAsConst(_definedMacros)) {
+    for (const Macro ¯o : std::as_const(_definedMacros)) {
         if (macro.line() == line)
             return ¯o;
     }
@@ -497,7 +497,7 @@ const Macro *Document::findMacroDefinitionAt(int line) const
 
 const Document::MacroUse *Document::findMacroUseAt(int utf16charsOffset) const
 {
-    for (const Document::MacroUse &use : qAsConst(_macroUses)) {
+    for (const Document::MacroUse &use : std::as_const(_macroUses)) {
         if (use.containsUtf16charOffset(utf16charsOffset)
                 && (utf16charsOffset < use.utf16charsBegin() + use.macro().nameToQString().size())) {
             return &use;
@@ -508,7 +508,7 @@ const Document::MacroUse *Document::findMacroUseAt(int utf16charsOffset) const
 
 const Document::UndefinedMacroUse *Document::findUndefinedMacroUseAt(int utf16charsOffset) const
 {
-    for (const Document::UndefinedMacroUse &use : qAsConst(_undefinedMacroUses)) {
+    for (const Document::UndefinedMacroUse &use : std::as_const(_undefinedMacroUses)) {
         if (use.containsUtf16charOffset(utf16charsOffset)
                 && (utf16charsOffset < use.utf16charsBegin()
                     + QString::fromUtf8(use.name(), use.name().size()).length()))
diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp
index 2f52079bdc6..8141cda12d8 100644
--- a/src/libs/cplusplus/FindUsages.cpp
+++ b/src/libs/cplusplus/FindUsages.cpp
@@ -399,7 +399,7 @@ private:
                 if (!klass) {
                     if (const auto namedType = baseExprType->asNamedType()) {
                         items = context.lookup(namedType->name(), item->scope());
-                        for (const LookupItem &item : qAsConst(items)) {
+                        for (const LookupItem &item : std::as_const(items)) {
                             if ((klass = item.type()->asClassType()))
                                 break;
                         }
@@ -410,7 +410,7 @@ private:
                 items = context.lookup(memberAccess->member_name->name, klass);
                 if (items.isEmpty())
                     return Usage::Type::Other;
-                for (const LookupItem &item : qAsConst(items)) {
+                for (const LookupItem &item : std::as_const(items)) {
                     if (item.type()->asFunctionType()) {
                         if (item.type().isConst())
                             return Usage::Type::Read;
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 3c12070e913..dee9e65d21a 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -1357,7 +1357,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name,
             for (int i = 0; i < argumentCountOfSpecialization; ++i)
                 templParams.insert(templateSpecialization->templateParameterAt(i)->name(), i);
 
-            for (const Name *baseName : qAsConst(allBases)) {
+            for (const Name *baseName : std::as_const(allBases)) {
                 ClassOrNamespace *baseBinding = nullptr;
 
                 if (const Identifier *nameId = baseName->asNameId()) {
@@ -1435,7 +1435,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name,
 
     // Find the missing bases for regular (non-template) types.
     // Ex.: class A : public B::Type {};
-    for (const Name *baseName : qAsConst(allBases)) {
+    for (const Name *baseName : std::as_const(allBases)) {
         ClassOrNamespace *binding = this;
         if (const QualifiedNameId *qBaseName = baseName->asQualifiedNameId()) {
             if (const Name *qualification = qBaseName->base())
diff --git a/src/libs/cplusplus/Macro.cpp b/src/libs/cplusplus/Macro.cpp
index a3046e8e832..bd36ec39b95 100644
--- a/src/libs/cplusplus/Macro.cpp
+++ b/src/libs/cplusplus/Macro.cpp
@@ -47,7 +47,7 @@ QString Macro::decoratedName() const
     if (f._functionLike) {
         text += QLatin1Char('(');
         bool first = true;
-        for (const QByteArray &formal : qAsConst(_formals)) {
+        for (const QByteArray &formal : std::as_const(_formals)) {
             if (! first)
                 text += QLatin1String(", ");
             else
diff --git a/src/libs/cplusplus/MatchingText.cpp b/src/libs/cplusplus/MatchingText.cpp
index bbd0e8d30a1..d6b89a1aad3 100644
--- a/src/libs/cplusplus/MatchingText.cpp
+++ b/src/libs/cplusplus/MatchingText.cpp
@@ -522,7 +522,7 @@ QString MatchingText::insertMatchingBrace(const QTextCursor &cursor, const QStri
     }
 
     QString result;
-    for (const QChar &ch : qAsConst(text)) {
+    for (const QChar &ch : std::as_const(text)) {
         if      (ch == QLatin1Char('('))  result += QLatin1Char(')');
         else if (ch == QLatin1Char('['))  result += QLatin1Char(']');
         else if (ch == QLatin1Char('{'))  result += QLatin1Char('}');
diff --git a/src/libs/extensionsystem/optionsparser.cpp b/src/libs/extensionsystem/optionsparser.cpp
index dd19474ba7c..8773523267f 100644
--- a/src/libs/extensionsystem/optionsparser.cpp
+++ b/src/libs/extensionsystem/optionsparser.cpp
@@ -176,7 +176,7 @@ bool OptionsParser::checkForLoadOption()
         return false;
     if (nextToken(RequiredToken)) {
         if (m_currentArg == QLatin1String("all")) {
-            for (PluginSpec *spec : qAsConst(m_pmPrivate->pluginSpecs))
+            for (PluginSpec *spec : std::as_const(m_pmPrivate->pluginSpecs))
                 spec->d->setForceEnabled(true);
             m_isDependencyRefreshNeeded = true;
         } else {
@@ -203,7 +203,7 @@ bool OptionsParser::checkForNoLoadOption()
         return false;
     if (nextToken(RequiredToken)) {
         if (m_currentArg == QLatin1String("all")) {
-            for (PluginSpec *spec : qAsConst(m_pmPrivate->pluginSpecs))
+            for (PluginSpec *spec : std::as_const(m_pmPrivate->pluginSpecs))
                 spec->d->setForceDisabled(true);
             m_isDependencyRefreshNeeded = true;
         } else {
@@ -287,7 +287,7 @@ void OptionsParser::forceDisableAllPluginsExceptTestedAndForceEnabled()
 {
     for (const PluginManagerPrivate::TestSpec &testSpec : m_pmPrivate->testSpecs)
         testSpec.pluginSpec->d->setForceEnabled(true);
-    for (PluginSpec *spec : qAsConst(m_pmPrivate->pluginSpecs)) {
+    for (PluginSpec *spec : std::as_const(m_pmPrivate->pluginSpecs)) {
         if (!spec->isForceEnabled() && !spec->isRequired())
             spec->d->setForceDisabled(true);
     }
diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp
index 4ff50a12c59..01811c33c54 100644
--- a/src/libs/extensionsystem/pluginmanager.cpp
+++ b/src/libs/extensionsystem/pluginmanager.cpp
@@ -579,7 +579,7 @@ QString PluginManager::serializedArguments()
         if (!rc.isEmpty())
             rc += separator;
         rc += QLatin1String(argumentKeywordC);
-        for (const QString &argument : qAsConst(d->arguments))
+        for (const QString &argument : std::as_const(d->arguments))
             rc += separator + argument;
     }
     return rc;
@@ -746,7 +746,7 @@ void PluginManager::formatOptions(QTextStream &str, int optionIndentation, int d
 void PluginManager::formatPluginOptions(QTextStream &str, int optionIndentation, int descriptionIndentation)
 {
     // Check plugins for options
-    for (PluginSpec *ps : qAsConst(d->pluginSpecs)) {
+    for (PluginSpec *ps : std::as_const(d->pluginSpecs)) {
         const PluginSpec::PluginArgumentDescriptions pargs = ps->argumentDescriptions();
         if (!pargs.empty()) {
             str << "\nPlugin: " <<  ps->name() << '\n';
@@ -761,7 +761,7 @@ void PluginManager::formatPluginOptions(QTextStream &str, int optionIndentation,
 */
 void PluginManager::formatPluginVersions(QTextStream &str)
 {
-    for (PluginSpec *ps : qAsConst(d->pluginSpecs))
+    for (PluginSpec *ps : std::as_const(d->pluginSpecs))
         str << "  " << ps->name() << ' ' << ps->version() << ' ' << ps->description() <<  '\n';
 }
 
@@ -993,7 +993,7 @@ void PluginManagerPrivate::writeSettings()
         return;
     QStringList tempDisabledPlugins;
     QStringList tempForceEnabledPlugins;
-    for (PluginSpec *spec : qAsConst(pluginSpecs)) {
+    for (PluginSpec *spec : std::as_const(pluginSpecs)) {
         if (spec->isEnabledByDefault() && !spec->isEnabledBySettings())
             tempDisabledPlugins.append(spec->name());
         if (!spec->isEnabledByDefault() && spec->isEnabledBySettings())
@@ -1203,7 +1203,7 @@ static TestPlan generateCustomTestPlan(IPlugin *plugin,
 
         } else {
             // Add all matching test functions of all remaining test objects
-            for (QObject *testObject : qAsConst(remainingTestObjectsOfPlugin)) {
+            for (QObject *testObject : std::as_const(remainingTestObjectsOfPlugin)) {
                 const QStringList allFunctions = testFunctions(testObject->metaObject());
                 const QStringList matchingFunctions = matchingTestFunctions(allFunctions,
                                                                             matchText);
@@ -1250,7 +1250,7 @@ void PluginManagerPrivate::startTests()
     }
 
     int failedTests = 0;
-    for (const TestSpec &testSpec : qAsConst(testSpecs)) {
+    for (const TestSpec &testSpec : std::as_const(testSpecs)) {
         IPlugin *plugin = testSpec.pluginSpec->plugin();
         if (!plugin)
             continue; // plugin not loaded
@@ -1395,7 +1395,7 @@ void PluginManagerPrivate::shutdown()
 const QVector PluginManagerPrivate::loadQueue()
 {
     QVector queue;
-    for (PluginSpec *spec : qAsConst(pluginSpecs)) {
+    for (PluginSpec *spec : std::as_const(pluginSpecs)) {
         QVector circularityCheckQueue;
         loadQueue(spec, queue, circularityCheckQueue);
     }
@@ -1702,13 +1702,13 @@ void PluginManagerPrivate::readPluginPaths()
 
 void PluginManagerPrivate::resolveDependencies()
 {
-    for (PluginSpec *spec : qAsConst(pluginSpecs))
+    for (PluginSpec *spec : std::as_const(pluginSpecs))
         spec->d->resolveDependencies(pluginSpecs);
 }
 
 void PluginManagerPrivate::enableDependenciesIndirectly()
 {
-    for (PluginSpec *spec : qAsConst(pluginSpecs))
+    for (PluginSpec *spec : std::as_const(pluginSpecs))
         spec->d->enabledIndirectly = false;
     // cannot use reverse loadQueue here, because test dependencies can introduce circles
     QVector queue = Utils::filtered(pluginSpecs, &PluginSpec::isEffectivelyEnabled);
@@ -1723,7 +1723,7 @@ PluginSpec *PluginManagerPrivate::pluginForOption(const QString &option, bool *r
 {
     // Look in the plugins for an option
     *requiresArgument = false;
-    for (PluginSpec *spec : qAsConst(pluginSpecs)) {
+    for (PluginSpec *spec : std::as_const(pluginSpecs)) {
         PluginArgumentDescription match = Utils::findOrDefault(spec->argumentDescriptions(),
                                                                [option](PluginArgumentDescription pad) {
                                                                    return pad.name == option;
diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp
index ad924bbb91b..6287c882dcc 100644
--- a/src/libs/extensionsystem/pluginspec.cpp
+++ b/src/libs/extensionsystem/pluginspec.cpp
@@ -998,7 +998,7 @@ bool PluginSpecPrivate::resolveDependencies(const QVector &specs)
         return false;
     }
     QHash resolvedDependencies;
-    for (const PluginDependency &dependency : qAsConst(dependencies)) {
+    for (const PluginDependency &dependency : std::as_const(dependencies)) {
         PluginSpec * const found = Utils::findOrDefault(specs, [&dependency](PluginSpec *spec) {
             return spec->provides(dependency.name, dependency.version);
         });
diff --git a/src/libs/extensionsystem/pluginview.cpp b/src/libs/extensionsystem/pluginview.cpp
index 5fdc7528998..f75849d3592 100644
--- a/src/libs/extensionsystem/pluginview.cpp
+++ b/src/libs/extensionsystem/pluginview.cpp
@@ -358,7 +358,7 @@ void PluginView::updatePlugins()
     }
     Utils::sort(collections, &CollectionItem::m_name);
 
-    for (CollectionItem *collection : qAsConst(collections))
+    for (CollectionItem *collection : std::as_const(collections))
         m_model->rootItem()->appendChild(collection);
 
     emit m_model->layoutChanged();
diff --git a/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.cpp b/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.cpp
index da10a7ce44c..57c99db0c2f 100644
--- a/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.cpp
+++ b/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.cpp
@@ -535,7 +535,7 @@ void DiagramController::onBeginResetModel()
 void DiagramController::onEndResetModel()
 {
     updateAllDiagramsList();
-    for (MDiagram *diagram : qAsConst(m_allDiagrams)) {
+    for (MDiagram *diagram : std::as_const(m_allDiagrams)) {
         const QList elements = diagram->diagramElements();
         // remove all elements which are not longer part of the model
         for (int i = elements.size() - 1; i >= 0; --i) {
diff --git a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp
index 6093546f5a2..dbb363646c9 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp
+++ b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp
@@ -230,7 +230,7 @@ ObjectItem *DiagramSceneModel::findTopmostObjectItem(const QPointF &scenePos) co
 {
     // fetch affected items from scene in correct drawing order to find topmost element
     const QList items = m_graphicsScene->items(scenePos);
-    for (QGraphicsItem *item : qAsConst(items)) {
+    for (QGraphicsItem *item : std::as_const(items)) {
         if (m_graphicsItems.contains(item)) {
             DObject *object = dynamic_cast(m_itemToElementMap.value(item));
             if (object)
@@ -807,7 +807,7 @@ void DiagramSceneModel::onEndRemoveElement(int row, const MDiagram *diagram)
     Q_UNUSED(diagram)
     QMT_CHECK(m_busyState == RemoveElement);
     // update elements from store (see above)
-    for (const Uid &end_uid : qAsConst(m_relationEndsUid)) {
+    for (const Uid &end_uid : std::as_const(m_relationEndsUid)) {
         DElement *dEnd = m_diagramController->findElement(end_uid, diagram);
         if (dEnd)
             updateGraphicsItem(graphicsItem(dEnd), dEnd);
@@ -854,11 +854,11 @@ void DiagramSceneModel::onSelectionChanged()
     }
 
     // select more items secondarily
-    for (QGraphicsItem *selectedItem : qAsConst(m_selectedItems)) {
+    for (QGraphicsItem *selectedItem : std::as_const(m_selectedItems)) {
         if (auto selectable = dynamic_cast(selectedItem)) {
             QRectF boundary = selectable->getSecondarySelectionBoundary();
             if (!boundary.isEmpty()) {
-                for (QGraphicsItem *item : qAsConst(m_graphicsItems)) {
+                for (QGraphicsItem *item : std::as_const(m_graphicsItems)) {
                     if (auto secondarySelectable = dynamic_cast(item)) {
                         if (!item->isSelected() && !secondarySelectable->isSecondarySelected()) {
                             secondarySelectable->setBoundarySelected(boundary, true);
@@ -1023,7 +1023,7 @@ void DiagramSceneModel::restoreSelectedStatusAfterExport(const DiagramSceneModel
 void DiagramSceneModel::recalcSceneRectSize()
 {
     QRectF sceneRect = m_originItem->mapRectToScene(m_originItem->boundingRect());
-    for (QGraphicsItem *item : qAsConst(m_graphicsItems)) {
+    for (QGraphicsItem *item : std::as_const(m_graphicsItems)) {
         // TODO use an interface to update sceneRect by item
         if (!dynamic_cast(item))
             sceneRect |= item->mapRectToScene(item->boundingRect());
diff --git a/src/libs/qmljs/qmljsimportdependencies.cpp b/src/libs/qmljs/qmljsimportdependencies.cpp
index 25b9959d004..db8e7905440 100644
--- a/src/libs/qmljs/qmljsimportdependencies.cpp
+++ b/src/libs/qmljs/qmljsimportdependencies.cpp
@@ -554,7 +554,7 @@ QByteArray DependencyInfo::calculateFingerprint(const ImportDependencies &deps)
     hash.addData("/", 1);
     QList imports = Utils::toList(allImports);
     std::sort(imports.begin(), imports.end());
-    for (const ImportKey &k : qAsConst(imports))
+    for (const ImportKey &k : std::as_const(imports))
         k.addToHash(hash);
     return hash.result();
 }
diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp
index 0c8c5bb6f3a..91dbf8eae81 100644
--- a/src/libs/qmljs/qmljsinterpreter.cpp
+++ b/src/libs/qmljs/qmljsinterpreter.cpp
@@ -2565,7 +2565,7 @@ const ObjectValue *Imports::resolveAliasAndMarkUsed(const QString &name) const
 {
     if (const ObjectValue *value = m_aliased.value(name, nullptr)) {
         // mark all respective ImportInfo objects to avoid dropping imports (QmlDesigner) on rewrite
-        for (const Import &i : qAsConst(m_imports)) {
+        for (const Import &i : std::as_const(m_imports)) {
             const ImportInfo &info = i.info;
             if (info.as() == name)
                 i.used = true; // FIXME: This evilly modifies a 'const' object
diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp
index c09eedf7b1f..6c04966cedd 100644
--- a/src/libs/qmljs/qmljslink.cpp
+++ b/src/libs/qmljs/qmljslink.cpp
@@ -212,7 +212,7 @@ Context::ImportsPerDocument LinkPrivate::linkImports()
         importsPerDocument.insert(document.data(), QSharedPointer(imports));
     }
 
-    for (const Document::Ptr &doc : qAsConst(m_snapshot)) {
+    for (const Document::Ptr &doc : std::as_const(m_snapshot)) {
         if (doc == document)
             continue;
 
@@ -413,7 +413,7 @@ Import LinkPrivate::importNonFile(const Document::Ptr &doc, const ImportInfo &im
     }
 
     if (!importFound) {
-        for (const Utils::FilePath &dir : qAsConst(m_applicationDirectories)) {
+        for (const Utils::FilePath &dir : std::as_const(m_applicationDirectories)) {
             auto qmltypes = dir.dirEntries(
                 Utils::FileFilter(QStringList{"*.qmltypes"}, QDir::Files));
 
diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
index bcf5fcb78ab..c39c48415dc 100644
--- a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
+++ b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp
@@ -278,9 +278,9 @@ void ModelManagerInterface::loadQmlTypeDescriptionsInternal(const QString &resou
     for (auto it = objs.cbegin(); it != objs.cend(); ++it)
         CppQmlTypesLoader::defaultLibraryObjects.insert(it.key(), it.value());
 
-    for (const QString &error : qAsConst(errors))
+    for (const QString &error : std::as_const(errors))
         writeMessageInternal(error);
-    for (const QString &warning : qAsConst(warnings))
+    for (const QString &warning : std::as_const(warnings))
         writeMessageInternal(warning);
 }
 
@@ -462,7 +462,7 @@ void ModelManagerInterface::iterateQrcFiles(
     }
 
     QSet pathsChecked;
-    for (const ModelManagerInterface::ProjectInfo &pInfo : qAsConst(pInfos)) {
+    for (const ModelManagerInterface::ProjectInfo &pInfo : std::as_const(pInfos)) {
         QList qrcFilePaths;
         if (resources == ActiveQrcResources)
             qrcFilePaths = pInfo.activeResourceFiles;
@@ -470,7 +470,7 @@ void ModelManagerInterface::iterateQrcFiles(
             qrcFilePaths = pInfo.allResourceFiles;
         for (const Utils::FilePath &p : generatedQrc(pInfo.applicationDirectories))
             qrcFilePaths.append(p);
-        for (const Utils::FilePath &qrcFilePath : qAsConst(qrcFilePaths)) {
+        for (const Utils::FilePath &qrcFilePath : std::as_const(qrcFilePaths)) {
             if (pathsChecked.contains(qrcFilePath))
                 continue;
             pathsChecked.insert(qrcFilePath);
@@ -566,19 +566,19 @@ void ModelManagerInterface::updateProjectInfo(const ProjectInfo &pinfo, ProjectE
 
     // remove files that are no longer in the project and have been deleted
     QList deletedFiles;
-    for (const Utils::FilePath &oldFile : qAsConst(oldInfo.sourceFiles)) {
+    for (const Utils::FilePath &oldFile : std::as_const(oldInfo.sourceFiles)) {
         if (snapshot.document(oldFile) && !pinfo.sourceFiles.contains(oldFile)
             && !oldFile.exists()) {
             deletedFiles += oldFile;
         }
     }
     removeFiles(deletedFiles);
-    for (const Utils::FilePath &oldFile : qAsConst(deletedFiles))
+    for (const Utils::FilePath &oldFile : std::as_const(deletedFiles))
         m_fileToProject.remove(oldFile, p);
 
     // parse any files not yet in the snapshot
     QList newFiles;
-    for (const Utils::FilePath &file : qAsConst(pinfo.sourceFiles)) {
+    for (const Utils::FilePath &file : std::as_const(pinfo.sourceFiles)) {
         if (!m_fileToProject.contains(file, p))
             m_fileToProject.insert(file, p);
         if (!snapshot.document(file))
@@ -589,11 +589,11 @@ void ModelManagerInterface::updateProjectInfo(const ProjectInfo &pinfo, ProjectE
 
     // update qrc cache
     m_qrcContents = pinfo.resourceFileContents;
-    for (const Utils::FilePath &newQrc : qAsConst(pinfo.allResourceFiles))
+    for (const Utils::FilePath &newQrc : std::as_const(pinfo.allResourceFiles))
         m_qrcCache.addPath(newQrc.toString(), m_qrcContents.value(newQrc));
     for (const Utils::FilePath &newQrc : generatedQrc(pinfo.applicationDirectories))
         m_qrcCache.addPath(newQrc.toString(), m_qrcContents.value(newQrc));
-    for (const Utils::FilePath &oldQrc : qAsConst(oldInfo.allResourceFiles))
+    for (const Utils::FilePath &oldQrc : std::as_const(oldInfo.allResourceFiles))
         m_qrcCache.removePath(oldQrc.toString());
 
     m_pluginDumper->loadBuiltinTypes(pinfo);
@@ -654,7 +654,7 @@ QList ModelManagerInterface::allProjectInfos
             projects = m_fileToProject.values(path.canonicalPath());
     }
     QList infos;
-    for (ProjectExplorer::Project *project : qAsConst(projects)) {
+    for (ProjectExplorer::Project *project : std::as_const(projects)) {
         ProjectInfo info = projectInfo(project);
         if (!info.project.isNull())
             infos.append(info);
@@ -1011,7 +1011,7 @@ void ModelManagerInterface::parseLoop(QSet &scannedPaths,
         }
 
         // add new files to parse list
-        for (const Utils::FilePath &file : qAsConst(importedFiles)) {
+        for (const Utils::FilePath &file : std::as_const(importedFiles)) {
             if (!files.contains(file))
                 files.append(file);
         }
@@ -1200,7 +1200,7 @@ static QList minimalPrefixPaths(const QList &p
 {
     QList sortedPaths;
     // find minimal prefix, ensure '/' at end
-    for (Utils::FilePath path : qAsConst(paths)) {
+    for (Utils::FilePath path : std::as_const(paths)) {
         if (!path.endsWith("/"))
             path = path.withNewPath(path.path() + "/");
         if (path.path().length() > 1)
@@ -1226,7 +1226,7 @@ void ModelManagerInterface::updateImportPaths()
     QList allApplicationDirectories;
     QmlLanguageBundles activeBundles;
     QmlLanguageBundles extendedBundles;
-    for (const ProjectInfo &pInfo : qAsConst(m_projects)) {
+    for (const ProjectInfo &pInfo : std::as_const(m_projects)) {
         for (const auto &importPath : pInfo.importPaths) {
             const FilePath canonicalPath = importPath.path().canonicalPath();
             if (!canonicalPath.isEmpty())
@@ -1235,13 +1235,13 @@ void ModelManagerInterface::updateImportPaths()
         allApplicationDirectories.append(pInfo.applicationDirectories);
     }
 
-    for (const ViewerContext &vContext : qAsConst(m_defaultVContexts)) {
+    for (const ViewerContext &vContext : std::as_const(m_defaultVContexts)) {
         for (const Utils::FilePath &path : vContext.paths)
             allImportPaths.maybeInsert(path, vContext.language);
         allApplicationDirectories.append(vContext.applicationDirectories);
     }
 
-    for (const ProjectInfo &pInfo : qAsConst(m_projects)) {
+    for (const ProjectInfo &pInfo : std::as_const(m_projects)) {
         activeBundles.mergeLanguageBundles(pInfo.activeBundle);
         const auto languages = pInfo.activeBundle.languages();
         for (Dialect l : languages) {
@@ -1254,7 +1254,7 @@ void ModelManagerInterface::updateImportPaths()
         }
     }
 
-    for (const ProjectInfo &pInfo : qAsConst(m_projects)) {
+    for (const ProjectInfo &pInfo : std::as_const(m_projects)) {
         if (!pInfo.qtQmlPath.isEmpty())
             allImportPaths.maybeInsert(pInfo.qtQmlPath, Dialect::QmlQtQuick2);
     }
@@ -1269,7 +1269,7 @@ void ModelManagerInterface::updateImportPaths()
         allImportPaths.maybeInsert(importPath);
     }
 
-    for (const Utils::FilePath &path : qAsConst(m_defaultImportPaths))
+    for (const Utils::FilePath &path : std::as_const(m_defaultImportPaths))
         allImportPaths.maybeInsert(path, Dialect::Qml);
     allImportPaths.compact();
     allApplicationDirectories = Utils::filteredUnique(allApplicationDirectories);
@@ -1288,9 +1288,9 @@ void ModelManagerInterface::updateImportPaths()
     QList importedFiles;
     QSet scannedPaths;
     QSet newLibraries;
-    for (const Document::Ptr &doc : qAsConst(snapshot))
+    for (const Document::Ptr &doc : std::as_const(snapshot))
         findNewLibraryImports(doc, snapshot, this, &importedFiles, &scannedPaths, &newLibraries);
-    for (const Utils::FilePath &path : qAsConst(allApplicationDirectories)) {
+    for (const Utils::FilePath &path : std::as_const(allApplicationDirectories)) {
         allImportPaths.maybeInsert(path, Dialect::Qml);
         findNewQmlApplicationInPath(path, snapshot, this, &newLibraries);
     }
@@ -1381,9 +1381,9 @@ bool rescanExports(const QString &fileName, FindExportedCppTypes &finder,
         }
         if (!hasNewInfo) {
             QHash newFingerprints;
-            for (const auto &newType : qAsConst(exported))
+            for (const auto &newType : std::as_const(exported))
                 newFingerprints[newType->className()]=newType->fingerprint();
-            for (const auto &oldType : qAsConst(data.exportedTypes)) {
+            for (const auto &oldType : std::as_const(data.exportedTypes)) {
                 if (newFingerprints.value(oldType->className()) != oldType->fingerprint()) {
                     hasNewInfo = true;
                     break;
@@ -1521,7 +1521,7 @@ ViewerContext ModelManagerInterface::getVContext(const ViewerContext &vCtx,
         Q_FALLTHROUGH();
     case ViewerContext::AddAllPaths:
     {
-        for (const Utils::FilePath &path : qAsConst(defaultVCtx.paths))
+        for (const Utils::FilePath &path : std::as_const(defaultVCtx.paths))
             maybeAddPath(res, path);
         switch (res.language.dialect()) {
         case Dialect::AnyLanguage:
@@ -1552,7 +1552,7 @@ ViewerContext ModelManagerInterface::getVContext(const ViewerContext &vCtx,
                     allProjects = m_projects.values();
                 }
                 std::sort(allProjects.begin(), allProjects.end(), &pInfoLessThanImports);
-                for (const ProjectInfo &pInfo : qAsConst(allProjects))
+                for (const ProjectInfo &pInfo : std::as_const(allProjects))
                     addPathsOnLanguageMatch(pInfo.importPaths);
             }
             const auto environmentPaths = environmentImportPaths();
@@ -1574,7 +1574,7 @@ ViewerContext ModelManagerInterface::getVContext(const ViewerContext &vCtx,
         res.selectors.append(defaultVCtx.selectors);
         Q_FALLTHROUGH();
     case ViewerContext::AddDefaultPaths:
-        for (const Utils::FilePath &path : qAsConst(defaultVCtx.paths))
+        for (const Utils::FilePath &path : std::as_const(defaultVCtx.paths))
             maybeAddPath(res, path);
         if (res.language == Dialect::AnyLanguage || res.language == Dialect::Qml)
             maybeAddPath(res, info.qtQmlPath);
@@ -1692,7 +1692,7 @@ void ModelManagerInterface::resetCodeModel()
         QMutexLocker locker(&m_mutex);
 
         // find all documents currently in the code model
-        for (const Document::Ptr &doc : qAsConst(m_validSnapshot))
+        for (const Document::Ptr &doc : std::as_const(m_validSnapshot))
             documents.append(doc->fileName());
 
         // reset the snapshot
diff --git a/src/libs/qmljs/qmljsplugindumper.cpp b/src/libs/qmljs/qmljsplugindumper.cpp
index b00a2be83c9..882d3b8ef53 100644
--- a/src/libs/qmljs/qmljsplugindumper.cpp
+++ b/src/libs/qmljs/qmljsplugindumper.cpp
@@ -151,7 +151,7 @@ void PluginDumper::onLoadPluginTypes(const Utils::FilePath &libraryPath,
 
     // watch library qmltypes file
     if (!plugin.typeInfoPaths.isEmpty()) {
-        for (const FilePath &path : qAsConst(plugin.typeInfoPaths)) {
+        for (const FilePath &path : std::as_const(plugin.typeInfoPaths)) {
             if (!path.exists())
                 continue;
             if (!pluginWatcher()->watchesFile(path.toString()))
diff --git a/src/libs/tracing/timelinetracemanager.cpp b/src/libs/tracing/timelinetracemanager.cpp
index 293bcf3c9ae..97cadb8d963 100644
--- a/src/libs/tracing/timelinetracemanager.cpp
+++ b/src/libs/tracing/timelinetracemanager.cpp
@@ -198,7 +198,7 @@ void TimelineTraceManager::setAggregateTraces(bool aggregateTraces)
 
 void TimelineTraceManager::initialize()
 {
-    for (const Initializer &initializer : qAsConst(d->initializers))
+    for (const Initializer &initializer : std::as_const(d->initializers))
         initializer();
 }
 
@@ -209,7 +209,7 @@ void TimelineTraceManager::finalize()
     // Load notes after the timeline models have been initialized ...
     // which happens on stateChanged(Done).
 
-    for (const Finalizer &finalizer : qAsConst(d->finalizers))
+    for (const Finalizer &finalizer : std::as_const(d->finalizers))
         finalizer();
 }
 
@@ -398,7 +398,7 @@ void TimelineTraceManager::TimelineTraceManagerPrivate::reset()
     traceStart = -1;
     traceEnd = -1;
 
-    for (const Clearer &clearer : qAsConst(clearers))
+    for (const Clearer &clearer : std::as_const(clearers))
         clearer();
 
     numEvents = 0;
diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp
index 3914e1f5293..5ed7efd439d 100644
--- a/src/libs/utils/aspects.cpp
+++ b/src/libs/utils/aspects.cpp
@@ -180,7 +180,7 @@ bool BaseAspect::isVisible() const
 void BaseAspect::setVisible(bool visible)
 {
     d->m_visible = visible;
-    for (QWidget *w : qAsConst(d->m_subWidgets)) {
+    for (QWidget *w : std::as_const(d->m_subWidgets)) {
         QTC_ASSERT(w, continue);
         // This may happen during layout building. Explicit setting visibility here
         // may create a show a toplevel widget for a moment until it is parented
@@ -274,7 +274,7 @@ QString BaseAspect::toolTip() const
 void BaseAspect::setToolTip(const QString &tooltip)
 {
     d->m_tooltip = tooltip;
-    for (QWidget *w : qAsConst(d->m_subWidgets)) {
+    for (QWidget *w : std::as_const(d->m_subWidgets)) {
         QTC_ASSERT(w, continue);
         w->setToolTip(tooltip);
     }
@@ -288,7 +288,7 @@ bool BaseAspect::isEnabled() const
 void BaseAspect::setEnabled(bool enabled)
 {
     d->m_enabled = enabled;
-    for (QWidget *w : qAsConst(d->m_subWidgets)) {
+    for (QWidget *w : std::as_const(d->m_subWidgets)) {
         QTC_ASSERT(w, continue);
         w->setEnabled(enabled);
     }
@@ -313,7 +313,7 @@ bool BaseAspect::isReadOnly() const
 void BaseAspect::setReadOnly(bool readOnly)
 {
     d->m_readOnly = readOnly;
-    for (QWidget *w : qAsConst(d->m_subWidgets)) {
+    for (QWidget *w : std::as_const(d->m_subWidgets)) {
         QTC_ASSERT(w, continue);
         if (auto lineEdit = qobject_cast(w))
             lineEdit->setReadOnly(readOnly);
@@ -1661,7 +1661,7 @@ void MultiSelectionAspect::addToLayout(LayoutBuilder &builder)
     switch (d->m_displayStyle) {
     case DisplayStyle::ListView:
         d->m_listView = createSubWidget();
-        for (const QString &val : qAsConst(d->m_allValues)) {
+        for (const QString &val : std::as_const(d->m_allValues)) {
             auto item = new QListWidgetItem(val, d->m_listView);
             item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
             item->setCheckState(value().contains(item->text()) ? Qt::Checked : Qt::Unchecked);
@@ -2239,7 +2239,7 @@ void AspectContainer::registerAspect(BaseAspect *aspect)
 
 void AspectContainer::registerAspects(const AspectContainer &aspects)
 {
-    for (BaseAspect *aspect : qAsConst(aspects.d->m_items))
+    for (BaseAspect *aspect : std::as_const(aspects.d->m_items))
         registerAspect(aspect);
 }
 
@@ -2270,7 +2270,7 @@ const QList &AspectContainer::aspects() const
 
 void AspectContainer::fromMap(const QVariantMap &map)
 {
-    for (BaseAspect *aspect : qAsConst(d->m_items))
+    for (BaseAspect *aspect : std::as_const(d->m_items))
         aspect->fromMap(map);
 
     emit fromMapFinished();
@@ -2279,7 +2279,7 @@ void AspectContainer::fromMap(const QVariantMap &map)
 
 void AspectContainer::toMap(QVariantMap &map) const
 {
-    for (BaseAspect *aspect : qAsConst(d->m_items))
+    for (BaseAspect *aspect : std::as_const(d->m_items))
         aspect->toMap(map);
 }
 
@@ -2288,7 +2288,7 @@ void AspectContainer::readSettings(QSettings *settings)
     for (const QString &group : d->m_settingsGroup)
         settings->beginGroup(group);
 
-    for (BaseAspect *aspect : qAsConst(d->m_items))
+    for (BaseAspect *aspect : std::as_const(d->m_items))
         aspect->readSettings(settings);
 
     for (int i = 0; i != d->m_settingsGroup.size(); ++i)
@@ -2300,7 +2300,7 @@ void AspectContainer::writeSettings(QSettings *settings) const
     for (const QString &group : d->m_settingsGroup)
         settings->beginGroup(group);
 
-    for (BaseAspect *aspect : qAsConst(d->m_items))
+    for (BaseAspect *aspect : std::as_const(d->m_items))
         aspect->writeSettings(settings);
 
     for (int i = 0; i != d->m_settingsGroup.size(); ++i)
@@ -2319,7 +2319,7 @@ void AspectContainer::setSettingsGroups(const QString &groupKey, const QString &
 
 void AspectContainer::apply()
 {
-    for (BaseAspect *aspect : qAsConst(d->m_items))
+    for (BaseAspect *aspect : std::as_const(d->m_items))
         aspect->apply();
 
     emit applied();
@@ -2327,26 +2327,26 @@ void AspectContainer::apply()
 
 void AspectContainer::cancel()
 {
-    for (BaseAspect *aspect : qAsConst(d->m_items))
+    for (BaseAspect *aspect : std::as_const(d->m_items))
         aspect->cancel();
 }
 
 void AspectContainer::finish()
 {
-    for (BaseAspect *aspect : qAsConst(d->m_items))
+    for (BaseAspect *aspect : std::as_const(d->m_items))
         aspect->finish();
 }
 
 void AspectContainer::reset()
 {
-    for (BaseAspect *aspect : qAsConst(d->m_items))
+    for (BaseAspect *aspect : std::as_const(d->m_items))
         aspect->setValueQuietly(aspect->defaultValue());
 }
 
 void AspectContainer::setAutoApply(bool on)
 {
     d->m_autoApply = on;
-    for (BaseAspect *aspect : qAsConst(d->m_items))
+    for (BaseAspect *aspect : std::as_const(d->m_items))
         aspect->setAutoApply(on);
 }
 
@@ -2357,7 +2357,7 @@ void AspectContainer::setOwnsSubAspects(bool on)
 
 bool AspectContainer::isDirty() const
 {
-    for (BaseAspect *aspect : qAsConst(d->m_items)) {
+    for (BaseAspect *aspect : std::as_const(d->m_items)) {
         if (aspect->isDirty())
             return true;
     }
@@ -2382,7 +2382,7 @@ void AspectContainer::copyFrom(const AspectContainer &other)
 
 void AspectContainer::forEachAspect(const std::function &run) const
 {
-    for (BaseAspect *aspect : qAsConst(d->m_items)) {
+    for (BaseAspect *aspect : std::as_const(d->m_items)) {
         if (auto container = dynamic_cast(aspect))
             container->forEachAspect(run);
         else
diff --git a/src/libs/utils/codegeneration.cpp b/src/libs/utils/codegeneration.cpp
index 0dfaaac011e..e1d7dd6dcf4 100644
--- a/src/libs/utils/codegeneration.cpp
+++ b/src/libs/utils/codegeneration.cpp
@@ -64,7 +64,7 @@ static void qtSection(const QStringList &qtIncludes, QTextStream &str)
 {
     QStringList sorted = qtIncludes;
     sort(sorted);
-    for (const QString &inc : qAsConst(sorted)) {
+    for (const QString &inc : std::as_const(sorted)) {
         if (!inc.isEmpty())
             str << QStringLiteral("#include <%1>\n").arg(inc);
     }
diff --git a/src/libs/utils/fancylineedit.cpp b/src/libs/utils/fancylineedit.cpp
index f1f5f4d4787..299fc7fb299 100644
--- a/src/libs/utils/fancylineedit.cpp
+++ b/src/libs/utils/fancylineedit.cpp
@@ -509,7 +509,7 @@ void FancyLineEdit::validate()
 
     // Check buttons.
     if (d->m_oldText.isEmpty() || t.isEmpty()) {
-        for (auto &button : qAsConst(d->m_iconbutton)) {
+        for (auto &button : std::as_const(d->m_iconbutton)) {
             if (button->hasAutoHide())
                 button->animateShow(!t.isEmpty());
         }
diff --git a/src/libs/utils/fancymainwindow.cpp b/src/libs/utils/fancymainwindow.cpp
index 344b5531a49..92772bd085e 100644
--- a/src/libs/utils/fancymainwindow.cpp
+++ b/src/libs/utils/fancymainwindow.cpp
@@ -518,7 +518,7 @@ void FancyMainWindow::addDockActionsToMenu(QMenu *menu)
         QTC_ASSERT(action2, return false);
         return stripAccelerator(action1->text()).toLower() < stripAccelerator(action2->text()).toLower();
     });
-    for (QAction *action : qAsConst(actions))
+    for (QAction *action : std::as_const(actions))
         menu->addAction(action);
     menu->addAction(&d->m_showCentralWidget);
     menu->addAction(&d->m_menuSeparator1);
diff --git a/src/libs/utils/filesystemmodel.cpp b/src/libs/utils/filesystemmodel.cpp
index 645d979fc9c..b905da09945 100644
--- a/src/libs/utils/filesystemmodel.cpp
+++ b/src/libs/utils/filesystemmodel.cpp
@@ -416,9 +416,9 @@ void FileInfoGatherer::run()
             condition.wait(&mutex);
         if (abort.loadRelaxed())
             return;
-        const QString thisPath = qAsConst(path).front();
+        const QString thisPath = std::as_const(path).front();
         path.pop_front();
-        const QStringList thisList = qAsConst(files).front();
+        const QStringList thisList = std::as_const(files).front();
         files.pop_front();
         locker.unlock();
 
@@ -659,7 +659,7 @@ public:
     void updateIcon(QFileIconProvider *iconProvider, const QString &path) {
         if (info)
             info->icon = iconProvider->icon(QFileInfo(path));
-        for (FileSystemNode *child : qAsConst(children)) {
+        for (FileSystemNode *child : std::as_const(children)) {
             //On windows the root (My computer) has no path so we don't want to add a / for nothing (e.g. /C:/)
             if (!path.isEmpty()) {
                 if (path.endsWith(QLatin1Char('/')))
@@ -674,7 +674,7 @@ public:
     void retranslateStrings(QFileIconProvider *iconProvider, const QString &path) {
         if (info)
             info->displayType = iconProvider->type(QFileInfo(path));
-        for (FileSystemNode *child : qAsConst(children)) {
+        for (FileSystemNode *child : std::as_const(children)) {
             //On windows the root (My computer) has no path so we don't want to add a / for nothing (e.g. /C:/)
             if (!path.isEmpty()) {
                 if (path.endsWith(QLatin1Char('/')))
@@ -2454,7 +2454,7 @@ void FileSystemModelPrivate::_q_fileSystemChanged(const QString &path,
     std::sort(rowsToUpdate.begin(), rowsToUpdate.end());
     PathKey min;
     PathKey max;
-    for (const PathKey &value : qAsConst(rowsToUpdate)) {
+    for (const PathKey &value : std::as_const(rowsToUpdate)) {
         //##TODO is there a way to bundle signals with QString as the content of the list?
         /*if (min.isEmpty()) {
             min = value;
diff --git a/src/libs/utils/filesystemwatcher.cpp b/src/libs/utils/filesystemwatcher.cpp
index 602aaadf00a..7eb5db4692f 100644
--- a/src/libs/utils/filesystemwatcher.cpp
+++ b/src/libs/utils/filesystemwatcher.cpp
@@ -175,10 +175,10 @@ void FileSystemWatcherPrivate::autoReloadPostponed(bool postponed)
         return;
     m_postponed = postponed;
     if (!postponed) {
-        for (const QString &file : qAsConst(m_postponedFiles))
+        for (const QString &file : std::as_const(m_postponedFiles))
             emit q->fileChanged(file);
         m_postponedFiles.clear();
-        for (const QString &directory : qAsConst(m_postponedDirectories))
+        for (const QString &directory : std::as_const(m_postponedDirectories))
             emit q->directoryChanged(directory);
         m_postponedDirectories.clear();
     }
@@ -450,7 +450,7 @@ void FileSystemWatcher::slotDirectoryChanged(const QString &path)
             toReadd.removeOne(rejected);
 
         // If we've successfully added the file, that means it was deleted and replaced.
-        for (const QString &reAdded : qAsConst(toReadd))
+        for (const QString &reAdded : std::as_const(toReadd))
             d->fileChanged(reAdded);
     }
 }
diff --git a/src/libs/utils/futuresynchronizer.cpp b/src/libs/utils/futuresynchronizer.cpp
index 92a4cd95af5..b3238373137 100644
--- a/src/libs/utils/futuresynchronizer.cpp
+++ b/src/libs/utils/futuresynchronizer.cpp
@@ -53,7 +53,7 @@ bool FutureSynchronizer::isCancelOnWait() const
 void FutureSynchronizer::flushFinishedFutures()
 {
     QList> newFutures;
-    for (const QFuture &future : qAsConst(m_futures)) {
+    for (const QFuture &future : std::as_const(m_futures)) {
         if (!future.isFinished())
             newFutures.append(future);
     }
diff --git a/src/libs/utils/infobar.cpp b/src/libs/utils/infobar.cpp
index b44ac0d6294..13fca918f53 100644
--- a/src/libs/utils/infobar.cpp
+++ b/src/libs/utils/infobar.cpp
@@ -266,7 +266,7 @@ void InfoBarDisplay::infoBarDestroyed()
 
 void InfoBarDisplay::update()
 {
-    for (QWidget *widget : qAsConst(m_infoWidgets)) {
+    for (QWidget *widget : std::as_const(m_infoWidgets)) {
         widget->disconnect(this); // We want no destroyed() signal now
         delete widget;
     }
@@ -275,7 +275,7 @@ void InfoBarDisplay::update()
     if (!m_infoBar)
         return;
 
-    for (const InfoBarEntry &info : qAsConst(m_infoBar->m_infoBarEntries)) {
+    for (const InfoBarEntry &info : std::as_const(m_infoBar->m_infoBarEntries)) {
         auto infoWidget = new InfoBarWidget(m_edge);
 
         auto hbox = new QHBoxLayout;
@@ -319,7 +319,7 @@ void InfoBarDisplay::update()
         if (!info.m_combo.entries.isEmpty()) {
             auto cb = new QComboBox();
             cb->setToolTip(info.m_combo.tooltip);
-            for (const InfoBarEntry::ComboInfo &comboInfo : qAsConst(info.m_combo.entries))
+            for (const InfoBarEntry::ComboInfo &comboInfo : std::as_const(info.m_combo.entries))
                 cb->addItem(comboInfo.displayText, comboInfo.data);
             if (info.m_combo.currentIndex >= 0 && info.m_combo.currentIndex < cb->count())
                 cb->setCurrentIndex(info.m_combo.currentIndex);
@@ -330,7 +330,7 @@ void InfoBarDisplay::update()
             hbox->addWidget(cb);
         }
 
-        for (const InfoBarEntry::Button &button : qAsConst(info.m_buttons)) {
+        for (const InfoBarEntry::Button &button : std::as_const(info.m_buttons)) {
             auto infoWidgetButton = new QToolButton;
             infoWidgetButton->setText(button.text);
             infoWidgetButton->setToolTip(button.tooltip);
diff --git a/src/libs/utils/json.cpp b/src/libs/utils/json.cpp
index 195b50f2949..c55a4d30cac 100644
--- a/src/libs/utils/json.cpp
+++ b/src/libs/utils/json.cpp
@@ -13,7 +13,7 @@ using namespace Utils;
 
 JsonMemoryPool::~JsonMemoryPool()
 {
-    for (char *obj : qAsConst(_objs)) {
+    for (char *obj : std::as_const(_objs)) {
         reinterpret_cast(obj)->~JsonValue();
         delete[] obj;
     }
@@ -657,7 +657,7 @@ JsonSchemaManager::JsonSchemaManager(const QStringList &searchPaths)
 
 JsonSchemaManager::~JsonSchemaManager()
 {
-    for (const JsonSchemaData &schemaData : qAsConst(m_schemas))
+    for (const JsonSchemaData &schemaData : std::as_const(m_schemas))
         delete schemaData.m_schema;
 }
 
diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp
index e375d36dab3..07d0b917d21 100644
--- a/src/libs/utils/launchersocket.cpp
+++ b/src/libs/utils/launchersocket.cpp
@@ -79,7 +79,7 @@ bool CallerHandle::flushFor(SignalType signalType)
     {
         QMutexLocker locker(&m_mutex);
         const QList storedSignals =
-                Utils::transform(qAsConst(m_signals), [](const LauncherSignal *launcherSignal) {
+                Utils::transform(std::as_const(m_signals), [](const LauncherSignal *launcherSignal) {
                                    return launcherSignal->signalType();
         });
 
@@ -102,7 +102,7 @@ bool CallerHandle::flushFor(SignalType signalType)
         }
     }
     bool signalMatched = false;
-    for (const LauncherSignal *storedSignal : qAsConst(oldSignals)) {
+    for (const LauncherSignal *storedSignal : std::as_const(oldSignals)) {
         const SignalType storedSignalType = storedSignal->signalType();
         if (storedSignalType == signalType)
             signalMatched = true;
@@ -653,7 +653,7 @@ void LauncherSocket::handleRequests()
         m_requests.clear();
     }
 
-    for (const QByteArray &request : qAsConst(requests))
+    for (const QByteArray &request : std::as_const(requests))
         socket->write(request);
 }
 
diff --git a/src/libs/utils/mapreduce.h b/src/libs/utils/mapreduce.h
index eb903863205..57d1a578902 100644
--- a/src/libs/utils/mapreduce.h
+++ b/src/libs/utils/mapreduce.h
@@ -128,7 +128,7 @@ protected:
             return;
         const double progressPerMap = MAX_PROGRESS / double(m_size);
         double progress = m_successfullyFinishedMapCount * progressPerMap;
-        for (const QFutureWatcher *watcher : qAsConst(m_mapWatcher)) {
+        for (const QFutureWatcher *watcher : std::as_const(m_mapWatcher)) {
             if (watcher->progressMinimum() != watcher->progressMaximum()) {
                 const double range = watcher->progressMaximum() - watcher->progressMinimum();
                 progress += (watcher->progressValue() - watcher->progressMinimum()) / range * progressPerMap;
@@ -139,7 +139,7 @@ protected:
 
     void cancelAll()
     {
-        for (QFutureWatcher *watcher : qAsConst(m_mapWatcher))
+        for (QFutureWatcher *watcher : std::as_const(m_mapWatcher))
             watcher->cancel();
     }
 
diff --git a/src/libs/utils/mimetypes/mimedatabase.cpp b/src/libs/utils/mimetypes/mimedatabase.cpp
index 27aae693417..6ffe81d96d8 100644
--- a/src/libs/utils/mimetypes/mimedatabase.cpp
+++ b/src/libs/utils/mimetypes/mimedatabase.cpp
@@ -167,7 +167,7 @@ MimeType MimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileName
                 return candidateByData;
             }
             // If there is a glob match that is a sub class of sniffedMime, use it
-            for (const QString &m : qAsConst(candidatesByName)) {
+            for (const QString &m : std::as_const(candidatesByName)) {
                 if (inherits(m, sniffedMime)) {
                     // We have magic + pattern pointing to this, so it's a pretty good match
                     *accuracyPtr = 100;
@@ -425,7 +425,7 @@ QList MimeDatabase::mimeTypesForFileName(const QString &fileName) cons
     QStringList matches = d->mimeTypeForFileName(fileName);
     QList mimes;
     matches.sort(); // Make it deterministic
-    for (const QString &mime : qAsConst(matches))
+    for (const QString &mime : std::as_const(matches))
         mimes.append(d->mimeTypeForName(mime));
     return mimes;
 }
diff --git a/src/libs/utils/mimetypes/mimeprovider.cpp b/src/libs/utils/mimetypes/mimeprovider.cpp
index f516f13c926..03574a157f4 100644
--- a/src/libs/utils/mimetypes/mimeprovider.cpp
+++ b/src/libs/utils/mimetypes/mimeprovider.cpp
@@ -252,7 +252,7 @@ bool MimeProviderBase::shouldCheck()
 //    const QString lowerFileName = fileName.toLower();
 //    MimeGlobMatchResult result;
 //    // TODO this parses in the order (local, global). Check that it handles "NOGLOBS" correctly.
-//    for (CacheFile *cacheFile : qAsConst(m_cacheFiles)) {
+//    for (CacheFile *cacheFile : std::as_const(m_cacheFiles)) {
 //        matchGlobList(result, cacheFile, cacheFile->getUint32(PosLiteralListOffset), fileName);
 //        matchGlobList(result, cacheFile, cacheFile->getUint32(PosGlobListOffset), fileName);
 //        const int reverseSuffixTreeOffset = cacheFile->getUint32(PosReverseSuffixTreeOffset);
@@ -364,7 +364,7 @@ bool MimeProviderBase::shouldCheck()
 //MimeType MimeBinaryProvider::findByMagic(const QByteArray &data, int *accuracyPtr)
 //{
 //    checkCache();
-//    for (CacheFile *cacheFile : qAsConst(m_cacheFiles)) {
+//    for (CacheFile *cacheFile : std::as_const(m_cacheFiles)) {
 //        const int magicListOffset = cacheFile->getUint32(PosMagicListOffset);
 //        const int numMatches = cacheFile->getUint32(magicListOffset);
 //        //const int maxExtent = cacheFile->getUint32(magicListOffset + 4);
@@ -392,7 +392,7 @@ bool MimeProviderBase::shouldCheck()
 //    checkCache();
 //    const QByteArray mimeStr = mime.toLatin1();
 //    QStringList result;
-//    for (CacheFile *cacheFile : qAsConst(m_cacheFiles)) {
+//    for (CacheFile *cacheFile : std::as_const(m_cacheFiles)) {
 //        const int parentListOffset = cacheFile->getUint32(PosParentListOffset);
 //        const int numEntries = cacheFile->getUint32(parentListOffset);
 
@@ -432,7 +432,7 @@ bool MimeProviderBase::shouldCheck()
 //{
 //    checkCache();
 //    const QByteArray input = name.toLatin1();
-//    for (CacheFile *cacheFile : qAsConst(m_cacheFiles)) {
+//    for (CacheFile *cacheFile : std::as_const(m_cacheFiles)) {
 //        const int aliasListOffset = cacheFile->getUint32(PosAliasListOffset);
 //        const int numEntries = cacheFile->getUint32(aliasListOffset);
 //        int begin = 0;
@@ -463,7 +463,7 @@ bool MimeProviderBase::shouldCheck()
 //    checkCache();
 //    QStringList result;
 //    const QByteArray input = name.toLatin1();
-//    for (CacheFile *cacheFile : qAsConst(m_cacheFiles)) {
+//    for (CacheFile *cacheFile : std::as_const(m_cacheFiles)) {
 //        const int aliasListOffset = cacheFile->getUint32(PosAliasListOffset);
 //        const int numEntries = cacheFile->getUint32(aliasListOffset);
 //        for (int pos = 0; pos < numEntries; ++pos) {
@@ -641,7 +641,7 @@ bool MimeProviderBase::shouldCheck()
 //{
 //    checkCache();
 //    const QByteArray inputMime = data.name.toLatin1();
-//    for (CacheFile *cacheFile : qAsConst(m_cacheFiles)) {
+//    for (CacheFile *cacheFile : std::as_const(m_cacheFiles)) {
 //        const QString icon = iconForMime(cacheFile, PosIconsListOffset, inputMime);
 //        if (!icon.isEmpty()) {
 //            data.iconName = icon;
@@ -654,7 +654,7 @@ bool MimeProviderBase::shouldCheck()
 //{
 //    checkCache();
 //    const QByteArray inputMime = data.name.toLatin1();
-//    for (CacheFile *cacheFile : qAsConst(m_cacheFiles)) {
+//    for (CacheFile *cacheFile : std::as_const(m_cacheFiles)) {
 //        const QString icon = iconForMime(cacheFile, PosGenericIconsListOffset, inputMime);
 //        if (!icon.isEmpty()) {
 //            data.genericIconName = icon;
@@ -696,7 +696,7 @@ MimeType MimeXMLProvider::findByMagic(const QByteArray &data, int *accuracyPtr)
 
     QString candidate;
 
-    for (const MimeMagicRuleMatcher &matcher : qAsConst(m_magicMatchers)) {
+    for (const MimeMagicRuleMatcher &matcher : std::as_const(m_magicMatchers)) {
         if (matcher.matches(data)) {
             const int priority = matcher.priority();
             if (priority > *accuracyPtr) {
@@ -711,7 +711,7 @@ MimeType MimeXMLProvider::findByMagic(const QByteArray &data, int *accuracyPtr)
 QMap > MimeXMLProvider::magicRulesForMimeType(const MimeType &mimeType)
 {
     QMap > result;
-    for (const MimeMagicRuleMatcher &matcher : qAsConst(m_magicMatchers)) {
+    for (const MimeMagicRuleMatcher &matcher : std::as_const(m_magicMatchers)) {
         if (mimeType.matchesName(matcher.mimetype()))
             result[matcher.priority()].append(matcher.magicRules());
     }
@@ -775,7 +775,7 @@ void MimeXMLProvider::ensureLoaded()
             }
         }
 
-        for (const QString &file : qAsConst(allFiles))
+        for (const QString &file : std::as_const(allFiles))
             load(file);
     }
 }
diff --git a/src/libs/utils/mimetypes/mimetype.cpp b/src/libs/utils/mimetypes/mimetype.cpp
index 9c94f53749f..e749a569c65 100644
--- a/src/libs/utils/mimetypes/mimetype.cpp
+++ b/src/libs/utils/mimetypes/mimetype.cpp
@@ -327,7 +327,7 @@ QStringList MimeType::suffixes() const
     MimeDatabasePrivate::instance()->provider()->loadMimeTypePrivate(*d);
 
     QStringList result;
-    for (const QString &pattern : qAsConst(d->globPatterns)) {
+    for (const QString &pattern : std::as_const(d->globPatterns)) {
         const QString suffix = suffixFromPattern(pattern);
         if (!suffix.isEmpty())
             result.append(suffix);
diff --git a/src/libs/utils/mimetypes2/mimedatabase.cpp b/src/libs/utils/mimetypes2/mimedatabase.cpp
index 35cef228b93..d055d10ce73 100644
--- a/src/libs/utils/mimetypes2/mimedatabase.cpp
+++ b/src/libs/utils/mimetypes2/mimedatabase.cpp
@@ -431,7 +431,7 @@ MimeType MimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileName
                     *accuracyPtr = 100;
                     return candidateByData;
                 }
-                for (const QString &m : qAsConst(candidatesByName.m_allMatchingMimeTypes)) {
+                for (const QString &m : std::as_const(candidatesByName.m_allMatchingMimeTypes)) {
                     if (inherits(m, sniffedMime)) {
                         // We have magic + pattern pointing to this, so it's a pretty good match
                         *accuracyPtr = 100;
diff --git a/src/libs/utils/mimetypes2/mimeprovider.cpp b/src/libs/utils/mimetypes2/mimeprovider.cpp
index a4cee429218..99adb48c7a7 100644
--- a/src/libs/utils/mimetypes2/mimeprovider.cpp
+++ b/src/libs/utils/mimetypes2/mimeprovider.cpp
@@ -479,10 +479,10 @@ void MimeBinaryProvider::addAllMimeTypes(QList &result)
     loadMimeTypeList();
     if (result.isEmpty()) {
         result.reserve(m_mimetypeNames.count());
-        for (const QString &name : qAsConst(m_mimetypeNames))
+        for (const QString &name : std::as_const(m_mimetypeNames))
             result.append(mimeTypeForNameUnchecked(name));
     } else {
-        for (const QString &name : qAsConst(m_mimetypeNames))
+        for (const QString &name : std::as_const(m_mimetypeNames))
             if (std::find_if(result.constBegin(), result.constEnd(), [name](const MimeType &mime) -> bool { return mime.name() == name; })
                     == result.constEnd())
                 result.append(mimeTypeForNameUnchecked(name));
@@ -720,7 +720,7 @@ void MimeXMLProvider::findByMagic(const QByteArray &data, int *accuracyPtr, Mime
 {
     QString candidateName;
     bool foundOne = false;
-    for (const MimeMagicRuleMatcher &matcher : qAsConst(m_magicMatchers)) {
+    for (const MimeMagicRuleMatcher &matcher : std::as_const(m_magicMatchers)) {
         if (m_overriddenMimeTypes.contains(matcher.mimetype()))
             continue;
         if (matcher.matches(data)) {
@@ -758,7 +758,7 @@ void MimeXMLProvider::ensureLoaded()
 
     //qDebug() << "Loading" << m_allFiles;
 
-    for (const QString &file : qAsConst(allFiles))
+    for (const QString &file : std::as_const(allFiles))
         load(file);
 }
 
diff --git a/src/libs/utils/mimetypes2/mimetype.cpp b/src/libs/utils/mimetypes2/mimetype.cpp
index 735e529cff8..34177b13879 100644
--- a/src/libs/utils/mimetypes2/mimetype.cpp
+++ b/src/libs/utils/mimetypes2/mimetype.cpp
@@ -234,7 +234,7 @@ QString MimeType::comment() const
     languageList << QLocale().name();
     languageList << QLocale().uiLanguages();
     languageList << QLatin1String("default"); // use the default locale if possible.
-    for (const QString &language : qAsConst(languageList)) {
+    for (const QString &language : std::as_const(languageList)) {
         const QString lang = language == QLatin1String("C") ? QLatin1String("en_US") : language;
         const QString comm = d->localeComments.value(lang);
         if (!comm.isEmpty())
@@ -419,7 +419,7 @@ QStringList MimeType::suffixes() const
     MimeDatabasePrivate::instance()->loadMimeTypePrivate(const_cast(*d));
 
     QStringList result;
-    for (const QString &pattern : qAsConst(d->globPatterns)) {
+    for (const QString &pattern : std::as_const(d->globPatterns)) {
         const QString suffix = suffixFromPattern(pattern);
         if (!suffix.isEmpty())
             result.append(suffix);
diff --git a/src/libs/utils/minimizableinfobars.cpp b/src/libs/utils/minimizableinfobars.cpp
index c59a023cc96..6ca39a4af2a 100644
--- a/src/libs/utils/minimizableinfobars.cpp
+++ b/src/libs/utils/minimizableinfobars.cpp
@@ -40,7 +40,7 @@ void MinimizableInfoBars::setSettingsGroup(const QString &settingsGroup)
 void MinimizableInfoBars::createActions()
 {
     QTC_CHECK(m_actions.isEmpty());
-    for (const Utils::InfoBarEntry &entry : qAsConst(m_infoEntries)) {
+    for (const Utils::InfoBarEntry &entry : std::as_const(m_infoEntries)) {
         const Id id = entry.id();
         auto action = new QAction(this);
         action->setToolTip(entry.text());
diff --git a/src/libs/utils/namevaluemodel.cpp b/src/libs/utils/namevaluemodel.cpp
index dba0f8dc898..c0fcaa83b24 100644
--- a/src/libs/utils/namevaluemodel.cpp
+++ b/src/libs/utils/namevaluemodel.cpp
@@ -28,7 +28,7 @@ public:
         m_resultNameValueDictionary.modify(m_items);
         // Add removed variables again and mark them as "" so
         // that the user can actually see those removals:
-        for (const NameValueItem &item : qAsConst(m_items)) {
+        for (const NameValueItem &item : std::as_const(m_items)) {
             if (item.operation == NameValueItem::Unset)
                 m_resultNameValueDictionary.set(item.name, NameValueModel::tr(""));
         }
diff --git a/src/libs/utils/outputformatter.cpp b/src/libs/utils/outputformatter.cpp
index 2d65f8919c6..e0085b26ef2 100644
--- a/src/libs/utils/outputformatter.cpp
+++ b/src/libs/utils/outputformatter.cpp
@@ -240,7 +240,7 @@ void OutputFormatter::setLineParsers(const QList &parsers)
 
 void OutputFormatter::addLineParsers(const QList &parsers)
 {
-    for (OutputLineParser * const p : qAsConst(parsers))
+    for (OutputLineParser * const p : std::as_const(parsers))
         addLineParser(p);
 }
 
@@ -264,7 +264,7 @@ void OutputFormatter::setFileFinder(const FileInProjectFinder &finder)
 
 void OutputFormatter::setDemoteErrorsToWarnings(bool demote)
 {
-    for (OutputLineParser * const p : qAsConst(d->lineParsers))
+    for (OutputLineParser * const p : std::as_const(d->lineParsers))
         p->setDemoteErrorsToWarnings(demote);
 }
 
@@ -307,7 +307,7 @@ void OutputFormatter::doAppendMessage(const QString &text, OutputFormat format)
     if (linkified.isEmpty())
         append({}, charFmt); // This might cause insertion of a newline character.
 
-    for (OutputLineParser * const p : qAsConst(involvedParsers)) {
+    for (OutputLineParser * const p : std::as_const(involvedParsers)) {
         if (d->postPrintAction)
             d->postPrintAction(p);
         else
@@ -340,7 +340,7 @@ OutputLineParser::Result OutputFormatter::handleMessage(const QString &text, Out
         }
     }
     QTC_CHECK(!d->nextParser);
-    for (OutputLineParser * const parser : qAsConst(d->lineParsers)) {
+    for (OutputLineParser * const parser : std::as_const(d->lineParsers)) {
         if (parser == oldNextParser) // We tried that one already.
             continue;
         const OutputLineParser::Result res
@@ -532,7 +532,7 @@ void OutputFormatter::handleLink(const QString &href)
     // to the line parsers.
     if (handleFileLink(href))
         return;
-    for (OutputLineParser * const f : qAsConst(d->lineParsers)) {
+    for (OutputLineParser * const f : std::as_const(d->lineParsers)) {
         if (f->handleLink(href))
             return;
     }
@@ -575,7 +575,7 @@ void OutputFormatter::flush()
         flushIncompleteLine();
     flushTrailingNewline();
     d->escapeCodeHandler.endFormatScope();
-    for (OutputLineParser * const p : qAsConst(d->lineParsers))
+    for (OutputLineParser * const p : std::as_const(d->lineParsers))
         p->flush();
     if (d->nextParser)
         d->nextParser->runPostPrintActions(plainTextEdit());
@@ -590,13 +590,13 @@ bool OutputFormatter::hasFatalErrors() const
 
 void OutputFormatter::addSearchDir(const FilePath &dir)
 {
-    for (OutputLineParser * const p : qAsConst(d->lineParsers))
+    for (OutputLineParser * const p : std::as_const(d->lineParsers))
         p->addSearchDir(dir);
 }
 
 void OutputFormatter::dropSearchDir(const FilePath &dir)
 {
-    for (OutputLineParser * const p : qAsConst(d->lineParsers))
+    for (OutputLineParser * const p : std::as_const(d->lineParsers))
         p->dropSearchDir(dir);
 }
 
diff --git a/src/libs/utils/portlist.cpp b/src/libs/utils/portlist.cpp
index 2073a7f69ad..5456c90f8c3 100644
--- a/src/libs/utils/portlist.cpp
+++ b/src/libs/utils/portlist.cpp
@@ -141,7 +141,7 @@ bool PortList::hasMore() const { return !d->ranges.isEmpty(); }
 
 bool PortList::contains(Port port) const
 {
-    for (const Internal::Range &r : qAsConst(d->ranges)) {
+    for (const Internal::Range &r : std::as_const(d->ranges)) {
         if (port >= r.first && port <= r.second)
             return true;
     }
@@ -151,7 +151,7 @@ bool PortList::contains(Port port) const
 int PortList::count() const
 {
     int n = 0;
-    for (const Internal::Range &r : qAsConst(d->ranges))
+    for (const Internal::Range &r : std::as_const(d->ranges))
         n += r.second.number() - r.first.number() + 1;
     return n;
 }
@@ -171,7 +171,7 @@ Port PortList::getNext()
 QString PortList::toString() const
 {
     QString stringRep;
-    for (const Internal::Range &range : qAsConst(d->ranges)) {
+    for (const Internal::Range &range : std::as_const(d->ranges)) {
         stringRep += QString::number(range.first.number());
         if (range.second != range.first)
             stringRep += QLatin1Char('-') + QString::number(range.second.number());
diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp
index ac46cae9461..18abb0de20f 100644
--- a/src/libs/utils/qtcprocess.cpp
+++ b/src/libs/utils/qtcprocess.cpp
@@ -839,7 +839,7 @@ QList GeneralProcessBlockingImpl::takeSignalsFor(Proce
         return takeAllSignals();
 
     QMutexLocker locker(&m_mutex);
-    const QList storedSignals = transform(qAsConst(m_signals),
+    const QList storedSignals = transform(std::as_const(m_signals),
                             [](const ProcessInterfaceSignal *aSignal) {
         return aSignal->signalType();
     });
@@ -866,7 +866,7 @@ bool GeneralProcessBlockingImpl::flushSignals(const QListsignalType();
         if (signalType && storedSignalType == *signalType)
             signalMatched = true;
diff --git a/src/libs/utils/wizard.cpp b/src/libs/utils/wizard.cpp
index 31ef7dce28e..c9362f17fef 100644
--- a/src/libs/utils/wizard.cpp
+++ b/src/libs/utils/wizard.cpp
@@ -388,7 +388,7 @@ void Wizard::showVariables()
     QHash vars = variables();
     QList keys = vars.keys();
     sort(keys);
-    for (const QString &key : qAsConst(keys)) {
+    for (const QString &key : std::as_const(keys)) {
         const QVariant &v = vars.value(key);
         result += QLatin1String("  ")
                 + key + QLatin1String("")
diff --git a/src/plugins/android/androidavdmanager.cpp b/src/plugins/android/androidavdmanager.cpp
index 7fdc9960c6d..2234a6e2b45 100644
--- a/src/plugins/android/androidavdmanager.cpp
+++ b/src/plugins/android/androidavdmanager.cpp
@@ -212,11 +212,11 @@ static AndroidDeviceInfoList listVirtualDevices(const AndroidConfig &config)
         avdErrorPaths.clear();
         avdList = parseAvdList(output, &avdErrorPaths);
         allAvdErrorPaths << avdErrorPaths;
-        for (const QString &avdPathStr : qAsConst(avdErrorPaths))
+        for (const QString &avdPathStr : std::as_const(avdErrorPaths))
             avdConfigEditManufacturerTag(avdPathStr); // comment out manufacturer tag
     } while (!avdErrorPaths.isEmpty());               // try again
 
-    for (const QString &avdPathStr : qAsConst(allAvdErrorPaths))
+    for (const QString &avdPathStr : std::as_const(allAvdErrorPaths))
         avdConfigEditManufacturerTag(avdPathStr, true); // re-add manufacturer tag
 
     return avdList;
diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp
index dd55ccefa07..72286ef819b 100644
--- a/src/plugins/android/androidconfigurations.cpp
+++ b/src/plugins/android/androidconfigurations.cpp
@@ -673,7 +673,7 @@ QVector AndroidConfig::connectedDevices(QString *error) const
 
     // workaround for '????????????' serial numbers:
     // can use "adb -d" when only one usb device attached
-    for (const QString &device : qAsConst(adbDevs)) {
+    for (const QString &device : std::as_const(adbDevs)) {
         const QString serialNo = device.left(device.indexOf('\t')).trimmed();
         const QString deviceType = device.mid(device.indexOf('\t')).trimmed();
         AndroidDeviceInfo dev;
@@ -1538,7 +1538,7 @@ FilePath AndroidConfig::getJdkPath()
             // Look for the highest existing JDK
             allVersions.sort();
             std::reverse(allVersions.begin(), allVersions.end()); // Order descending
-            for (const QString &version : qAsConst(allVersions)) {
+            for (const QString &version : std::as_const(allVersions)) {
                 settings.beginGroup(version);
                 jdkHome = FilePath::fromUserInput(settings.value("JavaHome").toString());
                 settings.endGroup();
diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp
index 83095383917..f0d5ce61dcf 100644
--- a/src/plugins/android/androidmanifesteditorwidget.cpp
+++ b/src/plugins/android/androidmanifesteditorwidget.cpp
@@ -1052,7 +1052,7 @@ void AndroidManifestEditorWidget::parseManifest(QXmlStreamReader &reader, QXmlSt
                 writer.writeComment(QLatin1String(" %%INSERT_FEATURES "));
 
             if (!permissions.isEmpty()) {
-                for (const QString &permission : qAsConst(permissions)) {
+                for (const QString &permission : std::as_const(permissions)) {
                     writer.writeEmptyElement(QLatin1String("uses-permission"));
                     writer.writeAttribute(QLatin1String("android:name"), permission);
                 }
diff --git a/src/plugins/android/androidpackageinstallationstep.cpp b/src/plugins/android/androidpackageinstallationstep.cpp
index 0cc5dc5539c..72b80747737 100644
--- a/src/plugins/android/androidpackageinstallationstep.cpp
+++ b/src/plugins/android/androidpackageinstallationstep.cpp
@@ -123,7 +123,7 @@ void AndroidPackageInstallationStep::setupOutputFormatter(OutputFormatter *forma
 void AndroidPackageInstallationStep::doRun()
 {
     QString error;
-    for (const QString &dir : qAsConst(m_androidDirsToClean)) {
+    for (const QString &dir : std::as_const(m_androidDirsToClean)) {
         FilePath androidDir = FilePath::fromString(dir);
         if (!dir.isEmpty() && androidDir.exists()) {
             emit addOutput(Tr::tr("Removing directory %1").arg(dir), OutputFormat::NormalMessage);
diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp
index abbddb843ce..36a36a486e1 100644
--- a/src/plugins/android/androidrunnerworker.cpp
+++ b/src/plugins/android/androidrunnerworker.cpp
@@ -416,7 +416,7 @@ void AndroidRunnerWorker::logcatProcess(const QByteArray &text, QByteArray &buff
     }
 
     QString pidString = QString::number(m_processPID);
-    for (const QByteArray &msg : qAsConst(lines)) {
+    for (const QByteArray &msg : std::as_const(lines)) {
         const QString line = QString::fromUtf8(msg).trimmed() + QLatin1Char('\n');
         if (!line.contains(pidString))
             continue;
@@ -526,7 +526,7 @@ void AndroidRunnerWorker::asyncStartHelper()
     forceStop();
     asyncStartLogcat();
 
-    for (const QString &entry : qAsConst(m_beforeStartAdbCommands))
+    for (const QString &entry : std::as_const(m_beforeStartAdbCommands))
         runAdb(entry.split(' ', Qt::SkipEmptyParts));
 
     QStringList args({"shell", "am", "start"});
@@ -823,7 +823,7 @@ void AndroidRunnerWorker::onProcessIdChanged(qint64 pid)
         m_debugServerProcess.reset();
 
         // Run adb commands after application quit.
-        for (const QString &entry: qAsConst(m_afterFinishAdbCommands))
+        for (const QString &entry: std::as_const(m_afterFinishAdbCommands))
             runAdb(entry.split(' ', Qt::SkipEmptyParts));
     } else {
         // In debugging cases this will be funneled to the engine to actually start
diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp
index b82791db07b..af5b789f026 100644
--- a/src/plugins/android/androidsdkmanager.cpp
+++ b/src/plugins/android/androidsdkmanager.cpp
@@ -536,7 +536,7 @@ void SdkManagerOutputParser::compilePackageAssociations()
     deleteAlreadyInstalled(images);
 
     // Associate the system images with sdk platforms.
-    for (AndroidSdkPackage *image : qAsConst(images)) {
+    for (AndroidSdkPackage *image : std::as_const(images)) {
         int imageApi = m_systemImages[image];
         auto itr = std::find_if(m_packages.begin(), m_packages.end(),
                                 [imageApi](const AndroidSdkPackage *p) {
@@ -651,7 +651,7 @@ bool SdkManagerOutputParser::parseAbstractData(SdkManagerOutputParser::GenericPa
     keys << installLocationKey << revisionKey << descriptionKey;
     for (const QString &line : input) {
         QString value;
-        for (const auto &key: qAsConst(keys)) {
+        for (const auto &key: std::as_const(keys)) {
             if (valueForKey(key, line, &value)) {
                 if (key == installLocationKey)
                     output.installedLocation = Utils::FilePath::fromUserInput(value);
@@ -1123,7 +1123,7 @@ void AndroidSdkManagerPrivate::parseCommonArguments(QFutureInterface &f
 
 void AndroidSdkManagerPrivate::clearPackages()
 {
-    for (AndroidSdkPackage *p : qAsConst(m_allPackages))
+    for (AndroidSdkPackage *p : std::as_const(m_allPackages))
         delete p;
     m_allPackages.clear();
 }
diff --git a/src/plugins/android/androidsdkmodel.cpp b/src/plugins/android/androidsdkmodel.cpp
index 74e172d0118..30701c893a0 100644
--- a/src/plugins/android/androidsdkmodel.cpp
+++ b/src/plugins/android/androidsdkmodel.cpp
@@ -281,7 +281,7 @@ void AndroidSdkModel::selectMissingEssentials()
     }
 
     // Select SDK platform
-    for (const SdkPlatform *platform : qAsConst(m_sdkPlatforms)) {
+    for (const SdkPlatform *platform : std::as_const(m_sdkPlatforms)) {
         if (!platform->installedLocation().isEmpty()) {
             pendingPkgs.removeOne(platform->sdkStylePath());
         } else if (pendingPkgs.contains(platform->sdkStylePath()) &&
diff --git a/src/plugins/android/androidsdkpackage.cpp b/src/plugins/android/androidsdkpackage.cpp
index 6566c14e494..16e3cc8b725 100644
--- a/src/plugins/android/androidsdkpackage.cpp
+++ b/src/plugins/android/androidsdkpackage.cpp
@@ -133,7 +133,7 @@ SdkPlatform::SdkPlatform(const QVersionNumber &version, const QString &sdkStyleP
 
 SdkPlatform::~SdkPlatform()
 {
-    for (SystemImage *image : qAsConst(m_systemImages))
+    for (SystemImage *image : std::as_const(m_systemImages))
         delete image;
     m_systemImages.clear();
 }
diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp
index 4ea5748f594..64a7f68ba1f 100644
--- a/src/plugins/android/avddialog.cpp
+++ b/src/plugins/android/avddialog.cpp
@@ -235,7 +235,7 @@ void AvdDialog::updateDeviceDefinitionComboBox()
         m_deviceDefinitionTypeComboBox->currentText());
 
     m_deviceDefinitionComboBox->clear();
-    for (const DeviceDefinitionStruct &item : qAsConst(m_deviceDefinitionsList)) {
+    for (const DeviceDefinitionStruct &item : std::as_const(m_deviceDefinitionsList)) {
         if (item.deviceType == curDeviceType)
             m_deviceDefinitionComboBox->addItem(item.name_id);
     }
@@ -289,7 +289,7 @@ void AvdDialog::updateApiLevelComboBox()
     });
 
     m_targetApiComboBox->clear();
-    for (SystemImage *image : qAsConst(filteredList)) {
+    for (SystemImage *image : std::as_const(filteredList)) {
             QString imageString = "android-" % QString::number(image->apiLevel());
             const QStringList imageSplits = image->sdkStylePath().split(';');
             if (imageSplits.size() == 4)
diff --git a/src/plugins/autotest/boost/boosttesttreeitem.cpp b/src/plugins/autotest/boost/boosttesttreeitem.cpp
index ce3215aeeb3..ef4751c2982 100644
--- a/src/plugins/autotest/boost/boosttesttreeitem.cpp
+++ b/src/plugins/autotest/boost/boosttesttreeitem.cpp
@@ -182,7 +182,7 @@ QList BoostTestTreeItem::getAllTestConfigurations() const
     });
 
     for (auto it = testsPerProjectfile.begin(), end = testsPerProjectfile.end(); it != end; ++it) {
-        for (const QString &target : qAsConst(it.value().internalTargets)) {
+        for (const QString &target : std::as_const(it.value().internalTargets)) {
             BoostTestConfiguration *config = new BoostTestConfiguration(framework());
             config->setProject(project);
             config->setProjectFile(it.key());
diff --git a/src/plugins/autotest/catch/catchtreeitem.cpp b/src/plugins/autotest/catch/catchtreeitem.cpp
index 3ba23c4d8f4..1cc79c888b8 100644
--- a/src/plugins/autotest/catch/catchtreeitem.cpp
+++ b/src/plugins/autotest/catch/catchtreeitem.cpp
@@ -250,7 +250,7 @@ QList CatchTreeItem::getFailedTestConfigurations() const
     collectFailedTestInfo(this, testCasesForProFile);
 
     for (auto it = testCasesForProFile.begin(), end = testCasesForProFile.end(); it != end; ++it) {
-        for (const QString &target : qAsConst(it.value().internalTargets)) {
+        for (const QString &target : std::as_const(it.value().internalTargets)) {
             CatchConfiguration *tc = new CatchConfiguration(framework());
             tc->setTestCases(it.value().names);
             tc->setProjectFile(it.key());
@@ -321,7 +321,7 @@ QList CatchTreeItem::getTestConfigurations(bool ignoreChec
         collectTestInfo(childItem(row), testCasesForProfile, ignoreCheckState);
 
     for (auto it = testCasesForProfile.begin(), end = testCasesForProfile.end(); it != end; ++it) {
-        for (const QString &target : qAsConst(it.value().internalTargets)) {
+        for (const QString &target : std::as_const(it.value().internalTargets)) {
             CatchConfiguration *tc = new CatchConfiguration(framework());
             tc->setTestCases(it.value().names);
             if (ignoreCheckState)
diff --git a/src/plugins/autotest/gtest/gtesttreeitem.cpp b/src/plugins/autotest/gtest/gtesttreeitem.cpp
index 736f1b6fcaf..799ae33a15b 100644
--- a/src/plugins/autotest/gtest/gtesttreeitem.cpp
+++ b/src/plugins/autotest/gtest/gtesttreeitem.cpp
@@ -261,7 +261,7 @@ QList GTestTreeItem::getTestConfigurations(bool ignoreChec
     }
 
     for (auto it = testCasesForProFile.begin(), end = testCasesForProFile.end(); it != end; ++it) {
-        for (const QString &target : qAsConst(it.value().internalTargets)) {
+        for (const QString &target : std::as_const(it.value().internalTargets)) {
             GTestConfiguration *tc = new GTestConfiguration(framework());
             if (!ignoreCheckState)
                 tc->setTestCases(it.value().filters);
@@ -297,7 +297,7 @@ QList GTestTreeItem::getFailedTestConfigurations() const
     collectFailedTestInfo(this, testCasesForProFile);
 
     for (auto it = testCasesForProFile.begin(), end = testCasesForProFile.end(); it != end; ++it) {
-        for (const QString &target : qAsConst(it.value().internalTargets)) {
+        for (const QString &target : std::as_const(it.value().internalTargets)) {
             GTestConfiguration *tc = new GTestConfiguration(framework());
             tc->setTestCases(it.value().filters);
             tc->setTestCaseCount(tc->testCaseCount() + it.value().testSetCount);
@@ -331,7 +331,7 @@ QList GTestTreeItem::getTestConfigurationsForFile(const Ut
         }
     });
     for (auto it = testCases.begin(), end = testCases.end(); it != end; ++it) {
-        for (const QString &target : qAsConst(it.value().internalTargets)) {
+        for (const QString &target : std::as_const(it.value().internalTargets)) {
             GTestConfiguration *tc = new GTestConfiguration(framework());
             tc->setTestCases(it.value().filters);
             tc->setProjectFile(it.key());
diff --git a/src/plugins/autotest/projectsettingswidget.cpp b/src/plugins/autotest/projectsettingswidget.cpp
index d425699eb65..0d507105230 100644
--- a/src/plugins/autotest/projectsettingswidget.cpp
+++ b/src/plugins/autotest/projectsettingswidget.cpp
@@ -111,7 +111,7 @@ void ProjectTestSettingsWidget::populateFrameworks(const QHashsetData(0, BaseTypeRole, frameworkOrTestTool->type());
     };
 
-    for (ITestFramework *framework : qAsConst(sortedFrameworks))
+    for (ITestFramework *framework : std::as_const(sortedFrameworks))
         generateItem(framework, frameworks.value(framework));
 
     // FIXME: testTools aren't sorted and we cannot use priority here
diff --git a/src/plugins/autotest/qtest/qttestparser.cpp b/src/plugins/autotest/qtest/qttestparser.cpp
index 492e5843593..e5753a36a84 100644
--- a/src/plugins/autotest/qtest/qttestparser.cpp
+++ b/src/plugins/autotest/qtest/qttestparser.cpp
@@ -163,7 +163,7 @@ static CPlusPlus::Document::Ptr declaringDocument(CPlusPlus::Document::Ptr doc,
         }
     }
 
-    for (const CPlusPlus::LookupItem &item : qAsConst(lookupItems)) {
+    for (const CPlusPlus::LookupItem &item : std::as_const(lookupItems)) {
         if (CPlusPlus::Symbol *symbol = item.declaration()) {
             if (CPlusPlus::Class *toeClass = symbol->asClass()) {
                 const QString declFileName = QLatin1String(toeClass->fileId()->chars(),
diff --git a/src/plugins/autotest/quick/quicktestparser.cpp b/src/plugins/autotest/quick/quicktestparser.cpp
index 916434477ca..b133938abc2 100644
--- a/src/plugins/autotest/quick/quicktestparser.cpp
+++ b/src/plugins/autotest/quick/quicktestparser.cpp
@@ -180,7 +180,7 @@ QList QuickTestParser::scanDirectoryForQuickTestQmlFiles(const Ut
 
     QList foundDocs;
 
-    for (const Utils::FilePath &path : qAsConst(dirs)) {
+    for (const Utils::FilePath &path : std::as_const(dirs)) {
         const QList docs = snapshot.documentsInDirectory(path);
         for (const Document::Ptr &doc : docs) {
             Utils::FilePath fi = doc->fileName();
diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp
index 4a48a579028..27175552414 100644
--- a/src/plugins/autotest/testcodeparser.cpp
+++ b/src/plugins/autotest/testcodeparser.cpp
@@ -318,11 +318,11 @@ void TestCodeParser::scanForTests(const Utils::FilePaths &fileList,
         }
     } else if (!parsers.isEmpty()) {
         for (ITestParser *parser: parsers) {
-            for (const Utils::FilePath &filePath : qAsConst(list))
+            for (const Utils::FilePath &filePath : std::as_const(list))
                 parser->framework()->rootNode()->markForRemovalRecursively(filePath);
         }
     } else {
-        for (const Utils::FilePath &filePath : qAsConst(list))
+        for (const Utils::FilePath &filePath : std::as_const(list))
             emit requestRemoval(filePath);
     }
 
@@ -453,7 +453,7 @@ void TestCodeParser::parsePostponedFiles()
 
 void TestCodeParser::releaseParserInternals()
 {
-    for (ITestParser *parser : qAsConst(m_testCodeParsers))
+    for (ITestParser *parser : std::as_const(m_testCodeParsers))
         parser->release();
 }
 
diff --git a/src/plugins/autotest/testconfiguration.cpp b/src/plugins/autotest/testconfiguration.cpp
index 0ad73489784..c97bc22e93f 100644
--- a/src/plugins/autotest/testconfiguration.cpp
+++ b/src/plugins/autotest/testconfiguration.cpp
@@ -210,7 +210,7 @@ void TestConfiguration::completeTestInformation(TestRunMode runMode)
     QList runConfigurations = target->runConfigurations();
     runConfigurations.removeOne(target->activeRunConfiguration());
     runConfigurations.prepend(target->activeRunConfiguration());
-    for (RunConfiguration *runConfig : qAsConst(runConfigurations)) {
+    for (RunConfiguration *runConfig : std::as_const(runConfigurations)) {
         qCDebug(LOG) << "RunConfiguration" << runConfig->id();
         if (!isLocal(target)) { // TODO add device support
             qCDebug(LOG) << " Skipped as not being local";
diff --git a/src/plugins/autotest/testframeworkmanager.cpp b/src/plugins/autotest/testframeworkmanager.cpp
index f59c46d1333..d712c3d13de 100644
--- a/src/plugins/autotest/testframeworkmanager.cpp
+++ b/src/plugins/autotest/testframeworkmanager.cpp
@@ -51,11 +51,11 @@ bool TestFrameworkManager::registerTestTool(ITestTool *testTool)
 void TestFrameworkManager::activateFrameworksAndToolsFromSettings(
         const Internal::TestSettings *settings)
 {
-    for (ITestFramework *framework : qAsConst(s_instance->m_registeredFrameworks)) {
+    for (ITestFramework *framework : std::as_const(s_instance->m_registeredFrameworks)) {
         framework->setActive(settings->frameworks.value(framework->id(), false));
         framework->setGrouping(settings->frameworksGrouping.value(framework->id(), false));
     }
-    for (ITestTool *testTool : qAsConst(s_instance->m_registeredTestTools))
+    for (ITestTool *testTool : std::as_const(s_instance->m_registeredTestTools))
         testTool->setActive(settings->tools.value(testTool->id(), false));
 }
 
@@ -99,11 +99,11 @@ ITestTool *TestFrameworkManager::testToolForBuildSystemId(Id buildSystemId)
 void TestFrameworkManager::synchronizeSettings(QSettings *s)
 {
     Internal::AutotestPlugin::settings()->fromSettings(s);
-    for (ITestFramework *framework : qAsConst(m_registeredFrameworks)) {
+    for (ITestFramework *framework : std::as_const(m_registeredFrameworks)) {
         if (ITestSettings *fSettings = framework->testSettings())
             fSettings->readSettings(s);
     }
-    for (ITestTool *testTool : qAsConst(m_registeredTestTools)) {
+    for (ITestTool *testTool : std::as_const(m_registeredTestTools)) {
         if (ITestSettings *tSettings = testTool->testSettings())
             tSettings->readSettings(s);
     }
diff --git a/src/plugins/autotest/testresultmodel.cpp b/src/plugins/autotest/testresultmodel.cpp
index b76a5b3f036..d410ec8dd32 100644
--- a/src/plugins/autotest/testresultmodel.cpp
+++ b/src/plugins/autotest/testresultmodel.cpp
@@ -338,7 +338,7 @@ void TestResultModel::recalculateMaxWidthOfFileName(const QFont &font)
 {
     const QFontMetrics fm(font);
     m_maxWidthOfFileName = 0;
-    for (const QString &fileName : qAsConst(m_fileNames)) {
+    for (const QString &fileName : std::as_const(m_fileNames)) {
         m_maxWidthOfFileName = qMax(m_maxWidthOfFileName, fm.horizontalAdvance(fileName));
     }
 }
diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp
index d377e87c3d0..0eeba0f6d7d 100644
--- a/src/plugins/autotest/testrunner.cpp
+++ b/src/plugins/autotest/testrunner.cpp
@@ -462,7 +462,7 @@ int TestRunner::precheckTestConfigurations()
 {
     const bool omitWarnings = AutotestPlugin::settings()->omitRunConfigWarn;
     int testCaseCount = 0;
-    for (ITestConfiguration *itc : qAsConst(m_selectedTests)) {
+    for (ITestConfiguration *itc : std::as_const(m_selectedTests)) {
         if (itc->testBase()->type() == ITestBase::Tool) {
             if (itc->project()) {
                 testCaseCount += itc->testCaseCount();
@@ -509,7 +509,7 @@ void TestRunner::runTests()
 {
     QList toBeRemoved;
     bool projectChanged = false;
-    for (ITestConfiguration *itc : qAsConst(m_selectedTests)) {
+    for (ITestConfiguration *itc : std::as_const(m_selectedTests)) {
         if (itc->testBase()->type() == ITestBase::Tool) {
             if (itc->project() != SessionManager::startupProject()) {
                 projectChanged = true;
diff --git a/src/plugins/autotest/testtreemodel.cpp b/src/plugins/autotest/testtreemodel.cpp
index d50d8018588..cdb090461c5 100644
--- a/src/plugins/autotest/testtreemodel.cpp
+++ b/src/plugins/autotest/testtreemodel.cpp
@@ -374,7 +374,7 @@ void TestTreeModel::synchronizeTestTools()
     for (ITestTreeItem *oldFrameworkRoot : oldFrameworkRoots)
         takeItem(oldFrameworkRoot);  // do NOT delete the ptr is still held by TestFrameworkManager
 
-    for (ITestTool *testTool : qAsConst(tools)) {
+    for (ITestTool *testTool : std::as_const(tools)) {
         ITestTreeItem *testToolRootNode = testTool->rootNode();
         invisibleRoot->appendChild(testToolRootNode);
         if (!oldFrameworkRoots.removeOne(testToolRootNode))
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildsystem.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildsystem.cpp
index 4d38b63fe47..015d0e739bb 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsbuildsystem.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildsystem.cpp
@@ -93,7 +93,7 @@ void AutotoolsBuildSystem::makefileParsingFinished()
     }
 
     auto newRoot = std::make_unique(project()->projectDirectory());
-    for (const QString &f : qAsConst(m_files)) {
+    for (const QString &f : std::as_const(m_files)) {
         const Utils::FilePath path = Utils::FilePath::fromString(f);
         newRoot->addNestedNode(std::make_unique(path,
                                                           FileNode::fileTypeForFileName(path)));
diff --git a/src/plugins/autotoolsprojectmanager/makefileparser.cpp b/src/plugins/autotoolsprojectmanager/makefileparser.cpp
index 91169bb8f2e..dfc5b244aa3 100644
--- a/src/plugins/autotoolsprojectmanager/makefileparser.cpp
+++ b/src/plugins/autotoolsprojectmanager/makefileparser.cpp
@@ -239,7 +239,7 @@ void MakefileParser::parseSubDirs()
 
     // Delegate the parsing of all sub directories to a local
     // makefile parser and merge the results
-    for (const QString &subDir : qAsConst(subDirs)) {
+    for (const QString &subDir : std::as_const(subDirs)) {
         const QChar slash = QLatin1Char('/');
         const QString subDirMakefile = path + slash + subDir
                                        + slash + makefileName;
diff --git a/src/plugins/baremetal/debugserverprovidermanager.cpp b/src/plugins/baremetal/debugserverprovidermanager.cpp
index 2508486320c..2ed256e47ae 100644
--- a/src/plugins/baremetal/debugserverprovidermanager.cpp
+++ b/src/plugins/baremetal/debugserverprovidermanager.cpp
@@ -103,7 +103,7 @@ void DebugServerProviderManager::restoreProviders()
                 map[key.mid(lastDot + 1)] = map[key];
         }
         bool restored = false;
-        for (IDebugServerProviderFactory *f : qAsConst(m_factories)) {
+        for (IDebugServerProviderFactory *f : std::as_const(m_factories)) {
             if (f->canRestore(map)) {
                 if (IDebugServerProvider *p = f->restore(map)) {
                     registerProvider(p);
@@ -127,7 +127,7 @@ void DebugServerProviderManager::saveProviders()
     data.insert(fileVersionKeyC, 1);
 
     int count = 0;
-    for (const IDebugServerProvider *p : qAsConst(m_providers)) {
+    for (const IDebugServerProvider *p : std::as_const(m_providers)) {
         if (p->isValid()) {
             const QVariantMap tmp = p->toMap();
             if (tmp.isEmpty())
@@ -179,7 +179,7 @@ bool DebugServerProviderManager::registerProvider(IDebugServerProvider *provider
 {
     if (!provider || m_instance->m_providers.contains(provider))
         return true;
-    for (const IDebugServerProvider *current : qAsConst(m_instance->m_providers)) {
+    for (const IDebugServerProvider *current : std::as_const(m_instance->m_providers)) {
         if (*provider == *current)
             return false;
         QTC_ASSERT(current->id() != provider->id(), return false);
diff --git a/src/plugins/baremetal/debugserverproviderssettingspage.cpp b/src/plugins/baremetal/debugserverproviderssettingspage.cpp
index ba34d4e5912..47ce9549edf 100644
--- a/src/plugins/baremetal/debugserverproviderssettingspage.cpp
+++ b/src/plugins/baremetal/debugserverproviderssettingspage.cpp
@@ -146,7 +146,7 @@ DebugServerProviderNode *DebugServerProviderModel::nodeForIndex(const QModelInde
 void DebugServerProviderModel::apply()
 {
     // Remove unused providers
-    for (IDebugServerProvider *provider : qAsConst(m_providersToRemove))
+    for (IDebugServerProvider *provider : std::as_const(m_providersToRemove))
         DebugServerProviderManager::deregisterProvider(provider);
     QTC_ASSERT(m_providersToRemove.isEmpty(), m_providersToRemove.clear());
 
@@ -166,7 +166,7 @@ void DebugServerProviderModel::apply()
 
     // Add new (and already updated) providers
     QStringList skippedProviders;
-    for (IDebugServerProvider *provider: qAsConst(m_providersToAdd)) {
+    for (IDebugServerProvider *provider: std::as_const(m_providersToAdd)) {
         if (!DebugServerProviderManager::registerProvider(provider))
             skippedProviders << provider->displayName();
     }
diff --git a/src/plugins/baremetal/debugservers/uvsc/uvproject.cpp b/src/plugins/baremetal/debugservers/uvsc/uvproject.cpp
index d393641251a..8f09294ec3c 100644
--- a/src/plugins/baremetal/debugservers/uvsc/uvproject.cpp
+++ b/src/plugins/baremetal/debugservers/uvsc/uvproject.cpp
@@ -73,7 +73,7 @@ static void extractAllFiles(const DebuggerRunTool *runTool, QStringList &include
         return;
     const QVector parts = info->projectParts();
     for (const ProjectPart::ConstPtr &part : parts) {
-        for (const ProjectFile &file : qAsConst(part->files)) {
+        for (const ProjectFile &file : std::as_const(part->files)) {
             if (!file.active)
                 continue;
             const auto path = FilePath::fromString(file.path);
@@ -84,7 +84,7 @@ static void extractAllFiles(const DebuggerRunTool *runTool, QStringList &include
             else if (file.path.endsWith(".s") && !assemblers.contains(path))
                 assemblers.push_back(path);
         }
-        for (const HeaderPath &include : qAsConst(part->headerPaths)) {
+        for (const HeaderPath &include : std::as_const(part->headerPaths)) {
             if (!includes.contains(include.path))
                 includes.push_back(include.path);
         }
diff --git a/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp b/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp
index 80571724e11..32b1d3fad66 100644
--- a/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp
+++ b/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp
@@ -215,7 +215,7 @@ void DeviceSelectionModel::fillAllPacks(const FilePath &toolsIniFile)
 
     if (allPackFiles.isEmpty())
         return;
-    for (const QString &packFile : qAsConst(allPackFiles))
+    for (const QString &packFile : std::as_const(allPackFiles))
         parsePackage(packFile);
 }
 
diff --git a/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.cpp b/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.cpp
index ea38204a87e..66cc3aaafcb 100644
--- a/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.cpp
+++ b/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.cpp
@@ -78,7 +78,7 @@ QVariantMap DeviceSelection::toMap() const
     map.insert(deviceMpuKeyC, cpu.mpu);
     // Device MEMORY.
     QVariantList memoryList;
-    for (const DeviceSelection::Memory &memory : qAsConst(memories)) {
+    for (const DeviceSelection::Memory &memory : std::as_const(memories)) {
         QVariantMap m;
         m.insert(deviceMemoryIdKeyC, memory.id);
         m.insert(deviceMemoryStartKeyC, memory.start);
@@ -88,7 +88,7 @@ QVariantMap DeviceSelection::toMap() const
     map.insert(deviceMemoryKeyC, memoryList);
     // Device ALGORITHM.
     QVariantList algorithmList;
-    for (const DeviceSelection::Algorithm &algorithm : qAsConst(algorithms)) {
+    for (const DeviceSelection::Algorithm &algorithm : std::as_const(algorithms)) {
         QVariantMap m;
         m.insert(deviceAlgorithmPathKeyC, algorithm.path);
         m.insert(deviceAlgorithmFlashStartKeyC, algorithm.flashStart);
diff --git a/src/plugins/baremetal/debugservers/uvsc/uvtargetdrivermodel.cpp b/src/plugins/baremetal/debugservers/uvsc/uvtargetdrivermodel.cpp
index a2abc5f3a79..50cbf216d6f 100644
--- a/src/plugins/baremetal/debugservers/uvsc/uvtargetdrivermodel.cpp
+++ b/src/plugins/baremetal/debugservers/uvsc/uvtargetdrivermodel.cpp
@@ -123,13 +123,13 @@ void DriverSelectionModel::fillDrivers(const FilePath &toolsIniFile,
     if (!collectCpuDllsAndDrivers(&f, allCpuDlls, allDrivers))
         return;
 
-    for (const Dll &dll : qAsConst(allDrivers)) {
+    for (const Dll &dll : std::as_const(allDrivers)) {
         if (!supportedDrivers.contains(dll.path))
             continue;
         const auto item = new DriverSelectionItem(dll.index);
         item->m_dll = dll.path;
         item->m_name = dll.content;
-        for (const Dll &cpu : qAsConst(allCpuDlls)) {
+        for (const Dll &cpu : std::as_const(allCpuDlls)) {
             const QStringList mnemonics = cpu.content.split(',');
             if (mnemonics.contains(dll.mnemonic))
                 item->m_cpuDlls.push_back(cpu.path);
diff --git a/src/plugins/baremetal/iarewtoolchain.cpp b/src/plugins/baremetal/iarewtoolchain.cpp
index d987a80c5ed..7337fafd5c8 100644
--- a/src/plugins/baremetal/iarewtoolchain.cpp
+++ b/src/plugins/baremetal/iarewtoolchain.cpp
@@ -490,7 +490,7 @@ Toolchains IarToolChainFactory::autoDetectToolchains(
 {
     Toolchains result;
 
-    for (const Candidate &candidate : qAsConst(candidates)) {
+    for (const Candidate &candidate : std::as_const(candidates)) {
         const Toolchains filtered = Utils::filtered(alreadyKnown, [candidate](ToolChain *tc) {
             return tc->typeId() == Constants::IAREW_TOOLCHAIN_TYPEID
                 && tc->compilerCommand() == candidate.compilerPath
diff --git a/src/plugins/baremetal/keiltoolchain.cpp b/src/plugins/baremetal/keiltoolchain.cpp
index b08ae4d2ee8..387049f29a4 100644
--- a/src/plugins/baremetal/keiltoolchain.cpp
+++ b/src/plugins/baremetal/keiltoolchain.cpp
@@ -635,7 +635,7 @@ Toolchains KeilToolChainFactory::autoDetectToolchains(
 {
     Toolchains result;
 
-    for (const Candidate &candidate : qAsConst(candidates)) {
+    for (const Candidate &candidate : std::as_const(candidates)) {
         const Toolchains filtered = Utils::filtered(
                     alreadyKnown, [candidate](ToolChain *tc) {
             return tc->typeId() == Constants::IAREW_TOOLCHAIN_TYPEID
diff --git a/src/plugins/baremetal/sdcctoolchain.cpp b/src/plugins/baremetal/sdcctoolchain.cpp
index 38f56bb31b8..0fc7eb0f925 100644
--- a/src/plugins/baremetal/sdcctoolchain.cpp
+++ b/src/plugins/baremetal/sdcctoolchain.cpp
@@ -346,7 +346,7 @@ Toolchains SdccToolChainFactory::autoDetectToolchains(
 {
     Toolchains result;
 
-    for (const Candidate &candidate : qAsConst(candidates)) {
+    for (const Candidate &candidate : std::as_const(candidates)) {
         const Toolchains filtered = Utils::filtered(alreadyKnown, [candidate](ToolChain *tc) {
             return tc->typeId() == Constants::SDCC_TOOLCHAIN_TYPEID
                 && tc->compilerCommand() == candidate.compilerPath
diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp
index b0bdef80d50..cbef03141ad 100644
--- a/src/plugins/bazaar/bazaarplugin.cpp
+++ b/src/plugins/bazaar/bazaarplugin.cpp
@@ -865,7 +865,7 @@ void BazaarPluginPrivate::updateActions(VcsBasePluginPrivate::ActionState as)
     m_revertFile->setParameter(filename);
     m_statusFile->setParameter(filename);
 
-    for (QAction *repoAction : qAsConst(m_repositoryActionList))
+    for (QAction *repoAction : std::as_const(m_repositoryActionList))
         repoAction->setEnabled(repoEnabled);
 }
 
diff --git a/src/plugins/beautifier/abstractsettings.cpp b/src/plugins/beautifier/abstractsettings.cpp
index 42371aec0bc..4875e13ec50 100644
--- a/src/plugins/beautifier/abstractsettings.cpp
+++ b/src/plugins/beautifier/abstractsettings.cpp
@@ -379,7 +379,7 @@ void AbstractSettings::readDocumentation()
                 if (xml.readNext() == QXmlStreamReader::Characters) {
                     m_docu << xml.text().toString();
                     const int index = m_docu.size() - 1;
-                    for (const QString &key : qAsConst(keys))
+                    for (const QString &key : std::as_const(keys))
                         m_options.insert(key, index);
                 }
             }
diff --git a/src/plugins/beautifier/artisticstyle/artisticstylesettings.cpp b/src/plugins/beautifier/artisticstyle/artisticstylesettings.cpp
index 7522f1f647c..cbe47956d2b 100644
--- a/src/plugins/beautifier/artisticstyle/artisticstylesettings.cpp
+++ b/src/plugins/beautifier/artisticstyle/artisticstylesettings.cpp
@@ -158,7 +158,7 @@ void ArtisticStyleSettings::createDocumentationFile() const
                     // Write entry
                     stream.writeStartElement(Constants::DOCUMENTATION_XMLENTRY);
                     stream.writeStartElement(Constants::DOCUMENTATION_XMLKEYS);
-                    for (const QString &key : qAsConst(keys))
+                    for (const QString &key : std::as_const(keys))
                         stream.writeTextElement(Constants::DOCUMENTATION_XMLKEY, key);
                     stream.writeEndElement();
                     const QString text = "

" diff --git a/src/plugins/bineditor/bineditorwidget.cpp b/src/plugins/bineditor/bineditorwidget.cpp index 5a3e47229ce..ad0f631d092 100644 --- a/src/plugins/bineditor/bineditorwidget.cpp +++ b/src/plugins/bineditor/bineditorwidget.cpp @@ -890,7 +890,7 @@ void BinEditorWidget::paintEvent(QPaintEvent *e) int item_x = -xoffset + m_margin + c * m_columnWidth + m_labelWidth; QColor color; - for (const Markup &m : qAsConst(m_markup)) { + for (const Markup &m : std::as_const(m_markup)) { if (m.covers(lineAddress + c)) { color = m.color; break; @@ -1221,7 +1221,7 @@ QString BinEditorWidget::toolTip(const QHelpEvent *helpEvent) const str << "

" << Tr::tr("Memory at 0x%1").arg(address, 0, 16) << "

"; - for (const Markup &m : qAsConst(m_markup)) { + for (const Markup &m : std::as_const(m_markup)) { if (m.covers(address) && !m.toolTip.isEmpty()) { str << "

" << m.toolTip << "


"; break; diff --git a/src/plugins/clangcodemodel/clangdast.cpp b/src/plugins/clangcodemodel/clangdast.cpp index 4e1ce3f7802..9aebc8759b4 100644 --- a/src/plugins/clangcodemodel/clangdast.cpp +++ b/src/plugins/clangcodemodel/clangdast.cpp @@ -319,7 +319,7 @@ private: } const bool wasDone = m_done; - for (const ClangdAstNode &child : qAsConst(childrenToCheck)) { + for (const ClangdAstNode &child : std::as_const(childrenToCheck)) { visitNode(child); if (m_done && !wasDone) break; diff --git a/src/plugins/clangcodemodel/clangdcompletion.cpp b/src/plugins/clangcodemodel/clangdcompletion.cpp index 442a3fb2401..0263380ab87 100644 --- a/src/plugins/clangcodemodel/clangdcompletion.cpp +++ b/src/plugins/clangcodemodel/clangdcompletion.cpp @@ -478,7 +478,7 @@ QList CustomAssistProcessor::completeInclude( const QStringList suffixes = mimeType.suffixes(); QList completions; - for (const HeaderPath &headerPath : qAsConst(allHeaderPaths)) { + for (const HeaderPath &headerPath : std::as_const(allHeaderPaths)) { QString realPath = headerPath.path; if (!directoryPrefix.isEmpty()) { realPath += QLatin1Char('/'); @@ -490,7 +490,7 @@ QList CustomAssistProcessor::completeInclude( } QList> completionsForSorting; - for (AssistProposalItemInterface * const item : qAsConst(completions)) { + for (AssistProposalItemInterface * const item : std::as_const(completions)) { QString s = item->text(); s.replace('/', QChar(0)); // The dir separator should compare less than anything else. completionsForSorting.push_back({item, s}); diff --git a/src/plugins/clangcodemodel/clangdfindreferences.cpp b/src/plugins/clangcodemodel/clangdfindreferences.cpp index fde197f277e..ce0abac572e 100644 --- a/src/plugins/clangcodemodel/clangdfindreferences.cpp +++ b/src/plugins/clangcodemodel/clangdfindreferences.cpp @@ -129,7 +129,7 @@ void ClangdFindReferences::Private::handleFindUsagesResult(const QList QObject::connect(search, &SearchResult::canceled, q, [this] { canceled = true; search->disconnect(q); - for (const MessageId &id : qAsConst(pendingAstRequests)) + for (const MessageId &id : std::as_const(pendingAstRequests)) client()->cancelRequest(id); pendingAstRequests.clear(); finishSearch(); diff --git a/src/plugins/clangcodemodel/clangdfollowsymbol.cpp b/src/plugins/clangcodemodel/clangdfollowsymbol.cpp index 2e138bc96d5..8c249d30727 100644 --- a/src/plugins/clangcodemodel/clangdfollowsymbol.cpp +++ b/src/plugins/clangcodemodel/clangdfollowsymbol.cpp @@ -173,11 +173,11 @@ ClangdFollowSymbol::~ClangdFollowSymbol() d->closeTempDocuments(); if (d->virtualFuncAssistProcessor) d->virtualFuncAssistProcessor->resetData(false); - for (const MessageId &id : qAsConst(d->pendingSymbolInfoRequests)) + for (const MessageId &id : std::as_const(d->pendingSymbolInfoRequests)) d->client->cancelRequest(id); - for (const MessageId &id : qAsConst(d->pendingGotoImplRequests)) + for (const MessageId &id : std::as_const(d->pendingGotoImplRequests)) d->client->cancelRequest(id); - for (const MessageId &id : qAsConst(d->pendingGotoDefRequests)) + for (const MessageId &id : std::as_const(d->pendingGotoDefRequests)) d->client->cancelRequest(id); delete d; } @@ -307,7 +307,7 @@ ClangdFollowSymbol::VirtualFunctionAssistProcessor::createProposal(bool final) c QList items; bool needsBaseDeclEntry = !m_followSymbol->d->defLinkNode.range() .contains(Position(m_followSymbol->d->cursor)); - for (const SymbolData &symbol : qAsConst(m_followSymbol->d->symbolsToDisplay)) { + for (const SymbolData &symbol : std::as_const(m_followSymbol->d->symbolsToDisplay)) { Link link = symbol.second; if (m_followSymbol->d->defLink == link) { if (!needsBaseDeclEntry) @@ -411,7 +411,7 @@ void ClangdFollowSymbol::Private::handleGotoImplementationResult( newLinks = {ploc->toLink()}; if (const auto plloc = std::get_if>(&*result)) newLinks = transform(*plloc, &Location::toLink); - for (const Link &link : qAsConst(newLinks)) { + for (const Link &link : std::as_const(newLinks)) { if (!allLinks.contains(link)) { allLinks << link; @@ -444,7 +444,7 @@ void ClangdFollowSymbol::Private::handleGotoImplementationResult( // pure virtual and mark it accordingly. // In addition, we need to follow all override links, because for these, clangd // gives us the declaration instead of the definition. - for (const Link &link : qAsConst(allLinks)) { + for (const Link &link : std::as_const(allLinks)) { if (!client->documentForFilePath(link.targetFilePath) && addOpenFile(link.targetFilePath)) client->openExtraFile(link.targetFilePath); const auto symbolInfoHandler = [sentinel = QPointer(q), this, link]( @@ -525,7 +525,7 @@ void ClangdFollowSymbol::Private::handleGotoImplementationResult( void ClangdFollowSymbol::Private::closeTempDocuments() { - for (const FilePath &fp : qAsConst(openedFiles)) { + for (const FilePath &fp : std::as_const(openedFiles)) { if (!client->documentForFilePath(fp)) client->closeExtraFile(fp); } diff --git a/src/plugins/clangcodemodel/clangdlocatorfilters.cpp b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp index e10a62b66f8..9644f6b25c2 100644 --- a/src/plugins/clangcodemodel/clangdlocatorfilters.cpp +++ b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp @@ -154,7 +154,7 @@ QList ClangGlobalSymbolFilter::matchesFor( const QList lspMatches = m_lspFilter->matchesFor(future, entry); if (!lspMatches.isEmpty()) { std::set> locations; - for (const auto &entry : qAsConst(matches)) { + for (const auto &entry : std::as_const(matches)) { const CppEditor::IndexItem::Ptr item = qvariant_cast(entry.internalData); locations.insert(std::make_tuple(Utils::FilePath::fromString(item->fileName()), diff --git a/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp b/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp index 3d989901349..dcf6a898993 100644 --- a/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp +++ b/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp @@ -102,7 +102,7 @@ static QList cleanupDisabledCode(HighlightingResults &results, const qCDebug(clangdLogHighlight) << "found" << ifdefedOutRanges.size() << "ifdefed-out ranges"; if (clangdLogHighlight().isDebugEnabled()) { - for (const BlockRange &r : qAsConst(ifdefedOutRanges)) + for (const BlockRange &r : std::as_const(ifdefedOutRanges)) qCDebug(clangdLogHighlight) << r.first() << r.last(); } diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index 9a37e805304..47718511881 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -166,7 +166,7 @@ GenerateCompilationDbResult generateCompilationDB(QList p const UsePrecompiledHeaders usePch = getPchUsage(); const QJsonArray jsonProjectOptions = QJsonArray::fromStringList(projectOptions); - for (const ProjectInfo::ConstPtr &projectInfo : qAsConst(projectInfoList)) { + for (const ProjectInfo::ConstPtr &projectInfo : std::as_const(projectInfoList)) { for (ProjectPart::ConstPtr projectPart : projectInfo->projectParts()) { QTC_ASSERT(projectInfo, continue); QStringList args; diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index 15e2dfb0be9..f00e675651b 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -144,7 +144,7 @@ void ClangdTest::initTestCase() QVERIFY(m_client); // Open cpp documents. - for (const QString &sourceFileName : qAsConst(m_sourceFileNames)) { + for (const QString &sourceFileName : std::as_const(m_sourceFileNames)) { const auto sourceFilePath = Utils::FilePath::fromString( m_projectDir->absolutePath(sourceFileName.toLocal8Bit())); QVERIFY2(sourceFilePath.exists(), qPrintable(sourceFilePath.toUserOutput())); @@ -1854,7 +1854,7 @@ void ClangdTestCompletion::testSignalCompletion() QVERIFY(proposal); QCOMPARE(proposal->size(), expectedSuggestions.size()); - for (const QString &expectedSuggestion : qAsConst(expectedSuggestions)) + for (const QString &expectedSuggestion : std::as_const(expectedSuggestions)) QVERIFY2(hasItem(proposal, ' ' + expectedSuggestion), qPrintable(expectedSuggestion)); } diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index 73fbef3b465..4a4a12fada7 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -250,7 +250,7 @@ public: QVector itemsSchedulable; // Construct refactoring operations - for (DiagnosticItem *diagnosticItem : qAsConst(fileInfo.diagnosticItems)) { + for (DiagnosticItem *diagnosticItem : std::as_const(fileInfo.diagnosticItems)) { const FixitStatus fixItStatus = diagnosticItem->fixItStatus(); const bool isScheduled = fixItStatus == FixitStatus::Scheduled; @@ -269,7 +269,7 @@ public: // Collect replacements ReplacementOperations ops; - for (DiagnosticItem *item : qAsConst(itemsScheduledOrSchedulable)) + for (DiagnosticItem *item : std::as_const(itemsScheduledOrSchedulable)) ops += item->fixitOperations(); if (ops.empty()) @@ -291,11 +291,11 @@ public: model->addWatchedPath(ops.first()->fileName); // Update DiagnosticItem state - for (DiagnosticItem *diagnosticItem : qAsConst(itemsScheduled)) + for (DiagnosticItem *diagnosticItem : std::as_const(itemsScheduled)) diagnosticItem->setFixItStatus(FixitStatus::Applied); - for (DiagnosticItem *diagnosticItem : qAsConst(itemsFailedToApply)) + for (DiagnosticItem *diagnosticItem : std::as_const(itemsFailedToApply)) diagnosticItem->setFixItStatus(FixitStatus::FailedToApply); - for (DiagnosticItem *diagnosticItem : qAsConst(itemsInvalidated)) + for (DiagnosticItem *diagnosticItem : std::as_const(itemsInvalidated)) diagnosticItem->setFixItStatus(FixitStatus::Invalidated); } } @@ -313,7 +313,7 @@ static FileInfos sortedFileInfos(const QVector if (!projectPart->selectedForBuilding) continue; - for (const CppEditor::ProjectFile &file : qAsConst(projectPart->files)) { + for (const CppEditor::ProjectFile &file : std::as_const(projectPart->files)) { QTC_ASSERT(file.kind != CppEditor::ProjectFile::Unclassified, continue); QTC_ASSERT(file.kind != CppEditor::ProjectFile::Unsupported, continue); if (file.path == CppEditor::CppModelManager::configurationFileName()) diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index 0e5519df04e..b9917fc1dfb 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -281,7 +281,7 @@ void ClangToolRunWorker::start() void ClangToolRunWorker::stop() { - for (ClangToolRunner *runner : qAsConst(m_runners)) { + for (ClangToolRunner *runner : std::as_const(m_runners)) { QObject::disconnect(runner, nullptr, this, nullptr); delete runner; } diff --git a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp index a395de05bc2..8e3b25429dd 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp +++ b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp @@ -139,7 +139,7 @@ void ClangToolsDiagnosticModel::clear() void ClangToolsDiagnosticModel::updateItems(const DiagnosticItem *changedItem) { - for (auto item : qAsConst(stepsToItemsCache[changedItem->diagnostic().explainingSteps])) { + for (auto item : std::as_const(stepsToItemsCache[changedItem->diagnostic().explainingSteps])) { if (item != changedItem) item->setFixItStatus(changedItem->fixItStatus()); } @@ -202,7 +202,7 @@ static QString createExplainingStepToolTipString(const ExplainingStep &step) "\n" "
"); - for (const StringPair &pair : qAsConst(lines)) { + for (const StringPair &pair : std::as_const(lines)) { html += QLatin1String("
"); html += pair.first; html += QLatin1String("
"); @@ -250,7 +250,7 @@ static QString fullText(const Diagnostic &diagnostic) // Explaining steps. int explainingStepNumber = 1; - for (const ExplainingStep &explainingStep : qAsConst(diagnostic.explainingSteps)) { + for (const ExplainingStep &explainingStep : std::as_const(diagnostic.explainingSteps)) { text += createExplainingStepString(explainingStep, explainingStepNumber++) + QLatin1Char('\n'); } @@ -622,7 +622,7 @@ bool DiagnosticFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &s } // Explicitly suppressed? - for (const SuppressedDiagnostic &d : qAsConst(m_suppressedDiagnostics)) { + for (const SuppressedDiagnostic &d : std::as_const(m_suppressedDiagnostics)) { if (d.description != diag.description) continue; Utils::FilePath filePath = d.filePath; diff --git a/src/plugins/clangtools/clangtoolsplugin.cpp b/src/plugins/clangtools/clangtoolsplugin.cpp index 67a961d9bba..c2edeefa1a7 100644 --- a/src/plugins/clangtools/clangtoolsplugin.cpp +++ b/src/plugins/clangtools/clangtoolsplugin.cpp @@ -68,7 +68,7 @@ public: DocumentClangToolRunner *runnerForFilePath(const Utils::FilePath &filePath) { - for (DocumentClangToolRunner *runner : qAsConst(documentRunners)) { + for (DocumentClangToolRunner *runner : std::as_const(documentRunners)) { if (runner->filePath() == filePath) return runner; } diff --git a/src/plugins/clangtools/clangtoolsprojectsettings.cpp b/src/plugins/clangtools/clangtoolsprojectsettings.cpp index bf210b1f2eb..80f3bd5f2d2 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettings.cpp +++ b/src/plugins/clangtools/clangtoolsprojectsettings.cpp @@ -182,7 +182,7 @@ void ClangToolsProjectSettings::store() map.insert(SETTINGS_KEY_SELECTED_FILES, files); QVariantList list; - for (const SuppressedDiagnostic &diag : qAsConst(m_suppressedDiagnostics)) { + for (const SuppressedDiagnostic &diag : std::as_const(m_suppressedDiagnostics)) { QVariantMap diagMap; diagMap.insert(SETTINGS_KEY_SUPPRESSED_DIAGS_FILEPATH, diag.filePath.toString()); diagMap.insert(SETTINGS_KEY_SUPPRESSED_DIAGS_MESSAGE, diag.description); diff --git a/src/plugins/clangtools/clangtoolsutils.cpp b/src/plugins/clangtools/clangtoolsutils.cpp index 9eeaed31d4b..76c72c60ed1 100644 --- a/src/plugins/clangtools/clangtoolsutils.cpp +++ b/src/plugins/clangtools/clangtoolsutils.cpp @@ -109,7 +109,7 @@ QString createDiagnosticToolTipString( "\n" "
"); - for (const StringPair &pair : qAsConst(lines)) { + for (const StringPair &pair : std::as_const(lines)) { html += QLatin1String("
"); html += pair.first; html += QLatin1String("
"); diff --git a/src/plugins/clangtools/documentclangtoolrunner.cpp b/src/plugins/clangtools/documentclangtoolrunner.cpp index 69a9ae615c4..010c751e9fd 100644 --- a/src/plugins/clangtools/documentclangtoolrunner.cpp +++ b/src/plugins/clangtools/documentclangtoolrunner.cpp @@ -102,9 +102,9 @@ static void removeClangToolRefactorMarkers(TextEditor::TextEditorWidget *editor) void DocumentClangToolRunner::scheduleRun() { - for (DiagnosticMark *mark : qAsConst(m_marks)) + for (DiagnosticMark *mark : std::as_const(m_marks)) mark->disable(); - for (TextEditor::TextEditorWidget *editor : qAsConst(m_editorsWithMarkers)) + for (TextEditor::TextEditorWidget *editor : std::as_const(m_editorsWithMarkers)) removeClangToolRefactorMarkers(editor); m_runTimer.start(); } @@ -131,7 +131,7 @@ static FileInfo getFileInfo(const FilePath &file, Project *project) for (const ProjectPart::ConstPtr &projectPart : projectInfo->projectParts()) { QTC_ASSERT(projectPart, continue); - for (const ProjectFile &projectFile : qAsConst(projectPart->files)) { + for (const ProjectFile &projectFile : std::as_const(projectPart->files)) { QTC_ASSERT(projectFile.kind != ProjectFile::Unclassified, continue); QTC_ASSERT(projectFile.kind != ProjectFile::Unsupported, continue); if (projectFile.path == CppModelManager::configurationFileName()) diff --git a/src/plugins/clangtools/documentquickfixfactory.cpp b/src/plugins/clangtools/documentquickfixfactory.cpp index b816b9c0371..1689dd84615 100644 --- a/src/plugins/clangtools/documentquickfixfactory.cpp +++ b/src/plugins/clangtools/documentquickfixfactory.cpp @@ -56,7 +56,7 @@ void ClangToolQuickFixOperation::perform() refactoringFile->setChangeSet(changeSet); } - for (const TextEditor::RefactoringFilePtr &refactoringFile : qAsConst(refactoringFiles)) + for (const TextEditor::RefactoringFilePtr &refactoringFile : std::as_const(refactoringFiles)) refactoringFile->apply(); } diff --git a/src/plugins/clangtools/filterdialog.cpp b/src/plugins/clangtools/filterdialog.cpp index 34c40bd618b..c302c86c8ba 100644 --- a/src/plugins/clangtools/filterdialog.cpp +++ b/src/plugins/clangtools/filterdialog.cpp @@ -57,7 +57,7 @@ public: setHeader({tr("Check"), "#"}); setRootItem(new Utils::StaticTreeItem(QString())); - for (const Check &check : qAsConst(sortedChecks)) + for (const Check &check : std::as_const(sortedChecks)) m_root->appendChild(new CheckItem(check)); } }; diff --git a/src/plugins/clangtools/virtualfilesystemoverlay.cpp b/src/plugins/clangtools/virtualfilesystemoverlay.cpp index 923f7d903ba..16b3864533b 100644 --- a/src/plugins/clangtools/virtualfilesystemoverlay.cpp +++ b/src/plugins/clangtools/virtualfilesystemoverlay.cpp @@ -53,7 +53,7 @@ void VirtualFileSystemOverlay::update() newSaved[doc] = saved; } - for (const AutoSavedPath &path : qAsConst(m_saved)) { + for (const AutoSavedPath &path : std::as_const(m_saved)) { QString error; if (!path.path.removeRecursively(&error)) qCDebug(LOG) << error; @@ -79,7 +79,7 @@ void VirtualFileSystemOverlay::update() jsonRoot["type"] = "directory"; jsonRoot["name"] = root.toUserOutput(); QJsonArray contents; - for (auto doc : qAsConst(documents)) + for (auto doc : std::as_const(documents)) contents << toContent(doc); jsonRoot["contents"] = contents; jsonRoots << jsonRoot; diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index 117c5de6cbf..459ac361fbd 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -523,7 +523,7 @@ QString ClearCasePluginPrivate::ccManagesDirectory(const FilePath &directory) co if (vobs.empty()) vobs = getVobList(); - for (const QString &relativeVobDir : qAsConst(vobs)) { + for (const QString &relativeVobDir : std::as_const(vobs)) { const QString vobPath = QDir::cleanPath(rootDir + QDir::fromNativeSeparators(relativeVobDir)); const bool isManaged = (vobPath == directory.toString()) || directory.isChildOf(FilePath::fromString(vobPath)); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index 875971a1cfa..8fbea8df256 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -628,7 +628,7 @@ void CMakeBuildStep::recreateBuildTargetsModel() m_buildTargets.push_back(m_allTarget); } - for (const QString &buildTarget : qAsConst(targetList)) + for (const QString &buildTarget : std::as_const(targetList)) addItem(buildTarget, specialTargets(usesAllCapsTargets).contains(buildTarget)); updateBuildTargetsModel(); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 5157f87b6ea..4b089dff6fc 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -543,7 +543,7 @@ void CMakeBuildSystem::updateProjectData() { QSet res; QStringList apps; - for (const auto &target : qAsConst(m_buildTargets)) { + for (const auto &target : std::as_const(m_buildTargets)) { if (target.targetType == DynamicLibraryType) { res.insert(target.executable.parentDir().toString()); apps.push_back(target.executable.toUserOutput()); @@ -630,7 +630,7 @@ void CMakeBuildSystem::updateProjectData() QtSupport::KitHasMergedHeaderPathsWithQmlImportPaths::id(), false).toBool(); QStringList extraHeaderPaths; QList moduleMappings; - for (const RawProjectPart &rpp : qAsConst(rpps)) { + for (const RawProjectPart &rpp : std::as_const(rpps)) { FilePath moduleMapFile = buildConfiguration()->buildDirectory() .pathAppended("qml_module_mappings/" + rpp.buildSystemTarget); if (moduleMapFile.exists()) { diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp index 9ddeb279914..42eccdf7e06 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp @@ -448,7 +448,7 @@ private: extraGeneratorCombo->clear(); extraGeneratorCombo->addItem(Tr::tr(""), QString()); - for (const QString &eg : qAsConst(it->extraGenerators)) + for (const QString &eg : std::as_const(it->extraGenerators)) extraGeneratorCombo->addItem(eg, eg); extraGeneratorCombo->setEnabled(extraGeneratorCombo->count() > 1); diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 3e6b0ece8e4..4be73541a80 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -510,7 +510,7 @@ QList CMakeProjectImporter::examineDirectory(const FilePath &importPath, buildConfigurationTypes = buildConfigurationTypesString.split(';'); } - for (auto const &buildType: qAsConst(buildConfigurationTypes)) { + for (auto const &buildType: std::as_const(buildConfigurationTypes)) { auto data = std::make_unique(); data->cmakeHomeDirectory = @@ -745,7 +745,7 @@ void CMakeProjectPlugin::testCMakeProjectImporterQt() QFETCH(QString, expectedQmake); CMakeConfig config; - for (const QString &c : qAsConst(cache)) { + for (const QString &c : std::as_const(cache)) { const int pos = c.indexOf('='); Q_ASSERT(pos > 0); const QString key = c.left(pos); @@ -802,7 +802,7 @@ void CMakeProjectPlugin::testCMakeProjectImporterToolChain() QCOMPARE(expectedLanguages.count(), expectedToolChains.count()); CMakeConfig config; - for (const QString &c : qAsConst(cache)) { + for (const QString &c : std::as_const(cache)) { const int pos = c.indexOf('='); Q_ASSERT(pos > 0); const QString key = c.left(pos); diff --git a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp index 319e35b6858..714c90e2b70 100644 --- a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp +++ b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp @@ -321,7 +321,7 @@ void CMakeToolItemModel::removeCMakeTool(const Id &id) void CMakeToolItemModel::apply() { - for (const Id &id : qAsConst(m_removedItems)) + for (const Id &id : std::as_const(m_removedItems)) CMakeToolManager::deregisterCMakeTool(id); QList toRegister; @@ -338,7 +338,7 @@ void CMakeToolItemModel::apply() } }); - for (CMakeToolTreeItem *item : qAsConst(toRegister)) { + for (CMakeToolTreeItem *item : std::as_const(toRegister)) { CMakeTool::Detection detection = item->m_autodetected ? CMakeTool::AutoDetection : CMakeTool::ManualDetection; auto cmake = std::make_unique(detection, item->m_id); diff --git a/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp b/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp index 2d017528293..301d20dea2e 100644 --- a/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp @@ -212,7 +212,7 @@ void CMakeToolManager::listDetectedCMake(const QString &detectionSource, QString { QTC_ASSERT(logMessage, return); QStringList logMessages{Tr::tr("CMake:")}; - for (const auto &tool : qAsConst(d->m_cmakeTools)) { + for (const auto &tool : std::as_const(d->m_cmakeTools)) { if (tool->detectionSource() == detectionSource) logMessages.append(tool->displayName()); } diff --git a/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp b/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp index 176334a57eb..362c62c7b1f 100644 --- a/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp @@ -68,7 +68,7 @@ static std::vector> autoDetectCMakeTools() const QStringList execs = env.appendExeExtensions(QLatin1String("cmake")); FilePaths suspects; - for (const FilePath &base : qAsConst(path)) { + for (const FilePath &base : std::as_const(path)) { if (base.isEmpty()) continue; @@ -80,7 +80,7 @@ static std::vector> autoDetectCMakeTools() } std::vector> found; - for (const FilePath &command : qAsConst(suspects)) { + for (const FilePath &command : std::as_const(suspects)) { auto item = std::make_unique(CMakeTool::AutoDetection, CMakeTool::createId()); item->setFilePath(command); item->setDisplayName(Tr::tr("System CMake at %1").arg(command.toUserOutput())); diff --git a/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp b/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp index d12b91438e7..812b4ff999d 100644 --- a/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp +++ b/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp @@ -44,7 +44,7 @@ QWidget *ConfigModelItemDelegate::createEditor(QWidget *parent, const QStyleOpti edit->setAttribute(Qt::WA_MacSmallSize); edit->setFocusPolicy(Qt::StrongFocus); edit->setAutoFillBackground(true); - for (const QString &s : qAsConst(data.values)) + for (const QString &s : std::as_const(data.values)) edit->addItem(s); return edit; } else if (data.type == ConfigModel::DataItem::BOOLEAN) { diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp index df4b37814c4..43243be7ada 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp +++ b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp @@ -329,7 +329,7 @@ Command *ActionContainerPrivate::addSeparator(const Context &context, Id group, void ActionContainerPrivate::clear() { for (Group &group : m_groups) { - for (QObject *item : qAsConst(group.items)) { + for (QObject *item : std::as_const(group.items)) { if (auto command = qobject_cast(item)) { removeAction(command); disconnect(command, &Command::activeStateChanged, @@ -458,8 +458,8 @@ bool MenuActionContainer::updateInternal() bool hasitems = false; QList actions = m_menu->actions(); - for (const Group &group : qAsConst(m_groups)) { - for (QObject *item : qAsConst(group.items)) { + for (const Group &group : std::as_const(m_groups)) { + for (QObject *item : std::as_const(group.items)) { if (auto container = qobject_cast(item)) { actions.removeAll(container->menu()->menuAction()); if (container == this) { @@ -491,7 +491,7 @@ bool MenuActionContainer::updateInternal() } if (!hasitems) { // look if there were actions added that we don't control and check if they are enabled - for (const QAction *action : qAsConst(actions)) { + for (const QAction *action : std::as_const(actions)) { if (!action->isSeparator() && action->isEnabled()) { hasitems = true; break; diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.cpp b/src/plugins/coreplugin/actionmanager/actionmanager.cpp index 24ce6591a86..6404d6a4000 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager.cpp +++ b/src/plugins/coreplugin/actionmanager/actionmanager.cpp @@ -421,7 +421,7 @@ ActionManagerPrivate::ActionManagerPrivate() = default; ActionManagerPrivate::~ActionManagerPrivate() { // first delete containers to avoid them reacting to command deletion - for (const ActionContainerPrivate *container : qAsConst(m_idContainerMap)) + for (const ActionContainerPrivate *container : std::as_const(m_idContainerMap)) disconnect(container, &QObject::destroyed, this, &ActionManagerPrivate::containerDestroyed); qDeleteAll(m_idContainerMap); qDeleteAll(m_idCmdMap); diff --git a/src/plugins/coreplugin/actionmanager/commandsfile.cpp b/src/plugins/coreplugin/actionmanager/commandsfile.cpp index ec41d235ec7..c945a694fa5 100644 --- a/src/plugins/coreplugin/actionmanager/commandsfile.cpp +++ b/src/plugins/coreplugin/actionmanager/commandsfile.cpp @@ -109,7 +109,7 @@ bool CommandsFile::exportCommands(const QList &items) arg(ICore::versionString(), QDateTime::currentDateTime().toString(Qt::ISODate))); w.writeStartElement(ctx.mappingElement); - for (const ShortcutItem *item : qAsConst(items)) { + for (const ShortcutItem *item : std::as_const(items)) { const Id id = item->m_cmd->id(); if (item->m_keys.isEmpty() || item->m_keys.first().isEmpty()) { w.writeEmptyElement(ctx.shortCutElement); diff --git a/src/plugins/coreplugin/actionsfilter.cpp b/src/plugins/coreplugin/actionsfilter.cpp index 3c3153cdd42..82099eda581 100644 --- a/src/plugins/coreplugin/actionsfilter.cpp +++ b/src/plugins/coreplugin/actionsfilter.cpp @@ -155,7 +155,7 @@ QList ActionsFilter::matchesFor(QFutureInterface> filtered; - const QList> filterResults = Utils::map(qAsConst(m_entries), filter) + const QList> filterResults = Utils::map(std::as_const(m_entries), filter) .results(); for (const std::optional &filterResult : filterResults) { if (filterResult) @@ -163,7 +163,7 @@ QList ActionsFilter::matchesFor(QFutureInterface result; - for (const QList &sublist : qAsConst(filtered)) + for (const QList &sublist : std::as_const(filtered)) result << sublist; return result; } @@ -292,7 +292,7 @@ void ActionsFilter::updateEnabledActionCache() { m_enabledActions.clear(); QList queue = menuBarActions(); - for (QAction *action : qAsConst(queue)) + for (QAction *action : std::as_const(queue)) requestMenuUpdate(action); while (!queue.isEmpty()) { QAction *action = queue.takeFirst(); diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index 2a9cdef67b8..4fb4f7dee49 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -31,7 +31,7 @@ BaseFileWizard::BaseFileWizard(const BaseFileWizardFactory *factory, m_extraValues(extraValues), m_factory(factory) { - for (IFileWizardExtension *extension : qAsConst(g_fileWizardExtensions)) + for (IFileWizardExtension *extension : std::as_const(g_fileWizardExtensions)) m_extensionPages += extension->extensionPages(factory); if (!m_extensionPages.empty()) @@ -44,7 +44,7 @@ void BaseFileWizard::initializePage(int id) if (page(id) == m_firstExtensionPage) { generateFileList(); - for (IFileWizardExtension *ex : qAsConst(g_fileWizardExtensions)) + for (IFileWizardExtension *ex : std::as_const(g_fileWizardExtensions)) ex->firstExtensionPageShown(m_files, m_extraValues); } } @@ -74,7 +74,7 @@ void BaseFileWizard::accept() break; } - for (IFileWizardExtension *ex : qAsConst(g_fileWizardExtensions)) { + for (IFileWizardExtension *ex : std::as_const(g_fileWizardExtensions)) { for (int i = 0; i < m_files.count(); i++) { ex->applyCodeStyle(&m_files[i]); } @@ -89,7 +89,7 @@ void BaseFileWizard::accept() bool removeOpenProjectAttribute = false; // Run the extensions - for (IFileWizardExtension *ex : qAsConst(g_fileWizardExtensions)) { + for (IFileWizardExtension *ex : std::as_const(g_fileWizardExtensions)) { bool remove; if (!ex->processFiles(m_files, &remove, &errorMessage)) { if (!errorMessage.isEmpty()) diff --git a/src/plugins/coreplugin/basefilewizardfactory.cpp b/src/plugins/coreplugin/basefilewizardfactory.cpp index ce9807f6076..ff23b143af7 100644 --- a/src/plugins/coreplugin/basefilewizardfactory.cpp +++ b/src/plugins/coreplugin/basefilewizardfactory.cpp @@ -130,7 +130,7 @@ bool BaseFileWizardFactory::writeFiles(const GeneratedFiles &files, QString *err { const GeneratedFile::Attributes noWriteAttributes = GeneratedFile::CustomGeneratorAttribute|GeneratedFile::KeepExistingFileAttribute; - for (const GeneratedFile &generatedFile : qAsConst(files)) + for (const GeneratedFile &generatedFile : std::as_const(files)) if (!(generatedFile.attributes() & noWriteAttributes )) if (!generatedFile.write(errorMessage)) return false; @@ -164,7 +164,7 @@ bool BaseFileWizardFactory::postGenerateFiles(const QWizard *, const GeneratedFi bool BaseFileWizardFactory::postGenerateOpenEditors(const GeneratedFiles &l, QString *errorMessage) { - for (const GeneratedFile &file : qAsConst(l)) { + for (const GeneratedFile &file : std::as_const(l)) { if (file.attributes() & GeneratedFile::OpenEditorAttribute) { if (!EditorManager::openEditor(file.filePath(), file.editorId())) { if (errorMessage) @@ -197,7 +197,7 @@ BaseFileWizardFactory::OverwriteResult BaseFileWizardFactory::promptOverwrite(Ge static const QString directoryMsg = tr("[folder]"); static const QString symLinkMsg = tr("[symbolic link]"); - for (const GeneratedFile &file : qAsConst(*files)) { + for (const GeneratedFile &file : std::as_const(*files)) { const FilePath path = file.filePath(); if (path.exists()) existingFiles.append(path.toString()); @@ -209,7 +209,7 @@ BaseFileWizardFactory::OverwriteResult BaseFileWizardFactory::promptOverwrite(Ge // Format a file list message as ( " [readonly], [folder]"). const QString commonExistingPath = Utils::commonPath(existingFiles); QString fileNamesMsgPart; - for (const QString &fileName : qAsConst(existingFiles)) { + for (const QString &fileName : std::as_const(existingFiles)) { const QFileInfo fi(fileName); if (fi.exists()) { if (!fileNamesMsgPart.isEmpty()) @@ -243,7 +243,7 @@ BaseFileWizardFactory::OverwriteResult BaseFileWizardFactory::promptOverwrite(Ge PromptOverwriteDialog overwriteDialog; // Scripts cannot handle overwrite overwriteDialog.setFiles(existingFiles); - for (const GeneratedFile &file : qAsConst(*files)) + for (const GeneratedFile &file : std::as_const(*files)) if (file.attributes() & GeneratedFile::CustomGeneratorAttribute) overwriteDialog.setFileEnabled(file.filePath().toString(), false); if (overwriteDialog.exec() != QDialog::Accepted) @@ -252,7 +252,7 @@ BaseFileWizardFactory::OverwriteResult BaseFileWizardFactory::promptOverwrite(Ge if (existingFilesToKeep.size() == files->size()) // All exist & all unchecked->Cancel. return OverwriteCanceled; // Set 'keep' attribute in files - for (const QString &keepFile : qAsConst(existingFilesToKeep)) { + for (const QString &keepFile : std::as_const(existingFilesToKeep)) { const int i = indexOfFile(*files, FilePath::fromString(keepFile).cleanPath()); QTC_ASSERT(i != -1, return OverwriteCanceled); GeneratedFile &file = (*files)[i]; diff --git a/src/plugins/coreplugin/designmode.cpp b/src/plugins/coreplugin/designmode.cpp index 480e8b0ee5c..101b8880563 100644 --- a/src/plugins/coreplugin/designmode.cpp +++ b/src/plugins/coreplugin/designmode.cpp @@ -118,7 +118,7 @@ void DesignMode::registerDesignWidget(QWidget *widget, void DesignMode::unregisterDesignWidget(QWidget *widget) { d->m_stackWidget->removeWidget(widget); - for (DesignEditorInfo *info : qAsConst(d->m_editors)) { + for (DesignEditorInfo *info : std::as_const(d->m_editors)) { if (info->widget == widget) { d->m_editors.removeAll(info); delete info; @@ -138,7 +138,7 @@ void DesignMode::currentEditorChanged(IEditor *editor) if (editor) { const QString mimeType = editor->document()->mimeType(); if (!mimeType.isEmpty()) { - for (const DesignEditorInfo *editorInfo : qAsConst(d->m_editors)) { + for (const DesignEditorInfo *editorInfo : std::as_const(d->m_editors)) { for (const QString &mime : editorInfo->mimeTypes) { if (mime == mimeType) { d->m_stackWidget->setCurrentIndex(editorInfo->widgetIndex); diff --git a/src/plugins/coreplugin/dialogs/codecselector.cpp b/src/plugins/coreplugin/dialogs/codecselector.cpp index 6bb91779249..6cdade2d0b4 100644 --- a/src/plugins/coreplugin/dialogs/codecselector.cpp +++ b/src/plugins/coreplugin/dialogs/codecselector.cpp @@ -55,15 +55,15 @@ CodecSelector::CodecSelector(QWidget *parent, Core::BaseTextDocument *doc) QList mibs = QTextCodec::availableMibs(); Utils::sort(mibs); QList sortedMibs; - for (const int mib : qAsConst(mibs)) + for (const int mib : std::as_const(mibs)) if (mib >= 0) sortedMibs += mib; - for (const int mib : qAsConst(mibs)) + for (const int mib : std::as_const(mibs)) if (mib < 0) sortedMibs += mib; int currentIndex = -1; - for (const int mib : qAsConst(sortedMibs)) { + for (const int mib : std::as_const(sortedMibs)) { QTextCodec *c = QTextCodec::codecForMib(mib); if (!doc->supportsCodec(c)) continue; diff --git a/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp b/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp index 835b63f8147..d9d03501d0f 100644 --- a/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp +++ b/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp @@ -876,7 +876,7 @@ void ExternalToolConfig::apply() resultMap.insert(it.key(), items); } // Remove tools that have been deleted from the settings (and are no preset) - for (const ExternalTool *tool : qAsConst(originalTools)) { + for (const ExternalTool *tool : std::as_const(originalTools)) { QTC_ASSERT(!tool->preset(), continue); // TODO error handling tool->fileName().removeFile(); diff --git a/src/plugins/coreplugin/dialogs/newdialogwidget.cpp b/src/plugins/coreplugin/dialogs/newdialogwidget.cpp index 634a36128d2..ff9995295eb 100644 --- a/src/plugins/coreplugin/dialogs/newdialogwidget.cpp +++ b/src/plugins/coreplugin/dialogs/newdialogwidget.cpp @@ -307,7 +307,7 @@ void NewDialogWidget::setWizardFactories(QList factories, if (!showPlatformFilter) m_comboBox->hide(); - for (IWizardFactory *factory : qAsConst(factories)) { + for (IWizardFactory *factory : std::as_const(factories)) { QStandardItem *kindItem; switch (factory->kind()) { case IWizardFactory::ProjectWizard: @@ -342,7 +342,7 @@ void NewDialogWidget::showDialog() static_cast(m_filterProxyModel)->manualReset(); if (!lastCategory.isEmpty()) - for (QStandardItem *item : qAsConst(m_categoryItems)) { + for (QStandardItem *item : std::as_const(m_categoryItems)) { if (item->data(Qt::UserRole) == lastCategory) idx = m_filterProxyModel->mapFromSource(m_model->indexFromItem(item)); } diff --git a/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp b/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp index 76d9b9d1dee..4e0db083bee 100644 --- a/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp +++ b/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp @@ -108,7 +108,7 @@ ReadOnlyFilesDialogPrivate::ReadOnlyFilesDialogPrivate(ReadOnlyFilesDialog *pare ReadOnlyFilesDialogPrivate::~ReadOnlyFilesDialogPrivate() { - for (const ButtonGroupForFile &groupForFile : qAsConst(buttonGroups)) + for (const ButtonGroupForFile &groupForFile : std::as_const(buttonGroups)) delete groupForFile.group; } @@ -282,7 +282,7 @@ int ReadOnlyFilesDialog::exec() ReadOnlyResult result = RO_Cancel; FilePaths failedToMakeWritable; for (const ReadOnlyFilesDialogPrivate::ButtonGroupForFile &buttongroup - : qAsConst(d->buttonGroups)) { + : std::as_const(d->buttonGroups)) { result = static_cast(buttongroup.group->checkedId()); switch (result) { case RO_MakeWritable: @@ -356,7 +356,7 @@ void ReadOnlyFilesDialogPrivate::setAll(int index) // Check for every file if the selected operation is available and change it to the operation. for (const ReadOnlyFilesDialogPrivate::ButtonGroupForFile &groupForFile : - qAsConst(buttonGroups)) { + std::as_const(buttonGroups)) { auto radioButton = qobject_cast(groupForFile.group->button(type)); if (radioButton) radioButton->setChecked(true); @@ -372,7 +372,7 @@ void ReadOnlyFilesDialogPrivate::updateSelectAll() { int selectedOperation = -1; for (const ReadOnlyFilesDialogPrivate::ButtonGroupForFile &groupForFile : - qAsConst(buttonGroups)) { + std::as_const(buttonGroups)) { if (selectedOperation == -1) { selectedOperation = groupForFile.group->checkedId(); } else if (selectedOperation != groupForFile.group->checkedId()) { diff --git a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp index 8ad7b8e7492..25e77a77785 100644 --- a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp @@ -144,7 +144,7 @@ void SaveItemsDialog::adjustButtonWidths() possibleTexts << tr("Save Selected"); int maxTextWidth = 0; QPushButton *saveButton = m_buttonBox->button(QDialogButtonBox::Save); - for (const QString &text : qAsConst(possibleTexts)) { + for (const QString &text : std::as_const(possibleTexts)) { saveButton->setText(text); int hint = saveButton->sizeHint().width(); if (hint > maxTextWidth) diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index 2f377e9e7c0..d4a65df5de5 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -195,11 +195,11 @@ void CategoryModel::ensurePages(Category *category) { if (!category->providerPagesCreated) { QList createdPages; - for (const IOptionsPageProvider *provider : qAsConst(category->providers)) + for (const IOptionsPageProvider *provider : std::as_const(category->providers)) createdPages += provider->pages(); // check for duplicate ids - for (const IOptionsPage *page : qAsConst(createdPages)) { + for (const IOptionsPage *page : std::as_const(createdPages)) { QTC_ASSERT(!m_pageIds.contains(page->id()), qWarning("duplicate options page id '%s'", qPrintable(page->id().toString()))); } @@ -585,7 +585,7 @@ void SettingsDialog::ensureCategoryWidget(Category *category) m_model.ensurePages(category); auto tabWidget = new QTabWidget; tabWidget->tabBar()->setObjectName("qc_settings_main_tabbar"); // easier lookup in Squish - for (IOptionsPage *page : qAsConst(category->pages)) { + for (IOptionsPage *page : std::as_const(category->pages)) { QWidget *widget = page->widget(); ICore::setupScreenShooter(page->displayName(), widget); auto ssa = new SmartScrollArea(this); @@ -677,9 +677,9 @@ void SettingsDialog::accept() m_finished = true; disconnectTabWidgets(); m_applied = true; - for (IOptionsPage *page : qAsConst(m_visitedPages)) + for (IOptionsPage *page : std::as_const(m_visitedPages)) page->apply(); - for (IOptionsPage *page : qAsConst(m_pages)) + for (IOptionsPage *page : std::as_const(m_pages)) page->finish(); done(QDialog::Accepted); } @@ -690,14 +690,14 @@ void SettingsDialog::reject() return; m_finished = true; disconnectTabWidgets(); - for (IOptionsPage *page : qAsConst(m_pages)) + for (IOptionsPage *page : std::as_const(m_pages)) page->finish(); done(QDialog::Rejected); } void SettingsDialog::apply() { - for (IOptionsPage *page : qAsConst(m_visitedPages)) + for (IOptionsPage *page : std::as_const(m_visitedPages)) page->apply(); m_applied = true; } diff --git a/src/plugins/coreplugin/dialogs/shortcutsettings.cpp b/src/plugins/coreplugin/dialogs/shortcutsettings.cpp index 28db3a02a9b..0052ddf6e9f 100644 --- a/src/plugins/coreplugin/dialogs/shortcutsettings.cpp +++ b/src/plugins/coreplugin/dialogs/shortcutsettings.cpp @@ -306,7 +306,7 @@ QWidget *ShortcutSettings::widget() void ShortcutSettingsWidget::apply() { - for (const ShortcutItem *item : qAsConst(m_scitems)) + for (const ShortcutItem *item : std::as_const(m_scitems)) item->m_cmd->setKeySequences(item->m_keys); } @@ -474,7 +474,7 @@ void ShortcutSettingsWidget::importAction() CommandsFile cf(fileName); QMap> mapping = cf.importCommands(); - for (ShortcutItem *item : qAsConst(m_scitems)) { + for (ShortcutItem *item : std::as_const(m_scitems)) { QString sid = item->m_cmd->id().toString(); if (mapping.contains(sid)) { item->m_keys = mapping.value(sid); @@ -494,7 +494,7 @@ void ShortcutSettingsWidget::importAction() void ShortcutSettingsWidget::defaultAction() { - for (ShortcutItem *item : qAsConst(m_scitems)) { + for (ShortcutItem *item : std::as_const(m_scitems)) { item->m_keys = item->m_cmd->defaultKeySequences(); item->m_item->setText(2, keySequencesToNativeString(item->m_keys)); setModified(item->m_item, false); @@ -580,7 +580,7 @@ bool ShortcutSettingsWidget::markCollisions(ShortcutItem *item, int index) Id globalId(Constants::C_GLOBAL); const Context itemContext = item->m_cmd->context(); const bool itemHasGlobalContext = itemContext.contains(globalId); - for (ShortcutItem *currentItem : qAsConst(m_scitems)) { + for (ShortcutItem *currentItem : std::as_const(m_scitems)) { if (item == currentItem) continue; if (!Utils::anyOf(currentItem->m_keys, Utils::equalTo(key))) @@ -613,7 +613,7 @@ bool ShortcutSettingsWidget::markCollisions(ShortcutItem *item, int index) void ShortcutSettingsWidget::markAllCollisions() { - for (ShortcutItem *item : qAsConst(m_scitems)) + for (ShortcutItem *item : std::as_const(m_scitems)) for (int i = 0; i < item->m_keys.size(); ++i) markCollisions(item, i); } diff --git a/src/plugins/coreplugin/documentmanager.cpp b/src/plugins/coreplugin/documentmanager.cpp index 13698bb50f2..c19e65366b5 100644 --- a/src/plugins/coreplugin/documentmanager.cpp +++ b/src/plugins/coreplugin/documentmanager.cpp @@ -477,7 +477,7 @@ void DocumentManager::renamedFile(const Utils::FilePath &from, const Utils::File } // rename the IDocuments - for (IDocument *document : qAsConst(documentsToRename)) { + for (IDocument *document : std::as_const(documentsToRename)) { d->m_blockedIDocument = document; removeFileInfo(document); document->setFilePath(to); @@ -572,7 +572,7 @@ QList DocumentManager::modifiedDocuments() modified << document; } - for (IDocument *document : qAsConst(d->m_documentsWithoutWatch)) { + for (IDocument *document : std::as_const(d->m_documentsWithoutWatch)) { if (document->isModified()) modified << document; } @@ -682,7 +682,7 @@ static bool saveModifiedFilesHelper(const QList &documents, } // Check for files without write permissions. QList roDocuments; - for (IDocument *document : qAsConst(documentsToSave)) { + for (IDocument *document : std::as_const(documentsToSave)) { if (document->isFileReadOnly()) roDocuments << document; } @@ -699,7 +699,7 @@ static bool saveModifiedFilesHelper(const QList &documents, return false; } } - for (IDocument *document : qAsConst(documentsToSave)) { + for (IDocument *document : std::as_const(documentsToSave)) { if (!EditorManagerPrivate::saveDocument(document)) { if (cancelled) *cancelled = true; @@ -1088,7 +1088,7 @@ void DocumentManager::checkForReload() QMap currentStates; QMap changeTypes; QSet changedIDocuments; - for (const FilePath &filePath : qAsConst(d->m_changedFiles)) { + for (const FilePath &filePath : std::as_const(d->m_changedFiles)) { const FilePath fileKey = filePathKey(filePath, KeepLinks); qCDebug(log) << "handling file change for" << filePath << "(" << fileKey << ")"; IDocument::ChangeType type = IDocument::TypeContents; @@ -1119,7 +1119,7 @@ void DocumentManager::checkForReload() // if the resolved names are different when unexpectFileChange is called // we would end up with never-unexpected file names QSet expectedFileKeys; - for (const FilePath &filePath : qAsConst(d->m_expectedFileNames)) { + for (const FilePath &filePath : std::as_const(d->m_expectedFileNames)) { const FilePath cleanAbsFilePath = filePathKey(filePath, KeepLinks); expectedFileKeys.insert(filePathKey(filePath, KeepLinks)); const FilePath resolvedCleanAbsFilePath = cleanAbsFilePath.canonicalPath(); @@ -1130,7 +1130,7 @@ void DocumentManager::checkForReload() // handle the IDocuments QStringList errorStrings; QStringList filesToDiff; - for (IDocument *document : qAsConst(changedIDocuments)) { + for (IDocument *document : std::as_const(changedIDocuments)) { IDocument::ChangeTrigger trigger = IDocument::TriggerInternal; std::optional type; bool changed = false; @@ -1355,7 +1355,7 @@ void DocumentManager::saveSettings() { QVariantList recentFiles; QStringList recentEditorIds; - for (const RecentFile &file : qAsConst(d->m_recentFiles)) { + for (const RecentFile &file : std::as_const(d->m_recentFiles)) { recentFiles.append(file.first.toVariant()); recentEditorIds.append(file.second.toString()); } diff --git a/src/plugins/coreplugin/editormanager/documentmodel.cpp b/src/plugins/coreplugin/editormanager/documentmodel.cpp index b9777b48da2..c154ebb551e 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.cpp +++ b/src/plugins/coreplugin/editormanager/documentmodel.cpp @@ -474,7 +474,7 @@ void DocumentModelPrivate::removeAllSuspendedEntries(PinnedFileRemovalPolicy pin d->m_entryByFixedPath.remove(fixedPath); } QSet displayNames; - for (DocumentModel::Entry *entry : qAsConst(d->m_entries)) { + for (DocumentModel::Entry *entry : std::as_const(d->m_entries)) { const QString displayName = entry->plainDisplayName(); if (displayNames.contains(displayName)) continue; diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 5480e95bae6..54622fcaf73 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -891,7 +891,7 @@ IEditor *EditorManagerPrivate::openEditor(EditorView *view, const FilePath &file auto button = qobject_cast(msgbox.button(QMessageBox::Open)); QTC_ASSERT(button, return nullptr); auto menu = new QMenu(button); - for (EditorType *factory : qAsConst(factories)) { + for (EditorType *factory : std::as_const(factories)) { QAction *action = menu->addAction(factory->displayName()); connect(action, &QAction::triggered, &msgbox, [&selectedFactory, factory, &msgbox]() { selectedFactory = factory; @@ -969,7 +969,7 @@ IEditor *EditorManagerPrivate::openEditorWith(const FilePath &filePath, Id edito views.prepend(currentView); // open editor in current view first } EditorManager::OpenEditorFlags flags; - for (EditorView *view : qAsConst(views)) { + for (EditorView *view : std::as_const(views)) { IEditor *editor = EditorManagerPrivate::openEditor(view, filePath, editorId, flags); if (!openedEditor && editor) openedEditor = editor; @@ -1128,7 +1128,7 @@ void EditorManagerPrivate::showPopupOrSelectDocument() // if the active window has editors, we want that editor area as a reference // TODO: this does not work correctly with multiple editor areas in the same window EditorArea *activeEditorArea = nullptr; - for (EditorArea *area : qAsConst(d->m_editorAreas)) { + for (EditorArea *area : std::as_const(d->m_editorAreas)) { if (area->window() == activeWindow) { activeEditorArea = area; break; @@ -1629,7 +1629,7 @@ bool EditorManagerPrivate::closeEditors(const QList &editors, CloseFla // 2. keep track of the document and all the editors that might remain open for it QSet acceptedEditors; QHash > editorsForDocuments; - for (IEditor *editor : qAsConst(editors)) { + for (IEditor *editor : std::as_const(editors)) { bool editorAccepted = true; const QList> listeners = d->m_closeEditorListeners; for (const std::function &listener : listeners) { @@ -1676,7 +1676,7 @@ bool EditorManagerPrivate::closeEditors(const QList &editors, CloseFla return false; // save editor states - for (IEditor *editor : qAsConst(acceptedEditors)) { + for (IEditor *editor : std::as_const(acceptedEditors)) { if (!editor->document()->filePath().isEmpty() && !editor->document()->isTemporary()) { QByteArray state = editor->saveState(); if (!state.isEmpty()) @@ -1690,7 +1690,7 @@ bool EditorManagerPrivate::closeEditors(const QList &editors, CloseFla // and sort them per view, so we can remove them from views in an orderly // manner. QMultiHash editorsPerView; - for (IEditor *editor : qAsConst(acceptedEditors)) { + for (IEditor *editor : std::as_const(acceptedEditors)) { emit m_instance->editorAboutToClose(editor); removeEditor(editor, flag != CloseFlag::Suspend); if (EditorView *view = viewForEditor(editor)) { @@ -1723,7 +1723,7 @@ bool EditorManagerPrivate::closeEditors(const QList &editors, CloseFla return true; return false; }); - for (EditorView *view : qAsConst(views)) { + for (EditorView *view : std::as_const(views)) { QList editors = editorsPerView.values(view); // handle current editor in view last IEditor *viewCurrentEditor = view->currentEditor(); @@ -1731,7 +1731,7 @@ bool EditorManagerPrivate::closeEditors(const QList &editors, CloseFla editors.removeAll(viewCurrentEditor); editors.append(viewCurrentEditor); } - for (IEditor *editor : qAsConst(editors)) { + for (IEditor *editor : std::as_const(editors)) { if (editor == viewCurrentEditor && view == views.last()) { // Avoid removing the globally current editor from its view, // set a new current editor before. @@ -2602,7 +2602,7 @@ void EditorManagerPrivate::autoSuspendDocuments() &IEditor::document); int keptEditorCount = 0; QList documentsToSuspend; - for (const EditLocation &editLocation : qAsConst(d->m_globalHistory)) { + for (const EditLocation &editLocation : std::as_const(d->m_globalHistory)) { IDocument *document = editLocation.document; if (!document || !document->isSuspendAllowed() || document->isModified() || document->isTemporary() || document->filePath().isEmpty() @@ -2690,7 +2690,7 @@ EditorView *EditorManagerPrivate::currentEditorView() } QTC_CHECK(view); if (!view) { // should not happen, we should always have either currentview or currentdocument - for (const EditorArea *area : qAsConst(d->m_editorAreas)) { + for (const EditorArea *area : std::as_const(d->m_editorAreas)) { if (area->window()->isActiveWindow()) { view = area->findFirstView(); break; @@ -2705,7 +2705,7 @@ EditorView *EditorManagerPrivate::currentEditorView() QList EditorManagerPrivate::allEditorViews() { QList views; - for (const EditorArea *area : qAsConst(d->m_editorAreas)) { + for (const EditorArea *area : std::as_const(d->m_editorAreas)) { EditorView *firstView = area->findFirstView(); EditorView *view = firstView; if (view) { @@ -3639,7 +3639,7 @@ bool EditorManager::restoreState(const QByteArray &state) // restore windows QVector windowStates; stream >> windowStates; - for (const QVariantHash &windowState : qAsConst(windowStates)) { + for (const QVariantHash &windowState : std::as_const(windowStates)) { EditorWindow *window = d->createEditorWindow(); window->restoreState(windowState); window->show(); @@ -3804,7 +3804,7 @@ void EditorManager::setSessionTitleHandler(WindowTitleHandler handler) */ void EditorManager::updateWindowTitles() { - for (EditorArea *area : qAsConst(d->m_editorAreas)) + for (EditorArea *area : std::as_const(d->m_editorAreas)) emit area->windowTitleNeedsUpdate(); } diff --git a/src/plugins/coreplugin/fancytabwidget.cpp b/src/plugins/coreplugin/fancytabwidget.cpp index 10b751dbf9c..fd788c36c8c 100644 --- a/src/plugins/coreplugin/fancytabwidget.cpp +++ b/src/plugins/coreplugin/fancytabwidget.cpp @@ -75,7 +75,7 @@ QSize FancyTabBar::tabSizeHint(bool minimum) const const int spacing = 8; const int width = 60 + spacing + 2; int maxLabelwidth = 0; - for (auto tab : qAsConst(m_tabs)) { + for (auto tab : std::as_const(m_tabs)) { const int width = fm.horizontalAdvance(tab->text); if (width > maxLabelwidth) maxLabelwidth = width; @@ -155,7 +155,7 @@ void FancyTabBar::leaveEvent(QEvent *event) Q_UNUSED(event) m_hoverIndex = -1; m_hoverRect = QRect(); - for (auto tab : qAsConst(m_tabs)) + for (auto tab : std::as_const(m_tabs)) tab->fadeOut(); } diff --git a/src/plugins/coreplugin/find/findplugin.cpp b/src/plugins/coreplugin/find/findplugin.cpp index 2d844455593..6c3d03294a2 100644 --- a/src/plugins/coreplugin/find/findplugin.cpp +++ b/src/plugins/coreplugin/find/findplugin.cpp @@ -301,7 +301,7 @@ void FindPrivate::setupFilterMenuItems() const Id base("FindFilter."); QList sortedFilters = IFindFilter::allFindFilters(); Utils::sort(sortedFilters, &IFindFilter::displayName); - for (IFindFilter *filter : qAsConst(sortedFilters)) { + for (IFindFilter *filter : std::as_const(sortedFilters)) { QAction *action = new QAction(filterActionName(filter), this); bool isEnabled = filter->isEnabled(); if (isEnabled) diff --git a/src/plugins/coreplugin/find/findtoolwindow.cpp b/src/plugins/coreplugin/find/findtoolwindow.cpp index 1650d9bb538..a543da5d87a 100644 --- a/src/plugins/coreplugin/find/findtoolwindow.cpp +++ b/src/plugins/coreplugin/find/findtoolwindow.cpp @@ -228,7 +228,7 @@ void FindToolWindow::setFindFilters(const QList &filters) { qDeleteAll(m_configWidgets); m_configWidgets.clear(); - for (IFindFilter *filter : qAsConst(m_filters)) + for (IFindFilter *filter : std::as_const(m_filters)) filter->disconnect(this); m_filters = filters; m_filterList->clear(); @@ -353,7 +353,7 @@ void FindToolWindow::writeSettings() settings->beginGroup("Find"); settings->setValueWithDefault("CurrentFilter", m_currentFilter ? m_currentFilter->id() : QString()); - for (IFindFilter *filter : qAsConst(m_filters)) + for (IFindFilter *filter : std::as_const(m_filters)) filter->writeSettings(settings); settings->endGroup(); } diff --git a/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp b/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp index 56647e05090..75736bb6810 100644 --- a/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp +++ b/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp @@ -188,7 +188,7 @@ void HighlightScrollBarOverlay::drawHighlights(QPainter *painter, const double lineHeight = m_highlightController->lineHeight(); - for (const QMap> &colors : qAsConst(m_highlightCache)) { + for (const QMap> &colors : std::as_const(m_highlightCache)) { const auto itColorEnd = colors.constEnd(); for (auto itColor = colors.constBegin(); itColor != itColorEnd; ++itColor) { const QColor &color = creatorTheme()->color(itColor.key()); diff --git a/src/plugins/coreplugin/find/searchresulttreemodel.cpp b/src/plugins/coreplugin/find/searchresulttreemodel.cpp index 30fd5e56e5b..0080e0baf22 100644 --- a/src/plugins/coreplugin/find/searchresulttreemodel.cpp +++ b/src/plugins/coreplugin/find/searchresulttreemodel.cpp @@ -457,7 +457,7 @@ QList SearchResultTreeModel::addResults(const QList pathIndices; - for (SearchResultTreeItem *item : qAsConst(pathNodes)) + for (SearchResultTreeItem *item : std::as_const(pathNodes)) pathIndices << index(item); return pathIndices; } diff --git a/src/plugins/coreplugin/find/searchresultwindow.cpp b/src/plugins/coreplugin/find/searchresultwindow.cpp index d4bd1d98f46..acdc526539e 100644 --- a/src/plugins/coreplugin/find/searchresultwindow.cpp +++ b/src/plugins/coreplugin/find/searchresultwindow.cpp @@ -519,7 +519,7 @@ void SearchResultWindow::clearContents() for (int i = d->m_recentSearchesBox->count() - 1; i > 0 /* don't want i==0 */; --i) d->m_recentSearchesBox->removeItem(i); } - for (Internal::SearchResultWidget *widget : qAsConst(d->m_searchResultWidgets)) + for (Internal::SearchResultWidget *widget : std::as_const(d->m_searchResultWidgets)) widget->notifyVisibilityChanged(false); qDeleteAll(d->m_searchResultWidgets); d->m_searchResultWidgets.clear(); @@ -573,7 +573,7 @@ void SearchResultWindow::setTextEditorFont(const QFont &font, const SearchResult { d->m_font = font; d->m_colors = colors; - for (Internal::SearchResultWidget *widget : qAsConst(d->m_searchResultWidgets)) + for (Internal::SearchResultWidget *widget : std::as_const(d->m_searchResultWidgets)) widget->setTextEditorFont(font, colors); } @@ -583,7 +583,7 @@ void SearchResultWindow::setTextEditorFont(const QFont &font, const SearchResult void SearchResultWindow::setTabWidth(int tabWidth) { d->m_tabWidth = tabWidth; - for (Internal::SearchResultWidget *widget : qAsConst(d->m_searchResultWidgets)) + for (Internal::SearchResultWidget *widget : std::as_const(d->m_searchResultWidgets)) widget->setTabWidth(tabWidth); } /*! diff --git a/src/plugins/coreplugin/foldernavigationwidget.cpp b/src/plugins/coreplugin/foldernavigationwidget.cpp index 70f3c689249..226629386f6 100644 --- a/src/plugins/coreplugin/foldernavigationwidget.cpp +++ b/src/plugins/coreplugin/foldernavigationwidget.cpp @@ -800,7 +800,7 @@ FolderNavigationWidgetFactory::FolderNavigationWidgetFactory() Core::NavigationView FolderNavigationWidgetFactory::createWidget() { auto fnw = new FolderNavigationWidget; - for (const RootDirectory &root : qAsConst(m_rootDirectories)) + for (const RootDirectory &root : std::as_const(m_rootDirectories)) fnw->insertRootDirectory(root); connect(this, &FolderNavigationWidgetFactory::rootDirectoryAdded, diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp index 6af6e5b49d9..81aa475ab98 100644 --- a/src/plugins/coreplugin/generalsettings.cpp +++ b/src/plugins/coreplugin/generalsettings.cpp @@ -246,7 +246,7 @@ void GeneralSettingsWidget::fillCodecBox() const QByteArrayList codecs = QTextCodec::availableCodecs(); Utils::sort(codecs); - for (const QByteArray &codec : qAsConst(codecs)) { + for (const QByteArray &codec : std::as_const(codecs)) { m_codecBox->addItem(QString::fromLocal8Bit(codec)); if (codec == currentCodec) m_codecBox->setCurrentIndex(m_codecBox->count() - 1); diff --git a/src/plugins/coreplugin/iwizardfactory.cpp b/src/plugins/coreplugin/iwizardfactory.cpp index 938dc06fced..47db80bc7f8 100644 --- a/src/plugins/coreplugin/iwizardfactory.cpp +++ b/src/plugins/coreplugin/iwizardfactory.cpp @@ -173,7 +173,7 @@ QList IWizardFactory::allWizardFactories() s_areFactoriesLoaded = true; QHash sanityCheck; - for (const FactoryCreator &fc : qAsConst(s_factoryCreators)) { + for (const FactoryCreator &fc : std::as_const(s_factoryCreators)) { IWizardFactory *newFactory = fc(); QTC_ASSERT(newFactory, continue); IWizardFactory *existingFactory = sanityCheck.value(newFactory->id()); @@ -308,7 +308,7 @@ void IWizardFactory::registerFactoryCreator(const IWizardFactory::FactoryCreator QSet IWizardFactory::allAvailablePlatforms() { QSet platforms; - for (const IFeatureProvider *featureManager : qAsConst(s_providerList)) + for (const IFeatureProvider *featureManager : std::as_const(s_providerList)) platforms.unite(featureManager->availablePlatforms()); return platforms; @@ -316,7 +316,7 @@ QSet IWizardFactory::allAvailablePlatforms() QString IWizardFactory::displayNameForPlatform(Id i) { - for (const IFeatureProvider *featureManager : qAsConst(s_providerList)) { + for (const IFeatureProvider *featureManager : std::as_const(s_providerList)) { const QString displayName = featureManager->displayNameForPlatform(i); if (!displayName.isEmpty()) return displayName; @@ -361,7 +361,7 @@ void IWizardFactory::destroyFeatureProvider() void IWizardFactory::clearWizardFactories() { - for (IWizardFactory *factory : qAsConst(s_allFactories)) + for (IWizardFactory *factory : std::as_const(s_allFactories)) ActionManager::unregisterAction(factory->m_action, actionId(factory)); qDeleteAll(s_allFactories); @@ -388,7 +388,7 @@ QSet IWizardFactory::availableFeatures(Id platformId) { QSet availableFeatures; - for (const IFeatureProvider *featureManager : qAsConst(s_providerList)) + for (const IFeatureProvider *featureManager : std::as_const(s_providerList)) availableFeatures.unite(featureManager->availableFeatures(platformId)); return availableFeatures; diff --git a/src/plugins/coreplugin/locator/commandlocator.cpp b/src/plugins/coreplugin/locator/commandlocator.cpp index 24842f443f3..0e9e4fd1e0b 100644 --- a/src/plugins/coreplugin/locator/commandlocator.cpp +++ b/src/plugins/coreplugin/locator/commandlocator.cpp @@ -70,7 +70,7 @@ QList CommandLocator::matchesFor(QFutureInterface goodEntries; QList betterEntries; const Qt::CaseSensitivity entryCaseSensitivity = caseSensitivity(entry); - for (const auto &pair : qAsConst(d->commandsData)) { + for (const auto &pair : std::as_const(d->commandsData)) { if (future.isCanceled()) break; diff --git a/src/plugins/coreplugin/locator/executefilter.cpp b/src/plugins/coreplugin/locator/executefilter.cpp index d24f22b620c..854ea514519 100644 --- a/src/plugins/coreplugin/locator/executefilter.cpp +++ b/src/plugins/coreplugin/locator/executefilter.cpp @@ -45,7 +45,7 @@ QList ExecuteFilter::matchesFor(QFutureInterface others; const Qt::CaseSensitivity entryCaseSensitivity = caseSensitivity(entry); - for (const QString &cmd : qAsConst(m_commandHistory)) { + for (const QString &cmd : std::as_const(m_commandHistory)) { if (future.isCanceled()) break; if (cmd == entry) // avoid repeated entry diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index 7c2e3b7a2cc..704a76d8b30 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -173,7 +173,7 @@ void Locator::loadSettings() m_refreshTimer.setInterval(settings->value("RefreshInterval", 60).toInt() * 60000); m_settings.useCenteredPopup = settings->value(kUseCenteredPopup, def.useCenteredPopup).toBool(); - for (ILocatorFilter *filter : qAsConst(m_filters)) { + for (ILocatorFilter *filter : std::as_const(m_filters)) { if (settings->contains(filter->id().toString())) { const QByteArray state = settings->value(filter->id().toString()).toByteArray(); if (!state.isEmpty()) @@ -214,7 +214,7 @@ void Locator::updateFilterActions() QMap actionCopy = m_filterActionMap; m_filterActionMap.clear(); // register new actions, update existent - for (ILocatorFilter *filter : qAsConst(m_filters)) { + for (ILocatorFilter *filter : std::as_const(m_filters)) { if (filter->shortcutString().isEmpty() || filter->isHidden()) continue; Id filterId = filter->id(); diff --git a/src/plugins/coreplugin/locator/locator_test.cpp b/src/plugins/coreplugin/locator/locator_test.cpp index fd40a119984..60ef12fbd92 100644 --- a/src/plugins/coreplugin/locator/locator_test.cpp +++ b/src/plugins/coreplugin/locator/locator_test.cpp @@ -56,7 +56,7 @@ void Core::Internal::CorePlugin::test_basefilefilter() MyBaseFileFilter filter(Utils::FileUtils::toFilePathList(testFiles)); BasicLocatorFilterTest test(&filter); - for (const ReferenceData &reference : qAsConst(referenceDataList)) { + for (const ReferenceData &reference : std::as_const(referenceDataList)) { const QList filterEntries = test.matchesFor(reference.searchText); const ResultDataList results = ResultData::fromFilterEntryList(filterEntries); // QTextStream(stdout) << "----" << endl; diff --git a/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp b/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp index a45bb96d447..665290687e2 100644 --- a/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp +++ b/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp @@ -40,7 +40,7 @@ void LocatorFiltersFilter::prepareSearch(const QString &entry) uniqueFilters.insert(filterId, filter); } - for (ILocatorFilter *filter : qAsConst(uniqueFilters)) { + for (ILocatorFilter *filter : std::as_const(uniqueFilters)) { if (!filter->shortcutString().isEmpty() && !filter->isHidden() && filter->isEnabled()) { m_filterShortcutStrings.append(filter->shortcutString()); m_filterDisplayNames.append(filter->displayName()); diff --git a/src/plugins/coreplugin/locator/locatorsettingspage.cpp b/src/plugins/coreplugin/locator/locatorsettingspage.cpp index 9468410c7dc..1ba68bff084 100644 --- a/src/plugins/coreplugin/locator/locatorsettingspage.cpp +++ b/src/plugins/coreplugin/locator/locatorsettingspage.cpp @@ -330,7 +330,7 @@ void LocatorSettingsWidget::setFilter(const QString &text) void LocatorSettingsWidget::saveFilterStates() { m_filterStates.clear(); - for (ILocatorFilter *filter : qAsConst(m_filters)) + for (ILocatorFilter *filter : std::as_const(m_filters)) m_filterStates.insert(filter, filter->saveState()); } @@ -352,11 +352,11 @@ void LocatorSettingsWidget::initializeModel() m_model->clear(); QSet customFilterSet = Utils::toSet(m_customFilters); auto builtIn = new CategoryItem(tr("Built-in"), 0/*order*/); - for (ILocatorFilter *filter : qAsConst(m_filters)) + for (ILocatorFilter *filter : std::as_const(m_filters)) if (!filter->isHidden() && !customFilterSet.contains(filter)) builtIn->appendChild(new FilterItem(filter)); m_customFilterRoot = new CategoryItem(tr("Custom"), 1/*order*/); - for (ILocatorFilter *customFilter : qAsConst(m_customFilters)) + for (ILocatorFilter *customFilter : std::as_const(m_customFilters)) m_customFilterRoot->appendChild(new FilterItem(customFilter)); m_model->rootItem()->appendChild(builtIn); diff --git a/src/plugins/coreplugin/loggingmanager.cpp b/src/plugins/coreplugin/loggingmanager.cpp index 4a3f392d4c5..f30a816ac09 100644 --- a/src/plugins/coreplugin/loggingmanager.cpp +++ b/src/plugins/coreplugin/loggingmanager.cpp @@ -271,7 +271,7 @@ void LoggingViewManager::prefillCategories() void LoggingViewManager::resetFilterRules() { - for (const FilterRuleSpec &rule : qAsConst(m_originalRules)) { + for (const FilterRuleSpec &rule : std::as_const(m_originalRules)) { const QString level = rule.level.has_value() ? '.' + levelToString(rule.level.value()) : QString(); const QString ruleString = rule.category + level + '=' + (rule.enabled ? "true" : "false"); @@ -285,7 +285,7 @@ bool LoggingViewManager::enabledInOriginalRules(const QMessageLogContext &contex return false; const QString category = QString::fromUtf8(context.category); bool result = false; - for (const FilterRuleSpec &rule : qAsConst(m_originalRules)) { + for (const FilterRuleSpec &rule : std::as_const(m_originalRules)) { const QRegularExpression regex( QRegularExpression::wildcardToRegularExpression(rule.category)); if (regex.match(category).hasMatch()) { diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index df8ef17c33a..a7e943c1961 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -1319,13 +1319,13 @@ void MainWindow::updateContext() { Context contexts = m_highPrioAdditionalContexts; - for (IContext *context : qAsConst(m_activeContext)) + for (IContext *context : std::as_const(m_activeContext)) contexts.add(context->context()); contexts.add(m_lowPrioAdditionalContexts); Context uniquecontexts; - for (const Id &id : qAsConst(contexts)) { + for (const Id &id : std::as_const(contexts)) { if (!uniquecontexts.contains(id)) uniquecontexts.add(id); } diff --git a/src/plugins/coreplugin/mimetypesettings.cpp b/src/plugins/coreplugin/mimetypesettings.cpp index 79045ae40ab..6551cd1a0e8 100644 --- a/src/plugins/coreplugin/mimetypesettings.cpp +++ b/src/plugins/coreplugin/mimetypesettings.cpp @@ -591,7 +591,7 @@ void MimeTypeSettingsPrivate::writeUserModifiedMimeTypes() writer.writeStartDocument(); writer.writeStartElement(QLatin1String(mimeInfoTagC)); - for (const UserMimeType &mt : qAsConst(m_userModifiedMimeTypes)) { + for (const UserMimeType &mt : std::as_const(m_userModifiedMimeTypes)) { writer.writeStartElement(QLatin1String(mimeTypeTagC)); writer.writeAttribute(QLatin1String(mimeTypeAttributeC), mt.name); writer.writeAttribute(QLatin1String(patternAttributeC), diff --git a/src/plugins/coreplugin/modemanager.cpp b/src/plugins/coreplugin/modemanager.cpp index 00960b4e5d2..f17830445d4 100644 --- a/src/plugins/coreplugin/modemanager.cpp +++ b/src/plugins/coreplugin/modemanager.cpp @@ -189,7 +189,7 @@ void ModeManagerPrivate::extensionsInitializedHelper() Utils::sort(m_modes, &IMode::priority); std::reverse(m_modes.begin(), m_modes.end()); - for (IMode *mode : qAsConst(m_modes)) + for (IMode *mode : std::as_const(m_modes)) appendMode(mode); if (m_pendingFirstActiveMode.isValid()) @@ -279,7 +279,7 @@ void ModeManager::addAction(QAction *action, int priority) // Count the number of commands with a higher priority int index = 0; - for (int p : qAsConst(d->m_actions)) { + for (int p : std::as_const(d->m_actions)) { if (p > priority) ++index; } diff --git a/src/plugins/coreplugin/navigationsubwidget.cpp b/src/plugins/coreplugin/navigationsubwidget.cpp index d0fe95abfc2..9f8db2e5974 100644 --- a/src/plugins/coreplugin/navigationsubwidget.cpp +++ b/src/plugins/coreplugin/navigationsubwidget.cpp @@ -90,7 +90,7 @@ void NavigationSubWidget::comboBoxIndexChanged(int factoryIndex) saveSettings(); // Remove toolbutton - for (QWidget *w : qAsConst(m_additionalToolBarWidgets)) + for (QWidget *w : std::as_const(m_additionalToolBarWidgets)) delete w; m_additionalToolBarWidgets.clear(); @@ -111,7 +111,7 @@ void NavigationSubWidget::comboBoxIndexChanged(int factoryIndex) // Add Toolbutton m_additionalToolBarWidgets = n.dockToolBarWidgets; auto layout = qobject_cast(m_toolBar->layout()); - for (QToolButton *w : qAsConst(m_additionalToolBarWidgets)) + for (QToolButton *w : std::as_const(m_additionalToolBarWidgets)) layout->insertWidget(layout->count()-2, w); restoreSettings(); diff --git a/src/plugins/coreplugin/navigationwidget.cpp b/src/plugins/coreplugin/navigationwidget.cpp index f3fde110bdb..9a76f1d5fe6 100644 --- a/src/plugins/coreplugin/navigationwidget.cpp +++ b/src/plugins/coreplugin/navigationwidget.cpp @@ -223,7 +223,7 @@ QWidget *NavigationWidget::activateSubWidget(Id factoryId, Side fallbackSide) void NavigationWidget::setFactories(const QList &factories) { Context navicontext(Constants::C_NAVIGATION_PANE); - for (INavigationWidgetFactory *factory : qAsConst(factories)) { + for (INavigationWidgetFactory *factory : std::as_const(factories)) { const Id id = factory->id(); const Id actionId = id.withPrefix("QtCreator.Sidebar."); @@ -334,7 +334,7 @@ Internal::NavigationSubWidget *NavigationWidget::insertSubItem(int position, int QWidget *NavigationWidget::activateSubWidget(Id factoryId, int preferredPosition) { setShown(true); - for (Internal::NavigationSubWidget *subWidget : qAsConst(d->m_subWidgets)) { + for (Internal::NavigationSubWidget *subWidget : std::as_const(d->m_subWidgets)) { if (subWidget->factory()->id() == factoryId) { subWidget->setFocusWidget(); ICore::raiseWindow(this); @@ -434,7 +434,7 @@ void NavigationWidget::restoreSettings(QSettings *settings) } int position = 0; - for (const QString &id : qAsConst(viewIds)) { + for (const QString &id : std::as_const(viewIds)) { int index = factoryIndex(Id::fromString(id)); if (index >= 0) { // Only add if the id was actually found! @@ -486,7 +486,7 @@ void NavigationWidget::restoreSettings(QSettings *settings) void NavigationWidget::closeSubWidgets() { - for (Internal::NavigationSubWidget *subWidget : qAsConst(d->m_subWidgets)) { + for (Internal::NavigationSubWidget *subWidget : std::as_const(d->m_subWidgets)) { subWidget->saveSettings(); delete subWidget; } diff --git a/src/plugins/coreplugin/outputpane.cpp b/src/plugins/coreplugin/outputpane.cpp index 4c7bbc3d3a5..aef455785e2 100644 --- a/src/plugins/coreplugin/outputpane.cpp +++ b/src/plugins/coreplugin/outputpane.cpp @@ -104,7 +104,7 @@ void OutputPanePlaceHolder::setMaximized(bool maximize) if (maximize) { d->m_nonMaximizedSize = sizes[idx]; int sum = 0; - for (const int s : qAsConst(sizes)) + for (const int s : std::as_const(sizes)) sum += s; for (int i = 0; i < sizes.count(); ++i) { sizes[i] = 32; diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index b2ae43059f4..8d8f5e7b29d 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -551,7 +551,7 @@ void OutputWindow::flush() return; } d->queueTimer.stop(); - for (const auto &chunk : qAsConst(d->queuedOutput)) + for (const auto &chunk : std::as_const(d->queuedOutput)) handleOutputChunk(chunk.first, chunk.second); d->queuedOutput.clear(); d->formatter.flush(); diff --git a/src/plugins/coreplugin/progressmanager/progressmanager.cpp b/src/plugins/coreplugin/progressmanager/progressmanager.cpp index 682cbb38e7d..1800d562946 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager.cpp +++ b/src/plugins/coreplugin/progressmanager/progressmanager.cpp @@ -515,7 +515,7 @@ void ProgressManagerPrivate::stopFadeOfSummaryProgress() bool ProgressManagerPrivate::hasError() const { - for (const FutureProgress *progress : qAsConst(m_taskList)) + for (const FutureProgress *progress : std::as_const(m_taskList)) if (progress->hasError()) return true; return false; @@ -525,7 +525,7 @@ bool ProgressManagerPrivate::isLastFading() const { if (m_taskList.isEmpty()) return false; - for (const FutureProgress *progress : qAsConst(m_taskList)) { + for (const FutureProgress *progress : std::as_const(m_taskList)) { if (!progress->isFading()) // we still have progress bars that are not fading return false; } @@ -567,7 +567,7 @@ void ProgressManagerPrivate::removeOneOldTask() Id type = (*i)->type(); int taskCount = 0; - for (const FutureProgress *p : qAsConst(m_taskList)) + for (const FutureProgress *p : std::as_const(m_taskList)) if (p->type() == type) ++taskCount; diff --git a/src/plugins/coreplugin/sidebar.cpp b/src/plugins/coreplugin/sidebar.cpp index 4c327835827..f7b833d4dac 100644 --- a/src/plugins/coreplugin/sidebar.cpp +++ b/src/plugins/coreplugin/sidebar.cpp @@ -63,13 +63,13 @@ SideBar::SideBar(QList itemList, d(new SideBarPrivate) { setOrientation(Qt::Vertical); - for (SideBarItem *item : qAsConst(itemList)) { + for (SideBarItem *item : std::as_const(itemList)) { d->m_itemMap.insert(item->id(), item); d->m_availableItemIds.append(item->id()); d->m_availableItemTitles.append(item->title()); } - for (SideBarItem *item : qAsConst(defaultVisible)) { + for (SideBarItem *item : std::as_const(defaultVisible)) { if (!itemList.contains(item)) continue; d->m_defaultVisible.append(item->id()); @@ -78,7 +78,7 @@ SideBar::SideBar(QList itemList, SideBar::~SideBar() { - for (const QPointer &i : qAsConst(d->m_itemMap)) + for (const QPointer &i : std::as_const(d->m_itemMap)) if (!i.isNull()) delete i.data(); delete d; @@ -138,7 +138,7 @@ void SideBar::makeItemAvailable(SideBarItem *item) void SideBar::setUnavailableItemIds(const QStringList &itemIds) { // re-enable previous items - for (const QString &id : qAsConst(d->m_unavailableItemIds)) { + for (const QString &id : std::as_const(d->m_unavailableItemIds)) { d->m_availableItemIds.append(id); d->m_availableItemTitles.append(d->m_itemMap.value(id).data()->title()); } @@ -224,7 +224,7 @@ void SideBar::closeSubWidget(Internal::SideBarWidget *widget) void SideBar::updateWidgets() { - for (Internal::SideBarWidget *i : qAsConst(d->m_widgets)) + for (Internal::SideBarWidget *i : std::as_const(d->m_widgets)) i->updateAvailableItems(); } @@ -250,7 +250,7 @@ void SideBar::saveSettings(QSettings *settings, const QString &name) void SideBar::closeAllWidgets() { - for (Internal::SideBarWidget *widget : qAsConst(d->m_widgets)) + for (Internal::SideBarWidget *widget : std::as_const(d->m_widgets)) removeSideBarWidget(widget); } @@ -273,7 +273,7 @@ void SideBar::readSettings(QSettings *settings, const QString &name) } } if (d->m_widgets.size() == 0) { - for (const QString &id : qAsConst(d->m_defaultVisible)) + for (const QString &id : std::as_const(d->m_defaultVisible)) insertSideBarWidget(d->m_widgets.count(), id); } diff --git a/src/plugins/coreplugin/sidebarwidget.cpp b/src/plugins/coreplugin/sidebarwidget.cpp index e0497a8efde..35c183001c4 100644 --- a/src/plugins/coreplugin/sidebarwidget.cpp +++ b/src/plugins/coreplugin/sidebarwidget.cpp @@ -68,7 +68,7 @@ SideBarWidget::SideBarWidget(SideBar *sideBar, const QString &id) Utils::sort(titleList); QString t = id; if (!titleList.isEmpty()) { - for (const QString &itemTitle : qAsConst(titleList)) + for (const QString &itemTitle : std::as_const(titleList)) m_comboBox->addItem(itemTitle, m_sideBar->idForTitle(itemTitle)); m_comboBox->setCurrentIndex(0); @@ -131,7 +131,7 @@ void SideBarWidget::updateAvailableItems() titleList.append(currentTitle); Utils::sort(titleList); - for (const QString &itemTitle : qAsConst(titleList)) + for (const QString &itemTitle : std::as_const(titleList)) m_comboBox->addItem(itemTitle, m_sideBar->idForTitle(itemTitle)); int idx = m_comboBox->findText(currentTitle); diff --git a/src/plugins/coreplugin/statusbarmanager.cpp b/src/plugins/coreplugin/statusbarmanager.cpp index 80a2a04dddf..79ef861dd0a 100644 --- a/src/plugins/coreplugin/statusbarmanager.cpp +++ b/src/plugins/coreplugin/statusbarmanager.cpp @@ -91,7 +91,7 @@ static void createStatusBarManager() delete statusContext; // This is the catch-all on rampdown. Individual items may // have been removed earlier by destroyStatusBarWidget(). - for (const QPointer &context : qAsConst(m_contexts)) { + for (const QPointer &context : std::as_const(m_contexts)) { ICore::removeContextObject(context); delete context; } diff --git a/src/plugins/coreplugin/themechooser.cpp b/src/plugins/coreplugin/themechooser.cpp index b19808746a9..1724c6e2cc8 100644 --- a/src/plugins/coreplugin/themechooser.cpp +++ b/src/plugins/coreplugin/themechooser.cpp @@ -179,7 +179,7 @@ static void addThemesFromPath(const QString &path, QList *themes) themeDir.setNameFilters({extension}); themeDir.setFilter(QDir::Files); const QStringList themeList = themeDir.entryList(); - for (const QString &fileName : qAsConst(themeList)) { + for (const QString &fileName : std::as_const(themeList)) { QString id = QFileInfo(fileName).completeBaseName(); themes->append(ThemeEntry(Id::fromString(id), themeDir.absoluteFilePath(fileName))); } diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index 735a813137e..e547ba8ab64 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -544,7 +544,7 @@ void CorePlugin::testVcsManager() // From VCSes: int expectedCount = 0; - for (const QString &result : qAsConst(results)) { + for (const QString &result : std::as_const(results)) { // qDebug() << "Expecting:" << result; const QStringList split = result.split(QLatin1Char(':')); diff --git a/src/plugins/cpaster/cpasterplugin.cpp b/src/plugins/cpaster/cpasterplugin.cpp index edc3913ccdc..0a9d3c137e6 100644 --- a/src/plugins/cpaster/cpasterplugin.cpp +++ b/src/plugins/cpaster/cpasterplugin.cpp @@ -174,7 +174,7 @@ CodePasterPluginPrivate::CodePasterPluginPrivate() ExtensionSystem::IPlugin::ShutdownFlag CodePasterPlugin::aboutToShutdown() { // Delete temporary, fetched files - for (const QString &fetchedSnippet : qAsConst(d->m_fetchedSnippets)) { + for (const QString &fetchedSnippet : std::as_const(d->m_fetchedSnippets)) { QFile file(fetchedSnippet); if (file.exists()) file.remove(); diff --git a/src/plugins/cppcheck/cppchecktool.cpp b/src/plugins/cppcheck/cppchecktool.cpp index cff9d6bc67b..af8e123dcaf 100644 --- a/src/plugins/cppcheck/cppchecktool.cpp +++ b/src/plugins/cppcheck/cppchecktool.cpp @@ -194,7 +194,7 @@ void CppcheckTool::check(const Utils::FilePaths &files) } std::map groups; - for (const Utils::FilePath &file : qAsConst(filtered)) { + for (const Utils::FilePath &file : std::as_const(filtered)) { const QString stringed = file.toString(); for (const CppEditor::ProjectPart::ConstPtr &part : parts) { using CppEditor::ProjectFile; diff --git a/src/plugins/cppeditor/builtineditordocumentparser.cpp b/src/plugins/cppeditor/builtineditordocumentparser.cpp index d06806a2037..7d3a2430e84 100644 --- a/src/plugins/cppeditor/builtineditordocumentparser.cpp +++ b/src/plugins/cppeditor/builtineditordocumentparser.cpp @@ -136,7 +136,7 @@ void BuiltinEditorDocumentParser::updateImpl(const QFutureInterface &futur } else { // Remove changed files from the snapshot QSet toRemove; - for (const Document::Ptr &doc : qAsConst(state.snapshot)) { + for (const Document::Ptr &doc : std::as_const(state.snapshot)) { const Utils::FilePath fileName = Utils::FilePath::fromString(doc->fileName()); if (workingCopy.contains(fileName)) { if (workingCopy.get(fileName).second != doc->editorRevision()) @@ -150,7 +150,7 @@ void BuiltinEditorDocumentParser::updateImpl(const QFutureInterface &futur if (!toRemove.isEmpty()) { invalidateSnapshot = true; - for (const Utils::FilePath &fileName : qAsConst(toRemove)) + for (const Utils::FilePath &fileName : std::as_const(toRemove)) state.snapshot.remove(fileName); } } @@ -189,7 +189,7 @@ void BuiltinEditorDocumentParser::updateImpl(const QFutureInterface &futur sourceProcessor.setLanguageFeatures(features); sourceProcessor.run(configurationFileName); if (baseConfig.usePrecompiledHeaders) { - for (const QString &precompiledHeader : qAsConst(state.precompiledHeaders)) + for (const QString &precompiledHeader : std::as_const(state.precompiledHeaders)) sourceProcessor.run(precompiledHeader); } if (!baseState.editorDefines.isEmpty()) diff --git a/src/plugins/cppeditor/builtinindexingsupport.cpp b/src/plugins/cppeditor/builtinindexingsupport.cpp index 1f65f28f047..81d8b11c2c5 100644 --- a/src/plugins/cppeditor/builtinindexingsupport.cpp +++ b/src/plugins/cppeditor/builtinindexingsupport.cpp @@ -168,7 +168,7 @@ void index(QFutureInterface &indexingFuture, QStringList headers; classifyFiles(params.sourceFiles, &headers, &sources); - for (const QString &file : qAsConst(params.sourceFiles)) + for (const QString &file : std::as_const(params.sourceFiles)) sourceProcessor->removeFromCache(file); const int sourceCount = sources.size(); diff --git a/src/plugins/cppeditor/compileroptionsbuilder.cpp b/src/plugins/cppeditor/compileroptionsbuilder.cpp index a0deb3a9193..a1b151de2a2 100644 --- a/src/plugins/cppeditor/compileroptionsbuilder.cpp +++ b/src/plugins/cppeditor/compileroptionsbuilder.cpp @@ -348,9 +348,9 @@ void CompilerOptionsBuilder::addHeaderPathOptions() filter.process(); - for (const HeaderPath &headerPath : qAsConst(filter.userHeaderPaths)) + for (const HeaderPath &headerPath : std::as_const(filter.userHeaderPaths)) addIncludeDirOptionForPath(headerPath); - for (const HeaderPath &headerPath : qAsConst(filter.systemHeaderPaths)) + for (const HeaderPath &headerPath : std::as_const(filter.systemHeaderPaths)) addIncludeDirOptionForPath(headerPath); if (m_useTweakedHeaderPaths != UseTweakedHeaderPaths::No) { @@ -359,7 +359,7 @@ void CompilerOptionsBuilder::addHeaderPathOptions() m_options.prepend("-nostdinc++"); m_options.prepend("-nostdinc"); - for (const HeaderPath &headerPath : qAsConst(filter.builtInHeaderPaths)) + for (const HeaderPath &headerPath : std::as_const(filter.builtInHeaderPaths)) addIncludeDirOptionForPath(headerPath); } } diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cppeditor/cppchecksymbols.cpp index 0d0a8746967..1621f6ae51f 100644 --- a/src/plugins/cppeditor/cppchecksymbols.cpp +++ b/src/plugins/cppeditor/cppchecksymbols.cpp @@ -1120,7 +1120,7 @@ bool CheckSymbols::visit(FunctionDefinitionAST *ast) accept(ast->function_body); const Internal::LocalSymbols locals(_doc, ast); - for (const QList &uses : qAsConst(locals.uses)) { + for (const QList &uses : std::as_const(locals.uses)) { for (const Result &u : uses) addUse(u); } diff --git a/src/plugins/cppeditor/cppcodeformatter.cpp b/src/plugins/cppeditor/cppcodeformatter.cpp index e7479ec71c6..ab2b8506b6f 100644 --- a/src/plugins/cppeditor/cppcodeformatter.cpp +++ b/src/plugins/cppeditor/cppcodeformatter.cpp @@ -1090,7 +1090,7 @@ void CodeFormatter::dump() const qDebug() << "Current token index" << m_tokenIndex; qDebug() << "Current state:"; - for (const State &s : qAsConst(m_currentState)) + for (const State &s : std::as_const(m_currentState)) qDebug() << metaEnum.valueToKey(s.type) << s.savedIndentDepth << s.savedPaddingDepth; qDebug() << "Current indent depth:" << m_indentDepth; diff --git a/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp b/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp index 509fbf8a9c4..f17f5c1f62f 100644 --- a/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp +++ b/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp @@ -1117,7 +1117,7 @@ void ProjectPartsModel::configure(const QList &projectInf { emit layoutAboutToBeChanged(); m_projectPartsList.clear(); - for (const ProjectInfo::ConstPtr &info : qAsConst(projectInfos)) { + for (const ProjectInfo::ConstPtr &info : std::as_const(projectInfos)) { const QVector projectParts = info->projectParts(); for (const ProjectPart::ConstPtr &projectPart : projectParts) { if (!m_projectPartsList.contains(projectPart)) { @@ -1139,7 +1139,7 @@ QModelIndex ProjectPartsModel::indexForCurrentEditorsProjectPart() const ProjectPart::ConstPtr ProjectPartsModel::projectPartForProjectId(const QString &projectPartId) const { - for (const ProjectPart::ConstPtr &part : qAsConst(m_projectPartsList)) { + for (const ProjectPart::ConstPtr &part : std::as_const(m_projectPartsList)) { if (part->id() == projectPartId) return part; } diff --git a/src/plugins/cppeditor/cppcodemodelinspectordumper.cpp b/src/plugins/cppeditor/cppcodemodelinspectordumper.cpp index cf656aa8387..6b4429574e8 100644 --- a/src/plugins/cppeditor/cppcodemodelinspectordumper.cpp +++ b/src/plugins/cppeditor/cppcodemodelinspectordumper.cpp @@ -521,7 +521,7 @@ void Dumper::dumpProjectInfos(const QList &projectInfos) if (!part->files.isEmpty()) { m_out << i3 << "Files:{{{4\n"; - for (const ProjectFile &projectFile : qAsConst(part->files)) { + for (const ProjectFile &projectFile : std::as_const(part->files)) { m_out << i4 << Utils::toString(projectFile.kind) << ": " << projectFile.path; if (!projectFile.active) m_out << " (inactive)"; @@ -546,7 +546,7 @@ void Dumper::dumpProjectInfos(const QList &projectInfos) if (!part->headerPaths.isEmpty()) { m_out << i3 << "Header Paths:{{{4\n"; - for (const ProjectExplorer::HeaderPath &headerPath : qAsConst(part->headerPaths)) { + for (const ProjectExplorer::HeaderPath &headerPath : std::as_const(part->headerPaths)) { m_out << i4 << headerPath.path; printIncludeType(m_out, headerPath.type); m_out << "\n"; @@ -555,7 +555,7 @@ void Dumper::dumpProjectInfos(const QList &projectInfos) if (!part->precompiledHeaders.isEmpty()) { m_out << i3 << "Precompiled Headers:{{{4\n"; - for (const QString &precompiledHeader : qAsConst(part->precompiledHeaders)) + for (const QString &precompiledHeader : std::as_const(part->precompiledHeaders)) m_out << i4 << precompiledHeader << "\n"; } } // for part diff --git a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp index df3575b9b91..476a3dae5c1 100644 --- a/src/plugins/cppeditor/cppcodemodelsettingspage.cpp +++ b/src/plugins/cppeditor/cppcodemodelsettingspage.cpp @@ -347,7 +347,7 @@ ClangdSettingsWidget::ClangdSettingsWidget(const ClangdSettings::Data &settingsD QInputDialog dlg(sessionsView); QStringList sessions = ProjectExplorer::SessionManager::sessions(); QStringList currentSessions = d->sessionsModel.stringList(); - for (const QString &s : qAsConst(currentSessions)) + for (const QString &s : std::as_const(currentSessions)) sessions.removeOne(s); if (sessions.isEmpty()) return; diff --git a/src/plugins/cppeditor/cppcodestylesettingspage.cpp b/src/plugins/cppeditor/cppcodestylesettingspage.cpp index 5880d0fab03..225f8fcfdb3 100644 --- a/src/plugins/cppeditor/cppcodestylesettingspage.cpp +++ b/src/plugins/cppeditor/cppcodestylesettingspage.cpp @@ -285,7 +285,7 @@ void CppCodeStylePreferencesWidget::updatePreview() const CppCodeStyleSettings ccss = cppCodeStylePreferences->currentCodeStyleSettings(); const TabSettings ts = cppCodeStylePreferences->currentTabSettings(); QtStyleCodeFormatter formatter(ts, ccss); - for (SnippetEditorWidget *preview : qAsConst(m_previews)) { + for (SnippetEditorWidget *preview : std::as_const(m_previews)) { preview->textDocument()->setTabSettings(ts); preview->setCodeStyle(cppCodeStylePreferences); @@ -307,7 +307,7 @@ void CppCodeStylePreferencesWidget::updatePreview() void CppCodeStylePreferencesWidget::decorateEditors(const FontSettings &fontSettings) { - for (SnippetEditorWidget *editor : qAsConst(m_previews)) { + for (SnippetEditorWidget *editor : std::as_const(m_previews)) { editor->textDocument()->setFontSettings(fontSettings); SnippetProvider::decorateEditor(editor, CppEditor::Constants::CPP_SNIPPETS_GROUP_ID); } @@ -315,7 +315,7 @@ void CppCodeStylePreferencesWidget::decorateEditors(const FontSettings &fontSett void CppCodeStylePreferencesWidget::setVisualizeWhitespace(bool on) { - for (SnippetEditorWidget *editor : qAsConst(m_previews)) { + for (SnippetEditorWidget *editor : std::as_const(m_previews)) { DisplaySettings displaySettings = editor->displaySettings(); displaySettings.m_visualizeWhitespace = on; editor->setDisplaySettings(displaySettings); diff --git a/src/plugins/cppeditor/cppcompletion_test.cpp b/src/plugins/cppeditor/cppcompletion_test.cpp index dff0fd4508f..956ebb9faa7 100644 --- a/src/plugins/cppeditor/cppcompletion_test.cpp +++ b/src/plugins/cppeditor/cppcompletion_test.cpp @@ -258,7 +258,7 @@ void CompletionTest::testCompletionTemplateFunction() QStringList actualCompletions = test.getCompletions(); QString errorPattern(QLatin1String("Completion not found: %1")); - for (const QString &completion : qAsConst(expectedCompletions)) { + for (const QString &completion : std::as_const(expectedCompletions)) { QByteArray errorMessage = errorPattern.arg(completion).toUtf8(); QVERIFY2(actualCompletions.contains(completion), errorMessage.data()); } diff --git a/src/plugins/cppeditor/cppcompletionassist.cpp b/src/plugins/cppeditor/cppcompletionassist.cpp index 68c2a9d8e18..c5eb9f2c41b 100644 --- a/src/plugins/cppeditor/cppcompletionassist.cpp +++ b/src/plugins/cppeditor/cppcompletionassist.cpp @@ -1153,7 +1153,7 @@ void InternalCppCompletionAssistProcessor::completeObjCMsgSend(ClassOrNamespace memberScopes.append(c); } - for (Scope *scope : qAsConst(memberScopes)) { + for (Scope *scope : std::as_const(memberScopes)) { for (int i = 0; i < scope->memberCount(); ++i) { Symbol *symbol = scope->memberAt(i); @@ -1218,7 +1218,7 @@ bool InternalCppCompletionAssistProcessor::completeInclude(const QTextCursor &cu const QStringList suffixes = Utils::mimeTypeForName(QLatin1String("text/x-c++hdr")).suffixes(); - for (const ProjectExplorer::HeaderPath &headerPath : qAsConst(headerPaths)) { + for (const ProjectExplorer::HeaderPath &headerPath : std::as_const(headerPaths)) { QString realPath = headerPath.path; if (!directoryPrefix.isEmpty()) { realPath += QLatin1Char('/'); @@ -1476,7 +1476,7 @@ bool InternalCppCompletionAssistProcessor::globalCompletion(Scope *currentScope) } } - for (ClassOrNamespace *b : qAsConst(usingBindings)) + for (ClassOrNamespace *b : std::as_const(usingBindings)) completeNamespace(b); addKeywords(); @@ -1750,7 +1750,7 @@ bool InternalCppCompletionAssistProcessor::completeQtMethod(const QListasClass(); if (!klass) continue; @@ -1850,7 +1850,7 @@ void InternalCppCompletionAssistProcessor::addMacros(const QString &fileName, addMacros_helper(snapshot, fileName, &processed, &definedMacros); - for (const QString ¯oName : qAsConst(definedMacros)) + for (const QString ¯oName : std::as_const(definedMacros)) addCompletionItem(macroName, Icons::macroIcon(), MacrosOrder); } @@ -1932,7 +1932,7 @@ bool InternalCppCompletionAssistProcessor::completeConstructorOrFunction(const Q bool newOverload = true; - for (Function *f : qAsConst(functions)) { + for (Function *f : std::as_const(functions)) { if (fun->match(f)) { newOverload = false; break; @@ -2045,7 +2045,7 @@ bool InternalCppCompletionAssistProcessor::completeConstructorOrFunction(const Q Control *control = context.bindings()->control().data(); // set up signature autocompletion - for (Function *f : qAsConst(functions)) { + for (Function *f : std::as_const(functions)) { Overview overview; overview.showArgumentNames = true; overview.showDefaultArguments = false; diff --git a/src/plugins/cppeditor/cppeditorplugin.cpp b/src/plugins/cppeditor/cppeditorplugin.cpp index 3ce2884553c..3bf52d996df 100644 --- a/src/plugins/cppeditor/cppeditorplugin.cpp +++ b/src/plugins/cppeditor/cppeditorplugin.cpp @@ -829,8 +829,8 @@ QString correspondingHeaderOrSource(const QString &fileName, bool *wasHeader, Ca candidateFileNames += baseNamesWithAllPrefixes(candidateFileNames, isHeader); // Try to find a file in the same or sibling directories first - for (const QString &candidateDir : qAsConst(candidateDirs)) { - for (const QString &candidateFileName : qAsConst(candidateFileNames)) { + for (const QString &candidateDir : std::as_const(candidateDirs)) { + for (const QString &candidateFileName : std::as_const(candidateFileNames)) { const QString candidateFilePath = candidateDir + QLatin1Char('/') + candidateFileName; const QString normalized = FileUtils::normalizedPathName(candidateFilePath); const QFileInfo candidateFi(normalized); diff --git a/src/plugins/cppeditor/cppinsertvirtualmethods.cpp b/src/plugins/cppeditor/cppinsertvirtualmethods.cpp index 2ec33edc30b..62a25ea960c 100644 --- a/src/plugins/cppeditor/cppinsertvirtualmethods.cpp +++ b/src/plugins/cppeditor/cppinsertvirtualmethods.cpp @@ -196,7 +196,7 @@ ClassItem::~ClassItem() Qt::ItemFlags ClassItem::flags() const { - for (FunctionItem *func : qAsConst(functions)) { + for (FunctionItem *func : std::as_const(functions)) { if (!func->alreadyFound) return Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled; } @@ -209,7 +209,7 @@ Qt::CheckState ClassItem::checkState() const if (functions.isEmpty()) return Qt::Unchecked; Qt::CheckState state = functions.first()->checkState(); - for (FunctionItem *function : qAsConst(functions)) { + for (FunctionItem *function : std::as_const(functions)) { Qt::CheckState functionState = function->checkState(); if (functionState != state) return Qt::PartiallyChecked; @@ -469,7 +469,7 @@ public: } } else { auto classItem = static_cast(item); - for (FunctionItem *funcItem : qAsConst(classItem->functions)) { + for (FunctionItem *funcItem : std::as_const(classItem->functions)) { if (funcItem->alreadyFound || funcItem->checked == checked) continue; QModelIndex funcIndex = createIndex(funcItem->row, 0, funcItem); @@ -576,7 +576,7 @@ public: Overview printer = CppCodeStyleSettings::currentProjectCodeStyleOverview(); printer.showFunctionSignatures = true; QHash virtualFunctions; - for (const Class *clazz : qAsConst(baseClasses)) { + for (const Class *clazz : std::as_const(baseClasses)) { ClassItem *itemBase = new ClassItem(printer.prettyName(clazz->name()), clazz); for (Scope::iterator it = clazz->memberBegin(); it != clazz->memberEnd(); ++it) { if (const Function *func = (*it)->type()->asFunctionType()) { @@ -592,7 +592,7 @@ public: continue; if (func->isFinal()) { - for (const Function *firstVirtual : qAsConst(firstVirtuals)) { + for (const Function *firstVirtual : std::as_const(firstVirtuals)) { if (FunctionItem *first = virtualFunctions[firstVirtual]) { FunctionItem *next = nullptr; for (FunctionItem *removed = first; next != first; removed = next) { @@ -610,7 +610,7 @@ public: // - virtual void *qt_metacast(const char *); // - virtual int qt_metacall(QMetaObject::Call, int, void **); bool skip = false; - for (const Function *firstVirtual : qAsConst(firstVirtuals)) { + for (const Function *firstVirtual : std::as_const(firstVirtuals)) { if (printer.prettyName(firstVirtual->enclosingClass()->name()) == "QObject" && magicQObjectFunctions().contains( printer.prettyName(func->name()))) { @@ -653,7 +653,7 @@ public: factory->setHasReimplementedFunctions(true); funcItem->reimplemented = true; funcItem->alreadyFound = funcExistsInClass; - for (const Function *firstVirtual : qAsConst(firstVirtuals)) { + for (const Function *firstVirtual : std::as_const(firstVirtuals)) { if (FunctionItem *first = virtualFunctions[firstVirtual]) { if (!first->alreadyFound) { while (first->checked != isPureVirtual) { @@ -773,14 +773,14 @@ public: UseMinimalNames useMinimalNames(targetCoN); Control *control = context().bindings()->control().data(); QList insertedFunctions; - for (ClassItem *classItem : qAsConst(m_factory->classFunctionModel->classes)) { + for (ClassItem *classItem : std::as_const(m_factory->classFunctionModel->classes)) { if (classItem->checkState() == Qt::Unchecked) continue; // Insert Declarations (+ definitions) QString lastAccessSpecString; bool first = true; - for (FunctionItem *funcItem : qAsConst(classItem->functions)) { + for (FunctionItem *funcItem : std::as_const(classItem->functions)) { if (funcItem->reimplemented || funcItem->alreadyFound || !funcItem->checked) continue; @@ -1198,7 +1198,7 @@ void InsertVirtualMethodsDialog::setHideReimplementedFunctions(bool hide) void InsertVirtualMethodsDialog::updateOverrideReplacementsComboBox() { m_overrideReplacementComboBox->clear(); - for (const QString &replacement : qAsConst(m_availableOverrideReplacements)) + for (const QString &replacement : std::as_const(m_availableOverrideReplacements)) m_overrideReplacementComboBox->addItem(replacement); } diff --git a/src/plugins/cppeditor/cpplocatordata.cpp b/src/plugins/cppeditor/cpplocatordata.cpp index 97c47cc0daa..3349011ce91 100644 --- a/src/plugins/cppeditor/cpplocatordata.cpp +++ b/src/plugins/cppeditor/cpplocatordata.cpp @@ -69,7 +69,7 @@ void CppLocatorData::flushPendingDocument(bool force) const if (m_pendingDocuments.isEmpty()) return; - for (CPlusPlus::Document::Ptr doc : qAsConst(m_pendingDocuments)) + for (CPlusPlus::Document::Ptr doc : std::as_const(m_pendingDocuments)) m_infosByFile.insert(Internal::StringTable::insert(doc->fileName()), m_search(doc)); m_pendingDocuments.clear(); diff --git a/src/plugins/cppeditor/cppmodelmanager.cpp b/src/plugins/cppeditor/cppmodelmanager.cpp index c3de62dc27f..da8fdb53f62 100644 --- a/src/plugins/cppeditor/cppmodelmanager.cpp +++ b/src/plugins/cppeditor/cppmodelmanager.cpp @@ -850,7 +850,7 @@ void CppModelManager::ensureUpdated() QStringList CppModelManager::internalProjectFiles() const { QStringList files; - for (const ProjectData &projectData : qAsConst(d->m_projectData)) { + for (const ProjectData &projectData : std::as_const(d->m_projectData)) { for (const ProjectPart::ConstPtr &part : projectData.projectInfo->projectParts()) { for (const ProjectFile &file : part->files) files += file.path; @@ -863,7 +863,7 @@ QStringList CppModelManager::internalProjectFiles() const ProjectExplorer::HeaderPaths CppModelManager::internalHeaderPaths() const { ProjectExplorer::HeaderPaths headerPaths; - for (const ProjectData &projectData: qAsConst(d->m_projectData)) { + for (const ProjectData &projectData: std::as_const(d->m_projectData)) { for (const ProjectPart::ConstPtr &part : projectData.projectInfo->projectParts()) { for (const ProjectExplorer::HeaderPath &path : part->headerPaths) { ProjectExplorer::HeaderPath hp(QDir::cleanPath(path.path), path.type); @@ -891,7 +891,7 @@ ProjectExplorer::Macros CppModelManager::internalDefinedMacros() const { ProjectExplorer::Macros macros; QSet alreadyIn; - for (const ProjectData &projectData : qAsConst(d->m_projectData)) { + for (const ProjectData &projectData : std::as_const(d->m_projectData)) { for (const ProjectPart::ConstPtr &part : projectData.projectInfo->projectParts()) { addUnique(part->toolChainMacros, macros, alreadyIn); addUnique(part->projectMacros, macros, alreadyIn); @@ -1023,7 +1023,7 @@ WorkingCopy CppModelManager::buildWorkingCopyList() cppEditorDocument->revision()); } - for (AbstractEditorSupport *es : qAsConst(d->m_extraEditorSupports)) + for (AbstractEditorSupport *es : std::as_const(d->m_extraEditorSupports)) workingCopy.insert(es->fileName(), es->contents(), es->revision()); // Add the project configuration file @@ -1097,7 +1097,7 @@ void CppModelManager::removeProjectInfoFilesAndIncludesFromSnapshot(const Projec { QMutexLocker snapshotLocker(&d->m_snapshotMutex); for (const ProjectPart::ConstPtr &projectPart : projectInfo.projectParts()) { - for (const ProjectFile &cxxFile : qAsConst(projectPart->files)) { + for (const ProjectFile &cxxFile : std::as_const(projectPart->files)) { const QSet fileNames = d->m_snapshot.allIncludesForDocument(cxxFile.path); for (const QString &fileName : fileNames) d->m_snapshot.remove(fileName); @@ -1195,7 +1195,7 @@ void CppModelManager::recalculateProjectPartMappings() { d->m_projectPartIdToProjectProjectPart.clear(); d->m_fileToProjectParts.clear(); - for (const ProjectData &projectData : qAsConst(d->m_projectData)) { + for (const ProjectData &projectData : std::as_const(d->m_projectData)) { for (const ProjectPart::ConstPtr &projectPart : projectData.projectInfo->projectParts()) { d->m_projectPartIdToProjectProjectPart[projectPart->id()] = projectPart; for (const ProjectFile &cxxFile : projectPart->files) @@ -1245,7 +1245,7 @@ void CppModelManager::updateCppEditorDocuments(bool projectsUpdated) const QSet invisibleCppEditorDocuments = Utils::toSet(Core::DocumentModel::openedDocuments()); invisibleCppEditorDocuments.subtract(visibleCppEditorDocuments); - for (Core::IDocument *document : qAsConst(invisibleCppEditorDocuments)) { + for (Core::IDocument *document : std::as_const(invisibleCppEditorDocuments)) { const QString filePath = document->filePath().toString(); if (CppEditorDocumentHandle *theCppEditorDocument = cppEditorDocument(filePath)) { const CppEditorDocumentHandle::RefreshReason refreshReason = projectsUpdated @@ -1528,7 +1528,7 @@ QSet CppModelManager::dependingInternalTargets(const Utils::FilePath &f = correspondingHeaderOrSource(file.toString(), &wasHeader, CacheUsage::ReadOnly); const Utils::FilePaths dependingFiles = snapshot.filesDependingOn( wasHeader ? file : Utils::FilePath::fromString(correspondingFile)); - for (const Utils::FilePath &fn : qAsConst(dependingFiles)) { + for (const Utils::FilePath &fn : std::as_const(dependingFiles)) { for (const ProjectPart::ConstPtr &part : projectPart(fn)) result.insert(part->buildSystemTarget); } diff --git a/src/plugins/cppeditor/cppmodelmanager_test.cpp b/src/plugins/cppeditor/cppmodelmanager_test.cpp index 5f0deb7af94..42ce1809472 100644 --- a/src/plugins/cppeditor/cppmodelmanager_test.cpp +++ b/src/plugins/cppeditor/cppmodelmanager_test.cpp @@ -470,7 +470,7 @@ void ModelManagerTest::testRefreshTimeStampModifiedIfSourcefilesChange() QCOMPARE(refreshedFiles.size(), initialProjectFiles.size()); snapshot = mm->snapshot(); - for (const QString &file : qAsConst(initialProjectFiles)) { + for (const QString &file : std::as_const(initialProjectFiles)) { QVERIFY(refreshedFiles.contains(file)); QVERIFY(snapshot.contains(file)); } @@ -499,7 +499,7 @@ void ModelManagerTest::testRefreshTimeStampModifiedIfSourcefilesChange() QCOMPARE(refreshedFiles.size(), finalProjectFiles.size()); snapshot = mm->snapshot(); - for (const QString &file : qAsConst(finalProjectFiles)) { + for (const QString &file : std::as_const(finalProjectFiles)) { QVERIFY(refreshedFiles.contains(file)); QVERIFY(snapshot.contains(file)); } @@ -550,7 +550,7 @@ void ModelManagerTest::testSnapshotAfterTwoProjects() QCOMPARE(refreshedFiles, Utils::toSet(project1.projectFiles)); const int snapshotSizeAfterProject1 = mm->snapshot().size(); - for (const QString &file : qAsConst(project1.projectFiles)) + for (const QString &file : std::as_const(project1.projectFiles)) QVERIFY(mm->snapshot().contains(file)); // Project 2 @@ -565,9 +565,9 @@ void ModelManagerTest::testSnapshotAfterTwoProjects() QVERIFY(snapshotSizeAfterProject2 > snapshotSizeAfterProject1); QVERIFY(snapshotSizeAfterProject2 >= snapshotSizeAfterProject1 + project2.projectFiles.size()); - for (const QString &file : qAsConst(project1.projectFiles)) + for (const QString &file : std::as_const(project1.projectFiles)) QVERIFY(mm->snapshot().contains(file)); - for (const QString &file : qAsConst(project2.projectFiles)) + for (const QString &file : std::as_const(project2.projectFiles)) QVERIFY(mm->snapshot().contains(file)); } @@ -995,7 +995,7 @@ void ModelManagerTest::testRenameIncludes() // Copy test files to a temporary directory QSet sourceFiles; - for (const QString &fileName : qAsConst(fileNames)) { + for (const QString &fileName : std::as_const(fileNames)) { const QString &file = workingDir.filePath(fileName); QVERIFY(QFile::copy(testDir.file(fileName), file)); // Saving source file names for the model manager update, @@ -1008,7 +1008,7 @@ void ModelManagerTest::testRenameIncludes() modelManager->updateSourceFiles(sourceFiles).waitForFinished(); QCoreApplication::processEvents(); CPlusPlus::Snapshot snapshot = modelManager->snapshot(); - for (const QString &sourceFile : qAsConst(sourceFiles)) + for (const QString &sourceFile : std::as_const(sourceFiles)) QCOMPARE(snapshot.allIncludesForDocument(sourceFile), QSet{oldHeader}); // Renaming the header @@ -1020,7 +1020,7 @@ void ModelManagerTest::testRenameIncludes() modelManager->updateSourceFiles(sourceFiles).waitForFinished(); QCoreApplication::processEvents(); snapshot = modelManager->snapshot(); - for (const QString &sourceFile : qAsConst(sourceFiles)) + for (const QString &sourceFile : std::as_const(sourceFiles)) QCOMPARE(snapshot.allIncludesForDocument(sourceFile), QSet{newHeader}); } @@ -1066,7 +1066,7 @@ void ModelManagerTest::testRenameIncludesInEditor() modelManager->updateSourceFiles(sourceFiles).waitForFinished(); QCoreApplication::processEvents(); CPlusPlus::Snapshot snapshot = modelManager->snapshot(); - for (const QString &sourceFile : qAsConst(sourceFiles)) + for (const QString &sourceFile : std::as_const(sourceFiles)) QCOMPARE(snapshot.allIncludesForDocument(sourceFile), QSet{headerWithPragmaOnce}); // Open a file in the editor @@ -1144,7 +1144,7 @@ void ModelManagerTest::testRenameIncludesInEditor() modelManager->updateSourceFiles(sourceFiles).waitForFinished(); QCoreApplication::processEvents(); snapshot = modelManager->snapshot(); - for (const QString &sourceFile : qAsConst(sourceFiles)) + for (const QString &sourceFile : std::as_const(sourceFiles)) QCOMPARE(snapshot.allIncludesForDocument(sourceFile), QSet{renamedHeaderWithPragmaOnce}); } diff --git a/src/plugins/cppeditor/cppprojectupdater.cpp b/src/plugins/cppeditor/cppprojectupdater.cpp index 6fbc01223cb..52d55457c48 100644 --- a/src/plugins/cppeditor/cppprojectupdater.cpp +++ b/src/plugins/cppeditor/cppprojectupdater.cpp @@ -66,7 +66,7 @@ void CppProjectUpdater::update(const ProjectUpdateInfo &projectUpdateInfo, m_futureSynchronizer.addFuture(generateFuture); // extra compilers - for (QPointer compiler : qAsConst(m_extraCompilers)) { + for (QPointer compiler : std::as_const(m_extraCompilers)) { if (compiler->isDirty()) { QPointer> watcher = new QFutureWatcher; // queued connection to delay after the extra compiler updated its result contents, @@ -135,7 +135,7 @@ void CppProjectUpdater::checkForExtraCompilersFinished() QList extraCompilers; QSet compilerFiles; - for (const QPointer &compiler : qAsConst(m_extraCompilers)) { + for (const QPointer &compiler : std::as_const(m_extraCompilers)) { if (compiler) { extraCompilers += compiler.data(); compilerFiles += Utils::transform(compiler->targets(), &Utils::FilePath::toString); diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 0e5ad70b8e0..060eb808a93 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -69,7 +69,7 @@ BaseQuickFixTestCase::BaseQuickFixTestCase(const QList &testDoc // Check if there is exactly one cursor marker unsigned cursorMarkersCount = 0; - for (const TestDocumentPtr &document : qAsConst(m_testDocuments)) { + for (const TestDocumentPtr &document : std::as_const(m_testDocuments)) { if (document->hasCursorMarker()) ++cursorMarkersCount; } @@ -78,7 +78,7 @@ BaseQuickFixTestCase::BaseQuickFixTestCase(const QList &testDoc // Write documents to disk m_temporaryDirectory.reset(new TemporaryDir); QVERIFY(m_temporaryDirectory->isValid()); - for (const TestDocumentPtr &document : qAsConst(m_testDocuments)) { + for (const TestDocumentPtr &document : std::as_const(m_testDocuments)) { if (QFileInfo(document->m_fileName).isRelative()) document->setBaseDirectory(m_temporaryDirectory->path()); document->writeToDisk(); @@ -93,12 +93,12 @@ BaseQuickFixTestCase::BaseQuickFixTestCase(const QList &testDoc // Update Code Model QSet filePaths; - for (const TestDocumentPtr &document : qAsConst(m_testDocuments)) + for (const TestDocumentPtr &document : std::as_const(m_testDocuments)) filePaths << document->filePath(); QVERIFY(parseFiles(filePaths)); // Open Files - for (const TestDocumentPtr &document : qAsConst(m_testDocuments)) { + for (const TestDocumentPtr &document : std::as_const(m_testDocuments)) { QVERIFY(openCppEditor(document->filePath(), &document->m_editor, &document->m_editorWidget)); closeEditorAtEndOfTestCase(document->m_editor); @@ -127,7 +127,7 @@ BaseQuickFixTestCase::BaseQuickFixTestCase(const QList &testDoc m_cppCodeStylePreferences->setCurrentDelegate("qt"); // Find the document having the cursor marker - for (const TestDocumentPtr &document : qAsConst(m_testDocuments)) { + for (const TestDocumentPtr &document : std::as_const(m_testDocuments)) { if (document->hasCursorMarker()){ m_documentWithMarker = document; break; @@ -149,7 +149,7 @@ BaseQuickFixTestCase::~BaseQuickFixTestCase() m_modelManager->setHeaderPaths(m_headerPathsToRestore); // Remove created files from file system - for (const TestDocumentPtr &testDocument : qAsConst(m_testDocuments)) + for (const TestDocumentPtr &testDocument : std::as_const(m_testDocuments)) QVERIFY(QFile::remove(testDocument->filePath())); } @@ -201,7 +201,7 @@ QuickFixOperationTest::QuickFixOperationTest(const QList &testD operation->perform(); // Compare all files - for (const TestDocumentPtr &testDocument : qAsConst(m_testDocuments)) { + for (const TestDocumentPtr &testDocument : std::as_const(m_testDocuments)) { // Check QString result = testDocument->m_editorWidget->document()->toPlainText(); removeTrailingWhitespace(result); @@ -247,7 +247,7 @@ QuickFixOfferedOperationsTest::QuickFixOfferedOperationsTest( // Convert to QStringList QStringList actualOperationsAsStringList; - for (const QuickFixOperation::Ptr &operation : qAsConst(actualOperations)) + for (const QuickFixOperation::Ptr &operation : std::as_const(actualOperations)) actualOperationsAsStringList << operation->description(); QCOMPARE(actualOperationsAsStringList, expectedOperations); @@ -5865,7 +5865,7 @@ void QuickfixTest::testAddIncludeForUndefinedIdentifier() TemporaryDir temporaryDir; QVERIFY(temporaryDir.isValid()); - for (const TestDocumentPtr &testDocument : qAsConst(testDocuments)) + for (const TestDocumentPtr &testDocument : std::as_const(testDocuments)) testDocument->setBaseDirectory(temporaryDir.path()); QScopedPointer factory; diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index cdfc4d7878f..0c33c377332 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -2064,7 +2064,7 @@ void AddIncludeForUndefinedIdentifier::match(const CppQuickFixInterface &interfa if (matchName(nameAst->name, &matches, &className)) { QList indexItems; const Snapshot forwardHeaders = forwardingHeaders(interface); - for (const Core::LocatorFilterEntry &entry : qAsConst(matches)) { + for (const Core::LocatorFilterEntry &entry : std::as_const(matches)) { IndexItem::Ptr info = entry.internalData.value(); if (!info || info->symbolName() != className) continue; @@ -2076,7 +2076,7 @@ void AddIncludeForUndefinedIdentifier::match(const CppQuickFixInterface &interfa headerAndItsForwardingHeaders << Utils::FilePath::fromString(info->fileName()); headerAndItsForwardingHeaders += localForwardHeaders.filesDependingOn(info->fileName()); - for (const Utils::FilePath &header : qAsConst(headerAndItsForwardingHeaders)) { + for (const Utils::FilePath &header : std::as_const(headerAndItsForwardingHeaders)) { const QString include = findShortestInclude(currentDocumentFilePath, header.toString(), headerPaths); @@ -2443,7 +2443,7 @@ static Enum *findEnum(const QList &results, const LookupContext &ctx const Name *referenceName = namedType->name(); if (const QualifiedNameId *qualifiedName = referenceName->asQualifiedNameId()) referenceName = qualifiedName->name(); - for (Enum *e : qAsConst(enums)) { + for (Enum *e : std::as_const(enums)) { if (const Name *candidateName = e->name()) { if (candidateName->match(referenceName)) return e; @@ -3221,7 +3221,7 @@ private: { QList unimplemented; SymbolFinder symbolFinder; - for (Symbol * const s : qAsConst(m_declarations)) { + for (Symbol * const s : std::as_const(m_declarations)) { if (!symbolFinder.findMatchingDefinition(s, snapshot())) unimplemented << s; } @@ -3262,7 +3262,7 @@ private: const auto incDefPos = [&defPos] { defPos = (defPos + 1) % (DefPosImplementationFile + 2); }; - for (Symbol * const func : qAsConst(unimplemented)) { + for (Symbol * const func : std::as_const(unimplemented)) { incDefPos(); if (defPos > DefPosImplementationFile) continue; @@ -3303,7 +3303,7 @@ private: }; QHash>> changeSets; - for (const MemberFunctionImplSetting &setting : qAsConst(settings)) { + for (const MemberFunctionImplSetting &setting : std::as_const(settings)) { DeclFinder finder(currentFile().data(), setting.func); finder.accept(m_classAST); QTC_ASSERT(finder.decl(), continue); @@ -4677,7 +4677,7 @@ public: } const QStringList memberFunctionsAsStrings = toStringList(memberFunctions); - for (Symbol *const member : qAsConst(dataMembers)) { + for (Symbol *const member : std::as_const(dataMembers)) { ExistingGetterSetterData existing; existing.memberVariableName = QString::fromUtf8(member->identifier()->chars(), member->identifier()->size()); @@ -6922,7 +6922,7 @@ void AssignToLocalVariable::match(const CppQuickFixInterface &interface, QuickFi TypeOfExpression::Preprocess); } - for (const LookupItem &item : qAsConst(items)) { + for (const LookupItem &item : std::as_const(items)) { if (!item.declaration()) continue; @@ -7254,7 +7254,7 @@ public: ChangeSet changes; bool replace = true; - for (const QByteArray &chunk : qAsConst(newContents)) { + for (const QByteArray &chunk : std::as_const(newContents)) { const QString str = decoder->toUnicode(chunk); const QByteArray utf8buf = str.toUtf8(); if (!utf8codec->canEncode(str) || chunk != utf8buf) @@ -7370,7 +7370,7 @@ bool findRawAccessFunction(Class *klass, PointerType *pointerType, QString *objA break; default: // Multiple candidates - prefer a function named data - for (Function *func : qAsConst(candidates)) { + for (Function *func : std::as_const(candidates)) { if (!strcmp(func->name()->identifier()->chars(), "data")) { funcName = func->name(); break; @@ -8111,7 +8111,7 @@ private: processIncludes(refactoring, filePath().toString()); } - for (auto &file : qAsConst(m_changes)) + for (auto &file : std::as_const(m_changes)) file->apply(); } diff --git a/src/plugins/cppeditor/cppquickfixsettingswidget.cpp b/src/plugins/cppeditor/cppquickfixsettingswidget.cpp index 2917dca1491..59af9963ab2 100644 --- a/src/plugins/cppeditor/cppquickfixsettingswidget.cpp +++ b/src/plugins/cppeditor/cppquickfixsettingswidget.cpp @@ -140,7 +140,7 @@ void CppQuickFixSettingsWidget::loadSettings(CppQuickFixSettings *settings) ui->checkBox_signalWithNewValue->setChecked(settings->signalWithNewValue); ui->useAutoCheckBox->setChecked(settings->useAuto); ui->valueTypes->clear(); - for (const auto &valueType : qAsConst(settings->valueTypes)) { + for (const auto &valueType : std::as_const(settings->valueTypes)) { auto item = new QListWidgetItem(valueType, ui->valueTypes); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren); diff --git a/src/plugins/cppeditor/cpptoolstestcase.cpp b/src/plugins/cppeditor/cpptoolstestcase.cpp index 0d361f1ae7a..2d83897e96d 100644 --- a/src/plugins/cppeditor/cpptoolstestcase.cpp +++ b/src/plugins/cppeditor/cpptoolstestcase.cpp @@ -382,7 +382,7 @@ ProjectOpenerAndCloser::~ProjectOpenerAndCloser() hasGcFinished = true; }); - for (Project *project : qAsConst(m_openProjects)) + for (Project *project : std::as_const(m_openProjects)) ProjectExplorerPlugin::unloadProject(project); QElapsedTimer t; diff --git a/src/plugins/cppeditor/fileandtokenactions_test.cpp b/src/plugins/cppeditor/fileandtokenactions_test.cpp index 83c15ef478b..0b781168bdc 100644 --- a/src/plugins/cppeditor/fileandtokenactions_test.cpp +++ b/src/plugins/cppeditor/fileandtokenactions_test.cpp @@ -144,7 +144,7 @@ TestActionsTestCase::TestActionsTestCase(const Actions &tokenActions, const Acti Utils::sort(filesToOpen); // Process all files from the projects - for (const QString &filePath : qAsConst(filesToOpen)) { + for (const QString &filePath : std::as_const(filesToOpen)) { // Skip e.g. "" if (!QFileInfo::exists(filePath)) continue; @@ -250,7 +250,7 @@ void TestActionsTestCase::undoChangesInAllEditorWidgets() void TestActionsTestCase::executeActionsOnEditorWidget(CppEditorWidget *editorWidget, TestActionsTestCase::Actions actions) { - for (const ActionPointer &action : qAsConst(actions)) + for (const ActionPointer &action : std::as_const(actions)) action->run(editorWidget); QApplication::processEvents(); } @@ -442,7 +442,7 @@ void RunAllQuickFixesTokenAction::run(CppEditorWidget *editorWidget) cppQuickFixFactory->match(qfi, operations); } - for (QuickFixOperation::Ptr operation : qAsConst(operations)) { + for (QuickFixOperation::Ptr operation : std::as_const(operations)) { qDebug() << " -- Performing Quick Fix" << operation->description(); operation->perform(); TestActionsTestCase::escape(); diff --git a/src/plugins/cppeditor/includeutils.cpp b/src/plugins/cppeditor/includeutils.cpp index 6aad8d0fa1b..5afb9958f81 100644 --- a/src/plugins/cppeditor/includeutils.cpp +++ b/src/plugins/cppeditor/includeutils.cpp @@ -117,7 +117,7 @@ LineForNewIncludeDirective::LineForNewIncludeDirective(const QTextDocument *text // Ignore *.moc includes if requested if (mocIncludeMode == IgnoreMocIncludes) { - for (const Document::Include &include : qAsConst(includes)) { + for (const Document::Include &include : std::as_const(includes)) { if (!include.unresolvedFileName().endsWith(QLatin1String(".moc"))) m_includes << include; } @@ -233,7 +233,7 @@ int LineForNewIncludeDirective::operator()(const QString &newIncludeFileName, IncludeGroups groupsSameIncludeDir; IncludeGroups groupsMixedIncludeDirs; - for (const IncludeGroup &group : qAsConst(groupsMatchingIncludeType)) { + for (const IncludeGroup &group : std::as_const(groupsMatchingIncludeType)) { if (group.hasCommonIncludeDir()) groupsSameIncludeDir << group; else @@ -241,7 +241,7 @@ int LineForNewIncludeDirective::operator()(const QString &newIncludeFileName, } IncludeGroups groupsMatchingIncludeDir; - for (const IncludeGroup &group : qAsConst(groupsSameIncludeDir)) { + for (const IncludeGroup &group : std::as_const(groupsSameIncludeDir)) { if (group.commonIncludeDir() == includeDir(pureIncludeFileName)) groupsMatchingIncludeDir << group; } @@ -251,7 +251,7 @@ int LineForNewIncludeDirective::operator()(const QString &newIncludeFileName, if (!groupsMatchingIncludeDir.isEmpty()) { // The group with the longest common matching prefix is the best group int longestPrefixSoFar = 0; - for (const IncludeGroup &group : qAsConst(groupsMatchingIncludeDir)) { + for (const IncludeGroup &group : std::as_const(groupsMatchingIncludeDir)) { const int groupPrefixLength = group.commonPrefix().length(); if (groupPrefixLength >= longestPrefixSoFar) { bestGroup = group; @@ -272,12 +272,12 @@ int LineForNewIncludeDirective::operator()(const QString &newIncludeFileName, // group with mixed include dirs } else { IncludeGroups groupsIncludeDir; - for (const IncludeGroup &group : qAsConst(groupsMixedIncludeDirs)) { + for (const IncludeGroup &group : std::as_const(groupsMixedIncludeDirs)) { groupsIncludeDir.append( IncludeGroup::detectIncludeGroupsByIncludeDir(group.includes())); } IncludeGroup localBestIncludeGroup = IncludeGroup(QList()); - for (const IncludeGroup &group : qAsConst(groupsIncludeDir)) { + for (const IncludeGroup &group : std::as_const(groupsIncludeDir)) { if (group.commonIncludeDir() == includeDir(pureIncludeFileName)) localBestIncludeGroup = group; } @@ -307,7 +307,7 @@ QList IncludeGroup::detectIncludeGroupsByNewLines(QList currentIncludes; bool isFirst = true; - for (const Include &include : qAsConst(includes)) { + for (const Include &include : std::as_const(includes)) { // First include... if (isFirst) { isFirst = false; @@ -424,7 +424,7 @@ QList IncludeGroup::filterMixedIncludeGroups(const QList pies = mm->projectInfos(); - for (Project * const p : qAsConst(m_projects)) { + for (Project * const p : std::as_const(m_projects)) { ProjectExplorer::SessionManager::removeProject(p); emit aboutToRemoveProject(p); } diff --git a/src/plugins/cppeditor/projectinfo.cpp b/src/plugins/cppeditor/projectinfo.cpp index 8c0daf37d60..4dcb7cd6f49 100644 --- a/src/plugins/cppeditor/projectinfo.cpp +++ b/src/plugins/cppeditor/projectinfo.cpp @@ -62,7 +62,7 @@ static QSet getSourceFiles(const QVector &projec { QSet sourceFiles; for (const ProjectPart::ConstPtr &part : projectParts) { - for (const ProjectFile &file : qAsConst(part->files)) + for (const ProjectFile &file : std::as_const(part->files)) sourceFiles.insert(file.path); } return sourceFiles; @@ -83,7 +83,7 @@ static ProjectExplorer::HeaderPaths getHeaderPaths( { QSet uniqueHeaderPaths; for (const ProjectPart::ConstPtr &part : projectParts) { - for (const ProjectExplorer::HeaderPath &headerPath : qAsConst(part->headerPaths)) + for (const ProjectExplorer::HeaderPath &headerPath : std::as_const(part->headerPaths)) uniqueHeaderPaths.insert(headerPath); } return ProjectExplorer::HeaderPaths(uniqueHeaderPaths.cbegin(), uniqueHeaderPaths.cend()); diff --git a/src/plugins/cppeditor/projectpart.cpp b/src/plugins/cppeditor/projectpart.cpp index ee53e61ad2d..464c138cc8b 100644 --- a/src/plugins/cppeditor/projectpart.cpp +++ b/src/plugins/cppeditor/projectpart.cpp @@ -76,7 +76,7 @@ static HeaderPaths getHeaderPaths(const RawProjectPart &rpp, // Prevent duplicate include paths. // TODO: Do this once when finalizing the raw project part? std::set seenPaths; - for (const HeaderPath &p : qAsConst(rpp.headerPaths)) { + for (const HeaderPath &p : std::as_const(rpp.headerPaths)) { const QString cleanPath = QDir::cleanPath(p.path); if (seenPaths.insert(cleanPath).second) headerPaths << HeaderPath(cleanPath, p.type); diff --git a/src/plugins/cppeditor/symbolfinder.cpp b/src/plugins/cppeditor/symbolfinder.cpp index a2df28b5f77..df93d36246d 100644 --- a/src/plugins/cppeditor/symbolfinder.cpp +++ b/src/plugins/cppeditor/symbolfinder.cpp @@ -268,7 +268,7 @@ Symbol *SymbolFinder::findMatchingVarDefinition(Symbol *declaration, const Snaps candidates << fallbacks; SymbolWithPriority best; - for (const auto &candidate : qAsConst(candidates)) { + for (const auto &candidate : std::as_const(candidates)) { if (candidate.first == declaration) continue; if (QLatin1String(candidate.first->fileName()) == declFile diff --git a/src/plugins/cppeditor/typehierarchybuilder_test.cpp b/src/plugins/cppeditor/typehierarchybuilder_test.cpp index d83b7fa5913..5a1a5a1028d 100644 --- a/src/plugins/cppeditor/typehierarchybuilder_test.cpp +++ b/src/plugins/cppeditor/typehierarchybuilder_test.cpp @@ -34,7 +34,7 @@ QString toString(const TypeHierarchy &hierarchy, int indent = 0) Utils::sort(sortedHierarchy, [&oo](const TypeHierarchy &h1, const TypeHierarchy &h2) -> bool { return oo.prettyName(h1.symbol()->name()) < oo.prettyName(h2.symbol()->name()); }); - for (const TypeHierarchy &childHierarchy : qAsConst(sortedHierarchy)) + for (const TypeHierarchy &childHierarchy : std::as_const(sortedHierarchy)) result += toString(childHierarchy, indent + 2); return result; } diff --git a/src/plugins/ctfvisualizer/ctftracemanager.cpp b/src/plugins/ctfvisualizer/ctftracemanager.cpp index 980aa3363f1..879e8fdd33f 100644 --- a/src/plugins/ctfvisualizer/ctftracemanager.cpp +++ b/src/plugins/ctfvisualizer/ctftracemanager.cpp @@ -177,7 +177,7 @@ void CtfTraceManager::finalize() ++it; } } - for (CtfTimelineModel *model: qAsConst(m_threadModels)) { + for (CtfTimelineModel *model: std::as_const(m_threadModels)) { model->finalize(m_traceBegin, m_traceEnd, m_processNames[model->m_processId], m_threadNames[model->m_threadId]); } @@ -256,7 +256,7 @@ void CtfTraceManager::updateStatistics() }); m_statisticsModel->beginLoading(); - for (auto thread : qAsConst(m_threadModels)) { + for (auto thread : std::as_const(m_threadModels)) { if (showAll || m_threadRestrictions[thread->tid()]) { const int eventCount = thread->count(); @@ -273,7 +273,7 @@ void CtfTraceManager::updateStatistics() void CtfTraceManager::clearAll() { m_modelAggregator->clear(); - for (CtfTimelineModel *model: qAsConst(m_threadModels)) { + for (CtfTimelineModel *model: std::as_const(m_threadModels)) { model->deleteLater(); } m_threadModels.clear(); diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index e54114b7e8d..91e6c9c0d1e 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -2035,7 +2035,7 @@ void BreakHandler::releaseAllBreakpoints() } clear(); // Make now-unclaimed breakpoints globally visible again. - for (GlobalBreakpoint gbp: qAsConst(gbps)) { + for (GlobalBreakpoint gbp: std::as_const(gbps)) { if (gbp) gbp->updateMarker(); } diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 9e8496e246b..b0da3a13637 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -991,7 +991,7 @@ void CdbEngine::runCommand(const DebuggerCommand &dbgCmd) } QTC_CHECK(argumentSplitPos == arguments.size()); int tokenPart = splittedArguments.size(); - for (QStringView part : qAsConst(splittedArguments)) + for (QStringView part : std::as_const(splittedArguments)) str << prefix << " -t " << token << '.' << --tokenPart << ' ' << part << '\n'; } else { cmd = prefix; @@ -2019,7 +2019,7 @@ void CdbEngine::handleSessionIdle(const QString &message) elapsedLogTime(), qPrintable(message), qPrintable(stateName(state()))); - for (const InterruptCallback &callback : qAsConst(m_interrupCallbacks)) + for (const InterruptCallback &callback : std::as_const(m_interrupCallbacks)) callback(); m_interrupCallbacks.clear(); diff --git a/src/plugins/debugger/cdb/cdboptionspage.cpp b/src/plugins/debugger/cdb/cdboptionspage.cpp index 419e3985702..a7440ea4e46 100644 --- a/src/plugins/debugger/cdb/cdboptionspage.cpp +++ b/src/plugins/debugger/cdb/cdboptionspage.cpp @@ -105,11 +105,11 @@ CdbBreakEventWidget::CdbBreakEventWidget(QWidget *parent) : QWidget(parent) void CdbBreakEventWidget::clear() { - for (QLineEdit *l : qAsConst(m_lineEdits)) { + for (QLineEdit *l : std::as_const(m_lineEdits)) { if (l) l->clear(); } - for (QCheckBox *c : qAsConst(m_checkBoxes)) + for (QCheckBox *c : std::as_const(m_checkBoxes)) c->setChecked(false); } diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 326fa93b733..695175bc01d 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -2840,7 +2840,7 @@ void CppDebuggerEngine::validateRunParameters(DebuggerRunParameters &rp) bool found = false; while (str < limit) { const QString string = QString::fromUtf8(str); - for (auto pair : qAsConst(globalRegExpSourceMap)) { + for (auto pair : std::as_const(globalRegExpSourceMap)) { const QRegularExpressionMatch match = pair.first.match(string); if (match.hasMatch()) { rp.sourcePathMap.insert(string.left(match.capturedStart()) + match.captured(1), @@ -2862,7 +2862,7 @@ void CppDebuggerEngine::validateRunParameters(DebuggerRunParameters &rp) if (hasEmbeddedInfo || hasLink) return; - for (const QByteArray &name : qAsConst(interesting)) { + for (const QByteArray &name : std::as_const(interesting)) { const QString found = seen.contains(name) ? Tr::tr("Found.") : Tr::tr("Not found."); detailedWarning.append('\n' + Tr::tr("Section %1: %2").arg(QString::fromUtf8(name)).arg(found)); diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp index 5c4c973aefd..8602f031fdf 100644 --- a/src/plugins/debugger/debuggeritemmanager.cpp +++ b/src/plugins/debugger/debuggeritemmanager.cpp @@ -651,7 +651,7 @@ void DebuggerItemManagerPrivate::autoDetectCdbDebuggers() } } - for (const FilePath &cdb : qAsConst(cdbs)) { + for (const FilePath &cdb : std::as_const(cdbs)) { if (DebuggerItemManager::findByCommand(cdb)) continue; DebuggerItem item; @@ -738,7 +738,7 @@ void DebuggerItemManagerPrivate::autoDetectGdbOrLldbDebuggers(const FilePaths &s path.iterateDirectory(addSuspect, {filters, QDir::Files | QDir::Executable}); QStringList logMessages{Tr::tr("Searching debuggers...")}; - for (const FilePath &command : qAsConst(suspects)) { + for (const FilePath &command : std::as_const(suspects)) { const auto commandMatches = [command](const DebuggerTreeItem *titem) { return titem->m_item.command() == command; }; diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index af1ab3ab194..b4ee7cf1ac9 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -182,7 +182,7 @@ DebuggerMainWindowPrivate::DebuggerMainWindowPrivate(DebuggerMainWindow *parent) m_perspectiveMenu = new QMenu; connect(m_perspectiveMenu, &QMenu::aboutToShow, this, [this] { m_perspectiveMenu->clear(); - for (Perspective *perspective : qAsConst(m_perspectives)) { + for (Perspective *perspective : std::as_const(m_perspectives)) { m_perspectiveMenu->addAction(perspective->d->m_name, perspective, [perspective] { if (auto subPerspective = Perspective::findPerspective( perspective->d->m_lastActiveSubPerspectiveId)) @@ -875,7 +875,7 @@ Context PerspectivePrivate::context() const PerspectivePrivate::~PerspectivePrivate() { - for (const DockOperation &op : qAsConst(m_dockOperations)) + for (const DockOperation &op : std::as_const(m_dockOperations)) delete op.widget; } diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index c6d256a1233..63517e48b92 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1819,7 +1819,7 @@ void DebuggerPluginPrivate::attachToQmlPort() void DebuggerPluginPrivate::runScheduled() { - for (DebuggerRunTool *debugger : qAsConst(m_scheduledStarts)) + for (DebuggerRunTool *debugger : std::as_const(m_scheduledStarts)) debugger->startRunControl(); } @@ -2494,7 +2494,7 @@ void DebuggerUnitTests::testDebuggerMatching() auto expectedLevel = static_cast(result); Abis debuggerAbis; - for (const QString &abi : qAsConst(debugger)) + for (const QString &abi : std::as_const(debugger)) debuggerAbis << Abi::fromString(abi); DebuggerItem item; diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index ef045c2abbd..d72c57fe6f1 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -188,7 +188,7 @@ void DebuggerRunTool::setStartMode(DebuggerStartMode startMode) projects.removeOne(startupProject); projects.insert(0, startupProject); } - for (Project *project : qAsConst(projects)) + for (Project *project : std::as_const(projects)) m_runParameters.projectSourceFiles.append(project->files(Project::SourceFiles)); if (!projects.isEmpty()) m_runParameters.projectSourceDirectory = projects.first()->projectDirectory(); diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp index 20021e9798c..d853bc8f009 100644 --- a/src/plugins/debugger/debuggertooltipmanager.cpp +++ b/src/plugins/debugger/debuggertooltipmanager.cpp @@ -669,7 +669,7 @@ public: void DebuggerToolTipManagerPrivate::hideAllToolTips() { purgeClosedToolTips(); - for (const DebuggerToolTipHolder *tooltip : qAsConst(m_tooltips)) + for (const DebuggerToolTipHolder *tooltip : std::as_const(m_tooltips)) tooltip->widget->hide(); } @@ -996,7 +996,7 @@ void DebuggerToolTipManagerPrivate::updateVisibleToolTips() } // Reposition and show all tooltips of that file. - for (DebuggerToolTipHolder *tooltip : qAsConst(m_tooltips)) { + for (DebuggerToolTipHolder *tooltip : std::as_const(m_tooltips)) { if (tooltip->context.fileName == filePath) tooltip->positionShow(toolTipEditor->editorWidget()); else @@ -1012,7 +1012,7 @@ void DebuggerToolTipManager::updateToolTips() // Stack frame changed: All tooltips of that file acquire the engine, // all others release (arguable, this could be more precise?) - for (DebuggerToolTipHolder *tooltip : qAsConst(d->m_tooltips)) + for (DebuggerToolTipHolder *tooltip : std::as_const(d->m_tooltips)) tooltip->updateTooltip(d->m_engine); d->updateVisibleToolTips(); // Move tooltip when stepping in same file. } @@ -1023,14 +1023,14 @@ void DebuggerToolTipManager::deregisterEngine() d->purgeClosedToolTips(); - for (DebuggerToolTipHolder *tooltip : qAsConst(d->m_tooltips)) + for (DebuggerToolTipHolder *tooltip : std::as_const(d->m_tooltips)) if (tooltip->context.engineType == d->m_engine->objectName()) tooltip->releaseEngine(); d->saveSessionData(); // FIXME: For now remove all. - for (DebuggerToolTipHolder *tooltip : qAsConst(d->m_tooltips)) + for (DebuggerToolTipHolder *tooltip : std::as_const(d->m_tooltips)) tooltip->destroy(); d->purgeClosedToolTips(); } @@ -1111,7 +1111,7 @@ void DebuggerToolTipManagerPrivate::saveSessionData() w.writeStartDocument(); w.writeStartElement(sessionDocumentC); w.writeAttribute(sessionVersionAttributeC, "1.0"); - for (DebuggerToolTipHolder *tooltip : qAsConst(m_tooltips)) + for (DebuggerToolTipHolder *tooltip : std::as_const(m_tooltips)) if (tooltip->widget->isPinned) tooltip->saveSessionData(w); w.writeEndDocument(); @@ -1127,7 +1127,7 @@ void DebuggerToolTipManager::closeAllToolTips() void DebuggerToolTipManagerPrivate::closeAllToolTips() { - for (DebuggerToolTipHolder *tooltip : qAsConst(m_tooltips)) + for (DebuggerToolTipHolder *tooltip : std::as_const(m_tooltips)) tooltip->destroy(); m_tooltips.clear(); } @@ -1135,7 +1135,7 @@ void DebuggerToolTipManagerPrivate::closeAllToolTips() void DebuggerToolTipManager::resetLocation() { d->purgeClosedToolTips(); - for (DebuggerToolTipHolder *tooltip : qAsConst(d->m_tooltips)) + for (DebuggerToolTipHolder *tooltip : std::as_const(d->m_tooltips)) tooltip->widget->pin(); } @@ -1306,7 +1306,7 @@ DebuggerToolTipContexts DebuggerToolTipManager::pendingTooltips() const { StackFrame frame = d->m_engine->stackHandler()->currentFrame(); DebuggerToolTipContexts rc; - for (DebuggerToolTipHolder *tooltip : qAsConst(d->m_tooltips)) { + for (DebuggerToolTipHolder *tooltip : std::as_const(d->m_tooltips)) { const DebuggerToolTipContext &context = tooltip->context; if (context.iname.startsWith("tooltip") && context.matchesFrame(frame)) rc.push_back(context); @@ -1323,7 +1323,7 @@ bool DebuggerToolTipManagerPrivate::eventFilter(QObject *o, QEvent *e) const auto me = static_cast(e); const QPoint dist = me->pos() - me->oldPos(); purgeClosedToolTips(); - for (DebuggerToolTipHolder *tooltip : qAsConst(m_tooltips)) { + for (DebuggerToolTipHolder *tooltip : std::as_const(m_tooltips)) { if (tooltip->widget && tooltip->widget->isVisible()) tooltip->widget->move(tooltip->widget->pos() + dist); } @@ -1335,7 +1335,7 @@ bool DebuggerToolTipManagerPrivate::eventFilter(QObject *o, QEvent *e) const bool isMinimized = static_cast(o)->windowState() & Qt::WindowMinimized; if (wasMinimized != isMinimized) { purgeClosedToolTips(); - for (DebuggerToolTipHolder *tooltip : qAsConst(m_tooltips)) + for (DebuggerToolTipHolder *tooltip : std::as_const(m_tooltips)) tooltip->widget->setVisible(!isMinimized); } break; diff --git a/src/plugins/debugger/disassembleragent.cpp b/src/plugins/debugger/disassembleragent.cpp index aed67a599c5..cfed65dfa24 100644 --- a/src/plugins/debugger/disassembleragent.cpp +++ b/src/plugins/debugger/disassembleragent.cpp @@ -345,7 +345,7 @@ void DisassemblerAgent::removeBreakpointMarker(const Breakpoint &bp) if (!d->document) return; - for (DisassemblerBreakpointMarker *marker : qAsConst(d->breakpointMarks)) { + for (DisassemblerBreakpointMarker *marker : std::as_const(d->breakpointMarks)) { if (marker->m_bp == bp) { d->breakpointMarks.removeOne(marker); d->document->removeMark(marker); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 30a1403f9ee..eca5b1729ca 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -798,13 +798,13 @@ void GdbEngine::commandTimeout() QList keys = m_commandForToken.keys(); Utils::sort(keys); bool killIt = false; - for (int key : qAsConst(keys)) { + for (int key : std::as_const(keys)) { const DebuggerCommand &cmd = m_commandForToken.value(key); killIt = true; showMessage(QString::number(key) + ": " + cmd.function); } QStringList commands; - for (const DebuggerCommand &cmd : qAsConst(m_commandForToken)) + for (const DebuggerCommand &cmd : std::as_const(m_commandForToken)) commands << QString("\"%1\"").arg(cmd.function); if (killIt) { showMessage(QString("TIMED OUT WAITING FOR GDB REPLY. " @@ -2910,7 +2910,7 @@ void GdbEngine::handleShowModuleSections(const DebuggerResponse &response, const QString needle = prefix + moduleName; Sections sections; bool active = false; - for (const QString &line : qAsConst(lines)) { + for (const QString &line : std::as_const(lines)) { if (line.startsWith(prefix)) { if (active) break; @@ -3815,7 +3815,7 @@ void GdbEngine::setupEngine() const QStringList testList = qtcEnvironmentVariable("QTC_DEBUGGER_TESTS").split(','); for (const QString &test : testList) m_testCases.insert(test.toInt()); - for (int test : qAsConst(m_testCases)) + for (int test : std::as_const(m_testCases)) showMessage("ENABLING TEST CASE: " + QString::number(test)); m_expectTerminalTrap = terminal(); @@ -4176,7 +4176,7 @@ void GdbEngine::resetCommandQueue() QString msg; QTextStream ts(&msg); ts << "RESETING COMMAND QUEUE. LEFT OVER TOKENS: "; - for (const DebuggerCommand &cmd : qAsConst(m_commandForToken)) + for (const DebuggerCommand &cmd : std::as_const(m_commandForToken)) ts << "CMD:" << cmd.function; m_commandForToken.clear(); m_flagsForToken.clear(); diff --git a/src/plugins/debugger/peripheralregisterhandler.cpp b/src/plugins/debugger/peripheralregisterhandler.cpp index 4d9a8341d87..3cd1a5ae8df 100644 --- a/src/plugins/debugger/peripheralregisterhandler.cpp +++ b/src/plugins/debugger/peripheralregisterhandler.cpp @@ -782,7 +782,7 @@ QMenu *PeripheralRegisterHandler::createRegisterGroupsMenu(DebuggerState state) const auto groupMenu = new QMenu(Tr::tr("View Groups")); const auto actionGroup = new QActionGroup(groupMenu); bool hasActions = false; - for (const PeripheralRegisterGroup &group : qAsConst(m_peripheralRegisterGroups)) { + for (const PeripheralRegisterGroup &group : std::as_const(m_peripheralRegisterGroups)) { const QString groupName = group.name; const QString actName = QStringLiteral("%1: %2").arg(groupName, group.description); QAction *act = groupMenu->addAction(actName); diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 5eb9b89e4d4..200803440e7 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -875,7 +875,7 @@ static ConsoleItem *constructLogItemTree(const QVariant &result, std::sort(children.begin(), children.end(), compareConsoleItems); item = new ConsoleItem(ConsoleItem::DefaultType, text); - for (ConsoleItem *child : qAsConst(children)) { + for (ConsoleItem *child : std::as_const(children)) { if (child) item->appendChild(child); } @@ -895,7 +895,7 @@ static ConsoleItem *constructLogItemTree(const QVariant &result, std::sort(children.begin(), children.end(), compareConsoleItems); item = new ConsoleItem(ConsoleItem::DefaultType, text); - for (ConsoleItem *child : qAsConst(children)) { + for (ConsoleItem *child : std::as_const(children)) { if (child) item->appendChild(child); } @@ -1804,7 +1804,7 @@ void QmlEnginePrivate::messageReceived(const QByteArray &data) } QMap files; - for (const QString &file : qAsConst(sourceFiles)) { + for (const QString &file : std::as_const(sourceFiles)) { QString shortName = file; QString fullName = engine->toFileInProject(file); files.insert(shortName, fullName); @@ -1856,7 +1856,7 @@ void QmlEnginePrivate::messageReceived(const QByteArray &data) int newColumn = sourceLineText.indexOf('(') + 1; - for (const Breakpoint &bp : qAsConst(v8Breakpoints)) { + for (const Breakpoint &bp : std::as_const(v8Breakpoints)) { QTC_ASSERT(bp, continue); const BreakpointParameters ¶ms = bp->requestedParameters(); @@ -1882,7 +1882,7 @@ void QmlEnginePrivate::messageReceived(const QByteArray &data) if (inferiorStop) { //Update breakpoint data - for (const Breakpoint &bp : qAsConst(v8Breakpoints)) { + for (const Breakpoint &bp : std::as_const(v8Breakpoints)) { QTC_ASSERT(bp, continue); if (bp->functionName().isEmpty()) { bp->setFunctionName(invocationText); @@ -1895,7 +1895,7 @@ void QmlEnginePrivate::messageReceived(const QByteArray &data) } if (engine->state() == InferiorRunOk) { - for (const Breakpoint &bp : qAsConst(v8Breakpoints)) { + for (const Breakpoint &bp : std::as_const(v8Breakpoints)) { QTC_ASSERT(bp, continue); if (breakpointsTemp.contains(bp->responseId())) clearBreakpoint(bp); @@ -2238,7 +2238,7 @@ void QmlEnginePrivate::constructChildLogItems(ConsoleItem *item, const QmlV8Obje if (debuggerSettings()->sortStructMembers.value()) std::sort(children.begin(), children.end(), compareConsoleItems); - for (ConsoleItem *child : qAsConst(children)) + for (ConsoleItem *child : std::as_const(children)) item->appendChild(child); } @@ -2364,7 +2364,7 @@ void QmlEnginePrivate::handleExecuteDebuggerCommand(const QVariantMap &response) debuggerConsole()->printItem(constructLogItemTree(extractData(response.value(BODY)))); // Update the locals - for (int index : qAsConst(currentFrameScopes)) + for (int index : std::as_const(currentFrameScopes)) scope(index); } else { debuggerConsole()->printItem(new ConsoleItem(ConsoleItem::ErrorType, @@ -2439,7 +2439,7 @@ void QmlEnginePrivate::handleVersion(const QVariantMap &response) void QmlEnginePrivate::flushSendBuffer() { QTC_ASSERT(state() == Enabled, return); - for (const QByteArray &msg : qAsConst(sendBuffer)) + for (const QByteArray &msg : std::as_const(sendBuffer)) sendMessage(msg); sendBuffer.clear(); } diff --git a/src/plugins/debugger/qml/qmlinspectoragent.cpp b/src/plugins/debugger/qml/qmlinspectoragent.cpp index 8eb1eac5c0b..722ffd1e2d0 100644 --- a/src/plugins/debugger/qml/qmlinspectoragent.cpp +++ b/src/plugins/debugger/qml/qmlinspectoragent.cpp @@ -247,7 +247,7 @@ void QmlInspectorAgent::onResult(quint32 queryId, const QVariant &value, m_rootContexts.insert(engineId, qvariant_cast(value)); if (m_rootContexts.size() == m_engines.size()) { clearObjectTree(); - for (const auto &engine : qAsConst(m_engines)) { + for (const auto &engine : std::as_const(m_engines)) { QString name = engine.name(); if (name.isEmpty()) name = QString::fromLatin1("Engine %1").arg(engine.debugId()); @@ -270,7 +270,7 @@ void QmlInspectorAgent::newObject(int engineId, int /*objectId*/, int /*parentId log(LogReceive, "OBJECT_CREATED"); - for (const auto &engine : qAsConst(m_engines)) { + for (const auto &engine : std::as_const(m_engines)) { if (engine.debugId() == engineId) { m_delayQueryTimer.start(); break; @@ -361,7 +361,7 @@ void QmlInspectorAgent::queryEngineContext() m_rootContexts.clear(); m_rootContextQueryIds.clear(); - for (const auto &engine : qAsConst(m_engines)) + for (const auto &engine : std::as_const(m_engines)) m_rootContextQueryIds.append(m_engineClient->queryRootContexts(engine)); } @@ -424,7 +424,7 @@ void QmlInspectorAgent::verifyAndInsertObjectInTree(const ObjectReference &objec // Still not found? Maybe we're loading the engine itself. if (engineId == -1) { - for (const auto &engine : qAsConst(m_engines)) { + for (const auto &engine : std::as_const(m_engines)) { if (engine.debugId() == objectDebugId) { engineId = engine.debugId(); break; diff --git a/src/plugins/debugger/threadshandler.cpp b/src/plugins/debugger/threadshandler.cpp index e353c09a0f3..cc0920fb121 100644 --- a/src/plugins/debugger/threadshandler.cpp +++ b/src/plugins/debugger/threadshandler.cpp @@ -301,7 +301,7 @@ bool ThreadsHandler::notifyGroupExited(const QString &groupId) if (item->threadData.groupId == groupId) list.append(item); }); - for (ThreadItem *item : qAsConst(list)) + for (ThreadItem *item : std::as_const(list)) destroyItem(item); m_pidForGroupId.remove(groupId); diff --git a/src/plugins/debugger/uvsc/uvscclient.cpp b/src/plugins/debugger/uvsc/uvscclient.cpp index 961f838e501..c647b7b038c 100644 --- a/src/plugins/debugger/uvsc/uvscclient.cpp +++ b/src/plugins/debugger/uvsc/uvscclient.cpp @@ -551,7 +551,7 @@ bool UvscClient::inspectLocal(const QStringList &expandedLocalINames, } if (localIName == "local") { - for (const GdbMi &child : qAsConst(children)) + for (const GdbMi &child : std::as_const(children)) data.addChild(child); } else { const GdbMi childrenEntry = UvscUtils::buildChildrenEntry(children); diff --git a/src/plugins/debugger/uvsc/uvscengine.cpp b/src/plugins/debugger/uvsc/uvscengine.cpp index 7f874bfdf23..019f5eca4d0 100644 --- a/src/plugins/debugger/uvsc/uvscengine.cpp +++ b/src/plugins/debugger/uvsc/uvscengine.cpp @@ -684,7 +684,7 @@ void UvscEngine::handleReloadRegisters() showMessage(Tr::tr("UVSC: Reading registers failed."), LogMisc); } else { RegisterHandler *handler = registerHandler(); - for (const auto ® : qAsConst(m_registers)) + for (const auto ® : std::as_const(m_registers)) handler->updateRegister(reg.second); handler->commitUpdates(); } diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 1cd74cae4ad..8f93dadfec4 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1543,7 +1543,7 @@ MemoryMarkupList WatchModel::variableMemoryMarkup(WatchItem *item, name = ranges.at(i).second; } dbg << '\n'; - for (const MemoryMarkup &m : qAsConst(result)) + for (const MemoryMarkup &m : std::as_const(result)) dbg << m.address << ' ' << m.length << ' ' << m.toolTip << '\n'; } @@ -2139,7 +2139,7 @@ void WatchHandler::cleanup() { m_model->m_expandedINames.clear(); theWatcherNames.remove(QString()); - for (const QString &exp : qAsConst(theTemporaryWatchers)) + for (const QString &exp : std::as_const(theTemporaryWatchers)) theWatcherNames.remove(exp); theTemporaryWatchers.clear(); saveWatchers(); @@ -2171,7 +2171,7 @@ void WatchHandler::insertItems(const GdbMi &data) itemsToSort.insert(static_cast(item->parent())); } - for (WatchItem *toplevel : qAsConst(itemsToSort)) + for (WatchItem *toplevel : std::as_const(itemsToSort)) toplevel->sortChildren(&sortByName); } @@ -2210,7 +2210,7 @@ bool WatchHandler::insertItem(WatchItem *item) void WatchModel::reexpandItems() { - for (const QString &iname : qAsConst(m_expandedINames)) { + for (const QString &iname : std::as_const(m_expandedINames)) { if (WatchItem *item = findItem(iname)) { emit itemIsExpanded(indexForItem(item)); emit inameIsExpanded(iname); @@ -2266,7 +2266,7 @@ void WatchHandler::notifyUpdateStarted(const UpdateParameters &updateParameters) item->forAllChildren(marker); }); } else { - for (const QString &iname : qAsConst(inames)) { + for (const QString &iname : std::as_const(inames)) { if (WatchItem *item = m_model->findItem(iname)) item->forAllChildren(marker); } @@ -2288,7 +2288,7 @@ void WatchHandler::notifyUpdateFinished() return true; }); - for (WatchItem *item : qAsConst(toRemove)) + for (WatchItem *item : std::as_const(toRemove)) m_model->destroyItem(item); m_model->forAllItems([this](WatchItem *item) { @@ -2712,7 +2712,7 @@ QString WatchHandler::individualFormatRequests() const void WatchHandler::appendFormatRequests(DebuggerCommand *cmd) const { QJsonArray expanded; - for (const QString &name : qAsConst(m_model->m_expandedINames)) + for (const QString &name : std::as_const(m_model->m_expandedINames)) expanded.append(name); cmd->arg("expanded", expanded); diff --git a/src/plugins/designer/formeditorplugin.cpp b/src/plugins/designer/formeditorplugin.cpp index 6e8dffba5b6..d19a4363f6f 100644 --- a/src/plugins/designer/formeditorplugin.cpp +++ b/src/plugins/designer/formeditorplugin.cpp @@ -151,7 +151,7 @@ static FilePath otherFile() } // Try to find existing file with desired suffix const FilePath currentBaseName = current.parentDir().pathAppended(current.baseName() + '.'); - for (const QString &candidateSuffix : qAsConst(candidateSuffixes)) { + for (const QString &candidateSuffix : std::as_const(candidateSuffixes)) { const FilePath filePath = currentBaseName.stringAppended(candidateSuffix); if (filePath.isFile()) return filePath.absoluteFilePath(); diff --git a/src/plugins/designer/formeditorstack.cpp b/src/plugins/designer/formeditorstack.cpp index c99335a8216..f6f24c103a2 100644 --- a/src/plugins/designer/formeditorstack.cpp +++ b/src/plugins/designer/formeditorstack.cpp @@ -140,7 +140,7 @@ void FormEditorStack::updateFormWindowSelectionHandles() if (Designer::Constants::Internal::debug) qDebug() << "updateFormWindowSelectionHandles"; QDesignerFormWindowInterface *activeFormWindow = m_designerCore->formWindowManager()->activeFormWindow(); - for (const EditorData &fdm : qAsConst(m_formEditors)) { + for (const EditorData &fdm : std::as_const(m_formEditors)) { const bool active = activeFormWindow == fdm.widgetHost->formWindow(); fdm.widgetHost->updateFormWindowSelectionHandles(active); } @@ -168,7 +168,7 @@ void FormEditorStack::modeAboutToChange(Utils::Id mode) // Sync the editor when entering edit mode if (mode == Core::Constants::MODE_EDIT) - for (const EditorData &data : qAsConst(m_formEditors)) + for (const EditorData &data : std::as_const(m_formEditors)) data.formWindowEditor->formWindowFile()->syncXmlFromFormWindow(); } diff --git a/src/plugins/designer/gotoslot_test.cpp b/src/plugins/designer/gotoslot_test.cpp index ec3253f7a58..bfc200acd15 100644 --- a/src/plugins/designer/gotoslot_test.cpp +++ b/src/plugins/designer/gotoslot_test.cpp @@ -154,7 +154,7 @@ public: QVERIFY(EditorManager::currentDocument()->isModified()); // Wait for updated documents - for (TextEditor::BaseTextEditor *editor : qAsConst(editors)) { + for (TextEditor::BaseTextEditor *editor : std::as_const(editors)) { QElapsedTimer t; t.start(); const QString filePath = editor->document()->filePath().toString(); diff --git a/src/plugins/designer/qtcreatorintegration.cpp b/src/plugins/designer/qtcreatorintegration.cpp index 85e57a3db9a..e889e212222 100644 --- a/src/plugins/designer/qtcreatorintegration.cpp +++ b/src/plugins/designer/qtcreatorintegration.cpp @@ -477,7 +477,7 @@ bool QtCreatorIntegration::navigateToSlot(const QString &objectName, // Find the class definition (ui class defined as member or base class) // in the file itself or in the directly included files (order 1). - for (const Document::Ptr &d : qAsConst(docMap)) { + for (const Document::Ptr &d : std::as_const(docMap)) { LookupContext context(d, docTable); const ClassDocumentPtrPair cd = findClassRecursively(context, candidate, 1u); if (cd.first) { @@ -519,7 +519,7 @@ bool QtCreatorIntegration::navigateToSlot(const QString &objectName, workingCopy = CppEditor::CppModelManager::instance()->workingCopy(); docTable = CppEditor::CppModelManager::instance()->snapshot(); newDocTable = {}; - for (const auto &file : qAsConst(filePaths)) { + for (const auto &file : std::as_const(filePaths)) { const Document::Ptr doc = docTable.document(file); if (doc) newDocTable.insert(doc); diff --git a/src/plugins/designer/resourcehandler.cpp b/src/plugins/designer/resourcehandler.cpp index 6789792bacf..8bd426a773e 100644 --- a/src/plugins/designer/resourcehandler.cpp +++ b/src/plugins/designer/resourcehandler.cpp @@ -115,7 +115,7 @@ void ResourceHandler::updateResourcesHelper(bool updateProjectResources) // Check if the user has chosen to update the lacking resource inside designer if (dirty && updateProjectResources) { QStringList qrcPathsToBeAdded; - for (const QString &originalQrcPath : qAsConst(m_originalUiQrcPaths)) { + for (const QString &originalQrcPath : std::as_const(m_originalUiQrcPaths)) { if (!projectQrcFiles.contains(originalQrcPath) && !qrcPathsToBeAdded.contains(originalQrcPath)) qrcPathsToBeAdded.append(originalQrcPath); } diff --git a/src/plugins/designer/settingspage.cpp b/src/plugins/designer/settingspage.cpp index c84cc4f1e54..f767198b6d3 100644 --- a/src/plugins/designer/settingspage.cpp +++ b/src/plugins/designer/settingspage.cpp @@ -96,7 +96,7 @@ bool SettingsPageProvider::matches(const QRegularExpression ®ex) const for (size_t i = 0; i < itemCount; ++i) m_keywords << Utils::stripAccelerator(QCoreApplication::translate(uitext[i].context, uitext[i].value)); } - for (const QString &key : qAsConst(m_keywords)) { + for (const QString &key : std::as_const(m_keywords)) { if (key.contains(regex)) return true; } diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp index 07c4f31bd6e..8beb3027f05 100644 --- a/src/plugins/diffeditor/diffutils.cpp +++ b/src/plugins/diffeditor/diffutils.cpp @@ -1286,7 +1286,7 @@ static QList readGitPatch(QStringView patch, bool *ok, QFutureInterfac QList fileDataList; readOk = false; int i = 0; - for (const auto &patchInfo : qAsConst(patches)) { + for (const auto &patchInfo : std::as_const(patches)) { if (jobController) { if (jobController->isCanceled()) return {}; diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp index 1c9a83a93bc..b6a40b18ed0 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp @@ -432,7 +432,7 @@ UnifiedDiffOutput UnifiedDiffData::diffOutput(QFutureInterface &fi, int pr int i = 0; const int count = input.m_contextFileData.size(); - for (const FileData &fileData : qAsConst(input.m_contextFileData)) { + for (const FileData &fileData : std::as_const(input.m_contextFileData)) { const QString leftFileInfo = "--- " + fileData.fileInfo[LeftSide].fileName + '\n'; const QString rightFileInfo = "+++ " + fileData.fileInfo[RightSide].fileName + '\n'; output.diffData.m_fileInfo[blockNumber] = fileData.fileInfo; diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index d50e81ccbe6..0f08650618a 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -480,7 +480,7 @@ bool DockerDevicePrivate::createContainer() dockerCreate.addArgs({"-u", QString("%1:%2").arg(getuid()).arg(getgid())}); #endif - for (QString mount : qAsConst(m_data.mounts)) { + for (QString mount : std::as_const(m_data.mounts)) { if (mount.isEmpty()) continue; mount = q->mapToDevicePath(FilePath::fromUserInput(mount)); @@ -490,7 +490,7 @@ bool DockerDevicePrivate::createContainer() addTemporaryMount(Core::ICore::resourcePath("debugger/"), dumperPath); q->setDebugDumperPath(dumperPath); - for (const auto &[path, containerPath] : qAsConst(m_temporaryMounts)) { + for (const auto &[path, containerPath] : std::as_const(m_temporaryMounts)) { if (path.isEmpty()) continue; dockerCreate.addArgs({"-v", path.nativePath() + ':' + containerPath.nativePath()}); diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index bcde351b8c3..86eaa8efa12 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -6122,7 +6122,7 @@ bool FakeVimHandler::Private::handleExRegisterCommand(const ExCommand &cmd) } QString info; info += "--- Registers ---\n"; - for (char reg : qAsConst(regs)) { + for (char reg : std::as_const(regs)) { QString value = quoteUnprintable(registerContents(reg)); info += QString("\"%1 %2\n").arg(reg).arg(value); } @@ -6528,7 +6528,7 @@ bool FakeVimHandler::Private::handleExMultiRepeatCommand(const ExCommand &cmd) beginEditBlock(); - for (const QTextCursor &tc : qAsConst(matches)) { + for (const QTextCursor &tc : std::as_const(matches)) { setPosition(tc.position()); handleExCommand(innerCmd); } diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index cde11c1c220..12648471f8c 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -1396,7 +1396,7 @@ void FakeVimPluginPrivate::moveSomewhere(FakeVimHandler *handler, DistFunction f while (repeat < 0 || repeat-- > 0) { editors.removeOne(currentEditor); int bestValue = -1; - for (IEditor *editor : qAsConst(editors)) { + for (IEditor *editor : std::as_const(editors)) { QWidget *w = editor->widget(); QRect editorRect(w->mapToGlobal(w->geometry().topLeft()), w->mapToGlobal(w->geometry().bottomRight())); @@ -1428,7 +1428,7 @@ void FakeVimPluginPrivate::keepOnlyWindow() QList editors = EditorManager::visibleEditors(); editors.removeOne(currentEditor); - for (IEditor *editor : qAsConst(editors)) { + for (IEditor *editor : std::as_const(editors)) { EditorManager::activateEditor(editor); triggerAction(Core::Constants::REMOVE_CURRENT_SPLIT); } diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 7916ee020d2..c9b56a142ad 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -416,7 +416,7 @@ void GenericBuildSystem::parse(RefreshOptions options) QStringList normalPaths; QStringList frameworkPaths; const auto baseDir = Utils::FilePath::fromString(m_includesFileName).parentDir(); - for (const QString &rawPath : qAsConst(m_rawProjectIncludePaths)) { + for (const QString &rawPath : std::as_const(m_rawProjectIncludePaths)) { if (rawPath.startsWith("-F")) frameworkPaths << rawPath.mid(2); else @@ -440,7 +440,7 @@ FilePath GenericBuildSystem::findCommonSourceRoot() return FilePath::fromFileInfo(QFileInfo(m_filesFileName)); QString root = m_files.front().first.toString(); - for (const SourceFile &sourceFile : qAsConst(m_files)) { + for (const SourceFile &sourceFile : std::as_const(m_files)) { const QString item = sourceFile.first.toString(); if (root.length() > item.length()) root.truncate(item.length()); @@ -468,7 +468,7 @@ void GenericBuildSystem::refresh(RefreshOptions options) FilePath baseDir = findCommonSourceRoot(); std::vector> fileNodes; - for (const SourceFile &f : qAsConst(m_files)) { + for (const SourceFile &f : std::as_const(m_files)) { FileType fileType = FileType::Source; // ### FIXME if (f.first.endsWith(".qrc")) fileType = FileType::Resource; diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index c262f07c0bc..4deefcb734c 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -127,7 +127,7 @@ public: fn.append(nodes.first()->sha); nodes.removeFirst(); - for (const BranchNode *n : qAsConst(nodes)) + for (const BranchNode *n : std::as_const(nodes)) fn.append(n->name); return fn; @@ -390,7 +390,7 @@ Qt::ItemFlags BranchModel::flags(const QModelIndex &index) const void BranchModel::clear() { - for (BranchNode *root : qAsConst(d->rootNode->children)) { + for (BranchNode *root : std::as_const(d->rootNode->children)) { while (root->count()) delete root->children.takeLast(); } diff --git a/src/plugins/git/branchview.cpp b/src/plugins/git/branchview.cpp index eb8d5ad86e7..bc4f48277a8 100644 --- a/src/plugins/git/branchview.cpp +++ b/src/plugins/git/branchview.cpp @@ -392,7 +392,7 @@ bool BranchView::checkout() QList stashes; client->synchronousStashList(m_repository, &stashes); - for (const Stash &stash : qAsConst(stashes)) { + for (const Stash &stash : std::as_const(stashes)) { if (stash.message.startsWith(popMessageStart)) { branchCheckoutDialog.foundStashForNextBranch(); break; @@ -428,7 +428,7 @@ bool BranchView::checkout() QList stashes; QString stashName; client->synchronousStashList(m_repository, &stashes); - for (const Stash &stash : qAsConst(stashes)) { + for (const Stash &stash : std::as_const(stashes)) { if (stash.message.startsWith(popMessageStart)) { stashName = stash.name; break; diff --git a/src/plugins/git/gerrit/gerritmodel.cpp b/src/plugins/git/gerrit/gerritmodel.cpp index 9691a8266a4..cd4857edeb4 100644 --- a/src/plugins/git/gerrit/gerritmodel.cpp +++ b/src/plugins/git/gerrit/gerritmodel.cpp @@ -908,7 +908,7 @@ void GerritModel::resultRetrieved(const QByteArray &output) std::stable_sort(changes.begin(), changes.end(), gerritChangeLessThan); numberIndexHash.clear(); - for (const GerritChangePtr &c : qAsConst(changes)) { + for (const GerritChangePtr &c : std::as_const(changes)) { // Avoid duplicate entries for example in the (unlikely) // case people do self-reviews. if (!itemForNumber(c->number)) { diff --git a/src/plugins/git/gerrit/gerritremotechooser.cpp b/src/plugins/git/gerrit/gerritremotechooser.cpp index df628194ba9..2d319bc8cb8 100644 --- a/src/plugins/git/gerrit/gerritremotechooser.cpp +++ b/src/plugins/git/gerrit/gerritremotechooser.cpp @@ -103,7 +103,7 @@ bool GerritRemoteChooser::updateRemotes(bool forceReload) void GerritRemoteChooser::addRemote(const GerritServer &server, const QString &name) { if (!m_allowDups) { - for (const auto &remote : qAsConst(m_remotes)) { + for (const auto &remote : std::as_const(m_remotes)) { if (remote.second == server) return; } diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 386549993ff..002d603a431 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1796,7 +1796,7 @@ QString GitClient::synchronousTopic(const FilePath &workingDirectory) const const QString dereference("^{}"); QString remoteBranch; - for (const QString &ref : qAsConst(references)) { + for (const QString &ref : std::as_const(references)) { int derefInd = ref.indexOf(dereference); if (ref.startsWith(tagStart)) return ref.mid(tagStart.size(), (derefInd == -1) ? -1 : derefInd - tagStart.size()); @@ -1968,7 +1968,7 @@ bool GitClient::stashNameFromMessage(const FilePath &workingDirectory, QList stashes; if (!synchronousStashList(workingDirectory, &stashes, errorMessage)) return false; - for (const Stash &s : qAsConst(stashes)) { + for (const Stash &s : std::as_const(stashes)) { if (s.message == message) { *name = s.name; return true; @@ -2321,7 +2321,7 @@ void GitClient::updateSubmodulesIfNeeded(const FilePath &workingDirectory, bool void GitClient::finishSubmoduleUpdate() { - for (const FilePath &submoduleDir : qAsConst(m_updatedSubmodules)) + for (const FilePath &submoduleDir : std::as_const(m_updatedSubmodules)) endStashScope(submoduleDir); m_updatedSubmodules.clear(); } diff --git a/src/plugins/git/gitgrep.cpp b/src/plugins/git/gitgrep.cpp index 1e0fc3f1312..243952c2d41 100644 --- a/src/plugins/git/gitgrep.cpp +++ b/src/plugins/git/gitgrep.cpp @@ -108,7 +108,7 @@ public: } single.matchingLine = text; - for (const auto &match : qAsConst(matches)) { + for (const auto &match : std::as_const(matches)) { single.matchStart = match.matchStart; single.matchLength = match.matchLength; single.regexpCapturedTexts = match.regexpCapturedTexts; diff --git a/src/plugins/git/githighlighters.cpp b/src/plugins/git/githighlighters.cpp index a3b7547f080..046a8b0c66e 100644 --- a/src/plugins/git/githighlighters.cpp +++ b/src/plugins/git/githighlighters.cpp @@ -138,7 +138,7 @@ void GitRebaseHighlighter::highlightBlock(const QString &text) setFormat(match.capturedStart(), match.capturedLength(), formatForCategory(Format_Change)); } } else { - for (const RebaseAction &action : qAsConst(m_actions)) { + for (const RebaseAction &action : std::as_const(m_actions)) { const QRegularExpressionMatch match = action.exp.match(text); if (match.hasMatch()) { const int len = match.capturedLength(); diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 4a19145300b..f2e277a7552 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -1689,15 +1689,15 @@ void GitPluginPrivate::updateActions(VcsBasePluginPrivate::ActionState as) // Note: This menu is visible if there is no repository. Only // 'Create Repository'/'Show' actions should be available. const QString fileName = Utils::quoteAmpersands(state.currentFileName()); - for (ParameterAction *fileAction : qAsConst(m_fileActions)) + for (ParameterAction *fileAction : std::as_const(m_fileActions)) fileAction->setParameter(fileName); // If the current file looks like a patch, offer to apply m_applyCurrentFilePatchAction->setParameter(state.currentPatchFileDisplayName()); const QString projectName = state.currentProjectName(); - for (ParameterAction *projectAction : qAsConst(m_projectActions)) + for (ParameterAction *projectAction : std::as_const(m_projectActions)) projectAction->setParameter(projectName); - for (QAction *repositoryAction : qAsConst(m_repositoryActions)) + for (QAction *repositoryAction : std::as_const(m_repositoryActions)) repositoryAction->setEnabled(repositoryEnabled); m_submoduleUpdateAction->setVisible(repositoryEnabled diff --git a/src/plugins/gitlab/gitlabdialog.cpp b/src/plugins/gitlab/gitlabdialog.cpp index 7d95b2252d4..94de24d6f15 100644 --- a/src/plugins/gitlab/gitlabdialog.cpp +++ b/src/plugins/gitlab/gitlabdialog.cpp @@ -161,7 +161,7 @@ void GitLabDialog::updateRemotes() { m_remoteComboBox->clear(); const GitLabParameters *global = GitLabPlugin::globalParameters(); - for (const GitLabServer &server : qAsConst(global->gitLabServers)) + for (const GitLabServer &server : std::as_const(global->gitLabServers)) m_remoteComboBox->addItem(server.displayString(), QVariant::fromValue(server)); m_remoteComboBox->setCurrentIndex(m_remoteComboBox->findData( diff --git a/src/plugins/help/docsettingspage.cpp b/src/plugins/help/docsettingspage.cpp index 40223ea5d29..b532c3b0fdf 100644 --- a/src/plugins/help/docsettingspage.cpp +++ b/src/plugins/help/docsettingspage.cpp @@ -327,7 +327,7 @@ void DocSettingsPageWidget::removeDocumentation(const QList &items) Utils::sort(itemsByDecreasingRow, [](const QModelIndex &i1, const QModelIndex &i2) { return i1.row() > i2.row(); }); - for (const QModelIndex &item : qAsConst(itemsByDecreasingRow)) { + for (const QModelIndex &item : std::as_const(itemsByDecreasingRow)) { const int row = item.row(); const QString nameSpace = m_model.entryAt(row).nameSpace; diff --git a/src/plugins/help/helpindexfilter.cpp b/src/plugins/help/helpindexfilter.cpp index 55b22e97741..fd3473b57a0 100644 --- a/src/plugins/help/helpindexfilter.cpp +++ b/src/plugins/help/helpindexfilter.cpp @@ -84,7 +84,7 @@ QList HelpIndexFilter::matchesFor(QFutureInterface entries; - for (const QString &keyword : qAsConst(m_lastIndicesCache)) { + for (const QString &keyword : std::as_const(m_lastIndicesCache)) { const int index = keyword.indexOf(entry, 0, cs); LocatorFilterEntry filterEntry(this, keyword, QVariant(), m_icon); filterEntry.highlightInfo = {index, int(entry.length())}; diff --git a/src/plugins/help/helpwidget.cpp b/src/plugins/help/helpwidget.cpp index d3a54d6c119..30d638f40c7 100644 --- a/src/plugins/help/helpwidget.cpp +++ b/src/plugins/help/helpwidget.cpp @@ -990,7 +990,7 @@ void HelpWidget::highlightSearchTerms(HelpViewer *viewer) { if (m_searchTerms.isEmpty()) return; - for (const QString &term : qAsConst(m_searchTerms)) + for (const QString &term : std::as_const(m_searchTerms)) viewer->findText(term, {}, false, true); m_searchTerms.clear(); } diff --git a/src/plugins/ios/iosconfigurations.cpp b/src/plugins/ios/iosconfigurations.cpp index eff01885b8b..8d8255c2293 100644 --- a/src/plugins/ios/iosconfigurations.cpp +++ b/src/plugins/ios/iosconfigurations.cpp @@ -298,7 +298,7 @@ void IosConfigurations::updateAutomaticKitList() existingKits.subtract(resultingKits); qCDebug(kitSetupLog) << "Removing unused kits:"; printKits(existingKits); - for (Kit *kit : qAsConst(existingKits)) + for (Kit *kit : std::as_const(existingKits)) KitManager::deregisterKit(kit); } @@ -474,7 +474,7 @@ void IosConfigurations::loadProvisioningData(bool notify) return teamInfo1.value(freeTeamTag).toInt() < teamInfo2.value(freeTeamTag).toInt(); }); - for (auto teamInfo : qAsConst(teams)) { + for (auto teamInfo : std::as_const(teams)) { auto team = std::make_shared(); team->m_name = teamInfo.value(teamNameTag).toString(); team->m_email = teamInfo.value(emailTag).toString(); @@ -624,7 +624,7 @@ QDebug &operator<<(QDebug &stream, DevelopmentTeamPtr team) { QTC_ASSERT(team, return stream); stream << team->displayName() << team->identifier() << team->isFreeProfile(); - for (const auto &profile : qAsConst(team->m_profiles)) + for (const auto &profile : std::as_const(team->m_profiles)) stream << "Profile:" << profile; return stream; } diff --git a/src/plugins/ios/iosdevice.cpp b/src/plugins/ios/iosdevice.cpp index f1e5b9717e7..277bfbfbcad 100644 --- a/src/plugins/ios/iosdevice.cpp +++ b/src/plugins/ios/iosdevice.cpp @@ -510,7 +510,7 @@ IosDeviceManager::IosDeviceManager(QObject *parent) : void IosDeviceManager::updateUserModeDevices() { - for (const QString &uid : qAsConst(m_userModeDeviceIds)) + for (const QString &uid : std::as_const(m_userModeDeviceIds)) updateInfo(uid); } diff --git a/src/plugins/ios/iosprobe.cpp b/src/plugins/ios/iosprobe.cpp index 97204b42daf..08d670c44f4 100644 --- a/src/plugins/ios/iosprobe.cpp +++ b/src/plugins/ios/iosprobe.cpp @@ -103,7 +103,7 @@ void XcodeProbe::setupDefaultToolchains(const QString &devPath) } if (!clangProfile.cCompilerPath.isEmpty() || !clangProfile.cxxCompilerPath.isEmpty()) { - for (const QString &arch : qAsConst(allArchitectures)) { + for (const QString &arch : std::as_const(allArchitectures)) { const QString clangFullName = QString(QLatin1String("Apple Clang (%1)")).arg(arch) + ((devPath != defaultDeveloperPath) ? QString(QLatin1String(" in %1")).arg(devPath) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 16717cdfee0..be68f933639 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -203,7 +203,7 @@ public: } updateEditorToolBar(m_openedDocument.keys()); } - for (IAssistProcessor *processor : qAsConst(m_runningAssistProcessors)) + for (IAssistProcessor *processor : std::as_const(m_runningAssistProcessors)) processor->setAsyncProposalAvailable(nullptr); qDeleteAll(m_documentHighlightsTimer); m_documentHighlightsTimer.clear(); @@ -1548,7 +1548,7 @@ bool ClientPrivate::reset() // temporary container needed since m_resetAssistProvider is changed in resetAssistProviders for (TextEditor::TextDocument *document : m_resetAssistProvider.keys()) resetAssistProviders(document); - for (TextEditor::IAssistProcessor *processor : qAsConst(m_runningAssistProcessors)) + for (TextEditor::IAssistProcessor *processor : std::as_const(m_runningAssistProcessors)) processor->setAsyncProposalAvailable(nullptr); m_runningAssistProcessors.clear(); qDeleteAll(m_documentHighlightsTimer); diff --git a/src/plugins/languageclient/diagnosticmanager.cpp b/src/plugins/languageclient/diagnosticmanager.cpp index 5b829263af2..cb199538e9f 100644 --- a/src/plugins/languageclient/diagnosticmanager.cpp +++ b/src/plugins/languageclient/diagnosticmanager.cpp @@ -159,7 +159,7 @@ void DiagnosticManager::setExtraSelectionsId(const Utils::Id &extraSelectionsId) void DiagnosticManager::forAllMarks(std::function func) { - for (const Marks &marks : qAsConst(m_marks)) { + for (const Marks &marks : std::as_const(m_marks)) { for (TextEditor::TextMark *mark : marks.marks) func(mark); } diff --git a/src/plugins/languageclient/documentsymbolcache.cpp b/src/plugins/languageclient/documentsymbolcache.cpp index 66c189a4b5b..465c3c4f690 100644 --- a/src/plugins/languageclient/documentsymbolcache.cpp +++ b/src/plugins/languageclient/documentsymbolcache.cpp @@ -64,7 +64,7 @@ void DocumentSymbolCache::requestSymbolsImpl() m_compressionTimer.start(200); return; } - for (const DocumentUri &uri : qAsConst(m_compressedUris)) { + for (const DocumentUri &uri : std::as_const(m_compressedUris)) { auto entry = m_cache.find(uri); if (entry != m_cache.end()) { emit gotSymbols(uri, entry.value()); diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index 6c108708420..fd8346962a5 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.cpp +++ b/src/plugins/languageclient/languageclientcompletionassist.cpp @@ -468,7 +468,7 @@ void LanguageClientCompletionAssistProvider::setTriggerCharacters( { m_activationCharSequenceLength = 0; m_triggerChars = triggerChars.value_or(QList()); - for (const QString &trigger : qAsConst(m_triggerChars)) { + for (const QString &trigger : std::as_const(m_triggerChars)) { if (trigger.length() > m_activationCharSequenceLength) m_activationCharSequenceLength = trigger.length(); } diff --git a/src/plugins/languageclient/languageclientfunctionhint.cpp b/src/plugins/languageclient/languageclientfunctionhint.cpp index ec180f4f05a..2b5b46cdfac 100644 --- a/src/plugins/languageclient/languageclientfunctionhint.cpp +++ b/src/plugins/languageclient/languageclientfunctionhint.cpp @@ -147,7 +147,7 @@ void FunctionHintAssistProvider::setTriggerCharacters( const std::optional> &triggerChars) { m_triggerChars = triggerChars.value_or(QList()); - for (const QString &trigger : qAsConst(m_triggerChars)) { + for (const QString &trigger : std::as_const(m_triggerChars)) { if (trigger.length() > m_activationCharSequenceLength) m_activationCharSequenceLength = trigger.length(); } diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index fce7cc8b825..47624ca5f29 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -186,7 +186,7 @@ void LanguageClientManager::addExclusiveRequest(const MessageId &id, Client *cli void LanguageClientManager::reportFinished(const MessageId &id, Client *byClient) { QTC_ASSERT(managerInstance, return); - for (Client *client : qAsConst(managerInstance->m_exclusiveRequests[id])) { + for (Client *client : std::as_const(managerInstance->m_exclusiveRequests[id])) { if (client != byClient) client->cancelRequest(id); } @@ -275,14 +275,14 @@ void LanguageClientManager::applySettings() documents << managerInstance->m_clientForDocument.keys(client); shutdownClient(client); } - for (auto document : qAsConst(documents)) + for (auto document : std::as_const(documents)) managerInstance->m_clientForDocument.remove(document); if (!setting->isValid() || !setting->m_enabled) continue; switch (setting->m_startBehavior) { case BaseSettings::AlwaysOn: { Client *client = startClient(setting); - for (TextEditor::TextDocument *document : qAsConst(documents)) + for (TextEditor::TextDocument *document : std::as_const(documents)) managerInstance->m_clientForDocument[document] = client; break; } @@ -296,7 +296,7 @@ void LanguageClientManager::applySettings() } if (!documents.isEmpty()) { Client *client = startClient(setting); - for (TextEditor::TextDocument *document : qAsConst(documents)) + for (TextEditor::TextDocument *document : std::as_const(documents)) client->openDocument(document); } break; @@ -514,7 +514,7 @@ void LanguageClientManager::documentOpened(Core::IDocument *document) } else if (setting->m_startBehavior == BaseSettings::RequiresFile && clients.isEmpty()) { clients << startClient(setting); } - for (auto client : qAsConst(clients)) + for (auto client : std::as_const(clients)) client->openDocument(textDocument); } } @@ -546,7 +546,7 @@ void LanguageClientManager::documentWillSave(Core::IDocument *document) void LanguageClientManager::updateProject(ProjectExplorer::Project *project) { - for (BaseSettings *setting : qAsConst(m_currentSettings)) { + for (BaseSettings *setting : std::as_const(m_currentSettings)) { if (setting->isValid() && setting->m_enabled && setting->m_startBehavior == BaseSettings::RequiresProject) { diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index 5bed7bc164d..fdce7843224 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -438,7 +438,7 @@ QList generateReplaceItems(const WorkspaceEdit &edits, QMap> rangesInDocument; auto documentChanges = edits.documentChanges().value_or(QList()); if (!documentChanges.isEmpty()) { - for (const TextDocumentEdit &documentChange : qAsConst(documentChanges)) { + for (const TextDocumentEdit &documentChange : std::as_const(documentChanges)) { rangesInDocument[documentChange.textDocument().uri().toFilePath()] = convertEdits( documentChange.edits()); } diff --git a/src/plugins/languageclient/languageclientutils.cpp b/src/plugins/languageclient/languageclientutils.cpp index dbea480a70f..f85d62a4c28 100644 --- a/src/plugins/languageclient/languageclientutils.cpp +++ b/src/plugins/languageclient/languageclientutils.cpp @@ -183,7 +183,7 @@ void updateCodeActionRefactoringMarker(Client *client, } else if (std::optional localChanges = edit->changes()) { edits = (*localChanges)[uri]; } - for (const TextEdit &edit : qAsConst(edits)) + for (const TextEdit &edit : std::as_const(edits)) addMarkerForCursor(action, edit.range()); } } diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index 6df5170a42d..971c701d5d8 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -250,7 +250,7 @@ void WorkspaceLocatorFilter::prepareSearch(const QString &entry, params.setLimit(m_maxResultCount); QMutexLocker locker(&m_mutex); - for (auto client : qAsConst(clients)) { + for (auto client : std::as_const(clients)) { if (!client->reachable()) continue; if (!(force || client->locatorsEnabled())) diff --git a/src/plugins/languageclient/semantichighlightsupport.cpp b/src/plugins/languageclient/semantichighlightsupport.cpp index e9f6429acaf..d51d62ad1fa 100644 --- a/src/plugins/languageclient/semantichighlightsupport.cpp +++ b/src/plugins/languageclient/semantichighlightsupport.cpp @@ -235,7 +235,7 @@ void SemanticTokenSupport::setLegend(const LanguageServerProtocol::SemanticToken void SemanticTokenSupport::updateFormatHash() { auto fontSettings = TextEditorSettings::fontSettings(); - for (int tokenType : qAsConst(m_tokenTypes)) { + for (int tokenType : std::as_const(m_tokenTypes)) { if (tokenType < 0) continue; TextStyle style; @@ -364,7 +364,7 @@ void SemanticTokenSupport::handleSemanticTokensDelta( const QList &data = tokens.data(); int newDataSize = data.size(); - for (const SemanticTokensEdit &edit : qAsConst(edits)) + for (const SemanticTokensEdit &edit : std::as_const(edits)) newDataSize += edit.dataSize() - edit.deleteCount(); QList newData; newData.reserve(newDataSize); @@ -373,7 +373,7 @@ void SemanticTokenSupport::handleSemanticTokensDelta( const auto end = data.end(); qCDebug(LOGLSPHIGHLIGHT) << "Edit Tokens"; qCDebug(LOGLSPHIGHLIGHT) << "Data before edit " << data; - for (const SemanticTokensEdit &edit : qAsConst(edits)) { + for (const SemanticTokensEdit &edit : std::as_const(edits)) { if (edit.start() > data.size()) // prevent edits after the previously reported data return; for (const auto start = data.begin() + edit.start(); it < start; ++it) @@ -446,7 +446,7 @@ void SemanticTokenSupport::highlight(const Utils::FilePath &filePath, bool force }; if (LOGLSPHIGHLIGHT().isDebugEnabled()) { qCDebug(LOGLSPHIGHLIGHT) << "Expanded Tokens for " << filePath; - for (const ExpandedSemanticToken &token : qAsConst(expandedTokens)) { + for (const ExpandedSemanticToken &token : std::as_const(expandedTokens)) { qCDebug(LOGLSPHIGHLIGHT) << token.line << token.column << token.length << token.type << token.modifiers; } diff --git a/src/plugins/macros/macro.cpp b/src/plugins/macros/macro.cpp index dba5472ca40..2f7e44fe393 100644 --- a/src/plugins/macros/macro.cpp +++ b/src/plugins/macros/macro.cpp @@ -121,7 +121,7 @@ bool Macro::save(const QString &fileName, QWidget *parent) QDataStream stream(saver.file()); stream << d->version; stream << d->description; - for (const MacroEvent &event : qAsConst(d->events)) { + for (const MacroEvent &event : std::as_const(d->events)) { event.save(stream); } saver.setResult(&stream); diff --git a/src/plugins/macros/macromanager.cpp b/src/plugins/macros/macromanager.cpp index 627f8ee8c46..4f79dee1867 100644 --- a/src/plugins/macros/macromanager.cpp +++ b/src/plugins/macros/macromanager.cpp @@ -178,7 +178,7 @@ bool MacroManagerPrivate::executeMacro(Macro *macro) for (const MacroEvent ¯oEvent : macroEvents) { if (error) break; - for (IMacroHandler *handler : qAsConst(handlers)) { + for (IMacroHandler *handler : std::as_const(handlers)) { if (handler->canExecuteEvent(macroEvent)) { if (!handler->executeEvent(macroEvent)) error = true; @@ -256,7 +256,7 @@ void MacroManager::startMacro() Core::ActionManager::command(Constants::END_MACRO)->action()->setEnabled(true); Core::ActionManager::command(Constants::EXECUTE_LAST_MACRO)->action()->setEnabled(false); Core::ActionManager::command(Constants::SAVE_LAST_MACRO)->action()->setEnabled(false); - for (IMacroHandler *handler : qAsConst(d->handlers)) + for (IMacroHandler *handler : std::as_const(d->handlers)) handler->startRecording(d->currentMacro); const QString endShortcut = Core::ActionManager::command(Constants::END_MACRO) @@ -281,7 +281,7 @@ void MacroManager::endMacro() Core::ActionManager::command(Constants::END_MACRO)->action()->setEnabled(false); Core::ActionManager::command(Constants::EXECUTE_LAST_MACRO)->action()->setEnabled(true); Core::ActionManager::command(Constants::SAVE_LAST_MACRO)->action()->setEnabled(true); - for (IMacroHandler *handler : qAsConst(d->handlers)) + for (IMacroHandler *handler : std::as_const(d->handlers)) handler->endRecordingMacro(d->currentMacro); d->isRecording = false; diff --git a/src/plugins/macros/macrooptionswidget.cpp b/src/plugins/macros/macrooptionswidget.cpp index 58156c4d8f6..44705c7ebd8 100644 --- a/src/plugins/macros/macrooptionswidget.cpp +++ b/src/plugins/macros/macrooptionswidget.cpp @@ -135,7 +135,7 @@ void MacroOptionsWidget::remove() void MacroOptionsWidget::apply() { // Remove macro - for (const QString &name : qAsConst(m_macroToRemove)) { + for (const QString &name : std::as_const(m_macroToRemove)) { MacroManager::instance()->deleteMacro(name); m_macroToChange.remove(name); } diff --git a/src/plugins/marketplace/productlistmodel.cpp b/src/plugins/marketplace/productlistmodel.cpp index baa12cc73d0..7e2f0f76d86 100644 --- a/src/plugins/marketplace/productlistmodel.cpp +++ b/src/plugins/marketplace/productlistmodel.cpp @@ -308,7 +308,7 @@ void SectionedProducts::fetchNextImage() if (QPixmapCache::find(nextUrl, nullptr)) { // this image is already cached it might have been added while downloading - for (ProductListModel *model : qAsConst(m_productModels)) + for (ProductListModel *model : std::as_const(m_productModels)) model->updateModelIndexesForUrl(nextUrl); fetchNextImage(); return; @@ -337,7 +337,7 @@ void SectionedProducts::onImageDownloadFinished(QNetworkReply *reply) Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap.setDevicePixelRatio(dpr); QPixmapCache::insert(url, pixmap); - for (ProductListModel *model : qAsConst(m_productModels)) + for (ProductListModel *model : std::as_const(m_productModels)) model->updateModelIndexesForUrl(url); } } // handle error not needed - it's okay'ish to have no images as long as the rest works @@ -386,7 +386,7 @@ void SectionedProducts::onTagClicked(const QString &tag) QList SectionedProducts::items() { QList result; - for (const ProductListModel *model : qAsConst(m_productModels)) + for (const ProductListModel *model : std::as_const(m_productModels)) result.append(model->items()); return result; } diff --git a/src/plugins/mcusupport/mcukitmanager.cpp b/src/plugins/mcusupport/mcukitmanager.cpp index d7e3d1cc389..ef7f9f2ed2a 100644 --- a/src/plugins/mcusupport/mcukitmanager.cpp +++ b/src/plugins/mcusupport/mcukitmanager.cpp @@ -43,7 +43,7 @@ namespace McuSupport::Internal { static QMap cMakeConfigToMap(const CMakeConfig &config) { QMap map; - for (const auto &configItem : qAsConst(config.toList())) { + for (const auto &configItem : std::as_const(config.toList())) { map.insert(configItem.key, configItem.value); } return map; @@ -493,7 +493,7 @@ void createAutomaticKits(const SettingsHandler::Ptr &settingsHandler) McuSdkRepository repo{targetsAndPackages(qtForMCUsPackage, settingsHandler)}; bool needsUpgrade = false; - for (const auto &target : qAsConst(repo.mcuTargets)) { + for (const auto &target : std::as_const(repo.mcuTargets)) { // if kit already exists, skip if (!matchingKits(target.get(), qtForMCUsPackage).empty()) continue; @@ -530,7 +530,7 @@ void upgradeKitsByCreatingNewPackage(const SettingsHandler::Ptr &settingsHandler McuSdkRepository repo{targetsAndPackages(qtForMCUsPackage, settingsHandler)}; - for (const auto &target : qAsConst(repo.mcuTargets)) { + for (const auto &target : std::as_const(repo.mcuTargets)) { if (!matchingKits(target.get(), qtForMCUsPackage).empty()) // already up-to-date continue; @@ -570,7 +570,7 @@ void updatePathsInExistingKits(const SettingsHandler::Ptr &settingsHandler) McuPackagePtr qtForMCUsPackage{createQtForMCUsPackage(settingsHandler)}; McuSdkRepository repo{targetsAndPackages(qtForMCUsPackage, settingsHandler)}; - for (const auto &target : qAsConst(repo.mcuTargets)) { + for (const auto &target : std::as_const(repo.mcuTargets)) { if (target->isValid()) { for (auto *kit : kitsWithMismatchedDependencies(target.get())) { auto changes = cMakeConfigToMap(CMakeConfigurationKitAspect::configuration(kit)); @@ -629,7 +629,7 @@ void fixExistingKits(const SettingsHandler::Ptr &settingsHandler) } if (!kit->hasValue(kitQmlImportPath)) { auto config = CMakeProjectManager::CMakeConfigurationKitAspect::configuration(kit); - for (const auto &cfgItem : qAsConst(config)) { + for (const auto &cfgItem : std::as_const(config)) { if (cfgItem.key == "QUL_GENERATORS") { auto idx = cfgItem.value.indexOf("/lib/cmake/Qul"); auto qulDir = cfgItem.value.left(idx); @@ -655,7 +655,7 @@ void fixExistingKits(const SettingsHandler::Ptr &settingsHandler) qtForMCUsPackage->updateStatus(); if (qtForMCUsPackage->isValidStatus()) { McuSdkRepository repo{targetsAndPackages(qtForMCUsPackage, settingsHandler)}; - for (const auto &target : qAsConst(repo.mcuTargets)) + for (const auto &target : std::as_const(repo.mcuTargets)) for (auto kit : existingKits(target.get())) { if (McuDependenciesKitAspect::dependencies(kit).isEmpty()) { McuKitFactory::setKitCMakeOptions(kit, target.get(), qtForMCUsPackage); diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 7f4eb241b48..edd7ac13bfc 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -100,7 +100,7 @@ void McuSupportOptions::setQulDir(const FilePath &) sdkRepository = targetsAndPackages(qtForMCUsSdkPackage, settingsHandler); else sdkRepository = McuSdkRepository{}; - for (const auto &package : qAsConst(sdkRepository.packages)) + for (const auto &package : std::as_const(sdkRepository.packages)) connect(package.get(), &McuAbstractPackage::changed, this, diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index 35f663d8e60..f4a794e4133 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -256,7 +256,7 @@ void McuSupportOptionsWidget::showMcuTargetPackages() row.fieldItem->widget()->hide(); } - for (const auto &package : qAsConst(m_options.sdkRepository.packages)) { + for (const auto &package : std::as_const(m_options.sdkRepository.packages)) { QWidget *packageWidget = package->widget(); if (!mcuTarget->packages().contains(package) || package->label().isEmpty()) continue; @@ -289,7 +289,7 @@ void McuSupportOptionsWidget::apply() m_settingsHandler->setAutomaticKitCreation(m_options.automaticKitCreationEnabled()); pathsChanged |= m_options.qtForMCUsSdkPackage->writeToSettings(); - for (const auto &package : qAsConst(m_options.sdkRepository.packages)) + for (const auto &package : std::as_const(m_options.sdkRepository.packages)) pathsChanged |= package->writeToSettings(); if (pathsChanged) { diff --git a/src/plugins/mercurial/commiteditor.cpp b/src/plugins/mercurial/commiteditor.cpp index 3288d63389e..ab46c2b5c82 100644 --- a/src/plugins/mercurial/commiteditor.cpp +++ b/src/plugins/mercurial/commiteditor.cpp @@ -50,7 +50,7 @@ void CommitEditor::setFields(const QFileInfo &repositoryRoot, const QString &bra VcsBaseSubmitEditor::filterUntrackedFilesOfProject(fileModel->repositoryRoot(), &shouldTrack); - for (const QString &track : qAsConst(shouldTrack)) { + for (const QString &track : std::as_const(shouldTrack)) { for (const VcsBaseClient::StatusItem &item : repoStatus) { if (item.file == track) fileModel->addFile(item.file, item.flags, Unchecked); diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp index 389accbd641..f9332fcc04c 100644 --- a/src/plugins/mercurial/mercurialplugin.cpp +++ b/src/plugins/mercurial/mercurialplugin.cpp @@ -708,7 +708,7 @@ void MercurialPluginPrivate::updateActions(VcsBasePluginPrivate::ActionState as) revertFile->setParameter(filename); statusFile->setParameter(filename); - for (QAction *repoAction : qAsConst(m_repositoryActionList)) + for (QAction *repoAction : std::as_const(m_repositoryActionList)) repoAction->setEnabled(repoEnabled); } diff --git a/src/plugins/modeleditor/modeleditor.cpp b/src/plugins/modeleditor/modeleditor.cpp index e0f1838c582..8180f0ef5b2 100644 --- a/src/plugins/modeleditor/modeleditor.cpp +++ b/src/plugins/modeleditor/modeleditor.cpp @@ -1046,7 +1046,7 @@ void ModelEditor::initToolbars() QList toolbars = stereotypeController->toolbars(); std::stable_sort(toolbars.begin(), toolbars.end(), [=](const qmt::Toolbar &lhs, const qmt::Toolbar &rhs) { return lhs.priority() > rhs.priority(); }); - for (const qmt::Toolbar &toolbar : qAsConst(toolbars)) { + for (const qmt::Toolbar &toolbar : std::as_const(toolbars)) { QWidget *toolBar = toolBars.value(toolbar.id()); QLayout *toolBarLayout = nullptr; if (!toolBar) { @@ -1171,7 +1171,7 @@ void ModelEditor::initToolbars() // add stretch to all layouts and calculate width of tool bar int maxWidth = 48; - for (QWidget *toolBar : qAsConst(toolBars)) { + for (QWidget *toolBar : std::as_const(toolBars)) { QMT_ASSERT(toolBar, continue); auto layout = qobject_cast(toolBar->layout()); QMT_ASSERT(layout, continue); diff --git a/src/plugins/modeleditor/modelsmanager.cpp b/src/plugins/modeleditor/modelsmanager.cpp index 5a5cd67276b..fe7bbc9bbd5 100644 --- a/src/plugins/modeleditor/modelsmanager.cpp +++ b/src/plugins/modeleditor/modelsmanager.cpp @@ -145,7 +145,7 @@ void ModelsManager::releaseModel(ExtDocumentController *documentController) void ModelsManager::openDiagram(const qmt::Uid &modelUid, const qmt::Uid &diagramUid) { - for (const ManagedModel &managedModel : qAsConst(d->managedModels)) { + for (const ManagedModel &managedModel : std::as_const(d->managedModels)) { if (managedModel.m_documentController->projectController()->project()->uid() == modelUid) { qmt::MDiagram *diagram = managedModel.m_documentController->modelController()->findObject(diagramUid); QMT_ASSERT(diagram, continue); @@ -208,7 +208,7 @@ void ModelsManager::onAboutToShowContextMenu(ProjectExplorer::Node *node) { bool canOpenDiagram = false; - for (const ManagedModel &managedModel : qAsConst(d->managedModels)) { + for (const ManagedModel &managedModel : std::as_const(d->managedModels)) { if (managedModel.m_documentController->pxNodeController()->hasDiagramForExplorerNode(node)) { canOpenDiagram = true; break; @@ -226,7 +226,7 @@ void ModelsManager::onOpenDiagramFromProjectExplorer() { if (ProjectExplorer::ProjectTree::currentNode() == d->contextMenuOwnerNode) { qmt::MDiagram *diagram = nullptr; - for (const ManagedModel &managedModel : qAsConst(d->managedModels)) { + for (const ManagedModel &managedModel : std::as_const(d->managedModels)) { if ((diagram = managedModel.m_documentController->pxNodeController()->findDiagramForExplorerNode(d->contextMenuOwnerNode))) { openDiagram(managedModel.m_documentController, diagram); break; @@ -245,7 +245,7 @@ void ModelsManager::onOpenDefaultModel(const qmt::Uid &modelUid) void ModelsManager::openDiagram(ExtDocumentController *documentController, qmt::MDiagram *diagram) { - for (const ManagedModel &managedModel : qAsConst(d->managedModels)) { + for (const ManagedModel &managedModel : std::as_const(d->managedModels)) { if (managedModel.m_documentController == documentController) { Core::IEditor *editor = Core::EditorManager::activateEditorForDocument(managedModel.m_modelDocument); if (auto modelEditor = qobject_cast(editor)) { diff --git a/src/plugins/nim/project/nimcompilerbuildstep.cpp b/src/plugins/nim/project/nimcompilerbuildstep.cpp index 718f9b12ab3..958b9388a2a 100644 --- a/src/plugins/nim/project/nimcompilerbuildstep.cpp +++ b/src/plugins/nim/project/nimcompilerbuildstep.cpp @@ -175,7 +175,7 @@ CommandLine NimCompilerBuildStep::commandLine() cmd.addArg("--out:" + outFilePath().toString()); cmd.addArg("--nimCache:" + bc->cacheDirectory().toString()); - for (const QString &arg : qAsConst(m_userCompilerOptions)) { + for (const QString &arg : std::as_const(m_userCompilerOptions)) { if (!arg.isEmpty()) cmd.addArg(arg); } diff --git a/src/plugins/perforce/perforcesubmiteditor.cpp b/src/plugins/perforce/perforcesubmiteditor.cpp index 18f595663be..db7474edfaa 100644 --- a/src/plugins/perforce/perforcesubmiteditor.cpp +++ b/src/plugins/perforce/perforcesubmiteditor.cpp @@ -103,7 +103,7 @@ void PerforceSubmitEditor::updateFields() lines = m_entries.value(QLatin1String("Files")).split(newLine); // split up "file#add" and store complete spec line as user data - for (const QString &specLine : qAsConst(lines)) { + for (const QString &specLine : std::as_const(lines)) { const QStringList list = specLine.split(QLatin1Char('#')); if (list.size() == 2) { const QString file = list.at(0).trimmed(); diff --git a/src/plugins/perfprofiler/perfconfigwidget.cpp b/src/plugins/perfprofiler/perfconfigwidget.cpp index 1441c305747..69eb0fab710 100644 --- a/src/plugins/perfprofiler/perfconfigwidget.cpp +++ b/src/plugins/perfprofiler/perfconfigwidget.cpp @@ -182,7 +182,7 @@ void PerfConfigWidget::handleProcessDone() Tr::tr("No Trace Points Found"), Tr::tr("Trace points can be defined with \"perf probe -a\".")); } else { - for (const QByteArray &event : qAsConst(tracePoints)) { + for (const QByteArray &event : std::as_const(tracePoints)) { int row = model->rowCount(); model->insertRow(row); model->setData(model->index(row, PerfConfigEventsModel::ColumnEventType), diff --git a/src/plugins/perfprofiler/perfprofilerflamegraphmodel.cpp b/src/plugins/perfprofiler/perfprofilerflamegraphmodel.cpp index 0b111c102d0..5c34eb633a4 100644 --- a/src/plugins/perfprofiler/perfprofilerflamegraphmodel.cpp +++ b/src/plugins/perfprofiler/perfprofilerflamegraphmodel.cpp @@ -310,7 +310,7 @@ void PerfProfilerFlameGraphModel::finalize(PerfProfilerFlameGraphData *data) node->resourcePeak = node->resourceUsage; node->lastResourceChangeId = data->resourcePeakId(); } - for (const auto &child : qAsConst(node->children)) + for (const auto &child : std::as_const(node->children)) nodes.enqueue(child.get()); } diff --git a/src/plugins/perfprofiler/perfprofilertool.cpp b/src/plugins/perfprofiler/perfprofilertool.cpp index 66084dbdca9..092bdf9c783 100644 --- a/src/plugins/perfprofiler/perfprofilertool.cpp +++ b/src/plugins/perfprofiler/perfprofilertool.cpp @@ -500,7 +500,7 @@ void PerfProfilerTool::updateFilterMenu() QList threads = m_traceManager->threads().values(); std::sort(threads.begin(), threads.end()); - for (const PerfProfilerTraceManager::Thread &thread : qAsConst(threads)) { + for (const PerfProfilerTraceManager::Thread &thread : std::as_const(threads)) { QAction *action = m_filterMenu->addAction( QString::fromLatin1("%1 (%2)") .arg(QString::fromUtf8(m_traceManager->string(thread.name))) diff --git a/src/plugins/perfprofiler/perftimelinemodelmanager.cpp b/src/plugins/perfprofiler/perftimelinemodelmanager.cpp index cd5e1c581f2..e86d3a81308 100644 --- a/src/plugins/perfprofiler/perftimelinemodelmanager.cpp +++ b/src/plugins/perfprofiler/perftimelinemodelmanager.cpp @@ -63,7 +63,7 @@ void PerfTimelineModelManager::finalize() m_unfinished.clear(); const qint64 frequency = m_traceManager->samplingFrequency(); - for (PerfTimelineModel *model : qAsConst(finished)) { + for (PerfTimelineModel *model : std::as_const(finished)) { model->setSamplingFrequency(frequency); threads.remove(model->tid()); } @@ -84,7 +84,7 @@ void PerfTimelineModelManager::finalize() }); QVariantList modelsToAdd; - for (PerfTimelineModel *model : qAsConst(finished)) + for (PerfTimelineModel *model : std::as_const(finished)) modelsToAdd.append(QVariant::fromValue(model)); setModels(modelsToAdd); } diff --git a/src/plugins/projectexplorer/abi.cpp b/src/plugins/projectexplorer/abi.cpp index fcf0cb4d0df..8022256325d 100644 --- a/src/plugins/projectexplorer/abi.cpp +++ b/src/plugins/projectexplorer/abi.cpp @@ -1201,7 +1201,7 @@ Abis Abi::abisOfBinary(const Utils::FilePath &path) // Remove duplicates: Abis result; - for (const Abi &a : qAsConst(tmp)) { + for (const Abi &a : std::as_const(tmp)) { if (!result.contains(a)) result.append(a); } diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index 1e22fac9961..1f58332b8b2 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -228,7 +228,7 @@ AppOutputPane::~AppOutputPane() { qCDebug(appOutputLog) << "AppOutputPane::~AppOutputPane: Entries left" << m_runControlTabs.size(); - for (const RunControlTab &rt : qAsConst(m_runControlTabs)) { + for (const RunControlTab &rt : std::as_const(m_runControlTabs)) { delete rt.window; delete rt.runControl; } @@ -355,7 +355,7 @@ void AppOutputPane::updateFilter() const QList AppOutputPane::outputWindows() const { QList windows; - for (const RunControlTab &tab : qAsConst(m_runControlTabs)) { + for (const RunControlTab &tab : std::as_const(m_runControlTabs)) { if (tab.window) windows << tab.window; } @@ -381,7 +381,7 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) connect(rc, &RunControl::started, this, runControlChanged); connect(rc, &RunControl::stopped, this, [this, rc] { QTimer::singleShot(0, this, [this, rc] { runControlFinished(rc); }); - for (const RunControlTab &t : qAsConst(m_runControlTabs)) { + for (const RunControlTab &t : std::as_const(m_runControlTabs)) { if (t.runControl == rc) { t.window->flush(); break; @@ -451,7 +451,7 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) connect(ow, &Core::OutputWindow::wheelZoom, this, [this, ow]() { float fontZoom = ow->fontZoom(); - for (const RunControlTab &tab : qAsConst(m_runControlTabs)) + for (const RunControlTab &tab : std::as_const(m_runControlTabs)) tab.window->setFontZoom(fontZoom); }); connect(TextEditor::TextEditorSettings::instance(), &TextEditor::TextEditorSettings::fontSettingsChanged, @@ -476,7 +476,7 @@ void AppOutputPane::handleOldOutput(Core::OutputWindow *window) const void AppOutputPane::updateFromSettings() { - for (const RunControlTab &tab : qAsConst(m_runControlTabs)) { + for (const RunControlTab &tab : std::as_const(m_runControlTabs)) { tab.window->setWordWrapEnabled(m_settings.wrapOutput); tab.window->setMaxCharCount(m_settings.maxCharCount); } @@ -677,19 +677,19 @@ void AppOutputPane::enableDefaultButtons() void AppOutputPane::zoomIn(int range) { - for (const RunControlTab &tab : qAsConst(m_runControlTabs)) + for (const RunControlTab &tab : std::as_const(m_runControlTabs)) tab.window->zoomIn(range); } void AppOutputPane::zoomOut(int range) { - for (const RunControlTab &tab : qAsConst(m_runControlTabs)) + for (const RunControlTab &tab : std::as_const(m_runControlTabs)) tab.window->zoomOut(range); } void AppOutputPane::resetZoom() { - for (const RunControlTab &tab : qAsConst(m_runControlTabs)) + for (const RunControlTab &tab : std::as_const(m_runControlTabs)) tab.window->resetZoom(); } diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index df0c433ed28..b858fdb4d46 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -284,10 +284,10 @@ void BuildConfiguration::doInitialize(const BuildInfo &info) d->m_initialBuildType = info.buildType; - for (Utils::Id id : qAsConst(d->m_initialBuildSteps)) + for (Utils::Id id : std::as_const(d->m_initialBuildSteps)) d->m_buildSteps.appendStep(id); - for (Utils::Id id : qAsConst(d->m_initialCleanSteps)) + for (Utils::Id id : std::as_const(d->m_initialCleanSteps)) d->m_cleanSteps.appendStep(id); if (d->m_initializer) @@ -702,7 +702,7 @@ BuildConfigurationFactory *BuildConfigurationFactory::find(const Kit *k, const F { QTC_ASSERT(k, return nullptr); const Utils::Id deviceType = DeviceTypeKitAspect::deviceTypeId(k); - for (BuildConfigurationFactory *factory : qAsConst(g_buildConfigurationFactories)) { + for (BuildConfigurationFactory *factory : std::as_const(g_buildConfigurationFactories)) { if (Utils::mimeTypeForFile(projectPath).matchesName(factory->m_supportedProjectMimeTypeName) && factory->supportsTargetDeviceType(deviceType)) return factory; @@ -713,7 +713,7 @@ BuildConfigurationFactory *BuildConfigurationFactory::find(const Kit *k, const F // create BuildConfigurationFactory * BuildConfigurationFactory::find(Target *parent) { - for (BuildConfigurationFactory *factory : qAsConst(g_buildConfigurationFactories)) { + for (BuildConfigurationFactory *factory : std::as_const(g_buildConfigurationFactories)) { if (factory->canHandle(parent)) return factory; } @@ -775,7 +775,7 @@ BuildConfiguration *BuildConfigurationFactory::create(Target *parent, const Buil BuildConfiguration *BuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) { const Utils::Id id = idFromMap(map); - for (BuildConfigurationFactory *factory : qAsConst(g_buildConfigurationFactories)) { + for (BuildConfigurationFactory *factory : std::as_const(g_buildConfigurationFactories)) { QTC_ASSERT(factory->m_creator, return nullptr); if (!factory->canHandle(parent)) continue; diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index b682d7a50e5..59beff60f77 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -508,7 +508,7 @@ void BuildManager::emitCancelMessage() void BuildManager::clearBuildQueue() { - for (BuildStep *bs : qAsConst(d->m_buildQueue)) { + for (BuildStep *bs : std::as_const(d->m_buildQueue)) { decrementActiveBuildSteps(bs); disconnectOutput(bs); } diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp index 38a177addf5..070e8f3b545 100644 --- a/src/plugins/projectexplorer/buildstep.cpp +++ b/src/plugins/projectexplorer/buildstep.cpp @@ -145,7 +145,7 @@ QWidget *BuildStep::doCreateConfigWidget() setSummaryText(m_summaryUpdater()); }; - for (BaseAspect *aspect : qAsConst(m_aspects)) + for (BaseAspect *aspect : std::as_const(m_aspects)) connect(aspect, &BaseAspect::changed, widget, recreateSummary); connect(buildConfiguration(), &BuildConfiguration::buildDirectoryChanged, @@ -159,7 +159,7 @@ QWidget *BuildStep::doCreateConfigWidget() QWidget *BuildStep::createConfigWidget() { Layouting::Form builder; - for (BaseAspect *aspect : qAsConst(m_aspects)) { + for (BaseAspect *aspect : std::as_const(m_aspects)) { if (aspect->isVisible()) aspect->addToLayout(builder.finishRow()); } diff --git a/src/plugins/projectexplorer/customparser.cpp b/src/plugins/projectexplorer/customparser.cpp index 7bcc18a6210..e10f1e8f380 100644 --- a/src/plugins/projectexplorer/customparser.cpp +++ b/src/plugins/projectexplorer/customparser.cpp @@ -277,7 +277,7 @@ public: void setSelectedParsers(const QList &parsers) { - for (const auto &p : qAsConst(parserCheckBoxes)) + for (const auto &p : std::as_const(parserCheckBoxes)) p.first->setChecked(parsers.contains(p.second)); emit selectionChanged(); } @@ -285,7 +285,7 @@ public: QList selectedParsers() const { QList parsers; - for (const auto &p : qAsConst(parserCheckBoxes)) { + for (const auto &p : std::as_const(parserCheckBoxes)) { if (p.first->isChecked()) parsers << p.second; } @@ -301,7 +301,7 @@ private: const auto layout = qobject_cast(this->layout()); QTC_ASSERT(layout, return); const QList parsers = selectedParsers(); - for (const auto &p : qAsConst(parserCheckBoxes)) + for (const auto &p : std::as_const(parserCheckBoxes)) delete p.first; parserCheckBoxes.clear(); for (const CustomParserSettings &s : ProjectExplorerPlugin::customParsers()) { diff --git a/src/plugins/projectexplorer/customparserssettingspage.cpp b/src/plugins/projectexplorer/customparserssettingspage.cpp index e2f8d63ff97..c832d77a12c 100644 --- a/src/plugins/projectexplorer/customparserssettingspage.cpp +++ b/src/plugins/projectexplorer/customparserssettingspage.cpp @@ -104,7 +104,7 @@ private: [](const CustomParserSettings &s1, const CustomParserSettings &s2) { return s1.displayName < s2.displayName; }); - for (const CustomParserSettings &s : qAsConst(m_customParsers)) { + for (const CustomParserSettings &s : std::as_const(m_customParsers)) { const auto item = new QListWidgetItem(s.displayName); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable); m_parserListView.addItem(item); diff --git a/src/plugins/projectexplorer/customwizard/customwizard.cpp b/src/plugins/projectexplorer/customwizard/customwizard.cpp index f55755bb9e9..181f09033b9 100644 --- a/src/plugins/projectexplorer/customwizard/customwizard.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizard.cpp @@ -311,7 +311,7 @@ GeneratedFiles CustomWizard::generateWizardFiles(QString *errorMessage) const return rc; } // Add the template files specified by the elements. - for (const CustomWizardFile &file : qAsConst(d->m_parameters->files)) + for (const CustomWizardFile &file : std::as_const(d->m_parameters->files)) if (!createFile(file, d->m_parameters->directory, ctx->targetPath.toString(), context()->replacements, &rc, errorMessage)) return {}; diff --git a/src/plugins/projectexplorer/customwizard/customwizardpage.cpp b/src/plugins/projectexplorer/customwizard/customwizardpage.cpp index a657d78626d..5d966e5011c 100644 --- a/src/plugins/projectexplorer/customwizard/customwizardpage.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizardpage.cpp @@ -74,7 +74,7 @@ CustomWizardFieldPage::CustomWizardFieldPage(const QSharedPointersetFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); if (debug) qDebug() << Q_FUNC_INFO << parameters->fields.size(); - for (const CustomWizardField &f : qAsConst(parameters->fields)) + for (const CustomWizardField &f : std::as_const(parameters->fields)) addField(f); vLayout->addLayout(m_formLayout); m_errorLabel->setVisible(false); @@ -281,7 +281,7 @@ void CustomWizardFieldPage::initializePage() { QWizardPage::initializePage(); clearError(); - for (const LineEditData &led : qAsConst(m_lineEdits)) { + for (const LineEditData &led : std::as_const(m_lineEdits)) { if (!led.userChange.isNull()) { led.lineEdit->setText(led.userChange); } else if (!led.defaultText.isEmpty()) { @@ -292,7 +292,7 @@ void CustomWizardFieldPage::initializePage() if (!led.placeholderText.isEmpty()) led.lineEdit->setPlaceholderText(led.placeholderText); } - for (const TextEditData &ted : qAsConst(m_textEdits)) { + for (const TextEditData &ted : std::as_const(m_textEdits)) { if (!ted.userChange.isNull()) { ted.textEdit->setText(ted.userChange); } else if (!ted.defaultText.isEmpty()) { @@ -301,7 +301,7 @@ void CustomWizardFieldPage::initializePage() ted.textEdit->setText(defaultText); } } - for (const PathChooserData &ped : qAsConst(m_pathChoosers)) { + for (const PathChooserData &ped : std::as_const(m_pathChoosers)) { if (!ped.userChange.isNull()) { ped.pathChooser->setFilePath(FilePath::fromUserInput(ped.userChange)); } else if (!ped.defaultText.isEmpty()) { @@ -349,7 +349,7 @@ bool CustomWizardFieldPage::validatePage() { clearError(); // Check line edits with validators - for (const LineEditData &led : qAsConst(m_lineEdits)) { + for (const LineEditData &led : std::as_const(m_lineEdits)) { if (const QValidator *val = led.lineEdit->validator()) { int pos = 0; QString text = led.lineEdit->text(); diff --git a/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp b/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp index 3e92ccd1c4c..ea232426986 100644 --- a/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp @@ -167,7 +167,7 @@ Core::GeneratedFiles if (CustomWizard::verbose()) { QDebug nospace = qDebug().nospace(); nospace << script << " generated:\n"; - for (const Core::GeneratedFile &f : qAsConst(files)) + for (const Core::GeneratedFile &f : std::as_const(files)) nospace << ' ' << f.filePath() << f.attributes() << '\n'; } return files; diff --git a/src/plugins/projectexplorer/deployconfiguration.cpp b/src/plugins/projectexplorer/deployconfiguration.cpp index 6c93f745882..559de555121 100644 --- a/src/plugins/projectexplorer/deployconfiguration.cpp +++ b/src/plugins/projectexplorer/deployconfiguration.cpp @@ -175,7 +175,7 @@ DeployConfiguration *DeployConfigurationFactory::create(Target *parent) DeployConfiguration *dc = createDeployConfiguration(parent); QTC_ASSERT(dc, return nullptr); BuildStepList *stepList = dc->stepList(); - for (const BuildStepList::StepCreationInfo &info : qAsConst(m_initialSteps)) { + for (const BuildStepList::StepCreationInfo &info : std::as_const(m_initialSteps)) { if (!info.condition || info.condition(parent)) stepList->appendStep(info.stepId); } diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 7a5c9c416a9..c0ae7a1726e 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -92,7 +92,7 @@ void DeviceManager::replaceInstance() const QList newIds = Utils::transform(DeviceManagerPrivate::clonedInstance->d->devices, &IDevice::id); - for (const IDevice::Ptr &dev : qAsConst(m_instance->d->devices)) { + for (const IDevice::Ptr &dev : std::as_const(m_instance->d->devices)) { if (!newIds.contains(dev->id())) dev->aboutToBeRemoved(); } @@ -124,7 +124,7 @@ DeviceManager *DeviceManager::cloneInstance() void DeviceManager::copy(const DeviceManager *source, DeviceManager *target, bool deep) { if (deep) { - for (const IDevice::Ptr &device : qAsConst(source->d->devices)) + for (const IDevice::Ptr &device : std::as_const(source->d->devices)) target->d->devices << device->clone(); } else { target->d->devices = source->d->devices; @@ -170,8 +170,8 @@ void DeviceManager::load() userDevices = fromMap(reader.restoreValues().value(DeviceManagerKey).toMap(), &defaultDevices); // Insert devices into the model. Prefer the higher device version when there are multiple // devices with the same id. - for (IDevice::ConstPtr device : qAsConst(userDevices)) { - for (const IDevice::Ptr &sdkDevice : qAsConst(sdkDevices)) { + for (IDevice::ConstPtr device : std::as_const(userDevices)) { + for (const IDevice::Ptr &sdkDevice : std::as_const(sdkDevices)) { if (device->id() == sdkDevice->id()) { if (device->version() < sdkDevice->version()) device = sdkDevice; @@ -182,7 +182,7 @@ void DeviceManager::load() addDevice(device); } // Append the new SDK devices to the model. - for (const IDevice::Ptr &sdkDevice : qAsConst(sdkDevices)) + for (const IDevice::Ptr &sdkDevice : std::as_const(sdkDevices)) addDevice(sdkDevice); // Overwrite with the saved default devices. @@ -245,7 +245,7 @@ QVariantMap DeviceManager::toMap() const } map.insert(QLatin1String(DefaultDevicesKey), defaultDeviceMap); QVariantList deviceList; - for (const IDevice::Ptr &device : qAsConst(d->devices)) + for (const IDevice::Ptr &device : std::as_const(d->devices)) deviceList << device->toMap(); map.insert(QLatin1String(DeviceListKey), deviceList); return map; @@ -256,7 +256,7 @@ void DeviceManager::addDevice(const IDevice::ConstPtr &_device) const IDevice::Ptr device = _device->clone(); QStringList names; - for (const IDevice::Ptr &tmp : qAsConst(d->devices)) { + for (const IDevice::Ptr &tmp : std::as_const(d->devices)) { if (tmp->id() != device->id()) names << tmp->displayName(); } diff --git a/src/plugins/projectexplorer/editorconfiguration.cpp b/src/plugins/projectexplorer/editorconfiguration.cpp index 9bffdaff890..68f0b037011 100644 --- a/src/plugins/projectexplorer/editorconfiguration.cpp +++ b/src/plugins/projectexplorer/editorconfiguration.cpp @@ -390,7 +390,7 @@ void EditorConfiguration::slotAboutToRemoveProject(Project *project) if (project->editorConfiguration() != this) return; - for (BaseTextEditor *editor : qAsConst(d->m_editors)) + for (BaseTextEditor *editor : std::as_const(d->m_editors)) deconfigureEditor(editor); } diff --git a/src/plugins/projectexplorer/environmentwidget.cpp b/src/plugins/projectexplorer/environmentwidget.cpp index 33c6193dd4d..4e9ca13c3e5 100644 --- a/src/plugins/projectexplorer/environmentwidget.cpp +++ b/src/plugins/projectexplorer/environmentwidget.cpp @@ -373,7 +373,7 @@ void EnvironmentWidget::updateSummaryText() Utils::EnvironmentItem::sort(&list); QString text; - for (const Utils::EnvironmentItem &item : qAsConst(list)) { + for (const Utils::EnvironmentItem &item : std::as_const(list)) { if (item.name != Utils::EnvironmentModel::tr("")) { if (!d->m_baseEnvironmentText.isEmpty() || !text.isEmpty()) text.append(QLatin1String("
")); diff --git a/src/plugins/projectexplorer/extracompiler.cpp b/src/plugins/projectexplorer/extracompiler.cpp index b71ae0a1279..8c8e46f4220 100644 --- a/src/plugins/projectexplorer/extracompiler.cpp +++ b/src/plugins/projectexplorer/extracompiler.cpp @@ -263,7 +263,7 @@ void ExtraCompilerPrivate::updateIssues() QList selections; const QTextDocument *document = widget->document(); - for (const Task &issue : qAsConst(issues)) { + for (const Task &issue : std::as_const(issues)) { QTextEdit::ExtraSelection selection; QTextCursor cursor(document->findBlockByNumber(issue.line - 1)); cursor.movePosition(QTextCursor::StartOfLine); diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 0b2b37fbcf5..e4581419faf 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -627,7 +627,7 @@ HeaderPaths GccToolChain::builtInHeaderPaths(const Utils::Environment &env, headerCache->insert({env, arguments}, paths); qCDebug(gccLog) << "Reporting header paths to code model:"; - for (const HeaderPath &hp : qAsConst(paths)) { + for (const HeaderPath &hp : std::as_const(paths)) { qCDebug(gccLog) << compilerCommand.toUserOutput() << (languageId == Constants::CXX_LANGUAGE_ID ? ": C++ [" : ": C [") << arguments.join(", ") << "]" << hp.path; @@ -1108,7 +1108,7 @@ static FilePaths findCompilerCandidates(const ToolchainDetector &detector, FilePaths searchPaths = detector.searchPaths; if (searchPaths.isEmpty()) searchPaths = device->systemEnvironment().path(); - for (const FilePath &deviceDir : qAsConst(searchPaths)) { + for (const FilePath &deviceDir : std::as_const(searchPaths)) { static const QRegularExpression regexp(binaryRegexp); const auto callBack = [&compilerPaths, compilerName](const FilePath &candidate) { if (candidate.fileName() == compilerName) @@ -1142,7 +1142,7 @@ static FilePaths findCompilerCandidates(const ToolchainDetector &detector, searchPaths << ccachePath; } } - for (const FilePath &dir : qAsConst(searchPaths)) { + for (const FilePath &dir : std::as_const(searchPaths)) { static const QRegularExpression regexp(binaryRegexp); QDir binDir(dir.toString()); const QStringList fileNames = binDir.entryList(nameFilters, @@ -1173,7 +1173,7 @@ Toolchains GccToolChainFactory::autoDetectToolchains( Toolchains existingCandidates = filtered(detector.alreadyKnown, [language](const ToolChain *tc) { return tc->language() == language; }); Toolchains result; - for (const FilePath &compilerPath : qAsConst(compilerPaths)) { + for (const FilePath &compilerPath : std::as_const(compilerPaths)) { bool alreadyExists = false; for (ToolChain * const existingTc : existingCandidates) { // We have a match if the existing toolchain ultimately refers to the same file diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp index b8f8080a2f1..2842ad25b6d 100644 --- a/src/plugins/projectexplorer/gnumakeparser.cpp +++ b/src/plugins/projectexplorer/gnumakeparser.cpp @@ -348,7 +348,7 @@ void ProjectExplorerPlugin::testGnuMakeParserParsing() FilePaths searchDirs = childParser->searchDirectories(); // add extra directories: - for (const QString &dir : qAsConst(extraSearchDirs)) + for (const QString &dir : std::as_const(extraSearchDirs)) testbench.addSearchDir(FilePath::fromString(dir)); testbench.testParsing(input, inputChannel, @@ -357,13 +357,13 @@ void ProjectExplorerPlugin::testGnuMakeParserParsing() // make sure we still have all the original dirs FilePaths newSearchDirs = tester->directories; - for (const FilePath &dir : qAsConst(searchDirs)) { + for (const FilePath &dir : std::as_const(searchDirs)) { QVERIFY(newSearchDirs.contains(dir)); newSearchDirs.removeOne(dir); } // make sure we have all additional dirs: - for (const QString &dir : qAsConst(additionalSearchDirs)) { + for (const QString &dir : std::as_const(additionalSearchDirs)) { const FilePath fp = FilePath::fromString(dir); QVERIFY(newSearchDirs.contains(fp)); newSearchDirs.removeOne(fp); diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp index 9a783e2f77e..f11f53d09cd 100644 --- a/src/plugins/projectexplorer/ioutputparser.cpp +++ b/src/plugins/projectexplorer/ioutputparser.cpp @@ -105,7 +105,7 @@ void OutputTaskParser::runPostPrintActions(QPlainTextEdit *edit) }); } - for (const TaskInfo &t : qAsConst(d->scheduledTasks)) + for (const TaskInfo &t : std::as_const(d->scheduledTasks)) TaskHub::addTask(t.task); d->scheduledTasks.clear(); } diff --git a/src/plugins/projectexplorer/journaldwatcher.cpp b/src/plugins/projectexplorer/journaldwatcher.cpp index ecef018f289..47dcd558de3 100644 --- a/src/plugins/projectexplorer/journaldwatcher.cpp +++ b/src/plugins/projectexplorer/journaldwatcher.cpp @@ -190,7 +190,7 @@ void JournaldWatcher::handleEntry() if (logEntry.isEmpty()) break; - for (const JournaldWatcherPrivate::SubscriberInformation &info: qAsConst(d->m_subscriptions)) + for (const JournaldWatcherPrivate::SubscriberInformation &info: std::as_const(d->m_subscriptions)) info.subscription(logEntry); } } diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp index 67b8da4ce56..8992fd4ab96 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp @@ -1391,7 +1391,7 @@ bool JsonFieldPage::isComplete() const bool result = true; bool hasErrorMessage = false; - for (Field *f : qAsConst(m_fields)) { + for (Field *f : std::as_const(m_fields)) { f->adjustState(m_expander); if (!f->validate(m_expander, &message)) { if (!message.isEmpty()) { @@ -1411,19 +1411,19 @@ bool JsonFieldPage::isComplete() const void JsonFieldPage::initializePage() { - for (Field *f : qAsConst(m_fields)) + for (Field *f : std::as_const(m_fields)) f->initialize(m_expander); } void JsonFieldPage::cleanupPage() { - for (Field *f : qAsConst(m_fields)) + for (Field *f : std::as_const(m_fields)) f->cleanup(m_expander); } bool JsonFieldPage::validatePage() { - for (Field * const f : qAsConst(m_fields)) + for (Field * const f : std::as_const(m_fields)) if (!f->persistenceKey().isEmpty() && f->hasUserChanges()) { const QVariant value = f->toSettings(); if (value.isValid()) diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizard.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizard.cpp index 7ce7802bda6..6ec0b1b5440 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizard.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizard.cpp @@ -174,7 +174,7 @@ JsonWizard::GeneratorFiles JsonWizard::generateFileList() if (m_files.isEmpty() && errorMessage.isEmpty()) { emit preGenerateFiles(); - for (JsonWizardGenerator *gen : qAsConst(m_generators)) { + for (JsonWizardGenerator *gen : std::as_const(m_generators)) { const Utils::FilePath wizardDir = Utils::FilePath::fromString(stringValue(QLatin1String("WizardDir"))); const Core::GeneratedFiles tmp = diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp index 63723c757b3..7c169519e48 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp @@ -599,13 +599,13 @@ Wizard *JsonWizardFactory::runWizardImpl(const FilePath &path, QWidget *parent, wizard->setValue(QStringLiteral("id"), id().toString()); MacroExpander *expander = wizard->expander(); - for (const JsonWizard::OptionDefinition &od : qAsConst(m_options)) { + for (const JsonWizard::OptionDefinition &od : std::as_const(m_options)) { if (od.condition(*expander)) wizard->setValue(od.key(), od.value(*expander)); } bool havePage = false; - for (const Page &data : qAsConst(m_pages)) { + for (const Page &data : std::as_const(m_pages)) { QTC_ASSERT(data.isValid(), continue); if (!JsonWizard::boolFromVariant(data.enabled, wizard->expander())) @@ -633,7 +633,7 @@ Wizard *JsonWizardFactory::runWizardImpl(const FilePath &path, QWidget *parent, } } - for (const Generator &data : qAsConst(m_generators)) { + for (const Generator &data : std::as_const(m_generators)) { QTC_ASSERT(data.isValid(), continue); JsonWizardGeneratorFactory *factory = Utils::findOr(s_generatorFactories, nullptr, [&data](JsonWizardGeneratorFactory *f) { @@ -680,7 +680,7 @@ QString JsonWizardFactory::localizedString(const QVariant &value) const QString locale = languageSetting().toLower(); QStringList locales; locales << locale << QLatin1String("en") << QLatin1String("C") << tmp.keys(); - for (const QString &locale : qAsConst(locales)) { + for (const QString &locale : std::as_const(locales)) { QString result = tmp.value(locale, QString()).toString(); if (!result.isEmpty()) return result; @@ -834,7 +834,7 @@ bool JsonWizardFactory::initialize(const QVariantMap &data, const FilePath &base return false; } - for (const QVariant &v : qAsConst(list)) { + for (const QVariant &v : std::as_const(list)) { Generator gen = parseGenerator(v, errorMessage); if (gen.isValid()) m_generators.append(gen); @@ -849,7 +849,7 @@ bool JsonWizardFactory::initialize(const QVariantMap &data, const FilePath &base return false; } - for (const QVariant &v : qAsConst(list)) { + for (const QVariant &v : std::as_const(list)) { Page p = parsePage(v, errorMessage); if (p.isValid()) m_pages.append(p); diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp index 4a191535837..c1b83cb8e9f 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp @@ -95,7 +95,7 @@ Core::GeneratedFile JsonWizardFileGenerator::generateFile(const File &file, // evaluate file options once: QHash options; - for (const JsonWizard::OptionDefinition &od : qAsConst(file.options)) { + for (const JsonWizard::OptionDefinition &od : std::as_const(file.options)) { if (od.condition(*expander)) options.insert(od.key(), od.value(*expander)); } @@ -171,7 +171,7 @@ Core::GeneratedFiles JsonWizardFileGenerator::fileList(Utils::MacroExpander *exp const QSet knownFiles = Utils::transform(fileList, &File::target); - for (const File &dir : qAsConst(dirList)) { + for (const File &dir : std::as_const(dirList)) { Utils::FilePath sourceDir(dir.source); const Utils::FilePaths entries = sourceDir.dirEntries(QDir::NoDotAndDotDot | QDir::Files| QDir::Hidden); diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp index 719c5790234..9e33dd0b5e7 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp @@ -139,7 +139,7 @@ JsonWizardGenerator::OverwriteResult JsonWizardGenerator::promptForOverwrite(Jso QStringList existingFiles; bool oddStuffFound = false; - for (const JsonWizard::GeneratorFile &f : qAsConst(*files)) { + for (const JsonWizard::GeneratorFile &f : std::as_const(*files)) { if (f.file.filePath().exists() && !(f.file.attributes() & GeneratedFile::ForceOverwrite) && !(f.file.attributes() & GeneratedFile::KeepExistingFileAttribute)) @@ -153,7 +153,7 @@ JsonWizardGenerator::OverwriteResult JsonWizardGenerator::promptForOverwrite(Jso // Format a file list message as ( " [readonly], [folder]"). const QString commonExistingPath = Utils::commonPath(existingFiles); QString fileNamesMsgPart; - for (const QString &fileName : qAsConst(existingFiles)) { + for (const QString &fileName : std::as_const(existingFiles)) { const QFileInfo fi(fileName); if (fi.exists()) { if (!fileNamesMsgPart.isEmpty()) @@ -187,7 +187,7 @@ JsonWizardGenerator::OverwriteResult JsonWizardGenerator::promptForOverwrite(Jso // Scripts cannot handle overwrite overwriteDialog.setFiles(existingFiles); - for (const JsonWizard::GeneratorFile &file : qAsConst(*files)) + for (const JsonWizard::GeneratorFile &file : std::as_const(*files)) if (!file.generator->canKeepExistingFiles()) overwriteDialog.setFileEnabled(file.file.filePath().toString(), false); if (overwriteDialog.exec() != QDialog::Accepted) diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardscannergenerator.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardscannergenerator.cpp index ef1a8c0b8e2..a7477d0a39e 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardscannergenerator.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardscannergenerator.cpp @@ -101,7 +101,7 @@ Core::GeneratedFiles JsonWizardScannerGenerator::fileList(Utils::MacroExpander * bool JsonWizardScannerGenerator::matchesSubdirectoryPattern(const Utils::FilePath &path) { - for (const QRegularExpression ®exp : qAsConst(m_subDirectoryExpressions)) { + for (const QRegularExpression ®exp : std::as_const(m_subDirectoryExpressions)) { if (regexp.match(path.path()).hasMatch()) return true; } diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index 9ea9c6606c8..1bbe25c7e8e 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -516,12 +516,12 @@ QVariantMap Kit::toMap() const data.insert(DEVICE_TYPE_FOR_ICON_KEY, d->m_deviceTypeForIcon.toSetting()); QStringList mutableInfo; - for (const Id id : qAsConst(d->m_mutable)) + for (const Id id : std::as_const(d->m_mutable)) mutableInfo << id.toString(); data.insert(QLatin1String(MUTABLE_INFO_KEY), mutableInfo); QStringList stickyInfo; - for (const Id id : qAsConst(d->m_sticky)) + for (const Id id : std::as_const(d->m_sticky)) stickyInfo << id.toString(); data.insert(QLatin1String(STICKY_INFO_KEY), stickyInfo); diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index 22675f4e672..0265d6376d0 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -207,7 +207,7 @@ public: }); QTC_ASSERT(!languageList.isEmpty(), return); int row = 0; - for (Id l : qAsConst(languageList)) { + for (Id l : std::as_const(languageList)) { layout->addWidget(new QLabel(ToolChainManager::displayNameOfLanguageId(l) + ':'), row, 0); auto cb = new QComboBox; cb->setSizePolicy(QSizePolicy::Ignored, cb->sizePolicy().verticalPolicy()); diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index 00744b0801e..d79b73de293 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -221,7 +221,7 @@ void KitManagerConfigWidget::setHasUniqueName(bool unique) void KitManagerConfigWidget::makeStickySubWidgetsReadOnly() { - for (KitAspectWidget *w : qAsConst(m_widgets)) { + for (KitAspectWidget *w : std::as_const(m_widgets)) { if (w->kit()->isSticky(w->kitInformation()->id())) w->makeReadOnly(); } @@ -272,7 +272,7 @@ void KitManagerConfigWidget::setIcon() Utils::sort(allDeviceFactories, less); } QMenu iconMenu; - for (const IDeviceFactory * const factory : qAsConst(allDeviceFactories)) { + for (const IDeviceFactory * const factory : std::as_const(allDeviceFactories)) { if (factory->icon().isNull()) continue; QAction *action = iconMenu.addAction(factory->icon(), @@ -332,7 +332,7 @@ void KitManagerConfigWidget::workingCopyWasUpdated(Kit *k) k->fix(); m_fixingKit = false; - for (KitAspectWidget *w : qAsConst(m_widgets)) + for (KitAspectWidget *w : std::as_const(m_widgets)) w->refresh(); m_cachedDisplayName.clear(); @@ -360,7 +360,7 @@ void KitManagerConfigWidget::kitWasUpdated(Kit *k) void KitManagerConfigWidget::showEvent(QShowEvent *event) { Q_UNUSED(event) - for (KitAspectWidget *widget : qAsConst(m_widgets)) + for (KitAspectWidget *widget : std::as_const(m_widgets)) widget->refresh(); } diff --git a/src/plugins/projectexplorer/kitmodel.cpp b/src/plugins/projectexplorer/kitmodel.cpp index a26455ba972..25ef46f5867 100644 --- a/src/plugins/projectexplorer/kitmodel.cpp +++ b/src/plugins/projectexplorer/kitmodel.cpp @@ -290,7 +290,7 @@ void KitModel::updateKit(Kit *) void KitModel::removeKit(Kit *k) { QList nodes = m_toRemoveList; - for (KitNode *n : qAsConst(nodes)) { + for (KitNode *n : std::as_const(nodes)) { if (n->widget->configures(k)) { m_toRemoveList.removeOne(n); if (m_defaultNode == n) diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.cpp b/src/plugins/projectexplorer/miniprojecttargetselector.cpp index 89bb81de0f1..5ea8a718dfa 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.cpp +++ b/src/plugins/projectexplorer/miniprojecttargetselector.cpp @@ -615,7 +615,7 @@ private: setKit(m_kit); } else { // Refresh all widgets if the number of mutable settings did not change - for (KitAspectWidget *w : qAsConst(m_widgets)) + for (KitAspectWidget *w : std::as_const(m_widgets)) w->refresh(); } } diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index e33c264ab4b..e3f506c0595 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -792,7 +792,7 @@ void MsvcToolChain::updateEnvironmentModifications(Utils::EnvironmentItems modif if (modifications != m_environmentModifications) { if (Log().isDebugEnabled()) { qCDebug(Log) << "Update environment for " << displayName(); - for (const EnvironmentItem &item : qAsConst(modifications)) + for (const EnvironmentItem &item : std::as_const(modifications)) qCDebug(Log) << '\t' << item; } m_environmentModifications = modifications; @@ -1294,7 +1294,7 @@ MsvcToolChainConfigWidget::MsvcToolChainConfigWidget(ToolChain *tc) m_varsBatPathCombo->setObjectName("varsBatCombo"); m_varsBatPathCombo->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); m_varsBatPathCombo->setEditable(true); - for (const MsvcToolChain *tmpTc : qAsConst(g_availableMsvcToolchains)) { + for (const MsvcToolChain *tmpTc : std::as_const(g_availableMsvcToolchains)) { const QString nativeVcVars = QDir::toNativeSeparators(tmpTc->varsBat()); if (!tmpTc->varsBat().isEmpty() && m_varsBatPathCombo->findText(nativeVcVars) == -1) { @@ -1403,7 +1403,7 @@ void MsvcToolChainConfigWidget::updateAbis() // choose one appropriately. Abis supportedAbis; Abi targetAbi; - for (const MsvcToolChain *tc : qAsConst(g_availableMsvcToolchains)) { + for (const MsvcToolChain *tc : std::as_const(g_availableMsvcToolchains)) { if (tc->varsBat() == normalizedVcVars && tc->targetAbi().wordWidth() == wordWidth && tc->targetAbi().architecture() == arch && tc->language() == currentTc->language()) { // We need to filter out duplicates as there might be multiple toolchains with @@ -1504,7 +1504,7 @@ void ClangClToolChainConfigWidget::setFromClangClToolChain() m_nameDisplayLabel->setText(currentTC->displayName()); m_varsBatDisplayCombo->clear(); m_varsBatDisplayCombo->addItem(msvcVarsToDisplay(*currentTC)); - for (const MsvcToolChain *tc : qAsConst(g_availableMsvcToolchains)) { + for (const MsvcToolChain *tc : std::as_const(g_availableMsvcToolchains)) { const QString varsToDisplay = msvcVarsToDisplay(*tc); if (m_varsBatDisplayCombo->findText(varsToDisplay) == -1) m_varsBatDisplayCombo->addItem(varsToDisplay); @@ -1993,7 +1993,7 @@ Toolchains MsvcToolChainFactory::autoDetect(const ToolchainDetector &detector) c detectCppBuildTools2015(&results); - for (ToolChain *tc : qAsConst(results)) + for (ToolChain *tc : std::as_const(results)) tc->setDetection(ToolChain::AutoDetection); return results; diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index cb87e033296..de503fff874 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -358,7 +358,7 @@ void Project::setExtraProjectFiles(const QSet &projectDocumentPaths, return toRemove.contains(d->filePath()); }); if (docUpdater) { - for (const auto &doc : qAsConst(d->m_extraProjectDocuments)) + for (const auto &doc : std::as_const(d->m_extraProjectDocuments)) docUpdater(doc.get()); } QList toRegister; @@ -391,7 +391,7 @@ void Project::updateExtraProjectFiles(const QSet &projectDocumentPaths void Project::updateExtraProjectFiles(const DocUpdater &docUpdater) { - for (const auto &doc : qAsConst(d->m_extraProjectDocuments)) + for (const auto &doc : std::as_const(d->m_extraProjectDocuments)) docUpdater(doc.get()); } @@ -625,7 +625,7 @@ FilePaths Project::files(const NodeMatcher &filter) const result.append(projectFilePath()); FilePath lastAdded; - for (const Node *n : qAsConst(d->m_sortedNodeList)) { + for (const Node *n : std::as_const(d->m_sortedNodeList)) { if (!filter(n)) continue; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 43d193819ff..db57d6f2bca 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -3570,7 +3570,7 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions(Node *currentNode) m_defaultRunConfiguration = runConfigs.first(); } else if (runConfigs.count() > 1) { runMenu->menu()->menuAction()->setVisible(true); - for (RunConfiguration *rc : qAsConst(runConfigs)) { + for (RunConfiguration *rc : std::as_const(runConfigs)) { auto *act = new QAction(runMenu->menu()); act->setText(tr("Run %1").arg(rc->displayName())); runMenu->menu()->addAction(act); @@ -3792,7 +3792,7 @@ void ProjectExplorerPluginPrivate::addExistingProjects() return; FilePaths failedProjects; FilePaths addedProjects; - for (const FilePath &filePath : qAsConst(subProjectFilePaths)) { + for (const FilePath &filePath : std::as_const(subProjectFilePaths)) { if (projectNode->addSubProject(filePath)) addedProjects << filePath; else @@ -3968,7 +3968,7 @@ void ProjectExplorerPluginPrivate::removeFile() filesToRemove << siblings; } - for (const NodeAndPath &file : qAsConst(filesToRemove)) { + for (const NodeAndPath &file : std::as_const(filesToRemove)) { // Nodes can become invalid if the project was re-parsed while the dialog was open if (!ProjectTree::hasNode(file.first)) { QMessageBox::warning(ICore::dialogParent(), tr("Removing File Failed"), @@ -3997,7 +3997,7 @@ void ProjectExplorerPluginPrivate::removeFile() std::vector> changeGuards; FilePaths pathList; - for (const NodeAndPath &file : qAsConst(filesToRemove)) { + for (const NodeAndPath &file : std::as_const(filesToRemove)) { pathList << file.second; changeGuards.emplace_back(std::make_unique(file.second)); } diff --git a/src/plugins/projectexplorer/projectimporter.cpp b/src/plugins/projectexplorer/projectimporter.cpp index 12f59deb171..dbedd856088 100644 --- a/src/plugins/projectexplorer/projectimporter.cpp +++ b/src/plugins/projectexplorer/projectimporter.cpp @@ -113,7 +113,7 @@ const QList ProjectImporter::import(const Utils::FilePath &importPath } qCDebug(log) << "Looking for kits"; - for (void *data : qAsConst(dataList)) { + for (void *data : std::as_const(dataList)) { QTC_ASSERT(data, continue); QList kitList; const QList tmp @@ -128,7 +128,7 @@ const QList ProjectImporter::import(const Utils::FilePath &importPath qCDebug(log) << " " << tmp.count() << "matching kits found."; } - for (Kit *k : qAsConst(kitList)) { + for (Kit *k : std::as_const(kitList)) { qCDebug(log) << "Creating buildinfos for kit" << k->displayName(); const QList infoList = buildInfoList(data); if (infoList.isEmpty()) { @@ -146,7 +146,7 @@ const QList ProjectImporter::import(const Utils::FilePath &importPath } } - for (void *dd : qAsConst(dataList)) + for (void *dd : std::as_const(dataList)) deleteDirectoryData(dd); dataList.clear(); @@ -213,7 +213,7 @@ void ProjectImporter::makePersistent(Kit *k) const k->removeKey(KIT_TEMPORARY_NAME); k->removeKey(KIT_FINAL_NAME); - for (const TemporaryInformationHandler &tih : qAsConst(m_temporaryHandlers)) { + for (const TemporaryInformationHandler &tih : std::as_const(m_temporaryHandlers)) { const Utils::Id fid = fullId(tih.id); const QVariantList temporaryValues = k->value(fid).toList(); @@ -238,7 +238,7 @@ void ProjectImporter::makePersistent(Kit *k) const void ProjectImporter::cleanupKit(Kit *k) const { QTC_ASSERT(k, return); - for (const TemporaryInformationHandler &tih : qAsConst(m_temporaryHandlers)) { + for (const TemporaryInformationHandler &tih : std::as_const(m_temporaryHandlers)) { const Utils::Id fid = fullId(tih.id); const QVariantList temporaryValues = Utils::filtered(k->value(fid).toList(), [fid, k](const QVariant &v) { @@ -377,7 +377,7 @@ static ProjectImporter::ToolChainData createToolChains(const ToolChainDescriptio if (data.tcs.isEmpty()) continue; - for (ToolChain *tc : qAsConst(data.tcs)) + for (ToolChain *tc : std::as_const(data.tcs)) ToolChainManager::registerToolChain(tc); data.areTemporary = true; @@ -394,7 +394,7 @@ ProjectImporter::findOrCreateToolChains(const ToolChainDescription &tcd) const result.tcs = ToolChainManager::toolchains([&tcd](const ToolChain *tc) { return tc->language() == tcd.language && tc->matchesCompilerCommand(tcd.compilerPath); }); - for (const ToolChain *tc : qAsConst(result.tcs)) { + for (const ToolChain *tc : std::as_const(result.tcs)) { const QByteArray tcId = tc->id(); result.areTemporary = result.areTemporary ? true : hasKitWithTemporaryData(ToolChainKitAspect::id(), tcId); } diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 86766a586c8..68d482264af 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -66,7 +66,7 @@ static FolderNode *recursiveFindOrCreateFolderNode(FolderNode *folder, parts[0].prepend('/'); ProjectExplorer::FolderNode *parent = folder; - for (const QString &part : qAsConst(parts)) { + for (const QString &part : std::as_const(parts)) { path = path.pathAppended(part); // Find folder in subFolders FolderNode *next = parent->folderNode(path); diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index b40c955d542..891d1bdf0c9 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -172,7 +172,7 @@ void ProjectTree::updateFromNode(Node *node) project = SessionManager::startupProject(); setCurrent(node, project); - for (ProjectTreeWidget *widget : qAsConst(m_projectTreeWidgets)) + for (ProjectTreeWidget *widget : std::as_const(m_projectTreeWidgets)) widget->sync(node); } diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp index e74e5c96382..c7b6910985d 100644 --- a/src/plugins/projectexplorer/projecttreewidget.cpp +++ b/src/plugins/projectexplorer/projecttreewidget.cpp @@ -304,7 +304,7 @@ int ProjectTreeWidget::expandedCount(Node *node) return 0; int count = 0; - for (ProjectTreeWidget *tree : qAsConst(m_projectTreeWidgets)) { + for (ProjectTreeWidget *tree : std::as_const(m_projectTreeWidgets)) { QModelIndex idx = index; while (idx.isValid() && idx != tree->m_view->rootIndex()) { if (!tree->m_view->isExpanded(idx)) diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index 8da18e1fdf4..6a8dc6954d2 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -78,7 +78,7 @@ AddNewTree::AddNewTree(FolderNode *node, QList children, const QSt { if (node) m_toolTip = node->directory().toString(); - for (AddNewTree *child : qAsConst(children)) + for (AddNewTree *child : std::as_const(children)) appendChild(child); } @@ -90,7 +90,7 @@ AddNewTree::AddNewTree(FolderNode *node, QList children, { if (node) m_toolTip = node->directory().toString(); - for (AddNewTree *child : qAsConst(children)) + for (AddNewTree *child : std::as_const(children)) appendChild(child); } @@ -557,7 +557,7 @@ void ProjectWizardPage::setFiles(const FilePaths &files) return filePath1HasDir; }); - for (const QString &f : qAsConst(formattedFiles)) + for (const QString &f : std::as_const(formattedFiles)) str << QDir::toNativeSeparators(f) << '\n'; str << "
"; diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 1b6fa0b8375..d4e6784dda5 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -218,7 +218,7 @@ bool RunConfiguration::isEnabled() const QWidget *RunConfiguration::createConfigurationWidget() { Layouting::Form builder; - for (BaseAspect *aspect : qAsConst(m_aspects)) { + for (BaseAspect *aspect : std::as_const(m_aspects)) { if (aspect->isVisible()) aspect->addToLayout(builder.finishRow()); } @@ -580,7 +580,7 @@ RunConfiguration *RunConfigurationCreationInfo::create(Target *target) const RunConfiguration *RunConfigurationFactory::restore(Target *parent, const QVariantMap &map) { - for (RunConfigurationFactory *factory : qAsConst(g_runConfigurationFactories)) { + for (RunConfigurationFactory *factory : std::as_const(g_runConfigurationFactories)) { if (factory->canHandle(parent)) { const Utils::Id id = idFromMap(map); if (id.name().startsWith(factory->m_runConfigurationId.name())) { @@ -605,7 +605,7 @@ RunConfiguration *RunConfigurationFactory::clone(Target *parent, RunConfiguratio const QList RunConfigurationFactory::creatorsForTarget(Target *parent) { QList items; - for (RunConfigurationFactory *factory : qAsConst(g_runConfigurationFactories)) { + for (RunConfigurationFactory *factory : std::as_const(g_runConfigurationFactories)) { if (factory->canHandle(parent)) items.append(factory->availableCreators(parent)); } diff --git a/src/plugins/projectexplorer/runconfigurationaspects.cpp b/src/plugins/projectexplorer/runconfigurationaspects.cpp index ea701ae498f..9c845fd31c0 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/runconfigurationaspects.cpp @@ -854,7 +854,7 @@ void InterpreterAspect::updateComboBox() int defaultIndex = -1; const QString currentId = m_currentId; m_comboBox->clear(); - for (const Interpreter &interpreter : qAsConst(m_interpreters)) { + for (const Interpreter &interpreter : std::as_const(m_interpreters)) { int index = m_comboBox->count(); m_comboBox->addItem(interpreter.name); m_comboBox->setItemData(index, interpreter.command.toUserOutput(), Qt::ToolTipRole); diff --git a/src/plugins/projectexplorer/runcontrol.cpp b/src/plugins/projectexplorer/runcontrol.cpp index 2c4ef43e4cd..0f24f238909 100644 --- a/src/plugins/projectexplorer/runcontrol.cpp +++ b/src/plugins/projectexplorer/runcontrol.cpp @@ -150,10 +150,10 @@ void RunWorkerFactory::dumpAll() const QList devices = Utils::transform(IDeviceFactory::allDeviceFactories(), &IDeviceFactory::deviceType); - for (Utils::Id runMode : qAsConst(g_runModes)) { + for (Utils::Id runMode : std::as_const(g_runModes)) { qDebug() << ""; for (Utils::Id device : devices) { - for (Utils::Id runConfig : qAsConst(g_runConfigs)) { + for (Utils::Id runConfig : std::as_const(g_runConfigs)) { const auto check = std::bind(&RunWorkerFactory::canRun, std::placeholders::_1, runMode, @@ -520,7 +520,7 @@ bool RunControl::createMainWorker() bool RunControl::canRun(Utils::Id runMode, Utils::Id deviceType, Utils::Id runConfigId) { - for (const RunWorkerFactory *factory : qAsConst(g_runWorkerFactories)) { + for (const RunWorkerFactory *factory : std::as_const(g_runWorkerFactories)) { if (factory->canRun(runMode, deviceType, runConfigId.toString())) return true; } @@ -541,7 +541,7 @@ void RunControlPrivate::initiateReStart() checkState(RunControlState::Stopped); // Re-set worked on re-runs. - for (RunWorker *worker : qAsConst(m_workers)) { + for (RunWorker *worker : std::as_const(m_workers)) { if (worker->d->state == RunWorkerState::Done) worker->d->state = RunWorkerState::Initialized; } @@ -557,7 +557,7 @@ void RunControlPrivate::continueStart() checkState(RunControlState::Starting); bool allDone = true; debugMessage("Looking for next worker"); - for (RunWorker *worker : qAsConst(m_workers)) { + for (RunWorker *worker : std::as_const(m_workers)) { if (worker) { const QString &workerId = worker->d->id; debugMessage(" Examining worker " + workerId); @@ -620,7 +620,7 @@ void RunControlPrivate::continueStopOrFinish() } }; - for (RunWorker *worker : qAsConst(m_workers)) { + for (RunWorker *worker : std::as_const(m_workers)) { if (worker) { const QString &workerId = worker->d->id; debugMessage(" Examining worker " + workerId); @@ -672,7 +672,7 @@ void RunControlPrivate::forceStop() debugMessage("Was finished, too late to force Stop"); return; } - for (RunWorker *worker : qAsConst(m_workers)) { + for (RunWorker *worker : std::as_const(m_workers)) { if (worker) { const QString &workerId = worker->d->id; debugMessage(" Examining worker " + workerId); @@ -788,7 +788,7 @@ void RunControlPrivate::onWorkerStopped(RunWorker *worker) return; } - for (RunWorker *dependent : qAsConst(worker->d->stopDependencies)) { + for (RunWorker *dependent : std::as_const(worker->d->stopDependencies)) { switch (dependent->d->state) { case RunWorkerState::Done: break; @@ -805,7 +805,7 @@ void RunControlPrivate::onWorkerStopped(RunWorker *worker) debugMessage("Checking whether all stopped"); bool allDone = true; - for (RunWorker *worker : qAsConst(m_workers)) { + for (RunWorker *worker : std::as_const(m_workers)) { if (worker) { const QString &workerId = worker->d->id; debugMessage(" Examining worker " + workerId); @@ -856,7 +856,7 @@ void RunControl::setupFormatter(OutputFormatter *formatter) const { QList parsers = OutputFormatterFactory::createFormatters(target()); if (const auto customParsersAspect = aspect()) { - for (const Id id : qAsConst(customParsersAspect->parsers)) { + for (const Id id : std::as_const(customParsersAspect->parsers)) { if (CustomParser * const parser = CustomParser::createFromId(id)) parsers << parser; } @@ -1879,7 +1879,7 @@ OutputFormatterFactory::~OutputFormatterFactory() QList OutputFormatterFactory::createFormatters(Target *target) { QList formatters; - for (auto factory : qAsConst(g_outputFormatterFactories)) + for (auto factory : std::as_const(g_outputFormatterFactories)) formatters << factory->m_creator(target); return formatters; } diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index 354440b4baf..c5573662e3e 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -491,7 +491,7 @@ void RunSettingsWidget::addSubWidget(QWidget *widget, QLabel *label) void RunSettingsWidget::removeSubWidgets() { - for (const RunConfigItem &item : qAsConst(m_subWidgets)) { + for (const RunConfigItem &item : std::as_const(m_subWidgets)) { delete item.first; delete item.second; } diff --git a/src/plugins/projectexplorer/selectablefilesmodel.cpp b/src/plugins/projectexplorer/selectablefilesmodel.cpp index 894874a89be..01d01bbda9d 100644 --- a/src/plugins/projectexplorer/selectablefilesmodel.cpp +++ b/src/plugins/projectexplorer/selectablefilesmodel.cpp @@ -293,7 +293,7 @@ void SelectableFilesModel::collectPaths(Tree *root, Utils::FilePaths *result) c if (root->checked == Qt::Unchecked) return; result->append(root->fullPath); - for (Tree *t : qAsConst(root->childDirectories)) + for (Tree *t : std::as_const(root->childDirectories)) collectPaths(t, result); } @@ -318,9 +318,9 @@ void SelectableFilesModel::collectFiles(Tree *root, Utils::FilePaths *result) co { if (root->checked == Qt::Unchecked) return; - for (Tree *t : qAsConst(root->childDirectories)) + for (Tree *t : std::as_const(root->childDirectories)) collectFiles(t, result); - for (Tree *t : qAsConst(root->visibleFiles)) + for (Tree *t : std::as_const(root->visibleFiles)) if (t->checked == Qt::Checked) result->append(t->fullPath); } @@ -372,10 +372,10 @@ void SelectableFilesModel::selectAllFiles(Tree *root) { root->checked = Qt::Checked; - for (Tree *t : qAsConst(root->childDirectories)) + for (Tree *t : std::as_const(root->childDirectories)) selectAllFiles(t); - for (Tree *t : qAsConst(root->visibleFiles)) + for (Tree *t : std::as_const(root->visibleFiles)) t->checked = Qt::Checked; emit checkedFilesChanged(); diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index 12a6bcf5452..2437b4389ee 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -489,7 +489,7 @@ bool SessionManager::save() FilePaths projectFiles = Utils::transform(projects(), &Project::projectFilePath); // Restore information on projects that failed to load: // don't read projects to the list, which the user loaded - for (const FilePath &failed : qAsConst(d->m_failedProjects)) { + for (const FilePath &failed : std::as_const(d->m_failedProjects)) { if (!projectFiles.contains(failed)) projectFiles << failed; } @@ -649,7 +649,7 @@ QStringList SessionManagerPrivate::dependenciesOrder() const // remove the handled projects from the dependency lists // of the remaining unordered projects for (int i = 0; i < unordered.count(); ++i) { - for (const QString &pro : qAsConst(ordered)) { + for (const QString &pro : std::as_const(ordered)) { QStringList depList = unordered.at(i).second; depList.removeAll(pro); unordered[i].second = depList; @@ -670,7 +670,7 @@ QList SessionManager::projectOrder(const Project *project) else pros = d->dependenciesOrder(); - for (const QString &proFile : qAsConst(pros)) { + for (const QString &proFile : std::as_const(pros)) { for (Project *pro : projects()) { if (pro->projectFilePath().toString() == proFile) { result << pro; @@ -921,7 +921,7 @@ void SessionManagerPrivate::restoreStartupProject(const PersistentSettingsReader { const QString startupProject = reader.restoreValue(QLatin1String("StartupProject")).toString(); if (!startupProject.isEmpty()) { - for (Project *pro : qAsConst(m_projects)) { + for (Project *pro : std::as_const(m_projects)) { if (pro->projectFilePath().toString() == startupProject) { m_instance->setStartupProject(pro); break; diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index 6e09f0d0753..58533bbd6fb 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -619,7 +619,7 @@ void Target::updateDefaultDeployConfigurations() removeDeployConfiguration(dc); } - for (Utils::Id id : qAsConst(toCreate)) { + for (Utils::Id id : std::as_const(toCreate)) { for (DeployConfigurationFactory *dcFactory : dcFactories) { if (dcFactory->creationId() == id) { DeployConfiguration *dc = dcFactory->create(this); @@ -658,7 +658,7 @@ void Target::updateDefaultRunConfigurations() // that produce already existing RCs QList toRemove; QList existing; - for (RunConfiguration *rc : qAsConst(existingConfigured)) { + for (RunConfiguration *rc : std::as_const(existingConfigured)) { bool present = false; for (const RunConfigurationCreationInfo &item : creators) { QString buildKey = rc->buildKey(); @@ -713,14 +713,14 @@ void Target::updateDefaultRunConfigurations() } // Do actual changes: - for (RunConfiguration *rc : qAsConst(newConfigured)) + for (RunConfiguration *rc : std::as_const(newConfigured)) addRunConfiguration(rc); - for (RunConfiguration *rc : qAsConst(newUnconfigured)) + for (RunConfiguration *rc : std::as_const(newUnconfigured)) addRunConfiguration(rc); // Generate complete list of RCs to remove later: QList removalList; - for (RunConfiguration *rc : qAsConst(toRemove)) { + for (RunConfiguration *rc : std::as_const(toRemove)) { removalList << rc; existingConfigured.removeOne(rc); // make sure to also remove them from existingConfigured! } @@ -756,7 +756,7 @@ void Target::updateDefaultRunConfigurations() } // Remove the RCs that are no longer needed: - for (RunConfiguration *rc : qAsConst(removalList)) + for (RunConfiguration *rc : std::as_const(removalList)) removeRunConfiguration(rc); } diff --git a/src/plugins/projectexplorer/targetsetuppage.cpp b/src/plugins/projectexplorer/targetsetuppage.cpp index eeb57e6602c..9439d5cc730 100644 --- a/src/plugins/projectexplorer/targetsetuppage.cpp +++ b/src/plugins/projectexplorer/targetsetuppage.cpp @@ -187,7 +187,7 @@ TargetSetupPage::TargetSetupPage(QWidget *parent) setTitle(tr("Kit Selection")); - for (IPotentialKit *pk : qAsConst(g_potentialKits)) + for (IPotentialKit *pk : std::as_const(g_potentialKits)) if (pk->isEnabled()) m_potentialWidgets.append(pk->createWidget(this)); @@ -443,9 +443,9 @@ void TargetSetupPage::updateVisibility() void TargetSetupPage::reLayout() { removeAdditionalWidgets(); - for (TargetSetupWidget * const w : qAsConst(m_widgets)) + for (TargetSetupWidget * const w : std::as_const(m_widgets)) m_baseLayout->removeWidget(w); - for (TargetSetupWidget * const w : qAsConst(m_widgets)) + for (TargetSetupWidget * const w : std::as_const(m_widgets)) m_baseLayout->addWidget(w); addAdditionalWidgets(); } @@ -509,7 +509,7 @@ void TargetSetupPage::kitFilterChanged(const QString &filterText) setupWidgets(filterText); // Re-select kits: - for (TargetSetupWidget *w : qAsConst(m_widgets)) + for (TargetSetupWidget *w : std::as_const(m_widgets)) w->setKitSelected(selectedKitIds.contains(w->kit()->id())); emit completeChanged(); @@ -613,7 +613,7 @@ TargetSetupWidget *TargetSetupPage::addWidget(Kit *k) void TargetSetupPage::addAdditionalWidgets() { m_baseLayout->addWidget(m_importWidget); - for (QWidget * const widget : qAsConst(m_potentialWidgets)) + for (QWidget * const widget : std::as_const(m_potentialWidgets)) m_baseLayout->addWidget(widget); m_baseLayout->addItem(m_spacer); } @@ -621,7 +621,7 @@ void TargetSetupPage::addAdditionalWidgets() void TargetSetupPage::removeAdditionalWidgets(QLayout *layout) { layout->removeWidget(m_importWidget); - for (QWidget * const potentialWidget : qAsConst(m_potentialWidgets)) + for (QWidget * const potentialWidget : std::as_const(m_potentialWidgets)) layout->removeWidget(potentialWidget); layout->removeItem(m_spacer); } diff --git a/src/plugins/projectexplorer/targetsetupwidget.cpp b/src/plugins/projectexplorer/targetsetupwidget.cpp index 12c7880b65e..fcd9cc7996b 100644 --- a/src/plugins/projectexplorer/targetsetupwidget.cpp +++ b/src/plugins/projectexplorer/targetsetupwidget.cpp @@ -347,7 +347,7 @@ QPair TargetSetupWidget::findIssues(const BuildInfo &in QString text; Task::TaskType highestType = Task::Unknown; - for (const Task &t : qAsConst(issues)) { + for (const Task &t : std::as_const(issues)) { if (!text.isEmpty()) text.append(QLatin1String("
")); // set severity: diff --git a/src/plugins/projectexplorer/taskfile.cpp b/src/plugins/projectexplorer/taskfile.cpp index c144797242a..c3f89cfc3b1 100644 --- a/src/plugins/projectexplorer/taskfile.cpp +++ b/src/plugins/projectexplorer/taskfile.cpp @@ -161,7 +161,7 @@ void TaskFile::stopMonitoring() { SessionManager::setValue(Constants::SESSION_TASKFILE_KEY, {}); - for (TaskFile *document : qAsConst(openFiles)) + for (TaskFile *document : std::as_const(openFiles)) document->deleteLater(); openFiles.clear(); } diff --git a/src/plugins/projectexplorer/taskmodel.cpp b/src/plugins/projectexplorer/taskmodel.cpp index 632abfa3f70..387b9f13c13 100644 --- a/src/plugins/projectexplorer/taskmodel.cpp +++ b/src/plugins/projectexplorer/taskmodel.cpp @@ -75,7 +75,7 @@ Tasks TaskModel::tasks(Utils::Id categoryId) const return m_tasks; Tasks taskList; - for (const Task &t : qAsConst(m_tasks)) { + for (const Task &t : std::as_const(m_tasks)) { if (t.category == categoryId) taskList.append(t); } diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index 977b494d525..86cb69d0d70 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -345,7 +345,7 @@ TaskWindow::TaskWindow() : d(std::make_unique()) connect(d->m_listview->selectionModel(), &QItemSelectionModel::selectionChanged, this, [this] { const Tasks tasks = d->m_filter->tasks(d->m_listview->selectionModel()->selectedIndexes()); - for (QAction * const action : qAsConst(d->m_actions)) { + for (QAction * const action : std::as_const(d->m_actions)) { ITaskHandler * const h = d->handler(action); action->setEnabled(h && h->canHandle(tasks)); } @@ -421,7 +421,7 @@ void TaskWindow::delayedInitialization() alreadyDone = true; - for (ITaskHandler *h : qAsConst(g_taskHandlers)) { + for (ITaskHandler *h : std::as_const(g_taskHandlers)) { if (h->isDefaultHandler() && !d->m_defaultHandler) d->m_defaultHandler = h; @@ -822,7 +822,7 @@ void TaskDelegate::currentChanged(const QModelIndex ¤t, const QModelIndex QString TaskDelegate::hrefForPos(const QPointF &pos) { - for (const auto &link : qAsConst(m_hrefs)) { + for (const auto &link : std::as_const(m_hrefs)) { if (link.first.contains(pos)) return link.second; } diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index d0b9d92e86f..cca95c8158a 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -217,7 +217,7 @@ bool ToolChain::operator == (const ToolChain &tc) const ToolChain *ToolChain::clone() const { - for (ToolChainFactory *f : qAsConst(Internal::g_toolChainFactories)) { + for (ToolChainFactory *f : std::as_const(Internal::g_toolChainFactories)) { if (f->supportedToolChainType() == d->m_typeId) { ToolChain *tc = f->create(); QTC_ASSERT(tc, return nullptr); @@ -616,7 +616,7 @@ void ToolChainFactory::autoDetectionToMap(QVariantMap &data, bool detected) ToolChain *ToolChainFactory::createToolChain(Utils::Id toolChainType) { - for (ToolChainFactory *factory : qAsConst(Internal::g_toolChainFactories)) { + for (ToolChainFactory *factory : std::as_const(Internal::g_toolChainFactories)) { if (factory->m_supportedToolChainType == toolChainType) { if (ToolChain *tc = factory->create()) { tc->d->m_typeId = toolChainType; diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp index 57a8d777339..bdcb7149858 100644 --- a/src/plugins/projectexplorer/toolchainmanager.cpp +++ b/src/plugins/projectexplorer/toolchainmanager.cpp @@ -143,7 +143,7 @@ ToolChain *ToolChainManager::toolChain(const ToolChain::Predicate &predicate) Toolchains ToolChainManager::findToolChains(const Abi &abi) { Toolchains result; - for (ToolChain *tc : qAsConst(d->m_toolChains)) { + for (ToolChain *tc : std::as_const(d->m_toolChains)) { bool isCompatible = Utils::anyOf(tc->supportedAbis(), [abi](const Abi &supportedAbi) { return supportedAbi.isCompatibleWith(abi); }); @@ -198,7 +198,7 @@ bool ToolChainManager::registerToolChain(ToolChain *tc) if (d->m_toolChains.contains(tc)) return true; - for (const ToolChain *current : qAsConst(d->m_toolChains)) { + for (const ToolChain *current : std::as_const(d->m_toolChains)) { if (*tc == *current && !tc->isAutoDetected()) return false; QTC_ASSERT(current->id() != tc->id(), return false); diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index 33a564c8b88..9f8548aedb0 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -175,7 +175,7 @@ public: m_addButton = new QPushButton(ToolChainOptionsPage::tr("Add"), this); auto addMenu = new QMenu; - for (ToolChainFactory *factory : qAsConst(m_factories)) { + for (ToolChainFactory *factory : std::as_const(m_factories)) { QList languages = factory->supportedLanguages(); if (languages.isEmpty()) continue; @@ -187,7 +187,7 @@ public: return ToolChainManager::displayNameOfLanguageId(l1) < ToolChainManager::displayNameOfLanguageId(l2); }); auto subMenu = addMenu->addMenu(factory->displayName()); - for (const Utils::Id &l : qAsConst(languages)) + for (const Utils::Id &l : std::as_const(languages)) subMenu->addAction(createAction(ToolChainManager::displayNameOfLanguageId(l), factory, l)); } } @@ -209,7 +209,7 @@ public: if (!tcItem->toolChain->isSdkProvided()) itemsToRemove << tcItem; }); - for (ToolChainTreeItem * const tcItem : qAsConst(itemsToRemove)) + for (ToolChainTreeItem * const tcItem : std::as_const(itemsToRemove)) markForRemoval(tcItem); }); @@ -410,9 +410,9 @@ void ToolChainOptionsWidget::redetectToolchains() toAdd << tc; } } - for (ToolChainTreeItem * const tcItem : qAsConst(itemsToRemove)) + for (ToolChainTreeItem * const tcItem : std::as_const(itemsToRemove)) markForRemoval(tcItem); - for (ToolChain * const newTc : qAsConst(toAdd)) + for (ToolChain * const newTc : std::as_const(toAdd)) m_toAddList.append(insertToolChain(newTc, true)); qDeleteAll(toDelete); } @@ -432,7 +432,7 @@ void ToolChainOptionsWidget::apply() { // Remove unused tool chains: QList nodes = m_toRemoveList; - for (const ToolChainTreeItem *n : qAsConst(nodes)) + for (const ToolChainTreeItem *n : std::as_const(nodes)) ToolChainManager::deregisterToolChain(n->toolChain); Q_ASSERT(m_toRemoveList.isEmpty()); @@ -456,7 +456,7 @@ void ToolChainOptionsWidget::apply() // Add new (and already updated) tool chains QStringList removedTcs; nodes = m_toAddList; - for (const ToolChainTreeItem *n : qAsConst(nodes)) { + for (const ToolChainTreeItem *n : std::as_const(nodes)) { if (!ToolChainManager::registerToolChain(n->toolChain)) removedTcs << n->toolChain->displayName(); } diff --git a/src/plugins/projectexplorer/userfileaccessor.cpp b/src/plugins/projectexplorer/userfileaccessor.cpp index 86814054895..a82769b1634 100644 --- a/src/plugins/projectexplorer/userfileaccessor.cpp +++ b/src/plugins/projectexplorer/userfileaccessor.cpp @@ -680,8 +680,8 @@ QVariantMap UserFileVersion16Upgrader::upgrade(const QVariantMap &data) NamePolicy policy = oldSteps.size() > 1 ? RenameBuildConfiguration : KeepName; - for (const QVariantMap &oldBuildConfiguration : qAsConst(oldBuildConfigurations)) { - for (const OldStepMaps &oldStep : qAsConst(oldSteps)) { + for (const QVariantMap &oldBuildConfiguration : std::as_const(oldBuildConfigurations)) { + for (const OldStepMaps &oldStep : std::as_const(oldSteps)) { QVariantMap newBuildConfiguration = insertSteps(oldBuildConfiguration, oldStep, policy); if (!newBuildConfiguration.isEmpty()) newBuildConfigurations.append(newBuildConfiguration); diff --git a/src/plugins/projectexplorer/windebuginterface.cpp b/src/plugins/projectexplorer/windebuginterface.cpp index 64850090117..a27d3500959 100644 --- a/src/plugins/projectexplorer/windebuginterface.cpp +++ b/src/plugins/projectexplorer/windebuginterface.cpp @@ -170,7 +170,7 @@ void WinDebugInterface::dispatchDebugOutput() m_readySignalEmitted = false; m_outputMutex.unlock(); - for (const auto &p : qAsConst(output)) + for (const auto &p : std::as_const(output)) emit debugOutput(p.first, p.second); if (hasMoreOutput) emit _q_debugOutputReady(); diff --git a/src/plugins/python/pythonproject.cpp b/src/plugins/python/pythonproject.cpp index 7666100cd4b..70528b0c997 100644 --- a/src/plugins/python/pythonproject.cpp +++ b/src/plugins/python/pythonproject.cpp @@ -227,7 +227,7 @@ void PythonBuildSystem::triggerParsing() QList appTargets; auto newRoot = std::make_unique(projectDirectory()); - for (const QString &f : qAsConst(m_files)) { + for (const QString &f : std::as_const(m_files)) { const QString displayName = baseDir.relativeFilePath(f); const FilePath filePath = FilePath::fromString(f); const FileType fileType = getFileType(filePath); @@ -252,7 +252,7 @@ void PythonBuildSystem::triggerParsing() if (modelManager) { auto projectInfo = modelManager->defaultProjectInfoForProject(project()); - for (const QString &importPath : qAsConst(m_qmlImportPaths)) { + for (const QString &importPath : std::as_const(m_qmlImportPaths)) { const FilePath filePath = FilePath::fromString(importPath); projectInfo.importPaths.maybeInsert(filePath, QmlJS::Dialect::Qml); } diff --git a/src/plugins/python/pythonrunconfiguration.cpp b/src/plugins/python/pythonrunconfiguration.cpp index d3e843cf1d9..7a370f7517e 100644 --- a/src/plugins/python/pythonrunconfiguration.cpp +++ b/src/plugins/python/pythonrunconfiguration.cpp @@ -203,7 +203,7 @@ void PythonRunConfiguration::checkForPySide(const FilePath &python) const PipPackage pySide6Package("PySide6"); const PipPackageInfo info = pySide6Package.info(python); - for (const FilePath &file : qAsConst(info.files)) { + for (const FilePath &file : std::as_const(info.files)) { if (file.fileName() == HostOsInfo::withExecutableSuffix("pyside6-project")) { pySideProjectPath = info.location.resolvePath(file); pySideProjectPath = pySideProjectPath.cleanPath(); diff --git a/src/plugins/python/pythonsettings.cpp b/src/plugins/python/pythonsettings.cpp index db789d07a68..bc9a906e493 100644 --- a/src/plugins/python/pythonsettings.cpp +++ b/src/plugins/python/pythonsettings.cpp @@ -829,7 +829,7 @@ void PythonSettings::initFromSettings(QSettings *settings) m_interpreters << interpreter; } - for (const Interpreter &interpreter : qAsConst(oldSettings)) { + for (const Interpreter &interpreter : std::as_const(oldSettings)) { if (Utils::anyOf(m_interpreters, Utils::equal(&Interpreter::id, interpreter.id))) continue; m_interpreters << interpreter; diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 80c137ca449..5ac88bb4665 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -415,7 +415,7 @@ void QbsBuildStep::buildingDone(const ErrorInfo &error) m_session->disconnect(this); m_session = nullptr; m_lastWasSuccess = !error.hasError(); - for (const ErrorInfoItem &item : qAsConst(error.items)) { + for (const ErrorInfoItem &item : std::as_const(error.items)) { createTaskAndOutput( ProjectExplorer::Task::Error, item.description, @@ -809,7 +809,7 @@ void QbsBuildStepConfigWidget::applyCachedProperties() Constants::QBS_INSTALL_ROOT_KEY}); if (m_qbsStep->m_selectedAbis->isManagedByTarget()) additionalSpecialKeys << Constants::QBS_ARCHITECTURES; - for (const QString &key : qAsConst(additionalSpecialKeys)) { + for (const QString &key : std::as_const(additionalSpecialKeys)) { const auto it = tmp.constFind(key); if (it != tmp.cend()) data.insert(key, it.value()); diff --git a/src/plugins/qbsprojectmanager/qbsprofilemanager.cpp b/src/plugins/qbsprojectmanager/qbsprofilemanager.cpp index ee5cd7fc51e..060c37eac99 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilemanager.cpp +++ b/src/plugins/qbsprojectmanager/qbsprofilemanager.cpp @@ -155,7 +155,7 @@ void QbsProfileManager::addProfileFromKit(const ProjectExplorer::Kit *k) // set up properties: QVariantMap data = m_defaultPropertyProvider->properties(k, QVariantMap()); - for (PropertyProvider *provider : qAsConst(g_propertyProviders)) { + for (PropertyProvider *provider : std::as_const(g_propertyProviders)) { if (provider->canHandle(k)) data = provider->properties(k, data); } diff --git a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp index af8e7b15867..4d0fedf39b0 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp +++ b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp @@ -178,7 +178,7 @@ void QbsProfilesSettingsWidget::refreshKitsList() QList validKits = KitManager::kits(); Utils::erase(validKits, [](const Kit *k) { return !k->isValid(); }); const bool hasKits = !validKits.isEmpty(); - for (const Kit * const kit : qAsConst(validKits)) { + for (const Kit * const kit : std::as_const(validKits)) { if (kit->id() == currentId) newCurrentIndex = m_kitsComboBox->count(); m_kitsComboBox->addItem(kit->displayName(), kit->id().toSetting()); diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 60fe82b56e5..1249025387a 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -156,7 +156,7 @@ QbsBuildSystem::QbsBuildSystem(QbsBuildConfiguration *bc) { connect(m_session, &QbsSession::newGeneratedFilesForSources, this, [this](const QHash &generatedFiles) { - for (ExtraCompiler * const ec : qAsConst(m_extraCompilers)) + for (ExtraCompiler * const ec : std::as_const(m_extraCompilers)) ec->deleteLater(); m_extraCompilers.clear(); for (auto it = m_sourcesForGeneratedFiles.cbegin(); @@ -906,17 +906,17 @@ static RawProjectParts generateProjectParts( ProjectExplorer::HeaderPaths grpHeaderPaths; QStringList list = arrayToStringList(props.value("cpp.includePaths")); list.removeDuplicates(); - for (const QString &p : qAsConst(list)) + for (const QString &p : std::as_const(list)) grpHeaderPaths += HeaderPath::makeUser(FilePath::fromUserInput(p)); list = arrayToStringList(props.value("cpp.distributionIncludePaths")) + arrayToStringList(props.value("cpp.systemIncludePaths")); list.removeDuplicates(); - for (const QString &p : qAsConst(list)) + for (const QString &p : std::as_const(list)) grpHeaderPaths += HeaderPath::makeSystem(FilePath::fromUserInput(p)); list = arrayToStringList(props.value("cpp.frameworkPaths")); list.append(arrayToStringList(props.value("cpp.systemFrameworkPaths"))); list.removeDuplicates(); - for (const QString &p : qAsConst(list)) + for (const QString &p : std::as_const(list)) grpHeaderPaths += HeaderPath::makeFramework(FilePath::fromUserInput(p)); rpp.setHeaderPaths(grpHeaderPaths); rpp.setDisplayName(groupName); diff --git a/src/plugins/qmakeprojectmanager/qmakemakestep.cpp b/src/plugins/qmakeprojectmanager/qmakemakestep.cpp index c96d877c6ce..4b086ffb5f8 100644 --- a/src/plugins/qmakeprojectmanager/qmakemakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakemakestep.cpp @@ -192,7 +192,7 @@ void QmakeMakeStep::setupOutputFormatter(OutputFormatter *formatter) additionalParsers << new QMakeParser; if (xcodeBuildParser) { - for (OutputLineParser * const p : qAsConst(additionalParsers)) + for (OutputLineParser * const p : std::as_const(additionalParsers)) p->setRedirectionDetector(xcodeBuildParser); } formatter->addLineParsers(additionalParsers); diff --git a/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp b/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp index 0f77555f689..c790251e675 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp @@ -206,7 +206,7 @@ static void createTree(QmakeBuildSystem *buildSystem, auto genFolder = std::make_unique(baseDir); genFolder->setDisplayName(Tr::tr("Generated Files")); genFolder->setIsGenerated(true); - for (const FilePath &fp : qAsConst(generatedFiles)) { + for (const FilePath &fp : std::as_const(generatedFiles)) { auto fileNode = std::make_unique(fp, FileNode::fileTypeForFileName(fp)); fileNode->setIsGenerated(true); genFolder->addNestedNode(std::move(fileNode)); diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index e8af0bef33e..100016cb021 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -172,7 +172,7 @@ QmakePriFile *QmakePriFile::findPriFile(const FilePath &fileName) { if (fileName == filePath()) return this; - for (QmakePriFile *n : qAsConst(m_children)) { + for (QmakePriFile *n : std::as_const(m_children)) { if (QmakePriFile *result = n->findPriFile(fileName)) return result; } @@ -183,7 +183,7 @@ const QmakePriFile *QmakePriFile::findPriFile(const FilePath &fileName) const { if (fileName == filePath()) return this; - for (const QmakePriFile *n : qAsConst(m_children)) { + for (const QmakePriFile *n : std::as_const(m_children)) { if (const QmakePriFile *result = n->findPriFile(fileName)) return result; } @@ -205,7 +205,7 @@ const QSet QmakePriFile::collectFiles(const FileType &type) const { QSet allFiles = transform(files(type), [](const SourceFile &sf) { return sf.first; }); - for (const QmakePriFile * const priFile : qAsConst(m_children)) { + for (const QmakePriFile * const priFile : std::as_const(m_children)) { if (!dynamic_cast(priFile)) allFiles.unite(priFile->collectFiles(type)); } @@ -547,7 +547,7 @@ bool QmakePriFile::addFiles(const FilePaths &filePaths, FilePaths *notAdded) } FilePaths uniqueQrcFiles; - for (const FilePath &file : qAsConst(qrcFiles)) { + for (const FilePath &file : std::as_const(qrcFiles)) { if (!m_recursiveEnumerateFiles.contains(file)) uniqueQrcFiles.append(file); } @@ -1208,7 +1208,7 @@ QString QmakeProFile::displayName() const QList QmakeProFile::allProFiles() { QList result = { this }; - for (QmakePriFile *c : qAsConst(m_children)) { + for (QmakePriFile *c : std::as_const(m_children)) { auto proC = dynamic_cast(c); if (proC) result.append(proC->allProFiles()); @@ -1588,7 +1588,7 @@ QmakeEvalResultPtr QmakeProFile::evaluate(const QmakeEvalInput &input) toCompare.pop_front(); // Loop prevention: Make sure that exact same node is not in our parent chain - for (QmakeIncludedPriFile *priFile : qAsConst(tree->children)) { + for (QmakeIncludedPriFile *priFile : std::as_const(tree->children)) { bool loop = input.parentFilePaths.contains(priFile->name); for (const QmakePriFile *n = pn; n && !loop; n = n->parent()) { if (n->filePath() == priFile->name) @@ -1688,16 +1688,16 @@ void QmakeProFile::applyEvaluate(const QmakeEvalResultPtr &result) // FilePath buildDirectory = m_buildSystem->buildDir(m_filePath); makeEmpty(); - for (QmakePriFile * const toAdd : qAsConst(result->directChildren)) + for (QmakePriFile * const toAdd : std::as_const(result->directChildren)) addChild(toAdd); result->directChildren.clear(); - for (const auto &priFiles : qAsConst(result->priFiles)) { + for (const auto &priFiles : std::as_const(result->priFiles)) { priFiles.first->finishInitialization(m_buildSystem, this); priFiles.first->update(priFiles.second); } - for (QmakeProFile * const proFile : qAsConst(result->proFiles)) { + for (QmakeProFile * const proFile : std::as_const(result->proFiles)) { proFile->finishInitialization(m_buildSystem, proFile); proFile->asyncUpdate(); } @@ -1998,7 +1998,7 @@ InstallsList QmakeProFile::installsList(const QtSupport::ProFileReader *reader, } QString itemPath = itemPaths.last(); - for (const auto &prefixValuePair : qAsConst(installPrefixValues)) { + for (const auto &prefixValuePair : std::as_const(installPrefixValues)) { if (prefixValuePair.first == prefixValuePair.second || !itemPath.startsWith(prefixValuePair.first)) { continue; diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index ac886ee1797..f2fc741156c 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -703,7 +703,7 @@ void QmakeBuildSystem::asyncUpdate() }; if (m_asyncUpdateState != AsyncFullUpdatePending) { QSet projectFilePaths; - for (QmakeProFile * const file : qAsConst(m_partialEvaluate)) { + for (QmakeProFile * const file : std::as_const(m_partialEvaluate)) { QVector priFiles = file->children(); for (int i = 0; i < priFiles.count(); ++i) { const QmakePriFile * const priFile = priFiles.at(i); diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp index 2eda6a97a27..f29e0abb64b 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp @@ -144,7 +144,7 @@ QString QMakeStep::allArguments(const QtVersion *v, ArgumentFlags flags) const QString args = ProcessArgs::joinArgs(arguments); // User arguments ProcessArgs::addArgs(&args, userArguments()); - for (QString arg : qAsConst(m_extraArgs)) + for (QString arg : std::as_const(m_extraArgs)) ProcessArgs::addArgs(&args, arg); return (flags & ArgumentFlag::Expand) ? bc->macroExpander()->expand(args) : args; } @@ -248,7 +248,7 @@ bool QMakeStep::init() if (!tasks.isEmpty()) { bool canContinue = true; - for (const Task &t : qAsConst(tasks)) { + for (const Task &t : std::as_const(tasks)) { emit addTask(t); if (t.type == Task::Error) canContinue = false; @@ -635,7 +635,7 @@ void QMakeStep::abisChanged() } } QStringList archs; - for (const QString &selectedAbi : qAsConst(m_selectedAbis)) { + for (const QString &selectedAbi : std::as_const(m_selectedAbis)) { const auto abi = Abi::abiFromTargetTriplet(selectedAbi); if (abi.architecture() == Abi::X86Architecture) archs << "x86_64"; diff --git a/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp b/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp index 9201f16d639..552de545502 100644 --- a/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp +++ b/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp @@ -129,7 +129,7 @@ void AssetExporter::exportQml(const Utils::FilePaths &qmlFiles, const Utils::Fil void AssetExporter::beginExport() { - for (const Utils::FilePath &p : qAsConst(m_exportFiles)) { + for (const Utils::FilePath &p : std::as_const(m_exportFiles)) { if (m_cancelled) break; preprocessQmlFile(p); diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp index 4d5c0b2cd2c..5dbb7102f4d 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp @@ -338,7 +338,7 @@ void AssetsLibraryWidget::addResources(const QStringList &files) QStringList filters { tr("All Files (%1)").arg("*.*") }; QString filterTemplate = "%1 (%2)"; - for (const QString &key : qAsConst(sortedKeys)) { + for (const QString &key : std::as_const(sortedKeys)) { const QStringList values = map.values(key); if (values.contains("*.png")) { // Avoid long filter for images by splitting const QHash imageFormats = allImageFormats(); @@ -373,7 +373,7 @@ void AssetsLibraryWidget::addResources(const QStringList &files) QMultiMap categoryFileNames; // filenames grouped by category - for (const QString &fileName : qAsConst(fileNames)) { + for (const QString &fileName : std::as_const(fileNames)) { const QString suffix = "*." + QFileInfo(fileName).suffix().toLower(); const QString category = filterToCategory.value(suffix); categoryFileNames.insert(category, fileName); diff --git a/src/plugins/qmldesigner/components/bindingeditor/actioneditordialog.cpp b/src/plugins/qmldesigner/components/bindingeditor/actioneditordialog.cpp index 38026570bb8..227b82ecc73 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/actioneditordialog.cpp +++ b/src/plugins/qmldesigner/components/bindingeditor/actioneditordialog.cpp @@ -433,7 +433,7 @@ void ActionEditorDialog::fillAndSetTargetItem(const QString &value, bool useDefa { if (m_comboBoxType->currentIndex() == ConnectionType::Action) { m_actionTargetItem->clear(); - for (const auto &connection : qAsConst(m_connections)) { + for (const auto &connection : std::as_const(m_connections)) { if (!connection.methods.isEmpty()) m_actionTargetItem->addItem(connection.item); } @@ -448,7 +448,7 @@ void ActionEditorDialog::fillAndSetTargetItem(const QString &value, bool useDefa } } else { // ConnectionType::Assignment m_assignmentTargetItem->clear(); - for (const auto &connection : qAsConst(m_connections)) { + for (const auto &connection : std::as_const(m_connections)) { if (!connection.properties.isEmpty() && connection.hasWriteableProperties()) m_assignmentTargetItem->addItem(connection.item); } @@ -493,7 +493,7 @@ void ActionEditorDialog::fillAndSetTargetProperty(const QString &value, bool use if (idx == -1) { insertAndSetUndefined(m_assignmentTargetProperty); } else { - for (const auto &property : qAsConst(m_connections[idx].properties)) { + for (const auto &property : std::as_const(m_connections[idx].properties)) { if (property.isWriteable) m_assignmentTargetProperty->addItem(property.name, property.type); } @@ -516,7 +516,7 @@ void ActionEditorDialog::fillAndSetSourceItem(const QString &value, bool useDefa const TypeName targetPropertyType = m_assignmentTargetProperty->currentData().value(); if (!targetPropertyType.isEmpty()) { - for (const ConnectionOption &connection : qAsConst(m_connections)) { + for (const ConnectionOption &connection : std::as_const(m_connections)) { if (!connection.containsType(targetPropertyType)) continue; @@ -524,7 +524,7 @@ void ActionEditorDialog::fillAndSetSourceItem(const QString &value, bool useDefa } // Add Constants - for (const SingletonOption &singleton : qAsConst(m_singletons)) { + for (const SingletonOption &singleton : std::as_const(m_singletons)) { if (!singleton.containsType(targetPropertyType)) continue; @@ -560,7 +560,7 @@ void ActionEditorDialog::fillAndSetSourceProperty(const QString &value, else insertAndSetUndefined(m_assignmentSourceProperty); } else if (targetProperty == "state") { - for (const auto &state : qAsConst(m_states)) + for (const auto &state : std::as_const(m_states)) m_assignmentSourceProperty->addItem(state, specificItem); if (m_assignmentSourceProperty->findText(value) != -1) @@ -589,7 +589,7 @@ void ActionEditorDialog::fillAndSetSourceProperty(const QString &value, m_assignmentSourceProperty->addItem("false", specificItem); specificsEnd = 2; } else if (targetProperty == "state") { - for (const auto &state : qAsConst(m_states)) + for (const auto &state : std::as_const(m_states)) m_assignmentSourceProperty->addItem(state, specificItem); specificsEnd = m_states.count(); @@ -599,14 +599,14 @@ void ActionEditorDialog::fillAndSetSourceProperty(const QString &value, m_assignmentSourceProperty->insertSeparator(specificsEnd); if (sourceItemType == singletonItem) { - for (const auto &property : qAsConst(m_singletons[idx].properties)) { + for (const auto &property : std::as_const(m_singletons[idx].properties)) { if (targetPropertyType.isEmpty() // TODO isEmpty correct?! || property.type == targetPropertyType || (isNumeric(property.type) && isNumeric(targetPropertyType))) m_assignmentSourceProperty->addItem(property.name, property.type); } } else { - for (const auto &property : qAsConst(m_connections[idx].properties)) { + for (const auto &property : std::as_const(m_connections[idx].properties)) { if (targetPropertyType.isEmpty() // TODO isEmpty correct?! || property.type == targetPropertyType || (isNumeric(property.type) && isNumeric(targetPropertyType))) diff --git a/src/plugins/qmldesigner/components/bindingeditor/bindingeditordialog.cpp b/src/plugins/qmldesigner/components/bindingeditor/bindingeditordialog.cpp index 92139c6816f..3aaaacc7d29 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/bindingeditordialog.cpp +++ b/src/plugins/qmldesigner/components/bindingeditor/bindingeditordialog.cpp @@ -113,7 +113,7 @@ void BindingEditorDialog::setupComboBoxes() m_comboBoxItem->clear(); m_comboBoxProperty->clear(); - for (const auto &bind : qAsConst(m_bindings)) + for (const auto &bind : std::as_const(m_bindings)) m_comboBoxItem->addItem(bind.item); } diff --git a/src/plugins/qmldesigner/components/componentcore/addsignalhandlerdialog.cpp b/src/plugins/qmldesigner/components/componentcore/addsignalhandlerdialog.cpp index df391154030..1fdfcc0b6e4 100644 --- a/src/plugins/qmldesigner/components/componentcore/addsignalhandlerdialog.cpp +++ b/src/plugins/qmldesigner/components/componentcore/addsignalhandlerdialog.cpp @@ -51,7 +51,7 @@ bool checkForPropertyChanges(const QString &signal) void AddSignalHandlerDialog::updateComboBox() { m_ui->comboBox->clear(); - for (const QString &signal : qAsConst(m_signals)) { + for (const QString &signal : std::as_const(m_signals)) { if (m_ui->all->isChecked()) { m_ui->comboBox->addItem(signal); } else if (m_ui->properties->isChecked()) { diff --git a/src/plugins/qmldesigner/components/componentcore/changestyleaction.cpp b/src/plugins/qmldesigner/components/componentcore/changestyleaction.cpp index e57aa51e7f8..fe55ea76c1d 100644 --- a/src/plugins/qmldesigner/components/componentcore/changestyleaction.cpp +++ b/src/plugins/qmldesigner/components/componentcore/changestyleaction.cpp @@ -71,7 +71,7 @@ void ChangeStyleWidgetAction::changeStyle(const QString &style) int contains = -1; - for (const auto &item : qAsConst(items)) { + for (const auto &item : std::as_const(items)) { if (item.displayName == style) { contains = items.indexOf(item); break; @@ -106,7 +106,7 @@ QWidget *ChangeStyleWidgetAction::createWidget(QWidget *parent) auto comboBox = new QComboBox(parent); comboBox->setToolTip(tr(enabledTooltip)); - for (const auto &item : qAsConst(items)) + for (const auto &item : std::as_const(items)) comboBox->addItem(item.displayName); comboBox->setEditable(true); diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 8245a2e94d4..2377a8d0e0c 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -75,7 +75,7 @@ DesignerActionToolBar *DesignerActionManager::createToolBar(QWidget *parent) con return l->priority() > r->priority(); }); - for (auto *categoryAction : qAsConst(categories)) { + for (auto *categoryAction : std::as_const(categories)) { QList actions = Utils::filtered(designerActions(), [categoryAction](ActionInterface *action) { return action->category() == categoryAction->menuId(); }); @@ -86,7 +86,7 @@ DesignerActionToolBar *DesignerActionManager::createToolBar(QWidget *parent) con bool addSeparator = false; - for (auto *action : qAsConst(actions)) { + for (auto *action : std::as_const(actions)) { if ((action->type() == ActionInterface::Action || action->type() == ActionInterface::ToolBarAction) && action->action()) { toolBar->registerAction(action); @@ -151,7 +151,7 @@ QGraphicsWidget *DesignerActionManager::createFormEditorToolBar(QGraphicsItem *p layout->setSpacing(0); toolbar->setLayout(layout); - for (ActionInterface *action : qAsConst(actions)) { + for (ActionInterface *action : std::as_const(actions)) { auto button = new FormEditorToolButton(action->action(), toolbar); layout->addItem(button); } @@ -203,7 +203,7 @@ void DesignerActionManager::registerModelNodePreviewHandler(const ModelNodePrevi bool DesignerActionManager::hasModelNodePreviewHandler(const ModelNode &node) const { const bool isComponent = node.isComponent(); - for (const auto &handler : qAsConst(m_modelNodePreviewImageHandlers)) { + for (const auto &handler : std::as_const(m_modelNodePreviewImageHandlers)) { if ((isComponent || !handler.componentOnly)) { if (auto base = node.model()->metaInfo(handler.type); node.metaInfo().isBasedOn(base)) return true; @@ -217,7 +217,7 @@ ModelNodePreviewImageOperation DesignerActionManager::modelNodePreviewOperation( ModelNodePreviewImageOperation op = nullptr; int prio = -1; const bool isComponent = node.isComponent(); - for (const auto &handler : qAsConst(m_modelNodePreviewImageHandlers)) { + for (const auto &handler : std::as_const(m_modelNodePreviewImageHandlers)) { if ((isComponent || !handler.componentOnly) && handler.priority > prio) { if (auto base = node.model()->metaInfo(handler.type); node.metaInfo().isBasedOn(base)) { op = handler.operation; @@ -1922,7 +1922,7 @@ void DesignerActionManager::addCreatorCommand(Core::Command *command, const QByt QList > DesignerActionManager::actionsForTargetView(const ActionInterface::TargetView &target) { QList > out; - for (auto interface : qAsConst(m_designerActions)) + for (auto interface : std::as_const(m_designerActions)) if (interface->targetView() == target) out << interface; diff --git a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp index 5d2b8570182..5941b92746d 100644 --- a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp +++ b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp @@ -248,7 +248,7 @@ void LayoutInGridLayout::collectItemNodes() void LayoutInGridLayout::collectOffsets() { //We collect all different x and y offsets that define the cells - for (const QmlItemNode &qmlItemNode : qAsConst(m_qmlItemNodes)) { + for (const QmlItemNode &qmlItemNode : std::as_const(m_qmlItemNodes)) { int x = qRound((qmlItemNode.instancePosition().x())); m_xTopOffsets.append(x); x = qRound((qmlItemNode.instancePosition().x() + lowerBound(qmlItemNode.instanceBoundingRect().width()))); @@ -284,7 +284,7 @@ void LayoutInGridLayout::calculateGridOffsets() int heightTolerance = defaultHeightTolerance; //The tolerance cannot be bigger then the size of an item - for (const auto &qmlItemNode : qAsConst(m_qmlItemNodes)) { + for (const auto &qmlItemNode : std::as_const(m_qmlItemNodes)) { widthTolerance = qMin(qmlItemNode.instanceSize().toSize().width() - 1, widthTolerance); heightTolerance = qMin(qmlItemNode.instanceSize().toSize().height() - 1, heightTolerance); } @@ -321,7 +321,7 @@ void LayoutInGridLayout::removeEmtpyRowsAndColumns() m_columns = QVector(columnCount()); m_columns.fill(false); - for (const auto &qmlItemNode : qAsConst(m_qmlItemNodes)) { + for (const auto &qmlItemNode : std::as_const(m_qmlItemNodes)) { int xCell = getCell(m_xTopOffsets, qmlItemNode.instancePosition().x()); int yCell = getCell(m_yTopOffsets, qmlItemNode.instancePosition().y()); @@ -353,7 +353,7 @@ void LayoutInGridLayout::initializeCells() void LayoutInGridLayout::markUsedCells() { //We mark cells which are covered by items with true - for (const auto &qmlItemNode : qAsConst(m_qmlItemNodes)) { + for (const auto &qmlItemNode : std::as_const(m_qmlItemNodes)) { int xCell = getCell(m_xTopOffsets, qmlItemNode.instancePosition().x()); int yCell = getCell(m_yTopOffsets, qmlItemNode.instancePosition().y()); @@ -372,7 +372,7 @@ void LayoutInGridLayout::fillEmptyCells() //Cells which are not covered by items and are not marked as true have to be filled with a "spacer" item m_layoutedNodes = m_selectionContext.selectedModelNodes(); - for (const auto &itemNode : qAsConst(m_qmlItemNodes)) { + for (const auto &itemNode : std::as_const(m_qmlItemNodes)) { m_layoutedNodes.append(itemNode); } @@ -414,7 +414,7 @@ void LayoutInGridLayout::setSpanning(const ModelNode &layoutNode) layoutNode.variantProperty("columns").setValue(columnCount()); layoutNode.variantProperty("rows").setValue(rowCount()); - for (const ModelNode &modelNode : qAsConst(m_layoutedNodes)) { + for (const ModelNode &modelNode : std::as_const(m_layoutedNodes)) { QmlItemNode qmlItemNode(modelNode); int xCell = getCell(m_xTopOffsets, qmlItemNode.instancePosition().x()); int yCell = getCell(m_yTopOffsets, qmlItemNode.instancePosition().y()); @@ -444,7 +444,7 @@ void LayoutInGridLayout::setSpanning(const ModelNode &layoutNode) void LayoutInGridLayout::removeSpacersBySpanning(QList &nodes) { - for (const ModelNode &node : qAsConst(m_spacerNodes)) { + for (const ModelNode &node : std::as_const(m_spacerNodes)) { if (int index = nodes.indexOf(node)) { ModelNode before = nodes.at(index -1); if (m_spacerNodes.contains(before)) { diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp index 6d8065595b1..1b3fbac3f47 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp @@ -45,7 +45,7 @@ void populateMenu(QSet &actionInterfaces, return l->priority() > r->priority(); }); - for (ActionInterface* actionInterface : qAsConst(matchingFactoriesList)) { + for (ActionInterface* actionInterface : std::as_const(matchingFactoriesList)) { if (actionInterface->type() == ActionInterface::ContextMenu) { actionInterface->currentContextChanged(selectionContext); QMenu *newMenu = actionInterface->action()->menu(); diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 861397227e8..31c3303a54f 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -1052,10 +1052,10 @@ AddFilesResult addFilesToProject(const QStringList &fileNames, const QString &de } // Defer actual file operations after we have dealt with possible popup dialogs to avoid // unnecessarily refreshing file models multiple times during the operation - for (const auto &file : qAsConst(removeList)) + for (const auto &file : std::as_const(removeList)) QFile::remove(file); - for (const auto &filePair : qAsConst(copyList)) { + for (const auto &filePair : std::as_const(copyList)) { const bool success = QFile::copy(filePair.first, filePair.second); if (!success) return AddFilesResult::Failed; diff --git a/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp index 8951ffb6b82..0a5741e54cc 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/dynamicpropertiesmodel.cpp @@ -638,7 +638,7 @@ void DynamicPropertiesModel::addModelNode(const ModelNode &modelNode) return a.name() < b.name(); }); - for (const AbstractProperty &property : qAsConst(dynamicProperties)) { + for (const AbstractProperty &property : std::as_const(dynamicProperties)) { if (property.isBindingProperty()) addBindingProperty(property.toBindingProperty()); else if (property.isVariantProperty()) diff --git a/src/plugins/qmldesigner/components/curveeditor/animationcurve.cpp b/src/plugins/qmldesigner/components/curveeditor/animationcurve.cpp index 276c73d1dd3..b6277b5f859 100644 --- a/src/plugins/qmldesigner/components/curveeditor/animationcurve.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/animationcurve.cpp @@ -363,7 +363,7 @@ void AnimationCurve::analyze() m_maxY = e.y(); } - for (auto &frame : qAsConst(m_frames)) { + for (auto &frame : std::as_const(m_frames)) { if (frame.position().y() < m_minY) m_minY = frame.position().y(); diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp index bbdaa47dc31..c6c66c03440 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/curveitem.cpp @@ -114,7 +114,7 @@ void CurveItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidg void CurveItem::lockedCallback() { - for (auto frame : qAsConst(m_keyframes)) + for (auto frame : std::as_const(m_keyframes)) frame->setLocked(locked()); setHandleVisibility(!locked()); @@ -355,7 +355,7 @@ void CurveItem::setDirty(bool dirty) void CurveItem::setHandleVisibility(bool visible) { - for (auto *frame : qAsConst(m_keyframes)) + for (auto *frame : std::as_const(m_keyframes)) frame->setHandleVisibility(visible); } @@ -390,7 +390,7 @@ QRectF CurveItem::setComponentTransform(const QTransform &transform) { prepareGeometryChange(); m_transform = transform; - for (auto *frame : qAsConst(m_keyframes)) + for (auto *frame : std::as_const(m_keyframes)) frame->setComponentTransform(transform); return boundingRect(); @@ -400,7 +400,7 @@ void CurveItem::setStyle(const CurveEditorStyle &style) { m_style = style.curveStyle; - for (auto *frame : qAsConst(m_keyframes)) + for (auto *frame : std::as_const(m_keyframes)) frame->setStyle(style); } @@ -441,7 +441,7 @@ void CurveItem::toggleUnified() if (m_keyframes.empty()) return; - for (auto *frame : qAsConst(m_keyframes)) { + for (auto *frame : std::as_const(m_keyframes)) { if (frame->selected()) frame->toggleUnified(); } @@ -489,7 +489,7 @@ void CurveItem::deleteSelectedKeyframes() void CurveItem::remapValue(double min, double max) { - for (auto *frameItem : qAsConst(m_keyframes)) { + for (auto *frameItem : std::as_const(m_keyframes)) { frameItem->remapValue(min, max); } } diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp index 28c0f62f3aa..07a7786bb8b 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsscene.cpp @@ -200,21 +200,21 @@ void GraphicsScene::reset() void GraphicsScene::deleteSelectedKeyframes() { m_dirty = true; - for (auto *curve : qAsConst(m_curves)) + for (auto *curve : std::as_const(m_curves)) curve->deleteSelectedKeyframes(); } void GraphicsScene::insertKeyframe(double time, bool all) { if (!all) { - for (auto *curve : qAsConst(m_curves)) { + for (auto *curve : std::as_const(m_curves)) { if (curve->isUnderMouse()) curve->insertKeyframeByTime(std::round(time)); } return; } - for (auto *curve : qAsConst(m_curves)) + for (auto *curve : std::as_const(m_curves)) curve->insertKeyframeByTime(std::round(time)); } @@ -226,7 +226,7 @@ void GraphicsScene::doNotMoveItems(bool val) void GraphicsScene::removeCurveItem(unsigned int id) { CurveItem *tmp = nullptr; - for (auto *curve : qAsConst(m_curves)) { + for (auto *curve : std::as_const(m_curves)) { if (curve->id() == id) { removeItem(curve); tmp = curve; @@ -244,7 +244,7 @@ void GraphicsScene::removeCurveItem(unsigned int id) void GraphicsScene::addCurveItem(CurveItem *item) { - for (auto *curve : qAsConst(m_curves)) { + for (auto *curve : std::as_const(m_curves)) { if (curve->id() == item->id()) { delete item; return; @@ -285,7 +285,7 @@ void GraphicsScene::setComponentTransform(const QTransform &transform) { QRectF bounds; - for (auto *curve : qAsConst(m_curves)) + for (auto *curve : std::as_const(m_curves)) bounds = bounds.united(curve->setComponentTransform(transform)); if (bounds.isNull()) { @@ -299,7 +299,7 @@ void GraphicsScene::setComponentTransform(const QTransform &transform) void GraphicsScene::keyframeMoved(KeyframeItem *movedItem, const QPointF &direction) { - for (auto *curve : qAsConst(m_curves)) { + for (auto *curve : std::as_const(m_curves)) { for (auto *keyframe : curve->keyframes()) { if (keyframe != movedItem && keyframe->selected()) keyframe->moveKeyframe(direction); @@ -309,7 +309,7 @@ void GraphicsScene::keyframeMoved(KeyframeItem *movedItem, const QPointF &direct void GraphicsScene::handleUnderMouse(HandleItem *handle) { - for (auto *curve : qAsConst(m_curves)) { + for (auto *curve : std::as_const(m_curves)) { for (auto *keyframe : curve->keyframes()) { if (keyframe->selected()) keyframe->setActivated(handle->isUnderMouse(), handle->slot()); @@ -334,7 +334,7 @@ void GraphicsScene::handleMoved(KeyframeItem *frame, } }; - for (auto *curve : qAsConst(m_curves)) { + for (auto *curve : std::as_const(m_curves)) { for (auto *keyframe : curve->keyframes()) { if (keyframe == frame) moveUnified(keyframe); @@ -355,7 +355,7 @@ void GraphicsScene::setPinned(uint id, bool pinned) std::vector GraphicsScene::takePinnedItems() { std::vector out; - for (auto *curve : qAsConst(m_curves)) { + for (auto *curve : std::as_const(m_curves)) { if (curve->pinned()) out.push_back(curve); } @@ -376,7 +376,7 @@ void GraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) QPointF mouse = mouseEvent->scenePos(); bool hasHandle = false; - for (auto *curve : qAsConst(m_curves)) { + for (auto *curve : std::as_const(m_curves)) { for (auto *handle : curve->handles()) { bool intersects = handle->contains(mouse); handle->setIsUnderMouse(intersects); @@ -386,10 +386,10 @@ void GraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) } if (hasHandle) { - for (auto *curve : qAsConst(m_curves)) + for (auto *curve : std::as_const(m_curves)) curve->setIsUnderMouse(false); } else { - for (auto *curve : qAsConst(m_curves)) + for (auto *curve : std::as_const(m_curves)) curve->setIsUnderMouse(curve->contains(mouseEvent->scenePos())); } } @@ -398,7 +398,7 @@ void GraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) { QGraphicsScene::mouseReleaseEvent(mouseEvent); - for (auto *curve : qAsConst(m_curves)) { + for (auto *curve : std::as_const(m_curves)) { // CurveItems might become invalid after a keyframe-drag operation. curve->restore(); if (curve->isDirty()) { diff --git a/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp b/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp index d920ae34c90..2c1d7ebce14 100644 --- a/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp @@ -26,7 +26,7 @@ ContentNotEditableIndicator::~ContentNotEditableIndicator() void ContentNotEditableIndicator::clear() { - for (const EntryPair &entryPair : qAsConst(m_entryList)) { + for (const EntryPair &entryPair : std::as_const(m_entryList)) { delete entryPair.second; entryPair.first->blurContent(false); } @@ -52,8 +52,8 @@ void ContentNotEditableIndicator::updateItems(const QList &ite for (FormEditorItem *formEditorItem : itemList) affectedFormEditorItemItems.unite(Utils::toSet(formEditorItem->offspringFormEditorItems())); - for (const EntryPair &entryPair : qAsConst(m_entryList)) { - for (FormEditorItem *formEditorItem : qAsConst(affectedFormEditorItemItems)) { + for (const EntryPair &entryPair : std::as_const(m_entryList)) { + for (FormEditorItem *formEditorItem : std::as_const(affectedFormEditorItemItems)) { if (formEditorItem == entryPair.first) { QRectF boundingRectangleInSceneSpace = formEditorItem->qmlItemNode().instanceSceneTransform().mapRect( diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp index b8721ec14ed..7377cbe6c1a 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp @@ -395,7 +395,7 @@ void DragTool::commitTransaction() void DragTool::handleView3dDrop() { // If a View3D is dropped, we need to assign material to the included model - for (const QmlItemNode &dragNode : qAsConst(m_dragNodes)) { + for (const QmlItemNode &dragNode : std::as_const(m_dragNodes)) { if (dragNode.modelNode().metaInfo().isQtQuick3DView3D()) { auto model = dragNode.model(); const QList models = dragNode.modelNode().subModelNodesOfType( diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 225751dc71d..03138609565 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -551,7 +551,7 @@ void FormEditorView::changeToCustomTool() const ModelNode selectedModelNode = selectedModelNodes().constFirst(); - for (const auto &customTool : qAsConst(m_customTools)) { + for (const auto &customTool : std::as_const(m_customTools)) { if (customTool->wantHandleItem(selectedModelNode) > handlingRank) { handlingRank = customTool->wantHandleItem(selectedModelNode); selectedCustomTool = customTool.get(); diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp index d8ed860b196..b19bc1b7641 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp @@ -89,7 +89,7 @@ void MoveManipulator::synchronizeInstanceParent(const QList &it bool MoveManipulator::itemsCanReparented() const { - for (FormEditorItem* item : qAsConst(m_itemList)) { + for (FormEditorItem* item : std::as_const(m_itemList)) { if (item && item->qmlItemNode().isValid() && !item->qmlItemNode().instanceCanReparent()) @@ -101,7 +101,7 @@ bool MoveManipulator::itemsCanReparented() const void MoveManipulator::setDirectUpdateInNodeInstances(bool directUpdate) { - for (FormEditorItem* item : qAsConst(m_itemList)) { + for (FormEditorItem* item : std::as_const(m_itemList)) { if (item && item->qmlItemNode().isValid()) item->qmlItemNode().nodeInstance().setDirectUpdate(directUpdate); } @@ -114,7 +114,7 @@ void MoveManipulator::begin(const QPointF &beginPoint) m_snapper.updateSnappingLines(m_itemList); - for (FormEditorItem* item : qAsConst(m_itemList)) { + for (FormEditorItem* item : std::as_const(m_itemList)) { if (item && item->qmlItemNode().isValid()) { QTransform fromItemToSceneTransform = item->qmlItemNode().instanceSceneTransform(); m_beginItemRectInSceneSpaceHash.insert(item, fromItemToSceneTransform.mapRect(item->qmlItemNode().instanceBoundingRect())); @@ -122,14 +122,14 @@ void MoveManipulator::begin(const QPointF &beginPoint) } QTransform fromContentItemToSceneTransform = m_snapper.containerFormEditorItem()->qmlItemNode().instanceSceneContentItemTransform(); - for (FormEditorItem* item : qAsConst(m_itemList)) { + for (FormEditorItem* item : std::as_const(m_itemList)) { if (item && item->qmlItemNode().isValid()) { QPointF positionInScenesSpace = fromContentItemToSceneTransform.map(item->instancePosition()); m_beginPositionInSceneSpaceHash.insert(item, positionInScenesSpace); } } - for (FormEditorItem* item : qAsConst(m_itemList)) { + for (FormEditorItem* item : std::as_const(m_itemList)) { if (item && item->qmlItemNode().isValid()) { QmlAnchors anchors(item->qmlItemNode().anchors()); m_beginTopMarginHash.insert(item, anchors.instanceMargin(AnchorLineTop)); @@ -256,7 +256,7 @@ void MoveManipulator::update(const QPointF& updatePoint, Snapper::Snapping useSn generateSnappingLines(tanslatedBoundingRects(m_beginItemRectInSceneSpaceHash, offsetVector, fromSceneToItemTransform)); } - for (FormEditorItem* item : qAsConst(m_itemList)) { + for (FormEditorItem* item : std::as_const(m_itemList)) { QPointF positionInContainerSpace(fromSceneToContentItemTransform.map(m_beginPositionInSceneSpaceHash.value(item)) + offsetVector); if (!item || !item->qmlItemNode().isValid()) @@ -341,7 +341,7 @@ void MoveManipulator::reparentTo(FormEditorItem *newParent, ReparentFlag flag) else parentProperty = parentItemNode.nodeAbstractProperty("data"); - for (FormEditorItem* item : qAsConst(m_itemList)) { + for (FormEditorItem* item : std::as_const(m_itemList)) { if (!item || !item->qmlItemNode().isValid()) continue; @@ -350,7 +350,7 @@ void MoveManipulator::reparentTo(FormEditorItem *newParent, ReparentFlag flag) } - for (const ModelNode &nodeToReparented : qAsConst(nodeReparentVector)) + for (const ModelNode &nodeToReparented : std::as_const(nodeReparentVector)) parentProperty.reparentHere(nodeToReparented); synchronizeParent(m_itemList, parentProperty.parentModelNode()); @@ -371,7 +371,7 @@ void MoveManipulator::end() void MoveManipulator::end(Snapper::Snapping useSnapping) { if (useSnapping == Snapper::UseSnappingAndAnchoring) { - for (FormEditorItem* formEditorItem : qAsConst(m_itemList)) + for (FormEditorItem* formEditorItem : std::as_const(m_itemList)) m_snapper.adjustAnchoringOfItem(formEditorItem); } @@ -380,7 +380,7 @@ void MoveManipulator::end(Snapper::Snapping useSnapping) void MoveManipulator::moveBy(double deltaX, double deltaY) { - for (FormEditorItem* item : qAsConst(m_itemList)) { + for (FormEditorItem* item : std::as_const(m_itemList)) { if (!item || !item->qmlItemNode().isValid()) continue; @@ -422,14 +422,14 @@ void MoveManipulator::endRewriterTransaction() void MoveManipulator::setOpacityForAllElements(qreal opacity) { - for (FormEditorItem* item : qAsConst(m_itemList)) + for (FormEditorItem* item : std::as_const(m_itemList)) item->setOpacity(opacity); } void MoveManipulator::deleteSnapLines() { if (m_layerItem) { - for (QGraphicsItem *item : qAsConst(m_graphicsLineList)) { + for (QGraphicsItem *item : std::as_const(m_graphicsLineList)) { m_layerItem->scene()->removeItem(item); delete item; } diff --git a/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp b/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp index 4dbd3cd290d..96b71086710 100644 --- a/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp +++ b/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp @@ -112,7 +112,7 @@ QList OneDimensionalCluster::reduceLines(const QList & oneDimens clusterList = reduceOneDimensionalClusterList(clusterList, maximumDistance); QList lineList; - for (const OneDimensionalCluster &cluster : qAsConst(clusterList)) + for (const OneDimensionalCluster &cluster : std::as_const(clusterList)) lineList.append(cluster.constFirst()); return lineList; diff --git a/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp b/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp index 7d5df61ef94..09d6907c901 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp @@ -20,13 +20,13 @@ ResizeIndicator::~ResizeIndicator() void ResizeIndicator::show() { - for (ResizeController controller : qAsConst(m_itemControllerHash)) + for (ResizeController controller : std::as_const(m_itemControllerHash)) controller.show(); } void ResizeIndicator::hide() { - for (ResizeController controller : qAsConst(m_itemControllerHash)) + for (ResizeController controller : std::as_const(m_itemControllerHash)) controller.hide(); } diff --git a/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp index 8c4545ca2de..023da3b094f 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp @@ -606,7 +606,7 @@ bool ResizeManipulator::isInvalidSize(const QSizeF & size) void ResizeManipulator::deleteSnapLines() { if (m_layerItem) { - for (QGraphicsItem *item : qAsConst(m_graphicsLineList)) { + for (QGraphicsItem *item : std::as_const(m_graphicsLineList)) { m_layerItem->scene()->removeItem(item); delete item; } diff --git a/src/plugins/qmldesigner/components/formeditor/rotationindicator.cpp b/src/plugins/qmldesigner/components/formeditor/rotationindicator.cpp index c89d166d398..d3e311588d3 100644 --- a/src/plugins/qmldesigner/components/formeditor/rotationindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/rotationindicator.cpp @@ -24,13 +24,13 @@ RotationIndicator::~RotationIndicator() void RotationIndicator::show() { - for (RotationController controller : qAsConst(m_itemControllerHash)) + for (RotationController controller : std::as_const(m_itemControllerHash)) controller.show(); } void RotationIndicator::hide() { - for (RotationController controller : qAsConst(m_itemControllerHash)) + for (RotationController controller : std::as_const(m_itemControllerHash)) controller.hide(); } diff --git a/src/plugins/qmldesigner/components/formeditor/rotationmanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/rotationmanipulator.cpp index a170bb24cee..53fffbd534d 100644 --- a/src/plugins/qmldesigner/components/formeditor/rotationmanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/rotationmanipulator.cpp @@ -198,7 +198,7 @@ void RotationManipulator::end() void RotationManipulator::deleteSnapLines() { if (m_layerItem) { - for (QGraphicsItem *item : qAsConst(m_graphicsLineList)) { + for (QGraphicsItem *item : std::as_const(m_graphicsLineList)) { m_layerItem->scene()->removeItem(item); delete item; } diff --git a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp index 80774414b66..cbcd64d6308 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp @@ -32,7 +32,7 @@ SelectionIndicator::~SelectionIndicator() void SelectionIndicator::show() { - for (QGraphicsPolygonItem *item : qAsConst(m_indicatorShapeHash)) + for (QGraphicsPolygonItem *item : std::as_const(m_indicatorShapeHash)) item->show(); if (m_labelItem) m_labelItem->show(); @@ -40,7 +40,7 @@ void SelectionIndicator::show() void SelectionIndicator::hide() { - for (QGraphicsPolygonItem *item : qAsConst(m_indicatorShapeHash)) + for (QGraphicsPolygonItem *item : std::as_const(m_indicatorShapeHash)) item->hide(); if (m_labelItem) m_labelItem->hide(); @@ -49,7 +49,7 @@ void SelectionIndicator::hide() void SelectionIndicator::clear() { if (m_layerItem) { - for (QGraphicsPolygonItem *item : qAsConst(m_indicatorShapeHash)) { + for (QGraphicsPolygonItem *item : std::as_const(m_indicatorShapeHash)) { m_layerItem->scene()->removeItem(item); delete item; } @@ -185,7 +185,7 @@ void SelectionIndicator::setCursor(const QCursor &cursor) { m_cursor = cursor; - for (QGraphicsItem *item : qAsConst(m_indicatorShapeHash)) + for (QGraphicsItem *item : std::as_const(m_indicatorShapeHash)) item->setCursor(cursor); } diff --git a/src/plugins/qmldesigner/components/formeditor/snapper.cpp b/src/plugins/qmldesigner/components/formeditor/snapper.cpp index 1a7f2459f7d..cb3e93d109e 100644 --- a/src/plugins/qmldesigner/components/formeditor/snapper.cpp +++ b/src/plugins/qmldesigner/components/formeditor/snapper.cpp @@ -689,7 +689,7 @@ QList Snapper::generateSnappingLines(const QList &boundi lineList += mergedVerticalLines(verticalSnappedLines(boundingRect, &snappedBoundingRectList)); } - for (const QLineF &line : qAsConst(lineList)) { + for (const QLineF &line : std::as_const(lineList)) { QLineF lineInTransformationSpace = transform.map(line); auto lineItem = new QGraphicsLineItem(lineInTransformationSpace, layerItem); lineItem->setZValue(40); diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index 97cc756697e..05c0b1ba972 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -447,7 +447,7 @@ void DesignDocument::deleteSelected() Utils::sort(lockedNodes); QString detailedText = QString("" + tr("Locked items:") + "
"); - for (const auto &id : qAsConst(lockedNodes)) + for (const auto &id : std::as_const(lockedNodes)) detailedText.append("- " + id + "
"); detailedText.chop(QString("
").size()); @@ -586,8 +586,8 @@ void DesignDocument::paste() if (!targetNode.isValid()) targetNode = view.rootModelNode(); - for (const ModelNode &node : qAsConst(selectedNodes)) { - for (const ModelNode &node2 : qAsConst(selectedNodes)) { + for (const ModelNode &node : std::as_const(selectedNodes)) { + for (const ModelNode &node2 : std::as_const(selectedNodes)) { if (node.isAncestorOf(node2)) selectedNodes.removeAll(node2); } @@ -601,7 +601,7 @@ void DesignDocument::paste() const auto defaultPropertyName = targetNode.metaInfo().defaultPropertyName(); auto parentProperty = targetNode.nodeListProperty(defaultPropertyName); - for (const ModelNode &node : qAsConst(selectedNodes)) { + for (const ModelNode &node : std::as_const(selectedNodes)) { ModelNode pastedNode(view.insertModel(node)); pastedNodeList.append(pastedNode); scatterItem(pastedNode, targetNode, offset); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp index c217bda183b..47451b76a68 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp @@ -223,7 +223,7 @@ void DesignDocumentView::copyModelNodes(const QList &nodesToCopy) view.changeRootNodeType("QtQuick.Rectangle", 2, 0); view.rootModelNode().setIdWithRefactoring("__multi__selection__"); - for (const ModelNode &selectedNode : qAsConst(selectedNodes)) { + for (const ModelNode &selectedNode : std::as_const(selectedNodes)) { ModelNode newNode(view.insertModel(selectedNode)); view.rootModelNode().nodeListProperty("data").reparentHere(newNode); } diff --git a/src/plugins/qmldesigner/components/itemlibrary/assetimportupdatetreemodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/assetimportupdatetreemodel.cpp index 52b07cf8685..8c473349d8e 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/assetimportupdatetreemodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/assetimportupdatetreemodel.cpp @@ -181,7 +181,7 @@ void AssetImportUpdateTreeModel::createItems(const QList &infos, } } // Remove dir items that have no children from the model - for (auto dirItem : qAsConst(dirItems)) { + for (auto dirItem : std::as_const(dirItems)) { if (dirItem->childCount() == 0) delete dirItem; } @@ -220,7 +220,7 @@ QStringList AssetImportUpdateTreeModel::checkedFiles() const { QStringList retList; - for (const auto item : qAsConst(m_fileItems)) { + for (const auto item : std::as_const(m_fileItems)) { if (item->checkState() == Qt::Checked) retList.append(item->fileInfo().absoluteFilePath()); } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp index 0f53839126f..b3b06f9dc42 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp @@ -135,7 +135,7 @@ ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog( QString candidatePath = targetDir + defaultAssetFolder + quick3DFolder; int candidatePriority = 5; - for (const auto &importPath : qAsConst(importPaths)) { + for (const auto &importPath : std::as_const(importPaths)) { if (importPath.startsWith(targetDir)) { const bool isDefaultFolder = importPath.endsWith(defaultAssetFolder); const QString assetFolder = importPath + quick3DFolder; @@ -197,7 +197,7 @@ ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog( // Create tab for each supported extension group that also has files included in the import QMap tabMap; // QMap used for alphabetical order - for (const auto &file : qAsConst(m_quick3DFiles)) { + for (const auto &file : std::as_const(m_quick3DFiles)) { auto extIt = supportedExts.constBegin(); QString ext = QFileInfo(file).suffix().toLower(); while (extIt != supportedExts.constEnd()) { @@ -252,7 +252,7 @@ ItemLibraryAssetImportDialog::ItemLibraryAssetImportDialog( this, &ItemLibraryAssetImportDialog::setImportProgress); addInfo(tr("Select import options and press \"Import\" to import the following files:")); - for (const auto &file : qAsConst(m_quick3DFiles)) + for (const auto &file : std::as_const(m_quick3DFiles)) addInfo(file); connect(ui->advancedSettingsButton, &QPushButton::clicked, @@ -751,7 +751,7 @@ QGridLayout *ItemLibraryAssetImportDialog::createOptionsGrid( // Ungrouped options are spread evenly under the groups int totalRowCount = (rowIndex[0] + rowIndex[1] + widgets[0].size() + 1) / 2; - for (const auto &rowWidgets : qAsConst(widgets[0])) { + for (const auto &rowWidgets : std::as_const(widgets[0])) { int col = rowIndex[0] < totalRowCount ? 0 : 1; insertOptionToLayout(col, rowWidgets); } @@ -898,11 +898,11 @@ void ItemLibraryAssetImportDialog::onClose() void ItemLibraryAssetImportDialog::toggleAdvanced() { m_advancedMode = !m_advancedMode; - for (const auto &widget : qAsConst(m_simpleData.contentWidgets)) { + for (const auto &widget : std::as_const(m_simpleData.contentWidgets)) { if (widget) widget->setVisible(!m_advancedMode); } - for (const auto &widget : qAsConst(m_advancedData.contentWidgets)) { + for (const auto &widget : std::as_const(m_advancedData.contentWidgets)) { if (widget) widget->setVisible(m_advancedMode); } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp index d7551626287..ecaeeb18de8 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp @@ -498,7 +498,7 @@ void ItemLibraryAssetImporter::copyImportedFiles() notifyProgress(0, progressTitle); int counter = 0; - for (const auto &assetFiles : qAsConst(m_importFiles)) { + for (const auto &assetFiles : std::as_const(m_importFiles)) { // Only increase progress between entire assets instead of individual files, because // progress notify leads to processEvents call, which can lead to various filesystem // watchers triggering while library is still incomplete, leading to inconsistent model. @@ -710,7 +710,7 @@ void ItemLibraryAssetImporter::finalizeQuick3DImport() const QList currentImports = model->imports(); QList newImportsToAdd; - for (auto &imp : qAsConst(m_requiredImports)) { + for (auto &imp : std::as_const(m_requiredImports)) { const bool isPos = Utils::contains(posImports, [imp](const Import &posImp) { return posImp.url() == imp.url(); }); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp index fc687278dc5..cec9dda58bc 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp @@ -112,7 +112,7 @@ void ItemLibraryCategoriesModel::sortCategorySections() std::sort(m_categoryList.begin(), m_categoryList.end(), categorySort); - for (const auto &category : qAsConst(m_categoryList)) + for (const auto &category : std::as_const(m_categoryList)) category->sortItems(); } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index 6e51d2aadbc..3ef77f52ca7 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -374,7 +374,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) } } - for (const auto itemLibImport : qAsConst(importHash)) { + for (const auto itemLibImport : std::as_const(importHash)) { m_importList.append(itemLibImport); itemLibImport->setImportExpanded(loadExpandedState(itemLibImport->importUrl())); } @@ -588,7 +588,7 @@ void ItemLibraryModel::sortSections() std::sort(m_importList.begin(), m_importList.end(), sectionSort); - for (ItemLibraryImport *itemLibImport : qAsConst(m_importList)) + for (ItemLibraryImport *itemLibImport : std::as_const(m_importList)) itemLibImport->sortCategorySections(); } diff --git a/src/plugins/qmldesigner/components/materialbrowser/bundleimporter.cpp b/src/plugins/qmldesigner/components/materialbrowser/bundleimporter.cpp index 7dae1e900ff..62d122d14c0 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/bundleimporter.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/bundleimporter.cpp @@ -74,7 +74,7 @@ QString BundleImporter::importComponent(const QString &qmlFile, if (!bundleImportPathExists && !bundleImportPath.createDir()) return QStringLiteral("Failed to create bundle import folder: '%1'").arg(bundleImportPath.toString()); - for (const QString &file : qAsConst(m_sharedFiles)) { + for (const QString &file : std::as_const(m_sharedFiles)) { FilePath target = bundleImportPath.resolvePath(file); if (!target.exists()) { FilePath parentDir = target.parentDir(); @@ -111,7 +111,7 @@ QString BundleImporter::importComponent(const QString &qmlFile, QStringList allFiles; allFiles.append(files); allFiles.append(qmlFile); - for (const QString &file : qAsConst(allFiles)) { + for (const QString &file : std::as_const(allFiles)) { FilePath target = bundleImportPath.resolvePath(file); FilePath parentDir = target.parentDir(); if (!parentDir.exists() && !parentDir.createDir()) diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index f6f9bb498d5..feb38e1cff6 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -90,7 +90,7 @@ WidgetInfo MaterialBrowserView::widgetInfo() propNames.append(changedProp.name()); } } - for (const PropertyName &propName : qAsConst(propNames)) { + for (const PropertyName &propName : std::as_const(propNames)) { if (propName != "objectName") mat.removeProperty(propName); } diff --git a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp index 7bd8fab01cb..61de509af3d 100644 --- a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp +++ b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp @@ -170,7 +170,7 @@ void ChooseFromPropertyListDialog::fillList(const QStringList &propNames) QString defaultProp = propNames.first(); QStringList sortedNames = propNames; sortedNames.sort(); - for (const auto &propName : qAsConst(sortedNames)) { + for (const auto &propName : std::as_const(sortedNames)) { QListWidgetItem *newItem = new QListWidgetItem(propName); m_ui->listProps->addItem(newItem); } diff --git a/src/plugins/qmldesigner/components/pathtool/pathitem.cpp b/src/plugins/qmldesigner/components/pathtool/pathitem.cpp index 401affca13f..8f0b28e159a 100644 --- a/src/plugins/qmldesigner/components/pathtool/pathitem.cpp +++ b/src/plugins/qmldesigner/components/pathtool/pathitem.cpp @@ -122,7 +122,7 @@ void PathItem::writePathToProperty() pathNode.variantProperty("startX").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().x()); pathNode.variantProperty("startY").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().y()); - for (const CubicSegment &cubicSegment : qAsConst(m_cubicSegments)) { + for (const CubicSegment &cubicSegment : std::as_const(m_cubicSegments)) { writePathAttributes(pathNode, cubicSegment.attributes()); writePathPercent(pathNode, cubicSegment.percent()); @@ -157,7 +157,7 @@ void PathItem::writePathAsCubicSegmentsOnly() pathNode.variantProperty("startY").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().y()); - for (const CubicSegment &cubicSegment : qAsConst(m_cubicSegments)) { + for (const CubicSegment &cubicSegment : std::as_const(m_cubicSegments)) { writePathAttributes(pathNode, cubicSegment.attributes()); writePathPercent(pathNode, cubicSegment.percent()); writeCubicPath(pathNode, cubicSegment); @@ -668,7 +668,7 @@ const QList PathItem::controlPoints() const if (!m_cubicSegments.isEmpty()) controlPointList.append(m_cubicSegments.constFirst().firstControlPoint()); - for (const CubicSegment &cubicSegment : qAsConst(m_cubicSegments)) { + for (const CubicSegment &cubicSegment : std::as_const(m_cubicSegments)) { controlPointList.append(cubicSegment.secondControlPoint()); controlPointList.append(cubicSegment.thirdControlPoint()); controlPointList.append(cubicSegment.fourthControlPoint()); diff --git a/src/plugins/qmldesigner/components/pathtool/pathselectionmanipulator.cpp b/src/plugins/qmldesigner/components/pathtool/pathselectionmanipulator.cpp index 54f5a82edb8..2308beba9bd 100644 --- a/src/plugins/qmldesigner/components/pathtool/pathselectionmanipulator.cpp +++ b/src/plugins/qmldesigner/components/pathtool/pathselectionmanipulator.cpp @@ -97,13 +97,13 @@ QList PathSelectionManipulator::allControlPoints() { QList controlPoints; - for (const SelectionPoint &selectionPoint : qAsConst(m_singleSelectedPoints)) + for (const SelectionPoint &selectionPoint : std::as_const(m_singleSelectedPoints)) controlPoints.append(selectionPoint.controlPoint); - for (const SelectionPoint &selectionPoint : qAsConst(m_automaticallyAddedSinglePoints)) + for (const SelectionPoint &selectionPoint : std::as_const(m_automaticallyAddedSinglePoints)) controlPoints.append(selectionPoint.controlPoint); - for (const SelectionPoint &selectionPoint : qAsConst(m_multiSelectedPoints)) + for (const SelectionPoint &selectionPoint : std::as_const(m_multiSelectedPoints)) controlPoints.append(selectionPoint.controlPoint); return controlPoints; diff --git a/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp b/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp index 80ca4ab47fc..9365f825ef9 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp @@ -309,7 +309,7 @@ void AlignDistribute::alignObjects(Target target, AlignTo alignTo, const QString }; view->executeInTransaction("DesignerActionManager|" + operationName, [&]() { - for (const ModelNode &modelNode : qAsConst(selectedNodes)) { + for (const ModelNode &modelNode : std::as_const(selectedNodes)) { QTC_ASSERT(!modelNode.isRootNode(), continue); if (QmlItemNode::isValidQmlItemNode(modelNode)) { QmlItemNode qmlItemNode(modelNode); @@ -434,7 +434,7 @@ void AlignDistribute::distributeObjects(Target target, AlignTo alignTo, const QS return; } - for (const ModelNode &modelNode : qAsConst(selectedNodes)) { + for (const ModelNode &modelNode : std::as_const(selectedNodes)) { if (QmlItemNode::isValidQmlItemNode(modelNode)) { QmlItemNode qmlItemNode(modelNode); qreal currentPosition; @@ -473,7 +473,7 @@ void AlignDistribute::distributeObjects(Target target, AlignTo alignTo, const QS const QByteArray operationName = "distribute" + QVariant::fromValue(target).toByteArray(); view->executeInTransaction("DesignerActionManager|" + operationName, [&]() { - for (const ModelNode &modelNode : qAsConst(selectedNodes)) { + for (const ModelNode &modelNode : std::as_const(selectedNodes)) { QTC_ASSERT(!modelNode.isRootNode(), continue); if (QmlItemNode::isValidQmlItemNode(modelNode)) { QmlItemNode qmlItemNode(modelNode); @@ -569,7 +569,7 @@ void AlignDistribute::distributeSpacing(Dimension dimension, } } - for (const ModelNode &modelNode : qAsConst(selectedNodes)) { + for (const ModelNode &modelNode : std::as_const(selectedNodes)) { if (QmlItemNode::isValidQmlItemNode(modelNode)) { const QmlItemNode qmlItemNode(modelNode); qreal currentPosition; @@ -606,7 +606,7 @@ void AlignDistribute::distributeSpacing(Dimension dimension, : "distributeSpacingVertical"; view->executeInTransaction("DesignerActionManager|" + operationName, [&]() { - for (const ModelNode &modelNode : qAsConst(selectedNodes)) { + for (const ModelNode &modelNode : std::as_const(selectedNodes)) { QTC_ASSERT(!modelNode.isRootNode(), continue); if (QmlItemNode::isValidQmlItemNode(modelNode)) { QmlItemNode qmlItemNode(modelNode); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index 049985ddda8..10f08b542ae 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -243,7 +243,7 @@ void PropertyEditorContextObject::changeTypeName(const QString &typeName) if (!incompatibleProperties.empty()) { QString detailedText = QString("Incompatible properties:
"); - for (const auto &p : qAsConst(incompatibleProperties)) + for (const auto &p : std::as_const(incompatibleProperties)) detailedText.append("- " + QString::fromUtf8(p) + "
"); detailedText.chop(QString("
").size()); @@ -263,7 +263,7 @@ void PropertyEditorContextObject::changeTypeName(const QString &typeName) if (msgBox.exec() == QMessageBox::Cancel) return; - for (const auto &p : qAsConst(incompatibleProperties)) + for (const auto &p : std::as_const(incompatibleProperties)) selectedNode.removeProperty(p); } diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp index 0cf8ebe9224..a609a3d5ccb 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp @@ -581,11 +581,11 @@ QStringList QmlAnchorBindingProxy::possibleTargetItems() const itemList.removeOne(m_qmlItemNode); //We currently have no instanceChildren(). //So we double check here if the instanceParents are equal. - for (const QmlItemNode &node : qAsConst(itemList)) + for (const QmlItemNode &node : std::as_const(itemList)) if (node.isValid() && (node.instanceParent().modelNode() != m_qmlItemNode.instanceParent().modelNode())) itemList.removeAll(node); - for (const QmlItemNode &itemNode : qAsConst(itemList)) { + for (const QmlItemNode &itemNode : std::as_const(itemList)) { if (itemNode.isValid() && !itemNode.id().isEmpty()) stringList.append(itemNode.id()); } diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index f70789310cc..45c482c16d9 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -114,7 +114,7 @@ void StatesEditorView::removeState(int nodeId) Utils::sort(lockedTargets); QString detailedText = QString("" + tr("Locked components:") + "
"); - for (const auto &id : qAsConst(lockedTargets)) + for (const auto &id : std::as_const(lockedTargets)) detailedText.append("- " + id + "
"); detailedText.chop(QString("
").size()); diff --git a/src/plugins/qmldesigner/components/stateseditornew/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditornew/stateseditorview.cpp index a8e28f62e06..c2c8ec83882 100644 --- a/src/plugins/qmldesigner/components/stateseditornew/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditornew/stateseditorview.cpp @@ -312,7 +312,7 @@ void StatesEditorView::removeState(int nodeId) Utils::sort(lockedTargets); QString detailedText = QString("" + tr("Locked components:") + "
"); - for (const auto &id : qAsConst(lockedTargets)) + for (const auto &id : std::as_const(lockedTargets)) detailedText.append("- " + id + "
"); detailedText.chop(QString("
").size()); diff --git a/src/plugins/qmldesigner/components/timelineeditor/easingcurvedialog.cpp b/src/plugins/qmldesigner/components/timelineeditor/easingcurvedialog.cpp index aafb7e8b18f..96e6140f618 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/easingcurvedialog.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/easingcurvedialog.cpp @@ -176,7 +176,7 @@ bool EasingCurveDialog::apply() return view->executeInTransaction("EasingCurveDialog::apply", [this](){ auto expression = m_splineEditor->easingCurve().toString(); - for (const auto &frame : qAsConst(m_frames)) + for (const auto &frame : std::as_const(m_frames)) frame.bindingProperty("easing.bezierCurve").setExpression(expression); }); } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineactions.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelineactions.cpp index 33c8424a0b0..70855241a55 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineactions.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineactions.cpp @@ -229,7 +229,7 @@ std::vector> getFramesRelative(const ModelNode &par if (!sortedByTime.empty()) { qreal firstTime = getTime(sortedByTime.first()); - for (const ModelNode &keyframe : qAsConst(sortedByTime)) + for (const ModelNode &keyframe : std::as_const(sortedByTime)) result.emplace_back(keyframe, getTime(keyframe) - firstTime); } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp index dfa00985dd3..4493c0a2201 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp @@ -537,7 +537,7 @@ void AbstractScrollGraphicsScene::selectKeyframes(const SelectionMode &mode, void AbstractScrollGraphicsScene::clearSelection() { - for (auto *keyframe : qAsConst(m_selectedKeyframes)) + for (auto *keyframe : std::as_const(m_selectedKeyframes)) if (keyframe) keyframe->setHighlighted(false); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp index b366d0822c7..ab0f52e7862 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineselectiontool.cpp @@ -113,7 +113,7 @@ void TimelineSelectionTool::reset() void TimelineSelectionTool::resetHighlights() { - for (auto *keyframe : qAsConst(m_aboutToSelectBuffer)) + for (auto *keyframe : std::as_const(m_aboutToSelectBuffer)) if (scene()->isKeyframeSelected(keyframe)) keyframe->setHighlighted(true); else diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp index a2fd0b8e558..09cdd75c9e9 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp @@ -478,7 +478,7 @@ void TimelineToolBar::resizeEvent([[maybe_unused]] QResizeEvent *event) { int width = 0; QWidget *spacer = nullptr; - for (auto *object : qAsConst(m_grp)) { + for (auto *object : std::as_const(m_grp)) { if (isSpacer(object)) spacer = qobject_cast(object); else diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditortoolbar.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditortoolbar.cpp index 383d313ffdf..d8f1741994b 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditortoolbar.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditortoolbar.cpp @@ -292,7 +292,7 @@ void TransitionEditorToolBar::resizeEvent([[maybe_unused]] QResizeEvent *event) { int width = 0; QWidget *spacer = nullptr; - for (auto *object : qAsConst(m_grp)) { + for (auto *object : std::as_const(m_grp)) { if (isSpacer(object)) spacer = qobject_cast(object); else diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp index 9bf04e8e0c5..a2af7ed0eea 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp @@ -194,7 +194,7 @@ ModelNode TransitionEditorView::addNewTransition() QHash idPropertyList; - for (const QmlModelState &state : qAsConst(states)) { + for (const QmlModelState &state : std::as_const(states)) { for (const QmlPropertyChanges & change : state.propertyChanges()) { QStringList locList; const ModelNode target = change.target(); diff --git a/src/plugins/qmldesigner/designercore/include/forwardview.h b/src/plugins/qmldesigner/designercore/include/forwardview.h index a51c34dce42..9dbb1c934ab 100644 --- a/src/plugins/qmldesigner/designercore/include/forwardview.h +++ b/src/plugins/qmldesigner/designercore/include/forwardview.h @@ -70,14 +70,14 @@ template void ForwardView::modelAttached(Model *model) { AbstractView::modelAttached(model); - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->modelAttached(model); } template void ForwardView::modelAboutToBeDetached(Model *model) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->modelAboutToBeDetached(model); AbstractView::modelAboutToBeDetached(model); @@ -86,35 +86,35 @@ void ForwardView::modelAboutToBeDetached(Model *model) template void ForwardView::nodeCreated(const ModelNode &createdNode) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->nodeCreated(ModelNode(createdNode, view.data())); } template void ForwardView::nodeAboutToBeRemoved(const ModelNode &removedNode) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->nodeAboutToBeRemoved(ModelNode(removedNode, view.data())); } template void ForwardView::nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->nodeRemoved(ModelNode(removedNode, view.data()), NodeAbstractProperty(parentProperty, view.data()), propertyChange); } template void ForwardView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, PropertyChangeFlags propertyChange) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->nodeReparented(ModelNode(node, view.data()), NodeAbstractProperty(newPropertyParent, view.data()), NodeAbstractProperty(oldPropertyParent, view.data()), propertyChange); } template void ForwardView::nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->nodeIdChanged(ModelNode(node, view.data()), newId, oldId); } @@ -134,41 +134,41 @@ static QList adjustedList(const QList& oldList, AbstractView *view) template void ForwardView::propertiesAboutToBeRemoved(const QList& propertyList) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->propertiesAboutToBeRemoved(adjustedList(propertyList, view.data())); } template void ForwardView::propertiesRemoved(const QList& propertyList) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->propertiesRemoved(adjustedList(propertyList, view.data())); } template void ForwardView::variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->variantPropertiesChanged(adjustedList(propertyList, view.data()), propertyChange); } template void ForwardView::bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->bindingPropertiesChanged(adjustedList(propertyList, view.data()), propertyChange); } void ForwardView::signalHandlerPropertiesChanged(const QVector &propertyList, AbstractView::PropertyChangeFlags propertyChange) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->signalHandlerPropertiesChanged(adjustedList(propertyList, view.data()), propertyChange); } template void ForwardView::rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->rootNodeTypeChanged(type, majorVersion, minorVersion); } @@ -176,7 +176,7 @@ template void ForwardView::selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->selectedNodesChanged(adjustedList(selectedNodeList, view.data()), adjustedList(lastSelectedNodeList, view.data())); } @@ -185,21 +185,21 @@ void ForwardView::fileUrlChanged(const QUrl &oldUrl, const QUrl &newUr { AbstractView::fileUrlChanged(oldUrl, newUrl); - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->fileUrlChanged(oldUrl, newUrl); } template void ForwardView::nodeOrderChanged(const NodeListProperty &listProperty) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->nodeOrderChanged(NodeListProperty(listProperty, view.data())); } template void ForwardView::importChanged(const QList &addedImports, const QList &removedImports) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->importChanged(addedImport, removedImport); } @@ -208,7 +208,7 @@ void ForwardView::importRemoved(const Import &import) { AbstractView::importRemoved(import); - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->importRemoved(import); } @@ -217,14 +217,14 @@ void ForwardView::auxiliaryDataChanged(const ModelNode &node, const Pr { AbstractView::auxiliaryDataChanged(node, name, data); - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->auxiliaryDataChanged(ModelNode(node, view.data()), name, data); } template void ForwardView::scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) { - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) view->scriptFunctionsChanged(node, scriptFunctionList); } @@ -245,7 +245,7 @@ QList ForwardView::viewList() const { QList newList; - for (const ViewTypePointer &view : qAsConst(m_targetViewList)) + for (const ViewTypePointer &view : std::as_const(m_targetViewList)) newList.append(view.data()); return newList; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 7cf699c6176..dfc5667199b 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -146,7 +146,7 @@ NodeInstanceView::NodeInstanceView(ConnectionManagerInterface &connectionManager m_updateWatcherTimer.setSingleShot(true); m_updateWatcherTimer.setInterval(100); QObject::connect(&m_updateWatcherTimer, &QTimer::timeout, [this] { - for (const auto &path : qAsConst(m_pendingUpdateDirs)) + for (const auto &path : std::as_const(m_pendingUpdateDirs)) updateWatcher(path); m_pendingUpdateDirs.clear(); }); @@ -502,7 +502,7 @@ void NodeInstanceView::propertiesAboutToBeRemoved(const QList& } } - for (const ModelNode &node : qAsConst(nodeList)) + for (const ModelNode &node : std::as_const(nodeList)) removeInstanceNodeRelationship(node); } @@ -2172,7 +2172,7 @@ void NodeInstanceView::handleShaderChanges() m_remainingQsbTargets += newShaders.size(); - for (const auto &shader : qAsConst(newShaders)) { + for (const auto &shader : std::as_const(newShaders)) { const Utils::FilePath srcFile = Utils::FilePath::fromString(shader); const Utils::FilePath srcPath = srcFile.absolutePath(); const Utils::FilePath outPath = Utils::FilePath::fromString(shader + ".qsb"); @@ -2237,7 +2237,7 @@ void NodeInstanceView::updateRotationBlocks() } } if (!qml3DNodes.isEmpty()) { - for (const auto &node : qAsConst(qml3DNodes)) { + for (const auto &node : std::as_const(qml3DNodes)) { if (rotationKeyframeTargets.contains(node)) node.setAuxiliaryData(rotBlockProperty, true); else diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp index 8fb3c4d59c9..a96fac3ad09 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp @@ -269,7 +269,7 @@ QList ItemLibraryInfo::entriesForType(const QByteArray &typeNa { QList entries; - for (const ItemLibraryEntry &entry : qAsConst(m_nameToEntryHash)) { + for (const ItemLibraryEntry &entry : std::as_const(m_nameToEntryHash)) { if (entry.typeName() == typeName) entries += entry; } diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp index 24b612d8088..ae8abef5a19 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp @@ -95,7 +95,7 @@ void MetaInfoPrivate::parseItemLibraryDescriptions() { #ifndef QMLDESIGNER_TEST Internal::WidgetPluginManager pluginManager; - for (const QString &pluginDir : qAsConst(m_q->s_pluginDirs)) + for (const QString &pluginDir : std::as_const(m_q->s_pluginDirs)) pluginManager.addPath(pluginDir); const QList widgetPluginList = pluginManager.instances(); for (IWidgetPlugin *plugin : widgetPluginList) { diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index c71bb6aa8b4..5d63b8bebc4 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -148,7 +148,7 @@ static QString qualifiedTypeNameForContext(const ObjectValue *objectValue, CoreImport cImport = dep.coreImport(objectValue->originId()); if (!cImport.valid()) break; - for (const Export &e : qAsConst(cImport.possibleExports)) { + for (const Export &e : std::as_const(cImport.possibleExports)) { if (e.pathRequired.isEmpty() || vContext.paths.contains(e.pathRequired)) { switch (e.exportName.type) { case ImportType::Library: @@ -173,7 +173,7 @@ static QString qualifiedTypeNameForContext(const ObjectValue *objectValue, // remove the search path prefix. // this means that the same relative path wrt. different import paths will clash QString filePath = e.exportName.path(); - for (const Utils::FilePath &path : qAsConst(vContext.paths)) { + for (const Utils::FilePath &path : std::as_const(vContext.paths)) { if (filePath.startsWith(path.path()) && filePath.size() > path.path().size() && filePath.at(path.path().size()) == QLatin1Char('/')) { filePath = filePath.mid(path.path().size() + 1); @@ -247,7 +247,7 @@ static QString qualifiedTypeNameForContext(const ObjectValue *objectValue, }; if (!possibleLibraries.isEmpty()) { if (hasQtQuick) { - for (const QString &libImport : qAsConst(possibleLibraries)) + for (const QString &libImport : std::as_const(possibleLibraries)) if (!libImport.startsWith(QLatin1String("QtQuick"))) possibleLibraries.removeAll(libImport); } @@ -284,7 +284,7 @@ public: const TypeName type = resolveTypeName(ref, m_context, dotProperties); m_properties.append({propertyName, type}); if (!dotProperties.isEmpty()) { - for (const PropertyInfo &propertyInfo : qAsConst(dotProperties)) { + for (const PropertyInfo &propertyInfo : std::as_const(dotProperties)) { PropertyName dotName = propertyInfo.first; TypeName type = propertyInfo.second; dotName = propertyName + '.' + dotName; @@ -1267,7 +1267,7 @@ void NodeMetaInfoPrivate::setupPrototypes() return; } - for (const ObjectValue *ov : qAsConst(objects)) { + for (const ObjectValue *ov : std::as_const(objects)) { TypeDescription description; description.className = ov->className(); description.minorVersion = -1; diff --git a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp index 3c58092416d..79961abfd7f 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp @@ -152,7 +152,7 @@ void SubComponentManager::parseDirectories() for (const auto &assetPath : assetPaths) parseDirectory(assetPath); - for (const Import &import : qAsConst(m_imports)) { + for (const Import &import : std::as_const(m_imports)) { if (import.isFileImport()) { QFileInfo dirInfo = QFileInfo(m_filePath.resolved(import.file()).toLocalFile()); if (dirInfo.exists() && dirInfo.isDir()) { @@ -389,7 +389,7 @@ void SubComponentManager::parseQuick3DAssetsDir(const QString &quick3DAssetsPath asset.prepend(QString(Constants::QUICK_3D_ASSETS_FOLDER).mid(1) + '.'); // Create item library entries for Quick3D assets that are imported by document - for (auto &import : qAsConst(m_imports)) { + for (auto &import : std::as_const(m_imports)) { if (import.isLibraryImport() && assets.contains(import.url())) { assets.removeOne(import.url()); parseQuick3DAssetsItem(import.url(), quick3DAssetsPath); diff --git a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp index cfe5c800310..b4e6273870d 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp @@ -77,7 +77,7 @@ void InternalNodeListProperty::slide(int from, int to) QList InternalNodeListProperty::allSubNodes() const { QList nodeList; - for (const InternalNode::Pointer &childNode : qAsConst(m_nodeList)) { + for (const InternalNode::Pointer &childNode : std::as_const(m_nodeList)) { nodeList.append(childNode->allSubNodes()); nodeList.append(childNode); } diff --git a/src/plugins/qmldesigner/designercore/model/modelnodepositionrecalculator.cpp b/src/plugins/qmldesigner/designercore/model/modelnodepositionrecalculator.cpp index 8b1018bd633..71cc2da0425 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnodepositionrecalculator.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnodepositionrecalculator.cpp @@ -24,7 +24,7 @@ void ModelNodePositionRecalculator::moved(const TextModifier::MoveInfo &moveInfo const int prefixLength = moveInfo.prefixToInsert.length(); const int suffixLength = moveInfo.suffixToInsert.length(); - for (const ModelNode &node : qAsConst(m_nodesToTrack)) { + for (const ModelNode &node : std::as_const(m_nodesToTrack)) { const int nodeLocation = m_positionStore->nodeOffset(node); if (nodeLocation == ModelNodePositionStorage::INVALID_LOCATION) @@ -67,7 +67,7 @@ void ModelNodePositionRecalculator::replaced(int offset, int oldLength, int newL if (growth == 0) return; - for (const ModelNode &node : qAsConst(m_nodesToTrack)) { + for (const ModelNode &node : std::as_const(m_nodesToTrack)) { const int nodeLocation = m_positionStore->nodeOffset(node); if (nodeLocation == ModelNodePositionStorage::INVALID_LOCATION) diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp index 9b368b0cdaf..588cab5d50a 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp @@ -237,7 +237,7 @@ void ModelToTextMerger::applyChanges() textModifier->deactivateChangeSignals(); textModifier->startGroup(); - for (auto action : qAsConst(m_rewriteActions)) { + for (auto action : std::as_const(m_rewriteActions)) { if (DebugRewriteActions) qDebug() << "Next rewrite action:" << qPrintable(action->info()); @@ -299,7 +299,7 @@ void ModelToTextMerger::reindent(const QMap &dirtyAreas) const Utils::sort(offsets); TextModifier *textModifier = m_rewriterView->textModifier(); - for (const int offset : qAsConst(offsets)) { + for (const int offset : std::as_const(offsets)) { const int length = dirtyAreas[offset]; textModifier->indent(offset, length); } @@ -396,7 +396,7 @@ void ModelToTextMerger::dumpRewriteActions(const QString &msg) if (DebugRewriteActions) { qDebug() << "---->" << qPrintable(msg); - for (RewriteAction *action : qAsConst(m_rewriteActions)) { + for (RewriteAction *action : std::as_const(m_rewriteActions)) { qDebug() << "-----" << qPrintable(action->info()); } diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 3bb73e586e8..d9f592e7499 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -431,7 +431,7 @@ void QmlObjectNode::destroy() } const auto subNodes = modelNode().allSubModelNodesAndThisNode(); - for (auto &timelineNode : qAsConst(timelineNodes)) { + for (auto &timelineNode : std::as_const(timelineNodes)) { QmlTimeline timeline(timelineNode); for (const auto &subNode : subNodes) timeline.destroyKeyframesForTarget(subNode); @@ -552,7 +552,7 @@ QList QmlObjectNode::allDefinedStates() const if (QmlVisualNode::isValidQmlVisualNode(view()->rootModelNode())) allVisualNodes.append(allQmlVisualNodesRecursive(view()->rootModelNode())); - for (const QmlVisualNode &node : qAsConst(allVisualNodes)) + for (const QmlVisualNode &node : std::as_const(allVisualNodes)) returnList.append(node.states().allStates()); const auto allNodes = view()->allModelNodes(); diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index a3fa65d682f..27b452ae5ed 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -220,7 +220,7 @@ QString QmlTextGenerator::propertiesToQml(const ModelNode &node, int indentDepth PropertyNameList nodePropertyNames = node.propertyNames(); bool addToTop = true; - for (const PropertyName &propertyName : qAsConst(m_propertyOrder)) { + for (const PropertyName &propertyName : std::as_const(m_propertyOrder)) { if (propertyName == "id") { // the model handles the id property special, so: if (!node.id().isEmpty()) { @@ -246,7 +246,7 @@ QString QmlTextGenerator::propertiesToQml(const ModelNode &node, int indentDepth } } - for (const PropertyName &propertyName : qAsConst(nodePropertyNames)) { + for (const PropertyName &propertyName : std::as_const(nodePropertyNames)) { bottomPart.prepend(propertyToQml(node.property(propertyName), indentDepth)); } diff --git a/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp b/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp index f7d5da29aba..e1d496fc061 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp @@ -80,7 +80,7 @@ void RewriteActionCompressor::compressImports(QList &actions) c } } - for (RewriteAction *action : qAsConst(actionsToRemove)) { + for (RewriteAction *action : std::as_const(actionsToRemove)) { actions.removeOne(action); delete action; } @@ -106,7 +106,7 @@ void RewriteActionCompressor::compressRereparentActions(QList & } } - for (RewriteAction *action : qAsConst(actionsToRemove)) { + for (RewriteAction *action : std::as_const(actionsToRemove)) { actions.removeOne(action); delete action; } @@ -125,7 +125,7 @@ void RewriteActionCompressor::compressReparentIntoSamePropertyActions(QList &ac } } - for (RewriteAction *action : qAsConst(actionsToRemove)) { + for (RewriteAction *action : std::as_const(actionsToRemove)) { actions.removeOne(action); delete action; } @@ -269,7 +269,7 @@ void RewriteActionCompressor::compressAddEditActions( QSet addedNodes; QSet dirtyActions; - for (RewriteAction *action : qAsConst(actions)) { + for (RewriteAction *action : std::as_const(actions)) { if (action->asAddPropertyRewriteAction() || action->asChangePropertyRewriteAction()) { AbstractProperty property; ModelNode containedNode; @@ -305,13 +305,13 @@ void RewriteActionCompressor::compressAddEditActions( } } - for (RewriteAction *action : qAsConst(actionsToRemove)) { + for (RewriteAction *action : std::as_const(actionsToRemove)) { actions.removeOne(action); delete action; } QmlTextGenerator gen(m_propertyOrder, tabSettings); - for (RewriteAction *action : qAsConst(dirtyActions)) { + for (RewriteAction *action : std::as_const(dirtyActions)) { RewriteAction *newAction = nullptr; if (AddPropertyRewriteAction *addAction = action->asAddPropertyRewriteAction()) { newAction = new AddPropertyRewriteAction(addAction->property(), @@ -376,7 +376,7 @@ void RewriteActionCompressor::compressAddReparentActions(QList } } - for (RewriteAction *action : qAsConst(actionsToRemove)) { + for (RewriteAction *action : std::as_const(actionsToRemove)) { actions.removeOne(action); delete action; } diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 65f1041fae0..656a772620b 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -838,7 +838,7 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc, } } - for (const Import &import : qAsConst(existingImports)) + for (const Import &import : std::as_const(existingImports)) differenceHandler.importAbsentInQMl(import); } @@ -1412,7 +1412,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, } } - for (const PropertyName &modelPropertyName : qAsConst(modelPropertyNames)) { + for (const PropertyName &modelPropertyName : std::as_const(modelPropertyNames)) { AbstractProperty modelProperty = modelNode.property(modelPropertyName); // property deleted. diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 517e6d86e33..233c88a4b88 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -97,7 +97,7 @@ DesignModeWidget::DesignModeWidget() DesignModeWidget::~DesignModeWidget() { - for (QPointer widget : qAsConst(m_viewWidgets)) { + for (QPointer widget : std::as_const(m_viewWidgets)) { if (widget) widget.clear(); } @@ -464,7 +464,7 @@ void DesignModeWidget::aboutToShowWorkspaces() auto sortedWorkspaces = m_dockManager->workspaces(); Utils::sort(sortedWorkspaces); - for (const auto &workspace : qAsConst(sortedWorkspaces)) { + for (const auto &workspace : std::as_const(sortedWorkspaces)) { QAction *action = ag->addAction(workspace); action->setData(workspace); action->setCheckable(true); diff --git a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp index 313a3315bd1..70704ce9974 100644 --- a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp +++ b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp @@ -146,7 +146,7 @@ void FpsLabelAction::fpsHandler(quint16 fpsValues[8]) fpsText = fpsText.arg("--"); else fpsText = fpsText.arg(lastValidFrames); - for (const QPointer &label : qAsConst(fpsHandlerLabelList)) { + for (const QPointer &label : std::as_const(fpsHandlerLabelList)) { if (label) label->setText(fpsText); } @@ -175,7 +175,7 @@ QWidget *FpsLabelAction::createWidget(QWidget *parent) void FpsLabelAction::refreshFpsLabel(quint16 frames) { - for (const auto &labelPointer : qAsConst(fpsHandlerLabelList)) { + for (const auto &labelPointer : std::as_const(fpsHandlerLabelList)) { if (labelPointer) labelPointer->setText(QString("%1 FPS").arg(frames)); } diff --git a/src/plugins/qmljseditor/qmljscompletionassist.cpp b/src/plugins/qmljseditor/qmljscompletionassist.cpp index 427bdc3e0db..2f9c21fcf70 100644 --- a/src/plugins/qmljseditor/qmljscompletionassist.cpp +++ b/src/plugins/qmljseditor/qmljscompletionassist.cpp @@ -666,7 +666,7 @@ IAssistProposal *QmlJSCompletionAssistProcessor::perform(const AssistInterface * QStringList nCompletions; QString prefix(libVersion.left(toSkip)); nCompletions.reserve(completions.size()); - for (const QString &completion : qAsConst(completions)) + for (const QString &completion : std::as_const(completions)) if (completion.startsWith(prefix)) nCompletions.append(completion.right(completion.size()-toSkip)); completions = nCompletions; @@ -1031,7 +1031,7 @@ void QmlJSAssistProposalModel::filter(const QString &prefix) return; QList newCurrentItems; newCurrentItems.reserve(m_currentItems.size()); - for (AssistProposalItemInterface *item : qAsConst(m_currentItems)) + for (AssistProposalItemInterface *item : std::as_const(m_currentItems)) if (!item->text().startsWith(QLatin1String("__"))) newCurrentItems << item; m_currentItems = newCurrentItems; diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp index ea828dc73b7..33633e2f8ab 100644 --- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp @@ -109,7 +109,7 @@ public: sortedPropertiesWithoutId.sort(); - for (const QString &property : qAsConst(sortedPropertiesWithoutId)) + for (const QString &property : std::as_const(sortedPropertiesWithoutId)) sourcePreview.append(QLatin1String(" ") + property + QLatin1String(": ") + propertyReader.readAstValue(property)); const bool confirm = ComponentNameDialog::go(&componentName, @@ -161,7 +161,7 @@ public: if (program->members) astRootNode = program->members->member; - for (const QString &property : qAsConst(result)) + for (const QString &property : std::as_const(result)) rewriter.removeBindingByName(initializerOfObject(astRootNode), property); } else { qWarning() << Q_FUNC_INFO << "parsing failed:" << newComponentSource; @@ -191,7 +191,7 @@ public: if (!m_idName.isEmpty()) replacement += QLatin1String("id: ") + m_idName + QLatin1Char('\n'); - for (const QString &property : qAsConst(result)) + for (const QString &property : std::as_const(result)) replacement += property + QLatin1String(": ") + propertyReader.readAstValue(property) + QLatin1Char('\n'); Utils::ChangeSet changes; diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 3db43211763..aa5494aa3da 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -357,7 +357,7 @@ void QmlJSEditorWidget::updateUses() Utils::sort(locations, [](const SourceLocation &lhs, const SourceLocation &rhs) { return lhs.begin() < rhs.begin(); }); - for (const SourceLocation &loc : qAsConst(locations)) { + for (const SourceLocation &loc : std::as_const(locations)) { if (! loc.isValid()) continue; diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index c71dd48975c..81f30c410a3 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -618,13 +618,13 @@ void QmlJSEditorDocumentPrivate::createTextMarks(const SemanticInfo &info) m_semanticMarks.removeAll(mark); delete mark; }; - for (const DiagnosticMessage &diagnostic : qAsConst(info.semanticMessages)) { + for (const DiagnosticMessage &diagnostic : std::as_const(info.semanticMessages)) { auto mark = new QmlJSTextMark(q->filePath(), diagnostic, onMarkRemoved); m_semanticMarks.append(mark); q->addMark(mark); } - for (const QmlJS::StaticAnalysis::Message &message : qAsConst(info.staticAnalysisMessages)) { + for (const QmlJS::StaticAnalysis::Message &message : std::as_const(info.staticAnalysisMessages)) { auto mark = new QmlJSTextMark(q->filePath(), message, onMarkRemoved); m_semanticMarks.append(mark); diff --git a/src/plugins/qmljseditor/qmljsfindreferences.cpp b/src/plugins/qmljseditor/qmljsfindreferences.cpp index 4a58d6f2634..af4461b34a1 100644 --- a/src/plugins/qmljseditor/qmljsfindreferences.cpp +++ b/src/plugins/qmljseditor/qmljsfindreferences.cpp @@ -879,7 +879,7 @@ static void find_helper(QFutureInterface &future, replacement = name; Utils::FilePaths files; - for (const Document::Ptr &doc : qAsConst(snapshot)) { + for (const Document::Ptr &doc : std::as_const(snapshot)) { // ### skip files that don't contain the name token files.append(modelManager->fileToSource(doc->fileName())); } @@ -965,7 +965,7 @@ QList FindReferences::findUsageOfType(const Utils::FilePa QmlJS::Snapshot snapshot = modelManager->snapshot(); QSet docDone; - for (const QmlJS::Document::Ptr &doc : qAsConst(snapshot)) { + for (const QmlJS::Document::Ptr &doc : std::as_const(snapshot)) { Utils::FilePath sourceFile = modelManager->fileToSource(doc->fileName()); if (docDone.contains(sourceFile)) continue; diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp index 696668df9ea..a8ce6a5b020 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.cpp +++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp @@ -378,7 +378,7 @@ bool QmlOutlineModel::dropMimeData(const QMimeData *data, Qt::DropAction action, stream >> rowPath; QModelIndex index; - for (int row : qAsConst(rowPath)) { + for (int row : std::as_const(rowPath)) { index = this->index(row, 0, index); if (!index.isValid()) continue; @@ -860,7 +860,7 @@ void QmlOutlineModel::reparentNodes(QmlOutlineItem *targetItem, int row, QListfileName()); file->setChangeSet(changeSet); - for (const Utils::ChangeSet::Range &range : qAsConst(changedRanges)) { + for (const Utils::ChangeSet::Range &range : std::as_const(changedRanges)) { file->appendIndentRange(range); } file->apply(); diff --git a/src/plugins/qmljseditor/qmltaskmanager.cpp b/src/plugins/qmljseditor/qmltaskmanager.cpp index 5e077ccc3cf..a5c89a946e6 100644 --- a/src/plugins/qmljseditor/qmltaskmanager.cpp +++ b/src/plugins/qmljseditor/qmltaskmanager.cpp @@ -71,7 +71,7 @@ void QmlTaskManager::collectMessages(QFutureInterface &future context = link(&linkMessages); } - for (const Utils::FilePath &fileName : qAsConst(info.sourceFiles)) { + for (const Utils::FilePath &fileName : std::as_const(info.sourceFiles)) { Document::Ptr document = snapshot.document(fileName); if (!document) continue; diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp index af8c9117238..19fc3aa4a67 100644 --- a/src/plugins/qmljstools/qmljsmodelmanager.cpp +++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp @@ -74,7 +74,7 @@ static void setupProjectInfoQmlBundles(ModelManagerInterface::ProjectInfo &proje for (const Target *t : targets) currentKits.insert(t->kit()); currentKits.remove(activeKit); - for (Kit *kit : qAsConst(currentKits)) { + for (Kit *kit : std::as_const(currentKits)) { for (IBundleProvider *bp : IBundleProvider::allBundleProviders()) bp->mergeBundlesForKit(kit, projectInfo.extendedBundle, replacements); } diff --git a/src/plugins/qmljstools/qmljssemanticinfo.cpp b/src/plugins/qmljstools/qmljssemanticinfo.cpp index eb5f9da25f7..4bc48b4af8e 100644 --- a/src/plugins/qmljstools/qmljssemanticinfo.cpp +++ b/src/plugins/qmljstools/qmljssemanticinfo.cpp @@ -169,7 +169,7 @@ QList SemanticInfo::rangePath(int cursorPosition) const { QList path; - for (const Range &range : qAsConst(ranges)) { + for (const Range &range : std::as_const(ranges)) { if (range.begin.isNull() || range.end.isNull()) continue; else if (cursorPosition >= range.begin.position() && cursorPosition <= range.end.position()) diff --git a/src/plugins/qmlprofiler/flamegraphmodel.cpp b/src/plugins/qmlprofiler/flamegraphmodel.cpp index 87b5947d89f..e9de9823c28 100644 --- a/src/plugins/qmlprofiler/flamegraphmodel.cpp +++ b/src/plugins/qmlprofiler/flamegraphmodel.cpp @@ -118,7 +118,7 @@ void FlameGraphModel::loadEvent(const QmlEvent &event, const QmlEventType &type) void FlameGraphModel::finalize() { - for (FlameGraphData *child : qAsConst(m_stackBottom.children)) + for (FlameGraphData *child : std::as_const(m_stackBottom.children)) m_stackBottom.duration += child->duration; loadNotes(-1, false); diff --git a/src/plugins/qmlprofiler/pixmapcachemodel.cpp b/src/plugins/qmlprofiler/pixmapcachemodel.cpp index 24ecf32f289..df1ae7fee50 100644 --- a/src/plugins/qmlprofiler/pixmapcachemodel.cpp +++ b/src/plugins/qmlprofiler/pixmapcachemodel.cpp @@ -411,7 +411,7 @@ QString PixmapCacheModel::fileName(int index) const void PixmapCacheModel::computeMaxCacheSize() { - for (const PixmapCacheModel::Item &event : qAsConst(m_data)) { + for (const PixmapCacheModel::Item &event : std::as_const(m_data)) { if (event.pixmapEventType == PixmapCacheModel::PixmapCacheCountChanged) { if (event.cacheSize > m_maxCacheSize) m_maxCacheSize = event.cacheSize; diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp index 90619b61258..9dadf4ae37d 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp @@ -390,7 +390,7 @@ QmlProfilerModelManager::rangeFilter(qint64 rangeStart, qint64 rangeEnd) const } } else { if (!crossedRangeStart) { - for (auto stashed : qAsConst(stack)) { + for (auto stashed : std::as_const(stack)) { stashed.setTimestamp(rangeStart); loader(stashed, eventType(stashed.typeIndex())); } diff --git a/src/plugins/qmlprofiler/qmlprofilertextmark.cpp b/src/plugins/qmlprofiler/qmlprofilertextmark.cpp index 776e095cca5..c35a18a8926 100644 --- a/src/plugins/qmlprofiler/qmlprofilertextmark.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertextmark.cpp @@ -94,13 +94,13 @@ void QmlProfilerTextMarkModel::createMarks(QmlProfilerViewManager *viewManager, void QmlProfilerTextMarkModel::showTextMarks() { - for (QmlProfilerTextMark *mark : qAsConst(m_marks)) + for (QmlProfilerTextMark *mark : std::as_const(m_marks)) mark->setVisible(true); } void QmlProfilerTextMarkModel::hideTextMarks() { - for (QmlProfilerTextMark *mark : qAsConst(m_marks)) + for (QmlProfilerTextMark *mark : std::as_const(m_marks)) mark->setVisible(false); } diff --git a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp index 3b2a9df9924..2647e342822 100644 --- a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp +++ b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp @@ -203,7 +203,7 @@ void FileFilterBaseItem::updateFileListNow() QSet dirsToBeWatched; QSet newFiles; - for (const QString &explicitPath : qAsConst(m_explicitFiles)) + for (const QString &explicitPath : std::as_const(m_explicitFiles)) newFiles << absolutePath(explicitPath); if ((!m_fileSuffixes.isEmpty() || !m_regExpList.isEmpty()) && m_explicitFiles.isEmpty()) @@ -236,12 +236,12 @@ void FileFilterBaseItem::updateFileListNow() bool FileFilterBaseItem::fileMatches(const QString &fileName) const { - for (const QString &suffix : qAsConst(m_fileSuffixes)) { + for (const QString &suffix : std::as_const(m_fileSuffixes)) { if (fileName.endsWith(suffix, Qt::CaseInsensitive)) return true; } - for (const QRegularExpression &filter : qAsConst(m_regExpList)) { + for (const QRegularExpression &filter : std::as_const(m_regExpList)) { if (filter.match(fileName).hasMatch()) return true; } @@ -279,7 +279,7 @@ ImageFileFilterItem::ImageFileFilterItem(QObject *parent) QList extensions = QImageReader::supportedImageFormats(); extensions.append("hdr"); extensions.append("ktx"); - for (const QByteArray &extension : qAsConst(extensions)) + for (const QByteArray &extension : std::as_const(extensions)) filter.append(QString::fromLatin1("*.%1;").arg(QString::fromLatin1(extension))); setFilter(filter); } diff --git a/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp b/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp index 20ea980a279..76a08172401 100644 --- a/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp +++ b/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp @@ -110,7 +110,7 @@ void QmlMainFileAspect::updateFileComboBox() // make paths relative to project directory QStringList relativeFiles; - for (const QString &fn : qAsConst(sortedFiles)) + for (const QString &fn : std::as_const(sortedFiles)) relativeFiles += projectDir.relativeFilePath(fn); sortedFiles = relativeFiles; @@ -120,7 +120,7 @@ void QmlMainFileAspect::updateFileComboBox() if (mainScriptSource() != FileInEditor) mainScriptPath = projectDir.relativeFilePath(mainScript()); - for (const QString &fn : qAsConst(sortedFiles)) { + for (const QString &fn : std::as_const(sortedFiles)) { QFileInfo fileInfo(fn); if (fileInfo.suffix() != "qml") continue; diff --git a/src/plugins/qnx/qnxconfiguration.cpp b/src/plugins/qnx/qnxconfiguration.cpp index b17c240a469..84ba0baa488 100644 --- a/src/plugins/qnx/qnxconfiguration.cpp +++ b/src/plugins/qnx/qnxconfiguration.cpp @@ -219,7 +219,7 @@ QList QnxConfiguration::autoDetect(const QList &alread { QList result; - for (const Target &target : qAsConst(m_targets)) + for (const Target &target : std::as_const(m_targets)) result += findToolChain(alreadyKnown, target.m_abi); return result; diff --git a/src/plugins/qnx/qnxconfigurationmanager.cpp b/src/plugins/qnx/qnxconfigurationmanager.cpp index e26641d9dde..d5be8267bdc 100644 --- a/src/plugins/qnx/qnxconfigurationmanager.cpp +++ b/src/plugins/qnx/qnxconfigurationmanager.cpp @@ -64,7 +64,7 @@ bool QnxConfigurationManager::addConfiguration(QnxConfiguration *config) if (!config || !config->isValid()) return false; - for (QnxConfiguration *c : qAsConst(m_configurations)) { + for (QnxConfiguration *c : std::as_const(m_configurations)) { if (c->envFile() == config->envFile()) return false; } @@ -90,7 +90,7 @@ void QnxConfigurationManager::saveConfigs() QVariantMap data; data.insert(QLatin1String(QNXConfigsFileVersionKey), 1); int count = 0; - for (QnxConfiguration *config : qAsConst(m_configurations)) { + for (QnxConfiguration *config : std::as_const(m_configurations)) { QVariantMap tmp = config->toMap(); if (tmp.isEmpty()) continue; diff --git a/src/plugins/qnx/qnxdeviceprocesslist.cpp b/src/plugins/qnx/qnxdeviceprocesslist.cpp index 3f6c885a663..ac2971334bf 100644 --- a/src/plugins/qnx/qnxdeviceprocesslist.cpp +++ b/src/plugins/qnx/qnxdeviceprocesslist.cpp @@ -36,7 +36,7 @@ QList QnxDeviceProcessList::buildProcessList(const QString &listPro lines.pop_front(); // drop headers const QRegularExpression re("\\s*(\\d+)\\s+(.*){(.*)}"); - for (const QString &line : qAsConst(lines)) { + for (const QString &line : std::as_const(lines)) { const QRegularExpressionMatch match = re.match(line); if (match.hasMatch()) { const QStringList captures = match.capturedTexts(); diff --git a/src/plugins/qnx/qnxqtversion.cpp b/src/plugins/qnx/qnxqtversion.cpp index 02228170f9d..d68c667a792 100644 --- a/src/plugins/qnx/qnxqtversion.cpp +++ b/src/plugins/qnx/qnxqtversion.cpp @@ -80,7 +80,7 @@ QString QnxQtVersion::qnxHost() const if (!m_environmentUpToDate) updateEnvironment(); - for (const EnvironmentItem &item : qAsConst(m_qnxEnv)) { + for (const EnvironmentItem &item : std::as_const(m_qnxEnv)) { if (item.name == QLatin1String(QNX_HOST_KEY)) return item.value; } diff --git a/src/plugins/qnx/qnxsettingspage.cpp b/src/plugins/qnx/qnxsettingspage.cpp index f6a29eddf09..35253ba956c 100644 --- a/src/plugins/qnx/qnxsettingspage.cpp +++ b/src/plugins/qnx/qnxsettingspage.cpp @@ -223,7 +223,7 @@ void QnxSettingsWidget::setConfigState(QnxConfiguration *config, State state) break; } - for (const ConfigState &configState : qAsConst(m_changedConfigs)) { + for (const ConfigState &configState : std::as_const(m_changedConfigs)) { if (configState.config == config && configState.state == stateToRemove) m_changedConfigs.removeAll(configState); } @@ -233,7 +233,7 @@ void QnxSettingsWidget::setConfigState(QnxConfiguration *config, State state) void QnxSettingsWidget::apply() { - for (const ConfigState &configState : qAsConst(m_changedConfigs)) { + for (const ConfigState &configState : std::as_const(m_changedConfigs)) { switch (configState.state) { case Activated : configState.config->activate(); diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 209376d7456..d550d4c9ccf 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -1048,7 +1048,7 @@ FilePath QtVersionPrivate::findHostBinary(HostBinaries binary) const default: Q_ASSERT(false); } - for (const QString &possibleCommand : qAsConst(possibleCommands)) { + for (const QString &possibleCommand : std::as_const(possibleCommands)) { const FilePath fullPath = baseDir / possibleCommand; if (fullPath.isExecutableFile()) return fullPath; @@ -2341,7 +2341,7 @@ QtVersion *QtVersionFactory::create() const QtVersion *QtVersion::clone() const { - for (QtVersionFactory *factory : qAsConst(g_qtVersionFactories)) { + for (QtVersionFactory *factory : std::as_const(g_qtVersionFactories)) { if (factory->m_supportedType == d->m_type) { QtVersion *version = factory->create(); QTC_ASSERT(version, return nullptr); diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index dd39525d878..c00b5a846c2 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -242,7 +242,7 @@ void QtVersionManager::updateFromInstaller(bool emitSignal) if (log().isDebugEnabled()) { qCDebug(log) << "======= Existing Qt versions ======="; - for (QtVersion *version : qAsConst(m_versions)) { + for (QtVersion *version : std::as_const(m_versions)) { qCDebug(log) << version->qmakeFilePath().toUserOutput() << "id:"<uniqueId(); qCDebug(log) << " autodetection source:" << version->detectionSource(); qCDebug(log) << ""; @@ -318,7 +318,7 @@ void QtVersionManager::updateFromInstaller(bool emitSignal) if (log().isDebugEnabled()) { qCDebug(log) << "======= Before removing outdated sdk versions ======="; - for (QtVersion *version : qAsConst(m_versions)) { + for (QtVersion *version : std::as_const(m_versions)) { qCDebug(log) << version->qmakeFilePath().toUserOutput() << "id:" << version->uniqueId(); qCDebug(log) << " autodetection source:" << version->detectionSource(); qCDebug(log) << ""; @@ -337,7 +337,7 @@ void QtVersionManager::updateFromInstaller(bool emitSignal) if (log().isDebugEnabled()) { qCDebug(log)<< "======= End result ======="; - for (QtVersion *version : qAsConst(m_versions)) { + for (QtVersion *version : std::as_const(m_versions)) { qCDebug(log) << version->qmakeFilePath().toUserOutput() << "id:" << version->uniqueId(); qCDebug(log) << " autodetection source:" << version->detectionSource(); qCDebug(log) << ""; @@ -356,7 +356,7 @@ static void saveQtVersions() data.insert(QTVERSION_FILE_VERSION_KEY, 1); int count = 0; - for (QtVersion *qtv : qAsConst(m_versions)) { + for (QtVersion *qtv : std::as_const(m_versions)) { QVariantMap tmp = qtv->toMap(); if (tmp.isEmpty()) continue; @@ -417,7 +417,7 @@ static void findSystemQt() FilePaths systemQMakes = BuildableHelperLibrary::findQtsInEnvironment(Environment::systemEnvironment()); systemQMakes.append(gatherQmakePathsFromQtChooser()); - for (const FilePath &qmakePath : qAsConst(systemQMakes)) { + for (const FilePath &qmakePath : std::as_const(systemQMakes)) { if (BuildableHelperLibrary::isQtChooser(qmakePath)) continue; const auto isSameQmake = [qmakePath](const QtVersion *version) { diff --git a/src/plugins/qtsupport/translationwizardpage.cpp b/src/plugins/qtsupport/translationwizardpage.cpp index 2e735ab12b3..224b14dfac3 100644 --- a/src/plugins/qtsupport/translationwizardpage.cpp +++ b/src/plugins/qtsupport/translationwizardpage.cpp @@ -92,7 +92,7 @@ TranslationWizardPage::TranslationWizardPage(const QString &enabledExpr) return l1.first < l2.first; }); localeStrings.erase(std::unique(localeStrings.begin(), localeStrings.end()), localeStrings.end()); - for (const LocalePair &lp : qAsConst(localeStrings)) + for (const LocalePair &lp : std::as_const(localeStrings)) m_languageComboBox.addItem(lp.first, lp.second); formLayout->addRow(Tr::tr("Language:"), &m_languageComboBox); const auto fileNameLayout = new QHBoxLayout; diff --git a/src/plugins/remotelinux/genericdirectuploadservice.cpp b/src/plugins/remotelinux/genericdirectuploadservice.cpp index c7230005860..f109c2e5388 100644 --- a/src/plugins/remotelinux/genericdirectuploadservice.cpp +++ b/src/plugins/remotelinux/genericdirectuploadservice.cpp @@ -278,7 +278,7 @@ void GenericDirectUploadService::uploadFiles() } emit progressMessage(Tr::tr("%n file(s) need to be uploaded.", "", d->filesToUpload.size())); FilesToTransfer files; - for (const DeployableFile &file : qAsConst(d->filesToUpload)) { + for (const DeployableFile &file : std::as_const(d->filesToUpload)) { if (!file.localFilePath().exists()) { const QString message = Tr::tr("Local file \"%1\" does not exist.") .arg(file.localFilePath().toUserOutput()); @@ -305,7 +305,7 @@ void GenericDirectUploadService::chmod() QTC_ASSERT(d->state == PostProcessing, return); if (!Utils::HostOsInfo::isWindowsHost()) return; - for (const DeployableFile &f : qAsConst(d->filesToUpload)) { + for (const DeployableFile &f : std::as_const(d->filesToUpload)) { if (!f.isExecutable()) continue; QtcProcess * const chmodProc = new QtcProcess(this); diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index e137a420035..9b5d9c78f7a 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -833,7 +833,7 @@ public: // If displayless sshParameters don't match the old connections' sshParameters, then stale // old connections (don't delete, as the last deref() to each one will delete them). - for (SshSharedConnection *connection : qAsConst(m_connections)) + for (SshSharedConnection *connection : std::as_const(m_connections)) connection->makeStale(); m_connections.clear(); m_displaylessSshParameters = displaylessSshParameters; @@ -847,7 +847,7 @@ public: SshSharedConnection *matchingConnection = nullptr; // Find the matching connection - for (SshSharedConnection *connection : qAsConst(m_connections)) { + for (SshSharedConnection *connection : std::as_const(m_connections)) { if (connection->sshParameters() == sshParameters) { matchingConnection = connection; break; diff --git a/src/plugins/remotelinux/rsyncdeploystep.cpp b/src/plugins/remotelinux/rsyncdeploystep.cpp index 363ed7f7189..29985a1c3f6 100644 --- a/src/plugins/remotelinux/rsyncdeploystep.cpp +++ b/src/plugins/remotelinux/rsyncdeploystep.cpp @@ -109,7 +109,7 @@ void RsyncDeployService::doDeploy() void RsyncDeployService::createRemoteDirectories() { QStringList remoteDirs; - for (const FileToTransfer &file : qAsConst(m_files)) + for (const FileToTransfer &file : std::as_const(m_files)) remoteDirs << file.m_target.parentDir().path(); remoteDirs.sort(); remoteDirs.removeDuplicates(); diff --git a/src/plugins/remotelinux/tarpackagecreationstep.cpp b/src/plugins/remotelinux/tarpackagecreationstep.cpp index ca9c0001a2a..9255c2e2287 100644 --- a/src/plugins/remotelinux/tarpackagecreationstep.cpp +++ b/src/plugins/remotelinux/tarpackagecreationstep.cpp @@ -189,7 +189,7 @@ void TarPackageCreationStep::deployFinished(bool success) const Kit *kit = target()->kit(); // Store files that have been tar'd and successfully deployed - for (const DeployableFile &file : qAsConst(m_files)) + for (const DeployableFile &file : std::as_const(m_files)) m_deployTimes.saveDeploymentTimeStamp(file, kit, QDateTime()); } @@ -267,7 +267,7 @@ bool TarPackageCreationStep::doPackage() return false; } - for (const DeployableFile &d : qAsConst(m_files)) { + for (const DeployableFile &d : std::as_const(m_files)) { if (d.remoteDirectory().isEmpty()) { emit addOutput(Tr::tr("No remote path specified for file \"%1\", skipping.") .arg(d.localFilePath().toUserOutput()), OutputFormat::ErrorMessage); diff --git a/src/plugins/resourceeditor/qrceditor/resourcefile.cpp b/src/plugins/resourceeditor/qrceditor/resourcefile.cpp index a937ce16740..04f55ec7d03 100644 --- a/src/plugins/resourceeditor/qrceditor/resourcefile.cpp +++ b/src/plugins/resourceeditor/qrceditor/resourcefile.cpp @@ -432,7 +432,7 @@ QString ResourceFile::absolutePath(const QString &rel_path) const void ResourceFile::orderList() { - for (Prefix *p : qAsConst(m_prefix_list)) { + for (Prefix *p : std::as_const(m_prefix_list)) { std::sort(p->file_list.begin(), p->file_list.end(), [&](File *f1, File *f2) { return *f1 < *f2; }); diff --git a/src/plugins/resourceeditor/resourceeditorplugin.cpp b/src/plugins/resourceeditor/resourceeditorplugin.cpp index 50686c094aa..ddfaa7d27a4 100644 --- a/src/plugins/resourceeditor/resourceeditorplugin.cpp +++ b/src/plugins/resourceeditor/resourceeditorplugin.cpp @@ -234,7 +234,7 @@ void ResourceEditorPlugin::extensionsInitialized() }, {}, [](const FolderNode *fn) { return dynamic_cast(fn) == nullptr; }); - for (FileNode *file : qAsConst(toReplace)) { + for (FileNode *file : std::as_const(toReplace)) { FolderNode *const pn = file->parentFolderNode(); QTC_ASSERT(pn, continue); const Utils::FilePath path = file->filePath(); diff --git a/src/plugins/scxmleditor/common/structure.cpp b/src/plugins/scxmleditor/common/structure.cpp index bf098c9ab30..5bfc51dfaf6 100644 --- a/src/plugins/scxmleditor/common/structure.cpp +++ b/src/plugins/scxmleditor/common/structure.cpp @@ -133,7 +133,7 @@ void Structure::addCheckbox(const QString &name, TagType type) void Structure::updateCheckBoxes() { QVector visibleTags; - for (QCheckBox *box : qAsConst(m_checkboxes)) { + for (QCheckBox *box : std::as_const(m_checkboxes)) { if (box->isChecked()) { switch (TagType(box->property(Constants::C_SCXMLTAG_TAGTYPE).toInt())) { case State: diff --git a/src/plugins/scxmleditor/outputpane/warningmodel.cpp b/src/plugins/scxmleditor/outputpane/warningmodel.cpp index e88b0f234be..3339af067db 100644 --- a/src/plugins/scxmleditor/outputpane/warningmodel.cpp +++ b/src/plugins/scxmleditor/outputpane/warningmodel.cpp @@ -37,7 +37,7 @@ void WarningModel::clear(bool sendSignal) { emit modelAboutToBeClear(); - for (Warning *w : qAsConst(m_warnings)) + for (Warning *w : std::as_const(m_warnings)) w->disconnect(this); beginResetModel(); diff --git a/src/plugins/scxmleditor/plugin_interface/connectableitem.cpp b/src/plugins/scxmleditor/plugin_interface/connectableitem.cpp index 88dec58eaad..f00948cb21d 100644 --- a/src/plugins/scxmleditor/plugin_interface/connectableitem.cpp +++ b/src/plugins/scxmleditor/plugin_interface/connectableitem.cpp @@ -270,7 +270,7 @@ void ConnectableItem::removeInputTransition(TransitionItem *transition) void ConnectableItem::updateInputTransitions() { - for (TransitionItem *transition : qAsConst(m_inputTransitions)) { + for (TransitionItem *transition : std::as_const(m_inputTransitions)) { transition->updateComponents(); transition->updateUIProperties(); } @@ -279,7 +279,7 @@ void ConnectableItem::updateInputTransitions() void ConnectableItem::updateOutputTransitions() { - for (TransitionItem *transition : qAsConst(m_outputTransitions)) { + for (TransitionItem *transition : std::as_const(m_outputTransitions)) { transition->updateComponents(); transition->updateUIProperties(); } @@ -303,10 +303,10 @@ void ConnectableItem::updateTransitions(bool allChildren) void ConnectableItem::updateTransitionAttributes(bool allChildren) { - for (TransitionItem *transition : qAsConst(m_outputTransitions)) + for (TransitionItem *transition : std::as_const(m_outputTransitions)) transition->updateTarget(); - for (TransitionItem *transition : qAsConst(m_inputTransitions)) + for (TransitionItem *transition : std::as_const(m_inputTransitions)) transition->updateTarget(); if (allChildren) { @@ -333,7 +333,7 @@ QPointF ConnectableItem::getInternalPosition(const TransitionItem *transition, T int ind = 0; if (type == TransitionItem::InternalNoTarget) { - for (TransitionItem *item : qAsConst(m_outputTransitions)) { + for (TransitionItem *item : std::as_const(m_outputTransitions)) { if (item->targetType() == TransitionItem::InternalSameTarget) ind++; } @@ -565,7 +565,7 @@ void ConnectableItem::updateAttributes() { BaseItem::updateAttributes(); - for (TransitionItem *transition : qAsConst(m_inputTransitions)) { + for (TransitionItem *transition : std::as_const(m_inputTransitions)) { if (transition->isEndItem(this)) transition->setTagValue("target", itemId()); } @@ -681,7 +681,7 @@ void ConnectableItem::finalizeCreation() bool ConnectableItem::hasInputTransitions(const ConnectableItem *parentItem, bool checkChildren) const { - for (const TransitionItem *it : qAsConst(m_inputTransitions)) + for (const TransitionItem *it : std::as_const(m_inputTransitions)) if (!SceneUtils::isChild(parentItem, it->connectedItem(this))) return true; @@ -701,7 +701,7 @@ bool ConnectableItem::hasInputTransitions(const ConnectableItem *parentItem, boo bool ConnectableItem::hasOutputTransitions(const ConnectableItem *parentItem, bool checkChildren) const { - for (TransitionItem *it : qAsConst(m_outputTransitions)) + for (TransitionItem *it : std::as_const(m_outputTransitions)) if (!SceneUtils::isChild(parentItem, it->connectedItem(this))) return true; @@ -754,7 +754,7 @@ void ConnectableItem::checkOverlapping() } // Add new overlapped items - for (ConnectableItem *it : qAsConst(overlappedItems)) { + for (ConnectableItem *it : std::as_const(overlappedItems)) { if (!m_overlappedItems.contains(it)) { m_overlappedItems << it; it->addOverlappingItem(this); diff --git a/src/plugins/scxmleditor/plugin_interface/graphicsscene.cpp b/src/plugins/scxmleditor/plugin_interface/graphicsscene.cpp index 50edce3c12d..6a1f83a7f67 100644 --- a/src/plugins/scxmleditor/plugin_interface/graphicsscene.cpp +++ b/src/plugins/scxmleditor/plugin_interface/graphicsscene.cpp @@ -54,20 +54,20 @@ void GraphicsScene::unselectAll() void GraphicsScene::unhighlightAll() { - for (BaseItem *it : qAsConst(m_baseItems)) + for (BaseItem *it : std::as_const(m_baseItems)) it->setHighlight(false); } void GraphicsScene::highlightItems(const QVector &lstIds) { - for (BaseItem *it : qAsConst(m_baseItems)) + for (BaseItem *it : std::as_const(m_baseItems)) it->setHighlight(lstIds.contains(it->tag())); } QRectF GraphicsScene::selectedBoundingRect() const { QRectF r; - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected()) r = r.united(item->sceneBoundingRect()); } @@ -77,7 +77,7 @@ QRectF GraphicsScene::selectedBoundingRect() const qreal GraphicsScene::selectedMaxWidth() const { qreal maxw = 0; - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= InitialStateType) maxw = qMax(maxw, item->sceneBoundingRect().width()); } @@ -87,7 +87,7 @@ qreal GraphicsScene::selectedMaxWidth() const qreal GraphicsScene::selectedMaxHeight() const { qreal maxh = 0; - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= InitialStateType) maxh = qMax(maxh, item->sceneBoundingRect().height()); } @@ -103,37 +103,37 @@ void GraphicsScene::alignStates(int alignType) if (r.isValid()) { switch (alignType) { case ActionAlignLeft: - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= InitialStateType) item->moveStateBy(r.left() - item->sceneBoundingRect().left(), 0); } break; case ActionAlignRight: - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= InitialStateType) item->moveStateBy(r.right() - item->sceneBoundingRect().right(), 0); } break; case ActionAlignTop: - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= InitialStateType) item->moveStateBy(0, r.top() - item->sceneBoundingRect().top()); } break; case ActionAlignBottom: - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= InitialStateType) item->moveStateBy(0, r.bottom() - item->sceneBoundingRect().bottom()); } break; case ActionAlignHorizontal: - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= InitialStateType) item->moveStateBy(0, r.center().y() - item->sceneBoundingRect().center().y()); } break; case ActionAlignVertical: - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= InitialStateType) item->moveStateBy(r.center().x() - item->sceneBoundingRect().center().x(), 0); } @@ -154,7 +154,7 @@ void GraphicsScene::adjustStates(int adjustType) qreal maxw = selectedMaxWidth(); qreal maxh = selectedMaxHeight(); - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= InitialStateType) { QRectF rr = item->boundingRect(); if ((adjustType == ActionAdjustWidth || adjustType == ActionAdjustSize) && !qFuzzyCompare(rr.width(), maxw)) @@ -202,7 +202,7 @@ void GraphicsScene::copy() QVector tags; if (m_document->currentTag()->tagType() == Scxml) { QVector items; - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (!item->parentItem()) items << item; } @@ -220,7 +220,7 @@ void GraphicsScene::copy() mime->setText(QLatin1String(result)); mime->setData("StateChartEditor/StateData", result); QStringList strTypes; - for (const ScxmlTag *tag : qAsConst(tags)) + for (const ScxmlTag *tag : std::as_const(tags)) strTypes << tag->tagName(false); mime->setData("StateChartEditor/CopiedTagTypes", strTypes.join(",").toLocal8Bit()); @@ -246,7 +246,7 @@ void GraphicsScene::paste(const QPointF &targetPos) QPointF startPos(targetPos); BaseItem *targetItem = nullptr; - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= StateType) { targetItem = item; break; @@ -275,7 +275,7 @@ void GraphicsScene::paste(const QPointF &targetPos) void GraphicsScene::setEditorInfo(const QString &key, const QString &value) { - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected() && item->type() >= TransitionType) item->setEditorInfo(key, value); } @@ -350,7 +350,7 @@ void GraphicsScene::runLayoutToSelectedStates() m_document->undoStack()->beginMacro(Tr::tr("Re-layout")); QVector selectedItems; - for (BaseItem *node : qAsConst(m_baseItems)) { + for (BaseItem *node : std::as_const(m_baseItems)) { if (node->isSelected()) { int index = 0; for (int i = 0; i < selectedItems.count(); ++i) { @@ -370,19 +370,19 @@ void GraphicsScene::runLayoutToSelectedStates() // Layout scene items if necessary if (selectedItems.isEmpty()) { QList sceneItems; - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->type() >= InitialStateType && !item->parentItem()) sceneItems << item; } SceneUtils::layout(sceneItems); - for (QGraphicsItem *item : qAsConst(sceneItems)) + for (QGraphicsItem *item : std::as_const(sceneItems)) if (item->type() >= StateType) static_cast(item)->shrink(); } // Update properties - for (BaseItem *node : qAsConst(selectedItems)) + for (BaseItem *node : std::as_const(selectedItems)) node->updateUIProperties(); m_document->undoStack()->endMacro(); @@ -394,31 +394,31 @@ void GraphicsScene::runAutomaticLayout() // 1. Find max depth int maxDepth = 0; - for (BaseItem *node : qAsConst(m_baseItems)) { + for (BaseItem *node : std::as_const(m_baseItems)) { maxDepth = qMax(maxDepth, node->depth()); node->setBlockUpdates(true); } // 2. Layout every depth-level separately for (int d = (maxDepth + 1); d--;) { - for (BaseItem *node : qAsConst(m_baseItems)) + for (BaseItem *node : std::as_const(m_baseItems)) node->doLayout(d); } // 3. Layout scene items QList sceneItems; - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->type() >= InitialStateType && !item->parentItem()) sceneItems << item; } SceneUtils::layout(sceneItems); - for (QGraphicsItem *item : qAsConst(sceneItems)) { + for (QGraphicsItem *item : std::as_const(sceneItems)) { if (item->type() >= StateType) static_cast(item)->shrink(); } - for (BaseItem *node : qAsConst(m_baseItems)) { + for (BaseItem *node : std::as_const(m_baseItems)) { node->updateUIProperties(); node->setBlockUpdates(false); } @@ -445,21 +445,21 @@ void GraphicsScene::endTagChange(ScxmlDocument::TagChange change, ScxmlTag *tag, switch (change) { case ScxmlDocument::TagAttributesChanged: { - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->tag() == tag) item->updateAttributes(); } break; } case ScxmlDocument::TagEditorInfoChanged: { - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->tag() == tag) item->updateEditorInfo(); } break; } case ScxmlDocument::TagCurrentChanged: { - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (!item->isSelected() && item->tag() == tag) item->setSelected(true); } @@ -702,7 +702,7 @@ BaseItem *GraphicsScene::findItem(const ScxmlTag *tag) const if (!tag) return nullptr; - for (BaseItem *it : qAsConst(m_baseItems)) { + for (BaseItem *it : std::as_const(m_baseItems)) { if (it->tag() == tag) return it; } @@ -715,7 +715,7 @@ void GraphicsScene::removeItems(const ScxmlTag *tag) if (tag) { // Find right items QVector items; - for (BaseItem *it : qAsConst(m_baseItems)) { + for (BaseItem *it : std::as_const(m_baseItems)) { if (it->tag() == tag) items << it; } @@ -741,7 +741,7 @@ QPair GraphicsScene::checkSnapToItem(BaseItem *item, const QPointF & qreal diffY = 8; qreal diffYdX = 2000; - for (BaseItem *it : qAsConst(m_baseItems)) { + for (BaseItem *it : std::as_const(m_baseItems)) { if (!it->isSelected() && it != item && it->parentItem() == parentItem && it->type() >= InitialStateType) { QPointF c = it->sceneCenter(); qreal dX = qAbs(c.x() - p.x()); @@ -779,7 +779,7 @@ void GraphicsScene::selectionChanged(bool para) int baseCount = 0; int stateTypeCount = 0; - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->isSelected()) { if (item->type() >= TransitionType) baseCount++; @@ -825,7 +825,7 @@ void GraphicsScene::removeWarningItem(WarningItem *item) void GraphicsScene::warningVisibilityChanged(int type, WarningItem *item) { if (!m_autoLayoutRunning && !m_initializing) { - for (WarningItem *it : qAsConst(m_allWarnings)) + for (WarningItem *it : std::as_const(m_allWarnings)) if (it != item && (type == 0 || it->type() == type)) it->check(); } @@ -834,7 +834,7 @@ void GraphicsScene::warningVisibilityChanged(int type, WarningItem *item) ScxmlTag *GraphicsScene::tagByWarning(const ScxmlEditor::OutputPane::Warning *w) const { ScxmlTag *tag = nullptr; - for (WarningItem *it : qAsConst(m_allWarnings)) + for (WarningItem *it : std::as_const(m_allWarnings)) if (it->warning() == w) { tag = it->tag(); break; @@ -896,7 +896,7 @@ void GraphicsScene::removeChild(BaseItem *item) void GraphicsScene::checkItemsVisibility(double scaleFactor) { - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { item->checkVisibility(scaleFactor); } } @@ -905,7 +905,7 @@ void GraphicsScene::checkInitialState() { if (m_document) { QList sceneItems; - for (BaseItem *item : qAsConst(m_baseItems)) { + for (BaseItem *item : std::as_const(m_baseItems)) { if (item->type() >= InitialStateType && !item->parentItem()) sceneItems << item; } @@ -919,14 +919,14 @@ void GraphicsScene::checkInitialState() void GraphicsScene::clearAllTags() { - for (BaseItem *it : qAsConst(m_baseItems)) { + for (BaseItem *it : std::as_const(m_baseItems)) { it->setTag(nullptr); } } void GraphicsScene::setBlockUpdates(bool block) { - for (BaseItem *it : qAsConst(m_baseItems)) { + for (BaseItem *it : std::as_const(m_baseItems)) { it->setBlockUpdates(block); } } diff --git a/src/plugins/scxmleditor/plugin_interface/parallelitem.cpp b/src/plugins/scxmleditor/plugin_interface/parallelitem.cpp index 9ad154e730a..0c55a26ce24 100644 --- a/src/plugins/scxmleditor/plugin_interface/parallelitem.cpp +++ b/src/plugins/scxmleditor/plugin_interface/parallelitem.cpp @@ -51,16 +51,16 @@ void ParallelItem::doLayout(int d) } // 2. Adjust sizes - for (StateItem *itt : qAsConst(children)) + for (StateItem *itt : std::as_const(children)) itt->shrink(); qreal maxw = 0; - for (StateItem *itt : qAsConst(children)) { + for (StateItem *itt : std::as_const(children)) { QRectF rr = itt->boundingRect(); maxw = qMax(rr.width(), maxw); } - for (StateItem *itt : qAsConst(children)) { + for (StateItem *itt : std::as_const(children)) { QRectF rr = itt->boundingRect(); if (!qFuzzyCompare(rr.width(), maxw)) rr.setWidth(maxw); diff --git a/src/plugins/scxmleditor/plugin_interface/sceneutils.cpp b/src/plugins/scxmleditor/plugin_interface/sceneutils.cpp index 6441f8ffc2a..6facac57d07 100644 --- a/src/plugins/scxmleditor/plugin_interface/sceneutils.cpp +++ b/src/plugins/scxmleditor/plugin_interface/sceneutils.cpp @@ -295,7 +295,7 @@ void layout(const QList &items) } // Finally set initial and final positions - for (ConnectableItem *item : qAsConst(childItems)) { + for (ConnectableItem *item : std::as_const(childItems)) { if (item == firstItem) initialItem->setPos(firstItem->pos() + firstItem->boundingRect().topLeft() - QPointF(50, 50)); diff --git a/src/plugins/scxmleditor/plugin_interface/sceneutils.h b/src/plugins/scxmleditor/plugin_interface/sceneutils.h index f6e58c3c47c..de1d3824206 100644 --- a/src/plugins/scxmleditor/plugin_interface/sceneutils.h +++ b/src/plugins/scxmleditor/plugin_interface/sceneutils.h @@ -54,7 +54,7 @@ bool hasSiblingStates(T *item) children << it; } - for (QGraphicsItem *it : qAsConst(children)) + for (QGraphicsItem *it : std::as_const(children)) if (it != item && it->type() == item->type()) return true; } diff --git a/src/plugins/scxmleditor/plugin_interface/scxmldocument.cpp b/src/plugins/scxmleditor/plugin_interface/scxmldocument.cpp index 1cfe0ba95ff..07bcf0b7050 100644 --- a/src/plugins/scxmleditor/plugin_interface/scxmldocument.cpp +++ b/src/plugins/scxmleditor/plugin_interface/scxmldocument.cpp @@ -112,7 +112,7 @@ void ScxmlDocument::addNamespace(ScxmlNamespace *ns) ScxmlTag *scxmlTag = scxmlRootTag(); if (scxmlTag) { - for (ScxmlNamespace *ns : qAsConst(m_namespaces)) { + for (ScxmlNamespace *ns : std::as_const(m_namespaces)) { QString prefix = ns->prefix(); if (prefix.isEmpty()) prefix = "xmlns"; @@ -149,7 +149,7 @@ bool ScxmlDocument::generateSCXML(QIODevice *io, ScxmlTag *tag) const ScxmlTag *ScxmlDocument::createScxmlTag() { auto tag = new ScxmlTag(Scxml, this); - for (ScxmlNamespace *ns : qAsConst(m_namespaces)) { + for (ScxmlNamespace *ns : std::as_const(m_namespaces)) { QString prefix = ns->prefix(); if (prefix.isEmpty()) prefix = "xmlns"; @@ -291,7 +291,7 @@ bool ScxmlDocument::pasteData(const QByteArray &data, const QPointF &minPos, con QBuffer buffer(&d); buffer.open(QIODevice::ReadOnly); QXmlStreamReader xml(&buffer); - for (ScxmlNamespace *ns : qAsConst(m_namespaces)) { + for (ScxmlNamespace *ns : std::as_const(m_namespaces)) { xml.addExtraNamespaceDeclaration(QXmlStreamNamespaceDeclaration(ns->prefix(), ns->name())); } @@ -576,7 +576,7 @@ QString ScxmlDocument::nextUniqueId(const QString &key) name = QString::fromLatin1("%1_%2").arg(key).arg(id); // Check duplicate - for (const ScxmlTag *tag : qAsConst(m_tags)) { + for (const ScxmlTag *tag : std::as_const(m_tags)) { if (tag->attribute("id") == name) { bFound = true; break; @@ -598,7 +598,7 @@ QString ScxmlDocument::getUniqueCopyId(const ScxmlTag *tag) while (true) { bFound = false; // Check duplicate - for (const ScxmlTag *t : qAsConst(m_tags)) { + for (const ScxmlTag *t : std::as_const(m_tags)) { if (t->attribute("id") == name && t != tag) { name = QString::fromLatin1("%1_Copy%2").arg(key).arg(counter); bFound = true; diff --git a/src/plugins/scxmleditor/plugin_interface/scxmltag.cpp b/src/plugins/scxmleditor/plugin_interface/scxmltag.cpp index e982f275c0d..283c07fa6d9 100644 --- a/src/plugins/scxmleditor/plugin_interface/scxmltag.cpp +++ b/src/plugins/scxmleditor/plugin_interface/scxmltag.cpp @@ -251,7 +251,7 @@ bool ScxmlTag::hasData() const if (!m_attributeNames.isEmpty() || !m_content.isEmpty()) return true; - for (ScxmlTag *tag : qAsConst(m_childTags)) { + for (ScxmlTag *tag : std::as_const(m_childTags)) { if (tag->hasData()) return true; } @@ -261,7 +261,7 @@ bool ScxmlTag::hasData() const bool ScxmlTag::hasChild(TagType type) const { - for (ScxmlTag *tag : qAsConst(m_childTags)) { + for (ScxmlTag *tag : std::as_const(m_childTags)) { if (tag->tagType() == type) return true; } @@ -271,7 +271,7 @@ bool ScxmlTag::hasChild(TagType type) const bool ScxmlTag::hasChild(const QString &name) const { - for (ScxmlTag *tag : qAsConst(m_childTags)) { + for (ScxmlTag *tag : std::as_const(m_childTags)) { if (tag->tagName() == name) return true; } @@ -484,7 +484,7 @@ QVector ScxmlTag::allChildren() const QVector ScxmlTag::children(const QString &name) const { QVector children; - for (ScxmlTag *tag : qAsConst(m_childTags)) { + for (ScxmlTag *tag : std::as_const(m_childTags)) { if (tag->tagName() == name) children << tag; } @@ -494,7 +494,7 @@ QVector ScxmlTag::children(const QString &name) const ScxmlTag *ScxmlTag::child(const QString &name) const { - for (ScxmlTag *tag : qAsConst(m_childTags)) { + for (ScxmlTag *tag : std::as_const(m_childTags)) { if (tag->tagName() == name) return tag; } diff --git a/src/plugins/scxmleditor/plugin_interface/scxmltagutils.cpp b/src/plugins/scxmleditor/plugin_interface/scxmltagutils.cpp index cd2f44c2554..343352d11aa 100644 --- a/src/plugins/scxmleditor/plugin_interface/scxmltagutils.cpp +++ b/src/plugins/scxmleditor/plugin_interface/scxmltagutils.cpp @@ -36,7 +36,7 @@ bool checkPaste(const QString &copiedTagTypes, const ScxmlTag *currentTag) return false; QVector childTags = allowedChildTypes(currentTag->tagType()); - for (const TagType &type : qAsConst(tagTypes)) { + for (const TagType &type : std::as_const(tagTypes)) { if (!childTags.contains(type)) return false; } diff --git a/src/plugins/scxmleditor/scxmleditorstack.cpp b/src/plugins/scxmleditor/scxmleditorstack.cpp index 58d88fe8123..f8f2eb00efd 100644 --- a/src/plugins/scxmleditor/scxmleditorstack.cpp +++ b/src/plugins/scxmleditor/scxmleditorstack.cpp @@ -67,7 +67,7 @@ void ScxmlEditorStack::modeAboutToChange(Utils::Id m) { // Sync the editor when entering edit mode if (m == Core::Constants::MODE_EDIT) { - for (auto editor: qAsConst(m_editors)) + for (auto editor: std::as_const(m_editors)) if (auto document = qobject_cast(editor->textDocument())) document->syncXmlFromDesignWidget(); } diff --git a/src/plugins/serialterminal/serialterminalsettings.cpp b/src/plugins/serialterminal/serialterminalsettings.cpp index d0d03bf8046..348b81fe072 100644 --- a/src/plugins/serialterminal/serialterminalsettings.cpp +++ b/src/plugins/serialterminal/serialterminalsettings.cpp @@ -132,7 +132,7 @@ void Settings::saveLineEndings(QSettings &settings) { settings.beginWriteArray(Constants::SETTINGS_LINE_ENDINGS, lineEndings.size()); int i = 0; - for (const QPair& value : qAsConst(lineEndings)) { + for (const QPair& value : std::as_const(lineEndings)) { settings.setArrayIndex(i++); settings.setValue(Constants::SETTINGS_LINE_ENDING_NAME, value.first); settings.setValue(Constants::SETTINGS_LINE_ENDING_VALUE, value.second); diff --git a/src/plugins/silversearcher/findinfilessilversearcher.cpp b/src/plugins/silversearcher/findinfilessilversearcher.cpp index 9e78b731095..c5a55575410 100644 --- a/src/plugins/silversearcher/findinfilessilversearcher.cpp +++ b/src/plugins/silversearcher/findinfilessilversearcher.cpp @@ -92,11 +92,11 @@ void runSilverSeacher(FutureInterfaceType &fi, FileFindParameters parameters) if (!(parameters.flags & FindRegularExpression)) arguments << "-Q"; - for (const QString &filter : qAsConst(parameters.exclusionFilters)) + for (const QString &filter : std::as_const(parameters.exclusionFilters)) arguments << "--ignore" << filter; QString nameFiltersAsRegex; - for (const QString &filter : qAsConst(parameters.nameFilters)) + for (const QString &filter : std::as_const(parameters.nameFilters)) nameFiltersAsRegex += QString("(%1)|").arg(convertWildcardToRegex(filter)); nameFiltersAsRegex.remove(nameFiltersAsRegex.length() - 1, 1); diff --git a/src/plugins/squish/objectsmapdocument.cpp b/src/plugins/squish/objectsmapdocument.cpp index 8c3b286121b..31958ba3003 100644 --- a/src/plugins/squish/objectsmapdocument.cpp +++ b/src/plugins/squish/objectsmapdocument.cpp @@ -122,7 +122,7 @@ bool ObjectsMapDocument::buildObjectsMapTree(const QByteArray &contents) ObjectsMapTreeItem *root = new ObjectsMapTreeItem(QString()); QMap::iterator end = itemForName.end(); - for (ObjectsMapTreeItem *item : qAsConst(itemForName)) { + for (ObjectsMapTreeItem *item : std::as_const(itemForName)) { const QString &parentName = item->parentName(); auto parent = itemForName.find(parentName); if (parent != end) diff --git a/src/plugins/squish/objectsmaptreeitem.cpp b/src/plugins/squish/objectsmaptreeitem.cpp index ac4442c1cc2..4338181be3b 100644 --- a/src/plugins/squish/objectsmaptreeitem.cpp +++ b/src/plugins/squish/objectsmaptreeitem.cpp @@ -90,7 +90,7 @@ QByteArray ObjectsMapTreeItem::propertiesToByteArray() const [](const Property &lhs, const Property &rhs) { return lhs.m_name < rhs.m_name; }); result.append('{'); - for (const Property &property : qAsConst(properties)) + for (const Property &property : std::as_const(properties)) result.append(property.toString().toUtf8()).append(' '); if (result.at(result.size() - 1) == ' ') result.chop(1); diff --git a/src/plugins/squish/squishsettings.cpp b/src/plugins/squish/squishsettings.cpp index fd063510e14..93f37e9d70c 100644 --- a/src/plugins/squish/squishsettings.cpp +++ b/src/plugins/squish/squishsettings.cpp @@ -415,7 +415,7 @@ void SquishServerSettingsWidget::repopulateApplicationView() SquishServerItem *autPaths = new SquishServerItem(Tr::tr("AUT Paths")); m_model.rootItem()->appendChild(autPaths); - for (const QString &path : qAsConst(m_serverSettings.autPaths)) + for (const QString &path : std::as_const(m_serverSettings.autPaths)) autPaths->appendChild(new SquishServerItem(path, "")); SquishServerItem *attachable = new SquishServerItem(Tr::tr("Attachable AUTs")); @@ -593,11 +593,11 @@ QList SquishServerSettingsWidget::toConfigChangeArguments() const result.append({"addAttachableAUT", it.key(), it.value()}); } - for (auto &path : qAsConst(m_originalSettings.autPaths)) { + for (auto &path : std::as_const(m_originalSettings.autPaths)) { if (!m_serverSettings.autPaths.contains(path)) result.append({"removeAppPath", path}); } - for (auto &path : qAsConst(m_serverSettings.autPaths)) { + for (auto &path : std::as_const(m_serverSettings.autPaths)) { if (!m_originalSettings.autPaths.contains(path)) result.append({"addAppPath", path}); } diff --git a/src/plugins/squish/squishtools.cpp b/src/plugins/squish/squishtools.cpp index b671606e3da..ca0a4ba600e 100644 --- a/src/plugins/squish/squishtools.cpp +++ b/src/plugins/squish/squishtools.cpp @@ -1157,7 +1157,7 @@ void SquishTools::minimizeQtCreatorWindows() void SquishTools::restoreQtCreatorWindows() { - for (QWindow *window : qAsConst(m_lastTopLevelWindows)) { + for (QWindow *window : std::as_const(m_lastTopLevelWindows)) { window->raise(); window->requestActivate(); window->showNormal(); diff --git a/src/plugins/squish/squishxmloutputhandler.cpp b/src/plugins/squish/squishxmloutputhandler.cpp index b628f205162..4c70f6e8761 100644 --- a/src/plugins/squish/squishxmloutputhandler.cpp +++ b/src/plugins/squish/squishxmloutputhandler.cpp @@ -282,7 +282,7 @@ void SquishXmlOutputHandler::outputAvailable(const QByteArray &output) } if (!logDetailsList.isEmpty()) { - for (const QString &detail : qAsConst(logDetailsList)) { + for (const QString &detail : std::as_const(logDetailsList)) { TestResult childResult(Result::Detail, detail); SquishResultItem *childItem = new SquishResultItem(childResult); item->appendChild(childItem); diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index da5f67e68cd..798a7781c96 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -1019,7 +1019,7 @@ QString SubversionPluginPrivate::monitorFile(const FilePath &repository) const { QTC_ASSERT(!repository.isEmpty(), return QString()); QDir repoDir(repository.toString()); - for (const QString &svnDir : qAsConst(m_svnDirectories)) { + for (const QString &svnDir : std::as_const(m_svnDirectories)) { if (repoDir.exists(svnDir)) { QFileInfo fi(repoDir.absoluteFilePath(svnDir + QLatin1String("/wc.db"))); if (fi.exists() && fi.isFile()) diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index a225479c69d..12c635a119e 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -397,7 +397,7 @@ void BaseFileFind::writeCommonSettings(QSettings *settings) settings->setValue("currentExclusionFilter", QDir::fromNativeSeparators(d->m_exclusionCombo->currentText())); - for (const SearchEngine *searchEngine : qAsConst(d->m_searchEngines)) + for (const SearchEngine *searchEngine : std::as_const(d->m_searchEngines)) searchEngine->writeSettings(settings); settings->setValue("currentSearchEngineIndex", d->m_currentSearchEngineIndex); } @@ -429,7 +429,7 @@ void BaseFileFind::readCommonSettings(QSettings *settings, const QString &defaul if (d->m_exclusionCombo) syncComboWithSettings(d->m_exclusionCombo, d->m_exclusionSetting); - for (SearchEngine* searchEngine : qAsConst(d->m_searchEngines)) + for (SearchEngine* searchEngine : std::as_const(d->m_searchEngines)) searchEngine->readSettings(settings); const int currentSearchEngineIndex = settings->value("currentSearchEngineIndex", 0).toInt(); syncSearchEngineCombo(currentSearchEngineIndex); diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp index c5b6075e6ea..dcc2707212c 100644 --- a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp @@ -283,7 +283,7 @@ void GenericProposalModel::filter(const QString &prefix) m_currentItems.clear(); const QString lowerPrefix = prefix.toLower(); const bool checkInfix = prefix.size() >= 3; - for (const auto &item : qAsConst(m_originalItems)) { + for (const auto &item : std::as_const(m_originalItems)) { const QString &text = item->filterText(); // Direct match? diff --git a/src/plugins/texteditor/codecchooser.cpp b/src/plugins/texteditor/codecchooser.cpp index e856515c41d..ae4ad07f554 100644 --- a/src/plugins/texteditor/codecchooser.cpp +++ b/src/plugins/texteditor/codecchooser.cpp @@ -28,7 +28,7 @@ CodecChooser::CodecChooser(Filter filter) std::find_if(mibs.begin(), mibs.end(), [](int n) { return n >=0; }); if (firstNonNegative != mibs.end()) std::rotate(mibs.begin(), firstNonNegative, mibs.end()); - for (int mib : qAsConst(mibs)) { + for (int mib : std::as_const(mibs)) { if (filter == Filter::SingleByte && !isSingleByte(mib)) continue; if (QTextCodec *codec = QTextCodec::codecForMib(mib)) { diff --git a/src/plugins/texteditor/fontsettingspage.cpp b/src/plugins/texteditor/fontsettingspage.cpp index bf1500d5eed..560c3435503 100644 --- a/src/plugins/texteditor/fontsettingspage.cpp +++ b/src/plugins/texteditor/fontsettingspage.cpp @@ -702,7 +702,7 @@ void FontSettingsPageWidget::refreshColorSchemeList() int selected = 0; - for (const FilePath &file : qAsConst(schemeList)) { + for (const FilePath &file : std::as_const(schemeList)) { if (m_value.colorSchemeFileName() == file) selected = colorSchemes.size(); colorSchemes.append(ColorSchemeEntry(file, true)); diff --git a/src/plugins/texteditor/formattexteditor.cpp b/src/plugins/texteditor/formattexteditor.cpp index 9594d0d4f33..d602ff3d652 100644 --- a/src/plugins/texteditor/formattexteditor.cpp +++ b/src/plugins/texteditor/formattexteditor.cpp @@ -240,7 +240,7 @@ static void updateEditorText(QPlainTextEdit *editor, const QString &text) + absoluteVerticalCursorOffset / fontHeight); // Restore folded blocks const QTextDocument *doc = editor->document(); - for (int blockId : qAsConst(foldedBlocks)) { + for (int blockId : std::as_const(foldedBlocks)) { const QTextBlock block = doc->findBlockByNumber(qMax(0, blockId)); if (block.isValid()) TextDocumentLayout::doFoldOrUnfold(block, false); diff --git a/src/plugins/texteditor/outlinefactory.cpp b/src/plugins/texteditor/outlinefactory.cpp index 2c0c6a021de..dabf77e8b4c 100644 --- a/src/plugins/texteditor/outlinefactory.cpp +++ b/src/plugins/texteditor/outlinefactory.cpp @@ -166,7 +166,7 @@ void OutlineWidgetStack::updateEditor(Core::IEditor *editor) IOutlineWidget *newWidget = nullptr; if (editor) { - for (IOutlineWidgetFactory *widgetFactory : qAsConst(g_outlineWidgetFactories)) { + for (IOutlineWidgetFactory *widgetFactory : std::as_const(g_outlineWidgetFactories)) { if (widgetFactory->supportsEditor(editor)) { newWidget = widgetFactory->createWidget(editor); m_toggleSort->setVisible(widgetFactory->supportsSorting()); diff --git a/src/plugins/texteditor/refactoroverlay.cpp b/src/plugins/texteditor/refactoroverlay.cpp index a718d23be80..6626dbbcbf8 100644 --- a/src/plugins/texteditor/refactoroverlay.cpp +++ b/src/plugins/texteditor/refactoroverlay.cpp @@ -25,7 +25,7 @@ RefactorOverlay::RefactorOverlay(TextEditor::TextEditorWidget *editor) : void RefactorOverlay::paint(QPainter *painter, const QRect &clip) { m_maxWidth = 0; - for (auto &marker : qAsConst(m_markers)) { + for (auto &marker : std::as_const(m_markers)) { paintMarker(marker, painter, clip); } diff --git a/src/plugins/texteditor/snippets/snippetprovider.cpp b/src/plugins/texteditor/snippets/snippetprovider.cpp index 5dee0301c58..506276327a1 100644 --- a/src/plugins/texteditor/snippets/snippetprovider.cpp +++ b/src/plugins/texteditor/snippets/snippetprovider.cpp @@ -79,7 +79,7 @@ QString SnippetProvider::displayName() const */ void SnippetProvider::decorateEditor(TextEditorWidget *editor, const QString &groupId) { - for (const SnippetProvider &provider : qAsConst(g_snippetProviders)) { + for (const SnippetProvider &provider : std::as_const(g_snippetProviders)) { if (provider.m_groupId == groupId && provider.m_editorDecorator) provider.m_editorDecorator(editor); } diff --git a/src/plugins/texteditor/snippets/snippetscollection.cpp b/src/plugins/texteditor/snippets/snippetscollection.cpp index 12a3543193e..b6a45200dd6 100644 --- a/src/plugins/texteditor/snippets/snippetscollection.cpp +++ b/src/plugins/texteditor/snippets/snippetscollection.cpp @@ -229,7 +229,7 @@ void SnippetsCollection::restoreRemovedSnippets(const QString &groupId) const QVector toRestore = m_snippets[group].mid(m_activeSnippetsCount[group]); m_snippets[group].resize(m_activeSnippetsCount[group]); - for (Snippet snippet : qAsConst(toRestore)) { + for (Snippet snippet : std::as_const(toRestore)) { snippet.setIsRemoved(false); insertSnippet(snippet); } @@ -275,7 +275,7 @@ void SnippetsCollection::reload() insertSnippet(snippet); } - for (const Snippet &snippet : qAsConst(activeBuiltInSnippets)) + for (const Snippet &snippet : std::as_const(activeBuiltInSnippets)) insertSnippet(snippet); } diff --git a/src/plugins/texteditor/syntaxhighlighter.cpp b/src/plugins/texteditor/syntaxhighlighter.cpp index 5d98292f563..a54fcafbfdf 100644 --- a/src/plugins/texteditor/syntaxhighlighter.cpp +++ b/src/plugins/texteditor/syntaxhighlighter.cpp @@ -819,7 +819,7 @@ void SyntaxHighlighterPrivate::updateFormats(const FontSettings &fontSettings) this->fontSettings = fontSettings; // C_TEXT is handled by text editor's foreground and background color, // so use empty format for that - for (const auto &pair : qAsConst(formatCategories)) { + for (const auto &pair : std::as_const(formatCategories)) { formats[pair.first] = pair.second == C_TEXT ? QTextCharFormat() : fontSettings.toTextCharFormat(pair.second); } diff --git a/src/plugins/texteditor/tabsettings.cpp b/src/plugins/texteditor/tabsettings.cpp index 66c9f46f17d..1fddbc79919 100644 --- a/src/plugins/texteditor/tabsettings.cpp +++ b/src/plugins/texteditor/tabsettings.cpp @@ -251,7 +251,7 @@ bool TabSettings::guessSpacesForTabs(const QTextBlock &_block) const if (currentBlocks.at(1).isValid()) currentBlocks[1] = currentBlocks.at(1).next(); bool done = true; - for (const QTextBlock &block : qAsConst(currentBlocks)) { + for (const QTextBlock &block : std::as_const(currentBlocks)) { if (block.isValid()) done = false; if (!block.isValid() || block.length() == 0) diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp index 6b221c310fa..ed7662cb66b 100644 --- a/src/plugins/texteditor/textdocument.cpp +++ b/src/plugins/texteditor/textdocument.cpp @@ -918,7 +918,7 @@ void TextDocument::cleanWhitespace(QTextCursor &cursor, bool inEntireDocument, const IndentationForBlock &indentations = d->m_indenter->indentationForBlocks(blocks, currentTabSettings); - for (QTextBlock block : qAsConst(blocks)) { + for (QTextBlock block : std::as_const(blocks)) { QString blockText = block.text(); if (removeTrailingWhitespace) diff --git a/src/plugins/texteditor/textdocumentlayout.cpp b/src/plugins/texteditor/textdocumentlayout.cpp index 037ec735c18..998ec1a3f6e 100644 --- a/src/plugins/texteditor/textdocumentlayout.cpp +++ b/src/plugins/texteditor/textdocumentlayout.cpp @@ -14,7 +14,7 @@ CodeFormatterData::~CodeFormatterData() = default; TextBlockUserData::~TextBlockUserData() { - for (TextMark *mrk : qAsConst(m_marks)) { + for (TextMark *mrk : std::as_const(m_marks)) { mrk->baseTextDocument()->removeMarkFromMarksCache(mrk); mrk->setBaseTextDocument(nullptr); mrk->removedFromEditor(); @@ -577,7 +577,7 @@ TextMarks TextDocumentLayout::documentClosing() void TextDocumentLayout::documentReloaded(TextMarks marks, TextDocument *baseTextDocument) { - for (TextMark *mark : qAsConst(marks)) { + for (TextMark *mark : std::as_const(marks)) { int blockNumber = mark->lineNumber() - 1; QTextBlock block = document()->findBlockByNumber(blockNumber); if (block.isValid()) { diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index aa542763e39..7c4a47870c0 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -1081,7 +1081,7 @@ void TextEditorWidgetPrivate::showTextMarksToolTip(const QPoint &pos, return mark1->priority() > mark2->priority(); }); - for (const TextMark *mark : qAsConst(allMarks)) { + for (const TextMark *mark : std::as_const(allMarks)) { if (mark != mainTextMark) mark->addToToolTipLayout(layout); } @@ -1549,7 +1549,7 @@ void TextEditorWidgetPrivate::updateAutoCompleteHighlight() const QTextCharFormat matchFormat = m_document->fontSettings().toTextCharFormat(C_AUTOCOMPLETE); QList extraSelections; - for (const QTextCursor &cursor : qAsConst(m_autoCompleteHighlightPos)) { + for (const QTextCursor &cursor : std::as_const(m_autoCompleteHighlightPos)) { QTextEdit::ExtraSelection sel; sel.cursor = cursor; sel.format.setBackground(matchFormat.background()); @@ -2873,7 +2873,7 @@ void TextEditorWidget::insertCodeSnippet(const QTextCursor &cursor_arg, d->m_snippetOverlay->accept(); QList positionedParts; - for (const ParsedSnippet::Part &part : qAsConst(data.parts)) { + for (const ParsedSnippet::Part &part : std::as_const(data.parts)) { if (part.variableIndex >= 0) { PositionedPart posPart(part); posPart.start = cursor.position(); @@ -3202,7 +3202,7 @@ void TextEditorWidget::restoreState(const QByteArray &state) stream >> collapsedBlocks; QTextDocument *doc = document(); bool layoutChanged = false; - for (const int blockNumber : qAsConst(collapsedBlocks)) { + for (const int blockNumber : std::as_const(collapsedBlocks)) { QTextBlock block = doc->findBlockByNumber(qMax(0, blockNumber)); if (block.isValid()) { TextDocumentLayout::doFoldOrUnfold(block, false); @@ -4070,7 +4070,7 @@ void TextEditorWidgetPrivate::updateLineAnnotation(const PaintEventData &data, } } - for (const TextMark *mark : qAsConst(marks)) { + for (const TextMark *mark : std::as_const(marks)) { boundingRect = QRectF(x, boundingRect.top(), q->viewport()->width() - x, boundingRect.height()); if (boundingRect.isEmpty()) break; @@ -5035,7 +5035,7 @@ void TextEditorWidgetPrivate::paintTextMarks(QPainter &painter, const ExtraAreaP return; } size = size / 2; - for (const QIcon &icon : qAsConst(icons)) { + for (const QIcon &icon : std::as_const(icons)) { const QRect r(xoffset, yoffset, size, size); icon.paint(&painter, r, Qt::AlignCenter); if (xoffset != 0) { @@ -7160,7 +7160,7 @@ QList TextEditorWidget::extraSelections(Id kind) cons QString TextEditorWidget::extraSelectionTooltip(int pos) const { - for (const QList &sel : qAsConst(d->m_extraSelections)) { + for (const QList &sel : std::as_const(d->m_extraSelections)) { for (const QTextEdit::ExtraSelection &s : sel) { if (s.cursor.selectionStart() <= pos && s.cursor.selectionEnd() >= pos @@ -7279,7 +7279,7 @@ void TextEditorWidget::rewrapParagraph() // keep the same indentation level as first line in paragraph. QString currentWord; - for (const QChar &ch : qAsConst(selectedText)) { + for (const QChar &ch : std::as_const(selectedText)) { if (ch.isSpace() && ch != QChar::Nbsp) { if (!currentWord.isEmpty()) { currentLength += currentWord.length() + 1; diff --git a/src/plugins/texteditor/texteditoractionhandler.cpp b/src/plugins/texteditor/texteditoractionhandler.cpp index 348b421be83..3f658f7bde1 100644 --- a/src/plugins/texteditor/texteditoractionhandler.cpp +++ b/src/plugins/texteditor/texteditoractionhandler.cpp @@ -445,7 +445,7 @@ void TextEditorActionHandlerPrivate::createActions() void TextEditorActionHandlerPrivate::updateActions() { bool isWritable = m_currentEditorWidget && !m_currentEditorWidget->isReadOnly(); - for (QAction *a : qAsConst(m_modifyingActions)) + for (QAction *a : std::as_const(m_modifyingActions)) a->setEnabled(isWritable); m_unCommentSelectionAction->setEnabled((m_optionalActions & TextEditorActionHandler::UnCommentSelection) && isWritable); m_visualizeWhitespaceAction->setEnabled(m_currentEditorWidget); diff --git a/src/plugins/texteditor/textmark.cpp b/src/plugins/texteditor/textmark.cpp index d74aa177593..4eadb4b4c63 100644 --- a/src/plugins/texteditor/textmark.cpp +++ b/src/plugins/texteditor/textmark.cpp @@ -292,7 +292,7 @@ void TextMark::addToToolTipLayout(QGridLayout *target) const QMargins margins = actionsLayout->contentsMargins(); margins.setLeft(margins.left() + 5); actionsLayout->setContentsMargins(margins); - for (QAction *action : qAsConst(actions)) { + for (QAction *action : std::as_const(actions)) { QTC_ASSERT(!action->icon().isNull(), delete action; continue); auto button = new QToolButton; button->setIcon(action->icon()); @@ -481,7 +481,7 @@ void TextMarkRegistry::documentRenamed(IDocument *document, m_marks[oldPath].subtract(toBeMoved); m_marks[newPath].unite(toBeMoved); - for (TextMark *mark : qAsConst(toBeMoved)) + for (TextMark *mark : std::as_const(toBeMoved)) mark->updateFileName(newPath); } diff --git a/src/plugins/todo/optionsdialog.cpp b/src/plugins/todo/optionsdialog.cpp index 65c2e3d83c3..522b052e648 100644 --- a/src/plugins/todo/optionsdialog.cpp +++ b/src/plugins/todo/optionsdialog.cpp @@ -198,7 +198,7 @@ void OptionsDialog::setSettings(const Settings &settings) m_scanInSubprojectRadioButton->setChecked(settings.scanningScope == ScanningScopeSubProject); m_keywordsList->clear(); - for (const Keyword &keyword : qAsConst(settings.keywords)) + for (const Keyword &keyword : std::as_const(settings.keywords)) addToKeywordsList(keyword); } diff --git a/src/plugins/todo/todooutputpane.cpp b/src/plugins/todo/todooutputpane.cpp index e20c68f5097..a3e6bed1702 100644 --- a/src/plugins/todo/todooutputpane.cpp +++ b/src/plugins/todo/todooutputpane.cpp @@ -168,7 +168,7 @@ void TodoOutputPane::updateTodoCount() void TodoOutputPane::updateKeywordFilter() { QStringList keywords; - for (const QToolButton *btn: qAsConst(m_filterButtons)) { + for (const QToolButton *btn: std::as_const(m_filterButtons)) { if (btn->isChecked()) keywords.append(btn->property(Constants::FILTER_KEYWORD_NAME).toString()); } @@ -185,7 +185,7 @@ void TodoOutputPane::updateKeywordFilter() void TodoOutputPane::clearKeywordFilter() { - for (QToolButton *btn: qAsConst(m_filterButtons)) + for (QToolButton *btn: std::as_const(m_filterButtons)) btn->setChecked(false); updateKeywordFilter(); diff --git a/src/plugins/valgrind/callgrind/callgrindcycledetection.cpp b/src/plugins/valgrind/callgrind/callgrindcycledetection.cpp index 61c09e7ca64..9b3b1759875 100644 --- a/src/plugins/valgrind/callgrind/callgrindcycledetection.cpp +++ b/src/plugins/valgrind/callgrind/callgrindcycledetection.cpp @@ -28,7 +28,7 @@ QVector CycleDetection::run(const QVector &i node->lowlink = -1; m_nodes.insert(function, node); } - for (Node *node : qAsConst(m_nodes)) { + for (Node *node : std::as_const(m_nodes)) { if (node->dfs == -1) tarjan(node); } diff --git a/src/plugins/valgrind/callgrind/callgrindfunction.cpp b/src/plugins/valgrind/callgrind/callgrindfunction.cpp index d6c18c21262..7cbad7d8a80 100644 --- a/src/plugins/valgrind/callgrind/callgrindfunction.cpp +++ b/src/plugins/valgrind/callgrind/callgrindfunction.cpp @@ -153,7 +153,7 @@ void Function::setObject(qint64 id) QString Function::location() const { QString pos; - for (const CostItem *costItem : qAsConst(d->m_costItems)) { + for (const CostItem *costItem : std::as_const(d->m_costItems)) { if (costItem->differingFileId() != -1) { QTextStream stream(&pos); stream << '('; @@ -192,7 +192,7 @@ int Function::lineNumber() const if (lineIdx == -1) return -1; - for (const CostItem *costItem : qAsConst(d->m_costItems)) { + for (const CostItem *costItem : std::as_const(d->m_costItems)) { if (costItem->differingFileId() == -1) return costItem->position(lineIdx); } @@ -265,7 +265,7 @@ void Function::addCostItem(const CostItem *item) void Function::finalize() { bool recursive = false; - for (const FunctionCall *call : qAsConst(d->m_incomingCalls)) { + for (const FunctionCall *call : std::as_const(d->m_incomingCalls)) { if (call->caller() == this) { recursive = true; break; @@ -278,7 +278,7 @@ void Function::finalize() // e.g.: A -> B -> B ..., C -> B -> B ... // cost of B = cost of call to B in A + cost of call to B in C + ... d->m_inclusiveCost.fill(0); - for (const FunctionCall *call : qAsConst(d->m_incomingCalls)) { + for (const FunctionCall *call : std::as_const(d->m_incomingCalls)) { if (call->caller() != this) { const QVector costItems = call->caller()->costItems(); for (const CostItem *costItem : costItems) { diff --git a/src/plugins/valgrind/callgrind/callgrindparsedata.cpp b/src/plugins/valgrind/callgrind/callgrindparsedata.cpp index b9d432e4fe7..b7a779b57fa 100644 --- a/src/plugins/valgrind/callgrind/callgrindparsedata.cpp +++ b/src/plugins/valgrind/callgrind/callgrindparsedata.cpp @@ -69,7 +69,7 @@ ParseData::Private::~Private() void ParseData::Private::cleanupFunctionCycles() { m_cycleCacheValid = false; - for (const Function *func : qAsConst(m_cycleCache)) { + for (const Function *func : std::as_const(m_cycleCache)) { if (dynamic_cast(func)) delete func; } diff --git a/src/plugins/valgrind/callgrind/callgrindparser.cpp b/src/plugins/valgrind/callgrind/callgrindparser.cpp index e012168001f..07a8d4f2bb1 100644 --- a/src/plugins/valgrind/callgrind/callgrindparser.cpp +++ b/src/plugins/valgrind/callgrind/callgrindparser.cpp @@ -204,7 +204,7 @@ void Parser::Private::parse(const FilePath &filePath) // functions that need to accumulate their calees QSet pendingFunctions; - for (const CallData &callData : qAsConst(pendingCallees)) { + for (const CallData &callData : std::as_const(pendingCallees)) { Function *calledFunction = nullptr; QTC_ASSERT(callData.call, continue); QTC_ASSERT(callData.call->caller(), continue); @@ -243,7 +243,7 @@ void Parser::Private::parse(const FilePath &filePath) // lookup done // now accumulate callees - for (Function *func : qAsConst(pendingFunctions)) + for (Function *func : std::as_const(pendingFunctions)) func->finalize(); emit q->parserDataReady(); diff --git a/src/plugins/valgrind/callgrindtool.cpp b/src/plugins/valgrind/callgrindtool.cpp index e8cd33eb335..4609510fe2b 100644 --- a/src/plugins/valgrind/callgrindtool.cpp +++ b/src/plugins/valgrind/callgrindtool.cpp @@ -827,7 +827,7 @@ void CallgrindToolPrivate::editorOpened(IEditor *editor) void CallgrindToolPrivate::requestContextMenu(TextEditorWidget *widget, int line, QMenu *menu) { // Find callgrind text mark that corresponds to this editor's file and line number - for (CallgrindTextMark *textMark : qAsConst(m_textMarks)) { + for (CallgrindTextMark *textMark : std::as_const(m_textMarks)) { if (textMark->fileName() == widget->textDocument()->filePath() && textMark->lineNumber() == line) { const Function *func = textMark->function(); QAction *action = menu->addAction(Tr::tr("Select This Function in the Analyzer Output")); diff --git a/src/plugins/valgrind/callgrindvisualisation.cpp b/src/plugins/valgrind/callgrindvisualisation.cpp index 60fdc3ef130..c06664d3ab4 100644 --- a/src/plugins/valgrind/callgrindvisualisation.cpp +++ b/src/plugins/valgrind/callgrindvisualisation.cpp @@ -383,7 +383,7 @@ void Visualization::populateScene() // add the canvas elements to the scene qreal used = sceneHeight * 0.1; - for (const Pair &cost : qAsConst(costs)) { + for (const Pair &cost : std::as_const(costs)) { const QModelIndex &index = cost.first; const QString text = index.data().toString(); diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp index a8c62b3e41f..b9789260e8d 100644 --- a/src/plugins/valgrind/memchecktool.cpp +++ b/src/plugins/valgrind/memchecktool.cpp @@ -359,7 +359,7 @@ bool MemcheckErrorFilterProxyModel::filterAcceptsRow(int sourceRow, const QModel bool inProject = false; for (int i = 0; i < framesToLookAt; ++i) { const Frame &frame = frames.at(i); - for (const QString &folder : qAsConst(validFolders)) { + for (const QString &folder : std::as_const(validFolders)) { if (frame.directory().startsWith(folder)) { inProject = true; break; @@ -609,7 +609,7 @@ MemcheckToolPrivate::MemcheckToolPrivate() filterButton->setProperty("noArrow", true); m_filterMenu = new QMenu(filterButton); - for (QAction *filterAction : qAsConst(m_errorFilterActions)) + for (QAction *filterAction : std::as_const(m_errorFilterActions)) m_filterMenu->addAction(filterAction); m_filterMenu->addSeparator(); m_filterMenu->addAction(m_filterProjectAction); @@ -908,7 +908,7 @@ void MemcheckToolPrivate::settingsDestroyed(QObject *settings) void MemcheckToolPrivate::updateFromSettings() { - for (QAction *action : qAsConst(m_errorFilterActions)) { + for (QAction *action : std::as_const(m_errorFilterActions)) { bool contained = true; const QList actions = action->data().toList(); for (const QVariant &v : actions) { @@ -1094,7 +1094,7 @@ void MemcheckToolPrivate::updateErrorFilter() m_settings->filterExternalIssues.setValue(!m_filterProjectAction->isChecked()); QList errorKinds; - for (QAction *a : qAsConst(m_errorFilterActions)) { + for (QAction *a : std::as_const(m_errorFilterActions)) { if (!a->isChecked()) continue; const QList actions = a->data().toList(); @@ -1204,7 +1204,7 @@ HeobDialog::HeobDialog(QWidget *parent) : auto profilesLayout = new QHBoxLayout; m_profilesCombo = new QComboBox; - for (const auto &profile : qAsConst(m_profiles)) + for (const auto &profile : std::as_const(m_profiles)) m_profilesCombo->addItem(settings->value(profile + "/" + heobProfileNameC).toString()); if (hasSelProfile) { int selIdx = m_profiles.indexOf(selProfile); diff --git a/src/plugins/valgrind/suppressiondialog.cpp b/src/plugins/valgrind/suppressiondialog.cpp index 6330f665130..0d90ee58d86 100644 --- a/src/plugins/valgrind/suppressiondialog.cpp +++ b/src/plugins/valgrind/suppressiondialog.cpp @@ -130,7 +130,7 @@ SuppressionDialog::SuppressionDialog(MemcheckErrorView *view, const QList m_fileChooser->setPromptDialogTitle(Tr::tr("Select Suppression File")); QString suppressions; - for (const Error &error : qAsConst(m_errors)) + for (const Error &error : std::as_const(m_errors)) suppressions += suppressionText(error); m_suppressionEdit->setPlainText(suppressions); @@ -153,7 +153,7 @@ void SuppressionDialog::maybeShow(MemcheckErrorView *view) indices.append(view->selectionModel()->currentIndex()); QList errors; - for (const QModelIndex &index : qAsConst(indices)) { + for (const QModelIndex &index : std::as_const(indices)) { Error error = view->model()->data(index, ErrorListModel::ErrorRole).value(); if (!error.suppression().isNull()) errors.append(error); @@ -198,7 +198,7 @@ void SuppressionDialog::accept() return l.row() > r.row(); }); QAbstractItemModel *model = m_view->model(); - for (const QModelIndex &index : qAsConst(indices)) { + for (const QModelIndex &index : std::as_const(indices)) { bool removed = model->removeRow(index.row()); QTC_ASSERT(removed, qt_noop()); Q_UNUSED(removed) @@ -209,7 +209,7 @@ void SuppressionDialog::accept() const Error rowError = model->data( model->index(row, 0), ErrorListModel::ErrorRole).value(); - for (const Error &error : qAsConst(m_errors)) { + for (const Error &error : std::as_const(m_errors)) { if (equalSuppression(rowError, error)) { bool removed = model->removeRow(row); QTC_CHECK(removed); diff --git a/src/plugins/valgrind/valgrindsettings.cpp b/src/plugins/valgrind/valgrindsettings.cpp index be03ab07dba..106a5df7722 100644 --- a/src/plugins/valgrind/valgrindsettings.cpp +++ b/src/plugins/valgrind/valgrindsettings.cpp @@ -91,7 +91,7 @@ void SuppressionAspectPrivate::slotRemoveSuppression() Utils::sort(rows, std::greater()); - for (int row : qAsConst(rows)) + for (int row : std::as_const(rows)) m_model.removeRow(row); if (!isGlobal) diff --git a/src/plugins/valgrind/xmlprotocol/error.cpp b/src/plugins/valgrind/xmlprotocol/error.cpp index 8691d7edec8..4a6e65132fe 100644 --- a/src/plugins/valgrind/xmlprotocol/error.cpp +++ b/src/plugins/valgrind/xmlprotocol/error.cpp @@ -182,7 +182,7 @@ QString Error::toXml() const stream << " " << d->what << "\n"; } - for (const Stack &stack : qAsConst(d->stacks)) { + for (const Stack &stack : std::as_const(d->stacks)) { if (!stack.auxWhat().isEmpty()) stream << " " << stack.auxWhat() << "\n"; stream << " \n"; diff --git a/src/plugins/valgrind/xmlprotocol/modelhelpers.cpp b/src/plugins/valgrind/xmlprotocol/modelhelpers.cpp index 5a9af364f9e..81c70206cf6 100644 --- a/src/plugins/valgrind/xmlprotocol/modelhelpers.cpp +++ b/src/plugins/valgrind/xmlprotocol/modelhelpers.cpp @@ -38,7 +38,7 @@ QString toolTipForFrame(const Frame &frame) "\n" "
"; - for (const StringPair &pair : qAsConst(lines)) { + for (const StringPair &pair : std::as_const(lines)) { html += "
"; html += pair.first; html += "
"; diff --git a/src/plugins/valgrind/xmlprotocol/suppression.cpp b/src/plugins/valgrind/xmlprotocol/suppression.cpp index d8e3903663b..7e3426d4292 100644 --- a/src/plugins/valgrind/xmlprotocol/suppression.cpp +++ b/src/plugins/valgrind/xmlprotocol/suppression.cpp @@ -185,7 +185,7 @@ QString Suppression::toString() const stream << "{\n"; stream << indent << d->name << '\n'; stream << indent << d->kind << '\n'; - for (const SuppressionFrame &frame : qAsConst(d->frames)) + for (const SuppressionFrame &frame : std::as_const(d->frames)) stream << indent << frame.toString() << '\n'; stream << "}\n"; return ret; diff --git a/src/plugins/vcsbase/submiteditorwidget.cpp b/src/plugins/vcsbase/submiteditorwidget.cpp index 6c0e2498a65..4d01d1f549f 100644 --- a/src/plugins/vcsbase/submiteditorwidget.cpp +++ b/src/plugins/vcsbase/submiteditorwidget.cpp @@ -621,7 +621,7 @@ void SubmitEditorWidget::descriptionTextChanged() wrapDescription(); trimDescription(); // append field entries - for (const SubmitFieldWidget *fw : qAsConst(d->m_fieldWidgets)) + for (const SubmitFieldWidget *fw : std::as_const(d->m_fieldWidgets)) d->m_description += fw->fieldValues(); updateSubmitAction(); } @@ -713,7 +713,7 @@ void SubmitEditorWidget::editorCustomContextMenuRequested(const QPoint &pos) QScopedPointer menu(d->description->createStandardContextMenu()); // Extend for (const SubmitEditorWidgetPrivate::AdditionalContextMenuAction &a : - qAsConst(d->descriptionEditContextMenuActions)) { + std::as_const(d->descriptionEditContextMenuActions)) { if (a.second) { if (a.first >= 0) menu->insertAction(menu->actions().at(a.first), a.second); diff --git a/src/plugins/vcsbase/submitfieldwidget.cpp b/src/plugins/vcsbase/submitfieldwidget.cpp index 102ca674351..4c90e6156de 100644 --- a/src/plugins/vcsbase/submitfieldwidget.cpp +++ b/src/plugins/vcsbase/submitfieldwidget.cpp @@ -185,7 +185,7 @@ void SubmitFieldWidget::setHasBrowseButton(bool on) if (d->hasBrowseButton == on) return; d->hasBrowseButton = on; - for (const FieldEntry &fe : qAsConst(d->fieldEntries)) + for (const FieldEntry &fe : std::as_const(d->fieldEntries)) fe.browseButton->setVisible(on); } @@ -209,7 +209,7 @@ void SubmitFieldWidget::setCompleter(QCompleter *c) if (c == d->completer) return; d->completer = c; - for (const FieldEntry &fe : qAsConst(d->fieldEntries)) + for (const FieldEntry &fe : std::as_const(d->fieldEntries)) fe.lineEdit->setCompleter(c); } @@ -229,7 +229,7 @@ QString SubmitFieldWidget::fieldValues() const const QChar newLine = QLatin1Char('\n'); // Format as "RevBy: value\nSigned-Off: value\n" QString rc; - for (const FieldEntry &fe : qAsConst(d->fieldEntries)) { + for (const FieldEntry &fe : std::as_const(d->fieldEntries)) { const QString value = fe.lineEdit->text().trimmed(); if (!value.isEmpty()) { rc += fe.combo->currentText(); diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 59936e8d560..0ba1497cf1e 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -572,7 +572,7 @@ void VcsBaseClient::statusParser(const QString &text) QStringList rawStatusList = text.split(QLatin1Char('\n')); - for (const QString &string : qAsConst(rawStatusList)) { + for (const QString &string : std::as_const(rawStatusList)) { const VcsBaseClient::StatusItem lineInfo = parseStatusLine(string); if (!lineInfo.flags.isEmpty() && !lineInfo.file.isEmpty()) lineInfoList.append(lineInfo); diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index f6ecadc253b..82bdf893622 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -560,7 +560,7 @@ VcsBaseEditorWidgetPrivate::VcsBaseEditorWidgetPrivate(VcsBaseEditorWidget *edit AbstractTextCursorHandler *VcsBaseEditorWidgetPrivate::findTextCursorHandler(const QTextCursor &cursor) { - for (AbstractTextCursorHandler *handler : qAsConst(m_textCursorHandlers)) { + for (AbstractTextCursorHandler *handler : std::as_const(m_textCursorHandlers)) { if (handler->findContentsUnderCursor(cursor)) return handler; } diff --git a/src/plugins/vcsbase/wizard/vcscommandpage.cpp b/src/plugins/vcsbase/wizard/vcscommandpage.cpp index 476d2ab0b5d..d0290af8e82 100644 --- a/src/plugins/vcsbase/wizard/vcscommandpage.cpp +++ b/src/plugins/vcsbase/wizard/vcscommandpage.cpp @@ -310,7 +310,7 @@ void VcsCommandPage::delayedInitialize() m_startedStatus = runMessage; QStringList extraArgs; - for (const QString &in : qAsConst(m_arguments)) { + for (const QString &in : std::as_const(m_arguments)) { const QString tmp = wiz->expander()->expand(in); if (tmp.isEmpty()) continue; @@ -322,7 +322,7 @@ void VcsCommandPage::delayedInitialize() VcsCommand *command = vc->createInitialCheckoutCommand(repo, FilePath::fromString(base), name, extraArgs); - for (const JobData &job : qAsConst(m_additionalJobs)) { + for (const JobData &job : std::as_const(m_additionalJobs)) { QTC_ASSERT(!job.job.isEmpty(), continue); if (!JsonWizard::boolFromVariant(job.condition, wiz->expander())) diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index 343853a01ae..bb2a820136b 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -465,7 +465,7 @@ void WelcomeMode::addPage(IWelcomePage *page) auto onClicked = [this, pageId, stackPage] { m_activePage = pageId; m_pageStack->setCurrentWidget(stackPage); - for (WelcomePageButton *pageButton : qAsConst(m_pageButtons)) + for (WelcomePageButton *pageButton : std::as_const(m_pageButtons)) pageButton->recheckActive(); }; diff --git a/src/shared/proparser/prowriter.cpp b/src/shared/proparser/prowriter.cpp index 13a9a1f09bb..2c7c8d54ff3 100644 --- a/src/shared/proparser/prowriter.cpp +++ b/src/shared/proparser/prowriter.cpp @@ -534,7 +534,7 @@ QList ProWriter::removeVarValues(ProFile *profile, QStringList *lines, // Entries existed, but were all removed if (contCol < 0) { // This is the last line, so clear continuations leading to it - for (const ContPos &pos : qAsConst(contPos)) { + for (const ContPos &pos : std::as_const(contPos)) { QString &bline = (*lines)[pos.first]; bline.remove(pos.second, 1); if (pos.second == bline.length()) diff --git a/src/tools/cplusplus-ast2png/cplusplus-ast2png.cpp b/src/tools/cplusplus-ast2png/cplusplus-ast2png.cpp index fc6514781e4..d87b61bdad0 100644 --- a/src/tools/cplusplus-ast2png/cplusplus-ast2png.cpp +++ b/src/tools/cplusplus-ast2png/cplusplus-ast2png.cpp @@ -75,7 +75,7 @@ public: typedef QPair Pair; - for (const Pair &conn : qAsConst(_connections)) + for (const Pair &conn : std::as_const(_connections)) out << conn.first.constData() << " -> " << conn.second.constData() << std::endl; alignTerminals(); @@ -91,7 +91,7 @@ public: protected: void alignTerminals() { out<<"{ rank=same;" << std::endl; - for (const QByteArray &terminalShape : qAsConst(_terminalShapes)) { + for (const QByteArray &terminalShape : std::as_const(_terminalShapes)) { out << " " << std::string(terminalShape.constData(), terminalShape.size()).c_str() << ";" << std::endl; } out<<"}"<ast()->asTranslationUnit()); }" << std::endl << std::endl; - for (ClassOrNamespace *b : qAsConst(interfaces)) { + for (ClassOrNamespace *b : std::as_const(interfaces)) { Q_ASSERT(! b->symbols().isEmpty()); Class *klass = 0; @@ -136,7 +136,7 @@ public: << std::endl; QHash > implements; - for (ClassOrNamespace *b : qAsConst(nodes)) { + for (ClassOrNamespace *b : std::as_const(nodes)) { ClassOrNamespace *iface = 0; for (ClassOrNamespace *u : b->usings()) { if (interfaces.contains(u)) { @@ -148,7 +148,7 @@ public: implements[iface].append(b); } - for (ClassOrNamespace *iface : qAsConst(interfaces)) { + for (ClassOrNamespace *iface : std::as_const(interfaces)) { const QList values = implements.value(iface); for (ClassOrNamespace *b : values) { if (! isMiscNode(b)) @@ -169,7 +169,7 @@ public: std::cout << std::endl; - for (ClassOrNamespace *iface : qAsConst(interfaces)) { + for (ClassOrNamespace *iface : std::as_const(interfaces)) { std::cout << " // " << qPrintable(oo(iface->symbols().first()->name())) << std::endl; const QList values = implements.value(iface); for (ClassOrNamespace *b : values) { @@ -187,7 +187,7 @@ public: } std::cout << "private:" << std::endl; - for (ClassOrNamespace *b : qAsConst(interfaces)) { + for (ClassOrNamespace *b : std::as_const(interfaces)) { Q_ASSERT(! b->symbols().isEmpty()); Class *klass = 0; @@ -220,7 +220,7 @@ public: // implementation - for (ClassOrNamespace *b : qAsConst(interfaces)) { + for (ClassOrNamespace *b : std::as_const(interfaces)) { Q_ASSERT(! b->symbols().isEmpty()); Class *klass = 0; @@ -255,7 +255,7 @@ public: << std::endl; } - for (ClassOrNamespace *iface : qAsConst(interfaces)) { + for (ClassOrNamespace *iface : std::as_const(interfaces)) { std::cout << "// " << qPrintable(oo(iface->symbols().first()->name())) << std::endl; const QList values = implements.value(iface); for (ClassOrNamespace *b : values) { diff --git a/src/tools/cplusplus-update-frontend/cplusplus-update-frontend.cpp b/src/tools/cplusplus-update-frontend/cplusplus-update-frontend.cpp index d4708356e5c..f9f9358b83c 100644 --- a/src/tools/cplusplus-update-frontend/cplusplus-update-frontend.cpp +++ b/src/tools/cplusplus-update-frontend/cplusplus-update-frontend.cpp @@ -1020,7 +1020,7 @@ void generateAST_cpp(const Snapshot &snapshot, const QDir &cplusplusDir) StringClassSpecifierASTMap classesNeedingLastToken; // find all classes with method declarations for firstToken/lastToken - for (ClassSpecifierAST *classAST : qAsConst(astNodes.deriveds)) { + for (ClassSpecifierAST *classAST : std::as_const(astNodes.deriveds)) { const QString className = oo(classAST->symbol->name()); if (className.isEmpty()) continue; @@ -1110,7 +1110,7 @@ void generateAST_cpp(const Snapshot &snapshot, const QDir &cplusplusDir) const int documentEnd = cpp_document.lastBlock().position() + cpp_document.lastBlock().length() - 1; Utils::ChangeSet changes; - for (GenInfo info : qAsConst(todo)) { + for (GenInfo info : std::as_const(todo)) { if (info.end > documentEnd) info.end = documentEnd; @@ -1318,7 +1318,7 @@ QStringList generateAST_H(const Snapshot &snapshot, const QDir &cplusplusDir, co Overview oo; QStringList castMethods; - for (ClassSpecifierAST *classAST : qAsConst(astNodes.deriveds)) { + for (ClassSpecifierAST *classAST : std::as_const(astNodes.deriveds)) { cursors[classAST] = removeCastMethods(classAST); const QString className = oo(classAST->symbol->name()); const QString methodName = QLatin1String("as") + className.mid(0, className.length() - 3); @@ -1485,7 +1485,7 @@ void generateASTPatternBuilder_h(const QDir &cplusplusDir) Control *control = AST_h_document->control(); QSet classesSet; - for (ClassSpecifierAST *classNode : qAsConst(astNodes.deriveds)) { + for (ClassSpecifierAST *classNode : std::as_const(astNodes.deriveds)) { Class *klass = classNode->symbol; const Identifier *match0_id = control->identifier("match0"); @@ -1540,7 +1540,7 @@ void generateASTPatternBuilder_h(const QDir &cplusplusDir) << " {" << Qt::endl << " " << className << " *ast = new (&pool) " << className << ';' << Qt::endl; - for (const StringPair &p : qAsConst(args)) + for (const StringPair &p : std::as_const(args)) out << " ast->" << p.second << " = " << p.second << ';' << Qt::endl; out << " return ast;" << Qt::endl << " }" << Qt::endl << Qt::endl; @@ -1548,7 +1548,7 @@ void generateASTPatternBuilder_h(const QDir &cplusplusDir) QStringList classesList = Utils::toList(classesSet); Utils::sort(classesList); - for (const QString &className : qAsConst(classesList)) { + for (const QString &className : std::as_const(classesList)) { const QString methodName = className.left(className.length() - 3); const QString elementName = className.left(className.length() - 7) + QLatin1String("AST"); out << " " << className << " *" << methodName << "(" << elementName << " *value, " diff --git a/src/tools/iostool/iosdevicemanager.cpp b/src/tools/iostool/iosdevicemanager.cpp index 90b620e9c38..d9c28c3532e 100644 --- a/src/tools/iostool/iosdevicemanager.cpp +++ b/src/tools/iostool/iosdevicemanager.cpp @@ -565,7 +565,7 @@ void IosDeviceManagerPrivate::addDevice(AMDeviceRef device) m_pendingLookups.remove(devId); devices << m_pendingLookups.values(QString()); m_pendingLookups.remove(QString()); - for (PendingDeviceLookup *devLookup : qAsConst(devices)) { + for (PendingDeviceLookup *devLookup : std::as_const(devices)) { qCDebug(loggingCategory) << "found pending op"; devLookup->timer.stop(); devLookup->callback(devId, device, devLookup->userData); @@ -1461,7 +1461,7 @@ void AppOpSession::deviceCallbackReturned() int AppOpSession::qmljsDebugPort() const { const QRegularExpression qmlPortRe(QLatin1String("-qmljsdebugger=port:([0-9]+)")); - for (const QString &arg : qAsConst(extraArgs)) { + for (const QString &arg : std::as_const(extraArgs)) { const QRegularExpressionMatch match = qmlPortRe.match(arg); if (match.hasMatch()) { bool ok; diff --git a/src/tools/qtcreatorcrashhandler/crashhandler.cpp b/src/tools/qtcreatorcrashhandler/crashhandler.cpp index 7762a0c3ee0..8ef5ce2b37c 100644 --- a/src/tools/qtcreatorcrashhandler/crashhandler.cpp +++ b/src/tools/qtcreatorcrashhandler/crashhandler.cpp @@ -173,7 +173,7 @@ bool CrashHandler::collectRestartAppData() return false; } commandLine.removeLast(); - for (const QByteArray &item : qAsConst(commandLine)) + for (const QByteArray &item : std::as_const(commandLine)) d->restartAppCommandLine.append(QString::fromLatin1(item)); // Get environment. @@ -187,7 +187,7 @@ bool CrashHandler::collectRestartAppData() } if (environment.last().isEmpty()) environment.removeLast(); - for (const QByteArray &item : qAsConst(environment)) + for (const QByteArray &item : std::as_const(environment)) d->restartAppEnvironment.append(QString::fromLatin1(item)); return true; diff --git a/src/tools/qtpromaker/main.cpp b/src/tools/qtpromaker/main.cpp index 873f8c72583..7f042249a31 100644 --- a/src/tools/qtpromaker/main.cpp +++ b/src/tools/qtpromaker/main.cpp @@ -278,17 +278,17 @@ void Project::writeProFile() if (m_subdirs.isEmpty()) { ts << "TEMPLATE = app\n"; ts << "TARGET = " << QFileInfo(m_outputFileName).baseName() << "\n"; - for (const FileClass &fc : qAsConst(m_fileClasses)) + for (const FileClass &fc : std::as_const(m_fileClasses)) fc.writeProBlock(ts); ts << "\nPATHS *="; - for (const QDir dir : qAsConst(m_items)) + for (const QDir dir : std::as_const(m_items)) ts << " \\\n " << dir.path(); ts << "\n\nDEPENDPATH *= $$PATHS\n"; ts << "\nINCLUDEPATH *= $$PATHS\n"; } else { ts << "TEMPLATE = subdirs\n"; ts << "SUBDIRS = "; - for (const QString &subdir : qAsConst(m_subdirs)) + for (const QString &subdir : std::as_const(m_subdirs)) ts << " \\\n " << subdir; ts << "\n"; } diff --git a/src/tools/sdktool/addcmakeoperation.cpp b/src/tools/sdktool/addcmakeoperation.cpp index f58af800ec7..d1be67b1c36 100644 --- a/src/tools/sdktool/addcmakeoperation.cpp +++ b/src/tools/sdktool/addcmakeoperation.cpp @@ -207,7 +207,7 @@ QVariantMap AddCMakeData::addCMake(const QVariantMap &map) const data << KeyValuePair({cm, AUTODETECTED_KEY}, QVariant(true)); data << KeyValuePair({cm, PATH_KEY}, Utils::FilePath::fromUserInput(m_path).toVariant()); KeyValuePairList extraList; - for (const KeyValuePair &pair : qAsConst(m_extra)) + for (const KeyValuePair &pair : std::as_const(m_extra)) extraList << KeyValuePair(QStringList({cm}) << pair.key, pair.value); data.append(extraList); data << KeyValuePair(COUNT, QVariant(count + 1)); @@ -229,7 +229,7 @@ bool AddCMakeData::exists(const QVariantMap &map, const QString &id) // support old settings using QByteArray for id's valueKeys.append(FindValueOperation::findValue(map, id.toUtf8())); - for (const QString &k : qAsConst(valueKeys)) { + for (const QString &k : std::as_const(valueKeys)) { if (k.endsWith(QString('/') + ID_KEY)) { return true; } diff --git a/src/tools/sdktool/adddebuggeroperation.cpp b/src/tools/sdktool/adddebuggeroperation.cpp index a8c47e1d4cc..6fa6439637b 100644 --- a/src/tools/sdktool/adddebuggeroperation.cpp +++ b/src/tools/sdktool/adddebuggeroperation.cpp @@ -228,7 +228,7 @@ QVariantMap AddDebuggerData::addDebugger(const QVariantMap &map) const data << KeyValuePair(QStringList() << QLatin1String(COUNT), QVariant(count + 1)); KeyValuePairList qtExtraList; - for (const KeyValuePair &pair : qAsConst(m_extra)) + for (const KeyValuePair &pair : std::as_const(m_extra)) qtExtraList << KeyValuePair(QStringList() << debugger << pair.key, pair.value); data.append(qtExtraList); diff --git a/src/tools/sdktool/addkitoperation.cpp b/src/tools/sdktool/addkitoperation.cpp index ed616d2dc80..6af6b257792 100644 --- a/src/tools/sdktool/addkitoperation.cpp +++ b/src/tools/sdktool/addkitoperation.cpp @@ -715,7 +715,7 @@ QVariantMap AddKitData::addKit(const QVariantMap &map, data << KeyValuePair(COUNT, QVariant(count + 1)); KeyValuePairList qtExtraList; - for (const KeyValuePair &pair : qAsConst(m_extra)) + for (const KeyValuePair &pair : std::as_const(m_extra)) qtExtraList << KeyValuePair(QStringList() << kit << pair.key, pair.value); data.append(qtExtraList); diff --git a/src/tools/sdktool/addqtoperation.cpp b/src/tools/sdktool/addqtoperation.cpp index cdba206d132..c68b8aaecc0 100644 --- a/src/tools/sdktool/addqtoperation.cpp +++ b/src/tools/sdktool/addqtoperation.cpp @@ -296,7 +296,7 @@ QVariantMap AddQtData::addQt(const QVariantMap &map) const data << KeyValuePair(QStringList() << qt << ABIS, QVariant(m_abis)); KeyValuePairList qtExtraList; - for (const KeyValuePair &pair : qAsConst(m_extra)) + for (const KeyValuePair &pair : std::as_const(m_extra)) qtExtraList << KeyValuePair(QStringList() << qt << pair.key, pair.value); data.append(qtExtraList); diff --git a/src/tools/sdktool/addtoolchainoperation.cpp b/src/tools/sdktool/addtoolchainoperation.cpp index 0d9e9139d65..47ef7b23238 100644 --- a/src/tools/sdktool/addtoolchainoperation.cpp +++ b/src/tools/sdktool/addtoolchainoperation.cpp @@ -291,7 +291,7 @@ QVariantMap AddToolChainData::addToolChain(const QVariantMap &map) const abis << QVariant(s); data << KeyValuePair({tc, SUPPORTED_ABIS}, QVariant(abis)); KeyValuePairList tcExtraList; - for (const KeyValuePair &pair : qAsConst(m_extra)) + for (const KeyValuePair &pair : std::as_const(m_extra)) tcExtraList << KeyValuePair(QStringList({tc}) << pair.key, pair.value); data.append(tcExtraList); data << KeyValuePair(COUNT, QVariant(count + 1)); @@ -313,7 +313,7 @@ bool AddToolChainData::exists(const QVariantMap &map, const QString &id) // support old settings using QByteArray for id's valueKeys.append(FindValueOperation::findValue(map, id.toUtf8())); - for (const QString &k : qAsConst(valueKeys)) { + for (const QString &k : std::as_const(valueKeys)) { if (k.endsWith(QString('/') + ID)) { return true; } diff --git a/src/tools/sdktool/findvalueoperation.cpp b/src/tools/sdktool/findvalueoperation.cpp index 66b2d667760..8369e87d2bf 100644 --- a/src/tools/sdktool/findvalueoperation.cpp +++ b/src/tools/sdktool/findvalueoperation.cpp @@ -60,7 +60,7 @@ int FindValueOperation::execute() const Q_ASSERT(!m_values.isEmpty()); QVariantMap map = load(m_file); - for (const QVariant &v : qAsConst(m_values)) { + for (const QVariant &v : std::as_const(m_values)) { const QStringList result = findValue(map, v); for (const QString &r : result) std::cout << qPrintable(r) << std::endl; diff --git a/src/tools/sdktool/getoperation.cpp b/src/tools/sdktool/getoperation.cpp index c116973210b..1d02b8ddfd8 100644 --- a/src/tools/sdktool/getoperation.cpp +++ b/src/tools/sdktool/getoperation.cpp @@ -86,7 +86,7 @@ int GetOperation::execute() const Q_ASSERT(!m_keys.isEmpty()); QVariantMap map = load(m_file); - for (const QString &key : qAsConst(m_keys)) { + for (const QString &key : std::as_const(m_keys)) { const QVariant result = get(map, key); if (!result.isValid()) std::cout << "" << std::endl; diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 695ed6ac97f..a65f2158ea7 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -1711,12 +1711,12 @@ void tst_Dumpers::dumper() } }; collectExpandedINames(data.checks); - for (const auto &checkset : qAsConst(data.checksets)) + for (const auto &checkset : std::as_const(data.checksets)) collectExpandedINames(checkset.checks); QString expanded; QString expandedq; - for (const QString &iname : qAsConst(expandedINames)) { + for (const QString &iname : std::as_const(expandedINames)) { if (!expanded.isEmpty()) { expanded.append(','); expandedq.append(','); @@ -2005,7 +2005,7 @@ void tst_Dumpers::dumper() if (!data.checks.isEmpty()) { qCDebug(lcDumpers) << "SOME TESTS NOT EXECUTED: "; - for (const Check &check : qAsConst(data.checks)) { + for (const Check &check : std::as_const(data.checks)) { if (check.optionallyPresent) { qCDebug(lcDumpers) << " OPTIONAL TEST NOT FOUND: " << check << " IGNORED."; } else { diff --git a/tests/auto/utils/deviceshell/tst_deviceshell.cpp b/tests/auto/utils/deviceshell/tst_deviceshell.cpp index 5d550b2afa0..db4a18a6164 100644 --- a/tests/auto/utils/deviceshell/tst_deviceshell.cpp +++ b/tests/auto/utils/deviceshell/tst_deviceshell.cpp @@ -127,7 +127,7 @@ private slots: QTest::addColumn("cmdLine"); QTest::addColumn("testData"); - for (const auto &cmdLine : qAsConst(m_availableShells)) { + for (const auto &cmdLine : std::as_const(m_availableShells)) { QTest::newRow((cmdLine.executable().baseName() + " : simple").toUtf8()) << cmdLine << "Hallo Welt!"; QTest::newRow((cmdLine.executable().baseName() + " : japanese").toUtf8()) @@ -175,7 +175,7 @@ private slots: QTest::addColumn("cmdLine"); QTest::addColumn("testData"); - for (const auto &cmdLine : qAsConst(m_availableShells)) { + for (const auto &cmdLine : std::as_const(m_availableShells)) { QTest::newRow((cmdLine.executable().baseName() + " : simple").toUtf8()) << cmdLine << "Hallo Welt!"; QTest::newRow((cmdLine.executable().baseName() + " : japanese").toUtf8()) @@ -220,7 +220,7 @@ private slots: void testAscii_data() { QTest::addColumn("cmdLine"); - for (const auto &cmdLine : qAsConst(m_availableShells)) { + for (const auto &cmdLine : std::as_const(m_availableShells)) { QTest::newRow(cmdLine.executable().baseName().toUtf8()) << cmdLine; } } From 93dfa93b7dd6d338539927a43b52f5d5e96b03e4 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 7 Oct 2022 16:16:35 +0200 Subject: [PATCH 095/104] VcsCommand: Simplify ProgressParser Get rid of abstract base ProgressParser and replace it with ProgressParser function. The only one former subclass GitProgressParser is now functor object. Pass future interface directly to the ProgressParser function, along with input text to be parsed. Change-Id: Icbcf0b6e55097f8b38eb8a32ceaa4414723116d0 Reviewed-by: Orgad Shaneh --- src/plugins/git/gitclient.cpp | 25 ++++++----------- src/plugins/vcsbase/vcscommand.cpp | 45 ++++-------------------------- src/plugins/vcsbase/vcscommand.h | 21 ++------------ 3 files changed, 16 insertions(+), 75 deletions(-) diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 002d603a431..fdc1c9a6251 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -791,26 +791,19 @@ private: QStringList m_files; }; -class GitProgressParser : public ProgressParser +class GitProgressParser { public: - static void attachToCommand(VcsCommand *command) - { - command->setProgressParser(new GitProgressParser); + void operator()(QFutureInterface &fi, const QString &inputText) const { + const QRegularExpressionMatch match = m_progressExp.match(inputText); + if (match.hasMatch()) { + fi.setProgressRange(0, match.captured(2).toInt()); + fi.setProgressValue(match.captured(1).toInt()); + } } private: - GitProgressParser() : m_progressExp("\\((\\d+)/(\\d+)\\)") // e.g. Rebasing (7/42) - { } - - void parseProgress(const QString &text) override - { - const QRegularExpressionMatch match = m_progressExp.match(text); - if (match.hasMatch()) - setProgressAndMaximum(match.captured(1).toInt(), match.captured(2).toInt()); - } - - const QRegularExpression m_progressExp; + const QRegularExpression m_progressExp{"\\((\\d+)/(\\d+)\\)"}; // e.g. Rebasing (7/42) }; static inline QString msgRepositoryNotFound(const FilePath &dir) @@ -3404,7 +3397,7 @@ VcsCommand *GitClient::vcsExecAbortable(const FilePath &workingDirectory, command->addJob({vcsBinary(), arguments}, isRebase ? 0 : vcsTimeoutS()); ConflictHandler::attachToCommand(command, workingDirectory, abortCommand); if (isRebase) - GitProgressParser::attachToCommand(command); + command->setProgressParser(GitProgressParser()); command->start(); return command; diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index b7097c873dc..39519e1a838 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -13,16 +13,12 @@ #include #include #include -#include +#include #include #include -#include #include #include -#include - -#include /*! \fn void Utils::ProgressParser::parseProgress(const QString &text) @@ -67,8 +63,6 @@ public: m_futureInterface.setProgressRange(0, 1); } - ~VcsCommandPrivate() { delete m_progressParser; } - Environment environment() { if (!(m_flags & RunFlags::ForceCLocale)) @@ -98,7 +92,7 @@ public: const FilePath m_defaultWorkingDirectory; Environment m_environment; QTextCodec *m_codec = nullptr; - ProgressParser *m_progressParser = nullptr; + ProgressParser m_progressParser = {}; QFutureWatcher m_watcher; QList m_jobs; @@ -143,8 +137,6 @@ void VcsCommandPrivate::setup() GlobalFileChangeBlocker::instance()->forceBlocked(true); }); } - if (m_progressParser) - m_progressParser->setFuture(&m_futureInterface); } void VcsCommandPrivate::cleanup() @@ -156,8 +148,6 @@ void VcsCommandPrivate::cleanup() GlobalFileChangeBlocker::instance()->forceBlocked(false); }); } - if (m_progressParser) - m_progressParser->setFuture(nullptr); } void VcsCommandPrivate::setupProcess(QtcProcess *process, const Job &job) @@ -186,7 +176,7 @@ void VcsCommandPrivate::installStdCallbacks(QtcProcess *process) || !(m_flags & RunFlags::SuppressStdErr))) { process->setStdErrCallback([this](const QString &text) { if (m_progressParser) - m_progressParser->parseProgress(text); + m_progressParser(m_futureInterface, text); if (!(m_flags & RunFlags::SuppressStdErr)) emit q->appendError(text); if (m_flags & RunFlags::ProgressiveOutput) @@ -198,7 +188,7 @@ void VcsCommandPrivate::installStdCallbacks(QtcProcess *process) || m_flags & RunFlags::ShowStdOut) { process->setStdOutCallback([this](const QString &text) { if (m_progressParser) - m_progressParser->parseProgress(text); + m_progressParser(m_futureInterface, text); if (m_flags & RunFlags::ShowStdOut) { if (m_flags & RunFlags::SilentOutput) emit q->appendSilently(text); @@ -415,36 +405,11 @@ void VcsCommand::setCodec(QTextCodec *codec) } //! Use \a parser to parse progress data from stdout. Command takes ownership of \a parser -void VcsCommand::setProgressParser(ProgressParser *parser) +void VcsCommand::setProgressParser(const ProgressParser &parser) { - QTC_ASSERT(!d->m_progressParser, return); d->m_progressParser = parser; } -ProgressParser::ProgressParser() : - m_futureMutex(new QMutex) -{ } - -ProgressParser::~ProgressParser() -{ - delete m_futureMutex; -} - -void ProgressParser::setProgressAndMaximum(int value, int maximum) -{ - QMutexLocker lock(m_futureMutex); - if (!m_future) - return; - m_future->setProgressRange(0, maximum); - m_future->setProgressValue(value); -} - -void ProgressParser::setFuture(QFutureInterface *future) -{ - QMutexLocker lock(m_futureMutex); - m_future = future; -} - CommandResult::CommandResult(const QtcProcess &process) : m_result(process.result()) , m_exitCode(process.exitCode()) diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h index f26cf53f963..a948519dade 100644 --- a/src/plugins/vcsbase/vcscommand.h +++ b/src/plugins/vcsbase/vcscommand.h @@ -12,7 +12,6 @@ #include QT_BEGIN_NAMESPACE -class QMutex; class QVariant; template class QFuture; @@ -31,23 +30,7 @@ namespace VcsBase { namespace Internal { class VcsCommandPrivate; } -class VCSBASE_EXPORT ProgressParser -{ -public: - ProgressParser(); - virtual ~ProgressParser(); - -protected: - virtual void parseProgress(const QString &text) = 0; - void setProgressAndMaximum(int value, int maximum); - -private: - void setFuture(QFutureInterface *future); - - QFutureInterface *m_future; - QMutex *m_futureMutex = nullptr; - friend class Internal::VcsCommandPrivate; -}; +using ProgressParser = std::function &, const QString &)>; class VCSBASE_EXPORT CommandResult { @@ -96,7 +79,7 @@ public: void setCodec(QTextCodec *codec); - void setProgressParser(ProgressParser *parser); + void setProgressParser(const ProgressParser &parser); static CommandResult runBlocking(const Utils::FilePath &workingDirectory, const Utils::Environment &environmentconst, From 531e1a572e9c19c6deee56bc0898bd477982547d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sivert=20Kr=C3=B8vel?= Date: Tue, 27 Sep 2022 12:10:23 +0200 Subject: [PATCH 096/104] McuSupport: Add flag in JSON for adding a package path to system path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An entry called "addToSystemPath" was added to JSON files to signal whether the corresponding path should also be added to the system path. Task-number: UL-6409 Change-Id: I2d7ba38b3905d67475a3c482692e4f8e21d4141e Reviewed-by: Reviewed-by: Piotr Mućko Reviewed-by: hjk (cherry picked from commit fb643db0885ebefffe86f876fdbb6d403f5baafe) Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportsdk.cpp | 2 +- src/plugins/mcusupport/mcutargetfactory.cpp | 3 ++- .../test/armgcc_ek_ra6m3g_baremetal_json.h | 3 ++- .../test/armgcc_ek_ra6m3g_freertos_json.h | 3 ++- .../test/armgcc_mimxrt1050_evk_baremetal_json.h | 3 ++- .../test/armgcc_mimxrt1050_evk_freertos_json.h | 3 ++- .../test/armgcc_mimxrt1060_evk_baremetal_json.h | 3 ++- .../test/armgcc_mimxrt1064_evk_baremetal_json.h | 3 ++- .../test/armgcc_mimxrt1064_evk_freertos_json.h | 3 ++- .../test/armgcc_mimxrt1170_evk_freertos_json.h | 3 ++- ...armgcc_stm32f469i_discovery_baremetal_json.h | 3 ++- ...armgcc_stm32f769i_discovery_baremetal_json.h | 3 ++- .../armgcc_stm32f769i_discovery_freertos_json.h | 3 ++- ...armgcc_stm32h750b_discovery_baremetal_json.h | 3 ++- .../test/ghs_rh850_d1m1a_baremetal_json.h | 3 ++- .../test/ghs_tviic2d4m_baremetal_json.h | 3 ++- .../test/ghs_tviic2d6m_baremetal_json.h | 3 ++- .../test/iar_ek_ra6m3g_baremetal_json.h | 3 ++- .../test/iar_ek_ra6m3g_freertos_json.h | 3 ++- .../test/iar_mimxrt1050_evk_baremetal_json.h | 3 ++- .../test/iar_mimxrt1050_evk_freertos_json.h | 3 ++- .../test/iar_mimxrt1060_evk_baremetal_json.h | 3 ++- .../test/iar_mimxrt1064_evk_baremetal_json.h | 3 ++- .../test/iar_mimxrt1064_evk_freertos_json.h | 3 ++- .../test/iar_mimxrt1170_evk_freertos_json.h | 3 ++- .../iar_stm32f469i_discovery_baremetal_json.h | 3 ++- .../iar_stm32f769i_discovery_baremetal_json.h | 3 ++- .../iar_stm32f769i_discovery_freertos_json.h | 3 ++- .../iar_stm32h750b_discovery_baremetal_json.h | 3 ++- .../test/iar_tviic2d6m_baremetal_json.h | 3 ++- src/plugins/mcusupport/test/unittest.cpp | 17 +++++++++++++++++ src/plugins/mcusupport/test/unittest.h | 1 + 32 files changed, 77 insertions(+), 30 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index cea595d2d89..f9213d00f7c 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -649,7 +649,7 @@ static PackageDescription parsePackage(const QJsonObject &cmakeEntry) FilePath::fromUserInput(cmakeEntry["validation"].toString()), versions, parseVersionDetection(cmakeEntry), - false}; + cmakeEntry["addToSystemPath"].toBool()}; } static QList parsePackages(const QJsonArray &cmakeEntries) diff --git a/src/plugins/mcusupport/mcutargetfactory.cpp b/src/plugins/mcusupport/mcutargetfactory.cpp index e6fb8c41d58..91229bd2418 100644 --- a/src/plugins/mcusupport/mcutargetfactory.cpp +++ b/src/plugins/mcusupport/mcutargetfactory.cpp @@ -140,7 +140,8 @@ McuPackagePtr McuTargetFactory::createPackage(const PackageDescription &pkgDesc) pkgDesc.envVar, pkgDesc.versions, {}, - createVersionDetection(pkgDesc.versionDetection)}}; + createVersionDetection(pkgDesc.versionDetection), + pkgDesc.shouldAddToSystemPath}}; } McuToolChainPackage *McuTargetFactory::createToolchain( diff --git a/src/plugins/mcusupport/test/armgcc_ek_ra6m3g_baremetal_json.h b/src/plugins/mcusupport/test/armgcc_ek_ra6m3g_baremetal_json.h index c4da86afb40..92b3c733dab 100644 --- a/src/plugins/mcusupport/test/armgcc_ek_ra6m3g_baremetal_json.h +++ b/src/plugins/mcusupport/test/armgcc_ek_ra6m3g_baremetal_json.h @@ -24,7 +24,8 @@ constexpr auto armgcc_ek_ra6m3g_baremetal_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/SEGGER/JLink", "unix": "/opt/SEGGER/JLink" }, - "optional": true + "optional": true, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_ek_ra6m3g_freertos_json.h b/src/plugins/mcusupport/test/armgcc_ek_ra6m3g_freertos_json.h index a7dc79022af..e347828d093 100644 --- a/src/plugins/mcusupport/test/armgcc_ek_ra6m3g_freertos_json.h +++ b/src/plugins/mcusupport/test/armgcc_ek_ra6m3g_freertos_json.h @@ -24,7 +24,8 @@ constexpr auto armgcc_ek_ra6m3g_freertos_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/SEGGER/JLink", "unix": "/opt/SEGGER/JLink" }, - "optional": true + "optional": true, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_mimxrt1050_evk_baremetal_json.h b/src/plugins/mcusupport/test/armgcc_mimxrt1050_evk_baremetal_json.h index 1b91b062925..a6a6fc2f796 100644 --- a/src/plugins/mcusupport/test/armgcc_mimxrt1050_evk_baremetal_json.h +++ b/src/plugins/mcusupport/test/armgcc_mimxrt1050_evk_baremetal_json.h @@ -27,7 +27,8 @@ constexpr auto armgcc_mimxrt1050_evk_baremetal_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_mimxrt1050_evk_freertos_json.h b/src/plugins/mcusupport/test/armgcc_mimxrt1050_evk_freertos_json.h index 3b6887f914f..1d3eb8eeb23 100644 --- a/src/plugins/mcusupport/test/armgcc_mimxrt1050_evk_freertos_json.h +++ b/src/plugins/mcusupport/test/armgcc_mimxrt1050_evk_freertos_json.h @@ -27,7 +27,8 @@ constexpr auto armgcc_mimxrt1050_evk_freertos_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_mimxrt1060_evk_baremetal_json.h b/src/plugins/mcusupport/test/armgcc_mimxrt1060_evk_baremetal_json.h index 8cb4679cedc..f8a164cdf33 100644 --- a/src/plugins/mcusupport/test/armgcc_mimxrt1060_evk_baremetal_json.h +++ b/src/plugins/mcusupport/test/armgcc_mimxrt1060_evk_baremetal_json.h @@ -23,7 +23,8 @@ constexpr auto armgcc_mimxrt1060_evk_baremetal_json = R"( "windows": "%{Env:ROOT}/nxp/MCUXpressoIDE*", "unix": "/usr/local/mcuxpressoide/" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_mimxrt1064_evk_baremetal_json.h b/src/plugins/mcusupport/test/armgcc_mimxrt1064_evk_baremetal_json.h index 3683818f2a6..21d760fb13e 100644 --- a/src/plugins/mcusupport/test/armgcc_mimxrt1064_evk_baremetal_json.h +++ b/src/plugins/mcusupport/test/armgcc_mimxrt1064_evk_baremetal_json.h @@ -27,7 +27,8 @@ constexpr auto armgcc_mimxrt1064_evk_baremetal_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_mimxrt1064_evk_freertos_json.h b/src/plugins/mcusupport/test/armgcc_mimxrt1064_evk_freertos_json.h index c2778bd61e6..e0b6ae8db10 100644 --- a/src/plugins/mcusupport/test/armgcc_mimxrt1064_evk_freertos_json.h +++ b/src/plugins/mcusupport/test/armgcc_mimxrt1064_evk_freertos_json.h @@ -27,7 +27,8 @@ constexpr auto armgcc_mimxrt1064_evk_freertos_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_mimxrt1170_evk_freertos_json.h b/src/plugins/mcusupport/test/armgcc_mimxrt1170_evk_freertos_json.h index 16918857ad3..23407137161 100644 --- a/src/plugins/mcusupport/test/armgcc_mimxrt1170_evk_freertos_json.h +++ b/src/plugins/mcusupport/test/armgcc_mimxrt1170_evk_freertos_json.h @@ -27,7 +27,8 @@ constexpr auto armgcc_mimxrt1170_evk_freertos_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_stm32f469i_discovery_baremetal_json.h b/src/plugins/mcusupport/test/armgcc_stm32f469i_discovery_baremetal_json.h index 9dff84e6f08..763e039b548 100644 --- a/src/plugins/mcusupport/test/armgcc_stm32f469i_discovery_baremetal_json.h +++ b/src/plugins/mcusupport/test/armgcc_stm32f469i_discovery_baremetal_json.h @@ -22,7 +22,8 @@ constexpr auto armgcc_stm32f469i_discovery_baremetal_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_stm32f769i_discovery_baremetal_json.h b/src/plugins/mcusupport/test/armgcc_stm32f769i_discovery_baremetal_json.h index 5e85ada4362..405c25f934a 100644 --- a/src/plugins/mcusupport/test/armgcc_stm32f769i_discovery_baremetal_json.h +++ b/src/plugins/mcusupport/test/armgcc_stm32f769i_discovery_baremetal_json.h @@ -23,7 +23,8 @@ constexpr auto armgcc_stm32f769i_discovery_baremetal_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_stm32f769i_discovery_freertos_json.h b/src/plugins/mcusupport/test/armgcc_stm32f769i_discovery_freertos_json.h index 60742512cc5..c061bd19e8b 100644 --- a/src/plugins/mcusupport/test/armgcc_stm32f769i_discovery_freertos_json.h +++ b/src/plugins/mcusupport/test/armgcc_stm32f769i_discovery_freertos_json.h @@ -23,7 +23,8 @@ constexpr auto armgcc_stm32f769i_discovery_freertos_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/armgcc_stm32h750b_discovery_baremetal_json.h b/src/plugins/mcusupport/test/armgcc_stm32h750b_discovery_baremetal_json.h index 78c09d5cadf..66af227d7b0 100644 --- a/src/plugins/mcusupport/test/armgcc_stm32h750b_discovery_baremetal_json.h +++ b/src/plugins/mcusupport/test/armgcc_stm32h750b_discovery_baremetal_json.h @@ -23,7 +23,8 @@ constexpr auto armgcc_stm32h750b_discovery_baremetal_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/ghs_rh850_d1m1a_baremetal_json.h b/src/plugins/mcusupport/test/ghs_rh850_d1m1a_baremetal_json.h index d44d672b0ea..bac50527196 100644 --- a/src/plugins/mcusupport/test/ghs_rh850_d1m1a_baremetal_json.h +++ b/src/plugins/mcusupport/test/ghs_rh850_d1m1a_baremetal_json.h @@ -25,7 +25,8 @@ constexpr auto ghs_rh850_d1m1a_baremetal_json = R"( "unix": "%{Env:HOME}" }, "envVar": "RenesasFlashProgrammer_PATH", - "optional": true + "optional": true, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/ghs_tviic2d4m_baremetal_json.h b/src/plugins/mcusupport/test/ghs_tviic2d4m_baremetal_json.h index a2c31c289a2..c10f1f052fc 100644 --- a/src/plugins/mcusupport/test/ghs_tviic2d4m_baremetal_json.h +++ b/src/plugins/mcusupport/test/ghs_tviic2d4m_baremetal_json.h @@ -19,7 +19,8 @@ constexpr auto ghs_tviic2d4m_baremetal_json = R"( "label": "Cypress Auto Flash Utility", "type": "path", "cmakeVar": "INFINEON_AUTO_FLASH_UTILITY_DIR", - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/ghs_tviic2d6m_baremetal_json.h b/src/plugins/mcusupport/test/ghs_tviic2d6m_baremetal_json.h index d10a28097a7..1f8b6bbb6dd 100644 --- a/src/plugins/mcusupport/test/ghs_tviic2d6m_baremetal_json.h +++ b/src/plugins/mcusupport/test/ghs_tviic2d6m_baremetal_json.h @@ -19,7 +19,8 @@ constexpr auto ghs_tviic2d6m_baremetal_json = R"( "label": "Cypress Auto Flash Utility", "type": "path", "cmakeVar": "INFINEON_AUTO_FLASH_UTILITY_DIR", - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_ek_ra6m3g_baremetal_json.h b/src/plugins/mcusupport/test/iar_ek_ra6m3g_baremetal_json.h index 311cdc5dcb4..3df8455c07d 100644 --- a/src/plugins/mcusupport/test/iar_ek_ra6m3g_baremetal_json.h +++ b/src/plugins/mcusupport/test/iar_ek_ra6m3g_baremetal_json.h @@ -24,7 +24,8 @@ constexpr auto iar_ek_ra6m3g_baremetal_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/SEGGER/JLink", "unix": "/opt/SEGGER/JLink" }, - "optional": true + "optional": true, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_ek_ra6m3g_freertos_json.h b/src/plugins/mcusupport/test/iar_ek_ra6m3g_freertos_json.h index ef9e0d9b348..570259672cf 100644 --- a/src/plugins/mcusupport/test/iar_ek_ra6m3g_freertos_json.h +++ b/src/plugins/mcusupport/test/iar_ek_ra6m3g_freertos_json.h @@ -24,7 +24,8 @@ constexpr auto iar_ek_ra6m3g_freertos_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/SEGGER/JLink", "unix": "/opt/SEGGER/JLink" }, - "optional": true + "optional": true, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_mimxrt1050_evk_baremetal_json.h b/src/plugins/mcusupport/test/iar_mimxrt1050_evk_baremetal_json.h index 42092c4edc3..9903abd6c84 100644 --- a/src/plugins/mcusupport/test/iar_mimxrt1050_evk_baremetal_json.h +++ b/src/plugins/mcusupport/test/iar_mimxrt1050_evk_baremetal_json.h @@ -27,7 +27,8 @@ constexpr auto iar_mimxrt1050_evk_baremetal_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_mimxrt1050_evk_freertos_json.h b/src/plugins/mcusupport/test/iar_mimxrt1050_evk_freertos_json.h index d069b90759a..c5c0cee2d4c 100644 --- a/src/plugins/mcusupport/test/iar_mimxrt1050_evk_freertos_json.h +++ b/src/plugins/mcusupport/test/iar_mimxrt1050_evk_freertos_json.h @@ -27,7 +27,8 @@ constexpr auto iar_mimxrt1050_evk_freertos_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_mimxrt1060_evk_baremetal_json.h b/src/plugins/mcusupport/test/iar_mimxrt1060_evk_baremetal_json.h index 4131601d2a5..5ad87a16c56 100644 --- a/src/plugins/mcusupport/test/iar_mimxrt1060_evk_baremetal_json.h +++ b/src/plugins/mcusupport/test/iar_mimxrt1060_evk_baremetal_json.h @@ -27,7 +27,8 @@ constexpr auto iar_mimxrt1060_evk_baremetal_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_mimxrt1064_evk_baremetal_json.h b/src/plugins/mcusupport/test/iar_mimxrt1064_evk_baremetal_json.h index ec582712703..634d3b92505 100644 --- a/src/plugins/mcusupport/test/iar_mimxrt1064_evk_baremetal_json.h +++ b/src/plugins/mcusupport/test/iar_mimxrt1064_evk_baremetal_json.h @@ -27,7 +27,8 @@ constexpr auto iar_mimxrt1064_evk_baremetal_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_mimxrt1064_evk_freertos_json.h b/src/plugins/mcusupport/test/iar_mimxrt1064_evk_freertos_json.h index 83255e94c75..8a223c2a6db 100644 --- a/src/plugins/mcusupport/test/iar_mimxrt1064_evk_freertos_json.h +++ b/src/plugins/mcusupport/test/iar_mimxrt1064_evk_freertos_json.h @@ -27,7 +27,8 @@ constexpr auto iar_mimxrt1064_evk_freertos_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_mimxrt1170_evk_freertos_json.h b/src/plugins/mcusupport/test/iar_mimxrt1170_evk_freertos_json.h index 51c9e21a805..c77aa9c3f32 100644 --- a/src/plugins/mcusupport/test/iar_mimxrt1170_evk_freertos_json.h +++ b/src/plugins/mcusupport/test/iar_mimxrt1170_evk_freertos_json.h @@ -27,7 +27,8 @@ constexpr auto iar_mimxrt1170_evk_freertos_json = R"( "versionDetection": { "filePattern": "ide/binaries/crt_emu_cm_redlink" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_stm32f469i_discovery_baremetal_json.h b/src/plugins/mcusupport/test/iar_stm32f469i_discovery_baremetal_json.h index af002fa7fa3..74f1012f61c 100644 --- a/src/plugins/mcusupport/test/iar_stm32f469i_discovery_baremetal_json.h +++ b/src/plugins/mcusupport/test/iar_stm32f469i_discovery_baremetal_json.h @@ -22,7 +22,8 @@ constexpr auto iar_stm32f469i_discovery_baremetal_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_stm32f769i_discovery_baremetal_json.h b/src/plugins/mcusupport/test/iar_stm32f769i_discovery_baremetal_json.h index bb749ae5e39..8ff4c748cde 100644 --- a/src/plugins/mcusupport/test/iar_stm32f769i_discovery_baremetal_json.h +++ b/src/plugins/mcusupport/test/iar_stm32f769i_discovery_baremetal_json.h @@ -23,7 +23,8 @@ constexpr auto iar_stm32f769i_discovery_baremetal_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_stm32f769i_discovery_freertos_json.h b/src/plugins/mcusupport/test/iar_stm32f769i_discovery_freertos_json.h index 4200c61611d..2817aed3a0d 100644 --- a/src/plugins/mcusupport/test/iar_stm32f769i_discovery_freertos_json.h +++ b/src/plugins/mcusupport/test/iar_stm32f769i_discovery_freertos_json.h @@ -23,7 +23,8 @@ constexpr auto iar_stm32f769i_discovery_freertos_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_stm32h750b_discovery_baremetal_json.h b/src/plugins/mcusupport/test/iar_stm32h750b_discovery_baremetal_json.h index a272a3a4800..836cdde05d0 100644 --- a/src/plugins/mcusupport/test/iar_stm32h750b_discovery_baremetal_json.h +++ b/src/plugins/mcusupport/test/iar_stm32h750b_discovery_baremetal_json.h @@ -23,7 +23,8 @@ constexpr auto iar_stm32h750b_discovery_baremetal_json = R"( "windows": "%{Env:PROGRAMSANDFILES}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/", "unix": "%{Env:HOME}/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" }, - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/iar_tviic2d6m_baremetal_json.h b/src/plugins/mcusupport/test/iar_tviic2d6m_baremetal_json.h index 78520e48d24..2b5ec845bf4 100644 --- a/src/plugins/mcusupport/test/iar_tviic2d6m_baremetal_json.h +++ b/src/plugins/mcusupport/test/iar_tviic2d6m_baremetal_json.h @@ -19,7 +19,8 @@ constexpr auto iar_tviic2d6m_baremetal_json = R"( "label": "Cypress Auto Flash Utility", "type": "path", "cmakeVar": "INFINEON_AUTO_FLASH_UTILITY_DIR", - "optional": false + "optional": false, + "addToSystemPath": true } ] }, diff --git a/src/plugins/mcusupport/test/unittest.cpp b/src/plugins/mcusupport/test/unittest.cpp index 0e441a2d60b..64301f3009d 100644 --- a/src/plugins/mcusupport/test/unittest.cpp +++ b/src/plugins/mcusupport/test/unittest.cpp @@ -1454,4 +1454,21 @@ void McuSupportTest::test_defaultValueForEachOperationSystem() else QCOMPARE(QString("/usr/local/mcuxpressoide"), default_path_entry); }; +void McuSupportTest::test_addToSystemPathFlag() +{ + const auto targetDescription = parseDescriptionJson(armgcc_stm32f769i_discovery_freertos_json); + + const auto programmerPackage = targetDescription.platform.entries[0]; + const auto compilerPackage = targetDescription.toolchain.compiler; + const auto toolchainFilePackage = targetDescription.toolchain.file; + const auto boardSdkPackage = targetDescription.boardSdk; + const auto freeRtosPackage = targetDescription.freeRTOS.package; + + QCOMPARE(programmerPackage.shouldAddToSystemPath, true); + QCOMPARE(compilerPackage.shouldAddToSystemPath, false); + QCOMPARE(toolchainFilePackage.shouldAddToSystemPath, false); + QCOMPARE(boardSdkPackage.shouldAddToSystemPath, false); + QCOMPARE(freeRtosPackage.shouldAddToSystemPath, false); +} + } // namespace McuSupport::Internal::Test diff --git a/src/plugins/mcusupport/test/unittest.h b/src/plugins/mcusupport/test/unittest.h index 732d636f3ac..be46281beba 100644 --- a/src/plugins/mcusupport/test/unittest.h +++ b/src/plugins/mcusupport/test/unittest.h @@ -96,6 +96,7 @@ private slots: void test_legacy_createThirdPartyPackage(); void test_defaultValueForEachOperationSystem(); + void test_addToSystemPathFlag(); private: QVersionNumber currentQulVersion{2, 0}; From 7c0c57fef9ad9c5057adb5c7f73c5c894ef644ff Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 7 Oct 2022 16:57:28 +0200 Subject: [PATCH 097/104] VcsCommand: Remove outdated comments Amends 93dfa93b7dd6d338539927a43b52f5d5e96b03e4 Change-Id: Iad2f4002aaa4579aa90209daf7a7a960607e3c36 Reviewed-by: Reviewed-by: Orgad Shaneh --- src/plugins/vcsbase/vcscommand.cpp | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index 39519e1a838..c62508d57bc 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -20,23 +20,6 @@ #include #include -/*! - \fn void Utils::ProgressParser::parseProgress(const QString &text) - - Reimplement to parse progress as it appears in the standard output. - If a progress string is detected, call \c setProgressAndMaximum() to update - the progress bar accordingly. - - \sa Utils::ProgressParser::setProgressAndMaximum() -*/ - -/*! - \fn void Utils::ProgressParser::setProgressAndMaximum(int value, int maximum) - - Sets progress \a value and \a maximum for current command. Called by \c parseProgress() - when a progress string is detected. -*/ - using namespace Core; using namespace Utils; From 5e786d444db492222b878e2f1489348d8cdc8b41 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 6 Oct 2022 16:58:18 +0200 Subject: [PATCH 098/104] Meson: Flatten directory hierarchy Keep tests/ and icons/ but put the rest into the toplevel. The previous setup was so different from the rest of the bunch that it regularly stuck out in maintenance tasks. Change-Id: I69821be6268f69682353a388f6bb1fa343215303 Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Alessandro Portale --- .../mesonprojectmanager/CMakeLists.txt | 178 ++++++++--------- .../optionsmodel => }/arrayoptionlineedit.cpp | 0 .../optionsmodel => }/arrayoptionlineedit.h | 0 .../{mesoninfoparser => }/buildoptions.h | 0 .../optionsmodel => }/buildoptionsmodel.cpp | 3 +- .../optionsmodel => }/buildoptionsmodel.h | 2 +- .../parsers => }/buildoptionsparser.h | 4 +- .../parsers => }/buildsystemfilesparser.h | 2 +- .../{mesoninfoparser/parsers => }/common.h | 0 .../parsers => }/infoparser.h | 4 +- .../{kithelper => }/kitdata.h | 0 .../{kithelper => }/kithelper.h | 0 .../{machinefiles => }/machinefilemanager.cpp | 4 +- .../{machinefiles => }/machinefilemanager.h | 0 .../mesonactionsmanager.cpp | 11 +- .../mesonactionsmanager.h | 0 .../{project => }/mesonbuildconfiguration.cpp | 4 +- .../{project => }/mesonbuildconfiguration.h | 2 - .../mesonbuildsettingswidget.cpp | 4 +- .../mesonbuildsettingswidget.h | 2 +- .../{project => }/mesonbuildsystem.cpp | 8 +- .../{project => }/mesonbuildsystem.h | 3 +- .../{mesoninfoparser => }/mesoninfo.h | 0 .../{mesoninfoparser => }/mesoninfoparser.h | 8 +- .../outputparsers => }/mesonoutputparser.cpp | 0 .../outputparsers => }/mesonoutputparser.h | 0 .../{project => }/mesonprocess.cpp | 2 +- .../{project => }/mesonprocess.h | 2 +- .../{project => }/mesonproject.cpp | 4 +- .../{project => }/mesonproject.h | 0 .../{project => }/mesonprojectimporter.cpp | 0 .../{project => }/mesonprojectimporter.h | 0 .../mesonprojectmanager.qbs | 184 +++++++++--------- .../projecttree => }/mesonprojectnodes.cpp | 4 +- .../projecttree => }/mesonprojectnodes.h | 0 .../{project => }/mesonprojectparser.cpp | 8 +- .../{project => }/mesonprojectparser.h | 10 +- .../mesonprojectplugin.cpp | 22 +-- .../{project => }/mesonrunconfiguration.cpp | 0 .../{project => }/mesonrunconfiguration.h | 0 .../kitaspect => }/mesontoolkitaspect.cpp | 0 .../tools/kitaspect => }/mesontoolkitaspect.h | 2 +- .../{exewrappers => }/mesontools.cpp | 0 .../{exewrappers => }/mesontools.h | 0 .../{exewrappers => }/mesonwrapper.cpp | 0 .../{exewrappers => }/mesonwrapper.h | 2 +- .../nativefilegenerator.cpp | 2 +- .../{machinefiles => }/nativefilegenerator.h | 2 +- .../{project => }/ninjabuildstep.cpp | 6 +- .../{project => }/ninjabuildstep.h | 2 +- .../outputparsers => }/ninjaparser.cpp | 0 .../{project/outputparsers => }/ninjaparser.h | 0 .../kitaspect => }/ninjatoolkitaspect.cpp | 0 .../tools/kitaspect => }/ninjatoolkitaspect.h | 2 +- .../{exewrappers => }/ninjawrapper.h | 2 +- .../{project/projecttree => }/projecttree.cpp | 0 .../{project/projecttree => }/projecttree.h | 2 +- .../{settings/general => }/settings.cpp | 0 .../{settings/general => }/settings.h | 0 .../{mesoninfoparser => }/target.h | 0 .../parsers => }/targetparser.h | 4 +- .../tests/testmesoninfoparser.cpp | 4 +- .../tests/testmesonparser.cpp | 2 +- .../tests/testmesonwrapper.cpp | 2 +- .../tests/testninjaparser.cpp | 2 +- .../{settings/tools => }/toolitemsettings.cpp | 0 .../{settings/tools => }/toolitemsettings.h | 0 .../kitaspect => }/toolkitaspectwidget.cpp | 0 .../kitaspect => }/toolkitaspectwidget.h | 2 +- .../{settings/tools => }/toolsmodel.cpp | 2 +- .../{settings/tools => }/toolsmodel.h | 2 +- .../tools => }/toolssettingsaccessor.cpp | 0 .../tools => }/toolssettingsaccessor.h | 2 +- .../tools => }/toolssettingspage.cpp | 0 .../{settings/tools => }/toolssettingspage.h | 0 .../tools => }/toolssettingswidget.cpp | 0 .../tools => }/toolssettingswidget.h | 0 .../{settings/tools => }/tooltreeitem.cpp | 0 .../{settings/tools => }/tooltreeitem.h | 2 +- .../{exewrappers => }/toolwrapper.cpp | 0 .../{exewrappers => }/toolwrapper.h | 0 81 files changed, 260 insertions(+), 261 deletions(-) rename src/plugins/mesonprojectmanager/{project/buildoptions/optionsmodel => }/arrayoptionlineedit.cpp (100%) rename src/plugins/mesonprojectmanager/{project/buildoptions/optionsmodel => }/arrayoptionlineedit.h (100%) rename src/plugins/mesonprojectmanager/{mesoninfoparser => }/buildoptions.h (100%) rename src/plugins/mesonprojectmanager/{project/buildoptions/optionsmodel => }/buildoptionsmodel.cpp (98%) rename src/plugins/mesonprojectmanager/{project/buildoptions/optionsmodel => }/buildoptionsmodel.h (99%) rename src/plugins/mesonprojectmanager/{mesoninfoparser/parsers => }/buildoptionsparser.h (98%) rename src/plugins/mesonprojectmanager/{mesoninfoparser/parsers => }/buildsystemfilesparser.h (97%) rename src/plugins/mesonprojectmanager/{mesoninfoparser/parsers => }/common.h (100%) rename src/plugins/mesonprojectmanager/{mesoninfoparser/parsers => }/infoparser.h (95%) rename src/plugins/mesonprojectmanager/{kithelper => }/kitdata.h (100%) rename src/plugins/mesonprojectmanager/{kithelper => }/kithelper.h (100%) rename src/plugins/mesonprojectmanager/{machinefiles => }/machinefilemanager.cpp (98%) rename src/plugins/mesonprojectmanager/{machinefiles => }/machinefilemanager.h (100%) rename src/plugins/mesonprojectmanager/{mesonactionsmanager => }/mesonactionsmanager.cpp (94%) rename src/plugins/mesonprojectmanager/{mesonactionsmanager => }/mesonactionsmanager.h (100%) rename src/plugins/mesonprojectmanager/{project => }/mesonbuildconfiguration.cpp (98%) rename src/plugins/mesonprojectmanager/{project => }/mesonbuildconfiguration.h (98%) rename src/plugins/mesonprojectmanager/{project/buildoptions => }/mesonbuildsettingswidget.cpp (98%) rename src/plugins/mesonprojectmanager/{project/buildoptions => }/mesonbuildsettingswidget.h (94%) rename src/plugins/mesonprojectmanager/{project => }/mesonbuildsystem.cpp (97%) rename src/plugins/mesonprojectmanager/{project => }/mesonbuildsystem.h (96%) rename src/plugins/mesonprojectmanager/{mesoninfoparser => }/mesoninfo.h (100%) rename src/plugins/mesonprojectmanager/{mesoninfoparser => }/mesoninfoparser.h (91%) rename src/plugins/mesonprojectmanager/{project/outputparsers => }/mesonoutputparser.cpp (100%) rename src/plugins/mesonprojectmanager/{project/outputparsers => }/mesonoutputparser.h (100%) rename src/plugins/mesonprojectmanager/{project => }/mesonprocess.cpp (99%) rename src/plugins/mesonprojectmanager/{project => }/mesonprocess.h (97%) rename src/plugins/mesonprojectmanager/{project => }/mesonproject.cpp (94%) rename src/plugins/mesonprojectmanager/{project => }/mesonproject.h (100%) rename src/plugins/mesonprojectmanager/{project => }/mesonprojectimporter.cpp (100%) rename src/plugins/mesonprojectmanager/{project => }/mesonprojectimporter.h (100%) rename src/plugins/mesonprojectmanager/{project/projecttree => }/mesonprojectnodes.cpp (95%) rename src/plugins/mesonprojectmanager/{project/projecttree => }/mesonprojectnodes.h (100%) rename src/plugins/mesonprojectmanager/{project => }/mesonprojectparser.cpp (98%) rename src/plugins/mesonprojectmanager/{project => }/mesonprojectparser.h (95%) rename src/plugins/mesonprojectmanager/{project => }/mesonrunconfiguration.cpp (100%) rename src/plugins/mesonprojectmanager/{project => }/mesonrunconfiguration.h (100%) rename src/plugins/mesonprojectmanager/{settings/tools/kitaspect => }/mesontoolkitaspect.cpp (100%) rename src/plugins/mesonprojectmanager/{settings/tools/kitaspect => }/mesontoolkitaspect.h (97%) rename src/plugins/mesonprojectmanager/{exewrappers => }/mesontools.cpp (100%) rename src/plugins/mesonprojectmanager/{exewrappers => }/mesontools.h (100%) rename src/plugins/mesonprojectmanager/{exewrappers => }/mesonwrapper.cpp (100%) rename src/plugins/mesonprojectmanager/{exewrappers => }/mesonwrapper.h (99%) rename src/plugins/mesonprojectmanager/{machinefiles => }/nativefilegenerator.cpp (98%) rename src/plugins/mesonprojectmanager/{machinefiles => }/nativefilegenerator.h (93%) rename src/plugins/mesonprojectmanager/{project => }/ninjabuildstep.cpp (98%) rename src/plugins/mesonprojectmanager/{project => }/ninjabuildstep.h (97%) rename src/plugins/mesonprojectmanager/{project/outputparsers => }/ninjaparser.cpp (100%) rename src/plugins/mesonprojectmanager/{project/outputparsers => }/ninjaparser.h (100%) rename src/plugins/mesonprojectmanager/{settings/tools/kitaspect => }/ninjatoolkitaspect.cpp (100%) rename src/plugins/mesonprojectmanager/{settings/tools/kitaspect => }/ninjatoolkitaspect.h (97%) rename src/plugins/mesonprojectmanager/{exewrappers => }/ninjawrapper.h (97%) rename src/plugins/mesonprojectmanager/{project/projecttree => }/projecttree.cpp (100%) rename src/plugins/mesonprojectmanager/{project/projecttree => }/projecttree.h (93%) rename src/plugins/mesonprojectmanager/{settings/general => }/settings.cpp (100%) rename src/plugins/mesonprojectmanager/{settings/general => }/settings.h (100%) rename src/plugins/mesonprojectmanager/{mesoninfoparser => }/target.h (100%) rename src/plugins/mesonprojectmanager/{mesoninfoparser/parsers => }/targetparser.h (97%) rename src/plugins/mesonprojectmanager/{settings/tools => }/toolitemsettings.cpp (100%) rename src/plugins/mesonprojectmanager/{settings/tools => }/toolitemsettings.h (100%) rename src/plugins/mesonprojectmanager/{settings/tools/kitaspect => }/toolkitaspectwidget.cpp (100%) rename src/plugins/mesonprojectmanager/{settings/tools/kitaspect => }/toolkitaspectwidget.h (98%) rename src/plugins/mesonprojectmanager/{settings/tools => }/toolsmodel.cpp (98%) rename src/plugins/mesonprojectmanager/{settings/tools => }/toolsmodel.h (96%) rename src/plugins/mesonprojectmanager/{settings/tools => }/toolssettingsaccessor.cpp (100%) rename src/plugins/mesonprojectmanager/{settings/tools => }/toolssettingsaccessor.h (94%) rename src/plugins/mesonprojectmanager/{settings/tools => }/toolssettingspage.cpp (100%) rename src/plugins/mesonprojectmanager/{settings/tools => }/toolssettingspage.h (100%) rename src/plugins/mesonprojectmanager/{settings/tools => }/toolssettingswidget.cpp (100%) rename src/plugins/mesonprojectmanager/{settings/tools => }/toolssettingswidget.h (100%) rename src/plugins/mesonprojectmanager/{settings/tools => }/tooltreeitem.cpp (100%) rename src/plugins/mesonprojectmanager/{settings/tools => }/tooltreeitem.h (97%) rename src/plugins/mesonprojectmanager/{exewrappers => }/toolwrapper.cpp (100%) rename src/plugins/mesonprojectmanager/{exewrappers => }/toolwrapper.h (100%) diff --git a/src/plugins/mesonprojectmanager/CMakeLists.txt b/src/plugins/mesonprojectmanager/CMakeLists.txt index 3e2a55dfe54..ebb2f4f8621 100644 --- a/src/plugins/mesonprojectmanager/CMakeLists.txt +++ b/src/plugins/mesonprojectmanager/CMakeLists.txt @@ -6,80 +6,80 @@ add_qtc_plugin(MesonProjectManager mesonprojectplugin.cpp mesonprojectplugin.h versionhelper.h - mesonactionsmanager/mesonactionsmanager.h - mesonactionsmanager/mesonactionsmanager.cpp - settings/tools/toolsmodel.cpp - settings/tools/toolssettingswidget.h - settings/tools/toolssettingswidget.cpp - settings/tools/toolssettingspage.cpp - settings/tools/toolssettingspage.h - settings/tools/toolitemsettings.cpp - settings/tools/toolitemsettings.h - settings/tools/tooltreeitem.cpp - settings/tools/tooltreeitem.h - settings/tools/toolsmodel.h - settings/tools/kitaspect/ninjatoolkitaspect.cpp - settings/tools/kitaspect/ninjatoolkitaspect.h - settings/tools/kitaspect/toolkitaspectwidget.h - settings/tools/kitaspect/toolkitaspectwidget.cpp - settings/tools/kitaspect/mesontoolkitaspect.cpp - settings/tools/kitaspect/mesontoolkitaspect.h - settings/tools/toolssettingsaccessor.h - settings/tools/toolssettingsaccessor.cpp - settings/general/settings.h - settings/general/settings.cpp - exewrappers/mesonwrapper.cpp - exewrappers/mesonwrapper.h - exewrappers/ninjawrapper.h - exewrappers/toolwrapper.h - exewrappers/toolwrapper.cpp - exewrappers/mesontools.h - exewrappers/mesontools.cpp - mesoninfoparser/mesoninfoparser.h - mesoninfoparser/buildoptions.h - mesoninfoparser/target.h - mesoninfoparser/mesoninfo.h - mesoninfoparser/parsers/common.h - mesoninfoparser/parsers/buildoptionsparser.h - mesoninfoparser/parsers/buildsystemfilesparser.h - mesoninfoparser/parsers/infoparser.h - mesoninfoparser/parsers/targetparser.h - kithelper/kitdata.h - kithelper/kithelper.h - project/mesonproject.h - project/mesonproject.cpp - project/mesonprojectimporter.h - project/mesonprojectimporter.cpp - project/mesonbuildsystem.h - project/mesonbuildsystem.cpp - project/mesonprojectparser.h - project/mesonprojectparser.cpp - project/mesonbuildconfiguration.h - project/mesonbuildconfiguration.cpp - project/ninjabuildstep.h - project/ninjabuildstep.cpp - project/buildoptions/mesonbuildsettingswidget.h - project/buildoptions/mesonbuildsettingswidget.cpp - project/buildoptions/optionsmodel/buildoptionsmodel.h - project/buildoptions/optionsmodel/buildoptionsmodel.cpp - project/buildoptions/optionsmodel/arrayoptionlineedit.cpp - project/buildoptions/optionsmodel/arrayoptionlineedit.h - project/mesonprocess.h - project/mesonprocess.cpp - project/outputparsers/mesonoutputparser.h - project/outputparsers/mesonoutputparser.cpp - project/outputparsers/ninjaparser.h - project/outputparsers/ninjaparser.cpp - project/mesonrunconfiguration.h - project/mesonrunconfiguration.cpp - project/projecttree/projecttree.h - project/projecttree/projecttree.cpp - project/projecttree/mesonprojectnodes.h - project/projecttree/mesonprojectnodes.cpp - machinefiles/machinefilemanager.h - machinefiles/machinefilemanager.cpp - machinefiles/nativefilegenerator.h - machinefiles/nativefilegenerator.cpp + mesonactionsmanager.h + mesonactionsmanager.cpp + toolsmodel.cpp + toolssettingswidget.h + toolssettingswidget.cpp + toolssettingspage.cpp + toolssettingspage.h + toolitemsettings.cpp + toolitemsettings.h + tooltreeitem.cpp + tooltreeitem.h + toolsmodel.h + ninjatoolkitaspect.cpp + ninjatoolkitaspect.h + toolkitaspectwidget.h + toolkitaspectwidget.cpp + mesontoolkitaspect.cpp + mesontoolkitaspect.h + toolssettingsaccessor.h + toolssettingsaccessor.cpp + settings.h + settings.cpp + mesonwrapper.cpp + mesonwrapper.h + ninjawrapper.h + toolwrapper.h + toolwrapper.cpp + mesontools.h + mesontools.cpp + mesoninfoparser.h + buildoptions.h + target.h + mesoninfo.h + common.h + buildoptionsparser.h + buildsystemfilesparser.h + infoparser.h + targetparser.h + kitdata.h + kithelper.h + mesonproject.h + mesonproject.cpp + mesonprojectimporter.h + mesonprojectimporter.cpp + mesonbuildsystem.h + mesonbuildsystem.cpp + mesonprojectparser.h + mesonprojectparser.cpp + mesonbuildconfiguration.h + mesonbuildconfiguration.cpp + ninjabuildstep.h + ninjabuildstep.cpp + mesonbuildsettingswidget.h + mesonbuildsettingswidget.cpp + buildoptionsmodel.h + buildoptionsmodel.cpp + arrayoptionlineedit.cpp + arrayoptionlineedit.h + mesonprocess.h + mesonprocess.cpp + mesonoutputparser.h + mesonoutputparser.cpp + ninjaparser.h + ninjaparser.cpp + mesonrunconfiguration.h + mesonrunconfiguration.cpp + projecttree.h + projecttree.cpp + mesonprojectnodes.h + mesonprojectnodes.cpp + machinefilemanager.h + machinefilemanager.cpp + nativefilegenerator.h + nativefilegenerator.cpp resources_meson.qrc ) @@ -100,12 +100,12 @@ add_qtc_test(tst_mesonwrapper TEST_RELATIVE_LIBEXEC_PATH="${TEST_RELATIVE_LIBEXEC_PATH}" SOURCES tests/testmesonwrapper.cpp - exewrappers/mesonwrapper.cpp - exewrappers/mesonwrapper.h - exewrappers/ninjawrapper.h - exewrappers/toolwrapper.h - exewrappers/toolwrapper.cpp - exewrappers/mesontools.h + mesonwrapper.cpp + mesonwrapper.h + ninjawrapper.h + toolwrapper.h + toolwrapper.cpp + mesontools.h ) add_qtc_test(tst_mesoninfoparser @@ -121,13 +121,13 @@ add_qtc_test(tst_mesoninfoparser TEST_RELATIVE_LIBEXEC_PATH="${TEST_RELATIVE_LIBEXEC_PATH}" SOURCES tests/testmesoninfoparser.cpp - exewrappers/mesonwrapper.cpp - exewrappers/mesonwrapper.h - exewrappers/ninjawrapper.h - exewrappers/toolwrapper.h - exewrappers/toolwrapper.cpp - exewrappers/mesontools.h - mesoninfoparser/mesoninfoparser.h + mesonwrapper.cpp + mesonwrapper.h + ninjawrapper.h + toolwrapper.h + toolwrapper.cpp + mesontools.h + mesoninfoparser.h ) add_qtc_test(tst_ninjaparser @@ -138,7 +138,7 @@ add_qtc_test(tst_ninjaparser Utils ProjectExplorer SOURCES tests/testninjaparser.cpp - project/outputparsers/ninjaparser.cpp + ninjaparser.cpp ) add_qtc_test(tst_mesonparser @@ -151,7 +151,7 @@ add_qtc_test(tst_mesonparser Utils ProjectExplorer SOURCES tests/testmesonparser.cpp - project/outputparsers/mesonoutputparser.cpp + mesonoutputparser.cpp ) diff --git a/src/plugins/mesonprojectmanager/project/buildoptions/optionsmodel/arrayoptionlineedit.cpp b/src/plugins/mesonprojectmanager/arrayoptionlineedit.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/project/buildoptions/optionsmodel/arrayoptionlineedit.cpp rename to src/plugins/mesonprojectmanager/arrayoptionlineedit.cpp diff --git a/src/plugins/mesonprojectmanager/project/buildoptions/optionsmodel/arrayoptionlineedit.h b/src/plugins/mesonprojectmanager/arrayoptionlineedit.h similarity index 100% rename from src/plugins/mesonprojectmanager/project/buildoptions/optionsmodel/arrayoptionlineedit.h rename to src/plugins/mesonprojectmanager/arrayoptionlineedit.h diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser/buildoptions.h b/src/plugins/mesonprojectmanager/buildoptions.h similarity index 100% rename from src/plugins/mesonprojectmanager/mesoninfoparser/buildoptions.h rename to src/plugins/mesonprojectmanager/buildoptions.h diff --git a/src/plugins/mesonprojectmanager/project/buildoptions/optionsmodel/buildoptionsmodel.cpp b/src/plugins/mesonprojectmanager/buildoptionsmodel.cpp similarity index 98% rename from src/plugins/mesonprojectmanager/project/buildoptions/optionsmodel/buildoptionsmodel.cpp rename to src/plugins/mesonprojectmanager/buildoptionsmodel.cpp index 14fc20bbb1b..4803146ad3d 100644 --- a/src/plugins/mesonprojectmanager/project/buildoptions/optionsmodel/buildoptionsmodel.cpp +++ b/src/plugins/mesonprojectmanager/buildoptionsmodel.cpp @@ -4,6 +4,7 @@ #include "buildoptionsmodel.h" #include "arrayoptionlineedit.h" +#include "mesonprojectmanagertr.h" #include #include @@ -27,7 +28,7 @@ inline Utils::TreeItem *makeBuildOptionTreeItem(CancellableOption *buildOption) BuidOptionsModel::BuidOptionsModel(QObject *parent) : Utils::TreeModel<>(parent) { - setHeader({tr("Key"), tr("Value")}); + setHeader({Tr::tr("Key"), Tr::tr("Value")}); } inline void groupPerSubprojectAndSection( diff --git a/src/plugins/mesonprojectmanager/project/buildoptions/optionsmodel/buildoptionsmodel.h b/src/plugins/mesonprojectmanager/buildoptionsmodel.h similarity index 99% rename from src/plugins/mesonprojectmanager/project/buildoptions/optionsmodel/buildoptionsmodel.h rename to src/plugins/mesonprojectmanager/buildoptionsmodel.h index 895a346ff49..3b951c65460 100644 --- a/src/plugins/mesonprojectmanager/project/buildoptions/optionsmodel/buildoptionsmodel.h +++ b/src/plugins/mesonprojectmanager/buildoptionsmodel.h @@ -3,7 +3,7 @@ #pragma once -#include "mesoninfoparser/mesoninfoparser.h" +#include "mesoninfoparser.h" #include #include diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser/parsers/buildoptionsparser.h b/src/plugins/mesonprojectmanager/buildoptionsparser.h similarity index 98% rename from src/plugins/mesonprojectmanager/mesoninfoparser/parsers/buildoptionsparser.h rename to src/plugins/mesonprojectmanager/buildoptionsparser.h index edcda1b9fb6..26098cf7635 100644 --- a/src/plugins/mesonprojectmanager/mesoninfoparser/parsers/buildoptionsparser.h +++ b/src/plugins/mesonprojectmanager/buildoptionsparser.h @@ -3,9 +3,9 @@ #pragma once -#include "../../mesonpluginconstants.h" -#include "../buildoptions.h" +#include "buildoptions.h" #include "common.h" +#include "mesonpluginconstants.h" #include #include diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser/parsers/buildsystemfilesparser.h b/src/plugins/mesonprojectmanager/buildsystemfilesparser.h similarity index 97% rename from src/plugins/mesonprojectmanager/mesoninfoparser/parsers/buildsystemfilesparser.h rename to src/plugins/mesonprojectmanager/buildsystemfilesparser.h index 0856dac4eed..b50f9b47c5d 100644 --- a/src/plugins/mesonprojectmanager/mesoninfoparser/parsers/buildsystemfilesparser.h +++ b/src/plugins/mesonprojectmanager/buildsystemfilesparser.h @@ -3,8 +3,8 @@ #pragma once -#include "../../mesonpluginconstants.h" #include "common.h" +#include "mesonpluginconstants.h" #include diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser/parsers/common.h b/src/plugins/mesonprojectmanager/common.h similarity index 100% rename from src/plugins/mesonprojectmanager/mesoninfoparser/parsers/common.h rename to src/plugins/mesonprojectmanager/common.h diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser/parsers/infoparser.h b/src/plugins/mesonprojectmanager/infoparser.h similarity index 95% rename from src/plugins/mesonprojectmanager/mesoninfoparser/parsers/infoparser.h rename to src/plugins/mesonprojectmanager/infoparser.h index d016aa6771e..725e31a5e7c 100644 --- a/src/plugins/mesonprojectmanager/mesoninfoparser/parsers/infoparser.h +++ b/src/plugins/mesonprojectmanager/infoparser.h @@ -3,8 +3,8 @@ #pragma once -#include "../../mesonpluginconstants.h" -#include "../mesoninfo.h" +#include "mesoninfo.h" +#include "mesonpluginconstants.h" #include #include diff --git a/src/plugins/mesonprojectmanager/kithelper/kitdata.h b/src/plugins/mesonprojectmanager/kitdata.h similarity index 100% rename from src/plugins/mesonprojectmanager/kithelper/kitdata.h rename to src/plugins/mesonprojectmanager/kitdata.h diff --git a/src/plugins/mesonprojectmanager/kithelper/kithelper.h b/src/plugins/mesonprojectmanager/kithelper.h similarity index 100% rename from src/plugins/mesonprojectmanager/kithelper/kithelper.h rename to src/plugins/mesonprojectmanager/kithelper.h diff --git a/src/plugins/mesonprojectmanager/machinefiles/machinefilemanager.cpp b/src/plugins/mesonprojectmanager/machinefilemanager.cpp similarity index 98% rename from src/plugins/mesonprojectmanager/machinefiles/machinefilemanager.cpp rename to src/plugins/mesonprojectmanager/machinefilemanager.cpp index 0bfb4820492..b39b0920778 100644 --- a/src/plugins/mesonprojectmanager/machinefiles/machinefilemanager.cpp +++ b/src/plugins/mesonprojectmanager/machinefilemanager.cpp @@ -3,8 +3,8 @@ #include "machinefilemanager.h" -#include "kithelper/kitdata.h" -#include "kithelper/kithelper.h" +#include "kitdata.h" +#include "kithelper.h" #include "nativefilegenerator.h" #include diff --git a/src/plugins/mesonprojectmanager/machinefiles/machinefilemanager.h b/src/plugins/mesonprojectmanager/machinefilemanager.h similarity index 100% rename from src/plugins/mesonprojectmanager/machinefiles/machinefilemanager.h rename to src/plugins/mesonprojectmanager/machinefilemanager.h diff --git a/src/plugins/mesonprojectmanager/mesonactionsmanager/mesonactionsmanager.cpp b/src/plugins/mesonprojectmanager/mesonactionsmanager.cpp similarity index 94% rename from src/plugins/mesonprojectmanager/mesonactionsmanager/mesonactionsmanager.cpp rename to src/plugins/mesonprojectmanager/mesonactionsmanager.cpp index 260686314ea..401a4013d2e 100644 --- a/src/plugins/mesonprojectmanager/mesonactionsmanager/mesonactionsmanager.cpp +++ b/src/plugins/mesonprojectmanager/mesonactionsmanager.cpp @@ -3,13 +3,14 @@ #include "mesonactionsmanager.h" +#include "mesonbuildsystem.h" +#include "mesonprojectmanagertr.h" +#include "mesonprojectnodes.h" + #include #include #include -#include -#include - #include #include #include @@ -20,8 +21,8 @@ namespace MesonProjectManager { namespace Internal { MesonActionsManager::MesonActionsManager() - : configureActionMenu(tr("Configure")) - , configureActionContextMenu(tr("Configure")) + : configureActionMenu(Tr::tr("Configure")) + , configureActionContextMenu(Tr::tr("Configure")) { const Core::Context globalContext(Core::Constants::C_GLOBAL); const Core::Context projectContext{Constants::Project::ID}; diff --git a/src/plugins/mesonprojectmanager/mesonactionsmanager/mesonactionsmanager.h b/src/plugins/mesonprojectmanager/mesonactionsmanager.h similarity index 100% rename from src/plugins/mesonprojectmanager/mesonactionsmanager/mesonactionsmanager.h rename to src/plugins/mesonprojectmanager/mesonactionsmanager.h diff --git a/src/plugins/mesonprojectmanager/project/mesonbuildconfiguration.cpp b/src/plugins/mesonprojectmanager/mesonbuildconfiguration.cpp similarity index 98% rename from src/plugins/mesonprojectmanager/project/mesonbuildconfiguration.cpp rename to src/plugins/mesonprojectmanager/mesonbuildconfiguration.cpp index 7531ebb2fb0..91e154cfe47 100644 --- a/src/plugins/mesonprojectmanager/project/mesonbuildconfiguration.cpp +++ b/src/plugins/mesonprojectmanager/mesonbuildconfiguration.cpp @@ -3,11 +3,11 @@ #include "mesonbuildconfiguration.h" -#include "buildoptions/mesonbuildsettingswidget.h" -#include "exewrappers/mesonwrapper.h" +#include "mesonbuildsettingswidget.h" #include "mesonbuildsystem.h" #include "mesonpluginconstants.h" #include "mesonpluginconstants.h" +#include "mesonwrapper.h" #include "ninjabuildstep.h" #include diff --git a/src/plugins/mesonprojectmanager/project/mesonbuildconfiguration.h b/src/plugins/mesonprojectmanager/mesonbuildconfiguration.h similarity index 98% rename from src/plugins/mesonprojectmanager/project/mesonbuildconfiguration.h rename to src/plugins/mesonprojectmanager/mesonbuildconfiguration.h index 84b7ec96e16..a8d9b582b8d 100644 --- a/src/plugins/mesonprojectmanager/project/mesonbuildconfiguration.h +++ b/src/plugins/mesonprojectmanager/mesonbuildconfiguration.h @@ -4,8 +4,6 @@ #include "projectexplorer/buildconfiguration.h" #include "projectexplorer/target.h" -#include "utils/fileutils.h" -#include namespace MesonProjectManager { namespace Internal { diff --git a/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.cpp b/src/plugins/mesonprojectmanager/mesonbuildsettingswidget.cpp similarity index 98% rename from src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.cpp rename to src/plugins/mesonprojectmanager/mesonbuildsettingswidget.cpp index c3852917310..8bd682a7bc4 100644 --- a/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.cpp +++ b/src/plugins/mesonprojectmanager/mesonbuildsettingswidget.cpp @@ -3,8 +3,8 @@ #include "mesonbuildsettingswidget.h" -#include "../mesonbuildconfiguration.h" -#include "../mesonbuildsystem.h" +#include "mesonbuildconfiguration.h" +#include "mesonbuildsystem.h" #include diff --git a/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.h b/src/plugins/mesonprojectmanager/mesonbuildsettingswidget.h similarity index 94% rename from src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.h rename to src/plugins/mesonprojectmanager/mesonbuildsettingswidget.h index 52752285350..29680ce79a6 100644 --- a/src/plugins/mesonprojectmanager/project/buildoptions/mesonbuildsettingswidget.h +++ b/src/plugins/mesonprojectmanager/mesonbuildsettingswidget.h @@ -3,7 +3,7 @@ #pragma once -#include "optionsmodel/buildoptionsmodel.h" +#include "buildoptionsmodel.h" #include diff --git a/src/plugins/mesonprojectmanager/project/mesonbuildsystem.cpp b/src/plugins/mesonprojectmanager/mesonbuildsystem.cpp similarity index 97% rename from src/plugins/mesonprojectmanager/project/mesonbuildsystem.cpp rename to src/plugins/mesonprojectmanager/mesonbuildsystem.cpp index 555e6db6e2a..5aa27323f9f 100644 --- a/src/plugins/mesonprojectmanager/project/mesonbuildsystem.cpp +++ b/src/plugins/mesonprojectmanager/mesonbuildsystem.cpp @@ -3,11 +3,11 @@ #include "mesonbuildsystem.h" +#include "kithelper.h" +#include "machinefilemanager.h" #include "mesonbuildconfiguration.h" -#include "kithelper/kithelper.h" -#include "machinefiles/machinefilemanager.h" -#include "settings/general/settings.h" -#include "settings/tools/kitaspect/mesontoolkitaspect.h" +#include "mesontoolkitaspect.h" +#include "settings.h" #include #include diff --git a/src/plugins/mesonprojectmanager/project/mesonbuildsystem.h b/src/plugins/mesonprojectmanager/mesonbuildsystem.h similarity index 96% rename from src/plugins/mesonprojectmanager/project/mesonbuildsystem.h rename to src/plugins/mesonprojectmanager/mesonbuildsystem.h index 0fc5a7d415f..1919936b74c 100644 --- a/src/plugins/mesonprojectmanager/project/mesonbuildsystem.h +++ b/src/plugins/mesonprojectmanager/mesonbuildsystem.h @@ -4,8 +4,7 @@ #pragma once #include "mesonprojectparser.h" -#include "exewrappers/mesonwrapper.h" -#include "kithelper/kitdata.h" +#include "kitdata.h" #include diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser/mesoninfo.h b/src/plugins/mesonprojectmanager/mesoninfo.h similarity index 100% rename from src/plugins/mesonprojectmanager/mesoninfoparser/mesoninfo.h rename to src/plugins/mesonprojectmanager/mesoninfo.h diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser/mesoninfoparser.h b/src/plugins/mesonprojectmanager/mesoninfoparser.h similarity index 91% rename from src/plugins/mesonprojectmanager/mesoninfoparser/mesoninfoparser.h rename to src/plugins/mesonprojectmanager/mesoninfoparser.h index 6833ea253e5..031dcb2673e 100644 --- a/src/plugins/mesonprojectmanager/mesoninfoparser/mesoninfoparser.h +++ b/src/plugins/mesonprojectmanager/mesoninfoparser.h @@ -4,12 +4,12 @@ #pragma once #include "buildoptions.h" +#include "buildoptionsparser.h" +#include "buildsystemfilesparser.h" +#include "infoparser.h" #include "mesoninfo.h" -#include "parsers/buildoptionsparser.h" -#include "parsers/buildsystemfilesparser.h" -#include "parsers/infoparser.h" -#include "parsers/targetparser.h" #include "target.h" +#include "targetparser.h" #include diff --git a/src/plugins/mesonprojectmanager/project/outputparsers/mesonoutputparser.cpp b/src/plugins/mesonprojectmanager/mesonoutputparser.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/project/outputparsers/mesonoutputparser.cpp rename to src/plugins/mesonprojectmanager/mesonoutputparser.cpp diff --git a/src/plugins/mesonprojectmanager/project/outputparsers/mesonoutputparser.h b/src/plugins/mesonprojectmanager/mesonoutputparser.h similarity index 100% rename from src/plugins/mesonprojectmanager/project/outputparsers/mesonoutputparser.h rename to src/plugins/mesonprojectmanager/mesonoutputparser.h diff --git a/src/plugins/mesonprojectmanager/project/mesonprocess.cpp b/src/plugins/mesonprojectmanager/mesonprocess.cpp similarity index 99% rename from src/plugins/mesonprojectmanager/project/mesonprocess.cpp rename to src/plugins/mesonprojectmanager/mesonprocess.cpp index d517993648a..ffd23761b04 100644 --- a/src/plugins/mesonprojectmanager/project/mesonprocess.cpp +++ b/src/plugins/mesonprojectmanager/mesonprocess.cpp @@ -3,7 +3,7 @@ #include "mesonprocess.h" -#include "outputparsers/mesonoutputparser.h" +#include "mesonoutputparser.h" #include #include diff --git a/src/plugins/mesonprojectmanager/project/mesonprocess.h b/src/plugins/mesonprojectmanager/mesonprocess.h similarity index 97% rename from src/plugins/mesonprojectmanager/project/mesonprocess.h rename to src/plugins/mesonprojectmanager/mesonprocess.h index 9a0dc97f97c..87063288103 100644 --- a/src/plugins/mesonprojectmanager/project/mesonprocess.h +++ b/src/plugins/mesonprojectmanager/mesonprocess.h @@ -3,7 +3,7 @@ #pragma once -#include "exewrappers/mesonwrapper.h" +#include "mesonwrapper.h" #include #include diff --git a/src/plugins/mesonprojectmanager/project/mesonproject.cpp b/src/plugins/mesonprojectmanager/mesonproject.cpp similarity index 94% rename from src/plugins/mesonprojectmanager/project/mesonproject.cpp rename to src/plugins/mesonprojectmanager/mesonproject.cpp index d21802d97c6..a8857ba94df 100644 --- a/src/plugins/mesonprojectmanager/project/mesonproject.cpp +++ b/src/plugins/mesonprojectmanager/mesonproject.cpp @@ -4,8 +4,8 @@ #include "mesonproject.h" #include "mesonpluginconstants.h" -#include "settings/tools/kitaspect/mesontoolkitaspect.h" -#include "settings/tools/kitaspect/ninjatoolkitaspect.h" +#include "mesontoolkitaspect.h" +#include "ninjatoolkitaspect.h" #include diff --git a/src/plugins/mesonprojectmanager/project/mesonproject.h b/src/plugins/mesonprojectmanager/mesonproject.h similarity index 100% rename from src/plugins/mesonprojectmanager/project/mesonproject.h rename to src/plugins/mesonprojectmanager/mesonproject.h diff --git a/src/plugins/mesonprojectmanager/project/mesonprojectimporter.cpp b/src/plugins/mesonprojectmanager/mesonprojectimporter.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/project/mesonprojectimporter.cpp rename to src/plugins/mesonprojectmanager/mesonprojectimporter.cpp diff --git a/src/plugins/mesonprojectmanager/project/mesonprojectimporter.h b/src/plugins/mesonprojectmanager/mesonprojectimporter.h similarity index 100% rename from src/plugins/mesonprojectmanager/project/mesonprojectimporter.h rename to src/plugins/mesonprojectmanager/mesonprojectimporter.h diff --git a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs index bc7e9361947..8334e6de0a3 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs +++ b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs @@ -20,84 +20,84 @@ Project { cpp.includePaths: "." files: [ - "exewrappers/mesontools.cpp", - "exewrappers/mesontools.h", - "exewrappers/mesonwrapper.cpp", - "exewrappers/mesonwrapper.h", - "exewrappers/ninjawrapper.h", - "exewrappers/toolwrapper.cpp", - "exewrappers/toolwrapper.h", - "kithelper/kitdata.h", - "kithelper/kithelper.h", - "machinefiles/machinefilemanager.cpp", - "machinefiles/machinefilemanager.h", - "machinefiles/nativefilegenerator.cpp", - "machinefiles/nativefilegenerator.h", - "mesonactionsmanager/mesonactionsmanager.cpp", - "mesonactionsmanager/mesonactionsmanager.h", - "mesoninfoparser/buildoptions.h", - "mesoninfoparser/mesoninfo.h", - "mesoninfoparser/mesoninfoparser.h", - "mesoninfoparser/parsers/buildoptionsparser.h", - "mesoninfoparser/parsers/buildsystemfilesparser.h", - "mesoninfoparser/parsers/common.h", - "mesoninfoparser/parsers/infoparser.h", - "mesoninfoparser/parsers/targetparser.h", - "mesoninfoparser/target.h", + "mesontools.cpp", + "mesontools.h", + "mesonwrapper.cpp", + "mesonwrapper.h", + "ninjawrapper.h", + "toolwrapper.cpp", + "toolwrapper.h", + "kitdata.h", + "kithelper.h", + "machinefilemanager.cpp", + "machinefilemanager.h", + "nativefilegenerator.cpp", + "nativefilegenerator.h", + "mesonactionsmanager.cpp", + "mesonactionsmanager.h", + "buildoptions.h", + "mesoninfo.h", + "mesoninfoparser.h", + "buildoptionsparser.h", + "buildsystemfilesparser.h", + "common.h", + "infoparser.h", + "targetparser.h", + "target.h", "mesonpluginconstants.h", "mesonprojectplugin.cpp", "mesonprojectplugin.h", - "project/buildoptions/mesonbuildsettingswidget.cpp", - "project/buildoptions/mesonbuildsettingswidget.h", - "project/buildoptions/optionsmodel/arrayoptionlineedit.cpp", - "project/buildoptions/optionsmodel/arrayoptionlineedit.h", - "project/buildoptions/optionsmodel/buildoptionsmodel.cpp", - "project/buildoptions/optionsmodel/buildoptionsmodel.h", - "project/mesonbuildconfiguration.cpp", - "project/mesonbuildconfiguration.h", - "project/mesonbuildsystem.cpp", - "project/mesonbuildsystem.h", - "project/mesonprocess.cpp", - "project/mesonprocess.h", - "project/mesonproject.cpp", - "project/mesonproject.h", - "project/mesonprojectimporter.cpp", - "project/mesonprojectimporter.h", - "project/mesonprojectparser.cpp", - "project/mesonprojectparser.h", - "project/mesonrunconfiguration.cpp", - "project/mesonrunconfiguration.h", - "project/ninjabuildstep.cpp", - "project/ninjabuildstep.h", - "project/outputparsers/mesonoutputparser.cpp", - "project/outputparsers/mesonoutputparser.h", - "project/outputparsers/ninjaparser.cpp", - "project/outputparsers/ninjaparser.h", - "project/projecttree/mesonprojectnodes.cpp", - "project/projecttree/mesonprojectnodes.h", - "project/projecttree/projecttree.cpp", - "project/projecttree/projecttree.h", + "mesonbuildsettingswidget.cpp", + "mesonbuildsettingswidget.h", + "arrayoptionlineedit.cpp", + "arrayoptionlineedit.h", + "buildoptionsmodel.cpp", + "buildoptionsmodel.h", + "mesonbuildconfiguration.cpp", + "mesonbuildconfiguration.h", + "mesonbuildsystem.cpp", + "mesonbuildsystem.h", + "mesonprocess.cpp", + "mesonprocess.h", + "mesonproject.cpp", + "mesonproject.h", + "mesonprojectimporter.cpp", + "mesonprojectimporter.h", + "mesonprojectparser.cpp", + "mesonprojectparser.h", + "mesonrunconfiguration.cpp", + "mesonrunconfiguration.h", + "ninjabuildstep.cpp", + "ninjabuildstep.h", + "mesonoutputparser.cpp", + "mesonoutputparser.h", + "ninjaparser.cpp", + "ninjaparser.h", + "mesonprojectnodes.cpp", + "mesonprojectnodes.h", + "projecttree.cpp", + "projecttree.h", "resources_meson.qrc", - "settings/general/settings.cpp", - "settings/general/settings.h", - "settings/tools/kitaspect/mesontoolkitaspect.cpp", - "settings/tools/kitaspect/mesontoolkitaspect.h", - "settings/tools/kitaspect/ninjatoolkitaspect.cpp", - "settings/tools/kitaspect/ninjatoolkitaspect.h", - "settings/tools/kitaspect/toolkitaspectwidget.cpp", - "settings/tools/kitaspect/toolkitaspectwidget.h", - "settings/tools/toolitemsettings.cpp", - "settings/tools/toolitemsettings.h", - "settings/tools/toolsmodel.cpp", - "settings/tools/toolsmodel.h", - "settings/tools/toolssettingsaccessor.cpp", - "settings/tools/toolssettingsaccessor.h", - "settings/tools/toolssettingspage.cpp", - "settings/tools/toolssettingspage.h", - "settings/tools/toolssettingswidget.cpp", - "settings/tools/toolssettingswidget.h", - "settings/tools/tooltreeitem.cpp", - "settings/tools/tooltreeitem.h", + "settings.cpp", + "settings.h", + "mesontoolkitaspect.cpp", + "mesontoolkitaspect.h", + "ninjatoolkitaspect.cpp", + "ninjatoolkitaspect.h", + "toolkitaspectwidget.cpp", + "toolkitaspectwidget.h", + "toolitemsettings.cpp", + "toolitemsettings.h", + "toolsmodel.cpp", + "toolsmodel.h", + "toolssettingsaccessor.cpp", + "toolssettingsaccessor.h", + "toolssettingspage.cpp", + "toolssettingspage.h", + "toolssettingswidget.cpp", + "toolssettingswidget.h", + "tooltreeitem.cpp", + "tooltreeitem.h", "versionhelper.h", ] } @@ -113,12 +113,12 @@ Project { cpp.includePaths: "." files: [ - "exewrappers/mesonwrapper.cpp", - "exewrappers/mesonwrapper.h", - "exewrappers/ninjawrapper.h", - "exewrappers/toolwrapper.h", - "exewrappers/toolwrapper.cpp", - "exewrappers/mesontools.h", + "mesonwrapper.cpp", + "mesonwrapper.h", + "ninjawrapper.h", + "toolwrapper.h", + "toolwrapper.cpp", + "mesontools.h", "tests/testmesonwrapper.cpp", ] } @@ -134,13 +134,13 @@ Project { cpp.includePaths: "." files: [ - "exewrappers/mesonwrapper.cpp", - "exewrappers/mesonwrapper.h", - "exewrappers/ninjawrapper.h", - "exewrappers/toolwrapper.h", - "exewrappers/toolwrapper.cpp", - "exewrappers/mesontools.h", - "mesoninfoparser/mesoninfoparser.h", + "mesonwrapper.cpp", + "mesonwrapper.h", + "ninjawrapper.h", + "toolwrapper.h", + "toolwrapper.cpp", + "mesontools.h", + "mesoninfoparser.h", "tests/testmesoninfoparser.cpp", ] } @@ -156,9 +156,9 @@ Project { cpp.includePaths: "." files: [ - "project/outputparsers/ninjaparser.cpp", - "project/outputparsers/ninjaparser.h", - "mesoninfoparser/mesoninfoparser.h", + "ninjaparser.cpp", + "ninjaparser.h", + "mesoninfoparser.h", "tests/testninjaparser.cpp", ] } @@ -175,8 +175,8 @@ Project { cpp.includePaths: "." files: [ - "project/outputparsers/mesonoutputparser.h", - "project/outputparsers/mesonoutputparser.cpp", + "mesonoutputparser.h", + "mesonoutputparser.cpp", "tests/testmesonparser.cpp", ] } diff --git a/src/plugins/mesonprojectmanager/project/projecttree/mesonprojectnodes.cpp b/src/plugins/mesonprojectmanager/mesonprojectnodes.cpp similarity index 95% rename from src/plugins/mesonprojectmanager/project/projecttree/mesonprojectnodes.cpp rename to src/plugins/mesonprojectmanager/mesonprojectnodes.cpp index a21b859a8d4..f4009dd51cc 100644 --- a/src/plugins/mesonprojectmanager/project/projecttree/mesonprojectnodes.cpp +++ b/src/plugins/mesonprojectmanager/mesonprojectnodes.cpp @@ -3,8 +3,8 @@ #include "mesonprojectnodes.h" -#include "project/mesonbuildconfiguration.h" -#include "project/mesonbuildsystem.h" +#include "mesonbuildconfiguration.h" +#include "mesonbuildsystem.h" #include "mesonpluginconstants.h" #include diff --git a/src/plugins/mesonprojectmanager/project/projecttree/mesonprojectnodes.h b/src/plugins/mesonprojectmanager/mesonprojectnodes.h similarity index 100% rename from src/plugins/mesonprojectmanager/project/projecttree/mesonprojectnodes.h rename to src/plugins/mesonprojectmanager/mesonprojectnodes.h diff --git a/src/plugins/mesonprojectmanager/project/mesonprojectparser.cpp b/src/plugins/mesonprojectmanager/mesonprojectparser.cpp similarity index 98% rename from src/plugins/mesonprojectmanager/project/mesonprojectparser.cpp rename to src/plugins/mesonprojectmanager/mesonprojectparser.cpp index 28073d3478d..dfa8da8e172 100644 --- a/src/plugins/mesonprojectmanager/project/mesonprojectparser.cpp +++ b/src/plugins/mesonprojectmanager/mesonprojectparser.cpp @@ -3,10 +3,10 @@ #include "mesonprojectparser.h" -#include "projecttree/mesonprojectnodes.h" -#include "projecttree/projecttree.h" -#include "exewrappers/mesontools.h" -#include "mesoninfoparser/mesoninfoparser.h" +#include "mesoninfoparser.h" +#include "mesonprojectnodes.h" +#include "mesontools.h" +#include "projecttree.h" #include diff --git a/src/plugins/mesonprojectmanager/project/mesonprojectparser.h b/src/plugins/mesonprojectmanager/mesonprojectparser.h similarity index 95% rename from src/plugins/mesonprojectmanager/project/mesonprojectparser.h rename to src/plugins/mesonprojectmanager/mesonprojectparser.h index 051c05b117e..b5f669361b9 100644 --- a/src/plugins/mesonprojectmanager/project/mesonprojectparser.h +++ b/src/plugins/mesonprojectmanager/mesonprojectparser.h @@ -3,12 +3,12 @@ #pragma once -#include "exewrappers/mesonwrapper.h" -#include "kithelper/kitdata.h" -#include "mesoninfoparser/mesoninfoparser.h" +#include "kitdata.h" +#include "mesoninfoparser.h" +#include "mesonoutputparser.h" #include "mesonprocess.h" -#include "outputparsers/mesonoutputparser.h" -#include "projecttree/mesonprojectnodes.h" +#include "mesonprojectnodes.h" +#include "mesonwrapper.h" #include #include diff --git a/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp b/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp index 62744dfcb25..5cbfcd26224 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp +++ b/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp @@ -3,17 +3,17 @@ #include "mesonprojectplugin.h" -#include "machinefiles/machinefilemanager.h" -#include "mesonactionsmanager/mesonactionsmanager.h" -#include "project/mesonbuildconfiguration.h" -#include "project/mesonproject.h" -#include "project/mesonrunconfiguration.h" -#include "project/ninjabuildstep.h" -#include "settings/general/settings.h" -#include "settings/tools/kitaspect/mesontoolkitaspect.h" -#include "settings/tools/kitaspect/ninjatoolkitaspect.h" -#include "settings/tools/toolssettingsaccessor.h" -#include "settings/tools/toolssettingspage.h" +#include "machinefilemanager.h" +#include "mesonactionsmanager.h" +#include "mesonbuildconfiguration.h" +#include "mesonproject.h" +#include "mesonrunconfiguration.h" +#include "mesontoolkitaspect.h" +#include "ninjabuildstep.h" +#include "ninjatoolkitaspect.h" +#include "settings.h" +#include "toolssettingsaccessor.h" +#include "toolssettingspage.h" #include diff --git a/src/plugins/mesonprojectmanager/project/mesonrunconfiguration.cpp b/src/plugins/mesonprojectmanager/mesonrunconfiguration.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/project/mesonrunconfiguration.cpp rename to src/plugins/mesonprojectmanager/mesonrunconfiguration.cpp diff --git a/src/plugins/mesonprojectmanager/project/mesonrunconfiguration.h b/src/plugins/mesonprojectmanager/mesonrunconfiguration.h similarity index 100% rename from src/plugins/mesonprojectmanager/project/mesonrunconfiguration.h rename to src/plugins/mesonprojectmanager/mesonrunconfiguration.h diff --git a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/mesontoolkitaspect.cpp b/src/plugins/mesonprojectmanager/mesontoolkitaspect.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/kitaspect/mesontoolkitaspect.cpp rename to src/plugins/mesonprojectmanager/mesontoolkitaspect.cpp diff --git a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/mesontoolkitaspect.h b/src/plugins/mesonprojectmanager/mesontoolkitaspect.h similarity index 97% rename from src/plugins/mesonprojectmanager/settings/tools/kitaspect/mesontoolkitaspect.h rename to src/plugins/mesonprojectmanager/mesontoolkitaspect.h index a91596a0d3f..9f5c37f4bbe 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/mesontoolkitaspect.h +++ b/src/plugins/mesonprojectmanager/mesontoolkitaspect.h @@ -3,7 +3,7 @@ #pragma once -#include "exewrappers/mesontools.h" +#include "mesontools.h" #include #include diff --git a/src/plugins/mesonprojectmanager/exewrappers/mesontools.cpp b/src/plugins/mesonprojectmanager/mesontools.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/exewrappers/mesontools.cpp rename to src/plugins/mesonprojectmanager/mesontools.cpp diff --git a/src/plugins/mesonprojectmanager/exewrappers/mesontools.h b/src/plugins/mesonprojectmanager/mesontools.h similarity index 100% rename from src/plugins/mesonprojectmanager/exewrappers/mesontools.h rename to src/plugins/mesonprojectmanager/mesontools.h diff --git a/src/plugins/mesonprojectmanager/exewrappers/mesonwrapper.cpp b/src/plugins/mesonprojectmanager/mesonwrapper.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/exewrappers/mesonwrapper.cpp rename to src/plugins/mesonprojectmanager/mesonwrapper.cpp diff --git a/src/plugins/mesonprojectmanager/exewrappers/mesonwrapper.h b/src/plugins/mesonprojectmanager/mesonwrapper.h similarity index 99% rename from src/plugins/mesonprojectmanager/exewrappers/mesonwrapper.h rename to src/plugins/mesonprojectmanager/mesonwrapper.h index 72a7f135888..d1f399b2240 100644 --- a/src/plugins/mesonprojectmanager/exewrappers/mesonwrapper.h +++ b/src/plugins/mesonprojectmanager/mesonwrapper.h @@ -3,7 +3,7 @@ #pragma once -#include "../mesonpluginconstants.h" +#include "mesonpluginconstants.h" #include "toolwrapper.h" #include diff --git a/src/plugins/mesonprojectmanager/machinefiles/nativefilegenerator.cpp b/src/plugins/mesonprojectmanager/nativefilegenerator.cpp similarity index 98% rename from src/plugins/mesonprojectmanager/machinefiles/nativefilegenerator.cpp rename to src/plugins/mesonprojectmanager/nativefilegenerator.cpp index 72ac455c0aa..d434a07815f 100644 --- a/src/plugins/mesonprojectmanager/machinefiles/nativefilegenerator.cpp +++ b/src/plugins/mesonprojectmanager/nativefilegenerator.cpp @@ -3,7 +3,7 @@ #include "nativefilegenerator.h" -#include "kithelper/kithelper.h" +#include "kithelper.h" #include #include diff --git a/src/plugins/mesonprojectmanager/machinefiles/nativefilegenerator.h b/src/plugins/mesonprojectmanager/nativefilegenerator.h similarity index 93% rename from src/plugins/mesonprojectmanager/machinefiles/nativefilegenerator.h rename to src/plugins/mesonprojectmanager/nativefilegenerator.h index 3055583eb69..ee164037015 100644 --- a/src/plugins/mesonprojectmanager/machinefiles/nativefilegenerator.h +++ b/src/plugins/mesonprojectmanager/nativefilegenerator.h @@ -3,7 +3,7 @@ #pragma once -#include "kithelper/kitdata.h" +#include "kitdata.h" #include diff --git a/src/plugins/mesonprojectmanager/project/ninjabuildstep.cpp b/src/plugins/mesonprojectmanager/ninjabuildstep.cpp similarity index 98% rename from src/plugins/mesonprojectmanager/project/ninjabuildstep.cpp rename to src/plugins/mesonprojectmanager/ninjabuildstep.cpp index 0efa1e96d2d..a09b82c5999 100644 --- a/src/plugins/mesonprojectmanager/project/ninjabuildstep.cpp +++ b/src/plugins/mesonprojectmanager/ninjabuildstep.cpp @@ -6,9 +6,9 @@ #include "mesonbuildconfiguration.h" #include "mesonbuildsystem.h" #include "mesonpluginconstants.h" -#include "outputparsers/mesonoutputparser.h" -#include "settings/general/settings.h" -#include "settings/tools/kitaspect/ninjatoolkitaspect.h" +#include "mesonoutputparser.h" +#include "ninjatoolkitaspect.h" +#include "settings.h" #include diff --git a/src/plugins/mesonprojectmanager/project/ninjabuildstep.h b/src/plugins/mesonprojectmanager/ninjabuildstep.h similarity index 97% rename from src/plugins/mesonprojectmanager/project/ninjabuildstep.h rename to src/plugins/mesonprojectmanager/ninjabuildstep.h index 498bfe008b4..1657a71ecce 100644 --- a/src/plugins/mesonprojectmanager/project/ninjabuildstep.h +++ b/src/plugins/mesonprojectmanager/ninjabuildstep.h @@ -3,7 +3,7 @@ #pragma once -#include "outputparsers/ninjaparser.h" +#include "ninjaparser.h" #include #include diff --git a/src/plugins/mesonprojectmanager/project/outputparsers/ninjaparser.cpp b/src/plugins/mesonprojectmanager/ninjaparser.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/project/outputparsers/ninjaparser.cpp rename to src/plugins/mesonprojectmanager/ninjaparser.cpp diff --git a/src/plugins/mesonprojectmanager/project/outputparsers/ninjaparser.h b/src/plugins/mesonprojectmanager/ninjaparser.h similarity index 100% rename from src/plugins/mesonprojectmanager/project/outputparsers/ninjaparser.h rename to src/plugins/mesonprojectmanager/ninjaparser.h diff --git a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/ninjatoolkitaspect.cpp b/src/plugins/mesonprojectmanager/ninjatoolkitaspect.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/kitaspect/ninjatoolkitaspect.cpp rename to src/plugins/mesonprojectmanager/ninjatoolkitaspect.cpp diff --git a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/ninjatoolkitaspect.h b/src/plugins/mesonprojectmanager/ninjatoolkitaspect.h similarity index 97% rename from src/plugins/mesonprojectmanager/settings/tools/kitaspect/ninjatoolkitaspect.h rename to src/plugins/mesonprojectmanager/ninjatoolkitaspect.h index 3fdeaab144b..7a4eed9e030 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/ninjatoolkitaspect.h +++ b/src/plugins/mesonprojectmanager/ninjatoolkitaspect.h @@ -3,7 +3,7 @@ #pragma once -#include "exewrappers/mesontools.h" +#include "mesontools.h" #include #include diff --git a/src/plugins/mesonprojectmanager/exewrappers/ninjawrapper.h b/src/plugins/mesonprojectmanager/ninjawrapper.h similarity index 97% rename from src/plugins/mesonprojectmanager/exewrappers/ninjawrapper.h rename to src/plugins/mesonprojectmanager/ninjawrapper.h index a67a436bf18..9604728c85c 100644 --- a/src/plugins/mesonprojectmanager/exewrappers/ninjawrapper.h +++ b/src/plugins/mesonprojectmanager/ninjawrapper.h @@ -3,7 +3,7 @@ #pragma once -#include "../mesonpluginconstants.h" +#include "mesonpluginconstants.h" #include "toolwrapper.h" namespace MesonProjectManager { diff --git a/src/plugins/mesonprojectmanager/project/projecttree/projecttree.cpp b/src/plugins/mesonprojectmanager/projecttree.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/project/projecttree/projecttree.cpp rename to src/plugins/mesonprojectmanager/projecttree.cpp diff --git a/src/plugins/mesonprojectmanager/project/projecttree/projecttree.h b/src/plugins/mesonprojectmanager/projecttree.h similarity index 93% rename from src/plugins/mesonprojectmanager/project/projecttree/projecttree.h rename to src/plugins/mesonprojectmanager/projecttree.h index a9d7c4c702d..1e4ed92a4fc 100644 --- a/src/plugins/mesonprojectmanager/project/projecttree/projecttree.h +++ b/src/plugins/mesonprojectmanager/projecttree.h @@ -3,7 +3,7 @@ #pragma once -#include "mesoninfoparser/mesoninfoparser.h" +#include "mesoninfoparser.h" #include "mesonprojectnodes.h" #include diff --git a/src/plugins/mesonprojectmanager/settings/general/settings.cpp b/src/plugins/mesonprojectmanager/settings.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/settings/general/settings.cpp rename to src/plugins/mesonprojectmanager/settings.cpp diff --git a/src/plugins/mesonprojectmanager/settings/general/settings.h b/src/plugins/mesonprojectmanager/settings.h similarity index 100% rename from src/plugins/mesonprojectmanager/settings/general/settings.h rename to src/plugins/mesonprojectmanager/settings.h diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser/target.h b/src/plugins/mesonprojectmanager/target.h similarity index 100% rename from src/plugins/mesonprojectmanager/mesoninfoparser/target.h rename to src/plugins/mesonprojectmanager/target.h diff --git a/src/plugins/mesonprojectmanager/mesoninfoparser/parsers/targetparser.h b/src/plugins/mesonprojectmanager/targetparser.h similarity index 97% rename from src/plugins/mesonprojectmanager/mesoninfoparser/parsers/targetparser.h rename to src/plugins/mesonprojectmanager/targetparser.h index ae57e6cef1a..ca30221cd36 100644 --- a/src/plugins/mesonprojectmanager/mesoninfoparser/parsers/targetparser.h +++ b/src/plugins/mesonprojectmanager/targetparser.h @@ -3,8 +3,8 @@ #pragma once -#include "../../mesonpluginconstants.h" -#include "../target.h" +#include "mesonpluginconstants.h" +#include "target.h" #include #include diff --git a/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp b/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp index 1d887d4f1a2..035a2f8a1b7 100644 --- a/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp +++ b/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp @@ -1,8 +1,8 @@ // Copyright (C) 2020 Alexis Jeandet. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "exewrappers/mesonwrapper.h" -#include "mesoninfoparser/mesoninfoparser.h" +#include "mesonwrapper.h" +#include "mesoninfoparser.h" #include #include diff --git a/src/plugins/mesonprojectmanager/tests/testmesonparser.cpp b/src/plugins/mesonprojectmanager/tests/testmesonparser.cpp index d3c963b7400..11a1753c885 100644 --- a/src/plugins/mesonprojectmanager/tests/testmesonparser.cpp +++ b/src/plugins/mesonprojectmanager/tests/testmesonparser.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2020 Alexis Jeandet. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "project/outputparsers/mesonoutputparser.h" +#include "../mesonoutputparser.h" #include diff --git a/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp b/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp index 1eb655b7e7b..479f1f8c2bb 100644 --- a/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp +++ b/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2020 Alexis Jeandet. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "exewrappers/mesonwrapper.h" +#include "../mesonwrapper.h" #include #include diff --git a/src/plugins/mesonprojectmanager/tests/testninjaparser.cpp b/src/plugins/mesonprojectmanager/tests/testninjaparser.cpp index 1d04ff5d068..8f7c38dae93 100644 --- a/src/plugins/mesonprojectmanager/tests/testninjaparser.cpp +++ b/src/plugins/mesonprojectmanager/tests/testninjaparser.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2020 Alexis Jeandet. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "project/outputparsers/ninjaparser.h" +#include "../ninjaparser.h" #include #include diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.cpp b/src/plugins/mesonprojectmanager/toolitemsettings.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.cpp rename to src/plugins/mesonprojectmanager/toolitemsettings.cpp diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.h b/src/plugins/mesonprojectmanager/toolitemsettings.h similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/toolitemsettings.h rename to src/plugins/mesonprojectmanager/toolitemsettings.h diff --git a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/toolkitaspectwidget.cpp b/src/plugins/mesonprojectmanager/toolkitaspectwidget.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/kitaspect/toolkitaspectwidget.cpp rename to src/plugins/mesonprojectmanager/toolkitaspectwidget.cpp diff --git a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/toolkitaspectwidget.h b/src/plugins/mesonprojectmanager/toolkitaspectwidget.h similarity index 98% rename from src/plugins/mesonprojectmanager/settings/tools/kitaspect/toolkitaspectwidget.h rename to src/plugins/mesonprojectmanager/toolkitaspectwidget.h index 209bd634a53..8b389aa0318 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/kitaspect/toolkitaspectwidget.h +++ b/src/plugins/mesonprojectmanager/toolkitaspectwidget.h @@ -2,8 +2,8 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once -#include "exewrappers/mesonwrapper.h" #include "mesontoolkitaspect.h" +#include "mesonwrapper.h" #include "ninjatoolkitaspect.h" #include diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolsmodel.cpp b/src/plugins/mesonprojectmanager/toolsmodel.cpp similarity index 98% rename from src/plugins/mesonprojectmanager/settings/tools/toolsmodel.cpp rename to src/plugins/mesonprojectmanager/toolsmodel.cpp index 99539457b75..9c1407387ef 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/toolsmodel.cpp +++ b/src/plugins/mesonprojectmanager/toolsmodel.cpp @@ -4,7 +4,7 @@ #include "toolsmodel.h" #include "tooltreeitem.h" -#include "exewrappers/mesontools.h" +#include "mesontools.h" #include #include diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolsmodel.h b/src/plugins/mesonprojectmanager/toolsmodel.h similarity index 96% rename from src/plugins/mesonprojectmanager/settings/tools/toolsmodel.h rename to src/plugins/mesonprojectmanager/toolsmodel.h index 0e13a234f28..b37dca1015c 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/toolsmodel.h +++ b/src/plugins/mesonprojectmanager/toolsmodel.h @@ -3,7 +3,7 @@ #pragma once -#include "exewrappers/mesontools.h" +#include "mesontools.h" #include diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolssettingsaccessor.cpp b/src/plugins/mesonprojectmanager/toolssettingsaccessor.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/toolssettingsaccessor.cpp rename to src/plugins/mesonprojectmanager/toolssettingsaccessor.cpp diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolssettingsaccessor.h b/src/plugins/mesonprojectmanager/toolssettingsaccessor.h similarity index 94% rename from src/plugins/mesonprojectmanager/settings/tools/toolssettingsaccessor.h rename to src/plugins/mesonprojectmanager/toolssettingsaccessor.h index 9f6366c9086..109fa32a15e 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/toolssettingsaccessor.h +++ b/src/plugins/mesonprojectmanager/toolssettingsaccessor.h @@ -3,7 +3,7 @@ #pragma once -#include "exewrappers/mesontools.h" +#include "mesontools.h" #include diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolssettingspage.cpp b/src/plugins/mesonprojectmanager/toolssettingspage.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/toolssettingspage.cpp rename to src/plugins/mesonprojectmanager/toolssettingspage.cpp diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolssettingspage.h b/src/plugins/mesonprojectmanager/toolssettingspage.h similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/toolssettingspage.h rename to src/plugins/mesonprojectmanager/toolssettingspage.h diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.cpp b/src/plugins/mesonprojectmanager/toolssettingswidget.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.cpp rename to src/plugins/mesonprojectmanager/toolssettingswidget.cpp diff --git a/src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.h b/src/plugins/mesonprojectmanager/toolssettingswidget.h similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/toolssettingswidget.h rename to src/plugins/mesonprojectmanager/toolssettingswidget.h diff --git a/src/plugins/mesonprojectmanager/settings/tools/tooltreeitem.cpp b/src/plugins/mesonprojectmanager/tooltreeitem.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/settings/tools/tooltreeitem.cpp rename to src/plugins/mesonprojectmanager/tooltreeitem.cpp diff --git a/src/plugins/mesonprojectmanager/settings/tools/tooltreeitem.h b/src/plugins/mesonprojectmanager/tooltreeitem.h similarity index 97% rename from src/plugins/mesonprojectmanager/settings/tools/tooltreeitem.h rename to src/plugins/mesonprojectmanager/tooltreeitem.h index 8c021325100..6e8592bf6f2 100644 --- a/src/plugins/mesonprojectmanager/settings/tools/tooltreeitem.h +++ b/src/plugins/mesonprojectmanager/tooltreeitem.h @@ -3,7 +3,7 @@ #pragma once -#include "exewrappers/mesontools.h" +#include "mesontools.h" #include "toolssettingspage.h" #include diff --git a/src/plugins/mesonprojectmanager/exewrappers/toolwrapper.cpp b/src/plugins/mesonprojectmanager/toolwrapper.cpp similarity index 100% rename from src/plugins/mesonprojectmanager/exewrappers/toolwrapper.cpp rename to src/plugins/mesonprojectmanager/toolwrapper.cpp diff --git a/src/plugins/mesonprojectmanager/exewrappers/toolwrapper.h b/src/plugins/mesonprojectmanager/toolwrapper.h similarity index 100% rename from src/plugins/mesonprojectmanager/exewrappers/toolwrapper.h rename to src/plugins/mesonprojectmanager/toolwrapper.h From ce9da995284863031203f373b5acdb9fac2e2029 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 7 Oct 2022 15:52:41 +0200 Subject: [PATCH 099/104] FilePath: Fix isRelativePath for QRC paths Implicitly fixing methods like absoluteFilePath too. Fixes e.g. JSON wizards that are registered from a plugin QRC file, like McuSupport wizards (run with McuSupport plugin enabled and create a "Application (Qt for MCU)" application). Change-Id: I296ba1c5eb63c9eb27f9a55e65019125faf546ea Reviewed-by: hjk Reviewed-by: Qt CI Bot Reviewed-by: --- src/libs/utils/filepath.cpp | 2 ++ tests/auto/utils/fileutils/tst_fileutils.cpp | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index 0f9d245142c..02335910ec9 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -1630,6 +1630,8 @@ bool FilePath::isRelativePath() const return false; if (path().size() > 1 && isWindowsDriveLetter(path()[0]) && path().at(1) == ':') return false; + if (path().startsWith(":/")) // QRC + return false; return true; } diff --git a/tests/auto/utils/fileutils/tst_fileutils.cpp b/tests/auto/utils/fileutils/tst_fileutils.cpp index f93aa74a58d..0522b320575 100644 --- a/tests/auto/utils/fileutils/tst_fileutils.cpp +++ b/tests/auto/utils/fileutils/tst_fileutils.cpp @@ -161,6 +161,8 @@ void tst_fileutils::parentDir_data() << "//server/directory/file" << "//server/directory" << ""; QTest::newRow("//server/directory") << "//server/directory" << "//server/" << ""; QTest::newRow("//server") << "//server" << "" << ""; + + QTest::newRow("qrc") << ":/foo/bar.txt" << ":/foo" << ""; } void tst_fileutils::parentDir() @@ -199,6 +201,8 @@ void tst_fileutils::isChildOf_data() << "//server/directory" << "//server/directory/file" << true; QTest::newRow("//server/directory") << "//server" << "//server/directory" << true; + + QTest::newRow("qrc") << ":/foo/bar" << ":/foo/bar/blah" << true; } void tst_fileutils::isChildOf() @@ -243,6 +247,8 @@ void tst_fileutils::fileName_data() QTest::newRow("slashes at end 2") << "/a/b//" << 1 << "b//"; QTest::newRow("root only 1") << "/" << 0 << ""; QTest::newRow("root only 2") << "/" << 1 << "/"; + QTest::newRow("qrc 0") << ":/foo/bar" << 0 << "bar"; + QTest::newRow("qrc with root") << ":/foo/bar" << 1 << ":/foo/bar"; } void tst_fileutils::fileName() @@ -384,6 +390,8 @@ void tst_fileutils::absoluteFilePath_data() QTest::newRow("default-constructed") << FilePath() << FilePath(); QTest::newRow("relative") << FilePath::fromString("a/b") << FilePath::fromString(QDir::currentPath() + "/a/b"); + QTest::newRow("qrc") << FilePath::fromString(":/foo/bar.txt") + << FilePath::fromString(":/foo/bar.txt"); } void tst_fileutils::absoluteFilePath() From cddaacc6c6fb2abf7fdfc77a2f01243c4bafd50f Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 6 Oct 2022 12:04:39 +0200 Subject: [PATCH 100/104] Core: show shortcuts in LocatorFiltersFilter Change-Id: I700128ac2366ff78310dc5be6dbcc8953c2c2a5b Reviewed-by: Eike Ziller --- src/plugins/coreplugin/locator/locatorfiltersfilter.cpp | 7 +++++++ src/plugins/coreplugin/locator/locatorfiltersfilter.h | 1 + 2 files changed, 8 insertions(+) diff --git a/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp b/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp index 665290687e2..26e71064514 100644 --- a/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp +++ b/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp @@ -9,6 +9,8 @@ #include #include +#include + using namespace Core; using namespace Core::Internal; @@ -45,6 +47,10 @@ void LocatorFiltersFilter::prepareSearch(const QString &entry) m_filterShortcutStrings.append(filter->shortcutString()); m_filterDisplayNames.append(filter->displayName()); m_filterDescriptions.append(filter->description()); + QString keyboardShortcut; + if (auto command = ActionManager::command(filter->actionId())) + keyboardShortcut = command->keySequence().toString(QKeySequence::NativeText); + m_filterKeyboardShortcuts.append(keyboardShortcut); } } } @@ -62,6 +68,7 @@ QList LocatorFiltersFilter::matchesFor(QFutureInterface Date: Mon, 10 Oct 2022 10:13:06 +0200 Subject: [PATCH 101/104] Core: Fix qbs build Change-Id: Id68a1db888a0540c520cbbc2bc7ece979c4fa3a6 Reviewed-by: Christian Stenger Reviewed-by: David Schulz --- src/plugins/coreplugin/locator/locatorfiltersfilter.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp b/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp index 26e71064514..6ff69476b43 100644 --- a/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp +++ b/src/plugins/coreplugin/locator/locatorfiltersfilter.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "locatorfiltersfilter.h" +#include "../actionmanager/actionmanager.h" #include "locator.h" #include "locatorwidget.h" @@ -9,8 +10,6 @@ #include #include -#include - using namespace Core; using namespace Core::Internal; From bf5a8835eefd6494caa5330da5f597c46796fa27 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 5 Oct 2022 13:48:16 +0200 Subject: [PATCH 102/104] Editor: improve visual indent depth for empty blocks Use the indenter based visual indent only for the cpp qt style indenter since it gives accurate results. In all other casess Look for the next and previous not empty lines and use the minimum indent depth of those lines as the visual indent depth for empty lines. Task-number: QTCREATORBUG-28179 Change-Id: Ic456fba5adfb2a12f20e2bd4fc663010c752b65c Reviewed-by: Eike Ziller --- src/plugins/cppeditor/cppqtstyleindenter.cpp | 6 ++ src/plugins/cppeditor/cppqtstyleindenter.h | 2 + src/plugins/qmljstools/qmljsindenter.cpp | 5 ++ src/plugins/qmljstools/qmljsindenter.h | 2 + src/plugins/texteditor/indenter.h | 6 ++ src/plugins/texteditor/texteditor.cpp | 76 ++++++++++++++++---- 6 files changed, 85 insertions(+), 12 deletions(-) diff --git a/src/plugins/cppeditor/cppqtstyleindenter.cpp b/src/plugins/cppeditor/cppqtstyleindenter.cpp index e19632ab2ca..c12df09941b 100644 --- a/src/plugins/cppeditor/cppqtstyleindenter.cpp +++ b/src/plugins/cppeditor/cppqtstyleindenter.cpp @@ -157,6 +157,12 @@ int CppQtStyleIndenter::indentFor(const QTextBlock &block, return indent; } +int CppQtStyleIndenter::visualIndentFor(const QTextBlock &block, + const TextEditor::TabSettings &tabSettings) +{ + return indentFor(block, tabSettings); +} + CppCodeStyleSettings CppQtStyleIndenter::codeStyleSettings() const { if (m_cppCodeStylePreferences) diff --git a/src/plugins/cppeditor/cppqtstyleindenter.h b/src/plugins/cppeditor/cppqtstyleindenter.h index 646ab909b93..a5ad6dff38b 100644 --- a/src/plugins/cppeditor/cppqtstyleindenter.h +++ b/src/plugins/cppeditor/cppqtstyleindenter.h @@ -34,6 +34,8 @@ public: int indentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings, int cursorPositionInEditor = -1) override; + int visualIndentFor(const QTextBlock &block, + const TextEditor::TabSettings &tabSettings) override; TextEditor::IndentationForBlock indentationForBlocks(const QVector &blocks, const TextEditor::TabSettings &tabSettings, int cursorPositionInEditor = -1) override; diff --git a/src/plugins/qmljstools/qmljsindenter.cpp b/src/plugins/qmljstools/qmljsindenter.cpp index f051855b4f6..0418728eca5 100644 --- a/src/plugins/qmljstools/qmljsindenter.cpp +++ b/src/plugins/qmljstools/qmljsindenter.cpp @@ -67,6 +67,11 @@ int Indenter::indentFor(const QTextBlock &block, return codeFormatter.indentFor(block); } +int Indenter::visualIndentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings) +{ + return indentFor(block, tabSettings); +} + TextEditor::IndentationForBlock Indenter::indentationForBlocks( const QVector &blocks, const TextEditor::TabSettings &tabSettings, diff --git a/src/plugins/qmljstools/qmljsindenter.h b/src/plugins/qmljstools/qmljsindenter.h index 36430fbccc5..603c868c36c 100644 --- a/src/plugins/qmljstools/qmljsindenter.h +++ b/src/plugins/qmljstools/qmljsindenter.h @@ -26,6 +26,8 @@ public: int indentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings, int cursorPositionInEditor = -1) override; + int visualIndentFor(const QTextBlock &block, + const TextEditor::TabSettings &tabSettings) override; TextEditor::IndentationForBlock indentationForBlocks(const QVector &blocks, const TextEditor::TabSettings &tabSettings, int cursorPositionInEditor = -1) override; diff --git a/src/plugins/texteditor/indenter.h b/src/plugins/texteditor/indenter.h index ccaae3e2e8f..91c11f043a5 100644 --- a/src/plugins/texteditor/indenter.h +++ b/src/plugins/texteditor/indenter.h @@ -57,6 +57,12 @@ public: return -1; } + virtual int visualIndentFor(const QTextBlock & /*block*/, + const TabSettings & /*tabSettings*/) + { + return -1; + } + virtual void autoIndent(const QTextCursor &cursor, const TabSettings &tabSettings, int cursorPositionInEditor = -1) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 7c4a47870c0..688d231ad79 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -513,6 +513,7 @@ public: void updateHighlights(); void updateCurrentLineInScrollbar(); void updateCurrentLineHighlight(); + int indentDepthForBlock(const QTextBlock &block); void drawFoldingMarker(QPainter *painter, const QPalette &pal, const QRect &rect, @@ -533,7 +534,7 @@ public: void paintCursorAsBlock(const PaintEventData &data, QPainter &painter, PaintEventBlockData &blockData, int cursorPosition) const; void paintAdditionalVisualWhitespaces(PaintEventData &data, QPainter &painter, qreal top) const; - void paintIndentDepth(PaintEventData &data, QPainter &painter, const PaintEventBlockData &blockData) const; + void paintIndentDepth(PaintEventData &data, QPainter &painter, const PaintEventBlockData &blockData); void paintReplacement(PaintEventData &data, QPainter &painter, qreal top) const; void paintWidgetBackground(const PaintEventData &data, QPainter &painter) const; void paintOverlays(const PaintEventData &data, QPainter &painter) const; @@ -808,6 +809,7 @@ public: }; using UndoMultiCursor = QList; QStack m_undoCursorStack; + QList m_visualIndentCache; }; class TextEditorWidgetFind : public BaseTextFind @@ -1852,6 +1854,7 @@ void TextEditorWidgetPrivate::editorContentsChange(int position, int charsRemove } m_blockCount = newBlockCount; m_scrollBarUpdateTimer.start(500); + m_visualIndentCache.clear(); } void TextEditorWidgetPrivate::slotSelectionChanged() @@ -4379,24 +4382,72 @@ void TextEditorWidgetPrivate::paintAdditionalVisualWhitespaces(PaintEventData &d } } +int TextEditorWidgetPrivate::indentDepthForBlock(const QTextBlock &block) +{ + const TabSettings &tabSettings = m_document->tabSettings(); + const auto blockDepth = [&](const QTextBlock &block) { + int depth = m_visualIndentCache.value(block.blockNumber(), -1); + if (depth < 0) { + const QString text = block.text(); + depth = text.simplified().isEmpty() ? -1 : tabSettings.indentationColumn(text); + } + return depth; + }; + const auto ensureCacheSize = [&](const int size) { + if (m_visualIndentCache.size() < size) + m_visualIndentCache.resize(size, -1); + }; + int depth = blockDepth(block); + if (depth < 0) // the block was empty and uncached ask the indenter for a visual indentation + depth = m_document->indenter()->visualIndentFor(block, tabSettings); + if (depth >= 0) { + ensureCacheSize(block.blockNumber() + 1); + m_visualIndentCache[block.blockNumber()] = depth; + } else { + // find previous non empty block and get the indent depth of this block + QTextBlock it = block.previous(); + int prevDepth = -1; + while (it.isValid()) { + prevDepth = blockDepth(it); + if (prevDepth >= 0) + break; + it = it.previous(); + } + const int startBlockNumber = it.isValid() ? it.blockNumber() + 1 : 0; + + // find next non empty block and get the indent depth of this block + it = block.next(); + int nextDepth = -1; + while (it.isValid()) { + nextDepth = blockDepth(it); + if (nextDepth >= 0) + break; + it = it.next(); + } + const int endBlockNumber = it.isValid() ? it.blockNumber() : m_blockCount; + + // get the depth for the whole range of empty blocks and fill the cache so we do not need to + // redo this for every paint event + depth = prevDepth > 0 && nextDepth > 0 ? qMin(prevDepth, nextDepth) : 0; + ensureCacheSize(endBlockNumber); + for (int i = startBlockNumber; i < endBlockNumber; ++i) + m_visualIndentCache[i] = depth; + } + return depth; +} + void TextEditorWidgetPrivate::paintIndentDepth(PaintEventData &data, QPainter &painter, - const PaintEventBlockData &blockData) const + const PaintEventBlockData &blockData) { if (!m_displaySettings.m_visualizeIndent) return; - const QString text = data.block.text(); - const TabSettings &tabSettings = m_document->tabSettings(); - int currentDepth = -1; - if (text.simplified().isEmpty()) - currentDepth = m_document->indenter()->indentFor(data.block, tabSettings); - if (currentDepth < 0) - currentDepth = tabSettings.indentationColumn(text); - - if (currentDepth == 0 || blockData.layout->lineCount() < 1) + const int depth = indentDepthForBlock(data.block); + if (depth <= 0 || blockData.layout->lineCount() < 1) return; + const TabSettings &tabSettings = m_document->tabSettings(); const qreal horizontalAdvance = QFontMetricsF(q->font()).horizontalAdvance( QString(tabSettings.m_indentSize, QChar(' '))); @@ -4408,7 +4459,8 @@ void TextEditorWidgetPrivate::paintIndentDepth(PaintEventData &data, qreal x = textLine.cursorToX(0) + data.offset.x() + qMax(0, q->cursorWidth() - 1); int paintColumn = 0; - while (paintColumn < currentDepth) { + const QString text = data.block.text(); + while (paintColumn < depth) { if (x >= 0) { int paintPosition = tabSettings.positionAtColumn(text, paintColumn); if (blockData.layout->lineForTextPosition(paintPosition).lineNumber() != 0) From 5dde520a436dd410269ab84af6814bff12d3c01e Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 7 Oct 2022 16:54:27 +0200 Subject: [PATCH 103/104] Utils: Return a bit more data from DeviceShell::runInShell Pass on stderr data and exit code to the caller, it's typically in a better condition to handle errors. Use it to notify the user about non-available 'find' arguments and fix the fallback to ls-based operation. Change-Id: I535535de2ffa09cad1dd6e9b07eb69f807dbae2f Reviewed-by: Marcus Tillmanns Reviewed-by: hjk --- src/libs/utils/deviceshell.cpp | 34 ++---- src/libs/utils/deviceshell.h | 12 +- src/libs/utils/fileutils.cpp | 31 ++--- src/libs/utils/fileutils.h | 9 +- src/plugins/docker/dockerdevice.cpp | 75 ++++++------ src/plugins/remotelinux/linuxdevice.cpp | 110 +++++++----------- .../utils/deviceshell/tst_deviceshell.cpp | 22 ++-- tests/manual/deviceshell/tst_deviceshell.cpp | 4 +- 8 files changed, 125 insertions(+), 172 deletions(-) diff --git a/src/libs/utils/deviceshell.cpp b/src/libs/utils/deviceshell.cpp index 8daf147ea54..5e43d020219 100644 --- a/src/libs/utils/deviceshell.cpp +++ b/src/libs/utils/deviceshell.cpp @@ -174,31 +174,11 @@ DeviceShell::~DeviceShell() * \param stdInData Data to send to the stdin of the command * \return true if the command finished with EXIT_SUCCESS(0) * - * Runs the cmd inside the internal shell process and return whether it exited with EXIT_SUCCESS + * Runs the cmd inside the internal shell process and return stdout, stderr and exit code * * Will automatically defer to the internal thread */ -bool DeviceShell::runInShell(const CommandLine &cmd, const QByteArray &stdInData) -{ - QTC_ASSERT(m_shellProcess, return false); - Q_ASSERT(QThread::currentThread() != &m_thread); - - const RunResult result = run(cmd, stdInData); - return result.exitCode == 0; -} - -/*! - * \brief DeviceShell::outputForRunInShell - * \param cmd The command to run - * \param stdInData Data to send to the stdin of the command - * \return The stdout of the command - * - * Runs a command inside the running shell and returns the stdout that was generated by it. - * - * Will automatically defer to the internal thread - */ -DeviceShell::RunResult DeviceShell::outputForRunInShell(const CommandLine &cmd, - const QByteArray &stdInData) +RunResult DeviceShell::runInShell(const CommandLine &cmd, const QByteArray &stdInData) { QTC_ASSERT(m_shellProcess, return {}); Q_ASSERT(QThread::currentThread() != &m_thread); @@ -210,7 +190,7 @@ DeviceShell::State DeviceShell::state() const { return m_shellScriptState; } QStringList DeviceShell::missingFeatures() const { return m_missingFeatures; } -DeviceShell::RunResult DeviceShell::run(const CommandLine &cmd, const QByteArray &stdInData) +RunResult DeviceShell::run(const CommandLine &cmd, const QByteArray &stdInData) { if (m_shellScriptState == State::NoScript) { // Fallback ... @@ -539,16 +519,16 @@ void DeviceShell::onReadyRead() QTC_ASSERT(itCmd != m_commandOutput.end(), continue); switch (type) { - case Utils::DeviceShell::ParseType::StdOut: + case ParseType::StdOut: itCmd->stdOut.append(data); break; - case Utils::DeviceShell::ParseType::StdErr: + case ParseType::StdErr: itCmd->stdErr.append(data); break; - case Utils::DeviceShell::ParseType::ExitCode: { + case ParseType::ExitCode: { bool ok = false; int exitCode; - exitCode = QString::fromUtf8(data.begin(), data.size()).toInt(&ok); + exitCode = data.toInt(&ok); QTC_ASSERT(ok, exitCode = -1); itCmd->exitCode = exitCode; itCmd->waiter->wakeOne(); diff --git a/src/libs/utils/deviceshell.h b/src/libs/utils/deviceshell.h index e9382bc885b..dcbd3ca905c 100644 --- a/src/libs/utils/deviceshell.h +++ b/src/libs/utils/deviceshell.h @@ -5,6 +5,8 @@ #include "utils_global.h" +#include "fileutils.h" + #include #include #include @@ -28,13 +30,6 @@ class QTCREATOR_UTILS_EXPORT DeviceShell : public QObject public: enum class State { FailedToStart = -1, Unknown = 0, Succeeded = 1, NoScript = 2 }; - struct RunResult - { - int exitCode = 0; - QByteArray stdOut; - QByteArray stdErr; - }; - enum class ParseType { StdOut, StdErr, @@ -46,8 +41,7 @@ public: bool start(); - bool runInShell(const CommandLine &cmd, const QByteArray &stdInData = {}); - RunResult outputForRunInShell(const CommandLine &cmd, const QByteArray &stdInData = {}); + RunResult runInShell(const CommandLine &cmd, const QByteArray &stdInData = {}); State state() const; diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 2e147fa43de..ae83517440b 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -592,8 +592,6 @@ void FileUtils::iterateLsOutput(const FilePath &base, const FileFilter &filter, const std::function &callBack) { - QTC_CHECK(filter.iteratorFlags != QDirIterator::NoIteratorFlags); // FIXME: Not supported yet below. - const QList nameRegexps = transform(filter.nameFilters, [](const QString &filter) { QRegularExpression re; @@ -625,25 +623,27 @@ void FileUtils::iterateLsOutput(const FilePath &base, // returns whether 'find' could be used. static bool iterateWithFind(const FilePath &filePath, const FileFilter &filter, - const std::function &runInShell, - const std::function &callBack) + const std::function &runInShell, + const std::function &callBack) { QTC_CHECK(filePath.isAbsolutePath()); QStringList arguments{filePath.path()}; arguments << filter.asFindArguments(); - const QByteArray output = runInShell({"find", arguments}); - const QString out = QString::fromUtf8(output.data(), output.size()); - if (!output.isEmpty() && !out.startsWith(filePath.path())) // missing find, unknown option + const RunResult result = runInShell({"find", arguments}); + if (!result.stdErr.isEmpty()) { + // missing find, unknown option e.g. "find: unknown predicate `-L'\n" + // qDebug() << "find error: " << result.stdErr; return false; + } + const QString out = QString::fromUtf8(result.stdOut); const QStringList entries = out.split("\n", Qt::SkipEmptyParts); for (const QString &entry : entries) { - if (!entry.startsWith("find: ")) { - const FilePath fp = FilePath::fromString(entry); - if (!callBack(fp.onDevice(filePath))) - break; - } + const FilePath fp = FilePath::fromString(entry); + // Call back returning 'false' indicates a request to abort iteration. + if (!callBack(fp.onDevice(filePath))) + break; } return true; } @@ -651,7 +651,7 @@ static bool iterateWithFind(const FilePath &filePath, void FileUtils::iterateUnixDirectory(const FilePath &filePath, const FileFilter &filter, bool *useFind, - const std::function &runInShell, + const std::function &runInShell, const std::function &callBack) { QTC_ASSERT(callBack, return); @@ -665,8 +665,9 @@ void FileUtils::iterateUnixDirectory(const FilePath &filePath, } // if we do not have find - use ls as fallback - const QByteArray output = runInShell({"ls", {"-1", "-b", "--", filePath.path()}}); - const QStringList entries = QString::fromUtf8(output).split('\n', Qt::SkipEmptyParts); + // FIXME: Recursion into subdirectories not implemented! + const RunResult result = runInShell({"ls", {"-1", "-b", "--", filePath.path()}}); + const QStringList entries = QString::fromUtf8(result.stdOut).split('\n', Qt::SkipEmptyParts); FileUtils::iterateLsOutput(filePath, entries, filter, callBack); } diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 09ba6ece639..5a1c5e1f075 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -33,6 +33,13 @@ namespace Utils { class CommandLine; +struct QTCREATOR_UTILS_EXPORT RunResult +{ + int exitCode = 0; + QByteArray stdOut; + QByteArray stdErr; +}; + class QTCREATOR_UTILS_EXPORT FileUtils { public: @@ -89,7 +96,7 @@ public: const FilePath &base, const FileFilter &filter, bool *useFind, - const std::function &runInShell, + const std::function &runInShell, const std::function &callBack); static qint64 bytesAvailableFromDFOutput(const QByteArray &dfOutput); diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 0f08650618a..8ab4bb9f8e6 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -125,8 +125,10 @@ public: ~DockerDevicePrivate() { stopCurrentContainer(); } - bool runInShell(const CommandLine &cmd, const QByteArray &stdInData = {}); - QByteArray outputForRunInShell(const CommandLine &cmd); + RunResult runInShell(const CommandLine &cmd, const QByteArray &stdInData = {}); + bool runInShellSuccess(const CommandLine &cmd, const QByteArray &stdInData = {}) { + return runInShell(cmd, stdInData).exitCode == 0; + } std::optional fileContents(const FilePath &filePath, qint64 limit, qint64 offset); @@ -727,76 +729,76 @@ bool DockerDevice::isExecutableFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-x", path}}); + return d->runInShellSuccess({"test", {"-x", path}}); } bool DockerDevice::isReadableFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-r", path, "-a", "-f", path}}); + return d->runInShellSuccess({"test", {"-r", path, "-a", "-f", path}}); } bool DockerDevice::isWritableFile(const Utils::FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-w", path, "-a", "-f", path}}); + return d->runInShellSuccess({"test", {"-w", path, "-a", "-f", path}}); } bool DockerDevice::isReadableDirectory(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-r", path, "-a", "-d", path}}); + return d->runInShellSuccess({"test", {"-r", path, "-a", "-d", path}}); } bool DockerDevice::isWritableDirectory(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-w", path, "-a", "-d", path}}); + return d->runInShellSuccess({"test", {"-w", path, "-a", "-d", path}}); } bool DockerDevice::isFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-f", path}}); + return d->runInShellSuccess({"test", {"-f", path}}); } bool DockerDevice::isDirectory(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-d", path}}); + return d->runInShellSuccess({"test", {"-d", path}}); } bool DockerDevice::createDirectory(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"mkdir", {"-p", path}}); + return d->runInShellSuccess({"mkdir", {"-p", path}}); } bool DockerDevice::exists(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-e", path}}); + return d->runInShellSuccess({"test", {"-e", path}}); } bool DockerDevice::ensureExistingFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"touch", {path}}); + return d->runInShellSuccess({"touch", {path}}); } bool DockerDevice::removeFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); - return d->runInShell({"rm", {filePath.path()}}); + return d->runInShellSuccess({"rm", {filePath.path()}}); } bool DockerDevice::removeRecursively(const FilePath &filePath) const @@ -811,28 +813,28 @@ bool DockerDevice::removeRecursively(const FilePath &filePath) const const int levelsNeeded = path.startsWith("/home/") ? 4 : 3; QTC_ASSERT(path.count('/') >= levelsNeeded, return false); - return d->runInShell({"rm", {"-rf", "--", path}}); + return d->runInShellSuccess({"rm", {"-rf", "--", path}}); } bool DockerDevice::copyFile(const FilePath &filePath, const FilePath &target) const { QTC_ASSERT(handlesFile(filePath), return false); QTC_ASSERT(handlesFile(target), return false); - return d->runInShell({"cp", {filePath.path(), target.path()}}); + return d->runInShellSuccess({"cp", {filePath.path(), target.path()}}); } bool DockerDevice::renameFile(const FilePath &filePath, const FilePath &target) const { QTC_ASSERT(handlesFile(filePath), return false); QTC_ASSERT(handlesFile(target), return false); - return d->runInShell({"mv", {filePath.path(), target.path()}}); + return d->runInShellSuccess({"mv", {filePath.path(), target.path()}}); } QDateTime DockerDevice::lastModified(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return {}); - const QByteArray output = d->outputForRunInShell({"stat", {"-L", "-c", "%Y", filePath.path()}}); - qint64 secs = output.toLongLong(); + const RunResult result = d->runInShell({"stat", {"-L", "-c", "%Y", filePath.path()}}); + qint64 secs = result.stdOut.toLongLong(); const QDateTime dt = QDateTime::fromSecsSinceEpoch(secs, Qt::UTC); return dt; } @@ -840,24 +842,24 @@ QDateTime DockerDevice::lastModified(const FilePath &filePath) const FilePath DockerDevice::symLinkTarget(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return {}); - const QByteArray output = d->outputForRunInShell({"readlink", {"-n", "-e", filePath.path()}}); - const QString out = QString::fromUtf8(output.data(), output.size()); + const RunResult result = d->runInShell({"readlink", {"-n", "-e", filePath.path()}}); + const QString out = QString::fromUtf8(result.stdOut); return out.isEmpty() ? FilePath() : filePath.withNewPath(out); } qint64 DockerDevice::fileSize(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return -1); - const QByteArray output = d->outputForRunInShell({"stat", {"-L", "-c", "%s", filePath.path()}}); - return output.toLongLong(); + const RunResult result = d->runInShell({"stat", {"-L", "-c", "%s", filePath.path()}}); + return result.stdOut.toLongLong(); } QFileDevice::Permissions DockerDevice::permissions(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return {}); - const QByteArray output = d->outputForRunInShell({"stat", {"-L", "-c", "%a", filePath.path()}}); - const uint bits = output.toUInt(nullptr, 8); + const RunResult result = d->runInShell({"stat", {"-L", "-c", "%a", filePath.path()}}); + const uint bits = result.stdOut.toUInt(nullptr, 8); QFileDevice::Permissions perm = {}; #define BIT(n, p) if (bits & (1<outputForRunInShell(cmd); }; + auto runInShell = [this](const CommandLine &cmd) { return d->runInShell(cmd); }; FileUtils::iterateUnixDirectory(filePath, filter, &d->m_useFind, runInShell, callBack); } @@ -911,7 +913,7 @@ std::optional DockerDevice::fileContents(const FilePath &filePath, bool DockerDevice::writeFileContents(const FilePath &filePath, const QByteArray &data) const { QTC_ASSERT(handlesFile(filePath), return {}); - return d->runInShell({"dd", {"of=" + filePath.path()}}, data); + return d->runInShellSuccess({"dd", {"of=" + filePath.path()}}, data); } Environment DockerDevice::systemEnvironment() const @@ -926,8 +928,8 @@ void DockerDevice::aboutToBeRemoved() const } std::optional DockerDevicePrivate::fileContents(const FilePath &filePath, - qint64 limit, - qint64 offset) + qint64 limit, + qint64 offset) { updateContainerAccess(); @@ -939,7 +941,7 @@ std::optional DockerDevicePrivate::fileContents(const FilePath &file QString("seek=%1").arg(offset / gcd)}; } - const ContainerShell::RunResult r = m_shell->outputForRunInShell({"dd", args}); + const RunResult r = m_shell->runInShell({"dd", args}); if (r.exitCode != 0) return {}; @@ -952,8 +954,8 @@ void DockerDevicePrivate::fetchSystemEnviroment() updateContainerAccess(); if (m_shell && m_shell->state() == DeviceShell::State::Succeeded) { - const QByteArray output = outputForRunInShell({"env", {}}); - const QString out = QString::fromUtf8(output.data(), output.size()); + const RunResult result = runInShell({"env", {}}); + const QString out = QString::fromUtf8(result.stdOut); m_cachedEnviroment = Environment(out.split('\n', Qt::SkipEmptyParts), q->osType()); return; } @@ -972,20 +974,13 @@ void DockerDevicePrivate::fetchSystemEnviroment() qCWarning(dockerDeviceLog) << "Cannot read container environment:", qPrintable(remoteError); } -bool DockerDevicePrivate::runInShell(const CommandLine &cmd, const QByteArray &stdInData) +RunResult DockerDevicePrivate::runInShell(const CommandLine &cmd, const QByteArray &stdInData) { updateContainerAccess(); - QTC_ASSERT(m_shell, return false); + QTC_ASSERT(m_shell, return {}); return m_shell->runInShell(cmd, stdInData); } -QByteArray DockerDevicePrivate::outputForRunInShell(const CommandLine &cmd) -{ - updateContainerAccess(); - QTC_ASSERT(m_shell.get(), return {}); - return m_shell->outputForRunInShell(cmd).stdOut; -} - // Factory class DockerImageItem final : public TreeItem, public DockerDeviceData diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 9b5d9c78f7a..cf7fe54810a 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -357,8 +357,11 @@ public: ~LinuxDevicePrivate(); bool setupShell(); - bool runInShell(const CommandLine &cmd, const QByteArray &data = {}); - std::optional outputForRunInShell(const CommandLine &cmd); + RunResult runInShell(const CommandLine &cmd, const QByteArray &stdInData = {}); + bool runInShellSuccess(const CommandLine &cmd, const QByteArray &stdInData = {}) { + return runInShell(cmd, stdInData).exitCode == 0; + } + void attachToSharedConnection(SshConnectionHandle *connectionHandle, const SshParameters &sshParameters); @@ -462,7 +465,7 @@ qint64 SshProcessInterface::processId() const bool SshProcessInterface::runInShell(const CommandLine &command, const QByteArray &data) { - return d->m_devicePrivate->runInShell(command, data); + return d->m_devicePrivate->runInShellSuccess(command, data); } void SshProcessInterface::start() @@ -807,20 +810,10 @@ public: } // Call me with shell mutex locked - bool runInShell(const CommandLine &cmd, const QByteArray &data = {}) - { - QTC_ASSERT(m_shell, return false); - return m_shell->runInShell(cmd, data); - } - - // Call me with shell mutex locked - std::optional outputForRunInShell(const CommandLine &cmd) + RunResult runInShell(const CommandLine &cmd, const QByteArray &data = {}) { QTC_ASSERT(m_shell, return {}); - const DeviceShell::RunResult result = m_shell->outputForRunInShell(cmd); - if (result.exitCode == 0) - return result.stdOut; - return {}; + return m_shell->runInShell(cmd, data); } void setSshParameters(const SshParameters &sshParameters) @@ -1104,22 +1097,13 @@ bool LinuxDevicePrivate::setupShell() return ok; } -bool LinuxDevicePrivate::runInShell(const CommandLine &cmd, const QByteArray &data) +RunResult LinuxDevicePrivate::runInShell(const CommandLine &cmd, const QByteArray &data) { QMutexLocker locker(&m_shellMutex); DEBUG(cmd.toUserOutput()); - QTC_ASSERT(setupShell(), return false); - - return m_handler->runInShell(cmd, data); -} - -std::optional LinuxDevicePrivate::outputForRunInShell(const CommandLine &cmd) -{ - QMutexLocker locker(&m_shellMutex); - DEBUG(cmd); QTC_ASSERT(setupShell(), return {}); - return m_handler->outputForRunInShell(cmd); + return m_handler->runInShell(cmd, data); } void LinuxDevicePrivate::attachToSharedConnection(SshConnectionHandle *connectionHandle, @@ -1141,56 +1125,56 @@ bool LinuxDevice::isExecutableFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-x", path}}); + return d->runInShellSuccess({"test", {"-x", path}}); } bool LinuxDevice::isReadableFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-r", path, "-a", "-f", path}}); + return d->runInShellSuccess({"test", {"-r", path, "-a", "-f", path}}); } bool LinuxDevice::isWritableFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-w", path, "-a", "-f", path}}); + return d->runInShellSuccess({"test", {"-w", path, "-a", "-f", path}}); } bool LinuxDevice::isReadableDirectory(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-r", path, "-a", "-d", path}}); + return d->runInShellSuccess({"test", {"-r", path, "-a", "-d", path}}); } bool LinuxDevice::isWritableDirectory(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-w", path, "-a", "-d", path}}); + return d->runInShellSuccess({"test", {"-w", path, "-a", "-d", path}}); } bool LinuxDevice::isFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-f", path}}); + return d->runInShellSuccess({"test", {"-f", path}}); } bool LinuxDevice::isDirectory(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-d", path}}); + return d->runInShellSuccess({"test", {"-d", path}}); } bool LinuxDevice::createDirectory(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"mkdir", {"-p", path}}); + return d->runInShellSuccess({"mkdir", {"-p", path}}); } bool LinuxDevice::exists(const FilePath &filePath) const @@ -1198,20 +1182,20 @@ bool LinuxDevice::exists(const FilePath &filePath) const DEBUG("filepath " << filePath.path()); QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"test", {"-e", path}}); + return d->runInShellSuccess({"test", {"-e", path}}); } bool LinuxDevice::ensureExistingFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); const QString path = filePath.path(); - return d->runInShell({"touch", {path}}); + return d->runInShellSuccess({"touch", {path}}); } bool LinuxDevice::removeFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); - return d->runInShell({"rm", {filePath.path()}}); + return d->runInShellSuccess({"rm", {filePath.path()}}); } bool LinuxDevice::removeRecursively(const FilePath &filePath) const @@ -1226,29 +1210,28 @@ bool LinuxDevice::removeRecursively(const FilePath &filePath) const const int levelsNeeded = path.startsWith("/home/") ? 3 : 2; QTC_ASSERT(path.count('/') >= levelsNeeded, return false); - return d->runInShell({"rm", {"-rf", "--", path}}); + return d->runInShellSuccess({"rm", {"-rf", "--", path}}); } bool LinuxDevice::copyFile(const FilePath &filePath, const FilePath &target) const { QTC_ASSERT(handlesFile(filePath), return false); QTC_ASSERT(handlesFile(target), return false); - return d->runInShell({"cp", {filePath.path(), target.path()}}); + return d->runInShellSuccess({"cp", {filePath.path(), target.path()}}); } bool LinuxDevice::renameFile(const FilePath &filePath, const FilePath &target) const { QTC_ASSERT(handlesFile(filePath), return false); QTC_ASSERT(handlesFile(target), return false); - return d->runInShell({"mv", {filePath.path(), target.path()}}); + return d->runInShellSuccess({"mv", {filePath.path(), target.path()}}); } QDateTime LinuxDevice::lastModified(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return {}); - const QByteArray output = d->outputForRunInShell({"stat", {"-L", "-c", "%Y", filePath.path()}}) - .value_or(QByteArray()); - const qint64 secs = output.toLongLong(); + const RunResult result = d->runInShell({"stat", {"-L", "-c", "%Y", filePath.path()}}); + const qint64 secs = result.stdOut.toLongLong(); const QDateTime dt = QDateTime::fromSecsSinceEpoch(secs, Qt::UTC); return dt; } @@ -1256,18 +1239,16 @@ QDateTime LinuxDevice::lastModified(const FilePath &filePath) const FilePath LinuxDevice::symLinkTarget(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return {}); - const QByteArray output = d->outputForRunInShell({"readlink", {"-n", "-e", filePath.path()}}) - .value_or(QByteArray()); - const QString out = QString::fromUtf8(output.data(), output.size()); - return output.isEmpty() ? FilePath() : filePath.withNewPath(out); + const RunResult result = d->runInShell({"readlink", {"-n", "-e", filePath.path()}}); + return result.stdOut.isEmpty() ? FilePath() + : filePath.withNewPath(QString::fromUtf8(result.stdOut)); } qint64 LinuxDevice::fileSize(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return -1); - const QByteArray output = d->outputForRunInShell({"stat", {"-L", "-c", "%s", filePath.path()}}) - .value_or(QByteArray()); - return output.toLongLong(); + const RunResult result = d->runInShell({"stat", {"-L", "-c", "%s", filePath.path()}}); + return result.stdOut.toLongLong(); } qint64 LinuxDevice::bytesAvailable(const FilePath &filePath) const @@ -1275,17 +1256,15 @@ qint64 LinuxDevice::bytesAvailable(const FilePath &filePath) const QTC_ASSERT(handlesFile(filePath), return -1); CommandLine cmd("df", {"-k"}); cmd.addArg(filePath.path()); - const QByteArray output = d->outputForRunInShell(cmd).value_or(QByteArray()); - - return FileUtils::bytesAvailableFromDFOutput(output); + const RunResult result = d->runInShell(cmd); + return FileUtils::bytesAvailableFromDFOutput(result.stdOut); } QFileDevice::Permissions LinuxDevice::permissions(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return {}); - const QByteArray output = d->outputForRunInShell({"stat", {"-L", "-c", "%a", filePath.path()}}) - .value_or(QByteArray()); - const uint bits = output.toUInt(nullptr, 8); + const RunResult result = d->runInShell({"stat", {"-L", "-c", "%a", filePath.path()}}); + const uint bits = result.stdOut.toUInt(nullptr, 8); QFileDevice::Permissions perm = {}; #define BIT(n, p) if (bits & (1<runInShell({"chmod", {QString::number(flags, 16), filePath.path()}}); + return d->runInShellSuccess({"chmod", {QString::number(flags, 16), filePath.path()}}); } void LinuxDevice::iterateDirectory(const FilePath &filePath, @@ -1313,9 +1292,7 @@ void LinuxDevice::iterateDirectory(const FilePath &filePath, const FileFilter &filter) const { QTC_ASSERT(handlesFile(filePath), return); - auto runInShell = [this](const CommandLine &cmd) { - return d->outputForRunInShell(cmd).value_or(QByteArray()); - }; + auto runInShell = [this](const CommandLine &cmd) { return d->runInShell(cmd); }; FileUtils::iterateUnixDirectory(filePath, filter, &d->m_useFind, runInShell, callBack); } @@ -1331,19 +1308,20 @@ std::optional LinuxDevice::fileContents(const FilePath &filePath, } CommandLine cmd(FilePath::fromString("dd"), args, CommandLine::Raw); - const std::optional output = d->outputForRunInShell(cmd); - if (output) { - DEBUG(*output << QByteArray::fromHex(*output)); - } else { + const RunResult result = d->runInShell(cmd); + if (result.exitCode != 0) { DEBUG("fileContents failed"); + return {}; } - return output; + + DEBUG(result.stdOut << QByteArray::fromHex(result.stdOut)); + return result.stdOut; } bool LinuxDevice::writeFileContents(const FilePath &filePath, const QByteArray &data) const { QTC_ASSERT(handlesFile(filePath), return {}); - return d->runInShell({"dd", {"of=" + filePath.path()}}, data); + return d->runInShellSuccess({"dd", {"of=" + filePath.path()}}, data); } static FilePaths dirsToCreate(const FilesToTransfer &files) diff --git a/tests/auto/utils/deviceshell/tst_deviceshell.cpp b/tests/auto/utils/deviceshell/tst_deviceshell.cpp index db4a18a6164..ceba7a90eef 100644 --- a/tests/auto/utils/deviceshell/tst_deviceshell.cpp +++ b/tests/auto/utils/deviceshell/tst_deviceshell.cpp @@ -162,7 +162,7 @@ private slots: QRandomGenerator generator; - const DeviceShell::RunResult result = shell.outputForRunInShell({"echo", {testData}}); + const RunResult result = shell.runInShell({"echo", {testData}}); QCOMPARE(result.exitCode, 0); const QString expected = testData + "\n"; const QString resultAsUtf8 = QString::fromUtf8(result.stdOut); @@ -210,7 +210,7 @@ private slots: QRandomGenerator generator; - const DeviceShell::RunResult result = shell.outputForRunInShell({"cat", {}}, testData.toUtf8()); + const RunResult result = shell.runInShell({"cat", {}}, testData.toUtf8()); QCOMPARE(result.exitCode, 0); const QString resultAsUtf8 = QString::fromUtf8(result.stdOut); QCOMPARE(resultAsUtf8.size(), testData.size()); @@ -236,8 +236,7 @@ private slots: TestShell shell(cmdLine); QCOMPARE(shell.state(), DeviceShell::State::Succeeded); - const DeviceShell::RunResult result = shell.outputForRunInShell({"cat", {}}, - m_asciiTestData); + const RunResult result = shell.runInShell({"cat", {}}, m_asciiTestData); QCOMPARE(result.stdOut, m_asciiTestData); } @@ -260,12 +259,11 @@ private slots: TestShell shell(cmdLine); QCOMPARE(shell.state(), DeviceShell::State::Succeeded); - const DeviceShell::RunResult result = shell.outputForRunInShell({"cat", {}}, - m_asciiTestData); + const RunResult result = shell.runInShell({"cat", {}}, m_asciiTestData); QCOMPARE(result.stdOut, m_asciiTestData); QVERIFY(result.stdErr.isEmpty()); - const DeviceShell::RunResult result2 = shell.outputForRunInShell( + const RunResult result2 = shell.runInShell( {"cat", {"/tmp/i-do-not-exist.none"}}); QVERIFY(!result2.stdErr.isEmpty()); QVERIFY(result2.exitCode != 0); @@ -290,7 +288,7 @@ private slots: TestShell shell(cmdLine); QCOMPARE(shell.state(), DeviceShell::State::Succeeded); - const DeviceShell::RunResult result = shell.outputForRunInShell({}, {}); + const RunResult result = shell.runInShell({}, {}); QVERIFY(result.exitCode == 255); } @@ -322,7 +320,7 @@ private slots: while (true) { QElapsedTimer t; t.start(); - DeviceShell::RunResult result = shell.outputForRunInShell({"find", {"/usr", "-maxdepth", QString::number(maxDepth)}}); + RunResult result = shell.runInShell({"find", {"/usr", "-maxdepth", QString::number(maxDepth)}}); numMs = t.elapsed(); qDebug() << "adjusted maxDepth" << maxDepth << "took" << numMs << "ms"; if (numMs < 100 || maxDepth == 1) { @@ -334,7 +332,7 @@ private slots: QList results = Utils::mapped(runs, [&shell, maxDepth](const int i) -> QByteArray{ QElapsedTimer t; t.start(); - DeviceShell::RunResult result = shell.outputForRunInShell({"find", {"/usr", "-maxdepth", QString::number(maxDepth)}}); + RunResult result = shell.runInShell({"find", {"/usr", "-maxdepth", QString::number(maxDepth)}}); qDebug() << i << "took" << t.elapsed() << "ms"; return result.stdOut; }); @@ -357,8 +355,8 @@ private slots: TestShell shell(cmdLine, true); QCOMPARE(shell.state(), DeviceShell::State::NoScript); - const bool result = shell.runInShell({"echo", {"Hello"}}); - QCOMPARE(result, true); + const RunResult result = shell.runInShell({"echo", {"Hello"}}); + QCOMPARE(result.exitCode, 0); } }; diff --git a/tests/manual/deviceshell/tst_deviceshell.cpp b/tests/manual/deviceshell/tst_deviceshell.cpp index c65cf0f3164..f23efd82318 100644 --- a/tests/manual/deviceshell/tst_deviceshell.cpp +++ b/tests/manual/deviceshell/tst_deviceshell.cpp @@ -100,7 +100,7 @@ class tst_DeviceShell : public QObject const QList result = mapped(testArray, [&shell](QByteArray data) -> QByteArray { - return shell.outputForRunInShell({"cat", {}}, data).stdOut; + return shell.runInShell({"cat", {}}, data).stdOut; }, MapReduceOption::Ordered, QThreadPool::globalInstance()); QCOMPARE(result, testArray); @@ -164,7 +164,7 @@ private slots: TestShell shell; QCOMPARE(shell.state(), DeviceShell::State::Succeeded); - const DeviceShell::RunResult r = shell.outputForRunInShell({"cat", {}}, utf8string.toUtf8()); + const RunResult r = shell.runInShell({"cat", {}}, utf8string.toUtf8()); const QString output = QString::fromUtf8(r.stdOut); QCOMPARE(output, utf8string); } From 1462258939c4c98bf5d480a9cc1dfc70fbafa954 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 10 Oct 2022 10:01:26 +0200 Subject: [PATCH 104/104] AutoTest: Avoid crash Do not emit sizeHintChanged() on a QModelIndex that is no more part of the model. Fixes: QTCREATORBUG-28269 Change-Id: I1fa1733961eff8b427a9510243d304565cefe380 Reviewed-by: Eike Ziller --- src/plugins/autotest/testresultdelegate.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugins/autotest/testresultdelegate.cpp b/src/plugins/autotest/testresultdelegate.cpp index 9d123bbad86..161857ca9d8 100644 --- a/src/plugins/autotest/testresultdelegate.cpp +++ b/src/plugins/autotest/testresultdelegate.cpp @@ -181,8 +181,12 @@ void TestResultDelegate::clearCache() m_lastProcessedIndex = QModelIndex(); m_lastProcessedFont = QFont(); m_lastWidth = -1; - if (current.isValid()) - emit sizeHintChanged(current); + if (current.isValid()) { + if (auto model = current.model()) { + if (model->index(current.row(), current.column(), current.parent()) == current) + emit sizeHintChanged(current); + } + } } void TestResultDelegate::limitTextOutput(QString &output) const