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