From f15f048ee95c2799c69808e3b6a0831c4b8fa163 Mon Sep 17 00:00:00 2001 From: Xavier BESSON Date: Sat, 6 Jul 2024 16:26:24 +0200 Subject: [PATCH] Add keyboard shortcuts for bookmarks Add keyboard shortcuts to move bookmarks up or down Add keyboard shortcut to sort bookmarks by filenames and line numbers Fixes: QTCREATORBUG-30286 Change-Id: Iaf40f389e51357cb7d9fdf214e3acd0765fd1201 Reviewed-by: David Schulz --- src/plugins/texteditor/bookmarkmanager.cpp | 56 +++++++++++++++++--- src/plugins/texteditor/bookmarkmanager.h | 1 + src/plugins/texteditor/texteditorconstants.h | 7 ++- 3 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/plugins/texteditor/bookmarkmanager.cpp b/src/plugins/texteditor/bookmarkmanager.cpp index 9e3423a2423..eac800cfc33 100644 --- a/src/plugins/texteditor/bookmarkmanager.cpp +++ b/src/plugins/texteditor/bookmarkmanager.cpp @@ -214,6 +214,14 @@ BookmarkView::BookmarkView() setDragDropMode(QAbstractItemView::DragDrop); connect(this, &QAbstractItemView::activated, this, &BookmarkView::gotoBookmark); + connect(this->selectionModel(), &QItemSelectionModel::currentRowChanged, + this, [=](const QModelIndex ¤t, const QModelIndex &previous) { + Q_UNUSED(previous) + Command *moveUpCmd = ActionManager::command(TextEditor::Constants::BOOKMARKS_MOVEUP_ACTION); + Command *moveDownCmd = ActionManager::command(TextEditor::Constants::BOOKMARKS_MOVEDOWN_ACTION); + moveUpCmd->action()->setEnabled(current.isValid()); + moveDownCmd->action()->setEnabled(current.isValid()); + }); } QList BookmarkView::createToolBarWidgets() @@ -233,8 +241,14 @@ QList BookmarkView::createToolBarWidgets() void BookmarkView::contextMenuEvent(QContextMenuEvent *event) { QMenu menu; - QAction *moveUp = menu.addAction(Tr::tr("Move Up")); - QAction *moveDown = menu.addAction(Tr::tr("Move Down")); + Command *moveUpCmd = ActionManager::command(TextEditor::Constants::BOOKMARKS_MOVEUP_ACTION); + Command *moveDownCmd = ActionManager::command(TextEditor::Constants::BOOKMARKS_MOVEDOWN_ACTION); + menu.addAction(moveUpCmd->action()); + menu.addAction(moveDownCmd->action()); + menu.addSeparator(); + Command *sortByFilenamesCmd = ActionManager::command(TextEditor::Constants::BOOKMARKS_SORTBYFILENAMES_ACTION); + menu.addAction(sortByFilenamesCmd->action()); + menu.addSeparator(); QAction *edit = menu.addAction(Tr::tr("&Edit")); menu.addSeparator(); QAction *remove = menu.addAction(Tr::tr("&Remove")); @@ -243,18 +257,17 @@ void BookmarkView::contextMenuEvent(QContextMenuEvent *event) m_contextMenuIndex = indexAt(event->pos()); if (!m_contextMenuIndex.isValid()) { - moveUp->setEnabled(false); - moveDown->setEnabled(false); + moveUpCmd->action()->setEnabled(false); + moveDownCmd->action()->setEnabled(false); remove->setEnabled(false); edit->setEnabled(false); } - if (model()->rowCount() == 0) + if (model()->rowCount() == 0) { removeAll->setEnabled(false); + } BookmarkManager *manager = &bookmarkManager(); - connect(moveUp, &QAction::triggered, manager, &BookmarkManager::moveUp); - connect(moveDown, &QAction::triggered, manager, &BookmarkManager::moveDown); connect(remove, &QAction::triggered, this, &BookmarkView::removeFromContextMenu); connect(removeAll, &QAction::triggered, this, &BookmarkView::removeAll); connect(edit, &QAction::triggered, manager, &BookmarkManager::edit); @@ -327,6 +340,7 @@ BookmarkManager::BookmarkManager(QObject *parent) const Id bookmarkMenuId = "Bookmarks.Menu"; const Context editorManagerContext(Core::Constants::C_EDITORMANAGER); + const Context bookmarksContext(BOOKMARKS_CONTEXT); MenuBuilder bookmarkMenu(bookmarkMenuId); bookmarkMenu.setTitle(Tr::tr("&Bookmarks")); @@ -413,6 +427,24 @@ BookmarkManager::BookmarkManager(QObject *parent) ActionContainer *touchBar = ActionManager::actionContainer(Core::Constants::TOUCH_BAR); touchBar->addAction(toggleAction.command(), Core::Constants::G_TOUCHBAR_EDITOR); + ActionBuilder moveDownAction(this, Constants::BOOKMARKS_MOVEDOWN_ACTION); + moveDownAction.setContext(bookmarksContext); + moveDownAction.setText(Tr::tr("Move Down")); + moveDownAction.setDefaultKeySequence(Tr::tr("Ctrl+Alt+.")); + moveDownAction.addOnTriggered(this, [this] { moveDown(); }); + + ActionBuilder moveUpAction(this, Constants::BOOKMARKS_MOVEUP_ACTION); + moveUpAction.setContext(bookmarksContext); + moveUpAction.setText(Tr::tr("Move Up")); + moveUpAction.setDefaultKeySequence(Tr::tr("Ctrl+Alt+,")); + moveUpAction.addOnTriggered(this, [this] { moveUp(); }); + + ActionBuilder sortByFilenamesAction(this, Constants::BOOKMARKS_SORTBYFILENAMES_ACTION); + sortByFilenamesAction.setContext(bookmarksContext); + sortByFilenamesAction.setText(Tr::tr("Sort by Filenames")); + sortByFilenamesAction.setDefaultKeySequence(Tr::tr("Ctrl+Alt+P")); + sortByFilenamesAction.addOnTriggered(this, [this] { sortByFilenames(); }); + updateActionStatus(); } @@ -889,6 +921,16 @@ void BookmarkManager::edit() } } +void BookmarkManager::sortByFilenames() +{ + beginResetModel(); + std::sort(m_bookmarksList.begin(), m_bookmarksList.end(), [](const Bookmark* a, const Bookmark* b){ + return a->filePath().fileName() < b->filePath().fileName() + || (a->filePath().fileName() == b->filePath().fileName() && a->lineNumber() < b->lineNumber()); + }); + endResetModel(); +} + /* Returns the bookmark at the given file and line number, or 0 if no such bookmark exists. */ Bookmark *BookmarkManager::findBookmark(const FilePath &filePath, int lineNumber) { diff --git a/src/plugins/texteditor/bookmarkmanager.h b/src/plugins/texteditor/bookmarkmanager.h index 08a8f1b24d1..c7a9a021ef1 100644 --- a/src/plugins/texteditor/bookmarkmanager.h +++ b/src/plugins/texteditor/bookmarkmanager.h @@ -75,6 +75,7 @@ public: void moveDown(); void edit(); void editByFileAndLine(const Utils::FilePath &fileName, int lineNumber); + void sortByFilenames(); bool gotoBookmark(const Bookmark *bookmark) const; void requestContextMenu(const Utils::FilePath &filePath, int lineNumber, QMenu *menu); diff --git a/src/plugins/texteditor/texteditorconstants.h b/src/plugins/texteditor/texteditorconstants.h index cbb91c46516..d53c09cf42a 100644 --- a/src/plugins/texteditor/texteditorconstants.h +++ b/src/plugins/texteditor/texteditorconstants.h @@ -243,8 +243,11 @@ const char TEXT_SNIPPET_GROUP_ID[] = "Text"; const char GLOBAL_SETTINGS_ID[] = "Global"; const char GENERIC_PROPOSAL_ID[] = "TextEditor.GenericProposalId"; -const char BOOKMARKS_PREV_ACTION[] = "Bookmarks.Previous"; -const char BOOKMARKS_NEXT_ACTION[] = "Bookmarks.Next"; +const char BOOKMARKS_PREV_ACTION[] = "Bookmarks.Previous"; +const char BOOKMARKS_NEXT_ACTION[] = "Bookmarks.Next"; +const char BOOKMARKS_MOVEUP_ACTION[] = "Bookmarks.MoveUp"; +const char BOOKMARKS_MOVEDOWN_ACTION[] = "Bookmarks.MoveDown"; +const char BOOKMARKS_SORTBYFILENAMES_ACTION[] = "Bookmarks.SortByFilenames"; /** * Delay before tooltip will be shown near completion assistant proposal