@@ -20,12 +20,14 @@ mac{ | |||
LIBS += -framework Foundation | |||
OBJECTIVE_SOURCES += osx/notification.mm | |||
OBJECTIVE_SOURCES += osx/notification.mm\ | |||
osx/notificationimpl.mm | |||
SOURCES += osx/osxplatform.cpp | |||
HEADERS += osx/notification.h\ | |||
osx/osxplatform.h | |||
osx/osxplatform.h\ | |||
osx/notificationimpl.h | |||
} | |||
SOURCES += main.cpp\ | |||
@@ -54,7 +56,6 @@ SOURCES += main.cpp\ | |||
chooseemojiwidget.cpp \ | |||
sendtextedit.cpp \ | |||
feiqwin.cpp \ | |||
plugin/unreadchecker.cpp \ | |||
plugin/iplugin.cpp \ | |||
plugin/rankuser.cpp \ | |||
settings.cpp | |||
@@ -94,7 +95,6 @@ HEADERS += mainwindow.h \ | |||
sendtextedit.h \ | |||
plugin/iplugin.h \ | |||
feiqwin.h \ | |||
plugin/unreadchecker.h \ | |||
plugin/rankuser.h \ | |||
settings.h | |||
@@ -2,8 +2,6 @@ | |||
#include "mainwindow.h" | |||
#include "plugin/iplugin.h" | |||
#include "plugin/unreadchecker.h" | |||
FeiqWin::FeiqWin() | |||
{ | |||
@@ -34,11 +32,6 @@ Settings *FeiqWin::settings() | |||
return mMainWin->mSettings; | |||
} | |||
int FeiqWin::getUnreadCount() | |||
{ | |||
return mMainWin->getUnreadCount(); | |||
} | |||
void FeiqWin::init(MainWindow *mainWin) | |||
{ | |||
mMainWin = mainWin; | |||
@@ -27,9 +27,6 @@ public: | |||
const FeiqModel* feiqModel(); | |||
Settings* settings(); | |||
public: | |||
int getUnreadCount(); | |||
private: | |||
void init(MainWindow* mainWin); | |||
void unInit(); | |||
@@ -80,6 +80,9 @@ MainWindow::MainWindow(QWidget *parent) : | |||
connect(ui->actionSendKnock, SIGNAL(triggered(bool)), this, SLOT(sendKnock())); | |||
connect(ui->actionSendFile, SIGNAL(triggered(bool)), this, SLOT(sendFile())); | |||
//初始化平台相关特性 | |||
PlatformDepend::instance().setMainWnd(this); | |||
//初始化飞秋引擎 | |||
connect(this, SIGNAL(feiqViewEvent(shared_ptr<ViewEvent>)), this, SLOT(handleFeiqViewEvent(shared_ptr<ViewEvent>))); | |||
@@ -105,13 +108,55 @@ void MainWindow::setFeiqWin(FeiqWin *feiqWin) | |||
mFeiqWin->init(this); | |||
} | |||
void MainWindow::onNotifyClicked(const QString& fellowIp) | |||
{ | |||
qDebug()<<fellowIp; | |||
auto fellow = mFeiq.getModel().findFirstFellowOf(fellowIp.toStdString()); | |||
if (fellow) | |||
openChartTo(fellow.get()); | |||
raise(); | |||
activateWindow(); | |||
showNormal(); | |||
} | |||
void MainWindow::onNotifyReplied(long notifyId, const QString &fellowIp, const QString &reply) | |||
{ | |||
auto fellow = mFeiq.getModel().findFirstFellowOf(fellowIp.toStdString()); | |||
if (fellow) | |||
{ | |||
//回复消息 | |||
auto content = make_shared<TextContent>(); | |||
content->text = reply.toStdString(); | |||
mFeiq.send(fellow, content); | |||
//设为已回复 | |||
auto msgRepliedTo = findUnshownMessage(notifyId); | |||
if (msgRepliedTo) | |||
{ | |||
msgRepliedTo->replied=true; | |||
} | |||
//将自己的回复放入未显示列表 | |||
auto event = make_shared<MessageViewEvent>(); | |||
event->contents.push_back(content); | |||
event->fellow = nullptr; | |||
auto& msg = addUnshownMessage(fellow.get(), event); | |||
msg.read = true; | |||
updateUnshownHint(fellow.get()); | |||
} | |||
} | |||
void MainWindow::enterEvent(QEvent *event) | |||
{ | |||
auto fellow = mRecvTextEdit->curFellow(); | |||
if (fellow) | |||
{ | |||
flushUnread(fellow); | |||
updateUnread(fellow); | |||
flushUnshown(fellow); | |||
updateUnshownHint(fellow); | |||
} | |||
PlatformDepend::instance().hideAllNotify(); | |||
@@ -122,8 +167,8 @@ void MainWindow::openChartTo(const Fellow *fellow) | |||
mFellowList.top(*fellow); | |||
mRecvTextEdit->setCurFellow(fellow); | |||
setWindowTitle(mTitle + " - 与"+fellow->getName().c_str()+"会话中"); | |||
flushUnread(fellow); | |||
updateUnread(fellow); | |||
flushUnshown(fellow); | |||
updateUnshownHint(fellow); | |||
} | |||
shared_ptr<Fellow> MainWindow::checkCurFellow() | |||
@@ -150,7 +195,9 @@ void MainWindow::onStateChanged(FileTask *fileTask) | |||
if (fileTask->getState()==FileTaskState::Finish) | |||
{ | |||
auto title = QString(fileTask->getTaskTypeDes().c_str())+"完成"; | |||
PlatformDepend::instance().showNotify(title, fileTask->getContent()->filename.c_str()); | |||
PlatformDepend::instance().showNotify(title, | |||
fileTask->getContent()->filename.c_str(), | |||
fileTask->fellow()->getIp().c_str()); | |||
} | |||
else if (fileTask->getState()==FileTaskState::Error) | |||
{ | |||
@@ -158,7 +205,9 @@ void MainWindow::onStateChanged(FileTask *fileTask) | |||
auto content = QString(fileTask->getContent()->filename.c_str()); | |||
content += "\n"; | |||
content += fileTask->getDetailInfo().c_str(); | |||
PlatformDepend::instance().showNotify(title, content); | |||
PlatformDepend::instance().showNotify(title, | |||
content, | |||
fileTask->fellow()->getIp().c_str()); | |||
} | |||
if (mDownloadFileDlg->isVisible()) | |||
@@ -200,23 +249,15 @@ void MainWindow::handleFeiqViewEvent(shared_ptr<ViewEvent> event) | |||
auto e = static_cast<FellowViewEvent*>(event.get()); | |||
auto fellow = e->fellow.get(); | |||
if (isActiveWindow()) | |||
if (isActiveWindow() && fellow == mRecvTextEdit->curFellow()) | |||
{//窗口可见,处理当前用户消息,其他用户消息则放入通知队列 | |||
if (fellow == mRecvTextEdit->curFellow()) | |||
{ | |||
readEvent(event.get()); | |||
} | |||
else | |||
{ | |||
mUnreadEvents[fellow].push_back(event); | |||
updateUnread(fellow); | |||
} | |||
readEvent(event.get()); | |||
} | |||
else | |||
{//窗口不可见,放入未读队列并通知 | |||
mUnreadEvents[fellow].push_back(event); | |||
updateUnread(fellow); | |||
notifyUnread(event.get()); | |||
auto& umsg = addUnshownMessage(fellow, event); | |||
notifyUnshown(umsg); | |||
updateUnshownHint(fellow); | |||
} | |||
} | |||
} | |||
@@ -277,31 +318,39 @@ void MainWindow::userAddFellow(QString ip) | |||
mFeiq.sendImOnLine(fellow->getIp()); | |||
} | |||
void MainWindow::notifyUnread(const ViewEvent *event) | |||
void MainWindow::notifyUnshown(UnshownMessage& umsg) | |||
{ | |||
auto event = umsg.event.get(); | |||
if (event->what == ViewEventType::SEND_TIMEO) | |||
{ | |||
auto e = static_cast<const SendTimeoEvent*>(event); | |||
auto fellow = e->fellow.get(); | |||
showNotification(fellow, "发送超时:"+simpleTextOf(e->content.get())); | |||
umsg.notifyId = showNotification(fellow, "发送超时:"+simpleTextOf(e->content.get())); | |||
} | |||
else if (event->what == ViewEventType::MESSAGE) | |||
{ | |||
auto e = static_cast<const MessageViewEvent*>(event); | |||
auto fellow = e->fellow.get(); | |||
QString text=""; | |||
bool first=false; | |||
for (auto content : e->contents) | |||
{ | |||
showNotification(fellow, simpleTextOf(content.get())); | |||
auto t = simpleTextOf(content.get()); | |||
if (first) | |||
text = t; | |||
else | |||
text = text+"\n"+t; | |||
} | |||
umsg.notifyId = showNotification(fellow, text); | |||
} | |||
} | |||
void MainWindow::showNotification(const Fellow *fellow, const QString &text) | |||
long MainWindow::showNotification(const Fellow *fellow, const QString &text) | |||
{ | |||
QString content(text); | |||
if (content.length()>20) | |||
content = content.left(20)+"..."; | |||
PlatformDepend::instance().showNotify(QString(fellow->getName().c_str())+":", content); | |||
return PlatformDepend::instance().showNotify(QString(fellow->getName().c_str())+":", content, fellow->getIp().c_str()); | |||
} | |||
void MainWindow::navigateToFileTask(IdType packetNo, IdType fileId, bool upload) | |||
@@ -462,12 +511,12 @@ void MainWindow::initFeiq() | |||
qDebug()<<"feiq started"; | |||
} | |||
void MainWindow::updateUnread(const Fellow *fellow) | |||
void MainWindow::updateUnshownHint(const Fellow *fellow) | |||
{ | |||
auto it = mUnreadEvents.find(fellow); | |||
if (it != mUnreadEvents.end()) | |||
auto it = mUnshownEvents.find(fellow); | |||
if (it != mUnshownEvents.end()) | |||
{ | |||
auto count = (*it).second.size(); | |||
auto count = it->second.size(); | |||
if (count == 0) | |||
{ | |||
mFellowList.mark(*fellow, ""); | |||
@@ -483,26 +532,30 @@ void MainWindow::updateUnread(const Fellow *fellow) | |||
int MainWindow::getUnreadCount() | |||
{ | |||
auto begin = mUnreadEvents.begin(); | |||
auto end = mUnreadEvents.end(); | |||
auto begin = mUnshownEvents.begin(); | |||
auto end = mUnshownEvents.end(); | |||
auto count = 0; | |||
for (auto it = begin; it != end; it++) | |||
{ | |||
count += it->second.size(); | |||
for (auto msg : it->second) | |||
{ | |||
if (msg.isUnread()) | |||
++count; | |||
} | |||
} | |||
return count; | |||
} | |||
void MainWindow::flushUnread(const Fellow *fellow) | |||
void MainWindow::flushUnshown(const Fellow *fellow) | |||
{ | |||
auto it = mUnreadEvents.find(fellow); | |||
if (it != mUnreadEvents.end()) | |||
auto it = mUnshownEvents.find(fellow); | |||
if (it != mUnshownEvents.end()) | |||
{ | |||
auto& list = (*it).second; | |||
while (!list.empty()) | |||
{ | |||
auto event = list.front(); | |||
readEvent(event.get()); | |||
auto msg = list.front(); | |||
readEvent(msg.event.get()); | |||
list.pop_front(); | |||
} | |||
} | |||
@@ -525,7 +578,10 @@ void MainWindow::readEvent(const ViewEvent *event) | |||
auto time = e->when.time_since_epoch().count(); | |||
for (auto content : e->contents) | |||
{ | |||
mRecvTextEdit->addFellowContent(content.get(), time); | |||
if (e->fellow == nullptr) | |||
mRecvTextEdit->addMyContent(content.get(), time); | |||
else | |||
mRecvTextEdit->addFellowContent(content.get(), time); | |||
} | |||
} | |||
} | |||
@@ -550,3 +606,27 @@ QString MainWindow::simpleTextOf(const Content *content) | |||
break; | |||
} | |||
} | |||
UnshownMessage &MainWindow::addUnshownMessage(const Fellow *fellow, shared_ptr<ViewEvent> event) | |||
{ | |||
UnshownMessage msg; | |||
msg.event = event; | |||
mUnshownEvents[fellow].push_back(msg); | |||
return mUnshownEvents[fellow].back(); | |||
} | |||
UnshownMessage* MainWindow::findUnshownMessage(int id) | |||
{ | |||
auto begin = mUnshownEvents.begin(); | |||
auto end = mUnshownEvents.end(); | |||
for (auto it = begin; it != end; it++) | |||
{ | |||
for (auto& msg : it->second){ | |||
if (msg.notifyId == id) | |||
return &msg; | |||
} | |||
} | |||
return nullptr; | |||
} |
@@ -21,6 +21,19 @@ class MainWindow; | |||
class FeiqWin; | |||
struct UnshownMessage | |||
{ | |||
shared_ptr<ViewEvent> event; | |||
bool replied = false; | |||
bool read = false; | |||
long notifyId = 0; | |||
bool isUnread() | |||
{ | |||
return !replied && !read; | |||
} | |||
}; | |||
Q_DECLARE_METATYPE(shared_ptr<ViewEvent>) | |||
class MainWindow : public QMainWindow, IFeiqView | |||
{ | |||
@@ -33,6 +46,10 @@ public: | |||
void setFeiqWin(FeiqWin* feiqWin); | |||
public slots: | |||
void onNotifyClicked(const QString& fellowIp); | |||
void onNotifyReplied(long notifyId, const QString& fellowIp, const QString& reply); | |||
protected: | |||
void enterEvent(QEvent *event); | |||
@@ -62,19 +79,22 @@ private slots: | |||
private: | |||
void userAddFellow(QString ip); | |||
void notifyUnread(const ViewEvent* event); | |||
void showNotification(const Fellow* fellow, const QString& text); | |||
long showNotification(const Fellow* fellow, const QString& text); | |||
shared_ptr<Fellow> checkCurFellow(); | |||
void showResult(pair<bool, string> ret, const Content *content); | |||
vector<const Fellow*> fellowSearchDriver(const QString& text); | |||
void initFeiq(); | |||
void updateUnread(const Fellow* fellow); | |||
int getUnreadCount(); | |||
void flushUnread(const Fellow* fellow); | |||
void readEvent(const ViewEvent* event); | |||
void setBadgeNumber(int number); | |||
QString simpleTextOf(const Content* content); | |||
UnshownMessage& addUnshownMessage(const Fellow *fellow, shared_ptr<ViewEvent> event); | |||
UnshownMessage *findUnshownMessage(int id); | |||
void notifyUnshown(UnshownMessage &umsg); | |||
void updateUnshownHint(const Fellow* fellow); | |||
int getUnreadCount(); | |||
void flushUnshown(const Fellow* fellow); | |||
// IFileTaskObserver interface | |||
public: | |||
void onStateChanged(FileTask *fileTask); | |||
@@ -95,7 +115,7 @@ private: | |||
RecvTextEdit* mRecvTextEdit; | |||
SendTextEdit* mSendTextEdit; | |||
QString mTitle; | |||
unordered_map<const Fellow*, list<shared_ptr<ViewEvent>>> mUnreadEvents; | |||
unordered_map<const Fellow*, list<UnshownMessage>> mUnshownEvents; | |||
FeiqWin* mFeiqWin = nullptr; | |||
}; | |||
@@ -2,13 +2,18 @@ | |||
#define OSXNOTIFICATION_H | |||
#include <QString> | |||
#include <QObject> | |||
class MainWindow; | |||
class Notification | |||
{ | |||
public: | |||
explicit Notification(); | |||
void show(const QString& title, const QString& content); | |||
int show(const QString& title, const QString& content, const QString &fellowIp); | |||
void hideAll(); | |||
public: | |||
void setMainWnd(MainWindow* mainWnd); | |||
}; | |||
#endif // OSXNOTIFICATION_H |
@@ -1,22 +1,46 @@ | |||
#include "notification.h" | |||
#include "notificationimpl.h" | |||
#include <QDebug> | |||
#include "../mainwindow.h" | |||
#import <cocoa/Cocoa.h> | |||
static NotificationImpl* impl = [[NotificationImpl alloc] init]; | |||
static void clickCallback(void* arg, NSString* fellowIp) | |||
{ | |||
MainWindow* mainWnd = (MainWindow*)arg; | |||
const char* ip = [fellowIp UTF8String]; | |||
mainWnd->onNotifyClicked(ip); | |||
} | |||
static void replyCallback(void* arg, long notifyId, NSString* fellowIp, NSString* str) | |||
{ | |||
const char* reply = [str UTF8String]; | |||
const char* ip = [fellowIp UTF8String]; | |||
MainWindow* mainWnd = (MainWindow*)arg; | |||
mainWnd->onNotifyReplied(notifyId, ip, reply); | |||
} | |||
Notification::Notification() | |||
{ | |||
} | |||
void Notification::show(const QString &title, const QString &content) | |||
int Notification::show(const QString &title, const QString &content, const QString& fellowIp) | |||
{ | |||
NSUserNotification *userNotification = [[[NSUserNotification alloc] init] autorelease]; | |||
userNotification.title = title.toNSString(); | |||
userNotification.informativeText = content.toNSString(); | |||
NSUserNotificationCenter* center = [NSUserNotificationCenter defaultUserNotificationCenter]; | |||
[center deliverNotification:userNotification]; | |||
NSString* objcTitle = title.toNSString(); | |||
NSString* objcMessage = content.toNSString(); | |||
return [impl show: objcTitle message: objcMessage extra: fellowIp.toNSString()]; | |||
} | |||
void Notification::hideAll() | |||
{ | |||
[[NSUserNotificationCenter defaultUserNotificationCenter] removeAllDeliveredNotifications]; | |||
[impl hideAll]; | |||
} | |||
void Notification::setMainWnd(MainWindow *mainWnd) | |||
{ | |||
impl->clickCallback = clickCallback; | |||
impl->replyCallback = replyCallback; | |||
impl->callbackArg = mainWnd; | |||
} |
@@ -0,0 +1,32 @@ | |||
#ifndef NOTIFICATIONIMPL_H | |||
#define NOTIFICATIONIMPL_H | |||
#ifdef __cplusplus | |||
extern "C"{ | |||
#endif | |||
#import <Foundation/Foundation.h> | |||
typedef void(*ClickCallback)(void*, NSString*); | |||
typedef void(*ReplyCallback)(void*, long, NSString*, NSString*); | |||
@interface NotificationImpl : NSObject | |||
{ | |||
@public | |||
ClickCallback clickCallback; | |||
ReplyCallback replyCallback; | |||
void* callbackArg; | |||
@private | |||
int id; | |||
} | |||
-(instancetype)init; | |||
-(long)show: (NSString*)title message:(NSString*)msg extra:(NSString*)who; | |||
-(void)hideAll; | |||
@end | |||
#ifdef __cplusplus | |||
} | |||
#endif | |||
#endif // NOTIFICATIONIMPL_H |
@@ -0,0 +1,61 @@ | |||
#include "notificationimpl.h" | |||
#include <QDebug> | |||
@interface NotificationImpl () <NSUserNotificationCenterDelegate> | |||
@end | |||
@implementation NotificationImpl | |||
-(instancetype)init | |||
{ | |||
self = [super init]; | |||
if(self) | |||
{ | |||
id=0; | |||
[[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self]; | |||
} | |||
return self; | |||
} | |||
-(long)show:(NSString*)title message:(NSString*)msg extra:(NSString*)who | |||
{ | |||
NSUserNotification* notification = [[NSUserNotification alloc] init]; | |||
notification.title = title; | |||
if (who != nil && who.length > 0) | |||
{ | |||
notification.userInfo=@{@"extra":who}; | |||
notification.hasReplyButton = true; | |||
} | |||
int myid = ++id; | |||
notification.identifier = [NSString stringWithFormat:@"%d",myid]; | |||
notification.informativeText = msg; | |||
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification: notification]; | |||
return (long)myid; | |||
} | |||
-(void)hideAll | |||
{ | |||
[[NSUserNotificationCenter defaultUserNotificationCenter] removeAllDeliveredNotifications]; | |||
} | |||
-(BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresent:(NSUserNotification *)notification | |||
{ | |||
return YES; | |||
} | |||
-(void)userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification | |||
{ | |||
NSString* who = [notification.userInfo objectForKey:@"extra"]; | |||
int myid = notification.identifier.intValue; | |||
if (notification.activationType == NSUserNotificationActivationTypeContentsClicked){ | |||
clickCallback(callbackArg, who); | |||
} | |||
else if (notification.activationType == NSUserNotificationActivationTypeReplied){ | |||
replyCallback(callbackArg, myid, who, notification.response.string); | |||
} | |||
} | |||
@end |
@@ -6,9 +6,9 @@ OsxPlatform::OsxPlatform() | |||
} | |||
void OsxPlatform::showNotify(const QString &title, const QString &content) | |||
long OsxPlatform::showNotify(const QString &title, const QString &content, const QString & fellowIp) | |||
{ | |||
mNotify.show(title, content); | |||
return mNotify.show(title, content, fellowIp); | |||
} | |||
void OsxPlatform::hideAllNotify() | |||
@@ -23,3 +23,9 @@ void OsxPlatform::setBadgeNumber(int number) | |||
else | |||
QtMac::setBadgeLabelText(QString::number(number)); | |||
} | |||
void OsxPlatform::setMainWnd(MainWindow *mainWnd) | |||
{ | |||
IPlatform::setMainWnd(mainWnd); | |||
mNotify.setMainWnd(mainWnd); | |||
} |
@@ -10,11 +10,12 @@ public: | |||
OsxPlatform(); | |||
public: | |||
void showNotify(const QString& title, const QString& content) override; | |||
long showNotify(const QString& title, const QString& content, const QString &fellowIp) override; | |||
void hideAllNotify() override; | |||
void setBadgeNumber(int number) override; | |||
void setMainWnd(MainWindow *mainWnd) override; | |||
private: | |||
Notification mNotify; | |||
}; | |||
@@ -7,10 +7,12 @@ | |||
class MockPlatform : public IPlatform | |||
{ | |||
public: | |||
void showNotify(const QString& title, const QString& content) | |||
long showNotify(const QString& title, const QString& content, const QString& data) | |||
{ | |||
(void)title; | |||
(void)content; | |||
(void)data; | |||
return 0; | |||
} | |||
void hideAllNotify() | |||
{ | |||
@@ -43,9 +45,9 @@ PlatformDepend &PlatformDepend::instance() | |||
return me; | |||
} | |||
void PlatformDepend::showNotify(const QString &title, const QString &content) | |||
long PlatformDepend::showNotify(const QString &title, const QString &content, const QString &fellowIp) | |||
{ | |||
mImpl->showNotify(title, content); | |||
return mImpl->showNotify(title, content, fellowIp); | |||
} | |||
void PlatformDepend::hideAllNotify() | |||
@@ -57,3 +59,9 @@ void PlatformDepend::setBadgeNumber(int number) | |||
{ | |||
mImpl->setBadgeNumber(number); | |||
} | |||
void PlatformDepend::setMainWnd(MainWindow *mainWnd) | |||
{ | |||
IPlatform::setMainWnd(mainWnd); | |||
mImpl->setMainWnd(mainWnd); | |||
} |
@@ -2,15 +2,22 @@ | |||
#define PLATFORMDEPEND_H | |||
#include <QString> | |||
class MainWindow; | |||
class IPlatform | |||
{ | |||
public: | |||
virtual ~IPlatform(){} | |||
virtual void showNotify(const QString& title, const QString& content) = 0; | |||
virtual long showNotify(const QString& title, const QString& content, const QString & fellowIp) = 0; | |||
virtual void hideAllNotify() = 0; | |||
virtual void setBadgeNumber(int number) = 0; | |||
virtual void setMainWnd(MainWindow* mainWnd) | |||
{ | |||
Q_UNUSED(mainWnd); | |||
} | |||
}; | |||
class PlatformDepend : public IPlatform | |||
@@ -23,11 +30,12 @@ public: | |||
static PlatformDepend& instance(); | |||
public: | |||
void showNotify(const QString& title, const QString& content) override; | |||
long showNotify(const QString& title, const QString& content, const QString & fellowIp) override; | |||
void hideAllNotify() override; | |||
void setBadgeNumber(int number) override; | |||
void setMainWnd(MainWindow* mainWnd) override; | |||
private: | |||
IPlatform* mImpl; | |||
}; | |||
@@ -1,39 +0,0 @@ | |||
#include "unreadchecker.h" | |||
#include <QTimerEvent> | |||
#include "platformdepend.h" | |||
#define PLUGIN_NAME "unread_checker" | |||
REGISTER_PLUGIN(PLUGIN_NAME, UnreadChecker) | |||
UnreadChecker::UnreadChecker() | |||
{ | |||
} | |||
void UnreadChecker::timerEvent(QTimerEvent *event) | |||
{ | |||
if (event->timerId() == mUnreadTimerId) | |||
{ | |||
auto count = mFeiq->getUnreadCount(); | |||
if (count > 0) | |||
{ | |||
PlatformDepend::instance().hideAllNotify(); | |||
PlatformDepend::instance().showNotify("未读提醒", QString("还有%1条未读消息").arg(count)); | |||
} | |||
} | |||
} | |||
void UnreadChecker::init() | |||
{ | |||
IPlugin::init(); | |||
auto settings = mFeiq->settings(); | |||
mUnreadTimerInterval = settings->value(PLUGIN_NAME"/timer", "600").toInt(); | |||
if (mUnreadTimerInterval > 0) | |||
mUnreadTimerId = startTimer(mUnreadTimerInterval*1000, Qt::VeryCoarseTimer); | |||
} | |||
void UnreadChecker::unInit() | |||
{ | |||
if (mUnreadTimerId > 0) | |||
killTimer(mUnreadTimerId); | |||
} |
@@ -1,25 +0,0 @@ | |||
#ifndef UNREADCHECKER_H | |||
#define UNREADCHECKER_H | |||
#include "iplugin.h" | |||
#include <QObject> | |||
class UnreadChecker : public QObject, public IPlugin | |||
{ | |||
Q_OBJECT | |||
public: | |||
UnreadChecker(); | |||
void init() override; | |||
void unInit() override; | |||
protected: | |||
void timerEvent(QTimerEvent *event) override; | |||
private: | |||
int mUnreadTimerInterval; | |||
int mUnreadTimerId=-1; | |||
int mLastCheckCount=0; | |||
}; | |||
#endif // UNREADCHECKER_H |