diff options
| -rw-r--r-- | pica-client/msguirouter.cpp | 40 | ||||
| -rw-r--r-- | pica-client/msguirouter.h | 5 | ||||
| -rw-r--r-- | pica-client/picasystray.cpp | 29 | ||||
| -rw-r--r-- | pica-client/picasystray.h | 8 |
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); |
