From 1a6b4d6d36f4a336817ee14ba2a28f877b1e0250 Mon Sep 17 00:00:00 2001 From: teknsl <64030674+teknsl@users.noreply.github.com> Date: Sat, 25 Oct 2025 18:13:12 +0200 Subject: [PATCH] feat: menu action to sort tabs alphabetically (#6551) --- CHANGELOG.md | 1 + src/widgets/Notebook.cpp | 22 ++++++++++++++++++++++ src/widgets/Notebook.hpp | 4 ++++ 3 files changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4303feb7..2a5592f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Minor: Added setting for character limit of deleted messages. (#6491) - Minor: Added link support to plugin message API. (#6386, #6527) - Minor: Added a description for the logging option under moderation tab. (#6514) +- Minor: Added a menu action to sort tabs alphabetically. (#6551) - Minor: Fixed "edit hotkey" dialog opening like a normal window. (#6540) - Bugfix: Expose the "Extra extension IDs" setting on non-Windows systems too. (#6509) - Bugfix: Fixed some commands and filters not working as expected in seach popups. (#6539) diff --git a/src/widgets/Notebook.cpp b/src/widgets/Notebook.cpp index 0ee58877..66a065ef 100644 --- a/src/widgets/Notebook.cpp +++ b/src/widgets/Notebook.cpp @@ -32,6 +32,7 @@ #include #include +#include #include namespace chatterino { @@ -1244,6 +1245,18 @@ bool Notebook::shouldShowTab(const NotebookTab *tab) const return true; } +void Notebook::sortTabsAlphabetically() +{ + std::ranges::sort(this->items_, [](const Item &a, const Item &b) { + const QString &lhs = a.tab->getTitle(); + const QString &rhs = b.tab->getTitle(); + return lhs.compare(rhs, Qt::CaseInsensitive) < 0; + }); + + getApp()->getWindows()->queueSave(); + this->performLayout(true); +} + SplitNotebook::SplitNotebook(Window *parent) : Notebook(parent) { @@ -1305,6 +1318,13 @@ SplitNotebook::SplitNotebook(Window *parent) }); tabVisibilityActionGroup->addAction(this->hideAllTabsAction); + this->sortTabsAlphabeticallyAction_ = + new QAction("Sort Tabs Alphabetically", this); + QObject::connect(this->sortTabsAlphabeticallyAction_, &QAction::triggered, + [this] { + this->sortTabsAlphabetically(); + }); + switch (getSettings()->tabVisibility.getEnum()) { case NotebookTabVisibility::AllTabs: { @@ -1393,6 +1413,8 @@ void SplitNotebook::addNotebookActionsToMenu(QMenu *menu) { Notebook::addNotebookActionsToMenu(menu); + menu->addAction(this->sortTabsAlphabeticallyAction_); + auto *submenu = menu->addMenu("Tab visibility"); submenu->addAction(this->showAllTabsAction); submenu->addAction(this->onlyShowLiveTabsAction); diff --git a/src/widgets/Notebook.hpp b/src/widgets/Notebook.hpp index 40fd675a..c4dd96e3 100644 --- a/src/widgets/Notebook.hpp +++ b/src/widgets/Notebook.hpp @@ -122,6 +122,8 @@ public: // Update layout and tab visibility void refresh(); + void sortTabsAlphabetically(); + protected: bool getShowTabs() const; void setShowTabs(bool value); @@ -264,6 +266,8 @@ protected: void showEvent(QShowEvent *event) override; private: + QAction *sortTabsAlphabeticallyAction_; + void addCustomButtons(); pajlada::Signals::SignalHolder signalHolder_;