From 1c47a0a301c291b0ec450b7a141c5067d402dac4 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 5 Mar 2024 07:40:28 +0100 Subject: [PATCH 01/45] TextEditor: Use synchronous highlighter by default Change-Id: I796800972668d4cad9dd12aa4fcc9395febcce0f Reviewed-by: Eike Ziller --- src/plugins/texteditor/textdocument.cpp | 16 ++++++++++------ src/plugins/texteditor/textdocument.h | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp index cb421f2bf7c..2636ad46e23 100644 --- a/src/plugins/texteditor/textdocument.cpp +++ b/src/plugins/texteditor/textdocument.cpp @@ -914,19 +914,23 @@ bool TextDocument::reload(QString *errorString, ReloadFlag flag, ChangeType type void TextDocument::resetSyntaxHighlighter(const std::function &creator, bool threaded) { - if (d->m_highlighterRunner) - delete d->m_highlighterRunner; + delete d->m_highlighterRunner; - static const bool envValue - = qtcEnvironmentVariable("QTC_USE_THREADED_HIGHLIGHTER", "TRUE").toUpper() - == QLatin1String("TRUE"); + static const std::optional envValue = []() -> std::optional { + const QString key("QTC_USE_THREADED_HIGHLIGHTER"); + if (qtcEnvironmentVariableIsSet(key)) { + const QString value = qtcEnvironmentVariable(key).toUpper(); + return value != "FALSE" && value != "0"; + } + return {}; + }(); SyntaxHighlighter *highlighter = creator(); highlighter->setFontSettings(TextEditorSettings::fontSettings()); highlighter->setMimeType(mimeType()); d->m_highlighterRunner = new SyntaxHighlighterRunner(highlighter, document(), - threaded && envValue); + envValue.value_or(threaded)); } void TextDocument::cleanWhitespace(const QTextCursor &cursor) diff --git a/src/plugins/texteditor/textdocument.h b/src/plugins/texteditor/textdocument.h index ad3fe262e24..5879d9e9ec2 100644 --- a/src/plugins/texteditor/textdocument.h +++ b/src/plugins/texteditor/textdocument.h @@ -127,7 +127,7 @@ public: QTextDocument *document() const; using SyntaxHighLighterCreator = std::function; - void resetSyntaxHighlighter(const SyntaxHighLighterCreator &creator, bool threaded = true); + void resetSyntaxHighlighter(const SyntaxHighLighterCreator &creator, bool threaded = false); SyntaxHighlighterRunner *syntaxHighlighterRunner() const; bool reload(QString *errorString, QTextCodec *codec); From 1badc9f4a8b367f0c090e508513b59af5c7c157a Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 20 Feb 2024 10:23:17 +0100 Subject: [PATCH 02/45] ClangFormat: Do not align parameters/arguments with the function name The previous setting - wastes space, leading to problems when both the function name and the parameter (or, more likely, the argument expression) are long-ish. - necessitates re-formatting of the entire argument/parameter list on function renaming. Change-Id: Ica82e284f9a5a8f2cf244938996039a59ce0b3aa Reviewed-by: Reviewed-by: Christian Kandeler --- .clang-format | 2 +- tests/manual/clang-format-for-qtc/test.cpp | 134 +++++++++++---------- 2 files changed, 72 insertions(+), 64 deletions(-) diff --git a/.clang-format b/.clang-format index 2af05c07cd1..d71ae17f30e 100644 --- a/.clang-format +++ b/.clang-format @@ -18,7 +18,7 @@ --- Language: Cpp AccessModifierOffset: -4 -AlignAfterOpenBracket: Align +AlignAfterOpenBracket: AlwaysBreak AlignConsecutiveAssignments: None AlignConsecutiveDeclarations: None AlignEscapedNewlines: DontAlign diff --git a/tests/manual/clang-format-for-qtc/test.cpp b/tests/manual/clang-format-for-qtc/test.cpp index 02119baef30..92c9347b007 100644 --- a/tests/manual/clang-format-for-qtc/test.cpp +++ b/tests/manual/clang-format-for-qtc/test.cpp @@ -169,14 +169,15 @@ void f3(int parameter1, int parameter2, int parameter3); void f3( int parameter1, int parameter2, int parameter3, int parameter4, int parameter5, int parameter6); -void f3(int parameter1, - int parameter2, - int parameter3, - int parameter4, - int parameter5, - int parameter6, - int parrameter7, - int p = aGlobalInt); +void f3( + int parameter1, + int parameter2, + int parameter3, + int parameter4, + int parameter5, + int parameter6, + int parrameter7, + int p = aGlobalInt); bool operator==(N::Baz, N::Baz); @@ -291,13 +292,14 @@ int functionToCall( return 1; } -int functionToCall(int paramter1, - int parameter2, - int parameter3, - int parameter4, - int parameter5, - int paramete6, - int parameter6) +int functionToCall( + int paramter1, + int parameter2, + int parameter3, + int parameter4, + int parameter5, + int paramete6, + int parameter6) { return 1; } @@ -327,44 +329,45 @@ void penaltyTests(bool isThatTrue) const auto someValue10 = functionToCall(valueX, valueY, valueXTimesY); const auto someValue11 = functionToCall(valueX, valueY, valueXTimesY, unbelievableBigValue, unbelievableBigValue); - const auto someValue12 = functionToCall(valueX, - valueY, - valueXTimesY, - unbelievableBigValue, - unbelievableBigValue * unbelievableBigValue, - unbelievableBigValue); + const auto someValue12 = functionToCall( + valueX, + valueY, + valueXTimesY, + unbelievableBigValue, + unbelievableBigValue * unbelievableBigValue, + unbelievableBigValue); - const auto someValue13 = functionToCall(valueX, - valueY, - valueXTimesY, - unbelievableBigValue, - functionToCall(functionToCall(valueX), - functionToCall(valueY)), - unbelievableBigValue); + const auto someValue13 = functionToCall( + valueX, + valueY, + valueXTimesY, + unbelievableBigValue, + functionToCall(functionToCall(valueX), functionToCall(valueY)), + unbelievableBigValue); - const auto someValue14WithAnOutstandingLongName - = functionToCall(valueX, - valueY, - valueXTimesY, - unbelievableBigValue, - functionToCall(functionToCall(valueX), functionToCall(valueY)), - unbelievableBigValue); + const auto someValue14WithAnOutstandingLongName = functionToCall( + valueX, + valueY, + valueXTimesY, + unbelievableBigValue, + functionToCall(functionToCall(valueX), functionToCall(valueY)), + unbelievableBigValue); const bool someValue20 = functionToCall(valueX, valueY, valueXTimesY) || functionToCall(3); const bool someValue21 = functionToCall(valueX, valueY, valueXTimesY) || functionToCall(valueX, valueY); - emitAddOutput(QCoreApplication::tr("Starting: \"%1\" %2") - .arg("/some/very/very/very/very/long/path/to/an/executable", arguments), - functionToCall(3), - functionToCall(3) | valueX); + emitAddOutput( + QCoreApplication::tr("Starting: \"%1\" %2") + .arg("/some/very/very/very/very/long/path/to/an/executable", arguments), + functionToCall(3), + functionToCall(3) | valueX); - emitAddOutput(QCoreApplication::tr("Starting: \"%1\" %2") - .arg("/some/very/very/very/very/long/path/to/an/executable", - argumentsVeryLong), - functionToCall(3), - functionToCall(3) | unlimitedValueunbelievableBigValue - | unlimitedValueunbelievableBigValue); + emitAddOutput( + QCoreApplication::tr("Starting: \"%1\" %2") + .arg("/some/very/very/very/very/long/path/to/an/executable", argumentsVeryLong), + functionToCall(3), + functionToCall(3) | unlimitedValueunbelievableBigValue | unlimitedValueunbelievableBigValue); const QString path; const bool someLongerNameNNNNNNNNNN @@ -400,12 +403,13 @@ public: , data3(d2) {} - MyClass(int initialData1, - int initialData2, - int initialData3, - int initialData4, - int initialData5, - int initialData6) + MyClass( + int initialData1, + int initialData2, + int initialData3, + int initialData4, + int initialData5, + int initialData6) : data1(initialData1) , data2(initialData2) , data3(initialData3) @@ -636,22 +640,26 @@ void extremeFunction( "super duper long"); } -void extremeFunction2(int parameter1, - int parameter2, - int parameter3WithAVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVerVeryVeryLong) +void extremeFunction2( + int parameter1, + int parameter2, + int parameter3WithAVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVerVeryVeryLong) { - extremeFunction2(parameter1, - parameter2, - parameter3WithAVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVerVeryVeryLong); + extremeFunction2( + parameter1, + parameter2, + parameter3WithAVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVerVeryVeryLong); } -void extremeFunction3(int parameter1, - int parameter2, - int parameter3WithAVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVerVeryVeryLongNameX) +void extremeFunction3( + int parameter1, + int parameter2, + int parameter3WithAVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVerVeryVeryLongNameX) { - extremeFunction3(parameter1, - parameter2, - parameter3WithAVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVerVeryVeryLongNameX); + extremeFunction3( + parameter1, + parameter2, + parameter3WithAVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVerVeryVeryLongNameX); } // ------------------------------------------------------------------------------------------------- From e31a06a0f42143724ebf35aa2cc669dbcf54fbf0 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 5 Mar 2024 11:09:57 +0100 Subject: [PATCH 03/45] Android/ProjectExplorer: Fix crash when removing multiple Android Qts That were configured for a project. The crash is triggered by a messy combination of the Android automatic kit creation, project window update, and automatic creation of Qt versions and kits by the automatic project importers, including a mess of the listener pattern without any atomicity. - the user removes the Qt versions - the Android plugin updates the automatic kits and individually reports the removed kits (*) - that triggers an update of the project window and an update of the target setup page (even if that is not shown, but that's yet another issue) - that triggers the project importers, which add Qt versions, which in turn triggers another update of automatic kits in the Android plugin - while that is still in the reporting loop at (*) - that leads to the crash, because the state at this point of time is a mess This minimal fix of the specific crash makes the kit update reporting in the Android plugin at (*) "more atomic", and the same for similar code in the iOS plugin. Fixes: QTCREATORBUG-30347 Change-Id: I2bea6fb735abcaa34469fc43f44aa37313f70429 Reviewed-by: Qt CI Bot Reviewed-by: Alessandro Portale Reviewed-by: Reviewed-by: Christian Kandeler --- src/plugins/android/androidconfigurations.cpp | 3 +- src/plugins/ios/iosconfigurations.cpp | 3 +- src/plugins/projectexplorer/kitmanager.cpp | 30 ++++++++++++++----- src/plugins/projectexplorer/kitmanager.h | 1 + 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index fae6c64bbe3..8edba77605c 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1470,8 +1470,7 @@ void AndroidConfigurations::updateAutomaticKitList() } // cleanup any mess that might have existed before, by removing all Android kits that // existed before, but weren't re-used - for (Kit *k : unhandledKits) - KitManager::deregisterKit(k); + KitManager::deregisterKits(unhandledKits); } Environment AndroidConfig::toolsEnvironment() const diff --git a/src/plugins/ios/iosconfigurations.cpp b/src/plugins/ios/iosconfigurations.cpp index 8e748bfd6ef..d576202fbde 100644 --- a/src/plugins/ios/iosconfigurations.cpp +++ b/src/plugins/ios/iosconfigurations.cpp @@ -305,8 +305,7 @@ void IosConfigurations::updateAutomaticKitList() existingKits.subtract(resultingKits); qCDebug(kitSetupLog) << "Removing unused kits:"; printKits(existingKits); - for (Kit *kit : std::as_const(existingKits)) - KitManager::deregisterKit(kit); + KitManager::deregisterKits(toList(existingKits)); } static IosConfigurations *m_instance = nullptr; diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index ae6755fb00b..ea23bea65f2 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -650,16 +650,30 @@ Kit *KitManager::registerKit(const std::function &init, Utils::Id void KitManager::deregisterKit(Kit *k) { - QTC_ASSERT(KitManager::isLoaded(), return); + deregisterKits({k}); +} - if (!k || !Utils::contains(d->m_kitList, k)) - return; - auto taken = Utils::take(d->m_kitList, k); - if (defaultKit() == k) { - Kit *newDefault = Utils::findOrDefault(kits(), [](Kit *k) { return k->isValid(); }); - setDefaultKit(newDefault); +void KitManager::deregisterKits(const QList kitList) +{ + QTC_ASSERT(KitManager::isLoaded(), return); + std::vector> removed; // to keep them alive until the end of the function + Kit *newDefault = nullptr; + for (Kit *k : kitList) { + if (!k) + continue; + std::optional> taken = Utils::take(d->m_kitList, k); + if (!taken) + continue; + removed.push_back(std::move(*taken)); + if (defaultKit() == k) { + newDefault = Utils::findOrDefault(kits(), [](Kit *k) { return k->isValid(); }); + } } - emit instance()->kitRemoved(k); + if (newDefault) + setDefaultKit(newDefault); + + for (auto it = removed.cbegin(); it != removed.cend(); ++it) + emit instance()->kitRemoved(it->get()); emit instance()->kitsChanged(); } diff --git a/src/plugins/projectexplorer/kitmanager.h b/src/plugins/projectexplorer/kitmanager.h index 4146d440e0b..44c6223d79b 100644 --- a/src/plugins/projectexplorer/kitmanager.h +++ b/src/plugins/projectexplorer/kitmanager.h @@ -153,6 +153,7 @@ public: static Kit *registerKit(const std::function &init, Utils::Id id = {}); static void deregisterKit(Kit *k); + static void deregisterKits(const QList kits); static void setDefaultKit(Kit *k); static void saveKits(); From bb87db09e287a2e60782d8eb212586415a630f98 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Mon, 12 Feb 2024 11:10:04 +0100 Subject: [PATCH 04/45] SyntaxHighlighter: Add rerun if highlighting was interrupted Added mechanism of highlighting restart when the previous highlighting was interrupted. Change-Id: Ic44c06442fd9f0002fed760472d5d39903e7ef50 Reviewed-by: Reviewed-by: David Schulz --- src/plugins/texteditor/syntaxhighlighter.cpp | 15 +-- src/plugins/texteditor/syntaxhighlighter.h | 11 +- .../texteditor/syntaxhighlighterrunner.cpp | 123 +++++++++++++++--- .../texteditor/syntaxhighlighterrunner.h | 16 +++ 4 files changed, 136 insertions(+), 29 deletions(-) diff --git a/src/plugins/texteditor/syntaxhighlighter.cpp b/src/plugins/texteditor/syntaxhighlighter.cpp index 34f4b1c7772..f7db190852d 100644 --- a/src/plugins/texteditor/syntaxhighlighter.cpp +++ b/src/plugins/texteditor/syntaxhighlighter.cpp @@ -206,8 +206,11 @@ void SyntaxHighlighterPrivate::reformatBlocks(int from, int charsRemoved, int ch vecRes << resStart; while (block.isValid() && (block.position() < endPosition || forceHighlightOfNextBlock)) { - if (QThread::currentThread()->isInterruptionRequested()) - break; + if (QThread::currentThread()->isInterruptionRequested() || q->isInterrupted()) { + inReformatBlocks = false; + emit q->resultsReady({}); + return; + } const int stateBeforeHighlight = block.userState(); @@ -767,9 +770,7 @@ void SyntaxHighlighter::setExtraFormats(const QTextBlock &block, res.m_formatRanges = block.layout()->formats(); res.fillByBlock(block); res.m_state = SyntaxHighlighter::State::Extras; - SyntaxHighlighter::Result resDone; - resDone.m_state = SyntaxHighlighter::State::Done; - emit resultsReady({res, resDone}); + emit resultsReady({std::move(res)}); document()->markContentsDirty(block.position(), blockLength - 1); d->inReformatBlocks = wasInReformatBlocks; @@ -796,9 +797,7 @@ void SyntaxHighlighter::clearExtraFormats(const QTextBlock &block) res.m_formatRanges = block.layout()->formats(); res.fillByBlock(block); res.m_state = SyntaxHighlighter::State::Extras; - SyntaxHighlighter::Result resDone; - resDone.m_state = SyntaxHighlighter::State::Done; - emit resultsReady({res, resDone}); + emit resultsReady({std::move(res)}); document()->markContentsDirty(block.position(), blockLength - 1); d->inReformatBlocks = wasInReformatBlocks; diff --git a/src/plugins/texteditor/syntaxhighlighter.h b/src/plugins/texteditor/syntaxhighlighter.h index 533c628b9cd..6b07d333f33 100644 --- a/src/plugins/texteditor/syntaxhighlighter.h +++ b/src/plugins/texteditor/syntaxhighlighter.h @@ -56,15 +56,15 @@ public: enum State { Start, InProgress, - Extras, - Done + Done, + Extras }; struct Result { void fillByBlock(const QTextBlock &block) { - m_blockNumber = block.position(); + m_blockNumber = block.blockNumber(); m_userState = block.userState(); TextBlockUserData *userDate = TextDocumentLayout::textUserData(block); @@ -117,6 +117,8 @@ public: State m_state = InProgress; }; + void setInterrupted(bool interrupted) { m_interrupted = interrupted; } + bool isInterrupted() { return m_interrupted; } void setExtraFormats(const QTextBlock &block, const QList &formats); virtual void setLanguageFeaturesFlags(unsigned int /*flags*/) {}; // needed for CppHighlighting virtual void setEnabled(bool /*enabled*/) {}; // needed for DiffAndLogHighlighter @@ -126,6 +128,7 @@ public slots: virtual void rehighlight(); void rehighlightBlock(const QTextBlock &block); void clearExtraFormats(const QTextBlock &block); + void reformatBlocks(int from, int charsRemoved, int charsAdded); void clearAllExtraFormats(); protected: @@ -165,10 +168,10 @@ signals: private: void setTextFormatCategories(const QList> &categories); - void reformatBlocks(int from, int charsRemoved, int charsAdded); void delayedRehighlight(); QScopedPointer d_ptr; + std::atomic m_interrupted = false; #ifdef WITH_TESTS friend class tst_highlighter; diff --git a/src/plugins/texteditor/syntaxhighlighterrunner.cpp b/src/plugins/texteditor/syntaxhighlighterrunner.cpp index 228b8668493..1a649af5329 100644 --- a/src/plugins/texteditor/syntaxhighlighterrunner.cpp +++ b/src/plugins/texteditor/syntaxhighlighterrunner.cpp @@ -81,7 +81,6 @@ public: void setFontSettings(const TextEditor::FontSettings &fontSettings) { m_highlighter->setFontSettings(fontSettings); - rehighlight(); } void setDefinitionName(const QString &name) @@ -98,13 +97,51 @@ public: void rehighlight() { m_highlighter->rehighlight(); } + void reformatBlocks(int from, int charsRemoved, int charsAdded) + { + m_highlighter->reformatBlocks(from, charsRemoved, charsAdded); + } + + void setInterrupted(bool interrupted) { m_highlighter->setInterrupted(interrupted); } + SyntaxHighlighter *m_highlighter = nullptr; QTextDocument *m_document = nullptr; + signals: void resultsReady(const QList &result); }; +void SyntaxHighlighterRunner::HighlightingStatus::notInterrupted(int from, + int charsRemoved, + int charsAdded) +{ + m_from = from; + m_addedChars = charsAdded; + m_removedChars = charsRemoved; + m_current = from; + m_newFrom = from + m_addedChars; + m_interruptionRequested = false; +} + +void SyntaxHighlighterRunner::HighlightingStatus::interrupted(int from, + int charsRemoved, + int charsAdded) +{ + m_newFrom = std::min(m_newFrom, from); + m_newFrom = std::min(m_current, m_newFrom); + m_removedChars += charsRemoved; + m_addedChars += charsAdded; + m_interruptionRequested = true; +} + +void SyntaxHighlighterRunner::HighlightingStatus::applyNewFrom() +{ + m_from = m_newFrom; + m_current = m_newFrom; + m_interruptionRequested = false; +} + SyntaxHighlighterRunner::SyntaxHighlighterRunner(SyntaxHighlighter *highlighter, QTextDocument *document, bool async) @@ -124,8 +161,8 @@ SyntaxHighlighterRunner::SyntaxHighlighterRunner(SyntaxHighlighter *highlighter, this, &SyntaxHighlighterRunner::applyFormatRanges); - changeDocument(0, 0, document->characterCount()); - connect(document, + changeDocument(0, 0, m_document->characterCount()); + connect(m_document, &QTextDocument::contentsChange, this, &SyntaxHighlighterRunner::changeDocument); @@ -136,10 +173,15 @@ SyntaxHighlighterRunner::SyntaxHighlighterRunner(SyntaxHighlighter *highlighter, &SyntaxHighlighterRunnerPrivate::resultsReady, this, [this](const QList &result) { + if (result.size() == 1 + && result.at(0).m_state == SyntaxHighlighter::State::Extras) + return; + auto done = std::find_if(result.cbegin(), result.cend(), [](const SyntaxHighlighter::Result &res) { - return res.m_state == SyntaxHighlighter::State::Done; + return res.m_state + == SyntaxHighlighter::State::Done; }); if (done != result.cend()) { m_syntaxInfoUpdated = SyntaxHighlighter::State::Done; @@ -168,6 +210,34 @@ void SyntaxHighlighterRunner::applyFormatRanges(const QListsetInterrupted(false); + m_highlightingStatus.applyNewFrom(); + reformatBlocks(m_highlightingStatus.m_newFrom, + m_highlightingStatus.m_removedChars, + m_highlightingStatus.m_addedChars); + return; + } + + auto processResult = [this](SyntaxHighlighter::Result result, QTextBlock docBlock) { + if (!docBlock.isValid()) + return; + + result.copyToBlock(docBlock); + m_highlightingStatus.m_current = docBlock.position() + docBlock.length() - 1; + + if (result.m_formatRanges != docBlock.layout()->formats()) { + docBlock.layout()->setFormats(result.m_formatRanges); + m_document->markContentsDirty(docBlock.position(), docBlock.length()); + } + }; + + if (results.size() == 1 && results.at(0).m_state == SyntaxHighlighter::State::Extras) { + QTextBlock docBlock = m_document->findBlockByNumber(results.at(0).m_blockNumber); + processResult(results.at(0), docBlock); + return; + } + for (const SyntaxHighlighter::Result &result : results) { m_syntaxInfoUpdated = result.m_state; if (m_syntaxInfoUpdated == SyntaxHighlighter::State::Start) { @@ -180,25 +250,18 @@ void SyntaxHighlighterRunner::applyFormatRanges(const QListfindBlock(result.m_blockNumber); - if (!docBlock.isValid()) - return; - - result.copyToBlock(docBlock); - - if (result.m_formatRanges != docBlock.layout()->formats()) { - docBlock.layout()->setFormats(result.m_formatRanges); - m_document->markContentsDirty(docBlock.position(), docBlock.length()); - } - if (m_syntaxInfoUpdated != SyntaxHighlighter::State::Extras) - m_foldValidator.process(docBlock); + QTextBlock docBlock = m_document->findBlockByNumber(result.m_blockNumber); + processResult(result, docBlock); + m_foldValidator.process(docBlock); } } void SyntaxHighlighterRunner::changeDocument(int from, int charsRemoved, int charsAdded) { QTC_ASSERT(m_document, return); + SyntaxHighlighter::State prevSyntaxInfoUpdated = m_syntaxInfoUpdated; m_syntaxInfoUpdated = SyntaxHighlighter::State::InProgress; + QMap blocksPreedit; QTextBlock block = m_document->findBlock(from); const QTextBlock endBlock = m_document->findBlock(from + charsAdded); @@ -213,6 +276,14 @@ void SyntaxHighlighterRunner::changeDocument(int from, int charsRemoved, int cha QMetaObject::invokeMethod(d, [this, from, charsRemoved, text, blocksPreedit] { d->changeDocument(from, charsRemoved, text, blocksPreedit); }); + + if (prevSyntaxInfoUpdated == SyntaxHighlighter::State::InProgress) { + m_highlightingStatus.interrupted(from, charsRemoved, charsAdded); + d->setInterrupted(true); + } else { + m_highlightingStatus.notInterrupted(from, charsRemoved, charsAdded); + d->setInterrupted(false); + } } bool SyntaxHighlighterRunner::useGenericHighlighter() const @@ -239,6 +310,7 @@ void SyntaxHighlighterRunner::clearAllExtraFormats() void SyntaxHighlighterRunner::setFontSettings(const TextEditor::FontSettings &fontSettings) { QMetaObject::invokeMethod(d, [this, fontSettings] { d->setFontSettings(fontSettings); }); + rehighlight(); } void SyntaxHighlighterRunner::setLanguageFeaturesFlags(unsigned int flags) @@ -253,7 +325,24 @@ void SyntaxHighlighterRunner::setEnabled(bool enabled) void SyntaxHighlighterRunner::rehighlight() { - QMetaObject::invokeMethod(d, [this] { d->rehighlight(); }); + if (m_syntaxInfoUpdated == SyntaxHighlighter::State::InProgress) { + m_highlightingStatus.interrupted(0, 0, m_document->characterCount()); + d->setInterrupted(true); + } else { + m_highlightingStatus.notInterrupted(0, 0, m_document->characterCount()); + d->setInterrupted(false); + QMetaObject::invokeMethod(d, [this] { d->rehighlight(); }); + } +} + + +void SyntaxHighlighterRunner::reformatBlocks(int from, int charsRemoved, int charsAdded) +{ + QMetaObject::invokeMethod( + d, + [this, from, charsRemoved, charsAdded] { + d->reformatBlocks(from, charsRemoved, charsAdded); + }); } QString SyntaxHighlighterRunner::definitionName() diff --git a/src/plugins/texteditor/syntaxhighlighterrunner.h b/src/plugins/texteditor/syntaxhighlighterrunner.h index 5540bd666a9..16b7c1535c8 100644 --- a/src/plugins/texteditor/syntaxhighlighterrunner.h +++ b/src/plugins/texteditor/syntaxhighlighterrunner.h @@ -34,6 +34,7 @@ public: void setLanguageFeaturesFlags(unsigned int flags); void setEnabled(bool enabled); void rehighlight(); + void reformatBlocks(int from, int charsRemoved, int charsAdded); QString definitionName(); void setDefinitionName(const QString &name); @@ -53,6 +54,21 @@ private: SyntaxHighlighterRunnerPrivate *d; QPointer m_document = nullptr; SyntaxHighlighter::State m_syntaxInfoUpdated = SyntaxHighlighter::State::Done; + + struct HighlightingStatus + { + int m_from = 0; + int m_addedChars = 0; + int m_current = 0; + int m_removedChars = 0; + int m_newFrom = 0; + bool m_interruptionRequested = false; + + void notInterrupted(int from, int charsRemoved, int charsAdded); + void interrupted(int from, int charsRemoved, int charsAdded); + void applyNewFrom(); + } m_highlightingStatus; + bool m_useGenericHighlighter = false; QString m_definitionName; std::optional m_thread; From e3f099b8f35f60ce500d8d50bd4513c21dbc11b8 Mon Sep 17 00:00:00 2001 From: Dominik Holland Date: Wed, 6 Mar 2024 09:27:51 +0100 Subject: [PATCH 05/45] AppMan: Fix crash when using a qmlproject Limit the Deploy Configuration and the CMake step to CMake projects. Change-Id: If198dc2e4277861f2aa9183c5eeed0cc1d40727c Reviewed-by: Reviewed-by: hjk --- src/plugins/qtapplicationmanager/appmanagercmakepackagestep.cpp | 1 + .../appmanagerdeployconfigurationfactory.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/plugins/qtapplicationmanager/appmanagercmakepackagestep.cpp b/src/plugins/qtapplicationmanager/appmanagercmakepackagestep.cpp index 94f91a15856..0f9ae37f712 100644 --- a/src/plugins/qtapplicationmanager/appmanagercmakepackagestep.cpp +++ b/src/plugins/qtapplicationmanager/appmanagercmakepackagestep.cpp @@ -44,6 +44,7 @@ public: setDisplayName(Tr::tr("Create Application Manager package with CMake")); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); + setSupportedProjectType(CMakeProjectManager::Constants::CMAKE_PROJECT_ID); } }; diff --git a/src/plugins/qtapplicationmanager/appmanagerdeployconfigurationfactory.cpp b/src/plugins/qtapplicationmanager/appmanagerdeployconfigurationfactory.cpp index ed524cae286..b6b3b9a0910 100644 --- a/src/plugins/qtapplicationmanager/appmanagerdeployconfigurationfactory.cpp +++ b/src/plugins/qtapplicationmanager/appmanagerdeployconfigurationfactory.cpp @@ -16,6 +16,7 @@ #include #include +#include using namespace ProjectExplorer; @@ -37,6 +38,7 @@ public: addSupportedTargetDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); addSupportedTargetDeviceType(RemoteLinux::Constants::GenericLinuxOsType); addSupportedTargetDeviceType(Qdb::Constants::QdbLinuxOsType); + setSupportedProjectType(CMakeProjectManager::Constants::CMAKE_PROJECT_ID); addInitialStep(Constants::CMAKE_PACKAGE_STEP_ID); addInitialStep(Constants::DEPLOY_PACKAGE_STEP_ID, isNecessaryToDeploy); From cc30e923ff761f2c94186cfd5eceee2074f4e69d Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 6 Mar 2024 20:39:39 +0100 Subject: [PATCH 06/45] Welcome: Also hide separator lines when collapsing top- and side areas This moves the separator lines into the respective areas, so that the lines also disappear when their area collapes. Looks cleaner (for pixel obsessed people like me). Change-Id: I314c2c462767666638eae57087606f2a6ca4ae4a Reviewed-by: Alessandro Portale --- src/plugins/welcome/welcomeplugin.cpp | 35 +++++++++++++++++---------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index 4b3a5074f95..8f969c107fe 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -156,12 +156,16 @@ public: using namespace Layouting; - Row { - ideIconLabel, - welcomeLabel, - st, - spacing(ExVPaddingGapXl), - customMargin({HPaddingM, VPaddingM, HPaddingM, VPaddingM}), + Column { + Row { + ideIconLabel, + welcomeLabel, + st, + spacing(ExVPaddingGapXl), + customMargin({HPaddingM, VPaddingM, HPaddingM, VPaddingM}), + }, + createRule(Qt::Horizontal), + noMargin(), spacing(0), }.attachTo(this); } }; @@ -182,7 +186,7 @@ public: using namespace Layouting; - Column mainLayout { + Column mainColumn { spacing(0), customMargin({ExVPaddingGapXl, 0, ExVPaddingGapXl, 0}), }; @@ -224,8 +228,8 @@ public: } essentials.attachTo(m_essentials); - mainLayout.addItem(m_essentials); - mainLayout.addItem(st); + mainColumn.addItem(m_essentials); + mainColumn.addItem(st); { auto label = new Label(Tr::tr("Explore more"), Label::Secondary); @@ -263,10 +267,17 @@ public: m_links = new QWidget; linksLayout.attachTo(m_links); - mainLayout.addItem(m_links); + mainColumn.addItem(m_links); } - QWidget *mainWidget = mainLayout.emerge(); + QWidget *mainWidget = new QWidget; + + Row { + mainColumn, + createRule(Qt::Vertical), + noMargin(), spacing(0), + }.attachTo(mainWidget); + setWidget(mainWidget); } @@ -327,10 +338,8 @@ WelcomeMode::WelcomeMode() Column { new StyledBar, m_topArea, - createRule(Qt::Horizontal), Row { m_sideArea, - createRule(Qt::Vertical), m_pageStack, }, noMargin(), From 0539e2a0f63c25d24c78c4e12f8554714a7b1855 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 6 Mar 2024 14:12:30 +0000 Subject: [PATCH 07/45] Revert "TextEditor: Use synchronous highlighter by default" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 1c47a0a301c291b0ec450b7a141c5067d402dac4. Changing the default revealed a crash that seem to be caused by the async syntax highlighter infra structure changes. Revert the default for now to figure out the cause of the crash. Task-number: QTCREATORBUG-30494 Change-Id: I1d0388c29d206cb25f2d58e4b305aa8303db2a60 Reviewed-by: Robert Löhning Reviewed-by: Reviewed-by: Eike Ziller --- src/plugins/texteditor/textdocument.cpp | 16 ++++++---------- src/plugins/texteditor/textdocument.h | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp index 2636ad46e23..cb421f2bf7c 100644 --- a/src/plugins/texteditor/textdocument.cpp +++ b/src/plugins/texteditor/textdocument.cpp @@ -914,23 +914,19 @@ bool TextDocument::reload(QString *errorString, ReloadFlag flag, ChangeType type void TextDocument::resetSyntaxHighlighter(const std::function &creator, bool threaded) { - delete d->m_highlighterRunner; + if (d->m_highlighterRunner) + delete d->m_highlighterRunner; - static const std::optional envValue = []() -> std::optional { - const QString key("QTC_USE_THREADED_HIGHLIGHTER"); - if (qtcEnvironmentVariableIsSet(key)) { - const QString value = qtcEnvironmentVariable(key).toUpper(); - return value != "FALSE" && value != "0"; - } - return {}; - }(); + static const bool envValue + = qtcEnvironmentVariable("QTC_USE_THREADED_HIGHLIGHTER", "TRUE").toUpper() + == QLatin1String("TRUE"); SyntaxHighlighter *highlighter = creator(); highlighter->setFontSettings(TextEditorSettings::fontSettings()); highlighter->setMimeType(mimeType()); d->m_highlighterRunner = new SyntaxHighlighterRunner(highlighter, document(), - envValue.value_or(threaded)); + threaded && envValue); } void TextDocument::cleanWhitespace(const QTextCursor &cursor) diff --git a/src/plugins/texteditor/textdocument.h b/src/plugins/texteditor/textdocument.h index 5879d9e9ec2..ad3fe262e24 100644 --- a/src/plugins/texteditor/textdocument.h +++ b/src/plugins/texteditor/textdocument.h @@ -127,7 +127,7 @@ public: QTextDocument *document() const; using SyntaxHighLighterCreator = std::function; - void resetSyntaxHighlighter(const SyntaxHighLighterCreator &creator, bool threaded = false); + void resetSyntaxHighlighter(const SyntaxHighLighterCreator &creator, bool threaded = true); SyntaxHighlighterRunner *syntaxHighlighterRunner() const; bool reload(QString *errorString, QTextCodec *codec); From 9832af970187df48d233e3cfe1738eae6fb3d29b Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 6 Mar 2024 20:04:10 +0100 Subject: [PATCH 08/45] Welcome: Derive Core::Button from QAbstractButton Enable a hover effect on macOS and remove the need for the setFlat hack. Change-Id: Iea77ccaddcff0e9ad9299ffda8584160dca6413a Reviewed-by: Reviewed-by: Marcus Tillmanns --- src/plugins/coreplugin/welcomepagehelper.cpp | 6 ++---- src/plugins/coreplugin/welcomepagehelper.h | 2 +- src/plugins/extensionmanager/extensionsbrowser.h | 4 ++-- src/plugins/welcome/welcomeplugin.cpp | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/plugins/coreplugin/welcomepagehelper.cpp b/src/plugins/coreplugin/welcomepagehelper.cpp index c1cf35beb3d..87ee6a07c4b 100644 --- a/src/plugins/coreplugin/welcomepagehelper.cpp +++ b/src/plugins/coreplugin/welcomepagehelper.cpp @@ -134,12 +134,10 @@ static const TextFormat &buttonTF(Button::Role role, WidgetState state) } Button::Button(const QString &text, Role role, QWidget *parent) - : QPushButton(text, parent) + : QAbstractButton(parent) , m_role(role) { - // Prevent QMacStyle::subElementRect(SE_PushButtonLayoutItem) from changing our geometry - setFlat(true); - + setText(text); updateMargins(); if (m_role == SmallList) setCheckable(true); diff --git a/src/plugins/coreplugin/welcomepagehelper.h b/src/plugins/coreplugin/welcomepagehelper.h index 84a6ec358b3..201d5e43483 100644 --- a/src/plugins/coreplugin/welcomepagehelper.h +++ b/src/plugins/coreplugin/welcomepagehelper.h @@ -70,7 +70,7 @@ CORE_EXPORT QWidget *createRule(Qt::Orientation orientation, QWidget *parent = n } // namespace WelcomePageHelpers -class CORE_EXPORT Button : public QPushButton +class CORE_EXPORT Button : public QAbstractButton { public: enum Role { diff --git a/src/plugins/extensionmanager/extensionsbrowser.h b/src/plugins/extensionmanager/extensionsbrowser.h index 4724e53cf5d..2daa2362ba0 100644 --- a/src/plugins/extensionmanager/extensionsbrowser.h +++ b/src/plugins/extensionmanager/extensionsbrowser.h @@ -9,10 +9,10 @@ #include QT_BEGIN_NAMESPACE +class QAbstractButton; class QItemSelectionModel; class QLineEdit; class QListView; -class QPushButton; class QSortFilterProxyModel; QT_END_NAMESPACE @@ -58,7 +58,7 @@ private: QScopedPointer m_model; QLineEdit *m_searchBox; - QPushButton *m_updateButton; + QAbstractButton *m_updateButton; QListView *m_extensionsView; QItemSelectionModel *m_selectionModel = nullptr; QSortFilterProxyModel *m_filterProxyModel; diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index 8f969c107fe..994d097024c 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -73,7 +73,7 @@ private: TopArea *m_topArea; SideArea *m_sideArea; QList m_pluginList; - QList m_pageButtons; + QList m_pageButtons; QButtonGroup *m_buttonGroup; Id m_activePage; Id m_defaultPage; From c87435f9713c768f75975ca80a9b83919172b5eb Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 29 Feb 2024 15:09:24 +0100 Subject: [PATCH 09/45] Core: Tweak cursor handling of mini splitter It is possible that the internal signals are missed which results in a stale cursor until it gets changed again. Explicitly handle the hover event and set the cursor there. This also makes the need to restart QC obsolete when toggling the respective option. Task-number: QTCREATORBUG-29980 Change-Id: I51dfa6fda018a325d43cddae99f395cd8c0accde Reviewed-by: Eike Ziller --- src/plugins/coreplugin/generalsettings.cpp | 4 ---- src/plugins/coreplugin/minisplitter.cpp | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp index 0689adea522..71cfacbb402 100644 --- a/src/plugins/coreplugin/generalsettings.cpp +++ b/src/plugins/coreplugin/generalsettings.cpp @@ -250,12 +250,8 @@ void GeneralSettingsWidget::fillLanguageBox() const void GeneralSettingsWidget::apply() { - bool showRestart = generalSettings().provideSplitterCursors.volatileValue() - != generalSettings().provideSplitterCursors.value(); generalSettings().apply(); generalSettings().writeSettings(); - if (showRestart) - ICore::askForRestart(Tr::tr("The cursors for resizing views will change after restart.")); int currentIndex = m_languageBox->currentIndex(); setLanguage(m_languageBox->itemData(currentIndex, Qt::UserRole).toString()); diff --git a/src/plugins/coreplugin/minisplitter.cpp b/src/plugins/coreplugin/minisplitter.cpp index 8fdec456b0b..dd2aa280e1f 100644 --- a/src/plugins/coreplugin/minisplitter.cpp +++ b/src/plugins/coreplugin/minisplitter.cpp @@ -90,10 +90,9 @@ public: { setMask(QRegion(contentsRect())); setAttribute(Qt::WA_MouseNoMask, true); - if (generalSettings().provideSplitterCursors()) - setCursor(orientation == Qt::Horizontal ? hsplitCursor() : vsplitCursor()); } protected: + bool event(QEvent *event) override; void resizeEvent(QResizeEvent *event) override; void paintEvent(QPaintEvent *event) override; @@ -107,6 +106,17 @@ private: using namespace Core; using namespace Core::Internal; +bool MiniSplitterHandle::event(QEvent *event) +{ + if (generalSettings().provideSplitterCursors()) { + if (event->type() == QEvent::HoverEnter) + setCursor(orientation() == Qt::Horizontal ? hsplitCursor() : vsplitCursor()); + else if (event->type() == QEvent::HoverLeave) + unsetCursor(); + } + return QSplitterHandle::event(event); +} + void MiniSplitterHandle::resizeEvent(QResizeEvent *event) { if (orientation() == Qt::Horizontal) From f35962cfb3a377f88de8e3855f2f0a3ad42f4b22 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 29 Feb 2024 15:31:15 +0100 Subject: [PATCH 10/45] Core: Fix handling of high dpi for self provided cursors When using the cursors provided by QC we should scale them according to the pixel ratio otherwise the icons appear too small. Task-number: QTCREATORBUG-29980 Change-Id: Ia9de8a5adf4bbd457971260edc52f824ddb7564f Reviewed-by: Eike Ziller --- src/plugins/coreplugin/minisplitter.cpp | 28 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/plugins/coreplugin/minisplitter.cpp b/src/plugins/coreplugin/minisplitter.cpp index dd2aa280e1f..cdf6d16d8e2 100644 --- a/src/plugins/coreplugin/minisplitter.cpp +++ b/src/plugins/coreplugin/minisplitter.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -15,8 +16,14 @@ namespace Core { namespace Internal { +static QBitmap scaledBitmap(const QBitmap &other, qreal factor) +{ + QTransform trans = QTransform::fromScale(factor, factor); + return other.transformed(trans); +} + // cursor images / masks taken from qplatformcursor.cpp -static QCursor hsplitCursor() +static QCursor hsplitCursor(qreal ratio) { static const uchar hsplit_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -42,14 +49,13 @@ static QCursor hsplitCursor() 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - static QBitmap cursorImg = QBitmap::fromData({32, 32}, hsplit_bits); static QBitmap mask = QBitmap::fromData({32, 32}, hsplitm_bits); - static QCursor cursor(cursorImg, mask, 15, 15); - return cursor; + return QCursor(scaledBitmap(cursorImg, ratio), scaledBitmap(mask, ratio), + 15 * ratio, 15 * ratio); } -static QCursor vsplitCursor() +static QCursor vsplitCursor(qreal ratio) { static const uchar vsplit_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -77,8 +83,8 @@ static QCursor vsplitCursor() 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static QBitmap cursorImg = QBitmap::fromData({32, 32}, vsplit_bits); static QBitmap mask = QBitmap::fromData({32, 32}, vsplitm_bits); - static QCursor cursor(cursorImg, mask, 15, 15); - return cursor; + return QCursor(scaledBitmap(cursorImg, ratio), scaledBitmap(mask, ratio), + 15 * ratio, 15 * ratio); } class MiniSplitterHandle : public QSplitterHandle @@ -109,10 +115,12 @@ using namespace Core::Internal; bool MiniSplitterHandle::event(QEvent *event) { if (generalSettings().provideSplitterCursors()) { - if (event->type() == QEvent::HoverEnter) - setCursor(orientation() == Qt::Horizontal ? hsplitCursor() : vsplitCursor()); - else if (event->type() == QEvent::HoverLeave) + if (event->type() == QEvent::HoverEnter) { + const qreal ratio = screen()->devicePixelRatio(); + setCursor(orientation() == Qt::Horizontal ? hsplitCursor(ratio) : vsplitCursor(ratio)); + } else if (event->type() == QEvent::HoverLeave) { unsetCursor(); + } } return QSplitterHandle::event(event); } From 2428db2a3025c06b9c6b28a28c8375b35351f0f8 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 7 Mar 2024 07:01:54 +0100 Subject: [PATCH 11/45] TextEditor: Fix crash in SyntaxHighlighter The SyntaxHighlighterRunner is deleted by deleteLater in the TextDocument destructor. This makes it possible that the SyntaxHighlighter inside the runner lives longer than the document itself. Avoid this by making the document the parent of the SyntaxHighlighter like before the async highlighter patch series. Fixes: QTCREATORBUG-30494 Change-Id: I6ce9c35ab400b17f2a1a6f3c3bd98df23f41c71e Reviewed-by: Artem Sokolovskii --- .../texteditor/syntaxhighlighterrunner.cpp | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/plugins/texteditor/syntaxhighlighterrunner.cpp b/src/plugins/texteditor/syntaxhighlighterrunner.cpp index 1a649af5329..874f8254abf 100644 --- a/src/plugins/texteditor/syntaxhighlighterrunner.cpp +++ b/src/plugins/texteditor/syntaxhighlighterrunner.cpp @@ -35,11 +35,11 @@ public: if (async) { m_document = new QTextDocument(this); m_document->setDocumentLayout(new TextDocumentLayout(m_document)); - m_highlighter->setParent(m_document); } else { m_document = document; } + m_highlighter->setParent(m_document); m_highlighter->setDocument(m_document); connect(m_highlighter, @@ -66,45 +66,67 @@ public: void setExtraFormats(const QMap> &formatMap) { + QTC_ASSERT(m_highlighter, return); for (auto it = formatMap.cbegin(); it != formatMap.cend(); ++it) m_highlighter->setExtraFormats(m_document->findBlockByNumber(it.key()), it.value()); } void clearExtraFormats(const QList &blockNumbers) { + QTC_ASSERT(m_highlighter, return); for (auto it = blockNumbers.cbegin(); it != blockNumbers.cend(); ++it) m_highlighter->clearExtraFormats(m_document->findBlockByNumber(*it)); } - void clearAllExtraFormats() { m_highlighter->clearAllExtraFormats(); } + void clearAllExtraFormats() + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->clearAllExtraFormats(); + } void setFontSettings(const TextEditor::FontSettings &fontSettings) { + QTC_ASSERT(m_highlighter, return); m_highlighter->setFontSettings(fontSettings); } void setDefinitionName(const QString &name) { - return m_highlighter->setDefinitionName(name); + QTC_ASSERT(m_highlighter, return); + m_highlighter->setDefinitionName(name); } void setLanguageFeaturesFlags(unsigned int flags) { + QTC_ASSERT(m_highlighter, return); m_highlighter->setLanguageFeaturesFlags(flags); } - void setEnabled(bool enabled) { m_highlighter->setEnabled(enabled); } + void setEnabled(bool enabled) + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->setEnabled(enabled); + } - void rehighlight() { m_highlighter->rehighlight(); } + void rehighlight() + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->rehighlight(); + } void reformatBlocks(int from, int charsRemoved, int charsAdded) { + QTC_ASSERT(m_highlighter, return); m_highlighter->reformatBlocks(from, charsRemoved, charsAdded); } - void setInterrupted(bool interrupted) { m_highlighter->setInterrupted(interrupted); } + void setInterrupted(bool interrupted) + { + QTC_ASSERT(m_highlighter, return); + m_highlighter->setInterrupted(interrupted); + } - SyntaxHighlighter *m_highlighter = nullptr; + QPointer m_highlighter = nullptr; QTextDocument *m_document = nullptr; signals: @@ -200,7 +222,6 @@ SyntaxHighlighterRunner::~SyntaxHighlighterRunner() m_thread->quit(); m_thread->wait(); } else { - delete d->m_highlighter; delete d; } } From 2cf2843b384247431ffe6371c8c9f4b5494fc291 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 26 Feb 2024 13:22:43 +0100 Subject: [PATCH 12/45] CreateSimulatorDialog: Skip explicit call to waitForFinished() This is done by the FutureSynchronizer d'tor, so no need to call it explicitly. Move the FutureSynchronizer as the last field of CreateSimulatorDialog so that its d'tor is executed first. Change-Id: I861e4c6498b63909fe52965ca16343ef82d20b42 Reviewed-by: hjk Reviewed-by: Reviewed-by: Eike Ziller --- src/plugins/ios/createsimulatordialog.cpp | 5 +---- src/plugins/ios/createsimulatordialog.h | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/plugins/ios/createsimulatordialog.cpp b/src/plugins/ios/createsimulatordialog.cpp index e658fef07c6..bacba246f27 100644 --- a/src/plugins/ios/createsimulatordialog.cpp +++ b/src/plugins/ios/createsimulatordialog.cpp @@ -71,10 +71,7 @@ CreateSimulatorDialog::CreateSimulatorDialog(QWidget *parent) populateRuntimes(DeviceTypeInfo()); } -CreateSimulatorDialog::~CreateSimulatorDialog() -{ - m_futureSync.waitForFinished(); -} +CreateSimulatorDialog::~CreateSimulatorDialog() = default; /*! Returns the simulator name entered by user. diff --git a/src/plugins/ios/createsimulatordialog.h b/src/plugins/ios/createsimulatordialog.h index 30c862fa584..9f269cc636e 100644 --- a/src/plugins/ios/createsimulatordialog.h +++ b/src/plugins/ios/createsimulatordialog.h @@ -35,12 +35,12 @@ private: void populateDeviceTypes(const QList &deviceTypes); void populateRuntimes(const DeviceTypeInfo &deviceType); - Utils::FutureSynchronizer m_futureSync; QList m_runtimes; QLineEdit *m_nameEdit; QComboBox *m_deviceTypeCombo; QComboBox *m_runtimeCombo; + Utils::FutureSynchronizer m_futureSync; // Keep me last }; } // Ios::Internal From 876159cea9791912f7d2b9d0c838e321b4a96975 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 7 Mar 2024 07:30:30 +0100 Subject: [PATCH 13/45] Revert "Revert "TextEditor: Use synchronous highlighter by default"" The crash in the syntax highlighter was resolved so we can switch the default back to synchronous highlighter. This reverts commit 0539e2a0f63c25d24c78c4e12f8554714a7b1855. Change-Id: I2e9cdb818420a14d01565d58def14f88cf5e895d Reviewed-by: Artem Sokolovskii --- src/plugins/texteditor/textdocument.cpp | 16 ++++++++++------ src/plugins/texteditor/textdocument.h | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp index cb421f2bf7c..2636ad46e23 100644 --- a/src/plugins/texteditor/textdocument.cpp +++ b/src/plugins/texteditor/textdocument.cpp @@ -914,19 +914,23 @@ bool TextDocument::reload(QString *errorString, ReloadFlag flag, ChangeType type void TextDocument::resetSyntaxHighlighter(const std::function &creator, bool threaded) { - if (d->m_highlighterRunner) - delete d->m_highlighterRunner; + delete d->m_highlighterRunner; - static const bool envValue - = qtcEnvironmentVariable("QTC_USE_THREADED_HIGHLIGHTER", "TRUE").toUpper() - == QLatin1String("TRUE"); + static const std::optional envValue = []() -> std::optional { + const QString key("QTC_USE_THREADED_HIGHLIGHTER"); + if (qtcEnvironmentVariableIsSet(key)) { + const QString value = qtcEnvironmentVariable(key).toUpper(); + return value != "FALSE" && value != "0"; + } + return {}; + }(); SyntaxHighlighter *highlighter = creator(); highlighter->setFontSettings(TextEditorSettings::fontSettings()); highlighter->setMimeType(mimeType()); d->m_highlighterRunner = new SyntaxHighlighterRunner(highlighter, document(), - threaded && envValue); + envValue.value_or(threaded)); } void TextDocument::cleanWhitespace(const QTextCursor &cursor) diff --git a/src/plugins/texteditor/textdocument.h b/src/plugins/texteditor/textdocument.h index ad3fe262e24..5879d9e9ec2 100644 --- a/src/plugins/texteditor/textdocument.h +++ b/src/plugins/texteditor/textdocument.h @@ -127,7 +127,7 @@ public: QTextDocument *document() const; using SyntaxHighLighterCreator = std::function; - void resetSyntaxHighlighter(const SyntaxHighLighterCreator &creator, bool threaded = true); + void resetSyntaxHighlighter(const SyntaxHighLighterCreator &creator, bool threaded = false); SyntaxHighlighterRunner *syntaxHighlighterRunner() const; bool reload(QString *errorString, QTextCodec *codec); From 10da1ef3ffd26d4bcf9bc44908ebe536e8b85c03 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 7 Mar 2024 09:45:54 +0100 Subject: [PATCH 14/45] Android: Make errors visible Change-Id: Ic0a1ebbc932c5854f7b41572a96a1c6b6c8896a0 Reviewed-by: David Schulz --- src/plugins/android/androidsettingswidget.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 1e086daa9fe..952465788f2 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -56,6 +56,7 @@ class SummaryWidget : public QWidget public: InfoLabel *m_infoLabel = nullptr; bool m_valid = false; + QString m_validText; }; public: @@ -73,6 +74,7 @@ public: for (auto itr = validationPoints.cbegin(); itr != validationPoints.cend(); ++itr) { RowData data; data.m_infoLabel = new InfoLabel(itr.value()); + data.m_validText = itr.value(); layout->addWidget(data.m_infoLabel); m_validationData[itr.key()] = data; setPointValid(itr.key(), false); @@ -81,13 +83,20 @@ public: setContentsMargins(0, 0, 0, 0); } - void setPointValid(int key, bool valid) + template + void setPointValid(int key, const expected_str &test) + { + setPointValid(key, test.has_value(), test.has_value() ? QString{} : test.error()); + } + + void setPointValid(int key, bool valid, const QString errorText = {}) { if (!m_validationData.contains(key)) return; RowData &data = m_validationData[key]; data.m_valid = valid; data.m_infoLabel->setType(valid ? InfoLabel::Ok : InfoLabel::NotOk); + data.m_infoLabel->setText(valid || errorText.isEmpty() ? data.m_validText : errorText); updateUi(); } @@ -598,7 +607,7 @@ void AndroidSettingsWidget::validateJdk() androidConfig().setOpenJDKLocation(m_openJdkLocationPathChooser->filePath()); expected_str test = testJavaC(androidConfig().openJDKLocation()); - m_androidSummary->setPointValid(JavaPathExistsAndWritableRow, test.has_value()); + m_androidSummary->setPointValid(JavaPathExistsAndWritableRow, test); updateUI(); From d32a5ebb35586b6506fadc4427bdbd8da2f72759 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 28 Feb 2024 16:40:10 +0100 Subject: [PATCH 15/45] Axivion: Suppress the network error logging on unauthorized access This is a valid path to try the unauthorized access first, and when it fails we automatically try the authorized access. So we shouldn't bother the user with an error on a failure on unauthorized access to the dashboard info. Change-Id: Ia27686f804415741da614e36802551f8d8d610ed Reviewed-by: Christian Stenger Reviewed-by: Andreas Loth --- src/plugins/axivion/axivionplugin.cpp | 39 ++++++++++++++++----------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp index 06c0d72aac4..d9ba207de39 100644 --- a/src/plugins/axivion/axivionplugin.cpp +++ b/src/plugins/axivion/axivionplugin.cpp @@ -440,24 +440,31 @@ static Group dtoRecipe(const Storage> &dtoStorage) return DoneResult::Success; } - const auto getError = [&]() -> Error { - if (contentType == s_jsonContentType) { - try { - return DashboardError(reply->url(), statusCode, - reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), - Dto::ErrorDto::deserialize(reply->readAll())); - } catch (const Dto::invalid_dto_exception &) { - // ignore + QString errorString; + if (contentType == s_jsonContentType) { + const Utils::expected_str error + = Dto::ErrorDto::deserializeExpected(reply->readAll()); + + if (error) { + if constexpr (std::is_same_v) { + // Suppress logging error on unauthorized dashboard fetch + if (!dtoStorage->credential && error->type == "UnauthenticatedException") + return DoneResult::Error; } + + errorString = Error(DashboardError(reply->url(), statusCode, + reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), + *error)).message(); } - if (statusCode != 0) { - return HttpError(reply->url(), statusCode, - reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), - QString::fromUtf8(reply->readAll())); // encoding? - } - return NetworkError(reply->url(), error, reply->errorString()); - }; - MessageManager::writeDisrupting(QString("Axivion: %1").arg(getError().message())); + } else if (statusCode != 0) { + errorString = Error(HttpError(reply->url(), statusCode, + reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), + QString::fromUtf8(reply->readAll()))).message(); // encoding? + } else { + errorString = Error(NetworkError(reply->url(), error, reply->errorString())).message(); + } + + MessageManager::writeDisrupting(QString("Axivion: %1").arg(errorString)); return DoneResult::Error; }; From 43b54e8c3ace7f17572de01ba9ed80e6f6589551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Thu, 7 Mar 2024 09:43:41 +0100 Subject: [PATCH 16/45] SquishTests: Update button type in Welcome mode Amends 9832af970187df48d233e3cfe1738eae6fb3d29b Change-Id: I8840748e3bcb2c0993f93411b324e04a7f81960d Reviewed-by: Christian Stenger --- tests/system/shared/welcome.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/shared/welcome.py b/tests/system/shared/welcome.py index a5ba097ff1f..aa30952301a 100644 --- a/tests/system/shared/welcome.py +++ b/tests/system/shared/welcome.py @@ -6,7 +6,7 @@ def __childrenOfType__(parentObject, typeName): def getWelcomeScreenSideBarButton(buttonLabel): - return ("{text='%s' type='QPushButton' unnamed='1' visible='1' " + return ("{text='%s' type='QAbstractButton' unnamed='1' visible='1' " "window=':Qt Creator_Core::Internal::MainWindow'}" % buttonLabel) From 256105d75f892e318f65674c071843424145e7c7 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 7 Mar 2024 10:30:48 +0100 Subject: [PATCH 17/45] Update qbs submodule to HEAD of 2.3 branch Change-Id: I0e97c91701030674cba363a692c2c9765a4aedbd Reviewed-by: Christian Stenger Reviewed-by: Qt CI Bot Reviewed-by: --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 75aca0dca12..44d658cbf47 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 75aca0dca12c6c94109e65ee035b6b533b33a3c5 +Subproject commit 44d658cbf479a597ba22bb661c8ca68d7a98be6d From c936fc5982f5c11e0d5c411b366e5c7d6ac6bbd2 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 6 Mar 2024 20:12:40 +0100 Subject: [PATCH 18/45] Welcome: Determine maximum width for Core::Button text for all states Button states can have individual text tokens assigned. Depending on the used fonts and platform-specific renderer, any of these states may have the highest widts. Consider all of them and use the maximum. Change-Id: I51caccef9e34c1911c2773b8836dba722ad63c47 Reviewed-by: Alessandro Portale Reviewed-by: --- src/plugins/coreplugin/welcomepagehelper.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/welcomepagehelper.cpp b/src/plugins/coreplugin/welcomepagehelper.cpp index 87ee6a07c4b..49e15f1acac 100644 --- a/src/plugins/coreplugin/welcomepagehelper.cpp +++ b/src/plugins/coreplugin/welcomepagehelper.cpp @@ -147,11 +147,16 @@ Button::Button(const QString &text, Role role, QWidget *parent) QSize Button::minimumSizeHint() const { - const TextFormat &tf = buttonTF(m_role, WidgetStateHovered); - const QFontMetrics fm(tf.font()); - const QSize textS = fm.size(Qt::TextShowMnemonic, text()); + int maxTextWidth = 0; + for (WidgetState state : {WidgetStateDefault, WidgetStateChecked, WidgetStateHovered} ) { + const TextFormat &tf = buttonTF(m_role, state); + const QFontMetrics fm(tf.font()); + const QSize textS = fm.size(Qt::TextShowMnemonic, text()); + maxTextWidth = qMax(maxTextWidth, textS.width()); + } + const TextFormat &tf = buttonTF(m_role, WidgetStateDefault); const QMargins margins = contentsMargins(); - return {margins.left() + textS.width() + margins.right(), + return {margins.left() + maxTextWidth + margins.right(), margins.top() + tf.lineHeight() + margins.bottom()}; } From 22f41fb751cd5b1b136e0c7fa15d8e3163bc912e Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 7 Mar 2024 13:00:21 +0100 Subject: [PATCH 19/45] ModelEditor: Fix crash when selecting items Fixes: QTCREATORBUG-30413 Change-Id: Ie637e20d6308da2e1afcf3ff710f29c6a1695d58 Reviewed-by: Eike Ziller --- src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp index 2333bc5154e..de8b82de20e 100644 --- a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp +++ b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp @@ -507,7 +507,9 @@ void DiagramSceneModel::selectItem(QGraphicsItem *item, bool multiSelect) { if (!multiSelect) { if (!item->isSelected()) { - for (QGraphicsItem *selectedItem : std::as_const(m_selectedItems)) { + // We have to create a copy since "setSelected" may modify m_selectedItems + const QSet copy = m_selectedItems; + for (QGraphicsItem *selectedItem : copy) { if (selectedItem != item) selectedItem->setSelected(false); } From da9afa8cc7c31b47c0ef0ada8e8e881b895e411f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 7 Mar 2024 13:22:19 +0100 Subject: [PATCH 20/45] ModelEditor: Remove multiline text from action text It is supposed to be shown in the tool tip, so set the tool tip instead. Fixes: QTCREATORBUG-29174 Change-Id: Ib2572b71dfccf18276e63fadb7dbe386949b0275 Reviewed-by: Reviewed-by: David Schulz --- src/plugins/modeleditor/actionhandler.cpp | 34 ++++++++++++++++------- src/plugins/modeleditor/actionhandler.h | 12 +++++--- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/plugins/modeleditor/actionhandler.cpp b/src/plugins/modeleditor/actionhandler.cpp index 8dbca707de3..47599413aac 100644 --- a/src/plugins/modeleditor/actionhandler.cpp +++ b/src/plugins/modeleditor/actionhandler.cpp @@ -7,12 +7,13 @@ #include "modeleditor_constants.h" #include "modeleditortr.h" -#include -#include #include +#include +#include #include #include #include +#include #include #include @@ -161,11 +162,17 @@ void ActionHandler::createActions() QKeySequence(), QIcon(":/modelinglib/48x48/class.png")); registerCommand(Constants::ACTION_ADD_CANVAS_DIAGRAM, nullptr, Core::Context(), Tr::tr("Add Canvas Diagram"), QKeySequence(), QIcon(":/modelinglib/48x48/canvas-diagram.png")); - d->synchronizeBrowserAction = registerCommand( - Constants::ACTION_SYNC_BROWSER, nullptr, Core::Context(), - Tr::tr("Synchronize Browser and Diagram") + "
" - + Tr::tr("Press && Hold for Options") + "", QKeySequence(), - Utils::Icons::LINK_TOOLBAR.icon())->action(); + d->synchronizeBrowserAction + = registerCommand( + Constants::ACTION_SYNC_BROWSER, + nullptr, + Core::Context(), + Tr::tr("Synchronize Browser and Diagram"), + QKeySequence(), + Utils::Icons::LINK_TOOLBAR.icon(), + Tr::tr("Synchronize Browser and Diagram") + "
" + + Utils::stripAccelerator(Tr::tr("Press && Hold for Options")) + "") + ->action(); d->synchronizeBrowserAction->setCheckable(true); auto editPropertiesAction = new QAction(Tr::tr("Edit Element Properties"), @@ -205,13 +212,20 @@ std::function invokeOnCurrentModelEditor(void (ModelEditor::*function)() }; } -Core::Command *ActionHandler::registerCommand(const Utils::Id &id, void (ModelEditor::*function)(), - const Core::Context &context, const QString &title, - const QKeySequence &keySequence, const QIcon &icon) +Core::Command *ActionHandler::registerCommand( + const Utils::Id &id, + void (ModelEditor::*function)(), + const Core::Context &context, + const QString &title, + const QKeySequence &keySequence, + const QIcon &icon, + const QString &toolTip) { auto action = new QAction(title, this); if (!icon.isNull()) action->setIcon(icon); + if (!toolTip.isEmpty()) + action->setToolTip(toolTip); Core::Command *command = Core::ActionManager::registerAction(action, id, context, /*scriptable=*/true); if (!keySequence.isEmpty()) command->setDefaultKeySequence(keySequence); diff --git a/src/plugins/modeleditor/actionhandler.h b/src/plugins/modeleditor/actionhandler.h index 6b8d6a4502e..82b7c5321ad 100644 --- a/src/plugins/modeleditor/actionhandler.h +++ b/src/plugins/modeleditor/actionhandler.h @@ -56,10 +56,14 @@ private: void onEditProperties(); void onEditItem(); - Core::Command *registerCommand(const Utils::Id &id, void (ModelEditor::*function)(), - const Core::Context &context, const QString &title = QString(), - const QKeySequence &keySequence = QKeySequence(), - const QIcon &icon = QIcon()); + Core::Command *registerCommand( + const Utils::Id &id, + void (ModelEditor::*function)(), + const Core::Context &context, + const QString &title = QString(), + const QKeySequence &keySequence = QKeySequence(), + const QIcon &icon = QIcon(), + const QString &toolTip = {}); private: ActionHandlerPrivate *d; From b24acbc28be35ce55b4e9b15c2f265ebf9f3440b Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Thu, 7 Mar 2024 15:04:00 +0100 Subject: [PATCH 21/45] ClangFormat: Fix General tab is missing Fixes: QTCREATORBUG-30501 Change-Id: Ic1f09e513114acf6fb6ee52c8b5f066a2071e202 Reviewed-by: Christian Kandeler --- .../clangformat/clangformatglobalconfigwidget.cpp | 1 + src/plugins/cppeditor/cppcodestylesettingspage.cpp | 8 +++++--- src/plugins/texteditor/icodestylepreferences.cpp | 11 +++++++++++ src/plugins/texteditor/icodestylepreferences.h | 3 +++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/plugins/clangformat/clangformatglobalconfigwidget.cpp b/src/plugins/clangformat/clangformatglobalconfigwidget.cpp index 7027511868e..4dc344601d7 100644 --- a/src/plugins/clangformat/clangformatglobalconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatglobalconfigwidget.cpp @@ -277,6 +277,7 @@ void ClangFormatGlobalConfigWidget::initCustomSettingsCheckBox() !m_useCustomSettingsCheckBox->isChecked()); m_codeStyle->currentPreferences()->setIsAdditionalTabVisible( m_useCustomSettingsCheckBox->isEnabled()); + m_codeStyle->currentPreferences()->setAdditionalTabExist(true); ClangFormatSettings::instance().write(); emit m_codeStyle->currentPreferencesChanged(m_codeStyle->currentPreferences()); }; diff --git a/src/plugins/cppeditor/cppcodestylesettingspage.cpp b/src/plugins/cppeditor/cppcodestylesettingspage.cpp index 74f505d663c..2ad6ba8baa9 100644 --- a/src/plugins/cppeditor/cppcodestylesettingspage.cpp +++ b/src/plugins/cppeditor/cppcodestylesettingspage.cpp @@ -429,9 +429,11 @@ void CppCodeStylePreferencesWidget::slotCurrentPreferencesChanged(ICodeStylePref const bool enable = !preferences->isReadOnly() && (!preferences->isTemporarilyReadOnly() || !preferences->isAdditionalTabVisible()); - d->m_categoryTab->setTabVisible(0, preferences->isAdditionalTabVisible()); - for (int i = 1; i < d->m_categoryTab->count(); ++i) - d->m_categoryTab->setTabVisible(i, !preferences->isAdditionalTabVisible()); + if (preferences->additionalTabExist()) { + d->m_categoryTab->setTabVisible(0, preferences->isAdditionalTabVisible()); + for (int i = 1; i < d->m_categoryTab->count(); ++i) + d->m_categoryTab->setTabVisible(i, !preferences->isAdditionalTabVisible()); + } for (QWidget *widget : d->m_controllers) widget->setEnabled(enable); diff --git a/src/plugins/texteditor/icodestylepreferences.cpp b/src/plugins/texteditor/icodestylepreferences.cpp index 82a478e6977..8eae1c4be70 100644 --- a/src/plugins/texteditor/icodestylepreferences.cpp +++ b/src/plugins/texteditor/icodestylepreferences.cpp @@ -25,6 +25,7 @@ public: bool m_readOnly = false; bool m_temporarilyReadOnly = false; bool m_isAdditionalTabVisible = false; + bool m_isAdditionalTabExist = false; Key m_settingsSuffix; }; @@ -92,6 +93,16 @@ void ICodeStylePreferences::setIsAdditionalTabVisible(bool on) d->m_isAdditionalTabVisible = on; } +bool ICodeStylePreferences::additionalTabExist() const +{ + return d->m_isAdditionalTabExist; +} + +void ICodeStylePreferences::setAdditionalTabExist(bool on) +{ + d->m_isAdditionalTabExist = on; +} + void ICodeStylePreferences::setTabSettings(const TabSettings &settings) { if (d->m_tabSettings == settings) diff --git a/src/plugins/texteditor/icodestylepreferences.h b/src/plugins/texteditor/icodestylepreferences.h index 451ac669ccf..aab34d3dc25 100644 --- a/src/plugins/texteditor/icodestylepreferences.h +++ b/src/plugins/texteditor/icodestylepreferences.h @@ -44,6 +44,9 @@ public: bool isAdditionalTabVisible() const; void setIsAdditionalTabVisible(bool on); + bool additionalTabExist() const; + void setAdditionalTabExist(bool on); + void setTabSettings(const TabSettings &settings); TabSettings tabSettings() const; TabSettings currentTabSettings() const; From 4c0991b25df4b1c25a0121af1a8a314c8de05c7e Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 7 Mar 2024 13:17:48 +0100 Subject: [PATCH 22/45] PerfProfiler: Make perf record args accessible ... without creating a hard dependencies. Change-Id: I07b40dd9f1a4f53c5279d36f44e2a9123a34fa74 Reviewed-by: Dominik Holland --- .../perfprofiler/perfprofilerconstants.h | 1 + .../perfprofiler/perfprofilerruncontrol.cpp | 12 ++++------ src/plugins/perfprofiler/perfsettings.cpp | 22 ++++++++++++++----- src/plugins/perfprofiler/perfsettings.h | 3 ++- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/plugins/perfprofiler/perfprofilerconstants.h b/src/plugins/perfprofiler/perfprofilerconstants.h index 53a63a938ad..c1ff11c6849 100644 --- a/src/plugins/perfprofiler/perfprofilerconstants.h +++ b/src/plugins/perfprofiler/perfprofilerconstants.h @@ -29,6 +29,7 @@ const char AnalyzerSettingsGroupId[] = "Analyzer"; const char PerfSettingsId[] = "Analyzer.Perf.Settings"; const char PerfCallgraphDwarf[] = "dwarf"; +const char PerfRecordArgsId[] = "PerfRecordArgsId"; const char PerfStreamMagic[] = "QPERFSTREAM"; const char PerfZqfileMagic[] = "PTQFILE4.10"; diff --git a/src/plugins/perfprofiler/perfprofilerruncontrol.cpp b/src/plugins/perfprofiler/perfprofilerruncontrol.cpp index 2d35f1790ee..56e32c9a2f6 100644 --- a/src/plugins/perfprofiler/perfprofilerruncontrol.cpp +++ b/src/plugins/perfprofiler/perfprofilerruncontrol.cpp @@ -6,8 +6,6 @@ #include "perfdatareader.h" #include "perfprofilertool.h" #include "perfprofilertr.h" -#include "perfrunconfigurationaspect.h" -#include "perfsettings.h" #include #include @@ -97,11 +95,6 @@ public: void start() final { - auto perfAspect = runControl()->aspect(); - QTC_ASSERT(perfAspect, reportFailure(); return); - PerfSettings *settings = static_cast(perfAspect->currentSettings); - QTC_ASSERT(settings, reportFailure(); return); - m_process = new Process(this); connect(m_process, &Process::started, this, &RunWorker::reportStarted); @@ -121,8 +114,11 @@ public: reportStopped(); }); + const Store perfArgs = runControl()->settingsData(PerfProfiler::Constants::PerfSettingsId); + const QString recordArgs = perfArgs[Constants::PerfRecordArgsId].toString(); + CommandLine cmd({device()->filePath("perf"), {"record"}}); - settings->addPerfRecordArguments(&cmd); + cmd.addArgs(recordArgs, CommandLine::Raw); cmd.addArgs({"-o", "-", "--"}); cmd.addCommandLineAsArgs(runControl()->commandLine(), CommandLine::Raw); diff --git a/src/plugins/perfprofiler/perfsettings.cpp b/src/plugins/perfprofiler/perfsettings.cpp index d5f3ac88ca6..ab4ad75cc35 100644 --- a/src/plugins/perfprofiler/perfsettings.cpp +++ b/src/plugins/perfprofiler/perfsettings.cpp @@ -371,6 +371,8 @@ PerfSettings &globalSettings() PerfSettings::PerfSettings(ProjectExplorer::Target *target) { setAutoApply(false); + setId(Constants::PerfSettingsId); + period.setSettingsKey("Analyzer.Perf.Frequency"); period.setRange(250, 2147483647); period.setDefaultValue(250); @@ -448,7 +450,13 @@ void PerfSettings::writeGlobalSettings() const settings->endGroup(); } -void PerfSettings::addPerfRecordArguments(CommandLine *cmd) const +void PerfSettings::toMap(Store &map) const +{ + AspectContainer::toMap(map); + map[Constants::PerfRecordArgsId] = perfRecordArguments(); +} + +QString PerfSettings::perfRecordArguments() const { QString callgraphArg = callgraphMode.itemValue().toString(); if (callgraphArg == Constants::PerfCallgraphDwarf) @@ -463,11 +471,13 @@ void PerfSettings::addPerfRecordArguments(CommandLine *cmd) const } } - cmd->addArgs({"-e", events, - "--call-graph", callgraphArg, - sampleMode.itemValue().toString(), - QString::number(period())}); - cmd->addArgs(extraArguments(), CommandLine::Raw); + CommandLine cmd; + cmd.addArgs({"-e", events, + "--call-graph", callgraphArg, + sampleMode.itemValue().toString(), + QString::number(period())}); + cmd.addArgs(extraArguments(), CommandLine::Raw); + return cmd.arguments(); } void PerfSettings::resetToDefault() diff --git a/src/plugins/perfprofiler/perfsettings.h b/src/plugins/perfprofiler/perfsettings.h index a53557b9c47..79ee955b929 100644 --- a/src/plugins/perfprofiler/perfsettings.h +++ b/src/plugins/perfprofiler/perfsettings.h @@ -20,7 +20,8 @@ public: void readGlobalSettings(); void writeGlobalSettings() const; - void addPerfRecordArguments(Utils::CommandLine *cmd) const; + void toMap(Utils::Store &map) const override; + QString perfRecordArguments() const; void resetToDefault(); From ef569cc05d09e76cef0da553bb4b63d68c47e287 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 7 Mar 2024 16:29:25 +0100 Subject: [PATCH 23/45] PerfProfiler: Un-export and de-Q_OBJECT-ify PerfRunConfigurationAspect Not needed anymore. Change-Id: Iadeed22e90ab98ae5db0a4305af7c862fc2a1810 Reviewed-by: Reviewed-by: Dominik Holland --- .../perfprofiler/perfrunconfigurationaspect.cpp | 4 ++-- .../perfprofiler/perfrunconfigurationaspect.h | 14 ++++---------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/plugins/perfprofiler/perfrunconfigurationaspect.cpp b/src/plugins/perfprofiler/perfrunconfigurationaspect.cpp index 748c266f0fe..d1062ed732e 100644 --- a/src/plugins/perfprofiler/perfrunconfigurationaspect.cpp +++ b/src/plugins/perfprofiler/perfrunconfigurationaspect.cpp @@ -8,7 +8,7 @@ #include -namespace PerfProfiler { +namespace PerfProfiler::Internal { PerfRunConfigurationAspect::PerfRunConfigurationAspect(ProjectExplorer::Target *target) { @@ -21,4 +21,4 @@ PerfRunConfigurationAspect::PerfRunConfigurationAspect(ProjectExplorer::Target * setConfigWidgetCreator([this] { return new Debugger::AnalyzerRunConfigWidget(this); }); } -} // namespace PerfProfiler +} // PerfProfiler::Internal diff --git a/src/plugins/perfprofiler/perfrunconfigurationaspect.h b/src/plugins/perfprofiler/perfrunconfigurationaspect.h index 8f3e3927aa1..d941fcf8e6c 100644 --- a/src/plugins/perfprofiler/perfrunconfigurationaspect.h +++ b/src/plugins/perfprofiler/perfrunconfigurationaspect.h @@ -3,20 +3,14 @@ #pragma once -#include "perfprofiler_global.h" - #include -#include +namespace PerfProfiler::Internal { -namespace PerfProfiler { - -class PERFPROFILER_EXPORT PerfRunConfigurationAspect : - public ProjectExplorer::GlobalOrProjectAspect +class PerfRunConfigurationAspect final : public ProjectExplorer::GlobalOrProjectAspect { - Q_OBJECT public: - PerfRunConfigurationAspect(ProjectExplorer::Target *target); + explicit PerfRunConfigurationAspect(ProjectExplorer::Target *target); }; -} // namespace PerfProfiler +} // PerfProfiler::Internal From e71de0d0c15b56628c150a1c083957c6a590eb53 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 7 Mar 2024 16:36:01 +0100 Subject: [PATCH 24/45] Appman: Code cosmetics Use less specific #include to get EnvironmentAspect. Change-Id: I570c6a0871c63f5857d56ff640e95f10463fce5e Reviewed-by: Dominik Holland --- src/plugins/qtapplicationmanager/appmanagerruncontrol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qtapplicationmanager/appmanagerruncontrol.cpp b/src/plugins/qtapplicationmanager/appmanagerruncontrol.cpp index 5780b6043af..9dfa85de3cf 100644 --- a/src/plugins/qtapplicationmanager/appmanagerruncontrol.cpp +++ b/src/plugins/qtapplicationmanager/appmanagerruncontrol.cpp @@ -12,13 +12,13 @@ #include "appmanagerutilities.h" #include -#include #include #include #include #include #include +#include #include #include #include From 47018e59d2b3adbcf47d66b6dda2cbeb9df0b26d Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 7 Mar 2024 17:06:14 +0100 Subject: [PATCH 25/45] Android: revert to using 'threads' in handleJdbSettled But this time ignore unhandled exceptions which were caused by the 'threads' command in certain situations. Amends db307978bfd4a037a91341e066d63dcde3de71d6 Change-Id: I50819306eeb392ebae8dc869694ed588739c44fb Reviewed-by: Alessandro Portale --- 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 8f114f28dbc..3f8ff433b78 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -782,7 +782,7 @@ void AndroidRunnerWorker::handleJdbSettled() return false; }; - const QStringList commands{"suspend", "resume", "cont", "exit"}; + const QStringList commands{"ignore uncaught java.lang.Throwable", "threads", "cont", "exit"}; for (const QString &command : commands) { if (waitForCommand()) { From 24796279f3079474469858c366498cd62a84492b Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 7 Mar 2024 20:09:01 +0100 Subject: [PATCH 26/45] ScreenRecorder: Fix widget colors in the Crop&Trim dialog panelWidget() and isInUnstyledDialogOrPopup() in ManhattanStyle.cpp would mark the contents of this dialog as "panel widgets". In order to evade this, we don't set the dialog type of the Crop&Trim dialog to Qt::Windows. The author of this dialog did not leave us a comment on why Qt::Windows was chosen, so we can assume it was done for no particular reason. Fixes: QTCREATORBUG-29893 Change-Id: I90f653e39cee839203b8767cb30eadab69baaf09 Reviewed-by: Cristian Adam --- src/plugins/screenrecorder/cropandtrim.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/screenrecorder/cropandtrim.cpp b/src/plugins/screenrecorder/cropandtrim.cpp index cdd63994a89..ae52730aeca 100644 --- a/src/plugins/screenrecorder/cropandtrim.cpp +++ b/src/plugins/screenrecorder/cropandtrim.cpp @@ -637,7 +637,7 @@ private: }; CropAndTrimDialog::CropAndTrimDialog(const ClipInfo &clip, QWidget *parent) - : QDialog(parent, Qt::Window) + : QDialog(parent) , m_clipInfo(clip) { setWindowTitle(Tr::tr("Crop and Trim")); From db31db26dd900cd5427c2a4e4d70f00a1f4bc4cc Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 7 Mar 2024 15:52:26 +0100 Subject: [PATCH 27/45] Axivion: Provide some context menu for issues table Provide actions to open the selected issue or table inside the system web browser. Change-Id: I43d31368444fd4664db7d908c40b898e430cede3 Reviewed-by: Qt CI Bot Reviewed-by: hjk --- src/plugins/axivion/axivionoutputpane.cpp | 80 ++++++++++++++++++++++- src/plugins/axivion/axivionplugin.cpp | 6 ++ src/plugins/axivion/axivionplugin.h | 2 + 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/plugins/axivion/axivionoutputpane.cpp b/src/plugins/axivion/axivionoutputpane.cpp index 70e44057e9f..9c020f277a8 100644 --- a/src/plugins/axivion/axivionoutputpane.cpp +++ b/src/plugins/axivion/axivionoutputpane.cpp @@ -25,15 +25,20 @@ #include #include +#include #include +#include #include #include +#include #include #include +#include #include #include #include #include +#include #include @@ -197,6 +202,8 @@ struct LinkWithColumns QList columns; }; +static bool issueListContextMenuEvent(const ItemViewEvent &ev); // impl at bottom + class IssueListItem final : public ListItem { public: @@ -235,6 +242,10 @@ public: if (!m_id.isEmpty()) fetchIssueInfo(m_id); return true; + } else if (role == BaseTreeView::ItemViewEventRole) { + ItemViewEvent ev = value.value(); + if (ev.as()) + return issueListContextMenuEvent(ev); } return ListItem::setData(column, value, role); } @@ -252,13 +263,14 @@ public: explicit IssuesWidget(QWidget *parent = nullptr); void updateUi(); + const std::optional currentTableInfo() const { return m_currentTableInfo; } + IssueListSearch searchFromUi() const; private: void updateTable(); void addIssues(const Dto::IssueTableDto &dto, int startRow); void onSearchParameterChanged(); void updateBasicProjectInfo(std::optional info); void setFiltersEnabled(bool enabled); - IssueListSearch searchFromUi() const; void fetchTable(); void fetchIssues(const IssueListSearch &search); void onFetchRequested(int startRow, int limit); @@ -770,6 +782,61 @@ public: } } + bool handleContextMenu(const QString &issue, const ItemViewEvent &e) + { + auto issues = static_cast(m_outputWidget->widget(1)); + std::optional tableInfoOpt = issues ? issues->currentTableInfo() + : std::nullopt; + if (!tableInfoOpt) + return false; + const QString baseUri = tableInfoOpt->issueBaseViewUri.value_or(QString()); + if (baseUri.isEmpty()) + return false; + auto info = currentDashboardInfo(); + if (!info) + return false; + + QUrl issueBaseUrl = info->source.resolved(baseUri).resolved(issue); + QUrl dashboardUrl = info->source.resolved(baseUri); + QUrlQuery baseQuery; + IssueListSearch search = issues->searchFromUi(); + baseQuery.addQueryItem("kind", search.kind); + if (!search.versionStart.isEmpty()) + baseQuery.addQueryItem("start", search.versionStart); + if (!search.versionEnd.isEmpty()) + baseQuery.addQueryItem("end", search.versionEnd); + issueBaseUrl.setQuery(baseQuery); + if (!search.owner.isEmpty()) + baseQuery.addQueryItem("user", search.owner); + if (!search.filter_path.isEmpty()) + baseQuery.addQueryItem("filter_any path", search.filter_path); + if (!search.state.isEmpty()) + baseQuery.addQueryItem("state", search.state); + dashboardUrl.setQuery(baseQuery); + + QMenu *menu = new QMenu; + // FIXME Tr::tr() in before QC14 + auto action = new QAction("Open issue in Dashboard", menu); + menu->addAction(action); + QObject::connect(action, &QAction::triggered, menu, [issueBaseUrl] { + QDesktopServices::openUrl(issueBaseUrl); + }); + action = new QAction("Open table in Dashboard", menu); + QObject::connect(action, &QAction::triggered, menu, [dashboardUrl] { + QDesktopServices::openUrl(dashboardUrl); + }); + menu->addAction(action); + action = new QAction("Copy Dashboard link to clipboard", menu); + QObject::connect(action, &QAction::triggered, menu, [dashboardUrl] { + if (auto clipboard = QGuiApplication::clipboard()) + clipboard->setText(dashboardUrl.toString()); + }); + menu->addAction(action); + QObject::connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater); + menu->popup(e.globalPos()); + return true; + } + private: QStackedWidget *m_outputWidget = nullptr; QToolButton *m_showDashboard = nullptr; @@ -790,4 +857,15 @@ void updateDashboard() theAxivionOutputPane->updateDashboard(); } +static bool issueListContextMenuEvent(const ItemViewEvent &ev) +{ + QTC_ASSERT(theAxivionOutputPane, return false); + const QModelIndexList selectedIndices = ev.selectedRows(); + const QModelIndex first = selectedIndices.isEmpty() ? QModelIndex() : selectedIndices.first(); + if (!first.isValid()) + return false; + const QString issue = first.data().toString(); + return theAxivionOutputPane->handleContextMenu(issue, ev); +} + } // Axivion::Internal diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp index d9ba207de39..99d1f92eaa0 100644 --- a/src/plugins/axivion/axivionplugin.cpp +++ b/src/plugins/axivion/axivionplugin.cpp @@ -1014,6 +1014,12 @@ void fetchIssueInfo(const QString &id) dd->fetchIssueInfo(id); } +const std::optional currentDashboardInfo() +{ + QTC_ASSERT(dd, return std::nullopt); + return dd->m_dashboardInfo; +} + } // Axivion::Internal #include "axivionplugin.moc" diff --git a/src/plugins/axivion/axivionplugin.h b/src/plugins/axivion/axivionplugin.h index 39783a956da..db2f8494cb0 100644 --- a/src/plugins/axivion/axivionplugin.h +++ b/src/plugins/axivion/axivionplugin.h @@ -77,5 +77,7 @@ QIcon iconForIssue(const std::optional &issueKind); QString anyToSimpleString(const Dto::Any &any); void fetchIssueInfo(const QString &id); +const std::optional currentDashboardInfo(); + } // Axivion::Internal From 2484b50a99dbd254f767a7f6b90aada946e2248f Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 21 Feb 2024 09:31:39 +0100 Subject: [PATCH 28/45] Fix Fullscreen action text On macOS the action was correctly switching between "Enter Full Screen" and "Exit Full Screen", but on Windows & Linux the text was fixed to "Full Screen" and the code tried to set the check state - but forgot to make it checkable in the first place. Actually it is unclear what the "correct" behavior is on Windows & Linux. Neither on Gnome or KDE or Windows the action shows a check mark when in Full Screen mode though. Either there is a tool button with an icon, or some variation of "Exit Full Screen" or "Leave Full Screen". Change the text of the action on all platforms, use "Exit Full Screen" on all of them, but stay with just "Full Screen" on Windows & Linux (as opposed to "Enter Full Screen" on macOS). Fixes: QTCREATORBUG-30365 Change-Id: Ic55a30e32302ceb12f75449781b1aefecb370c97 Reviewed-by: Reviewed-by: Eike Ziller Reviewed-by: Christian Stenger Reviewed-by: David Schulz --- src/plugins/coreplugin/icore.cpp | 2 -- src/plugins/coreplugin/windowsupport.cpp | 14 +++++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index 1834a795608..1ed0987e5ab 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -1910,8 +1910,6 @@ void ICorePrivate::registerDefaultActions() // Full Screen Action ActionBuilder toggleFullScreenAction(this, Constants::TOGGLE_FULLSCREEN); toggleFullScreenAction.setText(Tr::tr("Full Screen")); - toggleFullScreenAction.setCheckable(!HostOsInfo::isMacHost()); - toggleFullScreenAction.setEnabled(false); // actual implementation in WindowSupport toggleFullScreenAction.setDefaultKeySequence(Tr::tr("Ctrl+Meta+F"), Tr::tr("Ctrl+Shift+F11")); if (HostOsInfo::isMacHost()) toggleFullScreenAction.setCommandAttribute(Command::CA_UpdateText); diff --git a/src/plugins/coreplugin/windowsupport.cpp b/src/plugins/coreplugin/windowsupport.cpp index 5c5cbbfe133..e166b573401 100644 --- a/src/plugins/coreplugin/windowsupport.cpp +++ b/src/plugins/coreplugin/windowsupport.cpp @@ -63,9 +63,12 @@ WindowSupport::WindowSupport(QWidget *window, const Context &context, const Cont connect(m_closeAction, &QAction::triggered, m_window, &QWidget::close, Qt::QueuedConnection); } - m_toggleFullScreenAction = new QAction(this); + auto cmd = ActionManager::command(Constants::TOGGLE_FULLSCREEN); // created in registerDefaultActions() + if (QTC_GUARD(cmd)) + m_toggleFullScreenAction = cmd->action(); + else + m_toggleFullScreenAction = new QAction(this); updateFullScreenAction(); - ActionManager::registerAction(m_toggleFullScreenAction, Constants::TOGGLE_FULLSCREEN, ac); connect(m_toggleFullScreenAction, &QAction::triggered, this, &WindowSupport::toggleFullScreen); m_windowList->addWindow(window); @@ -124,15 +127,12 @@ void WindowSupport::toggleFullScreen() void WindowSupport::updateFullScreenAction() { if (m_window->isFullScreen()) { - if (Utils::HostOsInfo::isMacHost()) - m_toggleFullScreenAction->setText(Tr::tr("Exit Full Screen")); - else - m_toggleFullScreenAction->setChecked(true); + m_toggleFullScreenAction->setText(Tr::tr("Exit Full Screen")); } else { if (Utils::HostOsInfo::isMacHost()) m_toggleFullScreenAction->setText(Tr::tr("Enter Full Screen")); else - m_toggleFullScreenAction->setChecked(false); + m_toggleFullScreenAction->setText(Tr::tr("Full Screen")); } } From 2f290e6dc09c23173273d4d98837e89efb4589c3 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 7 Mar 2024 17:07:06 +0100 Subject: [PATCH 29/45] ProjectExplorer: Fix KitManager::deregisterKits There were some problems regarding removal of the default kit: - A precondition of setDefaultKit() was violated. - The new default kit was set to a kit that was possibly removed later as well (and never updated afterwards). - The new default kit was only set if it wasn't null, leaving a dangling pointer in m_defaultKit. Also turned some checks into assertions. Amends e31a06a0f42143724ebf35aa2cc669dbcf54fbf0. Done-by: Christian Kandeler Fixes: QTCREATORBUG-30493 Fixes: QTCREATORBUG-30502 Change-Id: I3283f02c90d0ec84b579d7cfdf845b03663f5768 Reviewed-by: Eike Ziller Reviewed-by: Alessandro Portale Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/kitmanager.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index ea23bea65f2..9406d746d91 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -657,20 +657,20 @@ void KitManager::deregisterKits(const QList kitList) { QTC_ASSERT(KitManager::isLoaded(), return); std::vector> removed; // to keep them alive until the end of the function - Kit *newDefault = nullptr; + bool defaultKitRemoved = false; for (Kit *k : kitList) { - if (!k) - continue; + QTC_ASSERT(k, continue); std::optional> taken = Utils::take(d->m_kitList, k); - if (!taken) - continue; + QTC_ASSERT(taken, continue); + if (defaultKit() == k) + defaultKitRemoved = true; removed.push_back(std::move(*taken)); - if (defaultKit() == k) { - newDefault = Utils::findOrDefault(kits(), [](Kit *k) { return k->isValid(); }); - } } - if (newDefault) - setDefaultKit(newDefault); + + if (defaultKitRemoved) { + d->m_defaultKit = Utils::findOrDefault(kits(), &Kit::isValid); + emit instance()->defaultkitChanged(); + } for (auto it = removed.cbegin(); it != removed.cend(); ++it) emit instance()->kitRemoved(it->get()); From f4916b3125eb100b917c1077db761cb88b64bf8d Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 7 Mar 2024 17:49:32 +0100 Subject: [PATCH 30/45] Core: Lower the document auto-suspension threshold again This was already done in 509600da99fe48db30d930b308129da43abdbd40, but accidentally reverted by a refactoring in 7f908d737b0e017e65e917c65b19499f3093fa4c. Task-number: QTCREATORBUG-29943 Change-Id: Ica3df46fa9610729629704746a8e1003bb89f465 Reviewed-by: Eike Ziller Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Christian Stenger --- src/plugins/coreplugin/systemsettings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/systemsettings.cpp b/src/plugins/coreplugin/systemsettings.cpp index ccaef59b8b0..4ef1b0687b0 100644 --- a/src/plugins/coreplugin/systemsettings.cpp +++ b/src/plugins/coreplugin/systemsettings.cpp @@ -104,7 +104,7 @@ SystemSettings::SystemSettings() autoSuspendMinDocumentCount.setSettingsKey("EditorManager/AutoSuspendMinDocuments"); autoSuspendMinDocumentCount.setRange(1, 500); - autoSuspendMinDocumentCount.setDefaultValue(30); + autoSuspendMinDocumentCount.setDefaultValue(10); autoSuspendMinDocumentCount.setLabelText(Tr::tr("Files to keep open:")); autoSuspendMinDocumentCount.setToolTip( Tr::tr("Minimum number of open documents that should be kept in memory. Increasing this " From 5895ad5659161a5864066844174837c763ae1663 Mon Sep 17 00:00:00 2001 From: Volodymyr Zibarov Date: Fri, 8 Mar 2024 12:55:42 +0200 Subject: [PATCH 31/45] [cmake] Fix follow symbol for add_subdirectory to not jump to target Skip targets list if function name is add_subdirectory Fixes: QTCREATORBUG-30510 Change-Id: I8c601fb2134fc8a9b2814df01f6ec5eec380c51a Reviewed-by: Cristian Adam --- .../cmakeprojectmanager/cmakeeditor.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp index 89ea1eceeef..968d6260e70 100644 --- a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp @@ -353,18 +353,25 @@ void CMakeEditorWidget::findLinkAt(const QTextCursor &cursor, if (buffer.startsWith("${") && buffer.endsWith("}")) buffer = buffer.mid(2, buffer.size() - 3); - if (cbs->cmakeSymbolsHash().contains(buffer)) { + QString functionName; + if (funcStart > funcEnd) { + int funcStartPos = findWordStart(funcStart); + functionName = textDocument()->textAt(funcStartPos, funcStart - funcStartPos); + } + + bool skipTarget = false; + if (functionName.toLower() == "add_subdirectory") { + skipTarget = cbs->projectImportedTargets().contains(buffer) + || cbs->buildTargetTitles().contains(buffer); + } + if (!skipTarget && cbs->cmakeSymbolsHash().contains(buffer)) { link = cbs->cmakeSymbolsHash().value(buffer); addTextStartEndToLink(link); return processLinkCallback(link); } // Handle include(CMakeFileWithoutSuffix) and find_package(Package) - QString functionName; - if (funcStart > funcEnd) { - int funcStartPos = findWordStart(funcStart); - functionName = textDocument()->textAt(funcStartPos, funcStart - funcStartPos); - + if (!functionName.isEmpty()) { struct FunctionToHash { QString functionName; From 7813ce9335f63e658cbd89b522275c302a552481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Wed, 21 Feb 2024 21:09:51 +0100 Subject: [PATCH 32/45] SquishTests: Avoid warnings when reading build issues tst_APTW01 explicitly disables the Clang Code Model so there is no filter category of that name. Change-Id: I7378e11582bb0231a24404cca212a234ef7f37ed Reviewed-by: Christian Stenger --- tests/system/shared/build_utils.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/system/shared/build_utils.py b/tests/system/shared/build_utils.py index fbc89c5920f..a47416ca333 100644 --- a/tests/system/shared/build_utils.py +++ b/tests/system/shared/build_utils.py @@ -25,13 +25,21 @@ def toggleIssuesFilter(filterName, checked): def getBuildIssues(ignoreCodeModel=True): + # Heuristically determine whether the ClandCodeModel is loaded. + # The current implementation is inaccurate: + # The value may be "True" although the CCM was not loaded due to existing settings or + # insufficient memory. This would result in a slightly longer execution and false positive + # warnings. Since neither would cause an actual damage and a precise handling would require + # a bigger refactoring, this seems acceptable. + clangLoaded = " -noload ClangCodeModel" not in currentApplicationContext().commandLine + ensureChecked(":Qt Creator_Issues_Core::Internal::OutputPaneToggleButton" , silent=True) model = waitForObject(":Qt Creator.Issues_QListView").model() - if ignoreCodeModel: + if ignoreCodeModel and clangLoaded: # filter out possible code model issues present inside the Issues pane toggleIssuesFilter("Clang Code Model", False) result = dumpBuildIssues(model) - if ignoreCodeModel: + if ignoreCodeModel and clangLoaded: # reset the filter toggleIssuesFilter("Clang Code Model", True) return result From 3e0c302a6cd074f5b7afe22dd7a3e7228e327ada Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sat, 9 Mar 2024 21:12:31 +0100 Subject: [PATCH 33/45] ScreenRecorder: Make Crop&Trim dialog maximizable Give the dialog back its minimize and maximize buttons (on Windows), without setting the Window flag. Amends: 24796279f3079474469858c366498cd62a84492b Change-Id: I2bca972c0351d0749ea3771e418449a052703329 Reviewed-by: Cristian Adam --- src/plugins/screenrecorder/cropandtrim.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/screenrecorder/cropandtrim.cpp b/src/plugins/screenrecorder/cropandtrim.cpp index ae52730aeca..ff60472fedd 100644 --- a/src/plugins/screenrecorder/cropandtrim.cpp +++ b/src/plugins/screenrecorder/cropandtrim.cpp @@ -641,6 +641,7 @@ CropAndTrimDialog::CropAndTrimDialog(const ClipInfo &clip, QWidget *parent) , m_clipInfo(clip) { setWindowTitle(Tr::tr("Crop and Trim")); + setWindowFlags(Qt::Dialog | Qt::WindowMinMaxButtonsHint); // Make maximizable m_cropWidget = new CropWidget; From 477f4e18eb849533b41afdd6b97918e931662a4c Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sun, 10 Mar 2024 21:50:40 +0100 Subject: [PATCH 34/45] Welcome: Design update round User feedback was gathered and in part implemented in form of a design update: - Update dark and light tokens - Add Token_Text_Accent and use it for session/sroject names, tags, etc. - Change card hover from Token_Foreground_Subtle to Token_Background_Subtle - Remove font-style changes on hover Change-Id: Ia428d43828c9c76ea91d142356457846b932e2d6 Reviewed-by: hjk --- share/qtcreator/themes/dark.figmatokens | 17 +++++++++-------- share/qtcreator/themes/light.figmatokens | 9 +++++---- src/libs/utils/theme/theme.h | 1 + src/plugins/coreplugin/welcomepagehelper.cpp | 13 ++++++------- src/plugins/coreplugin/welcomepagehelper.h | 2 +- .../projectexplorer/projectwelcomepage.cpp | 2 +- 6 files changed, 23 insertions(+), 21 deletions(-) diff --git a/share/qtcreator/themes/dark.figmatokens b/share/qtcreator/themes/dark.figmatokens index fdd98e80c10..8937a3cc2d7 100644 --- a/share/qtcreator/themes/dark.figmatokens +++ b/share/qtcreator/themes/dark.figmatokens @@ -5,21 +5,22 @@ Token_Basic_Black=ff131313 Token_Basic_White=fff8f8f8 -Token_Accent_Default=ff23b26a -Token_Accent_Muted=ff1f9b5d -Token_Accent_Subtle=ff1a8550 +Token_Accent_Default=ff1F9B5D +Token_Accent_Muted=ff228C57 +Token_Accent_Subtle=ff1F7A4D Token_Background_Default=ff1f1f1f Token_Background_Muted=ff262626 Token_Background_Subtle=ff2e2e2e -Token_Foreground_Default=ff5a5a5a -Token_Foreground_Muted=ff3e3e3e -Token_Foreground_Subtle=ff303030 +Token_Foreground_Default=ff474747 +Token_Foreground_Muted=ff353535 +Token_Foreground_Subtle=ff2A2A2A -Token_Text_Default=fff8f8f8 -Token_Text_Muted=ffaeaeae +Token_Text_Default=ffF8F8F8 +Token_Text_Muted=ffAEAEAE Token_Text_Subtle=ff595959 +Token_Text_Accent=ff23B26A Token_Stroke_Strong=ffeeeeee Token_Stroke_Muted=ff727272 diff --git a/share/qtcreator/themes/light.figmatokens b/share/qtcreator/themes/light.figmatokens index a4d1bfcaa8d..6ef243d17da 100644 --- a/share/qtcreator/themes/light.figmatokens +++ b/share/qtcreator/themes/light.figmatokens @@ -10,16 +10,17 @@ Token_Accent_Muted=ff1f9b5d Token_Accent_Subtle=ff1a8550 Token_Background_Default=fffcfcfc -Token_Background_Muted=ffefefef +Token_Background_Muted=ffF2F2F2 Token_Background_Subtle=ffe7e7e7 -Token_Foreground_Default=ffcdcdcd -Token_Foreground_Muted=ffd5d5d5 -Token_Foreground_Subtle=ffdddddd +Token_Foreground_Default=ffD8D8D8 +Token_Foreground_Muted=ffE3E3E3 +Token_Foreground_Subtle=ffEFEFEF Token_Text_Default=ff393939 Token_Text_Muted=ff6a6a6a Token_Text_Subtle=ffbebebe +Token_Text_Accent=ff28C878 Token_Stroke_Strong=ff464646 Token_Stroke_Muted=ff727272 diff --git a/src/libs/utils/theme/theme.h b/src/libs/utils/theme/theme.h index 65d0ee91eaf..6b3bf97d45d 100644 --- a/src/libs/utils/theme/theme.h +++ b/src/libs/utils/theme/theme.h @@ -239,6 +239,7 @@ public: Token_Text_Default, Token_Text_Muted, Token_Text_Subtle, + Token_Text_Accent, Token_Stroke_Strong, Token_Stroke_Muted, Token_Stroke_Subtle, diff --git a/src/plugins/coreplugin/welcomepagehelper.cpp b/src/plugins/coreplugin/welcomepagehelper.cpp index 49e15f1acac..9ae08c69384 100644 --- a/src/plugins/coreplugin/welcomepagehelper.cpp +++ b/src/plugins/coreplugin/welcomepagehelper.cpp @@ -111,13 +111,12 @@ static const TextFormat &buttonTF(Button::Role role, WidgetState state) static const TextFormat smallListDefaultTF {Theme::Token_Text_Default, StyleHelper::UiElement::UiElementIconStandard, Qt::AlignLeft | Qt::AlignVCenter | Qt::TextDontClip}; - static const TextFormat smallListCheckedTF - {smallListDefaultTF.themeColor, StyleHelper::UiElement::UiElementIconActive, - smallListDefaultTF.drawTextFlags}; + static const TextFormat smallListCheckedTF = smallListDefaultTF; static const TextFormat smallLinkDefaultTF - {Theme::Token_Text_Default, smallListDefaultTF.uiElement, smallListDefaultTF.drawTextFlags}; + {Theme::Token_Text_Default, StyleHelper::UiElement::UiElementIconStandard, + smallListDefaultTF.drawTextFlags}; static const TextFormat smallLinkHoveredTF - {Theme::Token_Accent_Default, smallListCheckedTF.uiElement, + {Theme::Token_Text_Accent, smallLinkDefaultTF.uiElement, smallLinkDefaultTF.drawTextFlags}; switch (role) { @@ -754,7 +753,7 @@ bool ListModelFilter::leaveFilterAcceptsRowBeforeFiltering(const ListItem *, boo constexpr TextFormat titleTF {Theme::Token_Text_Default, StyleHelper::UiElementIconActive}; constexpr TextFormat descriptionTF {titleTF.themeColor, StyleHelper::UiElementCaption}; constexpr TextFormat tagsLabelTF {Theme::Token_Text_Muted, StyleHelper::UiElementCaptionStrong}; -constexpr TextFormat tagsTF {Theme::Token_Accent_Default, tagsLabelTF.uiElement}; +constexpr TextFormat tagsTF {Theme::Token_Text_Accent, tagsLabelTF.uiElement}; constexpr qreal itemOutlineWidth = 1; constexpr qreal itemCornerRounding = 6; @@ -1157,7 +1156,7 @@ static QLabel *createTitleLabel(const QString &text, QWidget *parent = nullptr) static QLabel *createLinkLabel(const QString &text, QWidget *parent) { - constexpr TextFormat headerLinkTF {Theme::Token_Accent_Default, StyleHelper::UiElementH6}; + constexpr TextFormat headerLinkTF {Theme::Token_Text_Accent, StyleHelper::UiElementH6}; const QString linkColor = themeColor(headerLinkTF.themeColor).name(); auto link = new QLabel("" + text + "", parent); diff --git a/src/plugins/coreplugin/welcomepagehelper.h b/src/plugins/coreplugin/welcomepagehelper.h index 201d5e43483..e55a5663e9a 100644 --- a/src/plugins/coreplugin/welcomepagehelper.h +++ b/src/plugins/coreplugin/welcomepagehelper.h @@ -61,7 +61,7 @@ CORE_EXPORT void setBackgroundColor(QWidget *widget, Utils::Theme::Color colorRo constexpr qreal defaultCardBackgroundRounding = 3.75; constexpr Utils::Theme::Color cardDefaultBackground = Utils::Theme::Token_Background_Muted; constexpr Utils::Theme::Color cardDefaultStroke = Utils::Theme::Token_Stroke_Subtle; -constexpr Utils::Theme::Color cardHoverBackground = Utils::Theme::Token_Foreground_Subtle; +constexpr Utils::Theme::Color cardHoverBackground = Utils::Theme::Token_Background_Subtle; constexpr Utils::Theme::Color cardHoverStroke = cardHoverBackground; CORE_EXPORT void drawCardBackground(QPainter *painter, const QRectF &rect, const QBrush &fill, const QPen &pen = QPen(Qt::NoPen), diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index 5ca983329ec..e51800575d6 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -47,7 +47,7 @@ const char PROJECT_BASE_ID[] = "Welcome.OpenRecentProject"; namespace ProjectExplorer { namespace Internal { -constexpr TextFormat projectNameTF {Theme::Token_Accent_Default, StyleHelper::UiElementH5}; +constexpr TextFormat projectNameTF {Theme::Token_Text_Accent, StyleHelper::UiElementH5}; constexpr TextFormat projectPathTF {Theme::Token_Text_Muted, StyleHelper::UiElementIconActive}; constexpr TextFormat sessionNameTF {projectNameTF.themeColor, projectNameTF.uiElement}; constexpr TextFormat sessionProjetNameTF {Theme::Token_Text_Default, projectNameTF.uiElement}; From 27c02d94afee70b497f60401f9bfcee30c3d92a0 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 5 Mar 2024 10:45:46 +0100 Subject: [PATCH 35/45] Debugger: Fix persisting of debugger settings When triggering them from the context menu while debugging. Fix used settings group when triggering writeSettings() on the aspect instead of the AspectContainer. Explicitly persist respective settings when triggering them on the context menu. Fixes: QTCREATORBUG-30491 Change-Id: I6f429bb54630cbe61c8b2ee063028f323a2d08f6 Reviewed-by: hjk --- src/plugins/debugger/gdb/gdbsettings.cpp | 44 ++++++++++++------------ src/plugins/debugger/watchhandler.cpp | 11 ++++-- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/plugins/debugger/gdb/gdbsettings.cpp b/src/plugins/debugger/gdb/gdbsettings.cpp index 04688b54837..a86021a9d25 100644 --- a/src/plugins/debugger/gdb/gdbsettings.cpp +++ b/src/plugins/debugger/gdb/gdbsettings.cpp @@ -29,9 +29,9 @@ GdbSettings &gdbSettings() GdbSettings::GdbSettings() { setAutoApply(false); - setSettingsGroup("DebugMode"); + const Key debugModeGroup("DebugMode"); - useMessageBoxForSignals.setSettingsKey("UseMessageBoxForSignals"); + useMessageBoxForSignals.setSettingsKey(debugModeGroup, "UseMessageBoxForSignals"); useMessageBoxForSignals.setDefaultValue(true); useMessageBoxForSignals.setLabelText(Tr::tr( "Show a message box when receiving a signal")); @@ -49,7 +49,7 @@ GdbSettings::GdbSettings() "breakpoint markers in such cases to the location of the true " "breakpoint.")); adjustBreakpointLocations.setDefaultValue(true); - adjustBreakpointLocations.setSettingsKey("AdjustBreakpointLocations"); + adjustBreakpointLocations.setSettingsKey(debugModeGroup, "AdjustBreakpointLocations"); adjustBreakpointLocations.setLabelText(Tr::tr( "Adjust breakpoint locations")); adjustBreakpointLocations.setToolTip(Tr::tr( @@ -61,41 +61,41 @@ GdbSettings::GdbSettings() breakOnThrow.setLabelText(Tr::tr("Break on \"throw\"")); - breakOnThrow.setSettingsKey("BreakOnThrow"); + breakOnThrow.setSettingsKey(debugModeGroup, "BreakOnThrow"); breakOnCatch.setLabelText(Tr::tr("Break on \"catch\"")); - breakOnCatch.setSettingsKey("BreakOnCatch"); + breakOnCatch.setSettingsKey(debugModeGroup, "BreakOnCatch"); breakOnWarning.setLabelText(Tr::tr("Break on \"qWarning\"")); - breakOnWarning.setSettingsKey("BreakOnWarning"); + breakOnWarning.setSettingsKey(debugModeGroup, "BreakOnWarning"); // FIXME: Move to common settings page. breakOnWarning.setLabelText(msgSetBreakpointAtFunction("qWarning")); breakOnWarning.setToolTip(msgSetBreakpointAtFunctionToolTip("qWarning")); breakOnFatal.setLabelText(Tr::tr("Break on \"qFatal\"")); - breakOnFatal.setSettingsKey("BreakOnFatal"); + breakOnFatal.setSettingsKey(debugModeGroup, "BreakOnFatal"); breakOnFatal.setLabelText(msgSetBreakpointAtFunction("qFatal")); breakOnFatal.setToolTip(msgSetBreakpointAtFunctionToolTip("qFatal")); breakOnAbort.setLabelText(Tr::tr("Break on \"abort\"")); - breakOnAbort.setSettingsKey("BreakOnAbort"); + breakOnAbort.setSettingsKey(debugModeGroup, "BreakOnAbort"); breakOnAbort.setLabelText(msgSetBreakpointAtFunction("abort")); breakOnAbort.setToolTip(msgSetBreakpointAtFunctionToolTip("abort")); - loadGdbInit.setSettingsKey("LoadGdbInit"); + loadGdbInit.setSettingsKey(debugModeGroup, "LoadGdbInit"); loadGdbInit.setDefaultValue(true); loadGdbInit.setLabelText(Tr::tr("Load .gdbinit file on startup")); loadGdbInit.setToolTip(Tr::tr( "Allows or inhibits reading the user's default\n" ".gdbinit file on debugger startup.")); - loadGdbDumpers.setSettingsKey("LoadGdbDumpers2"); + loadGdbDumpers.setSettingsKey(debugModeGroup, "LoadGdbDumpers2"); loadGdbDumpers.setLabelText(Tr::tr("Load system GDB pretty printers")); loadGdbDumpers.setToolTip(Tr::tr( "Uses the default GDB pretty printers installed in your " "system or linked to the libraries your application uses.")); - autoEnrichParameters.setSettingsKey("AutoEnrichParameters"); + autoEnrichParameters.setSettingsKey(debugModeGroup, "AutoEnrichParameters"); autoEnrichParameters.setDefaultValue(true); autoEnrichParameters.setLabelText(Tr::tr( "Use common locations for debug information")); @@ -104,7 +104,7 @@ GdbSettings::GdbSettings() "of debug information such as /usr/src/debug " "when starting GDB.")); - useDynamicType.setSettingsKey("UseDynamicType"); + useDynamicType.setSettingsKey(debugModeGroup, "UseDynamicType"); useDynamicType.setDefaultValue(true); useDynamicType.setDisplayName(Tr::tr("Use Dynamic Object Type for Display")); useDynamicType.setLabelText(Tr::tr( @@ -113,7 +113,7 @@ GdbSettings::GdbSettings() "Specifies whether the dynamic or the static type of objects will be " "displayed. Choosing the dynamic type might be slower.")); - targetAsync.setSettingsKey("TargetAsync"); + targetAsync.setSettingsKey(debugModeGroup, "TargetAsync"); targetAsync.setLabelText(Tr::tr( "Use asynchronous mode to control the inferior")); @@ -125,7 +125,7 @@ GdbSettings::GdbSettings() "

