From b6bd36ac16f3fbc3717385a3c2fe365535206159 Mon Sep 17 00:00:00 2001
From: Emi Simpson <emi@alchemi.dev>
Date: Sun, 15 Mar 2020 11:19:22 -0400
Subject: [PATCH] Added toggle in the settings to ignore minor events

---
 src/ChatPage.cpp         |  2 +-
 src/RoomInfoListItem.cpp | 17 ++++++++++-------
 src/RoomInfoListItem.h   |  8 +++++++-
 src/RoomList.cpp         |  8 +++++---
 src/RoomList.h           |  6 +++++-
 src/UserSettingsPage.cpp |  9 +++++++++
 src/UserSettingsPage.h   |  9 +++++++++
 7 files changed, 46 insertions(+), 13 deletions(-)

diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index 698a4ae2d..7674f11cf 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -100,7 +100,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
 
         user_info_widget_    = new UserInfoWidget(sideBar_);
         user_mentions_popup_ = new popups::UserMentions();
-        room_list_           = new RoomList(sideBar_);
+        room_list_           = new RoomList(userSettings, sideBar_);
         connect(room_list_, &RoomList::joinRoom, this, &ChatPage::joinRoom);
 
         sideBarLayout_->addWidget(user_info_widget_);
diff --git a/src/RoomInfoListItem.cpp b/src/RoomInfoListItem.cpp
index 26c4e8cf7..d7537d643 100644
--- a/src/RoomInfoListItem.cpp
+++ b/src/RoomInfoListItem.cpp
@@ -26,6 +26,7 @@
 #include "Config.h"
 #include "RoomInfoListItem.h"
 #include "Splitter.h"
+#include "UserSettingsPage.h"
 #include "Utils.h"
 #include "ui/Menu.h"
 #include "ui/Ripple.h"
@@ -99,7 +100,10 @@ RoomInfoListItem::init(QWidget *parent)
         menu_->addAction(leaveRoom_);
 }
 
-RoomInfoListItem::RoomInfoListItem(QString room_id, const RoomInfo &info, QWidget *parent)
+RoomInfoListItem::RoomInfoListItem(QString room_id,
+                                   const RoomInfo &info,
+                                   QSharedPointer<UserSettings> userSettings,
+                                   QWidget *parent)
   : QWidget(parent)
   , roomType_{info.is_invite ? RoomType::Invited : RoomType::Joined}
   , roomId_(std::move(room_id))
@@ -107,6 +111,7 @@ RoomInfoListItem::RoomInfoListItem(QString room_id, const RoomInfo &info, QWidge
   , isPressed_(false)
   , unreadMsgCount_(0)
   , unreadHighlightedMsgCount_(0)
+  , settings(userSettings)
 {
         init(parent);
 }
@@ -336,18 +341,16 @@ enum NotificationImportance : unsigned short
 unsigned short int
 RoomInfoListItem::calculateImportance() const
 {
-        // 0: All messages and minor events read
-        // 1: Contains unread minor events (joins/notices/muted messages)
-        // 2: Contains unread messages
-        // 3: Contains mentions
-        // 4: Is a room invite
+        // Returns the degree of importance of the unread messages in the room.
+        // If ignoreMinorEvents is set to true in the settings, then
+        // NewMinorEvents will always be rounded down to AllEventsRead
         if (isInvite()) {
                 return Invite;
         } else if (unreadHighlightedMsgCount_) {
                 return NewMentions;
         } else if (unreadMsgCount_) {
                 return NewMessage;
-        } else if (hasUnreadMessages_) {
+        } else if (hasUnreadMessages_ && !settings->isIgnoreMinorEventsEnabled()) {
                 return NewMinorEvents;
         } else {
                 return AllEventsRead;
diff --git a/src/RoomInfoListItem.h b/src/RoomInfoListItem.h
index a246e487c..9361a20b8 100644
--- a/src/RoomInfoListItem.h
+++ b/src/RoomInfoListItem.h
@@ -25,6 +25,7 @@
 #include <mtx/responses.hpp>
 
 #include "CacheStructs.h"
+#include "UserSettingsPage.h"
 #include "ui/Avatar.h"
 
 class Menu;
@@ -63,7 +64,10 @@ class RoomInfoListItem : public QWidget
         Q_PROPERTY(QColor btnTextColor READ btnTextColor WRITE setBtnTextColor)
 
 public:
-        RoomInfoListItem(QString room_id, const RoomInfo &info, QWidget *parent = nullptr);
+        RoomInfoListItem(QString room_id,
+                         const RoomInfo &info,
+                         QSharedPointer<UserSettings> userSettings,
+                         QWidget *parent = nullptr);
 
         void updateUnreadMessageCount(int count, int highlightedCount);
         void clearUnreadMessageCount() { updateUnreadMessageCount(0, 0); };
@@ -216,4 +220,6 @@ private:
 
         QColor bubbleBgColor_;
         QColor bubbleFgColor_;
+
+        QSharedPointer<UserSettings> settings;
 };
diff --git a/src/RoomList.cpp b/src/RoomList.cpp
index 74a7ff6fb..a9ce957ab 100644
--- a/src/RoomList.cpp
+++ b/src/RoomList.cpp
@@ -27,11 +27,13 @@
 #include "MainWindow.h"
 #include "RoomInfoListItem.h"
 #include "RoomList.h"
+#include "UserSettingsPage.h"
 #include "Utils.h"
 #include "ui/OverlayModal.h"
 
-RoomList::RoomList(QWidget *parent)
+RoomList::RoomList(QSharedPointer<UserSettings> userSettings, QWidget *parent)
   : QWidget(parent)
+  , settings(userSettings)
 {
         topLayout_ = new QVBoxLayout(this);
         topLayout_->setSpacing(0);
@@ -68,7 +70,7 @@ RoomList::RoomList(QWidget *parent)
 void
 RoomList::addRoom(const QString &room_id, const RoomInfo &info)
 {
-        auto room_item = new RoomInfoListItem(room_id, info, scrollArea_);
+        auto room_item = new RoomInfoListItem(room_id, info, settings, scrollArea_);
         room_item->setRoomName(QString::fromStdString(std::move(info.name)));
 
         connect(room_item, &RoomInfoListItem::clicked, this, &RoomList::highlightSelectedRoom);
@@ -492,7 +494,7 @@ RoomList::updateRoom(const QString &room_id, const RoomInfo &info)
 void
 RoomList::addInvitedRoom(const QString &room_id, const RoomInfo &info)
 {
-        auto room_item = new RoomInfoListItem(room_id, info, scrollArea_);
+        auto room_item = new RoomInfoListItem(room_id, info, settings, scrollArea_);
 
         connect(room_item, &RoomInfoListItem::acceptInvite, this, &RoomList::acceptInvite);
         connect(room_item, &RoomInfoListItem::declineInvite, this, &RoomList::declineInvite);
diff --git a/src/RoomList.h b/src/RoomList.h
index fef552c6b..a0151f921 100644
--- a/src/RoomList.h
+++ b/src/RoomList.h
@@ -23,6 +23,9 @@
 #include <QVBoxLayout>
 #include <QWidget>
 
+#include "CacheStructs.h"
+#include "UserSettingsPage.h"
+
 class LeaveRoomDialog;
 class OverlayModal;
 class RoomInfoListItem;
@@ -35,7 +38,7 @@ class RoomList : public QWidget
         Q_OBJECT
 
 public:
-        explicit RoomList(QWidget *parent = nullptr);
+        explicit RoomList(QSharedPointer<UserSettings> userSettings, QWidget *parent = nullptr);
 
         void initialize(const QMap<QString, RoomInfo> &info);
         void sync(const std::map<QString, RoomInfo> &info);
@@ -100,4 +103,5 @@ private:
         QString selectedRoom_;
 
         bool isSortPending_ = false;
+        QSharedPointer<UserSettings> settings;
 };
diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index 2cac783c2..7bae01a08 100644
--- a/src/UserSettingsPage.cpp
+++ b/src/UserSettingsPage.cpp
@@ -57,6 +57,7 @@ UserSettings::load()
         isGroupViewEnabled_           = settings.value("user/group_view", true).toBool();
         isMarkdownEnabled_            = settings.value("user/markdown_enabled", true).toBool();
         isTypingNotificationsEnabled_ = settings.value("user/typing_notifications", true).toBool();
+        ignoreMinorEvents_            = settings.value("user/minor_events", false).toBool();
         isReadReceiptsEnabled_        = settings.value("user/read_receipts", true).toBool();
         theme_                        = settings.value("user/theme", defaultTheme_).toString();
         font_                         = settings.value("user/font_family", "default").toString();
@@ -130,6 +131,7 @@ UserSettings::save()
 
         settings.setValue("font_size", baseFontSize_);
         settings.setValue("typing_notifications", isTypingNotificationsEnabled_);
+        settings.setValue("minor_events", ignoreMinorEvents_);
         settings.setValue("read_receipts", isReadReceiptsEnabled_);
         settings.setValue("group_view", isGroupViewEnabled_);
         settings.setValue("markdown_enabled", isMarkdownEnabled_);
@@ -191,6 +193,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
         avatarCircles_           = new Toggle{this};
         groupViewToggle_         = new Toggle{this};
         typingNotifications_     = new Toggle{this};
+        ignoreMinorEvents_       = new Toggle{this};
         readReceipts_            = new Toggle{this};
         markdownEnabled_         = new Toggle{this};
         desktopNotifications_    = new Toggle{this};
@@ -293,6 +296,7 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
         boxWrap(tr("Circular Avatars"), avatarCircles_);
         boxWrap(tr("Group's sidebar"), groupViewToggle_);
         boxWrap(tr("Typing notifications"), typingNotifications_);
+        boxWrap(tr("Ignore minor events in room list"), ignoreMinorEvents_);
         formLayout_->addRow(new HorizontalLine{this});
         boxWrap(tr("Read receipts"), readReceipts_);
         boxWrap(tr("Send messages as Markdown"), markdownEnabled_);
@@ -394,6 +398,10 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
                 settings_->setTypingNotifications(!isDisabled);
         });
 
+        connect(ignoreMinorEvents_, &Toggle::toggled, this, [this](bool isDisabled) {
+                settings_->setIgnoreMinorEvents(!isDisabled);
+        });
+
         connect(readReceipts_, &Toggle::toggled, this, [this](bool isDisabled) {
                 settings_->setReadReceipts(!isDisabled);
         });
@@ -428,6 +436,7 @@ UserSettingsPage::showEvent(QShowEvent *)
         groupViewToggle_->setState(!settings_->isGroupViewEnabled());
         avatarCircles_->setState(!settings_->isAvatarCirclesEnabled());
         typingNotifications_->setState(!settings_->isTypingNotificationsEnabled());
+        ignoreMinorEvents_->setState(!settings_->isIgnoreMinorEventsEnabled());
         readReceipts_->setState(!settings_->isReadReceiptsEnabled());
         markdownEnabled_->setState(!settings_->isMarkdownEnabled());
         desktopNotifications_->setState(!settings_->hasDesktopNotifications());
diff --git a/src/UserSettingsPage.h b/src/UserSettingsPage.h
index a1b7b0841..e1c522771 100644
--- a/src/UserSettingsPage.h
+++ b/src/UserSettingsPage.h
@@ -87,6 +87,12 @@ public:
                 save();
         }
 
+        void setIgnoreMinorEvents(bool state)
+        {
+                ignoreMinorEvents_ = state;
+                save();
+        }
+
         void setDesktopNotifications(bool state)
         {
                 hasDesktopNotifications_ = state;
@@ -106,6 +112,7 @@ public:
         bool isAvatarCirclesEnabled() const { return avatarCircles_; }
         bool isMarkdownEnabled() const { return isMarkdownEnabled_; }
         bool isTypingNotificationsEnabled() const { return isTypingNotificationsEnabled_; }
+        bool isIgnoreMinorEventsEnabled() const { return ignoreMinorEvents_; }
         bool isReadReceiptsEnabled() const { return isReadReceiptsEnabled_; }
         bool hasDesktopNotifications() const { return hasDesktopNotifications_; }
         double fontSize() const { return baseFontSize_; }
@@ -127,6 +134,7 @@ private:
         bool isGroupViewEnabled_;
         bool isMarkdownEnabled_;
         bool isTypingNotificationsEnabled_;
+        bool ignoreMinorEvents_;
         bool isReadReceiptsEnabled_;
         bool hasDesktopNotifications_;
         bool avatarCircles_;
@@ -176,6 +184,7 @@ private:
         Toggle *startInTrayToggle_;
         Toggle *groupViewToggle_;
         Toggle *typingNotifications_;
+        Toggle *ignoreMinorEvents_;
         Toggle *readReceipts_;
         Toggle *markdownEnabled_;
         Toggle *desktopNotifications_;
-- 
GitLab