From 9c7c99928f85da618f1d4b6fd452cf55373b0ace Mon Sep 17 00:00:00 2001 From: DatGuy1 Date: Thu, 5 Jul 2018 16:58:20 +0300 Subject: [PATCH] Add highlighting of all messages from a certain user (#564) * Rework to use controllers * Rework to use controllers * Add doHighlight * Cherry pick? * Fixes per PR * Remove file --- chatterino.pro | 2 ++ .../highlights/HighlightController.cpp | 21 +++++++++++ .../highlights/HighlightController.hpp | 4 +++ .../highlights/UserHighlightModel.hpp | 27 ++++++++++++++ .../highlights/userhighlightmodel.cpp | 36 +++++++++++++++++++ src/providers/twitch/TwitchMessageBuilder.cpp | 21 +++++++++++ .../settingspages/HighlightingPage.cpp | 24 +++++++++++++ 7 files changed, 135 insertions(+) create mode 100644 src/controllers/highlights/UserHighlightModel.hpp create mode 100644 src/controllers/highlights/userhighlightmodel.cpp diff --git a/chatterino.pro b/chatterino.pro index 05f716ae8..413d11e04 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -113,6 +113,7 @@ SOURCES += \ src/controllers/highlights/HighlightController.cpp \ src/controllers/highlights/HighlightModel.cpp \ src/controllers/highlights/HighlightBlacklistModel.cpp \ + src/controllers/highlights/UserHighlightModel.cpp \ src/controllers/ignores/IgnoreController.cpp \ src/controllers/ignores/IgnoreModel.cpp \ src/controllers/taggedusers/TaggedUser.cpp \ @@ -260,6 +261,7 @@ HEADERS += \ src/controllers/highlights/HighlightBlacklistModel.hpp \ src/controllers/highlights/HighlightPhrase.hpp \ src/controllers/highlights/HighlightBlacklistUser.hpp \ + src/controllers/highlights/UserHighlightModel.hpp \ src/controllers/ignores/IgnoreController.hpp \ src/controllers/ignores/IgnoreModel.hpp \ src/controllers/ignores/IgnorePhrase.hpp \ diff --git a/src/controllers/highlights/HighlightController.cpp b/src/controllers/highlights/HighlightController.cpp index 2e49dd34d..db759deee 100644 --- a/src/controllers/highlights/HighlightController.cpp +++ b/src/controllers/highlights/HighlightController.cpp @@ -3,6 +3,7 @@ #include "Application.hpp" #include "controllers/highlights/HighlightBlacklistModel.hpp" #include "controllers/highlights/HighlightModel.hpp" +#include "controllers/highlights/UserHighlightModel.hpp" #include "widgets/dialogs/NotificationPopup.hpp" namespace chatterino { @@ -33,6 +34,26 @@ HighlightModel *HighlightController::createModel(QObject *parent) return model; } +UserHighlightModel *HighlightController::createUserModel(QObject *parent) +{ + auto *model = new UserHighlightModel(parent); + model->init(&this->highlightedUsers); + + return model; +} + +bool HighlightController::isHighlightedUser(const QString &username) +{ + const auto &userItems = this->highlightedUsers.getVector(); + for (const auto &highlightedUser : userItems) { + if (highlightedUser.isMatch(username)) { + return true; + } + } + + return false; +} + HighlightBlacklistModel *HighlightController::createBlacklistModel(QObject *parent) { auto *model = new HighlightBlacklistModel(parent); diff --git a/src/controllers/highlights/HighlightController.hpp b/src/controllers/highlights/HighlightController.hpp index 916641455..eef884b7e 100644 --- a/src/controllers/highlights/HighlightController.hpp +++ b/src/controllers/highlights/HighlightController.hpp @@ -8,6 +8,7 @@ namespace chatterino { +class UserHighlightModel; class HighlightModel; class HighlightBlacklistModel; @@ -20,10 +21,13 @@ public: UnsortedSignalVector phrases; UnsortedSignalVector blacklistedUsers; + UnsortedSignalVector highlightedUsers; HighlightModel *createModel(QObject *parent); HighlightBlacklistModel *createBlacklistModel(QObject *parent); + UserHighlightModel *createUserModel(QObject *parent); + bool isHighlightedUser(const QString &username); bool blacklistContains(const QString &username); void addHighlight(const MessagePtr &msg); diff --git a/src/controllers/highlights/UserHighlightModel.hpp b/src/controllers/highlights/UserHighlightModel.hpp new file mode 100644 index 000000000..b6a4023be --- /dev/null +++ b/src/controllers/highlights/UserHighlightModel.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include + +#include "common/SignalVectorModel.hpp" +#include "controllers/highlights/HighlightPhrase.hpp" + +namespace chatterino { + +class HighlightController; + +class UserHighlightModel : public SignalVectorModel +{ + explicit UserHighlightModel(QObject *parent); + +protected: + // vector into model row + virtual HighlightPhrase getItemFromRow(std::vector &row, + const HighlightPhrase &original) override; + + virtual void getRowFromItem(const HighlightPhrase &item, + std::vector &row) override; + + friend class HighlightController; +}; + +} // namespace chatterino diff --git a/src/controllers/highlights/userhighlightmodel.cpp b/src/controllers/highlights/userhighlightmodel.cpp new file mode 100644 index 000000000..92b862d60 --- /dev/null +++ b/src/controllers/highlights/userhighlightmodel.cpp @@ -0,0 +1,36 @@ +#include "UserHighlightModel.hpp" + +#include "Application.hpp" +#include "singletons/Settings.hpp" +#include "util/StandardItemHelper.hpp" + +namespace chatterino { + +// commandmodel +UserHighlightModel::UserHighlightModel(QObject *parent) + : SignalVectorModel(4, parent) +{ +} + +// turn vector item into model row +HighlightPhrase UserHighlightModel::getItemFromRow(std::vector &row, + const HighlightPhrase &original) +{ + // key, regex + + return HighlightPhrase{ + row[0]->data(Qt::DisplayRole).toString(), row[1]->data(Qt::CheckStateRole).toBool(), + row[2]->data(Qt::CheckStateRole).toBool(), row[3]->data(Qt::CheckStateRole).toBool()}; +} + +// row into vector item +void UserHighlightModel::getRowFromItem(const HighlightPhrase &item, + std::vector &row) +{ + setStringItem(row[0], item.getPattern()); + setBoolItem(row[1], item.getAlert()); + setBoolItem(row[2], item.getSound()); + setBoolItem(row[3], item.isRegex()); +} + +} // namespace chatterino diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index aa6ab58f8..cfae0010e 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -465,6 +465,7 @@ void TwitchMessageBuilder::parseHighlights() // TODO: This vector should only be rebuilt upon highlights being changed // fourtf: should be implemented in the HighlightsController std::vector activeHighlights = app->highlights->phrases.getVector(); + std::vector userHighlights = app->highlights->highlightedUsers.getVector(); if (app->settings->enableHighlightsSelf && currentUsername.size() > 0) { HighlightPhrase selfHighlight(currentUsername, app->settings->enableHighlightTaskbar, @@ -500,6 +501,26 @@ void TwitchMessageBuilder::parseHighlights() } } } + for (const HighlightPhrase &userHighlight : userHighlights) { + if (userHighlight.isMatch(this->ircMessage->nick())) { + Log("Highlight because user {} sent a message", this->ircMessage->nick()); + doHighlight = true; + + if (userHighlight.getAlert()) { + doAlert = true; + } + + if (userHighlight.getSound()) { + playSound = true; + } + + if (playSound && doAlert) { + // Break if no further action can be taken from other usernames + // Mostly used for regex stuff + break; + } + } + } this->setHighlight(doHighlight); diff --git a/src/widgets/settingspages/HighlightingPage.cpp b/src/widgets/settingspages/HighlightingPage.cpp index 7c8886531..46bedfcfc 100644 --- a/src/widgets/settingspages/HighlightingPage.cpp +++ b/src/widgets/settingspages/HighlightingPage.cpp @@ -4,6 +4,7 @@ #include "controllers/highlights/HighlightBlacklistModel.hpp" #include "controllers/highlights/HighlightController.hpp" #include "controllers/highlights/HighlightModel.hpp" +#include "controllers/highlights/UserHighlightModel.hpp" #include "debug/Log.hpp" #include "singletons/Settings.hpp" #include "util/LayoutCreator.hpp" @@ -88,6 +89,29 @@ HighlightingPage::HighlightingPage() HighlightBlacklistUser{"blacklisted user", false}); }); } + + auto pingUsers = tabs.appendTab(new QVBoxLayout, "Highlight on message"); + { + EditableModelView *view = + pingUsers.emplace(app->highlights->createUserModel(nullptr)) + .getElement(); + + view->setTitles({"Username", "Flash taskbar", "Play sound", "Regex"}); + view->getTableView()->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed); + view->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); + }); + + view->addButtonPressed.connect([] { + getApp()->highlights->highlightedUsers.appendItem( + HighlightPhrase{"highlighted user", true, false, false}); + }); + } } // MISC