mainwindow.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QDebug>
  4. #include <QItemSelectionModel>
  5. #include <QLabel>
  6. #include <QMainWindow>
  7. #include <QSortFilterProxyModel>
  8. #include <QSystemTrayIcon>
  9. #include <QTableWidget>
  10. #include <QTextEdit>
  11. #include <QTimer>
  12. #include <QTimerEvent>
  13. #include <QAction>
  14. #include <QSystemTrayIcon>
  15. #include <QAtomicInteger>
  16. #include "RvcSettings.h"
  17. #include "QRvcItemModel.hpp"
  18. #include "QtMessageInfo.h"
  19. #include "sysinfowidget.h"
  20. #include "cpuwidget.h"
  21. #include "performwidget.h"
  22. #include "memorywidget.h"
  23. #include "OperaThread.hpp"
  24. #include "mlabel.h"
  25. #include "floatwidget/widget.h"
  26. #define APP_EXIT_CODE_QUIT 0
  27. #define APP_EXIT_CODE_RESTART_CURR 1
  28. #define APP_EXIT_CODE_RESTART_ACTIVE 2
  29. QT_BEGIN_NAMESPACE
  30. namespace Ui { class MainWindow; }
  31. QT_END_NAMESPACE
  32. class MainWindow;
  33. class RichTimer : public QObject
  34. {
  35. Q_OBJECT
  36. public:
  37. explicit RichTimer(MainWindow *parent, QString entityName)
  38. :QObject((QObject*)parent)
  39. ,mWin(parent)
  40. ,mEntityName(entityName)
  41. ,mTimes(0)
  42. {
  43. mTimerID = startTimer(300);
  44. }
  45. virtual void timerEvent(QTimerEvent *event)
  46. {
  47. if(event->timerId() == mTimerID){
  48. HandleTimeout(mTimes == 7);
  49. }
  50. }
  51. private:
  52. void HandleTimeout(bool toStop);
  53. int mTimerID;
  54. MainWindow* mWin;
  55. QString mEntityName;
  56. int mTimes;
  57. };
  58. class EntityStateRecoverTimer : public QObject
  59. {
  60. Q_OBJECT
  61. public:
  62. explicit EntityStateRecoverTimer(MainWindow *parent, QString entityName, EntityState restoreState)
  63. :QObject((QObject*)parent)
  64. ,mWin(parent)
  65. ,mEntityName(entityName)
  66. ,mState(restoreState)
  67. ,mTimes(0)
  68. {
  69. mTimerID = startTimer(10000);
  70. }
  71. virtual void timerEvent( QTimerEvent *event)
  72. {
  73. if(event->timerId() == mTimerID) {
  74. HandleTimeout();
  75. }
  76. }
  77. private:
  78. void HandleTimeout();
  79. int mTimerID;
  80. MainWindow* mWin;
  81. QString mEntityName;
  82. EntityState mState;
  83. int mTimes;
  84. };
  85. class TimeDateTimer : public QObject
  86. {
  87. Q_OBJECT
  88. public:
  89. explicit TimeDateTimer(QObject *parent = 0)
  90. :QObject(parent)
  91. ,mWin(reinterpret_cast<MainWindow*>(parent))
  92. ,mDays(0),mHours(0),mMinutes(0),mSeconds(0){
  93. mTimer = new QTimer(this);
  94. }
  95. ~TimeDateTimer(){Stop();}
  96. void Start(int interval);
  97. void Stop();
  98. private slots:
  99. void HandleTimeout();
  100. private:
  101. QString GetCurrentRunTimeString()
  102. {
  103. QString result;
  104. if(mDays == 0)
  105. result = QString(QStringLiteral("elapsed: %1:%2:%3")).arg(mHours,2,10,QLatin1Char('0'))
  106. .arg(mMinutes,2,10,QLatin1Char('0'))
  107. .arg(mSeconds,2,10,QLatin1Char('0'));
  108. else
  109. result = QString(QStringLiteral("elapsed: %1 day - %2:%3:%4")).arg(mDays,2,10,QLatin1Char('0'))
  110. .arg(mHours,2,10,QLatin1Char('0'))
  111. .arg(mMinutes,2,10,QLatin1Char('0'))
  112. .arg(mSeconds,2,10,QLatin1Char('0'));
  113. return result;
  114. }
  115. MainWindow* mWin;
  116. int mDays;
  117. int mHours;
  118. int mMinutes;
  119. int mSeconds;
  120. QTimer *mTimer;
  121. };
  122. enum ExecuteType {
  123. CreatesSubProcess = 0,
  124. BootEntity,
  125. RunShellScript
  126. };
  127. class RvcAdditionAction : public QAction
  128. {
  129. public:
  130. explicit RvcAdditionAction(QObject *parent = nullptr)
  131. :QAction(parent) {}
  132. explicit RvcAdditionAction(const QString &text, QObject *parent = nullptr)
  133. :QAction(text, parent) {}
  134. explicit RvcAdditionAction(const QIcon &icon, const QString &text, QObject *parent = nullptr)
  135. :QAction(icon, text, parent) {}
  136. struct AdditionMenuInfo {
  137. ExecuteType type;
  138. QString cmdLine;
  139. QString entityName;
  140. } userData;
  141. };
  142. class MainWindow : public QMainWindow
  143. {
  144. Q_OBJECT
  145. public:
  146. MainWindow(QWidget *parent = nullptr);
  147. MainWindow(QString systemInfo, int totalEntityCount, QWidget *parent = nullptr);
  148. ~MainWindow();
  149. bool CanDisturb() const;
  150. protected:
  151. void closeEvent(QCloseEvent *event) override;
  152. private:
  153. void Init(QString title);
  154. void Test_EntityList();
  155. void Test_EventLog();
  156. void InitMenuAction();
  157. void InitStatusBar();
  158. void InitEntitiesView();
  159. void AddEntityEntry(const EntityInfo& entityInst);
  160. void InitSystemTrayIcon();
  161. int TriggerEntityState(QString entityName, EntityState state, int pid = 0, bool flicker = true);
  162. int TriggerEntityState(QTableWidgetItem* item, EntityState state, int pid = 0, bool flicker = true);
  163. void TriggerEntityState(int row, EntityState state, int pid, bool flicker = true);
  164. int FindEntityRowIndex(QString entityName);
  165. void ShowStatusMessage(QString message, int messageType);
  166. int DealWithEntity(const EntityInfo& entity, DealType dealType, QString extendParam = "", bool multiThread = true);
  167. void UpdateEntityOperateBtnState(EntityState currState);
  168. void ResetAllEntityOperateBtnState(bool enable=true);
  169. void StartEntityFromCustom(const QString& entityName, const QString& cmdLine);
  170. bool LoadPlguins();
  171. void OnSilentStateChange(bool beSilent);
  172. void InitFloatWidget();
  173. public slots:
  174. void ReceiveMessage(const QtMessageInfo* message);
  175. void ReceiveMessageVariant(QVariant info);
  176. void ReceiveEntityVariant(QVariant info);
  177. void ReceiveOperatResult(int action, int result, const QString& message);
  178. void ReceiveCustomOperatResult(int action, int result, const QString& message);
  179. void EntityItemContextMenu(QPoint pos);
  180. private slots:
  181. void LoadCustomPlguins();
  182. void DisplayEntities();
  183. void EntitySelectionChanged();
  184. void StartEntity();
  185. void PauseEntity();
  186. void ContinueEntity();
  187. void TerminateEntity();
  188. void KillEntity();
  189. void TestEntity();
  190. void SortEntityItem(int n);
  191. void RemindEntityStateChange(int row, EntityState previousState, EntityState currState);
  192. void OnTrayIconActivated(QSystemTrayIcon::ActivationReason activeRson);
  193. void ConfigApp();
  194. void QuitApp();
  195. void RestartApp();
  196. void RestartSystem();
  197. void ShutdownSystem();
  198. void RestartAppThroughActive();
  199. void RestartAppThroughSpShell();
  200. void InitializeTerminal();
  201. void VersionView();
  202. void LogView();
  203. void ErrorCodeView();
  204. void RemoveEntityRuninfoConfigFile();
  205. void TriggerAdditionMenu(QAction* action);
  206. void ProcessStarted();
  207. void GetSubProcessMsg();
  208. void messageClicked();
  209. void ExportEntitySnapshot();
  210. void RecordEntitySnapshot();
  211. private:
  212. EntityInfo GetCurrentSelectedEntity();
  213. EntityInfo GetEntityInfoByRowIndex(int row);
  214. QTableWidgetItem* FindEnityWidgetItem(QString entityName);
  215. void UpdateItemBackgroundColor(int row, EntityState state);
  216. enum NoteSrcType {
  217. BootStage,
  218. EntityFire
  219. };
  220. void Note(QString info, NoteSrcType srcType, QString srcEntity, bool bForce = false);
  221. QAction* CreateMenuAction(QString text, QKeySequence keyShot, QString toolTipText, void (MainWindow::*)());
  222. bool InsertConsole(const QtMessageInfo& message);
  223. /*弹窗显示信息*/
  224. void NotifyLogMessage(MessageType type, const QString& title, const QString& message);
  225. void UpdateEntityStatistics();
  226. void ExportEntityInfo(bool fromBtnClick);
  227. QString GetPerfStorePath();
  228. QStringList ExecuteShellScripts(QString shellCmd);
  229. private:
  230. Ui::MainWindow *ui;
  231. RvcItemModel* mEntityModel;
  232. QItemSelectionModel *mEntitySelectedModel;
  233. QSortFilterProxyModel* mEntityFilterModel;
  234. QLabel *mToolsTip;
  235. MLabel* mStatusLabel;
  236. QTimer *mEntityStateChangeReminder;
  237. QMenu *mEntityPopMenu;
  238. friend RichTimer;
  239. friend EntityStateRecoverTimer;
  240. void RemindEntityStateChangeWith(QString entityName, bool bEnd);
  241. friend TimeDateTimer;
  242. void TimeUpdate(const QString& timeStr);
  243. CpuWidget mCpuWidget;
  244. MemoryWidget mMemoryWidget;
  245. PerformWidget* mPerformWidge;
  246. QVector< EntityBootInfo> mBootEntitiesInfo;
  247. QSystemTrayIcon *mSicon;
  248. bool mSilent;
  249. QAtomicInteger<quint32> mIdleEntityCount;
  250. QAtomicInteger<quint32> mTotalEntityCount;
  251. Widget* mFloatWidget;
  252. };
  253. #endif // MAINWINDOW_H