Rabbit Remote Control 0.0.36
Loading...
Searching...
No Matches
mainwindow.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include "mainwindow.h"
4#include "ui_mainwindow.h"
5#ifdef HAVE_UPDATE
6#include "FrmUpdater.h"
7#endif
8#include "RabbitCommonDir.h"
9#include "RabbitCommonTools.h"
10
11#ifdef HAVE_ABOUT
12#include "DlgAbout.h"
13#endif
14#ifdef BUILD_QUIWidget
15#include "QUIWidget/QUIWidget.h"
16#endif
17
18#include "Connecter.h"
19#include "FrmFullScreenToolBar.h"
20#include "ParameterDlgSettings.h"
21#include "FrmListRecentConnects.h"
22
23#include "ViewTable.h"
24#include "ViewSplitter.h"
25
26#ifdef HAVE_ICE
27#include "Ice.h"
28#endif
29
30#include <QGridLayout>
31#include <QMessageBox>
32#include <QCheckBox>
33#include <QScreen>
34#include <QApplication>
35#include <QDebug>
36#include <QDesktopServices>
37#include <QWidgetAction>
38#include <QMouseEvent>
39#include <QDrag>
40#include <QMimeData>
41#include <QKeySequence>
42#include <QPushButton>
43#include <QDateTime>
44#include <QFileDialog>
45#include <QLoggingCategory>
46#include <QThread>
47
48static Q_LOGGING_CATEGORY(log, "App.MainWindow")
49static Q_LOGGING_CATEGORY(logRecord, "App.MainWindow.Record")
50
51MainWindow::MainWindow(QWidget *parent)
52 : QMainWindow(parent),
53 m_pActionConnecterMenu(nullptr),
54 m_pDockListRecentConnects(nullptr),
55 m_pDockListConnecters(nullptr),
56 m_pFrmConnecters(nullptr),
57 m_pSignalStatus(nullptr),
58 ui(new Ui::MainWindow),
59 m_pView(nullptr),
60 m_pFullScreenToolBar(nullptr),
61 m_pRecentMenu(nullptr),
62 m_pDockFavorite(nullptr),
63 m_pFavoriteView(nullptr)
64{
65 bool check = false;
66
67 ui->setupUi(this);
68
69 setFocusPolicy(Qt::NoFocus);
70 //addToolBar(Qt::LeftToolBarArea, ui->toolBar);
71 setAcceptDrops(true);
72
73 RabbitCommon::CTools::AddStyleMenu(ui->menuTools);
74 ui->menuTools->addMenu(RabbitCommon::CTools::GetLogMenu(this));
75
76 m_pRecentMenu = new RabbitCommon::CRecentMenu(
77 tr("Recently connected"),
78 QIcon::fromTheme("document-open-recent"),
79 this);
80 check = connect(m_pRecentMenu, SIGNAL(recentFileTriggered(const QString&)),
81 this, SLOT(slotOpenFile(const QString&)));
82 Q_ASSERT(check);
83 check = connect(&m_Parameter, SIGNAL(sigRecentMenuMaxCountChanged(int)),
84 m_pRecentMenu, SLOT(setMaxCount(int)));
85 Q_ASSERT(check);
86 QAction* pRecentAction = ui->menuRemote->insertMenu(
87 ui->actionOpenListRecentConnections, m_pRecentMenu);
88 pRecentAction->setStatusTip(pRecentAction->text());
89 QToolButton* tbRecent = new QToolButton(ui->toolBar);
90 tbRecent->setFocusPolicy(Qt::NoFocus);
91 tbRecent->setPopupMode(QToolButton::InstantPopup);
92 tbRecent->setMenu(m_pRecentMenu);
93 tbRecent->setIcon(pRecentAction->icon());
94 tbRecent->setText(pRecentAction->text());
95 tbRecent->setToolTip(pRecentAction->toolTip());
96 tbRecent->setStatusTip(pRecentAction->statusTip());
97 ui->toolBar->insertWidget(ui->actionOpenListRecentConnections, tbRecent);
98
99#ifdef HAVE_UPDATE
100 CFrmUpdater updater;
101 ui->actionUpdate->setIcon(updater.windowIcon());
102#endif
103
104 QToolButton* tbConnect = new QToolButton(ui->toolBar);
105 tbConnect->setFocusPolicy(Qt::NoFocus);
106 tbConnect->setPopupMode(QToolButton::InstantPopup);
107 //tbConnect->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
108 tbConnect->setMenu(ui->menuConnect_C);
109 tbConnect->setIcon(QIcon::fromTheme("network-wired"));
110 tbConnect->setText(tr("Connect"));
111 tbConnect->setToolTip(tr("Connect"));
112 tbConnect->setStatusTip(tr("Connect"));
113 m_pActionConnect = ui->toolBar->insertWidget(ui->actionDisconnect_D, tbConnect);
114
115 m_Client.EnumPlugins(this);
116 m_Parameter.Load();
117 EnableMenu(false);
118
119 check = connect(&m_Parameter, SIGNAL(sigReceiveShortCutChanged()),
120 this, SLOT(slotShortCut()));
121 Q_ASSERT(check);
122 slotSystemTrayIconTypeChanged();
123 check = connect(&m_Parameter, SIGNAL(sigSystemTrayIconTypeChanged()),
124 this,
125 SLOT(slotSystemTrayIconTypeChanged()));
126 Q_ASSERT(check);
127 check = connect(&m_Parameter, SIGNAL(sigEnableSystemTrayIcon()),
128 this, SLOT(slotEnableSystemTrayIcon()));
129 Q_ASSERT(check);
130 check = connect(&m_Parameter, SIGNAL(sigEnableTabToolTipChanged()),
131 this, SLOT(slotUpdateName()));
132 Q_ASSERT(check);
133 check = connect(&m_Parameter, SIGNAL(sigEnableTabIconChanged()),
134 this, SLOT(slotUpdateName()));
135 Q_ASSERT(check);
136
137 m_pDockFavorite = new QDockWidget(this);
138 if(m_pDockFavorite)
139 {
140 m_pFavoriteView = new CFavoriteView(m_pDockFavorite);
141 if(m_pFavoriteView)
142 {
143 m_pDockFavorite->setTitleBarWidget(m_pFavoriteView->m_pDockTitleBar);
144 check = connect(m_pFavoriteView, SIGNAL(sigConnect(const QString&, bool)),
145 this, SLOT(slotOpenFile(const QString&, bool)));
146 Q_ASSERT(check);
147 check = connect(m_pFavoriteView, SIGNAL(sigFavorite()),
148 this, SLOT(on_actionAdd_to_favorite_triggered()));
149 Q_ASSERT(check);
150 check = connect(&m_Parameter, SIGNAL(sigFavoriteEditChanged(bool)),
151 m_pFavoriteView, SLOT(slotDoubleEditNode(bool)));
152 Q_ASSERT(check);
153 emit m_Parameter.sigFavoriteEditChanged(m_Parameter.GetFavoriteEdit());
154 m_pDockFavorite->setWidget(m_pFavoriteView);
155 m_pDockFavorite->setWindowTitle(m_pFavoriteView->windowTitle());
156 }
157 // Must set ObjectName then restore it. See: saveState help document
158 m_pDockFavorite->setObjectName("dockFavorite");
159 //m_pDockFavorite->hide();
160 ui->menuView->addAction(m_pDockFavorite->toggleViewAction());
161 m_pDockFavorite->toggleViewAction()->setIcon(QIcon::fromTheme("emblem-favorite"));
162 addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, m_pDockFavorite);
163 }
164
165 m_pDockListRecentConnects = new QDockWidget(this);
166 if(m_pDockListRecentConnects)
167 {
168 CFrmListRecentConnects* pListRecentConnects
170 &m_Client, m_Parameter, true, m_pDockListRecentConnects);
171 if(pListRecentConnects) {
172 if(pListRecentConnects->m_pDockTitleBar)
173 m_pDockListRecentConnects->setTitleBarWidget(
174 pListRecentConnects->m_pDockTitleBar);
175 check = connect(pListRecentConnects,
176 SIGNAL(sigConnect(const QString&, bool)),
177 this, SLOT(slotOpenFile(const QString&, bool)));
178 Q_ASSERT(check);
179 m_pDockListRecentConnects->setWidget(pListRecentConnects);
180 m_pDockListRecentConnects->setWindowTitle(
181 pListRecentConnects->windowTitle());
182 }
183 // Must set ObjectName then restore it. See: saveState help document
184 m_pDockListRecentConnects->setObjectName("dockListRecentConnects");
185 //m_pDockListRecentConnects->hide();
186 ui->menuView->addAction(m_pDockListRecentConnects->toggleViewAction());
187 m_pDockListRecentConnects->toggleViewAction()->setIcon(QIcon::fromTheme("document-open-recent"));
188 tabifyDockWidget(m_pDockFavorite, m_pDockListRecentConnects);
189 }
190
191 m_pDockListConnecters = new QDockWidget(this);
192 if(m_pDockListConnecters)
193 {
194 m_pFrmConnecters = new CFrmConnecters(
195 m_Connecters, m_Parameter,
196 ui->menuConnect_C, ui->actionDisconnect_D,
197 m_pRecentMenu, m_pDockListConnecters);
198 if(m_pFrmConnecters) {
199 m_pDockListConnecters->setWidget(m_pFrmConnecters);
200 if(m_pFrmConnecters->m_pDockTitleBar)
201 m_pDockListConnecters->setTitleBarWidget(
202 m_pFrmConnecters->m_pDockTitleBar);
203 m_pDockListConnecters->setWindowTitle(m_pFrmConnecters->windowTitle());
204 check = connect(m_pFrmConnecters, SIGNAL(sigConnecterChanged(CConnecter*)),
205 this, SLOT(slotConnecterChanged(CConnecter*)));
206 Q_ASSERT(check);
207 }
208 m_pDockListConnecters->setObjectName("dockListConnects");
209 //m_pDockListConnecters->hide();
210 ui->menuView->addAction(m_pDockListConnecters->toggleViewAction());
211 m_pDockListConnecters->toggleViewAction()->setIcon(QIcon::fromTheme("network-wired"));
212 tabifyDockWidget(m_pDockFavorite, m_pDockListConnecters);
213 }
214
215 QActionGroup* pGBView = new QActionGroup(this);
216 if(pGBView) {
217 pGBView->addAction(ui->actionViewTab);
218 pGBView->addAction(ui->actionViewSplit);
219 }
220 qDebug(log) << "View type:" << m_Parameter.GetViewType();
221 if(CParameterApp::ViewType::Tab == m_Parameter.GetViewType()) {
222 ui->actionViewTab->setChecked(true);
223 on_actionViewTab_triggered();
224 }
225 if(CParameterApp::ViewType::Splitter == m_Parameter.GetViewType()) {
226 ui->actionViewSplit->setChecked(true);
227 on_actionViewSplit_triggered();
228 }
229 check = connect(&m_Parameter, &CParameterApp::sigViewTypeChanged,
230 this, [&](){
231 m_Parameter.Save();
232 });
233 Q_ASSERT(check);
234
235 slotShortCut();
236#ifdef HAVE_ICE
237 if(CICE::Instance()->GetSignal())
238 {
239 check = connect(CICE::Instance()->GetSignal().data(),
240 SIGNAL(sigConnected()),
241 this, SLOT(slotSignalConnected()));
242 Q_ASSERT(check);
243 check = connect(CICE::Instance()->GetSignal().data(),
244 SIGNAL(sigDisconnected()),
245 this, SLOT(slotSignalDisconnected()));
246 Q_ASSERT(check);
247 check = connect(CICE::Instance()->GetSignal().data(),
248 SIGNAL(sigError(const int, const QString&)),
249 this, SLOT(slotSignalError(const int, const QString&)));
250 Q_ASSERT(check);
251 }
252 CICE::Instance()->slotStart();
253 m_pSignalStatus = new QPushButton();
254 m_pSignalStatus->setToolTip(tr("ICE signal status"));
255 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
256 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
257 slotSignalDisconnected();
258 statusBar()->addPermanentWidget(m_pSignalStatus);
259#endif
260
261 if(m_Parameter.GetSaveMainWindowStatus())
262 {
263 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
264 QSettings::IniFormat);
265 QByteArray geometry
266 = set.value("MainWindow/Status/Geometry").toByteArray();
267 if(!geometry.isEmpty())
268 restoreGeometry(geometry);
269 // Restores the state of this mainwindow's toolbars and dockwidgets
270 QByteArray state = set.value("MainWindow/Status/State").toByteArray();
271 if(!state.isEmpty())
272 restoreState(state);
273
274 ui->actionTabBar_B->setChecked(m_Parameter.GetTabBar());
275 on_actionTabBar_B_toggled(m_Parameter.GetTabBar());
276 ui->actionStatus_bar_S->setChecked(m_Parameter.GetStatusBar());
277 statusBar()->setVisible(m_Parameter.GetStatusBar());
278 ui->actionMain_menu_bar_M->setChecked(m_Parameter.GetMenuBar());
279 menuBar()->setVisible(m_Parameter.GetMenuBar());
280 ui->actionToolBar_T->setChecked(!ui->toolBar->isHidden());
281 if(!m_Parameter.GetMenuBar())
282 ui->toolBar->insertAction(ui->actionTabBar_B,
283 ui->actionMain_menu_bar_M);
284 }
285
286 slotEnableSystemTrayIcon();
287
288 LoadConnectLasterClose();
289}
290
291MainWindow::~MainWindow()
292{
293 qDebug(log) << "MainWindow::~MainWindow()";
294 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
295 delete ui;
296}
297
298void MainWindow::SetView(CView* pView)
299{
300 qDebug(log) << Q_FUNC_INFO;
301 if(!pView)
302 return;
303 if(m_pView)
304 m_pView->disconnect();
305
306 m_pView = pView;
307 setCentralWidget(m_pView);
308
309 bool check = false;
310 m_pView->setFocusPolicy(Qt::NoFocus);
311 check = connect(m_pView, SIGNAL(sigCloseView(const QWidget*)),
312 this, SLOT(slotCloseView(const QWidget*)));
313 Q_ASSERT(check);
314 check = connect(m_pView, SIGNAL(sigCurrentChanged(const QWidget*)),
315 this, SLOT(slotCurrentViewChanged(const QWidget*)));
316 Q_ASSERT(check);
317 if(m_pFrmConnecters) {
318 check = connect(m_pView, SIGNAL(sigCurrentChanged(const QWidget*)),
319 m_pFrmConnecters, SLOT(slotViewChanged(const QWidget*)));
320 Q_ASSERT(check);
321 }
322 check = connect(m_pView, SIGNAL(customContextMenuRequested(const QPoint&)),
323 this, SLOT(slotCustomContextMenuRequested(const QPoint&)));
324 Q_ASSERT(check);
325
326 foreach (auto c, m_Connecters) {
327 m_pView->AddView(c->GetViewer());
328 m_pView->SetWidowsTitle(
329 c->GetViewer(), c->Name(), c->Icon(), c->Description());
330 }
331 m_pView->SetVisibleTab(m_Parameter.GetTabBar());
332}
333
334void MainWindow::on_actionViewTab_triggered()
335{
336 qDebug(log) << Q_FUNC_INFO;
337 if(!ui->actionViewTab->isChecked()) return;
338 m_Parameter.SetViewType(CParameterApp::ViewType::Tab);
339 SetView(new CViewTable(&m_Parameter, this));
340}
341
342void MainWindow::on_actionViewSplit_triggered()
343{
344 qDebug(log) << Q_FUNC_INFO;
345 if(!ui->actionViewSplit->isChecked()) return;
346 m_Parameter.SetViewType(CParameterApp::ViewType::Splitter);
347 SetView(new CViewSplitter(&m_Parameter, this));
348}
349
350void MainWindow::on_actionAbout_triggered()
351{
352#ifdef HAVE_ABOUT
353 CDlgAbout *about = new CDlgAbout(this);
354 QIcon icon = QIcon::fromTheme("app");
355 if(!icon.isNull()) {
356 auto sizeList = icon.availableSizes();
357 if(!sizeList.isEmpty()) {
358 QPixmap p = icon.pixmap(*sizeList.begin());
359 about->m_AppIcon = p.toImage();
360 }
361 }
362 about->m_szCopyrightStartTime = "2020";
363 about->m_szVersionRevision = RabbitRemoteControl_REVISION;
364 about->m_szDetails = m_Client.Details();
365 RC_SHOW_WINDOW(about);
366#endif
367}
368
369void MainWindow::on_actionUpdate_triggered()
370{
371 if(!qEnvironmentVariable("SNAP").isEmpty()) {
372 QDesktopServices::openUrl(QUrl("https://snapcraft.io/rabbitremotecontrol"));
373 } else if(!qEnvironmentVariable("FLATPAK_ID").isEmpty()) {
374 QDesktopServices::openUrl(QUrl("https://flathub.org/apps/io.github.KangLin.RabbitRemoteControl"));
375 } else {
376#ifdef HAVE_UPDATE
377 CFrmUpdater* m_pfrmUpdater = new CFrmUpdater();
378 QIcon icon = QIcon::fromTheme("app");
379 if(!icon.isNull()) {
380 auto sizeList = icon.availableSizes();
381 if(!sizeList.isEmpty()) {
382 QPixmap p = icon.pixmap(*sizeList.begin());
383 m_pfrmUpdater->SetTitle(p.toImage());
384 }
385 }
386 m_pfrmUpdater->SetInstallAutoStartup();
387 RC_SHOW_WINDOW(m_pfrmUpdater);
388#endif
389 }
390}
391
392void MainWindow::on_actionFull_screen_F_triggered()
393{
394 CView* pView = qobject_cast<CView*>(this->centralWidget());
395 if(pView)
396 {
397 pView->SetFullScreen(!isFullScreen());
398 }
399
400 if(isFullScreen())
401 {
402 qDebug(log) << "Exit full screen";
403 ui->actionFull_screen_F->setIcon(QIcon::fromTheme("view-fullscreen"));
404 ui->actionFull_screen_F->setText(tr("Full screen(&F)"));
405 ui->actionFull_screen_F->setToolTip(tr("Full screen"));
406 ui->actionFull_screen_F->setStatusTip(tr("Full screen"));
407 ui->actionFull_screen_F->setWhatsThis(tr("Full screen"));
408
409 ui->toolBar->setVisible(m_FullState.toolBar);
410 ui->statusbar->setVisible(m_FullState.statusbar);
411 ui->menubar->setVisible(m_FullState.menubar);
412
413 m_pDockListConnecters->setVisible(m_FullState.dockListConnects);
414 m_pDockListRecentConnects->setVisible(m_FullState.dockListRecentConnects);
415 m_pDockFavorite->setVisible(m_FullState.dockFavorite);
416 // TODO: This is hade code. it is in RabbitCommon
417 QDockWidget* pDockDebugLog = findChild<QDockWidget*>("dockDebugLog");
418 if(pDockDebugLog)
419 {
420 pDockDebugLog->setVisible(m_FullState.dockDebugLog);
421 }
422
423 if(m_pFullScreenToolBar)
424 {
425 // Delete it when the widget is close
426 m_pFullScreenToolBar->close();
427 m_pFullScreenToolBar = nullptr;
428 }
429
430 emit sigShowNormal();
431 this->showNormal();
432 this->activateWindow();
433
434 return;
435 }
436
437 qDebug(log) << "Entry full screen";
438 emit sigFullScreen();
439 //setWindowFlags(Qt::FramelessWindowHint | windowFlags());
440 this->showFullScreen();
441
442 ui->actionFull_screen_F->setIcon(QIcon::fromTheme("view-restore"));
443 ui->actionFull_screen_F->setText(tr("Exit full screen(&E)"));
444 ui->actionFull_screen_F->setToolTip(tr("Exit full screen"));
445 ui->actionFull_screen_F->setStatusTip(tr("Exit full screen"));
446 ui->actionFull_screen_F->setWhatsThis(tr("Exit full screen"));
447
448 m_FullState.toolBar = ui->toolBar->isVisible();
449 ui->toolBar->setVisible(false);
450 m_FullState.statusbar = ui->statusbar->isVisible();
451 ui->statusbar->setVisible(false);
452 m_FullState.menubar = ui->menubar->isVisible();
453 ui->menubar->setVisible(false);
454
455 m_FullState.dockListConnects = m_pDockListConnecters->isVisible();
456 m_pDockListConnecters->setVisible(false);
457 m_FullState.dockListRecentConnects = m_pDockListRecentConnects->isVisible();
458 m_pDockListRecentConnects->setVisible(false);
459 m_FullState.dockFavorite = m_pDockFavorite->isVisible();
460 m_pDockFavorite->setVisible(false);
461 // This is hade code. it is in RabbitCommon
462 QDockWidget* pDockDebugLog = findChild<QDockWidget*>("dockDebugLog");
463 if(pDockDebugLog)
464 {
465 m_FullState.dockDebugLog = pDockDebugLog->isVisible();
466 pDockDebugLog->setVisible(false);
467 }
468
469 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
470 // Delete it when the widget is close
471 m_pFullScreenToolBar = new CFrmFullScreenToolBar(this);
472 QScreen* pScreen = qApp->primaryScreen();
473 if(pScreen) {
474 QPoint pos(pScreen->geometry().left()
475 + (pScreen->geometry().width()
476 - m_pFullScreenToolBar->frameGeometry().width()) / 2,
477 pScreen->geometry().top());
478 qDebug(log) << "Primary screen geometry:" << pScreen->geometry()
479 << "availableGeometry:" << pScreen->availableGeometry()
480 << pos << mapToGlobal(pos);
481 m_pFullScreenToolBar->move(pos);
482 }
483 bool check = connect(m_pFullScreenToolBar, SIGNAL(sigExitFullScreen()),
484 this, SLOT(on_actionFull_screen_F_triggered()));
485 Q_ASSERT(check);
486 check = connect(m_pFullScreenToolBar, SIGNAL(sigExit()),
487 this, SLOT(on_actionExit_E_triggered()));
488 Q_ASSERT(check);
489 check = connect(m_pFullScreenToolBar, SIGNAL(sigDisconnect()),
490 this, SLOT(on_actionDisconnect_D_triggered()));
491 Q_ASSERT(check);
492 check = connect(this, SIGNAL(sigConnecterMenuChanged(QAction*)),
493 m_pFullScreenToolBar,
494 SLOT(slotConnecterMenuChanged(QAction*)));
495 Q_ASSERT(check);
496
497 m_pFullScreenToolBar->show();
498}
499
500void MainWindow::slotViewerFocusIn(QWidget *pView)
501{
502 CConnecter* c = (CConnecter*)sender();
503 qDebug(log) << Q_FUNC_INFO << "Focus:" << sender() << pView;
504 if(c && m_pView) {
505 m_pView->SetCurrentView(c->GetViewer());
506 }
507}
508
509void MainWindow::slotConnecterChanged(CConnecter *c)
510{
511 if(c && m_pView) {
512 m_pView->SetCurrentView(c->GetViewer());
513 }
514}
515
516void MainWindow::slotCurrentViewChanged(const QWidget* pView)
517{
518 qDebug(log) << Q_FUNC_INFO;
519 if(m_pView && pView)
520 EnableMenu(true);
521 else
522 EnableMenu(false);
523}
524
525void MainWindow::EnableMenu(bool bEnable)
526{
527 qDebug(log) << Q_FUNC_INFO << bEnable;
528 ui->actionClone->setEnabled(bEnable);
529 ui->actionAdd_to_favorite->setEnabled(bEnable);
530 ui->actionDisconnect_D->setEnabled(bEnable);
531 ui->actionTabBar_B->setEnabled(bEnable);
532 slotLoadConnecterMenu();
533}
534
535void MainWindow::slotLoadConnecterMenu()
536{
537 qDebug(log) << Q_FUNC_INFO;
538
539 if(m_pActionConnecterMenu) {
540 ui->menuTools->removeAction(m_pActionConnecterMenu);
541 ui->toolBar->removeAction(m_pActionConnecterMenu);
542 m_pActionConnecterMenu = nullptr;
543 }
544
545 if(!m_pView)
546 return;
547 auto pWin = m_pView->GetCurrentView();
548 if(!pWin) {
549 qDebug(log) << "The current view is empty";
550 return;
551 }
552 foreach(auto c, m_Connecters)
553 {
554 if(c->GetViewer() == pWin)
555 {
556 qDebug(log) << "Load plugin menu";
557 auto m = c->GetMenu(ui->menuTools);
558 if(!m) return;
559 m_pActionConnecterMenu = ui->menuTools->addMenu(m);
560 ui->toolBar->insertAction(ui->actionFull_screen_F, m_pActionConnecterMenu);
561 emit sigConnecterMenuChanged(m_pActionConnecterMenu);
562 }
563 }
564}
565
573{
574 if(!m_pView)
575 return;
576 auto pWin = m_pView->GetCurrentView();
577 if(!pWin) {
578 qDebug(log) << "The current view is empty";
579 return;
580 }
581 foreach(auto c, m_Connecters)
582 {
583 if(c->GetViewer() == pWin)
584 {
585 qDebug(log) << "Load plugin menu";
586 auto m = c->GetMenu(ui->menuTools);
587 if(!m) return;
588 // Note: The view is converted to global coordinates
589 m->exec(pos);
590 }
591 }
592}
593
594void MainWindow::on_actionExit_E_triggered()
595{
596 close();
597}
598
599void MainWindow::keyReleaseEvent(QKeyEvent *event)
600{
601 switch(event->key())
602 {
603 case Qt::Key_Escape:
604 if(isFullScreen())
605 on_actionFull_screen_F_triggered();
606 break;
607 }
608 QMainWindow::keyReleaseEvent(event);
609}
610
611void MainWindow::slotUpdateParameters(CConnecter* pConnecter)
612{
613 m_Client.SaveConnecter(pConnecter);
614}
615
616void MainWindow::on_actionClone_triggered()
617{
618 if(!m_pView) return;
619 QWidget* p = m_pView->GetCurrentView();
620 foreach(auto c, m_Connecters)
621 {
622 if(c->GetViewer() == p)
623 {
624 QString szFile = c->GetSettingsFile();
625 auto pConnecter = m_Client.LoadConnecter(szFile);
626 if(!pConnecter) return;
627 Connect(pConnecter, false, szFile);
628 return;
629 }
630 }
631}
632
633void MainWindow::slotOpenFile(const QString& szFile, bool bOpenSettings)
634{
635 if(szFile.isEmpty()) return;
636 CConnecter* p = m_Client.LoadConnecter(szFile);
637 if(nullptr == p)
638 {
639 slotInformation(tr("Load file fail: ") + szFile);
640 return;
641 }
642
643 Connect(p, bOpenSettings, szFile);
644}
645
646void MainWindow::on_actionOpenRRCFile_triggered()
647{
648 QString szFile = QFileDialog::getOpenFileName(
649 this,
650 tr("Open rabbit remote control file"),
651 RabbitCommon::CDir::Instance()->GetDirUserData(),
652 tr("Rabbit remote control Files (*.rrc);;All files(*.*)"));
653 if(szFile.isEmpty()) return;
654
655 CConnecter* p = m_Client.LoadConnecter(szFile);
656 if(nullptr == p)
657 {
658 slotInformation(tr("Load file fail: ") + szFile);
659 return;
660 }
661
662 Connect(p, true);
663}
664
665void MainWindow::slotConnect()
666{
667 if(nullptr == m_pView)
668 {
669 Q_ASSERT(false);
670 return;
671 }
672 QAction* pAction = dynamic_cast<QAction*>(this->sender());
673 CConnecter* p = m_Client.CreateConnecter(pAction->data().toString());
674 if(nullptr == p) return;
675 Connect(p, true);
676}
677
688int MainWindow::Connect(CConnecter *c, bool set, QString szFile)
689{
690 qDebug(log) << "MainWindow::Connect: set:" << set << "; File:" << szFile;
691 bool bSave = false; //whether is save configure file
692 Q_ASSERT(c);
693 bool check = connect(c, SIGNAL(sigConnected()),
694 this, SLOT(slotConnected()));
695 Q_ASSERT(check);
696 check = connect(c, SIGNAL(sigDisconnect()),
697 this, SLOT(slotDisconnect()));
698 Q_ASSERT(check);
699 check = connect(c, SIGNAL(sigDisconnected()),
700 this, SLOT(slotDisconnected()));
701 Q_ASSERT(check);
702 check = connect(c, SIGNAL(sigError(const int, const QString &)),
703 this, SLOT(slotError(const int, const QString&)));
704 Q_ASSERT(check);
705 check = connect(c, SIGNAL(sigShowMessageBox(const QString&, const QString&,
706 const QMessageBox::Icon&)),
707 this, SLOT(slotShowMessageBox(const QString&, const QString&,
708 const QMessageBox::Icon&)));
709 Q_ASSERT(check);
710 check = connect(c, SIGNAL(sigInformation(const QString&)),
711 this, SLOT(slotInformation(const QString&)));
712 Q_ASSERT(check);
713 check = connect(c, SIGNAL(sigUpdateName(const QString&)),
714 this, SLOT(slotUpdateName(const QString&)));
715 Q_ASSERT(check);
716 check = connect(c, SIGNAL(sigUpdateParameters(CConnecter*)),
717 this, SLOT(slotUpdateParameters(CConnecter*)));
718 Q_ASSERT(check);
719
720 if(set)
721 {
722 int nRet = c->OpenDialogSettings(this);
723 switch(nRet)
724 {
725 case QDialog::Rejected:
726 m_Client.DeleteConnecter(c);
727 return 0;
728 case QDialog::Accepted:
729 bSave = true;
730 break;
731 }
732 }
733
734 if(szFile.isEmpty())
735 szFile = c->GetSettingsFile();
736 else
737 c->SetSettingsFile(szFile);
738
739 int nRet = 0;
740 if(bSave)
741 nRet = m_Client.SaveConnecter(c);
742 if(0 == nRet)
743 m_pRecentMenu->addRecentFile(szFile, c->Name());
744
745 if(!c->Name().isEmpty())
746 slotInformation(tr("Connecting to ") + c->Name());
747
748 //* Show view. \see: slotConnected()
749 if(-1 < m_Connecters.indexOf(c)) {
750 if(m_pView)
751 m_pView->SetCurrentView(c->GetViewer());
752 return 0;
753 }
754 if(m_pView)
755 {
756 m_pView->AddView(c->GetViewer());
757 m_pView->SetWidowsTitle(c->GetViewer(), c->Name(), c->Icon(), c->Description());
758 //qDebug(log) << "View:" << p->GetViewer();
759 check = connect(c, SIGNAL(sigViewerFocusIn(QWidget*)),
760 this, SLOT(slotViewerFocusIn(QWidget*)));
761 Q_ASSERT(check);
762 }
763 m_Connecters.push_back(c);
764 m_pFrmConnecters->slotLoadConnecters();
765 m_pFrmConnecters->slotViewChanged(m_pView->GetCurrentView());
766 //*/
767
768 c->Connect();
769
770 return 0;
771}
772
774
778{
779 CConnecter* p = dynamic_cast<CConnecter*>(sender());
780 if(!p) return;
781
782 /* If you put it here, when connected, the view is not displayed.
783 So put it in the connect() display view.
784 See: Connect(CConnecter *p, bool set, QString szFile)
785 */
786 /*
787 if(-1 == m_Connecters.indexOf(p)) {
788 m_Connecters.push_back(p);
789 if(m_pView)
790 {
791 m_pView->AddView(p->GetViewer());
792 m_pView->SetWidowsTitle(p->GetViewer(), p->Name(), p->Icon(), p->Description());
793 }
794 } else {
795 m_pView->SetCurrentView(p->GetViewer());
796 }
797 //*/
798
799 slotLoadConnecterMenu();
800
801 slotInformation(tr("Connected to ") + p->Name());
802 qDebug(log) << "MainWindow::slotConnected()" << p->Name();
803}
805
806void MainWindow::slotCloseView(const QWidget* pView)
807{
808 qDebug(log) << "MainWindow::slotCloseView" << pView;
809 if(!pView) return;
810 foreach(auto c, m_Connecters)
811 {
812 if(c->GetViewer() == pView)
813 {
814 //TODO: Whether to save the setting
815 emit c->sigUpdateParameters(c);
816 c->DisConnect();
817 }
818 }
819}
820
821void MainWindow::on_actionDisconnect_D_triggered()
822{
823 qDebug(log) << "MainWindow::on_actionDisconnect_D_triggered()";
824 if(!m_pView) return;
825
826 QWidget* pView = m_pView->GetCurrentView();
827 slotCloseView(pView);
828}
829
830void MainWindow::slotDisconnect()
831{
832 qDebug(log) << "MainWindow::slotDisconnect()";
833 CConnecter* pConnecter = dynamic_cast<CConnecter*>(sender());
834 if(!pConnecter) return;
835 //TODO: Whether to save the setting
836 emit pConnecter->sigUpdateParameters(pConnecter);
837 pConnecter->DisConnect();
838}
839
840void MainWindow::slotDisconnected()
841{
842 qDebug(log) << "MainWindow::slotDisconnected()";
843 CConnecter* pConnecter = dynamic_cast<CConnecter*>(sender());
844 foreach(auto c, m_Connecters)
845 {
846 if(c == pConnecter)
847 {
848 m_pView->RemoveView(c->GetViewer());
849 m_Connecters.removeAll(c);
850 m_Client.DeleteConnecter(c);
851 m_pFrmConnecters->slotLoadConnecters();
852 m_pFrmConnecters->slotViewChanged(m_pView->GetCurrentView());
853 break;
854 }
855 }
856 if(m_Connecters.isEmpty())
857 if(m_pActionConnecterMenu) {
858 ui->menuTools->removeAction(m_pActionConnecterMenu);
859 ui->toolBar->removeAction(m_pActionConnecterMenu);
860 m_pActionConnecterMenu = nullptr;
861 }
862}
863
864void MainWindow::slotSignalConnected()
865{
866 m_pSignalStatus->setToolTip(tr("ICE signal status: Connected"));
867 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
868 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
869 //m_pSignalStatus->setText(tr("Connected"));
870 m_pSignalStatus->setIcon(QIcon::fromTheme("newwork-wired"));
871}
872
873void MainWindow::slotSignalDisconnected()
874{
875 m_pSignalStatus->setToolTip(tr("ICE signal status: Disconnected"));
876 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
877 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
878 //m_pSignalStatus->setText(tr("Disconnected"));
879 m_pSignalStatus->setIcon(QIcon::fromTheme("network-wireless"));
880}
881
882void MainWindow::slotSignalError(const int nError, const QString &szInfo)
883{
884 slotSignalDisconnected();
885 slotInformation(szInfo);
886}
887
888void MainWindow::slotSignalPushButtonClicked(bool checked)
889{
890#ifdef HAVE_ICE
891 if(checked)
892 CICE::Instance()->slotStart();
893 else
894 CICE::Instance()->slotStop();
895#endif
896}
897
898void MainWindow::slotError(const int nError, const QString &szInfo)
899{
900 Q_UNUSED(nError);
901 slotInformation(szInfo);
902}
903
905 const QString &title, const QString &message,
906 const QMessageBox::Icon &icon)
907{
908 slotInformation(message);
909 if(!m_Parameter.GetMessageBoxDisplayInformation())
910 return;
911
912 QMessageBox msg(icon, title, message, QMessageBox::Ok, this);
913 QCheckBox* cb = new QCheckBox(
914 tr("Use message box to display information"), this);
915 cb->setChecked(true);
916 msg.setCheckBox(cb);
917 RC_SHOW_WINDOW(&msg);
918 if(!cb->isChecked())
919 {
920 m_Parameter.SetMessageBoxDisplayInformation(false);
921 m_Parameter.Save();
922 }
923}
924
925void MainWindow::slotInformation(const QString& szInfo)
926{
927 statusBar()->showMessage(szInfo);
928}
929
930void MainWindow::slotUpdateName()
931{
932 foreach (auto pConnecter, m_Connecters)
933 {
934 m_pView->SetWidowsTitle(pConnecter->GetViewer(),
935 pConnecter->Name(),
936 pConnecter->Icon(),
937 pConnecter->Description());
938 }
939}
940
941void MainWindow::slotUpdateName(const QString& szName)
942{
943 CConnecter* pConnecter = dynamic_cast<CConnecter*>(sender());
944 if(!pConnecter) return;
945 m_pView->SetWidowsTitle(pConnecter->GetViewer(), szName,
946 pConnecter->Icon(), pConnecter->Description());
947}
948
949int MainWindow::onProcess(const QString &id, CPluginClient *pPlug)
950{
951 Q_UNUSED(id);
952 // Connect menu and toolbar
953 QAction* p = ui->menuConnect_C->addAction(pPlug->Protocol()
954 + ": " + pPlug->DisplayName(),
955 this, SLOT(slotConnect()));
956 p->setToolTip(pPlug->Description());
957 p->setStatusTip(pPlug->Description());
958 p->setData(id);
959 p->setIcon(pPlug->Icon());
960
961 return 0;
962}
963
964void MainWindow::closeEvent(QCloseEvent *event)
965{
966 qDebug(log) << "MainWindow::closeEvent()";
967
968 if(m_Parameter.GetSaveMainWindowStatus())
969 if(isFullScreen())
970 on_actionFull_screen_F_triggered();
971
972 SaveConnectLasterClose();
973
974 foreach (auto it, m_Connecters)
975 {
976 //TODO: Whether to save the setting
977 emit it->sigUpdateParameters(it);
978 it->DisConnect();
979 }
980
981 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
982 QSettings::IniFormat);
983 if(m_Parameter.GetSaveMainWindowStatus())
984 {
985 set.setValue("MainWindow/Status/Geometry", saveGeometry());
986 set.setValue("MainWindow/Status/State", saveState());
987
988 m_Parameter.SetTabBar(ui->actionTabBar_B->isChecked());
989 m_Parameter.SetMenuBar(menuBar()->isVisible());
990 m_Parameter.SetStatusBar(statusBar()->isVisible());
991 } else {
992 set.remove("MainWindow/Status/Geometry");
993 set.remove("MainWindow/Status/State");
994 }
995
996 m_Client.SaveSettings();
997 m_Parameter.Save();
998
999 QMainWindow::closeEvent(event);
1000
1001 //TODO: Wait for the background thread to exit
1002 QThread::sleep(1);
1003}
1004
1005int MainWindow::LoadConnectLasterClose()
1006{
1007 if(!m_Parameter.GetOpenLasterClose())
1008 return 0;
1009
1010 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1011 + QDir::separator() + "LasterClose.dat");
1012 if(f.open(QFile::ReadOnly))
1013 {
1014 QDataStream d(&f);
1015 while(1){
1016 QString szFile;
1017 d >> szFile;
1018 if(szFile.isEmpty())
1019 break;
1020 slotOpenFile(szFile);
1021 }
1022 f.close();
1023 }
1024 return 0;
1025}
1026
1027int MainWindow::SaveConnectLasterClose()
1028{
1029 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1030 + QDir::separator() + "LasterClose.dat");
1031 f.open(QFile::WriteOnly);
1032 if(m_Parameter.GetOpenLasterClose())
1033 {
1034 QDataStream d(&f);
1035 foreach(auto it, m_Connecters)
1036 {
1037 d << it->GetSettingsFile();
1038 }
1039 }
1040 f.close();
1041 return 0;
1042}
1043
1044void MainWindow::on_actionTabBar_B_toggled(bool bShow)
1045{
1046 if(m_pView)
1047 {
1048 m_pView->SetVisibleTab(bShow);
1049 m_Parameter.SetTabBar(bShow);
1050 } else {
1051 if(m_pDockListConnecters)
1052 m_pDockListConnecters->setVisible(bShow);
1053 }
1054}
1055
1056void MainWindow::on_actionMain_menu_bar_M_toggled(bool checked)
1057{
1058 qDebug(log) << Q_FUNC_INFO << checked;
1059 if(ui->toolBar->isHidden() && !checked)
1060 {
1061 if( QMessageBox::StandardButton::Yes
1062 == QMessageBox::information(this, tr("Hide menu bar"),
1063 tr("The menu bar will be hidden, the tool bar must be showed."),
1064 QMessageBox::StandardButton::Yes
1065 | QMessageBox::StandardButton::No))
1066 {
1067 ui->actionToolBar_T->setChecked(true);
1068 } else {
1069 ui->actionMain_menu_bar_M->setChecked(true);
1070 return;
1071 }
1072 }
1073
1074 menuBar()->setVisible(checked);
1075 m_Parameter.SetMenuBar(checked);
1076 if(checked)
1077 {
1078 ui->toolBar->removeAction(ui->actionMain_menu_bar_M);
1079 }
1080 else
1081 {
1082 ui->toolBar->insertAction(ui->actionTabBar_B,
1083 ui->actionMain_menu_bar_M);
1084 }
1085}
1086
1087void MainWindow::on_actionToolBar_T_toggled(bool checked)
1088{
1089 qDebug(log) << Q_FUNC_INFO << checked;
1090 if(menuBar()->isHidden() && !checked)
1091 {
1092 if( QMessageBox::StandardButton::Yes
1093 == QMessageBox::information(this, tr("Hide tool bar"),
1094 tr("The tool bar will be hidden, the menu bar must be showed."),
1095 QMessageBox::StandardButton::Yes
1096 | QMessageBox::StandardButton::No))
1097 {
1098 ui->actionMain_menu_bar_M->setChecked(true);
1099 } else {
1100 ui->actionToolBar_T->setChecked(true);
1101 return;
1102 }
1103 }
1104 ui->toolBar->setVisible(checked);
1105}
1106
1107void MainWindow::on_actionStatus_bar_S_toggled(bool checked)
1108{
1109 statusBar()->setVisible(checked);
1110 m_Parameter.SetStatusBar(checked);
1111}
1112
1113// [Get the widget that settings client parameters]
1114void MainWindow::on_actionSettings_triggered()
1115{
1116 CParameterDlgSettings set(&m_Parameter, m_Client.GetSettingsWidgets(this), this);
1117 if(CParameterDlgSettings::Accepted == RC_SHOW_WINDOW(&set))
1118 {
1119 m_Client.SaveSettings();
1120 m_Parameter.Save();
1121 }
1122}
1123// [Get the widget that settings client parameters]
1124
1125void MainWindow::slotShortCut()
1126{
1127 if(m_Parameter.GetReceiveShortCut())
1128 {
1129 setFocusPolicy(Qt::WheelFocus);
1130#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
1131 ui->actionFull_screen_F->setShortcut(
1132 QKeySequence(QKeyCombination(Qt::CTRL, Qt::Key_R),
1133 QKeyCombination(Qt::Key_F)));
1134 ui->actionScreenshot->setShortcut(
1135 QKeySequence(QKeyCombination(Qt::CTRL, Qt::Key_R),
1136 QKeyCombination(Qt::Key_S)));
1137#else
1138 ui->actionFull_screen_F->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R, Qt::Key_F));
1139 ui->actionScreenshot->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R, Qt::Key_S));
1140#endif
1141 } else {
1142 setFocusPolicy(Qt::NoFocus);
1143 ui->actionFull_screen_F->setShortcut(QKeySequence());
1144 ui->actionScreenshot->setShortcut(QKeySequence());
1145 }
1146}
1147
1148void MainWindow::on_actionOpenListRecentConnections_triggered()
1149{
1151 &m_Client, m_Parameter, false);
1152 if(!p) return;
1153 bool check = connect(p, SIGNAL(sigConnect(const QString&, bool)),
1154 this, SLOT(slotOpenFile(const QString&, bool)));
1155 Q_ASSERT(check);
1156
1157 QDialog d;
1158 d.resize(540, 400);
1159 d.setWindowIcon(windowIcon());
1160 d.setWindowTitle(p->windowTitle());
1161 QGridLayout* pLayout = new QGridLayout(&d);
1162 if(pLayout){
1163 pLayout->addWidget(p);
1164 check = connect(p, SIGNAL(destroyed()), &d, SLOT(reject()));
1165 d.setLayout(pLayout);
1166 }
1167 RC_SHOW_WINDOW(&d);
1168}
1169
1170void MainWindow::on_actionAdd_to_favorite_triggered()
1171{
1172 if(!m_pView || !m_pFavoriteView) return;
1173 QWidget* p = m_pView->GetCurrentView();
1174 foreach(auto c, m_Connecters)
1175 {
1176 if(c->GetViewer() == p)
1177 {
1178 m_pFavoriteView->AddFavorite(c->Name(), c->GetSettingsFile());
1179 }
1180 }
1181}
1182
1183void MainWindow::dragEnterEvent(QDragEnterEvent *event)
1184{
1185 qDebug(log) << "dragEnterEvent";
1186
1187 if(event->mimeData()->hasUrls())
1188 {
1189 qWarning(log) << event->mimeData()->urls();
1190 event->acceptProposedAction();
1191 }
1192}
1193
1194void MainWindow::dragMoveEvent(QDragMoveEvent *event)
1195{
1196 //qDebug(log) << "dragMoveEvent";
1197}
1198
1199void MainWindow::dropEvent(QDropEvent *event)
1200{
1201 qDebug(log) << "dropEvent";
1202 if(!event->mimeData()->hasUrls())
1203 return;
1204 auto urls = event->mimeData()->urls();
1205 foreach(auto url, urls)
1206 {
1207 if(url.isLocalFile())
1208 slotOpenFile(url.toLocalFile());
1209 }
1210}
1211
1212void MainWindow::slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
1213{
1214 //qDebug(log) << "MainWindow::slotSystemTrayIconActivated";
1215
1216 Q_UNUSED(reason)
1217#if defined(Q_OS_ANDROID)
1218 showMaximized();
1219#else
1220 switch(reason)
1221 {
1222 case QSystemTrayIcon::Trigger:
1223 {
1224 showNormal();
1225 activateWindow();
1226 break;
1227 }
1228 default:
1229 break;
1230 }
1231#endif
1232}
1233
1234void MainWindow::slotSystemTrayIconTypeChanged()
1235{
1236 //qDebug(log) << "MainWindow::slotSystemTrayIconTypeChanged:" << m_Parameter.GetEnableSystemTrayIcon();
1237 if(!QSystemTrayIcon::isSystemTrayAvailable())
1238 {
1239 qWarning(log) << "System tray is not available";
1240 return;
1241 }
1242
1243 if(!m_Parameter.GetEnableSystemTrayIcon())
1244 {
1245 qDebug(log) << "Disable system tray icon";
1246 return;
1247 }
1248
1249 if(m_TrayIcon)
1250 m_TrayIcon.reset();
1251
1252 m_TrayIcon = QSharedPointer<QSystemTrayIcon>(new QSystemTrayIcon(this));
1253 if(QSystemTrayIcon::isSystemTrayAvailable())
1254 {
1255 bool check = connect(
1256 m_TrayIcon.data(),
1257 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
1258 this,
1259 SLOT(slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason)));
1260 Q_ASSERT(check);
1261 m_TrayIcon->setIcon(this->windowIcon());
1262 m_TrayIcon->setToolTip(windowTitle());
1263 m_TrayIcon->show();
1264 } else
1265 qWarning(log) << "System tray is not available";
1266
1267 switch (m_Parameter.GetSystemTrayIconMenuType())
1268 {
1269 case CParameterApp::SystemTrayIconMenuType::MenuBar:
1270 {
1271 QMenu* pMenu = new QMenu(this);
1272 pMenu->addMenu(ui->menuRemote);
1273 pMenu->addMenu(ui->menuView);
1274 pMenu->addMenu(ui->menuTools);
1275 m_TrayIcon->setContextMenu(pMenu);
1276 break;
1277 }
1278 case CParameterApp::SystemTrayIconMenuType::Remote:
1279 m_TrayIcon->setContextMenu(ui->menuRemote);
1280 break;
1281 case CParameterApp::SystemTrayIconMenuType::RecentOpen:
1282 m_TrayIcon->setContextMenu(m_pRecentMenu);
1283 break;
1284 case CParameterApp::SystemTrayIconMenuType::View:
1285 m_TrayIcon->setContextMenu(ui->menuView);
1286 break;
1287 case CParameterApp::SystemTrayIconMenuType::Tools:
1288 m_TrayIcon->setContextMenu(ui->menuTools);
1289 break;
1290 case CParameterApp::SystemTrayIconMenuType::No:
1291 m_TrayIcon->setContextMenu(nullptr);
1292 break;
1293 }
1294}
1295
1296void MainWindow::slotEnableSystemTrayIcon()
1297{
1298 //qDebug(log) << "MainWindow::slotEnableSystemTryIcon()";
1299 if(m_TrayIcon)
1300 {
1301 if(!m_Parameter.GetEnableSystemTrayIcon())
1302 m_TrayIcon.reset();
1303 } else
1304 slotSystemTrayIconTypeChanged();
1305}
virtual CConnecter * LoadConnecter(const QString &szFile)
New CConnecter pointer from file, the owner is caller.
Definition Client.cpp:284
virtual CConnecter * CreateConnecter(const QString &id)
New CConnecter pointer, the owner is caller.
Definition Client.cpp:223
virtual int DeleteConnecter(CConnecter *p)
Delete CConnecter.
Definition Client.cpp:251
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
Get parameter settings widget.
Definition Client.cpp:400
virtual int SaveConnecter(CConnecter *pConnecter)
Accept connecter parameters to file.
Definition Client.cpp:324
virtual int SaveSettings(const QString szFile=QString())
Save Client parameters to file.
Definition Client.cpp:386
Connecter interface.
Definition Connecter.h:62
virtual int DisConnect()=0
Close connect.
virtual const QIcon Icon() const
Icon.
Definition Connecter.cpp:66
virtual int OpenDialogSettings(QWidget *parent=nullptr)
Open settings dialog.
Definition Connecter.cpp:85
virtual QWidget * GetViewer()=0
Get Viewer.
virtual const QString Description()
Description.
Definition Connecter.cpp:50
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get operate menu.
virtual int Connect()=0
Start connect.
virtual const QString Name()
Name.
Definition Connecter.cpp:45
void sigUpdateParameters(CConnecter *pConnecter)
Update parameters, notify application to save or show parameters.
List the connect of be existed.
static CICE * Instance()
Single instance.
Definition Ice.cpp:55
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file.
Definition Parameter.cpp:46
The plugin interface.
virtual const QString DisplayName() const
The plugin display name.
virtual const QString Description() const =0
Plugin description.
virtual const QString Protocol() const =0
Plugin Protocol.
The split view class.
The CViewTable class.
Definition ViewTable.h:16
The CView class.
Definition View.h:25
virtual int AddView(QWidget *pView)=0
virtual QWidget * GetCurrentView()=0
virtual int RemoveView(QWidget *pView)=0
The MainWindow class.
Definition mainwindow.h:33
virtual int onProcess(const QString &id, CPluginClient *pPlug) override
Process plugins.
void slotInformation(const QString &szInfo)
Show information.
int Connect(CConnecter *c, bool set, QString szFile=QString())
Connect.
void slotConnected()
[MainWindow slotConnected]
virtual void slotShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
Use message box display information.
void slotCloseView(const QWidget *pView)
[MainWindow slotConnected]
void slotCustomContextMenuRequested(const QPoint &pos)
MainWindow::slotCustomContextMenuRequested.