To execute arbitrary Python scripts, " "use python execfile('/path/to/script.py').

"); - gdbStartupCommands.setSettingsKey("GdbStartupCommands"); + gdbStartupCommands.setSettingsKey(debugModeGroup, "GdbStartupCommands"); gdbStartupCommands.setDisplayStyle(StringAspect::TextEditDisplay); gdbStartupCommands.setUseGlobalMacroExpander(); gdbStartupCommands.setToolTip("

" + Tr::tr( @@ -134,7 +134,7 @@ GdbSettings::GdbSettings() "attached, and before the debugging helpers are initialized.") + "

" + howToUsePython + ""); - gdbPostAttachCommands.setSettingsKey("GdbPostAttachCommands"); + gdbPostAttachCommands.setSettingsKey(debugModeGroup, "GdbPostAttachCommands"); gdbPostAttachCommands.setDisplayStyle(StringAspect::TextEditDisplay); gdbPostAttachCommands.setUseGlobalMacroExpander(); gdbPostAttachCommands.setToolTip("

" + Tr::tr( @@ -144,29 +144,29 @@ GdbSettings::GdbSettings() "such as \"monitor reset\" or \"load\".") + "

" + howToUsePython + ""); - multiInferior.setSettingsKey("MultiInferior"); + multiInferior.setSettingsKey(debugModeGroup, "MultiInferior"); multiInferior.setLabelText(Tr::tr("Debug all child processes")); multiInferior.setToolTip(Tr::tr( "Keeps debugging all children after a fork." "")); - intelFlavor.setSettingsKey("IntelFlavor"); + intelFlavor.setSettingsKey(debugModeGroup, "IntelFlavor"); intelFlavor.setLabelText(Tr::tr("Use Intel style disassembly")); intelFlavor.setToolTip(Tr::tr("GDB shows by default AT&&T style disassembly.")); - usePseudoTracepoints.setSettingsKey("UsePseudoTracepoints"); + usePseudoTracepoints.setSettingsKey(debugModeGroup, "UsePseudoTracepoints"); usePseudoTracepoints.setLabelText(Tr::tr("Use pseudo message tracepoints")); usePseudoTracepoints.setToolTip(Tr::tr("Uses Python to extend the ordinary GDB breakpoint class.")); usePseudoTracepoints.setDefaultValue(true); - useIndexCache.setSettingsKey("UseIndexCache"); + useIndexCache.setSettingsKey(debugModeGroup, "UseIndexCache"); useIndexCache.setLabelText(Tr::tr("Use automatic symbol cache")); useIndexCache.setToolTip(Tr::tr("It is possible for GDB to automatically save a copy of " "its symbol index in a cache on disk and retrieve it from there when loading the same " "binary in the future.")); useIndexCache.setDefaultValue(true); - skipKnownFrames.setSettingsKey("SkipKnownFrames"); + skipKnownFrames.setSettingsKey(debugModeGroup, "SkipKnownFrames"); skipKnownFrames.setDisplayName(Tr::tr("Skip Known Frames")); skipKnownFrames.setLabelText(Tr::tr("Skip known frames when stepping")); skipKnownFrames.setToolTip(Tr::tr( @@ -176,7 +176,7 @@ GdbSettings::GdbSettings() "counting code is skipped, and a single Step Into for a signal\n" "emission ends up directly in the slot connected to it.")); - enableReverseDebugging.setSettingsKey("EnableReverseDebugging"); + enableReverseDebugging.setSettingsKey(debugModeGroup, "EnableReverseDebugging"); enableReverseDebugging.setIcon(Icons::REVERSE_MODE.icon()); enableReverseDebugging.setDisplayName(Tr::tr("Enable Reverse Debugging")); enableReverseDebugging.setLabelText(Tr::tr("Enable reverse debugging")); @@ -186,7 +186,7 @@ GdbSettings::GdbSettings() "It exhibits unpredictable behavior when going backwards over system " "calls and is very likely to destroy your debugging session.

