mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 11:00:48 +03:00
Add menu to toggle notifications
This commit is contained in:
parent
5197f8a886
commit
c184362044
9 changed files with 163 additions and 31 deletions
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
#include "MatrixClient.h"
|
#include "MatrixClient.h"
|
||||||
#include "RoomList.h"
|
#include "RoomList.h"
|
||||||
|
#include "RoomSettings.h"
|
||||||
#include "RoomState.h"
|
#include "RoomState.h"
|
||||||
#include "Splitter.h"
|
#include "Splitter.h"
|
||||||
#include "TextInputWidget.h"
|
#include "TextInputWidget.h"
|
||||||
|
@ -92,6 +93,7 @@ private:
|
||||||
UserInfoWidget *user_info_widget_;
|
UserInfoWidget *user_info_widget_;
|
||||||
|
|
||||||
QMap<QString, RoomState> state_manager_;
|
QMap<QString, RoomState> state_manager_;
|
||||||
|
QMap<QString, QSharedPointer<RoomSettings>> settingsManager_;
|
||||||
|
|
||||||
// Matrix Client API provider.
|
// Matrix Client API provider.
|
||||||
QSharedPointer<MatrixClient> client_;
|
QSharedPointer<MatrixClient> client_;
|
||||||
|
|
55
include/RoomSettings.h
Normal file
55
include/RoomSettings.h
Normal file
|
@ -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_;
|
||||||
|
};
|
|
@ -17,15 +17,20 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <QAction>
|
||||||
|
#include <QDebug>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include <QImage>
|
#include <QImage>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QPaintEvent>
|
#include <QPaintEvent>
|
||||||
|
#include <QSharedPointer>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
#include "Avatar.h"
|
#include "Avatar.h"
|
||||||
#include "FlatButton.h"
|
#include "FlatButton.h"
|
||||||
|
#include "Menu.h"
|
||||||
|
#include "RoomSettings.h"
|
||||||
|
|
||||||
class TopRoomBar : public QWidget
|
class TopRoomBar : public QWidget
|
||||||
{
|
{
|
||||||
|
@ -39,6 +44,7 @@ public:
|
||||||
inline void updateRoomName(const QString &name);
|
inline void updateRoomName(const QString &name);
|
||||||
inline void updateRoomTopic(const QString &topic);
|
inline void updateRoomTopic(const QString &topic);
|
||||||
void updateRoomAvatarFromName(const QString &name);
|
void updateRoomAvatarFromName(const QString &name);
|
||||||
|
void setRoomSettings(QSharedPointer<RoomSettings> settings);
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
@ -52,10 +58,16 @@ private:
|
||||||
QLabel *name_label_;
|
QLabel *name_label_;
|
||||||
QLabel *topic_label_;
|
QLabel *topic_label_;
|
||||||
|
|
||||||
FlatButton *search_button_;
|
QSharedPointer<RoomSettings> roomSettings_;
|
||||||
FlatButton *settings_button_;
|
|
||||||
|
QMenu *menu_;
|
||||||
|
QAction *toggleNotifications_;
|
||||||
|
|
||||||
|
FlatButton *settingsBtn_;
|
||||||
|
|
||||||
Avatar *avatar_;
|
Avatar *avatar_;
|
||||||
|
|
||||||
|
int buttonSize_;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void TopRoomBar::updateRoomAvatar(const QImage &avatar_image)
|
inline void TopRoomBar::updateRoomAvatar(const QImage &avatar_image)
|
||||||
|
|
25
include/ui/Menu.h
Normal file
25
include/ui/Menu.h
Normal file
|
@ -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();
|
||||||
|
}
|
||||||
|
};
|
BIN
resources/icons/vertical-ellipsis.png
Normal file
BIN
resources/icons/vertical-ellipsis.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 509 B |
|
@ -22,6 +22,7 @@
|
||||||
<file>icons/emoji-categories/symbols.png</file>
|
<file>icons/emoji-categories/symbols.png</file>
|
||||||
<file>icons/emoji-categories/flags.png</file>
|
<file>icons/emoji-categories/flags.png</file>
|
||||||
|
|
||||||
|
<file>icons/vertical-ellipsis.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
|
|
||||||
<qresource prefix="/logos">
|
<qresource prefix="/logos">
|
||||||
|
|
|
@ -127,10 +127,16 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
|
||||||
connect(room_list_, &RoomList::roomChanged, this, &ChatPage::changeTopRoomInfo);
|
connect(room_list_, &RoomList::roomChanged, this, &ChatPage::changeTopRoomInfo);
|
||||||
connect(room_list_, &RoomList::roomChanged, view_manager_, &TimelineViewManager::setHistoryView);
|
connect(room_list_, &RoomList::roomChanged, view_manager_, &TimelineViewManager::setHistoryView);
|
||||||
|
|
||||||
connect(view_manager_,
|
connect(view_manager_, &TimelineViewManager::unreadMessages, this, [=](const QString &roomid, int count) {
|
||||||
SIGNAL(unreadMessages(const QString &, int)),
|
if (!settingsManager_.contains(roomid)) {
|
||||||
room_list_,
|
qWarning() << "RoomId does not have settings" << roomid;
|
||||||
SLOT(updateUnreadMessageCount(const QString &, int)));
|
room_list_->updateUnreadMessageCount(roomid, count);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settingsManager_[roomid]->isNotificationsEnabled())
|
||||||
|
room_list_->updateUnreadMessageCount(roomid, count);
|
||||||
|
});
|
||||||
|
|
||||||
connect(room_list_,
|
connect(room_list_,
|
||||||
SIGNAL(totalUnreadMessageCountUpdated(int)),
|
SIGNAL(totalUnreadMessageCountUpdated(int)),
|
||||||
|
@ -173,11 +179,17 @@ void ChatPage::logout()
|
||||||
{
|
{
|
||||||
sync_timer_->stop();
|
sync_timer_->stop();
|
||||||
|
|
||||||
|
// Delete all config parameters.
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
settings.remove("auth/access_token");
|
settings.beginGroup("auth");
|
||||||
settings.remove("auth/home_server");
|
settings.remove("");
|
||||||
settings.remove("auth/user_id");
|
settings.endGroup();
|
||||||
settings.remove("client/transaction_id");
|
settings.beginGroup("client");
|
||||||
|
settings.remove("");
|
||||||
|
settings.endGroup();
|
||||||
|
settings.beginGroup("notifications");
|
||||||
|
settings.remove("");
|
||||||
|
settings.endGroup();
|
||||||
|
|
||||||
// Clear the environment.
|
// Clear the environment.
|
||||||
room_list_->clear();
|
room_list_->clear();
|
||||||
|
@ -188,6 +200,7 @@ void ChatPage::logout()
|
||||||
client_->reset();
|
client_->reset();
|
||||||
|
|
||||||
state_manager_.clear();
|
state_manager_.clear();
|
||||||
|
settingsManager_.clear();
|
||||||
room_avatars_.clear();
|
room_avatars_.clear();
|
||||||
|
|
||||||
emit close();
|
emit close();
|
||||||
|
@ -286,6 +299,7 @@ void ChatPage::initialSyncCompleted(const SyncResponse &response)
|
||||||
updateDisplayNames(room_state);
|
updateDisplayNames(room_state);
|
||||||
|
|
||||||
state_manager_.insert(it.key(), room_state);
|
state_manager_.insert(it.key(), room_state);
|
||||||
|
settingsManager_.insert(it.key(), QSharedPointer<RoomSettings>(new RoomSettings(it.key())));
|
||||||
}
|
}
|
||||||
|
|
||||||
view_manager_->initialize(response.rooms());
|
view_manager_->initialize(response.rooms());
|
||||||
|
@ -325,6 +339,7 @@ void ChatPage::changeTopRoomInfo(const QString &room_id)
|
||||||
|
|
||||||
top_bar_->updateRoomName(state.getName());
|
top_bar_->updateRoomName(state.getName());
|
||||||
top_bar_->updateRoomTopic(state.getTopic());
|
top_bar_->updateRoomTopic(state.getTopic());
|
||||||
|
top_bar_->setRoomSettings(settingsManager_[room_id]);
|
||||||
|
|
||||||
if (room_avatars_.contains(room_id))
|
if (room_avatars_.contains(room_id))
|
||||||
top_bar_->updateRoomAvatar(room_avatars_.value(room_id).toImage());
|
top_bar_->updateRoomAvatar(room_avatars_.value(room_id).toImage());
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
EmojiPanel::EmojiPanel(QWidget *parent)
|
EmojiPanel::EmojiPanel(QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
, shadowMargin_{3}
|
, shadowMargin_{2}
|
||||||
, width_{370}
|
, width_{370}
|
||||||
, height_{350}
|
, height_{350}
|
||||||
, animationDuration_{100}
|
, animationDuration_{100}
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
TopRoomBar::TopRoomBar(QWidget *parent)
|
TopRoomBar::TopRoomBar(QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
|
, buttonSize_{32}
|
||||||
{
|
{
|
||||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
|
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
|
||||||
setMinimumSize(QSize(0, 65));
|
setMinimumSize(QSize(0, 65));
|
||||||
|
@ -28,7 +29,7 @@ TopRoomBar::TopRoomBar(QWidget *parent)
|
||||||
|
|
||||||
top_layout_ = new QHBoxLayout();
|
top_layout_ = new QHBoxLayout();
|
||||||
top_layout_->setSpacing(10);
|
top_layout_->setSpacing(10);
|
||||||
top_layout_->setContentsMargins(10, 10, 0, 10);
|
top_layout_->setMargin(10);
|
||||||
|
|
||||||
avatar_ = new Avatar(this);
|
avatar_ = new Avatar(this);
|
||||||
avatar_->setLetter(QChar('?'));
|
avatar_->setLetter(QChar('?'));
|
||||||
|
@ -49,31 +50,42 @@ TopRoomBar::TopRoomBar(QWidget *parent)
|
||||||
text_layout_->addWidget(name_label_);
|
text_layout_->addWidget(name_label_);
|
||||||
text_layout_->addWidget(topic_label_);
|
text_layout_->addWidget(topic_label_);
|
||||||
|
|
||||||
settings_button_ = new FlatButton(this);
|
settingsBtn_ = new FlatButton(this);
|
||||||
settings_button_->setForegroundColor(QColor("#acc7dc"));
|
settingsBtn_->setForegroundColor(QColor("#acc7dc"));
|
||||||
settings_button_->setCursor(QCursor(Qt::PointingHandCursor));
|
settingsBtn_->setCursor(QCursor(Qt::PointingHandCursor));
|
||||||
settings_button_->setStyleSheet("width: 30px; height: 30px;");
|
settingsBtn_->setFixedSize(buttonSize_, buttonSize_);
|
||||||
|
settingsBtn_->setCornerRadius(buttonSize_ / 2);
|
||||||
|
|
||||||
QIcon settings_icon;
|
QIcon settings_icon;
|
||||||
settings_icon.addFile(":/icons/icons/cog.png", QSize(), QIcon::Normal, QIcon::Off);
|
settings_icon.addFile(":/icons/icons/vertical-ellipsis.png", QSize(), QIcon::Normal, QIcon::Off);
|
||||||
settings_button_->setIcon(settings_icon);
|
settingsBtn_->setIcon(settings_icon);
|
||||||
settings_button_->setIconSize(QSize(16, 16));
|
settingsBtn_->setIconSize(QSize(buttonSize_ / 2, buttonSize_ / 2));
|
||||||
|
|
||||||
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));
|
|
||||||
|
|
||||||
top_layout_->addWidget(avatar_);
|
top_layout_->addWidget(avatar_);
|
||||||
top_layout_->addLayout(text_layout_);
|
top_layout_->addLayout(text_layout_);
|
||||||
top_layout_->addStretch(1);
|
top_layout_->addStretch(1);
|
||||||
top_layout_->addWidget(search_button_);
|
top_layout_->addWidget(settingsBtn_);
|
||||||
top_layout_->addWidget(settings_button_);
|
|
||||||
|
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_);
|
setLayout(top_layout_);
|
||||||
}
|
}
|
||||||
|
@ -106,6 +118,16 @@ void TopRoomBar::paintEvent(QPaintEvent *event)
|
||||||
style()->drawPrimitive(QStyle::PE_Widget, &option, &painter, this);
|
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()
|
TopRoomBar::~TopRoomBar()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue