From 53eb67e4838d8c6c2131da0809ffe606917690ed Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 1 Mar 2024 07:56:21 +0100 Subject: [PATCH 01/87] Axivion: Improve sort indicator icon Change-Id: I3579cd460644867cddf491365780c0fd76f2c810 Reviewed-by: hjk --- src/plugins/axivion/issueheaderview.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/plugins/axivion/issueheaderview.cpp b/src/plugins/axivion/issueheaderview.cpp index ce432eb1265..a9dfd38b8df 100644 --- a/src/plugins/axivion/issueheaderview.cpp +++ b/src/plugins/axivion/issueheaderview.cpp @@ -16,13 +16,16 @@ static QIcon iconForSorted(SortOrder order) { const Utils::Icon UNSORTED( {{":/axivion/images/sortAsc.png", Utils::Theme::IconsDisabledColor}, - {":/axivion/images/sortDesc.png", Utils::Theme::IconsDisabledColor}}); + {":/axivion/images/sortDesc.png", Utils::Theme::IconsDisabledColor}}, + Utils::Icon::MenuTintedStyle); const Utils::Icon SORT_ASC( {{":/axivion/images/sortAsc.png", Utils::Theme::PaletteText}, - {":/axivion/images/sortDesc.png", Utils::Theme::IconsDisabledColor}}); + {":/axivion/images/sortDesc.png", Utils::Theme::IconsDisabledColor}}, + Utils::Icon::MenuTintedStyle); const Utils::Icon SORT_DESC( {{":/axivion/images/sortAsc.png", Utils::Theme::IconsDisabledColor}, - {":/axivion/images/sortDesc.png", Utils::Theme::PaletteText}}); + {":/axivion/images/sortDesc.png", Utils::Theme::PaletteText}}, + Utils::Icon::MenuTintedStyle); static const QIcon unsorted = UNSORTED.icon(); static const QIcon sortedAsc = SORT_ASC.icon(); static const QIcon sortedDesc = SORT_DESC.icon(); From b6b5f04264fae1bd68278388a1448847952b1fbe Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Fri, 1 Mar 2024 07:10:01 +0100 Subject: [PATCH 02/87] CompilerExplorer: Fix value vs. volatileValue Previously adding a new Compiler would not compile the current source, but the last "applied" source. Change-Id: I0979d21a61808e7bc03e5b72e9c8a2492200c8f6 Reviewed-by: hjk --- src/plugins/compilerexplorer/compilerexplorereditor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/compilerexplorer/compilerexplorereditor.cpp b/src/plugins/compilerexplorer/compilerexplorereditor.cpp index 0defb331636..c39b594d486 100644 --- a/src/plugins/compilerexplorer/compilerexplorereditor.cpp +++ b/src/plugins/compilerexplorer/compilerexplorereditor.cpp @@ -389,7 +389,7 @@ CompilerWidget::CompilerWidget(const std::shared_ptr &sourceSett removeCompilerBtn->setToolTip(Tr::tr("Remove Compiler")); connect(removeCompilerBtn, &QToolButton::clicked, this, &CompilerWidget::remove); - compile(m_sourceSettings->source()); + compile(m_sourceSettings->source.volatileValue()); connect(&m_sourceSettings->source, &Utils::StringAspect::volatileValueChanged, this, [this] { compile(m_sourceSettings->source.volatileValue()); @@ -459,7 +459,7 @@ void CompilerWidget::doCompile() { using namespace Api; - QString compilerId = m_compilerSettings->compiler(); + QString compilerId = m_compilerSettings->compiler.volatileValue(); if (compilerId.isEmpty()) compilerId = "clang_trunk"; From b5a6f851a3d42ec0fb9ff4cffbb3e65fe0540035 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Fri, 1 Mar 2024 06:37:04 +0100 Subject: [PATCH 03/87] CompilerExplorer: Adjust Terminal font size Adjust the output Terminal font size based on the text editor font size settings. Change-Id: Id1047f0fce0ac781cbc51b01f0df9657b179d71a Reviewed-by: David Schulz --- src/libs/solutions/terminal/terminalview.h | 4 ++-- .../compilerexplorereditor.cpp | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/libs/solutions/terminal/terminalview.h b/src/libs/solutions/terminal/terminalview.h index 4079eb7ddca..c69fbcd14e6 100644 --- a/src/libs/solutions/terminal/terminalview.h +++ b/src/libs/solutions/terminal/terminalview.h @@ -32,8 +32,8 @@ struct SearchHit bool operator==(const SearchHit &other) const { return !operator!=(other); } }; -QString defaultFontFamily(); -int defaultFontSize(); +QString TERMINAL_EXPORT defaultFontFamily(); +int TERMINAL_EXPORT defaultFontSize(); class TERMINAL_EXPORT TerminalView : public QAbstractScrollArea { diff --git a/src/plugins/compilerexplorer/compilerexplorereditor.cpp b/src/plugins/compilerexplorer/compilerexplorereditor.cpp index c39b594d486..651ee596205 100644 --- a/src/plugins/compilerexplorer/compilerexplorereditor.cpp +++ b/src/plugins/compilerexplorer/compilerexplorereditor.cpp @@ -446,6 +446,22 @@ Core::SearchableTerminal *CompilerWidget::createTerminal() m_resultTerminal->setColors(colors); + auto setFontSize = [this](const TextEditor::FontSettings &fontSettings) { + QFont f; + f.setFixedPitch(true); + f.setFamily(TerminalSolution::defaultFontFamily()); + f.setPointSize(TerminalSolution::defaultFontSize() * (fontSettings.fontZoom() / 100.0f)); + + m_resultTerminal->setFont(f); + }; + + setFontSize(TextEditorSettings::instance()->fontSettings()); + + connect(TextEditorSettings::instance(), + &TextEditorSettings::fontSettingsChanged, + this, + setFontSize); + return m_resultTerminal; } @@ -924,6 +940,14 @@ EditorFactory::EditorFactory() m_actionHandler.setUnhandledCallback( [undoStackFromEditor](Utils::Id cmdId, Core::IEditor *editor) { + if (cmdId == TextEditor::Constants::INCREASE_FONT_SIZE) { + TextEditor::TextEditorSettings::instance()->increaseFontZoom(); + return true; + } else if (cmdId == TextEditor::Constants::DECREASE_FONT_SIZE) { + TextEditor::TextEditorSettings::instance()->decreaseFontZoom(); + return true; + } + if (cmdId != Core::Constants::UNDO && cmdId != Core::Constants::REDO) return false; From 5b276d5940fa12b80bee53946c87fa1fe2983f57 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 29 Feb 2024 08:07:57 +0100 Subject: [PATCH 04/87] Android: Use more ICore::dialogParent() This is usually the better choice because it takes dialogs into account. I had one message box vanish behind the rest of Qt Creator, which could be better with this. Change-Id: I47b93e120a9e86f9f81da8e542477f1c6274bf87 Reviewed-by: Assam Boudjelthia --- src/plugins/android/androidsdkmanagerwidget.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/plugins/android/androidsdkmanagerwidget.cpp b/src/plugins/android/androidsdkmanagerwidget.cpp index e5f0d27345f..7b1ca4e88f5 100644 --- a/src/plugins/android/androidsdkmanagerwidget.cpp +++ b/src/plugins/android/androidsdkmanagerwidget.cpp @@ -7,6 +7,8 @@ #include "androidsdkmodel.h" #include "androidtr.h" +#include + #include #include #include @@ -275,7 +277,7 @@ void AndroidSdkManagerWidget::installEssentials() { m_sdkModel->selectMissingEssentials(); if (!m_sdkModel->missingEssentials().isEmpty()) { - QMessageBox::warning(this, + QMessageBox::warning(Core::ICore::dialogParent(), Tr::tr("Android SDK Changes"), Tr::tr("%1 cannot find the following essential packages: \"%2\".\n" "Install them manually after the current operation is done.\n") @@ -321,8 +323,11 @@ void AndroidSdkManagerWidget::onApplyButton(const QString &extraMessage) QString message = Tr::tr("%n Android SDK packages shall be updated.", "", packagesToUpdate.count()); if (!extraMessage.isEmpty()) message.prepend(extraMessage + "\n\n"); - QMessageBox messageDlg(QMessageBox::Information, Tr::tr("Android SDK Changes"), - message, QMessageBox::Ok | QMessageBox::Cancel, this); + QMessageBox messageDlg(QMessageBox::Information, + Tr::tr("Android SDK Changes"), + message, + QMessageBox::Ok | QMessageBox::Cancel, + Core::ICore::dialogParent()); QString details; if (!uninstallPackages.isEmpty()) From 3ff56b80790dc6054f6994443ab7c59cd91b02b1 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 1 Mar 2024 11:22:10 +0100 Subject: [PATCH 05/87] Bump version to 13.0.0-rc1 Change-Id: I5b4efa41aabce4b007308a53ea9ac291a3a3ad58 Reviewed-by: Eike Ziller --- cmake/QtCreatorIDEBranding.cmake | 6 +++--- qbs/modules/qtc/qtc.qbs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake index 6890a1ef957..070a556d405 100644 --- a/cmake/QtCreatorIDEBranding.cmake +++ b/cmake/QtCreatorIDEBranding.cmake @@ -1,6 +1,6 @@ -set(IDE_VERSION "12.0.83") # The IDE version. -set(IDE_VERSION_COMPAT "12.0.83") # The IDE Compatibility version. -set(IDE_VERSION_DISPLAY "13.0.0-beta2") # The IDE display version. +set(IDE_VERSION "12.0.84") # The IDE version. +set(IDE_VERSION_COMPAT "12.0.84") # The IDE Compatibility version. +set(IDE_VERSION_DISPLAY "13.0.0-rc1") # The IDE display version. set(IDE_COPYRIGHT_YEAR "2024") # The IDE current copyright year. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index cb40782268e..c9bfc919fe3 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -4,16 +4,16 @@ import qbs.FileInfo import qbs.Utilities Module { - property string qtcreator_display_version: '13.0.0-beta2' + property string qtcreator_display_version: '13.0.0-rc1' property string ide_version_major: '12' property string ide_version_minor: '0' - property string ide_version_release: '83' + property string ide_version_release: '84' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release property string ide_compat_version_major: '12' property string ide_compat_version_minor: '0' - property string ide_compat_version_release: '83' + property string ide_compat_version_release: '84' property string qtcreator_compat_version: ide_compat_version_major + '.' + ide_compat_version_minor + '.' + ide_compat_version_release From 262dcc6643225d413490fbf03a1b1471b380518d Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 29 Feb 2024 13:17:33 +0100 Subject: [PATCH 06/87] Core: do not activate open documents entry on right click If we activate an entry before we handle the context menu event we might switch into another mode. For example when right clicking on a ui File. Fixes: QTCREATORBUG-30357 Change-Id: I8de78c3a6bbd9d62e2766ccd2059ee3ee4ef0870 Reviewed-by: Eike Ziller --- src/libs/utils/itemviews.h | 16 ++++++++++++++++ .../coreplugin/editormanager/openeditorsview.cpp | 9 +++++++++ src/plugins/projectexplorer/projectwindow.cpp | 14 +------------- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/libs/utils/itemviews.h b/src/libs/utils/itemviews.h index 50e8a4af01e..ff1f5328b15 100644 --- a/src/libs/utils/itemviews.h +++ b/src/libs/utils/itemviews.h @@ -59,6 +59,22 @@ public: BaseT::keyPressEvent(event); } + virtual bool userWantsContextMenu(const QMouseEvent *) const + { + return false; + } + + void mousePressEvent(QMouseEvent *e) override + { + if (!userWantsContextMenu(e)) + BaseT::mousePressEvent(e); + } + + void mouseReleaseEvent(QMouseEvent *e) override + { + if (!userWantsContextMenu(e)) + BaseT::mouseReleaseEvent(e); + } }; class QTCREATOR_UTILS_EXPORT TreeView : public View diff --git a/src/plugins/coreplugin/editormanager/openeditorsview.cpp b/src/plugins/coreplugin/editormanager/openeditorsview.cpp index 350cdac142b..cc7451b9395 100644 --- a/src/plugins/coreplugin/editormanager/openeditorsview.cpp +++ b/src/plugins/coreplugin/editormanager/openeditorsview.cpp @@ -66,6 +66,8 @@ private: void activateEditor(const QModelIndex &index); void closeDocument(const QModelIndex &index); + bool userWantsContextMenu(const QMouseEvent *) const final; + ProxyModel *m_model; }; @@ -138,6 +140,13 @@ void OpenEditorsWidget::closeDocument(const QModelIndex &index) updateCurrentItem(EditorManager::currentEditor()); } +bool OpenEditorsWidget::userWantsContextMenu(const QMouseEvent *e) const +{ + // block activating on entry on right click otherwise we might switch into another mode + // see QTCREATORBUG-30357 + return e->button() == Qt::RightButton; +} + void OpenEditorsWidget::contextMenuRequested(QPoint pos) { QMenu contextMenu; diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 66dca5ecd56..1c2f04a04c5 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -648,24 +648,12 @@ private: return; } - bool userWantsContextMenu(const QMouseEvent *e) const + bool userWantsContextMenu(const QMouseEvent *e) const final { // On Windows, we get additional mouse events for the item view when right-clicking, // causing unwanted kit activation (QTCREATORBUG-24156). Let's suppress these. return HostOsInfo::isWindowsHost() && e->button() == Qt::RightButton; } - - void mousePressEvent(QMouseEvent *e) final - { - if (!userWantsContextMenu(e)) - BaseTreeView::mousePressEvent(e); - } - - void mouseReleaseEvent(QMouseEvent *e) final - { - if (!userWantsContextMenu(e)) - BaseTreeView::mouseReleaseEvent(e); - } }; class ComboBoxItem : public TreeItem From 6a59cb891b7010cb97fcbdccf2b816ceadb516b6 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 1 Mar 2024 12:22:58 +0100 Subject: [PATCH 07/87] Qt/Documentation: Avoid automatic loading of unrelated help files On Linux/KDE systems, the KDE documentation files can be installed in the Qt documentation directory. This leads to a great of documentation files to be loaded by default, which we try to avoid for performance reasons. Restrict the pattern for .qch files to start with a 'q', which still matches the Qt documentation files. If the user wants the documentation of KDE libraries, they can register them manually. Change-Id: Ib658c3b2c26a97ca69a8c0e46a5057a58b5a7ec7 Reviewed-by: Christian Kandeler --- src/plugins/qtsupport/qtversionmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index 715eec8aa2d..acdaba62827 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -506,7 +506,7 @@ static QList> documentationFiles(QtVersion *v) {v->docsPath().toString() + QChar('/'), v->docsPath().toString() + "/qch/"}); for (const QString &docPath : docPaths) { const QDir versionHelpDir(docPath); - for (const QString &helpFile : versionHelpDir.entryList(QStringList("*.qch"), QDir::Files)) + for (const QString &helpFile : versionHelpDir.entryList(QStringList("q*.qch"), QDir::Files)) files.append({docPath, helpFile}); } return files; From c5cce4233d977a72ee4b99eed3845863cf91c7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Thu, 29 Feb 2024 14:24:40 +0100 Subject: [PATCH 08/87] SquishTests: Update tests for Welcome screen Some tests are failing because of QTCREATORBUG-30466 unless someone resizes Creator's windows manually. Task-number: QTCREATORBUG-30466 Change-Id: Ibeecc2abd85839be3497691912e411862c465a89 Reviewed-by: Christian Stenger --- tests/system/shared/project.py | 12 ++-- tests/system/shared/welcome.py | 35 +++--------- tests/system/suite_WELP/tst_WELP01/test.py | 55 ++++++++----------- tests/system/suite_WELP/tst_WELP02/test.py | 7 +-- tests/system/suite_WELP/tst_WELP03/test.py | 3 +- tests/system/suite_WELP/tst_WELP04/test.py | 3 +- .../tst_session_handling/test.py | 6 +- 7 files changed, 45 insertions(+), 76 deletions(-) diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index 5bb724a0b1d..71689babf77 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -9,11 +9,11 @@ def openQbsProject(projectPath): def openQmakeProject(projectPath, targets=Targets.desktopTargetClasses(), fromWelcome=False): cleanUpUserFiles(projectPath) if fromWelcome: - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton('Open Project...') - if not all((wsButtonFrame, wsButtonLabel)): + wsButton = getWelcomeScreenSideBarButton('Open Project...') + if not object.exists(wsButton): test.fatal("Could not find 'Open Project...' button on Welcome Page.") return [] - mouseClick(wsButtonLabel) + mouseClick(wsButton) else: invokeMenuItem("File", "Open File or Project...") selectFromFileDialog(projectPath) @@ -60,11 +60,11 @@ def __createProjectOrFileSelectType__(category, template, fromWelcome = False, i if fromWelcome: if not isProject: test.fatal("'Create Project...' on Welcome screen only handles projects nowadays.") - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton("Create Project...") - if not all((wsButtonFrame, wsButtonLabel)): + wsButton = getWelcomeScreenSideBarButton("Create Project...") + if not object.exists(wsButton): test.fatal("Could not find 'Create Project...' button on Welcome Page") return [] - mouseClick(wsButtonLabel) + mouseClick(wsButton) elif isProject: invokeMenuItem("File", "New Project...") else: diff --git a/tests/system/shared/welcome.py b/tests/system/shared/welcome.py index 8066f271318..a5ba097ff1f 100644 --- a/tests/system/shared/welcome.py +++ b/tests/system/shared/welcome.py @@ -4,30 +4,11 @@ def __childrenOfType__(parentObject, typeName): return [child for child in object.children(parentObject) if className(child) == typeName] -def __getWelcomeScreenButtonHelper__(buttonLabel, widgetWithQFrames, isUrlButton = False): - frames = __childrenOfType__(widgetWithQFrames, 'QWidget') - for frame in frames: - childCount = 1 # incorrect but okay for framed sidebar buttons - if isUrlButton: - childCount = len(__childrenOfType__(frame, 'QLabel')) - for occurrence in range(1, childCount + 1): - label = getChildByClass(frame, 'QLabel', occurrence) - if label is None: - continue - if str(label.text) == buttonLabel: - return frame, label - return None, None -def getWelcomeScreenSideBarButton(buttonLabel, isUrlButton = False): - sideBar = waitForObject("{container={type='Welcome::Internal::SideArea' unnamed='1' " - "window=':Qt Creator_Core::Internal::MainWindow'} type='QWidget' " - "unnamed='1'}") - return __getWelcomeScreenButtonHelper__(buttonLabel, sideBar, isUrlButton) +def getWelcomeScreenSideBarButton(buttonLabel): + return ("{text='%s' type='QPushButton' unnamed='1' visible='1' " + "window=':Qt Creator_Core::Internal::MainWindow'}" % buttonLabel) -def getWelcomeScreenBottomButton(buttonLabel): - bottomArea = waitForObject("{type='Welcome::Internal::BottomArea' unnamed='1' " - "window=':Qt Creator_Core::Internal::MainWindow'}") - return __getWelcomeScreenButtonHelper__(buttonLabel, bottomArea, False) def getWelcomeTreeView(treeViewLabel): try: @@ -37,11 +18,11 @@ def getWelcomeTreeView(treeViewLabel): return None def switchToSubMode(subModeLabel): - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton(subModeLabel) - frameAndLabelFound = all((wsButtonFrame, wsButtonLabel)) - if frameAndLabelFound: - mouseClick(wsButtonLabel) - return frameAndLabelFound + wsButton = getWelcomeScreenSideBarButton(subModeLabel) + buttonFound = object.exists(wsButton) + if buttonFound: + mouseClick(wsButton) + return buttonFound def findExampleOrTutorial(tableView, regex, verbose=False): filterModel = __childrenOfType__(tableView, 'QSortFilterProxyModel') diff --git a/tests/system/suite_WELP/tst_WELP01/test.py b/tests/system/suite_WELP/tst_WELP01/test.py index 0bc65d1f001..61ee8a6030b 100644 --- a/tests/system/suite_WELP/tst_WELP01/test.py +++ b/tests/system/suite_WELP/tst_WELP01/test.py @@ -14,25 +14,16 @@ def clickItemVerifyHelpCombo(button, expectedHelpComboRegex, testDetails): test.log("Found %s" % str(helpCombo.currentText)) # select "Welcome" page from left toolbar again switchViewTo(ViewConstants.WELCOME) - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton(getStarted) - return test.verify(all((wsButtonFrame, wsButtonLabel)), + return test.verify(object.exists(getWelcomeScreenSideBarButton(getStarted)), "Verifying: '%s' button is being displayed." % getStarted) def buttonActive(button): - # colors of the default theme for active button on Welcome page - defaultActiveRGB = (69, 206, 85) - # colors of the dark theme for active button on Welcome page - darkActiveRGB = (54, 193, 72) - # QPalette::Window (used background color of Welcome page buttons) - enumQPaletteWindow = 10 - color = button.palette.color(enumQPaletteWindow) - current = (color.red, color.green, color.blue) - return current == defaultActiveRGB or current == darkActiveRGB + return waitForObject(button).checked def waitForButtonsState(projectsActive, examplesActive, tutorialsActive, timeout=5000): - projButton = getWelcomeScreenSideBarButton('Projects')[0] - exmpButton = getWelcomeScreenSideBarButton('Examples')[0] - tutoButton = getWelcomeScreenSideBarButton('Tutorials')[0] - if not all((projButton, exmpButton, tutoButton)): + projButton = getWelcomeScreenSideBarButton('Projects') + exmpButton = getWelcomeScreenSideBarButton('Examples') + tutoButton = getWelcomeScreenSideBarButton('Tutorials') + if not all(map(object.exists, (projButton, exmpButton, tutoButton))): return False return waitFor('buttonActive(projButton) == projectsActive ' 'and buttonActive(exmpButton) == examplesActive ' @@ -65,25 +56,25 @@ def main(): buttonsAndState = {'Projects':False, 'Examples':True, 'Tutorials':False} for button, state in buttonsAndState.items(): - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton(button) - if test.verify(all((wsButtonFrame, wsButtonLabel)), + wsButton = getWelcomeScreenSideBarButton(button) + if test.verify(object.exists(wsButton), "Verified whether '%s' button is shown." % button): - test.compare(buttonActive(wsButtonFrame), state, + test.compare(buttonActive(wsButton), state, "Verifying whether '%s' button is active (%s)." % (button, state)) # select Projects and roughly check this switchToSubMode('Projects') for button in ['Create Project...', 'Open Project...']: - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton(button) - if test.verify(all((wsButtonFrame, wsButtonLabel)), + wsButton = getWelcomeScreenSideBarButton(button) + if test.verify(object.exists(wsButton), "Verified whether '%s' button is shown." % button): - test.verify(not buttonActive(wsButtonFrame), + test.verify(not buttonActive(wsButton), "Verifying whether '%s' button is inactive." % button) - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton(getStarted) - if test.verify(all((wsButtonFrame, wsButtonLabel)), + wsButton = getWelcomeScreenSideBarButton(getStarted) + if test.verify(object.exists(wsButton), "Verifying: Qt Creator displays Welcome Page with '%s' button." % getStarted): - if clickItemVerifyHelpCombo(wsButtonLabel, "Getting Started | Qt Creator Manual", + if clickItemVerifyHelpCombo(wsButton, "Getting Started | Qt Creator Manual", "Verifying: Help with Creator Documentation is being opened."): textUrls = {'Online Community':'https://forum.qt.io', @@ -92,13 +83,14 @@ def main(): 'User Guide':'qthelp://org.qt-project.qtcreator/doc/index.html' } for text, url in textUrls.items(): - button, label = getWelcomeScreenBottomButton(text) - if test.verify(all((button, label)), + button = getWelcomeScreenSideBarButton(text) + if test.verify(object.exists(button), "Verifying whether link button (%s) exists." % text): - test.compare(str(button.toolTip), url, "Verifying URL for %s" % text) - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton(getStarted) - if wsButtonLabel is not None: - mouseClick(wsButtonLabel) + test.compare(str(waitForObject(button).toolTip), url, + "Verifying URL for %s" % text) + wsButton = getWelcomeScreenSideBarButton(getStarted) + if object.exists(wsButton): + mouseClick(wsButton) qcManualQModelIndexStr = getQModelIndexStr("text~='Qt Creator Manual [0-9.]+'", ":Qt Creator_QHelpContentWidget") if str(waitForObject(":Qt Creator_HelpSelector_QComboBox").currentText) == "(Untitled)": @@ -109,8 +101,7 @@ def main(): # select "Welcome" page from left toolbar again switchViewTo(ViewConstants.WELCOME) - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton(getStarted) - test.verify(wsButtonFrame is not None and wsButtonLabel is not None, + test.verify(object.exists(getWelcomeScreenSideBarButton(getStarted)), "Verifying: Getting Started topic is being displayed.") # select Examples and roughly check them switchToSubMode('Examples') diff --git a/tests/system/suite_WELP/tst_WELP02/test.py b/tests/system/suite_WELP/tst_WELP02/test.py index d79391d1213..add3d28b3a4 100644 --- a/tests/system/suite_WELP/tst_WELP02/test.py +++ b/tests/system/suite_WELP/tst_WELP02/test.py @@ -6,8 +6,7 @@ source("../../shared/qtcreator.py") def checkTypeAndProperties(typePropertiesDetails): for (qType, props, detail) in typePropertiesDetails: if qType == "QPushButton": - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton(props) - test.verify(all((wsButtonFrame, wsButtonLabel)), + test.verify(object.exists(getWelcomeScreenSideBarButton(props)), "Verifying: Qt Creator displays Welcome Page with %s." % detail) elif qType == 'QTreeView': treeView = getWelcomeTreeView(props) @@ -59,8 +58,8 @@ def main(): ) checkTypeAndProperties(typePropDet) - getStartedF, getStartedL = getWelcomeScreenSideBarButton("Get Started") - test.verify(getStartedF is not None and getStartedL is not None, "'Get Started' button found") + test.verify(object.exists(getWelcomeScreenSideBarButton("Get Started")), + "'Get Started' button found") # select "Create Project" and try to create a new project createNewQtQuickApplication(tempDir(), "SampleApp", fromWelcome = True) diff --git a/tests/system/suite_WELP/tst_WELP03/test.py b/tests/system/suite_WELP/tst_WELP03/test.py index b09fa9e2a90..50f7b503cc7 100644 --- a/tests/system/suite_WELP/tst_WELP03/test.py +++ b/tests/system/suite_WELP/tst_WELP03/test.py @@ -55,8 +55,7 @@ def main(): qchs.extend([os.path.join(p, "qtopengl.qch"), os.path.join(p, "qtwidgets.qch")]) addHelpDocumentation(qchs) setFixedHelpViewer(HelpViewer.HELPMODE) - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton('Get Started') - if not test.verify(all((wsButtonFrame, wsButtonLabel)), + if not test.verify(object.exists(getWelcomeScreenSideBarButton('Get Started')), "Verifying: Qt Creator displays Welcome Page with Getting Started."): test.fatal("Something's wrong - leaving test.") invokeMenuItem("File", "Exit") diff --git a/tests/system/suite_WELP/tst_WELP04/test.py b/tests/system/suite_WELP/tst_WELP04/test.py index c9a18066693..6ccf2f0d3ac 100644 --- a/tests/system/suite_WELP/tst_WELP04/test.py +++ b/tests/system/suite_WELP/tst_WELP04/test.py @@ -15,8 +15,7 @@ def main(): startQC() if not startedWithoutPluginError(): return - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton('Get Started') - if not test.verify(all((wsButtonFrame, wsButtonLabel)), + if not test.verify(object.exists(getWelcomeScreenSideBarButton('Get Started')), "Verifying: Qt Creator displays Welcome Page with Getting Started."): test.fatal("Something's wrong - leaving test.") invokeMenuItem("File", "Exit") diff --git a/tests/system/suite_general/tst_session_handling/test.py b/tests/system/suite_general/tst_session_handling/test.py index b535145cc91..305d64895ea 100644 --- a/tests/system/suite_general/tst_session_handling/test.py +++ b/tests/system/suite_general/tst_session_handling/test.py @@ -84,11 +84,11 @@ def createAndSwitchToSession(toSession): def checkWelcomePage(sessionName, isCurrent=False): switchViewTo(ViewConstants.WELCOME) - wsButtonFrame, wsButtonLabel = getWelcomeScreenSideBarButton('Projects') - if not all((wsButtonFrame, wsButtonLabel)): + wsButton = getWelcomeScreenSideBarButton('Projects') + if not object.exists(wsButton): test.fatal("Something's pretty wrong - leaving check for WelcomePage.") return - mouseClick(wsButtonLabel) + mouseClick(wsButton) treeView = getWelcomeTreeView("Sessions") if not treeView: test.fatal("Failed to find Sessions tree view - leaving check for WelcomePage.") From 810c9e710686cd8b247f8e50428b42fc79ca1c75 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Fri, 1 Mar 2024 12:18:18 +0100 Subject: [PATCH 09/87] ClangFormat: Fix vague error message Change-Id: I321d74a80c1735dad3edb6e542451cab3a71a3f7 Reviewed-by: Leena Miettinen --- src/plugins/clangformat/clangformatconfigwidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp index 99b8302d369..9adf94cafc1 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatconfigwidget.cpp @@ -343,8 +343,8 @@ void ClangFormatConfigWidget::apply() } QMessageBox mBox; - mBox.setText( - Tr::tr("The current settings are not valid. Are you sure you want to apply them?")); + mBox.setText(Tr::tr("The current ClangFormat (C++ > Code Style > ClangFormat) settings are not " + "valid. Are you sure you want to apply them?")); mBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes); mBox.setDefaultButton(QMessageBox::No); if (mBox.exec() == QMessageBox::Yes) From 5e5c86fecbb51763cf655bd9e22aa195e636018e Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 27 Feb 2024 16:08:30 +0100 Subject: [PATCH 10/87] Doc: Update Axivion docs You can now view and filter issues from selected results. Task-number: QTCREATORBUG-30209 Change-Id: I175f71589755af3bd75813eea237487128f36c42 Reviewed-by: Christian Stenger --- doc/qtcreator/images/icons/axivion-av.png | Bin 0 -> 153 bytes doc/qtcreator/images/icons/axivion-cl.png | Bin 0 -> 315 bytes doc/qtcreator/images/icons/axivion-cy.png | Bin 0 -> 306 bytes doc/qtcreator/images/icons/axivion-de.png | Bin 0 -> 377 bytes doc/qtcreator/images/icons/axivion-mv.png | Bin 0 -> 253 bytes doc/qtcreator/images/icons/axivion-sv.png | Bin 0 -> 300 bytes .../images/qtcreator-axivion-annotation.webp | Bin 4890 -> 11880 bytes .../qtcreator-axivion-issue-search.webp | Bin 0 -> 13232 bytes .../images/qtcreator-axivion-view-rule.webp | Bin 2544 -> 4010 bytes .../images/qtcreator-axivion-view.webp | Bin 4270 -> 4184 bytes ...tcreator-edit-dashboard-configuration.webp | Bin 3790 -> 3772 bytes .../images/qtcreator-preferences-axivion.webp | Bin 2470 -> 2156 bytes .../src/analyze/creator-analyze.qdoc | 2 +- .../src/analyze/creator-axivion.qdoc | 192 +++++++++++++----- .../creator-projects-settings-overview.qdoc | 1 + doc/qtcreator/src/qtcreator-toc.qdoc | 1 - 16 files changed, 145 insertions(+), 51 deletions(-) create mode 100644 doc/qtcreator/images/icons/axivion-av.png create mode 100644 doc/qtcreator/images/icons/axivion-cl.png create mode 100644 doc/qtcreator/images/icons/axivion-cy.png create mode 100644 doc/qtcreator/images/icons/axivion-de.png create mode 100644 doc/qtcreator/images/icons/axivion-mv.png create mode 100644 doc/qtcreator/images/icons/axivion-sv.png create mode 100644 doc/qtcreator/images/qtcreator-axivion-issue-search.webp diff --git a/doc/qtcreator/images/icons/axivion-av.png b/doc/qtcreator/images/icons/axivion-av.png new file mode 100644 index 0000000000000000000000000000000000000000..54dcd301ea2abf6e61b6997595c122c278bc866f GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4i*LmhONKMUokK+BzU?whG?8`onXy(z<|Sf zp>uU^{KDhD?Yo$j0tEupxb63KMgRK2+_!CpE`yWwfj0~ZI;mxE3Yyk+sV)>=xvs-w z)04g>;SNtvHqJb@mGPQT%*&J(`(+GTw;RJ*dgM3!U~rwTXm$1w2NMGW1B0ilpUXO@ GgeCw|vo;L? literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/icons/axivion-cl.png b/doc/qtcreator/images/icons/axivion-cl.png new file mode 100644 index 0000000000000000000000000000000000000000..0e2de82f18d14b8d0f5c467b4f8ade3996a68f5c GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4i*LmhCj#M?l3SgGI_cOK6Krpn%D>DCg6$*{5O!{)YrKJDcnh$-Q(XXSV34+zyst z=|8pqt84e>@0x!2>AvqWI+=~e&zL_S-n!~Rgh#KbcJ{_(mQObxw+i2FUHkmaquBwo z_oc0U$Mt*N#3esBm=|%KY_Lz8?Vq${S=$7;6UGb9NbFqT&1Iv#@Gz&q?2;{qSau%Z znS0=?=bzhK3|ri))K|}OjWzI)Iw-jP%2zLapJyimjAw!iu*-9b4?#%Bg zCGxWW&W4J8`!cbD)Up z^|^O6m8J<^@!JsU@>VwYaz_-~M{yQy?wh`USiHNxG&^nBc%j5>UsG>_vP%KiM`o7Z z-k#_8I3H<>zqYxt+-+&eeBLVmX)2Q-N#sNPuI{kUuTB%7iokDecV`a{i9GgtPHVB@(PPnxeDCUGNbewl z7Yi=7n^oLDoi4lMPW8FJh5w$`#Cl|s*bD)lEXvPs&!bdJB3`ne}jR6fx*+&&t;ucLK6VxAEjvk literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/icons/axivion-mv.png b/doc/qtcreator/images/icons/axivion-mv.png new file mode 100644 index 0000000000000000000000000000000000000000..c34272c414b01d1f0844e0a50ae0c35b900ae760 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0y~yU=RXf4i*LmhCj#M?l3Sg9PxB<4AD5>dePR8iBW*< z!uG{iq%z<1h(s-P|G?qK`+er;6$R}435zx^nh+7RV4;!Wnu}~4yWYGD3EopPQ~u`+ zWnIx->uyE-Sk%kvwK+{}!TmE#)^gKwBKo=Z&UrO^=e=`Gsbv{S8?%Z+&NJ=ac_7tq z+8U$i2gg|+TFft6_5QCtcg=H6FYf0*_w=$V}Fe{zg~28a^kVYYZWuK zGAus5v7N?tH;`qv^PP|j9j4N|RxQ?*>?l^h73N^YN={_ zJ#bFhGM48Rp}o7e^m`Pf-)=oU<63=psnDY-2CM5B1wY0@RHd}IIs literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-axivion-annotation.webp b/doc/qtcreator/images/qtcreator-axivion-annotation.webp index 5879a1c19f5b18bbaf60780709a725326af30cf4..9cfd1407e30483c59c10fe737379089d34cc707f 100644 GIT binary patch literal 11880 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

?Hlxi&;Rr9L1JNw^G^GAGJ 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 YUh!;c*7~!%B>(sMrT=5z1T!)K0RN-i=>Px# literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-axivion-view-rule.webp b/doc/qtcreator/images/qtcreator-axivion-view-rule.webp index 30a5427885f915db37d3e6b67d63ee9f0ad02e50..9bbca00d9eaa45cbd7de4baae4f391c415fd98a2 100644 GIT binary patch literal 4010 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 E0P^~zAOHXW literal 2544 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 diff --git a/doc/qtcreator/images/qtcreator-axivion-view.webp b/doc/qtcreator/images/qtcreator-axivion-view.webp index c019284503ccb62d1534305ca9e515e65aedded9..0d1614b4eba94d5ae0713819d125d208c3fd9962 100644 GIT binary patch literal 4184 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 literal 4270 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

q1 zAy=of=}UV}RaWhfw%H#RY(2Z$zDLEai`V?&?TAZzejWBm+LmePY{26`@P=US)S575l#7Z&K3YHD8#kv$KBNzYTBgi>m|$U-F+-QPMdT)$}@X z`MIT52Qx3ICtQ57wy|sS%?jS@-ArHF7sdT7IQV+vch*Yzs`;xH2)~*8k^|<-^7$^V!4V=ilKCI&1IQeztIL&2NXe_q)pU z$J2+~^(yv7`#A?qj*)xhqZ?PcVfKq_>+DtPTV_Yc&gEUE!*kGYu6M!Sy-)AmPW3P6 zSC}oo>%q%+_hz(BKK$)k18-%jhxx^~bx(}$9?%YIm%S+-vW9EoPTR77pZA`$-XAyP z&+m=%nmz@r+|H)wtvbtjDrfclwTm65JkzdG*uh_N`_EN=Sp_S{Z)N{3@9h+?pWds& z{n1;yzeDf#tFP@*r*bkaleVNb%(V)?!1?W);_JHF+C|IPG^xJc=)Kx`S7+YWU(Sae zmY=&?(iD8*vfiSmiLdxg8H`tZy!}1T&6w@tqw@aT|C#X|^W<~Hv&j_Eu*A@qa6$|p*FnJ@USPKl3v zHOJ44|4Y{k{EDGypFTBIO?lqw{&(Tg%@25cH{`GW`a-i_ z@c5Ol?Oa+ek(CPGqCL{<7lvC1R-RFtXjxGz`cJ7(^CiEjo9h|9wGX9V@$1%Yy^-m( zEBD+JxhMLMW;Fc^kZd(xuF)8`@ZW`3>+Sb9+O#YVRr|i+oU6?2rhgyz-@C-O_g8q^ zzYTBqL+~Lk>&9ns)}jv^cF(w6W9B64^NK$-)}{WHHEDkJD+>MB)=tqm9JXz8MejaNuR~`1iJJsZMOeMjdR|&|BXpY2l{r`P zuSUP<-&-7J>iBB^(j(F@W+&{M`sC=N&4Qci?Z4croGbHHt6J>H*(v`5WWOB0^f9q8 zVaw8KRgYpPW@W9N!E>1N(BW zAMfAY>v_dLxA;Z>T4kpxFE*>k?Y3Rip(3rg*LR`&`~z$L1$<3>cX_#e&ToHd=LeTo z3%y(@$QIMj5~#jnQu~F3{VZQ=HW#;C$o{gT>q|gztHXIuu6>+CBp37$48WlKnsdy=?9c*=7{lk579wfA*uCpu_q_hgFY ziYh(f4!O+fcQ9o?%h%f7@8^L^vbWqT-Sw|#J@#-7m+ay_JtalqNKOme*Y+R50)p12 zzg1@x?u-1T;ct`OBs8IV!U`rsX2lfcD;MRpwx^1`z4Cf`!n}${(JGAUU5bg_dxcrN zeO~i_G+)bk@%40tZAAh#n=4+tcRKz5lJleIUlJ1!mE7)Fu+%=}v_pjFXKt~LT!&fx zYc^NjxZgT0Vo}?T?fl|4&3*p@m~u~RY@B>qUW+0BXvB}SuNUq=n)-Wbdx%f61vYY8a-AhGLk4ssXgaXBw{|ZfcCA#&OYDd=1s=ti2n}2gE z@~70jRGiA`R(Ya#%GdUy8QXdm&8_+?v_w~M>mR|Nycsj&t2|g2aitipuvc+U5wh-% V;JhRh_+(%8ufyQ#S}(GU0RWjFc6I;& diff --git a/doc/qtcreator/images/qtcreator-edit-dashboard-configuration.webp b/doc/qtcreator/images/qtcreator-edit-dashboard-configuration.webp index 3f76b4427a374d0ddcc3bce6536c872ea399c5a8..43d997ec424381b22d8a2cb8fe07601dabe54bd7 100644 GIT binary patch literal 3772 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 diff --git a/doc/qtcreator/images/qtcreator-preferences-axivion.webp b/doc/qtcreator/images/qtcreator-preferences-axivion.webp index f884259a54a21e89e8b76ec8ad903e9cb75ae2d8..a6b69dd1ff54ec5b9038e9b84c82eda59ba5999e 100644 GIT binary patch literal 2156 zcmWIYbaPALU|)-hZs^RPO>g(TKWVSf^h2njV1mkn zYunaFMZP}ugLQ|Jq~hOlN6C1lP0OW=a&9kMYdJr6>spDrFZNyXjW_p2e2#B_{{3I> z<>b)FsF2e9i)@a&->l$rcyO!1D%fJVN0a9Qr^dejhaPYDT^h8~g<~qmQh}8MN?cAN znGT#GVN0*Ax|Zaa7@RiYLYvb{hmQX$T>%{-Orom-R+Q_$4c25~bZHXsbjbPV-6ZBI zvh-lCa~7|XqtN9rr52ACp_P8z0-R0<#B!!&zKW5E2;|j2;2O4Jfj#pQ{E)fx^Fr%R;K!U+5_u2y^`FCgT-n}bZUjAakqj!Aw zHz_(=@xOa#aOa`^#p?HWRegU>iY)fLue#{}Bn8h&S2T*&AB@TgX{-_`x&0^G{_jh5 z*6wFfSF=LOR=%^ksH@^{U%jWHa@y)PjxQgZ+`?B1%6;-o^!(3#JiVQJ)(?4ozjK=_ zDx;_8%)MaE5*Rlj!*)yUkH;4}?6-LQc>Ki4`Oeo%-=fud662gbe4=jE%{aQ+Noez} zSJ^QaqitOE)^%=P={IfLaiP?b?1*2?Hm*nReqQxQ*i~(zzEOCKgq^)p%IOxnggYl& zWf!#iDCHLvc*!feKlyBMP~3fGOzf?R=Ke2cr(KszRaBU~W5b`_`^CP9vbpTz(B80Z z#&x-;`=3STC~I^wA6_f3-X_I0;s4Jkr;}NIrPO|`S}^CwuC%EiCZuzn4t_aZQAtf_ z*%SN!t5SonC7tuUVX{zum%5aysh^So-wx|78lTEeS4#IRw%ocvUh#ooORC_5(*AR| zkGfwvUyvg{OU3B<^pc>~$sSu<{st>sybF`OpzJT&EmWKpxctyz&nK2Ivn<|;c}Z2T zj+paC{+-O}h@9CfX=Qmv8S|!Ex4k<#r|W16?_M+2$*1RjQnFwDXX74Tm0nYZ%I=+Y zu4i%%8zrP3c-u8u-APpSaB;xi{{`+l^5nX_sH6;b@mbiefPwLiQTZ59adIG0^UFN=IQOhs= z{Xbj!4{Z!%Ez!QpSrJ%pw8-Nd|8WL=O$QTw6`gfYVwz7eO!ahY?h@S4&C8Wa6d=f(*e^{T77Zn`C1! z^J%V6mb6LBj!3}}wiP<@EQV5HK4&MY&9&v_SkRQ&u}z@p2;)~D*H6OA%u7A$S1k_F z&I}Ih+_lEsc9F=qlyu6|zBJOmy5#7@&;J(h^YRKVVT@g-yKH;o<3F=|9&ciuH@oVNvftJ@ z-{n4q?)ag(ZoXl9=JXY_ewp*$ue}iNsTKH*e|<-fw}@};S>{zY=Wd-*&&-xwHFx%U z;d~{Q;(Lu-L`!H^!z^;<{s}_947aqSK<6?-O$asIoqcd z)}%c%Kg1xn^^1bliO*5oSKmlp56!NvI=1}~gIp&6r>F_fuRdFK(|TX`k6jn*&GyG# zRMl6s`IeQlKt}jU<T<)i*%>-W;<&+gm)rnZt%TSVS?jTVT;4yJpD7*1j>VqT$IJyompUEPzP&ub=c+P8e2_PN_0N@okh zq_aw8{1;5$;b^R{F#YezHI|(pxa@*wK3i8U{YzunJHzlfv)K2aoS9oB$QpCXt;@mq zd|KYgP4% ze15~A_nZ4jK=#`QLKX!XlTS?BR4C+Vd_J%3^uLr2)#}DckA9p?+xR*>U}5LyjeMOU zE)NUst54Q@{rl`MD8F9)aAMyIwwYi5`!sFiDiCUvec94AsarkT`w-(M^(N`*_2(X_ z7=1|6|1ilQOYg-j#V7O1KLr^|PpX@<^G-l?&RBl4G*CfoZ9 zEz@^-zBTy3zRQE-*8f#+lv1XeA3V>x`$=iWp`&U)-pK4Ye5;7b=F6Slz%s*iW(U)Y z9!%%^q?B%jo+VV?&zK6ed5=ioc{%e klB;*N96xXC{V({_{7L_({8|3QUiH7`Pk)fVln*ih0Lq#QG5`Po literal 2470 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 Dd3B^> diff --git a/doc/qtcreator/src/analyze/creator-analyze.qdoc b/doc/qtcreator/src/analyze/creator-analyze.qdoc index 7438249701f..a29ab100155 100644 --- a/doc/qtcreator/src/analyze/creator-analyze.qdoc +++ b/doc/qtcreator/src/analyze/creator-analyze.qdoc @@ -44,7 +44,7 @@ example, and use the results to make the tests more efficient and complete. - \li \l{Static Code Analysis}{Axivion} + \li \l{Prevent code erosion}{Axivion} Do static code analysis and architecture analysis to detect and eliminate unnecessary complexity of code. diff --git a/doc/qtcreator/src/analyze/creator-axivion.qdoc b/doc/qtcreator/src/analyze/creator-axivion.qdoc index f188c84151b..b45d1f5fb19 100644 --- a/doc/qtcreator/src/analyze/creator-axivion.qdoc +++ b/doc/qtcreator/src/analyze/creator-axivion.qdoc @@ -1,16 +1,17 @@ -// Copyright (C) 2023 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! - \previouspage creator-coco.html \page creator-axivion.html - \nextpage creator-valgrind-overview.html + \previouspage creator-how-tos.html - \title Static Code Analysis + \ingroup creator-how-to-analyze + + \title Prevent code erosion \l{https://www.axivion.com/en/products/axivion-suite/}{Axivion Suite} is - a tool suite for protecting software from erosion. Static code analysis, - architecture analysis, and code-smells-detection enable you to: + a tool suite for protecting software from erosion. With static code analysis, + architecture analysis, and code-smells-detection, you can: \list \li Check the source code for potential runtime errors. @@ -22,50 +23,164 @@ \li Detect unreachable code. \endlist - The experimental Axivion plugin integrates the Axivion dashboard server into - \QC. + Connect to an Axivion dashboard server from \QC to view results of code + analysis. \note Enable the Axivion plugin to use it. To use the plugin, you must set up a project in the Axivion dashboard - server and link to it from \QC. You can then see style violations in the - \uicontrol Edit mode and descriptions and issue counts in the - \uicontrol Axivion view. + server and link to it from \QC. You can then see found issues in the + \uicontrol Edit mode, issues in the \uicontrol Axivion dashboard, and + issue details in the \uicontrol Axivion sidebar view. - The editor shows style violations as inline annotations. Hover the mouse over + The editor shows found issues as inline annotations. Hover the mouse over an annotation to bring up a tool tip with a short description of the issue. \image qtcreator-axivion-annotation.webp {Annotation popup} - Select the \inlineimage icons/info.png - button to view detailed information about the issue in the \uicontrol Axivion - view. + Select \inlineimage icons/info.png to view detailed information about the + issue in the \uicontrol Axivion sidebar view. - \image qtcreator-axivion-view-rule.webp {Axivion view} + \image qtcreator-axivion-view-rule.webp {Axivion sidebar view} + + \section1 View issue counts To view the issue counts, select \inlineimage icons/home.png - (\uicontrol {Show Dashboard}). + (\uicontrol {Show Dashboard}) in the \uicontrol Axivion dashboard. - \section1 Connecting to Axivion Dashboard Servers + \image qtcreator-axivion-view.webp {Axivion dashboard} - To connect to Axivion: + The \uicontrol Axivion dashboard lists the numbers of the following types of + issues that Axivion found in the linked project: + + \table + \header + \li Icon + \li Type + \li Description + \row + \li \inlineimage icons/axivion-av.png + \li \uicontrol AV + \li Architecture violations, such as hidden dependencies. + \row + \li \inlineimage icons/axivion-cl.png + \li \uicontrol CL + \li Clones, such as duplicates and similar pieces of code. + \row + \li \inlineimage icons/axivion-cy.png + \li \uicontrol CY + \li Cyclic dependencies, such as call, component, and include cycles. + \row + \li \inlineimage icons/axivion-de.png + \li \uicontrol DE + \li Dead entities are callable entities in the source code that cannot + be reached from the entry points of the system under analysis. + \row + \li \inlineimage icons/axivion-mv.png + \li \uicontrol MV + \li Violations of metrics based on lines and tokens, + nesting, cyclomatic complexity, control flow, and so on. + \row + \li \inlineimage icons/axivion-sv.png + \li \uicontrol SV + \li Style violations, such as deviations from the naming + or coding conventions. + \endtable + + To clear the view, select \inlineimage icons/clean_pane_small.png + (\uicontrol Clear). + + To view issues, select \inlineimage icons/zoom.png + (\uicontrol {Search for Issues}). + + \section1 Filter issues + + \image qtcreator-axivion-issue-search.webp {Issues in Axivion view} + + To filter issues, select: + + \list + \li The icon of an issue type. + \li Two analyzed versions to compare. Select \uicontrol EMPTY to see + issues from the version you select in the right-side version box. + \li \inlineimage icons/arrowup.png to see only added issues. + \li \inlineimage icons/arrowdown.png to see only removed issues. + \li The owner of the issue. Select \uicontrol ANYBODY to see all issues, + \uicontrol NOBODY to see issues that are not associated with a user, + or a user name to see issues owned by a particular user. + \li Path patterns to show issues in the files in the directories that + match the pattern. + \endlist + + The information you see depends on the issue type. Double-click an issue + to see more information about it in the \uicontrol Axivion sidebar view. + + \section1 Jump to issues in the editor + + Typically, the details for cycles and clones show several paths. To view the + issues in the editor: + + \list + \li Click in a location column (that shows a file or line) to open the + respective location (if it can be found). + \li Click in other columns to open the first link in the issue details. + Usually, it leads to the \uicontrol {Left location} or + \uicontrol {Source location}. + \endlist + + The easiest way to jump to the \uicontrol {Right location} is to + select the link in the details or in the \uicontrol {Right Path} + or \uicontrol {Target Path} column. + + \sa {Enable and disable plugins}, {Link projects to Axivion dashboards}, + {Axivion} +*/ + +/*! + \page creator-preferences-axivion.html + \previouspage creator-reference.html + + \ingroup creator-reference-preferences + + \title Axivion + + \brief Create a connection to an Axivion dashboard server. + + Set preferences for the Axivion static code analysis tool in + \preferences > \uicontrol Axivion. + + \image qtcreator-preferences-axivion.webp {General tab in Axivion Preferences} + + To connect to an Axivion dashboard server: \list 1 - \li Select \preferences > \uicontrol Axivion. - \image qtcreator-preferences-axivion.webp {General tab in Axivion Preferences} \li Select \uicontrol Edit to create a connection to the Axivion dashboard server. \image qtcreator-edit-dashboard-configuration.webp {Edit Dashboard Configuration dialog} \li In \uicontrol {Dashboard URL}, enter the URL of the server. - \li In \uicontrol Description, enter a free-text description of the - server. - \li In \uicontrol {Access token}, enter the IDE application token that - you created in the server, in user preferences. + \li In \uicontrol Username, enter the username to access the server. \endlist - \section1 Linking to Dashboards + The first time you access the server, you must enter the password that + matches the username. It is stored safely in your keychain that is provided + by the OS for later use. - To link a project to a dashboard: + Select \uicontrol {Highlight marks} to highlight found issues on the + scrollbar in the editor. + + \sa {Enable and disable plugins}, {Link projects to Axivion dashboards}, + {Prevent code erosion} +*/ + +/*! + \page creator-link-axivion-dashboards.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-projects-configure + + \title Link projects to Axivion dashboards + + To link a project to an Axivion dashboard: \list 1 \li \uicontrol Projects > \uicontrol {Project Settings} > @@ -78,26 +193,5 @@ To unlink a project, select \uicontrol {Unlink Project}. - \section1 Viewing Issue Counts - - \image qtcreator-axivion-view.webp {Axivion view} - - The \uicontrol Axivion view lists the numbers of the following types of - issues that Axivion found in the linked project: - - \list - \li \uicontrol AV - architecture violations, such as hidden dependencies - \li \uicontrol CL - duplicates and similar pieces of code - \li \uicontrol CY - call, component, and include cycles - \li \uicontrol DE - dead code - \li \uicontrol MV - violations of metrics based on lines and tokens, - nesting, cyclomatic complexity, control flow, and so on. - \li \uicontrol SV - style violations, such as deviations from the naming - or coding conventions - \endlist - - To clear the view, select \inlineimage icons/clean_pane_small.png - (\uicontrol Clear). - - \sa {Enable and disable plugins} + \sa {Enable and disable plugins}, {Prevent code erosion}, {Axivion} */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-overview.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-overview.qdoc index 27ff2fccff9..7902f219389 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-overview.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-overview.qdoc @@ -79,6 +79,7 @@ the project: \list + \li \l{Link projects to Axivion dashboards}{Axivion} \li \l{Specify clangd settings}{Clangd} \li \l{Speficy Clang tools settings}{Clang Tools} \li \l{Specify code style}{C++ Code Style} diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 933fadb3a0e..c1b310e6c9c 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -102,7 +102,6 @@ \list \li \l{Profiling QML Applications} \li \l{Checking Code Coverage} - \li \l{Static Code Analysis} \li \l{Using Valgrind Code Analysis Tools} \list \li \l{Detecting Memory Leaks with Memcheck} From bb15322af84fb3b13cd79f3c73fc33b5f03c5492 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Mar 2024 12:17:11 +0100 Subject: [PATCH 11/87] Update qbs submodule to HEAD of 2.3 branch Change-Id: I3c4dd9307c74e3fef12bccdc54c13f96dd252e97 Reviewed-by: Reviewed-by: Christian Stenger --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 60a18f09fa5..75aca0dca12 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 60a18f09fa547af064fb851e72b816ee25bf71a3 +Subproject commit 75aca0dca12c6c94109e65ee035b6b533b33a3c5 From 217b6eae033d178ed33a2cbcdfbb0671d46545ee Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 26 Feb 2024 13:53:56 +0100 Subject: [PATCH 12/87] Doc: Describe using junction points on Windows Task-number: QTCREATORBUG-30209 Change-Id: If6692b697e92a6d3fdffaaddc268cab82f50afd4 Reviewed-by: Cristian Adam --- .../qtcreator-preferences-cmake-general.webp | Bin 3406 -> 3816 bytes .../creator-projects-cmake-building.qdoc | 20 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/doc/qtcreator/images/qtcreator-preferences-cmake-general.webp b/doc/qtcreator/images/qtcreator-preferences-cmake-general.webp index e6b7de61f33ee971d1ec0503cf0d4c5e2c7c0e52..fb3b61eff00ef6d03092812d35e71c973b37cddc 100644 GIT binary patch literal 3816 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 SYrgOQ%`fZC{`O~gvj705;9M5~ literal 3406 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 diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc index c8da5117fb6..6f5508312f5 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc @@ -200,6 +200,26 @@ \image qtcreator-build-configuration-set-clicolor-force.webp {Build Environment with CLICOLOR_FORCE set} + \section1 Using Junction Points on Windows + + To overcome issues with long paths on Windows, create and use + \l{https://learn.microsoft.com/en-us/sysinternals/downloads/junction} + {junction points} for the source and build directories. At a junction point, + a directory serves as an alias to another directory on the computer. + + To use the junction points for CMake configure, build, and install + operations, go to \preferences > \uicontrol CMake > \uicontrol General and + select \uicontrol {Use junctions for CMake configuration and build operations}. + + \image qtcreator-preferences-cmake-general.webp {CMake General preferences} + + \QC stores junction points in \c {C:\ProgramData\QtCreator\Links}. To use + another path, set it as the value of the \c QTC_CMAKE_JUNCTIONS_DIR + environment variable. + + Set the \c QTC_CMAKE_JUNCTIONS_HASH_LENGTH environment variable to shorten + the MD5 hash key length from the default length value of 32. + \section1 CMake Build Steps \QC builds CMake projects by running \c {cmake . --build}, which then runs From 51ca09c2d7128308c10371beb0691761df702e07 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 23 Feb 2024 17:00:33 +0100 Subject: [PATCH 13/87] Doc: Describe the "Edit Checks as String" option for Clazy Task-number: QTCREATORBUG-30209 Change-Id: I56d2f9d9a18f474ab0228c9c64bbde2101d49429 Reviewed-by: Alessandro Portale --- dist/changelog/changes-13.0.0.md | 2 +- doc/qtcreator/images/qtcreator-clazy.png | Bin 22558 -> 0 bytes doc/qtcreator/images/qtcreator-clazy.webp | Bin 0 -> 14428 bytes .../analyze/creator-clang-static-analyzer.qdoc | 10 +++++++--- 4 files changed, 8 insertions(+), 4 deletions(-) delete mode 100644 doc/qtcreator/images/qtcreator-clazy.png create mode 100644 doc/qtcreator/images/qtcreator-clazy.webp diff --git a/dist/changelog/changes-13.0.0.md b/dist/changelog/changes-13.0.0.md index 82530d29768..163b25914cb 100644 --- a/dist/changelog/changes-13.0.0.md +++ b/dist/changelog/changes-13.0.0.md @@ -210,7 +210,7 @@ Analyzer ### Clang -* Added `Edit Checks as Strings` for Clazy +* Added `Edit Checks as String` for Clazy ([QTCREATORBUG-24846](https://bugreports.qt.io/browse/QTCREATORBUG-24846)) ### Axivion diff --git a/doc/qtcreator/images/qtcreator-clazy.png b/doc/qtcreator/images/qtcreator-clazy.png deleted file mode 100644 index 15dfb0aeb6b49e52bba350744183f65d2101734b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22558 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

L^zwo~~hBE%DPVb){+O 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 diff --git a/doc/qtcreator/images/qtcreator-clazy.webp b/doc/qtcreator/images/qtcreator-clazy.webp new file mode 100644 index 0000000000000000000000000000000000000000..1a7243b781807b2c352cb717bdab61b9a770b9fd GIT binary patch literal 14428 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc b/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc index c13e626edc6..b1b1cd9a8fa 100644 --- a/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc +++ b/doc/qtcreator/src/analyze/creator-clang-static-analyzer.qdoc @@ -247,20 +247,24 @@ \l{https://clang-analyzer.llvm.org/available_checks.html} {Clang Static Analyzer documentation}. - \li To edit the selected check as plain text, select + \li To edit the selected checks as plain text, select \uicontrol {Edit Checks as String}. \li In the \uicontrol {Clazy Checks} tab, select the level of Clazy checks to perform. - \image qtcreator-clazy.png {Clazy Checks tab} + \image qtcreator-clazy.webp {Clazy Checks tab} + + \li To edit the selected checks as plain text, select + \uicontrol {Edit Checks as String}. + \li In the \uicontrol Filters field, select topics to view only checks related to those areas in the \uicontrol Checks field. To filter the checks in the selected areas, enter a string in the \uicontrol {Filter by name} field. - \li To view all checks again, select \uicontrol {Reset Filter}. + \li To view all checks again, select \uicontrol {Reset Topic Filter}. \li To view more information about the checks online, select the \uicontrol {Web Page} links next to them. From 642c4beac1afed0ed2906865140b3b8da212ccab Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 19 Feb 2024 11:32:11 +0100 Subject: [PATCH 14/87] Doc: Split up Refactoring into how-to topics - Move info about viewing search results to the Search Results View reference topic - Remove the Refactoring top-level topic (the general info is now in the Overview topic) Task-number: QTCREATORBUG-29361 Change-Id: I4072e628368905ed1d5006ececae1b9eaa02fa10 Reviewed-by: Eike Ziller --- .../src/editors/creator-code-refactoring.qdoc | 111 ++++-------------- doc/qtcreator/src/editors/creator-coding.qdoc | 9 +- .../creator-only/creator-clang-codemodel.qdoc | 4 +- .../creator-only/creator-cpp-quick-fixes.qdoc | 12 +- .../creator-how-to-find-symbols.qdoc | 60 ++++++++++ .../creator-only/creator-language-server.qdoc | 4 +- .../src/editors/creator-quick-fixes.qdoc | 23 ++-- doc/qtcreator/src/editors/creator-search.qdoc | 2 +- doc/qtcreator/src/qtcreator-toc.qdoc | 1 - doc/qtcreator/src/qtcreator.qdoc | 1 - .../creator-open-documents-view.qdoc | 8 +- .../creator-reference-output-views.qdoc | 6 + .../developers/studio-jump-to-the-code.qdoc | 2 +- .../src/overviews/studio-finding.qdoc | 4 + .../src/qtdesignstudio-faq.qdoc | 2 +- .../src/qtdesignstudio-toc.qdoc | 4 +- .../src/views/qtquick-text-editor.qdoc | 25 +++- 17 files changed, 155 insertions(+), 123 deletions(-) create mode 100644 doc/qtcreator/src/editors/creator-only/creator-how-to-find-symbols.qdoc diff --git a/doc/qtcreator/src/editors/creator-code-refactoring.qdoc b/doc/qtcreator/src/editors/creator-code-refactoring.qdoc index 413ffe9ef54..5a94f1c08d3 100644 --- a/doc/qtcreator/src/editors/creator-code-refactoring.qdoc +++ b/doc/qtcreator/src/editors/creator-code-refactoring.qdoc @@ -2,100 +2,35 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! - \page creator-editor-refactoring.html - \previouspage creator-jump-to-the-code.html - \nextpage creator-editor-options.html - - \title Refactoring - - To quickly and conveniently apply actions to refactor your - code, \l{Apply quick fixes}{select quick fixes in a context menu}. - - By default, the refactored files are saved automatically. To disable - this feature, deselect \preferences > \uicontrol Environment > - \uicontrol System > \uicontrol {Auto-save files after refactoring}. - - \if defined(qtcreator) - \section1 Finding Symbols - - To find instances of a specific symbol in your Qt C++ project, place the - cursor on the symbol in the editor and select \uicontrol Tools > - \uicontrol {C++} > \uicontrol {Find References to Symbol Under Cursor} or - press \key {Ctrl+Shift+U}. - - \image qtcreator-find-references-to-symbol-under-cursor.png {Search results for finding references to symbols} - - To view the same results color-coded according to the access type, such as - read, write, or declaration, select \uicontrol Tools > \uicontrol {C++} > - \uicontrol {Find References with Access Type}. - - \note Select \uicontrol Edit > \uicontrol {Find/Replace} > - \uicontrol {Advanced Find} > \uicontrol {C++ Symbols} to search for - classes, functions, enums, and declarations (including type aliases) either - from files listed as part of the project or from all files that are used by - the code, such as include files. - \image qtcreator-search-cpp-symbols.png - \endif - - \section1 Viewing Search Results - - \QC searches from the following locations: - - \list - \li Files listed as a part of the project - \li Files directly used by the project files (for example, generated - files) - \if defined(qtcreator) - \li Header files of used frameworks and libraries - \endif - \endlist - - \l{Search Results View} shows the location and number of search hits in the - current project. - - \if defined(qtcreator) - \image qtcreator-refactoring-find.png + \page creator-how-to-rename-symbols.html + \if defined(qtdesignstudio) + \previouspage studio-finding.html \else - \image qml-find-usages.png + \previouspage creator-how-tos.html \endif - Browse the search results in the following ways: + \ingroup creator-how-to-search - \list - \li To go directly to an instance, double-click the instance in - \uicontrol {Search Results}. - \li To move between instances, click the \inlineimage icons/next.png - (\uicontrol {Next Item}) button and \inlineimage icons/prev.png - (\uicontrol {Previous Item}) button in \uicontrol {Search Results}. - \li To expand and collapse the list of all instances, click the - \inlineimage icons/qtcreator-expand.png - (\uicontrol {Expand All}) button. - \li To filter the search results for the usage of symbols according to - access type, such as read, write, or declaration, click the - \inlineimage icons/filtericon.png - (\uicontrol {Filter Tree}) button and select the access type. - \li To clear the search results, click the - \inlineimage icons/clean_pane_small.png - (\uicontrol Clear) button. - \li To start a new search, click the - \inlineimage icons/qtcreator-new-search-icon.png - (\uicontrol {New Search}) button. - \endlist - - \section1 Renaming Symbols + \title Rename symbols You can rename symbols in all files in a project. + \if defined(qtcreator) When you rename a class, you can also change filenames that match the class name. - To rename a C++ symbol in a project, place the cursor - on it and select \uicontrol Tools > \uicontrol {C++} > - \uicontrol {Rename Symbol Under Cursor} or press \key {Ctrl+Shift+R}. - Use the keyboard shortcut to rename Python symbols. + To rename a C++ symbol in a project: + + \list 1 + \li Place the cursor on the symbol in the editor. + \li Go to \uicontrol Tools > \uicontrol {C++} > + \uicontrol {Rename Symbol Under Cursor}, or press \key {Ctrl+Shift+R}. + + Use the keyboard shortcut to rename Python symbols. + \endlist \endif - To rename a QML type in a project, select \uicontrol Tools > + To rename a QML type in a project, go to \uicontrol Tools > \uicontrol {QML/JS} > \uicontrol {Rename Symbol Under Cursor} or press \key {Ctrl+Shift+R}. @@ -109,23 +44,23 @@ \endif To replace all selected instances, enter the name of the new symbol - in the \uicontrol {Replace with} text box, and select \uicontrol Replace. - To omit an instance, deselect the check box next to the instance. + in \uicontrol {Replace with}, and select \uicontrol Replace. + To omit an instance, clear the check box next to the instance. \note This action replaces all selected instances of the symbol in all files listed in \uicontrol {Search Results}. You cannot undo this action. \if defined(qtcreator) - If the symbol is a class, select the \uicontrol {Rename files} check - box to also change the filenames that match the class name. + If the symbol is a class, select \uicontrol {Rename files} to also change + the filenames that match the class name. \note Renaming local symbols does not open \uicontrol {Search Results}. The instances of the symbol are highlighted in code, and you can edit the symbol. All instances of the local symbol are changed as you type. - \sa {Specify settings for quick fixes}, {Quick Fixes}, {C++ Quick Fixes} - + \sa {Find symbols}, {Specify settings for quick fixes}, {Quick Fixes}, + {C++ Quick Fixes} \endif \sa {Apply quick fixes}, {QML Quick Fixes} diff --git a/doc/qtcreator/src/editors/creator-coding.qdoc b/doc/qtcreator/src/editors/creator-coding.qdoc index 38c6f3f5963..5df03c90ccd 100644 --- a/doc/qtcreator/src/editors/creator-coding.qdoc +++ b/doc/qtcreator/src/editors/creator-coding.qdoc @@ -46,13 +46,6 @@ and file systems. \endif - \li \l{Refactoring} - - Code refactoring is the process of improving and simplifying code - without modifying the existing functionality of an application. You - can easily find and rename symbols and apply predefined actions to - refactor code. - \li \l{Configuring the Editor} You can change the fonts, colors, highlighting, and indentation. @@ -65,5 +58,7 @@ \if defined(qtcreator) \sa {Using GitHub Copilot} + \else + \sa {Apply quick fixes} \endif */ diff --git a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc index 1bc7cd48bc9..b958f836558 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc @@ -38,7 +38,9 @@ \li \l{View function tooltips}{Tooltips} - \li \l{Finding Symbols}{Finding and renaming symbols} + \li \l{Find symbols}{Finding symbols} + + \li \l{Rename symbols}{Renaming symbols} \li \l{Apply quick fixes}{Quick fixes} diff --git a/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc b/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc index 7df63851dc7..44cc63bbf60 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc @@ -70,8 +70,8 @@ To return non-trivial objects by using a \c const reference, select the \uicontrol {Return non-value types by const reference} check box. - \sa {Apply quick fixes}, {Specify settings for quick fixes}, - {C++ Quick Fixes}, {QML Quick Fixes}, {Refactoring} + \sa {Apply quick fixes}, {Find symbols}, {Rename symbols}, + {Specify settings for quick fixes}, {C++ Quick Fixes}, {QML Quick Fixes} */ /*! @@ -786,8 +786,8 @@ \li Documentation comment for a function \endtable - \sa {Apply quick fixes}, {Specify settings for quick fixes}, - {QML Quick Fixes}, {Quick Fixes}, {Refactoring} + \sa {Apply quick fixes}, {Find symbols}, {Rename symbols}, + {Specify settings for quick fixes}, {QML Quick Fixes}, {Quick Fixes} */ /*! @@ -811,6 +811,6 @@ delete the custom settings, select \uicontrol {Use global settings}, and then select \uicontrol {Delete Custom Settings File}. - \sa {Apply quick fixes}, {C++ Quick Fixes}, {QML Quick Fixes}, {Quick Fixes}, - {Configuring Projects}, {Refactoring} + \sa {Apply quick fixes}, {Find symbols}, {Rename symbols}, + {C++ Quick Fixes}, {QML Quick Fixes}, {Quick Fixes}, {Configuring Projects} */ diff --git a/doc/qtcreator/src/editors/creator-only/creator-how-to-find-symbols.qdoc b/doc/qtcreator/src/editors/creator-only/creator-how-to-find-symbols.qdoc new file mode 100644 index 00000000000..b377f8c7da0 --- /dev/null +++ b/doc/qtcreator/src/editors/creator-only/creator-how-to-find-symbols.qdoc @@ -0,0 +1,60 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page creator-editor-how-to-find-symbols.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-search + + \title Find symbols + + You can search for references to a particular symbol or search for symbols + with a name that matches a pattern. + + \section1 Find references to a symbol + + To find instances of a particular symbol in your Qt C++ project: + + \list 1 + \li Place the cursor on the symbol in the editor. + \li Go to \uicontrol Tools > \uicontrol {C++} > + \uicontrol {Find References to Symbol Under Cursor}, + or press \key {Ctrl+Shift+U}. + \image qtcreator-find-references-to-symbol-under-cursor.png {Search results for finding references to symbols} + \endlist + + \section2 Color-code access type + + To view the same results color-coded according to the access type, such as + read, write, or declaration, go to \uicontrol Tools > \uicontrol {C++} > + \uicontrol {Find References with Access Type}. + + \section1 Find symbols that match search criteria + + Go to \uicontrol Edit > \uicontrol {Find/Replace} > + \uicontrol {Advanced Find} and select \uicontrol {C++ Symbols} to search for + classes, functions, enums, and declarations (including type aliases) either + from files listed as part of the project or from all files that are used by + the code, such as include files. + + \image qtcreator-search-cpp-symbols.png + + \QC searches from the following locations: + + \list + \li Files listed as a part of the project + \li Files directly used by the project files (for example, generated + files) + \li Header files of used frameworks and libraries + \endlist + + \section1 View found symbols + + \l{Search Results View} shows the location and number of search hits in the + current project. + + \image qtcreator-refactoring-find.png + + \sa {Search}{How To: Search}, {Search Results View} +*/ diff --git a/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc b/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc index a89ca3c7ef8..7572451a83e 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc @@ -36,8 +36,8 @@ \l{Outline} view or in the \uicontrol Symbols list on the \l{Edit Mode}{editor toolbar} \li \l{Call Hierarchy}{Viewing the callers and callees of a function} - \li \l{Finding Symbols}{Finding references to symbols} - \li \l{Renaming Symbols}{Renaming the symbol under cursor} + \li \l{Find references to a symbol}{Finding references to symbols} + \li \l{Rename symbols}{Renaming the symbol under the cursor} \li Code actions \li Displaying diagnostics from the language server as tooltips. You can also select a code range to display diagnostics for. diff --git a/doc/qtcreator/src/editors/creator-quick-fixes.qdoc b/doc/qtcreator/src/editors/creator-quick-fixes.qdoc index af49d65612d..a2db91d7610 100644 --- a/doc/qtcreator/src/editors/creator-quick-fixes.qdoc +++ b/doc/qtcreator/src/editors/creator-quick-fixes.qdoc @@ -4,12 +4,14 @@ /*! \page creator-editor-quick-fixes.html \if defined(qtdesignstudio) - \previouspage creator-editor-refactoring.html + \previouspage creator-jump-to-the-code.html + \nextpage creator-reference-qml-quick-fixes.html \else \previouspage creator-how-tos.html \endif \ingroup creator-how-to-edit + \ingroup studio-code-view \title Apply quick fixes @@ -35,6 +37,10 @@ Or, press \key {Alt+Enter} to open a context menu that has quick fixes available in the current cursor position. + By default, the refactored files are saved automatically. To turn off + this feature, go to \preferences > \uicontrol Environment > + \uicontrol System and select \uicontrol {Auto-save files after refactoring}. + \if defined(qtcreator) \section1 Create functions @@ -85,21 +91,24 @@ \image qtcreator-refactoring-constructor.png "Constructor dialog" - \sa {Specify settings for quick fixes}, {Quick Fixes}, {C++ Quick Fixes} + \sa {Find symbols}, {Specify settings for quick fixes}, {Quick Fixes}, + {C++ Quick Fixes} \endif - \sa {QML Quick Fixes}, {Refactoring} + \sa {Rename symbols}, {QML Quick Fixes} */ /*! \page creator-reference-qml-quick-fixes.html \if defined(qtdesignstudio) - \previouspage creator-editor-refactoring.html + \previouspage creator-editor-quick-fixes.html + \nextpage creator-editor-options.html \else \previouspage creator-reference.html \endif \ingroup creator-reference + \ingroup studio-code-view \title QML Quick Fixes @@ -168,10 +177,10 @@ \endtable - \sa {Apply quick fixes}, {Refactoring} + \sa {Apply quick fixes}, {Rename symbols} \if defined(qtcreator) - \sa {Exclude files from to-do lists}, {Specify settings for quick fixes}, - {Quick Fixes}, {C++ Quick Fixes} + \sa {Exclude files from to-do lists}, {Find symbols}, + {Specify settings for quick fixes}, {Quick Fixes}, {C++ Quick Fixes} \endif */ diff --git a/doc/qtcreator/src/editors/creator-search.qdoc b/doc/qtcreator/src/editors/creator-search.qdoc index 42ca482a5f3..e47957f48e1 100644 --- a/doc/qtcreator/src/editors/creator-search.qdoc +++ b/doc/qtcreator/src/editors/creator-search.qdoc @@ -215,7 +215,7 @@ \l {Preserve case when replacing} apply here as well. \if defined(qtcreator) - \sa {Search}{How To: Search}, {Finding Symbols}, {Turn on Silver Searcher} + \sa {Search}{How To: Search}, {Find symbols}, {Turn on Silver Searcher} \else \sa {Search in current file} \endif diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index c1b310e6c9c..1f5acccca57 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -36,7 +36,6 @@ \li \l{Using Text Editing Macros} \li \l{Comparing Files} \endlist - \li \l{Refactoring} \li \l{Configuring the Editor} \li \l{Using GitHub Copilot} \endlist diff --git a/doc/qtcreator/src/qtcreator.qdoc b/doc/qtcreator/src/qtcreator.qdoc index eaceebf177d..f828eb6995c 100644 --- a/doc/qtcreator/src/qtcreator.qdoc +++ b/doc/qtcreator/src/qtcreator.qdoc @@ -50,7 +50,6 @@ \li \b {\l{Coding}} \list \li \l{Writing Code} - \li \l{Refactoring} \li \l{Configuring the Editor} \endlist \li \b {\l{Building and Running}} diff --git a/doc/qtcreator/src/user-interface/creator-open-documents-view.qdoc b/doc/qtcreator/src/user-interface/creator-open-documents-view.qdoc index 3eb7a3c2d4c..87760c448c6 100644 --- a/doc/qtcreator/src/user-interface/creator-open-documents-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-open-documents-view.qdoc @@ -49,7 +49,7 @@ automatically save changed files at the intervals specified in the \uicontrol Interval field. \li Select the \uicontrol {Auto-save files after refactoring} check - box to automatically save \l{Refactoring}{refactored files}. + box to automatically save refactored files. \li Select the \uicontrol {Auto-suspend unmodified files} check box to automatically free the resources of open files after prolonged inactivity. The files are still listed in the @@ -62,4 +62,10 @@ field, set the number of recently opened files listed in \uicontrol File > \uicontrol {Recent Files}. \endlist + + \sa {Apply quick fixes}, {Rename symbols} + + \if defined(qtcreator) + \sa {Find symbols} + \endif */ diff --git a/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc b/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc index 60b8b72d5af..0381320085f 100644 --- a/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc +++ b/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc @@ -142,8 +142,14 @@ \list \li To clear the search results, select \inlineimage icons/clean_pane_small.png (\uicontrol Clear). + \li To move between instances, select \inlineimage icons/next.png + (\uicontrol {Next Item}) and \inlineimage icons/prev.png + (\uicontrol {Previous Item}). \li To expand and collapse the search results, select \inlineimage icons/qtcreator-expand.png (\uicontrol {Expand All}). + \li To filter the search results for the usage of symbols according to + access type, such as read, write, or declaration, select + \inlineimage icons/filtericon.png (\uicontrol {Filter Tree}). \li To start a new search, select \inlineimage icons/qtcreator-new-search-icon.png (\uicontrol {New Search}). diff --git a/doc/qtdesignstudio/src/developers/studio-jump-to-the-code.qdoc b/doc/qtdesignstudio/src/developers/studio-jump-to-the-code.qdoc index d5a83080bfd..f5e9425e009 100644 --- a/doc/qtdesignstudio/src/developers/studio-jump-to-the-code.qdoc +++ b/doc/qtdesignstudio/src/developers/studio-jump-to-the-code.qdoc @@ -4,7 +4,7 @@ /*! \previouspage creator-editor-locator.html \page creator-jump-to-the-code.html - \nextpage creator-editor-refactoring.html + \nextpage creator-editor-quick-fixes.html \title Jump to the Code diff --git a/doc/qtdesignstudio/src/overviews/studio-finding.qdoc b/doc/qtdesignstudio/src/overviews/studio-finding.qdoc index bd1e24a5053..188c7a6cc64 100644 --- a/doc/qtdesignstudio/src/overviews/studio-finding.qdoc +++ b/doc/qtdesignstudio/src/overviews/studio-finding.qdoc @@ -20,6 +20,10 @@ With advanced search, you can search in currently open projects or files on the file system. + \li \l{Rename symbols} + + Search for QML types and rename them in all files in a project. + \li \l{Searching with the Locator} Use the locator to browse diff --git a/doc/qtdesignstudio/src/qtdesignstudio-faq.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-faq.qdoc index f7dec4de039..8f7267e0d3d 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-faq.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-faq.qdoc @@ -109,7 +109,7 @@ However, you can rename symbols in all files within a project. To rename a QML type in a project, select \uicontrol Tools > \uicontrol QML/JS > \uicontrol {Rename Symbol Under Cursor} or press \key Ctrl+Shift+R. For more - information, see \l {Renaming Symbols}. + information, see \l {Rename symbols}. \section2 How can I add .qml files to my project in Qt Creator? diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index f18a71fb65a..5c34bad6e86 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -213,10 +213,12 @@ \list \li \l{Search in current file} \li \l{Search in projects or file systems} + \li \l{Rename symbols} \li \l{Searching with the Locator} \li \l{Jump to the Code} \endlist - \li \l{Refactoring} + \li \l{Apply quick fixes} + \li \l{QML quick fixes} \li \l{Configuring the Editor} \list \li \l{Font & Colors} diff --git a/doc/qtdesignstudio/src/views/qtquick-text-editor.qdoc b/doc/qtdesignstudio/src/views/qtquick-text-editor.qdoc index f2f5a80ade4..f6666daa50b 100644 --- a/doc/qtdesignstudio/src/views/qtquick-text-editor.qdoc +++ b/doc/qtdesignstudio/src/views/qtquick-text-editor.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2021 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! @@ -17,10 +17,6 @@ You can also view and modify other types of text files. - To open the search dialog in the \uicontrol {Code} view, go to - \uicontrol Edit > \uicontrol {Find/Replace} > \uicontrol {Find/Replace}. - You can also select \key Ctrl + \key {F}. - The view offers the following features: \list @@ -30,4 +26,23 @@ \li \l{Indent text or code} \li \l{Using Qt Quick Toolbars} \endlist + + \section1 Refactoring Code + + Code refactoring is the process of improving and simplifying code without + modifying the existing functionality of an application. You can easily find + and rename symbols and apply quick fixes in the \uicontrol Code view to + refactor code. + + \section1 Searching in Code + + To open the search dialog in the \uicontrol {Code} view: + + \list + \li Go to \uicontrol Edit > \uicontrol {Find/Replace} > + \uicontrol {Find/Replace}. + \li Select \key Ctrl + \key {F} (or \key Cmd + \key F on \macos). + \endlist + + \sa {Finding}, {Apply quick fixes}, {QML Quick Fixes} */ From 44b6dea74048a7a860795d299b89c84588e8b7b4 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Fri, 1 Mar 2024 14:42:29 +0100 Subject: [PATCH 15/87] CompilerExplorer: Use volatile Currently the user can't change the Url. This is for the future. Change-Id: I7854c1dc0e680c9aa4bbb41d44dbcb9540a3b34b Reviewed-by: Cristian Adam --- src/plugins/compilerexplorer/compilerexplorersettings.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/compilerexplorer/compilerexplorersettings.h b/src/plugins/compilerexplorer/compilerexplorersettings.h index 4b3ac849a2c..cd8c9533638 100644 --- a/src/plugins/compilerexplorer/compilerexplorersettings.h +++ b/src/plugins/compilerexplorer/compilerexplorersettings.h @@ -39,7 +39,8 @@ public: Api::Config apiConfig() const { - return Api::Config(Utils::NetworkAccessManager::instance(), compilerExplorerUrl()); + return Api::Config(Utils::NetworkAccessManager::instance(), + compilerExplorerUrl.volatileValue()); } }; From 5d41ab126f84dccf9351deaeb296751aeb6ed8e3 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 29 Feb 2024 17:22:57 +0100 Subject: [PATCH 16/87] ProjectExplorer: Expand selected details widgets in target setup page Rationale: - Selecting and unselecting should behave symmetrically. - The user is informed of and can easily change the set of pre-configured build configurations. Fixes: QTCREATORBUG-30412 Change-Id: I86e6a41c3baed280df9a694d6cf6eb631cb537f9 Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Marcus Tillmanns --- src/plugins/projectexplorer/targetsetupwidget.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/plugins/projectexplorer/targetsetupwidget.cpp b/src/plugins/projectexplorer/targetsetupwidget.cpp index 3ccf02b38de..0e2127706fb 100644 --- a/src/plugins/projectexplorer/targetsetupwidget.cpp +++ b/src/plugins/projectexplorer/targetsetupwidget.cpp @@ -103,6 +103,7 @@ void TargetSetupWidget::setKitSelected(bool b) b &= hasSelectedBuildConfigurations(); const GuardLocker locker(m_ignoreChanges); m_detailsWidget->setChecked(b); + m_detailsWidget->setState(b ? DetailsWidget::Expanded : DetailsWidget::Collapsed); m_detailsWidget->widget()->setEnabled(b); } @@ -168,12 +169,7 @@ void TargetSetupWidget::targetCheckBoxToggled(bool b) if (m_ignoreChanges.isLocked()) return; m_detailsWidget->widget()->setEnabled(b); - if (b && (contains(m_infoStore, &BuildInfoStore::hasIssues) - || !contains(m_infoStore, &BuildInfoStore::isEnabled))) { - m_detailsWidget->setState(DetailsWidget::Expanded); - } else if (!b) { - m_detailsWidget->setState(DetailsWidget::Collapsed); - } + m_detailsWidget->setState(b ? DetailsWidget::Expanded : DetailsWidget::Collapsed); emit selectedToggled(); } From 832fde9e0e359c5b6a7ce8d2f3441028acd03206 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 15 Feb 2024 10:33:27 +0100 Subject: [PATCH 17/87] CMake: Exclude non-project CMake files from search All the CMake files the belong to packages found with `find_package` are part of the project tree, but we shouldn't include them when searching through "files in the project". Set listInProjects to false for these files. Fixes: QTCREATORBUG-30372 Change-Id: If39d477f14dc3207f4e2dd66b2f3969811dbd863 Reviewed-by: Cristian Adam Reviewed-by: --- .../cmakeprojectmanager/projecttreehelper.cpp | 16 ++++++++++------ .../cmakeprojectmanager/projecttreehelper.h | 3 ++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp index fb7ca301667..e17505095a6 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp @@ -35,7 +35,8 @@ void addCMakeVFolder(FolderNode *base, int priority, const QString &displayName, std::vector> &&files, - bool sourcesOrHeaders) + bool sourcesOrHeaders, + bool listInProject) { if (files.size() == 0) return; @@ -45,6 +46,10 @@ void addCMakeVFolder(FolderNode *base, folder = newFolder.get(); base->addNode(std::move(newFolder)); } + if (!listInProject) { + for (auto it = files.begin(); it != files.end(); ++it) + (*it)->setListInProject(false); + } folder->addNestedNodes(std::move(files)); folder->forEachFolderNode([] (FolderNode *fn) { fn->compress(); }); } @@ -68,10 +73,7 @@ void addCMakeInputs(FolderNode *root, std::unique_ptr cmakeVFolder = std::make_unique(root->filePath()); QSet knownFiles; - root->forEachGenericNode([&knownFiles](const Node *n) { - if (n->listInProject()) - knownFiles.insert(n->filePath()); - }); + root->forEachGenericNode([&knownFiles](const Node *n) { knownFiles.insert(n->filePath()); }); addCMakeVFolder(cmakeVFolder.get(), sourceDir, @@ -87,7 +89,9 @@ void addCMakeInputs(FolderNode *root, Utils::FilePath(), 10, Tr::tr(""), - removeKnownNodes(knownFiles, std::move(rootInputs))); + removeKnownNodes(knownFiles, std::move(rootInputs)), + /*sourcesOrHeaders=*/false, + /*listInProject=*/false); root->addNode(std::move(cmakeVFolder)); } diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.h b/src/plugins/cmakeprojectmanager/projecttreehelper.h index 08707360ed4..bcd5500db97 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.h +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.h @@ -21,7 +21,8 @@ void addCMakeVFolder(ProjectExplorer::FolderNode *base, int priority, const QString &displayName, std::vector> &&files, - bool sourcesOrHeaders = false); + bool sourcesOrHeaders = false, + bool listInProject = true); std::vector> &&removeKnownNodes( const QSet &knownFiles, From 36c7d971c36b966560a42e453175a5077b3ec6ab Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 4 Mar 2024 09:34:11 +0100 Subject: [PATCH 18/87] LSP: Fix missing icons in call hierarchy Change-Id: I8b10392ac28689ce80dc818cba5ff58f21becb81 Reviewed-by: David Schulz --- src/libs/languageserverprotocol/callhierarchy.cpp | 2 +- src/libs/languageserverprotocol/callhierarchy.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libs/languageserverprotocol/callhierarchy.cpp b/src/libs/languageserverprotocol/callhierarchy.cpp index fc61faf6644..4b19d71fa82 100644 --- a/src/libs/languageserverprotocol/callhierarchy.cpp +++ b/src/libs/languageserverprotocol/callhierarchy.cpp @@ -7,7 +7,7 @@ namespace LanguageServerProtocol { bool CallHierarchyItem::isValid() const { - return contains(nameKey) && contains(symbolKindKey) && contains(rangeKey) && contains(uriKey) + return contains(nameKey) && contains(kindKey) && contains(rangeKey) && contains(uriKey) && contains(selectionRangeKey); } diff --git a/src/libs/languageserverprotocol/callhierarchy.h b/src/libs/languageserverprotocol/callhierarchy.h index a284611a127..1cc022d6d1f 100644 --- a/src/libs/languageserverprotocol/callhierarchy.h +++ b/src/libs/languageserverprotocol/callhierarchy.h @@ -15,8 +15,8 @@ public: QString name() const { return typedValue(nameKey); } void setName(const QString &name) { insert(nameKey, name); } - SymbolKind symbolKind() const { return SymbolKind(typedValue(symbolKindKey)); } - void setSymbolKind(const SymbolKind &symbolKind) { insert(symbolKindKey, int(symbolKind)); } + SymbolKind symbolKind() const { return SymbolKind(typedValue(kindKey)); } + void setSymbolKind(const SymbolKind &symbolKind) { insert(kindKey, int(symbolKind)); } Range range() const { return typedValue(rangeKey); } void setRange(const Range &range) { insert(rangeKey, range); } From add834577b45af4416e62e6ebd2cda9bd733c7ed Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 1 Mar 2024 14:58:22 +0100 Subject: [PATCH 19/87] Doc: Update info about autotests - Split the topic up into how-to and reference topics - Add and remove descriptions of preferences - Move general information to the overview - Describe qdt locator filter Task-number: QTCREATORBUG-30209 Task-number: QTCREATORBUG-29361 Change-Id: Idb29eebaeb2f77326ebbb5e6b5654c135473f329 Reviewed-by: Christian Stenger --- .../qtcreator-autotests-project-qt-test.png | Bin 9867 -> 0 bytes ...creator-autotests-project-qtquick-test.png | Bin 9287 -> 0 bytes .../images/qtcreator-new-file-test-case.webp | Bin 0 -> 6308 bytes .../qtcreator-new-project-boost-test.webp | Bin 0 -> 6572 bytes .../qtcreator-new-project-catch2-test.webp | Bin 0 -> 6958 bytes .../qtcreator-new-project-google-test.webp | Bin 0 -> 6694 bytes .../images/qtcreator-new-project-qt-test.webp | Bin 0 -> 5602 bytes .../qtcreator-new-project-qtquick-test.webp | Bin 0 -> 5368 bytes .../qtcreator-preferences-testing-qttest.webp | Bin 4594 -> 4690 bytes .../qtcreator-projects-settings-testing.webp | Bin 0 -> 3032 bytes .../images/qtcreator-test-results.webp | Bin 0 -> 5048 bytes .../howto/creator-only/creator-autotest.qdoc | 944 ++++++++++-------- .../howto/creator-only/creator-how-tos.qdoc | 12 + .../creator-only/creator-overview.qdoc | 59 +- .../creator-only/creator-reference.qdoc | 2 +- .../creator-only/creator-testing.qdoc | 7 +- .../creator-only/creator-files-creating.qdoc | 4 +- .../creator-projects-creating.qdoc | 4 +- .../projects/creator-projects-running.qdoc | 2 +- doc/qtcreator/src/qtcreator-toc.qdoc | 5 +- doc/qtcreator/src/qtcreator.qdoc | 7 +- 21 files changed, 623 insertions(+), 423 deletions(-) delete mode 100644 doc/qtcreator/images/qtcreator-autotests-project-qt-test.png delete mode 100644 doc/qtcreator/images/qtcreator-autotests-project-qtquick-test.png create mode 100644 doc/qtcreator/images/qtcreator-new-file-test-case.webp create mode 100644 doc/qtcreator/images/qtcreator-new-project-boost-test.webp create mode 100644 doc/qtcreator/images/qtcreator-new-project-catch2-test.webp create mode 100644 doc/qtcreator/images/qtcreator-new-project-google-test.webp create mode 100644 doc/qtcreator/images/qtcreator-new-project-qt-test.webp create mode 100644 doc/qtcreator/images/qtcreator-new-project-qtquick-test.webp create mode 100644 doc/qtcreator/images/qtcreator-projects-settings-testing.webp create mode 100644 doc/qtcreator/images/qtcreator-test-results.webp diff --git a/doc/qtcreator/images/qtcreator-autotests-project-qt-test.png b/doc/qtcreator/images/qtcreator-autotests-project-qt-test.png deleted file mode 100644 index aa5bee758c641cdee31a196f19458ddfddfea18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9867 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 UdrtpkU|?YIboFyt=akR{0H3h>rvLx| diff --git a/doc/qtcreator/images/qtcreator-autotests-project-qtquick-test.png b/doc/qtcreator/images/qtcreator-autotests-project-qtquick-test.png deleted file mode 100644 index 24d61b245aca3603ac8f7774911bcee1e783446e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9287 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 DyWD@~ literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-new-project-catch2-test.webp b/doc/qtcreator/images/qtcreator-new-project-catch2-test.webp new file mode 100644 index 0000000000000000000000000000000000000000..040f2a586b1bb6e81cc855a94e6804ead7627dd5 GIT binary patch literal 6958 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-new-project-google-test.webp b/doc/qtcreator/images/qtcreator-new-project-google-test.webp new file mode 100644 index 0000000000000000000000000000000000000000..eca2110f039f3965ee2a76d518018e9fd390b936 GIT binary patch literal 6694 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 ZbGzDhpLdLUogwuoCH?R5HeRNe900C_*t7ru literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-new-project-qtquick-test.webp b/doc/qtcreator/images/qtcreator-new-project-qtquick-test.webp new file mode 100644 index 0000000000000000000000000000000000000000..82124b958dea7e93a403c5c6b74e271b769b0d8f GIT binary patch literal 5368 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 Lv{|ykGbRQA!sKaw literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-preferences-testing-qttest.webp b/doc/qtcreator/images/qtcreator-preferences-testing-qttest.webp index f6df07907ead584d1fd5a80ab08329a409c7d72b..b4cb5a5db1cf94de9004dbbe4e404e19937566cb 100644 GIT binary patch literal 4690 zcmWIYbaV3(Vqge&bqWXzu<)@HVqnl;d@!3~`7?!WxuG|o+a2br>Gkjxn(!dHwSRAW zdchTsNy@2T&-_YF2$a3dTxfI6=KbzEsl1%qt7g}}V-7sh6T3p|>dFw)4Lm#lKD_(W zeD*fp$jM>lCU$P;s?WD8{VIH z;x5?GZ12$^?eidy$pzbi@3JE>GaBjJexC^Jl^G>y)C#VG&V7vC${`s^x&O;Gvhra&%XDO_OrefC&@5p-Y)r< z`o3OYQAv$q_Qf^JETvpb?({LRw>+JAXl-tr%1XD~*`cP}a&Lps^7LzYy}7gRcK>mf z{-I=~yxKTRBHrb{>c-wD9+Q}2&DZ@>T2<>mueK`c+x=eM+uO1hulcfVn(F(#-!K2R z3>7k77O0r;EAsO}9tpJt%0X& z88WG@n6V(MX`M<0XY6#PC&?`K&r@c#MlcxMUZi!!?^y2U56g{a@3~oelI?Qe-)4*5 z4ENveJ0a1?!(is((ORbPMy7k!4b6LRwg{X*wLpvY(d(ThIZN7Hb9v6K3GT7>F!~q0 zu5aV-lP&tkFMLXL)oWSS(qYqU9iS(DbfZYq)$ck#?^qsKcwqG*iK4WpmA2Dk zFJCpB`PTIJdRZ|shn~AxvcI1{t>IoDY|pgBX}7>DZ{46|(yq?UhE`GxF(!!5AHp}hHVwGkq&X#Z3>i9h{ygaJn zn4Iu=j>8OjPlGKsB)kx+IBc;b?)<;=CvsEdSE{w~ZvONqLd^WGRZ*wpg-7Pr=a2Z> z#GRY1@yzH(_LBwnN@6{CqcmD$Ud&BD`A%%!KfBNK@C~;tI4cBdHnJp|UgflK`bt&dvyXN53&Cbar zY;x+g>$d|p_wPAA{d4Qxdv714S*;CV3e2!(_{mryeR=KXZ429_1@}as6zP-MaYI$1 zd67g>T5jXz{^`cvN$G~&CypGMf9ja*k{f&VtbL~a&w1#+Az_nin%iHFU7l@r-tC>U zg}=9)mnbCgl30^c5AaG2RyUEU2OQ(VbhKiT@8xjb*x` zDEvmJeV4?fw5j*+3n;0o7dm~}b!zf^$IvZjey-Fx^YCj-+I(R)(~f)o3Sn!RR!!tv zTcx43@O4m2O^?Hj7XPiQt^|0vedU<1w{lt5)zjggeJfXbeo74bu{i(VXU>@)g&mfz zJk-Jw@cD`2r(K#ZkMGy|U0C;fO3buRi`y>E%R8dYD!9PkgC|^Up&ZLkEp`uP*+SFj zf2yP|uC6Oy`=rG9PUz3AWe+C>btUKD|8nck)8Hvn@^@uAu3o|66SMoBQ0v=Ga`zH; zzX_f@wRRQTzMZdRC#?UKZq0up%m4qIo9DcpC0CqR7V)?lf4r^w>i&QA9aRFh9;-Jx z)u(M;Eb6i~Nb4^HTdtGP>VAy{=@(KzFF4WBIQ#b;u0<^WpTrmsFW1yKy~u6oeN?4#us`^*F>~ox_-#(!- zBmL~V%enSGi0S;;@al}_8MD5)d{=&xZSR@RNO``Q`oU|K_?-rGhq*iXZXN5qZoTx= zbbasr1(DkszMh|Inx3~u$eQWOOkuX;7Hje|jnw^X@*|yZ|6ZK`ue4k!XL=jUI^+Lb zpLM2fIIs6$iTKW=CxltJ>eD8LC7jC-Eb!@Mefau}Pm*zf(4^|_bM52w1N-xoC9Ke*v|(Q*dAjQ<56?x+9LES~@KxX+Y?hP99O zY4ltyDay)iugQt@7w_<0Z+qES=0I=w#vS+HJJb}sRJ(rXxo(!zM5QI>{rY`}Ub*@+ z^*Hc(3|?&+sy9r-(LSz*cK?03a^8v1iMUiLmb=GszFu{4pB*WjJ`jQYpl zrcb(iqMhTuQir)|FZc3IkL;$;>hKVYnq@ibFjLQexg*x68QqFv4xcg63%v8ZYng~o zK*Ptc>n|wf?sSU!vM+Tm`-;q%9VbPBLRxA1SnNmI>ojK1m6nUQM z%p9ZGq{((Y&1k*#u*JeJSt><#`iN&<&eS5eAlm5SVVftjq8EDkIZ@bkG z|D&E=oGUwaxp}3nJ3Tc-ev-XuHG3C zau3N|>WJbyFs*IHy6IPYWKGrQnf$D|Qqyt3uS3_C_pSRW%lCPCUrqe~RJh+buexN` zw7-&DO_udtEBr2a@Aa<_aogDs)#))#Xm329TzK2_n4Sr5vD~S@uUD+S=*P&gxjyCL zzq9S-^L~B&CcI;Qn&abbi!&oV56@{W5y>|$G)m-sSE+JZe^l=G!@6~hvoCfoGW=e2dV0C|myf+JtJE@9 zWMv#F?{-|y9rHutu;99y{HYA9c5SP5mk)aK^hLC6>+6+#n(CUa*XOCUU-@M8FfjJM z`Tw6gxQ)H86w2N3@HN@{xnW{S)TGP3+bw(8ec#(StkwPay4WP6>iM&!D~@?xPz}Ch z&HnQJkDPO@MpO6$@4nqGu|`8#^~EHnOV;`c9^EU}IR11^J$lsrtOw_=B`%k(mvbJ} z`1E}0W|`;iO?oPOix-8lFWx2nF>Mb^Y(&*_AFJv8^>bLo<;{~-Uu-%p~AX53p{Tx(*RH`ioKmiWOJ zjl0!&&hF&A{C7LoDXY(RUe8`G4?Nm0)jj#LGSkL)0VaZ)wu~)3(U=k@I%_xZj)QD_*)R2>#0@h7sbrZyQn*!_GjFG#n1_@LqJ zp9zW{_Mg5?ow?^Rd#Ty~r|!IIzeNr&GycSF`u4#27YAn>9W1MSb3UPJ+hIO;rHt$6 z&g{3|{(PDBjA^VqZTn8Sv@5SM7V6cBpSf+ppZCK3cMR-5eeo539`P>py1l`2ZT^41 z&+t$Fd8YdReLV3sxV3#<`kfCAPS)m066~AA zh0K235An{I|CY+cY_lM^EHlmHO5HVX&QlAVtq!bpi#m65O03i_2cJ`G#3$8UX7!Qf zt5r2hoxZI0#N}|d&HqA6l{g}qkA0olEP zyOr-RX=$&?5ak28@B8mF$wk4lr0hNixC;tC3DDg9>{{GB_l#U#Ram+RDtnfDXZiqcP?E&btHy(~NauI5cu!8y9-*Kb=D$E=n36MNqC9^KeE-kT3h~(ewGqXu$;-R!kcOI(-|L1)- zf4=V1J1Vq$jSJ)DoyqT-iVjcmxR@@`?kC!}SN_wNsi%^Blu~7KWWx8nc$hiCr7I|a zQ~!p=Itz=V@%JXG1f9@%U(hjwBj=s*dGot0pJqwbhkua7T0 zdobvW{`+MfF&|m)OYC{C(c4&={8p=M@8oaqZkn&#!PLqB@3{S!lfE2Nm}XwAtT$HW zs;N1kWA~#X!eZSH4oy2PwLa~8>+ar|VYbfVrpTwOH(LFTj*8mC6B>*;Y6jR&Wl?=H2yoy zWhS~#dD*n$#bNpD7nkf7IeDjt)pCD$j4J!O!y!**`+YboD!Io}{v-FikMCR_mCtxE z_l@ub)!OgpUeW+0cw?wI4tehs~)3m(L{khAwr0E(;i>)*qx4L{?DP+`jip~7igR?I? z;#o{qTI_UvxtZ};@bToo7e%#PIUKi&ybAX_RiGBJ#&@TL^ha+UF9Xg=R&uYp;?Hob zRo&eqeSzoA+onsr3hT5kwp|k3uhHtOo-lWjk;khFpXqOsvv(g^UMQ>6y5~UDE}z`l zcjx`v>+_N=KyuGcqetQ_!uuy@OZ;M)qQz=cYI86B!6N@pN;w{~CarrWd_1}#=Tk!1 z!4pSsZ+QQ)x2E*Y3#*Nh^+A+#K zlf`}W_o`_bX2r4#RhMiKoSf;iZ1Qw1rwwgpO%_L%3d(@BF`5J$(bVBvF5kbyyep<@!m)gQC|-_O0BbNk-ui`DPfya^ z9c$a@;}ezS_r9rgv#ZLNeEQ<}M(uqZdsLJE{@?$f$&rgYGvts7ufv3P_GvRdcCGLz zd88F!xL4@bME)IHw{FjkTiT`C@R)Z-LErcLPMwL2sZ&-2`h=v~ht0pr3{>tl=3h6@nz8Z6Ik)n}_4n2+Jo?5d-2UZ+bk~26 zlCGu(KF-vsTd*;(JbT8)TKj!|*Yd9kB-aLl6tvoFuh#39@?U)W?yBpVGbWbDtG_kK z)PJQe`)N&u^ya*{(#R_nQa@j++_8`~TRu6f=knRhq0?Q@F8}yJfxR@ux#!qn5t-;L z{yEhf`Wx7=J!tLyCF^| zluqjX&Wx1FbEdC*`mpfHr3>l0veI$)`s^i-JWPKqYV*OOKh2%@ z>E4oeCstfiUNE&pbWurb_q9D2RgaixaYUWmd|IyJ$ir7l7w62iW_Gc0n994};`@P; zON`qz_a-|ZVK(}=GJIZDVE%%+TQ*mCxu@&TjoMq%^^AXkQQGcvcPH0g+Sz?@$MYNU zB9j@jw5PP*+Y{)WFjXTY>g}tg)tA0)vYy;B*^Oc2E+1pQNsFgntMplZ;*HJbUr!24 zm)ks=&~0(ph{NoH^WT?uy0`uA607pGuk^q7+d9f->DJ3!v+Qputn7KrZTsVa=kjan znvx5)IYn}OX7g!2$NB#?&&fQiKIVGC)+udmHx4i_@>=`w-Jv8RSO z$jIBy((FpQl3P{rOLl8^=}Mt^hQP&-ZUpUCejNC+u`obv>m;@MgHx+N&GYpic1%&n=zc64zthT`G^}CELp$Klrcu{^fSv zn&)%e>(0fy#xNIryRiA|>|W*P$1M9lx2?IPykO>*P~%QtPP2J7&5TCZ&V?i?s2#o< zX2!km>?HYLCxjmGx>RIlbW9aovPs@6fVp$V+g&ebEVs{4JhmtN!+&)Tju&cg-|xIJ zWs1ZXfuHGIm)fpEKXI ztoPcnabE?4w^Y&^optlq9*f9d7al8SI{#SGjgMkC`xQ3@em~5fad%nNQe`x7VeoUe0gKW&YcU{*JUoB zc57$bd6zpCtmc+|EoIl4`=@AhtXX90YB^scGlcEx@&v9OZ#=bjoqo6Lxe$gfR5Su`JPlD;M$STd{Z)2`1aJZy#EYM(nb;g;j6En>Qg zj;p45rW!XKRM}Ybgk^CP|4aR)=D#ifn*R~BQ&4)!`~31ZuB?M8au%B+u9&$Usdx}` zc#^HbRL`Y?Qxj%0aZSisy3eC$2HB3(K;VnZNz% zBrnY=+im1_8)f!3E;Vcjv0_%5_UH7a*MCLg1Ok2=n*k<%2!U!@y2C<+eNOi@>c1`yEz(6qutBczWq2Nrx>y zyc=8+KwWLrF6X0NZOv%gNo)#SVtWiNBQHqD#)$3Ob} zef@tD{dI+p@-BRQp7Pc-`}gF>Cvr}mF*8>dEUf$3aHB4G=fVyQr_^bo^gj}q%40-bJebm zlV+(N`t#_-KVRG1O>&!N>n?3<=;^zlbF(PyQ_1x&3Q2z+8C?NMev$5eI$_7>>)W%1 z7s#)>e`L#?AR}P`-@3x2XX@UwXCFN%?5)W&J7xXuKNT~#gmHScJ?wE{`FV6A^G5$| z*B!ggJUs1p^UunQ=385@9N>F5ZL-bXt-c_6?u+t{Z|)!1e0O=ja&&6tX-?C#)emC4 z8uT{^84a*FQM(9MgZ7zxG(w5wo}j(iffY*6;tZc-`Me{K^;A)2_K~n9kUo zv1(4#=c7P9Y4Ug|LQ9v zJMU|D#?lv--G6NMIz)Qb{+Z7s3MLl&I;gyQBUw55tJNR9V4;sIcRKPsEcvPQ+1$Ng zBKNE{W>Kvx7Z{BJ8=D^Zv-wyMhy?;hjZ^wy=%R~&#eOOJb|GX1^*nH)Rf^FX7 zx*aQj&fa-QRowEjN=M0--}xrX>T>ks0 zb})nIieuLnJ>{9?5U47m`#r$oj2z!9nTL7>5nLx#L=74j#~sua*z_o7)#@nD7Z&b+ zA3bAxu}37g;}#Eyz&;<#5rg8{?;NNm#ae8_-aiOc6trXM)5 z;}h$OZxQ$IxfJfOy!J;!Lh|(0^JcAuyZ4DJ9la>8m=h|o{bA9PA4ip2bXPsnOV2f0 zYI5wtzm1!PbG=e_9`M`MHC^PM-ODrqv)5C#%Z+{)UhdD{*AQ(w>%zB|@Vg1sy2lJ} z-iVzx%`HpOZoSuyCF1X{$XhBGem&G0edWQATmFVcJ9KIrllJ_pUt4W@?Dbb}*+-vO zHTQBo-ry$YdU|2p6-QZ}4IYIzHd<|buf6ofiSs`H7^UMAwr>CR#zS{o`Sqnsd$-=W z5&PkD57&)utF7|fu3d}!uFkBDKYU`oX;c3<^K0B$%XjVF{pfipdwjS=yU8s!zs>}q zCrU>(f?=KK%85vG7ih!lb+W92?)fb~^rc?d!+cPFIy;CKi<_ ziD~++{VinW_Rnz@clCt-HghjtJ(PQ{ZiR}U=Au&<^_^ZPG`e;Lzuwo9@FZQWzV=7h zuQNZ+hyK0OF+W^3=fdXn{M2uUm&u=BmHot|Jz4VBvi}M(67KeK!TYOwOQx&-+4IUl zwS4uz12=arKj~xEuDs1^+5cH~(+n4B3Ny|2AK^ zjGTRZjwjr^)-WqU@rl&+zRbQYb2b^ZuNNRODG4so`%^@=vf7;w8*=P6ikY?jib}=VD?>xaL z+jpCiaPZzN&fj||CKLpt8LRFR5z@N>9$$R;X0l=Dp^B=u^s8=(Yp(r$e(_4qmAjjE{i-p)_Th`fyO!B0JM7r1 zRgW3$_AL^!PU$})Ht$}SW%pYnZ-v$p?QoT%XNTqX`&)fZo80F(@451?+MN3>mGkDm z6uM!Z7L=;Vwm|UN+0U>4U9VqoefIfJHRA7tx?Y9U8c5FN3XILj&`Btr@%;YrdGhxU z+sGdjZHiKUHtlbDzvz0k1#8sG7>?z09|k|KG?Ry0PeK$vMfS z%~v|4!$TiyWq!y{;kEW)U#Xg}Gr8e?&?51J*(dlbA8~%2(7Y*7=l`)M)z`PYT{+=p z>E&rWryX}plla*3?Nr&B$Tjn~_w4)>7FV+EMa7bqc}yw{uIi?b?@u|OFMi6;vT+N~ z3DB0Zv9{V`@Q)3{ZGZqwSpe- z^5+zpCW=e&J`V+>a>~L$!5KR8i@$ciHjlAS5F#adC&|oQ%(z78)(NJ@N4WNp_VU zXH8%I`+fBF_uogGL#jmd|2*2Ir>L;PX<5qR(x5Oww%2ZL8q)J##Z8@3-Qx3b>bBn5 z8apm6UXyq*_mtzZ52tP&JG(uwqS~u#`t_Em-WsiJY4gba7O^X~XqW9gv=}6PMPKiN z-sID&>Zh3X0wQnkSorJc$JTe}c%`RJt#0vsXxyE<=iUDJJ?r+z%iL$oW-4B1P?BY$ z8FlW&@1J?qt;@E)?W_fiUzeW({Aaq#}hsO)?EMl{NmLk z3$3LBzW?96vtrAE^kT(1MgFg4yRP(k_2S3R?-x3~^s3D0J^!fa^@X25jdo4_rha_7)?U6>9ye#(cTc-~ za+9NQP?eh6LH26FlM901EsVbCy1PJNeOar{5kKL(_cTxYg{zkQXgIyL`TOmyjdn-a zxJw@4aw#QvDI}koO9wq|J&SWV&|0wS9PX9Y=3AC-dAY z5yn$%op=3+T$EWLC{+A0s zdEn`_ho3+5+7$d@-u1vL;by7T^=nO98-!%Mm63qTnOw diff --git a/doc/qtcreator/images/qtcreator-projects-settings-testing.webp b/doc/qtcreator/images/qtcreator-projects-settings-testing.webp new file mode 100644 index 0000000000000000000000000000000000000000..6f8fe53a22f287e8c697169d6f9d39f839ed4158 GIT binary patch literal 3032 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 \uicontrol Testing - > \uicontrol General. - - The detection of tests is usually much faster for build system based - tests as this normally does not involve scanning or parsing. - The information in the tests tree is usually more detailed - when using code based tests. - - If you enable both code based and build system based tests, you - may duplicate tests inside the tests tree. See also \l {Selecting Tests to Run}. - - \section1 Creating Tests - - Use a wizard to create projects that have tests. - - \section2 Creating Qt and Qt Quick Tests - - To create a Qt or Qt Quick test: + To create a Qt test: \list 1 - \li Select \uicontrol File > \uicontrol {New Project} > - \uicontrol {Test Project} > \uicontrol {Qt Test Project} > - \uicontrol Choose to create a project with boilerplate code for a - Qt test, or \uicontrol File > \uicontrol {New Project} > - \uicontrol {Test Project} > \uicontrol {Qt Quick Test Project} > - \uicontrol Choose to create a Qt Quick test. - + \li Go to \uicontrol File > \uicontrol {New Project} > + \uicontrol {Test Project}. + \li Select \uicontrol {Qt Test Project} > \uicontrol Choose. \li In the \uicontrol {Project and Test Information} dialog, specify - settings for the project and test: - - \list 1 - - \li For a Qt test, select the \uicontrol {GUI Application} check - box to create a Qt application. - - \image qtcreator-autotests-project-qt-test.png {Autotest project wizard - Qt Test} - - \li In the \uicontrol {Test case name} field, enter a name for - the test case. - - \li For a Qt test, select the \uicontrol {Requires \QApplication} - check box to add the include statement for QApplication to - the main.cpp file of the project. - - \li For a Qt Quick test, select the - \uicontrol {Generate setup code} check box to execute C++ - code before running any of the QML tests. The testing - framework will call slots and invocable functions, as - described in \l{Executing C++ Before QML Tests}. - - \image qtcreator-autotests-project-qtquick-test.png {Autotest project wizard - Qt Quick Test} - - \li Select the \uicontrol {Generate initialization and cleanup - code} checkbox to add functions to your test that the - testing framework executes to initialize and clean - up the test. - - \li In the \uicontrol {Build system} field, select the build - system to use for building the project: qmake, CMake, or - Qbs. - - \endlist - + settings for the project and test. + \image qtcreator-new-project-qt-test.webp {Project and Test Information - Qt Test} + \li In \uicontrol {Test case name}, enter a name for the test case. + \li Select \uicontrol {Requires \QApplication} to add the include + statement for QApplication to the main.cpp file of the project. + \li Select \uicontrol {GUI Application} to create a Qt application. + \li Select \uicontrol {Generate initialization and cleanup code} + to add functions to your test that the testing framework + executes to initialize and clean up the test. + \li In \uicontrol {Build system}, select the build system to use + for building the project: CMake, qmake, or Qbs. \endlist \QC creates the test in the specified project directory. Edit the .cpp file - to add private slots for each test function in your test. For more information - about creating Qt tests, see \l{Creating a Test}. + to add private slots for each test function in your test. - \section2 Creating Google Tests + For more information about creating Qt tests, see \l{Creating a Test}. + + \sa {Test}{How To: Test}, {Select the build system}, {Testing}, + {Test Results} +*/ + +/*! + \page creator-how-to-create-qtquick-tests.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-test + + \title Create Qt Quick tests + + \QC integrates the \l{Qt Quick Test} unit test framework for Qt Quick + applications, where you write test cases as JavaScript functions. + + To create a Qt Quick test: + + \list 1 + \li Go to \uicontrol File > \uicontrol {New Project} > + \uicontrol {Test Project}. + \li Select \uicontrol {Qt Quick Test Project} > \uicontrol Choose. + \li In the \uicontrol {Project and Test Information} dialog, specify + settings for the project and test. + \image qtcreator-new-project-qtquick-test.webp {Project and Test Information - Qt Quick Test} + \li In \uicontrol {Test case name}, enter a name for the test case. + \li Select \uicontrol {Generate setup code} to execute C++ + code before running any of the QML tests. The testing + framework will call slots and invocable functions, as + described in \l{Executing C++ Before QML Tests}. + \li Select \uicontrol {Generate initialization and cleanup code} + to add functions to your test that the testing framework + executes to initialize and clean up the test. + \li In \uicontrol {Build system}, select the build system to use + for building the project: CMake, qmake, or Qbs. + \endlist + + \QC creates the test in the specified project directory. Edit the .cpp file + to add private slots for each test function in your test. + + \sa {Test}{How To: Test}, {Select the build system}, {Testing}, + {Test Results} +*/ + +/*! + \page creator-how-to-create-google-tests.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-test + + \title Create Google tests To create a Google test: \list 1 - \li Select \uicontrol File > \uicontrol {New Project} > - \uicontrol {Test Project} > \uicontrol {Google Test Project} > - \uicontrol Choose to create a project with boilerplate code for a - Google test. + \li Go to \uicontrol File > \uicontrol {New Project} > + \uicontrol {Test Project}. + + \li Select \uicontrol {Google Test Project} > \uicontrol Choose to create + a project with boilerplate code for a Google test. \li In the \uicontrol {Project and Test Information} dialog, specify settings for the project and test: + \image qtcreator-new-project-google-test.webp {Project and Test Information - Google test} + \list 1 - \li In the \uicontrol {Test framework} field, select + \li In \uicontrol {Test framework}, select \uicontrol {Google Test (shared libraries)} to link against - Google Test, or \uicontrol {Google Test (headers only)} to + Google Test or \uicontrol {Google Test (headers only)} to include necessary Google Test sources into the project. - \li In the \uicontrol {Test suite name} field, enter a name for + \li In \uicontrol {Test suite name}, enter a name for the test suite. - \li In the \uicontrol {Test case name} field, enter a name for + \li In \uicontrol {Test case name}, enter a name for the test case. - \li Select the \uicontrol {Enable C++ 11} check box to - support C++ 11 features in the test. + \li For a shared library test, you can set the path to a + Google C++ testing framework installation in + \uicontrol {Googletest install directory (optional)}. - \li In the \uicontrol {Google test repository} field, select - a directory that has a clone of the googletest - repository. + \li For a header-only test, you can set the path to + a googletest repository clone in + \uicontrol {Googletest source directory (optional)}. - To use an installed Google C++ Testing framework instead, - see \l{Setting Up the Google C++ Testing Framework}. - - \li In the \uicontrol {Build system} field, select the build - system to use for building the project: qmake, CMake, or - Qbs. + \li In \uicontrol {Build system}, select the build system to use + for building the project: CMake, qmake, or Qbs. \endlist \endlist \QC creates the test in the specified project directory. + For more information about creating Google tests, see the \l{https://github.com/google/googletest/blob/master/docs/primer.md} {Google Test Primer}. - \section2 Creating Boost Tests + \sa {Test}{How To: Test}, {Select the build system}, {Testing}, + {Test Results} +*/ - To build and run Boost tests, you must have the Boost.Test installed on the - development host. Typically, the Boost installation includes it. You can - download Boost from \l{https://www.boost.org/}{Boost.org}. +/*! + \page creator-how-to-create-boost-tests.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-test + + \title Create Boost tests + + To build and run Boost tests, install Boost.Test on the computer. + Typically, the Boost installation includes it. Download Boost from + \l{https://www.boost.org/}{Boost.org}. If the compiler and build system can find the Boost libraries, you do not need to specify the include directory when creating the test. @@ -169,37 +159,49 @@ To create a Boost test: \list 1 - \li Select \uicontrol File > \uicontrol {New Project} > - \uicontrol {Test Project} > \uicontrol {Boost Test Project} > + \li Go to \uicontrol File > \uicontrol {New Project} > + \uicontrol {Test Project}. + \li Select \uicontrol {Boost Test Project} > \uicontrol Choose to create a project with boilerplate code for a Boost test. \li In the \uicontrol {Project and Test Information} dialog, specify settings for the project and test: + \image qtcreator-new-project-boost-test.webp {Project and Test Information - Boost test} \list 1 - \li In the \uicontrol {Test framework} field, select - \uicontrol {Boost Test (headers only)} to include needed + \li In \uicontrol {Test framework}, select + \uicontrol {Boost Test (header only)} to include needed headers, or \uicontrol {Boost Test (shared libraries)} to link against Boost Test. - \li In the \uicontrol {Test suite name} field, enter a name for + \li In \uicontrol {Test suite name}, enter a name for the test suite. - \li In the \uicontrol {Test case name} field, enter a name for + \li In \uicontrol {Test case name}, enter a name for the test case. - \li In the \uicontrol {Boost include dir (optional)} field, + \li In \uicontrol {Boost include directory (optional)}, enter the path to the directory that has files needed by Boost.Test, such as \e version.hpp and the \e test subfolder that contains the test header files. - \li In the \uicontrol {Build system} field, select the build - system to use for building the project: qmake, CMake, or - Qbs. + \li In \uicontrol {Build system}, select the build + system to use for building the project: CMake, qmake, or Qbs. \endlist \endlist \QC creates the test in the project directory. + For more information about creating Boost tests, see \l{https://www.boost.org/doc/libs/1_81_0/libs/test/doc/html/index.html} {Boost.Test}. - \section2 Creating Catch2 Tests + \sa {Test}{How To: Test}, {Select the build system}, {Testing}, + {Test Results} +*/ + +/*! + \page creator-how-to-create-catch2-tests.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-test + + \title Create Catch2 tests To build and run Catch2 tests, you can either install Catch2 libraries and headers or use the single include header file in the @@ -211,38 +213,50 @@ To create a basic Catch2 test: \list 1 - \li Select \uicontrol File > \uicontrol {New Project} > - \uicontrol {Test Project} > \uicontrol {Catch2 Test Project} > - \uicontrol Choose to create a project with boilerplate code for a - Catch2 test. + \li Go to \uicontrol File > \uicontrol {New Project} > + \uicontrol {Test Project}. + \li Select \uicontrol {Catch2 Test Project} > \uicontrol Choose to create + a project with boilerplate code for a Catch2 test. \li In the \uicontrol {Project and Test Information} dialog, specify settings for the project and test: + \image qtcreator-new-project-catch2-test.webp {Project and Test Information dialog - Catch2 test} \list 1 - \li In the \uicontrol {Test framework} field, select + \li In \uicontrol {Test framework}, select \uicontrol {Catch2 v3 (shared libraries)} to link against Catch2 (recommended for version 3), or \uicontrol {Catch2 v2 (header only)} to use a single header include (recommended for version 2). - \li In the \uicontrol {Test case name} field, specify a name + \li In \uicontrol {Test case name}, specify a name for the test case file. - \li Select the \uicontrol {Use Qt libraries} check box - to use a self-defined main function and set up the project - to use Qt features. - \li In the \uicontrol {Catch2 include directory (optional)} field, - you may enter a path to the directory that has the + \li In \uicontrol {Catch2 install directory (optional)}, + you can enter a path to the directory that has the Catch2 header files. - \li In the \uicontrol {Build system} field, select the build - system to use for building the project: qmake, CMake, or - Qbs. + \li Select \uicontrol {Use own main} to use a self-defined + main function. + \li Select \uicontrol {Use Qt libraries} set up the project to + use Qt features. + \li In \uicontrol {Build system}, select the build + system to use for building the project: CMake, qmake, or Qbs. \endlist \endlist \QC creates the test in the project directory. + For more information about creating Catch2 tests, see \l{https://github.com/catchorg/Catch2/blob/master/docs/Readme.md} {Catch2}. - \section2 Creating CTest Based Tests + \sa {Test}{How To: Test}, {Select the build system}, {Testing}, + {Test Results} +*/ + +/*! + \page creator-how-to-create-ctests.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-test + + \title Create CTest Based Tests CTest can execute tests for CMake based projects regardless of the test framework. You configure tests in the project file, usually, CMakeLists.txt. @@ -256,75 +270,52 @@ Add \c test_example as an executable before trying to register it as test. It may be any executable command including arguments. - For detailed information on how to use CTest see + + For more information about how to use CTest, see \l{https://gitlab.kitware.com/cmake/community/-/wikis/doc/ctest/Testing-With-CTest} {Testing with CTest}. - \section1 Adding Tests To Existing Test Projects + \sa {Test}{How To: Test}, {Select the build system}, {Testing}, + {Test Results} +*/ - Use a wizard to add a new file containing additional tests for projects - containing a test project. +/*! + \page creator-how-to-add-tests-to-projects.html + \previouspage creator-how-tos.html - Select \uicontrol File > \uicontrol {New File} > \uicontrol {Test Case} > - \uicontrol Choose to add a new test case. + \ingroup creator-how-to-test - \note This is only supported for code based test frameworks except for + \title Add tests to existing test projects + + To add a new file that has test cases to a project that contains a test + project: + + \list 1 + \li Go to \uicontrol File > \uicontrol {New File}. + \li Select \uicontrol {Test Case} > \uicontrol Choose. + \li In \uicontrol {Test framework}, select the test framework in use. + This has to match the test framework you are using inside the project + you want to add this file to. + \image qtcreator-new-file-test-case.webp {Test Information dialog} + \endlist + + The settings to specify depend on the selected test framework. + + \note This is only supported for code based test frameworks, except for Qt Tests. There is no official support for having multiple test cases - inside a single Qt test application and it is better to create + inside a single Qt test application, and it is better to create a separate test sub project for each test case. - In \uicontrol {Test framework}, select the test framework in use. - This has to match the test framework you are using inside the project - you want to add this file to. + \sa {Test}{How To: Test}, {Testing}, {Test Results} +*/ - Depending on the chosen test framework, you can specify the test case - name, test suite name, the used filename, or further options. For a - detailed explanation, see the general information provided for each - test framework on its own in \l {Creating Tests}. +/*! + \page creator-how-to-build-and-run-tests.html + \previouspage creator-how-tos.html - \section1 Setting Up the Google C++ Testing Framework + \ingroup creator-how-to-test - To build and run Google tests, install and configure the Google C++ Testing - framework on the development host. You can either clone it from Git Hub or - install it from an installation package. - - To configure a project to use a cloned Google testing framework, edit the - \c INCLUDEPATH variable in the project file (.pro) to include the source - and \c include folders of Google Test's \c googletest and \c googlemock. - Usually, you need to add the following subfolders: - - \list - \li \c googletest - \li \c googlemock - \li \c googletest/include - \li \c googlemock/include - \endlist - - Also, add the necessary files to the \c SOURCES variable. For example: - - \list - \li \c googletest/src/gtest-all.cc - \li \c googlemock/src/gmock-all.cc - \endlist - - To configure a project to use an installed Google testing framework package, - add the following include paths to the .pro file: - - \list - \li \c /include/gtest - \li \c /include/gmock - \endlist - - Then add linker options to be able to find the libraries and to link against - them. For example, for qmake based projects, you typically need to add the - following values to the .pro file: - - \list - \li \c {LIBS += -lgtest -L} - \li \c {LIBS += -lgmock -L} - \endlist - - \section1 Building and Running Tests + \title Build and run tests To build and run tests: @@ -334,7 +325,7 @@ \li In the \uicontrol Tests view, select the tests to run. - \li In the \uicontrol {Test Results}, select: + \li In the \uicontrol {Test Results} view, select: \list \li \inlineimage icons/run_small.png @@ -359,20 +350,20 @@ To run the selected tests without deployment, select \uicontrol {Run Selected Tests Without Deployment}. - The functions to run tests are also available in the context menu in the - \uicontrol Tests view and in \uicontrol Tools > \uicontrol Tests. + You can run tests also from the context menu in the \uicontrol Tests view or + by going to \uicontrol Tools > \uicontrol Tests. \note If you enable both build system based and code based tests, - you may run tests twice when using \uicontrol {Run All Tests} or + you may run tests twice when selecting \uicontrol {Run All Tests} or \uicontrol {Run Selected Tests}. This happens if the tests can be found by the code based test frameworks and are registered as test with the build system. If a test takes more than a minute to execute, the default timeout might - stop the test execution. To increase the timeout, select \preferences > + stop the test execution. To increase the timeout, go to \preferences > \uicontrol {Testing} > \uicontrol General. - \section2 Selecting Tests to Run + \section1 Select tests to run The \uicontrol Tests view shows all the tests found for the currently active test frameworks in the current project. Select the test cases to run. @@ -398,10 +389,10 @@ select \inlineimage icons/leafsort.png (\uicontrol {Sort Naturally}). - \section2 Running and Debugging Tests from Code Editor + \section1 Run and debug tests from code editor You can run and debug tests in the file currently open in the code editor. - To run all tests in the open file, select \uicontrol Tools > + To run all tests in the open file, go to \uicontrol Tools > \uicontrol Tests > \uicontrol {Run Tests for Current File}. \note Available only for code based test frameworks. @@ -414,230 +405,395 @@ \note Availability for build system based tests depends on the build system tool's abilities. - \section1 Specifying Test Settings + \section1 Turn on build system based tests - To customize the handling of tests, test frameworks, and test tools, select + By default, \QC does not handle build system based tests to avoid + interference with code based parsers. To turn on build system based tests, + select the respective test tool in \preferences > \uicontrol Testing + > \uicontrol General. + + The detection of tests is usually much faster for build system based + tests as this normally does not involve scanning or parsing. + The information in the tests tree is usually more detailed + when using code based tests. + + If you turn on both code based and build system based tests, you + may duplicate tests inside the tests tree. + + \section1 Locate Qt Test data tags + + To locate Qt Test data tags: + + \list 1 + \li Press \key {Ctrl+K} (\key {Cmd+K} on \macos) to activate the locator. + \li Enter \c qdt, followed by a space. + \endlist + + \sa {Test}{How To: Test}, {Select the build system}, {Testing}, + {Test Results} +*/ + +/*! + \page creator-preferences-testing.html + \previouspage creator-reference.html + + \ingroup creator-reference-preferences + + \title Testing + + \brief Customize the handling of tests, test frameworks, and test tools. + + To set preferences for handling tests, go to \preferences > \uicontrol {Testing} > \uicontrol General. \image qtcreator-preferences-testing-general.webp {General tab in Testing preferences} - You can customize some settings at project level. To change settings - for the current project instead of globally, select \uicontrol Projects > - \uicontrol {Project Settings} > \uicontrol {Testing}. + The following table summarizes the general testing preferences. - In the \uicontrol {Active Test Frameworks} list, select tests for \QC to - handle. To improve the performance of full scans for tests, disable - test frameworks you do not use. + \table + \header + \li Setting + \li Value + \row + \li \uicontrol {Scan threads} + \li Set the amount of worker threads used when scanning for tests. + By default, \QC uses a quarter of the available logical CPUs. + \row + \li \uicontrol {Omit internal messages} + \li Omit internal messages. + \row + \li \uicontrol {Omit run configuration warnings} + \li Omit run configuration warnings for deduced configurations. + \row + \li \uicontrol {Limit result output} + \li By default, test result output shows a maximum of 100,000 characters. + \row + \li \uicontrol {Limit result description} + \li Set the maximum number of lines in the test result tooltip and + description. + \row + \li \uicontrol {Open results when tests start} + \li Show test results automatically when testing starts. + \row + \li \uicontrol {Open results when tests finish} + \li Show test results automatically when testing ends. + \row + \li \uicontrol {Open results only for unsuccesfull test runs} + \li Show test results only if thy contain failed, fatal, or + unexpectedly passed tests. + \row + \li \uicontrol {Automatically scroll results} + \li The view automatically scrolls to show the latest results. + \row + \li \uicontrol {Group results by application} + \li Group test results by the executable path that you use to run the + tests. This is useful if you have multiple test executables and run + them all at once. + \row + \li \uicontrol {Process arguments} + \li Pass arguments to the test executable that you specify in the + \l {Configure projects for running}{run configuration}. This is an + experimental feature that might cause the execution of the test + executable to fail. + \row + \li \uicontrol {Automatically run} + \li Automatically run all or selected tests after successfully building + the current project. + \row + \li \uicontrol {Timeout} + \li The maximum time in seconds to execute a test case. + \row + \li \uicontrol {Reset Cached Choices} + \li Sometimes, \QC cannot deduce which executable or run configuration to + use. If it repeatedly asks you to select the tests to run when trying + to execute tests, you can let it cache your choices and use them where + appropriate. \QC clears the cache when you switch to another project, + close the current one, or select this setting. + \row + \li \uicontrol {Active Test Frameworks} + \li Select tests for \QC to handle. To improve the performance of full + scans for tests, disable test frameworks you do not use. + \row + \li \uicontrol {Group} + \li Group related test cases for an active test framework. + By default, \QC groups tests that are in the same directory. + \endtable - To group related test cases for an active test framework, select the - \uicontrol Group check box next to the framework name in the - \uicontrol {Active Test Frameworks} list. - By default, \QC groups tests that are in the same directory. + To select the testing framework for the current project, go to + \uicontrol Projects > \uicontrol {Project Settings} > \uicontrol {Testing}. - By default, \QC uses a quarter of the available logical CPUs when - scanning for tests. You can set the amount of worker threads used - in \uicontrol {Scan threads}. + \section1 Qt Tests - \QC omits internal messages and run configuration warnings for - deduced configurations by default. To view them, deselect the - \uicontrol {Omit internal messages} and - \uicontrol {Omit run configuration warnings} check boxes. - - By default, test result output shows a maximum of 100,000 characters. The - view automatically scrolls to show the latest results. To display - full results, deselect the \uicontrol {Limit result output} check box. - To disable automatic scrolling, deselect the - \uicontrol {Automatically scroll results} check box. - - Set the maximum number of lines in the test result tooltip and description - in \uicontrol {Limit result description}. - - To group test results by the executable path that you use to run the - tests, select \uicontrol {Group results by application}. This is useful - if you have multiple test executables and run them all at once. - - To automatically run tests after successfully building the current project, - select them in \uicontrol {Automatically run}. - - Sometimes, \QC cannot deduce which executable or run configuration to use. - If \QC repeatedly asks you to select the tests to run when trying to execute - tests, you can let it cache your choices and use them where appropriate. \QC - clears the cache when you switch to another project, close the current one, - or select \uicontrol {Reset Cached Choices}. - - Select the \uicontrol {Process arguments} check box to pass arguments to the - test executable that you specify in the \l {Configure projects for running} - {run configuration}. This is an experimental feature that might cause the - execution of the test executable to fail. - - \section2 Specifying Settings for Running Qt Tests - - The code inside a benchmark test is measured, and possibly also repeated - several times in order to get an accurate measurement. This depends on the - measurement back-end that you can select in the - \uicontrol {Benchmark Metrics} group in \preferences > \uicontrol {Testing} > - \uicontrol {Qt Test}: - walltime, CPU tick counter, event counter, Valgrind Callgrind, and Linux - Perf. For more information, see \l{Creating a Benchmark}. + To set preference for Qt tests, go to \preferences > \uicontrol {Testing} > + \uicontrol {Qt Test}. \image qtcreator-preferences-testing-qttest.webp {Qt Tests tab in Testing preferences} - To receive verbose output when running benchmarks, select the - \uicontrol {Verbose benchmarks} check box. + The code inside a benchmark test is measured, and possibly also repeated + several times in order to get an accurate measurement. This depends on the + measurement back-end that you select in \uicontrol {Benchmark Metrics}: - To allow the debugger to interrupt Qt tests on assertions, select the - \uicontrol {Disable crash handler while debugging} check box. + \list + \li Walltime + \li CPU tick counter + \li Event counter + \li Valgrind Callgrind + \li Linux Perf + \endlist - To record information about signals and slots in the test log, select the - \uicontrol {Log signals and slots} check box. + For more information, see \l{Creating a Benchmark}. - To explicitly limit the maximum number of warnings in the test log, select - the \uicontrol {Limit warnings} check box and set the limit. Set it to 0 if - you want no limit at all. The default number is 2000. + The following table summarizes the other Qt test preferences. - To check for Qt Quick Tests that are derived from TestCase, select the - \uicontrol {Check for derived Qt Quick tests} check box. + \table + \header + \li Setting + \li Value + \row + \li \uicontrol {Disable crash handler while debugging} + \li Allow the debugger to interrupt Qt tests on assertions. + \row + \li \uicontrol {Use XML output} + \li XML output avoids parsing issues, but plain text is more human + readable. + \note Plain text misses some information, such as duration. + \row + \li \uicontrol {Verbose benchmarks} + \li Receive verbose output when running benchmarks. + \row + \li \uicontrol {Log signals and slots} + \li Record information about signals and slots in the test log. + \row + \li \uicontrol {Limit warnings} + \li Explicitly limit the maximum number of warnings in the test log. + Set the limit to 0 if you want no limit at all. The default limit + is 2000. + \row + \li \uicontrol {Check for derived Qt Quick tests} + \li Check for Qt Quick Tests that are derived from TestCase. + \note This feature is rather expensive and increases the scan time + significantly. + \row + \li \uicontrol {Find user-defined locations} + \li Parse messages for the following pattern and use it as location + information: \c {file://filepath:line} - \note This feature is rather expensive and increases the - scan time significantly. + where \":line\" is optional. - \section2 Specifying Settings for Running Google Tests + \note 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. + \endtable - To specify settings for running Google tests, select \preferences > + \section1 Google Tests + + To specify settings for running Google tests, go to \preferences > \uicontrol {Testing} > \uicontrol {Google Test}. \image qtcreator-preferences-testing-googletest.webp {Gooble Test tab in Testing preferences} - To run disabled tests, select the \uicontrol {Run disabled tests} check box. + The following table summarizes the Google test preferences. - To turn assertion failures into C++ exceptions, select the - \uicontrol {Throw on failure} check box. + \table + \header + \li Setting + \li Value + \row + \li \uicontrol {Run disabled tests} + \li Execute disabled tests during a test run. + \row + \li \uicontrol {Throw on failure} + \li Turn assertion failures into C++ exceptions. + \row + \li \uicontrol {Break on failure while debugging} + \li Turn failures into debugger breakpoints. + \row + \li \uicontrol {Repeat tests} + \li Run several iterations of the tests. + \row + \li \uicontrol Iterations + \li The number of times to run the tests. + \row + \li \uicontrol {Shuffle tests} + \li Make sure that the tests are independent and repeatable by running + them in a different order each time. + \row + \li \uicontrol Seed + \li The seed for initializing the randomizer. The value 0 generates + a seed based on the current timestamp. + \row + \li \uicontrol {Group mode} + \li Group Google tests by using a \uicontrol {GTest Filter}. + \row + \li \uicontrol {Active filter} + \li The GTest filter to use. + \endtable - To turn failures into debugger breakpoints, select the - \uicontrol {Break on failure while debugging} check box. - - To run several iterations of the tests, select the \uicontrol {Repeat tests} - check box and enter the number of times to run the tests in the - \uicontrol Iterations field. To make sure that the tests are independent and - repeatable, run them in a different order each time by selecting the - \uicontrol {Shuffle tests} check box. Set the seed for initializing the - randomizer in the \uicontrol Seed field. The value 0 generates a seed - based on the current timestamp. - - - To group Google tests by using a GTest filter, select - \uicontrol {GTest Filter} in the \uicontrol {Group mode} field, - and specify the filter in the \uicontrol {Active filter} - field. For more information about GTest filters, see + For more information about GTest filters, see \l{https://github.com/google/googletest/blob/master/docs/advanced.md#running-a-subset-of-the-tests} {Running a Subset of the Tests}. - \section2 Specifying Settings for Running Boost Tests + \section1 Boost Tests - \list 1 - \li To specify settings for running Boost tests, select \preferences > - \uicontrol {Testing} > \uicontrol {Boost Test}. - \image qtcreator-preferences-testing-boosttest.webp {Boost Test tab in Testing preferences} - \li In the \uicontrol {Log format} field, select the error report - format to specify the type of events to record in the - test report. - \li In the \uicontrol {Report level} field, select the verbosity level - of the test result report. Select \uicontrol No if you do not want - a report. - \li Select the \uicontrol Randomize check box to execute the tests in - a random order, using the seed specified in the \uicontrol Seed - field for initializing the randomizer. The value 0 means no + To specify settings for running Boost tests, go to \preferences > + \uicontrol {Testing} > \uicontrol {Boost Test}. + + \image qtcreator-preferences-testing-boosttest.webp {Boost Test tab in Testing preferences} + + The following table summarizes the Boost test preferences. + + \table + \header + \li Setting + \li Value + \row + \li \uicontrol {Log format} + \li The type of events to record in the test report. + \row + \li \uicontrol {Report level} + \li The verbosity level of the test result report. Select \uicontrol No + if you do not want a report. + \row + \li \uicontrol Randomize + \li Execute the tests in a random order. + \row + \li \uicontrol Seed + \li The seed for initializing the randomizer. The value 0 means no randomization, the value 1 uses the current time, and any other value generates a random seed. - \li Select the \uicontrol {Catch system errors} check box to catch - system errors. - \li Select the \uicontrol {Floating point exceptions} check box to - detect floating point exceptions. - \li Select the \uicontrol {Detect memory leaks} check box to detect - memory leaks. - \endlist + \row + \li \uicontrol {Catch system errors} + \li Catch or ignore system errors. + \row + \li \uicontrol {Floating point exceptions} + \li Detect floating point exception traps. + \row + \li \uicontrol {Detect memory leaks} + \li Detect memory leaks. + \endtable - \section2 Specifying Settings for Running Catch2 Tests - \list 1 - \li To specify settings for running Catch2 tests, select - \preferences > \uicontrol {Testing} > \uicontrol {Catch Test}. - \image qtcreator-preferences-testing-catchtest.webp {Catch Test tab in Testing preferences} - \li Select the \uicontrol {Show success} check box to show succeeding - expressions as well. By default Catch2 will print only fails. - \li Select the \uicontrol {Break on failure while debugging} check box - to turn failures into debugger breakpoints. - \li Select the \uicontrol {Skip throwing assertions} check box to skip - any assertion that test for throwing an exception. - \li Select the \uicontrol {Visualize whitespace} check box to turn - whitespace into escape sequences. - \li Select the \uicontrol {Warn on empty tests} check box to get a - warning when a test case does not check any assertion. - \li Select the \uicontrol {Abort after} check box to abort the test - after the number of failures specified inside the spin box. - \li Select the \uicontrol {Benchmark samples} check box to specify - the number of samples to collect while running benchmarks. - \li Select the \uicontrol {Benchmark resamples} check box to specify - the number of resamples to use for statistical bootstrapping after + \section1 Catch2 Tests + + To specify settings for running Catch2 tests, go to \preferences > + \uicontrol {Testing} > \uicontrol {Catch Test}. + + \image qtcreator-preferences-testing-catchtest.webp {Catch Test tab in Testing preferences} + + The following table summarizes the Catch2 test preferences. + + \table + \header + \li Setting + \li Value + \row + \li \uicontrol {Show success} + \li Show succeeding expressions as well. By default Catch2 prints only + failed expressions. + \row + \li \uicontrol {Break on failure while debugging} + \li Turn failures into debugger breakpoints. + \row + \li \uicontrol {Skip throwing assertions} + \li Skip assertions that test for thrown exceptions. + \row + \li \uicontrol {Visualize whitespace} + \li Turn whitespace into escape sequences. + \row + \li \uicontrol {Abort after} + \li Abort the test after the number of failures specified inside the box. + \row + \li \uicontrol {Benchmark samples} + \li The number of samples to collect while running benchmarks. + \row + \li \uicontrol {Benchmark resamples} + \li The number of resamples to use for statistical bootstrapping after benchmarking. - \li Select the \uicontrol {Benchmark confidence interval} check box - to specify the confidence interval for statistical bootstrapping. - \li Select the \uicontrol {Benchmark warmup time} check box to specify - the warmup time for each test before benchmarking starts. - \li Select the \uicontrol {Disable analysis} check box to disable - statistical analysis and bootstrapping. - \endlist + \row + \li \uicontrol {Benchmark confidence interval} + \li The confidence interval for statistical bootstrapping. + \row + \li \uicontrol {Benchmark warmup time} + \li The warmup time for each test before benchmarking starts. + \row + \li \uicontrol {Disable analysis} + \li Disable statistical analysis and bootstrapping. + \endtable \section2 Specifying Settings for Running CTest-Based Tests - \list 1 - \li To specify settings for running CTest-based tests, select - \preferences > \uicontrol {Testing} > \uicontrol {CTest}. - \image qtcreator-preferences-testing-ctest.webp {CTest tab in Testing preferences} - \li Select the \uicontrol {Output on failure} check box to show test - specific output if a test fails. Contrary to the CTest default - this is enabled by default. - \li Select \uicontrol {Schedule random} to execute the tests in - random order. - \li Select \uicontrol {Stop on failure} to automatically stop the - test execution on the first failing test. - \li In the \uicontrol {Output mode} field, select the verbosity level - of the CTest output. - \note This only influences the output on the text display. - \li Select \uicontrol {Repeat tests} if you want to re-run tests - under certain circumstances. - \li In the \uicontrol {Repetition mode} field, select the mode for - re-running tests. Set the maximum count for repeating a test in - the \uicontrol {Count} field. - \li Select \uicontrol {Run in parallel} to run the tests in parallel - using the specified number of \uicontrol {Jobs}. - \li Select \uicontrol {Test load} to limit the parallel + + To specify settings for running CTest-based tests, go to \preferences > + \uicontrol {Testing} > \uicontrol {CTest}. + + \image qtcreator-preferences-testing-ctest.webp {CTest tab in Testing preferences} + + The following table summarizes the CTest preferences. + + \table + \header + \li Setting + \li Value + \row + \li \uicontrol {Output on failure} + \li Show test specific output if a test fails. Contrary to the + CTest default this setting is on by default. + \row + \li \uicontrol {Schedule random} + \li Execute the tests in random order. + \row + \li \uicontrol {Stop on failure} + \li Automatically stop the test execution on the first failing test. + \row + \li \uicontrol {Output mode}, + \li The verbosity level of the CTest output. + \note This setting only influences the output on the text display. + \row + \li \uicontrol {Repeat tests} + \li Re-run tests, as determined by \uicontrol {Repetition mode}. Set the + maximum number of times for repeating a test in \uicontrol {Count}. + \row + \li \uicontrol {Run in parallel} + \li Run the tests in parallel using the specified number of + \uicontrol {Jobs}. In \uicontrol {Test load}, limit the parallel execution. CTest will not start a new test if it would cause the CPU load to pass the threshold set in \uicontrol {Threshold}. - \endlist + \endtable - \section1 Viewing Test Output + \sa {Test}{How To: Test}, {Test Results} +*/ - The \l{View output}{Test Results} view shows Qt and Qt Quick test results +/*! + \page creator-test-results.html + \previouspage creator-reference.html + + \ingroup creator-reference-output-views + + \title Test Results + + \brief View test results. + + View and filter test results in the \uicontrol{Test Results} view. + + \image qtcreator-test-results.webp {Visual display in the Test Results view} + + \section1 Qt Test Output + + The \uicontrol{Test Results} view shows Qt and Qt Quick test results in XML format and other test results in plain text format. - \section2 Qt Test Output - XML can be parsed more easily and reliably than plain text. However, if a Qt or Qt Quick test crashes, it might not produce complete XML code that can be parsed, which might lead to information loss. You might see the lost information when viewing the results as plain text. - To view the - results of Qt and Qt Quick tests as plain text, select \preferences > - \uicontrol {Testing} > \uicontrol {Qt Test}, and - then deselect the \uicontrol {Use XML output} check box. Then select the - \inlineimage icons/text.png - (\uicontrol {Switch Between Visual and Text Display}) button in + To view the results of Qt and Qt Quick tests as plain text, go to + \preferences > \uicontrol {Testing} > \uicontrol {Qt Test} and then clear + \uicontrol {Use XML output}. Then select \inlineimage icons/text.png + (\uicontrol {Switch Between Visual and Text Display}) in \uicontrol {Test Results} to switch to the text display. - \section2 Summary of Messages + \section1 Summary of Messages - The following table lists the messages that \uicontrol {Test Results} - displays: + The following table lists the messages that \uicontrol {Test Results} shows. \table \header @@ -685,11 +841,17 @@ \endtable + \section1 Filtering Test Results + To view only messages of a particular type, select - \inlineimage icons/filtericon.png - (\uicontrol {Filter Test Results}), and then select the types of messages to - show. To show all messages, select \uicontrol {Check All Filters}. To - deselect all message types, select \uicontrol {Uncheck All Filters}. + \inlineimage icons/filtericon.png (\uicontrol {Filter Test Results}) and + then select the types of messages to show. + + To show all messages, select \uicontrol {Check All Filters}. + + To deselect all message types, select \uicontrol {Uncheck All Filters}. + + \section1 Blacklisting Tests Since Qt 5.4, you can add a BLACKLIST file for tests. It is mainly used internally by the Qt CI system. @@ -712,4 +874,6 @@ \li Blacklisted test case passed even though it was expected to fail. \endtable + + \sa {Test}{How To: Test}, {Test Results} */ diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc index 3696b292635..a715f171cb5 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc @@ -93,6 +93,18 @@ \generatelist creator-how-to-get-help + \section1 Test + + \QC supports both \e {code based tests} and \e {build system based tests}. + Code based testing offers special handling for particular testing + frameworks that strongly ties to the underlying code models or + specialized parsers. Build system based testing is independent from any + testing frameworks. It retrieves information directly from the underlying + build system and uses it or even the build system as such to execute the + respective tests. + + \generatelist creator-how-to-test + \section1 Use \QC \generatelist creator-how-to-use diff --git a/doc/qtcreator/src/overview/creator-only/creator-overview.qdoc b/doc/qtcreator/src/overview/creator-only/creator-overview.qdoc index eb0bcf8ec36..3a74a671e24 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-overview.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-overview.qdoc @@ -27,7 +27,7 @@ \image qt-app-dev-flow.webp {Application development life-cycle} \caption Application development life-cycle - \section1 Projects + \section1 Managing Projects First, you need a \e project. \QC relies on a separate build system, such as CMake, qmake, or Qbs for building the project. From the build system, \QC @@ -63,12 +63,12 @@ For more information, see \l{Manage Projects}{How To: Manage Projects}. - \section1 User Interfaces + \section1 Designing User Interfaces \image heartgame-start.webp {Heart Rate Game} - To create intuitive, modern-looking, fluid user interfaces, use \l{Qt Quick} - and \l{Qt Design Studio Manual}{\QDS}: + To create intuitive, modern-looking, fluid user interfaces (UI), use + \l{Qt Quick} and \l{Qt Design Studio Manual}{\QDS}: \list \li \l {\QMLD} @@ -101,7 +101,7 @@ For more information, see \l{Design UIs}{How To: Design UIs} and \l{UI Design}. - \section1 Code + \section1 Editing Code Writing, editing, and navigating in source code are core tasks in application development. Therefore, the code editor is one of the key components of \QC. @@ -116,13 +116,13 @@ such as Python, for which a \e {language server} is available that provides information about the code to IDEs. - \section2 Find + \section2 Finding Use the incremental and advanced search to search in currently open projects or files on the file system or use the locator to browse through projects, files, classes, functions, documentation, and file systems. - \section2 Refactor + \section2 Refactoring Code \e {Code refactoring} is the process of improving and simplifying code without modifying the existing functionality of an application. Find @@ -137,7 +137,7 @@ \li Simplify code structure \endlist - \section2 Configure the Editor + \section2 Configuring the Text Editor Configure the text editor to suit your specific needs. Change the fonts, colors, highlighting, and indentation. @@ -147,7 +147,7 @@ For more information, see \l{Edit Code}{How To: Edit Code} and \l{Editors}. - \section1 Build, Deploy, and Run + \section1 Building, Deploying, and Running Applications Run and deploy Qt applications that you build for different target platforms or with different compilers, debuggers, or Qt versions. @@ -182,7 +182,7 @@ For more information, see \l{Connecting Devices} and \l{Deploying to Devices}. - \section2 Preview QML + \section2 Previewing QML Use the QML live preview to preview a QML file or an entire Qt Quick application on the desktop, as well as on Android and embedded Linux @@ -191,7 +191,7 @@ For more information, see \l{Validating with Target Hardware}. - \section1 Debug + \section1 Debugging Applications A debugger lets you see what happens \e inside an application while it runs or when it crashes. A debugger can do the following to help you find errors @@ -214,7 +214,7 @@ For more information, see \l{Debugging}. - \section1 Analyze + \section1 Analyzing Source Code Devices have limited memory and CPU power, so you should use them carefully. \QC integrates code analysis tools for detecting memory leaks, profiling @@ -227,17 +227,42 @@ For more information, see \l{Analyzing Code}. - \section1 Autotest + \section1 Running Tests - Create, build and run Qt tests, Qt Quick tests, Google tests, and Boost tests - to unit test applications and libraries. + \QC supports both \e {code based tests} and \e {build system based tests}. + Code based testing offers special handling for particular testing + frameworks that strongly ties to the underlying code models or + specialized parsers. Build system based testing is independent from any + testing frameworks. It retrieves information directly from the underlying + build system and uses it or even the build system as such to execute the + respective tests. + + \QC integrates the following testing frameworks for unit testing + applications and libraries: + + \list + \li \l{https://www.boost.org/doc/libs/1_81_0/libs/test/doc/html/index.html} + {Boost.Test} + \li \l{https://github.com/catchorg/Catch2}{Catch2 test framework} + \li \l{https://github.com/google/googletest}{Google C++ Testing Framework} + \li \l{Qt Quick Test} framework + \li \l{Qt Test} framework + \endlist + + In addition, \QC offers build system based support for + \l{https://cmake.org/cmake/help/latest/manual/ctest.1.html}{CTest}. + + You can use \QC to create, build, and run code based tests for your + projects. + + \image qtcreator-autotests.png Map AUTs (Application Under Test) to \QC and run Squish test suites and cases from it. - For more information, see \l{Running Autotests} and \l{Using Squish}. + For more information, see \l{Test}{How To: Test} and \l{Using Squish}. - \section1 Publish + \section1 Publishing Applications Create installation packages for mobile devices that you publish to application stores and other channels. You must make sure that the diff --git a/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc b/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc index c26df6eb3e5..1fe8e41e287 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc @@ -37,7 +37,7 @@ \section1 Preferences - Set prefecerences that apply globally to all projects. + Set preferences that apply globally to all projects. \annotatedlist creator-reference-preferences diff --git a/doc/qtcreator/src/overview/creator-only/creator-testing.qdoc b/doc/qtcreator/src/overview/creator-only/creator-testing.qdoc index 26ef6701d69..34297d34fa5 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-testing.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-testing.qdoc @@ -12,7 +12,7 @@ \page creator-testing.html \nextpage creator-debugging.html - \title Testing + \title Debugging and Analyzing \image front-testing.png @@ -35,11 +35,6 @@ from \QC. However, the QML Profiler is installed as part of \QC for profiling Qt Quick applications. - \li \l{Running Autotests} - - Create, build and run Qt tests, Qt Quick tests, Google - tests, and Boost tests using \QC. - \li \l{Using Squish} Map AUTs to \QC and run Squish test suites and cases from it. diff --git a/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc index d03263d4625..084bc90c1ab 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc @@ -74,8 +74,8 @@ \li Empty Nim source and script files. \endtable - \sa {Add Files}{How To: Add Files}, {Create UML-style models}, - {Use project wizards} + \sa {Add Files}{How To: Add Files}, {Add tests to existing test projects}, + {Create UML-style models}, {Use project wizards} */ /*! diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc index 60fb9686fd6..914516417a1 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc @@ -168,8 +168,8 @@ \uicontrol Impl there. \sa {Assign keyboard shortcuts}, {Activate kits for a project}, - {Create files}, {Create Projects}{How To: Create Projects}, - {Creating Projects} + {Create files}, {Test}{How To: Test}, + {Create Projects}{How To: Create Projects}, {Creating Projects} */ /*! diff --git a/doc/qtcreator/src/projects/creator-projects-running.qdoc b/doc/qtcreator/src/projects/creator-projects-running.qdoc index 43d80f08c8d..0b39d0d7077 100644 --- a/doc/qtcreator/src/projects/creator-projects-running.qdoc +++ b/doc/qtcreator/src/projects/creator-projects-running.qdoc @@ -49,7 +49,7 @@ \section1 Select run targets If your project has several run targets defined, such as - \l{Running Autotests}{tests}, you can select them in the kit selector. + \l{Build and run tests}{tests}, you can select them in the kit selector. \image qtcreator-kit-selector-run-targets.png {Run targets in the kit selector} diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 1f5acccca57..c38beb825d3 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -68,7 +68,7 @@ \li \l{Building Applications for the Web} \endlist \endlist - \li \l{Testing} + \li \l{Debugging and Analyzing} \list \li \l{Debugging} \list @@ -112,7 +112,6 @@ \li \l{Analyzing Code with Cppcheck} \li \l{Visualizing Chrome Trace Events} \endlist - \li \l{Running Autotests} \li \l{Using Squish} \endlist \li \l{How To} @@ -157,6 +156,8 @@ \endlist \li Read Documentation \generatelist creator-how-to-get-help + \li Test + \generatelist creator-how-to-test \li Use \QC \generatelist creator-how-to-use \li Use the UI diff --git a/doc/qtcreator/src/qtcreator.qdoc b/doc/qtcreator/src/qtcreator.qdoc index f828eb6995c..ddc9b74cca6 100644 --- a/doc/qtcreator/src/qtcreator.qdoc +++ b/doc/qtcreator/src/qtcreator.qdoc @@ -64,11 +64,10 @@ \li \inlineimage front-help.png \li \inlineimage front-advanced.png \row - \li \b {\l{Testing}} + \li \b {\l{Debugging and Analyzing}} \list \li \l{Debugging} \li \l{Analyzing Code} - \li \l{Running Autotests} \li \l{Using Squish} \endlist \li \b {\l{How To}} @@ -79,6 +78,10 @@ \li \l{Design UIs} \li \l{Edit Code} \li \l{Manage Projects} + \li \l{Read Documentation} + \li \l{Test} + \li \l{Use \QC} + \li \l{Use the UI} \li \l{How To}{See More...} \endlist \li \b {\l{Reference}} From cf8a8974eda296ba82925bb3f2c0d2cfa1a4bc1b Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Mon, 4 Mar 2024 10:10:14 +0100 Subject: [PATCH 20/87] CMakePM: Suppress error message for valid build preset Fixes: QTCREATORBUG-30373 Change-Id: I2e2ec83c0b14d188096ace61468435ccbd36d84b Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmakeproject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 25352f0b5d6..23c68a6e642 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -210,7 +210,7 @@ void CMakeProject::setupBuildPresets(Internal::PresetsData &presetsData) { for (auto &buildPreset : presetsData.buildPresets) { if (buildPreset.inheritConfigureEnvironment) { - if (!buildPreset.configurePreset) { + if (!buildPreset.configurePreset && !buildPreset.hidden) { TaskHub::addTask(BuildSystemTask( Task::TaskType::Error, Tr::tr("Build preset %1 is missing a corresponding configure preset.") From f56fd04c8dbbfead7800a1612fb0d1fd05ceeca6 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Mar 2024 13:43:27 +0100 Subject: [PATCH 21/87] Revert "Clangd: Avoid client restart after modifying open documents" The whole point of tracking external changes to files is to use the open files as a sentinel to indicate that non-open files (on which we don't have a watch) have likely also been changed. This reverts commit cff26d813a8805c34588536ca19453852b946643. Change-Id: I5a8b3e6709eda881b912916cf0838b45d1ff4fa4 Reviewed-by: David Schulz Reviewed-by: Reviewed-by: Qt CI Bot --- .../clangcodemodel/clangmodelmanagersupport.cpp | 5 ----- src/plugins/clangcodemodel/test/clangdtests.cpp | 10 ++++++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 477ab9104b9..3cf94e19c7c 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -796,11 +796,6 @@ void ClangModelManagerSupport::watchForExternalChanges() if (!LanguageClientManager::hasClients()) return; for (const FilePath &file : files) { - if (TextEditor::TextDocument::textDocumentForFilePath(file)) { - // if we have a document for that file we should receive the content - // change via the document signals - continue; - } const ProjectFile::Kind kind = ProjectFile::classify(file.toString()); if (!ProjectFile::isSource(kind) && !ProjectFile::isHeader(kind)) continue; diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index 1edec4c2905..bfe7ea95368 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -2207,15 +2207,21 @@ void ClangdTestExternalChanges::test() QVERIFY(curDoc->marks().isEmpty()); // Now trigger an external change in an open, but not currently visible file and - // verify that we get diagnostics in the current editor. + // verify that we get a new client and diagnostics in the current editor. TextDocument * const docToChange = document("mainwindow.cpp"); docToChange->setSilentReload(); QFile otherSource(filePath("mainwindow.cpp").toString()); QVERIFY(otherSource.open(QIODevice::WriteOnly)); otherSource.write("blubb"); otherSource.close(); + QVERIFY(waitForSignalOrTimeout(LanguageClientManager::instance(), + &LanguageClientManager::clientAdded, timeOutInMs())); + ClangdClient * const newClient = ClangModelManagerSupport::clientForProject(project()); + QVERIFY(newClient); + QVERIFY(newClient != oldClient); + newClient->enableTesting(); if (curDoc->marks().isEmpty()) - QVERIFY(waitForSignalOrTimeout(client(), &ClangdClient::textMarkCreated, timeOutInMs())); + QVERIFY(waitForSignalOrTimeout(newClient, &ClangdClient::textMarkCreated, timeOutInMs())); } From fbe244fd4684121ae4b60519f0b2fcd37646e584 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 4 Mar 2024 10:52:15 +0100 Subject: [PATCH 22/87] Cpp Editor: Fix serializing clangd settings A "store with default operation" makes no sense on the level of the map itself, as it does not have knowledge about the current on-disk settings. This reverts commit a4fbc5f00dddde39871c25bca652de7842baa1dd. Change-Id: I008b0b5c24428c71182dac5d1f151d25cf4f7467 Reviewed-by: Marcus Tillmanns Reviewed-by: David Schulz Reviewed-by: Reviewed-by: Qt CI Bot --- src/libs/utils/store.cpp | 16 +++ src/libs/utils/store.h | 25 +---- .../cppeditor/cppcodemodelsettings.cpp | 99 +++++++------------ src/plugins/cppeditor/cppcodemodelsettings.h | 29 ++---- 4 files changed, 63 insertions(+), 106 deletions(-) diff --git a/src/libs/utils/store.cpp b/src/libs/utils/store.cpp index 37f939f5a8c..fa8d4232c02 100644 --- a/src/libs/utils/store.cpp +++ b/src/libs/utils/store.cpp @@ -190,4 +190,20 @@ void storeToSettings(const Key &groupKey, QtcSettings *s, const Store &store) s->endGroup(); } +void storeToSettingsWithDefault(const Key &groupKey, + QtcSettings *s, + const Store &store, + const Store &defaultStore) +{ + QTC_ASSERT(store.size() == defaultStore.size(), storeToSettings(groupKey, s, store); return); + + s->beginGroup(groupKey); + for (auto it = store.begin(), defaultIt = defaultStore.begin(), end = store.end(); it != end; + ++it, ++defaultIt) + s->setValueWithDefault(it.key(), + mapEntryFromStoreEntry(it.value()), + mapEntryFromStoreEntry(defaultIt.value())); + s->endGroup(); +} + } // Utils diff --git a/src/libs/utils/store.h b/src/libs/utils/store.h index 97e71b0eecd..c538f34c5f2 100644 --- a/src/libs/utils/store.h +++ b/src/libs/utils/store.h @@ -15,26 +15,7 @@ class QtcSettings; using KeyList = QList; -class Store : public QMap -{ -public: - using QMap::QMap; - - template - void insertValueWithDefault(const Key &key, const T &val, const T &defaultValue) - { - if (val != defaultValue) - insert(key, val); - } - - template - void insertValueWithDefault(const Key &key, const T &val) - { - if (val != T()) - insert(key, val); - } -}; - +using Store = QMap; using OldStore = QMap; QTCREATOR_UTILS_EXPORT KeyList keysFromStrings(const QStringList &list); @@ -60,6 +41,10 @@ QTCREATOR_UTILS_EXPORT QVariant mapEntryFromStoreEntry(const QVariant &value); // Don't use in new code. QTCREATOR_UTILS_EXPORT Store storeFromSettings(const Key &groupKey, QtcSettings *s); QTCREATOR_UTILS_EXPORT void storeToSettings(const Key &groupKey, QtcSettings *s, const Store &store); +QTCREATOR_UTILS_EXPORT void storeToSettingsWithDefault(const Key &groupKey, + QtcSettings *s, + const Store &store, + const Store &defaultStore); } // Utils diff --git a/src/plugins/cppeditor/cppcodemodelsettings.cpp b/src/plugins/cppeditor/cppcodemodelsettings.cpp index 29516c62189..82cca5752bc 100644 --- a/src/plugins/cppeditor/cppcodemodelsettings.cpp +++ b/src/plugins/cppeditor/cppcodemodelsettings.cpp @@ -445,7 +445,11 @@ void ClangdSettings::loadSettings() void ClangdSettings::saveSettings() { const auto settings = Core::ICore::settings(); - Utils::storeToSettings(clangdSettingsKey(), settings, m_data.toMap()); + const ClangdSettings::Data defaultData; + Utils::storeToSettingsWithDefault(clangdSettingsKey(), + settings, + m_data.toMap(), + defaultData.toMap()); settings->beginGroup(Constants::CPPEDITOR_SETTINGSGROUP); diagnosticConfigsToSettings(settings, m_data.customDiagnosticConfigs); settings->endGroup(); @@ -546,81 +550,44 @@ void ClangdProjectSettings::saveSettings() Store ClangdSettings::Data::toMap() const { Store map; - - map.insertValueWithDefault(useClangdKey(), useClangd, DefaultUseClangd); - - const QString clangdPath = executableFilePath != fallbackClangdFilePath() - ? executableFilePath.toString() - : QString(); - - map.insertValueWithDefault(clangdPathKey(), clangdPath); - - map.insertValueWithDefault(clangdIndexingKey(), indexingPriority != IndexingPriority::Off, true); - map.insertValueWithDefault(clangdIndexingPriorityKey(), - int(indexingPriority), - int(DefaultIndexingPriority)); - - map.insertValueWithDefault(clangdHeaderSourceSwitchModeKey(), - int(headerSourceSwitchMode), - int(DefaultHeaderSourceSwitchMode)); - - map.insertValueWithDefault(clangdCompletionRankingModelKey(), - int(completionRankingModel), - int(DefaultCompletionRankingModel)); - - map.insertValueWithDefault(clangdHeaderInsertionKey(), - autoIncludeHeaders, - DefaultAutoIncludeHeaders); - - map.insertValueWithDefault(clangdThreadLimitKey(), workerThreadLimit, DefaultWorkerThreadLimit); - - map.insertValueWithDefault(clangdDocumentThresholdKey(), - documentUpdateThreshold, - DefaultDocumentUpdateThreshold); - - map.insertValueWithDefault(clangdSizeThresholdEnabledKey(), - sizeThresholdEnabled, - DefaultSizeThresholdEnabled); - - map.insertValueWithDefault(clangdSizeThresholdKey(), - sizeThresholdInKb, - DefaultSizeThresholdInKb); - - map.insertValueWithDefault(sessionsWithOneClangdKey(), sessionsWithOneClangd); - - map.insertValueWithDefault(diagnosticConfigIdKey(), - diagnosticConfigId.toSetting(), - initialClangDiagnosticConfigId().toSetting()); - - if (haveCheckedHardwareReqirements != false) - map.insert(checkedHardwareKey(), true); - - map.insertValueWithDefault(completionResultsKey(), - completionResults, - defaultCompletionResults()); + map.insert(useClangdKey(), useClangd); + map.insert(clangdPathKey(), + executableFilePath != fallbackClangdFilePath() ? executableFilePath.toString() + : QString()); + map.insert(clangdIndexingKey(), indexingPriority != IndexingPriority::Off); + map.insert(clangdIndexingPriorityKey(), int(indexingPriority)); + map.insert(clangdHeaderSourceSwitchModeKey(), int(headerSourceSwitchMode)); + map.insert(clangdCompletionRankingModelKey(), int(completionRankingModel)); + map.insert(clangdHeaderInsertionKey(), autoIncludeHeaders); + map.insert(clangdThreadLimitKey(), workerThreadLimit); + map.insert(clangdDocumentThresholdKey(), documentUpdateThreshold); + map.insert(clangdSizeThresholdEnabledKey(), sizeThresholdEnabled); + map.insert(clangdSizeThresholdKey(), sizeThresholdInKb); + map.insert(sessionsWithOneClangdKey(), sessionsWithOneClangd); + map.insert(diagnosticConfigIdKey(), diagnosticConfigId.toSetting()); + map.insert(checkedHardwareKey(), true); + map.insert(completionResultsKey(), completionResults); return map; } void ClangdSettings::Data::fromMap(const Store &map) { - useClangd = map.value(useClangdKey(), DefaultUseClangd).toBool(); + useClangd = map.value(useClangdKey(), true).toBool(); executableFilePath = FilePath::fromString(map.value(clangdPathKey()).toString()); indexingPriority = IndexingPriority( - map.value(clangdIndexingPriorityKey(), int(DefaultIndexingPriority)).toInt()); + map.value(clangdIndexingPriorityKey(), int(this->indexingPriority)).toInt()); const auto it = map.find(clangdIndexingKey()); if (it != map.end() && !it->toBool()) indexingPriority = IndexingPriority::Off; - headerSourceSwitchMode = HeaderSourceSwitchMode( - map.value(clangdHeaderSourceSwitchModeKey(), int(DefaultHeaderSourceSwitchMode)).toInt()); - completionRankingModel = CompletionRankingModel( - map.value(clangdCompletionRankingModelKey(), int(DefaultCompletionRankingModel)).toInt()); - autoIncludeHeaders = map.value(clangdHeaderInsertionKey(), DefaultAutoIncludeHeaders).toBool(); - workerThreadLimit = map.value(clangdThreadLimitKey(), DefaultWorkerThreadLimit).toInt(); - documentUpdateThreshold - = map.value(clangdDocumentThresholdKey(), DefaultDocumentUpdateThreshold).toInt(); - sizeThresholdEnabled - = map.value(clangdSizeThresholdEnabledKey(), DefaultSizeThresholdEnabled).toBool(); - sizeThresholdInKb = map.value(clangdSizeThresholdKey(), DefaultSizeThresholdInKb).toLongLong(); + headerSourceSwitchMode = HeaderSourceSwitchMode(map.value(clangdHeaderSourceSwitchModeKey(), + int(headerSourceSwitchMode)).toInt()); + completionRankingModel = CompletionRankingModel(map.value(clangdCompletionRankingModelKey(), + int(completionRankingModel)).toInt()); + autoIncludeHeaders = map.value(clangdHeaderInsertionKey(), false).toBool(); + workerThreadLimit = map.value(clangdThreadLimitKey(), 0).toInt(); + documentUpdateThreshold = map.value(clangdDocumentThresholdKey(), 500).toInt(); + sizeThresholdEnabled = map.value(clangdSizeThresholdEnabledKey(), false).toBool(); + sizeThresholdInKb = map.value(clangdSizeThresholdKey(), 1024).toLongLong(); sessionsWithOneClangd = map.value(sessionsWithOneClangdKey()).toStringList(); diagnosticConfigId = Id::fromSetting(map.value(diagnosticConfigIdKey(), initialClangDiagnosticConfigId().toSetting())); diff --git a/src/plugins/cppeditor/cppcodemodelsettings.h b/src/plugins/cppeditor/cppcodemodelsettings.h index 6b491855107..fe2e625c070 100644 --- a/src/plugins/cppeditor/cppcodemodelsettings.h +++ b/src/plugins/cppeditor/cppcodemodelsettings.h @@ -125,26 +125,15 @@ public: QStringList sessionsWithOneClangd; ClangDiagnosticConfigs customDiagnosticConfigs; Utils::Id diagnosticConfigId; - - static constexpr auto DefaultWorkerThreadLimit = 0; - static constexpr auto DefaultDocumentUpdateThreshold = 500; - static constexpr auto DefaultSizeThresholdInKb = 1024ll; - static constexpr auto DefaultUseClangd = true; - static constexpr auto DefaultIndexingPriority = ClangdSettings::IndexingPriority::Low; - static constexpr auto DefaultHeaderSourceSwitchMode = HeaderSourceSwitchMode::Both; - static constexpr auto DefaultCompletionRankingModel = CompletionRankingModel::Default; - static constexpr auto DefaultAutoIncludeHeaders = false; - static constexpr auto DefaultSizeThresholdEnabled = false; - - int workerThreadLimit = DefaultWorkerThreadLimit; - int documentUpdateThreshold = DefaultDocumentUpdateThreshold; - qint64 sizeThresholdInKb = DefaultSizeThresholdInKb; - bool useClangd = DefaultUseClangd; - IndexingPriority indexingPriority = DefaultIndexingPriority; - HeaderSourceSwitchMode headerSourceSwitchMode = DefaultHeaderSourceSwitchMode; - CompletionRankingModel completionRankingModel = DefaultCompletionRankingModel; - bool autoIncludeHeaders = DefaultAutoIncludeHeaders; - bool sizeThresholdEnabled = DefaultSizeThresholdEnabled; + int workerThreadLimit = 0; + int documentUpdateThreshold = 500; + qint64 sizeThresholdInKb = 1024; + bool useClangd = true; + IndexingPriority indexingPriority = IndexingPriority::Low; + HeaderSourceSwitchMode headerSourceSwitchMode = HeaderSourceSwitchMode::Both; + CompletionRankingModel completionRankingModel = CompletionRankingModel::Default; + bool autoIncludeHeaders = false; + bool sizeThresholdEnabled = false; bool haveCheckedHardwareReqirements = false; int completionResults = defaultCompletionResults(); }; From 50c404659385fa1b991e18e84329bf0c25bd8190 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 4 Mar 2024 12:00:43 +0100 Subject: [PATCH 23/87] Deploy qtplugininfo It is useful for inspecting Qt Creator plugins and doesn't hurt. Change-Id: Ifefb3b17193e16b0f592b854477374dbcb5ab1b4 Reviewed-by: Alessandro Portale Reviewed-by: Reviewed-by: Qt CI Bot --- scripts/deploy.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/deploy.py b/scripts/deploy.py index 20ade283d2a..8df90f1ac14 100755 --- a/scripts/deploy.py +++ b/scripts/deploy.py @@ -236,7 +236,7 @@ def deploy_qt_conf_files(qtc_binary_path): if common.is_linux_platform(): qt_prefix_path = os.path.join(qtc_binary_path, '..', 'lib', 'Qt') add_qt_conf(os.path.join(qtc_binary_path, '..', 'libexec', 'qtcreator'), qt_prefix_path) - add_qt_conf(os.path.join(qtc_binary_path, '..', 'lib', 'Qt', 'bin'), qt_prefix_path) # qtdiag + add_qt_conf(os.path.join(qtc_binary_path, '..', 'lib', 'Qt', 'bin'), qt_prefix_path) # qtdiag etc add_qt_conf(qtc_binary_path, qt_prefix_path) # QtC itself if common.is_windows_platform(): add_qt_conf(qtc_binary_path, qtc_binary_path) # QtC itself, libexec, and qtdiag etc @@ -409,8 +409,9 @@ def deploy_qt_mac(qtc_binary_path, qt_install): puppets = glob(os.path.join(libexec_path, 'qml2puppet*')) for puppet in puppets: additional_paths.append(puppet) - # qtdiag + # qtdiag, qtplugininfo additional_paths.append(os.path.join(bin_path, 'qtdiag')) + additional_paths.append(os.path.join(bin_path, 'qtplugininfo')) # other libexec additional_paths.append(os.path.join(libexec_path, 'sdktool')) additional_paths.append(os.path.join(libexec_path, 'qtpromaker')) @@ -470,6 +471,7 @@ def main(): else os.path.dirname(args.qtcreator_binary)) deploy_binary('qtdiag', qtcreator_binary_path, qt_install) + deploy_binary('qtplugininfo', qtcreator_binary_path, qt_install) deploy_binary('qsb', qtcreator_binary_path, qt_install) deploy_plugins(qtcreator_binary_path, qt_install) deploy_imports(qtcreator_binary_path, qt_install) From 6d6ec00cdbb6d110411ed8b731790ab676417d41 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 4 Mar 2024 14:50:27 +0100 Subject: [PATCH 24/87] Core: Wrap moribund dialogs into QPointer There's no guarantee that items in the collected list don't die for other reasons before it's their turn in the loop. Change-Id: I5e81a25c3c205646eece30d6dd1a95f4b97eda05 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/icore.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index 54462f30512..1834a795608 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -2189,15 +2189,17 @@ void ICorePrivate::openFileFromDevice() static void acceptModalDialogs() { const QWidgetList topLevels = QApplication::topLevelWidgets(); - QList dialogsToClose; + QList> dialogsToClose; for (QWidget *topLevel : topLevels) { if (auto dialog = qobject_cast(topLevel)) { if (dialog->isModal()) dialogsToClose.append(dialog); } } - for (QDialog *dialog : dialogsToClose) - dialog->accept(); + for (QDialog *dialog : dialogsToClose) { + if (dialog) + dialog->accept(); + } } } // Internal From 58f6a3a459a8e77fe3b31b31d51a3ba428cc9afc Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 26 Feb 2024 14:17:08 +0100 Subject: [PATCH 25/87] COIN/GitHub: Use Qt 6.6.2 Change-Id: Ib9303ea53eb8b14851c670c144ed6a3261c2d6cb Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- .github/workflows/build_cmake.yml | 6 +++--- coin/instructions/common_environment.yaml | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index 6ac4564da1e..794b38c6c1c 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -7,7 +7,7 @@ on: - 'doc/**' env: - QT_VERSION: 6.6.0 + QT_VERSION: 6.6.2 MACOS_DEPLOYMENT_TARGET: 11.0 CLANG_VERSION: 17.0.1 ELFUTILS_VERSION: 0.175 @@ -202,12 +202,12 @@ jobs: set(url_os "linux_x64") set(qt_package_arch_suffix "gcc_64") set(qt_dir_prefix "${qt_version}/gcc_64") - set(qt_package_suffix "-Linux-RHEL_8_6-GCC-Linux-RHEL_8_6-X86_64") + set(qt_package_suffix "-Linux-RHEL_8_8-GCC-Linux-RHEL_8_8-X86_64") elseif ("${{ runner.os }}" STREQUAL "macOS") set(url_os "mac_x64") set(qt_package_arch_suffix "clang_64") set(qt_dir_prefix "${qt_version}/macos") - set(qt_package_suffix "-MacOS-MacOS_12-Clang-MacOS-MacOS_12-X86_64-ARM64") + set(qt_package_suffix "-MacOS-MacOS_13-Clang-MacOS-MacOS_13-X86_64-ARM64") endif() set(qt_base_url "https://\${qt_mirror}/online/qtsdkrepository/${url_os}/desktop/qt6_${qt_version_dotless}") diff --git a/coin/instructions/common_environment.yaml b/coin/instructions/common_environment.yaml index 6d4fe73802e..e2d11901180 100644 --- a/coin/instructions/common_environment.yaml +++ b/coin/instructions/common_environment.yaml @@ -10,13 +10,13 @@ instructions: variableValue: https://ci-files02-hki.ci.qt.io/packages/jenkins/qtcreator_libclang/libclang-release_17.0.1-based - type: EnvironmentVariable variableName: QTC_QT_BASE_URL - variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.6/6.6.0-released/Qt" + variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.6/6.6.2-released/Qt" - type: EnvironmentVariable variableName: QTC_QT_MODULES variableValue: "qt5compat qtbase qtdeclarative qtimageformats qtquick3d qtquicktimeline qtserialport qtshadertools qtsvg qttools qttranslations qtwebengine" - type: EnvironmentVariable variableName: MACOSX_DEPLOYMENT_TARGET - variableValue: 10.15 + variableValue: 11.0 - type: EnvironmentVariable variableName: SDKTOOL_MACOSX_DEPLOYMENT_TARGET variableValue: 10.14 @@ -39,7 +39,7 @@ instructions: instructions: - type: EnvironmentVariable variableName: QTC_QT_POSTFIX - variableValue: "-Linux-RHEL_8_6-GCC-Linux-RHEL_8_6-X86_64.7z" + variableValue: "-Linux-RHEL_8_8-GCC-Linux-RHEL_8_8-X86_64.7z" - type: EnvironmentVariable variableName: QTC_SDKTOOL_QT_EXT variableValue: ".tar.xz" @@ -51,7 +51,7 @@ instructions: instructions: - type: EnvironmentVariable variableName: QTC_QT_POSTFIX - variableValue: "-MacOS-MacOS_12-Clang-MacOS-MacOS_12-X86_64-ARM64.7z" + variableValue: "-MacOS-MacOS_13-Clang-MacOS-MacOS_13-X86_64-ARM64.7z" - type: EnvironmentVariable variableName: QTC_SDKTOOL_QT_EXT variableValue: ".tar.xz" From 568118af8b48b56fe567b8b8c19ff229f5a87e9e Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 5 Mar 2024 09:41:55 +0100 Subject: [PATCH 26/87] Terminal: Fix copying Japanese text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously if you tried to copy text such as "惣流・アスカ・ラングレー" an invalid char would be added after each character. This patch fixes the code so that "-1" cells are ignored. They are created because the previous cell had a width of 2. Change-Id: Iff8e60d3a4080068e188b08ded13a8c78df952f2 Reviewed-by: Cristian Adam --- src/libs/solutions/terminal/terminalsurface.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libs/solutions/terminal/terminalsurface.cpp b/src/libs/solutions/terminal/terminalsurface.cpp index e51c09d8944..00f26ce188f 100644 --- a/src/libs/solutions/terminal/terminalsurface.cpp +++ b/src/libs/solutions/terminal/terminalsurface.cpp @@ -456,6 +456,9 @@ std::u32string::value_type TerminalSurface::fetchCharAt(int x, int y) const if (cell->width == 0) return 0; + if (cell->chars[0] == 0xffffffff) + return 0; + QString s = QString::fromUcs4(cell->chars, 6).normalized(QString::NormalizationForm_C); const QList ucs4 = s.toUcs4(); return std::u32string(ucs4.begin(), ucs4.end()).front(); From 369105376008101ef710130bf17ebda84d24cbb7 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 5 Mar 2024 09:24:42 +0100 Subject: [PATCH 27/87] TextEditor: fix finding whole words '_' was handled as a word separator, in contrast the global search did not. So the user received different results when using find toolbar or the advanced search while searching with the same option and pattern. Fixes: QTCREATORBUG-10276 Change-Id: Ie07303fbaa35475bb98bdb813358169474c3ba1d Reviewed-by: Marcus Tillmanns --- src/plugins/texteditor/texteditor.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 054e65193f4..3256ee91b79 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -4154,10 +4154,17 @@ void TextEditorWidgetPrivate::highlightSearchResults(const QTextBlock &block, co l = match.capturedLength(); if (l == 0) break; - if ((m_findFlags & FindWholeWords) - && ((idx && text.at(idx-1).isLetterOrNumber()) - || (idx + l < text.length() && text.at(idx + l).isLetterOrNumber()))) - continue; + if (m_findFlags & FindWholeWords) { + auto posAtWordSeparator = [](const QString &text, int idx) { + if (idx < 0 || idx >= text.length()) + return false; + const QChar c = text.at(idx); + return !c.isLetterOrNumber() && c != QLatin1Char('_'); + }; + if (!posAtWordSeparator(text, idx - 1) || !posAtWordSeparator(text, idx + l)) + continue; + } + const int start = blockPosition + idx; const int end = start + l; From feeb72d78cb85c914b0bc17f95a7b9a00a84f22b Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 5 Mar 2024 09:00:52 +0100 Subject: [PATCH 28/87] Debugger: Rework timeout handling Extend the range to start with 10sec, but default to 40secs. Change-Id: Iede37afca0da2c9ba8fc0bb3fda65d403b8d0bcc Reviewed-by: Christian Stenger Reviewed-by: --- src/plugins/debugger/gdb/gdbengine.cpp | 10 ++-------- src/plugins/debugger/gdb/gdbengine.h | 1 - src/plugins/debugger/gdb/gdbsettings.cpp | 4 ++-- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 919ee6c7534..0f4fe9d7729 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -784,8 +784,8 @@ void GdbEngine::runCommand(const DebuggerCommand &command) } // Start Watchdog. - if (m_commandTimer.interval() <= 20000) - m_commandTimer.setInterval(commandTimeoutTime()); + const int watchDogMilliSecs = settings().gdbWatchdogTimeout() * 1000; + m_commandTimer.setInterval(watchDogMilliSecs); // The process can die for external reason between the "-gdb-exit" was // sent and a response could be retrieved. We don't want the watchdog // to bark in that case since the only possible outcome is a dead @@ -798,12 +798,6 @@ void GdbEngine::runCommand(const DebuggerCommand &command) } } -int GdbEngine::commandTimeoutTime() const -{ - const int time = settings().gdbWatchdogTimeout(); - return 1000 * qMax(20, time); -} - void GdbEngine::commandTimeout() { const QList keys = Utils::sorted(m_commandForToken.keys()); diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index c7efe0cbaf6..a396ad55079 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -116,7 +116,6 @@ private: ////////// General Interface ////////// QHash m_commandForToken; QHash m_flagsForToken; - int commandTimeoutTime() const; QTimer m_commandTimer; QString m_pendingConsoleStreamOutput; diff --git a/src/plugins/debugger/gdb/gdbsettings.cpp b/src/plugins/debugger/gdb/gdbsettings.cpp index eef19df9719..04688b54837 100644 --- a/src/plugins/debugger/gdb/gdbsettings.cpp +++ b/src/plugins/debugger/gdb/gdbsettings.cpp @@ -187,9 +187,9 @@ GdbSettings::GdbSettings() "calls and is very likely to destroy your debugging session.

")); gdbWatchdogTimeout.setSettingsKey("WatchdogTimeout"); - gdbWatchdogTimeout.setDefaultValue(20); + gdbWatchdogTimeout.setDefaultValue(40); gdbWatchdogTimeout.setSuffix(Tr::tr("sec")); - gdbWatchdogTimeout.setRange(20, 1000000); + gdbWatchdogTimeout.setRange(10, 1000000); gdbWatchdogTimeout.setLabelText(Tr::tr("GDB timeout:")); gdbWatchdogTimeout.setToolTip(Tr::tr( "The number of seconds before a non-responsive GDB process is terminated.\n" From ac67df7e7318456f3616e414caec20543764de9d Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 4 Mar 2024 11:51:58 +0100 Subject: [PATCH 29/87] main: Fix leaking of a QtcSettings object Amends b619f24396ab5d446f39d2d53904829254c19a80 Change-Id: Ic93d33a09eb2b49dd899470ba88f3a7d71f5400d Reviewed-by: Reviewed-by: hjk --- src/app/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index b875850722a..6c5fb9a3062 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -414,9 +414,8 @@ QStringList lastSessionArgument() QString crashReportsPath() { std::unique_ptr settings(createUserSettings()); - QFileInfo(settings->fileName()).path() + "/crashpad_reports"; if (Utils::HostOsInfo::isMacHost()) - return QFileInfo(createUserSettings()->fileName()).path() + "/crashpad_reports"; + return QFileInfo(settings->fileName()).path() + "/crashpad_reports"; else return QCoreApplication::applicationDirPath() + '/' + RELATIVE_LIBEXEC_PATH + "crashpad_reports"; From 25c0fc9c45658509f4199d254646148b517c5d81 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Tue, 5 Mar 2024 13:37:17 +0100 Subject: [PATCH 30/87] Android: Add output about JDK path issues Change-Id: Ib72c5e8e2e23aa1f24d5181a060c72aaa2006d37 Reviewed-by: Marcus Tillmanns --- src/plugins/android/androidsettingswidget.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index c75ba299c5b..1e086daa9fe 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -10,6 +10,7 @@ #include "androidtr.h" #include +#include #include @@ -361,8 +362,10 @@ AndroidSettingsWidget::AndroidSettingsWidget() m_openJdkLocationPathChooser->setValidationFunction([](const QString &s) { return Utils::asyncRun([s]() -> expected_str { expected_str test = testJavaC(FilePath::fromUserInput(s)); - if (!test) + if (!test) { + Core::MessageManager::writeSilently(test.error()); return make_unexpected(test.error()); + } return s; }); }); From 911c486ff07a8314d3c6186c3a86888f84dd7817 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 1 Mar 2024 10:15:05 +0100 Subject: [PATCH 31/87] Qt/Help: Fix the "Highest Version Only" setting for the online installer The Qt support has the option to only register the documentation for "the highest Qt version", which is enabled by default. That is based on finding the help files for registered Qt versions and only registering the right set depending on the settings. Unfortunately the online installer additionally registers the Qt documentation path as a separate documentation set in the install settings. (This was originally introduced to support documentation for components that are not directly related to a Qt version.) The Help plugin that handles this setting doesn't know that the Qt support explicitly doesn't want the documentation of some Qt versions registered. Let the Qt support explicitly tell the Help plugin about documentation files that should not be registered, even if they appear in the separate install setting. Change-Id: I0512adc0dfe9969481ce83094f5349a49aae5d9f Reviewed-by: Christian Kandeler Reviewed-by: Reviewed-by: Marcus Tillmanns --- src/plugins/coreplugin/helpmanager.cpp | 6 +++ src/plugins/coreplugin/helpmanager.h | 1 + .../coreplugin/helpmanager_implementation.h | 1 + src/plugins/help/helpmanager.cpp | 13 +++++ src/plugins/help/helpmanager.h | 1 + src/plugins/qtsupport/qtversionmanager.cpp | 49 ++++++++++++++++--- 6 files changed, 64 insertions(+), 7 deletions(-) diff --git a/src/plugins/coreplugin/helpmanager.cpp b/src/plugins/coreplugin/helpmanager.cpp index 2fda96bf1e2..01fc7eff478 100644 --- a/src/plugins/coreplugin/helpmanager.cpp +++ b/src/plugins/coreplugin/helpmanager.cpp @@ -97,5 +97,11 @@ void showHelpUrl(const QString &url, HelpViewerLocation location) showHelpUrl(QUrl(url), location); } +void setBlockedDocumentation(const QStringList &fileNames) +{ + if (checkInstance()) + m_instance->setBlockedDocumentation(fileNames); +} + } // HelpManager } // Core diff --git a/src/plugins/coreplugin/helpmanager.h b/src/plugins/coreplugin/helpmanager.h index 845b508015d..55d449e696b 100644 --- a/src/plugins/coreplugin/helpmanager.h +++ b/src/plugins/coreplugin/helpmanager.h @@ -38,6 +38,7 @@ enum HelpViewerLocation { CORE_EXPORT QString documentationPath(); CORE_EXPORT void registerDocumentation(const QStringList &fileNames); +CORE_EXPORT void setBlockedDocumentation(const QStringList &fileNames); CORE_EXPORT void unregisterDocumentation(const QStringList &fileNames); CORE_EXPORT QMultiMap linksForIdentifier(const QString &id); diff --git a/src/plugins/coreplugin/helpmanager_implementation.h b/src/plugins/coreplugin/helpmanager_implementation.h index c0d23563400..798a5a340ed 100644 --- a/src/plugins/coreplugin/helpmanager_implementation.h +++ b/src/plugins/coreplugin/helpmanager_implementation.h @@ -17,6 +17,7 @@ protected: public: virtual void registerDocumentation(const QStringList &fileNames) = 0; + virtual void setBlockedDocumentation(const QStringList &fileNames) = 0; virtual void unregisterDocumentation(const QStringList &fileNames) = 0; virtual QMultiMap linksForIdentifier(const QString &id) = 0; virtual QMultiMap linksForKeyword(const QString &keyword) = 0; diff --git a/src/plugins/help/helpmanager.cpp b/src/plugins/help/helpmanager.cpp index 6a232083bd1..7ec80e700d5 100644 --- a/src/plugins/help/helpmanager.cpp +++ b/src/plugins/help/helpmanager.cpp @@ -54,6 +54,7 @@ struct HelpManagerPrivate // data for delayed initialization QSet m_filesToRegister; + QSet m_blockedDocumentation; QSet m_filesToUnregister; QHash m_customValues; @@ -146,6 +147,12 @@ void HelpManager::registerDocumentation(const QStringList &files) ProgressManager::addTask(future, Tr::tr("Update Documentation"), kUpdateDocumentationTask); } +void HelpManager::setBlockedDocumentation(const QStringList &fileNames) +{ + for (const QString &filePath : fileNames) + d->m_blockedDocumentation.insert(filePath); +} + static void unregisterDocumentationNow(QPromise &promise, const QString collectionFilePath, const QStringList &files) @@ -334,6 +341,12 @@ void HelpManager::setupHelpManager() for (const QString &filePath : d->documentationFromInstaller()) d->m_filesToRegister.insert(filePath); + // The online installer registers documentation for Qt versions explicitly via an install + // setting, which defeats that we only register the Qt versions matching the setting. + // So the Qt support explicitly blocks the files that we do _not_ want to register, so the + // Help plugin knows about this. + d->m_filesToRegister -= d->m_blockedDocumentation; + d->cleanUpDocumentation(); if (!d->m_filesToUnregister.isEmpty()) { diff --git a/src/plugins/help/helpmanager.h b/src/plugins/help/helpmanager.h index 6a5874e7df2..5f0efe56200 100644 --- a/src/plugins/help/helpmanager.h +++ b/src/plugins/help/helpmanager.h @@ -29,6 +29,7 @@ public: static QString collectionFilePath(); void registerDocumentation(const QStringList &fileNames) override; + void setBlockedDocumentation(const QStringList &fileNames) override; void unregisterDocumentation(const QStringList &fileNames) override; static void registerUserDocumentation(const QStringList &filePaths); diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index acdaba62827..063a1309846 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -120,7 +120,8 @@ public: void updateDocumentation(const QtVersions &added, const QtVersions &removed, - const QtVersions &allNew); + const QtVersions &allNew, + bool updateBlockedDocumentation = false); void setNewQtVersions(const QtVersions &newVersions); QString qmakePath(const QString &qtchooser, const QString &version); @@ -174,7 +175,7 @@ void QtVersionManagerImpl::triggerQtVersionRestore() } // exists const QtVersions vs = QtVersionManager::versions(); - updateDocumentation(vs, {}, vs); + updateDocumentation(vs, {}, vs, /*updateBlockedDocumentation=*/true); } bool QtVersionManager::isLoaded() @@ -499,9 +500,13 @@ void QtVersionManager::registerExampleSet(const QString &displayName, using Path = QString; using FileName = QString; -static QList> documentationFiles(QtVersion *v) +using DocumentationFile = std::pair; +using DocumentationFiles = QList; +using AllDocumentationFiles = QHash; + +static DocumentationFiles allDocumentationFiles(QtVersion *v) { - QList> files; + DocumentationFiles files; const QStringList docPaths = QStringList( {v->docsPath().toString() + QChar('/'), v->docsPath().toString() + "/qch/"}); for (const QString &docPath : docPaths) { @@ -512,7 +517,17 @@ static QList> documentationFiles(QtVersion *v) return files; } -static QStringList documentationFiles(const QtVersions &vs, bool highestOnly = false) +static AllDocumentationFiles allDocumentationFiles(const QtVersions &versions) +{ + AllDocumentationFiles result; + for (QtVersion *v : versions) + result.insert(v, allDocumentationFiles(v)); + return result; +} + +static QStringList documentationFiles(const QtVersions &vs, + const AllDocumentationFiles &allDocumentationFiles, + bool highestOnly = false) { // if highestOnly is true, register each file only once per major Qt version, even if // multiple minor or patch releases of that major version are installed @@ -522,7 +537,8 @@ static QStringList documentationFiles(const QtVersions &vs, bool highestOnly = f for (QtVersion *v : versions) { const int majorVersion = v->qtVersion().majorVersion(); QSet &majorVersionFileNames = includedFileNames[majorVersion]; - for (const std::pair &file : documentationFiles(v)) { + const DocumentationFiles files = allDocumentationFiles.value(v); + for (const std::pair &file : files) { if (!highestOnly || !majorVersionFileNames.contains(file.second)) { filePaths.insert(file.first + file.second); majorVersionFileNames.insert(file.second); @@ -532,15 +548,23 @@ static QStringList documentationFiles(const QtVersions &vs, bool highestOnly = f return filePaths.values(); } +static QStringList documentationFiles(const QtVersions &vs) +{ + return documentationFiles(vs, allDocumentationFiles(vs)); +} + void QtVersionManagerImpl::updateDocumentation(const QtVersions &added, const QtVersions &removed, - const QtVersions &allNew) + const QtVersions &allNew, + bool updateBlockedDocumentation) { using DocumentationSetting = QtVersionManager::DocumentationSetting; const DocumentationSetting setting = QtVersionManager::documentationSetting(); + const AllDocumentationFiles allNewDocFiles = allDocumentationFiles(allNew); const QStringList docsOfAll = setting == DocumentationSetting::None ? QStringList() : documentationFiles(allNew, + allNewDocFiles, setting == DocumentationSetting::HighestOnly); const QStringList docsToRemove = Utils::filtered(documentationFiles(removed), @@ -551,6 +575,17 @@ void QtVersionManagerImpl::updateDocumentation(const QtVersions &added, [&docsOfAll](const QString &f) { return docsOfAll.contains(f); }); + + if (updateBlockedDocumentation) { + // The online installer registers documentation for Qt versions explicitly via an install + // setting, which defeats that we only register the Qt versions matching the setting. + // So the Qt support explicitly blocks the files that we do _not_ want to register, so the + // Help plugin knows about this. + const QSet reallyAllFiles = toSet(documentationFiles(allNew, allNewDocFiles)); + const QSet toBlock = reallyAllFiles - toSet(docsOfAll); + Core::HelpManager::setBlockedDocumentation(toList(toBlock)); + } + Core::HelpManager::unregisterDocumentation(docsToRemove); Core::HelpManager::registerDocumentation(docsToAdd); } From 118e39cae2eac020c0f649f2902fd9359fea4fbd Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 4 Mar 2024 05:50:06 +0100 Subject: [PATCH 32/87] LSP: fix placeholder key see https://microsoft.github.io/language-server-protocol/specifications/ lsp/3.17/specification/#textDocument_prepareRename This fixes the empty replacement input field when renaming a global symbol with current clangd from the llvm main branch. Change-Id: I6539a17c6172e7c96088645ab7234d9b0213170c Reviewed-by: Christian Kandeler --- src/libs/languageserverprotocol/jsonkeys.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/languageserverprotocol/jsonkeys.h b/src/libs/languageserverprotocol/jsonkeys.h index f9ef7b4bedb..236d28bfda1 100644 --- a/src/libs/languageserverprotocol/jsonkeys.h +++ b/src/libs/languageserverprotocol/jsonkeys.h @@ -143,7 +143,7 @@ constexpr Key parametersKey{"parameters"}; constexpr Key paramsKey{"params"}; constexpr Key patternKey{"pattern"}; constexpr Key percentageKey{"percentage"}; -constexpr Key placeHolderKey{"placeHolder"}; +constexpr Key placeHolderKey{"placeholder"}; constexpr Key positionKey{"position"}; constexpr Key prepareProviderKey{"prepareProvider"}; constexpr Key prepareSupportKey{"prepareSupport"}; From 3517123ff48bc32a89edaf57600ca6be3c287253 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 5 Mar 2024 13:07:40 +0100 Subject: [PATCH 33/87] LanguageClient: fix assist provider leak on client destruction Change-Id: I2d932c2123f48a65be1c6406ed669feda03c93ea Reviewed-by: Christian Stenger --- src/plugins/languageclient/client.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 7095c450481..90120e3174b 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -207,6 +207,9 @@ public: // do not handle messages while shutting down disconnect(m_clientInterface, &InterfaceController::messageReceived, q, &Client::handleMessage); + delete m_clientProviders.completionAssistProvider; + delete m_clientProviders.functionHintProvider; + delete m_clientProviders.quickFixAssistProvider; delete m_diagnosticManager; delete m_clientInterface; } From 5a1e5ce0583ef9bf2cafb247d2af477abf3703b5 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 4 Mar 2024 10:47:24 +0100 Subject: [PATCH 34/87] Doc: Split up "Searching with the Locator" Hide the locator docs from the QDS Manual because the locator is not visible in the Code view. Task-number: QTCREATORBUG-29361 Change-Id: Iecbbaece78b0cd6a496289fd9a00acfdd054d41f Reviewed-by: Eike Ziller --- .../src/cmake/creator-projects-cmake.qdoc | 4 +- .../src/editors/creator-locator.qdoc | 325 ------------------ .../creator-only/creator-clang-codemodel.qdoc | 2 +- .../creator-coding-edit-mode.qdoc | 6 +- .../editors/creator-only/creator-copilot.qdoc | 2 +- .../creator-only/creator-language-server.qdoc | 2 +- .../editors/creator-only/creator-locator.qdoc | 265 ++++++++++++++ .../creator-text-editing-macros.qdoc | 2 +- doc/qtcreator/src/editors/creator-search.qdoc | 2 +- .../creator-how-to-find-preferences.qdoc | 6 +- .../howto/creator-only/creator-how-tos.qdoc | 98 +++++- doc/qtcreator/src/howto/creator-sessions.qdoc | 32 +- .../creator-only/creator-files-creating.qdoc | 10 +- .../creator-projects-building.qdoc | 2 +- .../creator-projects-creating.qdoc | 2 +- .../creator-file-system-view.qdoc | 2 +- .../user-interface/creator-projects-view.qdoc | 2 +- .../src/user-interface/creator-ui.qdoc | 2 +- .../developers/studio-jump-to-the-code.qdoc | 2 +- .../src/overviews/studio-finding.qdoc | 6 - .../src/qtdesignstudio-toc.qdoc | 1 - 21 files changed, 408 insertions(+), 367 deletions(-) delete mode 100644 doc/qtcreator/src/editors/creator-locator.qdoc create mode 100644 doc/qtcreator/src/editors/creator-only/creator-locator.qdoc diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc index f4abbfa86ee..a1130b7a89e 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc @@ -198,8 +198,8 @@ \uicontrol Projects view and select \uicontrol {Open With} > \uicontrol {CMake Editor}. - You can also use the \c cmo filter in the \l {Searching with the Locator} - {locator} to open the CMakeLists.txt file for the current run configuration + You can also use the \c cmo filter in the \l {Navigate with locator}{locator} + to open the CMakeLists.txt file for the current run configuration in the editor. This is the same build target as when you select \uicontrol Build > \uicontrol {Build for Run Configuration}. diff --git a/doc/qtcreator/src/editors/creator-locator.qdoc b/doc/qtcreator/src/editors/creator-locator.qdoc deleted file mode 100644 index 292b35ff30c..00000000000 --- a/doc/qtcreator/src/editors/creator-locator.qdoc +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright (C) 2023 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \page creator-editor-locator.html - \previouspage creator-how-to-advanced-search.html - \if defined(qtdesignstudio) - \nextpage creator-jump-to-the-code.html - \else - \nextpage creator-how-tos.html - \endif - - \title Searching with the Locator - - The locator is the fastest way to find a particular project, file, class, or - function, or almost anything else in your project. - - By default, you can find the locator in the bottom left of the \QC window. - To open it as a centered popup, click \inlineimage icons/magnifier.png - (\uicontrol Options) in it and select \uicontrol {Open as Centered Popup}. - - \image qtcreator-locator.webp "List of locator filters" - - \section1 Activating the Locator - - To activate the locator: - - \list - - \li Press \key {Ctrl+K} (\key {Cmd+K} on \macos). - - \li Select \uicontrol Tools > \uicontrol Locate. - - \li Select \uicontrol Edit > \uicontrol {Go to Line}. - \if defined(qtcreator) - \li Click the line and column indicator on the - \l{Edit Mode}{editor toolbar}. - \endif - \endlist - - \section1 Using Locator Filters - - You can locate not only files, but any items defined by \e{locator filters}, - as well as trigger global actions and perform other tasks, such as build - projects or run external tools. - - The filters that are available depend on the file type. For more information - about what a particular locator filter does, see the tooltips that appear - when you hover over a filter in the locator. For longer descriptions of the - filters, select \uicontrol Configure to open the \uicontrol Locator - \l{Creating Locator Filters}{preferences}. - - To use a locator filter, type its prefix followed by \key Space. The prefix - is usually short, from one to three characters. Then type the search string - (for example, a filename or class name) or the command to execute. - - You can also double-click a locator filter in the filter list to use it. Use - the up and down arrow keys or the \key Ctrl+P and \key Ctrl+N - keyboard shortcuts to move up and down the list, and then press \key Enter - to use the selected filter. - - As you type a search string, - the locator shows the occurrences of that string regardless of where in the - name of an component it appears. Some locator filters, such as colon, \c m, - and \c t, support \e fuzzy matching, which means that you can enter the - uppercase letters to locate a symbol when using camel case or the letters - after the underscore when using snake case. - - To narrow down the search results, use the following wildcard characters: - - \list - - \li To match any number of any or no characters, enter \c{*}. - - \li To match a single instance of any character, enter \c{?}. - - \endlist - - \section2 Locating Lines and Columns - - To move directly to a particular line and column in the document when you - open the document, append the line and column number to the file name in - the locator, separated by plus signs (+) or colons (:). - - For example, to open \e HelloWorld.qml to line - 41 and column 2, enter: - - \code - HelloWorld.qml:41:2 - \endcode - - \section2 Creating Files and Directories from Locator - - To create a new file and open it in the editor, type \c f - followed by \key Space, followed by path and file name, and then press - \key Enter or select \uicontrol {Create and Open File}. To create a - directory, select \uicontrol {Create Directory}. - - \section2 Opening Sessions from Locator - - You can use the filter that triggers menu commands to open - \l{Manage sessions}{sessions}. Enter - \c {t yoursess} or \c {t sess yoursess} to trigger \uicontrol File > - \uicontrol Sessions > \e . - - \section2 Default Filters - - By default, you can use the following preset locator filters without a - prefix: - - \list - - \li Going to a line and column in the current file (\c {l}). - - \li Going to an open file (\c {o}). - - \li Going to a file in any open project (\c {a}). - - \endlist - - \section1 Changing Locator Filters - - You can change the preset locator filters to match your use case. For - example, you can change the filter prefix and restrict the search to - items that match the filter. - - \image qtcreator-locator-filter-edit-ai.webp {Filter Configuration dialog} - - To configure a locator filter: - - \list 1 - - \li In the locator, click \inlineimage icons/magnifier.png - (\uicontrol Options) and select \uicontrol Configure to open the - \uicontrol Locator preferences. - - \li Select a filter, and then select \uicontrol Edit. - - \li Specify the prefix string. - - \li To implicitly include the filter even when not typing a prefix as a - part of the search string, select \uicontrol {Include by default}. - - \li Set other available preferences. - - \endlist - - \section2 Adding Web Search Engines - - You can use the \uicontrol {Web Search (r)} locator filter to perform - web searches. URLs and search commands for Bing, Google, Yahoo! Search, - cplusplus.com, and Wikipedia are configured by default. - - To find out the format of the search command to use for your favorite - web search engine, perform a search in your browser and copy the resulting - URL to the locator filter configuration. Replace the search term with the - variable \c {%1}. - - To add URLs and search commands to the list: - - \list 1 - - \li Select \preferences > \uicontrol Environment > \uicontrol Locator > - \uicontrol {Web Search} > \uicontrol Edit. - - \li Select \uicontrol Add to add a new entry to the list. - - \image qtcreator-add-online-doc.webp "List of URLs in Filter Configuration dialog" - - \li Double-click the new entry to specify a URL and a search command. - For example, \c {http://www.google.com/search?q=%1}. - - \li Click \uicontrol OK. - - \endlist - - \section1 Creating Locator Filters - - You can create custom locator filters for searching in a directory structure - or on the web. - - To quickly access files not directly mentioned in your project, you can - create your own directory filters. That way you can locate files in a - directory structure you have defined. - - To create custom locator filters: - - \list 1 - - \li In the locator, select \uicontrol Options > - \uicontrol Configure to open the \uicontrol Locator preferences. - - \image qtcreator-locator-customize.webp "Locator preferences" - - \li Select \uicontrol Add > \uicontrol {Files in Directories} to add - a directory filter or \uicontrol {URL Template} to add a URL - filter. The settings to specify depend on the filter type. - - \image qtcreator-locator-generic-directory-filter.png "Filter Configuration dialog" - - \li In the \uicontrol Name field, enter a name for your filter. - - \li In the \uicontrol Directories field, select at least one - directory. The locator searches directories recursively. - - \li In the \uicontrol {File pattern} field, specify file patterns to - restrict the search to files that match the pattern. - Separate the patterns with commas. For example, to search for all - \c {.qml} and \c {.ui.qml} files, enter \c{*.qml,*.ui.qml} - - \li In the \uicontrol {Exclusion pattern} field, specify file - patterns to omit files from the search. - - \li In the \uicontrol Prefix field, specify the prefix string. - - To implicitly include the filter even when not typing a prefix - as a part of the search string, select - \uicontrol {Include by default}. - - \li Select \uicontrol OK. - - \endlist - - \section1 Configuring Locator Cache - - The locator searches the files matching your file pattern in the directories - you have selected and caches that information. \QC updates the cache for all - preset filters as you write code. By default, \QC updates your custom - filters once an hour. - - To update the cached information manually, select \uicontrol Options > - \uicontrol Refresh in the locator. - - To set a new cache update time: - - \list 1 - - \li Select \preferences > \uicontrol Environment > \uicontrol Locator. - - \li In \uicontrol {Refresh interval}, define new time in minutes. - - \endlist - - \section1 Executing JavaScript - - The locator has a JavaScript interpreter for performing calculations. - - Beside simple mathematical operations, like ((1 + 2) * 3), the following - built-in functions exist: - - \table - \header - \li Function - \li Purpose - \row - \li abs(x) - \li Returns the absolute value of x - \row - \li acos(x) - \li Returns the arccosine of x, in radians - \row - \li asin(x) - \li Returns the arcsine of x, in radians - \row - \li atan(x) - \li Returns the arctangent of x, in radians - \row - \li atan2(x, y) - \li Returns the arctangent of the quotient of its arguments - \row - \li bin(x) - \li Returns the binary representation of x - \row - \li ceil(x) - \li Returns the value of x rounded up to the next integer - \row - \li cos(x) - \li Returns the cosine of x (x is in radians) - \row - \li exp(x) - \li Returns the value of E to the power of x - \row - \li e() - \li Returns Euler's number E (2.71828...) - \row - \li floor(x) - \li Returns the value of x rounded down to the next integer - \row - \li hex(x) - \li Returns the hexadecimal representation of x - \row - \li log(x) - \li Returns the natural logarithm (base E) of x - \row - \li max([value1[, value2[, ...]]]) - \li Returns the highest value of the given numbers - \row - \li min([value1[, value2[, ...]]]) - \li Returns the lowest value of the given numbers - \row - \li oct(x) - \li Returns the octal representation of x - \row - \li pi() - \li Returns PI (3.14159...) - \row - \li pow(x, y) - \li Returns the value of x to the power of y - \row - \li random() - \li Returns a random number between 0 and 1 - \row - \li round(x) - \li Returns the value of x rounded to the next integer - \row - \li sin(x) - \li Returns the sine of x (x is in radians) - \row - \li sqrt(x) - \li Returns the square root of x - \row - \li tan(x) - \li Returns the tangent of x (x is in radians) - \endtable -*/ diff --git a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc index b958f836558..e4706d67111 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc @@ -27,7 +27,7 @@ \li Syntactic and \l{Semantic Highlighting}{semantic highlighting} - \li Navigating in the code by using the \l{Searching with the Locator} + \li Navigating in the code by using the \l{Navigate with locator} {locator}, \l{Move to symbol definition or declaration} {following symbols}, and so on diff --git a/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc b/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc index 8e0105b18be..bb730e402a4 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-coding-edit-mode.qdoc @@ -173,7 +173,7 @@ \sa {Edit Code}{How To: Edit Code}, {Manage Language Servers}{How To: Manage Language Servers}, - {Searching with the Locator}, {Keyboard Shortcuts}, {Sidebar Views} + {Navigate with locator}, {Keyboard Shortcuts}, {Sidebar Views} */ /*! @@ -258,7 +258,7 @@ \endlist \sa {Edit Code}{How To: Edit Code}, {Edit Mode}, - {Searching with the Locator}, {File System}, {Projects} + {Navigate with locator}, {File System}, {Projects} */ /*! @@ -378,7 +378,7 @@ \image qtcreator-add-resource.png {Resource Browser} \sa {Edit Code}{How To: Edit Code}, {Edit Mode}, {Editing Keyboard Shortcuts}, - {Searching with the Locator} + {Navigate with locator} */ /*! diff --git a/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc b/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc index 8855d4017fa..d2ca2681303 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-copilot.qdoc @@ -78,7 +78,7 @@ To manually request a suggestion at the current editor's cursor position, enter \uicontrol {t} (\uicontrol {Request Copilot Suggestion}) in the - \l{Searching with the Locator}{locator}. + \l{Navigate with locator}{locator}. Hover the mouse over a suggestion to show a toolbar with \inlineimage icons/prev.png diff --git a/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc b/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc index 7572451a83e..897facbe4ac 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-language-server.qdoc @@ -29,7 +29,7 @@ \li \l{Semantic Highlighting}{Semantic highlighting}, as defined in \l{https://github.com/microsoft/vscode-languageserver-node/pull/367} {Proposal of the semantic highlighting protocol extension} - \li Navigating in the code by using the \l{Searching with the Locator} + \li Navigating in the code by using the \l{Navigate with locator} {locator} or \l{Move to symbol definition or declaration} {moving to the symbol definition} \li Inspecting code by viewing the document outline in the diff --git a/doc/qtcreator/src/editors/creator-only/creator-locator.qdoc b/doc/qtcreator/src/editors/creator-only/creator-locator.qdoc new file mode 100644 index 00000000000..af9f3a3d828 --- /dev/null +++ b/doc/qtcreator/src/editors/creator-only/creator-locator.qdoc @@ -0,0 +1,265 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page creator-editor-locator.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-search + + \title Navigate with locator + + Locate not only files, but any items defined by \e{locator filters}, + as well as trigger global actions and perform other tasks, such as build + projects or run external tools. + + \image qtcreator-locator.webp {List of locator filters} + + \section1 Go to the locator + + To activate the locator: + + \list + + \li Press \key {Ctrl+K} (\key {Cmd+K} on \macos). + + \li Go to \uicontrol Tools, and then select \uicontrol Locate. + + \li Go to \uicontrol Edit, and then select \uicontrol {Go to Line}. + + \li Click the line and column indicator on the + \l{Edit Mode}{editor toolbar}. + + \endlist + + By default, you can find the locator in the bottom left of the \QC window. + To open it as a centered popup, select \inlineimage icons/magnifier.png, and + then select \uicontrol {Open as Centered Popup}. + + \section1 Use locator filters + + The filters that are available depend on the file type. For more information + about what a particular locator filter does, see the tooltips that appear + when you hover over a filter in the locator. For longer descriptions of the + filters, select \inlineimage icons/magnifier.png > \uicontrol Configure to + open the \l{Locator} preferences. + + To use a locator filter: + + \list + \li Type the locator filter prefix followed by \key Space. The prefix + is usually short, from one to three characters. Then type the search + string (for example, a filename or class name) or the command to + execute. + + \li Double-click a locator filter in the filter list to use it. Press + the up and down arrow keys or press \key Ctrl+P and \key Ctrl+N + to move up and down the list, and then press \key Enter to use the + selected filter. + \endlist + + As you type a search string, + the locator shows the occurrences of that string regardless of where in the + name of an object it appears. Some locator filters, such as colon, \c m, + and \c t, support \e fuzzy matching, which means that you can enter the + uppercase letters to locate a symbol when using camel case or the letters + after the underscore when using snake case. + + \section2 Use wildcard characters in search strings + + To narrow down the search results, use the following wildcard characters: + + \list + + \li To match any number of any or no characters, enter \c{*}. + + \li To match a single instance of any character, enter \c{?}. + + \endlist + + \section1 Omit default filters + + By default, you can use the following preset locator filters without a + prefix: + + \list + + \li Going to a line and column in the current file (\c {l}). + + \li Going to an open file (\c {o}). + + \li Going to a file in any open project (\c {a}). + + \endlist + + \section1 Locate lines and columns + + To move directly to a particular line and column in the document when you + open the document, append the line and column number to the file name in + the locator, separated by plus signs (+) or colons (:). + + For example, to open \e HelloWorld.qml to line + 41 and column 2, enter: + + \code + HelloWorld.qml:41:2 + \endcode + + \section1 Search the web + + Use the \uicontrol {Web Search (r)} locator filter to perform web searches. + + URLs and search commands for Bing, Google, Yahoo! Search, cplusplus.com, and + Wikipedia are configured by default. Add search commands for other web search + engines in the locator preferences. + + \section1 Create files and directories from the locator + + To create a new file and open it in the editor: + + \list 1 + \li Type \c f followed by \key Space, followed by path and file name + \li Press \key Enter or select \uicontrol {Create and Open File}. + \endlist + + To create a directory, select \uicontrol {Create Directory}. + + \sa {Search}{How To: Search}, {Manage sessions}, {Perform calculations}, + {Locator} + +*/ + +/*! + \page creator-preferences-locator.html + \previouspage creator-reference.html + + \ingroup creator-reference-preferences + + \title Locator + + \brief Add and change locator filters. + + To set locator preferences, go to \preferences > \uicontrol Environment > + \uicontrol Locator. + + \image qtcreator-locator-customize.webp {Locator preferences} + + \section1 Changing Locator Filters + + You can change the preset locator filters to match your use case. For + example, change the filter prefix and restrict the search to + items that match the filter. + + To configure a locator filter: + + \list 1 + + \li Go to \preferences > \uicontrol Environment > \uicontrol Locator. + + \li Select a filter, and then select \uicontrol Edit. + + \li Specify the prefix string. + + \image qtcreator-locator-filter-edit-ai.webp {Filter Configuration dialog} + + \li To implicitly include the filter even when not typing a prefix as a + part of the search string, select \uicontrol {Include by default}. + + \endlist + + \section1 Adding Web Search Engines + + By default, the \uicontrol {Web Search (r)} locator filter includes the URLs + and search commands for Bing, Google, Yahoo! Search, cplusplus.com, and + Wikipedia. + + To find out the format of the search command to use for your favorite + web search engine, perform a search in your browser and copy the resulting + URL to the locator filter configuration. Replace the search term with the + variable \c {%1}. + + To add URLs and search commands to the list: + + \list 1 + + \li Go to \preferences > \uicontrol Environment > \uicontrol Locator. + + \li Select \uicontrol {Web Search} > \uicontrol Edit. + + \li Select \uicontrol Add to add a URL filter to the list. + + \image qtcreator-add-online-doc.webp {List of URLs in Filter Configuration dialog} + + \li Double-click the new entry to specify a URL and a search command. + For example, \c {http://www.google.com/search?q=%1}. + + \li Click \uicontrol OK. + + \endlist + + To add a new separate web search locator filter instead of updating the + default filter, select \uicontrol Add > \uicontrol {URL Template}. + + \section1 Creating Locator Filters + + To quickly access files not directly mentioned in your project, + create your own directory filters. That way you can locate files in a + directory structure you have defined. + + To create custom locator filters: + + \list 1 + + \li Go to \preferences > \uicontrol Environment > \uicontrol Locator. + + \li Select \uicontrol Add > \uicontrol {Files in Directories} to add + a directory filter. + + \image qtcreator-locator-generic-directory-filter.png {Filter Configuration dialog} + + \li In \uicontrol Name, enter a name for your filter. + + \li Select \uicontrol Add to add directories to \uicontrol Directories. + The locator searches directories recursively. + + \li In \uicontrol {File pattern}, specify file patterns to + restrict the search to files that match the pattern. + Separate the patterns with commas. For example, to search for all + \c {.qml} and \c {.ui.qml} files, enter \c{*.qml,*.ui.qml} + + \li In \uicontrol {Exclusion pattern}, specify file + patterns to omit files from the search. + + \li In \uicontrol Prefix, specify the prefix string. + + To implicitly include the filter even when not typing a prefix + as a part of the search string, select + \uicontrol {Include by default}. + + \li Select \uicontrol OK. + + \endlist + + \section1 Configuring Locator Cache + + The locator searches the files matching your file pattern in the directories + you have selected and caches that information. \QC updates the cache for all + preset filters as you write code. By default, \QC updates your custom + filters once an hour. + + To update the cached information manually, select + \inlineimage icons/magnifier.png > \uicontrol Refresh in the locator. + + To set a new cache update time: + + \list 1 + + \li Go to \preferences > \uicontrol Environment > \uicontrol Locator. + + \li In \uicontrol {Refresh interval}, set a new time in minutes. + + \endlist + + \sa {Navigate with locator}, {Search}{How To: Search}, {Perform calculations}, + {Locator} +*/ diff --git a/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc b/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc index 1ea89d69d8f..fd4b4a8b709 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-text-editing-macros.qdoc @@ -28,7 +28,7 @@ \uicontrol Keyboard. For more information, see \l{Assign keyboard shortcuts}. You can also use the \c rm locator filter to run a macro. For more - information, see \l{Searching with the Locator}. + information, see \l{Navigate with locator}. To view and remove saved macros, select \preferences > \uicontrol {Text Editor} > \uicontrol Macros. diff --git a/doc/qtcreator/src/editors/creator-search.qdoc b/doc/qtcreator/src/editors/creator-search.qdoc index e47957f48e1..c3bd9e1fa22 100644 --- a/doc/qtcreator/src/editors/creator-search.qdoc +++ b/doc/qtcreator/src/editors/creator-search.qdoc @@ -131,7 +131,7 @@ \page creator-how-to-advanced-search.html \if defined(qtdesignstudio) \previouspage creator-editor-finding.html - \nextpage creator-editor-locator.html + \nextpage creator-how-to-rename-symbols.html \else \previouspage creator-how-tos.html \endif diff --git a/doc/qtcreator/src/howto/creator-how-to-find-preferences.qdoc b/doc/qtcreator/src/howto/creator-how-to-find-preferences.qdoc index b59e9709212..b0be3871e32 100644 --- a/doc/qtcreator/src/howto/creator-how-to-find-preferences.qdoc +++ b/doc/qtcreator/src/howto/creator-how-to-find-preferences.qdoc @@ -40,12 +40,16 @@ \image qtcreator-preferences.webp {Filtering preferences} + \if defined(qtcreator) \section1 Go to tabs in Preferences To go to a tab in the \uicontrol Preferences dialog from anywhere in \QC, - use the \c t \l{Searching with the Locator}{locator} filter. For example, + use the \c t \l{Navigate with locator}{locator} filter. For example, to open the \uicontrol Interface tab, enter \c {t preferences interface} in the locator. \image qtcreator-locator-filter-t.webp {Using the locator to open a tab in Preferences} + + \sa {Navigate with locator} + \endif */ diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc index a715f171cb5..07459d9a9bc 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc @@ -230,13 +230,99 @@ \title Perform calculations - Open the \uicontrol Locator with \key {Ctrl+K} and type =, followed by a space. - You can now do basic calculations, with options to copy the results to the clipboard - by navigating through the entries and pressing \key {Enter}. + To do basic calculations in the locator: - \image qtcreator-locator.webp "List of locator filters" + \list 1 + \li Press \key {Ctrl+K} (\key {Cmd+K} on \macos) to activate the locator. + \li Enter \c =, followed by a space. + \image qtcreator-locator.webp {List of locator filters} + \li Perform calculations. + \endlist - \sa {Executing JavaScript} + Navigate through the entries and press \key {Enter} to copy the results to + the clipboard + + \section1 Built-in functions + + Beside simple mathematical operations, like ((1 + 2) * 3), the following + built-in functions exist: + + \table + \header + \li Function + \li Purpose + \row + \li abs(x) + \li Returns the absolute value of x + \row + \li acos(x) + \li Returns the arccosine of x, in radians + \row + \li asin(x) + \li Returns the arcsine of x, in radians + \row + \li atan(x) + \li Returns the arctangent of x, in radians + \row + \li atan2(x, y) + \li Returns the arctangent of the quotient of its arguments + \row + \li bin(x) + \li Returns the binary representation of x + \row + \li ceil(x) + \li Returns the value of x rounded up to the next integer + \row + \li cos(x) + \li Returns the cosine of x (x is in radians) + \row + \li exp(x) + \li Returns the value of E to the power of x + \row + \li e() + \li Returns Euler's number E (2.71828...) + \row + \li floor(x) + \li Returns the value of x rounded down to the next integer + \row + \li hex(x) + \li Returns the hexadecimal representation of x + \row + \li log(x) + \li Returns the natural logarithm (base E) of x + \row + \li max([value1[, value2[, ...]]]) + \li Returns the highest value of the given numbers + \row + \li min([value1[, value2[, ...]]]) + \li Returns the lowest value of the given numbers + \row + \li oct(x) + \li Returns the octal representation of x + \row + \li pi() + \li Returns PI (3.14159...) + \row + \li pow(x, y) + \li Returns the value of x to the power of y + \row + \li random() + \li Returns a random number between 0 and 1 + \row + \li round(x) + \li Returns the value of x rounded to the next integer + \row + \li sin(x) + \li Returns the sine of x (x is in radians) + \row + \li sqrt(x) + \li Returns the square root of x + \row + \li tan(x) + \li Returns the tangent of x (x is in radians) + \endtable + + \sa {Navigate with locator}, {Locator} */ /*! @@ -281,7 +367,7 @@ \li Go to \uicontrol {Follow Symbol Under Cursor} in the context menu. \endlist - \sa {Edit Code}{How To: Edit Code}, {Edit Mode}, {Searching with the Locator} + \sa {Edit Code}{How To: Edit Code}, {Edit Mode}, {Navigate with locator} */ /*! diff --git a/doc/qtcreator/src/howto/creator-sessions.qdoc b/doc/qtcreator/src/howto/creator-sessions.qdoc index 348bea2139a..e047169118b 100644 --- a/doc/qtcreator/src/howto/creator-sessions.qdoc +++ b/doc/qtcreator/src/howto/creator-sessions.qdoc @@ -82,7 +82,12 @@ \section1 Open sessions - To switch between sessions, select \uicontrol {Open}. + To switch between sessions: + + \list + \li Go to \uicontrol File > \uicontrol Sessions, and select a session. + \li Select \uicontrol {Open} in \uicontrol {Session Manager}. + \endlist \if defined(qtcreator) @@ -93,17 +98,30 @@ \image qtcreator-welcome-session.png - You can also use the \c t locator filter to open a session. For more - information, see \l{Searching with the Locator}. - To view more information about a session, select the down arrow icon that appears when you move the mouse cursor over the session name. Select actions to clone, rename, and delete sessions. When you start \QC from the command line, you can give the name of - a session as an argument and \QC will start with this session. + a session as an argument to start \QC with this session. - \sa {Command-Line Options}, {Searching with the Locator} + \section1 Open sessions from the locator + + Use the \c t filter that triggers menu commands to open sessions. + + To locate a session: + + \list 1 + \li Press \key {Ctrl+K} (\key {Cmd+K} on \macos) to activate the locator. + \li Enter: + \list + \li \c {t} \e {} + \li \c {t sess} \e {} + \endlist + where \e is the name of the session to open. + \li Double-click the session name to open it. + \endlist + + \sa {Navigate with locator}, {Command-Line Options} \endif - */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc index 084bc90c1ab..83808a6a1e0 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-files-creating.qdoc @@ -18,9 +18,8 @@ \image qtcreator-new-file.webp {New File wizard} \note You can also use the \c f locator filter to create a new - file and open it in the editor. For more information, see - \l {Creating Files and Directories from Locator}. However, you must - manually add the created file to a project. + file and open it in the editor. However, you must manually add + the created file to a project. \section1 Select file type @@ -74,8 +73,9 @@ \li Empty Nim source and script files. \endtable - \sa {Add Files}{How To: Add Files}, {Add tests to existing test projects}, - {Create UML-style models}, {Use project wizards} + \sa {Navigate with locator}, {Add Files}{How To: Add Files}, + {Add tests to existing test projects}, {Create UML-style models}, + {Use project wizards} */ /*! diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc index 13b7d6eb9a9..512a3886ab4 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc @@ -81,7 +81,7 @@ Select \uicontrol {Build for Run Configuration} to build the executable that corresponds to the selected run configuration. - You can also use the \c cm filter in the \l {Searching with the Locator} + You can also use the \c cm filter in the \l {Navigate with locator} {locator}. To remove all build artifacts, select one of \uicontrol {Clean} menu commands. diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc index 914516417a1..1efac95137c 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc @@ -198,7 +198,7 @@ directory in the \l {File System} view. Declaring files as a part of the project also makes them visible to the - \l{Searching with the Locator}{locator} and + \l{Navigate with locator}{locator} and \l{Search in projects or file systems}{project-wide search}. \section1 CMake Projects diff --git a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc index 3b8a7d59cf7..06226006d58 100644 --- a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc @@ -18,7 +18,7 @@ \brief Shows all the files in the current directory. \if defined(qtcreator) - \note Usually, \l{Searching with the Locator}{searching with the locator} + \note Usually, \l{Navigate with locator}{searching with the locator} is the fastest way to find a particular project, file, class, or function, or almost anything else in your project. Use the \e {file system (f)} filter to open files from anywhere in the file system. diff --git a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc index 99e3b469cc1..b6b74f0993b 100644 --- a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc @@ -25,7 +25,7 @@ \image qtcreator-projects-view-edit.png {Projects view in the sidebar} - \note Usually, \l{Searching with the Locator}{searching with the locator} + \note Usually, \l{Navigate with locator}{searching with the locator} is the fastest way to find a particular project, file, class, or function, or almost anything else in your project. \else diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index d70c94d90ee..066e93fbbf6 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -55,7 +55,7 @@ \li \inlineimage numbers/06.png \li Locator \li Find a particular project, file, class, or function. - \li \l{Searching with the Locator} + \li \l{Navigate with locator} \row \li \inlineimage numbers/07.png \li Output diff --git a/doc/qtdesignstudio/src/developers/studio-jump-to-the-code.qdoc b/doc/qtdesignstudio/src/developers/studio-jump-to-the-code.qdoc index f5e9425e009..d7178236e3a 100644 --- a/doc/qtdesignstudio/src/developers/studio-jump-to-the-code.qdoc +++ b/doc/qtdesignstudio/src/developers/studio-jump-to-the-code.qdoc @@ -2,7 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! - \previouspage creator-editor-locator.html + \previouspage creator-how-to-rename-symbols.html \page creator-jump-to-the-code.html \nextpage creator-editor-quick-fixes.html diff --git a/doc/qtdesignstudio/src/overviews/studio-finding.qdoc b/doc/qtdesignstudio/src/overviews/studio-finding.qdoc index 188c7a6cc64..ead5bc33af1 100644 --- a/doc/qtdesignstudio/src/overviews/studio-finding.qdoc +++ b/doc/qtdesignstudio/src/overviews/studio-finding.qdoc @@ -24,12 +24,6 @@ Search for QML types and rename them in all files in a project. - \li \l{Searching with the Locator} - - Use the locator to browse - through projects, files, classes, functions, documentation and - file systems. - \li \l{Jump to the Code} Jump to the code for a specific component directly from diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index 5c34bad6e86..d0b451e6299 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -214,7 +214,6 @@ \li \l{Search in current file} \li \l{Search in projects or file systems} \li \l{Rename symbols} - \li \l{Searching with the Locator} \li \l{Jump to the Code} \endlist \li \l{Apply quick fixes} From 124c62a5a0bca8d64c26a64478b9875664d9fb9c Mon Sep 17 00:00:00 2001 From: Yasser Grimes Date: Wed, 28 Feb 2024 11:55:31 +0200 Subject: [PATCH 35/87] McuSupport: Fix kit creation dialog crash Use copies of messages to avoid their reference going out of scope Fix increment current message index for when there is only one message Fixes: QTCREATORBUG-30360 Change-Id: I26fac50ed171aaed7d178cc8f97ace401bf49e7c Reviewed-by: Eike Ziller --- .../mcusupport/dialogs/mcukitcreationdialog.cpp | 10 ++++++++-- src/plugins/mcusupport/mcusupportoptions.cpp | 4 ++-- src/plugins/mcusupport/mcusupportoptions.h | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/plugins/mcusupport/dialogs/mcukitcreationdialog.cpp b/src/plugins/mcusupport/dialogs/mcukitcreationdialog.cpp index 897fcd0aa14..4100052cbd5 100644 --- a/src/plugins/mcusupport/dialogs/mcukitcreationdialog.cpp +++ b/src/plugins/mcusupport/dialogs/mcukitcreationdialog.cpp @@ -78,12 +78,18 @@ McuKitCreationDialog::McuKitCreationDialog(const MessagesList &messages, QPushButton *fixButton = buttonBox->addButton(Tr::tr("Fix"), QDialogButtonBox::ActionRole); QPushButton *helpButton = buttonBox->addButton(Tr::tr("Help"), QDialogButtonBox::HelpRole); - if (messages.size() == 1) { + if (messages.empty()) { + fixButton->setVisible(false); + m_informationLabel->setText( + QCoreApplication::translate("QtC::Autotest", "No errors detected")); + } + + if (messages.size() < 2) { m_nextButton->setVisible(false); m_previousButton->setVisible(false); } //display first message - if (messages.size() > 1) + if (!messages.empty()) updateMessage(1); if (qtMCUPackage->isValidStatus()) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 187591298cf..a8b25013546 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -255,7 +255,7 @@ McuKitManager::UpgradeOption McuSupportOptions::askForKitUpgrades() return McuKitManager::UpgradeOption::Ignore; } -void McuSupportOptions::displayKitCreationMessages(const MessagesList &messages, +void McuSupportOptions::displayKitCreationMessages(const MessagesList messages, const SettingsHandler::Ptr &settingsHandler, McuPackagePtr qtMCUsPackage) { @@ -269,7 +269,7 @@ void McuSupportOptions::displayKitCreationMessages(const MessagesList &messages, Tr::tr("Errors while creating Qt for MCUs kits"), Utils::InfoBarEntry::GlobalSuppression::Enabled); - info.addCustomButton(Tr::tr("Details"), [=] { + info.addCustomButton(Tr::tr("Details"), [messages, &settingsHandler, qtMCUsPackage] { auto popup = new McuKitCreationDialog(messages, settingsHandler, qtMCUsPackage); popup->exec(); delete popup; diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index d8a5c3fdbf4..1c0a902ba14 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -59,7 +59,7 @@ public: [[nodiscard]] Utils::FilePath qulDirFromSettings() const; [[nodiscard]] Utils::FilePath qulDocsDir() const; static McuKitManager::UpgradeOption askForKitUpgrades(); - static void displayKitCreationMessages(const MessagesList &messages, + static void displayKitCreationMessages(const MessagesList messages, const SettingsHandler::Ptr &settingsHandler, McuPackagePtr qtMCUsPackage); From 9bb85fabf7eb6557961dd7d72fd444bfbaeac87f Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 5 Mar 2024 13:08:02 +0100 Subject: [PATCH 36/87] Welcome: Don't hide Links Fixes: QTCREATORBUG-30466 Change-Id: I399826d67e1bb7eba7ef96f3fd0717d08133a3de Reviewed-by: Alessandro Portale --- src/plugins/welcome/welcomeplugin.cpp | 29 ++++++++++++++------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index 2513ebaa10f..4b3a5074f95 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -292,25 +293,25 @@ WelcomeMode::WelcomeMode() m_modeWidget = new ResizeSignallingWidget; setBackgroundColor(m_modeWidget, Theme::Token_Background_Default); - connect(m_modeWidget, &ResizeSignallingWidget::resized, this, + connect(m_modeWidget, + &ResizeSignallingWidget::resized, + this, [this](const QSize &size, const QSize &) { - const QSize essentialsS = m_sideArea->m_essentials->size(); - const QSize linksS = m_sideArea->m_links->size(); - const QSize sideAreaS = m_sideArea->size(); - const QSize topAreaS = m_topArea->size(); - const QSize mainWindowS = ICore::mainWindow()->size(); + const QSize sideAreaS = m_sideArea->size(); + const QSize topAreaS = m_topArea->size(); + const QSize mainWindowS = ICore::mainWindow()->size(); - const bool showSideArea = sideAreaS.width() < size.width() / 4; - const bool showTopArea = topAreaS.height() < mainWindowS.height() / 7.75; - const bool showLinks = - linksS.height() + essentialsS.height() < sideAreaS.height() && showTopArea; + const bool showSideArea = sideAreaS.width() < size.width() / 4; + const bool showTopArea = topAreaS.height() < mainWindowS.height() / 8.85; + const bool showLinks = true; - m_sideArea->m_links->setVisible(showLinks); - m_sideArea->setVisible(showSideArea); - m_topArea->setVisible(showTopArea); - }); + m_sideArea->m_links->setVisible(showLinks); + m_sideArea->setVisible(showSideArea); + m_topArea->setVisible(showTopArea); + }); m_sideArea = new SideArea(m_modeWidget); + m_sideArea->verticalScrollBar()->setEnabled(false); m_buttonGroup = new QButtonGroup(m_modeWidget); m_buttonGroup->setExclusive(true); From 681d2da3b391d5e213b782a7059c832e45daed33 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 5 Mar 2024 09:51:37 +0100 Subject: [PATCH 37/87] Doc: Update info about environment settings They are now edited in an editor next to the variable list. Task-number: QTCREATORBUG-30209 Change-Id: I8eb46272a2b4b3b92ebf93247f4ef33ee4114b6f Reviewed-by: Christian Kandeler --- .../images/qtcreator-build-environment.png | Bin 34736 -> 0 bytes .../images/qtcreator-build-environment.webp | Bin 0 -> 15496 bytes .../qtcreator-edit-cmake-configuration.webp | Bin 0 -> 4844 bytes ...reator-environment-settings-hierarchy.webp | Bin 3662 -> 70100 bytes .../qtcreator-projects-environment.webp | Bin 4728 -> 6582 bytes .../images/qtcreator-run-environment.png | Bin 28561 -> 0 bytes .../images/qtcreator-run-environment.webp | Bin 0 -> 15872 bytes .../creator-projects-cmake-building.qdoc | 6 +- .../src/howto/creator-external-tools.qdoc | 2 +- .../creator-how-to-silver-searcher.qdoc | 2 +- .../creator-only/creator-projects-kits.qdoc | 2 +- ...creator-projects-settings-environment.qdoc | 63 +++++++++--------- 12 files changed, 38 insertions(+), 37 deletions(-) delete mode 100644 doc/qtcreator/images/qtcreator-build-environment.png create mode 100644 doc/qtcreator/images/qtcreator-build-environment.webp create mode 100644 doc/qtcreator/images/qtcreator-edit-cmake-configuration.webp delete mode 100644 doc/qtcreator/images/qtcreator-run-environment.png create mode 100644 doc/qtcreator/images/qtcreator-run-environment.webp diff --git a/doc/qtcreator/images/qtcreator-build-environment.png b/doc/qtcreator/images/qtcreator-build-environment.png deleted file mode 100644 index 9c1dc18281464c78a874ef31ff15c3b32baf8946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34736 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%0AJyBYx@L%&x`Pz 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 _RdzuDzacnV(m2 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-environment-settings-hierarchy.webp b/doc/qtcreator/images/qtcreator-environment-settings-hierarchy.webp index 574b2a7547009417503ca5eb57719f2810c1b850..98015123323ed89b390b23e49e162fb62b732fec 100644 GIT binary patch literal 70100 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 literal 3662 zcmWIYbaQj#V_*n(bqWXzu<)_uV_?v?Zko%m|ImVoOFUTlKD?jWR&68Uaa(PA;eWeu z=FHnET<`9`vHqWR*(~9k$lb=Nd)0*|noRN66LJ2wh(&cvhYRO4CBaU|E(ezYm!Jtw z0**}{Ci=cR&&>a@)nJc;M?uCB22Q1p%FX`@B(~(LXg=ew{%_4BXvo-`_svx!XHWX! zE%k>IHr%e)6n^fTdHKn{-JA$`3vQuZ2stQG0 z87_DHySylOw^xep?uTkpcij8fwfUopUVAUfz3mmvtMHC(P!4zK<5f4fb^ z&W*+A*1CO>7g9NyJ3G=cefA;29ju&jKfhkSxHI;DrL1~H2H!o&6IJpi-Hw+Qt1LUe zo~K~%t12%=>sLn-9=xtwBQ%$P?m`7+|DrxQ387i>L4PVu|KxnaS9ewRedP?7uW+1*i}rYGrM^%%MV4Q^@v8lt zx!-=jw!dBk|a;Ggfy%$tj)GgBTM9}URzc%MFo!!+1Jei}b^K6Q(ht@Q`?kiVkTe_z8T75bYpi(XKT`z@6l;_Vz zjRfBdPtG`oW>g3TRPt{0cQ>$PxA4}Q!u9{5e@}kXg}x`*&WonAF4&#WAj-%$Z-JHP zH}+Qw_Pvb$t6JDpCU`ul-6G*^{PWG0)|mf0lRxj=yzbEXxnE=Irmj=o+Hw9@Y4?&i z^UZy{RRN2(d~j4UU0I!SjdQ-zx38Q%6C>63IK6$n$Y8=wJ+3Tmd-o@$tey9EUAb7X zW0Go<_Wzb6(cGI{iZT~lGOeGRIp6B~?Qb)S=hh!u^>)MOKR?gUR{Q63%th_7y}^yO zX&!g$lEUnz>SSg<$^Xy%T6uHU_2+3{|F8eLF!Ji_8@@xC@ke2lyVlyAyTC&pQpiwd3k6G^uPprDs^CCZ;z4`v{dGYz(E~Sk6 zeWxo5PaHS8)H!ec!+;kP{d7+%zM8sQ;s2H8)0$#eb~^`X&pvT7)oEE*5Kmdc(TPC< zDvb3@d{q1X2xgk76gnTQxN5~3==~`|J#*{!PWu_13ZZPG+)XOQw~pM*g{CJA%i_=mS9xpt$gk@xX=8*hdUN*u1U~tbF%e9Lp^18W3?GW`)-r5)8 zvR2F|H@P@B)Tra+brYk=UAGFlSsc4A^*pdV&CeHmD|YKDj;(UC6BA`*l8BI6nBb)}DXom!32&)bl-e z&h`BM&&7Y|U+I&6w4`j0`T5M_U+ev>?^Qh8@^~NfPpe*cwxa8Wj5S+ND?4kRsJ#9D ze`P=h|169D3v@J=t4h~JtQTfqek0J6L$!~q!Z>&1=F4J5f1m$4|5bj9!t-+qUW?eL zOJ3+ou{mv&6h{yTN-{h z^gGN@xXym-Q^&uPo_7Vry`IM?rk^% zj`w{ZO}DN)^!optvY7wRw>+M&|IgBTy3POC#@GM1q%5h7GFtb4|7R)vbNfF_UH@Ns zvf}Z~={>LQuZNt_-_o|=*xHaQlMA!zi<|fFQN4Jz&iMG`hDiQ1pZe-*qu&Z2czr!+ zUr6y{pMUeKW~H35`FSFI;^$*e)xRtDW*0ta)fBw$yin)SJ|1`@ovA9y_+WE=tm*y4xdVNleJ97K+i<>Xk)q^6%TdwxE z?&O8m`}SR4wT)x;CFdg*oeMwCoUJc1zw5)CiH4^YE>u3OxcI7YUgDBBe`EsWt}*hT z+_;?Ol;jHyHo4_bXKPmNk$U{unDx~1^xrQ(M6Yekc^L6QvvJe0#T*K&K3#V6Q+@dT zdyVRbf%wv6QZ zz9&h&nX|tZFX=M$d$_sM{`k$z{rmrYesw7P(k`y`|36PE{5yX-&-!V*<)T*1Ua|4p z$Hw?+cIHc1zMbwBKel#yRbXkY--8adbGLh(*B-s^v40xJt!v#Aj=AOO_fP+PJ9BDz z?R@Et8*3+aSn8C$3Eo%p+t(~j{M!u)@0cw+zb}`1`nTazz4rbmLEWYMa(7o(NlZ8@ zH9u^R+{b!*Ly**I~&>!%~$yv_O7_wITw{^~}==~eSWePW;7*=uj}_S4%X zcb|o{|2TH++Q-BjckH7%?`%50$-L&<a|@4e-`AV=)&1Cq_o26$rtF_u{515)v2(6Q z&+fE1A6fJ7oQUVOf2z-psMfz;wfR@k#*a%QEjebIPv}k1Ey`ZHOHt$J?H4l)o9)fw z#7$49Z8Ti7(U(tVPFag`z4mj7a;L{Og2w$EdCJ~AcCN!J%-0N85QKZUC?Q62)7lm zoRe*w*4%oP->y~Ibl;bgy|R1E4%?qra0uf+vh_Wi%o>V>hZ;6jDM(B`eD+<-*0T}6behiuXtYaz$USx`UGj-#hm+-< z3z^1T>#wYk^GMq~pXq*@&foZ@nTrDW%u81my(|3S9BXvbRH zv;%eD{AEr(-1cn-qqW79!?|yN%c?dM-+jWkLAKbFA@6t$AHyBP=}ZdcXHpq1$QE-l zlpVkGk9kjW-fzZxhTH!uJe~2{$Y0Daa?w0qhN|mlHD2gNyjEOvEC2l-PKWoqX3khB z{IM{q*3)aIVx05)U6S2q`){62xqd9J^03d9b<2&N_q5$BHP+LKGx=?$SD$o-Nm7Mz z@9VTR?G`cot(#W-Ugl&dyVuS5NcM~BYt8ywnkPKp*C)s_Ig7YtAiZdU5 z{Z~b=KI&N4_1&yDrt7GDnJv<-DX9}zUzfJ0@vUyxjz6-?r+5bH1+o0dcqz5M{rKfC zOK!*nthc(Fo!(xsz+gdyyf9*M-TyijK zLNb5s`d!oiwmmyMoxdq*f7R6|O^>e4__``GZbs{l_&EU+P8io+uP$M+u)IDsVum!E z(DeB+S>+|7%#N#*_hyB0uIVnRo)?_8uJgb4D88ss1^-?-y@duJYE`!76{Y)wgzwm;k*H>kU z-e-t4shrT$Fz2S0Gn`M<=C<3hE& z=9#0r+WI|T$}KSGbH2O#q+ZEfW{r2r-pX|`w-%?bH@U3qxw*G?)j0<%JyRC+ShmXb@{-pLL7_KqCcayy-fR#p?DpEgse)<4VM~z1 zuU0T^x?;k3XNBf-kb@mpG43l?*~Fex<(0Eh^lFZa*O7#?Zd2HswVx%mhq41*I9?Tmi8{JWc);>wbMSh(53BnP{1r>W{xJS#=jHiv)qRHMf%V4{zdFR% zwy5*|`gfFP0oPkW#(lpyJ~RFJ+s!GqgE2>MiMQ;5RZ0!__ea<+2$z4jQla_&{s_B< zaQQ^L%K|Urb>wfXKg{0v@2ES&yU;65_xI0OcKz&yqYmOf{&v5t%6ZH7;Jdz={EOe> zyZPVz?f%RD<=@fe4NrcF9eGrJX5###-)AV>cfU7uuMNAO-1p6o000<5EusJb diff --git a/doc/qtcreator/images/qtcreator-projects-environment.webp b/doc/qtcreator/images/qtcreator-projects-environment.webp index 36011d22263463bf752ae30442bff0589d7ffe12..eeaed5eaa00e560fdc16ca2b501bdcf89b96d02c 100644 GIT binary patch literal 6582 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 literal 4728 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 $C!W_v-$VlT+qIRz9vN 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⪻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 diff --git a/doc/qtcreator/images/qtcreator-run-environment.webp b/doc/qtcreator/images/qtcreator-run-environment.webp new file mode 100644 index 0000000000000000000000000000000000000000..3a0313f994ddb1c44ab80b63696bb58d45b19fd8 GIT binary patch literal 15872 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 YFRmw^2wb|m;)h{#=AHVyAC2q`0CHtq2mk;8 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc index 6f5508312f5..0bf54dde2fb 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc @@ -94,9 +94,9 @@ You can select several variables and apply an action to them. To clear the selection, click anywhere in the view. - To change the environment variable values for the CMake build environment, - select \uicontrol {Batch Edit}. For more information, see - \l{Batch edit environment settings}. + To batch edit variable values, select \uicontrol {Batch Edit}. + + \image qtcreator-edit-cmake-configuration.webp {Edit CMake Configuration dialog} To build using the current configuration, select \uicontrol {Run CMake}. While building, the button text changes to \uicontrol {Stop CMake}. Select diff --git a/doc/qtcreator/src/howto/creator-external-tools.qdoc b/doc/qtcreator/src/howto/creator-external-tools.qdoc index dda7eeb62ae..13927f3d677 100644 --- a/doc/qtcreator/src/howto/creator-external-tools.qdoc +++ b/doc/qtcreator/src/howto/creator-external-tools.qdoc @@ -117,7 +117,7 @@ \sa {Run QML files}, {Use external text editors}, {Use Qt Linguist} \if defined(qtcreator) - \sa {Batch edit environment settings}, {Specify the environment for projects}, + \sa {Edit environment settings}, {Specify the environment for projects}, {Use Qt Creator variables} \endif */ diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-to-silver-searcher.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-to-silver-searcher.qdoc index b632145832d..4f60c3b5692 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-to-silver-searcher.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-to-silver-searcher.qdoc @@ -49,5 +49,5 @@ \endlist \sa {Enable and disable plugins}, {Search}{How To: Search}, - {Batch edit environment settings} + {Edit environment settings} */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc index d856f420c5e..4d0e9038639 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc @@ -152,7 +152,7 @@ \li Select \uicontrol Change to modify environment variable values for build environments in the \uicontrol {Edit Environment Changes} dialog. For more information about how to add and remove variable - values, see \l{Batch edit environment settings}. + values, see \l{Edit environment settings}. \row \li \uicontrol {Force UTF-8 MSVC compiler output} \li Either switches the language of MSVC to English or keeps the diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc index 3f200320fc1..ce809fc536d 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-environment.qdoc @@ -16,7 +16,7 @@ By default, the environment in which \QC was started is used and modified to include the Qt version. Depending on the selected Qt version, \QC automatically sets the necessary environment variables. You can edit - existing environment variables or add, reset and unset new variables + existing environment variables or add, reset, and unset variables based on your project requirements. The final environment is specified separately for each kit. With @@ -35,7 +35,7 @@ To globally change the environment from the one in which \QC is started, select \preferences > \uicontrol Environment > \uicontrol System, and then - select \uicontrol Change in the \uicontrol Environment field. + select \uicontrol Change in \uicontrol Environment. \image qtcreator-preferences-environment-system.webp "Environment preferences System tab" @@ -47,42 +47,43 @@ \image qtcreator-projects-environment.webp {Environment tab in Project Settings} + You can edit existing environment variables or add, reset, unset, or + temporarily disable variables. + \section1 Specify the build environment - Specify the build environment to use for a kit in \uicontrol Projects > - \uicontrol {Build Settings} > \uicontrol {Build Environment}. + To specify the build environment to use for a kit, go to \uicontrol Projects + > \uicontrol {Build Settings} and select \uicontrol {Build Environment}. - \image qtcreator-build-environment.png {Build Environment section in Build Settings} + \image qtcreator-build-environment.webp {Build Environment section in Build Settings} + + To change the values of environment variables for the build environment, + select the variable and then select \uicontrol Edit. Enter the new value + in the editor on the righ side. + + To add new variables, select \uicontrol {Add}. \section2 Clear the build environment - To build with a clean system environment, select the \uicontrol {Clear - system environment} check box. \QC discards the current environment, and - populates a clean system environment with the environment variables that + To build with a clean system environment, select + \uicontrol {Clear system environment}. \QC discards the current environment, + and populates a clean system environment with the environment variables that the compilers and tools need. Therefore, the environment is never totally empty, even after you clear it. \section1 Specify the run environment \QC automatically selects the environment used for running the application - based on the \l{glossary-device}{device} type. You can edit the environment - or select another environment in \uicontrol Projects > - \uicontrol {Run Settings} > \uicontrol {Environment}. + based on the \l{glossary-device}{device} type. To edit the environment + or select another environment, go to \uicontrol Projects > + \uicontrol {Run Settings} and select \uicontrol {Environment}. - You can edit existing environment variables or add, reset and unset new - variables. - - \image qtcreator-run-environment.png {Environment section in Run Settings} + \image qtcreator-run-environment.webp {Environment section in Run Settings} When running on the desktop, the \uicontrol {Build Environment} is used by default, but you can also use the \uicontrol {System Environment} without the additions made to the build environment. - To modify the environment variable values for the run environment, - double-click environment variables or their values and change them inline, - or select \uicontrol {Batch Edit} to change several variable values at a - time. - \section2 Clean the run environment To run in a clean system environment, select \uicontrol {Clean Environment}. @@ -107,32 +108,32 @@ \section2 Use device environment - When running on a mobile device connected to the development host, \QC + When you run applications on a mobile device connected to the computer, \QC fetches information about the \uicontrol {Device Environment} from the device. Usually, it does not make sense to edit the device environment. - \sa {Batch edit environment settings}, {Configure projects for building}, + \sa {Edit environment settings}, {Configure projects for building}, {Configure projects for running}, {Use Qt Creator variables} */ /*! - \page creator-how-to-batch-edit-environment-settings.html + \page creator-how-to-edit-environment-settings.html \previouspage creator-how-tos.html \ingroup creator-how-to-projects - \title Batch edit environment settings + \title Edit environment settings You can change the environment variable values for build or run environments - either for a particular project or globally for all projects in the - \uicontrol {Edit Environment} dialog: + either for a particular project or globally: \list - \li To change values globally, select \uicontrol Change in the - \l {Globally change the environment}{global environment preferences}. - \li To change values for a project, select \uicontrol {Batch Edit} in the - \l {Change the environment for a project}{project}, - \l {Specify the build environment}{build}, or + \li To change values globally, go to \preferences > + \uicontrol Environment > \uicontrol System, and select + \uicontrol Change in \uicontrol {Environment}. + \li To change values for a project, select \uicontrol Edit or + \uicontrol {Add} in the \l {Change the environment for a project} + {project}, \l {Specify the build environment}{build}, or \l {Specify the run environment}{run} environment settings. \endlist From 21e48c1a596867064a76a840eac783d46c07eb14 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 5 Mar 2024 16:35:49 +0100 Subject: [PATCH 38/87] Android: Enable writing to the jdb process Amends 97461f6f189e7bfbc0aff7c567f21230b7a22226 Fixes: QTCREATORBUG-29928 Fixes: QTCREATORBUG-30405 Change-Id: I3d4dad5bbc72a17f1246510ba10370811fda293a Reviewed-by: Alessandro Portale --- src/plugins/android/androidrunnerworker.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index d18f645165f..f152b7c5380 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -754,6 +754,7 @@ void AndroidRunnerWorker::handleJdbWaiting() m_jdbProcess->setProcessChannelMode(QProcess::MergedChannels); m_jdbProcess->setCommand({jdbPath, jdbArgs}); m_jdbProcess->setReaperTimeout(s_jdbTimeout); + m_jdbProcess->setProcessMode(ProcessMode::Writer); m_jdbProcess->start(); if (!m_jdbProcess->waitForStarted()) { emit remoteProcessFinished(Tr::tr("Failed to start JDB.")); From 97db1645ad36196a9a920efe86dcb14930936fa8 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 5 Mar 2024 20:54:12 +0100 Subject: [PATCH 39/87] Android: Log jdb communication Change-Id: If4833de2b65e57dd55c58c82bf707e57d4561031 Reviewed-by: Alessandro Portale --- src/plugins/android/androidrunnerworker.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index f152b7c5380..64979ef948c 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -771,6 +771,7 @@ void AndroidRunnerWorker::handleJdbSettled() for (int i = 0; i < 120 && m_jdbProcess->state() == QProcess::Running; ++i) { m_jdbProcess->waitForReadyRead(500ms); const QByteArray lines = m_jdbProcess->readAllRawStandardOutput(); + qCDebug(androidRunWorkerLog) << "JDB output:" << lines; const auto linesList = lines.split('\n'); for (const auto &line : linesList) { auto msg = line.trimmed(); @@ -784,8 +785,10 @@ void AndroidRunnerWorker::handleJdbSettled() const QStringList commands{"threads", "cont", "exit"}; for (const QString &command : commands) { - if (waitForCommand()) + if (waitForCommand()) { + qCDebug(androidRunWorkerLog) << "JDB input:" << command; m_jdbProcess->write(QString("%1\n").arg(command)); + } } if (!m_jdbProcess->waitForFinished(s_jdbTimeout)) { From db307978bfd4a037a91341e066d63dcde3de71d6 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 5 Mar 2024 21:14:52 +0100 Subject: [PATCH 40/87] Android: Send suspend/resume instead of threads in handleJdbSettled "threads" causes an exception in my jdb on my machine. "suspend" and "resume" do not, and they also cause enough delay for JDB to settle. Change-Id: I5297d720c5fdbe5ee2eaa421624491af50bc40bf Reviewed-by: Cristian Adam --- 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 64979ef948c..8f114f28dbc 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{"threads", "cont", "exit"}; + const QStringList commands{"suspend", "resume", "cont", "exit"}; for (const QString &command : commands) { if (waitForCommand()) { From 6b6aa896500c76aab6a9cbd1a20bb513fa6bfa46 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 4 Mar 2024 12:12:28 +0100 Subject: [PATCH 41/87] German translation: lupdate for 13.0 Check out with submodules (`git submodule update --init --recursive`). Configure Qt Creator: cmake "-DCMAKE_PREFIX_PATH=;" -DCMAKE_BUILD_TYPE=Debug -G Ninja Generate ts file: cmake --build . --target ts_de_cleaned Change-Id: I1c38da74f87352eeb6bc65b979d1e18d35668da8 Reviewed-by: Christian Stenger Reviewed-by: --- share/qtcreator/translations/qtcreator_de.ts | 2855 ++++++++++++++---- 1 file changed, 2284 insertions(+), 571 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index b15b6a1af2e..d8edc96b619 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -72,13 +72,6 @@ - - AccountImage - - Account - - - AddImageToResources @@ -447,7 +440,7 @@ Bind to AmbientSound.Infinite to loop the current sound forever. Animated image - + Animiertes Bild Speed @@ -466,6 +459,165 @@ Bind to AmbientSound.Infinite to loop the current sound forever. + + AnimatedSpriteSpecifics + + Animated Sprite + + + + Source + + + + Adds an image from the local file system. + + + + Frame size + + + + Sets the width and height of the frame. + + + + W + width + The width of the animated sprite frame + + + + Width. + + + + H + height + The height of the animated sprite frame + H + + + Height. + + + + Frame coordinates + + + + Sets the coordinates of the first frame of the animated sprite. + + + + X + Frame X + The width of the animated sprite frame + X + + + Frame X coordinate. + + + + Y + Frame Y + The height of the animated sprite frame + Y + + + Frame Y coordinate. + + + + Frame count + + + + Sets the number of frames in this animated sprite. + + + + Frame rate + + + + Sets the number of frames per second to show in the animation. + + + + Frame duration + + + + Sets the duration of each frame of the animation in milliseconds. + + + + Frame sync + + + + Sets frame advancements one frame each time a frame is rendered to the screen. + + + + Loops + + + + After playing the animation this many times, the animation will automatically stop. + + + + Interpolate + + + + If true, interpolation will occur between sprite frames to make the animation appear smoother. + + + + Finish behavior + + + + Sets the behavior when the animation finishes on its own. + + + + Reverse + + + + If true, the animation will be played in reverse. + + + + Running + Läuft + + + Whether the sprite is animating or not. + + + + Paused + + + + When paused, the current frame can be advanced manually. + + + + Current frame + + + + When paused, the current frame can be advanced manually by setting this property. + + + AnimationSection @@ -790,117 +942,6 @@ A positive value will increase reverb for higher frequencies and dampen lower fr - - Axivion - - Project: - - - - Lines of code: - - - - Analysis timestamp: - - - - unknown - unbekannt - - - Total: - - - - Show dashboard - - - - Axivion - - - - Show rule details - - - - Certificate Error - Zertifikatsfehler - - - 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. - Server-Zertifikat für %1 kann nicht authentifiziert werden. -Möchten Sie die SSL-Verifikation für diesen Server abschalten? -Hinweis: Dies macht Sie anfällig für Man-in-the-middle-Angriffe. - - - Dashboard projects: - - - - Fetch Projects - - - - Link Project - - - - Unlink Project - - - - This project is not linked to a dashboard project. - - - - This project is linked to "%1". - - - - Incomplete or misconfigured settings. - - - - curl: - curl: - - - Dashboard URL: - - - - Description: - Beschreibung: - - - Non-empty description - - - - Access token: - Zugriffstoken: - - - IDE Access Token - - - - Edit... - Bearbeiten... - - - Edit Dashboard Configuration - - - - General - Allgemein - - BackgroundColorMenuActions @@ -1197,6 +1238,29 @@ It should be a relative path. Größe der Bildquelle + + BrandBar + + Welcome to + Willkommen bei + + + Qt Design Studio + Qt Design Studio + + + Community Edition + + + + Enterprise Edition + + + + Professional Edition + + + BusyIndicatorSpecifics @@ -1396,7 +1460,7 @@ It should be a relative path. Emphasis - + Hervorherbung Sets the text to bold, italic, underlined, or strikethrough. @@ -1504,6 +1568,112 @@ It should be a relative path. Anwenden + + CollectionDetailsToolbar + + Add property left + + + + Add property right + + + + Delete selected property + + + + Insert row below + + + + Insert row above + + + + Delete selected row + + + + Save changes + + + + Export model + + + + Add Column + + + + Column name: + + + + The model already contains "%1"! + + + + Type: + Typ: + + + Add + Hinzufügen + + + Cancel + Abbrechen + + + + CollectionDetailsView + + Edit + + + + Delete + + + + Sort Ascending + + + + Sort Descending + + + + Add row above + + + + Add row below + + + + Delete this row + + + + Select a model to continue + + + + Delete Column + + + + Are you sure that you want to delete column "%1"? + + + + Cancel + Abbrechen + + CollectionItem @@ -1515,17 +1685,31 @@ It should be a relative path. Umbenennen - Deleting whole collection + Assign to the selected node + + + + Deleting the model + + + + Are you sure that you want to delete model "%1"? +The model will be deleted permanently. + + + + 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. + + + + Rename model Cancel Abbrechen - - Rename collection - - New name: Neuer Name: @@ -1534,19 +1718,15 @@ It should be a relative path. CollectionView - Collections + Data Models - Import Json + Import a model - Import CSV - - - - Add new collection + Add a new model @@ -1980,6 +2160,10 @@ It should be a relative path. Write the conditions for the components and the signals manually. + + Jump to the code. + + ConnectionsListView @@ -2313,53 +2497,6 @@ It should be a relative path. - - CsvImport - - Import A CSV File - - - - New CSV File - - - - Could not load the file - - - - An error occurred while trying to load the file. - - - - File name: - - - - Open - Öffnen - - - Collection name: - - - - File name can not be empty - - - - Collection name can not be empty - - - - Import - - - - Cancel - Abbrechen - - DelayButtonSpecifics @@ -2524,6 +2661,25 @@ defined in <b>Step size</b>. Titel + + DownloadButton + + Update available. + + + + Example was already downloaded. + + + + Network or example is not available or the link is broken. + + + + Download the example. + + + DownloadPane @@ -2539,6 +2695,21 @@ defined in <b>Step size</b>. % + + DownloadPanel + + Progress: + + + + % + % + + + Open + Öffnen + + DrawerSpecifics @@ -2597,37 +2768,76 @@ defined in <b>Step size</b>. - EffectCompositionNode + EditPropertyDialog - Remove + Edit Column - Enable/Disable Node + Name + Name + + + Type + Typ + + + Conversion from %1 to %2 may lead to data loss + + Apply + Anwenden + + + Cancel + Abbrechen + - EffectMaker + EffectComposer - Open Shader in Code Editor + Remove all effect nodes. + + + + Open Shader in Code Editor. Add an effect node to start - - - EffectMakerPreview - Zoom out + Effect Composer is disabled on MCU projects + + + EffectComposer::EffectComposerView + + Effect Composer [beta] + + + + + EffectComposer::EffectComposerWidget + + Effect Composer + Title of effect composer widget + + + + + EffectComposerPreview Zoom In Vergrößern + + Zoom out + + Zoom Fit @@ -2642,13 +2852,29 @@ defined in <b>Step size</b>. - EffectMakerTopBar + EffectComposerTopBar - Save in Library + Add new composition - How to use Effect Maker: + Save current composition + + + + Save current composition with a new name + + + + Assign current composition to selected item + + + + Untitled + Unbenannt + + + 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 @@ -2657,6 +2883,24 @@ defined in <b>Step size</b>. + + EffectCompositionNode + + Remove + + + + Enable/Disable Node + + + + + EffectNode + + Existing effect has conflicting properties, this effect cannot be added. + + + EffectNodesComboBox @@ -3060,7 +3304,7 @@ defined in <b>Step size</b>. Emphasis - + Hervorherbung Sets the text to bold, italic, underlined, or strikethrough. @@ -3674,6 +3918,57 @@ a highlight component. + + ImportDialog + + Import a model + + + + Model path + + + + Select a model file + + + + Open + Öffnen + + + Could not load the file + + + + An error occurred while trying to load the file. + + + + File name + + + + The model name + + + + File name can not be empty + + + + The model name can not be empty + + + + Import + + + + Cancel + Abbrechen + + InsetSection @@ -3723,10 +4018,6 @@ a highlight component. [None] - - Category - Kategorie - Object name @@ -3843,45 +4134,6 @@ IDs müssen außerdem mit einem Kleinbuchstaben beginnen. - - JsonImport - - Import Collections - - - - New Json File - - - - Could not load the file - - - - An error occurred while trying to load the file. - - - - File name: - - - - Open - Öffnen - - - File name cannot be empty. - - - - Import - - - - Cancel - Abbrechen - - Label @@ -4282,6 +4534,10 @@ a highlight component. State Group + + State Groups are not supported with Qt for MCUs + + Switch State Group @@ -4346,30 +4602,6 @@ a highlight component. minutes - - Predefined Categories - - - - Select the categories to track - - - - Select all - - - - Custom Categories - - - - Manage your own categories - - - - Add new Category - - Set runtime configuration for the project. @@ -4422,6 +4654,10 @@ a highlight component. Close Schließen + + Sets the visible <b>Views</b> to immovable across the Workspaces. + + Workspace @@ -4467,6 +4703,83 @@ a highlight component. + + MainGridStack + + Create a new project using the "<b>Create Project</b>" or open an existing project using the "<b>Open Project</b>" option. + + + + Remove Project from Recent Projects + Projekt aus der Liste der zuletzt bearbeiteten Projekte entfernen + + + Clear Recent Project List + Liste der zuletzt bearbeiteten Projekte löschen + + + + MainScreen + + Create Project ... + + + + Open Project ... + + + + New to Qt? + Neu bei Qt? + + + Get Started + Schnelleinstieg + + + Recent Projects + Zuletzt bearbeitete Projekte + + + Examples + Beispiele + + + Tutorials + Anleitungen + + + UI Tour + Oberfläche vorführen + + + User Guide + Handbuch + + + Blog + + + + Forums + + + + Account + + + + Get Qt + Qt + + + + MainWindow + + MainWindow + + + MarginSection @@ -4664,6 +4977,14 @@ a highlight component. Media Player + + Source + + + + Adds an image from the local file system. + + Playback rate @@ -4750,33 +5071,6 @@ Error: - - ModelSourceItem - - Delete - - - - Rename - Umbenennen - - - Deleting source - - - - Cancel - Abbrechen - - - Rename source - - - - New name: - Neuer Name: - - MouseAreaSpecifics @@ -4917,15 +5211,23 @@ Error: NewCollectionDialog - Add a new Collection + Add a new Model - Collection name: + Model + Modell + + + The model name - Collection name can not be empty + The model name can not be empty + + + + The model name already exists %1 @@ -5662,6 +5964,77 @@ operation is in progress. Schließt das Dock-Widget + + QKeychain::Job + + No error + + + + The specified item could not be found in the keychain + + + + User canceled the operation + + + + User interaction is not allowed + + + + No keychain is available. You may need to restart your computer + + + + The user name or passphrase you entered is not correct + + + + A cryptographic verification failure has occurred + + + + Function or operation not implemented + + + + I/O error + + + + Already open with with write permission + + + + Invalid parameters passed to a function + + + + Failed to allocate memory + + + + Bad parameter or invalid state for operation + + + + An internal component failed + + + + The specified item already exists in the keychain + + + + Unable to decode the provided data + + + + Unknown error + + + QObject @@ -5759,10 +6132,14 @@ operation is in progress. - 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? + + Minimize + Minimieren + QmlDesigner::AbstractEditorDialog @@ -5938,7 +6315,7 @@ Do you want to edit this effect? Advanced Options - + Erweiterte Optionen Export assets @@ -6098,6 +6475,14 @@ Exporting assets: %2 Title of assets library widget + + Failed to Delete Effect Resources + + + + Could not delete "%1". + + Failed to Add Files Dateien konnten nicht hinzugefügt werden @@ -6248,21 +6633,143 @@ Exporting assets: %2 - QmlDesigner::CollectionView + QmlDesigner::CollectionSourceModel - Collection Editor + Node is not indexed in the models. - Collection Editor view + Node should be a JSON model. + + + + A model with the identical name already exists. + + + + Selected node must have a valid source file address + + + + Can't read or write "%1". +%2 + + + + "%1" is corrupted. +%2 + + + + Can't clean "%1". + + + + Can't write to "%1". + + + + No model is available for the JSON model group. + + + + JSON document type should be an object containing models. + + + + Rename Model + + + + Invalid node + + + + Can't rename the node + + + + Invalid node type + + + + The model group doesn't contain the old model name (%1). + + + + The model name "%1" already exists in the model group. + + + + Delete Model + + + + The selected node has an invalid source address + + + + The model group doesn't contain the model name (%1). + + + + + QmlDesigner::CollectionView + + Model Editor + Model-Editor + + + Model Editor view QmlDesigner::CollectionWidget - Collection View - Title of collection view widget + Model Editor + Title of model editor widget + Model-Editor + + + Cannot Create QtQuick View + QtQuick View konnte nicht erzeugt werden + + + StatesEditorWidget: %1 cannot be created.%2 + + + + File error + + + + Can not open the file to write. + + + + + Can not add a model to the JSON file + + + + The imported model is empty or is not supported. + + + + Can not import to the main model + + + + The data store is not available. + + + + The default model node is not available. + + + + Failed to add a model to the default model group @@ -6657,6 +7164,106 @@ Exporting assets: %2 Group Selection Mode + + Viewport Shading + + + + Wireframe + + + + Show models as wireframe. + + + + Default + Vorgabe + + + Rendering occurs as normal. + + + + Base Color + + + + The base or diffuse color of a material is passed through without any lighting. + + + + Roughness + + + + The roughness of a material is passed through as an unlit greyscale value. + + + + Metalness + + + + The metalness of a material is passed through as an unlit greyscale value. + + + + Normals + + + + The interpolated world space normal value of the material mapped to an RGB color. + + + + Ambient Occlusion + + + + Only the ambient occlusion of the material. + + + + Emission + + + + Only the emissive contribution of the material. + + + + Shadow Occlusion + + + + The occlusion caused by shadows as a greyscale value. + + + + Diffuse + + + + Only the diffuse contribution of the material after all lighting. + + + + Specular + + + + Only the specular contribution of the material after all lighting. + + + + Reset All Viewports + + + + Reset all shading options for all viewports. + + 3D view is not supported in MCU projects. @@ -7035,6 +7642,10 @@ Exporting assets: %2 Manage... Verwalten... + + Lock Workspaces + + Reset Active @@ -7203,6 +7814,10 @@ Exporting assets: %2 Always auto-format ui.qml files in Design mode + + Enable DockWidget content minimum size + + Show property editor warnings Zeige Warnungen des Eigenschafteneditors @@ -7300,6 +7915,41 @@ Exporting assets: %2 + + QmlDesigner::Internal::TypeAnnotationReader + + Illegal state while parsing. + Ungültiger Zustand bei der Auswertung. + + + No property definition allowed. + Eigenschaftsdefinition nicht zulässig. + + + Invalid type %1 + Ungültiger Typ %1 + + + Unknown property for Type %1 + Unbekannte Eigenschaft für Typ %1 + + + Unknown property for ItemLibraryEntry %1 + Unbekannte Eigenschaft für ItemLibraryEntry %1 + + + Unknown property for Property %1 + Unbekannte Eigenschaft für Eigenschaft %1 + + + Unknown property for QmlSource %1 + Unbekannte Eigenschaft für QmlSource %1 + + + Unknown property for ExtraFile %1 + + + QmlDesigner::InvalidArgumentException @@ -8239,6 +8889,10 @@ Locked components cannot be modified or selected. Tools Werkzeuge + + Enable Experimental Features + + Hide top-level menus with advanced functionality to simplify the UI. <b>Build</b> is generally not required in the context of Qt Design Studio. <b>Debug</b> and <b>Analyze</b> are only required for debugging and profiling. <b>Tools</b> can be useful for bookmarks and git integration. @@ -8267,6 +8921,14 @@ Locked components cannot be modified or selected. Bundles path: + + Experimental Features + + + + This option enables experimental features in Qt Design Studio. Please provide feedback and bug reports at: %1 + + The menu visibility change will take effect after restart. @@ -8870,7 +9532,7 @@ Locked components cannot be modified or selected. - Effect Maker Files + Effect Composer Files @@ -8925,11 +9587,15 @@ Locked components cannot be modified or selected. - Remove This Handler + Edit the Connection - Add Signal Handler + Remove the Connection + + + + Add new Connection @@ -9008,6 +9674,10 @@ Locked components cannot be modified or selected. Edit Component + + Jump to the Code + + Go to Implementation Zu Implementierung gehen @@ -9593,6 +10263,10 @@ Locked components cannot be modified or selected. Pin Group To... + + Minimize + Minimieren + Close Other Groups @@ -9936,6 +10610,26 @@ Locked components cannot be modified or selected. All essential packages installed for all installed Qt versions. Für alle installierten Qt-Versionen sind alle notwendigen Pakete installiert. + + The selected path does not exist or is not readable. + + + + Could not find "%1" in the selected path. + + + + The selected path does not contain a valid JDK. (%1 failed: %2) + + + + Unexpected output from "%1": %2 + + + + Unsupported JDK version (needs to be %1): %2 (parsed: %3) + + OpenSSL path exists. Pfad zu OpenSSL existiert. @@ -11520,6 +12214,129 @@ und das Überschreiben Ihrer Einstellungen erfordert. Das Überschreiben erlaube Bilder (*.png *.jpg *.jpeg) + + QtC::AppManager + + Create Application Manager package with CMake + + + + Create Application Manager package + + + + Source directory: + Quellverzeichnis: + + + Package file: + + + + Automatic Application Manager Deploy Configuration + + + + Deploy Application Manager package + + + + Target directory: + Zielverzeichnis: + + + Uploading finished. + + + + Uploading failed. + + + + Install Application Manager package + + + + Starting command "%1". + Starte Kommando "%1". + + + Command finished successfully. + + + + Process failed: %1 + + + + Process finished with exit code %1. + + + + Run an Application Manager Package + + + + Run and Debug an Application Manager Package + + + + Clean Environment + Saubere Umgebung + + + %1 exited. + + + + Starting Application Manager debugging... + + + + Using: %1. + + + + Cannot debug: Only QML and native applications are supported. + + + + Cannot debug: Local executable is not set. + Kann nicht debuggen: Lokale ausführbare Datei ist nicht angegeben. + + + Application ID: + + + + Application Manager instance ID: + + + + Default instance + + + + Document URL: + + + + Customize step + + + + Disables the automatic updates based on the current run configuration and allows customizing the values. + + + + Controller: + + + + Packager: + + + QtC::Autotest @@ -12448,6 +13265,14 @@ Weitere Informationen über GTest-Filter finden Sie in der Dokumenation von Goog Uses Valgrind Callgrind when executing benchmarks (it must be installed). "Valgrind Callgrind" zur Benchmarkausführung benutzen (dazu muss es installiert sein). + + Find user-defined locations + + + + 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. + + Callgrind Callgrind @@ -12809,6 +13634,14 @@ Siehe auch die Einstellungen für Google Test. Running tests for "%1". Führe Tests für "%1" aus. + + Locate Qt Test data tags + + + + Locates Qt Test data tags found inside the active project. + + QtC::AutotoolsProjectManager @@ -12856,6 +13689,184 @@ Siehe auch die Einstellungen für Google Test. Werte Verzeichnis %1 aus + + QtC::Axivion + + Project: + + + + Lines of code: + + + + Analysis timestamp: + + + + unknown + unbekannt + + + Total: + + + + Owner + + + + Path globbing + + + + Total rows: + + + + Axivion + + + + Show dashboard + + + + Search for issues + + + + Show rule details + + + + Certificate Error + Zertifikatsfehler + + + 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. + Server-Zertifikat für %1 kann nicht authentifiziert werden. +Möchten Sie die SSL-Verifikation für diesen Server abschalten? +Hinweis: Dies macht Sie anfällig für Man-in-the-middle-Angriffe. + + + Unknown Dto structure deserialization error. + + + + The ApiToken cannot be read in a secure way. + + + + The ApiToken cannot be stored in a secure way. + + + + The ApiToken cannot be deleted in a secure way. + + + + Key chain message: "%1". + + + + Enter the password for: +Dashboard: %1 +User: %2 + + + + Axivion Server Password + + + + The stored ApiToken is not valid anymore, removing it. + + + + Fetching DashboardInfo error. + + + + The DashboardInfo doesn't contain project "%1". + + + + The activated link appears to be external. +Do you want to open "%1" with its default application? + + + + Open External Links + + + + Fetch Projects + + + + Link Project + + + + Unlink Project + + + + Dashboard projects: + + + + This project is not linked to a dashboard project. + + + + This project is linked to "%1". + + + + Incomplete or misconfigured settings. + + + + Highlight marks + + + + Marks issues on the scroll bar. + + + + Dashboard URL: + + + + Username: + + + + User name + Benutzername + + + Edit... + Bearbeiten... + + + Edit Dashboard Configuration + + + + General + Allgemein + + + Fetching... + + + QtC::BareMetal @@ -14959,6 +15970,14 @@ Zum Beispiel bewirkt die Angabe "Revision: 15" dass der Branch auf Rev Show advanced options by default Erweiterte Optionen standardmäßig anzeigen + + Use junctions for CMake configuration and build operations + + + + 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. + + General Allgemein @@ -15215,22 +16234,6 @@ Zum Beispiel bewirkt die Angabe "Revision: 15" dass der Branch auf Rev Configuring "%1" Konfiguriere "%1" - - CMake process failed to start. - Der CMake-Prozess konnte nicht gestartet werden. - - - CMake process was canceled by the user. - Der CMake-Prozess wurde vom Benutzer abgebrochen. - - - CMake process crashed. - Der CMake-Prozess ist abgestürzt. - - - CMake process exited with exit code %1. - Der CMake-Prozess wurde mit dem Rückgabewert %1 beendet. - <Build Directory> <Build-Verzeichnis> @@ -15787,6 +16790,10 @@ Stellen Sie sicher, dass der Wert der CMAKE_BUILD_TYPE-Variable derselbe wie der C++ code issues that Clangd found in the current document. C++-Probleme, die Clangd im aktuellen Dokument gefunden hat. + + Update Potentially Stale Clangd Index Entries + + Generate Compilation Database Kompilierungsdatenbank erzeugen @@ -15927,17 +16934,17 @@ Stellen Sie sicher, dass der Wert der CMAKE_BUILD_TYPE-Variable derselbe wie der QtC::ClangFormat - - Clang-Format Style - Clang-Format-Stil - Current ClangFormat version: %1. Aktuelle ClangFormat-Version: %1. - The widget was generated for ClangFormat %1. If you use a different version, the widget may work incorrectly. - Diese Benutzeroberfläche wurde für ClangFormat %1 generiert. Sie funktioniert möglicherweise nicht korrekt, wenn Sie eine andere ClangFormat-Version verwenden. + Warning: + + + + The current ClangFormat (C++ > Code Style > ClangFormat) settings are not valid. Are you sure you want to apply them? + Open Used .clang-format Configuration File @@ -15966,13 +16973,21 @@ Das integrierte Codemodell übernimmt das Einrücken. Bearbeiteten Quelltext beim Speichern der Datei formatieren - Override .clang-format file - .clang-format-Datei außer Kraft setzen + Use custom settings + + + + Use built-in indenter + Use global settings Globale Einstellungen verwenden + + Please note that the current project includes a .clang-format file, which will be used for code indenting and formatting. + + ClangFormat settings: Einstellungen für ClangFormat: @@ -15985,10 +17000,6 @@ Das integrierte Codemodell übernimmt das Einrücken. Full formatting Komplette Formatierung - - Disable - Deaktivieren - The current project has its own .clang-format file which can be overridden by the settings below. Das aktuelle Projekt hat ihre eigene .clang-format-Datei, die in den untenstehenden Einstellungen überschrieben werden kann. @@ -16318,6 +17329,10 @@ Setzen Sie erst eine gültige ausführbare Datei. Failed to build the project. Das Projekt konnte nicht erstellt werden. + + Diagnostics + + Failed to start the analyzer. Das Analyse-Werkzeug konnte nicht gestartet werden. @@ -16838,10 +17853,6 @@ Setzen Sie erst eine gültige ausführbare Datei. Undo Check Out Auschecken rückgängig machen - - &Undo Check Out "%1" - A&uschecken von "%1" rückgängig machen - Meta+L,Meta+U Meta+L,Meta+U @@ -17845,6 +18856,15 @@ Trotzdem fortfahren? Show keyboard shortcuts in context menus (default: %1) Tastenkombinationen in Kontextmenüs anzeigen (Vorgabe: %1) + + Override cursors for views + + + + Provide cursors for resizing views. +If the system cursors for resizing views are not displayed properly, you can use the cursors provided by %1. + + Toolbar style: Werkzeugleisten-Stil: @@ -17873,10 +18893,22 @@ Trotzdem fortfahren? DPI rounding policy: DPI-Rundungsstrategie: + + The following environment variables are set and can influence the UI scaling behavior of %1: + + + + Environment influences UI scaling behavior. + + Text codec for tools: Zeichenkodierung für Werkzeuge: + + The cursors for resizing views will change after restart. + + The language change will take effect after restart. Die Änderung der Sprache wird nach einem Neustart wirksam. @@ -18075,10 +19107,6 @@ Trotzdem fortfahren? Hide Menu Bar Menüleiste verbergen - - This will hide the menu bar completely. You can show it again by typing %1. - Dies verbirgt die Menüleiste. Sie können Sie durch Eingeben von %1 wieder anzeigen. - Version: Version: @@ -18115,6 +19143,10 @@ Trotzdem fortfahren? Ctrl+Meta+W Ctrl+Meta+W + + 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). + + Change Log... Änderungshistorie... @@ -18326,10 +19358,6 @@ Trotzdem fortfahren? Plugin changes will take effect after restart. Änderungen der Plugins werden nach einem Neustart wirksam. - - Plugin Details of %1 - Beschreibung zu %1 - Plugin Errors of %1 Fehler in %1 @@ -18438,6 +19466,10 @@ Trotzdem fortfahren? About %1 Über %1 + + Copy and Close + + <br/>From revision %1<br/> <br/>Revision %1<br/> @@ -19358,6 +20390,14 @@ Um es abzurufen, tippen Sie das Kürzel im Locator, gefolgt von einem Leerzeiche Directories: Verzeichnisse: + + Cannot Create File + + + + Cannot create file "%1". + + Create Directory Verzeichnis erzeugen @@ -19604,6 +20644,10 @@ Um es abzurufen, tippen Sie das Kürzel im Locator, gefolgt von einem Leerzeiche Expand All Alle aufklappen + + Show Paths in Relation to Active Project + + Filter Results Resultate filtern @@ -19616,6 +20660,10 @@ Um es abzurufen, tippen Sie das Kürzel im Locator, gefolgt von einem Leerzeiche Collapse All Alle einklappen + + Show Full Paths + + Search Results Suchergebnisse @@ -19780,6 +20828,14 @@ Möchten Sie es beenden? Enter Full Screen Vollbildmodus einschalten + + Proxy Authentication Required + + + + Do not ask again. + + No themes found in installation. Keine Themen in der Installation gefunden. @@ -19860,6 +20916,10 @@ Möchten Sie es beenden? A comment. Ein Kommentar. + + Convert string to pure ASCII. + + Create Folder Verzeichnis erzeugen @@ -20036,10 +21096,6 @@ Möchten Sie sie jetzt auschecken? Ctrl+W Ctrl+W - - Alternative Close - Schließen (alternativ) - Ctrl+F4 Ctrl+F4 @@ -20549,14 +21605,6 @@ provided they were unmodified before the refactoring. Case sensitive: Mit Groß-/Kleinschreibung: - - (%1) - (%1) - - - %1 %2%3 - %1 %2%3 - Based on Qt %1 (%2, %3) Auf Qt %1 (%2, %3) beruhend @@ -21418,6 +22466,10 @@ Doppelklicken Sie einen Eintrag um ihn zu ändern. Move All Function Definitions to %1 Alle Funktionsdefinitionen nach %1 verschieben + + Move Definition Here + + Move Definition to Class Definition in Klasse verschieben @@ -22071,6 +23123,14 @@ Diese Präfixe werden zusätzlich zum Dateinamen beim Wechseln zwischen Header- Use "#pragma once" instead of "#ifndef" guards "#pragma once" statt Include-Guards mit "#ifndef" verwenden + + Headers + Header-Dateien + + + Sources + Quelldateien + S&uffix: E&ndung: @@ -22620,6 +23680,10 @@ Das integrierte Codemodell übernimmt Syntaxhervorhebung, Code-Vervollständigun Insert header files on completion Bei Code-Vervollständigung Header-Dateien hinzufügen + + Automatic + Automatisch + Ignore files greater than Dateien ignorieren, wenn sie größer sind als @@ -25170,6 +26234,10 @@ markers in the source code editor. Treat All Characters as Printable Alle Zeichen als druckbar betrachten + + %1 of length %2 + + Show Unprintable Characters as Escape Sequences Nicht druckbare Zeichen als Escape-Sequenz anzeigen @@ -26377,28 +27445,24 @@ Sie können hier eine andere Verbindung wählen, beispielsweise eine serielle Ve <a href="qthelp://org.qt-project.qtcreator/doc/creator-debugging-qml.html">Was sind die Voraussetzungen?</a> - Enable C++ debugger. - C++-Debugger aktivieren. + Enable %1 debugger. + - Try to determine need for C++ debugger. - Versuche, die Notwendigkeit eines C++-Debuggers automatisch festzustellen. + Disable %1 debugger. + - Enable QML debugger. - QML-Debugger aktivieren. + Try to determine need for %1 debugger. + - Try to determine need for QML debugger. - Versuche, die Notwendigkeit eines QML-Debuggers automatisch festzustellen. + No additional startup commands. + - Without additional startup commands. - Ohne zusätzliche Kommandos beim Start. - - - With additional startup commands. - Mit zusätzlichen Kommandos beim Start. + Use additional startup commands. + C++ debugger: @@ -26408,6 +27472,10 @@ Sie können hier eine andere Verbindung wählen, beispielsweise eine serielle Ve QML debugger: QML-Debugger: + + Python debugger: + + Enable Debugging of Subprocesses Debuggen von Unterprozessen zulassen @@ -28682,6 +29750,85 @@ Versuchen Sie, das Projekt neu zu erstellen. Eine halbe Bildschirmseite aufwärts + + QtC::ExtensionManager + + Extensions + + + + Get started + + + + Install the extension from above. Installation starts automatically. You can always uninstall the extension afterwards. + + + + More information + + + + Online Documentation + + + + Tutorials + Anleitungen + + + Examples + Beispiele + + + Extension library details + + + + Size + Größe + + + Version + Version + + + Location + + + + Extension details + + + + Released + + + + Related tags + + + + Platforms + + + + Dependencies + Abhängigkeiten + + + Extensions in pack + + + + Manage Extensions + + + + Install... + + + QtC::ExtensionSystem @@ -28716,6 +29863,10 @@ Versuchen Sie, das Projekt neu zu erstellen. Dependencies: Abhängigkeiten: + + Plugin Details of %1 + Beschreibung zu %1 + Group: Gruppe: @@ -28980,8 +30131,14 @@ Grund: %3 Plugin is not available on this platform. Plugin ist auf dieser Plattform nicht verfügbar. + + %1 (deprecated) + %1 is a plugin name + + %1 (experimental) + %1 is a plugin name %1 (experimentell) @@ -29050,6 +30207,10 @@ zu deaktivieren, deaktiviert auch die folgenden Plugins: %2 + + Details + Details + The following plugins have errors and cannot be loaded: Die folgenden Plugins sind fehlerhaft und können nicht geladen werden: @@ -29062,6 +30223,10 @@ zu deaktivieren, deaktiviert auch die folgenden Plugins: Continue Fortsetzen + + Multiple versions of the same plugin have been found. + + %1 > About Plugins %1 > Plugins @@ -30693,6 +31858,10 @@ Jetzt Commit ausführen? Pull with rebase pull mit rebase + + Git command: + + Set "HOME" environment variable Umgebungsvariable "HOME" setzen @@ -31157,18 +32326,6 @@ wenn es außerhalb von git bash aufgerufen wird. Querying Gerrit Anfrage an Gerrit - - Error running %1: %2 - Fehler bei Ausführung von %1: %2 - - - %1 crashed. - %1 ist abgestürzt. - - - %1 returned %2. - %1 gab %2 zurück. - Timeout Zeitüberschreitung @@ -31966,15 +33123,6 @@ Leer lassen, um das Dateisystem zu durchsuchen. Avoid translating "Diff" Diff für aktuelle Datei - - Git Blame - Git Blame - - - <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>Hinweis:</b> "%1" oder "%2" ist in den Einstellungen für Instant Blame aktiviert. - Diff of "%1" Avoid translating "Diff" @@ -32149,10 +33297,6 @@ Leer lassen, um das Dateisystem zu durchsuchen. Unsupported version of Git found. Git %1 or later required. Es wurde eine nicht unterstützte Version von Git festgestellt. Es wird Git %1 oder neuer benötigt. - - You - Sie selbst - Amend %1 Abgabe %1 ändern (amend) @@ -33621,6 +34765,18 @@ Möchten Sie sie überschreiben? The Info.plist might be incorrect. Die Info.plist ist möglicherweise fehlerhaft. + + Deployment canceled. + + + + Failed to run devicectl: %1. + + + + devicectl returned unexpected output ... deployment might have failed. + + The provisioning profile "%1" (%2) used to sign the application does not cover the device %3 (%4). Deployment to it will fail. Das zum Signieren der Anwendung verwendete Provisioning-Profil "%1" (%2) deckt das Gerät %3 (%4) nicht ab. Deployment auf dieses wird scheitern. @@ -33735,6 +34891,10 @@ Möchten Sie sie überschreiben? %1 is not connected. Keine Verbindung zu %1. + + Debugging and profiling is currently not supported for devices with iOS 17 and later. + + Device type: Gerätetyp: @@ -33756,8 +34916,8 @@ Möchten Sie sie überschreiben? Der Start der Anwendung im Simulator ist gescheitert. Der Bundle-Pfad %1 ist ungültig - Application launch on simulator failed. Simulator not running. - Der Start der Anwendung im Simulator ist gescheitert. Der Simulator läuft nicht. + Application launch on simulator failed. Simulator not running. %1 + Application install on simulator failed. %1 @@ -33779,6 +34939,26 @@ Möchten Sie sie überschreiben? Invalid simulator response. Device Id mismatch. Device Id = %1 Response Id = %2 Ungültige Antwort des Simulators. Die Geräte-IDs stimmen nicht überein. Geräte-ID = %1 Antwort-ID = %2 + + Running failed. No iOS device found. + + + + Running canceled. + + + + "%1" exited. + + + + Failed to determine bundle identifier. + + + + Running "%1" on %2... + + Could not find %1. %1 konnte nicht gefunden werden. @@ -34141,6 +35321,82 @@ Ablaufdatum: %3 Reset to Default Auf Vorgabe zurücksetzen + + Failed to parse devicectl output: %1. + + + + Operation failed: %1 + + + + Failed to parse devicectl output: "result" is missing. + + + + devicectl returned unexpected output ... running failed. + + + + Failed to start process. + + + + Process was canceled. + + + + Process was forced to exit. + + + + Cannot find xcrun. + + + + xcrun is not executable. + + + + Invalid Empty UDID. + + + + Failed to start simulator app. + + + + Simulator device is not available. (%1) + + + + Simulator start was canceled. + + + + Cannot start Simulator device. Previous instance taking too long to shut down. (%1) + + + + Cannot start Simulator device. Simulator not in shutdown state. (%1) + + + + Cannot start Simulator device. Simulator not in booted state. (%1) + + + + Bundle path does not exist. + + + + Invalid (empty) bundle identifier. + + + + Failed to convert inferior pid. (%1) + + QtC::LanguageClient @@ -34208,6 +35464,46 @@ Ablaufdatum: %3 Manage... Verwalten... + + Install npm Package + + + + Running "%1" to install %2. + Führe "%1" aus, um %2 zu installieren. + + + The installation of "%1" was canceled by timeout. + Die Installation von "%1" wurde wegen Zeitüberschreitung abgebrochen. + + + The installation of "%1" was canceled by the user. + Die Installation von "%1" wurde vom Benutzer abgebrochen. + + + Installing "%1" failed with exit code %2. + Die Installation von "%1" ist mit dem Rückgabewert %2 fehlgeschlagen. + + + Install %1 language server via npm. + + + + Setup %1 language server (%2). + + + + Install + Installieren + + + Setup + + + + %1 Language Server + + Name: Name: @@ -34427,6 +35723,10 @@ Für gültige Einstellungen schauen Sie in die Dokumentation des benutzten Langu Expand All Alle aufklappen + + Collapse All + Alle einklappen + Client Message Client-Nachricht @@ -35119,6 +36419,14 @@ Für gültige Einstellungen schauen Sie in die Dokumentation des benutzten Langu Remove + + Read about Using QtMCUs in the Qt Design Studio + + + + Go to the Documentation + + Create new kits @@ -36858,6 +38166,11 @@ Weitere Erklärungen sind möglicherweise in "Ausgabe der Anwendung" z &Hijack &Hijack + + 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. + + p4 revert Rückgängig machen @@ -36898,18 +38211,6 @@ Weitere Erklärungen sind möglicherweise in "Ausgabe der Anwendung" z p4 changelists %1 p4 changelists %1 - - Could not start perforce "%1". Please check your settings in the preferences. - Das Perforce-Kommando "%1" konnte nicht gestartet werden. Bitte überprüfen Sie die Einstellungen. - - - Perforce did not respond within timeout limit (%1 s). - Perforce reagierte nicht innerhalb des Zeitlimits (%1 s). - - - The process terminated with exit code %1. - Der Prozess wurde beendet, Rückgabewert %1. - Close Submit Editor Submit-Editor schließen @@ -36926,20 +38227,6 @@ Weitere Erklärungen sind möglicherweise in "Ausgabe der Anwendung" z Cannot submit: %1. Submit fehlgeschlagen: %1. - - p4 submit failed: %1 - Fehler beim Submit: %1 - - - Error running "where" on %1: %2 - Failed to run p4 "where" to resolve a Perforce file name to a local file system name. - Fehler bei der Ausführung von "where" bei Datei "%1": %2 - - - The file is not mapped - File is not managed by Perforce - Die Datei wird nicht von Perforce verwaltet - Perforce repository: %1 Perforce-Repository: %1 @@ -36948,10 +38235,6 @@ Weitere Erklärungen sind möglicherweise in "Ausgabe der Anwendung" z Perforce: Unable to determine the repository: %1 Perforce: Das Repository von konnte nicht bestimmt werden: %1 - - The process terminated abnormally. - Der Prozess wurde unnormal beendet. - Perforce is not correctly configured. Perforce ist nicht richtig konfiguriert. @@ -37230,10 +38513,6 @@ Weitere Erklärungen sind möglicherweise in "Ausgabe der Anwendung" z Skipping disabled step %1. Überspringe deaktivierten Schritt %1. - - Variable already exists. - Variable existiert bereits. - Ed&it Bearbe&iten @@ -37262,10 +38541,6 @@ Weitere Erklärungen sind möglicherweise in "Ausgabe der Anwendung" z Prepend Path... Pfad voranstellen... - - &Batch Edit... - Als &Text bearbeiten... - Open &Terminal &Terminalfenster öffnen @@ -38182,6 +39457,14 @@ Bitte versuchen Sie es erneut. Runs a run configuration of the active project. Führt eine Ausführungskonfiguration des aktiven Projekts aus. + + Debug Run Configuration + + + + Starts debugging a run configuration of the active project. + + Switch Run Configuration Ausführungskonfiguration auswählen @@ -38820,6 +40103,10 @@ The name of the build configuration created by default for a generic project.&Keep Running &Fortsetzen + + Remote process did not finish in time. Connectivity lost? + + Starting %1... Starte %1... @@ -39889,14 +41176,6 @@ Bitte schließen Sie alle laufenden Instanzen Ihrer Anwendung vor dem Erstellen. Include QMainWindow QMainWindow einbinden - - Include QDeclarativeItem - Qt Quick 1 - QDeclarativeItem einbinden - Qt Quick 1 - - - Include QQuickItem - Qt Quick 2 - QQuickItem einbinden - Qt Quick 2 - Include QSharedData QSharedData einbinden @@ -40631,6 +41910,10 @@ Sie sollten nicht mehrere Test-Frameworks im selben Projekt mischen.PySide 6 PySide 6 + + Include QQuickItem + + Qt 6.2 Qt 6.2 @@ -40855,6 +42138,26 @@ Sie sollten nicht mehrere Test-Frameworks im selben Projekt mischen.Qt Quick Test Project Qt Quick Test-Projekt + + Creates a translation file that you can add to a Qt project. + + + + Qt Translation File + + + + 2.x + + + + 3.x + + + + Catch2 version: + + Creates a CMake-based test project for which a code snippet can be entered. Erstellt ein CMake-basiertes Testprojekt, für welches ein Code-Ausschnitt angegeben werden kann. @@ -41379,6 +42682,11 @@ Sie sollten nicht mehrere Test-Frameworks im selben Projekt mischen.* Version %1 nicht unterstützt. + + * Failed to create: %1 + + + The platform selected for the wizard. Die für den Assistenten ausgewählte Plattform. @@ -41508,16 +42816,8 @@ Sie sollten nicht mehrere Test-Frameworks im selben Projekt mischen.Wählen Sie das Wurzelverzeichnis - Replacement for - Ersatz für - - - Replacement for "%1" - Ersatz für "%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. - Das Projekt "%1" wurde für das Kit "%2" mit dem Bezeichner %3 konfiguriert. Dieses Kit existiert nicht mehr. Das neue Kit "%4" wurde an seiner Stelle erzeugt, um den Verlust von benutzerdefinierten Projekteinstellungen zu verhindern. + 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. + Could not find any qml_*.qm file at "%1" @@ -41767,6 +43067,43 @@ Sie werden erhalten. Show Non-matching Lines Nicht passende Zeilen anzeigen + + 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: + + + + 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. + + + + Copy the build, deploy, and run steps to another kit. + + + + %1 (%2) + vanished target display role: vanished target name (device type name) + %1 (%2) + + + Create a New Kit + + + + Copy Steps to Another Kit + + + + Remove Vanished Target "%1" + + + + Remove All Vanished Targets + + + + Vanished Targets + + Project Settings Projekteinstellungen @@ -42040,10 +43377,6 @@ Was soll %1 tun? Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug) Debug-Version von Frameworks verwenden (DYLD_IMAGE_SUFFIX=_debug) - - Interpreter: - Interpreter: - X11 Forwarding: X11-Weiterleitung: @@ -42064,10 +43397,6 @@ Was soll %1 tun? Override MAKEFLAGS MAKEFLAGS überschreiben - - <code>MAKEFLAGS</code> specifies parallel jobs. Check "%1" to override. - <code>MAKEFLAGS</code> legt parallele Jobs fest. Wählen Sie "%1", um dies zu überstimmen. - Disable in subdirectories: In Unterverzeichnissen deaktivieren: @@ -42108,6 +43437,18 @@ Was soll %1 tun? <b>Make:</b> %1 not found in the environment. <b>Make:</b> %1 konnte in der Umgebung nicht gefunden werden. + + Overriding <code>MAKEFLAGS</code> environment variable. + + + + <code>MAKEFLAGS</code> specifies a conflicting job count. + + + + No conflict with <code>MAKEFLAGS</code> environment variable. + + Enable connection sharing: Verbindungsfreigabe aktivieren: @@ -42214,6 +43555,14 @@ Was soll %1 tun? Shadow build: Shadow-Build: + + Build directory contains potentially problematic character "%1". + + + + This warning can be suppressed <a href="dummy">here</a>. + + The project is currently being parsed. Das Projekt wird gerade ausgewertet. @@ -42523,6 +43872,14 @@ Was soll %1 tun? Start build processes with low priority Erstellungsprozesse mit niedriger Priorität starten + + Warn against build directories with spaces or non-ASCII characters + + + + 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. + + Do Not Build Anything Nichts erstellen @@ -42567,6 +43924,14 @@ Was soll %1 tun? Use jom instead of nmake jom statt nmake verwenden + + Environment changes to apply to run configurations, but not build configurations. + + + + Application environment: + + Projects Directory Projektverzeichnis @@ -42965,6 +44330,10 @@ fails because Clang does not understand the target architecture. &Make Default Als &Vorgabe setzen + + &Generate Kit + + &Clean Up &Bereiningen @@ -43001,11 +44370,6 @@ fails because Clang does not understand the target architecture. Language Server Configuration Language Server-Konfiguration - - %1 (Windowed) - <python display name> (Windowed) - %1 (mit Fenster) - Python interpreter: Python-Interpreter: @@ -43035,12 +44399,20 @@ fails because Clang does not understand the target architecture. PySide-Version auswählen - Select which PySide version to install: - Wählen Sie die zu installierende PySide-Version aus: + Installing PySide + - Latest PySide from the Python Package Index - Letzte PySide-Version aus dem Python-Paketindex + 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. + + + + Select which version to install: + + + + Latest PySide from the PyPI + PySide %1 Wheel (%2) @@ -43091,8 +44463,28 @@ fails because Clang does not understand the target architecture. Geben Sie den Ort des PySide Projektwerkzeugs ein. - General - Allgemein + PySide uic tool: + + + + Enter location of PySide uic tool. + + + + Effective venv: + + + + New Virtual Environment + + + + Global Python + + + + Virtual Environment + REPL @@ -43166,18 +44558,50 @@ fails because Clang does not understand the target architecture. PySide version: PySide-Version: - - Create new virtual environment - Neue virtuelle Umgebung erstellen - - - Path to virtual environment: - Pfad zur virtuellen Umgebung: - Issues parsed from Python runtime output. Probleme, die in der Laufzeitausgabe von Python gefunden wurden. + + None + + + + The interpreter used for Python based projects. + + + + No Python setup. + + + + Python "%1" not found. + + + + Python "%1" is not executable. + + + + 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" does not contain a usable venv. venv is the recommended way to isolate a development environment for a project from the globally installed Python. + + + + Name of Python Interpreter + + + + Path to Python Interpreter + + + + No Python interpreter set for kit "%1" + + QtC::QbsProjectManager @@ -43545,6 +44969,10 @@ The affected files are: Die betroffenen Dateien sind: %2 + + Qbs Editor + + QtC::Qdb @@ -46867,7 +48295,7 @@ Speichern fehlgeschlagen. Advanced Options - + Erweiterte Optionen File %1 will be created. @@ -47059,6 +48487,14 @@ Are you sure? Build directory: Build-Verzeichnis: + + The Selected Kit Is Not Supported + + + + You cannot use the selected kit to preview Qt for MCUs applications. + + Failed to find valid Qt for MCUs kit @@ -47213,10 +48649,6 @@ Möchten Sie fortfahren? Local file "%1" does not exist. Es gibt keine lokale Datei "%1". - - Remote chmod failed for file "%1": %2 - "chmod" für die entfernte Datei "%1" ist fehlgeschlagen: %2 - No device configuration set. Es ist keine Gerätekonfiguration gesetzt. @@ -47383,6 +48815,10 @@ wirklich löschen? Qt %{Qt:Version} (%2) Qt %{Qt:Version} (%2) + + (on %1) + + Qt version is not properly installed, please run make install Die Qt-Version ist nicht richtig installiert, führen Sie bitte make install aus @@ -47892,8 +49328,12 @@ wirklich löschen? Deaktiviert QML-Debuggen. QML-Profiling funktioniert weiterhin. - 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. - Falls Sie planen, Übersetzungen für die Benutzeroberfläche Ihres Projekts über das Qt Linguist-Werkzeug bereit zu stellen, wählen Sie hier eine Sprache. Eine zugehörige Übersetzungsdatei (.ts) wird für Sie erzeugt. + Select a language for which a corresponding translation (.ts) file will be generated for you. + + + + 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. + <none> @@ -48079,10 +49519,6 @@ Zusätzlich wird die Verbindung zum Gerät getestet. Local file "%1" does not exist. Es gibt keine lokale Datei "%1". - - Remote chmod failed for file "%1": %2 - "chmod" für die entfernte Datei "%1" ist fehlgeschlagen: %2 - Incremental deployment Inkrementelles Deployment @@ -48131,6 +49567,19 @@ Zusätzlich wird die Verbindung zum Gerät getestet. All specified ports are available. Alle angegebenen Ports sind verfügbar. + + Connecting to device... + + + + Connected. Now doing extended checks. + + + + + Basic connectivity test failed, device is considered unusable. + + Device replied to echo with unexpected contents: "%1" Das Gerät hat auf das Echo mit unerwartetem Inhalt geantwortet: "%1" @@ -48443,6 +49892,14 @@ Der Kontrollprozess konnte nicht gestartet werden. SSH connection failure: SSH-Verbindungsfehler: + + Device is disconnected. + + + + Can't send control signal to the %1 device. The device might have been disconnected. + + Remote Linux Entferntes Linuxgerät @@ -48451,10 +49908,26 @@ Der Kontrollprozess konnte nicht gestartet werden. Error Fehler + + Establishing initial connection to device "%1". This might take a moment. + + + + Device "%1" is currently marked as disconnected. + + + + 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>. + + Failed: %1 Fehlgeschlagen: %1 + + Device is considered unconnected. Re-run device test to reset state. + + Remote Linux Device Entferntes Linuxgerät @@ -48589,10 +50062,6 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Transfer method: Übertragungsmethode: - - Use rsync if available. Otherwise use default transfer. - Benutze rsync, sofern verfügbar. Sonst Standardmethode verwenden. - Use sftp if available. Otherwise use default transfer. Benutze SFTP, sofern verfügbar. Sonst Standardmethode verwenden. @@ -48605,6 +50074,10 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Unknown error occurred while trying to create remote directories Beim Erstellen von entfernten Verzeichnissen ist ein unbekannter Fehler aufgetreten + + Transfer method was downgraded from "%1" to "%2". If this is unexpected, please re-test device "%3". + + rsync failed to start: %1 rsync konnte nicht gestartet werden: %1 @@ -48625,6 +50098,10 @@ Wenn Sie noch keinen privaten Schlüssel besitzen, können Sie hier auch einen e Ignore missing files: Fehlende Dateien ignorieren: + + Use rsync or sftp if available, but prefer rsync. Otherwise use default transfer. + + rsync is only supported for transfers between different devices. rsync wird nur für das Übertragen zwischen unterschiedlichen Geräten unterstützt. @@ -50212,6 +51689,22 @@ Testfall "%2" wird nicht aufgezeichnet. Test Suites Test-Suites + + Do you really want to delete "%1" permanently? + + + + Remove Shared File + + + + Cancel + Abbrechen + + + Failed to remove "%1". + + Remove "%1" from the list of shared folders? "%1" aus der Liste der gemeinsamen Verzeichnisse entfernen? @@ -50952,7 +52445,6 @@ Die Datei "%1" konnte nicht geöffnet werden. Sends Esc to terminal instead of %1. - %1 is the application name (Qt Creator) Sendet Escape zum Terminal statt zu %1. @@ -50965,12 +52457,10 @@ Die Datei "%1" konnte nicht geöffnet werden. %1 shortcuts are blocked when focus is inside the terminal. - %1 is the application name (Qt Creator) Tastenkombinationen von %1 werden blockiert, wenn der Fokus im Terminal ist. %1 shortcuts take precedence. - %1 is the application name (Qt Creator) Tastenkombinationen von %1 werden bevorzugt. @@ -51177,6 +52667,10 @@ Die Datei "%1" konnte nicht geöffnet werden. Paste Einfügen + + Select All + + Clear Selection Auswahl löschen @@ -51482,6 +52976,10 @@ Werte kleiner als 100% können überlappende und falsch ausgerichtete Darstellun Copy... Kopieren... + + Custom settings: + + Delete Löschen @@ -51756,10 +53254,6 @@ Werte kleiner als 100% können überlappende und falsch ausgerichtete Darstellun Import... Importieren... - - Current settings: - Aktuelle Einstellungen: - Copy Code Style Coding Style kopieren @@ -51804,6 +53298,10 @@ Werte kleiner als 100% können überlappende und falsch ausgerichtete Darstellun %1 [built-in] %1 [eingebaut] + + %1 [customizable] + + Files in File System Dateien aus Dateisystem @@ -52201,6 +53699,14 @@ Gibt an, wie sich die Rücktaste bezüglich Einrückung verhält. Display file line ending Zeilenende-Kodierung anzeigen + + &Highlight selection + + + + Adds a colored background and a marker to the scrollbar to occurrences of the selected text. + + Next to editor content Neben Editorinhalt @@ -52912,8 +54418,8 @@ Bestimmt das Verhalten bezüglich der Einrückung von Fortsetzungszeilen. Alt+U - &Sort Selected Lines - Auswahl &sortieren + &Sort Lines + Meta+Shift+S @@ -54126,10 +55632,23 @@ Außer Leerzeichen innerhalb von Kommentaren und Zeichenketten. Copy to Clipboard In die Zwischenablage kopieren + + Git Blame + Git Blame + Copy SHA1 to Clipboard SHA1 in die Zwischenablage kopieren + + <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>Hinweis:</b> "%1" oder "%2" ist in den Einstellungen für Instant Blame aktiviert. + + + You + Sie selbst + Show Preview Vorschau anzeigen @@ -54142,10 +55661,6 @@ Außer Leerzeichen innerhalb von Kommentaren und Zeichenketten. Emphasis Hervorherbung - - Strong - Fett - Inline Code Inline-Quelltext @@ -54760,10 +56275,6 @@ Die Trace-Daten sind verloren. Reset to Default Layout Vorgabe wiederherstellen - - Automatically Hide View Title Bars - Titelleisten von Anzeigen automatisch ausblenden - Name contains white space. Der Name enthält Leerzeichen. @@ -54837,8 +56348,8 @@ Die Trace-Daten sind verloren. Das Kommando "%1" konnte nicht gestartet werden. - The command "%1" did not respond within the timeout limit (%2 s). - Das Kommando "%1" hat nicht innerhalb des Zeitlimits (%2 s) geantwortet. + The command "%1" was canceled after %2 ms. + Invalid command @@ -54880,6 +56391,10 @@ Die Trace-Daten sind verloren. Cannot execute "%1": %2 Das Kommando "%1" konnte nicht ausgeführt werden: %2 + + Failed to start terminal process. The stub exited before the inferior was started. + + Cannot set permissions on temporary directory "%1": %2 Die Berechtigungen für das temporäre Verzeichnis "%1" konnten nicht gesetzt werden: %2 @@ -54916,6 +56431,10 @@ Die Trace-Daten sind verloren. createTempFile is not implemented for "%1". createTempFile ist für "%1" nicht implementiert. + + Refusing to remove the standard directory "%1". + + Refusing to remove root directory. Das Wurzelverzeichnis kann nicht entfernt werden. @@ -54971,6 +56490,10 @@ Die Trace-Daten sind verloren. Die Datei "%1" konnte nicht geschrieben werden (es wurden nur %2 von %n Bytes geschrieben). + + Device is not connected + + Failed reading file "%1": %2 Die Datei "%1" konnte nicht gelesen werden: %2 @@ -55023,6 +56546,10 @@ Die Trace-Daten sind verloren. Cannot create temporary file in %1: %2 Es konnte keine temporäre Datei erstellt in %1 werden: %2 + + Cannot create temporary file %1: %2 + + Overwrite File? Datei überschreiben? @@ -55353,14 +56880,8 @@ Um eine Variable zu deaktivieren, stellen Sie der Zeile "#" voran. <VARIABLE> - Name when inserting a new variable <VARIABLE> - - <VALUE> - Value when inserting a new variable - <VALUE> - Elapsed time: %1. Verstrichene Zeit: %1. @@ -57124,8 +58645,8 @@ Check settings or ensure Valgrind is installed and available in PATH. Führe aus: %1 - Running in "%1": %2. - Führe in "%1" aus: %2. + Running in "%1": %2 + Failed to retrieve data. @@ -57465,8 +58986,8 @@ should a repository require SSH-authentication (see documentation on SSH and the Willkommen - New to Qt? - Neu bei Qt? + Welcome to %1 + Create Project... @@ -57476,6 +58997,10 @@ should a repository require SSH-authentication (see documentation on SSH and the Open Project... Projekt öffnen... + + Explore more + + Get Started Schnelleinstieg @@ -58311,13 +59836,6 @@ defined in step size. - - RemoteLinux::SshProcessInterface - - Can't send control signal to the %1 device. The device might have been disconnected. - - - RenameFolderDialog @@ -58462,6 +59980,64 @@ defined in step size. + + SaveAsDialog + + Save Effect + + + + Effect name: + + + + Name contains invalid characters. + + + + Name must start with a capital letter + + + + Name must have at least 3 characters + + + + Name cannot contain white space + + + + Save + Speichern + + + Cancel + Abbrechen + + + + SaveChangesDialog + + Save Changes + Änderungen speichern + + + Current composition has unsaved changes. + + + + Cancel + Abbrechen + + + Save + Speichern + + + Discard Changes + + + ScaleToolAction @@ -58815,6 +60391,13 @@ This is used for calculating the total implicit size. + + SocialButton + + Text + Text + + SpatialSoundSection @@ -58996,6 +60579,13 @@ it reaches the start or end. Ausrichtung des Split View. + + SplitViewToggleAction + + Toggle Split View On/Off + + + StackLayoutSpecifics @@ -59135,6 +60725,10 @@ it reaches the start or end. Extend + + Jump to the code + + Reset when Condition Zurücksetzen bei Bedingung @@ -59511,6 +61105,13 @@ This is used for calculating the total implicit size. Bestimmt die Position der Tabs. + + Tag + + tag name + + + TemplateMerge @@ -59530,6 +61131,41 @@ This is used for calculating the total implicit size. + + TestControlPanel + + X + X + + + Theme + + + + light + + + + dark + + + + + + + + Basic + Grundlegend + + + Community + + + + < + + + TextAreaSpecifics @@ -59974,6 +61610,29 @@ This is used for calculating the total implicit size. + + ThumbnailDelegate + + Overwrite Example? + + + + Example already exists.<br>Do you want to replace it? + + + + Downloading... + + + + Extracting... + + + + Recently Downloaded + + + TimelineBarItem @@ -60077,6 +61736,104 @@ This is used for calculating the total implicit size. + + TourModel + + Welcome Page + + + + The welcome page of Qt Design Studio. + + + + Workspaces + + + + Introduction to the most important workspaces. + + + + Top Toolbar + + + + Short explanation of the top toolbar. + + + + States + + + + An introduction to states. + + + + Sorting Components + + + + A way to organize multiple components. + + + + Connecting Components + + + + A way to connect components with actions. + + + + Adding Assets + + + + A way to add new assets to the project. + + + + Creating 2D Animation + + + + A way to create a 2D Animation. + + + + Border and Arc + + + + Work with Border and Arc Studio Components. + + + + Ellipse and Pie + + + + Work with Ellipse and Pie Studio Components. + + + + Complex Shapes + + + + Work with Polygon, Triangle and Rectangle Studio Components. + + + + + TourRestartButton + + Restart + + + TumblerSpecifics @@ -60186,7 +61943,7 @@ Are you sure you want to remove the %1? VideoSection Video - + Video Source @@ -60342,50 +62099,6 @@ Are you sure you want to remove the %1? main - - Recent Projects - Zuletzt bearbeitete Projekte - - - Examples - Beispiele - - - Tutorials - Anleitungen - - - Welcome to - Willkommen bei - - - Qt Design Studio - Qt Design Studio - - - Create New - Neu erstellen - - - Open Project - Projekt öffnen - - - Help - Hilfe - - - Community - - - - Blog - - - - Community Edition - - Continue Fortsetzen From 3c94f63e67a0d58f160ff7635b8b6c0ca2cd4680 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 5 Mar 2024 13:22:25 +0100 Subject: [PATCH 42/87] Android: Guard against assert due to invalid access Change-Id: I4f98f18b786c95acae09a3be3b924953f1292e61 Reviewed-by: Artem Sokolovskii Reviewed-by: --- src/plugins/android/androidbuildapkstep.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 34c6a9b619a..c57d008705d 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -228,11 +228,12 @@ AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step) m_step->setBuildToolsVersion(buildToolsSdkComboBox->itemData(idx).value()); }); - const int initIdx = (m_step->buildToolsVersion().majorVersion() < 1) - ? buildToolsVersions.indexOf(buildToolsVersions.last()) - : buildToolsVersions.indexOf(m_step->buildToolsVersion()); - buildToolsSdkComboBox->setCurrentIndex(initIdx); - + if (!buildToolsVersions.isEmpty()) { + const int initIdx = (m_step->buildToolsVersion().majorVersion() < 1) + ? buildToolsVersions.indexOf(buildToolsVersions.last()) + : buildToolsVersions.indexOf(m_step->buildToolsVersion()); + buildToolsSdkComboBox->setCurrentIndex(initIdx); + } auto createAndroidTemplatesButton = new QPushButton(Tr::tr("Create Templates")); createAndroidTemplatesButton->setToolTip( From 7b8f274b9e3956a2e8668f932ee9717f96568678 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 6 Mar 2024 10:30:42 +0100 Subject: [PATCH 43/87] Help: Update qlitehtml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Includes layout fixes Fixes: QTCREATORBUG-30459 Change-Id: I561e018f7c99a00048db04643fc3d62c3282e509 Reviewed-by: Robert Löhning --- src/libs/qlitehtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/qlitehtml b/src/libs/qlitehtml index 7e8eb0f5eae..9c7b5d073bf 160000 --- a/src/libs/qlitehtml +++ b/src/libs/qlitehtml @@ -1 +1 @@ -Subproject commit 7e8eb0f5eaee53b0aeb04208bdaba74fcffc3a3f +Subproject commit 9c7b5d073bf4713250648cf7ea35580f489f7fd7 From 1c47a0a301c291b0ec450b7a141c5067d402dac4 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 5 Mar 2024 07:40:28 +0100 Subject: [PATCH 44/87] 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 45/87] 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 46/87] 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 47/87] 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 48/87] 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 49/87] 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 50/87] 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 51/87] 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 52/87] 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 53/87] 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 54/87] 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 55/87] 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 56/87] 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 57/87] 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 58/87] 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 59/87] 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 60/87] 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 61/87] 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 62/87] 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 63/87] 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 64/87] 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 65/87] 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 66/87] 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 67/87] 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 68/87] 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 69/87] 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 70/87] 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 71/87] 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 72/87] 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 73/87] 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 74/87] [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 75/87] 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 76/87] 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 77/87] 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 78/87] 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 79/87] 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 80/87] 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 81/87] 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 82/87] 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 83/87] 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 84/87] 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 85/87] 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 86/87] 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 87/87] 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