From 5fc6141091f6abe616115859e6d99a7578bfede1 Mon Sep 17 00:00:00 2001 From: apa420 Date: Sun, 2 Feb 2025 12:24:29 +0100 Subject: [PATCH 1/3] Make base pr --- src/widgets/helper/EditableModelView.cpp | 56 ++++++++++++++++++++++++ src/widgets/helper/EditableModelView.hpp | 5 +++ 2 files changed, 61 insertions(+) diff --git a/src/widgets/helper/EditableModelView.cpp b/src/widgets/helper/EditableModelView.cpp index c2d9ee6c7f6..f935d280510 100644 --- a/src/widgets/helper/EditableModelView.cpp +++ b/src/widgets/helper/EditableModelView.cpp @@ -150,6 +150,62 @@ void EditableModelView::addRegexHelpLink() this->addCustomButton(regexHelpLabel); } +bool EditableModelView::filterSearchResults(const QString &query, + std::span 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_->hideRow(i); + } + 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)) + { + tableView_->showRow(i); + searchFoundSomething = true; + } + } + } + return searchFoundSomething; +} + +void EditableModelView::filterSearchResultsHotkey( + const QKeySequence &keySequenceQuery) +{ + auto rowAmount = this->model_->rowCount(); + for (int i = 0; i < rowAmount; i++) + { + tableView_->hideRow(i); + } + for (int i = 0; i < rowAmount; i++) + { + QModelIndex idx = model_->index(i, 1); + QVariant a = model_->data(idx); + auto seq = qvariant_cast(a); + + // todo: Make this fuzzy match, right now only exact matches happen + // so ctrl+f won't match ctrl+shift+f shortcuts + if (keySequenceQuery.matches(seq) != QKeySequence::NoMatch) + { + tableView_->showRow(i); + } + } +} + void EditableModelView::moveRow(int dir) { auto selected = this->getTableView()->selectionModel()->selectedRows(0); diff --git a/src/widgets/helper/EditableModelView.hpp b/src/widgets/helper/EditableModelView.hpp index 37bff144a76..56cbe7f490c 100644 --- a/src/widgets/helper/EditableModelView.hpp +++ b/src/widgets/helper/EditableModelView.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include class QAbstractTableModel; @@ -25,6 +26,10 @@ class EditableModelView : public QWidget void addCustomButton(QWidget *widget); void addRegexHelpLink(); + bool filterSearchResults(const QString &query, + std::span columnSelect); + void filterSearchResultsHotkey(const QKeySequence &keySequenceQuery); + private: QTableView *tableView_{}; QAbstractTableModel *model_{}; From 471491b9047d2ad081926c323f6f207ec023d5f8 Mon Sep 17 00:00:00 2001 From: apa420 Date: Sun, 2 Feb 2025 12:31:47 +0100 Subject: [PATCH 2/3] Add command page tables to global search --- src/widgets/settingspages/CommandPage.cpp | 45 +++++++++++++---------- src/widgets/settingspages/CommandPage.hpp | 4 ++ 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/widgets/settingspages/CommandPage.cpp b/src/widgets/settingspages/CommandPage.cpp index 833ba713aa6..43c88d62170 100644 --- a/src/widgets/settingspages/CommandPage.cpp +++ b/src/widgets/settingspages/CommandPage.cpp @@ -87,16 +87,16 @@ CommandPage::CommandPage() LayoutCreator layoutCreator(this); auto layout = layoutCreator.setLayoutType(); - auto *view = layout - .emplace( - getApp()->getCommands()->createModel(nullptr)) - .getElement(); + this->view_ = layout + .emplace( + getApp()->getCommands()->createModel(nullptr)) + .getElement(); - view->setTitles({"Trigger", "Command", "Show In\nMessage Menu"}); - view->getTableView()->horizontalHeader()->setSectionResizeMode( + this->view_->setTitles({"Trigger", "Command", "Show In\nMessage Menu"}); + this->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 this->view_ + std::ignore = this->view_->addButtonPressed.connect([] { getApp()->getCommands()->items.append( Command{"/command", "I made a new command HeyGuys"}); }); @@ -105,7 +105,7 @@ CommandPage::CommandPage() if (QFile(c1settingsPath()).exists()) { auto *button = new QPushButton("Import commands from Chatterino 1"); - view->addCustomButton(button); + this->view_->addCustomButton(button); QObject::connect(button, &QPushButton::clicked, this, [] { QFile c1settings(c1settingsPath()); @@ -137,32 +137,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) +{ + std::array fields{0, 1}; + + return this->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 From 012733f490b3d84f3bea0859d0c1d4311a6b17bf Mon Sep 17 00:00:00 2001 From: apa420 Date: Fri, 7 Feb 2025 14:51:58 +0100 Subject: [PATCH 3/3] adhere to previous convention --- src/widgets/settingspages/CommandPage.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/widgets/settingspages/CommandPage.cpp b/src/widgets/settingspages/CommandPage.cpp index 43c88d62170..094fab690f8 100644 --- a/src/widgets/settingspages/CommandPage.cpp +++ b/src/widgets/settingspages/CommandPage.cpp @@ -87,16 +87,18 @@ CommandPage::CommandPage() LayoutCreator layoutCreator(this); auto layout = layoutCreator.setLayoutType(); - this->view_ = layout - .emplace( - getApp()->getCommands()->createModel(nullptr)) - .getElement(); + EditableModelView *view = + layout + .emplace( + getApp()->getCommands()->createModel(nullptr)) + .getElement(); + this->view_ = view; - this->view_->setTitles({"Trigger", "Command", "Show In\nMessage Menu"}); - this->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 this->view_ - std::ignore = this->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"); - this->view_->addCustomButton(button); + view->addCustomButton(button); QObject::connect(button, &QPushButton::clicked, this, [] { QFile c1settings(c1settingsPath());