first ideas for notifications

This commit is contained in:
Blue 2022-04-18 19:54:42 +03:00
parent 4c20a314f0
commit 18859cb960
Signed by: blue
GPG Key ID: 9B203B252A63EE38
6 changed files with 55 additions and 38 deletions

View File

@ -19,6 +19,7 @@
#include "global.h" #include "global.h"
#include "enums.h" #include "enums.h"
#include "ui/models/roster.h"
Shared::Global* Shared::Global::instance = 0; Shared::Global* Shared::Global::instance = 0;
const std::set<QString> Shared::Global::supportedImagesExts = {"png", "jpg", "webp", "jpeg", "gif", "svg"}; const std::set<QString> Shared::Global::supportedImagesExts = {"png", "jpg", "webp", "jpeg", "gif", "svg"};
@ -94,6 +95,8 @@ Shared::Global::Global():
}), }),
defaultSystemStyle(QApplication::style()->objectName()), defaultSystemStyle(QApplication::style()->objectName()),
defaultSystemPalette(QApplication::palette()), defaultSystemPalette(QApplication::palette()),
rosterModel(new Models::Roster()),
dbus("org.freedesktop.Notifications", "/org/freedesktop/Notifications", "org.freedesktop.Notifications", QDBusConnection::sessionBus()),
pluginSupport({ pluginSupport({
{"KWallet", false}, {"KWallet", false},
{"openFileManagerWindowJob", false}, {"openFileManagerWindowJob", false},
@ -349,6 +352,38 @@ void Shared::Global::setStyle(const QString& style)
} }
} }
void Shared::Global::notify(const QString& account, const Shared::Message& msg)
{
QString name = QString(instance->rosterModel->getContactName(account, msg.getPenPalJid()));
QString path = QString(instance->rosterModel->getContactIconPath(account, msg.getPenPalJid(), msg.getPenPalResource()));
QVariantList args;
args << QString(QCoreApplication::applicationName());
args << QVariant(QVariant::UInt); //TODO some normal id
if (path.size() > 0) {
args << path;
} else {
args << QString("mail-message"); //TODO should here better be unknown user icon?
}
if (msg.getType() == Shared::Message::groupChat) {
args << msg.getFromResource() + " from " + name;
} else {
args << name;
}
QString body(msg.getBody());
QString oob(msg.getOutOfBandUrl());
if (body == oob) {
body = tr("Attached file");
}
args << body;
args << QStringList();
args << QVariantMap();
args << 3000;
instance->dbus.callWithArgumentList(QDBus::AutoDetect, "Notify", args);
}
#define FROM_INT_INPL(Enum) \ #define FROM_INT_INPL(Enum) \
template<> \ template<> \
Enum Shared::Global::fromInt(int src) \ Enum Shared::Global::fromInt(int src) \

View File

