| @@ -54,7 +54,9 @@ SOURCES += main.cpp\ | |||||
| chooseemojidlg.cpp \ | chooseemojidlg.cpp \ | ||||
| platformdepend.cpp \ | platformdepend.cpp \ | ||||
| chooseemojiwidget.cpp \ | chooseemojiwidget.cpp \ | ||||
| sendtextedit.cpp | |||||
| sendtextedit.cpp \ | |||||
| feiqwin.cpp \ | |||||
| plugin/unreadchecker.cpp | |||||
| HEADERS += mainwindow.h \ | HEADERS += mainwindow.h \ | ||||
| @@ -88,7 +90,10 @@ HEADERS += mainwindow.h \ | |||||
| chooseemojidlg.h \ | chooseemojidlg.h \ | ||||
| platformdepend.h \ | platformdepend.h \ | ||||
| chooseemojiwidget.h \ | chooseemojiwidget.h \ | ||||
| sendtextedit.h | |||||
| sendtextedit.h \ | |||||
| plugin/iplugin.h \ | |||||
| feiqwin.h \ | |||||
| plugin/unreadchecker.h | |||||
| FORMS += mainwindow.ui \ | FORMS += mainwindow.ui \ | ||||
| searchfellowdlg.ui \ | searchfellowdlg.ui \ | ||||
| @@ -0,0 +1,65 @@ | |||||
| #include "feiqwin.h" | |||||
| #include "mainwindow.h" | |||||
| #include "plugin/iplugin.h" | |||||
| #include "plugin/unreadchecker.h" | |||||
| FeiqWin::FeiqWin() | |||||
| { | |||||
| } | |||||
| RecvTextEdit *FeiqWin::recvTextEdit() | |||||
| { | |||||
| return mMainWin->mRecvTextEdit; | |||||
| } | |||||
| SendTextEdit *FeiqWin::sendTextEdit() | |||||
| { | |||||
| return mMainWin->mSendTextEdit; | |||||
| } | |||||
| FellowListWidget *FeiqWin::fellowListWidget() | |||||
| { | |||||
| return &(mMainWin->mFellowList); | |||||
| } | |||||
| const FeiqModel *FeiqWin::feiqModel() | |||||
| { | |||||
| return &(mMainWin->mFeiq.getModel()); | |||||
| } | |||||
| QSettings *FeiqWin::settings() | |||||
| { | |||||
| return mMainWin->mSettings; | |||||
| } | |||||
| int FeiqWin::getUnreadCount() | |||||
| { | |||||
| return mMainWin->getUnreadCount(); | |||||
| } | |||||
| void FeiqWin::init(MainWindow *mainWin) | |||||
| { | |||||
| mMainWin = mainWin; | |||||
| loadPlugins(); | |||||
| for (auto plugin : mPlugins) | |||||
| plugin->init(this); | |||||
| } | |||||
| void FeiqWin::unInit() | |||||
| { | |||||
| for (auto plugin : mPlugins) | |||||
| { | |||||
| plugin->unInit(); | |||||
| delete plugin; | |||||
| } | |||||
| mPlugins.clear(); | |||||
| } | |||||
| void FeiqWin::loadPlugins() | |||||
| { | |||||
| mPlugins.append(new UnreadChecker()); | |||||
| } | |||||
| @@ -0,0 +1,43 @@ | |||||
| #ifndef FEIQWIN_H | |||||
| #define FEIQWIN_H | |||||
| #include "recvtextedit.h" | |||||
| #include "sendtextedit.h" | |||||
| #include "qsettings.h" | |||||
| #include "fellowlistwidget.h" | |||||
| #include "feiqlib/feiqmodel.h" | |||||
| class MainWindow; | |||||
| class IPlugin; | |||||
| /** | |||||
| * @brief The FeiqWin class | |||||
| * 其实就是MainWindow的代言人,用来隔离插件和MainWindow,方便控制MainWindow对插件的可见性 | |||||
| */ | |||||
| class FeiqWin | |||||
| { | |||||
| public: | |||||
| FeiqWin(); | |||||
| public: | |||||
| RecvTextEdit* recvTextEdit(); | |||||
| SendTextEdit* sendTextEdit(); | |||||
| FellowListWidget* fellowListWidget(); | |||||
| const FeiqModel* feiqModel(); | |||||
| QSettings* settings(); | |||||
| public: | |||||
| int getUnreadCount(); | |||||
| private: | |||||
| void init(MainWindow* mainWin); | |||||
| void unInit(); | |||||
| void loadPlugins(); | |||||
| private: | |||||
| friend class MainWindow; | |||||
| MainWindow* mMainWin; | |||||
| QList<IPlugin*> mPlugins; | |||||
| }; | |||||
| #endif // FEIQWIN_H | |||||
| @@ -1,21 +1,16 @@ | |||||
| #include "mainwindow.h" | #include "mainwindow.h" | ||||
| #include <QApplication> | #include <QApplication> | ||||
| #include <QWindow> | |||||
| #include "feiqwin.h" | |||||
| //待测: | |||||
| //*无当前交谈用户,且有未读消息时,未读消息能否正确置顶? | |||||
| //应用图标 | |||||
| int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||||
| { | { | ||||
| QApplication a(argc, argv); | QApplication a(argc, argv); | ||||
| a.setWindowIcon(QIcon(":/default/res/icon.png")); | a.setWindowIcon(QIcon(":/default/res/icon.png")); | ||||
| MainWindow w; | MainWindow w; | ||||
| FeiqWin feiqWin; | |||||
| w.setFeiqWin(&feiqWin); | |||||
| w.show(); | w.show(); | ||||
| return a.exec(); | return a.exec(); | ||||
| } | } | ||||
| //表情->html | |||||
| //查通讯录功能 | |||||
| //查ip占用功能 | |||||
| //美化用户列表 | |||||
| @@ -11,6 +11,7 @@ | |||||
| #include "addfellowdialog.h" | #include "addfellowdialog.h" | ||||
| #include <QProcess> | #include <QProcess> | ||||
| #include "platformdepend.h" | #include "platformdepend.h" | ||||
| #include "feiqwin.h" | |||||
| MainWindow::MainWindow(QWidget *parent) : | MainWindow::MainWindow(QWidget *parent) : | ||||
| QMainWindow(parent), | QMainWindow(parent), | ||||
| @@ -68,10 +69,6 @@ MainWindow::MainWindow(QWidget *parent) : | |||||
| mTitle = mSettings->value("app/title", "mac飞秋").toString(); | mTitle = mSettings->value("app/title", "mac飞秋").toString(); | ||||
| setWindowTitle(mTitle); | setWindowTitle(mTitle); | ||||
| mUnreadTimerInterval = mSettings->value("app/unread_timer", "0").toInt(); | |||||
| if (mUnreadTimerInterval > 0) | |||||
| mUnreadTimerId = startTimer(mUnreadTimerInterval*1000, Qt::VeryCoarseTimer); | |||||
| //初始化飞秋引擎 | //初始化飞秋引擎 | ||||
| connect(this, SIGNAL(feiqViewEvent(shared_ptr<ViewEvent>)), this, SLOT(handleFeiqViewEvent(shared_ptr<ViewEvent>))); | connect(this, SIGNAL(feiqViewEvent(shared_ptr<ViewEvent>)), this, SLOT(handleFeiqViewEvent(shared_ptr<ViewEvent>))); | ||||
| @@ -90,6 +87,12 @@ MainWindow::~MainWindow() | |||||
| delete ui; | delete ui; | ||||
| } | } | ||||
| void MainWindow::setFeiqWin(FeiqWin *feiqWin) | |||||
| { | |||||
| mFeiqWin = feiqWin; | |||||
| mFeiqWin->init(this); | |||||
| } | |||||
| void MainWindow::enterEvent(QEvent *event) | void MainWindow::enterEvent(QEvent *event) | ||||
| { | { | ||||
| auto fellow = mRecvTextEdit->curFellow(); | auto fellow = mRecvTextEdit->curFellow(); | ||||
| @@ -102,16 +105,6 @@ void MainWindow::enterEvent(QEvent *event) | |||||
| PlatformDepend::instance().hideAllNotify(); | PlatformDepend::instance().hideAllNotify(); | ||||
| } | } | ||||
| void MainWindow::timerEvent(QTimerEvent *event) | |||||
| { | |||||
| if (event->timerId() == mUnreadTimerId) | |||||
| { | |||||
| auto count = getUnreadCount(); | |||||
| if (count > 0) | |||||
| PlatformDepend::instance().showNotify("未读提醒", QString("还有%1条未读消息").arg(count)); | |||||
| } | |||||
| } | |||||
| void MainWindow::openChartTo(const Fellow *fellow) | void MainWindow::openChartTo(const Fellow *fellow) | ||||
| { | { | ||||
| mFellowList.top(*fellow); | mFellowList.top(*fellow); | ||||
| @@ -19,18 +19,22 @@ namespace Ui { | |||||
| class MainWindow; | class MainWindow; | ||||
| } | } | ||||
| class FeiqWin; | |||||
| Q_DECLARE_METATYPE(shared_ptr<ViewEvent>) | Q_DECLARE_METATYPE(shared_ptr<ViewEvent>) | ||||
| class MainWindow : public QMainWindow, IFeiqView | class MainWindow : public QMainWindow, IFeiqView | ||||
| { | { | ||||
| Q_OBJECT | Q_OBJECT | ||||
| friend class FeiqWin; | |||||
| public: | public: | ||||
| explicit MainWindow(QWidget *parent = 0); | explicit MainWindow(QWidget *parent = 0); | ||||
| ~MainWindow(); | ~MainWindow(); | ||||
| void setFeiqWin(FeiqWin* feiqWin); | |||||
| protected: | protected: | ||||
| void enterEvent(QEvent *event); | void enterEvent(QEvent *event); | ||||
| void timerEvent(QTimerEvent *event); | |||||
| signals: | signals: | ||||
| void showErrorAndQuit(const QString& text); | void showErrorAndQuit(const QString& text); | ||||
| @@ -92,9 +96,7 @@ private: | |||||
| SendTextEdit* mSendTextEdit; | SendTextEdit* mSendTextEdit; | ||||
| QString mTitle; | QString mTitle; | ||||
| unordered_map<const Fellow*, list<shared_ptr<ViewEvent>>> mUnreadEvents; | unordered_map<const Fellow*, list<shared_ptr<ViewEvent>>> mUnreadEvents; | ||||
| int mUnreadTimerInterval; | |||||
| int mUnreadTimerId; | |||||
| FeiqWin* mFeiqWin = nullptr; | |||||
| }; | }; | ||||
| #endif // MAINWINDOW_H | #endif // MAINWINDOW_H | ||||
| @@ -0,0 +1,21 @@ | |||||
| #ifndef IPLUGIN_H | |||||
| #define IPLUGIN_H | |||||
| #include "../feiqwin.h" | |||||
| class IPlugin | |||||
| { | |||||
| public: | |||||
| virtual ~IPlugin(){} | |||||
| virtual void init(FeiqWin* feiqWin) | |||||
| { | |||||
| mFeiq = feiqWin; | |||||
| } | |||||
| virtual void unInit() = 0; | |||||
| protected: | |||||
| FeiqWin* mFeiq; | |||||
| }; | |||||
| #endif // IPLUGIN_H | |||||
| @@ -0,0 +1,34 @@ | |||||
| #include "unreadchecker.h" | |||||
| #include <QTimerEvent> | |||||
| #include "platformdepend.h" | |||||
| UnreadChecker::UnreadChecker() | |||||
| { | |||||
| } | |||||
| void UnreadChecker::timerEvent(QTimerEvent *event) | |||||
| { | |||||
| if (event->timerId() == mUnreadTimerId) | |||||
| { | |||||
| auto count = mFeiq->getUnreadCount(); | |||||
| if (count > 0) | |||||
| PlatformDepend::instance().showNotify("未读提醒", QString("还有%1条未读消息").arg(count)); | |||||
| } | |||||
| } | |||||
| void UnreadChecker::init(FeiqWin *feiqWin) | |||||
| { | |||||
| IPlugin::init(feiqWin); | |||||
| auto settings = mFeiq->settings(); | |||||
| mUnreadTimerInterval = settings->value("app/unread_timer", "0").toInt(); | |||||
| if (mUnreadTimerInterval > 0) | |||||
| mUnreadTimerId = startTimer(mUnreadTimerInterval*1000, Qt::VeryCoarseTimer); | |||||
| } | |||||
| void UnreadChecker::unInit() | |||||
| { | |||||
| if (mUnreadTimerId > 0) | |||||
| killTimer(mUnreadTimerId); | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| #ifndef UNREADCHECKER_H | |||||
| #define UNREADCHECKER_H | |||||
| #include "iplugin.h" | |||||
| #include <QObject> | |||||
| class UnreadChecker : public QObject, public IPlugin | |||||
| { | |||||
| Q_OBJECT | |||||
| public: | |||||
| UnreadChecker(); | |||||
| void init(FeiqWin* feiqWin) override; | |||||
| void unInit() override; | |||||
| protected: | |||||
| void timerEvent(QTimerEvent *event) override; | |||||
| private: | |||||
| int mUnreadTimerInterval; | |||||
| int mUnreadTimerId=-1; | |||||
| }; | |||||
| #endif // UNREADCHECKER_H | |||||