")); - gdbWatchdogTimeout.setSettingsKey("WatchdogTimeout"); + gdbWatchdogTimeout.setSettingsKey(debugModeGroup, "WatchdogTimeout"); gdbWatchdogTimeout.setDefaultValue(40); gdbWatchdogTimeout.setSuffix(Tr::tr("sec")); gdbWatchdogTimeout.setRange(10, 1000000); diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 1c73cf33b58..987122fcf24 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1820,13 +1820,20 @@ bool WatchModel::contextMenuEvent(const ItemViewEvent &ev) menu->addSeparator(); DebuggerSettings &s = settings(); - menu->addAction(s.useDebuggingHelpers.action()); + QAction *debugHelperAction = s.useDebuggingHelpers.action(); + menu->addAction(debugHelperAction); menu->addAction(s.useToolTipsInLocalsView.action()); menu->addAction(s.autoDerefPointers.action()); menu->addAction(s.sortStructMembers.action()); - menu->addAction(s.useDynamicType.action()); + QAction *dynamicTypeAction = s.useDynamicType.action(); + menu->addAction(dynamicTypeAction); menu->addAction(s.settingsDialog.action()); + // useDebuggingHelpers/useDynamicType have no auto-apply, but need to be persisted on triggered + connect(debugHelperAction, &QAction::triggered, + &s.useDebuggingHelpers, &BoolAspect::writeSettings, Qt::UniqueConnection); + connect(dynamicTypeAction, &QAction::triggered, + &s.useDynamicType, &BoolAspect::writeSettings, Qt::UniqueConnection); connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater); menu->popup(ev.globalPos()); return true; From 17f40221e0d49fdb06b72f2d5c583216d7bed4ee Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 23 Feb 2024 11:15:58 +0100 Subject: [PATCH 36/45] Doc: Update the online doc sidebar according to structure changes Some of the linked topics were removed and others are now how-to topics. Added How To and Reference categories and fixed topic titles. Task-number: QTCREATORBUG-29361 Change-Id: I96efb10baacc173c30c6d568589bc91b3ff381ee Reviewed-by: Eike Ziller --- doc/qtcreator/config/style/qt5-sidebar.html | 27 +++++++++------------ 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/doc/qtcreator/config/style/qt5-sidebar.html b/doc/qtcreator/config/style/qt5-sidebar.html index 3bcc686adc6..a9e8acad864 100644 --- a/doc/qtcreator/config/style/qt5-sidebar.html +++ b/doc/qtcreator/config/style/qt5-sidebar.html @@ -9,7 +9,7 @@
-

