From f2fa585bbd09c2ce93f2dcaa30c4b3e33bb84815 Mon Sep 17 00:00:00 2001 From: apa420 Date: Thu, 30 Jan 2025 17:49:56 +0100 Subject: [PATCH] Added more pages to the global search function --- src/widgets/helper/EditableModelView.cpp | 23 +- src/widgets/helper/EditableModelView.hpp | 3 +- src/widgets/settingspages/CommandPage.cpp | 61 +++-- src/widgets/settingspages/CommandPage.hpp | 4 + .../settingspages/HighlightingPage.cpp | 235 ++++++++++-------- .../settingspages/HighlightingPage.hpp | 8 + src/widgets/settingspages/IgnoresPage.cpp | 45 ++-- src/widgets/settingspages/IgnoresPage.hpp | 9 + .../settingspages/KeyboardSettingsPage.cpp | 40 +-- .../settingspages/KeyboardSettingsPage.hpp | 4 + src/widgets/settingspages/NicknamesPage.cpp | 39 +-- src/widgets/settingspages/NicknamesPage.hpp | 6 + 12 files changed, 296 insertions(+), 181 deletions(-) diff --git a/src/widgets/helper/EditableModelView.cpp b/src/widgets/helper/EditableModelView.cpp index 2d948c02e92..007cce8331c 100644 --- a/src/widgets/helper/EditableModelView.cpp +++ b/src/widgets/helper/EditableModelView.cpp @@ -150,26 +150,37 @@ void EditableModelView::addRegexHelpLink() this->addCustomButton(regexHelpLabel); } -void EditableModelView::filterSearchResults(QString *query, - std::vector *columnSelect) +bool EditableModelView::filterSearchResults(const QString &query, + std::vector &columnSelect) { + bool searchFoundSomething = false; auto rowAmount = this->model_->rowCount(); + + // make sure to show the page even if the table is empty, + // but only if we aren't search something + if (rowAmount == 0 && query.isEmpty()) + { + return true; + } + for (int i = 0; i < rowAmount; i++) { - tableView_->showRow(i); + tableView_->hideRow(i); } - for (int j : *columnSelect) + for (int j : columnSelect) { for (int i = 0; i < rowAmount; i++) { QModelIndex idx = model_->index(i, j); QVariant a = model_->data(idx); - if (!a.toString().contains(*query, Qt::CaseInsensitive)) + if (a.toString().contains(query, Qt::CaseInsensitive)) { - tableView_->hideRow(i); + tableView_->showRow(i); + searchFoundSomething = true; } } } + return searchFoundSomething; } void EditableModelView::filterSearchResultsHotkey( diff --git a/src/widgets/helper/EditableModelView.hpp b/src/widgets/helper/EditableModelView.hpp index 4dc2d375ec0..ecf8b54d2c4 100644 --- a/src/widgets/helper/EditableModelView.hpp +++ b/src/widgets/helper/EditableModelView.hpp @@ -26,7 +26,8 @@ class EditableModelView : public QWidget void addCustomButton(QWidget *widget); void addRegexHelpLink(); - void filterSearchResults(QString *query, std::vector *columnSelect); + bool filterSearchResults(const QString &query, + std::vector &columnSelect); void filterSearchResultsHotkey(const QKeySequence *keySequenceQuery); private: diff --git a/src/widgets/settingspages/CommandPage.cpp b/src/widgets/settingspages/CommandPage.cpp index 833ba713aa6..8105daaf246 100644 --- a/src/widgets/settingspages/CommandPage.cpp +++ b/src/widgets/settingspages/CommandPage.cpp @@ -33,17 +33,17 @@ QString c1settingsPath() return combinePath(qgetenv("appdata"), "Chatterino\\Custom\\Commands.txt"); } -void checkCommandDuplicates(EditableModelView *view, QLabel *duplicateWarning) +void checkCommandDuplicates(EditableModelView *view_, QLabel *duplicateWarning) { bool foundDuplicateTrigger = false; // Maps command triggers to model row indices std::unordered_map> commands; - for (int i = 0; i < view->getModel()->rowCount(); i++) + for (int i = 0; i < view_->getModel()->rowCount(); i++) { QString commandTrigger = - view->getModel()->index(i, 0).data().toString(); + view_->getModel()->index(i, 0).data().toString(); commands[commandTrigger].push_back(i); } @@ -57,14 +57,16 @@ void checkCommandDuplicates(EditableModelView *view, QLabel *duplicateWarning) for (const auto &rowIndex : rowIndices) { - view->getModel()->setData(view->getModel()->index(rowIndex, 0), - QColor("yellow"), Qt::ForegroundRole); + view_->getModel()->setData( + view_->getModel()->index(rowIndex, 0), QColor("yellow"), + Qt::ForegroundRole); } } else { - view->getModel()->setData(view->getModel()->index(rowIndices[0], 0), - QColor("white"), Qt::ForegroundRole); + view_->getModel()->setData( + view_->getModel()->index(rowIndices[0], 0), QColor("white"), + Qt::ForegroundRole); } } @@ -87,16 +89,16 @@ CommandPage::CommandPage() LayoutCreator layoutCreator(this); auto layout = layoutCreator.setLayoutType(); - auto *view = layout - .emplace( - getApp()->getCommands()->createModel(nullptr)) - .getElement(); + view_ = layout + .emplace( + getApp()->getCommands()->createModel(nullptr)) + .getElement(); - view->setTitles({"Trigger", "Command", "Show In\nMessage Menu"}); - view->getTableView()->horizontalHeader()->setSectionResizeMode( + view_->setTitles({"Trigger", "Command", "Show In\nMessage Menu"}); + view_->getTableView()->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch); - // We can safely ignore this signal connection since we own the view - std::ignore = view->addButtonPressed.connect([] { + // We can safely ignore this signal connection since we own the view_ + std::ignore = view_->addButtonPressed.connect([] { getApp()->getCommands()->items.append( Command{"/command", "I made a new command HeyGuys"}); }); @@ -105,7 +107,7 @@ CommandPage::CommandPage() if (QFile(c1settingsPath()).exists()) { auto *button = new QPushButton("Import commands from Chatterino 1"); - view->addCustomButton(button); + view_->addCustomButton(button); QObject::connect(button, &QPushButton::clicked, this, [] { QFile c1settings(c1settingsPath()); @@ -137,32 +139,39 @@ CommandPage::CommandPage() // NOTE: These signals mean that the duplicate check happens in the middle of a row being moved, where he index can be wrong. // This should be reconsidered, or potentially changed in the signalvectormodel. Or maybe we rely on a SignalVectorModel signal instead - QObject::connect(view->getModel(), &QAbstractItemModel::rowsInserted, this, - [view, duplicateWarning]() { - checkCommandDuplicates(view, duplicateWarning); + QObject::connect(view_->getModel(), &QAbstractItemModel::rowsInserted, this, + [this, duplicateWarning]() { + checkCommandDuplicates(view_, duplicateWarning); }); - QObject::connect(view->getModel(), &QAbstractItemModel::rowsRemoved, this, - [view, duplicateWarning]() { - checkCommandDuplicates(view, duplicateWarning); + QObject::connect(view_->getModel(), &QAbstractItemModel::rowsRemoved, this, + [this, duplicateWarning]() { + checkCommandDuplicates(view_, duplicateWarning); }); - QObject::connect(view->getModel(), &QAbstractItemModel::dataChanged, this, - [view, duplicateWarning](const QModelIndex &topLeft, + QObject::connect(view_->getModel(), &QAbstractItemModel::dataChanged, this, + [this, duplicateWarning](const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) { (void)topLeft; (void)bottomRight; if (roles.contains(Qt::EditRole)) { - checkCommandDuplicates(view, duplicateWarning); + checkCommandDuplicates(view_, duplicateWarning); } }); - checkCommandDuplicates(view, duplicateWarning); + checkCommandDuplicates(view_, duplicateWarning); // ---- end of layout this->commandsEditTimer_.setSingleShot(true); } +bool CommandPage::filterElements(const QString &query) +{ + auto *fields = new std::vector{0, 1}; + + return view_->filterSearchResults(query, *fields); +} + } // namespace chatterino diff --git a/src/widgets/settingspages/CommandPage.hpp b/src/widgets/settingspages/CommandPage.hpp index d88c00a615b..82fe613a654 100644 --- a/src/widgets/settingspages/CommandPage.hpp +++ b/src/widgets/settingspages/CommandPage.hpp @@ -6,13 +6,17 @@ namespace chatterino { +class EditableModelView; + class CommandPage : public SettingsPage { public: CommandPage(); + bool filterElements(const QString &query) override; private: QTimer commandsEditTimer_; + EditableModelView *view_; }; } // namespace chatterino diff --git a/src/widgets/settingspages/HighlightingPage.cpp b/src/widgets/settingspages/HighlightingPage.cpp index a6459d9b4fe..b8c4be3ce91 100644 --- a/src/widgets/settingspages/HighlightingPage.cpp +++ b/src/widgets/settingspages/HighlightingPage.cpp @@ -53,7 +53,8 @@ HighlightingPage::HighlightingPage() // getSettings()->enableHighlights)); // TABS - auto tabs = layout.emplace(); + tabsWidget_ = new QTabWidget(); + auto tabs = layout.append(tabsWidget_); { // HIGHLIGHTS auto highlights = tabs.appendTab(new QVBoxLayout, "Messages"); @@ -64,45 +65,49 @@ HighlightingPage::HighlightingPage() "Message highlights are prioritized over badge highlights " "and user highlights."); - auto *view = + viewMessages_ = highlights .emplace( (new HighlightModel(nullptr)) ->initialized( &getSettings()->highlightedMessages)) .getElement(); - view->addRegexHelpLink(); - view->setTitles({"Pattern", "Show in\nMentions", - "Flash\ntaskbar", "Enable\nregex", - "Case-\nsensitive", "Play\nsound", - "Custom\nsound", "Color"}); - view->getTableView()->horizontalHeader()->setSectionResizeMode( - QHeaderView::Fixed); - view->getTableView()->horizontalHeader()->setSectionResizeMode( - 0, QHeaderView::Stretch); - view->getTableView()->setItemDelegateForColumn( - HighlightModel::Column::Color, new ColorItemDelegate(view)); + viewMessages_->addRegexHelpLink(); + viewMessages_->setTitles({"Pattern", "Show in\nMentions", + "Flash\ntaskbar", "Enable\nregex", + "Case-\nsensitive", "Play\nsound", + "Custom\nsound", "Color"}); + viewMessages_->getTableView() + ->horizontalHeader() + ->setSectionResizeMode(QHeaderView::Fixed); + viewMessages_->getTableView() + ->horizontalHeader() + ->setSectionResizeMode(0, QHeaderView::Stretch); + viewMessages_->getTableView()->setItemDelegateForColumn( + HighlightModel::Column::Color, + new ColorItemDelegate(viewMessages_)); // fourtf: make class extrend BaseWidget and add this to // dpiChanged - QTimer::singleShot(1, [view] { - view->getTableView()->resizeColumnsToContents(); - view->getTableView()->setColumnWidth(0, 400); + QTimer::singleShot(1, [this] { + viewMessages_->getTableView()->resizeColumnsToContents(); + viewMessages_->getTableView()->setColumnWidth(0, 400); }); - // We can safely ignore this signal connection since we own the view - std::ignore = view->addButtonPressed.connect([] { + // We can safely ignore this signal connection since we own the viewMessages_ + std::ignore = viewMessages_->addButtonPressed.connect([] { getSettings()->highlightedMessages.append(HighlightPhrase{ "my phrase", true, true, false, false, false, "", *ColorProvider::instance().color( ColorType::SelfHighlight)}); }); - QObject::connect(view->getTableView(), &QTableView::clicked, - [this, view](const QModelIndex &clicked) { - this->tableCellClicked( - clicked, view, HighlightTab::Messages); - }); + QObject::connect( + viewMessages_->getTableView(), &QTableView::clicked, + [this](const QModelIndex &clicked) { + this->tableCellClicked(clicked, viewMessages_, + HighlightTab::Messages); + }); } auto pingUsers = tabs.appendTab(new QVBoxLayout, "Users"); @@ -112,52 +117,55 @@ HighlightingPage::HighlightingPage() "certain users.\n" "User highlights are prioritized over badge highlights, " "but under message highlights."); - EditableModelView *view = + viewUsers_ = pingUsers .emplace( (new UserHighlightModel(nullptr)) ->initialized(&getSettings()->highlightedUsers)) .getElement(); - view->addRegexHelpLink(); - view->getTableView()->horizontalHeader()->hideSection( + viewUsers_->addRegexHelpLink(); + viewUsers_->getTableView()->horizontalHeader()->hideSection( HighlightModel::Column::UseRegex); - view->getTableView()->horizontalHeader()->hideSection( + viewUsers_->getTableView()->horizontalHeader()->hideSection( HighlightModel::Column::CaseSensitive); // Case-sensitivity doesn't make sense for user names so it is // set to "false" by default & the column is hidden - view->setTitles({"Username", "Show in\nMentions", - "Flash\ntaskbar", "Enable\nregex", - "Case-\nsensitive", "Play\nsound", - "Custom\nsound", "Color"}); - view->getTableView()->horizontalHeader()->setSectionResizeMode( - QHeaderView::Fixed); - view->getTableView()->horizontalHeader()->setSectionResizeMode( - 0, QHeaderView::Stretch); - view->getTableView()->setItemDelegateForColumn( + viewUsers_->setTitles({"Username", "Show in\nMentions", + "Flash\ntaskbar", "Enable\nregex", + "Case-\nsensitive", "Play\nsound", + "Custom\nsound", "Color"}); + viewUsers_->getTableView() + ->horizontalHeader() + ->setSectionResizeMode(QHeaderView::Fixed); + viewUsers_->getTableView() + ->horizontalHeader() + ->setSectionResizeMode(0, QHeaderView::Stretch); + viewUsers_->getTableView()->setItemDelegateForColumn( UserHighlightModel::Column::Color, - new ColorItemDelegate(view)); + new ColorItemDelegate(viewUsers_)); // fourtf: make class extrend BaseWidget and add this to // dpiChanged - QTimer::singleShot(1, [view] { - view->getTableView()->resizeColumnsToContents(); - view->getTableView()->setColumnWidth(0, 200); + QTimer::singleShot(1, [this] { + viewUsers_->getTableView()->resizeColumnsToContents(); + viewUsers_->getTableView()->setColumnWidth(0, 200); }); - // We can safely ignore this signal connection since we own the view - std::ignore = view->addButtonPressed.connect([] { + // We can safely ignore this signal connection since we own the viewUsers_ + std::ignore = viewUsers_->addButtonPressed.connect([] { getSettings()->highlightedUsers.append(HighlightPhrase{ "highlighted user", true, true, false, false, false, "", *ColorProvider::instance().color( ColorType::SelfHighlight)}); }); - QObject::connect(view->getTableView(), &QTableView::clicked, - [this, view](const QModelIndex &clicked) { - this->tableCellClicked( - clicked, view, HighlightTab::Users); - }); + QObject::connect( + viewUsers_->getTableView(), &QTableView::clicked, + [this](const QModelIndex &clicked) { + this->tableCellClicked(clicked, viewUsers_, + HighlightTab::Users); + }); } auto badgeHighlights = tabs.appendTab(new QVBoxLayout, "Badges"); @@ -167,31 +175,35 @@ HighlightingPage::HighlightingPage() "user badges.\n" "Badge highlights are prioritzed under user and message " "highlights."); - auto *view = badgeHighlights - .emplace( - (new BadgeHighlightModel(nullptr)) - ->initialized( - &getSettings()->highlightedBadges)) - .getElement(); - view->setTitles({"Name", "Show In\nMentions", "Flash\ntaskbar", - "Play\nsound", "Custom\nsound", "Color"}); - view->getTableView()->horizontalHeader()->setSectionResizeMode( - QHeaderView::Fixed); - view->getTableView()->horizontalHeader()->setSectionResizeMode( - 0, QHeaderView::Stretch); - view->getTableView()->setItemDelegateForColumn( + viewBadges_ = + badgeHighlights + .emplace( + (new BadgeHighlightModel(nullptr)) + ->initialized( + &getSettings()->highlightedBadges)) + .getElement(); + viewBadges_->setTitles({"Name", "Show In\nMentions", + "Flash\ntaskbar", "Play\nsound", + "Custom\nsound", "Color"}); + viewBadges_->getTableView() + ->horizontalHeader() + ->setSectionResizeMode(QHeaderView::Fixed); + viewBadges_->getTableView() + ->horizontalHeader() + ->setSectionResizeMode(0, QHeaderView::Stretch); + viewBadges_->getTableView()->setItemDelegateForColumn( BadgeHighlightModel::Column::Color, - new ColorItemDelegate(view)); + new ColorItemDelegate(viewBadges_)); // fourtf: make class extrend BaseWidget and add this to // dpiChanged - QTimer::singleShot(1, [view] { - view->getTableView()->resizeColumnsToContents(); - view->getTableView()->setColumnWidth(0, 200); + QTimer::singleShot(1, [this] { + viewBadges_->getTableView()->resizeColumnsToContents(); + viewBadges_->getTableView()->setColumnWidth(0, 200); }); - // We can safely ignore this signal connection since we own the view - std::ignore = view->addButtonPressed.connect([this] { + // We can safely ignore this signal connection since we own the viewBadges_ + std::ignore = viewBadges_->addButtonPressed.connect([this] { auto d = std::make_shared( availableBadges, this); @@ -211,11 +223,12 @@ HighlightingPage::HighlightingPage() } }); - QObject::connect(view->getTableView(), &QTableView::clicked, - [this, view](const QModelIndex &clicked) { - this->tableCellClicked( - clicked, view, HighlightTab::Badges); - }); + QObject::connect( + viewBadges_->getTableView(), &QTableView::clicked, + [this](const QModelIndex &clicked) { + this->tableCellClicked(clicked, viewBadges_, + HighlightTab::Badges); + }); } auto disabledUsers = @@ -224,32 +237,37 @@ HighlightingPage::HighlightingPage() disabledUsers.emplace( "Disable notification sounds and highlights from certain " "users (e.g. bots)."); - EditableModelView *view = + viewBlacklistedUsers_ = disabledUsers .emplace( (new HighlightBlacklistModel(nullptr)) ->initialized(&getSettings()->blacklistedUsers)) .getElement(); - view->addRegexHelpLink(); - view->setTitles({"Username", "Enable\nregex"}); - view->getTableView()->horizontalHeader()->setSectionResizeMode( - QHeaderView::Fixed); - view->getTableView()->horizontalHeader()->setSectionResizeMode( - 0, QHeaderView::Stretch); + viewBlacklistedUsers_->addRegexHelpLink(); + viewBlacklistedUsers_->setTitles({"Username", "Enable\nregex"}); + viewBlacklistedUsers_->getTableView() + ->horizontalHeader() + ->setSectionResizeMode(QHeaderView::Fixed); + viewBlacklistedUsers_->getTableView() + ->horizontalHeader() + ->setSectionResizeMode(0, QHeaderView::Stretch); // fourtf: make class extrend BaseWidget and add this to // dpiChanged - QTimer::singleShot(1, [view] { - view->getTableView()->resizeColumnsToContents(); - view->getTableView()->setColumnWidth(0, 200); + QTimer::singleShot(1, [this] { + viewBlacklistedUsers_->getTableView() + ->resizeColumnsToContents(); + viewBlacklistedUsers_->getTableView()->setColumnWidth(0, + 200); }); - // We can safely ignore this signal connection since we own the view - std::ignore = view->addButtonPressed.connect([] { - getSettings()->blacklistedUsers.append( - HighlightBlacklistUser{"blacklisted user", false}); - }); + // We can safely ignore this signal connection since we own the viewBlacklistedUsers_ + std::ignore = + viewBlacklistedUsers_->addButtonPressed.connect([] { + getSettings()->blacklistedUsers.append( + HighlightBlacklistUser{"blacklisted user", false}); + }); } } @@ -322,20 +340,21 @@ HighlightingPage::HighlightingPage() } void HighlightingPage::openSoundDialog(const QModelIndex &clicked, - EditableModelView *view, int soundColumn) + EditableModelView *view_, + int soundColumn) { auto fileUrl = QFileDialog::getOpenFileUrl(this, tr("Open Sound"), QUrl(), tr("Audio Files (*.mp3 *.wav)")); - view->getModel()->setData(clicked, fileUrl, Qt::UserRole); - view->getModel()->setData(clicked, fileUrl.fileName(), Qt::DisplayRole); + view_->getModel()->setData(clicked, fileUrl, Qt::UserRole); + view_->getModel()->setData(clicked, fileUrl.fileName(), Qt::DisplayRole); } void HighlightingPage::openColorDialog(const QModelIndex &clicked, - EditableModelView *view, + EditableModelView *view_, HighlightTab tab) { auto initial = - view->getModel()->data(clicked, Qt::DecorationRole).value(); + view_->getModel()->data(clicked, Qt::DecorationRole).value(); auto *dialog = new ColorPickerDialog(initial, this); // TODO: The QModelIndex clicked is technically not safe to persist here since the model @@ -344,15 +363,15 @@ void HighlightingPage::openColorDialog(const QModelIndex &clicked, [=](auto selected) { if (selected.isValid()) { - view->getModel()->setData(clicked, selected, - Qt::DecorationRole); + view_->getModel()->setData(clicked, selected, + Qt::DecorationRole); } }); dialog->show(); } void HighlightingPage::tableCellClicked(const QModelIndex &clicked, - EditableModelView *view, + EditableModelView *view_, HighlightTab tab) { if (!clicked.flags().testFlag(Qt::ItemIsEnabled)) @@ -368,11 +387,11 @@ void HighlightingPage::tableCellClicked(const QModelIndex &clicked, if (clicked.column() == Column::SoundPath) { - this->openSoundDialog(clicked, view, Column::SoundPath); + this->openSoundDialog(clicked, view_, Column::SoundPath); } else if (clicked.column() == Column::Color) { - this->openColorDialog(clicked, view, tab); + this->openColorDialog(clicked, view_, tab); } } break; @@ -381,15 +400,35 @@ void HighlightingPage::tableCellClicked(const QModelIndex &clicked, using Column = BadgeHighlightModel::Column; if (clicked.column() == Column::SoundPath) { - this->openSoundDialog(clicked, view, Column::SoundPath); + this->openSoundDialog(clicked, view_, Column::SoundPath); } else if (clicked.column() == Column::Color) { - this->openColorDialog(clicked, view, tab); + this->openColorDialog(clicked, view_, tab); } } break; } } +bool HighlightingPage::filterElements(const QString &query) +{ + auto *fields = new std::vector{0}; + + bool matchMessages = viewMessages_->filterSearchResults(query, *fields); + tabsWidget_->setTabVisible(0, matchMessages); + + bool matchUsers = viewUsers_->filterSearchResults(query, *fields); + tabsWidget_->setTabVisible(1, matchUsers); + + bool matchBadges = viewBadges_->filterSearchResults(query, *fields); + tabsWidget_->setTabVisible(2, matchBadges); + + bool matchBlacklistedUsers = + viewBlacklistedUsers_->filterSearchResults(query, *fields); + tabsWidget_->setTabVisible(3, matchBlacklistedUsers); + + return matchMessages || matchUsers || matchBadges || matchBlacklistedUsers; +} + } // namespace chatterino diff --git a/src/widgets/settingspages/HighlightingPage.hpp b/src/widgets/settingspages/HighlightingPage.hpp index 47a9c3e3a32..e893e90b8d1 100644 --- a/src/widgets/settingspages/HighlightingPage.hpp +++ b/src/widgets/settingspages/HighlightingPage.hpp @@ -1,5 +1,6 @@ #pragma once +#include "util/LayoutCreator.hpp" #include "widgets/settingspages/SettingsPage.hpp" #include @@ -16,10 +17,17 @@ class HighlightingPage : public SettingsPage { public: HighlightingPage(); + bool filterElements(const QString &query) override; private: enum HighlightTab { Messages = 0, Users = 1, Badges = 2, Blacklist = 3 }; + QTabWidget *tabsWidget_; + EditableModelView *viewMessages_; + EditableModelView *viewUsers_; + EditableModelView *viewBadges_; + EditableModelView *viewBlacklistedUsers_; + QTimer disabledUsersChangedTimer_; void tableCellClicked(const QModelIndex &clicked, EditableModelView *view, diff --git a/src/widgets/settingspages/IgnoresPage.cpp b/src/widgets/settingspages/IgnoresPage.cpp index 8445fdebfce..c4af34fc9ae 100644 --- a/src/widgets/settingspages/IgnoresPage.cpp +++ b/src/widgets/settingspages/IgnoresPage.cpp @@ -32,7 +32,9 @@ IgnoresPage::IgnoresPage() { LayoutCreator layoutCreator(this); auto layout = layoutCreator.setLayoutType(); - auto tabs = layout.emplace(); + + tabsWidget_ = new QTabWidget(); + auto tabs = layout.append(tabsWidget_); addPhrasesTab(tabs.appendTab(new QVBoxLayout, "Messages")); addUsersTab(*this, tabs.appendTab(new QVBoxLayout, "Users"), @@ -40,30 +42,29 @@ IgnoresPage::IgnoresPage() this->onShow(); } -void addPhrasesTab(LayoutCreator layout) +void IgnoresPage::addPhrasesTab(LayoutCreator layout) { layout.emplace("Ignore messages based certain patterns."); - EditableModelView *view = - layout - .emplace( - (new IgnoreModel(nullptr)) - ->initialized(&getSettings()->ignoredMessages)) - .getElement(); - view->setTitles( + viewMessages_ = layout + .emplace( + (new IgnoreModel(nullptr)) + ->initialized(&getSettings()->ignoredMessages)) + .getElement(); + viewMessages_->setTitles( {"Pattern", "Regex", "Case-sensitive", "Block", "Replacement"}); - view->getTableView()->horizontalHeader()->setSectionResizeMode( + viewMessages_->getTableView()->horizontalHeader()->setSectionResizeMode( QHeaderView::Fixed); - view->getTableView()->horizontalHeader()->setSectionResizeMode( + viewMessages_->getTableView()->horizontalHeader()->setSectionResizeMode( 0, QHeaderView::Stretch); - view->addRegexHelpLink(); + viewMessages_->addRegexHelpLink(); - QTimer::singleShot(1, [view] { - view->getTableView()->resizeColumnsToContents(); - view->getTableView()->setColumnWidth(0, 200); + QTimer::singleShot(1, [this] { + viewMessages_->getTableView()->resizeColumnsToContents(); + viewMessages_->getTableView()->setColumnWidth(0, 200); }); - // We can safely ignore this signal connection since we own the view - std::ignore = view->addButtonPressed.connect([] { + // We can safely ignore this signal connection since we own the viewMessages_ + std::ignore = viewMessages_->addButtonPressed.connect([] { getSettings()->ignoredMessages.append( IgnorePhrase{"my pattern", false, false, getSettings()->ignoredPhraseReplace.getValue(), true}); @@ -139,4 +140,14 @@ void IgnoresPage::onShow() this->userListModel_.setStringList(users); } +bool IgnoresPage::filterElements(const QString &query) +{ + auto *fields = new std::vector{0, 4}; + + bool matchMessages = viewMessages_->filterSearchResults(query, *fields); + tabsWidget_->setTabVisible(0, matchMessages); + + return matchMessages; +} + } // namespace chatterino diff --git a/src/widgets/settingspages/IgnoresPage.hpp b/src/widgets/settingspages/IgnoresPage.hpp index db1a22f3b1d..2506a23a18a 100644 --- a/src/widgets/settingspages/IgnoresPage.hpp +++ b/src/widgets/settingspages/IgnoresPage.hpp @@ -1,5 +1,6 @@ #pragma once +#include "util/LayoutCreator.hpp" #include "widgets/settingspages/SettingsPage.hpp" #include @@ -8,6 +9,8 @@ class QVBoxLayout; namespace chatterino { +class EditableModelView; + class IgnoresPage : public SettingsPage { public: @@ -15,8 +18,14 @@ class IgnoresPage : public SettingsPage void onShow() final; + bool filterElements(const QString &query) override; + private: QStringListModel userListModel_; + QTabWidget *tabsWidget_; + EditableModelView *viewMessages_; + + void addPhrasesTab(LayoutCreator layout); }; } // namespace chatterino diff --git a/src/widgets/settingspages/KeyboardSettingsPage.cpp b/src/widgets/settingspages/KeyboardSettingsPage.cpp index 80893e7e521..2eadac77a0a 100644 --- a/src/widgets/settingspages/KeyboardSettingsPage.cpp +++ b/src/widgets/settingspages/KeyboardSettingsPage.cpp @@ -50,19 +50,18 @@ KeyboardSettingsPage::KeyboardSettingsPage() auto layout = layoutCreator.emplace(); auto *model = getApp()->getHotkeys()->createModel(nullptr); - EditableModelView *view = - layout.emplace(model).getElement(); + view_ = layout.emplace(model).getElement(); - view->setTitles({"Hotkey name", "Keybinding"}); - view->getTableView()->horizontalHeader()->setVisible(true); - view->getTableView()->horizontalHeader()->setStretchLastSection(false); - view->getTableView()->horizontalHeader()->setSectionResizeMode( + view_->setTitles({"Hotkey name", "Keybinding"}); + view_->getTableView()->horizontalHeader()->setVisible(true); + view_->getTableView()->horizontalHeader()->setStretchLastSection(false); + view_->getTableView()->horizontalHeader()->setSectionResizeMode( QHeaderView::ResizeToContents); - view->getTableView()->horizontalHeader()->setSectionResizeMode( + view_->getTableView()->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch); - // We can safely ignore this signal connection since we own the view - std::ignore = view->addButtonPressed.connect([] { + // We can safely ignore this signal connection since we own the view_ + std::ignore = view_->addButtonPressed.connect([] { EditHotkeyDialog dialog(nullptr); bool wasAccepted = dialog.exec() == 1; @@ -74,9 +73,9 @@ KeyboardSettingsPage::KeyboardSettingsPage() } }); - QObject::connect(view->getTableView(), &QTableView::doubleClicked, - [view, model](const QModelIndex &clicked) { - tableCellClicked(clicked, view, model); + QObject::connect(view_->getTableView(), &QTableView::doubleClicked, + [this, model](const QModelIndex &clicked) { + tableCellClicked(clicked, view_, model); }); auto *keySequenceInput = new QKeySequenceEdit(this); @@ -84,11 +83,11 @@ KeyboardSettingsPage::KeyboardSettingsPage() auto *searchText = new QLabel("Search keybind:", this); QObject::connect(keySequenceInput, &QKeySequenceEdit::keySequenceChanged, - [view](const QKeySequence &keySequence) { - view->filterSearchResultsHotkey(&keySequence); + [this](const QKeySequence &keySequence) { + view_->filterSearchResultsHotkey(&keySequence); }); - view->addCustomButton(searchText); - view->addCustomButton(keySequenceInput); + view_->addCustomButton(searchText); + view_->addCustomButton(keySequenceInput); auto *resetEverything = new QPushButton("Reset to defaults"); QObject::connect(resetEverything, &QPushButton::clicked, [this]() { @@ -102,7 +101,7 @@ KeyboardSettingsPage::KeyboardSettingsPage() getApp()->getHotkeys()->resetToDefaults(); } }); - view->addCustomButton(resetEverything); + view_->addCustomButton(resetEverything); // We only check this once since a user *should* not have the ability to create a new hotkey with a deprecated or removed action // However, we also don't update this after the user has deleted a hotkey. This is a big lift that should probably be solved on the model level rather @@ -141,4 +140,11 @@ KeyboardSettingsPage::KeyboardSettingsPage() } } +bool KeyboardSettingsPage::filterElements(const QString &query) +{ + auto *fields = new std::vector{0, 1}; + + return view_->filterSearchResults(query, *fields); +} + } // namespace chatterino diff --git a/src/widgets/settingspages/KeyboardSettingsPage.hpp b/src/widgets/settingspages/KeyboardSettingsPage.hpp index fcd9eed613b..a18c3acde3d 100644 --- a/src/widgets/settingspages/KeyboardSettingsPage.hpp +++ b/src/widgets/settingspages/KeyboardSettingsPage.hpp @@ -11,6 +11,10 @@ class KeyboardSettingsPage : public SettingsPage { public: KeyboardSettingsPage(); + bool filterElements(const QString &query) override; + +private: + EditableModelView *view_; }; } // namespace chatterino diff --git a/src/widgets/settingspages/NicknamesPage.cpp b/src/widgets/settingspages/NicknamesPage.cpp index 581af22c1e9..7622f0f176c 100644 --- a/src/widgets/settingspages/NicknamesPage.cpp +++ b/src/widgets/settingspages/NicknamesPage.cpp @@ -22,31 +22,38 @@ NicknamesPage::NicknamesPage() "filters." "\nWith those features you will still need to use the user's original " "name."); - EditableModelView *view = - layout - .emplace( - (new NicknamesModel(nullptr)) - ->initialized(&getSettings()->nicknames)) - .getElement(); - - view->setTitles({"Username", "Nickname", "Enable regex", "Case-sensitive"}); - view->getTableView()->horizontalHeader()->setSectionResizeMode( + view_ = layout + .emplace( + (new NicknamesModel(nullptr)) + ->initialized(&getSettings()->nicknames)) + .getElement(); + + view_->setTitles( + {"Username", "Nickname", "Enable regex", "Case-sensitive"}); + view_->getTableView()->horizontalHeader()->setSectionResizeMode( QHeaderView::Fixed); - view->getTableView()->horizontalHeader()->setSectionResizeMode( + view_->getTableView()->horizontalHeader()->setSectionResizeMode( 0, QHeaderView::Stretch); - view->getTableView()->horizontalHeader()->setSectionResizeMode( + view_->getTableView()->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch); - // We can safely ignore this signal connection since we own the view - std::ignore = view->addButtonPressed.connect([] { + // We can safely ignore this signal connection since we own the view_ + std::ignore = view_->addButtonPressed.connect([] { getSettings()->nicknames.append( Nickname{"Username", "Nickname", false, false}); }); - QTimer::singleShot(1, [view] { - view->getTableView()->resizeColumnsToContents(); - view->getTableView()->setColumnWidth(0, 200); + QTimer::singleShot(1, [this] { + view_->getTableView()->resizeColumnsToContents(); + view_->getTableView()->setColumnWidth(0, 200); }); } +bool NicknamesPage::filterElements(const QString &query) +{ + auto *fields = new std::vector{0, 1}; + + return view_->filterSearchResults(query, *fields); +} + } // namespace chatterino diff --git a/src/widgets/settingspages/NicknamesPage.hpp b/src/widgets/settingspages/NicknamesPage.hpp index a3cf9e64152..d64850b057c 100644 --- a/src/widgets/settingspages/NicknamesPage.hpp +++ b/src/widgets/settingspages/NicknamesPage.hpp @@ -4,10 +4,16 @@ namespace chatterino { +class EditableModelView; + class NicknamesPage : public SettingsPage { public: NicknamesPage(); + bool filterElements(const QString &query) override; + +private: + EditableModelView *view_; }; } // namespace chatterino