@ -42,12 +42,18 @@
#include <QProcess> #include <QProcess>
#include <QDesktopServices> #include <QDesktopServices>
#include <QRegularExpression> #include <QRegularExpression>
#include <QDBusInterface>
class Squawk;
namespace Models {
class Roster;
}
namespace Shared { namespace Shared {
class Global { class Global {
Q_DECLARE_TR_FUNCTIONS(Global) Q_DECLARE_TR_FUNCTIONS(Global)
friend class ::Squawk;
public: public:
struct FileInfo { struct FileInfo {
enum class Preview { enum class Preview {
@ -64,7 +70,9 @@ namespace Shared {
}; };
Global(); Global();
static void notify(const QString& account, const Shared::Message& msg);
static Global* getInstance(); static Global* getInstance();
static QString getName(Availability av); static QString getName(Availability av);
static QString getName(ConnectionState cs); static QString getName(ConnectionState cs);
@ -122,6 +130,8 @@ namespace Shared {
private: private:
static Global* instance; static Global* instance;
Models::Roster* rosterModel;
QDBusInterface dbus;
std::map<QString, bool> pluginSupport; std::map<QString, bool> pluginSupport;
std::map<QString, FileInfo> fileCache; std::map<QString, FileInfo> fileCache;

View File

@ -763,7 +763,7 @@ void Models::Roster::removeAccount(const QString& account)
acc->deleteLater(); acc->deleteLater();
} }
QString Models::Roster::getContactName(const QString& account, const QString& jid) QString Models::Roster::getContactName(const QString& account, const QString& jid) const
{ {
ElId id(account, jid); ElId id(account, jid);
std::map<ElId, Contact*>::const_iterator cItr = contacts.find(id); std::map<ElId, Contact*>::const_iterator cItr = contacts.find(id);
@ -907,7 +907,7 @@ bool Models::Roster::groupHasContact(const QString& account, const QString& grou
} }
} }
QString Models::Roster::getContactIconPath(const QString& account, const QString& jid, const QString& resource) QString Models::Roster::getContactIconPath(const QString& account, const QString& jid, const QString& resource) const
{ {
ElId id(account, jid); ElId id(account, jid);
std::map<ElId, Contact*>::const_iterator cItr = contacts.find(id); std::map<ElId, Contact*>::const_iterator cItr = contacts.find(id);

View File

@ -65,7 +65,7 @@ public:
void addRoomParticipant(const QString& account, const QString& jid, const QString& name, const QMap<QString, QVariant>& data); void addRoomParticipant(const QString& account, const QString& jid, const QString& name, const QMap<QString, QVariant>& data);
void changeRoomParticipant(const QString& account, const QString& jid, const QString& name, const QMap<QString, QVariant>& data); void changeRoomParticipant(const QString& account, const QString& jid, const QString& name, const QMap<QString, QVariant>& data);
void removeRoomParticipant(const QString& account, const QString& jid, const QString& name); void removeRoomParticipant(const QString& account, const QString& jid, const QString& name);
QString getContactName(const QString& account, const QString& jid); QString getContactName(const QString& account, const QString& jid) const;
QVariant data ( const QModelIndex& index, int role ) const override; QVariant data ( const QModelIndex& index, int role ) const override;
Qt::ItemFlags flags(const QModelIndex &index) const override; Qt::ItemFlags flags(const QModelIndex &index) const override;
@ -77,7 +77,7 @@ public:
std::deque<QString> groupList(const QString& account) const; std::deque<QString> groupList(const QString& account) const;
bool groupHasContact(const QString& account, const QString& group, const QString& contactJID) const; bool groupHasContact(const QString& account, const QString& group, const QString& contactJID) const;
QString getContactIconPath(const QString& account, const QString& jid, const QString& resource); QString getContactIconPath(const QString& account, const QString& jid, const QString& resource) const;
Account* getAccount(const QString& name); Account* getAccount(const QString& name);
QModelIndex getAccountIndex(const QString& name); QModelIndex getAccountIndex(const QString& name);
QModelIndex getGroupIndex(const QString& account, const QString& name); QModelIndex getGroupIndex(const QString& account, const QString& name);

View File

@ -28,10 +28,9 @@ Squawk::Squawk(QWidget *parent) :
preferences(nullptr), preferences(nullptr),
about(nullptr), about(nullptr),
dialogueQueue(this), dialogueQueue(this),
rosterModel(), rosterModel(*(Shared::Global::getInstance()->rosterModel)),
conversations(), conversations(),
contextMenu(new QMenu()), contextMenu(new QMenu()),
dbus("org.freedesktop.Notifications", "/org/freedesktop/Notifications", "org.freedesktop.Notifications", QDBusConnection::sessionBus()),
vCards(), vCards(),
currentConversation(nullptr), currentConversation(nullptr),
restoreSelection(), restoreSelection(),
@ -441,33 +440,7 @@ void Squawk::changeMessage(const QString& account, const QString& jid, const QSt
void Squawk::notify(const QString& account, const Shared::Message& msg) void Squawk::notify(const QString& account, const Shared::Message& msg)
{ {
QString name = QString(rosterModel.getContactName(account, msg.getPenPalJid())); Shared::Global::notify(account, msg);
QString path = QString(rosterModel.getContactIconPath(account, msg.getPenPalJid(), msg.getPenPalResource()));
QVariantList args;
args << QString(QCoreApplication::applicationName());
args << QVariant(QVariant::UInt); //TODO some normal id
if (path.size() > 0) {
args << path;
} else {
args << QString("mail-message"); //TODO should here better be unknown user icon?
}
if (msg.getType() == Shared::Message::groupChat) {
args << msg.getFromResource() + " from " + name;
} else {
args << name;
}
QString body(msg.getBody());
QString oob(msg.getOutOfBandUrl());
if (body == oob) {
body = tr("Attached file");
}
args << body;
args << QStringList();
args << QVariantMap();
args << 3000;
dbus.callWithArgumentList(QDBus::AutoDetect, "Notify", args);
} }
void Squawk::onConversationMessage(const Shared::Message& msg) void Squawk::onConversationMessage(const Shared::Message& msg)

View File

@ -22,7 +22,6 @@
#include <QMainWindow> #include <QMainWindow>
#include <QScopedPointer> #include <QScopedPointer>
#include <QCloseEvent> #include <QCloseEvent>
#include <QtDBus/QDBusInterface>
#include <QSettings> #include <QSettings>
#include <QInputDialog> #include <QInputDialog>
@ -43,6 +42,7 @@
#include "dialogqueue.h" #include "dialogqueue.h"
#include "shared/shared.h" #include "shared/shared.h"
#include "shared/global.h"
namespace Ui { namespace Ui {
class Squawk; class Squawk;
@ -124,10 +124,9 @@ private:
Settings* preferences; Settings* preferences;
About* about; About* about;
DialogQueue dialogueQueue; DialogQueue dialogueQueue;
Models::Roster rosterModel; Models::Roster& rosterModel;
Conversations conversations; Conversations conversations;
QMenu* contextMenu; QMenu* contextMenu;
QDBusInterface dbus;
std::map<QString, VCard*> vCards; std::map<QString, VCard*> vCards;
Conversation* currentConversation; Conversation* currentConversation;
QModelIndex restoreSelection; QModelIndex restoreSelection;