blob: 5319f37986054093b368738d69cc5ef83fe54832 [file] [log] [blame]
Zhenkai Zhu6d589aa2012-05-29 17:34:35 -07001#ifndef CHATDIALOG_H
2#define CHATDIALOG_H
Zhenkai Zhub45e38a2012-06-01 15:44:36 -07003#include <boost/function.hpp>
Zhenkai Zhu9036e032012-09-27 20:59:33 -07004#include <boost/thread/recursive_mutex.hpp>
Zhenkai Zhub45e38a2012-06-01 15:44:36 -07005#include <vector>
6#include "digesttreescene.h"
Zhenkai Zhu6d589aa2012-05-29 17:34:35 -07007#include "ui_chatdialog.h"
Zhenkai Zhu5a8d5aa2012-05-30 21:25:23 -07008#include "chatbuf.pb.h"
Zhenkai Zhu90ee76c2012-06-01 16:00:25 -07009#include <sync-app-socket.h>
Zhenkai Zhu85845d22012-06-01 23:10:43 -070010#include <sync-logic.h>
11#include <sync-seq-no.h>
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -070012#include <QSystemTrayIcon>
Zhenkai Zhu6c4fc112012-10-07 17:07:43 -070013#include <QQueue>
Zhenkai Zhu6d589aa2012-05-29 17:34:35 -070014
Zhenkai Zhu7e9b06d2012-06-02 00:44:42 -070015#define ORGANIZATION "IRL@UCLA"
Zhenkai Zhu0b3fa332012-09-27 21:58:43 -070016#define APPLICATION "CHRONOS"
Zhenkai Zhu6c4fc112012-10-07 17:07:43 -070017#define MAX_HISTORY_ENTRY 20
Zhenkai Zhu7e9b06d2012-06-02 00:44:42 -070018
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -070019class QAction;
20class QMenu;
Zhenkai Zhu6082ede2012-09-27 17:28:46 -070021class QStringListModel;
Zhenkai Zhu560ef1b2012-09-28 14:23:33 -070022class QTextTable;
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -070023
Zhenkai Zhu6d589aa2012-05-29 17:34:35 -070024class ChatDialog : public QDialog, private Ui::ChatDialog
25{
26 Q_OBJECT
27
28public:
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -070029 ChatDialog(QWidget *parent = 0);
Zhenkai Zhu82a62752012-06-04 17:11:04 -070030 ~ChatDialog();
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -070031 void setVisible(bool visible);
Zhenkai Zhu64f9ede2012-06-05 11:32:00 -070032 void appendMessage(const SyncDemo::ChatMessage msg);
33 void processTreeUpdateWrapper(const std::vector<Sync::MissingDataInfo>, Sync::SyncAppSocket *);
34 void processDataWrapper(std::string, const char *buf, size_t len);
Zhenkai Zhubb198112012-09-27 11:31:42 -070035 void processDataNoShowWrapper(std::string, const char *buf, size_t len);
Zhenkai Zhu2425b6a2012-09-26 17:11:44 -070036 void processRemoveWrapper(std::string);
Zhenkai Zhu6c4fc112012-10-07 17:07:43 -070037 void respondHistoryRequest(std::string interest);
Zhenkai Zhub45e38a2012-06-01 15:44:36 -070038
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -070039protected:
40 void closeEvent(QCloseEvent *e);
41 void changeEvent(QEvent *e);
42
Zhenkai Zhu10ccb5a2012-06-04 21:55:14 -070043public slots:
Zhenkai Zhu64f9ede2012-06-05 11:32:00 -070044 void processTreeUpdate(const std::vector<Sync::MissingDataInfo>);
Zhenkai Zhubb198112012-09-27 11:31:42 -070045 void processData(QString name, const char *buf, size_t len, bool show);
Zhenkai Zhu2425b6a2012-09-26 17:11:44 -070046 void processRemove(QString);
Zhenkai Zhu10ccb5a2012-06-04 21:55:14 -070047
Zhenkai Zhub45e38a2012-06-01 15:44:36 -070048private:
Zhenkai Zhu6c4fc112012-10-07 17:07:43 -070049 void fetchHistory(std::string name);
Zhenkai Zhu59245aa2012-09-26 16:07:04 -070050 QString getRandomString();
Zhenkai Zhub45e38a2012-06-01 15:44:36 -070051 void formChatMessage(const QString &text, SyncDemo::ChatMessage &msg);
Zhenkai Zhub5b78462012-09-28 14:10:37 -070052 void formControlMessage(SyncDemo::ChatMessage &msg, SyncDemo::ChatMessage::ChatMessageType type);
Zhenkai Zhu2425b6a2012-09-26 17:11:44 -070053 void sendMsg(SyncDemo::ChatMessage &msg);
Zhenkai Zhu82a62752012-06-04 17:11:04 -070054 bool readSettings();
Zhenkai Zhu7e9b06d2012-06-02 00:44:42 -070055 void writeSettings();
56 void updateLabels();
Zhenkai Zhud13acd02012-06-04 15:25:20 -070057 void resizeEvent(QResizeEvent *);
58 void showEvent(QShowEvent *);
59 void fitView();
Zhenkai Zhu21d75f92012-06-04 21:23:34 -070060 void testDraw();
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -070061 void createTrayIcon();
62 void createActions();
Zhenkai Zhu560ef1b2012-09-28 14:23:33 -070063 QString formatTime(time_t);
64 void printTimeInCell(QTextTable *, time_t);
Zhenkai Zhu0e7a9b22012-10-05 17:55:17 -070065 void disableTreeDisplay();
Zhenkai Zhu6bda0bd2012-10-06 23:50:39 -070066 QString getLocalPrefix();
Zhenkai Zhu5a8d5aa2012-05-30 21:25:23 -070067
68private slots:
69 void returnPressed();
Zhenkai Zhu85845d22012-06-01 23:10:43 -070070 void buttonPressed();
Zhenkai Zhub60b7e12012-09-28 11:34:21 -070071 void treeButtonPressed();
Zhenkai Zhue837f792012-06-05 20:47:54 -070072 void checkSetting();
Zhenkai Zhu7e9b06d2012-06-02 00:44:42 -070073 void settingUpdated(QString, QString, QString);
Zhenkai Zhu3e26bb42012-09-27 11:04:09 -070074 void sendHello();
Zhenkai Zhu25e33e52012-09-28 13:00:07 -070075 void sendJoin();
Zhenkai Zhucf024442012-10-05 10:33:08 -070076 void sendLeave();
Zhenkai Zhu86df7412012-09-27 16:30:20 -070077 void replot();
Zhenkai Zhu25e33e52012-09-28 13:00:07 -070078 void updateRosterList(QStringList);
Zhenkai Zhu0e7a9b22012-10-05 17:55:17 -070079 void enableTreeDisplay();
Zhenkai Zhu5a8d5aa2012-05-30 21:25:23 -070080
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -070081 // icon related
82 void iconActivated(QSystemTrayIcon::ActivationReason reason);
83 void showMessage(QString, QString);
84 void messageClicked();
85
Zhenkai Zhu10ccb5a2012-06-04 21:55:14 -070086signals:
Zhenkai Zhubb198112012-09-27 11:31:42 -070087 void dataReceived(QString name, const char *buf, size_t len, bool show);
Zhenkai Zhu64f9ede2012-06-05 11:32:00 -070088 void treeUpdated(const std::vector<Sync::MissingDataInfo>);
Zhenkai Zhu2425b6a2012-09-26 17:11:44 -070089 void removeReceived(QString prefix);
Zhenkai Zhu10ccb5a2012-06-04 21:55:14 -070090
Zhenkai Zhu5a8d5aa2012-05-30 21:25:23 -070091private:
Zhenkai Zhu71b42cb2012-06-04 09:42:53 -070092 User m_user;
Zhenkai Zhub45e38a2012-06-01 15:44:36 -070093 Sync::SyncAppSocket *m_sock;
Zhenkai Zhu82a62752012-06-04 17:11:04 -070094 uint32_t m_session;
95 DigestTreeScene *m_scene;
Zhenkai Zhu9036e032012-09-27 20:59:33 -070096 boost::recursive_mutex m_msgMutex;
97 boost::recursive_mutex m_sceneMutex;
Zhenkai Zhu3e26bb42012-09-27 11:04:09 -070098 time_t m_lastMsgTime;
Zhenkai Zhuee5c90f2012-09-27 14:05:41 -070099 int m_randomizedInterval;
Zhenkai Zhu86df7412012-09-27 16:30:20 -0700100 QTimer *m_timer;
Zhenkai Zhu6082ede2012-09-27 17:28:46 -0700101 QStringListModel *m_rosterModel;
Zhenkai Zhu3974a492012-09-28 14:39:45 -0700102 bool m_minimaniho;
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -0700103
Zhenkai Zhu6c4fc112012-10-07 17:07:43 -0700104 QQueue<SyncDemo::ChatMessage> m_history;
105 bool m_historyInitialized;
106
Zhenkai Zhu3a008fc2012-06-08 17:36:39 -0700107 // icon related
108 QAction *minimizeAction;
109 QAction *maximizeAction;
110 QAction *restoreAction;
111 QAction *quitAction;
112 QSystemTrayIcon *trayIcon;
113 QMenu *trayIconMenu;
Zhenkai Zhu6d589aa2012-05-29 17:34:35 -0700114};
115#endif