10#include <QDesktopServices>
11#include <QWidgetAction>
15#include <QKeySequence>
19#include <QLoggingCategory>
21#include <QInputMethod>
22#include <QGuiApplication>
24#include "mainwindow.h"
25#include "ui_mainwindow.h"
27 #include "FrmUpdater.h"
29#include "RabbitCommonDir.h"
30#include "RabbitCommonTools.h"
36 #include "QUIWidget/QUIWidget.h"
40#include "FrmFullScreenToolBar.h"
41#include "ParameterDlgSettings.h"
44#include "ViewSplitter.h"
50static Q_LOGGING_CATEGORY(log,
"App.MainWindow")
51static Q_LOGGING_CATEGORY(logRecord, "App.
MainWindow.Record")
55 , m_pToolBarMenuAction(
nullptr)
56 , m_pMenuActivityGroup(
nullptr)
57 , m_ptbMenuActivity(
nullptr)
58 , m_pActionOperateMenu(
nullptr)
59 , m_pTBOperate(
nullptr)
60 , m_pActionTBOperate(
nullptr)
61 , m_pDockRecent(
nullptr)
63 , m_pDockActive(
nullptr)
64 , m_pFrmActive(
nullptr)
65 , m_pSecureLevel(
nullptr)
66 , m_pSignalStatus(
nullptr)
69 , m_pFullScreenToolBar(
nullptr)
70 , m_pRecentMenu(
nullptr)
71 , m_pDockFavorite(
nullptr)
72 , m_pFavoriteView(
nullptr)
73 , m_StatusBarMessage(this)
80 ui->actionKeyboard->setVisible(
false);
82 bool bVisible = (
nullptr != QGuiApplication::inputMethod());
83 ui->actionKeyboard->setVisible(bVisible);
84 ui->actionKeyboard->setEnabled(bVisible);
88 this, [&](
COperate* pOperate,
bool bOpenSettingsDialog) {
89 Start(pOperate, bOpenSettingsDialog);
93#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) && !defined(Q_OS_MACOS)
95 setWindowIcon(QIcon(
":/images/app"));
112 this->statusBar()->addPermanentWidget(&m_StatusBarMessage);
114 m_SendRate.setToolTip(tr(
"Send rate"));
115 m_SendRate.setStatusTip(tr(
"Send rate"));
118 this->statusBar()->addPermanentWidget(&m_SendRate);
119 m_ReceivesRate.setToolTip(tr(
"Receives rate"));
120 m_ReceivesRate.setStatusTip(tr(
"Receives rate"));
123 this->statusBar()->addPermanentWidget(&m_ReceivesRate);
124 m_TotalSends.setToolTip(tr(
"Total sends"));
125 m_TotalSends.setStatusTip(tr(
"Total sends"));
128 this->statusBar()->addPermanentWidget(&m_TotalSends);
129 m_TotalReceives.setToolTip(tr(
"Total receives"));
130 m_TotalReceives.setStatusTip(tr(
"Total receives"));
133 this->statusBar()->addPermanentWidget(&m_TotalReceives);
135 check = connect(&m_Timer, SIGNAL(timeout()),
this, SLOT(slotTimeOut()));
138 m_pSecureLevel =
new QLabel(statusBar());
142 m_pSecureLevel->hide();
143 statusBar()->addPermanentWidget(m_pSecureLevel);
147 setAcceptDrops(
true);
149 RabbitCommon::CTools::AddStyleMenu(ui->menuTools);
150 ui->menuTools->addMenu(RabbitCommon::CTools::GetLogMenu(
this));
152 m_pRecentMenu =
new RabbitCommon::CRecentMenu(
153 tr(
"Recently"), QIcon::fromTheme(
"document-open-recent"),
false,
this);
154 check = connect(m_pRecentMenu, SIGNAL(recentFileTriggered(
const QString&)),
155 this, SLOT(slotOpenFile(
const QString&)));
157 check = connect(&m_Parameter, SIGNAL(sigRecentMenuMaxCountChanged(
int)),
158 m_pRecentMenu, SLOT(setMaxCount(
int)));
160 QAction* pRecentAction = ui->menuOperate->insertMenu(
161 ui->actionOpenListRecent, m_pRecentMenu);
162 pRecentAction->setStatusTip(pRecentAction->text());
163 QToolButton* tbRecent =
new QToolButton(ui->toolBar);
164 tbRecent->setFocusPolicy(Qt::NoFocus);
165 tbRecent->setPopupMode(QToolButton::InstantPopup);
166 tbRecent->setMenu(m_pRecentMenu);
167 tbRecent->setIcon(pRecentAction->icon());
168 tbRecent->setText(pRecentAction->text());
169 tbRecent->setToolTip(pRecentAction->toolTip());
170 tbRecent->setStatusTip(pRecentAction->statusTip());
171 ui->toolBar->insertWidget(ui->actionOpenListRecent, tbRecent);
175 ui->actionUpdate->setIcon(updater.windowIcon());
178 QToolButton* tbStart =
new QToolButton(ui->toolBar);
179 tbStart->setFocusPolicy(Qt::NoFocus);
180 tbStart->setPopupMode(QToolButton::InstantPopup);
182 tbStart->setMenu(ui->menuStart);
183 tbStart->setIcon(QIcon::fromTheme(
"media-playback-start"));
184 tbStart->setText(tr(
"Start"));
185 tbStart->setToolTip(tr(
"Start"));
186 tbStart->setStatusTip(tr(
"Start"));
187 ui->toolBar->insertWidget(ui->actionStop, tbStart);
191 check = connect(&m_Parameter, SIGNAL(sigReceiveShortCutChanged()),
192 this, SLOT(slotShortCut()));
194 slotSystemTrayIconTypeChanged();
195 check = connect(&m_Parameter, SIGNAL(sigSystemTrayIconTypeChanged()),
197 SLOT(slotSystemTrayIconTypeChanged()));
199 check = connect(&m_Parameter, SIGNAL(sigEnableSystemTrayIcon()),
200 this, SLOT(slotEnableSystemTrayIcon()));
202 check = connect(&m_Parameter, SIGNAL(sigEnableTabToolTipChanged()),
203 this, SLOT(slotUpdateName()));
205 check = connect(&m_Parameter, SIGNAL(sigEnableTabIconChanged()),
206 this, SLOT(slotUpdateName()));
209 auto pTbMenu =
new QToolButton(ui->toolBar);
210 pTbMenu->setFocusPolicy(Qt::NoFocus);
211 pTbMenu->setPopupMode(QToolButton::InstantPopup);
213 pTbMenu->setText(ui->actionMain_menu_bar_M->text());
214 pTbMenu->setIcon(ui->actionMain_menu_bar_M->icon());
215 pTbMenu->setToolTip(ui->actionMain_menu_bar_M->toolTip());
216 pTbMenu->setStatusTip(ui->actionMain_menu_bar_M->statusTip());
217 QMenu *pMenu =
new QMenu(pTbMenu);
218 pMenu->addActions(this->menuBar()->actions());
219 pTbMenu->setMenu(pMenu);
220 m_pToolBarMenuAction = ui->toolBar->insertWidget(ui->actionTabBar_B, pTbMenu);
221#if defined(Q_OS_ANDROID)
222 m_pToolBarMenuAction->setVisible(
true);
224 m_pToolBarMenuAction->setVisible(
false);
227 check = connect(&m_Parameter, SIGNAL(sigStartByTypeChanged()),
228 this, SLOT(slotStartByType()));
231 m_pDockFavorite =
new QDockWidget(
this);
234 m_pFavoriteView =
new CFavoriteView(&m_Parameter, m_pDockFavorite);
237 if(m_pFavoriteView->m_pDockTitleBar)
238 m_pDockFavorite->setTitleBarWidget(m_pFavoriteView->m_pDockTitleBar);
239 check = connect(m_pFavoriteView, SIGNAL(sigStart(
const QString&,
bool)),
240 this, SLOT(slotOpenFile(
const QString&,
bool)));
242 check = connect(m_pFavoriteView, SIGNAL(sigFavorite()),
243 this, SLOT(on_actionAdd_to_favorite_triggered()));
248 check = connect(&m_Parameter, SIGNAL(sigFavoriteEditChanged(
bool)),
249 m_pFavoriteView, SLOT(slotDoubleEditNode(
bool)));
251 emit m_Parameter.sigFavoriteEditChanged(m_Parameter.GetFavoriteEdit());
252 m_pDockFavorite->setWidget(m_pFavoriteView);
253 m_pDockFavorite->setWindowTitle(m_pFavoriteView->windowTitle());
256 m_pDockFavorite->setObjectName(
"dockFavorite");
257#if defined(Q_OS_ANDROID)
258 m_pDockFavorite->hide();
260 ui->menuView->addAction(m_pDockFavorite->toggleViewAction());
261 m_pDockFavorite->toggleViewAction()->setIcon(QIcon::fromTheme(
"emblem-favorite"));
262 addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, m_pDockFavorite);
265 m_pDockRecent =
new QDockWidget(
this);
269 =
new CFrmRecent(
this, &m_Manager, m_Parameter,
true,
272 if(m_pRecent->m_pDockTitleBar)
273 m_pDockRecent->setTitleBarWidget(
274 m_pRecent->m_pDockTitleBar);
275 check = connect(m_pRecent,
276 SIGNAL(sigStart(
const QString&,
bool)),
277 this, SLOT(slotOpenFile(
const QString&,
bool)));
279 check = connect(m_pRecent, &CFrmRecent::sigAddToFavorite,
280 m_pFavoriteView, &CFavoriteView::slotAddToFavorite);
285 m_pDockRecent->setWidget(m_pRecent);
286 m_pDockRecent->setWindowTitle(
287 m_pRecent->windowTitle());
290 m_pDockRecent->setObjectName(
"dockRecent");
291#if defined(Q_OS_ANDROID)
292 m_pDockRecent->hide();
294 ui->menuView->addAction(m_pDockRecent->toggleViewAction());
295 m_pDockRecent->toggleViewAction()->setIcon(QIcon::fromTheme(
"document-open-recent"));
296 tabifyDockWidget(m_pDockFavorite, m_pDockRecent);
299 m_pDockActive =
new QDockWidget(
this);
303 m_Operates, m_Parameter,
304 ui->menuStart, ui->actionStop,
305 m_pRecentMenu, m_pDockActive);
307 m_pDockActive->setWidget(m_pFrmActive);
308 if(m_pFrmActive->m_pDockTitleBar)
309 m_pDockActive->setTitleBarWidget(
310 m_pFrmActive->m_pDockTitleBar);
311 m_pDockActive->setWindowTitle(m_pFrmActive->windowTitle());
312 check = connect(m_pFrmActive, SIGNAL(sigChanged(
COperate*)),
313 this, SLOT(slotOperateChanged(
COperate*)));
315 check = connect(m_pFrmActive, &CFrmActive::sigAddToFavorite,
316 m_pFavoriteView, &CFavoriteView::slotAddToFavorite);
319 m_pDockActive->setObjectName(
"dockListActive");
320#if defined(Q_OS_ANDROID)
321 m_pDockActive->hide();
323 ui->menuView->addAction(m_pDockActive->toggleViewAction());
324 m_pDockActive->toggleViewAction()->setIcon(QIcon::fromTheme(
"network-wired"));
325 tabifyDockWidget(m_pDockFavorite, m_pDockActive);
328 QActionGroup* pGBView =
new QActionGroup(
this);
330 pGBView->addAction(ui->actionViewTab);
331 pGBView->addAction(ui->actionViewSplit);
333 qDebug(log) <<
"View type:" << m_Parameter.GetViewType();
334 if(CParameterApp::ViewType::Tab == m_Parameter.GetViewType()) {
335 ui->actionViewTab->setChecked(
true);
336 on_actionViewTab_triggered();
338 if(CParameterApp::ViewType::Splitter == m_Parameter.GetViewType()) {
339 ui->actionViewSplit->setChecked(
true);
340 on_actionViewSplit_triggered();
342 check = connect(&m_Parameter, &CParameterApp::sigViewTypeChanged,
348 m_pMenuActivityGroup =
new QActionGroup(ui->menuActivity);
349 m_ptbMenuActivity =
new QToolButton(ui->toolBar);
350 m_ptbMenuActivity->setFocusPolicy(Qt::NoFocus);
351 m_ptbMenuActivity->setPopupMode(QToolButton::InstantPopup);
352 m_ptbMenuActivity->setMenu(ui->menuActivity);
353 m_ptbMenuActivity->setIcon(ui->menuActivity->icon());
354 m_ptbMenuActivity->setText(ui->menuActivity->title());
355 m_ptbMenuActivity->setToolTip(ui->menuActivity->toolTip());
356 m_ptbMenuActivity->setStatusTip(ui->menuActivity->statusTip());
357 ui->toolBar->insertWidget(ui->actionTabBar_B, m_ptbMenuActivity);
366 SIGNAL(sigConnected()),
367 this, SLOT(slotSignalConnected()));
370 SIGNAL(sigDisconnected()),
371 this, SLOT(slotSignalDisconnected()));
374 SIGNAL(sigError(
const int,
const QString&)),
375 this, SLOT(slotSignalError(
const int,
const QString&)));
379 m_pSignalStatus =
new QPushButton();
380 m_pSignalStatus->setToolTip(tr(
"ICE signal status"));
381 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
382 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
383 slotSignalDisconnected();
384 statusBar()->addPermanentWidget(m_pSignalStatus);
387 if(m_Parameter.GetSaveMainWindowStatus())
389 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
390 QSettings::IniFormat);
392 = set.value(
"MainWindow/Status/Geometry").toByteArray();
393 if(!geometry.isEmpty())
394 restoreGeometry(geometry);
396 QByteArray state = set.value(
"MainWindow/Status/State").toByteArray();
400 ui->actionTabBar_B->setChecked(m_Parameter.GetTabBar());
401 on_actionTabBar_B_toggled(m_Parameter.GetTabBar());
402 ui->actionStatus_bar_S->setChecked(m_Parameter.GetStatusBar());
403 statusBar()->setVisible(m_Parameter.GetStatusBar());
404 ui->actionMain_menu_bar_M->setChecked(m_Parameter.GetMenuBar());
405 menuBar()->setVisible(m_Parameter.GetMenuBar());
406 ui->actionToolBar_T->setChecked(!ui->toolBar->isHidden());
410 ui->actionMain_menu_bar_M->setVisible(
false);
413 if(!m_Parameter.GetMenuBar()) {
414 m_pToolBarMenuAction->setVisible(
true);
420MainWindow::~MainWindow()
422 qDebug(log) <<
"MainWindow::~MainWindow()";
423 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
430 qDebug(log) << Q_FUNC_INFO;
437 QMessageBox initMsgBox(QMessageBox::Information, tr(
"Load"), tr(
"Load ......"));
438 initMsgBox.showNormal();
439 qApp->processEvents();
442 szMsg = tr(
"Load plugins ......");
443 initMsgBox.setText(szMsg);
445 qApp->processEvents();
448 szErr = tr(
"Initial manage error");
456 bool bRet = QMetaObject::invokeMethod(
458 "SetGlobalParameters",
459 Qt::DirectConnection,
462 szErr = tr(
"Failed to set global parameters");
463 qCritical(log) << szErr;
470 szMsg = tr(
"Load list recent dock ......");
471 initMsgBox.setText(szMsg);
473 qApp->processEvents();
474 nRet = m_pRecent->Initial();
476 szErr = tr(
"Initial recent dock error");
482 szMsg = tr(
"Load recent menu ......");
483 initMsgBox.setText(szMsg);
485 qApp->processEvents();
487 auto recents = m_pRecent->GetRecents(m_Parameter.GetRecentMenuMaxCount());
489 for(
auto it = recents.rbegin(); it != recents.rend(); it++) {
490 m_pRecentMenu->addRecentFile(it->GetFile(), it->szName, it->icon);
492 m_pRecentMenu->slotShowFileEixst(
493 m_Parameter.GetGlobalParameters()->GetSaveSettingsType() == CParameterGlobal::Local);
494 bool check = connect(
495 m_Parameter.GetGlobalParameters(),
496 &CParameterGlobal::sigSaveSettingsTypeChanged,
497 m_pRecentMenu, [
this]() {
498 if(!(m_pRecentMenu && m_Parameter.GetGlobalParameters()))
500 m_pRecentMenu->slotShowFileEixst(
501 m_Parameter.GetGlobalParameters()->GetSaveSettingsType() == CParameterGlobal::Local);
507 if(m_pFavoriteView) {
508 szMsg = tr(
"Load favorite ......");
509 initMsgBox.setText(szMsg);
511 qApp->processEvents();
512 nRet = m_pFavoriteView->Initial();
514 szErr = tr(
"Initial favorite error");
519 slotEnableSystemTrayIcon();
523 szMsg = tr(
"Load laster operate ......");
524 initMsgBox.setText(szMsg);
526 qApp->processEvents();
527 nRet = LoadOperateLasterClose();
529 szErr = tr(
"Initial load laster close operate error");
540 slotError(nRet, szErr);
541 QMessageBox errMsgBox;
542 errMsgBox.setWindowTitle(QObject::tr(
"Error"));
543 errMsgBox.setText(QObject::tr(
"Initial error:") + szErr);
544 errMsgBox.setIcon(QMessageBox::Critical);
546 auto logMenu = RabbitCommon::CTools::GetLogMenu();
547 QPushButton *pbLog =
new QPushButton(logMenu->title());
548 pbLog->setMenu(logMenu);
550 QPushButton *pbettings =
new QPushButton(ui->actionSettings->text());
551 QMenu* pSettings =
new QMenu(pbettings);
552 pSettings->addAction(ui->actionSettings);
553 pbettings->setMenu(pSettings);
554 errMsgBox.addButton(pbettings, QMessageBox::ActionRole);
555 errMsgBox.addButton(pbLog, QMessageBox::ActionRole);
556 errMsgBox.addButton(QMessageBox::Cancel);
563void MainWindow::SetView(
CView* pView)
565 qDebug(log) << Q_FUNC_INFO;
569 m_pView->disconnect();
572 setCentralWidget(m_pView);
576 check = connect(m_pView, SIGNAL(sigCloseView(
const QWidget*)),
579 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
580 this, SLOT(slotCurrentViewChanged(
const QWidget*)));
583 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
584 m_pFrmActive, SLOT(slotViewChanged(
const QWidget*)));
587 check = connect(m_pView, SIGNAL(customContextMenuRequested(
const QPoint&)),
591 foreach (
auto c, m_Operates) {
592 m_pView->
AddView(c->GetViewer());
593 m_pView->SetWidowsTitle(
594 c->GetViewer(), c->Name(), c->Icon(), c->Description());
596 m_pView->SetVisibleTab(m_Parameter.GetTabBar());
599void MainWindow::on_actionViewTab_triggered()
601 qDebug(log) << Q_FUNC_INFO;
602 if(!ui->actionViewTab->isChecked())
return;
603 m_Parameter.SetViewType(CParameterApp::ViewType::Tab);
607void MainWindow::on_actionViewSplit_triggered()
609 qDebug(log) << Q_FUNC_INFO;
610 if(!ui->actionViewSplit->isChecked())
return;
611 m_Parameter.SetViewType(CParameterApp::ViewType::Splitter);
615void MainWindow::on_actionAbout_triggered()
618 CDlgAbout *about =
new CDlgAbout(
this);
619 QIcon icon = QIcon::fromTheme(
"app");
621 auto sizeList = icon.availableSizes();
622 if(!sizeList.isEmpty()) {
623 QPixmap p = icon.pixmap(*sizeList.begin());
624 about->m_AppIcon = p.toImage();
627 about->m_szBuildTime = QString(
"%1/%2").arg(__DATE__, __TIME__);
628 about->m_szCopyrightStartTime =
"2020";
629 about->m_szVersionRevision = RabbitRemoteControl_REVISION;
630 about->m_szDetails = m_Manager.Details();
631 RC_SHOW_WINDOW(about);
635void MainWindow::on_actionUpdate_triggered()
637 if(!qEnvironmentVariable(
"SNAP").isEmpty()) {
638 QDesktopServices::openUrl(QUrl(
"https://snapcraft.io/rabbitremotecontrol"));
639 }
else if(!qEnvironmentVariable(
"FLATPAK_ID").isEmpty()) {
640 QDesktopServices::openUrl(QUrl(
"https://flathub.org/apps/io.github.KangLin.RabbitRemoteControl"));
643 CFrmUpdater* m_pfrmUpdater =
new CFrmUpdater();
644 QIcon icon = QIcon::fromTheme(
"app");
646 auto sizeList = icon.availableSizes();
647 if(!sizeList.isEmpty()) {
648 QPixmap p = icon.pixmap(*sizeList.begin());
649 m_pfrmUpdater->SetTitle(p.toImage());
652 m_pfrmUpdater->SetInstallAutoStartup();
653 RC_SHOW_WINDOW(m_pfrmUpdater);
658void MainWindow::on_actionFull_screen_F_triggered()
660 CView* pView = qobject_cast<CView*>(this->centralWidget());
663 pView->SetFullScreen(!isFullScreen());
668 qDebug(log) <<
"Exit full screen";
669 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-fullscreen"));
670 ui->actionFull_screen_F->setText(tr(
"Full screen"));
671 ui->actionFull_screen_F->setToolTip(tr(
"Full screen"));
672 ui->actionFull_screen_F->setStatusTip(tr(
"Full screen"));
673 ui->actionFull_screen_F->setWhatsThis(tr(
"Full screen"));
675 ui->toolBar->setVisible(m_FullState.toolBar);
676 ui->statusbar->setVisible(m_FullState.statusbar);
677 ui->menubar->setVisible(m_FullState.menubar);
679 m_pDockActive->setVisible(m_FullState.dockListActive);
680 m_pDockRecent->setVisible(m_FullState.dockListRecent);
681 m_pDockFavorite->setVisible(m_FullState.dockFavorite);
683 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
686 pDockDebugLog->setVisible(m_FullState.dockDebugLog);
689 if(m_pFullScreenToolBar)
692 m_pFullScreenToolBar->close();
693 m_pFullScreenToolBar =
nullptr;
696 emit sigShowNormal();
698 this->activateWindow();
700 emit sigFullScreen(
false);
704 qDebug(log) <<
"Entry full screen";
707 this->showFullScreen();
708 emit sigFullScreen(
true);
710 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-restore"));
711 ui->actionFull_screen_F->setText(tr(
"Exit full screen"));
712 ui->actionFull_screen_F->setToolTip(tr(
"Exit full screen"));
713 ui->actionFull_screen_F->setStatusTip(tr(
"Exit full screen"));
714 ui->actionFull_screen_F->setWhatsThis(tr(
"Exit full screen"));
716 m_FullState.toolBar = ui->toolBar->isVisible();
717 ui->toolBar->setVisible(
false);
718 m_FullState.statusbar = ui->statusbar->isVisible();
719 ui->statusbar->setVisible(
false);
720 m_FullState.menubar = ui->menubar->isVisible();
721 ui->menubar->setVisible(
false);
723 m_FullState.dockListActive = m_pDockActive->isVisible();
724 m_pDockActive->setVisible(
false);
725 m_FullState.dockListRecent = m_pDockRecent->isVisible();
726 m_pDockRecent->setVisible(
false);
727 m_FullState.dockFavorite = m_pDockFavorite->isVisible();
728 m_pDockFavorite->setVisible(
false);
730 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
733 m_FullState.dockDebugLog = pDockDebugLog->isVisible();
734 pDockDebugLog->setVisible(
false);
737 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
740 QScreen* pScreen = qApp->primaryScreen();
742 QPoint pos(pScreen->geometry().left()
743 + (pScreen->geometry().width()
744 - m_pFullScreenToolBar->frameGeometry().width()) / 2,
745 pScreen->geometry().top());
746 qDebug(log) <<
"Primary screen geometry:" << pScreen->geometry()
747 <<
"availableGeometry:" << pScreen->availableGeometry()
748 << pos << mapToGlobal(pos);
749 m_pFullScreenToolBar->move(pos);
751 bool check = connect(m_pFullScreenToolBar, SIGNAL(sigExitFullScreen()),
752 this, SLOT(on_actionFull_screen_F_triggered()));
754 check = connect(m_pFullScreenToolBar, SIGNAL(sigExit()),
755 this, SLOT(on_actionExit_E_triggered()));
758 check = connect(
this, SIGNAL(sigOperateMenuChanged(QAction*)),
759 m_pFullScreenToolBar,
760 SLOT(slotOperateMenuChanged(QAction*)));
763 m_pFullScreenToolBar->show();
766void MainWindow::slotViewerFocusIn(QWidget *pView)
768 COperate* c = qobject_cast<COperate*>(sender());
769 qDebug(log) << Q_FUNC_INFO <<
"Focus:" << c << pView;
775void MainWindow::slotOperateChanged(
COperate *o)
782void MainWindow::slotCurrentViewChanged(
const QWidget* pView)
784 qDebug(log) << Q_FUNC_INFO;
790 foreach(
auto o, m_Operates) {
793 foreach (
auto a, ui->menuActivity->actions()) {
794 if(a->data().value<
COperate*>() == o)
797 ui->actionStop_other->setText(
798 tr(
"Stop other except the current \"%1\"").arg(o->
Name()));
802 QTimer::singleShot(0,
this, SLOT(slotTimeOut()));
805void MainWindow::EnableMenu(
bool bEnable)
807 qDebug(log) << Q_FUNC_INFO << bEnable;
808 ui->actionClone->setEnabled(bEnable);
809 ui->actionAdd_to_favorite->setEnabled(bEnable);
810 ui->actionStop->setEnabled(bEnable);
811 ui->actionStop_All->setEnabled(bEnable);
812 ui->actionStop_other->setEnabled(bEnable);
814 if(m_Operates.size() > 1)
815 ui->actionStop_other->setEnabled(
true);
817 ui->actionStop_other->setEnabled(
false);
819 ui->actionStop_other->setText(tr(
"Stop other"));
821 ui->actionTabBar_B->setEnabled(bEnable);
822 ui->menuActivity->setEnabled(bEnable);
823 m_ptbMenuActivity->setEnabled(bEnable);
824 slotLoadOperateMenu();
827void MainWindow::slotMenuActivity()
829 QAction* pAction = qobject_cast<QAction*>(sender());
834 slotOperateChanged(p);
837void MainWindow::slotLoadOperateMenu()
839 qDebug(log) << Q_FUNC_INFO;
841 if(m_pActionOperateMenu) {
842 ui->menuOperate->removeAction(m_pActionOperateMenu);
843 m_pActionOperateMenu =
nullptr;
845 ui->toolBar->removeAction(m_pActionTBOperate);
851 qDebug(log) <<
"The current view is empty";
854 foreach(
auto op, m_Operates)
856 if(op->GetViewer() == pWin)
858 qDebug(log) <<
"Load plugin menu";
859 auto m = op->GetMenu(ui->menuTools);
862 m_pActionOperateMenu = ui->menuOperate->insertMenu(ui->actionAdd_to_favorite, m);
865 m_pTBOperate =
new QToolButton(ui->toolBar);
867 m_pTBOperate->setFocusPolicy(Qt::NoFocus);
868 m_pTBOperate->setPopupMode(QToolButton::InstantPopup);
869 m_pTBOperate->setMenu(m);
870 m_pTBOperate->setIcon(m->icon());
871 m_pTBOperate->setText(m->title());
872 m_pTBOperate->setToolTip(m->toolTip());
873 m_pTBOperate->setStatusTip(m->statusTip());
874 m_pTBOperate->show();
875 m_pActionTBOperate = ui->toolBar->insertWidget(ui->actionAdd_to_favorite, m_pTBOperate);
877 emit sigOperateMenuChanged(m_pActionOperateMenu);
894 qDebug(log) <<
"The current view is empty";
897 foreach(
auto p, m_Operates)
901 qDebug(log) <<
"Load plugin menu";
902 auto m = p->
GetMenu(ui->menuTools);
910void MainWindow::on_actionExit_E_triggered()
915void MainWindow::keyReleaseEvent(QKeyEvent *event)
921 on_actionFull_screen_F_triggered();
924 QMainWindow::keyReleaseEvent(event);
927void MainWindow::slotUpdateParameters(
COperate *pOperate)
932void MainWindow::on_actionClone_triggered()
936 foreach(
auto pOperate, m_Operates)
940 QString szFile = pOperate->GetSettingsFile();
942 if(!pOperate)
return;
943 Start(pOperate,
false, szFile);
949void MainWindow::slotOpenFile(
const QString& szFile,
bool bOpenSettings)
951 if(szFile.isEmpty())
return;
955 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
959 Start(p, bOpenSettings, szFile);
962void MainWindow::on_actionOpenRRCFile_triggered()
964 QString szFile = QFileDialog::getOpenFileName(
966 tr(
"Open rabbit remote control file"),
967 RabbitCommon::CDir::Instance()->GetDirUserData(),
968 tr(
"Rabbit remote control Files (*.rrc);;All files(*.*)"));
969 if(szFile.isEmpty())
return;
974 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
981void MainWindow::slotStart()
983 if(
nullptr == m_pView)
988 QAction* pAction = qobject_cast<QAction*>(this->sender());
991 if(
nullptr == p)
return;
1007 qDebug(log) <<
"MainWindow::Start: set:" << set <<
"; File:" << szFile;
1010 bool check = connect(pOperate, SIGNAL(sigRunning()),
1013 check = connect(pOperate, SIGNAL(sigStop()),
1014 this, SLOT(slotStop()));
1016 check = connect(pOperate, SIGNAL(sigFinished()),
1017 this, SLOT(slotFinished()));
1019 check = connect(pOperate, SIGNAL(sigError(
const int,
const QString &)),
1020 this, SLOT(slotError(
const int,
const QString&)));
1022 check = connect(pOperate, SIGNAL(sigShowMessageBox(
const QString&,
const QString&,
1023 const QMessageBox::Icon&)),
1025 const QMessageBox::Icon&)));
1027 check = connect(pOperate, SIGNAL(sigInformation(
const QString&)),
1030 check = connect(pOperate, SIGNAL(sigUpdateName(
const QString&)),
1031 this, SLOT(slotUpdateName(
const QString&)));
1033 check = connect(pOperate, SIGNAL(sigUpdateParameters(
COperate*)),
1034 this, SLOT(slotUpdateParameters(
COperate*)));
1037 this, [
this, pOperate](
bool bFull) {
1039 if((bFull && !isFullScreen()) || (!bFull && isFullScreen()))
1040 on_actionFull_screen_F_triggered();
1045 this, [
this, pOperate]() {
1046 if(m_pView && pOperate) {
1048 slotCurrentViewChanged(pOperate->
GetViewer());
1058 case QDialog::Rejected:
1061 case QDialog::Accepted:
1067 if(szFile.isEmpty())
1068 szFile = pOperate->GetSettingsFile();
1070 pOperate->SetSettingsFile(szFile);
1076 m_pRecentMenu->addRecentFile(szFile, pOperate->
Name(), pOperate->Icon());
1078 item.szOperateId = pOperate->Id();
1079 item.icon = pOperate->Icon();
1080 item.szName = pOperate->
Name();
1081 item.szProtocol = pOperate->Protocol();
1082 item.szType = pOperate->GetTypeName();
1084 item.SetFile(szFile);
1085 item.time = QDateTime::currentDateTime();
1086 m_pRecent->AddRecent(item);
1089 if(!pOperate->
Name().isEmpty())
1093 if(m_Operates.contains(pOperate)) {
1095 m_pView->SetCurrentView(pOperate->
GetViewer());
1101 m_pView->SetWidowsTitle(pOperate->
GetViewer(), pOperate->
Name(),
1104 check = connect(pOperate, SIGNAL(sigViewerFocusIn(QWidget*)),
1105 this, SLOT(slotViewerFocusIn(QWidget*)));
1108 m_Operates.insert(pOperate);
1111 m_pFrmActive->slotLoad();
1115 vOperate.setValue(pOperate);
1116 QAction* m_pActionmenuActivity = ui->menuActivity->addAction(
1117 pOperate->Icon(), pOperate->
Name(),
this, SLOT(slotMenuActivity()));
1118 m_pActionmenuActivity->setData(vOperate);
1119 m_pActionmenuActivity->setCheckable(
true);
1120 m_pMenuActivityGroup->addAction(m_pActionmenuActivity);
1121 m_pActionmenuActivity->setChecked(
true);
1124 nRet = pOperate->
Start();
1136 COperate* p = qobject_cast<COperate*>(sender());
1161 m->addAction(ui->actionClone);
1162 m->addAction(ui->actionStop_All);
1163 m->addAction(ui->actionStop_other);
1167 qDebug(log) << Q_FUNC_INFO << p->
Name();
1173 qDebug(log) <<
"MainWindow::slotCloseView" << pView;
1175 foreach(
auto p, m_Operates)
1186void MainWindow::on_actionStop_other_triggered()
1188 if(!m_pView)
return;
1189 foreach(
auto p, m_Operates)
1200void MainWindow::on_actionStop_All_triggered()
1202 foreach(
auto p, m_Operates)
1210void MainWindow::on_actionStop_triggered()
1212 qDebug(log) << Q_FUNC_INFO;
1213 if(!m_pView)
return;
1219void MainWindow::slotStop()
1221 COperate* pOperate = qobject_cast<COperate*>(sender());
1222 if(!pOperate)
return;
1223 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
1229void MainWindow::slotFinished()
1231 COperate* pOperate = qobject_cast<COperate*>(sender());
1232 if(!pOperate)
return;
1234 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
1235 foreach(
auto a, ui->menuActivity->actions()) {
1238 ui->menuActivity->removeAction(a);
1239 m_pMenuActivityGroup->removeAction(a);
1242 foreach(
auto p, m_Operates)
1247 m_Operates.remove(p);
1249 m_pFrmActive->slotLoad();
1254 if(m_Operates.isEmpty())
1255 if(m_pActionOperateMenu) {
1256 ui->menuTools->removeAction(m_pActionOperateMenu);
1257 ui->toolBar->removeAction(m_pActionOperateMenu);
1258 m_pActionOperateMenu =
nullptr;
1266void SetIndicator(QLabel* label, QColor color,
int size)
1268 QString min_width = QString(
"min-width: %1px;").arg(size);
1269 QString min_height = QString(
"min-height: %1px;").arg(size);
1270 QString max_width = QString(
"max-width: %1px;").arg(size);
1271 QString max_height = QString(
"max-height: %1px;").arg(size);
1273 QString border_radius = QString(
"border-radius: %1px;").arg(size / 2);
1274 QString border = QString(
"border:1px solid ") + color.name() +
";";
1276 QString background =
"background-color: ";
1277 background += color.name() +
";";
1278 QString SheetStyle = min_width + min_height + max_width + max_height + border_radius + border + background;
1279 label->setStyleSheet(SheetStyle);
1282void MainWindow::SetSecureLevel(
COperate* o)
1284 if(!m_pSecureLevel)
return;
1287 if(szLevel.isEmpty()) {
1288 m_pSecureLevel->hide();
1291 m_pSecureLevel->setText(szLevel);
1292 m_pSecureLevel->setToolTip(CSecurityLevel::GetString(o->
GetSecurityLevel()));
1293 m_pSecureLevel->show();
1295 m_pSecureLevel->hide();
1298void MainWindow::slotSignalConnected()
1300 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Connected"));
1301 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1302 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1304 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wired"));
1307void MainWindow::slotSignalDisconnected()
1309 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Disconnected"));
1310 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1311 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1313 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wireless"));
1316void MainWindow::slotSignalError(
const int nError,
const QString &szInfo)
1318 slotSignalDisconnected();
1319 slotError(nError, szInfo);
1322void MainWindow::slotSignalPushButtonClicked(
bool checked)
1332void MainWindow::slotError(
const int nError,
const QString &szInfo)
1335 slotStatusMessage(szInfo, MessageLevel::Error);
1339 const QString &title,
const QString &message,
1340 const QMessageBox::Icon &icon)
1343 if(!m_Parameter.GetMessageBoxDisplayInformation())
1346 QMessageBox msg(icon, title, message, QMessageBox::Ok,
this);
1347 QCheckBox* cb =
new QCheckBox(
1348 tr(
"Use message box to display information"),
this);
1349 cb->setChecked(
true);
1350 msg.setCheckBox(cb);
1351 RC_SHOW_WINDOW(&msg);
1352 if(!cb->isChecked())
1354 m_Parameter.SetMessageBoxDisplayInformation(
false);
1361 slotStatusMessage(szInfo, MessageLevel::Normal);
1365void MainWindow::slotStatusMessage(QString szMessage, MessageLevel level)
1369 switch ((MessageLevel)level) {
1370 case MessageLevel::Error:
1371 pe.setColor(QPalette::WindowText, Qt::red);
1374 case MessageLevel::Warning:
1375 pe.setColor(QPalette::WindowText, Qt::yellow);
1381 m_StatusBarMessage.setPalette(pe);
1382 m_StatusBarMessage.setToolTip(szMessage);
1387 m_StatusBarMessage.setText(szLevel);
1388 statusBar()->showMessage(szMessage);
1391void MainWindow::slotUpdateName()
1393 foreach (
auto p, m_Operates)
1402void MainWindow::slotUpdateName(
const QString& szName)
1404 COperate* p = qobject_cast<COperate*>(sender());
1407 m_pView->SetWidowsTitle(p->
GetViewer(), szName,
1412 m_pRecentMenu->updateRecentFile(p->GetSettingsFile(), szName, p->Icon());
1415 item.SetFile(p->GetSettingsFile());
1416 item.szName = p->
Name();
1419 m_pRecent->UpdateRecent(item);
1422 foreach(
auto a, ui->menuActivity->actions()) {
1423 if(a->data().value<
COperate*>() == p) {
1425 a->setIcon(p->Icon());
1431 m_pFavoriteView->slotUpdateFavorite(
1432 p->GetSettingsFile(), szName, p->
Description(), p->Icon());
1435 m_pFrmActive->slotLoad();
1438QAction* MainWindow::GetStartAction(QMenu* pMenu,
CPlugin *pPlug)
1442 szTitle = pPlug->
Protocol() +
": ";
1444 QAction* p = pMenu->addAction(szTitle);
1447 p->setData(pPlug->
Id());
1448 p->setIcon(pPlug->Icon());
1452void MainWindow::slotStartByType()
1454 qDebug(log) << Q_FUNC_INFO;
1455 auto m = ui->menuStart->actions();
1456 foreach(
auto a, m) {
1459 foreach (
auto a, m_MenuStartByType) {
1462 ui->menuStart->clear();
1463 m_MenuStartByType.clear();
1470 QMenu* m = ui->menuStart;
1471 if(m_Parameter.GetStartByType()) {
1472 auto it = m_MenuStartByType.find(pPlugin->Type());
1473 if(it == m_MenuStartByType.end()) {
1474 m =
new QMenu(pPlugin->TypeName(pPlugin->Type()), ui->menuStart);
1475 m_MenuStartByType[pPlugin->Type()] = m;
1476 ui->menuStart->addMenu(m);
1481 QAction* p = GetStartAction(m, pPlugin);
1483 check = connect(p, SIGNAL(triggered()),
this, SLOT(slotStart()));
1488void MainWindow::closeEvent(QCloseEvent *event)
1490 qDebug(log) <<
"MainWindow::closeEvent()";
1492 if(m_Parameter.GetSaveMainWindowStatus())
1494 on_actionFull_screen_F_triggered();
1496 SaveOperateLasterClose();
1498 foreach (
auto it, m_Operates)
1501 emit it->sigUpdateParameters(it);
1505 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
1506 QSettings::IniFormat);
1507 if(m_Parameter.GetSaveMainWindowStatus())
1509 set.setValue(
"MainWindow/Status/Geometry", saveGeometry());
1510 set.setValue(
"MainWindow/Status/State", saveState());
1512 m_Parameter.SetTabBar(ui->actionTabBar_B->isChecked());
1513 m_Parameter.SetMenuBar(menuBar()->isVisible());
1514 m_Parameter.SetStatusBar(statusBar()->isVisible());
1516 set.remove(
"MainWindow/Status/Geometry");
1517 set.remove(
"MainWindow/Status/State");
1523 QMainWindow::closeEvent(event);
1529int MainWindow::LoadOperateLasterClose()
1531 if(!m_Parameter.GetOpenLasterClose())
1534 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1535 + QDir::separator() +
"LasterClose.dat");
1536 if(f.open(QFile::ReadOnly))
1542 if(szFile.isEmpty())
1544 slotOpenFile(szFile);
1551int MainWindow::SaveOperateLasterClose()
1553 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1554 + QDir::separator() +
"LasterClose.dat");
1555 bool bRet = f.open(QFile::WriteOnly);
1556 if(bRet && m_Parameter.GetOpenLasterClose())
1559 foreach(
auto it, m_Operates)
1561 d << it->GetSettingsFile();
1568void MainWindow::on_actionTabBar_B_toggled(
bool bShow)
1572 m_pView->SetVisibleTab(bShow);
1573 m_Parameter.SetTabBar(bShow);
1576 m_pDockActive->setVisible(bShow);
1580void MainWindow::on_actionMain_menu_bar_M_toggled(
bool checked)
1582 qDebug(log) << Q_FUNC_INFO << checked;
1583 if(ui->toolBar->isHidden() && !checked)
1585 if( QMessageBox::StandardButton::Yes
1586 == QMessageBox::information(
this, tr(
"Hide menu bar"),
1587 tr(
"The menu bar will be hidden, the tool bar must be showed."),
1588 QMessageBox::StandardButton::Yes
1589 | QMessageBox::StandardButton::No))
1591 ui->actionToolBar_T->setChecked(
true);
1592 if(m_pToolBarMenuAction)
1593 m_pToolBarMenuAction->setVisible(
true);
1595 ui->actionMain_menu_bar_M->setChecked(
true);
1596#if !defined(Q_OS_ANDROID)
1597 if(m_pToolBarMenuAction)
1598 m_pToolBarMenuAction->setVisible(
false);
1604 menuBar()->setVisible(checked);
1605 m_Parameter.SetMenuBar(checked);
1606#if !defined(Q_OS_ANDROID)
1607 if(m_pToolBarMenuAction)
1608 m_pToolBarMenuAction->setVisible(!checked);
1612void MainWindow::on_actionToolBar_T_toggled(
bool checked)
1614 qDebug(log) << Q_FUNC_INFO << checked;
1615 if(menuBar()->isHidden() && !checked)
1617 if( QMessageBox::StandardButton::Yes
1618 == QMessageBox::information(
this, tr(
"Hide tool bar"),
1619 tr(
"The tool bar will be hidden, the menu bar must be showed."),
1620 QMessageBox::StandardButton::Yes
1621 | QMessageBox::StandardButton::No))
1623 ui->actionMain_menu_bar_M->setChecked(
true);
1625 ui->actionToolBar_T->setChecked(
true);
1629 ui->toolBar->setVisible(checked);
1632void MainWindow::on_actionStatus_bar_S_toggled(
bool checked)
1634 statusBar()->setVisible(checked);
1635 m_Parameter.SetStatusBar(checked);
1638void MainWindow::on_actionKeyboard_triggered()
1640 auto inputMethod = QGuiApplication::inputMethod();
1650 inputMethod->show();
1655void MainWindow::on_actionSettings_triggered()
1659 set.AddViewers(viewers);
1660 if(CParameterDlgSettings::Accepted == RC_SHOW_WINDOW(&set))
1665 foreach(
auto v, viewers) {
1671void MainWindow::slotShortCut()
1673 if(m_Parameter.GetReceiveShortCut())
1675 setFocusPolicy(Qt::WheelFocus);
1676 ui->actionFull_screen_F->setShortcuts(QKeySequence::FullScreen);
1678 setFocusPolicy(Qt::NoFocus);
1679 ui->actionFull_screen_F->setShortcut(QKeySequence());
1683void MainWindow::on_actionOpenListRecent_triggered()
1687 bool check = connect(p, SIGNAL(sigStart(
const QString&,
bool)),
1688 this, SLOT(slotOpenFile(
const QString&,
bool)));
1690 check = connect(p, SIGNAL(sigAddToFavorite(QString,QString,QString,QIcon)),
1691 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QString,QIcon)));
1694 int nRet = p->Initial();
1699 d.setWindowIcon(windowIcon());
1700 d.setWindowTitle(p->windowTitle());
1701 QGridLayout* pLayout =
new QGridLayout(&d);
1703 pLayout->addWidget(p);
1704 check = connect(p, SIGNAL(destroyed()), &d, SLOT(reject()));
1705 d.setLayout(pLayout);
1710void MainWindow::on_actionAdd_to_favorite_triggered()
1712 if(!m_pView || !m_pFavoriteView)
return;
1714 foreach(
auto c, m_Operates)
1718 m_pFavoriteView->slotAddToFavorite(
1724void MainWindow::dragEnterEvent(QDragEnterEvent *event)
1726 qDebug(log) <<
"dragEnterEvent";
1728 if(event->mimeData()->hasUrls())
1731 event->acceptProposedAction();
1735void MainWindow::dragMoveEvent(QDragMoveEvent *event)
1740void MainWindow::dropEvent(QDropEvent *event)
1742 qDebug(log) <<
"dropEvent";
1744 if(!event->mimeData()->hasUrls())
1746 auto urls =
event->mimeData()->urls();
1747 foreach(
auto url, urls)
1749 if(url.isLocalFile())
1750 slotOpenFile(url.toLocalFile());
1759void MainWindow::slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
1764#if defined(Q_OS_ANDROID)
1769 case QSystemTrayIcon::Trigger:
1781void MainWindow::slotSystemTrayIconTypeChanged()
1784 if(!QSystemTrayIcon::isSystemTrayAvailable())
1786 qWarning(log) <<
"System tray is not available";
1790 if(!m_Parameter.GetEnableSystemTrayIcon())
1792 qDebug(log) <<
"Disable system tray icon";
1799 m_TrayIcon = QSharedPointer<QSystemTrayIcon>(
new QSystemTrayIcon(
this));
1800 if(QSystemTrayIcon::isSystemTrayAvailable())
1802 bool check = connect(
1804 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
1806 SLOT(slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason)));
1808 m_TrayIcon->setIcon(this->windowIcon());
1809 m_TrayIcon->setToolTip(windowTitle());
1812 qWarning(log) <<
"System tray is not available";
1814 switch (m_Parameter.GetSystemTrayIconMenuType())
1816 case CParameterApp::SystemTrayIconMenuType::MenuBar:
1818 QMenu* pMenu =
new QMenu(
this);
1819 pMenu->addMenu(ui->menuOperate);
1820 pMenu->addMenu(ui->menuView);
1821 pMenu->addMenu(ui->menuTools);
1822 m_TrayIcon->setContextMenu(pMenu);
1825 case CParameterApp::SystemTrayIconMenuType::Operate:
1826 m_TrayIcon->setContextMenu(ui->menuOperate);
1828 case CParameterApp::SystemTrayIconMenuType::RecentOpen:
1829 m_TrayIcon->setContextMenu(m_pRecentMenu);
1831 case CParameterApp::SystemTrayIconMenuType::View:
1832 m_TrayIcon->setContextMenu(ui->menuView);
1834 case CParameterApp::SystemTrayIconMenuType::Tools:
1835 m_TrayIcon->setContextMenu(ui->menuTools);
1837 case CParameterApp::SystemTrayIconMenuType::No:
1838 m_TrayIcon->setContextMenu(
nullptr);
1843void MainWindow::slotEnableSystemTrayIcon()
1848 if(!m_Parameter.GetEnableSystemTrayIcon())
1851 slotSystemTrayIconTypeChanged();
1854void MainWindow::SetStatsVisible(
bool visible)
1856 if(m_SendRate.isVisible() == visible)
1858 m_SendRate.setVisible(visible);
1859 m_ReceivesRate.setVisible(visible);
1860 m_TotalSends.setVisible(visible);
1861 m_TotalReceives.setVisible(visible);
1864void MainWindow::StartTimer()
1866 bool bStart =
false;
1867 int nMinInterval = 1;
1868 foreach(
auto o, m_Operates) {
1875 m_Timer.start(nMinInterval * 1000);
1879 SetStatsVisible(
false);
1883void MainWindow::slotTimeOut()
1888 qDebug(log) <<
"The current view is empty";
1891 foreach(
auto p, m_Operates)
1893 if(p->GetViewer() == pWin)
1895 auto pStats = p->GetStats();
1897 SetStatsVisible(
false);
1900 SetStatsVisible(
true);
1901 pStats->slotCalculating();
1902 m_TotalSends.setText(
"⇈ " + pStats->TotalSends());
1903 m_TotalReceives.setText(
"⇊ " + pStats->TotalReceives());
1904 m_SendRate.setText(
"↑ " + pStats->SendRate());
1905 m_ReceivesRate.setText(
"↓ " + pStats->ReceiveRate());
1911void MainWindow::on_actionUser_manual_triggered()
1913 QString szUrl =
"https://github.com/KangLin/RabbitRemoteControl/wiki/UserManual";
1914 if(RabbitCommon::CTools::GetLanguage() ==
"zh_CN"
1915 || RabbitCommon::CTools::GetLanguage() ==
"zh_TW")
1919void MainWindow::on_actionLayoutDefault_triggered()
1921 qDebug(log) << Q_FUNC_INFO;
1922 if(!m_pDockActive->toggleViewAction()->isChecked())
1923 m_pDockActive->toggleViewAction()->trigger();
1924 if(!m_pDockFavorite->toggleViewAction()->isChecked())
1925 m_pDockFavorite->toggleViewAction()->trigger();
1926 if(!m_pDockRecent->toggleViewAction()->isChecked())
1927 m_pDockRecent->toggleViewAction()->trigger();
1928 m_Parameter.SetTabPosition(QTabWidget::North);
1929 if(!ui->actionTabBar_B->isChecked())
1930 ui->actionTabBar_B->trigger();
1931 if(!ui->actionMain_menu_bar_M->isChecked()) {
1932 ui->actionMain_menu_bar_M->trigger();
1933#if !defined(Q_OS_ANDROID)
1934 m_pToolBarMenuAction->setVisible(
false);
1937 if(!ui->actionToolBar_T->isChecked())
1938 ui->actionToolBar_T->trigger();
1939 addToolBar(Qt::TopToolBarArea, ui->toolBar);
1940 if(!ui->actionStatus_bar_S->isChecked())
1941 ui->actionStatus_bar_S->trigger();
1944void MainWindow::on_actionLayoutSimple_triggered()
1946 qDebug(log) << Q_FUNC_INFO;
1947 if(m_pDockActive->toggleViewAction()->isChecked())
1948 m_pDockActive->toggleViewAction()->trigger();
1949 if(m_pDockFavorite->toggleViewAction()->isChecked())
1950 m_pDockFavorite->toggleViewAction()->trigger();
1951 if(m_pDockRecent->toggleViewAction()->isChecked())
1952 m_pDockRecent->toggleViewAction()->trigger();
1953 m_Parameter.SetTabPosition(QTabWidget::East);
1954 if(!ui->actionTabBar_B->isChecked())
1955 ui->actionTabBar_B->trigger();
1956 if(!ui->actionMain_menu_bar_M->isChecked()) {
1957 ui->actionMain_menu_bar_M->trigger();
1958#if !defined(Q_OS_ANDROID)
1959 m_pToolBarMenuAction->setVisible(
false);
1962 if(!ui->actionToolBar_T->isChecked())
1963 ui->actionToolBar_T->trigger();
1964 addToolBar(Qt::LeftToolBarArea, ui->toolBar);
1965 if(!ui->actionStatus_bar_S->isChecked())
1966 ui->actionStatus_bar_S->trigger();
1969void MainWindow::on_actionLayoutMinimalism_triggered()
1971 qDebug(log) << Q_FUNC_INFO;
1972 if(m_pDockActive->toggleViewAction()->isChecked())
1973 m_pDockActive->toggleViewAction()->trigger();
1974 if(m_pDockFavorite->toggleViewAction()->isChecked())
1975 m_pDockFavorite->toggleViewAction()->trigger();
1976 if(m_pDockRecent->toggleViewAction()->isChecked())
1977 m_pDockRecent->toggleViewAction()->trigger();
1978 m_Parameter.SetTabPosition(QTabWidget::East);
1979 if(ui->actionTabBar_B->isChecked())
1980 ui->actionTabBar_B->trigger();
1981#if !defined(Q_OS_MACOS)
1982 if(ui->actionMain_menu_bar_M->isChecked()) {
1983 ui->actionMain_menu_bar_M->trigger();
1984 m_pToolBarMenuAction->setVisible(
true);
1987 if(!ui->actionToolBar_T->isChecked())
1988 ui->actionToolBar_T->trigger();
1989#if defined(Q_OS_LINUX)
1990 addToolBar(Qt::RightToolBarArea, ui->toolBar);
1992 addToolBar(Qt::LeftToolBarArea, ui->toolBar);
1994 if(ui->actionStatus_bar_S->isChecked())
1995 ui->actionStatus_bar_S->trigger();
virtual void sigShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
Use message box display information.
List the connect of be existed.
virtual void sigShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
Use message box display information.
static CICE * Instance()
Single instance.
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
Get parameter settings widget.
virtual int EnumPlugins(Handle *handle)
Enum plugins.
virtual COperate * CreateOperate(const QString &id)
New COperate pointer, the owner is caller.
virtual COperate * LoadOperate(const QString &szFile)
New COperate pointer from file, the owner is caller.
virtual int DeleteOperate(COperate *p)
Delete COperate.
virtual int SaveOperate(COperate *pOperate)
Accept Operate parameters to file.
int Initial(QString szFile=QString())
Initial.
virtual int SaveSettings(const QString szFile=QString())
Save Client parameters to file.
CParameterGlobal * GetGlobalParameters()
Get Global Parameters.
void sigNewOperate(COperate *pOperate, bool bOpenSettingsDialog)
This signal is triggered when a new operate is created in the plugin.
virtual int OpenDialogSettings(QWidget *parent=nullptr)
Open settings dialog.
virtual CSecurityLevel::Levels GetSecurityLevel() const
Get Security Level.
virtual CStats * GetStats()
Get statistics.
virtual int Start()=0
Start.
void sigFullScreen(bool bFullScreen)
Full screen.
virtual QWidget * GetViewer()=0
Get Viewer.
virtual const QString Name()
Name.
virtual int Stop()=0
Stop.
virtual const QString Description()
Description.
void sigUpdateParameters(COperate *pOperate)
Update parameters, notify application to save or show parameters.
void sigSecurityLevel()
Triggered when the security level changes.
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get menu.
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file.
virtual const QString DisplayName() const
The plugin display name.
virtual const QString Protocol() const =0
Plugin Protocol.
virtual const QString Id() const
ID. Default: Type() + ":" + Protocol() + ":" + Name()
virtual const QString Description() const =0
Plugin description.
int GetInterval()
Get interval.
virtual int AddView(QWidget *pView)=0
virtual QWidget * GetCurrentView()=0
virtual int RemoveView(QWidget *pView)=0
Q_INVOKABLE 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)
Show information.
virtual void slotShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
Use message box display information.
void slotRunning()
[MainWindow slotRunning]
void slotCloseView(const QWidget *pView)
[MainWindow slotRunning]
void slotCustomContextMenuRequested(const QPoint &pos)
MainWindow::slotCustomContextMenuRequested.
int Initial()
For time-consuming operations.