4#include "ui_mainwindow.h"
8#include "RabbitCommonDir.h"
9#include "RabbitCommonTools.h"
15#include "QUIWidget/QUIWidget.h"
19#include "FrmFullScreenToolBar.h"
20#include "ParameterDlgSettings.h"
21#include "FrmListRecent.h"
24#include "ViewSplitter.h"
30#include <QFontMetrics>
35#include <QApplication>
37#include <QDesktopServices>
38#include <QWidgetAction>
42#include <QKeySequence>
46#include <QLoggingCategory>
49static Q_LOGGING_CATEGORY(log,
"App.MainWindow")
50static Q_LOGGING_CATEGORY(logRecord, "App.
MainWindow.Record")
54 , m_pMenuActivityGroup(
nullptr)
55 , m_ptbMenuActivity(
nullptr)
56 , m_pActionOperateMenu(
nullptr)
57 , m_pTBOperate(
nullptr)
58 , m_pActionTBOperate(
nullptr)
59 , m_pDockListRecent(
nullptr)
60 , m_pDockActive(
nullptr)
61 , m_pFrmActive(
nullptr)
62 , m_pSecureLevel(
nullptr)
63 , m_pSignalStatus(
nullptr)
66 , m_pFullScreenToolBar(
nullptr)
67 , m_pRecentMenu(
nullptr)
68 , m_pDockFavorite(
nullptr)
69 , m_pFavoriteView(
nullptr)
70 , m_StatusBarMessage(this)
77 m_StatusBarMessage.setSizePolicy(QSizePolicy::Policy::Expanding,
78 QSizePolicy::Policy::Fixed);
80 this->statusBar()->addWidget(&m_StatusBarMessage);
82 m_SendRate.setToolTip(tr(
"Send rate"));
83 m_SendRate.setStatusTip(tr(
"Send rate"));
86 this->statusBar()->addPermanentWidget(&m_SendRate);
87 m_ReceivesRate.setToolTip(tr(
"Receives rate"));
88 m_ReceivesRate.setStatusTip(tr(
"Receives rate"));
91 this->statusBar()->addPermanentWidget(&m_ReceivesRate);
92 m_TotalSends.setToolTip(tr(
"Total sends"));
93 m_TotalSends.setStatusTip(tr(
"Total sends"));
96 this->statusBar()->addPermanentWidget(&m_TotalSends);
97 m_TotalReceives.setToolTip(tr(
"Total receives"));
98 m_TotalReceives.setStatusTip(tr(
"Total receives"));
101 this->statusBar()->addPermanentWidget(&m_TotalReceives);
103 check = connect(&m_Timer, SIGNAL(timeout()),
this, SLOT(slotTimeOut()));
106 m_pSecureLevel =
new QLabel(statusBar());
110 m_pSecureLevel->hide();
111 statusBar()->addPermanentWidget(m_pSecureLevel);
115 setAcceptDrops(
true);
117 RabbitCommon::CTools::AddStyleMenu(ui->menuTools);
118 ui->menuTools->addMenu(RabbitCommon::CTools::GetLogMenu(
this));
120 m_pRecentMenu =
new RabbitCommon::CRecentMenu(
122 QIcon::fromTheme(
"document-open-recent"),
124 check = connect(m_pRecentMenu, SIGNAL(recentFileTriggered(
const QString&)),
125 this, SLOT(slotOpenFile(
const QString&)));
127 check = connect(&m_Parameter, SIGNAL(sigRecentMenuMaxCountChanged(
int)),
128 m_pRecentMenu, SLOT(setMaxCount(
int)));
130 QAction* pRecentAction = ui->menuOperate->insertMenu(
131 ui->actionOpenListRecent, m_pRecentMenu);
132 pRecentAction->setStatusTip(pRecentAction->text());
133 QToolButton* tbRecent =
new QToolButton(ui->toolBar);
134 tbRecent->setFocusPolicy(Qt::NoFocus);
135 tbRecent->setPopupMode(QToolButton::InstantPopup);
136 tbRecent->setMenu(m_pRecentMenu);
137 tbRecent->setIcon(pRecentAction->icon());
138 tbRecent->setText(pRecentAction->text());
139 tbRecent->setToolTip(pRecentAction->toolTip());
140 tbRecent->setStatusTip(pRecentAction->statusTip());
141 ui->toolBar->insertWidget(ui->actionOpenListRecent, tbRecent);
145 ui->actionUpdate->setIcon(updater.windowIcon());
148 QToolButton* tbStart =
new QToolButton(ui->toolBar);
149 tbStart->setFocusPolicy(Qt::NoFocus);
150 tbStart->setPopupMode(QToolButton::InstantPopup);
152 tbStart->setMenu(ui->menuStart);
153 tbStart->setIcon(QIcon::fromTheme(
"media-playback-start"));
154 tbStart->setText(tr(
"Start"));
155 tbStart->setToolTip(tr(
"Start"));
156 tbStart->setStatusTip(tr(
"Start"));
157 ui->toolBar->insertWidget(ui->actionStop, tbStart);
161 check = connect(&m_Parameter, SIGNAL(sigReceiveShortCutChanged()),
162 this, SLOT(slotShortCut()));
164 slotSystemTrayIconTypeChanged();
165 check = connect(&m_Parameter, SIGNAL(sigSystemTrayIconTypeChanged()),
167 SLOT(slotSystemTrayIconTypeChanged()));
169 check = connect(&m_Parameter, SIGNAL(sigEnableSystemTrayIcon()),
170 this, SLOT(slotEnableSystemTrayIcon()));
172 check = connect(&m_Parameter, SIGNAL(sigEnableTabToolTipChanged()),
173 this, SLOT(slotUpdateName()));
175 check = connect(&m_Parameter, SIGNAL(sigEnableTabIconChanged()),
176 this, SLOT(slotUpdateName()));
179 m_Manager.EnumPlugins(
this);
180 check = connect(&m_Parameter, SIGNAL(sigStartByTypeChanged()),
181 this, SLOT(slotStartByType()));
184 m_pDockFavorite =
new QDockWidget(
this);
190 m_pDockFavorite->setTitleBarWidget(m_pFavoriteView->m_pDockTitleBar);
191 check = connect(m_pFavoriteView, SIGNAL(sigStart(
const QString&,
bool)),
192 this, SLOT(slotOpenFile(
const QString&,
bool)));
194 check = connect(m_pFavoriteView, SIGNAL(sigFavorite()),
195 this, SLOT(on_actionAdd_to_favorite_triggered()));
197 check = connect(&m_Parameter, SIGNAL(sigFavoriteEditChanged(
bool)),
198 m_pFavoriteView, SLOT(slotDoubleEditNode(
bool)));
200 emit m_Parameter.sigFavoriteEditChanged(m_Parameter.GetFavoriteEdit());
201 m_pDockFavorite->setWidget(m_pFavoriteView);
202 m_pDockFavorite->setWindowTitle(m_pFavoriteView->windowTitle());
205 m_pDockFavorite->setObjectName(
"dockFavorite");
206#if defined(Q_OS_ANDROID)
207 m_pDockFavorite->hide();
209 ui->menuView->addAction(m_pDockFavorite->toggleViewAction());
210 m_pDockFavorite->toggleViewAction()->setIcon(QIcon::fromTheme(
"emblem-favorite"));
211 addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, m_pDockFavorite);
214 m_pDockListRecent =
new QDockWidget(
this);
215 if(m_pDockListRecent)
221 if(pListRecent->m_pDockTitleBar)
222 m_pDockListRecent->setTitleBarWidget(
223 pListRecent->m_pDockTitleBar);
224 check = connect(pListRecent,
225 SIGNAL(sigStart(
const QString&,
bool)),
226 this, SLOT(slotOpenFile(
const QString&,
bool)));
228 check = connect(pListRecent, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
229 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
231 m_pDockListRecent->setWidget(pListRecent);
232 m_pDockListRecent->setWindowTitle(
233 pListRecent->windowTitle());
236 m_pDockListRecent->setObjectName(
"dockListRecent");
237#if defined(Q_OS_ANDROID)
238 m_pDockListRecent->hide();
240 ui->menuView->addAction(m_pDockListRecent->toggleViewAction());
241 m_pDockListRecent->toggleViewAction()->setIcon(QIcon::fromTheme(
"document-open-recent"));
242 tabifyDockWidget(m_pDockFavorite, m_pDockListRecent);
245 m_pDockActive =
new QDockWidget(
this);
249 m_Operates, m_Parameter,
250 ui->menuStart, ui->actionStop,
251 m_pRecentMenu, m_pDockActive);
253 m_pDockActive->setWidget(m_pFrmActive);
254 if(m_pFrmActive->m_pDockTitleBar)
255 m_pDockActive->setTitleBarWidget(
256 m_pFrmActive->m_pDockTitleBar);
257 m_pDockActive->setWindowTitle(m_pFrmActive->windowTitle());
258 check = connect(m_pFrmActive, SIGNAL(sigChanged(
COperate*)),
259 this, SLOT(slotOperateChanged(
COperate*)));
261 check = connect(m_pFrmActive, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
262 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
265 m_pDockActive->setObjectName(
"dockListActive");
266#if defined(Q_OS_ANDROID)
267 m_pDockActive->hide();
269 ui->menuView->addAction(m_pDockActive->toggleViewAction());
270 m_pDockActive->toggleViewAction()->setIcon(QIcon::fromTheme(
"network-wired"));
271 tabifyDockWidget(m_pDockFavorite, m_pDockActive);
274 QActionGroup* pGBView =
new QActionGroup(
this);
276 pGBView->addAction(ui->actionViewTab);
277 pGBView->addAction(ui->actionViewSplit);
279 qDebug(log) <<
"View type:" << m_Parameter.GetViewType();
280 if(CParameterApp::ViewType::Tab == m_Parameter.GetViewType()) {
281 ui->actionViewTab->setChecked(
true);
282 on_actionViewTab_triggered();
284 if(CParameterApp::ViewType::Splitter == m_Parameter.GetViewType()) {
285 ui->actionViewSplit->setChecked(
true);
286 on_actionViewSplit_triggered();
288 check = connect(&m_Parameter, &CParameterApp::sigViewTypeChanged,
294 m_pMenuActivityGroup =
new QActionGroup(ui->menuActivity);
295 m_ptbMenuActivity =
new QToolButton(ui->toolBar);
296 m_ptbMenuActivity->setFocusPolicy(Qt::NoFocus);
297 m_ptbMenuActivity->setPopupMode(QToolButton::InstantPopup);
298 m_ptbMenuActivity->setMenu(ui->menuActivity);
299 m_ptbMenuActivity->setIcon(ui->menuActivity->icon());
300 m_ptbMenuActivity->setText(ui->menuActivity->title());
301 m_ptbMenuActivity->setToolTip(ui->menuActivity->toolTip());
302 m_ptbMenuActivity->setStatusTip(ui->menuActivity->statusTip());
303 ui->toolBar->insertWidget(ui->actionTabBar_B, m_ptbMenuActivity);
312 SIGNAL(sigConnected()),
313 this, SLOT(slotSignalConnected()));
316 SIGNAL(sigDisconnected()),
317 this, SLOT(slotSignalDisconnected()));
320 SIGNAL(sigError(
const int,
const QString&)),
321 this, SLOT(slotSignalError(
const int,
const QString&)));
325 m_pSignalStatus =
new QPushButton();
326 m_pSignalStatus->setToolTip(tr(
"ICE signal status"));
327 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
328 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
329 slotSignalDisconnected();
330 statusBar()->addPermanentWidget(m_pSignalStatus);
333 if(m_Parameter.GetSaveMainWindowStatus())
335 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
336 QSettings::IniFormat);
338 = set.value(
"MainWindow/Status/Geometry").toByteArray();
339 if(!geometry.isEmpty())
340 restoreGeometry(geometry);
342 QByteArray state = set.value(
"MainWindow/Status/State").toByteArray();
346 ui->actionTabBar_B->setChecked(m_Parameter.GetTabBar());
347 on_actionTabBar_B_toggled(m_Parameter.GetTabBar());
348 ui->actionStatus_bar_S->setChecked(m_Parameter.GetStatusBar());
349 statusBar()->setVisible(m_Parameter.GetStatusBar());
350 ui->actionMain_menu_bar_M->setChecked(m_Parameter.GetMenuBar());
351 menuBar()->setVisible(m_Parameter.GetMenuBar());
352 ui->actionToolBar_T->setChecked(!ui->toolBar->isHidden());
353 if(!m_Parameter.GetMenuBar())
354 ui->toolBar->insertAction(ui->actionTabBar_B,
355 ui->actionMain_menu_bar_M);
358 slotEnableSystemTrayIcon();
360 LoadOperateLasterClose();
363MainWindow::~MainWindow()
365 qDebug(log) <<
"MainWindow::~MainWindow()";
366 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
370void MainWindow::SetView(
CView* pView)
372 qDebug(log) << Q_FUNC_INFO;
376 m_pView->disconnect();
379 setCentralWidget(m_pView);
383 check = connect(m_pView, SIGNAL(sigCloseView(
const QWidget*)),
386 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
387 this, SLOT(slotCurrentViewChanged(
const QWidget*)));
390 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
391 m_pFrmActive, SLOT(slotViewChanged(
const QWidget*)));
394 check = connect(m_pView, SIGNAL(customContextMenuRequested(
const QPoint&)),
398 foreach (
auto c, m_Operates) {
399 m_pView->
AddView(c->GetViewer());
400 m_pView->SetWidowsTitle(
401 c->GetViewer(), c->Name(), c->Icon(), c->Description());
403 m_pView->SetVisibleTab(m_Parameter.GetTabBar());
406void MainWindow::on_actionViewTab_triggered()
408 qDebug(log) << Q_FUNC_INFO;
409 if(!ui->actionViewTab->isChecked())
return;
410 m_Parameter.SetViewType(CParameterApp::ViewType::Tab);
414void MainWindow::on_actionViewSplit_triggered()
416 qDebug(log) << Q_FUNC_INFO;
417 if(!ui->actionViewSplit->isChecked())
return;
418 m_Parameter.SetViewType(CParameterApp::ViewType::Splitter);
422void MainWindow::on_actionAbout_triggered()
425 CDlgAbout *about =
new CDlgAbout(
this);
426 QIcon icon = QIcon::fromTheme(
"app");
428 auto sizeList = icon.availableSizes();
429 if(!sizeList.isEmpty()) {
430 QPixmap p = icon.pixmap(*sizeList.begin());
431 about->m_AppIcon = p.toImage();
434 about->m_szCopyrightStartTime =
"2020";
435 about->m_szVersionRevision = RabbitRemoteControl_REVISION;
436 about->m_szDetails = m_Manager.Details();
437 RC_SHOW_WINDOW(about);
441void MainWindow::on_actionUpdate_triggered()
443 if(!qEnvironmentVariable(
"SNAP").isEmpty()) {
444 QDesktopServices::openUrl(QUrl(
"https://snapcraft.io/rabbitremotecontrol"));
445 }
else if(!qEnvironmentVariable(
"FLATPAK_ID").isEmpty()) {
446 QDesktopServices::openUrl(QUrl(
"https://flathub.org/apps/io.github.KangLin.RabbitRemoteControl"));
449 CFrmUpdater* m_pfrmUpdater =
new CFrmUpdater();
450 QIcon icon = QIcon::fromTheme(
"app");
452 auto sizeList = icon.availableSizes();
453 if(!sizeList.isEmpty()) {
454 QPixmap p = icon.pixmap(*sizeList.begin());
455 m_pfrmUpdater->SetTitle(p.toImage());
458 m_pfrmUpdater->SetInstallAutoStartup();
459 RC_SHOW_WINDOW(m_pfrmUpdater);
464void MainWindow::on_actionFull_screen_F_triggered()
466 CView* pView = qobject_cast<CView*>(this->centralWidget());
469 pView->SetFullScreen(!isFullScreen());
474 qDebug(log) <<
"Exit full screen";
475 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-fullscreen"));
476 ui->actionFull_screen_F->setText(tr(
"Full screen(&F)"));
477 ui->actionFull_screen_F->setToolTip(tr(
"Full screen"));
478 ui->actionFull_screen_F->setStatusTip(tr(
"Full screen"));
479 ui->actionFull_screen_F->setWhatsThis(tr(
"Full screen"));
481 ui->toolBar->setVisible(m_FullState.toolBar);
482 ui->statusbar->setVisible(m_FullState.statusbar);
483 ui->menubar->setVisible(m_FullState.menubar);
485 m_pDockActive->setVisible(m_FullState.dockListActive);
486 m_pDockListRecent->setVisible(m_FullState.dockListRecent);
487 m_pDockFavorite->setVisible(m_FullState.dockFavorite);
489 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
492 pDockDebugLog->setVisible(m_FullState.dockDebugLog);
495 if(m_pFullScreenToolBar)
498 m_pFullScreenToolBar->close();
499 m_pFullScreenToolBar =
nullptr;
502 emit sigShowNormal();
504 this->activateWindow();
509 qDebug(log) <<
"Entry full screen";
510 emit sigFullScreen();
512 this->showFullScreen();
514 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-restore"));
515 ui->actionFull_screen_F->setText(tr(
"Exit full screen(&E)"));
516 ui->actionFull_screen_F->setToolTip(tr(
"Exit full screen"));
517 ui->actionFull_screen_F->setStatusTip(tr(
"Exit full screen"));
518 ui->actionFull_screen_F->setWhatsThis(tr(
"Exit full screen"));
520 m_FullState.toolBar = ui->toolBar->isVisible();
521 ui->toolBar->setVisible(
false);
522 m_FullState.statusbar = ui->statusbar->isVisible();
523 ui->statusbar->setVisible(
false);
524 m_FullState.menubar = ui->menubar->isVisible();
525 ui->menubar->setVisible(
false);
527 m_FullState.dockListActive = m_pDockActive->isVisible();
528 m_pDockActive->setVisible(
false);
529 m_FullState.dockListRecent = m_pDockListRecent->isVisible();
530 m_pDockListRecent->setVisible(
false);
531 m_FullState.dockFavorite = m_pDockFavorite->isVisible();
532 m_pDockFavorite->setVisible(
false);
534 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
537 m_FullState.dockDebugLog = pDockDebugLog->isVisible();
538 pDockDebugLog->setVisible(
false);
541 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
544 QScreen* pScreen = qApp->primaryScreen();
546 QPoint pos(pScreen->geometry().left()
547 + (pScreen->geometry().width()
548 - m_pFullScreenToolBar->frameGeometry().width()) / 2,
549 pScreen->geometry().top());
550 qDebug(log) <<
"Primary screen geometry:" << pScreen->geometry()
551 <<
"availableGeometry:" << pScreen->availableGeometry()
552 << pos << mapToGlobal(pos);
553 m_pFullScreenToolBar->move(pos);
555 bool check = connect(m_pFullScreenToolBar, SIGNAL(sigExitFullScreen()),
556 this, SLOT(on_actionFull_screen_F_triggered()));
558 check = connect(m_pFullScreenToolBar, SIGNAL(sigExit()),
559 this, SLOT(on_actionExit_E_triggered()));
562 check = connect(
this, SIGNAL(sigOperateMenuChanged(QAction*)),
563 m_pFullScreenToolBar,
564 SLOT(slotOperateMenuChanged(QAction*)));
567 m_pFullScreenToolBar->show();
570void MainWindow::slotViewerFocusIn(QWidget *pView)
572 COperate* c = qobject_cast<COperate*>(sender());
573 qDebug(log) << Q_FUNC_INFO <<
"Focus:" << c << pView;
579void MainWindow::slotOperateChanged(
COperate *o)
586void MainWindow::slotCurrentViewChanged(
const QWidget* pView)
588 qDebug(log) << Q_FUNC_INFO;
594 foreach(
auto o, m_Operates) {
597 SetStatsVisible(o->GetStats());
598 foreach (
auto a, ui->menuActivity->actions()) {
599 if(a->data().value<
COperate*>() == o)
606void MainWindow::EnableMenu(
bool bEnable)
608 qDebug(log) << Q_FUNC_INFO << bEnable;
609 ui->actionClone->setEnabled(bEnable);
610 ui->actionAdd_to_favorite->setEnabled(bEnable);
611 ui->actionStop->setEnabled(bEnable);
612 ui->actionTabBar_B->setEnabled(bEnable);
613 ui->menuActivity->setEnabled(bEnable);
614 m_ptbMenuActivity->setEnabled(bEnable);
615 slotLoadOperateMenu();
618void MainWindow::slotMenuActivity()
620 QAction* pAction = qobject_cast<QAction*>(sender());
625 slotOperateChanged(p);
628void MainWindow::slotLoadOperateMenu()
630 qDebug(log) << Q_FUNC_INFO;
632 if(m_pActionOperateMenu) {
633 ui->menuOperate->removeAction(m_pActionOperateMenu);
634 m_pActionOperateMenu =
nullptr;
636 ui->toolBar->removeAction(m_pActionTBOperate);
642 qDebug(log) <<
"The current view is empty";
645 foreach(
auto op, m_Operates)
647 if(op->GetViewer() == pWin)
649 qDebug(log) <<
"Load plugin menu";
650 auto m = op->GetMenu(ui->menuTools);
653 m_pActionOperateMenu = ui->menuOperate->insertMenu(ui->actionAdd_to_favorite, m);
656 m_pTBOperate =
new QToolButton(ui->toolBar);
658 m_pTBOperate->setFocusPolicy(Qt::NoFocus);
659 m_pTBOperate->setPopupMode(QToolButton::InstantPopup);
660 m_pTBOperate->setMenu(m);
661 m_pTBOperate->setIcon(m->icon());
662 m_pTBOperate->setText(m->title());
663 m_pTBOperate->setToolTip(m->toolTip());
664 m_pTBOperate->setStatusTip(m->statusTip());
665 m_pTBOperate->show();
666 m_pActionTBOperate = ui->toolBar->insertWidget(ui->actionAdd_to_favorite, m_pTBOperate);
668 emit sigOperateMenuChanged(m_pActionOperateMenu);
685 qDebug(log) <<
"The current view is empty";
688 foreach(
auto p, m_Operates)
692 qDebug(log) <<
"Load plugin menu";
693 auto m = p->
GetMenu(ui->menuTools);
701void MainWindow::on_actionExit_E_triggered()
706void MainWindow::keyReleaseEvent(QKeyEvent *event)
712 on_actionFull_screen_F_triggered();
715 QMainWindow::keyReleaseEvent(event);
718void MainWindow::slotUpdateParameters(
COperate *pOperate)
723void MainWindow::on_actionClone_triggered()
727 foreach(
auto pOperate, m_Operates)
731 QString szFile = pOperate->GetSettingsFile();
733 if(!pOperate)
return;
734 Start(pOperate,
false, szFile);
740void MainWindow::slotOpenFile(
const QString& szFile,
bool bOpenSettings)
742 if(szFile.isEmpty())
return;
746 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
750 Start(p, bOpenSettings, szFile);
753void MainWindow::on_actionOpenRRCFile_triggered()
755 QString szFile = QFileDialog::getOpenFileName(
757 tr(
"Open rabbit remote control file"),
758 RabbitCommon::CDir::Instance()->GetDirUserData(),
759 tr(
"Rabbit remote control Files (*.rrc);;All files(*.*)"));
760 if(szFile.isEmpty())
return;
765 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
772void MainWindow::slotStart()
774 if(
nullptr == m_pView)
779 QAction* pAction = qobject_cast<QAction*>(this->sender());
782 if(
nullptr == p)
return;
798 qDebug(log) <<
"MainWindow::Start: set:" << set <<
"; File:" << szFile;
801 bool check = connect(pOperate, SIGNAL(sigRunning()),
804 check = connect(pOperate, SIGNAL(sigStop()),
805 this, SLOT(slotStop()));
807 check = connect(pOperate, SIGNAL(sigFinished()),
808 this, SLOT(slotFinished()));
810 check = connect(pOperate, SIGNAL(sigError(
const int,
const QString &)),
811 this, SLOT(slotError(
const int,
const QString&)));
813 check = connect(pOperate, SIGNAL(sigShowMessageBox(
const QString&,
const QString&,
814 const QMessageBox::Icon&)),
816 const QMessageBox::Icon&)));
818 check = connect(pOperate, SIGNAL(sigInformation(
const QString&)),
821 check = connect(pOperate, SIGNAL(sigUpdateName(
const QString&)),
822 this, SLOT(slotUpdateName(
const QString&)));
824 check = connect(pOperate, SIGNAL(sigUpdateParameters(
COperate*)),
825 this, SLOT(slotUpdateParameters(
COperate*)));
833 case QDialog::Rejected:
836 case QDialog::Accepted:
843 szFile = pOperate->GetSettingsFile();
845 pOperate->SetSettingsFile(szFile);
851 m_pRecentMenu->addRecentFile(szFile, pOperate->
Name());
853 if(!pOperate->
Name().isEmpty())
857 if(-1 < m_Operates.indexOf(pOperate)) {
859 m_pView->SetCurrentView(pOperate->
GetViewer());
865 m_pView->SetWidowsTitle(pOperate->
GetViewer(), pOperate->
Name(),
868 check = connect(pOperate, SIGNAL(sigViewerFocusIn(QWidget*)),
869 this, SLOT(slotViewerFocusIn(QWidget*)));
872 m_Operates.push_back(pOperate);
875 m_pFrmActive->slotLoad();
879 vOperate.setValue(pOperate);
880 QAction* m_pActionmenuActivity = ui->menuActivity->addAction(
881 pOperate->
Icon(), pOperate->
Name(),
this, SLOT(slotMenuActivity()));
882 m_pActionmenuActivity->setData(vOperate);
883 m_pActionmenuActivity->setCheckable(
true);
884 m_pMenuActivityGroup->addAction(m_pActionmenuActivity);
885 m_pActionmenuActivity->setChecked(
true);
888 nRet = pOperate->
Start();
900 COperate* p = qobject_cast<COperate*>(sender());
924 m->addAction(ui->actionClone);
926 slotLoadOperateMenu();
929 qDebug(log) << Q_FUNC_INFO << p->
Name();
935 qDebug(log) <<
"MainWindow::slotCloseView" << pView;
937 foreach(
auto p, m_Operates)
948void MainWindow::on_actionStop_triggered()
950 qDebug(log) << Q_FUNC_INFO;
957void MainWindow::slotStop()
959 COperate* pOperate = qobject_cast<COperate*>(sender());
960 if(!pOperate)
return;
961 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
967void MainWindow::slotFinished()
969 COperate* pOperate = qobject_cast<COperate*>(sender());
970 if(!pOperate)
return;
972 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
973 foreach(
auto a, ui->menuActivity->actions()) {
976 ui->menuActivity->removeAction(a);
977 m_pMenuActivityGroup->removeAction(a);
980 foreach(
auto p, m_Operates)
985 m_Operates.removeAll(p);
987 m_pFrmActive->slotLoad();
992 if(m_Operates.isEmpty())
993 if(m_pActionOperateMenu) {
994 ui->menuTools->removeAction(m_pActionOperateMenu);
995 ui->toolBar->removeAction(m_pActionOperateMenu);
996 m_pActionOperateMenu =
nullptr;
1004void SetIndicator(QLabel* label, QColor color,
int size)
1006 QString min_width = QString(
"min-width: %1px;").arg(size);
1007 QString min_height = QString(
"min-height: %1px;").arg(size);
1008 QString max_width = QString(
"max-width: %1px;").arg(size);
1009 QString max_height = QString(
"max-height: %1px;").arg(size);
1011 QString border_radius = QString(
"border-radius: %1px;").arg(size / 2);
1012 QString border = QString(
"border:1px solid ") + color.name() +
";";
1014 QString background =
"background-color: ";
1015 background += color.name() +
";";
1016 QString SheetStyle = min_width + min_height + max_width + max_height + border_radius + border + background;
1017 label->setStyleSheet(SheetStyle);
1020void MainWindow::SetSecureLevel(
COperate* o)
1022 if(!m_pSecureLevel)
return;
1024 if(COperate::SecurityLevel::No == o->GetSecurityLevel())
1026 m_pSecureLevel->hide();
1029 SetIndicator(m_pSecureLevel, o->GetSecurityLevelColor(), statusBar()->height() / 2);
1030 m_pSecureLevel->setToolTip(o->GetSecurityLevelString());
1031 m_pSecureLevel->setStatusTip(o->GetSecurityLevelString());
1032 m_pSecureLevel->show();
1034 m_pSecureLevel->hide();
1037void MainWindow::slotSignalConnected()
1039 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Connected"));
1040 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1041 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1043 m_pSignalStatus->setIcon(QIcon::fromTheme(
"newwork-wired"));
1046void MainWindow::slotSignalDisconnected()
1048 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Disconnected"));
1049 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1050 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1052 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wireless"));
1055void MainWindow::slotSignalError(
const int nError,
const QString &szInfo)
1057 slotSignalDisconnected();
1058 slotError(nError, szInfo);
1061void MainWindow::slotSignalPushButtonClicked(
bool checked)
1071void MainWindow::slotError(
const int nError,
const QString &szInfo)
1074 slotStatusMessage(szInfo, MessageLevel::Error);
1078 const QString &title,
const QString &message,
1079 const QMessageBox::Icon &icon)
1082 if(!m_Parameter.GetMessageBoxDisplayInformation())
1085 QMessageBox msg(icon, title, message, QMessageBox::Ok,
this);
1086 QCheckBox* cb =
new QCheckBox(
1087 tr(
"Use message box to display information"),
this);
1088 cb->setChecked(
true);
1089 msg.setCheckBox(cb);
1090 RC_SHOW_WINDOW(&msg);
1091 if(!cb->isChecked())
1093 m_Parameter.SetMessageBoxDisplayInformation(
false);
1100 slotStatusMessage(szInfo, MessageLevel::Normal);
1103void MainWindow::slotStatusMessage(QString szMessage, MessageLevel level)
1106 switch ((MessageLevel)level) {
1107 case MessageLevel::Error:
1108 pe.setColor(QPalette::WindowText, Qt::red);
1110 case MessageLevel::Warning:
1111 pe.setColor(QPalette::WindowText, Qt::yellow);
1117 m_StatusBarMessage.setPalette(pe);
1118 m_StatusBarMessage.setToolTip(szMessage);
1119 QFontMetrics metrics(m_StatusBarMessage.font());
1121 szMessage = metrics.elidedText(szMessage, Qt::ElideRight, m_StatusBarMessage.width());
1123 m_StatusBarMessage.setText(szMessage);
1126void MainWindow::slotUpdateName()
1128 foreach (
auto p, m_Operates)
1137void MainWindow::slotUpdateName(
const QString& szName)
1139 COperate* p = qobject_cast<COperate*>(sender());
1141 m_pView->SetWidowsTitle(p->
GetViewer(), szName,
1143 foreach(
auto a, ui->menuActivity->actions()) {
1144 if(a->data().value<
COperate*>() == p) {
1151QAction* MainWindow::GetStartAction(QMenu* pMenu,
CPlugin *pPlug)
1155 szTitle = pPlug->
Protocol() +
": ";
1157 QAction* p = pMenu->addAction(szTitle);
1160 p->setData(pPlug->
Id());
1161 p->setIcon(pPlug->Icon());
1165void MainWindow::slotStartByType()
1167 qDebug(log) << Q_FUNC_INFO;
1168 auto m = ui->menuStart->actions();
1169 foreach(
auto a, m) {
1172 foreach (
auto a, m_MenuStartByType) {
1175 ui->menuStart->clear();
1176 m_MenuStartByType.clear();
1183 QMenu* m = ui->menuStart;
1184 if(m_Parameter.GetStartByType()) {
1185 auto it = m_MenuStartByType.find(pPlugin->Type());
1186 if(it == m_MenuStartByType.end()) {
1187 m =
new QMenu(pPlugin->TypeName(pPlugin->Type()), ui->menuStart);
1188 m_MenuStartByType[pPlugin->Type()] = m;
1189 ui->menuStart->addMenu(m);
1194 QAction* p = GetStartAction(m, pPlugin);
1196 check = connect(p, SIGNAL(triggered()),
this, SLOT(slotStart()));
1201void MainWindow::closeEvent(QCloseEvent *event)
1203 qDebug(log) <<
"MainWindow::closeEvent()";
1205 if(m_Parameter.GetSaveMainWindowStatus())
1207 on_actionFull_screen_F_triggered();
1209 SaveOperateLasterClose();
1211 foreach (
auto it, m_Operates)
1214 emit it->sigUpdateParameters(it);
1218 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
1219 QSettings::IniFormat);
1220 if(m_Parameter.GetSaveMainWindowStatus())
1222 set.setValue(
"MainWindow/Status/Geometry", saveGeometry());
1223 set.setValue(
"MainWindow/Status/State", saveState());
1225 m_Parameter.SetTabBar(ui->actionTabBar_B->isChecked());
1226 m_Parameter.SetMenuBar(menuBar()->isVisible());
1227 m_Parameter.SetStatusBar(statusBar()->isVisible());
1229 set.remove(
"MainWindow/Status/Geometry");
1230 set.remove(
"MainWindow/Status/State");
1236 QMainWindow::closeEvent(event);
1242int MainWindow::LoadOperateLasterClose()
1244 if(!m_Parameter.GetOpenLasterClose())
1247 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1248 + QDir::separator() +
"LasterClose.dat");
1249 if(f.open(QFile::ReadOnly))
1255 if(szFile.isEmpty())
1257 slotOpenFile(szFile);
1264int MainWindow::SaveOperateLasterClose()
1266 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1267 + QDir::separator() +
"LasterClose.dat");
1268 f.open(QFile::WriteOnly);
1269 if(m_Parameter.GetOpenLasterClose())
1272 foreach(
auto it, m_Operates)
1274 d << it->GetSettingsFile();
1281void MainWindow::on_actionTabBar_B_toggled(
bool bShow)
1285 m_pView->SetVisibleTab(bShow);
1286 m_Parameter.SetTabBar(bShow);
1289 m_pDockActive->setVisible(bShow);
1293void MainWindow::on_actionMain_menu_bar_M_toggled(
bool checked)
1295 qDebug(log) << Q_FUNC_INFO << checked;
1296 if(ui->toolBar->isHidden() && !checked)
1298 if( QMessageBox::StandardButton::Yes
1299 == QMessageBox::information(
this, tr(
"Hide menu bar"),
1300 tr(
"The menu bar will be hidden, the tool bar must be showed."),
1301 QMessageBox::StandardButton::Yes
1302 | QMessageBox::StandardButton::No))
1304 ui->actionToolBar_T->setChecked(
true);
1306 ui->actionMain_menu_bar_M->setChecked(
true);
1311 menuBar()->setVisible(checked);
1312 m_Parameter.SetMenuBar(checked);
1315 ui->toolBar->removeAction(ui->actionMain_menu_bar_M);
1319 ui->toolBar->insertAction(ui->actionTabBar_B,
1320 ui->actionMain_menu_bar_M);
1324void MainWindow::on_actionToolBar_T_toggled(
bool checked)
1326 qDebug(log) << Q_FUNC_INFO << checked;
1327 if(menuBar()->isHidden() && !checked)
1329 if( QMessageBox::StandardButton::Yes
1330 == QMessageBox::information(
this, tr(
"Hide tool bar"),
1331 tr(
"The tool bar will be hidden, the menu bar must be showed."),
1332 QMessageBox::StandardButton::Yes
1333 | QMessageBox::StandardButton::No))
1335 ui->actionMain_menu_bar_M->setChecked(
true);
1337 ui->actionToolBar_T->setChecked(
true);
1341 ui->toolBar->setVisible(checked);
1344void MainWindow::on_actionStatus_bar_S_toggled(
bool checked)
1346 statusBar()->setVisible(checked);
1347 m_Parameter.SetStatusBar(checked);
1351void MainWindow::on_actionSettings_triggered()
1354 if(CParameterDlgSettings::Accepted == RC_SHOW_WINDOW(&set))
1362void MainWindow::slotShortCut()
1364 if(m_Parameter.GetReceiveShortCut())
1366 setFocusPolicy(Qt::WheelFocus);
1367#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
1368 ui->actionFull_screen_F->setShortcut(
1369 QKeySequence(QKeyCombination(Qt::CTRL, Qt::Key_R),
1370 QKeyCombination(Qt::Key_F)));
1371 ui->actionScreenshot->setShortcut(
1372 QKeySequence(QKeyCombination(Qt::CTRL, Qt::Key_R),
1373 QKeyCombination(Qt::Key_S)));
1375 ui->actionFull_screen_F->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R, Qt::Key_F));
1376 ui->actionScreenshot->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R, Qt::Key_S));
1379 setFocusPolicy(Qt::NoFocus);
1380 ui->actionFull_screen_F->setShortcut(QKeySequence());
1381 ui->actionScreenshot->setShortcut(QKeySequence());
1385void MainWindow::on_actionOpenListRecent_triggered()
1389 bool check = connect(p, SIGNAL(sigStart(
const QString&,
bool)),
1390 this, SLOT(slotOpenFile(
const QString&,
bool)));
1392 check = connect(p, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
1393 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
1398 d.setWindowIcon(windowIcon());
1399 d.setWindowTitle(p->windowTitle());
1400 QGridLayout* pLayout =
new QGridLayout(&d);
1402 pLayout->addWidget(p);
1403 check = connect(p, SIGNAL(destroyed()), &d, SLOT(reject()));
1404 d.setLayout(pLayout);
1409void MainWindow::on_actionAdd_to_favorite_triggered()
1411 if(!m_pView || !m_pFavoriteView)
return;
1413 foreach(
auto c, m_Operates)
1418 c->
Icon(), c->GetSettingsFile());
1423void MainWindow::dragEnterEvent(QDragEnterEvent *event)
1425 qDebug(log) <<
"dragEnterEvent";
1427 if(event->mimeData()->hasUrls())
1429 qWarning(log) <<
event->mimeData()->urls();
1430 event->acceptProposedAction();
1434void MainWindow::dragMoveEvent(QDragMoveEvent *event)
1439void MainWindow::dropEvent(QDropEvent *event)
1441 qDebug(log) <<
"dropEvent";
1442 if(!event->mimeData()->hasUrls())
1444 auto urls =
event->mimeData()->urls();
1445 foreach(
auto url, urls)
1447 if(url.isLocalFile())
1448 slotOpenFile(url.toLocalFile());
1452void MainWindow::slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
1457#if defined(Q_OS_ANDROID)
1462 case QSystemTrayIcon::Trigger:
1474void MainWindow::slotSystemTrayIconTypeChanged()
1477 if(!QSystemTrayIcon::isSystemTrayAvailable())
1479 qWarning(log) <<
"System tray is not available";
1483 if(!m_Parameter.GetEnableSystemTrayIcon())
1485 qDebug(log) <<
"Disable system tray icon";
1492 m_TrayIcon = QSharedPointer<QSystemTrayIcon>(
new QSystemTrayIcon(
this));
1493 if(QSystemTrayIcon::isSystemTrayAvailable())
1495 bool check = connect(
1497 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
1499 SLOT(slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason)));
1501 m_TrayIcon->setIcon(this->windowIcon());
1502 m_TrayIcon->setToolTip(windowTitle());
1505 qWarning(log) <<
"System tray is not available";
1507 switch (m_Parameter.GetSystemTrayIconMenuType())
1509 case CParameterApp::SystemTrayIconMenuType::MenuBar:
1511 QMenu* pMenu =
new QMenu(
this);
1512 pMenu->addMenu(ui->menuOperate);
1513 pMenu->addMenu(ui->menuView);
1514 pMenu->addMenu(ui->menuTools);
1515 m_TrayIcon->setContextMenu(pMenu);
1518 case CParameterApp::SystemTrayIconMenuType::Operate:
1519 m_TrayIcon->setContextMenu(ui->menuOperate);
1521 case CParameterApp::SystemTrayIconMenuType::RecentOpen:
1522 m_TrayIcon->setContextMenu(m_pRecentMenu);
1524 case CParameterApp::SystemTrayIconMenuType::View:
1525 m_TrayIcon->setContextMenu(ui->menuView);
1527 case CParameterApp::SystemTrayIconMenuType::Tools:
1528 m_TrayIcon->setContextMenu(ui->menuTools);
1530 case CParameterApp::SystemTrayIconMenuType::No:
1531 m_TrayIcon->setContextMenu(
nullptr);
1536void MainWindow::slotEnableSystemTrayIcon()
1541 if(!m_Parameter.GetEnableSystemTrayIcon())
1544 slotSystemTrayIconTypeChanged();
1547void MainWindow::slotTimeOut()
1551 qDebug(log) <<
"The current view is empty";
1554 foreach(
auto p, m_Operates)
1556 if(p->GetViewer() == pWin)
1558 auto pStats = p->GetStats();
1560 SetStatsVisible(
false);
1563 SetStatsVisible(
true);
1564 pStats->slotCalculating();
1565 m_TotalSends.setText(
"⇈ " + pStats->TotalSends());
1566 m_TotalReceives.setText(
"⇊ " + pStats->TotalReceives());
1567 m_SendRate.setText(
"↑ " + pStats->SendRate());
1568 m_ReceivesRate.setText(
"↓ " + pStats->ReceiveRate());
1574void MainWindow::SetStatsVisible(
bool visible)
1576 if(m_SendRate.isVisible() == visible)
1578 m_SendRate.setVisible(visible);
1579 m_ReceivesRate.setVisible(visible);
1580 m_TotalSends.setVisible(visible);
1581 m_TotalReceives.setVisible(visible);
1584void MainWindow::StartTimer()
1586 bool bStart =
false;
1587 int nMinInterval = 60;
1588 foreach(
auto o, m_Operates) {
1589 if(o && o->GetStats()) {
1590 nMinInterval = qMin(nMinInterval, o->GetStats()->
GetInterval());
1595 m_Timer.start(1000);
static CICE * Instance()
Single instance
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
得到设置参数窗口
virtual int EnumPlugins(Handle *handle)
Enum plugins
virtual COperate * CreateOperate(const QString &id)
新建 COperate 指针,所有者是调用者。 当不在使用时,调用者必调用 DeteleOperate() 须释放指针。 调用者必须连接信号 COperate::sigFinished 。 释放指针 (...
virtual COperate * LoadOperate(const QString &szFile)
从文件中新建 COperate 指针,所有者是调用者。 当不再使用时,调用者必须负责调用 DeleteOperate() 删除此指针。 调用者必须连接信号 COperate::sigFinished 。...
virtual int DeleteOperate(COperate *p)
Delete COperate
virtual int SaveOperate(COperate *pOperate)
保存连接参数到文件
virtual int SaveSettings(const QString szFile=QString())
保存客户端参数到文件
virtual int OpenDialogSettings(QWidget *parent=nullptr)
打开设置对话框
virtual const QIcon Icon() const
Icon
virtual QWidget * GetViewer()=0
得到显示视图
virtual const QString Name()
Name
virtual const QString Description()
Description
void sigUpdateParameters(COperate *pOperate)
更新参数,通知应用程序保存或显示参数
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get menu
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file
virtual const QString Id()
标识。默认: Type() + ":" + Protocol() + ":" + Name()
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Protocol() const =0
协议
virtual const QString Description() const =0
描述
int GetInterval()
Get interval.
virtual int AddView(QWidget *pView)=0
virtual QWidget * GetCurrentView()=0
virtual int RemoveView(QWidget *pView)=0
int Start(COperate *pOperate, bool set, QString szFile=QString())
Start
virtual int onProcess(const QString &id, CPlugin *pPlugin) override
Process plugins
void slotInformation(const QString &szInfo)
显示信息。暂时在状态栏显示。
virtual void slotShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
用消息对话框(QMessageBox)显示信息
void slotRunning()
[MainWindow slotRunning]
void slotCloseView(const QWidget *pView)
[MainWindow slotRunning]
void slotCustomContextMenuRequested(const QPoint &pos)
MainWindow::slotCustomContextMenuRequested