diff --git a/imports/NeoChat/Page/SettingsPage.qml b/imports/NeoChat/Page/SettingsPage.qml new file mode 100644 index 000000000..16ea72220 --- /dev/null +++ b/imports/NeoChat/Page/SettingsPage.qml @@ -0,0 +1,33 @@ +/** + * SPDX-FileCopyrightText: 2020 Tobias Fella + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +import QtQuick 2.14 +import QtQuick.Controls 2.14 as QQC2 +import QtQuick.Layouts 1.14 + +import org.kde.kirigami 2.12 as Kirigami + +import org.kde.neochat 1.0 + +Kirigami.ScrollablePage { + title: i18n("Settings") + + Kirigami.FormLayout { + QQC2.CheckBox { + id: showNotifications + Kirigami.FormData.label: i18n("Show Notifications:") + checked: Config.showNotifications + } + + QQC2.Button { + text: i18n("Save") + onClicked: { + Config.showNotifications = showNotifications.checked; + Config.save(); + } + } + } +} diff --git a/imports/NeoChat/Page/qmldir b/imports/NeoChat/Page/qmldir index 922a35e79..9d7c31b09 100644 --- a/imports/NeoChat/Page/qmldir +++ b/imports/NeoChat/Page/qmldir @@ -5,4 +5,5 @@ RoomListPage 1.0 RoomListPage.qml RoomPage 1.0 RoomPage.qml JoinRoomPage 1.0 JoinRoomPage.qml InviteUserPage 1.0 InviteUserPage.qml +SettingsPage 1.0 SettingsPage.qml diff --git a/qml/main.qml b/qml/main.qml index 2cd8f1946..babd9add4 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -80,6 +80,12 @@ Kirigami.ApplicationWindow { onTriggered: pageStack.layers.push("qrc:/imports/NeoChat/Page/AccountsPage.qml") enabled: pageStack.layers.currentItem.title !== i18n("Accounts") }, + Kirigami.Action { + text: i18n("Settings") + iconName: "settings-configure" + onTriggered: pageStack.layers.push("qrc:/imports/NeoChat/Page/SettingsPage.qml") + enabled: pageStack.layers.currentItem.title !== i18n("Settings") + }, Kirigami.Action { text: i18n("About Neochat") iconName: "help-about" diff --git a/res.qrc b/res.qrc index 140cfb7c3..5f3981c3f 100644 --- a/res.qrc +++ b/res.qrc @@ -11,6 +11,7 @@ imports/NeoChat/Page/AccountsPage.qml imports/NeoChat/Page/JoinRoomPage.qml imports/NeoChat/Page/InviteUserPage.qml + imports/NeoChat/Page/SettingsPage.qml imports/NeoChat/Component/qmldir imports/NeoChat/Component/ChatTextInput.qml imports/NeoChat/Component/AutoMouseArea.qml diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3ccc22b0c..ef683dbd5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -49,6 +49,7 @@ if(ANDROID) "go-down" "list-add" "irc-join-channel" + "settings-configure" ) else() target_link_libraries(neochat PRIVATE Qt5::Widgets ${QTKEYCHAIN_LIBRARIES}) diff --git a/src/main.cpp b/src/main.cpp index 2bca9f7eb..1f63a3ce7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -72,7 +72,6 @@ int main(int argc, char *argv[]) qmlRegisterType("org.kde.neochat", 1, 0, "PublicRoomListModel"); qmlRegisterType("org.kde.neochat", 1, 0, "UserDirectoryListModel"); qmlRegisterType("org.kde.neochat", 1, 0, "EmojiModel"); - qmlRegisterType("org.kde.neochat", 1, 0, "NotificationsManager"); qmlRegisterType("org.kde.neochat", 1, 0, "TrayIcon"); qmlRegisterType("org.kde.neochat", 1, 0, "SortFilterRoomListModel"); qmlRegisterUncreatableType("org.kde.neochat", 1, 0, "RoomMessageEvent", "ENUM"); diff --git a/src/neochatconfig.kcfg b/src/neochatconfig.kcfg index 0a53f2ffb..e07dfd1a7 100644 --- a/src/neochatconfig.kcfg +++ b/src/neochatconfig.kcfg @@ -11,6 +11,10 @@ + + + true + diff --git a/src/neochatroom.cpp b/src/neochatroom.cpp index bfd443cf7..38cea044b 100644 --- a/src/neochatroom.cpp +++ b/src/neochatroom.cpp @@ -31,6 +31,7 @@ #include "jobs/downloadfilejob.h" #include "user.h" #include "utils.h" +#include "notificationsmanager.h" #include @@ -43,6 +44,18 @@ NeoChatRoom::NeoChatRoom(Connection *connection, QString roomId, JoinState joinS setFileUploadingProgress(0); setHasFileUploading(false); }); + connect(this, &NeoChatRoom::notificationCountChanged, this, [this]() { + if(messageEvents().size() == 0) + return; + const RoomEvent *lastEvent = messageEvents().rbegin()->get(); + if (lastEvent->isStateEvent()) + return; + User *sender = user(lastEvent->senderId()); + if (sender == localUser()) + return; + + NotificationsManager::instance().postNotification(id(), lastEvent->id(), displayName(), sender->displayname(this), eventToString(*lastEvent), avatar(128)); + }); } void NeoChatRoom::uploadFile(const QUrl &url, const QString &body) diff --git a/src/notificationsmanager.cpp b/src/notificationsmanager.cpp index 1c78ea12f..dbc07c8f9 100644 --- a/src/notificationsmanager.cpp +++ b/src/notificationsmanager.cpp @@ -11,6 +11,15 @@ #include #include +#include "neochatconfig.h" + +NotificationsManager &NotificationsManager::instance() +{ + static NotificationsManager _instance; + return _instance; +} + + NotificationsManager::NotificationsManager(QObject *parent) : QObject(parent) { @@ -18,6 +27,10 @@ NotificationsManager::NotificationsManager(QObject *parent) void NotificationsManager::postNotification(const QString &roomid, const QString &eventid, const QString &roomname, const QString &sender, const QString &text, const QImage &icon) { + if(!NeoChatConfig::self()->showNotifications()) { + return; + } + QPixmap img; img.convertFromImage(icon); KNotification *notification = new KNotification("message"); diff --git a/src/notificationsmanager.h b/src/notificationsmanager.h index 3dd656f68..d307e9373 100644 --- a/src/notificationsmanager.h +++ b/src/notificationsmanager.h @@ -17,10 +17,12 @@ class NotificationsManager : public QObject Q_OBJECT public: - NotificationsManager(QObject *parent = nullptr); + static NotificationsManager &instance(); Q_INVOKABLE void postNotification(const QString &roomId, const QString &eventId, const QString &roomName, const QString &senderName, const QString &text, const QImage &icon); private: + NotificationsManager(QObject *parent = nullptr); + QMultiMap m_notifications; };