diff --git a/include/ChatPage.h b/include/ChatPage.h
index 68495276..74db6b15 100644
--- a/include/ChatPage.h
+++ b/include/ChatPage.h
@@ -23,6 +23,7 @@
#include "MatrixClient.h"
#include "RoomList.h"
+#include "RoomSettings.h"
#include "RoomState.h"
#include "Splitter.h"
#include "TextInputWidget.h"
@@ -92,6 +93,7 @@ private:
UserInfoWidget *user_info_widget_;
QMap<QString, RoomState> state_manager_;
+ QMap<QString, QSharedPointer<RoomSettings>> settingsManager_;
// Matrix Client API provider.
QSharedPointer<MatrixClient> client_;
diff --git a/include/RoomSettings.h b/include/RoomSettings.h
new file mode 100644
index 00000000..ee74b9eb
--- /dev/null
+++ b/include/RoomSettings.h
@@ -0,0 +1,55 @@
+/*
+ * nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <QSettings>
+
+class RoomSettings
+{
+public:
+ RoomSettings(QString room_id)
+ {
+ path_ = QString("notifications/%1").arg(room_id);
+ isNotificationsEnabled_ = true;
+
+ QSettings settings;
+
+ if (settings.contains(path_))
+ isNotificationsEnabled_ = settings.value(path_).toBool();
+ else
+ settings.setValue(path_, isNotificationsEnabled_);
+ };
+
+ bool isNotificationsEnabled()
+ {
+ return isNotificationsEnabled_;
+ };
+
+ void toggleNotifications()
+ {
+ isNotificationsEnabled_ = !isNotificationsEnabled_;
+
+ QSettings settings;
+ settings.setValue(path_, isNotificationsEnabled_);
+ }
+
+private:
+ QString path_;
+
+ bool isNotificationsEnabled_;
+};
diff --git a/include/TopRoomBar.h b/include/TopRoomBar.h
index 304ec320..6e4bfe7a 100644
--- a/include/TopRoomBar.h
+++ b/include/TopRoomBar.h
@@ -17,15 +17,20 @@
#pragma once
+#include <QAction>
+#include <QDebug>
#include <QIcon>
#include <QImage>
#include <QLabel>
#include <QPaintEvent>
+#include <QSharedPointer>
#include <QVBoxLayout>
#include <QWidget>
#include "Avatar.h"
#include "FlatButton.h"
+#include "Menu.h"
+#include "RoomSettings.h"
class TopRoomBar : public QWidget
{
@@ -39,6 +44,7 @@ public:
inline void updateRoomName(const QString &name);
inline void updateRoomTopic(const QString &topic);
void updateRoomAvatarFromName(const QString &name);
+ void setRoomSettings(QSharedPointer<RoomSettings> settings);
void reset();
@@ -52,10 +58,16 @@ private:
QLabel *name_label_;
QLabel *topic_label_;
- FlatButton *search_button_;
- FlatButton *settings_button_;
+ QSharedPointer<RoomSettings> roomSettings_;
+
+ QMenu *menu_;
+ QAction *toggleNotifications_;
+
+ FlatButton *settingsBtn_;
Avatar *avatar_;
+
+ int buttonSize_;
};
inline void TopRoomBar::updateRoomAvatar(const QImage &avatar_image)
diff --git a/include/ui/Menu.h b/include/ui/Menu.h
new file mode 100644
index 00000000..78a35b43
--- /dev/null
+++ b/include/ui/Menu.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <QMenu>
+
+class Menu : public QMenu
+{
+public:
+ Menu(QWidget *parent = nullptr)
+ : QMenu(parent)
+ {
+ setFont(QFont("Open Sans", 10));
+ setStyleSheet(
+ "QMenu { background-color: white; margin: 0px;}"
+ "QMenu::item { padding: 7px 20px; border: 1px solid transparent; margin: 2px 0px; }"
+ "QMenu::item:selected { background: rgba(180, 180, 180, 100); }");
+ };
+
+protected:
+ void leaveEvent(QEvent *e)
+ {
+ Q_UNUSED(e);
+
+ hide();
+ }
+};
diff --git a/resources/icons/vertical-ellipsis.png b/resources/icons/vertical-ellipsis.png
new file mode 100644
index 00000000..82714451
--- /dev/null
+++ b/resources/icons/vertical-ellipsis.png
Binary files differdiff --git a/resources/res.qrc b/resources/res.qrc
index be7d8770..56bf7144 100644
--- a/resources/res.qrc
+++ b/resources/res.qrc
@@ -22,6 +22,7 @@
<file>icons/emoji-categories/symbols.png</file>
<file>icons/emoji-categories/flags.png</file>
+ <file>icons/vertical-ellipsis.png</file>
</qresource>
<qresource prefix="/logos">
diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index d318d086..2b92ac7d 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -127,10 +127,16 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
connect(room_list_, &RoomList::roomChanged, this, &ChatPage::changeTopRoomInfo);
connect(room_list_, &RoomList::roomChanged, view_manager_, &TimelineViewManager::setHistoryView);
- connect(view_manager_,
- SIGNAL(unreadMessages(const QString &, int)),
- room_list_,
- SLOT(updateUnreadMessageCount(const QString &, int)));
+ connect(view_manager_, &TimelineViewManager::unreadMessages, this, [=](const QString &roomid, int count) {
+ if (!settingsManager_.contains(roomid)) {
+ qWarning() << "RoomId does not have settings" << roomid;
+ room_list_->updateUnreadMessageCount(roomid, count);
+ return;
+ }
+
+ if (settingsManager_[roomid]->isNotificationsEnabled())
+ room_list_->updateUnreadMessageCount(roomid, count);
+ });
connect(room_list_,
SIGNAL(totalUnreadMessageCountUpdated(int)),
@@ -173,11 +179,17 @@ void ChatPage::logout()
{
sync_timer_->stop();
+ // Delete all config parameters.
QSettings settings;
- settings.remove("auth/access_token");
- settings.remove("auth/home_server");
- settings.remove("auth/user_id");
- settings.remove("client/transaction_id");
+ settings.beginGroup("auth");
+ settings.remove("");
+ settings.endGroup();
+ settings.beginGroup("client");
+ settings.remove("");
+ settings.endGroup();
+ settings.beginGroup("notifications");
+ settings.remove("");
+ settings.endGroup();
// Clear the environment.
room_list_->clear();
@@ -188,6 +200,7 @@ void ChatPage::logout()
client_->reset();
state_manager_.clear();
+ settingsManager_.clear();
room_avatars_.clear();
emit close();
@@ -286,6 +299,7 @@ void ChatPage::initialSyncCompleted(const SyncResponse &response)
updateDisplayNames(room_state);
state_manager_.insert(it.key(), room_state);
+ settingsManager_.insert(it.key(), QSharedPointer<RoomSettings>(new RoomSettings(it.key())));
}
view_manager_->initialize(response.rooms());
@@ -325,6 +339,7 @@ void ChatPage::changeTopRoomInfo(const QString &room_id)
top_bar_->updateRoomName(state.getName());
top_bar_->updateRoomTopic(state.getTopic());
+ top_bar_->setRoomSettings(settingsManager_[room_id]);
if (room_avatars_.contains(room_id))
top_bar_->updateRoomAvatar(room_avatars_.value(room_id).toImage());
diff --git a/src/EmojiPanel.cc b/src/EmojiPanel.cc
index dde44369..53b3f8d1 100644
--- a/src/EmojiPanel.cc
+++ b/src/EmojiPanel.cc
@@ -28,7 +28,7 @@
EmojiPanel::EmojiPanel(QWidget *parent)
: QWidget(parent)
- , shadowMargin_{3}
+ , shadowMargin_{2}
, width_{370}
, height_{350}
, animationDuration_{100}
diff --git a/src/TopRoomBar.cc b/src/TopRoomBar.cc
index b35291cb..ce0693f2 100644
--- a/src/TopRoomBar.cc
+++ b/src/TopRoomBar.cc
@@ -21,6 +21,7 @@
TopRoomBar::TopRoomBar(QWidget *parent)
: QWidget(parent)
+ , buttonSize_{32}
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
setMinimumSize(QSize(0, 65));
@@ -28,7 +29,7 @@ TopRoomBar::TopRoomBar(QWidget *parent)
top_layout_ = new QHBoxLayout();
top_layout_->setSpacing(10);
- top_layout_->setContentsMargins(10, 10, 0, 10);
+ top_layout_->setMargin(10);
avatar_ = new Avatar(this);
avatar_->setLetter(QChar('?'));
@@ -49,31 +50,42 @@ TopRoomBar::TopRoomBar(QWidget *parent)
text_layout_->addWidget(name_label_);
text_layout_->addWidget(topic_label_);
- settings_button_ = new FlatButton(this);
- settings_button_->setForegroundColor(QColor("#acc7dc"));
- settings_button_->setCursor(QCursor(Qt::PointingHandCursor));
- settings_button_->setStyleSheet("width: 30px; height: 30px;");
+ settingsBtn_ = new FlatButton(this);
+ settingsBtn_->setForegroundColor(QColor("#acc7dc"));
+ settingsBtn_->setCursor(QCursor(Qt::PointingHandCursor));
+ settingsBtn_->setFixedSize(buttonSize_, buttonSize_);
+ settingsBtn_->setCornerRadius(buttonSize_ / 2);
QIcon settings_icon;
- settings_icon.addFile(":/icons/icons/cog.png", QSize(), QIcon::Normal, QIcon::Off);
- settings_button_->setIcon(settings_icon);
- settings_button_->setIconSize(QSize(16, 16));
-
- search_button_ = new FlatButton(this);
- search_button_->setForegroundColor(QColor("#acc7dc"));
- search_button_->setCursor(QCursor(Qt::PointingHandCursor));
- search_button_->setStyleSheet("width: 30px; height: 30px;");
-
- QIcon search_icon;
- search_icon.addFile(":/icons/icons/search.png", QSize(), QIcon::Normal, QIcon::Off);
- search_button_->setIcon(search_icon);
- search_button_->setIconSize(QSize(16, 16));
+ settings_icon.addFile(":/icons/icons/vertical-ellipsis.png", QSize(), QIcon::Normal, QIcon::Off);
+ settingsBtn_->setIcon(settings_icon);
+ settingsBtn_->setIconSize(QSize(buttonSize_ / 2, buttonSize_ / 2));
top_layout_->addWidget(avatar_);
top_layout_->addLayout(text_layout_);
top_layout_->addStretch(1);
- top_layout_->addWidget(search_button_);
- top_layout_->addWidget(settings_button_);
+ top_layout_->addWidget(settingsBtn_);
+
+ menu_ = new Menu(this);
+
+ toggleNotifications_ = new QAction(tr("Disable notifications"), this);
+ connect(toggleNotifications_, &QAction::triggered, this, [=]() {
+ roomSettings_->toggleNotifications();
+
+ if (roomSettings_->isNotificationsEnabled())
+ toggleNotifications_->setText("Disable notifications");
+ else
+ toggleNotifications_->setText("Enable notifications");
+
+ });
+
+ menu_->addAction(toggleNotifications_);
+
+ connect(settingsBtn_, &QPushButton::clicked, this, [=]() {
+ auto pos = mapToGlobal(settingsBtn_->pos());
+ menu_->popup(QPoint(pos.x() + buttonSize_ - menu_->sizeHint().width(),
+ pos.y() + buttonSize_));
+ });
setLayout(top_layout_);
}
@@ -106,6 +118,16 @@ void TopRoomBar::paintEvent(QPaintEvent *event)
style()->drawPrimitive(QStyle::PE_Widget, &option, &painter, this);
}
+void TopRoomBar::setRoomSettings(QSharedPointer<RoomSettings> settings)
+{
+ roomSettings_ = settings;
+
+ if (roomSettings_->isNotificationsEnabled())
+ toggleNotifications_->setText("Disable notifications");
+ else
+ toggleNotifications_->setText("Enable notifications");
+}
+
TopRoomBar::~TopRoomBar()
{
}
|