`&Q(#HS*
literal 0
HcmV?d00001
diff --git a/src/plugins/extensionmanager/images/packbig@2x.png b/src/plugins/extensionmanager/images/packbig@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..7fb684a9c2a2b9a68da337cd506cc9920cca8f54
GIT binary patch
literal 785
zcmeAS@N?(olHy`uVBq!ia0y~yU~pn!U~u7JU|?VnNZX^yz`%6F)5S3);_%xUz8=z!
zBFEJOcW)C_-FiXn)}E)J1HpFVFcOmy~sqR6t&$)r8O`NSGl-?!6SzsYR0
zuVl8;SSKKFcJ6tp=tAA^Mv68<>l>8Sw(LC}#VPpG;k@OZiBt8Ty*ai)w5r^tt3&a^
z6+2;5uQM-vtR)OWTr{lS$7B?|)o^urx?DZ8tlOhXtJ$FGMp|+j!^TMIiHaPVGPg~c
z-t?Is5|mNOuYI+$=FiGo$9HrKwA}gpSAbcl(S44wL&?E!(^hiuclc~|n6Jm@xIJ)E
zaKzj*HPKZn(i6&8Kiz`yYI-0*nrwfFyiPkbF4
zui1K}qef`W;w52s-rH3LHkGZPGi7p2(}~-C-1{oJS@oo^^WDgL!r`_5XI`h-{jm4x
zTOPht)cAW?o|*5ze%kG;?oXOGnQ<^SXW!9F>Ns)x_Q}^v_hqj$U!;73rRh?|N_{;$
z4qru|uU7?2U1UG*R}>4{su;xmXXBk`y))g9Xgi5;FJ1Q0wzy;OM>U-(3u2@r&Ppg6
zt!ADRb9m83yZINKRi3?Ny6Ca>s9#BjulxxC_RDK8Y%UI5&Gq7~U`0ukyOYw9ebOt}
z{3~V+nyJ`y^k{d2l(OH3Q$cs$vmQNC_<(VmV0&oG3jc^pAB?B&>-fKL&4yc2t&>hQ
z*>znr*p(V_&oD4ug{>mG%Jtd%2f~I2-u=(qb>*mbz@{Qz?z{=?ll~Y6ehc3mIOpgx
xJ^3wD(^(HZcK9UpU3}-+&d#%UrruvPhjBTZs
+
+
+
+
+
+
+
+
+
Date: Sun, 23 Jun 2024 10:23:06 +0300
Subject: [PATCH 17/73] TextEditor: Fix context for editor actions
Amends 411100b0378202dc617acaa236f4730eb4cc43b2.
Fixes: QTCREATORBUG-30748
Change-Id: I6b54e7283df2523e26a6dd186de973a8378a9b2f
Reviewed-by: David Schulz
---
src/plugins/texteditor/texteditorplugin.cpp | 190 ++++++++++----------
1 file changed, 100 insertions(+), 90 deletions(-)
diff --git a/src/plugins/texteditor/texteditorplugin.cpp b/src/plugins/texteditor/texteditorplugin.cpp
index 5db6a17e0d5..5df9de54701 100644
--- a/src/plugins/texteditor/texteditorplugin.cpp
+++ b/src/plugins/texteditor/texteditorplugin.cpp
@@ -304,12 +304,22 @@ void TextEditorPlugin::createStandardContextMenu()
add(Constants::SWITCH_UTF8BOM, Constants::G_BOM);
}
+class TextActionBuilder : public ActionBuilder
+{
+public:
+ TextActionBuilder(QObject *contextActionParent, const Utils::Id actionId)
+ : ActionBuilder(contextActionParent, actionId)
+ {
+ setContext(Context(Constants::C_TEXTEDITOR));
+ }
+};
+
void TextEditorPlugin::createEditorCommands()
{
using namespace Core::Constants;
// Add shortcut for invoking automatic completion
Command *command = nullptr;
- ActionBuilder(this, Constants::COMPLETE_THIS)
+ TextActionBuilder(this, Constants::COMPLETE_THIS)
.setText(Tr::tr("Trigger Completion"))
.bindCommand(&command)
.setDefaultKeySequence(Tr::tr("Meta+Space"), Tr::tr("Ctrl+Space"));
@@ -320,253 +330,253 @@ void TextEditorPlugin::createEditorCommands()
FancyLineEdit::setCompletionShortcut(command->keySequence());
// Add shortcut for invoking function hint completion
- ActionBuilder(this, Constants::FUNCTION_HINT)
+ TextActionBuilder(this, Constants::FUNCTION_HINT)
.setText(Tr::tr("Display Function Hint"))
.setDefaultKeySequence(Tr::tr("Meta+Shift+D"), Tr::tr("Ctrl+Shift+D"));
// Add shortcut for invoking quick fix options
- ActionBuilder(this, Constants::QUICKFIX_THIS)
+ TextActionBuilder(this, Constants::QUICKFIX_THIS)
.setText(Tr::tr("Trigger Refactoring Action"))
.setDefaultKeySequence(Tr::tr("Alt+Return"));
- ActionBuilder(this, Constants::SHOWCONTEXTMENU)
+ TextActionBuilder(this, Constants::SHOWCONTEXTMENU)
.setText(Tr::tr("Show Context Menu"));
- ActionBuilder(this, DELETE_LINE).setText(Tr::tr("Delete &Line"));
- ActionBuilder(this, DELETE_END_OF_LINE).setText(Tr::tr("Delete Line from Cursor On"));
- ActionBuilder(this, DELETE_END_OF_WORD).setText(Tr::tr("Delete Word from Cursor On"));
- ActionBuilder(this, DELETE_END_OF_WORD_CAMEL_CASE)
+ TextActionBuilder(this, DELETE_LINE).setText(Tr::tr("Delete &Line"));
+ TextActionBuilder(this, DELETE_END_OF_LINE).setText(Tr::tr("Delete Line from Cursor On"));
+ TextActionBuilder(this, DELETE_END_OF_WORD).setText(Tr::tr("Delete Word from Cursor On"));
+ TextActionBuilder(this, DELETE_END_OF_WORD_CAMEL_CASE)
.setText(Tr::tr("Delete Word Camel Case from Cursor On"));
- ActionBuilder(this, DELETE_START_OF_LINE)
+ TextActionBuilder(this, DELETE_START_OF_LINE)
.setText(Tr::tr("Delete Line up to Cursor"))
.setDefaultKeySequence(Tr::tr("Ctrl+Backspace"), {});
- ActionBuilder(this, DELETE_START_OF_WORD).setText(Tr::tr("Delete Word up to Cursor"));
- ActionBuilder(this, DELETE_START_OF_WORD_CAMEL_CASE)
+ TextActionBuilder(this, DELETE_START_OF_WORD).setText(Tr::tr("Delete Word up to Cursor"));
+ TextActionBuilder(this, DELETE_START_OF_WORD_CAMEL_CASE)
.setText(Tr::tr("Delete Word Camel Case up to Cursor"));
- ActionBuilder(this, GOTO_BLOCK_START_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_BLOCK_START_WITH_SELECTION)
.setText(Tr::tr("Go to Block Start with Selection"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+{")));
- ActionBuilder(this, GOTO_BLOCK_END_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_BLOCK_END_WITH_SELECTION)
.setText(Tr::tr("Go to Block End with Selection"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+}")));
- ActionBuilder(this, MOVE_LINE_UP)
+ TextActionBuilder(this, MOVE_LINE_UP)
.setText(Tr::tr("Move Line Up"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Shift+Up")));
- ActionBuilder(this, MOVE_LINE_DOWN)
+ TextActionBuilder(this, MOVE_LINE_DOWN)
.setText(Tr::tr("Move Line Down"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Shift+Down")));
- ActionBuilder(this, COPY_LINE_UP)
+ TextActionBuilder(this, COPY_LINE_UP)
.setText(Tr::tr("Copy Line Up"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Alt+Up")));
- ActionBuilder(this, COPY_LINE_DOWN)
+ TextActionBuilder(this, COPY_LINE_DOWN)
.setText(Tr::tr("Copy Line Down"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Alt+Down")));
- ActionBuilder(this, JOIN_LINES)
+ TextActionBuilder(this, JOIN_LINES)
.setText(Tr::tr("Join Lines"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+J")));
- ActionBuilder(this, INSERT_LINE_ABOVE)
+ TextActionBuilder(this, INSERT_LINE_ABOVE)
.setText(Tr::tr("Insert Line Above Current Line"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Shift+Return")));
- ActionBuilder(this, INSERT_LINE_BELOW)
+ TextActionBuilder(this, INSERT_LINE_BELOW)
.setText(Tr::tr("Insert Line Below Current Line"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Return")));
- ActionBuilder(this, SWITCH_UTF8BOM).setText(Tr::tr("Toggle UTF-8 BOM"));
- ActionBuilder(this, INDENT).setText(Tr::tr("Indent"));
- ActionBuilder(this, UNINDENT).setText(Tr::tr("Unindent"));
- ActionBuilder(this, FOLLOW_SYMBOL_UNDER_CURSOR)
+ TextActionBuilder(this, SWITCH_UTF8BOM).setText(Tr::tr("Toggle UTF-8 BOM"));
+ TextActionBuilder(this, INDENT).setText(Tr::tr("Indent"));
+ TextActionBuilder(this, UNINDENT).setText(Tr::tr("Unindent"));
+ TextActionBuilder(this, FOLLOW_SYMBOL_UNDER_CURSOR)
.setText(Tr::tr("Follow Symbol Under Cursor"))
.setDefaultKeySequence(QKeySequence(Qt::Key_F2));
- ActionBuilder(this, FOLLOW_SYMBOL_UNDER_CURSOR_IN_NEXT_SPLIT)
+ TextActionBuilder(this, FOLLOW_SYMBOL_UNDER_CURSOR_IN_NEXT_SPLIT)
.setText(Tr::tr("Follow Symbol Under Cursor in Next Split"))
.setDefaultKeySequence(Tr::tr("Meta+E, F2"), Tr::tr("Ctrl+E, F2"));
- ActionBuilder(this, FOLLOW_SYMBOL_TO_TYPE)
+ TextActionBuilder(this, FOLLOW_SYMBOL_TO_TYPE)
.setText(Tr::tr("Follow Type Under Cursor"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Shift+F2")));
- ActionBuilder(this, FOLLOW_SYMBOL_TO_TYPE_IN_NEXT_SPLIT)
+ TextActionBuilder(this, FOLLOW_SYMBOL_TO_TYPE_IN_NEXT_SPLIT)
.setText(Tr::tr("Follow Type Under Cursor in Next Split"))
.setDefaultKeySequence(Tr::tr("Meta+E, Shift+F2"), Tr::tr("Ctrl+E, Ctrl+Shift+F2"));
- ActionBuilder(this, FIND_USAGES)
+ TextActionBuilder(this, FIND_USAGES)
.setText(Tr::tr("Find References to Symbol Under Cursor"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Shift+U")));
- ActionBuilder(this, RENAME_SYMBOL)
+ TextActionBuilder(this, RENAME_SYMBOL)
.setText(Tr::tr("Rename Symbol Under Cursor"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Shift+R")));
- ActionBuilder(this, JUMP_TO_FILE_UNDER_CURSOR)
+ TextActionBuilder(this, JUMP_TO_FILE_UNDER_CURSOR)
.setText(Tr::tr("Jump to File Under Cursor"))
.setDefaultKeySequence(QKeySequence(Qt::Key_F2));
- ActionBuilder(this, JUMP_TO_FILE_UNDER_CURSOR_IN_NEXT_SPLIT)
+ TextActionBuilder(this, JUMP_TO_FILE_UNDER_CURSOR_IN_NEXT_SPLIT)
.setText(Tr::tr("Jump to File Under Cursor in Next Split"))
.setDefaultKeySequence(Tr::tr("Meta+E, F2"), Tr::tr("Ctrl+E, F2"));
- ActionBuilder(this, OPEN_CALL_HIERARCHY).setText(Tr::tr("Open Call Hierarchy"));
- ActionBuilder(this, OPEN_TYPE_HIERARCHY)
+ TextActionBuilder(this, OPEN_CALL_HIERARCHY).setText(Tr::tr("Open Call Hierarchy"));
+ TextActionBuilder(this, OPEN_TYPE_HIERARCHY)
.setText(Tr::tr("Open Type Hierarchy"))
.setDefaultKeySequence(Tr::tr("Meta+Shift+T"), Tr::tr("Ctrl+Shift+T"));
- ActionBuilder(this, VIEW_PAGE_UP)
+ TextActionBuilder(this, VIEW_PAGE_UP)
.setText(Tr::tr("Move the View a Page Up and Keep the Cursor Position"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+PgUp")));
- ActionBuilder(this, VIEW_PAGE_DOWN)
+ TextActionBuilder(this, VIEW_PAGE_DOWN)
.setText(Tr::tr("Move the View a Page Down and Keep the Cursor Position"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+PgDown")));
- ActionBuilder(this, VIEW_LINE_UP)
+ TextActionBuilder(this, VIEW_LINE_UP)
.setText(Tr::tr("Move the View a Line Up and Keep the Cursor Position"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Up")));
- ActionBuilder(this, VIEW_LINE_DOWN)
+ TextActionBuilder(this, VIEW_LINE_DOWN)
.setText(Tr::tr("Move the View a Line Down and Keep the Cursor Position"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Down")));
ActionManager::actionContainer(M_EDIT);
- ActionBuilder(this, SELECT_ENCODING)
+ TextActionBuilder(this, SELECT_ENCODING)
.setText(Tr::tr("Select Encoding..."))
.addToContainer(M_EDIT, G_EDIT_OTHER);
- ActionBuilder(this, CIRCULAR_PASTE)
+ TextActionBuilder(this, CIRCULAR_PASTE)
.setText(Tr::tr("Paste from Clipboard History"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Shift+V")))
.addToContainer(M_EDIT, G_EDIT_COPYPASTE);
- ActionBuilder(this, NO_FORMAT_PASTE)
+ TextActionBuilder(this, NO_FORMAT_PASTE)
.setText(Tr::tr("Paste Without Formatting"))
.setDefaultKeySequence(Tr::tr("Ctrl+Alt+Shift+V"), QString())
.addToContainer(M_EDIT, G_EDIT_COPYPASTE);
ActionManager::actionContainer(M_EDIT_ADVANCED);
- ActionBuilder(this, AUTO_INDENT_SELECTION)
+ TextActionBuilder(this, AUTO_INDENT_SELECTION)
.setText(Tr::tr("Auto-&indent Selection"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+I")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_FORMAT);
- ActionBuilder(this, AUTO_FORMAT_SELECTION)
+ TextActionBuilder(this, AUTO_FORMAT_SELECTION)
.setText(Tr::tr("Auto-&format Selection"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+;")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_FORMAT);
- ActionBuilder(this, REWRAP_PARAGRAPH)
+ TextActionBuilder(this, REWRAP_PARAGRAPH)
.setText(Tr::tr("&Rewrap Paragraph"))
.setDefaultKeySequence(Tr::tr("Meta+E, R"), Tr::tr("Ctrl+E, R"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_FORMAT);
- ActionBuilder(this, VISUALIZE_WHITESPACE)
+ TextActionBuilder(this, VISUALIZE_WHITESPACE)
.setText(Tr::tr("&Visualize Whitespace"))
.setDefaultKeySequence(Tr::tr("Meta+E, Meta+V"), Tr::tr("Ctrl+E, Ctrl+V"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_FORMAT);
- ActionBuilder(this, CLEAN_WHITESPACE)
+ TextActionBuilder(this, CLEAN_WHITESPACE)
.setText(Tr::tr("Clean Whitespace"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_FORMAT);
- ActionBuilder(this, TEXT_WRAPPING)
+ TextActionBuilder(this, TEXT_WRAPPING)
.setText(Tr::tr("Enable Text &Wrapping"))
.setDefaultKeySequence(Tr::tr("Meta+E, Meta+W"), Tr::tr("Ctrl+E, Ctrl+W"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_FORMAT)
.setCheckable(true);
- ActionBuilder(this, UN_COMMENT_SELECTION)
+ TextActionBuilder(this, UN_COMMENT_SELECTION)
.setText(Tr::tr("Toggle Comment &Selection"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+/")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_FORMAT);
- ActionBuilder(this, CUT_LINE)
+ TextActionBuilder(this, CUT_LINE)
.setText(Tr::tr("Cut &Line"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Shift+Del")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_TEXT);
- ActionBuilder(this, COPY_LINE)
+ TextActionBuilder(this, COPY_LINE)
.setText(Tr::tr("Copy &Line"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Ins")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_TEXT);
- ActionBuilder(this, COPY_WITH_HTML)
+ TextActionBuilder(this, COPY_WITH_HTML)
.setText(Tr::tr("Copy With Highlighting"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_TEXT);
- ActionBuilder(this, ADD_CURSORS_TO_LINE_ENDS)
+ TextActionBuilder(this, ADD_CURSORS_TO_LINE_ENDS)
.setText(Tr::tr("Create Cursors at Selected Line Ends"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Alt+Shift+I")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_TEXT);
- ActionBuilder(this, ADD_SELECT_NEXT_FIND_MATCH)
+ TextActionBuilder(this, ADD_SELECT_NEXT_FIND_MATCH)
.setText(Tr::tr("Add Next Occurrence to Selection"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+D")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_TEXT);
- ActionBuilder(this, DUPLICATE_SELECTION)
+ TextActionBuilder(this, DUPLICATE_SELECTION)
.setText(Tr::tr("&Duplicate Selection"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_TEXT);
- ActionBuilder(this, DUPLICATE_SELECTION_AND_COMMENT)
+ TextActionBuilder(this, DUPLICATE_SELECTION_AND_COMMENT)
.setText(Tr::tr("&Duplicate Selection and Comment"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_TEXT);
- ActionBuilder(this, UPPERCASE_SELECTION)
+ TextActionBuilder(this, UPPERCASE_SELECTION)
.setText(Tr::tr("Uppercase Selection"))
.setDefaultKeySequence(Tr::tr("Meta+Shift+U"), Tr::tr("Alt+Shift+U"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_TEXT);
- ActionBuilder(this, LOWERCASE_SELECTION)
+ TextActionBuilder(this, LOWERCASE_SELECTION)
.setText(Tr::tr("Lowercase Selection"))
.setDefaultKeySequence(Tr::tr("Meta+U"), Tr::tr("Alt+U"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_TEXT);
- ActionBuilder(this, SORT_LINES)
+ TextActionBuilder(this, SORT_LINES)
.setText(Tr::tr("Sort Lines"))
.setDefaultKeySequence(Tr::tr("Meta+Shift+S"), Tr::tr("Alt+Shift+S"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_TEXT);
- ActionBuilder(this, FOLD)
+ TextActionBuilder(this, FOLD)
.setText(Tr::tr("Fold"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+<")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_COLLAPSING);
- ActionBuilder(this, UNFOLD)
+ TextActionBuilder(this, UNFOLD)
.setText(Tr::tr("Unfold"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+>")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_COLLAPSING);
- ActionBuilder(this, UNFOLD_ALL)
+ TextActionBuilder(this, UNFOLD_ALL)
.setText(Tr::tr("Toggle &Fold All"))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_COLLAPSING);
- ActionBuilder(this, INCREASE_FONT_SIZE)
+ TextActionBuilder(this, INCREASE_FONT_SIZE)
.setText(Tr::tr("Increase Font Size"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl++")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_FONT);
- ActionBuilder(this, DECREASE_FONT_SIZE)
+ TextActionBuilder(this, DECREASE_FONT_SIZE)
.setText(Tr::tr("Decrease Font Size"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+-")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_FONT);
- ActionBuilder(this, RESET_FONT_SIZE)
+ TextActionBuilder(this, RESET_FONT_SIZE)
.setText(Tr::tr("Reset Font Size"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+0")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_FONT);
- ActionBuilder(this, GOTO_BLOCK_START)
+ TextActionBuilder(this, GOTO_BLOCK_START)
.setText(Tr::tr("Go to Block Start"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+[")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_BLOCKS);
- ActionBuilder(this, GOTO_BLOCK_END)
+ TextActionBuilder(this, GOTO_BLOCK_END)
.setText(Tr::tr("Go to Block End"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+]")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_BLOCKS);
- ActionBuilder(this, SELECT_BLOCK_UP)
+ TextActionBuilder(this, SELECT_BLOCK_UP)
.setText(Tr::tr("Select Block Up"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+U")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_BLOCKS);
- ActionBuilder(this, SELECT_BLOCK_DOWN)
+ TextActionBuilder(this, SELECT_BLOCK_DOWN)
.setText(Tr::tr("Select Block Down"))
.setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Shift+Alt+U")))
.addToContainer(M_EDIT_ADVANCED, G_EDIT_BLOCKS);
- ActionBuilder(this, SELECT_WORD_UNDER_CURSOR).setText(Tr::tr("Select Word Under Cursor"));
+ TextActionBuilder(this, SELECT_WORD_UNDER_CURSOR).setText(Tr::tr("Select Word Under Cursor"));
- ActionBuilder(this, GOTO_DOCUMENT_START).setText(Tr::tr("Go to Document Start"));
- ActionBuilder(this, GOTO_DOCUMENT_END).setText(Tr::tr("Go to Document End"));
- ActionBuilder(this, GOTO_LINE_START).setText(Tr::tr("Go to Line Start"));
- ActionBuilder(this, GOTO_LINE_END).setText(Tr::tr("Go to Line End"));
- ActionBuilder(this, GOTO_NEXT_LINE).setText(Tr::tr("Go to Next Line"));
- ActionBuilder(this, GOTO_PREVIOUS_LINE).setText(Tr::tr("Go to Previous Line"));
- ActionBuilder(this, GOTO_PREVIOUS_CHARACTER).setText(Tr::tr("Go to Previous Character"));
- ActionBuilder(this, GOTO_NEXT_CHARACTER).setText(Tr::tr("Go to Next Character"));
- ActionBuilder(this, GOTO_PREVIOUS_WORD).setText(Tr::tr("Go to Previous Word"));
- ActionBuilder(this, GOTO_NEXT_WORD).setText(Tr::tr("Go to Next Word"));
- ActionBuilder(this, GOTO_PREVIOUS_WORD_CAMEL_CASE)
+ TextActionBuilder(this, GOTO_DOCUMENT_START).setText(Tr::tr("Go to Document Start"));
+ TextActionBuilder(this, GOTO_DOCUMENT_END).setText(Tr::tr("Go to Document End"));
+ TextActionBuilder(this, GOTO_LINE_START).setText(Tr::tr("Go to Line Start"));
+ TextActionBuilder(this, GOTO_LINE_END).setText(Tr::tr("Go to Line End"));
+ TextActionBuilder(this, GOTO_NEXT_LINE).setText(Tr::tr("Go to Next Line"));
+ TextActionBuilder(this, GOTO_PREVIOUS_LINE).setText(Tr::tr("Go to Previous Line"));
+ TextActionBuilder(this, GOTO_PREVIOUS_CHARACTER).setText(Tr::tr("Go to Previous Character"));
+ TextActionBuilder(this, GOTO_NEXT_CHARACTER).setText(Tr::tr("Go to Next Character"));
+ TextActionBuilder(this, GOTO_PREVIOUS_WORD).setText(Tr::tr("Go to Previous Word"));
+ TextActionBuilder(this, GOTO_NEXT_WORD).setText(Tr::tr("Go to Next Word"));
+ TextActionBuilder(this, GOTO_PREVIOUS_WORD_CAMEL_CASE)
.setText(Tr::tr("Go to Previous Word (Camel Case)"));
- ActionBuilder(this, GOTO_NEXT_WORD_CAMEL_CASE).setText(Tr::tr("Go to Next Word (Camel Case)"));
+ TextActionBuilder(this, GOTO_NEXT_WORD_CAMEL_CASE).setText(Tr::tr("Go to Next Word (Camel Case)"));
- ActionBuilder(this, GOTO_LINE_START_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_LINE_START_WITH_SELECTION)
.setText(Tr::tr("Go to Line Start with Selection"));
- ActionBuilder(this, GOTO_LINE_END_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_LINE_END_WITH_SELECTION)
.setText(Tr::tr("Go to Line End with Selection"));
- ActionBuilder(this, GOTO_NEXT_LINE_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_NEXT_LINE_WITH_SELECTION)
.setText(Tr::tr("Go to Next Line with Selection"));
- ActionBuilder(this, GOTO_PREVIOUS_LINE_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_PREVIOUS_LINE_WITH_SELECTION)
.setText(Tr::tr("Go to Previous Line with Selection"));
- ActionBuilder(this, GOTO_PREVIOUS_CHARACTER_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_PREVIOUS_CHARACTER_WITH_SELECTION)
.setText(Tr::tr("Go to Previous Character with Selection"));
- ActionBuilder(this, GOTO_NEXT_CHARACTER_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_NEXT_CHARACTER_WITH_SELECTION)
.setText(Tr::tr("Go to Next Character with Selection"));
- ActionBuilder(this, GOTO_PREVIOUS_WORD_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_PREVIOUS_WORD_WITH_SELECTION)
.setText(Tr::tr("Go to Previous Word with Selection"));
- ActionBuilder(this, GOTO_NEXT_WORD_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_NEXT_WORD_WITH_SELECTION)
.setText(Tr::tr("Go to Next Word with Selection"));
- ActionBuilder(this, GOTO_PREVIOUS_WORD_CAMEL_CASE_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_PREVIOUS_WORD_CAMEL_CASE_WITH_SELECTION)
.setText(Tr::tr("Go to Previous Word (Camel Case) with Selection"));
- ActionBuilder(this, GOTO_NEXT_WORD_CAMEL_CASE_WITH_SELECTION)
+ TextActionBuilder(this, GOTO_NEXT_WORD_CAMEL_CASE_WITH_SELECTION)
.setText(Tr::tr("Go to Next Word (Camel Case) with Selection"));
}
From 64a9da8114b265d5dbc966330b57db9a77b87612 Mon Sep 17 00:00:00 2001
From: Eike Ziller
Date: Fri, 21 Jun 2024 15:02:43 +0200
Subject: [PATCH 18/73] COIN: Switch sdktool to Qt 6
Change-Id: I638c0b385a27e1e5b036102330b8f5a80899343c
Reviewed-by: Eike Ziller
---
coin/instructions/build.yaml | 6 +++---
coin/instructions/common_environment.yaml | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/coin/instructions/build.yaml b/coin/instructions/build.yaml
index e4453c9e71b..23ec37b4d6c 100644
--- a/coin/instructions/build.yaml
+++ b/coin/instructions/build.yaml
@@ -42,7 +42,7 @@ instructions:
- type: ChangeDirectory
directory: "{{.AgentWorkingDir}}/build/tqtc-qtsdk/packaging_tools"
- type: ExecuteCommand
- command: "python3 -m pipenv run python -u bld_sdktool.py --qt-url {{.Env.QTC_SDKTOOL_QT_BASE_URL}}{{.Env.QTC_SDKTOOL_QT_EXT}} --qt-build {{.AgentWorkingDir}}/build/sdktool/qt --src {{.AgentWorkingDir}}/qt-creator/qt-creator/src/tools/sdktool --build {{.AgentWorkingDir}}/build/sdktool/build --install {{.AgentWorkingDir}}/build/sdktool/install --make-command make"
+ command: "python3 -m pipenv run python -u bld_sdktool.py --qt-url {{.Env.QTC_SDKTOOL_QT_BASE_URL}}{{.Env.QTC_SDKTOOL_QT_EXT}} --qt-build {{.AgentWorkingDir}}/build/sdktool/qt --src {{.AgentWorkingDir}}/qt-creator/qt-creator/src/tools/sdktool --build {{.AgentWorkingDir}}/build/sdktool/build --install {{.AgentWorkingDir}}/build/sdktool/install --make-command ninja"
maxTimeInSeconds: 36000
maxTimeBetweenOutput: 3600
userMessageOnFailure: "Failed to build sdktool, check logs."
@@ -79,7 +79,7 @@ instructions:
variableName: MACOSX_DEPLOYMENT_TARGET
variableValue: "{{.Env.SDKTOOL_MACOSX_DEPLOYMENT_TARGET}}"
- type: ExecuteCommand
- command: "python3 -m pipenv run python -u bld_sdktool.py --qt-url {{.Env.QTC_SDKTOOL_QT_BASE_URL}}{{.Env.QTC_SDKTOOL_QT_EXT}} --qt-build {{.AgentWorkingDir}}/build/sdktool/qt --src {{.AgentWorkingDir}}/qt-creator/qt-creator/src/tools/sdktool --build {{.AgentWorkingDir}}/build/sdktool/build --install {{.AgentWorkingDir}}/build/sdktool/install --make-command make"
+ command: "python3 -m pipenv run python -u bld_sdktool.py --qt-url {{.Env.QTC_SDKTOOL_QT_BASE_URL}}{{.Env.QTC_SDKTOOL_QT_EXT}} --qt-build {{.AgentWorkingDir}}/build/sdktool/qt --src {{.AgentWorkingDir}}/qt-creator/qt-creator/src/tools/sdktool --build {{.AgentWorkingDir}}/build/sdktool/build --install {{.AgentWorkingDir}}/build/sdktool/install --make-command ninja --universal"
maxTimeInSeconds: 36000
maxTimeBetweenOutput: 3600
userMessageOnFailure: "Failed to build sdktool, check logs."
@@ -128,7 +128,7 @@ instructions:
- type: ChangeDirectory
directory: "{{.AgentWorkingDir}}\\build\\tqtc-qtsdk\\packaging_tools"
- type: ExecuteCommand
- command: "python -m pipenv run python -u bld_sdktool.py --qt-url {{.Env.QTC_SDKTOOL_QT_BASE_URL}}{{.Env.QTC_SDKTOOL_QT_EXT}} --qt-build {{.AgentWorkingDir}}\\build\\sdktool\\qt --src {{.AgentWorkingDir}}\\qt-creator\\qt-creator\\src\\tools\\sdktool --build {{.AgentWorkingDir}}\\build\\sdktool\\build --install {{.AgentWorkingDir}}\\build\\sdktool\\install --make-command nmake"
+ command: "python -m pipenv run python -u bld_sdktool.py --qt-url {{.Env.QTC_SDKTOOL_QT_BASE_URL}}{{.Env.QTC_SDKTOOL_QT_EXT}} --qt-build {{.AgentWorkingDir}}\\build\\sdktool\\qt --src {{.AgentWorkingDir}}\\qt-creator\\qt-creator\\src\\tools\\sdktool --build {{.AgentWorkingDir}}\\build\\sdktool\\build --install {{.AgentWorkingDir}}\\build\\sdktool\\install --make-command ninja"
maxTimeInSeconds: 36000
maxTimeBetweenOutput: 3600
userMessageOnFailure: "Failed to build sdktool, check logs."
diff --git a/coin/instructions/common_environment.yaml b/coin/instructions/common_environment.yaml
index bed851d11ed..22d53d03e2a 100644
--- a/coin/instructions/common_environment.yaml
+++ b/coin/instructions/common_environment.yaml
@@ -19,10 +19,10 @@ instructions:
variableValue: 11.0
- type: EnvironmentVariable
variableName: SDKTOOL_MACOSX_DEPLOYMENT_TARGET
- variableValue: 10.14
+ variableValue: 11.0
- type: EnvironmentVariable
variableName: QTC_SDKTOOL_QT_BASE_URL
- variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/5.15/5.15.2-final-released/latest/src/submodules/qtbase-everywhere-src-5.15.2"
+ variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.6/6.6.0-released/Qt/src/submodules/qtbase-everywhere-src-6.6.0"
- type: Group
instructions:
- type: EnvironmentVariable
From 4f1cc1ff310caf6296b7a4fc671157ffaaf7be1c Mon Sep 17 00:00:00 2001
From: David Schulz
Date: Mon, 24 Jun 2024 14:24:02 +0200
Subject: [PATCH 19/73] Core: fix direction of Ctrl+N/P/Up/Down
Additionally accept the shortcut override events in order to block other
potential shortcuts from interfering with the selection of the open
document.
amends e6299f510d44b5b57913026da3625ded316d848b
amends 03e35aac14c8ee2d9531297b658b4106b11c303b
Task-number: QTCREATORBUG-31072
Change-Id: Idfd65b92a84f5be39f9a01da68e8046ae5304733
Reviewed-by: Eike Ziller
---
.../editormanager/openeditorswindow.cpp | 33 ++++++++++---------
1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
index 0967fb16e6e..172b54570e1 100644
--- a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
+++ b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
@@ -165,34 +165,35 @@ bool OpenEditorsWindow::eventFilter(QObject *obj, QEvent *e)
auto ke = static_cast(e);
switch (ke->key()) {
case Qt::Key_Up:
- selectPreviousEditor();
+ case Qt::Key_P:
+ e->accept();
return true;
case Qt::Key_Down:
- selectNextEditor();
- return true;
- case Qt::Key_P:
case Qt::Key_N:
- if (ke->modifiers() == Qt::KeyboardModifiers(HostOsInfo::controlModifier())) {
- if (ke->key() == Qt::Key_P)
- selectPreviousEditor();
- else
- selectNextEditor();
- return true;
- }
- break;
+ e->accept();
+ return true;
}
}
if (e->type() == QEvent::KeyPress) {
auto ke = static_cast(e);
- if (ke->key() == Qt::Key_Escape) {
+ switch (ke->key()) {
+ case Qt::Key_Up:
+ case Qt::Key_P:
+ selectNextEditor();
+ return true;
+ case Qt::Key_Down:
+ case Qt::Key_N:
+ selectPreviousEditor();
+ return true;
+ case Qt::Key_Escape:
setVisible(false);
return true;
- }
- if (ke->key() == Qt::Key_Return
- || ke->key() == Qt::Key_Enter) {
+ case Qt::Key_Return:
+ case Qt::Key_Enter:
selectEditor(m_editorView->currentItem());
return true;
}
+
} else if (e->type() == QEvent::KeyRelease) {
auto ke = static_cast(e);
if (ke->modifiers() == 0
From 38fc03cc3bf1a005180f7a8d6d9f6fedd0f86a65 Mon Sep 17 00:00:00 2001
From: Eike Ziller
Date: Mon, 24 Jun 2024 13:51:50 +0200
Subject: [PATCH 20/73] COIN: Do not specify full path to 7zip
It is in the PATH, and the full path makes
changing platforms/VMs harder (like updating to ARM Macs)
Change-Id: I3b4a3208aa066e8000321d6a548b9559c249dc5e
Reviewed-by: Eike Ziller
---
coin/instructions/build.yaml | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/coin/instructions/build.yaml b/coin/instructions/build.yaml
index 23ec37b4d6c..b98cfbafbcc 100644
--- a/coin/instructions/build.yaml
+++ b/coin/instructions/build.yaml
@@ -20,7 +20,7 @@ instructions:
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to download elfutils package, check logs."
- type: ExecuteCommand
- command: "/usr/bin/7z x -y {{.AgentWorkingDir}}/build/qt_temp/elfutils-release_0.175qt-linux-x86_64.7z -o{{.AgentWorkingDir}}/build/qt_temp/elfutils"
+ command: "7z x -y {{.AgentWorkingDir}}/build/qt_temp/elfutils-release_0.175qt-linux-x86_64.7z -o{{.AgentWorkingDir}}/build/qt_temp/elfutils"
maxTimeInSeconds: 3600
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to extract elfutils package, check logs."
@@ -30,7 +30,7 @@ instructions:
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to download LLVM package, check logs."
- type: ExecuteCommand
- command: "/usr/bin/7z x -y {{.AgentWorkingDir}}/build/qt_temp/libclang.7z -o{{.AgentWorkingDir}}/build/qt_temp/"
+ command: "7z x -y {{.AgentWorkingDir}}/build/qt_temp/libclang.7z -o{{.AgentWorkingDir}}/build/qt_temp/"
maxTimeInSeconds: 3600
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to extract LLVM package, check logs."
@@ -64,7 +64,7 @@ instructions:
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to download LLVM package, check logs."
- type: ExecuteCommand
- command: "/usr/local/bin/7z x -y {{.AgentWorkingDir}}/build/qt_temp/libclang.7z -o{{.AgentWorkingDir}}/build/qt_temp/"
+ command: "7z x -y {{.AgentWorkingDir}}/build/qt_temp/libclang.7z -o{{.AgentWorkingDir}}/build/qt_temp/"
maxTimeInSeconds: 3600
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to extract LLVM package, check logs."
@@ -96,7 +96,7 @@ instructions:
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to download elfutils package, check logs."
- type: ExecuteCommand
- command: "C:\\Utils\\sevenzip\\7z.exe x -y {{.AgentWorkingDir}}\\build\\qt_temp\\elfutils-release_0.175qt-windows-x86_64.7z -o{{.AgentWorkingDir}}\\build\\qt_temp\\elfutils"
+ command: "7z.exe x -y {{.AgentWorkingDir}}\\build\\qt_temp\\elfutils-release_0.175qt-windows-x86_64.7z -o{{.AgentWorkingDir}}\\build\\qt_temp\\elfutils"
maxTimeInSeconds: 3600
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to extract elfutils package, check logs."
@@ -106,7 +106,7 @@ instructions:
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to download python package, check logs."
- type: ExecuteCommand
- command: "C:\\Utils\\sevenzip\\7z.exe x -y {{.AgentWorkingDir}}\\build\\qt_temp\\Python38-win-x64.7z -o{{.AgentWorkingDir}}\\build\\qt_temp\\python"
+ command: "7z.exe x -y {{.AgentWorkingDir}}\\build\\qt_temp\\Python38-win-x64.7z -o{{.AgentWorkingDir}}\\build\\qt_temp\\python"
maxTimeInSeconds: 3600
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to extract python package, check logs."
@@ -116,7 +116,7 @@ instructions:
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to download LLVM package, check logs."
- type: ExecuteCommand
- command: "C:\\Utils\\sevenzip\\7z.exe x -y {{.AgentWorkingDir}}\\build\\qt_temp\\libclang.7z -o{{.AgentWorkingDir}}\\build\\qt_temp\\"
+ command: "7z.exe x -y {{.AgentWorkingDir}}\\build\\qt_temp\\libclang.7z -o{{.AgentWorkingDir}}\\build\\qt_temp\\"
maxTimeInSeconds: 3600
maxTimeBetweenOutput: 360
userMessageOnFailure: "Failed to extract LLVM package, check logs."
From 7ffcbe541b87bc9977ba2cb14d6b48df717e7e11 Mon Sep 17 00:00:00 2001
From: Jarek Kobus
Date: Wed, 19 Jun 2024 13:17:11 +0200
Subject: [PATCH 21/73] TreeScanner: Inline scanForFiles() method
Make scanForFiles() a non-template method and hide it
in treescanner.cpp. Inline scanForFilesRecursively().
Change-Id: I10e07f190e1a4a65cd7045c625a364350964afb9
Reviewed-by: David Schulz
---
src/plugins/projectexplorer/CMakeLists.txt | 1 -
.../projectexplorer/projectexplorer.qbs | 1 -
.../projectexplorer/projectnodeshelper.h | 141 ------------------
src/plugins/projectexplorer/treescanner.cpp | 111 +++++++++++++-
src/plugins/projectexplorer/treescanner.h | 2 +-
5 files changed, 107 insertions(+), 149 deletions(-)
delete mode 100644 src/plugins/projectexplorer/projectnodeshelper.h
diff --git a/src/plugins/projectexplorer/CMakeLists.txt b/src/plugins/projectexplorer/CMakeLists.txt
index ea7a079d908..0c62d2177a1 100644
--- a/src/plugins/projectexplorer/CMakeLists.txt
+++ b/src/plugins/projectexplorer/CMakeLists.txt
@@ -140,7 +140,6 @@ add_qtc_plugin(ProjectExplorer
projectmanager.cpp projectmanager.h
projectmodels.cpp projectmodels.h
projectnodes.cpp projectnodes.h
- projectnodeshelper.h
projectpanelfactory.cpp projectpanelfactory.h
projectsettingswidget.cpp projectsettingswidget.h
projecttree.cpp projecttree.h
diff --git a/src/plugins/projectexplorer/projectexplorer.qbs b/src/plugins/projectexplorer/projectexplorer.qbs
index 19b9221de2b..bce24dc1361 100644
--- a/src/plugins/projectexplorer/projectexplorer.qbs
+++ b/src/plugins/projectexplorer/projectexplorer.qbs
@@ -115,7 +115,6 @@ QtcPlugin {
"projectmanager.cpp", "projectmanager.h",
"projectmodels.cpp", "projectmodels.h",
"projectnodes.cpp", "projectnodes.h",
- "projectnodeshelper.h",
"projectpanelfactory.cpp", "projectpanelfactory.h",
"projectsettingswidget.cpp", "projectsettingswidget.h",
"projecttree.cpp",
diff --git a/src/plugins/projectexplorer/projectnodeshelper.h b/src/plugins/projectexplorer/projectnodeshelper.h
deleted file mode 100644
index 37b015ec321..00000000000
--- a/src/plugins/projectexplorer/projectnodeshelper.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2021 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
-
-#pragma once
-
-#include "projectnodes.h"
-
-#include
-#include
-
-#include
-
-#include
-#include
-#include
-#include
-
-#include
-
-namespace ProjectExplorer {
-namespace Internal {
-
-struct DirectoryScanResult
-{
- QList nodes;
- Utils::FilePaths subDirectories;
-};
-
-static DirectoryScanResult scanForFiles(
- const QFuture &future,
- const Utils::FilePath &directory,
- QDir::Filters filter,
- const std::function &factory,
- const QList &versionControls)
-{
- DirectoryScanResult result;
-
- const Utils::FilePaths entries = directory.dirEntries(filter);
- for (const Utils::FilePath &entry : entries) {
- if (future.isCanceled())
- return result;
-
- if (Utils::anyOf(versionControls, [entry](const Core::IVersionControl *vc) {
- return vc->isVcsFileOrDirectory(entry);
- })) {
- continue;
- }
-
- if (entry.isDir())
- result.subDirectories.append(entry);
- else if (FileNode *node = factory(entry))
- result.nodes.append(node);
- }
- return result;
-}
-
-template
-QList scanForFilesRecursively(
- QPromise &promise,
- int progressRange,
- const Utils::FilePath &directory,
- QDir::Filters filter,
- const std::function &factory,
- const QList &versionControls)
-{
- const QFuture future(promise.future());
-
- QSet visited;
- const DirectoryScanResult result
- = scanForFiles(future, directory, filter, factory, versionControls);
- QList fileNodes = result.nodes;
- const int progressIncrement = int(
- progressRange / static_cast(fileNodes.count() + result.subDirectories.count()));
- promise.setProgressValue(int(fileNodes.count() * progressIncrement));
- QList> subDirectories;
- auto addSubDirectories = [&](const Utils::FilePaths &subdirs, int progressIncrement) {
- for (const Utils::FilePath &subdir : subdirs) {
- if (Utils::insert(visited, subdir.canonicalPath()))
- subDirectories.append(qMakePair(subdir, progressIncrement));
- else
- promise.setProgressValue(promise.future().progressValue() + progressIncrement);
- }
- };
- addSubDirectories(result.subDirectories, progressIncrement);
-
- while (!subDirectories.isEmpty()) {
- using namespace Tasking;
- const LoopList iterator(subDirectories);
- subDirectories.clear();
-
- auto onSetup = [&, iterator](Utils::Async &task) {
- task.setConcurrentCallData(
- scanForFiles, future, iterator->first, filter, factory, versionControls);
- };
-
- auto onDone = [&, iterator](const Utils::Async &task) {
- const int progressRange = iterator->second;
- const DirectoryScanResult result = task.result();
- fileNodes.append(result.nodes);
- const qsizetype subDirCount = result.subDirectories.count();
- if (subDirCount == 0) {
- promise.setProgressValue(promise.future().progressValue() + progressRange);
- } else {
- const qsizetype fileCount = result.nodes.count();
- const int increment = int(
- progressRange / static_cast(fileCount + subDirCount));
- promise.setProgressValue(
- promise.future().progressValue() + increment * fileCount);
- addSubDirectories(result.subDirectories, increment);
- }
- };
-
- const Group group{
- Utils::HostOsInfo::isLinuxHost() ? parallelLimit(2) : parallelIdealThreadCountLimit,
- iterator,
- Utils::AsyncTask(onSetup, onDone)
- };
- TaskTree::runBlocking(group);
- }
- return fileNodes;
-}
-
-} // namespace Internal
-
-template
-QList scanForFiles(
- QPromise &promise,
- const Utils::FilePath &directory,
- QDir::Filters filter,
- const std::function &factory)
-{
- promise.setProgressRange(0, 1000000);
- return Internal::scanForFilesRecursively(promise,
- 1000000,
- directory,
- filter,
- factory,
- Core::VcsManager::versionControls());
-}
-
-} // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/treescanner.cpp b/src/plugins/projectexplorer/treescanner.cpp
index 49680621ec2..4411184c923 100644
--- a/src/plugins/projectexplorer/treescanner.cpp
+++ b/src/plugins/projectexplorer/treescanner.cpp
@@ -3,15 +3,17 @@
#include "treescanner.h"
-#include "projectnodeshelper.h"
#include "projecttree.h"
#include
#include
-#include
-#include
+#include
+
#include
+#include
+#include
+#include
#include
@@ -146,14 +148,113 @@ static std::unique_ptr createFolderNode(const Utils::FilePath &direc
return fileSystemNode;
}
+struct DirectoryScanResult
+{
+ QList nodes;
+ Utils::FilePaths subDirectories;
+};
+
+static DirectoryScanResult scanForFilesImpl(
+ const QFuture &future,
+ const Utils::FilePath &directory,
+ QDir::Filters filter,
+ const std::function &factory,
+ const QList &versionControls)
+{
+ DirectoryScanResult result;
+
+ const Utils::FilePaths entries = directory.dirEntries(filter);
+ for (const Utils::FilePath &entry : entries) {
+ if (future.isCanceled())
+ return result;
+
+ if (Utils::anyOf(versionControls, [entry](const Core::IVersionControl *vc) {
+ return vc->isVcsFileOrDirectory(entry);
+ })) {
+ continue;
+ }
+
+ if (entry.isDir())
+ result.subDirectories.append(entry);
+ else if (FileNode *node = factory(entry))
+ result.nodes.append(node);
+ }
+ return result;
+}
+
+static QList scanForFilesHelper(
+ TreeScanner::Promise &promise,
+ const Utils::FilePath &directory,
+ QDir::Filters filter,
+ const std::function &factory)
+{
+ const QFuture future(promise.future());
+
+ const int progressRange = 1000000;
+ const QList &versionControls = Core::VcsManager::versionControls();
+ promise.setProgressRange(0, progressRange);
+
+ QSet visited;
+ const DirectoryScanResult result = scanForFilesImpl(future, directory, filter, factory, versionControls);
+ QList fileNodes = result.nodes;
+ const int progressIncrement = int(
+ progressRange / static_cast(fileNodes.count() + result.subDirectories.count()));
+ promise.setProgressValue(int(fileNodes.count() * progressIncrement));
+ QList> subDirectories;
+ auto addSubDirectories = [&](const Utils::FilePaths &subdirs, int progressIncrement) {
+ for (const Utils::FilePath &subdir : subdirs) {
+ if (Utils::insert(visited, subdir.canonicalPath()))
+ subDirectories.append(qMakePair(subdir, progressIncrement));
+ else
+ promise.setProgressValue(future.progressValue() + progressIncrement);
+ }
+ };
+ addSubDirectories(result.subDirectories, progressIncrement);
+
+ while (!subDirectories.isEmpty()) {
+ using namespace Tasking;
+ const LoopList iterator(subDirectories);
+ subDirectories.clear();
+
+ auto onSetup = [&, iterator](Utils::Async &task) {
+ task.setConcurrentCallData(
+ scanForFilesImpl, future, iterator->first, filter, factory, versionControls);
+ };
+
+ auto onDone = [&, iterator](const Utils::Async &task) {
+ const int progressRange = iterator->second;
+ const DirectoryScanResult result = task.result();
+ fileNodes.append(result.nodes);
+ const qsizetype subDirCount = result.subDirectories.count();
+ if (subDirCount == 0) {
+ promise.setProgressValue(future.progressValue() + progressRange);
+ } else {
+ const qsizetype fileCount = result.nodes.count();
+ const int increment = int(
+ progressRange / static_cast(fileCount + subDirCount));
+ promise.setProgressValue(future.progressValue() + increment * fileCount);
+ addSubDirectories(result.subDirectories, increment);
+ }
+ };
+
+ const Group group{
+ Utils::HostOsInfo::isLinuxHost() ? parallelLimit(2) : parallelIdealThreadCountLimit,
+ iterator,
+ Utils::AsyncTask(onSetup, onDone)
+ };
+ TaskTree::runBlocking(group);
+ }
+ return fileNodes;
+}
+
void TreeScanner::scanForFiles(
Promise &promise,
const Utils::FilePath &directory,
const FileFilter &filter,
- const QDir::Filters &dirFilter,
+ QDir::Filters dirFilter,
const FileTypeFactory &factory)
{
- QList nodes = ProjectExplorer::scanForFiles(
+ QList nodes = scanForFilesHelper(
promise, directory, dirFilter, [&filter, &factory](const Utils::FilePath &fn) -> FileNode * {
const Utils::MimeType mimeType = Utils::mimeTypesForFileName(fn.path()).value(0);
diff --git a/src/plugins/projectexplorer/treescanner.h b/src/plugins/projectexplorer/treescanner.h
index 6de26e399ad..bc4dbe0b069 100644
--- a/src/plugins/projectexplorer/treescanner.h
+++ b/src/plugins/projectexplorer/treescanner.h
@@ -75,7 +75,7 @@ private:
static void scanForFiles(Promise &fi,
const Utils::FilePath &directory,
const FileFilter &filter,
- const QDir::Filters &dirFilter,
+ QDir::Filters dirFilter,
const FileTypeFactory &factory);
private:
From 1f0d028b092f8f8713b7c756c9be9a28c319dabe Mon Sep 17 00:00:00 2001
From: Eike Ziller
Date: Mon, 24 Jun 2024 15:49:20 +0200
Subject: [PATCH 22/73] Update change log
Change-Id: I966a24d9fc2b272c798bd413eaadaf6c8ef14a0f
Reviewed-by: Leena Miettinen
---
dist/changelog/changes-14.0.0.md | 40 ++++++++++++++++++++++++++++----
dist/changelog/template.md | 4 ++++
2 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/dist/changelog/changes-14.0.0.md b/dist/changelog/changes-14.0.0.md
index 7d14123acae..8ef28236d6e 100644
--- a/dist/changelog/changes-14.0.0.md
+++ b/dist/changelog/changes-14.0.0.md
@@ -5,16 +5,16 @@ Qt Creator version 14 contains bug fixes and new features.
The most important changes are listed in this document. For a complete list of
changes, see the Git log for the Qt Creator sources that you can check out from
-the public Git repository. For example:
+the public Git repository or view online at
- git clone git://code.qt.io/qt-creator/qt-creator.git
- git log --cherry-pick --pretty=oneline origin/13.0..v14.0.0
+https://code.qt.io/cgit/qt-creator/qt-creator.git/log/?id=13.0..v14.0.0
General
-------
* Started work on supporting Lua based plugins (registering language servers,
actions, preferences, and wizards)
+ ([Documentation](https://doc-snapshots.qt.io/qtcreator-extending/lua-extensions.html))
* Added `Clear` and `Save Contents` to context menus of all output views
* Locator
* Added the option to show results relative to project root
@@ -42,6 +42,8 @@ Editing
### C++
* Made C++ code model settings configurable per project
+* Added a setting for the naming of include guards
+ ([QTCREATORBUG-25117](https://bugreports.qt.io/browse/QTCREATORBUG-25117))
* Fixed indentation after function calls with subscript operator
([QTCREATORBUG-29225](https://bugreports.qt.io/browse/QTCREATORBUG-29225))
* Refactoring
@@ -58,6 +60,7 @@ Editing
[Documentation](https://doc.qt.io/qtcreator/creator-reference-cpp-quick-fixes.html)
* Clangd
+ * Updated the prebuilt binaries to LLVM 18.1.7
* Increased the minimum version to LLVM 17
* Added the `Per-project index location` and `Per-session index location`
options in `Preferences` > `C++` > `Clangd` for setting the index location
@@ -88,8 +91,10 @@ Editing
([QTCREATORBUG-19226](https://bugreports.qt.io/browse/QTCREATORBUG-19226))
* Added `Qt Design Studio` to `Open With` for `.ui.qml` files
([Documentation](https://doc.qt.io/qtcreator/creator-quick-ui-forms.html))
+* Fixed that the color preview did not work on named colors
+ ([QTCREATORBUG-30594](https://bugreports.qt.io/browse/QTCREATORBUG-30594))
* Language Server
- * Switched on by default
+ * Switched on by default for Qt 6.8 and later
* Added option for generating `qmlls.ini` files for CMake projects
([QTCREATORBUG-30394](https://bugreports.qt.io/browse/QTCREATORBUG-30394))
([Qt Documentation](https://doc.qt.io/qt-6/cmake-variable-qt-qml-generate-qmlls-ini.html))
@@ -114,6 +119,10 @@ Editing
`Compiler Explorer`
[Documentation](https://doc.qt.io/qtcreator/creator-how-to-create-compiler-explorer-sessions.html)
+### Markdown
+
+* Fixed the navigation history
+
### Models
* Added more visual attributes for relations
@@ -135,6 +144,8 @@ Projects
from the list in the `Projects` mode
* Added support for user comments in the environment editor
([Documentation](https://doc-snapshots.qt.io/qtcreator-14.0/creator-how-to-edit-environment-settings.html))
+* Added the setting `Time to wait before force-stopping applications`
+ ([QTCREATORBUG-31025](https://bugreports.qt.io/browse/QTCREATORBUG-31025))
* Fixed the parsing of file links when color was used for the output
([QTCREATORBUG-30774](https://bugreports.qt.io/browse/QTCREATORBUG-30774))
* Fixed that the column information was not used when opening files from links
@@ -151,12 +162,18 @@ Projects
* Implemented `Open Online Documentation` for CMake documentation
* Added `Clear CMake Configuration` to the context menu in the `Projects` view
([QTCREATORBUG-24658](https://bugreports.qt.io/browse/QTCREATORBUG-24658))
+* Added support for the `CROSSCOMPILING_EMULATOR` target property
+ ([QTCREATORBUG-29880](https://bugreports.qt.io/browse/QTCREATORBUG-29880))
+ ([CMake Documentation](https://cmake.org/cmake/help/latest/prop_tgt/CROSSCOMPILING_EMULATOR.html#crosscompiling-emulator))
* Fixed that the package manager auto-setup files were not removed with
`Clear CMake Configuration`
([QTCREATORBUG-30771](https://bugreports.qt.io/browse/QTCREATORBUG-30771))
* Fixed that files generated by the Qt QML CMake API were not filtered as
generated files
([QTCREATORBUG-29631](https://bugreports.qt.io/browse/QTCREATORBUG-29631))
+* Fixed a crash when triggering `Follow Symbol` in a CMake file that does not
+ belong to a project
+ ([QTCREATORBUG-31077](https://bugreports.qt.io/browse/QTCREATORBUG-31077))
* Presets
* Made CMake settings configurable
([QTCREATORBUG-25972](https://bugreports.qt.io/browse/QTCREATORBUG-25972),
@@ -202,6 +219,12 @@ Analyzer
* Made it possible to register multiple servers
+### Cppcheck
+
+* Fixed that Cppcheck was not working until selecting `Apply` in the settings
+ ([QTCREATORBUG-28951](https://bugreports.qt.io/browse/QTCREATORBUG-28951),
+ [QTCREATORBUG-30615](https://bugreports.qt.io/browse/QTCREATORBUG-30615))
+
Terminal
--------
@@ -249,11 +272,15 @@ Platforms
* Added support for creating `android-desktop` devices
* Added support for `namespace` in `build.gradle`
([QTBUG-106907](https://bugreports.qt.io/browse/QTBUG-106907))
+* Fixed that errors when creating AVDs were not visible to the user
+ ([QTCREATORBUG-30852](https://bugreports.qt.io/browse/QTCREATORBUG-30852))
### iOS
* Removed Simulator management from the preferences. Use the
`Devices and Simulators` window in Xcode instead.
+* Fixed that starting the debugger could be slow for iOS < 17
+ ([QTCREATORBUG-31044](https://bugreports.qt.io/browse/QTCREATORBUG-31044))
### Remote Linux
@@ -266,6 +293,11 @@ Platforms
* Added support for the `perf` profiler
+### Bare Metal
+
+* Fixed issues with Qbs and the IAR toolchain
+ ([QTCREATORBUG-24040](https://bugreports.qt.io/browse/QTCREATORBUG-24040))
+
Credits for these changes go to:
--------------------------------
Ahmad Samir
diff --git a/dist/changelog/template.md b/dist/changelog/template.md
index cfbdad4677f..66e94906aea 100644
--- a/dist/changelog/template.md
+++ b/dist/changelog/template.md
@@ -83,6 +83,8 @@ Analyzer
### CTF Visualizer
+### Cppcheck
+
Terminal
--------
@@ -127,5 +129,7 @@ Platforms
### QNX
+### Bare Metal
+
Credits for these changes go to:
--------------------------------
From 3babe8c73c7b0b5448543b34ae24b87d0bae01fb Mon Sep 17 00:00:00 2001
From: Cristian Adam
Date: Thu, 20 Jun 2024 13:05:05 +0200
Subject: [PATCH 23/73] App: Set "windowsvista" style on Windows
This will set the pre Qt 6.7 default style.
Task-number: QTBUG-126515
Task-number: QTBUG-126548
Task-number: QTBUG-126549
Change-Id: I947bcbe859c91906f2a273a04f3142d8d42b7af1
Reviewed-by: Eike Ziller
---
src/app/main.cpp | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/src/app/main.cpp b/src/app/main.cpp
index 4ec11d5e896..43712c6836a 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -680,11 +680,18 @@ int main(int argc, char **argv)
setPixmapCacheLimit();
loadFonts();
- // On 100% or 200% scaling we can use the default 'Vista' style on Windows
- qreal tmp;
- const bool fractionalDpi = !qFuzzyIsNull(std::modf(qApp->devicePixelRatio(), &tmp));
- if (Utils::HostOsInfo::isWindowsHost() && fractionalDpi && !hasStyleOption)
- QApplication::setStyle(QLatin1String("fusion"));
+ if (Utils::HostOsInfo::isWindowsHost() && !hasStyleOption) {
+ // The Windows 11 default style (Qt 6.7) has major issues, therefore
+ // set the previous default style: "windowsvista"
+ // FIXME: check newer Qt Versions
+ QApplication::setStyle(QLatin1String("windowsvista"));
+
+ // On scaling different than 100% or 200% use the "fusion" style
+ qreal tmp;
+ const bool fractionalDpi = !qFuzzyIsNull(std::modf(qApp->devicePixelRatio(), &tmp));
+ if (fractionalDpi)
+ QApplication::setStyle(QLatin1String("fusion"));
+ }
const int threadCount = QThreadPool::globalInstance()->maxThreadCount();
QThreadPool::globalInstance()->setMaxThreadCount(qMax(4, 2 * threadCount));
From b4ece2e056450b595cb1d792c184163f100cfe86 Mon Sep 17 00:00:00 2001
From: Leena Miettinen
Date: Thu, 20 Jun 2024 12:09:50 +0200
Subject: [PATCH 24/73] Doc: Update topics about reading documentation
- Describe the Open Online Documentation option
- Edit the style
- Use How To: Read Documentation as \sa for all topics in the group
Task-number: QTCREATORBUG-30604
Change-Id: I7219ef9a38e993fc1387dd0ece9c8dfe762387d1
Reviewed-by: Eike Ziller
---
.../src/cmake/creator-projects-cmake.qdoc | 9 +-
doc/qtcreator/src/howto/creator-help.qdoc | 157 +++++++++---------
2 files changed, 84 insertions(+), 82 deletions(-)
diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc
index 5fdbd09dd8e..524163a2894 100644
--- a/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc
+++ b/doc/qtcreator/src/cmake/creator-projects-cmake.qdoc
@@ -120,11 +120,14 @@
tooltips
\li Selecting any of the above elements and pressing \key F1 to show
its documentation
- \li Switching to the Help mode
+ \li Switching to the \uicontrol Help mode
\endlist
- \sa {Build with CMake}{How To: Build with CMake}, {CMake},
- {Read Documentation}{How To: Read Documentation}
+ To view the documentation online, open it in the \uicontrol Help mode and
+ select \inlineimage icons/online.png (\uicontrol {Open Online Documentation}).
+
+ \sa {Build with CMake}{How To: Build with CMake},
+ {Read Documentation}{How To: Read Documentation}, {CMake}
*/
/*!
diff --git a/doc/qtcreator/src/howto/creator-help.qdoc b/doc/qtcreator/src/howto/creator-help.qdoc
index 434ee6fe9b2..f9f3028a022 100644
--- a/doc/qtcreator/src/howto/creator-help.qdoc
+++ b/doc/qtcreator/src/howto/creator-help.qdoc
@@ -23,23 +23,23 @@
\li To view context sensitive help on a Qt class or function as a
tooltip, move the mouse cursor over the class or function. If help
- is not available, the tooltip displays type information for the
+ is not available, the tooltip shows type information for the
symbol.
- \li To display tooltips for function signatures regardless of the
+ \li To show tooltips for function signatures regardless of the
cursor position in the function call, press \key {Ctrl+Shift+D}.
- \li To display the full help on a Qt class or function, press \key F1 or
+ \li To show the full help on a Qt class or function, press \key F1 or
select \uicontrol {Context Help} in the context menu.
- The documentation is displayed in a
+ The documentation is shown in a
view next to the code editor, or, if there is not enough vertical
space, in the fullscreen \uicontrol Help mode.
- \li To select and configure how the documentation is displayed in the
- \uicontrol Help mode, select \preferences > \uicontrol Help.
+ \li To change how the documentation is shown in the
+ \uicontrol Help mode, go to \preferences > \uicontrol Help.
\endlist
- The following image displays the context sensitive help in the \uicontrol Edit
+ The following image shows the context sensitive help in the \uicontrol Edit
mode.
\image qtcreator-context-sensitive-help.png {Context-sensitive help in Edit mode}
@@ -52,43 +52,43 @@
\image qtcreator-preferences-help-general.webp {General tab in Help preferences}
- You can set the default zoom level in the \uicontrol Zoom field. When
- viewing help pages, you can use the mouse scroll wheel to zoom them. To
- disable this feature, deselect the \uicontrol {Enable scroll wheel zooming}
- check box.
+ Set the default zoom level in \uicontrol Zoom. When viewing help pages, use
+ the mouse scroll wheel to zoom them. To turn off this feature, clear
+ \uicontrol {Enable scroll wheel zooming}.
- To disable antialiasing, deselect the \uicontrol Antialiasing check box.
+ To turn off antialiasing, clear \uicontrol Antialias.
\section1 Return to the editor
To switch to the editor context when you close the last help page, select
- the \uicontrol {Return to editor on closing the last page} check box.
+ \uicontrol {Return to editor on closing the last page}.
\section1 Select help viewer backend
- The help viewer backend determines the style sheet that is used to display
+ The help viewer backend determines the style sheet that is used to show
the help files. The default help viewer backend that is based on litehtml
is recommended for viewing Qt documentation. You can choose another help
- viewer backend in the \uicontrol {Viewer backend} field. To take the new
+ viewer backend in the \uicontrol {Viewer backend}. To take the new
backend to use, reload the help page.
\section1 View function tooltips
- To hide function tooltips by default, select \preferences >
- \uicontrol {Text Editor} > \uicontrol Behavior >
- \uicontrol {Show help tooltips using the mouse} >
- \uicontrol {On Shift+Mouseover}. You can still view the tooltips by pressing
- and holding down the \key Shift key.
+ To hide function tooltips by default:
+
+ \list 1
+ \li Go to \preferences > \uicontrol {Text Editor} > \uicontrol Behavior.
+ \image qtcreator-preferences-texteditor-behavior.webp {Text Editor Behavior preferences}
+ \li In \uicontrol {Show help tooltips using the mouse}, select
+ \uicontrol {On Shift+Mouseover}.
+ \endlist
+
+ You can still view the tooltips by pressing and holding down the \key Shift
+ key.
To use a keyboard shortcut for viewing help tooltips, select
\uicontrol {Show help tooltips using keyboard shortcut (Alt)}.
- \sa {Find information in Qt documentation}, {Filter documentation},
- {Search from documentation}
-
- \sa {Add external documentation}, {Detach the help window},
- {Filter documentation}, {Find information in Qt documentation},
- {Select the help start page}
+ \sa {Read Documentation}{How To: Read Documentation}
*/
/*!
@@ -103,15 +103,18 @@
\title Find information in Qt documentation
- \QC, \QSDK and other Qt deliverables have documentation
- as .qch files. All the documentation is accessible in the \uicontrol Help mode.
+ \QC installer, \QOI, and other Qt deliverables install documentation as .qch
+ files. View the documentation in the \uicontrol Help mode. To view the
+ currently open document online, select \inlineimage icons/online.png
+ (\uicontrol {Open Online Documentation}).
By default, \QC registers only the latest available version of the
documentation for each installed Qt module. To register all installed
- documentation, select \preferences > \uicontrol Kits >
- \uicontrol {Qt Versions} > \uicontrol {Register documentation}.
+ documentation, go to \preferences > \uicontrol Kits >
+ \uicontrol {Qt Versions} and select an option in
+ \uicontrol {Register documentation}.
- \image qtcreator-qt-versions.png {Register documentation field in Qt Versions tab in Kit Preferences}
+ \image qtcreator-qt-versions.png {Register documentation in Qt Versions preferences}
\section1 Help mode sidebar views
@@ -137,7 +140,7 @@
\endlist
- \sa {Add bookmarks to help pages}, {Search from documentation}
+ \sa {Read Documentation}{How To: Read Documentation}
*/
/*!
@@ -152,8 +155,8 @@
\title Add bookmarks to help pages
- You can add bookmarks to useful help pages to easily find them later
- in the \uicontrol Bookmarks view. You can either use the page title as the
+ Add bookmarks to useful help pages to easily find them later
+ in the \uicontrol Bookmarks view. Either use the page title as the
bookmark or change it to any text. You can organize the bookmarks in
folders in the view.
@@ -163,21 +166,21 @@
\list 1
- \li Click the \inlineimage icons/bookmark.png
- (\uicontrol {Add Bookmark}) button on the toolbar.
+ \li Select \inlineimage icons/bookmark.png (\uicontrol {Add Bookmark})
+ on the toolbar.
- \li In the \uicontrol {Add Bookmark} dialog, click \uicontrol OK to save the
+ \li In the \uicontrol {Add Bookmark} dialog, select \uicontrol OK to save the
page title as a bookmark in the selected folder.
\endlist
\section1 Import and export bookmarks
- To import and export bookmarks, select \preferences >
- \uicontrol Help > \uicontrol General > \uicontrol {Import Bookmarks} or
+ To import and export bookmarks, go to \preferences > \uicontrol Help >
+ \uicontrol General and select \uicontrol {Import Bookmarks} or
\uicontrol {Export Bookmarks}.
- \sa {Find information in Qt documentation}
+ \sa {Read Documentation}{How To: Read Documentation}
*/
/*!
@@ -192,10 +195,10 @@
\title Search from documentation
- In the \uicontrol Help mode \uicontrol Search pane, you can use full-text
+ In the \uicontrol Help mode \uicontrol Search pane, use full-text
search for finding a
particular word in all the installed documents. Enter the term you are
- looking for, and select the \uicontrol Search button. All documents that
+ looking for, and select \uicontrol Search. All documents that
have the specified term are listed. The list is sorted by document
version (if you have installed several Qt versions, for example) and
the number of search hits that the documents have. Select a document in
@@ -225,16 +228,15 @@
time when you open the \uicontrol Search pane. If you add or remove documents,
\QC recreates the index.
- If you cannot find words that you know are there, indexing might not have
- been completed for some reason. To regenerate the index, click
- \inlineimage icons/reload_gray.png
+ If you cannot find words that you know are there, the index might not be
+ complete. To recreate it, select \inlineimage icons/reload_gray.png
(\uicontrol {Regenerate Index}).
Punctuation is not included in indexed terms. To find terms that have
punctuation, such as domain names, use the asterisk as a wild card. For
example, to find \c {Pastebin.Com}, enter the search term \c {Pastebin*}.
- \sa {Find information in Qt documentation}
+ \sa {Read Documentation}{How To: Read Documentation}
*/
/*!
@@ -249,7 +251,7 @@
\title Add external documentation
- You can display external documentation in the \uicontrol Help mode.
+ You can view external documentation in the \uicontrol Help mode.
To add documentation or replace the documentation that ships with \QC and Qt:
\list 1
@@ -259,14 +261,14 @@
For information on how to prepare your documentation and create a
.qch file, see \l{The Qt Help Framework}.
- \li To add the .qch file to \QC, select \preferences >
+ \li To add the .qch file to \QC, go to \preferences >
\uicontrol Help > \uicontrol Documentation > \uicontrol Add.
\image qtcreator-preferences-help-documentation.webp {Documentation tab in Help Preferences}
\endlist
- \sa {Get help}
+ \sa {Read Documentation}{How To: Read Documentation}
*/
/*!
@@ -281,26 +283,24 @@
\title Detach the help window
- By default, context-sensitive help is opened in a window next to the
+ By default, context-sensitive help opens in a window next to the
code editor when you press \key F1. If there is not enough vertical
space, the help opens in the full-screen help mode.
\image qtcreator-context-sensitive-help.png {Context-sensitive help in Edit mode}
- To specify that the help always opens in full-screen mode or
- is detached to an external window, select \preferences > \uicontrol Help >
- \uicontrol General.
+ To specify that the help always opens in full-screen mode or in an external
+ window, go to \preferences > \uicontrol Help > \uicontrol General.
\image qtcreator-preferences-help-general.webp {General tab in Help preferences}
- Set preferences for displaying context-sensitive help
- in the \uicontrol {On context help} field. To detach the help window, select
+ Set preferences for viewing context-sensitive help
+ in \uicontrol {On context help}. To detach the help window, select
\uicontrol {Always Show in External Window}.
- To change this setting in a help view, select the \inlineimage icons/linkicon.png
- toolbar button.
+ To change this setting in a help view, select \inlineimage icons/linkicon.png.
- \sa {Get help}
+ \sa {Read Documentation}{How To: Read Documentation}
*/
/*!
@@ -315,27 +315,27 @@
\title Select the help start page
- You can select the page to display when you open the \uicontrol Help mode in the
- \preferences > \uicontrol Help > \uicontrol General >
- \uicontrol {On help start} field.
+ To set the page to show when you open the \uicontrol Help mode, go to
+ \preferences > \uicontrol Help > \uicontrol General and select
+ \uicontrol {On help start}.
\image qtcreator-preferences-help-general.webp {General tab in Help preferences}
\list
- \li To display the page and help views that were open when you exited the mode,
+ \li To show the page and help views that were open when you exited the mode,
select the \uicontrol {Show My Tabs from Last Session} option. However, Web pages
are not opened because loading them would slow down opening the \uicontrol Help
mode.
- \li To display a particular page, select \uicontrol {Show My Home Page}, and specify
- the page in the \uicontrol {Home Page} field.
+ \li To show a particular page, select \uicontrol {Show My Home Page}, and specify
+ the page in \uicontrol {Home Page}.
- \li To display a blank page, select the \uicontrol {Show a Blank Page} option. You can
- also select the \uicontrol {Use Blank Page} button to set a blank page as your
+ \li To show a blank page, select the \uicontrol {Show a Blank Page} option.
+ Select \uicontrol {Use Blank Page} to set a blank page as your
home page.
\endlist
- \sa {Get help}
+ \sa {Read Documentation}{How To: Read Documentation}
*/
/*!
@@ -350,40 +350,40 @@
\title Filter documentation
- You can filter the documents displayed in the \uicontrol Help mode to find
+ Filter the documents in the \uicontrol Help mode to find
relevant information faster. Select a filter from a list of filters. The
contents of the \uicontrol Index and \uicontrol Contents
view in the sidebar change accordingly.
- \image qtcreator-help-filters.png {Filters field on the Help mode toolbar}
+ \image qtcreator-help-filters.png {Filters on the Help mode toolbar}
\section1 Add filters
- You can define your own filters to display documentation for a set of
+ Define your own filters to show documentation for a set of
Qt modules and versions.
To add filters:
\list 1
- \li Select \preferences > \uicontrol Help > \uicontrol Filters.
+ \li Go to \preferences > \uicontrol Help > \uicontrol Filters.
\image qtcreator-help-filter-attributes.png {Filters tab in Help preferences}
\li Select \inlineimage icons/plus.png
to add a new filter in the \uicontrol {Add Filter} dialog.
- \li In the \uicontrol {Filter name} field, enter a name for the filter,
+ \li In \uicontrol {Filter name}, enter a name for the filter,
and then select \uicontrol {OK} to return to the \uicontrol Filters
tab.
- \li In the \uicontrol Components field, select the Qt modules to include
+ \li In \uicontrol Components, select the Qt modules to include
in the filter.
- \li In the \uicontrol Versions field, select the Qt versions to include
+ \li In \uicontrol Versions, select the Qt versions to include
in the filter.
- \li Click \uicontrol OK.
+ \li Select \uicontrol OK.
\li In the \uicontrol Help mode, select the filter in the list of
filters to see the filtered documentation in the sidebar.
@@ -392,15 +392,14 @@
\section1 Change filters
- To modify the selected filter, add and remove Qt modules and versions, and
+ To modify the selected filter, add and remove Qt modules and versions and
then select \uicontrol Apply.
To rename the selected filter, select \uicontrol Rename.
\section1 Remove filters
- To remove the selected filter select \inlineimage icons/minus.png
- .
+ To remove the selected filter, select \inlineimage icons/minus.png.
- \sa {Get help}
+ \sa {Read Documentation}{How To: Read Documentation}
*/
From 6db4c7af32d62f925822cd9c31e12b39a03debd3 Mon Sep 17 00:00:00 2001
From: Artem Sokolovskii
Date: Thu, 13 Jun 2024 13:12:55 +0200
Subject: [PATCH 25/73] AppStatisticMonitor: Change background color to current
theming
Change-Id: Ib12305cfda1d6ed4404c606314fa73451ed4afe7
Reviewed-by: hjk
---
src/plugins/appstatisticsmonitor/chart.cpp | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/plugins/appstatisticsmonitor/chart.cpp b/src/plugins/appstatisticsmonitor/chart.cpp
index 260282b39a4..86e99283fa7 100644
--- a/src/plugins/appstatisticsmonitor/chart.cpp
+++ b/src/plugins/appstatisticsmonitor/chart.cpp
@@ -38,7 +38,8 @@ AppStatisticsMonitorChart::AppStatisticsMonitorChart(
m_chartView->setMinimumHeight(200);
m_chartView->setMinimumWidth(400);
const QBrush brushTitle(creatorColor(Theme::Token_Text_Muted));
- const QBrush brush(creatorColor(Theme::Token_Background_Default));
+ // const QBrush brush(creatorColor(Theme::Token_Background_Default)); left for the future
+ const QBrush brush(creatorColor(Theme::BackgroundColorNormal));
const QPen penBack(creatorColor(Theme::Token_Text_Muted));
const QPen penAxis(creatorColor(Theme::Token_Text_Muted));
@@ -160,8 +161,8 @@ void Chart::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
-
- painter.fillRect(rect(), creatorColor(Theme::Token_Background_Default));
+ // painter.fillRect(rect(), creatorColor(Theme::Token_Background_Default)); left for the future
+ painter.fillRect(rect(), creatorColor(Theme::BackgroundColorNormal));
// add the name of the chart in the middle of the widget width and on the top
painter.drawText(
From 660e57976081b93a01b629caf389731d9d000e5b Mon Sep 17 00:00:00 2001
From: Cristian Adam
Date: Tue, 18 Jun 2024 18:28:09 +0200
Subject: [PATCH 26/73] CMakePM: Code readability fix
Amends b240bfb3dbd7b0da4be1490f7262bcc2c5542731
Having the assignement sepparate makes the code easier to understand.
Change-Id: I10112224c9752788e157012d53f638406b79793b
Reviewed-by: hjk
---
src/plugins/cmakeprojectmanager/cmakeeditor.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
index 92f63ea04c7..c4e91031015 100644
--- a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
@@ -330,7 +330,8 @@ void CMakeEditorWidget::findLinkAt(const QTextCursor &cursor,
if (auto project = ProjectTree::currentProject()) {
buffer.replace("${CMAKE_SOURCE_DIR}", project->projectDirectory().path());
- if (auto bs = ProjectTree::currentBuildSystem(); bs && bs->buildConfiguration()) {
+ auto bs = ProjectTree::currentBuildSystem();
+ if (bs && bs->buildConfiguration()) {
buffer.replace("${CMAKE_BINARY_DIR}", bs->buildConfiguration()->buildDirectory().path());
// Get the path suffix from current source dir to project source dir and apply it
From 460a5bbb56b57b2341782eb7a14d75d0bda06165 Mon Sep 17 00:00:00 2001
From: Jarek Kobus
Date: Fri, 14 Jun 2024 11:44:44 +0200
Subject: [PATCH 27/73] TaskTree: Qt-ify the code (part 4)
13. Make s_activeStorageWarning a QLatin1StringView, otherwise
having "qstring.h:1007:5: note: declared private here"
on ubuntu-24.04-x64.
Amends e331329e4f8bb3de30f99f0905a0d2517d4c227c
Change-Id: I6f5784f00b2894daa48128edd50bf57b54686acf
Reviewed-by: hjk
---
src/libs/solutions/tasking/tasktree.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/libs/solutions/tasking/tasktree.cpp b/src/libs/solutions/tasking/tasktree.cpp
index 55ae3cfb56a..91bdaf2d9e1 100644
--- a/src/libs/solutions/tasking/tasktree.cpp
+++ b/src/libs/solutions/tasking/tasktree.cpp
@@ -18,6 +18,7 @@
#include
#include
+using namespace Qt::StringLiterals;
using namespace std::chrono;
QT_BEGIN_NAMESPACE
@@ -1298,11 +1299,11 @@ const void *Loop::valuePtr() const
using StoragePtr = void *;
-static QString s_activeStorageWarning =
+static constexpr QLatin1StringView s_activeStorageWarning =
"The referenced storage is not reachable in the running tree. "
"A nullptr will be returned which might lead to a crash in the calling code. "
"It is possible that no storage was added to the tree, "
- "or the storage is not reachable from where it is referenced.";
+ "or the storage is not reachable from where it is referenced."_L1;
class StorageThreadData
{
From da957a5b1a534896c95e14ff2027a6eb52de575a Mon Sep 17 00:00:00 2001
From: Orgad Shaneh
Date: Fri, 21 Jun 2024 19:20:24 +0300
Subject: [PATCH 28/73] Utils: Fix MSVC warning
icon.cpp(214): warning C5030: attribute [[__maybe_unused__]] is not recognized
icon.cpp(214): warning C5222: '__maybe_unused__': all unscoped attribute names are reserved for future standardization
Change-Id: I99e484a508965ef256b20286b3c3795220c4f748
Reviewed-by: Christian Stenger
---
src/libs/utils/icon.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/libs/utils/icon.cpp b/src/libs/utils/icon.cpp
index 06570e6505a..073ec771531 100644
--- a/src/libs/utils/icon.cpp
+++ b/src/libs/utils/icon.cpp
@@ -211,7 +211,7 @@ QIcon Icon::sideBarIcon(const Icon &classic, const Icon &flat)
}
QIcon Icon::modeIcon(const Icon &classic, const Icon &flat,
- [[__maybe_unused__]] const Icon &flatActive)
+ [[maybe_unused]] const Icon &flatActive)
{
QIcon result = sideBarIcon(classic, flat);
return result;
From 8910356ffcb7fc80a26f49609198dd83a267b84d Mon Sep 17 00:00:00 2001
From: David Schulz
Date: Mon, 24 Jun 2024 15:16:45 +0200
Subject: [PATCH 29/73] LanguageClient: avoid crash on collecting clients for a
null setting
And assert in that case.
Change-Id: I7b74589e6f08eb57e1b08bf509729bef32d0a9ff
Reviewed-by: Marcus Tillmanns
---
src/plugins/languageclient/languageclientmanager.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp
index 8ee2254c746..11ce6b4618e 100644
--- a/src/plugins/languageclient/languageclientmanager.cpp
+++ b/src/plugins/languageclient/languageclientmanager.cpp
@@ -387,6 +387,7 @@ void LanguageClientManager::enableClientSettings(const QString &settingsId, bool
QList LanguageClientManager::clientsForSetting(const BaseSettings *setting)
{
QTC_ASSERT(managerInstance, return {});
+ QTC_ASSERT(setting, return {});
auto instance = managerInstance;
return instance->m_clientsForSetting.value(setting->m_id);
}
From 96815bb95ebff3ee0c07ff7ab670015003ab89e0 Mon Sep 17 00:00:00 2001
From: Marcus Tillmanns
Date: Mon, 24 Jun 2024 13:52:33 +0200
Subject: [PATCH 30/73] LuaLanguageClient: Fix crash on exit
Change-Id: I2f70d0b1586bc2bfbb27ea1513313e5c6ca32754
Reviewed-by: David Schulz
---
.../lualanguageclient/lualanguageclient.cpp | 28 ++++++++-----------
1 file changed, 11 insertions(+), 17 deletions(-)
diff --git a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp
index c9a12900230..47b2f7599dc 100644
--- a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp
+++ b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp
@@ -175,7 +175,7 @@ public:
std::optional m_startFailedCallback;
QMap m_messageCallbacks;
- QList m_clients;
+ LuaClientSettings *m_settings{nullptr};
public:
static BaseSettings::StartBehavior startBehaviorFromString(const QString &str)
@@ -190,6 +190,8 @@ public:
throw sol::error("Unknown start behavior: " + str.toStdString());
}
+ void setSettings(LuaClientSettings *settings) { m_settings = settings; }
+
LuaClientWrapper(const sol::table &options)
{
m_cmdLineCallback = addValue(
@@ -267,8 +269,6 @@ public:
auto luaClient = qobject_cast(c);
if (luaClient && luaClient->m_settingsId == m_settingsTypeId && m_onInstanceStart) {
QTC_CHECK(::Lua::LuaEngine::void_safe_call(*m_onInstanceStart, c));
-
- m_clients.push_back(c);
updateMessageCallbacks();
}
});
@@ -286,22 +286,11 @@ public:
if (!luaClient || luaClient->m_settingsId != m_settingsTypeId)
return;
- if (m_clients.contains(c))
- m_clients.removeOne(c);
-
if (unexpected && m_startFailedCallback) {
QTC_CHECK_EXPECTED(::Lua::LuaEngine::void_safe_call(*m_startFailedCallback));
}
}
- ~LuaClientWrapper()
- {
- for (auto client : m_clients)
- LanguageClientManager::shutdownClient(client);
-
- // TODO: Unregister Client settings from LanguageClientManager
- }
-
TransportType transportType() { return m_transportType; }
void applySettings()
@@ -340,7 +329,9 @@ public:
void updateMessageCallbacks()
{
- for (Client *c : m_clients) {
+ for (Client *c : LanguageClientManager::clientsForSetting(m_settings)) {
+ if (!c)
+ continue;
for (const auto &[msg, func] : m_messageCallbacks.asKeyValueRange()) {
c->registerCustomMethod(
msg,
@@ -367,8 +358,10 @@ public:
if (!messageValue.isObject())
throw sol::error("Message is not an object");
const LanguageServerProtocol::JsonRpcMessage jsonrpcmessage(messageValue.toObject());
- for (Client *c : m_clients)
- c->sendMessage(jsonrpcmessage);
+ for (Client *c : LanguageClientManager::clientsForSetting(m_settings)) {
+ if (c)
+ c->sendMessage(jsonrpcmessage);
+ }
}
void updateOptions()
@@ -536,6 +529,7 @@ static void registerLuaApi()
[](const sol::table &options) -> std::shared_ptr {
auto luaClient = std::make_shared(options);
auto client = new LuaClientSettings(luaClient);
+ luaClient->setSettings(client);
// The order is important!
// First restore the settings ...
From 2f76130a496e258e661002d9f9a9a5d59df85ff3 Mon Sep 17 00:00:00 2001
From: Leena Miettinen
Date: Tue, 25 Jun 2024 09:40:42 +0200
Subject: [PATCH 31/73] Doc: Update info about QML Language Server
- Rename topic as "Configure QML Language Server", as QMLLS
is now turned on by default
- Describe new preferences
- Remove "QML Language Server" from checkbox labels
- Add a link to the docs to the change log
Task-number: QTCREATORBUG-30604
Change-Id: I397b1747a3d23d728c78dc2eae000839655c4f32
Reviewed-by: Eike Ziller
---
dist/changelog/changes-14.0.0.md | 5 ++-
.../images/qtcreator-qml-js-editing.webp | Bin 11266 -> 11482 bytes
.../creator-only/creator-language-server.qdoc | 33 ++++++++----------
.../qmljseditor/qmljseditingsettingspage.cpp | 10 +++---
4 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/dist/changelog/changes-14.0.0.md b/dist/changelog/changes-14.0.0.md
index 8ef28236d6e..8c51242e3d5 100644
--- a/dist/changelog/changes-14.0.0.md
+++ b/dist/changelog/changes-14.0.0.md
@@ -95,12 +95,15 @@ Editing
([QTCREATORBUG-30594](https://bugreports.qt.io/browse/QTCREATORBUG-30594))
* Language Server
* Switched on by default for Qt 6.8 and later
- * Added option for generating `qmlls.ini` files for CMake projects
+ * Added an option for generating `qmlls.ini` files for CMake projects in
+ `Preferences` > `Qt Quick`> `QML/JS Editing`
([QTCREATORBUG-30394](https://bugreports.qt.io/browse/QTCREATORBUG-30394))
([Qt Documentation](https://doc.qt.io/qt-6/cmake-variable-qt-qml-generate-qmlls-ini.html))
* Fixed that tool tips from the built-in model were shown instead of tool tips
from the server
+ [Documentation](https://doc.qt.io/qtcreator/creator-how-to-use-qml-language-server.html)
+
### Python
* Added options for updating Python Language Server
diff --git a/doc/qtcreator/images/qtcreator-qml-js-editing.webp b/doc/qtcreator/images/qtcreator-qml-js-editing.webp
index c0b56264dd1e7b274fb66e8888a8ae0373676b6f..f9475414f54bca2361312c15f5e3d0fac9956090 100644
GIT binary patch
literal 11482
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