diff --git a/imports/Spectral/Page/Room.qml b/imports/Spectral/Page/Room.qml index dbcda44..f87ba95 100644 --- a/imports/Spectral/Page/Room.qml +++ b/imports/Spectral/Page/Room.qml @@ -1,5 +1,5 @@ import QtQuick 2.9 RoomForm { - roomListModel.onNewMessage: if (!window.visible) spectralController.postNotification(roomId, eventId, roomName, senderName, text, icon) + roomListModel.onNewMessage: if (!window.visible) spectralController.postNotification(roomId, eventId, roomName, senderName, text, icon, iconPath) } diff --git a/src/controller.cpp b/src/controller.cpp index 8d83a65..3b10d1b 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -244,7 +244,8 @@ void Controller::setColor(QString userId, QColor newColor) { void Controller::postNotification(const QString& roomId, const QString& eventId, const QString& roomName, const QString& senderName, - const QString& text, const QImage& icon) { + const QString& text, const QImage& icon, + const QUrl& iconPath) { notificationsManager.postNotification(roomId, eventId, roomName, senderName, - text, icon); + text, icon, iconPath); } diff --git a/src/controller.h b/src/controller.h index 95ff024..18d2532 100644 --- a/src/controller.h +++ b/src/controller.h @@ -73,7 +73,7 @@ class Controller : public QObject { void playAudio(QUrl localFile); void postNotification(const QString& roomId, const QString& eventId, const QString& roomName, const QString& senderName, - const QString& text, const QImage& icon); + const QString& text, const QImage& icon, const QUrl& iconPath); static QImage safeImage(QImage image); }; diff --git a/src/notifications/manager.h b/src/notifications/manager.h index 653a0e6..b55eac2 100644 --- a/src/notifications/manager.h +++ b/src/notifications/manager.h @@ -4,6 +4,7 @@ #include #include #include +#include #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) #include @@ -22,7 +23,7 @@ class NotificationsManager : public QObject { void postNotification(const QString &roomId, const QString &eventId, const QString &roomName, const QString &senderName, - const QString &text, const QImage &icon); + const QString &text, const QImage &icon, const QUrl &iconPath); signals: void notificationClicked(const QString roomId, const QString eventId); diff --git a/src/notifications/managerlinux.cpp b/src/notifications/managerlinux.cpp index 368cd02..5312cc4 100644 --- a/src/notifications/managerlinux.cpp +++ b/src/notifications/managerlinux.cpp @@ -25,7 +25,7 @@ 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) { + const QString &sender, const QString &text, const QImage &icon, const QUrl &iconPath) { uint id = showNotification(roomname, sender + ": " + text, icon); notificationIds[id] = roomEventId{roomid, eventid}; } diff --git a/src/notifications/managermac.mm b/src/notifications/managermac.mm index 782be1f..2ddc939 100644 --- a/src/notifications/managermac.mm +++ b/src/notifications/managermac.mm @@ -19,11 +19,13 @@ NotificationsManager::postNotification( const QString &roomName, const QString &senderName, const QString &text, - const QImage &icon) + const QImage &icon, + const QUrl &iconPath) { Q_UNUSED(roomId); Q_UNUSED(eventId); Q_UNUSED(icon); + Q_UNUSED(iconPath); NSUserNotification * notif = [[NSUserNotification alloc] init]; diff --git a/src/notifications/managerwin.cpp b/src/notifications/managerwin.cpp index 2c98694..ad1acd9 100644 --- a/src/notifications/managerwin.cpp +++ b/src/notifications/managerwin.cpp @@ -5,24 +5,24 @@ using namespace WinToastLib; class CustomHandler : public IWinToastHandler { public: - CustomHandler(NotificationsManager* parent) : notificationsManager(parent) {} + CustomHandler(uint id, NotificationsManager *parent) + : notificationID(id), notificationsManager(parent) {} void toastActivated() { - notificationsManager->actionInvoked(notificationID, ""); + notificationsManager->actionInvoked(notificationID, ""); } void toastActivated(int) { - notificationsManager->actionInvoked(notificationID, ""); + notificationsManager->actionInvoked(notificationID, ""); } void toastFailed() { std::wcout << L"Error showing current toast" << std::endl; } void toastDismissed(WinToastDismissalReason) { - notificationsManager->notificationClosed(notificationID, 0); + notificationsManager->notificationClosed(notificationID, 0); } + private: uint notificationID; - -private: - NotificationsManager* notificationsManager; + NotificationsManager *notificationsManager; }; namespace { @@ -44,7 +44,8 @@ NotificationsManager::NotificationsManager(QObject *parent) : QObject(parent) {} void NotificationsManager::postNotification( const QString &room_id, const QString &event_id, const QString &room_name, - const QString &sender, const QString &text, const QImage &icon) { + const QString &sender, const QString &text, const QImage &icon, + const QUrl &iconPath) { Q_UNUSED(room_id) Q_UNUSED(event_id) Q_UNUSED(icon) @@ -61,12 +62,11 @@ void NotificationsManager::postNotification( WinToastTemplate::FirstLine); templ.setTextField(QString("%1").arg(text).toStdWString(), WinToastTemplate::SecondLine); - // TODO: implement room or user avatar - // templ.setImagePath(L"C:/example.png"); + templ.setImagePath( + reinterpret_cast(iconPath.toLocalFile().utf16())); - CustomHandler *customHandler = new CustomHandler(this); count++; - customHandler->notificationID = count; + CustomHandler *customHandler = new CustomHandler(count, this); notificationIds[count] = roomEventId{room_id, event_id}; WinToast::instance()->showToast(templ, customHandler); diff --git a/src/roomlistmodel.cpp b/src/roomlistmodel.cpp index 1c1ec87..dd47894 100644 --- a/src/roomlistmodel.cpp +++ b/src/roomlistmodel.cpp @@ -4,6 +4,7 @@ #include "events/roomevent.h" +#include #include #include #include @@ -74,17 +75,22 @@ void RoomListModel::connectRoomSignals(SpectralRoom* room) { [=] { refresh(room, {AvatarRole}); }); connect(room, &Room::addedMessages, this, [=] { refresh(room, {LastEventRole}); }); - connect(room, &Room::aboutToAddNewMessages, this, - [=](QMatrixClient::RoomEventsRange eventsRange) { - RoomEvent* event = (eventsRange.end() - 1)->get(); - if (event->isStateEvent()) return; - User* sender = room->user(event->senderId()); - if (sender == room->localUser()) return; - emit newMessage(room->id(), event->id(), room->displayName(), - sender->displayname(), - event->contentJson().value("body").toString(), - room->avatar(128)); - }); + connect( + room, &Room::aboutToAddNewMessages, this, + [=](QMatrixClient::RoomEventsRange eventsRange) { + RoomEvent* event = (eventsRange.end() - 1)->get(); + if (event->isStateEvent()) return; + User* sender = room->user(event->senderId()); + if (sender == room->localUser()) return; + QUrl _url = room->avatarUrl(); + qDebug() << QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + + "/avatar/" + _url.authority() + '_' + _url.fileName() + ".png"; + emit newMessage( + room->id(), event->id(), room->displayName(), sender->displayname(), + event->contentJson().value("body").toString(), room->avatar(128), + QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + + "/avatar/" + _url.authority() + '_' + _url.fileName() + ".png"); + }); } void RoomListModel::updateRoom(Room* room, Room* prev) { diff --git a/src/roomlistmodel.h b/src/roomlistmodel.h index 9da486d..40b0f04 100644 --- a/src/roomlistmodel.h +++ b/src/roomlistmodel.h @@ -76,7 +76,7 @@ class RoomListModel : public QAbstractListModel { void roomAdded(SpectralRoom* room); void newMessage(const QString& roomId, const QString& eventId, const QString& roomName, const QString& senderName, - const QString& text, const QImage& icon); + const QString& text, const QImage& icon, const QUrl& iconPath); }; #endif // ROOMLISTMODEL_H