Testing

+

Debugging and Analyzing

@@ -65,11 +54,14 @@
  • Analyze
  • Build and Run
  • +
  • Create Models and Diagrams
  • Debug
  • Design UIs
  • Edit Code
  • +
  • Manage Kits
  • Manage Projects
  • Read Documentation
  • +
  • Test
  • Use Qt Creator
  • Use the UI
  • See All
  • @@ -81,15 +73,20 @@ From 325db93a7b39062d8dc7b9f5371259f143b9f51b Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 5 Mar 2024 12:47:33 +0100 Subject: [PATCH 37/45] LanguageClient: improve clangd function hint Add a Clangd specific function hint model that alwys highlights the current parameter based on the number of commas in front of the cursor position, like the builtin code model. It also correctly closes the proposal after typing the closing parenthesis. Fixes: QTCREATORBUG-26346 Fixes: QTCREATORBUG-30489 Change-Id: I09d3ac6856acfe5e0f206d8c3a96dbb561ea2ce7 Reviewed-by: Christian Kandeler --- src/plugins/clangcodemodel/clangdclient.cpp | 1 + .../clangcodemodel/clangdcompletion.cpp | 68 +++++++++++++++++-- src/plugins/clangcodemodel/clangdcompletion.h | 15 +++- .../clangcodemodel/test/clangdtests.cpp | 25 ++++--- src/plugins/cppeditor/cppcompletionassist.cpp | 24 ++----- src/plugins/cppeditor/cpptoolsreuse.cpp | 24 ++++++- src/plugins/cppeditor/cpptoolsreuse.h | 2 + src/plugins/languageclient/client.cpp | 6 ++ src/plugins/languageclient/client.h | 2 + .../languageclientfunctionhint.cpp | 37 ++++------ .../languageclientfunctionhint.h | 23 ++++++- 11 files changed, 166 insertions(+), 61 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 46aa5848f7c..b36ff8a4258 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -405,6 +405,7 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir, c setSupportedLanguage(langFilter); setActivateDocumentAutomatically(true); setCompletionAssistProvider(new ClangdCompletionAssistProvider(this)); + setFunctionHintAssistProvider(new ClangdFunctionHintProvider(this)); setQuickFixAssistProvider(new ClangdQuickFixProvider(this)); symbolSupport().setLimitRenamingToProjects(true); symbolSupport().setRenameResultsEnhancer([](const SearchResultItems &symbolOccurrencesInCode) { diff --git a/src/plugins/clangcodemodel/clangdcompletion.cpp b/src/plugins/clangcodemodel/clangdcompletion.cpp index a10ba815df3..44520d324de 100644 --- a/src/plugins/clangcodemodel/clangdcompletion.cpp +++ b/src/plugins/clangcodemodel/clangdcompletion.cpp @@ -102,13 +102,52 @@ private: QElapsedTimer m_timer; }; +class ClangdFunctionHintProposalModel : public FunctionHintProposalModel +{ +public: + using FunctionHintProposalModel::FunctionHintProposalModel; + +private: + int activeArgument(const QString &prefix) const override + { + const int arg = activeArgumenForPrefix(prefix); + if (arg < 0) + return -1; + m_currentArg = arg; + return arg; + } + + QString text(int index) const override + { + using Parameters = QList; + if (index < 0 || m_sigis.signatures().size() <= index) + return {}; + const SignatureInformation signature = m_sigis.signatures().at(index); + QString label = signature.label(); + + const QList parameters = Utils::transform(signature.parameters().value_or(Parameters()), + &ParameterInformation::label); + if (parameters.size() <= m_currentArg) + return label; + + const QString ¶meterText = parameters.at(m_currentArg); + const int start = label.indexOf(parameterText); + const int end = start + parameterText.length(); + return label.mid(0, start).toHtmlEscaped() + "" + parameterText.toHtmlEscaped() + "" + + label.mid(end).toHtmlEscaped(); + } + + mutable int m_currentArg = 0; +}; + class ClangdFunctionHintProcessor : public FunctionHintProcessor { public: - ClangdFunctionHintProcessor(ClangdClient *client); + ClangdFunctionHintProcessor(ClangdClient *client, int basePosition); private: IAssistProposal *perform() override; + IFunctionHintProposalModel *createModel(const SignatureHelp &signatureHelp) const override; ClangdClient * const m_client; }; @@ -138,7 +177,8 @@ IAssistProcessor *ClangdCompletionAssistProvider::createProcessor( switch (contextAnalyzer.completionAction()) { case ClangCompletionContextAnalyzer::PassThroughToLibClangAfterLeftParen: qCDebug(clangdLogCompletion) << "creating function hint processor"; - return new ClangdFunctionHintProcessor(m_client); + return new ClangdFunctionHintProcessor(m_client, + contextAnalyzer.positionForProposal()); case ClangCompletionContextAnalyzer::CompletePreprocessorDirective: qCDebug(clangdLogCompletion) << "creating macro processor"; return new CustomAssistProcessor(m_client, @@ -606,8 +646,8 @@ QList ClangdCompletionAssistProcessor::generateCo return itemGenerator(items); } -ClangdFunctionHintProcessor::ClangdFunctionHintProcessor(ClangdClient *client) - : FunctionHintProcessor(client) +ClangdFunctionHintProcessor::ClangdFunctionHintProcessor(ClangdClient *client, int basePosition) + : FunctionHintProcessor(client, basePosition) , m_client(client) {} @@ -621,6 +661,12 @@ IAssistProposal *ClangdFunctionHintProcessor::perform() return FunctionHintProcessor::perform(); } +IFunctionHintProposalModel *ClangdFunctionHintProcessor::createModel( + const SignatureHelp &signatureHelp) const +{ + return new ClangdFunctionHintProposalModel(signatureHelp); +} + ClangdCompletionCapabilities::ClangdCompletionCapabilities(const JsonObject &object) : TextDocumentClientCapabilities::CompletionCapabilities(object) { @@ -631,4 +677,18 @@ ClangdCompletionCapabilities::ClangdCompletionCapabilities(const JsonObject &obj } } +ClangdFunctionHintProvider::ClangdFunctionHintProvider(ClangdClient *client) + : FunctionHintAssistProvider(client) + , m_client(client) +{} + +IAssistProcessor *ClangdFunctionHintProvider::createProcessor( + const AssistInterface *interface) const +{ + ClangCompletionContextAnalyzer contextAnalyzer(interface->textDocument(), + interface->position(), false, {}); + contextAnalyzer.analyze(); + return new ClangdFunctionHintProcessor(m_client, contextAnalyzer.positionForProposal()); +} + } // namespace ClangCodeModel::Internal diff --git a/src/plugins/clangcodemodel/clangdcompletion.h b/src/plugins/clangcodemodel/clangdcompletion.h index 5dddf6784a8..363fcf5e064 100644 --- a/src/plugins/clangcodemodel/clangdcompletion.h +++ b/src/plugins/clangcodemodel/clangdcompletion.h @@ -1,11 +1,10 @@ - -#include // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include +#include #include namespace TextEditor { class IAssistProcessor; } @@ -37,4 +36,16 @@ public: explicit ClangdCompletionCapabilities(const JsonObject &object); }; +class ClangdFunctionHintProvider : public LanguageClient::FunctionHintAssistProvider +{ +public: + ClangdFunctionHintProvider(ClangdClient *client); + +private: + TextEditor::IAssistProcessor *createProcessor( + const TextEditor::AssistInterface *assistInterface) const override; + + ClangdClient * const m_client; +}; + } // namespace ClangCodeModel::Internal diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index bfe7ea95368..d4dd092b837 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -1832,12 +1833,12 @@ void ClangdTestCompletion::testFunctionHints() QVERIFY(proposal); QVERIFY(hasItem(proposal, "f() -> void")); - QVERIFY(hasItem(proposal, "f(int a) -> void")); - QVERIFY(hasItem(proposal, "f(const QString &s) -> void")); - QVERIFY(hasItem(proposal, "f(char c, int optional = 3) -> void")); - QVERIFY(hasItem(proposal, "f(char c, int optional1 = 3, int optional2 = 3) -> void")); - QVERIFY(hasItem(proposal, "f(const TType *t) -> void")); - QVERIFY(hasItem(proposal, "f(bool) -> TType")); + QVERIFY(hasItem(proposal, "f(int a) -> void")); + QVERIFY(hasItem(proposal, "f(const QString &s) -> void")); + QVERIFY(hasItem(proposal, "f(char c, int optional = 3) -> void")); + QVERIFY(hasItem(proposal, "f(char c, int optional1 = 3, int optional2 = 3) -> void")); + QVERIFY(hasItem(proposal, "f(const TType<QString> *t) -> void")); + QVERIFY(hasItem(proposal, "f(bool) -> TType<QString>")); } void ClangdTestCompletion::testFunctionHintsFiltered() @@ -1855,7 +1856,6 @@ void ClangdTestCompletion::testFunctionHintsFiltered() QVERIFY(proposal); QCOMPARE(proposal->size(), 2); QVERIFY(hasItem(proposal, "func(const S &s, int j) -> void")); - QEXPECT_FAIL("", "QTCREATORBUG-26346", Abort); QVERIFY(hasItem(proposal, "func(const S &s, int j, int k) -> void")); } @@ -1868,7 +1868,6 @@ void ClangdTestCompletion::testFunctionHintConstructor() QVERIFY(!hasItem(proposal, "globalVariable")); QVERIFY(!hasItem(proposal, " class")); QVERIFY(hasItem(proposal, "Foo(int)")); - QEXPECT_FAIL("", "QTCREATORBUG-26346", Abort); QVERIFY(hasItem(proposal, "Foo(int, double)")); } @@ -2066,7 +2065,8 @@ void ClangdTestCompletion::getProposal(const QString &fileName, { const TextDocument * const doc = document(fileName); QVERIFY(doc); - const int pos = doc->document()->toPlainText().indexOf(" /* COMPLETE HERE */"); + const QString docContent = doc->document()->toPlainText(); + const int pos = docContent.indexOf(" /* COMPLETE HERE */"); QVERIFY(pos != -1); if (cursorPos) *cursorPos = pos; @@ -2110,6 +2110,13 @@ void ClangdTestCompletion::getProposal(const QString &fileName, QVERIFY(timer.isActive()); QVERIFY(proposal); proposalModel = proposal->model(); + if (auto functionHintModel = proposalModel.dynamicCast()) { + const int proposalBasePos = proposal->basePosition(); + // The language client function hint model expects that activeArgument was called before the + // text of individual hints is accessed. This is usually done by the proposal widget. But + // since we don't have a proposal widget in this test, we have to call it manually. + functionHintModel->activeArgument(docContent.mid(proposalBasePos, pos - proposalBasePos)); + } delete proposal; // The "dot" test files are only used once. diff --git a/src/plugins/cppeditor/cppcompletionassist.cpp b/src/plugins/cppeditor/cppcompletionassist.cpp index 8168d72ba1f..03c04765d41 100644 --- a/src/plugins/cppeditor/cppcompletionassist.cpp +++ b/src/plugins/cppeditor/cppcompletionassist.cpp @@ -372,27 +372,11 @@ QString CppFunctionHintModel::text(int index) const int CppFunctionHintModel::activeArgument(const QString &prefix) const { - int argnr = 0; - int parcount = 0; - SimpleLexer tokenize; - Tokens tokens = tokenize(prefix); - for (int i = 0; i < tokens.count(); ++i) { - const Token &tk = tokens.at(i); - if (tk.is(T_LPAREN)) - ++parcount; - else if (tk.is(T_RPAREN)) - --parcount; - else if (!parcount && tk.is(T_COMMA)) - ++argnr; - } - - if (parcount < 0) + const int arg = activeArgumenForPrefix(prefix); + if (arg < 0) return -1; - - if (argnr != m_currentArg) - m_currentArg = argnr; - - return argnr; + m_currentArg = arg; + return arg; } // --------------------------- diff --git a/src/plugins/cppeditor/cpptoolsreuse.cpp b/src/plugins/cppeditor/cpptoolsreuse.cpp index 48fe23244bc..6555010c8f4 100644 --- a/src/plugins/cppeditor/cpptoolsreuse.cpp +++ b/src/plugins/cppeditor/cpptoolsreuse.cpp @@ -219,6 +219,28 @@ bool isValidIdentifier(const QString &s) return true; } +int activeArgumenForPrefix(const QString &prefix) +{ + int argnr = 0; + int parcount = 0; + SimpleLexer tokenize; + Tokens tokens = tokenize(prefix); + for (int i = 0; i < tokens.count(); ++i) { + const Token &tk = tokens.at(i); + if (tk.is(T_LPAREN)) + ++parcount; + else if (tk.is(T_RPAREN)) + --parcount; + else if (!parcount && tk.is(T_COMMA)) + ++argnr; + } + + if (parcount < 0) + return -1; + + return argnr; +} + bool isQtKeyword(QStringView text) { switch (text.length()) { @@ -859,5 +881,5 @@ void decorateCppEditor(TextEditor::TextEditorWidget *editor) editor->setAutoCompleter(new CppAutoCompleter); } -} // namespace Internal +} // Internal } // CppEditor diff --git a/src/plugins/cppeditor/cpptoolsreuse.h b/src/plugins/cppeditor/cpptoolsreuse.h index 50078bdd791..89bf8961976 100644 --- a/src/plugins/cppeditor/cpptoolsreuse.h +++ b/src/plugins/cppeditor/cpptoolsreuse.h @@ -45,6 +45,8 @@ bool CPPEDITOR_EXPORT isValidFirstIdentifierChar(const QChar &ch); bool CPPEDITOR_EXPORT isValidIdentifierChar(const QChar &ch); bool CPPEDITOR_EXPORT isValidIdentifier(const QString &s); +int CPPEDITOR_EXPORT activeArgumenForPrefix(const QString &prefix); + QStringList CPPEDITOR_EXPORT identifierWordsUnderCursor(const QTextCursor &tc); QString CPPEDITOR_EXPORT identifierUnderCursor(QTextCursor *cursor); diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 90120e3174b..96ba042b84a 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -1630,6 +1630,12 @@ void Client::setCompletionAssistProvider(LanguageClientCompletionAssistProvider d->m_clientProviders.completionAssistProvider = provider; } +void Client::setFunctionHintAssistProvider(FunctionHintAssistProvider *provider) +{ + delete d->m_clientProviders.functionHintProvider; + d->m_clientProviders.functionHintProvider = provider; +} + void Client::setQuickFixAssistProvider(LanguageClientQuickFixProvider *provider) { delete d->m_clientProviders.quickFixAssistProvider; diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index 65093237085..a881d178242 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -39,6 +39,7 @@ class ClientPrivate; class DiagnosticManager; class DocumentSymbolCache; class DynamicCapabilities; +class FunctionHintAssistProvider; class HoverHandler; class InterfaceController; class LanguageClientCompletionAssistProvider; @@ -171,6 +172,7 @@ public: void setSemanticTokensHandler(const SemanticTokensHandler &handler); void setSnippetsGroup(const QString &group); void setCompletionAssistProvider(LanguageClientCompletionAssistProvider *provider); + void setFunctionHintAssistProvider(FunctionHintAssistProvider *provider); void setQuickFixAssistProvider(LanguageClientQuickFixProvider *provider); virtual bool supportsDocumentSymbols(const TextEditor::TextDocument *doc) const; virtual bool fileBelongsToProject(const Utils::FilePath &filePath) const; diff --git a/src/plugins/languageclient/languageclientfunctionhint.cpp b/src/plugins/languageclient/languageclientfunctionhint.cpp index 67f51db90da..c18114392c7 100644 --- a/src/plugins/languageclient/languageclientfunctionhint.cpp +++ b/src/plugins/languageclient/languageclientfunctionhint.cpp @@ -17,24 +17,6 @@ using namespace LanguageServerProtocol; namespace LanguageClient { -class FunctionHintProposalModel : public IFunctionHintProposalModel -{ -public: - explicit FunctionHintProposalModel(SignatureHelp signature) - : m_sigis(signature) - {} - void reset() override {} - int size() const override - { return m_sigis.signatures().size(); } - QString text(int index) const override; - - int activeArgument(const QString &/*prefix*/) const override - { return m_sigis.activeParameter().value_or(0); } - -private: - LanguageServerProtocol::SignatureHelp m_sigis; -}; - QString FunctionHintProposalModel::text(int index) const { using Parameters = QList; @@ -62,18 +44,19 @@ QString FunctionHintProposalModel::text(int index) const + label.mid(end).toHtmlEscaped(); } -FunctionHintProcessor::FunctionHintProcessor(Client *client) +FunctionHintProcessor::FunctionHintProcessor(Client *client, int basePosition) : m_client(client) + , m_pos(basePosition) {} IAssistProposal *FunctionHintProcessor::perform() { QTC_ASSERT(m_client, return nullptr); - m_pos = interface()->position(); - QTextCursor cursor(interface()->textDocument()); - cursor.setPosition(m_pos); + if (m_pos < 0) + m_pos = interface()->position(); auto uri = m_client->hostPathToServerUri(interface()->filePath()); - SignatureHelpRequest request((TextDocumentPositionParams(TextDocumentIdentifier(uri), Position(cursor)))); + SignatureHelpRequest request( + (TextDocumentPositionParams(TextDocumentIdentifier(uri), Position(interface()->cursor())))); request.setResponseCallback([this](auto response) { this->handleSignatureResponse(response); }); m_client->addAssistProcessor(this); m_client->sendMessage(request); @@ -91,6 +74,12 @@ void FunctionHintProcessor::cancel() } } +IFunctionHintProposalModel *FunctionHintProcessor::createModel( + const SignatureHelp &signatureHelp) const +{ + return new FunctionHintProposalModel(signatureHelp); +} + void FunctionHintProcessor::handleSignatureResponse(const SignatureHelpRequest::Response &response) { QTC_ASSERT(m_client, setAsyncProposalAvailable(nullptr); return); @@ -107,7 +96,7 @@ void FunctionHintProcessor::handleSignatureResponse(const SignatureHelpRequest:: if (signatureHelp.signatures().isEmpty()) { setAsyncProposalAvailable(nullptr); } else { - FunctionHintProposalModelPtr model(new FunctionHintProposalModel(signatureHelp)); + FunctionHintProposalModelPtr model(createModel(signatureHelp)); setAsyncProposalAvailable(new FunctionHintProposal(m_pos, model)); } } diff --git a/src/plugins/languageclient/languageclientfunctionhint.h b/src/plugins/languageclient/languageclientfunctionhint.h index d086d4ccd4d..65d51bec26a 100644 --- a/src/plugins/languageclient/languageclientfunctionhint.h +++ b/src/plugins/languageclient/languageclientfunctionhint.h @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -43,13 +44,15 @@ private: class LANGUAGECLIENT_EXPORT FunctionHintProcessor : public TextEditor::IAssistProcessor { public: - explicit FunctionHintProcessor(Client *client); + explicit FunctionHintProcessor(Client *client, int basePosition = -1); TextEditor::IAssistProposal *perform() override; bool running() override { return m_currentRequest.has_value(); } bool needsRestart() const override { return true; } void cancel() override; private: + virtual TextEditor::IFunctionHintProposalModel *createModel( + const LanguageServerProtocol::SignatureHelp &signatureHelp) const; void handleSignatureResponse( const LanguageServerProtocol::SignatureHelpRequest::Response &response); @@ -58,4 +61,22 @@ private: int m_pos = -1; }; +class LANGUAGECLIENT_EXPORT FunctionHintProposalModel + : public TextEditor::IFunctionHintProposalModel +{ +public: + explicit FunctionHintProposalModel(LanguageServerProtocol::SignatureHelp signature) + : m_sigis(signature) + {} + void reset() override {} + int size() const override { return m_sigis.signatures().size(); } + QString text(int index) const override; + + int activeArgument(const QString &/*prefix*/) const override + { return m_sigis.activeParameter().value_or(0); } + +protected: + LanguageServerProtocol::SignatureHelp m_sigis; +}; + } // namespace LanguageClient From cd4ec16f6eb534df4ee4b2bc42b001536f586600 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 11 Mar 2024 10:25:55 +0100 Subject: [PATCH 38/45] Axivion: Show error string on error's deserialization error Change-Id: Ib8cd3d336508f1a4e12465456254b02c556ac38b Reviewed-by: Andreas Loth Reviewed-by: Reviewed-by: Christian Stenger --- src/plugins/axivion/axivionplugin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp index 99d1f92eaa0..7ce0c4ffe18 100644 --- a/src/plugins/axivion/axivionplugin.cpp +++ b/src/plugins/axivion/axivionplugin.cpp @@ -455,6 +455,8 @@ static Group dtoRecipe(const Storage> &dtoStorage) errorString = Error(DashboardError(reply->url(), statusCode, reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), *error)).message(); + } else { + errorString = error.error(); } } else if (statusCode != 0) { errorString = Error(HttpError(reply->url(), statusCode, From d30f97ac7edf97a946289bd3f3d7b910112c6382 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 11 Mar 2024 14:56:10 +0100 Subject: [PATCH 39/45] Axivion: Pass arg by const reference Amends 0b0941cbcb62b91872a5ee8caf6da11ec9061958 Change-Id: I61cfe511be6627a347b330a6833f5d7a4afe3f1d Reviewed-by: Christian Stenger --- src/plugins/axivion/axivionoutputpane.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/axivion/axivionoutputpane.cpp b/src/plugins/axivion/axivionoutputpane.cpp index 9c020f277a8..b6761197e07 100644 --- a/src/plugins/axivion/axivionoutputpane.cpp +++ b/src/plugins/axivion/axivionoutputpane.cpp @@ -269,7 +269,7 @@ private: void updateTable(); void addIssues(const Dto::IssueTableDto &dto, int startRow); void onSearchParameterChanged(); - void updateBasicProjectInfo(std::optional info); + void updateBasicProjectInfo(const std::optional &info); void setFiltersEnabled(bool enabled); void fetchTable(); void fetchIssues(const IssueListSearch &search); @@ -375,7 +375,7 @@ IssuesWidget::IssuesWidget(QWidget *parent) void IssuesWidget::updateUi() { setFiltersEnabled(false); - std::optional projectInfo = Internal::projectInfo(); + const std::optional projectInfo = Internal::projectInfo(); updateBasicProjectInfo(projectInfo); if (!projectInfo) @@ -535,7 +535,7 @@ void IssuesWidget::onSearchParameterChanged() fetchIssues(search); } -void IssuesWidget::updateBasicProjectInfo(std::optional info) +void IssuesWidget::updateBasicProjectInfo(const std::optional &info) { auto cleanOld = [this] { const QList originalList = m_typesButtonGroup->buttons(); From 54205c1b6272cc2317dbea05a768854bc303ac1e Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 11 Mar 2024 15:05:38 +0100 Subject: [PATCH 40/45] Axivion: Replace local lambda with static method No need to create lambda on every call to credentialKey(). This should remove the warning about the Performance inefficiencies (AUTO_CAUSES_COPY). Change-Id: I9a7dc9cabcc6f80e58e39ef8be6a5445a11e0433 Reviewed-by: Christian Stenger --- src/plugins/axivion/axivionplugin.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp index 7ce0c4ffe18..a5431b6069d 100644 --- a/src/plugins/axivion/axivionplugin.cpp +++ b/src/plugins/axivion/axivionplugin.cpp @@ -119,13 +119,15 @@ static QString apiTokenDescription() return "Automatically created by " + ua + " on " + user + "@" + QSysInfo::machineHostName(); } +static QString escapeKey(const QString &string) +{ + QString escaped = string; + return escaped.replace('\\', "\\\\").replace('@', "\\@"); +} + static QString credentialKey() { - const auto escape = [](const QString &string) { - QString escaped = string; - return escaped.replace('\\', "\\\\").replace('@', "\\@"); - }; - return escape(settings().server.username) + '@' + escape(settings().server.dashboard); + return escapeKey(settings().server.username) + '@' + escapeKey(settings().server.dashboard); } template From 18e1c366488979fa4c892ebaf5600e14407aadd7 Mon Sep 17 00:00:00 2001 From: Dominik Holland Date: Thu, 7 Mar 2024 16:53:20 +0100 Subject: [PATCH 41/45] boot2qt: Fix reading the perf record args Change-Id: I0b181dc05a409a38cbd87366a0cb6631c900ed24 Reviewed-by: hjk --- src/plugins/boot2qt/qdbdevicedebugsupport.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/plugins/boot2qt/qdbdevicedebugsupport.cpp b/src/plugins/boot2qt/qdbdevicedebugsupport.cpp index 15373e4b4cf..b3129adf22e 100644 --- a/src/plugins/boot2qt/qdbdevicedebugsupport.cpp +++ b/src/plugins/boot2qt/qdbdevicedebugsupport.cpp @@ -5,6 +5,8 @@ #include "qdbconstants.h" +#include + #include #include #include @@ -88,13 +90,10 @@ public: upperPort = qmlServerPort; } if (m_usePerf) { - Store settingsData = runControl()->settingsData("Analyzer.Perf.Settings"); - QVariant perfRecordArgs = settingsData.value("Analyzer.Perf.RecordArguments"); - QString args = Utils::transform(perfRecordArgs.toStringList(), [](QString arg) { - return arg.replace(',', ",,"); - }).join(','); + const Store perfArgs = runControl()->settingsData(PerfProfiler::Constants::PerfSettingsId); + const QString recordArgs = perfArgs[PerfProfiler::Constants::PerfRecordArgsId].toString(); cmd.addArg("--profile-perf"); - cmd.addArg(args); + cmd.addArgs(recordArgs, CommandLine::Raw); lowerPort = upperPort = perfPort; } cmd.addArg("--port-range"); From 68e178c041b0079e38874558b462d7f705e8d83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sivert=20Kr=C3=B8vel?= Date: Wed, 6 Mar 2024 19:00:35 +0100 Subject: [PATCH 42/45] McuSupport: Read versioned settings keys for MCU dependencies In an accompanying change, the installer writes versioned settings keys. The version string will be appended to the existing key, after a single underscore character. When reading from the settings, the plugin first looks for keys matching one of the requested versions from the kit. Optionally, if no key for a matching version is found, the key for the newest version available is chosen. This only applies to the Qul SDK package for the time being. If no suitable versioned key is found, the plain unversioned settings key is picked Task-number: QTCREATORBUG-29194 Change-Id: I2db888390cfb64a4b7c78ebcf795543251cb7a1b Reviewed-by: Eike Ziller --- src/plugins/mcusupport/mcupackage.cpp | 9 +-- src/plugins/mcusupport/mcupackage.h | 3 +- src/plugins/mcusupport/mcusupportsdk.cpp | 8 ++- src/plugins/mcusupport/settingshandler.cpp | 65 ++++++++++++++++++++++ src/plugins/mcusupport/settingshandler.h | 4 ++ 5 files changed, 83 insertions(+), 6 deletions(-) diff --git a/src/plugins/mcusupport/mcupackage.cpp b/src/plugins/mcusupport/mcupackage.cpp index 15b6b589859..2ff913c680e 100644 --- a/src/plugins/mcusupport/mcupackage.cpp +++ b/src/plugins/mcusupport/mcupackage.cpp @@ -42,12 +42,12 @@ McuPackage::McuPackage(const SettingsHandler::Ptr &settingsHandler, const QString &downloadUrl, const McuPackageVersionDetector *versionDetector, const bool addToSystemPath, - const Utils::PathChooser::Kind &valueType) + const Utils::PathChooser::Kind &valueType, + const bool useNewestVersionKey) : settingsHandler(settingsHandler) , m_label(label) - , m_defaultPath(settingsHandler->getPath(settingsKey, QSettings::SystemScope, defaultPath)) , m_detectionPaths(detectionPaths) - , m_settingsKey(settingsKey) + , m_settingsKey(settingsHandler->getVersionedKey(settingsKey, QSettings::SystemScope, versions, useNewestVersionKey)) , m_versionDetector(versionDetector) , m_versions(versions) , m_cmakeVariableName(cmakeVarName) @@ -56,7 +56,8 @@ McuPackage::McuPackage(const SettingsHandler::Ptr &settingsHandler, , m_addToSystemPath(addToSystemPath) , m_valueType(valueType) { - m_path = this->settingsHandler->getPath(settingsKey, QSettings::UserScope, m_defaultPath); + m_defaultPath = settingsHandler->getPath(m_settingsKey, QSettings::SystemScope, defaultPath); + m_path = settingsHandler->getPath(m_settingsKey, QSettings::UserScope, m_defaultPath); if (m_path.isEmpty()) { m_path = FilePath::fromUserInput(qtcEnvironmentVariable(m_environmentVariableName)); } diff --git a/src/plugins/mcusupport/mcupackage.h b/src/plugins/mcusupport/mcupackage.h index 2efeb5e127f..a74c08bcf2d 100644 --- a/src/plugins/mcusupport/mcupackage.h +++ b/src/plugins/mcusupport/mcupackage.h @@ -40,7 +40,8 @@ public: const McuPackageVersionDetector *versionDetector = nullptr, const bool addToPath = false, const Utils::PathChooser::Kind &valueType - = Utils::PathChooser::Kind::ExistingDirectory); + = Utils::PathChooser::Kind::ExistingDirectory, + const bool useNewestVersionKey = false); ~McuPackage() override = default; diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index 689ab875b42..18d62f41e91 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -54,7 +54,13 @@ McuPackagePtr createQtForMCUsPackage(const SettingsHandler::Ptr &settingsHandler .withExecutableSuffix()}, // detectionPaths Constants::SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK, // settingsKey Legacy::Constants::QUL_CMAKE_VAR, - Legacy::Constants::QUL_ENV_VAR)}; + Legacy::Constants::QUL_ENV_VAR, + {}, // versions + {}, // downloadUrl + nullptr, // versionDetector + false, // addToPath + Utils::PathChooser::Kind::ExistingDirectory, // valueType + true)}; // useNewestVersionKey } namespace Legacy { diff --git a/src/plugins/mcusupport/settingshandler.cpp b/src/plugins/mcusupport/settingshandler.cpp index 2bae687cfc8..1ecec030b45 100644 --- a/src/plugins/mcusupport/settingshandler.cpp +++ b/src/plugins/mcusupport/settingshandler.cpp @@ -10,6 +10,9 @@ #include #include +#include +#include + using namespace Utils; namespace McuSupport::Internal { @@ -27,6 +30,68 @@ static FilePath packagePathFromSettings(const Key &settingsKey, return FilePath::fromUserInput(path); } +static Key getKeyForNewestVersion(const Key &plainKey, + QtcSettings &settings) +{ + const Key baseKey = Key(Constants::SETTINGS_KEY_PACKAGE_PREFIX + plainKey); + + // Versioned keys have their version string after the last underscore character + // Only version strings on the format x[.y.z] are considered. + settings.beginGroup(Constants::SETTINGS_GROUP); + const QRegularExpression re(QString("%1_\\d+(\\.\\d+){0,2}$").arg(stringFromKey(baseKey))); + const QStringList matchingKeys = stringsFromKeys(settings.childKeys()).filter(re); + settings.endGroup(); + + if (matchingKeys.isEmpty()) { + return plainKey; + } + QVersionNumber newestVersion; + for (const auto &k: matchingKeys) { + const QString currentVersionStr = k.mid(k.lastIndexOf("_") + 1); + const auto currentVersion = QVersionNumber::fromString(currentVersionStr); + if (newestVersion.isNull() || newestVersion < currentVersion) { + newestVersion = currentVersion; + } + } + const QString newestVersionStr = QString("_%1").arg(newestVersion.toString()); + return Key(plainKey + newestVersionStr.toLocal8Bit()); +} + + +static Key getVersionedKeyFromSettings(const Key &plainKey, + QtcSettings &settings, + const QStringList &versions, + bool allowNewerVersions = false) +{ + const Key keyBase = Key(Constants::SETTINGS_GROUP) + '/' + + Constants::SETTINGS_KEY_PACKAGE_PREFIX; + + // Always prefer one of the versions listed in the kit + for (const auto &versionString: versions) { + const Key versionedKey = plainKey + QString("_%1").arg(versionString).toLocal8Bit(); + + if (settings.contains(keyBase + versionedKey)) { + return versionedKey; + } + } + + // Maybe find the newest version listed in the settings + if (allowNewerVersions) { + return getKeyForNewestVersion(plainKey, settings); + } + + // Fall back to the plain key if no versioned key is found + return plainKey; +} + +Key SettingsHandler::getVersionedKey(const Key &plainKey, + QSettings::Scope scope, + const QStringList &versions, + bool allowNewer) const +{ + return getVersionedKeyFromSettings(plainKey, *Core::ICore::settings(scope), versions, allowNewer); +} + FilePath SettingsHandler::getPath(const Key &settingsKey, QSettings::Scope scope, const FilePath &defaultPath) const diff --git a/src/plugins/mcusupport/settingshandler.h b/src/plugins/mcusupport/settingshandler.h index c50dcde1e3c..c5ed62c6428 100644 --- a/src/plugins/mcusupport/settingshandler.h +++ b/src/plugins/mcusupport/settingshandler.h @@ -18,6 +18,10 @@ public: virtual Utils::FilePath getPath(const Utils::Key &settingsKey, QSettings::Scope scope, const Utils::FilePath &m_defaultPath) const; + Utils::Key getVersionedKey(const Utils::Key &plainKey, + QSettings::Scope scope, + const QStringList &versions, + bool allowNewer) const; virtual bool write(const Utils::Key &settingsKey, const Utils::FilePath &path, From 96d44d375b714a35037c6ffe9f8bd5790339e992 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 7 Mar 2024 17:47:22 +0100 Subject: [PATCH 43/45] LanguageClient: Suppress a compiler warning warning indentation; statement is not part of the previous 'for' [-Wmisleading-indentation] if (__builtin_expect(!!(clients.removeAll(client) == 0), true)) {} else { ::Utils::writeAssertLocation( "\"" "clients.removeAll(client) == 0""\" in " "/data/dev/creator-out/src/plugins/languageclient/languageclientmanager.cpp" ":" "114"); } do {} while (0 Change-Id: I14297567627801d3a5436abf2df8fec23bff85dd Reviewed-by: Reviewed-by: Christian Stenger --- src/plugins/languageclient/languageclientmanager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index d855bf1a952..ae3c52f8975 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -110,8 +110,9 @@ void LanguageClient::LanguageClientManager::addClient(Client *client) managerInstance, [client]() { QTC_ASSERT(!managerInstance->m_clients.contains(client), managerInstance->m_clients.removeAll(client)); - for (QList &clients : managerInstance->m_clientsForSetting) + for (QList &clients : managerInstance->m_clientsForSetting) { QTC_CHECK(clients.removeAll(client) == 0); + } }); ProjectExplorer::Project *project = client->project(); From 3af6f65ebc06ea52001e459c09179680dfa41d1a Mon Sep 17 00:00:00 2001 From: Alexandre Laurent Date: Sun, 3 Mar 2024 13:37:17 +0100 Subject: [PATCH 44/45] French translation for Qt Creator 13.0 Change-Id: I0895a8ef3ccad9ab41081ec1df53aa45ed721e3e Reviewed-by: Oswald Buddenhagen Reviewed-by: Johnny Jazeix Reviewed-by: Olivier Delaune Reviewed-by: Eike Ziller Reviewed-by: --- share/qtcreator/translations/qtcreator_fr.ts | 2846 ++++++++++++++---- 1 file changed, 2276 insertions(+), 570 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_fr.ts b/share/qtcreator/translations/qtcreator_fr.ts index fe4d87c0326..b670b189d41 100644 --- a/share/qtcreator/translations/qtcreator_fr.ts +++ b/share/qtcreator/translations/qtcreator_fr.ts @@ -72,13 +72,6 @@ Intervalle de répétition - - AccountImage - - Account - Compte - - AddImageToResources @@ -468,6 +461,166 @@ Utilisez AmbientSound.Infinite pour boucler indéfiniment. Active/désactive la lecture de l'animation. + + AnimatedSpriteSpecifics + + Animated Sprite + Sprite animé + + + Source + Source + + + Adds an image from the local file system. + Ajoute une image depuis le système de fichiers local. + + + Frame size + Cadre, trame ou image? + Taille du cadre + + + Sets the width and height of the frame. + Définit la largeur et la hauteur du cadre. + + + W + width + The width of the animated sprite frame + L + + + Width. + Largeur. + + + H + height + The height of the animated sprite frame + H + + + Height. + Hauteur. + + + Frame coordinates + Coordonnées du cadre + + + Sets the coordinates of the first frame of the animated sprite. + Définit les coordonnées de la première image du sprite animé. + + + X + Frame X + The width of the animated sprite frame + X + + + Frame X coordinate. + Coordonnée X du cadre. + + + Y + Frame Y + The height of the animated sprite frame + Y + + + Frame Y coordinate. + Coordonnée Y du cadre. + + + Frame count + Nombre de cadres + + + Sets the number of frames in this animated sprite. + Définit le nombre d'images du sprite animé. + + + Frame rate + Vitesse de l'animation + + + Sets the number of frames per second to show in the animation. + Définit le nombre d'images par seconde à afficher dans l'animation. + + + Frame duration + Durée d'une image + + + Sets the duration of each frame of the animation in milliseconds. + Définit la durée de chaque image de l'animation en millisecondes. + + + Frame sync + Synchronisation de l'image + + + Sets frame advancements one frame each time a frame is rendered to the screen. + Définit la progression de l'animation à chaque fois qu'une image est dessinée à l'écran. + + + Loops + Boucles + + + After playing the animation this many times, the animation will automatically stop. + Arrête automatiquement l'animation après l'avoir joué ce nombre de fois. + + + Interpolate + Lisser + + + If true, interpolation will occur between sprite frames to make the animation appear smoother. + Lorsqu'à vrai, un lissage entre les images sera effectué pour rendre l'animation plus douce. + + + Finish behavior + Comportement de fin + + + Sets the behavior when the animation finishes on its own. + Définit le comportement à avoir lorsque l'animation se termine d'elle même. + + + Reverse + Inverser + + + If true, the animation will be played in reverse. + Lorsqu'à vrai, l'animation sera jouée en sens inverse. + + + Running + En cours d'exécution + + + Whether the sprite is animating or not. + Si le sprite est en cours d'animation ou non. + + + Paused + En pause + + + When paused, the current frame can be advanced manually. + Lorsqu'en pause, le cadre de l'image courante peut être avancé manuellement. + + + Current frame + Image courante + + + When paused, the current frame can be advanced manually by setting this property. + Lorsqu'en pause, le cadre de l'image courante peut être avancé manuellement en définissant cette propriété. + + AnimationSection @@ -797,117 +950,6 @@ Une valeur positive augmente la réverbération pour les hautes fréquences et En sourdine - - QtC::Axivion - - Project: - Projet : - - - Lines of code: - Lignes de code : - - - Analysis timestamp: - Analyse des horodatages : - - - unknown - inconnu - - - Total: - Total : - - - Show dashboard - Afficher le tableau de bord - - - Axivion - Axivion - - - Show rule details - Afficher le détail de la règle - - - Dashboard projects: - Projets de tableau de bord : - - - Fetch Projects - Récupérer les projets - - - Link Project - Lier le projet - - - Unlink Project - Délier le projet - - - This project is not linked to a dashboard project. - Ce projet n'est pas lié à un projet de tableau de bord. - - - This project is linked to "%1". - Ce projet est lié à « %1 ». - - - Incomplete or misconfigured settings. - Paramètres incomplets ou mal configurés. - - - Certificate Error - Erreur de certificat - - - Server certificate for %1 cannot be authenticated. -Do you want to disable SSL verification for this server? -Note: This can expose you to man-in-the-middle attack. - Le certificat du serveur %1 ne peut pas être authentifié. -Voulez-vous désactiver la vérification SSL pour ce serveur ? -Remarque : cela peut vous exposer à une attaque de type « homme du milieu ». - - - curl: - curl : - - - Dashboard URL: - URL du tableau de bord : - - - Description: - Description : - - - Non-empty description - Description non vide - - - Access token: - Jeton d’accès : - - - IDE Access Token - Jeton d'accès de l'EDI - - - Edit... - Modifier… - - - Edit Dashboard Configuration - Modifier la configuration du tableau de bord - - - General - Général - - BackgroundColorMenuActions @@ -1210,6 +1252,29 @@ Le chemin doit être relatif. Taille de la source + + BrandBar + + Welcome to + Bienvenue dans + + + Qt Design Studio + Qt Design Studio + + + Community Edition + Édition communautaire + + + Enterprise Edition + Édition entreprise + + + Professional Edition + Édition professionnelle + + BusyIndicatorSpecifics @@ -1517,6 +1582,112 @@ Le chemin doit être relatif. Appliquer + + CollectionDetailsToolbar + + Add property left + Ajouter une propriété à gauche + + + Add property right + Ajouter une propriété à droite + + + Delete selected property + Supprimer la propriété sélectionnée + + + Insert row below + Insérer une ligne en dessous + + + Insert row above + Insérer une ligne au-dessus + + + Delete selected row + Supprimer la ligne sélectionnée + + + Save changes + Enregistrer les changements + + + Export model + Exporter le modèle + + + Add Column + Ajouter une colonne + + + Column name: + Nom de la colonne : + + + The model already contains "%1"! + « %1 » est déjà contenu dans le modèle ! + + + Type: + Type : + + + Add + Ajouter + + + Cancel + Annuler + + + + CollectionDetailsView + + Edit + Modifier + + + Delete + Supprimer + + + Sort Ascending + Tri croissant + + + Sort Descending + Tri décroissant + + + Add row above + Ajouter une ligne au-dessus + + + Add row below + Ajouter une ligne en dessous + + + Delete this row + Supprimer cette ligne + + + Select a model to continue + Sélectionner un modèle pour continuer + + + Delete Column + Supprimer la colonne + + + Are you sure that you want to delete column "%1"? + Voulez-vous vraiment supprimer la colonne « %1 » ? + + + Cancel + Annuler + + CollectionItem @@ -1528,17 +1699,33 @@ Le chemin doit être relatif. Renommer - Deleting whole collection - Supprimer toute la collection + Assign to the selected node + Assigner au nœud sélectionné + + + Deleting the model + Suppression du modèle + + + Are you sure that you want to delete model "%1"? +The model will be deleted permanently. + Êtes-vous sûr de vouloir supprimer le modèle « %1 » ? +Le modèle sera définitivement supprimé. + + + Are you sure that you want to delete model "%1"? +The model will be removed from the project but the file will not be deleted. + Voulez-vous vraiment supprimer le modèle « %1 » ? +Le modèle sera retiré du projet mais le fichier ne sera pas supprimé. + + + Rename model + Renommer le modèle Cancel Annuler - - Rename collection - Renommer la collection - New name: Nouveau nom : @@ -1547,20 +1734,16 @@ Le chemin doit être relatif. CollectionView - Collections - Collections + Data Models + Modèles de données - Import Json - Importer un Json + Import a model + Importer un modèle - Import CSV - Importer un CSV - - - Add new collection - Ajouter une nouvelle collection + Add a new model + Ajouter un nouveau modèle @@ -1994,6 +2177,10 @@ Le chemin doit être relatif. Write the conditions for the components and the signals manually. Écrire manuellement les conditions pour les composants et les signaux. + + Jump to the code. + Aller au code. + ConnectionsListView @@ -2327,53 +2514,6 @@ Le chemin doit être relatif. Molette - - CsvImport - - Import A CSV File - Importer un fichier CSV - - - New CSV File - Nouveau fichier CSV - - - Could not load the file - Impossible de charger le fichier - - - An error occurred while trying to load the file. - Une erreur s'est produite lors de la lecture du fichier. - - - File name: - Nom du fichier : - - - Open - Ouvrir - - - Collection name: - Nom de la collection : - - - File name can not be empty - Le nom du fichier ne peut pas être vide - - - Collection name can not be empty - Le nom de la collection ne peut pas être vide - - - Import - Importer - - - Cancel - Annuler - - DelayButtonSpecifics @@ -2539,6 +2679,25 @@ définit par la<b>taille du pas</b>. Titre + + DownloadButton + + Update available. + Mise à jour disponible. + + + Example was already downloaded. + L'exemple est déjà téléchargé. + + + Network or example is not available or the link is broken. + Le réseau ou l'exemple n'est pas disponible ou le lien est cassé. + + + Download the example. + Télécharger l'exemple. + + DownloadPane @@ -2554,6 +2713,21 @@ définit par la<b>taille du pas</b>. % + + DownloadPanel + + Progress: + Progression : + + + % + % + + + Open + Ouvrir + + DrawerSpecifics @@ -2612,38 +2786,77 @@ définit par la<b>taille du pas</b>. - EffectCompositionNode + EditPropertyDialog - Remove - Supprimer + Edit Column + Modifier la colonne - Enable/Disable Node - Activer/désactiver le nœud + Name + Nom + + + Type + Type + + + Conversion from %1 to %2 may lead to data loss + La conversion de %1 vers %2 peut entraîner une perte de données + + + Apply + Appliquer + + + Cancel + Annuler - EffectMaker + EffectComposer - Open Shader in Code Editor - shader ou nuanceur - Ouvrir le shader dans l'éditeur de code + Remove all effect nodes. + Supprimer tous les nœuds d'effets. + + + Open Shader in Code Editor. + Ouvrir le shader dans l'éditeur de code. Add an effect node to start Ajoutez un nœud d'effet pour commencer + + Effect Composer is disabled on MCU projects + n'est pas pris en charge ? + Le compositeur d'effet est désactivé dans les projets MCU + - EffectMakerPreview + EffectComposer::EffectComposerView - Zoom out - Zoom arrière + Effect Composer [beta] + Compositeur d'effet [bêta] + + + EffectComposer::EffectComposerWidget + + Effect Composer + Title of effect composer widget + Compositeur d'effet + + + + EffectComposerPreview Zoom In Zoom avant + + Zoom out + Zoom arrière + Zoom Fit Ajuster @@ -2658,24 +2871,59 @@ définit par la<b>taille du pas</b>. - EffectMakerTopBar + EffectComposerTopBar - Save in Library - Sauvegarder dans la bibliothèque + Add new composition + Ajouter une nouvelle composition - How to use Effect Maker: + Save current composition + Enregistrer la composition actuelle + + + Save current composition with a new name + Enregistrer la composition actuelle avec un nouveau nom + + + Assign current composition to selected item + Assigner la composition actuelle à l'élément sélectionné + + + Untitled + Sans titre + + + How to use Effect Composer: 1. Click "+ Add Effect" to add effect node 2. Adjust the effect nodes properties 3. Change the order of the effects, if you like 4. See the preview 5. Save in the library, if you wish to reuse the effect later - Comment utiliser Effect Maker : -1. Cliquer sur « Ajouter un effet » pour ajouter un nœud d'effet + Pour utiliser le ... ? + Comment utiliser le compositeur d'effet : +1. Cliquer sur « + Ajouter un effet » pour ajouter un nœud d'effet 2. Ajuster les propriétés des nœuds d'effet -3. Changer l'ordre des effets, si nécessaire -4. Sauvegarder la prévisualisation -5. Sauvegarder dans la bibliothèque, si vous souhaitez réutiliser l'effet plus tard +3. Changer l'ordre des effets, si vous le souhaitez +4. Voir la prévisualisation +5. Enregistrer l'effet dans la bibliothèque, si vous souhaitez le réutiliser plus tard + + + + EffectCompositionNode + + Remove + Supprimer + + + Enable/Disable Node + Activer/désactiver le nœud + + + + EffectNode + + Existing effect has conflicting properties, this effect cannot be added. + Un effet existant contient des conflits de propriétés, cet effet ne peut être ajouté. @@ -3703,6 +3951,57 @@ ajouter un composant en surbrillance. Inverse l'image horizontalement. + + ImportDialog + + Import a model + Importer un modèle + + + Model path + Chemin du modèle + + + Select a model file + Sélectionner un fichier de modèle + + + Open + Ouvrir + + + Could not load the file + Impossible de charger le fichier + + + An error occurred while trying to load the file. + Une erreur s'est produite lors de la lecture du fichier. + + + File name + Nom du fichier + + + The model name + Le nom du modèle + + + File name can not be empty + Le nom du fichier ne peut pas être vide + + + The model name can not be empty + Le nom du modèle ne peut pas être vide + + + Import + Importer + + + Cancel + Annuler + + InsetSection @@ -3753,10 +4052,6 @@ ajouter un composant en surbrillance. [None] [Aucun] - - Category - Catégorie - Object name Nom de l'objet @@ -3854,45 +4149,6 @@ ajouter un composant en surbrillance. Ajouter un module. - - JsonImport - - Import Collections - Importer des collections - - - New Json File - Nouveau fichier Json - - - Could not load the file - Impossible de charger le fichier - - - An error occurred while trying to load the file. - Une erreur s'est produite lors de la lecture du fichier. - - - File name: - Nom du fichier : - - - Open - Ouvrir - - - File name cannot be empty. - Le nom du fichier ne peut pas être vide. - - - Import - Importer - - - Cancel - Annuler - - Label @@ -4302,6 +4558,10 @@ ajouter un composant en surbrillance. State Group Groupe d’états + + State Groups are not supported with Qt for MCUs + Les groupes d'états ne sont pas pris en charge dans Qt pour MCUs + Switch State Group Basculer le groupe d’états @@ -4366,30 +4626,6 @@ ajouter un composant en surbrillance. minutes minutes - - Predefined Categories - Catégories prédéfinies - - - Select the categories to track - Sélectionner les catégories à suivre - - - Select all - Tout sélectionner - - - Custom Categories - Catégories personnalisées - - - Manage your own categories - Gérer vos catégories - - - Add new Category - Ajouter une nouvelle catégorie - Set runtime configuration for the project. Définit la configuration d'exécution pour le projet. @@ -4442,6 +4678,11 @@ ajouter un composant en surbrillance. Close Fermer + + Sets the visible <b>Views</b> to immovable across the Workspaces. + Vues ? + Rend les <b>Vues</b> visibles fixes à travers les espaces de travail. + Workspace Espace de travail @@ -4487,6 +4728,77 @@ ajouter un composant en surbrillance. Ajoute une connexion, liaison ou une propriété personnalisée aux composants. + + MainGridStack + + Create a new project using the "<b>Create Project</b>" or open an existing project using the "<b>Open Project</b>" option. + Créer un nouveau projet avec « <b>Créer un projet</b> » ou ouvrir un projet existant avec l'option « <b>Ouvrir un projet</b> ». + + + Remove Project from Recent Projects + Supprimer le projet des projets récents + + + Clear Recent Project List + Effacer la liste des projets récents + + + + MainScreen + + Create Project ... + Créer un projet… + + + Open Project ... + Ouvrir un projet… + + + New to Qt? + Nouveau sur Qt ? + + + Get Started + Pour démarrer? + Démarrer + + + Recent Projects + Projets récents + + + Examples + Exemples + + + Tutorials + Tutoriels + + + UI Tour + Visite guidée de l'interface utilisateur + + + User Guide + Guide utilisateur + + + Blog + Blog + + + Forums + Forums + + + Account + Compte + + + Get Qt + Obtenir Qt + + MarginSection @@ -4684,6 +4996,14 @@ ajouter un composant en surbrillance. Media Player Lecteur média + + Source + Source + + + Adds an image from the local file system. + Ajoute une image depuis le système de fichiers local. + Playback rate Vitesse de lecture @@ -4773,33 +5093,6 @@ Erreur : %1 - - ModelSourceItem - - Delete - Supprimer - - - Rename - Renommer - - - Deleting source - Suppression de la source - - - Cancel - Annuler - - - Rename source - Renommer la source - - - New name: - Nouveau nom : - - MouseAreaSpecifics @@ -4940,16 +5233,24 @@ Erreur : NewCollectionDialog - Add a new Collection - Ajouter une nouvelle collection + Add a new Model + Ajouter un nouveau modèle - Collection name: - Nom de la collection : + Model + Modèle - Collection name can not be empty - Le nom d'une collection ne peut pas être vide + The model name + Le nom du modèle + + + The model name can not be empty + Le nom du modèle ne peut pas être vide + + + The model name already exists %1 + Le nom de modèle « %1 » existe déjà Create @@ -5703,6 +6004,106 @@ est en cours. Ferme le QDockWidget + + QKeychain::DeletePasswordJobPrivate + + Unknown error + Erreur inconnue + + + Could not open wallet: %1; %2 + Impossible d'ouvrir le portefeuille : %1; %2 + + + + QKeychain::JobPrivate + + Unknown error + Erreur inconnue + + + Access to keychain denied + keychain ? + Accès refusé au porte-clés + + + + QKeychain::PlainTextStore + + Could not store data in settings: access error + Impossible d'enregistrer les données dans les paramètres : erreur d'accès + + + Could not store data in settings: format error + Impossible d'enregistrer les données dans les paramètres : erreur de format + + + Could not delete data from settings: access error + Impossible de supprimer les données des paramètres : erreur d'accès + + + Could not delete data from settings: format error + Impossible de supprimer les données des paramètres : erreur de format + + + Entry not found + Entrée introuvable + + + + QKeychain::ReadPasswordJobPrivate + + D-Bus is not running + D-Bus n'est pas en cours d'exécution + + + Unknown error + Erreur inconnue + + + No keychain service available + Aucun service de porte-clés disponible + + + Could not open wallet: %1; %2 + Impossible d'ouvrir le portefeuille : %1 ; %2 + + + Access to keychain denied + Accès au porte-clés refusé + + + Could not determine data type: %1; %2 + Impossible de déterminer le type des données : %1 ; %2 + + + Entry not found + Entrée introuvable + + + Unsupported entry type 'Map' + Type d'entrée 'Map' non pris en charge + + + Unknown kwallet entry type '%1' + Type d'entrée kwallet inconnu '%1' + + + + QKeychain::WritePasswordJobPrivate + + D-Bus is not running + D-Bus n'est pas en cours d'exécution + + + Unknown error + Erreur inconnue + + + Could not open wallet: %1; %2 + Impossible d'ouvrir le portefeuille : %1; %2 + + QObject @@ -5772,11 +6173,59 @@ est en cours. L'effet %1 n'est pas complet. - Ensure that you have saved it in Qt Quick Effect Maker. + Ensure that you have saved it in the Effect Composer. Do you want to edit this effect? - Assurez vous de l'avoir sauvegardé dans Qt Quick Effect Make. + Assurez-vous de l'avoir sauvegardé dans le compositeur d'effet. Souhaitez-vous éditer cet effet ? + + Access to keychain denied + Accès au porte-clés refusé + + + No keyring daemon + Aucun démon de trousseau disponible + + + Already unlocked + Déjà déverrouillé + + + No such keyring + Aucun trousseau de ce type + + + Bad arguments + Arguments incorrects + + + I/O error + Erreur d'E/S + + + Cancelled + Annulé + + + Keyring already exists + Le trousseau existe déjà + + + No match + Aucun résultat + + + Unknown error + Erreur inconnue + + + Entry not found + Entrée introuvable + + + Minimize + Minimiser + QmlDesigner::AbstractEditorDialog @@ -6114,6 +6563,14 @@ Export des ressources : %2 Title of assets library widget Bibliothèque de ressources + + Failed to Delete Effect Resources + Échec de suppression des ressources d'effet + + + Could not delete "%1". + Impossible de supprimer « %1 ». + Failed to Add Files Échec lors de l'ajout de fichiers @@ -6265,22 +6722,147 @@ Export des ressources : %2 - QmlDesigner::CollectionView + QmlDesigner::CollectionSourceModel - Collection Editor - Éditeur de collections + Node is not indexed in the models. + Le nœud n'est pas indexé dans les modèles. - Collection Editor view - Vue de l'éditeur de collections + Node should be a JSON model. + Le nœud doit être un modèle JSON. + + + A model with the identical name already exists. + Un modèle portant ce nom existe déjà. + + + Selected node must have a valid source file address + Le nœud sélectionné contient une adresse de fichier source valide + + + Can't read or write "%1". +%2 + Impossible de lire ou d'écrire « %1 ». +%2 + + + "%1" is corrupted. +%2 + « %1 » est corrompu. +%2 + + + Can't clean "%1". + Impossible de nettoyer « %1 ». + + + Can't write to "%1". + Impossible d'écrire dans « %1 ». + + + No model is available for the JSON model group. + Aucun modèle n'est disponible pour le groupe de modèles JSON. + + + JSON document type should be an object containing models. + Le type de document JSON doit être un objet contenant des modèles. + + + Rename Model + Renommer le modèle + + + Invalid node + Nœud invalide + + + Can't rename the node + Impossible de renommer le nœud + + + Invalid node type + Type de nœud invalide + + + The model group doesn't contain the old model name (%1). + Le groupe de modèles ne contient pas l'ancien nom du modèle (%1). + + + The model name "%1" already exists in the model group. + Le nom de modèle « %1 » existe déjà dans le groupe de modèles. + + + Delete Model + Supprimer le modèle + + + The selected node has an invalid source address + Le nœud sélectionné contient une adresse source invalide + + + The model group doesn't contain the model name (%1). + Le groupe de modèles ne contient pas le nom du modèle (%1). + + + + QmlDesigner::CollectionView + + Model Editor + Éditeur de modèle + + + Model Editor view + Vue de l'éditeur de modèle QmlDesigner::CollectionWidget - Collection View - Title of collection view widget - Collections + Model Editor + Title of model editor widget + Éditeur de modèle + + + Cannot Create QtQuick View + Impossible de créer une vue QtQuick + + + StatesEditorWidget: %1 cannot be created.%2 + StatesEditorWidget : %1 ne peut être créé.%2 + + + File error + Erreur de fichier + + + Can not open the file to write. + + Impossible d'ouvrir le fichier en écriture. + + + + Can not add a model to the JSON file + Impossible d'ajouter un modèle au fichier JSON + + + The imported model is empty or is not supported. + Le modèle importé est vide ou non pris en charge. + + + Can not import to the main model + Impossible d'importer au modèle principal + + + The data store is not available. + Le stockage des données n'est pas disponible. + + + The default model node is not available. + Le nœud de modèle par défaut n'est pas disponible. + + + Failed to add a model to the default model group + Échec lors de l'ajout du modèle au groupe de modèles par défaut @@ -6651,6 +7233,108 @@ Export des ressources : %2 Group Selection Mode Mode de sélection en groupe + + Viewport Shading + https://doc.qt.io/qtdesignstudio/studio-3d-editor.html#using-viewport-shading + Rendu dans la vue + + + Wireframe + A vérifier + Fil de fer + + + Show models as wireframe. + Afficher les modèles en fil de fer. + + + Default + Défaut + + + Rendering occurs as normal. + Le rendu est effectué normalement. + + + Base Color + Couleur de base + + + The base or diffuse color of a material is passed through without any lighting. + La couleur de base ou la couleur diffuse du matériau est utilisée sans aucun éclairage. + + + Roughness + Rugosité + + + The roughness of a material is passed through as an unlit greyscale value. + La rugosité du matériau est utilisée comme niveau de gris, sans éclairage. + + + Metalness + Métallique + + + The metalness of a material is passed through as an unlit greyscale value. + L'aspect métallique du matériau est utilisé comme niveau de gris, sans éclairage. + + + Normals + Normales + + + The interpolated world space normal value of the material mapped to an RGB color. + La valeur lissée des normales en espace monde du matériau est transposée en couleur RGB. + + + Ambient Occlusion + Occlusion ambiante + + + Only the ambient occlusion of the material. + Uniquement l'occlusion ambiante du matériau. + + + Emission + Émission + + + Only the emissive contribution of the material. + Uniquement la contribution émissive du matériau. + + + Shadow Occlusion + Occlusion d'ombrage + + + The occlusion caused by shadows as a greyscale value. + L'occlusion provoquée par les ombres, en niveau de gris. + + + Diffuse + Diffuse + + + Only the diffuse contribution of the material after all lighting. + Uniquement la contribution diffuse du matériau après éclairage. + + + Specular + Spéculaire + + + Only the specular contribution of the material after all lighting. + Uniquement la contribution spéculaire du matériau après éclairage. + + + Reset All Viewports + Réinitialiser les vues + + + Reset all shading options for all viewports. + Réinitialiser toutes les options de rendu pour toutes les vues. + 3D view is not supported in MCU projects. La vue 3D n'est pas prise en charge dans les projets MCU. @@ -7025,6 +7709,10 @@ Export des ressources : %2 Manage... Gérer… + + Lock Workspaces + Verrouiller les espaces de travail + Reset Active Réinitialiser l'espace de travail actif @@ -7151,6 +7839,10 @@ Export des ressources : %2 Enable Timeline editor Activer l'éditeur de ligne temporelle + + Enable DockWidget content minimum size + Activer la taille minimale de contenu du DockWidget + Show property editor warnings Afficher les avertissements de l'éditeur de propriétés @@ -7240,6 +7932,41 @@ Export des ressources : %2 Les changements effectués prendront effet au prochain démarrage de la couche d’émulation QML ou %1. + + QmlDesigner::Internal::TypeAnnotationReader + + Illegal state while parsing. + État illégal lors de l'analyse. + + + No property definition allowed. + Aucune définition de propriété permise. + + + Invalid type %1 + Type %1 invalide + + + Unknown property for Type %1 + Propriété inconnue pour le type %1 + + + Unknown property for ItemLibraryEntry %1 + Propriété inconnue pour ItemLibraryEntry %1 + + + Unknown property for Property %1 + Propriété inconnue pour Property %1 + + + Unknown property for QmlSource %1 + Propriété inconnue pour QmlSource %1 + + + Unknown property for ExtraFile %1 + Propriété inconnue pour ExtraFile %1 + + QmlDesigner::ItemLibraryAssetImportDialog @@ -8700,8 +9427,8 @@ Les composants verrouillés ne peuvent être ni modifiés ni sélectionnés.Présentations Qt 3D Studio - Effect Maker Files - Fichiers Effect Maker + Effect Composer Files + Fichiers de compositeur d'effet @@ -8755,12 +9482,16 @@ Les composants verrouillés ne peuvent être ni modifiés ni sélectionnés. vers - Remove This Handler - Supprimer ce gestionnaire + Edit the Connection + Modifier la connexion - Add Signal Handler - Ajouter un gestionnaire de signaux + Remove the Connection + Supprimer la connexion + + + Add new Connection + Ajouter une nouvelle connexion Connect: %1 @@ -8866,6 +9597,10 @@ Les composants verrouillés ne peuvent être ni modifiés ni sélectionnés.Apply Formatting Appliquer le formattage + + Jump to the Code + Aller au code + Merge with Template Fusionner avec le modèle @@ -9249,6 +9984,10 @@ Les composants verrouillés ne peuvent être ni modifiés ni sélectionnés.Pin Group To... Épingler le groupe à… + + Minimize + Minimiser + Close Other Groups Fermer les autres groupes @@ -9814,6 +10553,26 @@ Annulation des opérations en cours… Certificate alias: Alias de certificat : + + The selected path does not exist or is not readable. + Le chemin sélectionné n'existe pas ou n'est pas lisible. + + + Could not find "%1" in the selected path. + Impossible de trouver « %1 » dans le chemin sélectionné. + + + The selected path does not contain a valid JDK. (%1 failed: %2) + Le chemin sélectionné ne contient aucun JDK valide. (%1 échoué : %2) + + + Unexpected output from "%1": %2 + Sortie inattendue de « %1 » : %2 + + + Unsupported JDK version (needs to be %1): %2 (parsed: %3) + Version de JDK non supportée (doit être %1) : %2 (analysé : %3) + Android Configuration Configuration Android @@ -11349,6 +12108,129 @@ le fichier manifeste et d'écraser vos paramètres. Accepter l'écrase Images + + QtC::AppManager + + Create Application Manager package with CMake + Créer un paquet Application Manager avec CMake + + + Create Application Manager package + Créer un paquet Application Manager + + + Source directory: + Répertoire source : + + + Package file: + Fichier paquet : + + + Automatic Application Manager Deploy Configuration + Configuration de déploiement automatique de l'Application Manager + + + Deploy Application Manager package + Déployer le paquet Application Manager + + + Target directory: + Répertoire cible : + + + Uploading finished. + Envoi terminé. + + + Uploading failed. + Envoi échoué. + + + Install Application Manager package + Installer le paquet Application Manager + + + Starting command "%1". + Lancement de la commande « %1 ». + + + Command finished successfully. + Commande terminée avec succès. + + + Process failed: %1 + Échec du processus : %1 + + + Process finished with exit code %1. + Processus terminé avec le code %1. + + + Run an Application Manager Package + Exécuter le paquet Application Manager + + + Run and Debug an Application Manager Package + Exécuter et déboguer le paquet Application Manager + + + Clean Environment + Nettoyer l'environnement + + + %1 exited. + %1 terminé. + + + Starting Application Manager debugging... + Démarrage du débogage de l'Application Manager… + + + Using: %1. + En utilisant : %1. + + + Cannot debug: Only QML and native applications are supported. + Impossible de déboguer : seules les applications QML ou natives sont prises en charge. + + + Cannot debug: Local executable is not set. + Impossible de déboguer : l'exécutable local n'est pas défini. + + + Application ID: + ID de l'application : + + + Application Manager instance ID: + ID de l'instance Application Manager : + + + Default instance + Instance par défaut + + + Document URL: + URL du document : + + + Customize step + Étape personnalisée + + + Disables the automatic updates based on the current run configuration and allows customizing the values. + Désactive les mises à jour automatiques reposant sur la configuration d'exécution actuelle et permet la personnalisation des valeurs. + + + Controller: + Contrôleur : + + + Packager: + Empaqueteur : + + QtC::Autotest @@ -12098,6 +12980,14 @@ Voir la documentation de Google Test pour plus d'informations sur les filtr Search for Qt Quick tests that are derived from TestCase.<p>Warning: Enabling this feature significantly increases scan time. Recherche des tests Qt Quick dérivé de TestCase.<p>Avertissement : l'activation de cette fonctionnalité augmente significativement le temps de recherche. + + Find user-defined locations + Trouver les emplacements définis par l'utilisateur + + + Parse messages for the following pattern and use it as location information:<pre>file://filepath:line</pre>where ":line" is optional.<p>Warning: If the patterns are used in code, the location information for debug messages and other messages might improve,at the risk of some incorrect locations and lower performance. + Analyser les messages avec le motif suivant et les utiliser comme information d'emplacement : <pre>fichier://chemin:ligne</pre> où « :ligne » est facultatif. <p>Avertissement : si le motif est utilisé dans le code, l'information d'emplacement pour les messages de débogage ou les autres messages peut être amélioré, au risque d'obtenir des emplacements incorrects ou une performance moindre. + Benchmark Metrics Métriques du benchmark @@ -12643,6 +13533,14 @@ Avertissement : fonctionnalité expérimentale pouvant entraîner un échec Running tests for "%1". Exécution des tests pour « %1 ». + + Locate Qt Test data tags + Trouver les étiquettes des données Qt Test + + + Locates Qt Test data tags found inside the active project. + Trouver les étiquettes des données Qt Test depuis le projet actif. + QtC::AutotoolsProjectManager @@ -12690,6 +13588,188 @@ Avertissement : fonctionnalité expérimentale pouvant entraîner un échec Analyse du répertoire %1 + + QtC::Axivion + + Project: + Projet : + + + Lines of code: + Lignes de code : + + + Analysis timestamp: + Analyse des horodatages : + + + unknown + inconnu + + + Total: + Total : + + + Owner + Propriétaire + + + Path globbing + globbing? + Motif de chemin + + + Total rows: + Nombre de lignes totales : + + + Show dashboard + Afficher le tableau de bord + + + Search for issues + Recherche des problèmes + + + Axivion + Axivion + + + Show rule details + Afficher le détail de la règle + + + Dashboard projects: + Projets de tableau de bord : + + + Fetch Projects + Récupérer les projets + + + Link Project + Lier le projet + + + Unlink Project + Délier le projet + + + This project is not linked to a dashboard project. + Ce projet n'est pas lié à un projet de tableau de bord. + + + This project is linked to "%1". + Ce projet est lié à « %1 ». + + + Incomplete or misconfigured settings. + Paramètres incomplets ou mal configurés. + + + Certificate Error + Erreur de certificat + + + Server certificate for %1 cannot be authenticated. +Do you want to disable SSL verification for this server? +Note: This can expose you to man-in-the-middle attack. + Le certificat du serveur %1 ne peut pas être authentifié. +Voulez-vous désactiver la vérification SSL pour ce serveur ? +Remarque : cela peut vous exposer à une attaque de type « homme du milieu ». + + + Unknown Dto structure deserialization error. + Erreur inconnue d'analyse de structure Dto. + + + The ApiToken cannot be read in a secure way. + Le jeton d'API ne peut être lu de manière sécurisée. + + + The ApiToken cannot be stored in a secure way. + Le jeton d'API ne peut être stocké de manière sécurisée. + + + The ApiToken cannot be deleted in a secure way. + Le jeton d'API ne peut être supprimé de manière sécurisée. + + + Key chain message: "%1". + Message du porte-clés « %1 ». + + + Enter the password for: +Dashboard: %1 +User: %2 + Saisir le mot de passe pour : +Tableau de bord : %1 +Utilisateur : %2 + + + Axivion Server Password + Mot de passe du serveur Axivion + + + The stored ApiToken is not valid anymore, removing it. + Le jeton d'API stocké n'est plus valide et va être supprimé. + + + Fetching DashboardInfo error. + Erreur de récupération des informations du tableau de bord. + + + The DashboardInfo doesn't contain project "%1". + Les informations du tableau de bord ne contiennent pas le projet « %1 ». + + + The activated link appears to be external. +Do you want to open "%1" with its default application? + Le lien activé semble être externe. +Souhaitez-vous ouvrir « %1 » avec l'application par défaut ? + + + Open External Links + Ouvrir les liens externes + + + Dashboard URL: + URL du tableau de bord : + + + Highlight marks + Mise en avant des problèmes + + + Marks issues on the scroll bar. + Affiche les problèmes dans la barre de défilement. + + + Username: + Nom d'utilisateur : + + + User name + Nom d'utilisateur + + + Edit... + Modifier… + + + Edit Dashboard Configuration + Modifier la configuration du tableau de bord + + + General + Général + + + Fetching... + Récupération… + + QtC::BareMetal @@ -14874,22 +15954,6 @@ Par exemple, « Revision : 15 » laissera la branche à la révis Configuring "%1" Configuration de « %1 » - - CMake process failed to start. - Échec de démarrage du processus CMake. - - - CMake process was canceled by the user. - Le processus CMake a été annulé par l’utilisateur. - - - CMake process crashed. - Le processus CMake a planté. - - - CMake process exited with exit code %1. - Le processus CMake s’est terminé avec le code %1. - No cmake tool set. Pas d’ensemble d'outils cmake. @@ -15087,6 +16151,14 @@ Par exemple, « Revision : 15 » laissera la branche à la révis Show advanced options by default Afficher les options avancées par défaut + + Use junctions for CMake configuration and build operations + Utiliser les embranchements lors des opérations CMake de configuration et de construction + + + Create and use junctions for the source and build directories to overcome issues with long paths on Windows.<br><br>Junctions are stored under <tt>C:\ProgramData\QtCreator\Links</tt> (overridable via the <tt>QTC_CMAKE_JUNCTIONS_DIR</tt> environment variable).<br><br>With <tt>QTC_CMAKE_JUNCTIONS_HASH_LENGTH</tt>, you can shorten the MD5 hash key length to a value smaller than the default length value of 32.<br><br>Junctions are used for CMake configure, build and install operations. + Créer et utiliser les embranchements pour les répertoires source et de compilation afin d'éviter les problèmes avec les chemins longs sous Windows. <br><br>Les embranchements sont stockés dans <tt>C:\ProgramData\QtCreator\Links</tt> (modifiable à travers la variable d'environnement <tt>QTC_CMAKE_JUNCTIONS_DIR</tt>). <br><br>Avec <tt>QTC_CMAKE_JUNCTIONS_HASH_LENGTH</tt>, vous pouvez réduire la longueur de la clé de hashage MD5 à une taille inférieure à la taille de 32 utilisée par défaut. <br><br>Les embranchements sont utilisées par CMake lors des opérations de configuration, de compilation et d'installation. + General Général @@ -15625,6 +16697,10 @@ Assurez-vous que la variable CMAKE_BUILD_TYPE contient le champ « Build ty C++ code issues that Clangd found in the current document. Problèmes de code C++ trouvés par Clangd dans le document actuel. + + Update Potentially Stale Clangd Index Entries + Mettre à jour les entrées d'index Clangd potentiellement obsolètes + Generate Compilation Database Générer la base de données de compilation @@ -15821,6 +16897,10 @@ Assurez-vous que la variable CMAKE_BUILD_TYPE contient le champ « Build ty Clang-Tidy and Clazy use a customized Clang executable from the Clang project to search for diagnostics. Clang-Tidy et Clazy utilisent un exécutable Clang personnalisé issu du projet Clang pour rechercher des diagnostics. + + Diagnostics + Diagnostiques + Release Release @@ -16595,10 +17675,6 @@ Définissez d’abord un exécutable valide. Undo Check Out Annuler l’exportation - - &Undo Check Out "%1" - &Annuler l’exportation « %1 » - Meta+L,Meta+U Meta+L, Meta+U @@ -17615,10 +18691,6 @@ Sinon, vous devez spécifier le chemin menant au fichier %2 dans le plug-in Copi Pin Épingler - - Alternative Close - Fermeture alternative - Split Scinder @@ -17888,6 +18960,16 @@ Poursuivre ? off non + + Override cursors for views + Remplacer les curseurs pour les vues + + + Provide cursors for resizing views. +If the system cursors for resizing views are not displayed properly, you can use the cursors provided by %1. + Fournit des curseurs lors du redimensionnement des vues. +Si les curseurs de redimensionnement des vues du système ne s'affichent pas correctement, vous pouvez utiliser les curseurs fournis par %1. + Round Up for .5 and Above Arrondir pour .5 et plus @@ -17912,10 +18994,22 @@ Poursuivre ? DPI rounding policy: Politique d'arrondi du DPI : + + The following environment variables are set and can influence the UI scaling behavior of %1: + Les variables d'environnement suivantes sont définies et peuvent influencer le comportement de mise à l'échelle de l'IU de %1 : + + + Environment influences UI scaling behavior. + L'environnement influence le comportement de mise à l'échelle de l'IU. + <System Language> <Langue du système> + + The cursors for resizing views will change after restart. + Les curseurs utilisés lors du redimensionnement des vues seront pris en compte après un redémarrage. + The language change will take effect after restart. Le changement de langue prend effet après le redémarrage. @@ -18297,10 +19391,6 @@ provided they were unmodified before the refactoring. Hide Menu Bar Cacher la barre de menu - - This will hide the menu bar completely. You can show it again by typing %1. - Cette option cache complètement la barre de menu. Vous pouvez la ré-afficher en appuyant sur %1. - About &%1 À propos de &%1 @@ -18413,6 +19503,10 @@ provided they were unmodified before the refactoring. Ctrl+Meta+F Ctrl+Meta+F + + This will hide the menu bar completely. You can show it again by typing %1.<br><br>Or, trigger the "%2" action from the "%3" locator filter (%4). + Cela cachera complètement la barre de menu. Vous pouvez l'afficher à nouveau en pressant %1. <br><br>ou en déclenchant l'action « %2 » à partir du filtre « %3 » du localisateur (%4). + &Views &Vues @@ -18697,11 +19791,6 @@ provided they were unmodified before the refactoring. Plugin changes will take effect after restart. Les modifications apportées au greffon prendront effet après le redémarrage. - - Plugin Details of %1 - Détail sur le greffon %1 ? - Détails du greffon %1 - Plugin Errors of %1 Erreurs du greffon %1 @@ -18974,6 +20063,10 @@ provided they were unmodified before the refactoring. Expand All Tout développer + + Show Paths in Relation to Active Project + Afficher les chemins en lien avec le projet actif + Filter Results Filtrer les résultats @@ -18986,6 +20079,10 @@ provided they were unmodified before the refactoring. Collapse All Tout réduire + + Show Full Paths + Afficher les chemins complets + History: Historique : @@ -19162,6 +20259,14 @@ To do this, you type this shortcut and a space in the Locator entry field, and t Create Créer + + Cannot Create File + Impossible de créer le fichier + + + Cannot create file "%1". + Impossible de créer le fichier « %1 ». + Create Directory Créer répertoire @@ -20345,14 +21450,6 @@ Souhaitez-vous les importer maintenant ? msgShowOptionsDialogToolTip (non-mac version) Ouvrir la fenêtre Options. - - (%1) - (%1) - - - %1 %2%3 - %1 %2%3 - Based on Qt %1 (%2, %3) Fondé sur Qt %1 (%2, %3) @@ -20405,6 +21502,14 @@ Souhaitez-vous les importer maintenant ? Triggers an action. If it is from the menu it matches any part of a menu hierarchy, separated by ">". For example "sess def" matches "File > Sessions > Default". Déclenche une action. Si elle provient du menu, elle correspond à n’importe quelle partie d’une hiérarchie de menu, séparée par « > ». Par exemple, « sess def » correspond à « Fichier > Sessions > Défaut ». + + Proxy Authentication Required + Authentification requise pour le proxy + + + Do not ask again. + Ne plus demander. + No themes found in installation. Aucun thème n’a été trouvé dans l’installation. @@ -20485,6 +21590,10 @@ Souhaitez-vous les importer maintenant ? A comment. Un commentaire. + + Convert string to pure ASCII. + Impossible de convertir la chaîne de caractères en pur ASCII. + %1 > %2 Preferences... Préférences %1 > %2… @@ -20911,6 +22020,10 @@ Double-cliquez pour modifier l’élément. About %1 À propos de %1 + + Copy and Close + Copier et fermer + <br/>From revision %1<br/> <br/>À partir de la révision %1<br/> @@ -21074,6 +22187,10 @@ Le modèle de code intégré gèrera le surlignage, la complétion, etc.Insert header files on completion Insérer les fichiers d’en-tête dans la complétion + + Automatic + Automatique + Ignore files greater than Ignorer les fichiers plus grands que @@ -21492,6 +22609,10 @@ devraient être gérés par le même processus clangd, ajoutez-les ici.Move All Function Definitions to %1 Déplacer toutes les définitions de fonction vers %1 + + Move Definition Here + Déplacer la définition ici + Assign to Local Variable Affecter à la variable locale @@ -22224,6 +23345,10 @@ These prefixes are used in addition to current file name on Switch Header/Source Ces préfixes sont utilisés en complément au répertoire actuel pour basculer entre les fichiers d’en-tête et de source. + + Headers + En-têtes + &Prefixes: &Préfixes : @@ -22232,6 +23357,10 @@ Ces préfixes sont utilisés en complément au répertoire actuel pour basculer Include guards Garde-fous + + Sources + Sources + P&refixes: Pré&fixes : @@ -26101,28 +27230,24 @@ Voulez-vous réessayer ? <a href="qthelp://org.qt-project.qtcreator/doc/creator-debugging-qml.html">Quels sont les prérequis ?</a> - Enable C++ debugger. - Activer le débogueur C++. + Enable %1 debugger. + Activer le débogueur %1. - Try to determine need for C++ debugger. - Essaie de déterminer le besoin d'un débogueur C++. + Disable %1 debugger. + Désactiver le débogueur %1. - Enable QML debugger. - Active le débogueur QML. + Try to determine need for %1 debugger. + Essayer de déterminer si le débogueur %1 est nécessaire. - Try to determine need for QML debugger. - Essaie de déterminer le besoin d'un débogueur QML. + No additional startup commands. + Aucune commande de démarrage additionnelle. - Without additional startup commands. - Sans commandes de démarrage supplémentaires. - - - With additional startup commands. - Avec commandes de démarrage supplémentaires. + Use additional startup commands. + Utiliser une commande de démarrage additionnelle. C++ debugger: @@ -26132,6 +27257,10 @@ Voulez-vous réessayer ? QML debugger: Débogueur QML : + + Python debugger: + Débogueur Python : + Enable Debugging of Subprocesses Activer le débogage des sous-processus @@ -26971,6 +28100,10 @@ L’accès au module ou la mise en place de points d’arrêt par fichier et par Time Temps + + %1 of length %2 + %1 d'une longueur %2 + Enter an expression to evaluate. Saisir une expression à évaluer. @@ -28471,6 +29604,85 @@ La recompilation du projet peut aider. Défiler jusqu’à la moitié de l’écran vers le haut + + QtC::ExtensionManager + + Extensions + Extensions + + + Get started + Démarrer + + + Install the extension from above. Installation starts automatically. You can always uninstall the extension afterwards. + Installer l'extension depuis l'emplacement ci-dessus. L'installation démarre automatiquement. Vous pourrez toujours désinstaller l'extension plus tard. + + + More information + Plus d'informations + + + Online Documentation + Documentation en ligne + + + Tutorials + Tutoriels + + + Examples + Exemples + + + Extension library details + Détails de la bibliothèque d'extensions + + + Size + Taille + + + Version + Version + + + Location + Emplacement + + + Extension details + Détails de l'extension + + + Released + Publiée + + + Related tags + Étiquettes connexes + + + Platforms + Plateformes + + + Dependencies + Dépendances + + + Extensions in pack + Extensions dans le paquet + + + Manage Extensions + Gérer les extensions + + + Install... + Installer… + + QtC::ExtensionSystem @@ -28510,6 +29722,10 @@ La recompilation du projet peut aider. %1 (current: "%2") %1 (actuel : « %2 ») + + Plugin Details of %1 + Détails du greffon %1 + Group: Groupe : @@ -28567,8 +29783,14 @@ La recompilation du projet peut aider. Error message: Message d’erreur : + + %1 (deprecated) + %1 is a plugin name + %1 (déprécié) + %1 (experimental) + %1 is a plugin name %1 (expérimental) @@ -28691,6 +29913,10 @@ désactivera également les greffons suivants : Deleted Supprimé + + Multiple versions of the same plugin have been found. + Plusieurs versions du même greffon ont été trouvées. + Circular dependency detected: Dépendance circulaire détectée : @@ -28867,6 +30093,10 @@ Raison : %3 Utilities Utilitaires + + Details + Détails + The following plugins have errors and cannot be loaded: Les chemins suivant contiennent des erreurs et ne peuvent être chargés : @@ -30731,10 +31961,6 @@ Valider maintenant ? Meta+G,Meta+D Meta+G, Meta+D - - Git Blame - Git Blame - &Copy "%1" &Copier « %1 » @@ -30896,10 +32122,6 @@ Valider maintenant ? Archive... Archiver… - - You - Vous - Unable to Retrieve File List Impossible d’accéder à la liste des fichiers @@ -30937,11 +32159,6 @@ Valider maintenant ? Meta+G,Meta+C Meta+G, Meta+C - - <b>Note:</b> "%1" or "%2" is enabled in the instant blame settings. - %1 and %2 are the "ignore whitespace changes" and "ignore line moves" options - <b>Remarque :</b> les options « %1 » ou « %2 » sont actives dans les paramètres de blame instantané. - &Subversion &Subversion @@ -31107,6 +32324,10 @@ Valider maintenant ? Pull with rebase Utiliser « pull » avec « rebase » + + Git command: + Commande Git : + Set "HOME" environment variable Définir la variable d’environnement « HOME » @@ -31568,14 +32789,6 @@ Souhaitez-vous y mettre fin ? Gerrit Gerrit - - Error running %1: %2 - Erreur lors de l’exécution de %1 : %2 - - - %1 crashed. - %1 a planté. - (Draft) (brouillon) @@ -31584,10 +32797,6 @@ Souhaitez-vous y mettre fin ? Querying Gerrit Interrogation de Gerrit - - %1 returned %2. - %1 a retourné %2. - Timeout Délai d’attente @@ -33577,6 +34786,18 @@ Erreur : %2 Deployment failed. The settings in the Devices window of Xcode might be incorrect. Déploiement échoué. Les paramètres dans la fenêtre Xcode des périphériques doivent être incorrects. + + Deployment canceled. + Déploiement annulé. + + + Failed to run devicectl: %1. + Échec de l'exécution de la commande devicectl : %1. + + + devicectl returned unexpected output ... deployment might have failed. + devicectl a renvoyé une sortie inattendue… le déploiement peut avoir échoué. + The provisioning profile "%1" (%2) used to sign the application does not cover the device %3 (%4). Deployment to it will fail. Le profil d'approvisionnement « %1 » (%2) utilisé pour signer l'application ne concerne pas le périphérique %3 (%4). Le déploiement va échouer. @@ -33699,6 +34920,10 @@ Erreur : %2 %1 is not connected. %1 n'est pas connecté. + + Debugging and profiling is currently not supported for devices with iOS 17 and later. + Le débogage et le profilage n'est actuellement pas pris en charge avec les périphériques iOS 17 et supérieur. + Starting remote process. Démarrage des processus distants. @@ -33707,6 +34932,26 @@ Erreur : %2 Could not find %1. Impossible de trouver %1. + + Running failed. No iOS device found. + Échec lors de l'exécution. Aucun périphérique iOS n'a été trouvé. + + + Running canceled. + Exécution de la commande annulée. + + + "%1" exited. + « %1 » s'est terminé. + + + Failed to determine bundle identifier. + Échec lors de la détermination de l'identifiant de bundle. + + + Running "%1" on %2... + Exécution de « %1 » sur %2… + Could not get necessary ports for the debugger connection. Impossible de récupérer les ports nécessaires à la connexion de débogage. @@ -34000,6 +35245,22 @@ Erreur : %5 Failed to convert inferior pid. (%1) Échec pour convertir le pid du processus à déboguer. (%1) + + Failed to parse devicectl output: %1. + Échec lors de l'analyse de la sortie de devicectl : %1. + + + Operation failed: %1 + Échec de l'opération : %1 + + + Failed to parse devicectl output: "result" is missing. + Échec lors de l'analyse de la sortie : « result » est manquant. + + + devicectl returned unexpected output ... running failed. + La commande devicectl a renvoyé une sortie inattendue… exécution échouée. + QtC::LanguageClient @@ -34298,10 +35559,54 @@ Voir la documentation spécifique au serveur de langage pour la liste des param Manage... Gérer… + + Install npm Package + Installer le paquet npm + + + Running "%1" to install %2. + Exécution de « %1 » pour installer %2. + + + The installation of "%1" was canceled by timeout. + L'installation de « %1 » a été annulée à cause d'un dépassement de délai. + + + The installation of "%1" was canceled by the user. + L'installation de « %1 » a été annulée par l'utilisateur. + + + Installing "%1" failed with exit code %2. + L'installation de « %1 » a échoué avec le code de sortie %2. + + + Install %1 language server via npm. + Installer le serveur de langage %1 via npm. + + + Setup %1 language server (%2). + Configurer le serveur de langage %1 (%2). + + + Install + Installer + + + Setup + Configurer + + + %1 Language Server + Serveur de langage %1 + Expand All Tout développer + + Collapse All + Tout réduire + Capabilities: Capacités : @@ -34905,6 +36210,14 @@ Voir la documentation spécifique au serveur de langage pour la liste des param Create Kits for Qt for MCUs Créer des kits Qt pour MCUs + + Read about Using QtMCUs in the Qt Design Studio + Lire à propos de l'utilisation de Qt MCU dans Qt Design Studio + + + Go to the Documentation + Aller à la documentation + Create new kits Créer de nouveaux kits @@ -36716,12 +38029,9 @@ Vous pouvez trouver des explications supplémentaires dans la vue « Sortie Liste des changements p4 %1 - Could not start perforce "%1". Please check your settings in the preferences. - Impossible de démarrer perforce « %1 ». Veuillez vérifier les réglages dans les préférences. - - - Perforce did not respond within timeout limit (%1 s). - Perforce n’a pas répondu dans le temps imparti (%1 ms). + Error running "where" on %1: The file is not mapped. + Failed to run p4 "where" to resolve a Perforce file name to a local file system name. + Échec lors de l'exécution « where » sur %1. Le fichier n'a pas de correspondance. p4 revert @@ -36775,23 +38085,6 @@ Vous pouvez trouver des explications supplémentaires dans la vue « Sortie Cannot submit: %1. Impossible de soumettre : %1. - - p4 submit failed: %1 - Échec de la soumission p4 : %1 - - - Error running "where" on %1: %2 - Failed to run p4 "where" to resolve a Perforce file name to a local file system name. - Erreur lors de l’exécution de « where » sur %1 : %2 - - - The file is not mapped - File is not managed by Perforce - Ce fichier n’est pas "mappé" ? -pierre: oups bien vu j'avais traduit le commentaire ! :D nouvelle suggestion... -francis : voila une nouvelle suggestion :) - Le fichier n’est pas référencé - Perforce repository: %1 Dépôt perforce : %1 @@ -36800,14 +38093,6 @@ francis : voila une nouvelle suggestion :) Perforce: Unable to determine the repository: %1 Perforce : impossible de déterminer le dépôt : %1 - - The process terminated with exit code %1. - Le processus s’est terminé avec le code de sortie %1. - - - The process terminated abnormally. - Le processus s’est terminé de façon anormale. - Perforce is not correctly configured. Perforce n’est pas configuré correctement. @@ -36999,10 +38284,6 @@ francis : voila une nouvelle suggestion :) Override MAKEFLAGS Écraser MAKEFLAGS - - <code>MAKEFLAGS</code> specifies parallel jobs. Check "%1" to override. - <code>MAKEFLAGS</code> spécifie les jobs parallèles. Cocher « %1 » pour l’ignorer. - Disable in subdirectories: Désactiver dans les sous-répertoires : @@ -37039,6 +38320,18 @@ francis : voila une nouvelle suggestion :) <b>Make:</b> %1 not found in the environment. <b>Make :</b> %1 non trouvé dans l’environnement. + + Overriding <code>MAKEFLAGS</code> environment variable. + Écrasement de la variable d'environnement <code>MAKEFLAGS</code>. + + + <code>MAKEFLAGS</code> specifies a conflicting job count. + <code>MAKEFLAGS</code> spécifie un nombre de jobs conflictuel. + + + No conflict with <code>MAKEFLAGS</code> environment variable. + Aucun conflit avec la variable d'environnement <code>MAKEFLAGS</code>. + Configuration is faulty. Check the Issues view for details. La configuration est défectueuse, veuillez vérifier la vue des problèmes pour les détails. @@ -37163,10 +38456,6 @@ francis : voila une nouvelle suggestion :) Choose Directory Sélectionner un répertoire - - Variable already exists. - La variable existe déjà. - Ed&it &Modifier @@ -37191,10 +38480,6 @@ francis : voila une nouvelle suggestion :) Prepend Path... Préfixer le chemin… - - &Batch Edit... - Modifier par &lots… - Open &Terminal Ouvrir un &terminal @@ -38251,6 +39536,14 @@ Renommer quand même %2 en %3 ? Runs a run configuration of the active project. Exécuter une configuration d'exécution du projet actif. + + Debug Run Configuration + Déboguer la configuration d'exécution + + + Starts debugging a run configuration of the active project. + Démarre le débogage d'une configuration d'exécution pour le projet actif. + Switch Run Configuration Changer la configuration d’exécution @@ -38481,6 +39774,14 @@ Renommer quand même %2 en %3 ? Start build processes with low priority Démarrer les processus de compilation avec une faible priorité + + Warn against build directories with spaces or non-ASCII characters + Avertit à propos des répertoires de compilation contenant des espaces ou des caractères non ASCII + + + Some legacy build tools do not deal well with paths that contain "special" characters such as spaces, potentially resulting in spurious build errors.<p>Uncheck this option if you do not work with such tools. + Certains outils de compilation ne gèrent pas correctement les chemins contenant des caractères « spéciaux » tels que les espaces, provoquant ainsi de fausses erreurs de compilation. <p>Décochez cette option si vous ne travaillez pas avec de tels outils. + Do Not Build Anything Ne rien compiler @@ -38521,6 +39822,14 @@ Renommer quand même %2 en %3 ? Deduced from Project Déduit du projet + + Environment changes to apply to run configurations, but not build configurations. + Changements de l'environnement à appliquer aux configurations d'exécution, mais pas aux configurations de compilation. + + + Application environment: + Environnement de l'application : + Closing Projects Fermeture des projets @@ -38589,6 +39898,10 @@ Renommer quand même %2 en %3 ? Cannot retrieve debugging output. Impossible d’obtenir la sortie du débogage. + + Remote process did not finish in time. Connectivity lost? + Le processus distant ne s'est pas terminé dans le délai imparti. Connexion perdue ? + Cannot run: No command given. Exécution impossible : aucune commande n’a été donnée. @@ -38653,6 +39966,43 @@ Renommer quand même %2 en %3 ? Show Non-matching Lines Afficher les lignes non concordantes + + The project was configured for kits that no longer exist. Select one of the following options in the context menu to restore the project's settings: + Le projet a été configuré pour des kits n'existant plus. Sélectionnez l'une des options suivantes du menu contextuel pour restaurer les paramètres du projet : + + + Create a new kit with the same name for the same device type, with the original build, deploy, and run steps. Other kit settings are not restored. + Créer un nouveau kit avec le même nom et pour le même type de périphérique, avec les étapes de compilation, de déploiement et d'exécution originales. Les autres paramètres du kit ne seront pas restaurés. + + + Copy the build, deploy, and run steps to another kit. + Copier les étapes de compilation, de déploiement et d'exécution vers un autre kit. + + + %1 (%2) + vanished target display role: vanished target name (device type name) + %1 (%2) + + + Create a New Kit + Créer un nouveau kit + + + Copy Steps to Another Kit + Copier les étapes vers un autre kit + + + Remove Vanished Target "%1" + Supprimer la cible manquante « %1 » + + + Remove All Vanished Targets + Supprimer toutes les cibles manquantes + + + Vanished Targets + Cibles manquantes + Project Settings Paramètres du projet @@ -40214,16 +41564,8 @@ The name of the build configuration created by default for a generic project.Sélectionner le répertoire racine - Replacement for - Remplacement de - - - Replacement for "%1" - Remplacement de « %1 » - - - Project "%1" was configured for kit "%2" with id %3, which does not exist anymore. The new kit "%4" was created in its place, in an attempt not to lose custom project settings. - Le projet « %1 » a été configuré pour le kit « %2 » avec l’identifiant %3, qui n’existe plus. Le nouveau kit « %4 » a été créé à sa place, afin de ne pas perdre les paramètres personnalisés du projet. + Project "%1" was configured for kit "%2" with id %3, which does not exist anymore. You can create a new kit or copy the steps of the vanished kit to another kit in %4 mode. + Le projet « %1 » a été configuré pour le kit « %2 » avec l'identifiant %3, mais n'existe plus. Vous pouvez créer un nouveau kit ou copier les étapes du kit manquant vers un autre kit dans le mode %4. Could not find any qml_*.qm file at "%1" @@ -41787,6 +43129,14 @@ Activez cette option si vous envisagez de créer des binaires x86 32 bits sans u Shadow build: Shadow build : + + Build directory contains potentially problematic character "%1". + Le répertoire de compilation contient des caractères potentiellement problématiques « %1 ». + + + This warning can be suppressed <a href="dummy">here</a>. + Cet avertissement peut être supprimé <a href="dummy">ici</a>. + Separate debug info: Séparer les informations de débogage : @@ -42256,6 +43606,12 @@ au projet « %2 ». * Version %1 not supported. * La version %1 n’est pas prise en charge. + + + + * Failed to create: %1 + + * Impossible de créer : %1 @@ -42574,10 +43930,6 @@ Que doit faire %1 maintenant ? Enter the path to the executable Entrez le chemin de l'exécutable - - Interpreter: - Interpréteur : - Executable: Exécutable : @@ -42813,12 +44165,20 @@ Ces fichiers sont préservés. Sélectionnez la version de PySide - Select which PySide version to install: - Sélectionnez la version de PySide à installer : + Installing PySide + Installation de PySide - Latest PySide from the Python Package Index - Dernière version de PySide connue dans l'index de paquets Python + You can install PySide from PyPi (Community OSS version) or from your Qt installation location, if you are using the Qt Installer and have a commercial license. + Vous pouvez installer PySide depuis PyPI (version OSS communautaire) ou depuis votre installation de Qt, si vous utilisez l'installateur Qt et que vous avez une licence commerciale. + + + Select which version to install: + Sélectionner la version à installer : + + + Latest PySide from the PyPI + Dernière version de PySide depuis PyPI PySide %1 Wheel (%2) @@ -42849,8 +44209,28 @@ Ces fichiers sont préservés. Saisir l’emplacement de l’outil de projet PySide. - General - Général + PySide uic tool: + Outil uic de PySide : + + + Enter location of PySide uic tool. + Entrer l'emplacement de l'outil uic de PySide. + + + Effective venv: + venv actif : + + + New Virtual Environment + Nouvel environnement virtuel + + + Global Python + Installation de Python globale + + + Virtual Environment + Environnement virtuel REPL @@ -42956,6 +44336,10 @@ Ces fichiers sont préservés. &Make Default &Rendre par défaut + + &Generate Kit + &Générer un kit + &Clean Up &Nettoyer @@ -42984,11 +44368,6 @@ Ces fichiers sont préservés. For a complete list of available options, consult the [Python LSP Server configuration documentation](%1). Pour une liste complète des options disponibles, consultez la [documentation de la configuration du serveur Python LSP](%1). - - %1 (Windowed) - <python display name> (Windowed) - %1 (fenêtré) - Python interpreter: Interpréteur Python : @@ -43045,18 +44424,50 @@ Ces fichiers sont préservés. PySide version: Version de PySide : - - Create new virtual environment - Créer un nouvel environnement virtuel - - - Path to virtual environment: - Chemin de l'environnement virtuel : - Issues parsed from Python runtime output. Problèmes provenant de la sortie de l'exécution de Python. + + None + Aucun + + + The interpreter used for Python based projects. + L'interpréteur utilisé pour les projets reposant sur Python. + + + No Python setup. + Aucun interpréteur Python n'est configuré. + + + Python "%1" not found. + Python « %1 » introuvable. + + + Python "%1" is not executable. + Python « %1 » n'est pas un exécutable. + + + Python "%1" does not contain a usable pip. pip is needed to install Python packages from the Python Package Index, like PySide and the Python language server. To use any of that functionality ensure that pip is installed for that Python. + Python « %1 » ne contient pas de pip utilisable. pip est nécessaire pour installer les paquets Python, tels que PySide et le serveur de langage Python, depuis l'index des paquets Python. Pour utiliser l'une de ces fonctionnalités, assurez vous que pip est installé pour cette version de Python. + + + Python "%1" does not contain a usable venv. venv is the recommended way to isolate a development environment for a project from the globally installed Python. + Python « %1 » ne contient pas de venv utilisable. venv est la méthode recommendée pour isoler l'environnement de développement d'un projet de l'instance Python globale. + + + Name of Python Interpreter + Nom de l'interpréteur Python + + + Path to Python Interpreter + Chemin de l'interpréteur Python + + + No Python interpreter set for kit "%1" + Aucun interpréteur Python n'est défini pour le kit « %1 » + QtC::QbsProjectManager @@ -43424,6 +44835,10 @@ Les fichiers affectés sont : General Général + + Qbs Editor + Éditeur Qbs + QtC::Qdb @@ -46835,6 +48250,14 @@ Qt Design Studio nécessite un projet fondé sur .qmlproject pour ouvrir le fich Build directory: Répertoire de compilation : + + The Selected Kit Is Not Supported + Le kit sélectionné n'est pas pris en charge + + + You cannot use the selected kit to preview Qt for MCUs applications. + Vous ne pouvez pas utiliser le kit sélectionné pour prévisualiser les applications Qt pour MCU. + Failed to find valid Qt for MCUs kit Impossible de trouver un kit Qt pour MCUs valide @@ -47051,10 +48474,6 @@ Le déploiement vers ce répertoire entrainera la suppression des fichiers déj Local file "%1" does not exist. Le fichier local « %1 » n'existe pas. - - Remote chmod failed for file "%1": %2 - La commande chmod à distance a échoué pour le fichier « %1 » : %2 - No device configuration set. Aucune configuration du périphérique définie. @@ -47220,6 +48639,10 @@ Le déploiement vers ce répertoire entrainera la suppression des fichiers déj Qt %{Qt:Version} (%2) Qt %{Qt:Version} (%2) + + (on %1) + (sur %1) + Device type is not supported by Qt version. Le type de périphérique n’est pas pris en charge par la version de Qt. @@ -47725,8 +49148,12 @@ Le déploiement vers ce répertoire entrainera la suppression des fichiers déj Chemin complet menant au répertoire libexect de la version de Qt dans le kit actif du projet actif. - If you plan to provide translations for your project's user interface via the Qt Linguist tool, please select a language here. A corresponding translation (.ts) file will be generated for you. - Si vous prévoyez de fournir des traductions pour l’interface utilisateur de votre projet via l’outil Qt Linguist, veuillez sélectionner une langue ici. Un fichier de traduction (.ts) correspondant sera généré pour vous. + Select a language for which a corresponding translation (.ts) file will be generated for you. + Sélectionnez une langue pour laquelle le fichier de traduction correspondant (.ts) sera généré pour vous. + + + If you plan to provide translations for your project's user interface via the Qt Linguist tool, select a language here. A corresponding translation (.ts) file will be generated for you. + Si vous prévoyez de fournir des traductions pour l'interface utilisateur de votre projet grâce à l'outil Qt Linguist, sélectionnez une langue ici. Un fichier de traduction correspondant (.ts) sera généré pour vous. <none> @@ -47917,10 +49344,6 @@ In addition, device connectivity will be tested. Local file "%1" does not exist. Le fichier local « %1 » n'existe pas. - - Remote chmod failed for file "%1": %2 - La commande distante chmod a échoué pour le fichier « %1 » : %2 - All files successfully deployed. Tous les fichiers ont été déployés avec succès. @@ -47971,6 +49394,14 @@ Le processus de contrôle n'a pas pu démarrer. Remote Linux Device Périphérique Linux distant + + Device is disconnected. + Le périphérique est déconnecté. + + + Can't send control signal to the %1 device. The device might have been disconnected. + Impossible d'envoyer un signal de contrôle au périphérique %1. Le périphérique est peut-être déconnecté. + Deploy Public Key... Déployer la clé publique… @@ -47983,6 +49414,18 @@ Le processus de contrôle n'a pas pu démarrer. Error Erreur + + Establishing initial connection to device "%1". This might take a moment. + Établissement de la connexion initiale au périphérique « %1 ». Cela peut prendre un certain temps. + + + Device "%1" is currently marked as disconnected. + Le périphérique « %1 » est actuellement marqué comme déconnecté. + + + The device was not available when trying to connect previously.<br>No further connection attempts will be made until the device is manually reset by running a successful connection test via the <a href="dummy">settings page</a>. + Le périphérique n'était pas disponible lors de la tentative de connexion précédente. <br>Aucune autre tentative de connexion ne sera effectuée tant que le périphérique n'est pas réinitialisé manuellement lors d'un test de connexion réussi dans la <a href="dummy">page des paramètres</a>. + "%1" failed to start: %2 « %1 » n’a pas pu démarrer : %2 @@ -48011,6 +49454,10 @@ Le processus de contrôle n'a pas pu démarrer. Copie %1/%2 : %3 -> %4 + + Device is considered unconnected. Re-run device test to reset state. + Le périphérique est considéré comme déconnecté. Ré-effectuez un test de périphérique pour réinitialiser son état. + Deploy Public Key Déployer la clé publique @@ -48115,6 +49562,20 @@ Le processus de contrôle n'a pas pu démarrer. Checking if required commands are available... Vérification de la disponibilité des commandes nécessaires… + + Connecting to device... + Connexion au périphérique… + + + Connected. Now doing extended checks. + + Connecté. Exécution des tests étendus. + + + + Basic connectivity test failed, device is considered unusable. + Test de base de connectivité échoué, le périphérique est considéré comme inutilisable. + Checking if specified ports are available... Vérification si les ports spécifiés sont disponibles… @@ -48427,10 +49888,6 @@ Le processus de contrôle n'a pas pu démarrer. Transfer method: Méthode de transfert : - - Use rsync if available. Otherwise use default transfer. - Utiliser rsync si disponible. Sinon utiliser le transfert par défaut. - Use sftp if available. Otherwise use default transfer. Utiliser sftp si disponible. Sinon utiliser le transfert par défaut. @@ -48443,6 +49900,11 @@ Le processus de contrôle n'a pas pu démarrer. Unknown error occurred while trying to create remote directories Une erreur inconnue s'est produite lors de la création des répertoires distants + + Transfer method was downgraded from "%1" to "%2". If this is unexpected, please re-test device "%3". + downgraded ? + La méthode de transfert a été rétrogradée de « %1 » à « %2 ». Si cela est inattendu, veuillez refaire un test du périphérique « %3 ». + rsync failed to start: %1 Démarrage de rsync échoué : %1 @@ -48463,6 +49925,10 @@ Le processus de contrôle n'a pas pu démarrer. Ignore missing files: Fichiers manquants ignorés : + + Use rsync or sftp if available, but prefer rsync. Otherwise use default transfer. + Utiliser rsync ou sftp si possible, mais préférer rsync. Sinon, utiliser le transfert par défaut. + rsync is only supported for transfers between different devices. rsync n'est supporté que pour le transfert de fichiers entre les périphériques. @@ -49990,6 +51456,22 @@ Refus d'enregistrer le cas de test « %2 ». Test Suites Suites de tests + + Do you really want to delete "%1" permanently? + Souhaitez-vous définitivement supprimer « %1 » ? + + + Remove Shared File + Supprimer le fichier partagé + + + Cancel + Annuler + + + Failed to remove "%1". + Échec lors de la suppression de « %1 ». + Remove "%1" from the list of shared folders? Supprimer « %1 » de la liste des dossiers partagés ? @@ -50730,7 +52212,6 @@ Impossible d'ouvrir le fichier « %1 ». Sends Esc to terminal instead of %1. - %1 is the application name (Qt Creator) Envoie Échap au terminal au lieu d'à %1. @@ -50743,12 +52224,10 @@ Impossible d'ouvrir le fichier « %1 ». %1 shortcuts are blocked when focus is inside the terminal. - %1 is the application name (Qt Creator) Les raccourcis de %1 sont bloqués lorsque le focus est dans le terminal. %1 shortcuts take precedence. - %1 is the application name (Qt Creator) Les raccourcis de %1 sont prioritaires. @@ -50955,6 +52434,10 @@ Impossible d'ouvrir le fichier « %1 ». Paste Coller + + Select All + Tout sélectionner + Clear Selection Effacer la sélection @@ -51663,10 +53146,6 @@ Une valeur inférieure à 100 % peut entraîner un chevauchement et un mauvais a Delete Word Camel Case up to Cursor Supprimer les mots en Camel Case jusqu’au curseur - - &Sort Selected Lines - &Trier les lignes sélectionnées - Meta+Shift+S Meta+Maj+S @@ -51891,6 +53370,10 @@ Une valeur inférieure à 100 % peut entraîner un chevauchement et un mauvais a Meta+U Meta+U + + &Sort Lines + &Trier les lignes + Ctrl+Shift+Alt+U Ctrl+Maj+Alt+U @@ -53063,6 +54546,10 @@ Ne s’applique pas aux espaces blancs dans les commentaires et dans les chaîne Cannot create user snippet directory %1 Impossible de créer le dossier utilisateur d’extraits de code %1 + + Custom settings: + Paramètres personnalisés : + Copy Code Style Copier le style de code @@ -53107,6 +54594,10 @@ Ne s’applique pas aux espaces blancs dans les commentaires et dans les chaîne %1 [built-in] %1 [intégré] + + %1 [customizable] + %1 [personnalisable] + Edit preview contents to see how the current settings are applied to custom code snippets. Changes in the preview do not affect the current settings. Modifier l’aperçu du contenu pour voir la manière dont les paramètres actuels sont appliqués dans l’extrait de code personnalisé. Les changements dans la zone d’aperçu n’affectent pas les paramètres actuels. @@ -53400,10 +54891,6 @@ Notez que les BOM UTF-8 sont peu courants et traités de manière incorrecte par Show help tooltips using the mouse: Afficher les info-bulles d’aide en utilisant la souris : - - Current settings: - Paramètres actuels : - Remove Supprimer @@ -53482,6 +54969,15 @@ francis : en effet, une erreur de ma part --> validé. Shows tabs and spaces. Affiche les tabulations et les espaces. + + &Highlight selection + &Mis en avant de la sélection + + + Adds a colored background and a marker to the scrollbar to occurrences of the selected text. + occurences ? apparitions ? + Ajoute un fond coloré et une marque dans la barre de défilement pour les occurences du texte sélectionné. + Next to editor content À côté du contenu de l’éditeur @@ -53769,10 +55265,23 @@ Influence l’indentation des lignes de continuation. Copy to Clipboard Copier dans le presse-papiers + + Git Blame + Git Blame + Copy SHA1 to Clipboard Copier le SHA1 dans le presse-papiers + + <b>Note:</b> "%1" or "%2" is enabled in the instant blame settings. + %1 and %2 are the "ignore whitespace changes" and "ignore line moves" options + <b>Remarque :</b> les options « %1 » ou « %2 » sont actives dans les paramètres de blame instantané. + + + You + Vous + Sort Alphabetically Trier par ordre alphabétique @@ -53877,10 +55386,6 @@ Influence l’indentation des lignes de continuation. Emphasis Emphase - - Strong - Gras - Inline Code Code en ligne @@ -54295,6 +55800,10 @@ Les données de la trace sont perdues. Cannot execute "%1": %2 Impossible d’exécuter « %1 » : %2 + + Failed to start terminal process. The stub exited before the inferior was started. + Échec de démarrage du processus de terminal. Le lanceur s'est arrêté avant le démarrage du terminal. + Cannot set permissions on temporary directory "%1": %2 Impossible de définir les permissions sur le répertoire temporaire « %1 » : %2 @@ -54521,10 +56030,6 @@ Les données de la trace sont perdues. Reset to Default Layout Restaurer la disposition par défaut - - Automatically Hide View Title Bars - Masquer automatiquement les barres de titre des vues - Location Emplacement @@ -54647,8 +56152,8 @@ Les données de la trace sont perdues. La commande « %1 » n’a pas pu être lancée. - The command "%1" did not respond within the timeout limit (%2 s). - La commande « %1 » n’a pas répondu dans le délai imparti (%2 s). + The command "%1" was canceled after %2 ms. + La commande « %1 » a été annulée après %2 ms. <UNSET> @@ -54664,14 +56169,8 @@ Les données de la trace sont perdues. <VARIABLE> - Name when inserting a new variable <VARIABLE> - - <VALUE> - Value when inserting a new variable - <VALEUR> - Error in command line. Erreur dans la ligne de commande. @@ -54712,6 +56211,10 @@ Les données de la trace sont perdues. createTempFile is not implemented for "%1". createTempFile n'est pas implémenté pour « %1 ». + + Refusing to remove the standard directory "%1". + Refus de suppression du répertoire standard « %1 ». + Refusing to remove root directory. Impossible de supprimer le répertoire racine. @@ -54735,6 +56238,10 @@ Les données de la trace sont perdues. Impossible d'écrire dans le fichier « %1 » (seuls %2 sur %n octets ont été écrits). + + Device is not connected + Le périphérique n'est pas connecté + Failed creating temporary file "%1" (too many tries). Échec lors de la création du fichier temporaire « %1 » (trop d'essais). @@ -54803,6 +56310,10 @@ Les données de la trace sont perdues. Cannot create temporary file in %1: %2 Impossible de créer un fichier temporaire dans %1 : %2 + + Cannot create temporary file %1: %2 + Impossible de créer le fichier temporaire %1 : %2 + Overwrite File? Écraser le fichier ? @@ -56623,8 +58134,8 @@ Vérifiez les paramètres pour vous assurer que Valgrind est installé et dispon Exécution de : %1 - Running in "%1": %2. - Exécution dans « %1 » : %2. + Running in "%1": %2 + Exécution dans « %1 » : %2 The directory %1 could not be deleted. @@ -57206,8 +58717,9 @@ si un dépôt requiert une authentification SSH (voir la documentation sur SSH e Visite guidée de l’interface utilisateur - New to Qt? - Nouveau sur Qt ? + Explore more + Découvrir ? + Explorer plus Get Started @@ -57242,6 +58754,10 @@ si un dépôt requiert une authentification SSH (voir la documentation sur SSH e Open Project... Ouvrir un projet… + + Welcome to %1 + Bienvenue dans %1 + Create Project... Créer un projet… @@ -58059,13 +59575,6 @@ définit dans la taille de pas. Définit le rayon utilisé pour arrondir les coins. - - RemoteLinux::SshProcessInterface - - Can't send control signal to the %1 device. The device might have been disconnected. - Impossible d'envoyer un signal de contrôle au périphérique %1. Le périphérique est peut-être déconnecté. - - RenameFolderDialog @@ -58210,6 +59719,64 @@ définit dans la taille de pas. Espacement + + SaveAsDialog + + Save Effect + Enregistrer l'effet + + + Effect name: + Nom de l'effet : + + + Name contains invalid characters. + Le nom contient des caractères invalides. + + + Name must start with a capital letter + Le nom doit commencer par une lettre majuscule + + + Name must have at least 3 characters + Le nom doit contenir au moins trois caractères + + + Name cannot contain white space + Le nom ne peut pas contenir d'espace + + + Save + Enregistrer + + + Cancel + Annuler + + + + SaveChangesDialog + + Save Changes + Enregistrer les changements + + + Current composition has unsaved changes. + L'actuelle composition contient des modifications non enregistrées. + + + Cancel + Annuler + + + Save + Enregistrer + + + Discard Changes + Abandonner les modifications + + ScaleToolAction @@ -58564,6 +60131,13 @@ Elle est utilisée pour calculer la taille totale implicite. Active/désactive l'aimantation lors du glissement du nœud + + SocialButton + + Text + Texte + + SpatialSoundSection @@ -58754,6 +60328,13 @@ atteint le début ou la fin. Orientation de la vue scindée. + + SplitViewToggleAction + + Toggle Split View On/Off + Activer/désactiver la vue scindée + + StackLayoutSpecifics @@ -58900,6 +60481,10 @@ atteint le début ou la fin. Extend Étendre + + Jump to the code + Aller au code + Reset when Condition Réinitialiser sur condition @@ -59271,6 +60856,13 @@ Elle est utilisée pour calculer la taille totale implicite. Détermine la position des onglets. + + Tag + + tag name + nom d'étiquette + + TemplateMerge @@ -59290,6 +60882,42 @@ Elle est utilisée pour calculer la taille totale implicite. Parcourir les modèles + + TestControlPanel + + X + X + + + Theme + Thème + + + light + clair + + + dark + sombre + + + + + + + Basic + Basique + + + Community + Ou garder community? + Communautaire + + + < + < + + TextAreaSpecifics @@ -59736,6 +61364,30 @@ Elle est utilisée pour calculer la taille totale implicite. Ouvrir le navigateur de matériaux. + + ThumbnailDelegate + + Overwrite Example? + Écraser l'exemple ? + + + Example already exists.<br>Do you want to replace it? + L'exemple existe déjà. <br>Souhaitez-vous le remplacer ? + + + Downloading... + Téléchargement… + + + Extracting... + Extraction… + + + Recently Downloaded + Pluriels? + Récemment téléchargé + + TimelineBarItem @@ -59839,6 +61491,104 @@ Elle est utilisée pour calculer la taille totale implicite. Définit l’orientation du séparateur. + + TourModel + + Welcome Page + Page de bienvenue + + + The welcome page of Qt Design Studio. + La page de bienvenue de Qt Design Studio. + + + Workspaces + Espaces de travail + + + Introduction to the most important workspaces. + Introduction aux principaux espaces de travail. + + + Top Toolbar + Barre d'outils haute + + + Short explanation of the top toolbar. + Courte explication à propos de la barre d'outils haute. + + + States + États + + + An introduction to states. + Une introduction aux états. + + + Sorting Components + Tri des composants + + + A way to organize multiple components. + Une méthode pour organiser les nombreux composants. + + + Connecting Components + Connexion des composants + + + A way to connect components with actions. + Une méthode pour connecter les composants avec les actions. + + + Adding Assets + Ajout de ressources + + + A way to add new assets to the project. + Une méthode pour ajouter des ressources au projet. + + + Creating 2D Animation + Création d'animation 2D + + + A way to create a 2D Animation. + Une méthode pour créer des animations 2D. + + + Border and Arc + Bordure et arc + + + Work with Border and Arc Studio Components. + Travailler avec les composants bordure et arc du Studio. + + + Ellipse and Pie + Ellipse et diagramme + + + Work with Ellipse and Pie Studio Components. + Travailler avec les composants ellipse et diagramme du Studio. + + + Complex Shapes + Formes complexes + + + Work with Polygon, Triangle and Rectangle Studio Components. + Travailler avec les composants polygone, triangle et rectangle du Studio. + + + + TourRestartButton + + Restart + Redémarrer + + TumblerSpecifics @@ -60128,50 +61878,6 @@ Voulez-vous vraiment supprimer %1 ? Download failed Échec du téléchargement - - Recent Projects - Projets récents - - - Examples - Exemples - - - Tutorials - Tutoriels - - - Welcome to - Bienvenue dans - - - Qt Design Studio - Qt Design Studio - - - Create New - Créer un nouveau - - - Open Project - Ouvrir un projet - - - Help - Aide - - - Community - Communauté - - - Blog - Blog - - - Community Edition - Édition communautaire - text From 9934a9cafafea4276ba7a325e3c899ba9ba2cd46 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 6 Mar 2024 13:13:38 +0100 Subject: [PATCH 45/45] Debugger: improve tooltip handling for cdb Fixes: QTCREATORBUG-13413 Change-Id: I93cde8d11867ab8cec8a2f760f0f38a0935fe946 Reviewed-by: Reviewed-by: Christian Stenger --- src/plugins/debugger/cdb/cdbengine.cpp | 9 --------- src/plugins/debugger/cdb/cdbengine.h | 2 -- 2 files changed, 11 deletions(-) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index c7e20aae980..e8d3978b73c 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -237,15 +237,6 @@ void CdbEngine::adjustOperateByInstruction(bool operateByInstruction) runCommand({QLatin1String(m_lastOperateByInstruction ? "l-t" : "l+t"), NoFlags}); } -bool CdbEngine::canHandleToolTip(const DebuggerToolTipContext &context) const -{ - Q_UNUSED(context) - // Tooltips matching local variables are already handled in the - // base class. We don't handle anything else here in CDB - // as it can slow debugging down. - return false; -} - // Determine full path to the CDB extension library. QString CdbEngine::extensionLibraryName(bool is64Bit, bool isArm) { diff --git a/src/plugins/debugger/cdb/cdbengine.h b/src/plugins/debugger/cdb/cdbengine.h index b8afe1e2d91..2b644c68baa 100644 --- a/src/plugins/debugger/cdb/cdbengine.h +++ b/src/plugins/debugger/cdb/cdbengine.h @@ -26,8 +26,6 @@ public: explicit CdbEngine(); ~CdbEngine() override; - bool canHandleToolTip(const DebuggerToolTipContext &context) const override; - void setupEngine() override; void runEngine(); void shutdownInferior() override;