summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pica-client/msguirouter.cpp40
-rw-r--r--pica-client/msguirouter.h5
-rw-r--r--pica-client/picasystray.cpp29
-rw-r--r--pica-client/picasystray.h8
4 files changed, 76 insertions, 6 deletions
diff --git a/pica-client/msguirouter.cpp b/pica-client/msguirouter.cpp
index b19bc55..2ab48c4 100644
--- a/pica-client/msguirouter.cpp
+++ b/pica-client/msguirouter.cpp
@@ -2,7 +2,8 @@
#include "dialogs/forgedcertdialog.h"
#include "history.h"
#include "mainwindow.h"
-
+#include "picasystray.h"
+#include "globals.h"
/*
этот класс должен обеспечивать связь между приёмом-отправкой сообщений и их отображением в пользовательском интерфейсе.
@@ -11,8 +12,7 @@
класса SkyNet) либо помигать иконкой в трее, либо создать новое окно чата, либо развернуть уже имеющееся, либо помигать
свернутым окном на таскбаре. Это поведение может настраиваться, настройки хранить в базе и загружать в конструкторе из
базы sqlite. Например, данный класс должен управлять экземплярами ChatWindow, создавать новые при необходимости либо
- активировать имеющиеся. Также этот класс должен обеспечивать хранение отложенных сообщений (когда собеседник недоступен).
- Можно придумать название получше
+ активировать имеющиеся.
*/
MsgUIRouter::MsgUIRouter(QObject *parent) :
QObject(parent)
@@ -22,7 +22,34 @@ MsgUIRouter::MsgUIRouter(QObject *parent) :
connect(skynet, SIGNAL(Delivered(QByteArray)), this, SLOT(delivered(QByteArray)));
connect(skynet, SIGNAL(CertificateForged(QByteArray,QString,QString)), this, SLOT(scary_cert_message(QByteArray,QString,QString)));
connect(skynet, SIGNAL(ErrMsgFromNode(QString)), this, SLOT(notification(QString)));
+ connect(systray, SIGNAL(doubleclicked()), this, SLOT(trayicon_dclick()));
+
+}
+void MsgUIRouter::trayicon_dclick()
+{
+ if (blinkqueue.isEmpty())
+ {
+ mainwindow->showNormal();
+ mainwindow->activateWindow();
+ mainwindow->raise();
+ }
+ else
+ {
+ QByteArray blinker_id = blinkqueue.takeLast();
+
+ if (chatwindows.contains(blinker_id))
+ {
+ chatwindows[blinker_id]->showNormal();
+ chatwindows[blinker_id]->activateWindow();
+ chatwindows[blinker_id]->raise();
+ }
+
+ if (blinkqueue.isEmpty())
+ {
+ systray->StopBlinking();
+ }
+ }
}
void MsgUIRouter::create_chatwindow(QByteArray peer_id)
@@ -49,6 +76,11 @@ void MsgUIRouter::msg_from_peer(QByteArray from, QString msg)
chatwindows[from]->msg_from_peer(msg);
+ if (!chatwindows[from]->isActiveWindow())
+ {
+ blinkqueue.append(from);
+ systray->StartBlinking();
+ }
}
void MsgUIRouter::msg_to_peer(QString msg, ChatWindow *sender_window)
@@ -65,6 +97,8 @@ void MsgUIRouter::start_chat(QByteArray peer_id)
else
{
chatwindows[peer_id]->showNormal();
+ chatwindows[peer_id]->activateWindow();
+ chatwindows[peer_id]->raise();
}
}
diff --git a/pica-client/msguirouter.h b/pica-client/msguirouter.h
index eafa54b..9fb404c 100644
--- a/pica-client/msguirouter.h
+++ b/pica-client/msguirouter.h
@@ -2,7 +2,7 @@
#define MSGUIROUTER_H
#include <QObject>
-#include <QList>
+#include <QLinkedList>
#include <QMap>
#include "chatwindow.h"
#include "skynet.h"
@@ -28,8 +28,11 @@ public slots:
void scary_cert_message(QByteArray peer_id, QString received_cert, QString stored_cert);
void notification(QString text);
+
+ void trayicon_dclick();
private:
QMap<QByteArray,ChatWindow*> chatwindows;
+ QLinkedList<QByteArray> blinkqueue;
void create_chatwindow(QByteArray peer_id);
diff --git a/pica-client/picasystray.cpp b/pica-client/picasystray.cpp
index 64e94b4..62a7adb 100644
--- a/pica-client/picasystray.cpp
+++ b/pica-client/picasystray.cpp
@@ -10,7 +10,7 @@
#endif
PicaSysTray::PicaSysTray(QObject *parent) :
- QObject(parent)
+ QObject(parent), emptyicon_(32,32)
{
systrayMenu_ = new QMenu();
@@ -26,13 +26,16 @@ PicaSysTray::PicaSysTray(QObject *parent) :
connect(systray_, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(systray_activated(QSystemTrayIcon::ActivationReason)));
connect(skynet, SIGNAL(BecameSelfAware()), this, SLOT(skynet_became_self_aware()));
connect(skynet, SIGNAL(LostSelfAwareness()), this, SLOT(skynet_lost_self_awareness()));
+
+ emptyicon_.fill(Qt::transparent);
+
}
void PicaSysTray::systray_activated(QSystemTrayIcon::ActivationReason r)
{
if (r == QSystemTrayIcon::DoubleClick && mainwindow!=NULL)
{
- mainwindow->showNormal();
+ emit doubleclicked();
}
}
@@ -46,3 +49,25 @@ void PicaSysTray::skynet_lost_self_awareness()
{
systray_->setIcon(picapica_ico_sit);
}
+
+void PicaSysTray::StartBlinking()
+{
+ blink_ = systray_->icon();
+ timer_id_ = startTimer(300);
+}
+
+void PicaSysTray::StopBlinking()
+{
+ killTimer(timer_id_);
+ systray_->setIcon(blink_);
+}
+
+void PicaSysTray::timerEvent(QTimerEvent *event)
+{
+static int blinker;
+
+ blinker++ % 2 ? systray_->setIcon(blink_)
+ :
+ systray_->setIcon(QIcon(emptyicon_));
+
+}
diff --git a/pica-client/picasystray.h b/pica-client/picasystray.h
index cf9706d..5743280 100644
--- a/pica-client/picasystray.h
+++ b/pica-client/picasystray.h
@@ -4,6 +4,7 @@
#include <QObject>
#include <QSystemTrayIcon>
#include <QMenu>
+#include <QPixmap>
#include "skynet.h"
#include "mainwindow.h"
#include "globals.h"
@@ -13,14 +14,21 @@ class PicaSysTray : public QObject
Q_OBJECT
public:
explicit PicaSysTray(QObject *parent = 0);
+ void StartBlinking();
+ void StopBlinking();
signals:
+ void doubleclicked();
public slots:
private:
QSystemTrayIcon *systray_;
QMenu *systrayMenu_;
+ void timerEvent(QTimerEvent *event);
+ int timer_id_;
+ QIcon blink_;
+ QPixmap emptyicon_;
private slots:
void systray_activated(QSystemTrayIcon::ActivationReason);