diff --git a/Desktop.qml b/Desktop.qml index 048bf2b6..91642faf 100644 --- a/Desktop.qml +++ b/Desktop.qml @@ -1,314 +1,314 @@ // Skeleton from https://github.com/achipa/outqross_blog.git // Almost everything has been re-adapted import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.2 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 import QtQuick.Layouts 1.1 import Qt.labs.settings 1.0 import QtGraphicalEffects 1.0 import KDE.Ruqola.UserData 1.0 import KDE.Ruqola.DDPClient 1.0 -import KDE.Ruqola.Notification 1.0 // import "Log.js" as Log // import "Data.js" as Data ApplicationWindow { property int margin: 11 property string statusText property string lightGreen: "#6ab141"; property string darkGreen: "#00613a"; property string selectedRoomID: ""; id: appid title: qsTr("Ruqola") width: 800 height: 600 visible: true - /* + Shortcut { sequence: StandardKey.Quit context: Qt.ApplicationShortcut onActivated: Qt.quit() } - */ + Login { id: loginTab visible: (UserData.loginStatus == DDPClient.LoginFailed || UserData.loginStatus == DDPClient.LoggedOut) anchors.fill:parent z: 10 serverURL: UserData.serverURL username: UserData.userName onAccepted: { UserData.password = loginTab.password; UserData.userName = loginTab.username; UserData.serverURL = loginTab.serverURL; UserData.tryLogin(); } } BusyIndicator { id: busy anchors.centerIn: parent visible: UserData.loginStatus == DDPClient.LoggingIn } Item { id: mainWidget anchors.fill: parent visible: !loginTab.visible Rectangle { id: userBox anchors.top: parent.top width: parent.width anchors.left: parent.left anchors.right: roomsList.right height: 40 color: darkGreen Text { verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignRight anchors.rightMargin: 10 anchors.fill: parent font.pointSize: 12 color: "white" text: "Hello, " + UserData.userName } } RoomsView { anchors.top: userBox.bottom anchors.left: parent.left anchors.bottom: parent.bottom anchors.margins: 0 width: 200 height: appid.height id: roomsList model: UserData.roomModel() visible: parent.visible selectedRoomID: appid.selectedRoomID; onRoomSelected: { if (roomID == selectedRoomID) { return; } console.log("Choosing room", roomID); appid.selectedRoomID = roomID; activeChat.model = UserData.getModelForRoom(roomID) topicWidget.selectedRoom = UserData.getRoom(roomID) } onCountChanged: { // console.log("We have", roomsList.count, "rooms") } LinearGradient { id: greenGradient anchors.fill: parent start: Qt.point(0, 0) end: Qt.point(roomsList.width, 0) gradient: Gradient { GradientStop { position: 0.0; color: "#6ab141" } GradientStop { position: 1.0; color: "#00613a" } } z: -1; } } Item { anchors.right: parent.right anchors.left: roomsList.right anchors.top: parent.top anchors.bottom: messageLine.top // Item { // anchors.fill: parent // id: greeter // visible: false // // visible: selectedRoomID.empty // Text { // text: "Welcome to Ruqola!"; // } // } Rectangle { id: topicWidget color: "#fff" anchors.top: parent.top property var selectedRoom; Text { id: nameLabel text: "#" + parent.selectedRoom.name font.pointSize: 18 verticalAlignment: Text.AlignVCenter anchors.leftMargin: 20 - height: 30 - + //height: 30 + height: font.pixelSize + 10 + anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right } Text { id: topicLabel text: topicWidget.selectedRoom.topic anchors.top: nameLabel.bottom anchors.bottom: parent.bottom anchors.left: parent.left anchors.right: parent.right horizontalAlignment: Text.AlignHCenter height: font.pixelSize + 10 } anchors.right: parent.right anchors.left: parent.left height: nameLabel.height + topicLabel.height } ScrollView { anchors.right: parent.right anchors.left: parent.left anchors.top: topicWidget.bottom anchors.bottom: parent.bottom verticalScrollBarPolicy: Qt.ScrollBarAlwaysOn // visible: parent.visible && (UserData.loginStatus != DDPClient.LoggingIn) // visible: !greeter.visible ListView { id: activeChat // model: UserData.getModelForRoom(selectedRoomID) onCountChanged: { // console.log("changed") // var newIndex = count - 1 // last index // positionViewAtEnd() positionViewAtIndex(count - 1, ListView.Beginning) // currentIndex = newIndex } // Component.onCompleted: positionViewAtEnd() Component.onCompleted: positionViewAtIndex(count - 1, ListView.Beginning) // onSelectedRoomIDChanged: { console.log("CHANGED"); activeChat.positionViewAtEnd(); } // model: myModel anchors.fill:parent visible : count > 0 z: -1 // ScrollBar.vertical: ScrollBar { } delegate: Message { i_messageText: messageText i_username: username i_systemMessage: systemMessage i_systemMessageType: type width: parent.width } } } } TextField { id: messageLine anchors.right: parent.right anchors.left: roomsList.right anchors.bottom: parent.bottom placeholderText: if (UserData.loginStatus != DDPClient.LoggedIn || (selectedRoomID=="")){ qsTr("Please Select a room") } else{ qsTr("Enter message") } height: 2.7*font.pixelSize onAccepted: { if (text != "" && UserData.loginStatus == DDPClient.LoggedIn && !(selectedRoomID=="")) { UserData.sendMessage(selectedRoomID, text); text = ""; } } } } Rectangle { z: -10 anchors.fill: parent color: "white" } onClosing: { console.log("Minimizing to systray..."); - Notification.windowVisibility = false; + Notification.windowMinimized = true; hide(); } function toggleShow(reason) { // console.log ("Showing"); if (visible) { - Notification.windowVisibility = false; + Notification.windowMinimized = false; hide(); } else { show(); raise(); requestActivate(); - Notification.windowVisibility = true; + Notification.windowMinimized = true; } } Component.onCompleted: { - Notification.systrayIcon.activated.connect(toggleShow); + systrayIcon.activated.connect(toggleShow); // roomsList.model = UserData.roomModel(); // systrayIcon.showMessage("Connected", "We are CONNECTED!"); - timer.start(); - timer.fire(); +// timer.start(); +// timer.fire(); } /* Timer { id: timer interval: 1000 onTriggered: { // console.log("FIRE"); switch (UserData.loginStatus) { case UserData.NotConnected: statusText = qsTr("Not connected."); break; case UserData.LoggedIn: statusText = qsTr("Connected to " + UserData.serverURL); break; } } repeat: true }*/ - onStatusTextChanged: timer.restart(); +// onStatusTextChanged: timer.restart(); } diff --git a/main.cpp b/main.cpp index 96021a30..23ddfc93 100644 --- a/main.cpp +++ b/main.cpp @@ -1,58 +1,57 @@ #include #include #include #include // only if deskop #include "src/roommodel.h" #include "src/rocketchatbackend.h" #include "src/userdata.h" #include #include #include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setWindowIcon(QIcon(":/systray.png")); QCoreApplication::setOrganizationName("KDE"); QCoreApplication::setOrganizationDomain("kde.org"); QCoreApplication::setApplicationName("Ruqola"); qmlRegisterSingletonType("KDE.Ruqola.UserData", 1, 0, "UserData", userdata_singletontype_provider); qmlRegisterType("KDE.Ruqola.Models", 1, 0, "MessageModel"); qmlRegisterType("KDE.Ruqola.DDPClient", 1, 0, "DDPClient"); qmlRegisterType("KDE.Ruqola.RoomModel", 1, 0, "RoomModel"); qmlRegisterType("KDE.Ruqola.RoomWrapper", 1, 0, "RoomWrapper"); - qmlRegisterType("KDE.Ruqola.Notification", 1, 0, "Notification"); RocketChatBackend c; QQmlApplicationEngine engine; /* QQmlContext *ctxt = engine.rootContext(); QMenu menu; auto quit = menu.addAction("&Quit"); QObject::connect(quit, &QAction::triggered, &app, &QApplication::quit); QSystemTrayIcon systray; systray.setIcon(QIcon(":/systray.png")); systray.setContextMenu(&menu); systray.setVisible(true); systray.setToolTip("Ruqola"); ctxt->setContextProperty("systrayIcon", &systray); */ engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); } diff --git a/src/rocketchatbackend.cpp b/src/rocketchatbackend.cpp index 23f99789..a09afa3f 100644 --- a/src/rocketchatbackend.cpp +++ b/src/rocketchatbackend.cpp @@ -1,234 +1,256 @@ /* * * Copyright 2016 Riccardo Iaconelli * * 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 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * 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 . * */ #include "rocketchatbackend.h" #include #include #include #include "userdata.h" #include "ddpclient.h" void debug_callback(QJsonDocument doc) { qDebug() << "DEBUG:" << doc; } void process_backlog(QJsonDocument messages) { qDebug() << messages.object().value("messages").toArray().size(); RocketChatBackend::processIncomingMessages(messages.object().value("messages").toArray()); } void rooms_callback(QJsonDocument doc) { // qDebug() << doc; RoomModel *model = UserData::self()->roomModel(); // qDebug() << model; // model->reset(); QJsonArray removed = doc.object().value("remove").toArray(); QJsonArray updated = doc.object().value("update").toArray(); for (int i = 0; i < updated.size(); i++) { QJsonObject room = updated.at(i).toObject(); if (room.value("t").toString() != "d") { QString roomID = room.value("_id").toString(); // qDebug() << "Adding" << roomID<< room.value("name").toString() << room; MessageModel *roomModel = UserData::self()->getModelForRoom(roomID); // let's be extra safe around crashes if (UserData::self()->loginStatus() == DDPClient::LoggedIn) { Room r; r.id = roomID; r.name = room["name"].toString(); r.topic = room["topic"].toString(); qDebug() << "Adding room" << r.name << r.id << r.topic; model->addRoom(r); } QString params = QString("[\"%1\"]").arg(roomID); UserData::self()->ddp()->subscribe("stream-room-messages", QJsonDocument::fromJson(params.toLatin1())); // Load history QByteArray json = "[\""+roomID.toLatin1() + "\", null, 50, {\"$date\": "+ QString::number(roomModel->lastTimestamp()).toLatin1()+ "}]"; qDebug() << json; UserData::self()->ddp()->method("loadHistory", QJsonDocument::fromJson(json), process_backlog); } } qDebug() << "DEBUG:" << doc; } void subs_callback(QJsonDocument doc) { // qDebug() << doc; RoomModel *model = UserData::self()->roomModel(); // qDebug() << model; // model->reset(); QJsonArray removed = doc.object().value("remove").toArray(); QJsonArray updated = doc.object().value("update").toArray(); for (int i = 0; i < updated.size(); i++) { QJsonObject room = updated.at(i).toObject(); if (room.value("t").toString() != "d") { QString roomID = room.value("rid").toString(); // qDebug() << "Adding" << roomID<< room.value("name").toString() << room; MessageModel *roomModel = UserData::self()->getModelForRoom(roomID); // let's be extra safe around crashes if (UserData::self()->loginStatus() == DDPClient::LoggedIn) { Room r; r.id = roomID; r.name = room["name"].toString(); r.topic = room["topic"].toString(); qDebug() << "Adding room" << r.name << r.id << r.topic; model->addRoom(r); } QString params = QString("[\"%1\"]").arg(roomID); UserData::self()->ddp()->subscribe("stream-room-messages", QJsonDocument::fromJson(params.toLatin1())); // Load history QByteArray json = "[\""+roomID.toLatin1() + "\", null, 50, {\"$date\": "+ QString::number(roomModel->lastTimestamp()).toLatin1()+ "}]"; qDebug() << json; UserData::self()->ddp()->method("loadHistory", QJsonDocument::fromJson(json), process_backlog); } } qDebug() << "DEBUG:" << doc; } void RocketChatBackend::processIncomingMessages(QJsonArray messages) { foreach (const QJsonValue v, messages) { QJsonObject o = v.toObject(); Message m; QString roomId = o.value("rid").toString(); QString type = o.value("t").toString(); m.username = o.value("u").toObject().value("username").toString(); m.userID = o.value("u").toObject().value("_id").toString(); m.message = o.value("msg").toString(); m.messageID = o.value("_id").toString(); m.roomID = roomId; m.timestamp = (qint64)o.value("ts").toObject().value("$date").toDouble(); if (!type.isEmpty()) { m.systemMessage = true; m.systemMessageType = type; } else { m.systemMessage = false; } UserData::self()->getModelForRoom(roomId)->addMessage(m); } } RocketChatBackend::RocketChatBackend(QObject* parent) : QObject(parent) { // UserData::self()->ddp() = new DDPClient(, this); connect(UserData::self(), &UserData::loginStatusChanged, this, &RocketChatBackend::onLoginStatusChanged); connect(UserData::self()->ddp(), &DDPClient::changed, this, &RocketChatBackend::onChanged); connect(UserData::self()->ddp(), &DDPClient::added, this, &RocketChatBackend::onAdded); } RocketChatBackend::~RocketChatBackend() { } void RocketChatBackend::onLoginStatusChanged() { if (UserData::self()->loginStatus() == DDPClient::LoggedIn) { qDebug() << "GETTING LIST OF ROOMS"; // UserData::self()->ddp()->method("subscriptions/get", QJsonDocument::fromJson("{\"$date\": 0}"), rooms_callback); UserData::self()->ddp()->method("rooms/get", QJsonDocument::fromJson("{\"$date\": 0}"), rooms_callback); // UserData::self()->ddp()->subscribe("stream-room-messages", QJsonDocument::fromJson(params.toLatin1())); } } void RocketChatBackend::onLoggedIn() { // if (UserData::self()->loginStatus() != DDPClient::LoggedIn) { // qDebug() << "not yet logged in:" << UserData::self()->loginStatus(); // return; // } // // get list of rooms // UserData::self()->ddp()->method("rooms/get", QJsonDocument::fromJson("{\"$date\": 0}"), rooms_callback); } void RocketChatBackend::onAdded(QJsonObject object) { QString collection = object.value("collection").toString(); qDebug() << "ROCKET BACK" << object << collection; if (collection == "stream-room-messages") { } else if (collection == "users") { qDebug() << "NEW USER"; } else if (collection == "rooms") { } } void RocketChatBackend::onChanged(QJsonObject object) { QString collection = object["collection"].toString(); qDebug() << "ROCKET BACK" << object << collection; if (collection == "stream-room-messages") { QJsonObject fields = object.value("fields").toObject(); QString roomId = fields.value("eventName").toString(); QJsonArray contents = fields.value("args").toArray(); RocketChatBackend::processIncomingMessages(contents); } else if (collection == "users") { qDebug() << "NEW USER"; } else if (collection == "rooms") { + + } + else if (collection == "stream-notify-user"){ + + QJsonArray messages = object.value("fields").toObject().value("args").toArray(); + foreach (const QJsonValue v, messages) { + QJsonObject o = v.toObject(); + + Message m; + QString roomId = o.value("rid").toString(); + QString type = o.value("t").toString(); + m.username = o.value("u").toObject().value("username").toString(); + m.userID = o.value("u").toObject().value("_id").toString(); + m.message = o.value("msg").toString(); + m.messageID = o.value("_id").toString(); + m.roomID = roomId; + m.timestamp = (qint64)o.value("ts").toObject().value("$date").toDouble(); + //not a system message and message not sent by user itself + if ( !type.isEmpty() && m.username != UserData::self()->userName()){ + Notification::self()->showNotification(m.userID, m.username,m.message); + } + } } } diff --git a/src/userdata.cpp b/src/userdata.cpp index c3ec18f3..89d9d92b 100644 --- a/src/userdata.cpp +++ b/src/userdata.cpp @@ -1,292 +1,294 @@ /* * * Copyright 2016 Riccardo Iaconelli * * 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 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * 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 . * */ #include "userdata.h" #include "roommodel.h" #include "ddpclient.h" #include #include #include #include -Notification::Notification(){ - qDebug() << "Inside notification constructor"; - createActions(); - createTrayIcon(); - connect(trayIcon, &QSystemTrayIcon::messageClicked, this, &Notification::notificationClicked); - trayIcon->show(); +bool Notification::windowMinimized() const { + return n_windowMinimized; } -QSystemTrayIcon * Notification::systrayIcon(){ - return trayIcon; -} - -//To check whether or not to show notifications -bool Notification::windowVisibility() { - return m_windowVisibility; -} - -void Notification::setmessage(const QString &message){ - m_message = message; -} - -QString Notification::message() const{ - return m_message; -} - -void Notification::showMessage(){ - if (!windowVisibility()){ - QString user_message = message(); - trayIcon->showMessage("New message from "+UserData::self()->userName(), - user_message, QSystemTrayIcon::Information, 5000); - } - else{ - qDebug() << "New message recieved- Window maximized"; - } +void Notification::setWindowMinimized(const bool &val){ + n_windowMinimized = val; } //Opens the room having new message -void Notification::notificationClicked(){ +//void Notification::notificationClicked(){ /* - * 1. open systray + * 1. Maximize systray * 2. switch to unread room * */ -} +//} void Notification::createActions(){ - restoreAction = new QAction(tr("&Restore"), this); - connect(restoreAction, &QAction::triggered, this, &QWindow::showNormal ); +// restoreAction = new QAction(tr("&Restore"), this); +// connect(restoreAction, &QAction::triggered, qApp, &QWindow::showNormal ); quitAction = new QAction(tr("&Quit"), this); connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit); } void Notification::createTrayIcon(){ qDebug() << "Creating system tray"; if (!QSystemTrayIcon::isSystemTrayAvailable()) { QMessageBox::critical(0, QObject::tr("Systray"), QObject::tr("Cannot detect SystemTray on this system.")); return; } trayIconMenu = new QMenu(); - trayIconMenu->addAction(restoreAction); +// trayIconMenu->addAction(restoreAction); trayIconMenu->addAction(quitAction); trayIconMenu->addSeparator(); - trayIcon = new QSystemTrayIcon(this); - trayIcon->setContextMenu(trayIconMenu); - trayIcon->setToolTip("Ruqola"); - trayIcon->setIcon(QIcon(":/systray.png")); - trayIcon->setVisible(true); + n_self->setContextMenu(trayIconMenu); + n_self->setToolTip("Ruqola"); + n_self->setIcon(QIcon(":/systray.png")); + n_self->setVisible(true); +} + +//void notification_callback(QJsonDocument doc) +//{ +//} + +void Notification::showNotification(const QString userID, const QString userName, QString message ) +{ + QString params = QString("[\"%1\"/\"%2\" ]").arg(userID).arg(QString("notification")); + UserData::self()->ddp()->subscribe("stream-notify-user", QJsonDocument::fromJson(params.toLatin1())); + + if ( n_windowMinimized && UserData::self()->loginStatus() == DDPClient::LoggedIn ){ + QString title("New Message"); //This can be enhanced later + QString msg = QString("%1 \n %2").arg(userName).arg(message); + n_self->showMessage(title, msg, QSystemTrayIcon::Information, 5000 ); + } } + +Notification *Notification::n_self = 0; UserData *UserData::m_self = 0; QString UserData::authToken() const { return m_authToken; } QString UserData::userName() const { return m_userName; } QString UserData::password() const { return m_password; } void UserData::setAuthToken(const QString& token) { qDebug() << "Setting token to" << token; QSettings s; m_authToken = token; s.setValue("authToken", token); } void UserData::setPassword(const QString& password) { m_password = password; } void UserData::setUserName(const QString& username) { m_userName = username; QSettings s; s.setValue("username", username); emit userNameChanged(); } RoomModel * UserData::roomModel() { if (!m_roomModel) { qDebug() << "creating new RoomModel"; m_roomModel = new RoomModel(this); qDebug() << m_roomModel; // m_roomModel->reset(); } return m_roomModel; } DDPClient * UserData::ddp() { if (!m_ddp) { m_ddp = new DDPClient(serverURL()); connect(m_ddp, &DDPClient::loginStatusChanged, this, &UserData::loginStatusChanged); // connect(m_ddp, &DDPClient::loginStatusChanged, this, [=](){qDebug() << "Signal received";}); } return m_ddp; } void UserData::sendMessage(const QString &roomID, const QString &message) { - Notification *notification = new Notification(); QString json = "{\"rid\": \"%1\", \"msg\": \"%2\"}"; json = json.arg(roomID, message); - notification->setmessage(message); ddp()->method("sendMessage", QJsonDocument::fromJson(json.toUtf8())); } MessageModel * UserData::getModelForRoom(const QString& roomID) { if (m_messageModels.contains(roomID)) { // qDebug() << "Returning old model for " << roomID; return m_messageModels.value(roomID); } else { // qDebug() << "Creating a new model"; m_messageModels[roomID] = new MessageModel(roomID, this); return m_messageModels[roomID]; } } QString UserData::serverURL() const { return m_serverURL; } void UserData::setServerURL(const QString& serverURL) { if (m_serverURL == serverURL) { return; } QSettings s; s.setValue("serverURL", serverURL); m_serverURL = serverURL; // m_roomModel->reset(); emit serverURLChanged(); } DDPClient::LoginStatus UserData::loginStatus() { if (m_ddp) { return ddp()->loginStatus(); } else { return DDPClient::LoggedOut; } } void UserData::tryLogin() { qDebug() << "Attempting login" << userName() << "on" << serverURL(); // Reset model views foreach (const QString key, m_messageModels.keys()) { MessageModel *m = m_messageModels.take(key); delete m; } delete m_ddp; m_ddp = 0; // In the meantime, load cache... m_roomModel->reset(); // This creates a new ddp() object. // DDP will automatically try to connect and login. ddp(); } void UserData::logOut() { setAuthToken(QString()); setPassword(QString()); // m_ddp->logOut(); foreach (const QString key, m_messageModels.keys()) { MessageModel *m = m_messageModels.take(key); delete m; } delete m_ddp; m_ddp = 0; emit loginStatusChanged(); m_roomModel->clear(); } QString UserData::cacheBasePath() const { if (m_serverURL.isEmpty()) { return QString(); } return QStandardPaths::writableLocation(QStandardPaths::CacheLocation)+'/'+m_serverURL; } // QString UserData::activeRoom() const // { // return m_activeRoom; // } // void UserData::setActiveRoom(const QString& activeRoom) // { // m_activeRoom = activeRoom; // // roomModel()->setActiveRoom(activeRoom); // emit activeRoomChanged(); // } RoomWrapper * UserData::getRoom(const QString& roomID) { return roomModel()->findRoom(roomID); } UserData::UserData(QObject* parent): QObject(parent), m_ddp(0), m_roomModel(0) { QSettings s; m_serverURL = s.value("serverURL", "demo.rocket.chat").toString(); m_userName = s.value("username").toString(); m_authToken = s.value("authToken").toString(); - Notification(); - qDebug() << "Called notification constructor"; // roomModel()->reset(); } UserData * UserData::self() { if (!m_self) { m_self = new UserData; m_self->ddp(); // Create DDP object so we try to connect at startup m_self->roomModel()->reset(); // m_self->getModelForRoom("GENERAL"); } return m_self; } +Notification::Notification(): n_windowMinimized(false) +{ + qDebug() << "Called notification constructor"; +} + + +Notification * Notification::self() +{ + if(!n_self){ + n_self = new Notification; + n_self->createActions(); + n_self->createTrayIcon(); + n_self->show(); + } + return n_self; +} + diff --git a/src/userdata.h b/src/userdata.h index 78c462f2..a62552a8 100644 --- a/src/userdata.h +++ b/src/userdata.h @@ -1,146 +1,143 @@ /* * * Copyright 2016 Riccardo Iaconelli * * 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 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * 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 . * */ #ifndef USERDATA_H #define USERDATA_H #include #include #include #include #include #include "ddpclient.h" #include "roommodel.h" #include "messagemodel.h" QT_BEGIN_NAMESPACE class QAction; class QMenu; QT_END_NAMESPACE class QString; class UserData: public QObject { Q_OBJECT Q_PROPERTY (QString userName READ userName WRITE setUserName NOTIFY userNameChanged) Q_PROPERTY (QString serverURL READ serverURL WRITE setServerURL NOTIFY serverURLChanged) - Q_PROPERTY (QString password READ password WRITE setPassword) + Q_PROPERTY (QString password WRITE setPassword) // Q_PROPERTY (bool connected READ connected NOTIFY connectedChanged) Q_PROPERTY (DDPClient::LoginStatus loginStatus READ loginStatus NOTIFY loginStatusChanged) // Q_PROPERTY(QString activeRoom READ activeRoom WRITE setActiveRoom NOTIFY activeRoomChanged) public: static UserData* self(); void setUserName(const QString &username); QString userName() const; void setPassword(const QString &password); QString password() const; void setAuthToken(const QString &token); QString authToken() const; bool connected(); DDPClient::LoginStatus loginStatus(); QString serverURL() const; void setServerURL(const QString &serverURL); // QString activeRoom() const; // void setActiveRoom(const QString &activeRoom); DDPClient *ddp(); Q_INVOKABLE RoomModel *roomModel(); Q_INVOKABLE void sendMessage(const QString &roomID, const QString &message); Q_INVOKABLE MessageModel* getModelForRoom(const QString &roomID); Q_INVOKABLE void tryLogin(); Q_INVOKABLE void logOut(); Q_INVOKABLE RoomWrapper* getRoom(const QString &roomID); // void setRoomModel(); QString cacheBasePath() const; signals: void userNameChanged(); void serverURLChanged(); void loginStatusChanged(); private: UserData(QObject *parent = 0); static UserData *m_self; QString m_password; QString m_userName; QString m_authToken; QString m_serverURL; DDPClient *m_ddp; RoomModel *m_roomModel; QHash< QString, MessageModel * > m_messageModels; }; -class Notification: public QWindow{ +class Notification: public QSystemTrayIcon{ Q_OBJECT - Q_PROPERTY(bool windowVisibility READ windowVisibility) - Q_PROPERTY(QString message READ message WRITE setmessage NOTIFY messageChanged) - Q_PROPERTY(QSystemTrayIcon *systrayIcon READ systrayIcon) + Q_PROPERTY (bool windowMinimized READ windowMinimized WRITE setWindowMinimized NOTIFY windowMinimizedChanged) + public: - Notification(); - bool windowVisibility(); - void setmessage(const QString &userMessage); - QString message() const; - QSystemTrayIcon * systrayIcon(); - void showMessage(); - void notificationClicked(); + void createActions(); + void createTrayIcon(); + + void setWindowMinimized(const bool &val); + bool windowMinimized() const; + void showNotification(const QString userID, const QString userName, QString message); + + static Notification * self(); signals: - void messageChanged(); //Not required though + void windowMinimizedChanged(); private: - void createActions(); - void createTrayIcon(); + Notification(); + static Notification *n_self; QAction *restoreAction; QAction *quitAction; - - QSystemTrayIcon *trayIcon; QMenu *trayIconMenu; - bool m_windowVisibility; - QString m_message; + bool n_windowMinimized; }; inline static QObject *userdata_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) Q_UNUSED(scriptEngine) UserData *userData = UserData::self(); return userData; } #endif // USERDATA_H