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)
84 QWidget* pContain =
new QWidget(
this);
86 pContain->setContentsMargins(0, 0, 0, 0);
87 setCentralWidget(pContain);
90 ui->actionKeyboard->setVisible(
false);
92 bool bVisible = (
nullptr != QGuiApplication::inputMethod());
93 ui->actionKeyboard->setVisible(bVisible);
94 ui->actionKeyboard->setEnabled(bVisible);
98 this, [&](
COperate* pOperate,
bool bOpenSettingsDialog) {
99 Start(pOperate, bOpenSettingsDialog);
103#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) && !defined(Q_OS_MACOS)
105 setWindowIcon(QIcon(
":/images/app"));
122 this->statusBar()->addPermanentWidget(&m_StatusBarMessage);
124 m_SendRate.setToolTip(tr(
"Send rate"));
125 m_SendRate.setStatusTip(tr(
"Send rate"));
128 this->statusBar()->addPermanentWidget(&m_SendRate);
129 m_ReceivesRate.setToolTip(tr(
"Receives rate"));
130 m_ReceivesRate.setStatusTip(tr(
"Receives rate"));
133 this->statusBar()->addPermanentWidget(&m_ReceivesRate);
134 m_TotalSends.setToolTip(tr(
"Total sends"));
135 m_TotalSends.setStatusTip(tr(
"Total sends"));
138 this->statusBar()->addPermanentWidget(&m_TotalSends);
139 m_TotalReceives.setToolTip(tr(
"Total receives"));
140 m_TotalReceives.setStatusTip(tr(
"Total receives"));
143 this->statusBar()->addPermanentWidget(&m_TotalReceives);
145 check = connect(&m_Timer, SIGNAL(timeout()),
this, SLOT(slotTimeOut()));
148 m_pSecureLevel =
new QLabel(statusBar());
152 m_pSecureLevel->hide();
153 statusBar()->addPermanentWidget(m_pSecureLevel);
157 setAcceptDrops(
true);
159 RabbitCommon::CTools::AddStyleMenu(ui->menuTools);
160 ui->menuTools->addMenu(RabbitCommon::CTools::GetLogMenu(
this));
162 m_pRecentMenu =
new RabbitCommon::CRecentMenu(
163 tr(
"Recently"), QIcon::fromTheme(
"document-open-recent"),
false,
this);
164 check = connect(m_pRecentMenu, SIGNAL(recentFileTriggered(
const QString&)),
165 this, SLOT(slotOpenFile(
const QString&)));
167 check = connect(&m_Parameter, SIGNAL(sigRecentMenuMaxCountChanged(
int)),
168 m_pRecentMenu, SLOT(setMaxCount(
int)));
170 QAction* pRecentAction = ui->menuOperate->insertMenu(
171 ui->actionOpenListRecent, m_pRecentMenu);
172 pRecentAction->setStatusTip(pRecentAction->text());
173 QToolButton* tbRecent =
new QToolButton(ui->toolBar);
174 tbRecent->setFocusPolicy(Qt::NoFocus);
175 tbRecent->setPopupMode(QToolButton::InstantPopup);
176 tbRecent->setMenu(m_pRecentMenu);
177 tbRecent->setIcon(pRecentAction->icon());
178 tbRecent->setText(pRecentAction->text());
179 tbRecent->setToolTip(pRecentAction->toolTip());
180 tbRecent->setStatusTip(pRecentAction->statusTip());
181 ui->toolBar->insertWidget(ui->actionOpenListRecent, tbRecent);
185 ui->actionUpdate->setIcon(updater.windowIcon());
188 QToolButton* tbStart =
new QToolButton(ui->toolBar);
189 tbStart->setFocusPolicy(Qt::NoFocus);
190 tbStart->setPopupMode(QToolButton::InstantPopup);
192 tbStart->setMenu(ui->menuStart);
193 tbStart->setIcon(QIcon::fromTheme(
"media-playback-start"));
194 tbStart->setText(tr(
"Start"));
195 tbStart->setToolTip(tr(
"Start"));
196 tbStart->setStatusTip(tr(
"Start"));
197 ui->toolBar->insertWidget(ui->actionStop, tbStart);
201 check = connect(&m_Parameter, SIGNAL(sigReceiveShortCutChanged()),
202 this, SLOT(slotShortCut()));
204 slotSystemTrayIconTypeChanged();
205 check = connect(&m_Parameter, SIGNAL(sigSystemTrayIconTypeChanged()),
207 SLOT(slotSystemTrayIconTypeChanged()));
209 check = connect(&m_Parameter, SIGNAL(sigEnableSystemTrayIcon()),
210 this, SLOT(slotEnableSystemTrayIcon()));
212 check = connect(&m_Parameter, SIGNAL(sigEnableTabToolTipChanged()),
213 this, SLOT(slotUpdateName()));
215 check = connect(&m_Parameter, SIGNAL(sigEnableTabIconChanged()),
216 this, SLOT(slotUpdateName()));
219 auto pTbMenu =
new QToolButton(ui->toolBar);
220 pTbMenu->setFocusPolicy(Qt::NoFocus);
221 pTbMenu->setPopupMode(QToolButton::InstantPopup);
223 pTbMenu->setText(ui->actionMain_menu_bar_M->text());
224 pTbMenu->setIcon(ui->actionMain_menu_bar_M->icon());
225 pTbMenu->setToolTip(ui->actionMain_menu_bar_M->toolTip());
226 pTbMenu->setStatusTip(ui->actionMain_menu_bar_M->statusTip());
227 QMenu *pMenu =
new QMenu(pTbMenu);
228 pMenu->addActions(this->menuBar()->actions());
229 pTbMenu->setMenu(pMenu);
230 m_pToolBarMenuAction = ui->toolBar->insertWidget(ui->actionTabBar_B, pTbMenu);
231#if defined(Q_OS_ANDROID)
232 m_pToolBarMenuAction->setVisible(
true);
234 m_pToolBarMenuAction->setVisible(
false);
237 check = connect(&m_Parameter, SIGNAL(sigStartByTypeChanged()),
238 this, SLOT(slotStartByType()));
241 m_pDockFavorite =
new QDockWidget(
this);
244 m_pFavoriteView =
new CFavoriteView(&m_Parameter, m_pDockFavorite);
247 if(m_pFavoriteView->m_pDockTitleBar)
248 m_pDockFavorite->setTitleBarWidget(m_pFavoriteView->m_pDockTitleBar);
249 check = connect(m_pFavoriteView, SIGNAL(sigStart(
const QString&,
bool)),
250 this, SLOT(slotOpenFile(
const QString&,
bool)));
252 check = connect(m_pFavoriteView, SIGNAL(sigFavorite()),
253 this, SLOT(on_actionAdd_to_favorite_triggered()));
258 check = connect(&m_Parameter, SIGNAL(sigFavoriteEditChanged(
bool)),
259 m_pFavoriteView, SLOT(slotDoubleEditNode(
bool)));
261 emit m_Parameter.sigFavoriteEditChanged(m_Parameter.GetFavoriteEdit());
262 m_pDockFavorite->setWidget(m_pFavoriteView);
263 m_pDockFavorite->setWindowTitle(m_pFavoriteView->windowTitle());
266 m_pDockFavorite->setObjectName(
"dockFavorite");
267#if defined(Q_OS_ANDROID)
268 m_pDockFavorite->hide();
270 ui->menuView->addAction(m_pDockFavorite->toggleViewAction());
271 m_pDockFavorite->toggleViewAction()->setIcon(QIcon::fromTheme(
"emblem-favorite"));
272 addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, m_pDockFavorite);
275 m_pDockRecent =
new QDockWidget(
this);
279 =
new CFrmRecent(
this, &m_Manager, m_Parameter,
true,
282 if(m_pRecent->m_pDockTitleBar)
283 m_pDockRecent->setTitleBarWidget(
284 m_pRecent->m_pDockTitleBar);
285 check = connect(m_pRecent,
286 SIGNAL(sigStart(
const QString&,
bool)),
287 this, SLOT(slotOpenFile(
const QString&,
bool)));
289 check = connect(m_pRecent, &CFrmRecent::sigAddToFavorite,
290 m_pFavoriteView, &CFavoriteView::slotAddToFavorite);
295 m_pDockRecent->setWidget(m_pRecent);
296 m_pDockRecent->setWindowTitle(
297 m_pRecent->windowTitle());
300 m_pDockRecent->setObjectName(
"dockRecent");
301#if defined(Q_OS_ANDROID)
302 m_pDockRecent->hide();
304 ui->menuView->addAction(m_pDockRecent->toggleViewAction());
305 m_pDockRecent->toggleViewAction()->setIcon(QIcon::fromTheme(
"document-open-recent"));
306 tabifyDockWidget(m_pDockFavorite, m_pDockRecent);
309 m_pDockActive =
new QDockWidget(
this);
313 m_Operates, m_Parameter,
314 ui->menuStart, ui->actionStop,
315 m_pRecentMenu, m_pDockActive);
317 m_pDockActive->setWidget(m_pFrmActive);
318 if(m_pFrmActive->m_pDockTitleBar)
319 m_pDockActive->setTitleBarWidget(
320 m_pFrmActive->m_pDockTitleBar);
321 m_pDockActive->setWindowTitle(m_pFrmActive->windowTitle());
322 check = connect(m_pFrmActive, SIGNAL(sigChanged(
COperate*)),
323 this, SLOT(slotOperateChanged(
COperate*)));
325 check = connect(m_pFrmActive, &CFrmActive::sigAddToFavorite,
326 m_pFavoriteView, &CFavoriteView::slotAddToFavorite);
329 m_pDockActive->setObjectName(
"dockListActive");
330#if defined(Q_OS_ANDROID)
331 m_pDockActive->hide();
333 ui->menuView->addAction(m_pDockActive->toggleViewAction());
334 m_pDockActive->toggleViewAction()->setIcon(QIcon::fromTheme(
"network-wired"));
335 tabifyDockWidget(m_pDockFavorite, m_pDockActive);
338 QActionGroup* pGBView =
new QActionGroup(
this);
340 pGBView->addAction(ui->actionViewTab);
341 pGBView->addAction(ui->actionViewSplit);
343 qDebug(log) <<
"View type:" << m_Parameter.GetViewType();
344 if(CParameterApp::ViewType::Tab == m_Parameter.GetViewType()) {
345 ui->actionViewTab->setChecked(
true);
346 on_actionViewTab_triggered();
348 if(CParameterApp::ViewType::Splitter == m_Parameter.GetViewType()) {
349 ui->actionViewSplit->setChecked(
true);
350 on_actionViewSplit_triggered();
352 check = connect(&m_Parameter, &CParameterApp::sigViewTypeChanged,
358 m_pMenuActivityGroup =
new QActionGroup(ui->menuActivity);
359 m_ptbMenuActivity =
new QToolButton(ui->toolBar);
360 m_ptbMenuActivity->setFocusPolicy(Qt::NoFocus);
361 m_ptbMenuActivity->setPopupMode(QToolButton::InstantPopup);
362 m_ptbMenuActivity->setMenu(ui->menuActivity);
363 m_ptbMenuActivity->setIcon(ui->menuActivity->icon());
364 m_ptbMenuActivity->setText(ui->menuActivity->title());
365 m_ptbMenuActivity->setToolTip(ui->menuActivity->toolTip());
366 m_ptbMenuActivity->setStatusTip(ui->menuActivity->statusTip());
367 ui->toolBar->insertWidget(ui->actionTabBar_B, m_ptbMenuActivity);
376 SIGNAL(sigConnected()),
377 this, SLOT(slotSignalConnected()));
380 SIGNAL(sigDisconnected()),
381 this, SLOT(slotSignalDisconnected()));
384 SIGNAL(sigError(
const int,
const QString&)),
385 this, SLOT(slotSignalError(
const int,
const QString&)));
389 m_pSignalStatus =
new QPushButton();
390 m_pSignalStatus->setToolTip(tr(
"ICE signal status"));
391 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
392 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
393 slotSignalDisconnected();
394 statusBar()->addPermanentWidget(m_pSignalStatus);
397 if(m_Parameter.GetSaveMainWindowStatus())
399 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
400 QSettings::IniFormat);
402 = set.value(
"MainWindow/Status/Geometry").toByteArray();
403 if(!geometry.isEmpty())
404 restoreGeometry(geometry);
406 QByteArray state = set.value(
"MainWindow/Status/State").toByteArray();
410 ui->actionTabBar_B->setChecked(m_Parameter.GetTabBar());
411 on_actionTabBar_B_toggled(m_Parameter.GetTabBar());
412 ui->actionStatus_bar_S->setChecked(m_Parameter.GetStatusBar());
413 statusBar()->setVisible(m_Parameter.GetStatusBar());
414 ui->actionMain_menu_bar_M->setChecked(m_Parameter.GetMenuBar());
415 menuBar()->setVisible(m_Parameter.GetMenuBar());
416 ui->actionToolBar_T->setChecked(!ui->toolBar->isHidden());
420 ui->actionMain_menu_bar_M->setVisible(
false);
423 if(!m_Parameter.GetMenuBar()) {
424 m_pToolBarMenuAction->setVisible(
true);
430MainWindow::~MainWindow()
432 qDebug(log) <<
"MainWindow::~MainWindow()";
433 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
440 qDebug(log) << Q_FUNC_INFO;
447 QMessageBox initMsgBox(QMessageBox::Information, tr(
"Load"), tr(
"Load ......"));
448 initMsgBox.showNormal();
449 qApp->processEvents();
452 szMsg = tr(
"Load plugins ......");
453 initMsgBox.setText(szMsg);
455 qApp->processEvents();
458 szErr = tr(
"Initial manage error");
466 bool bRet = QMetaObject::invokeMethod(
468 "SetGlobalParameters",
469 Qt::DirectConnection,
472 szErr = tr(
"Failed to set global parameters");
473 qCritical(log) << szErr;
480 szMsg = tr(
"Load list recent dock ......");
481 initMsgBox.setText(szMsg);
483 qApp->processEvents();
484 nRet = m_pRecent->Initial();
486 szErr = tr(
"Initial recent dock error");
492 szMsg = tr(
"Load recent menu ......");
493 initMsgBox.setText(szMsg);
495 qApp->processEvents();
497 auto recents = m_pRecent->GetRecents(m_Parameter.GetRecentMenuMaxCount());
499 for(
auto it = recents.rbegin(); it != recents.rend(); it++) {
500 m_pRecentMenu->addRecentFile(it->GetFile(), it->szName, it->icon);
502 m_pRecentMenu->slotShowFileEixst(
503 m_Parameter.GetGlobalParameters()->GetSaveSettingsType() == CParameterGlobal::File);
504 bool check = connect(
505 m_Parameter.GetGlobalParameters(),
506 &CParameterGlobal::sigSaveSettingsTypeChanged,
507 m_pRecentMenu, [
this]() {
508 if(!(m_pRecentMenu && m_Parameter.GetGlobalParameters()))
510 m_pRecentMenu->slotShowFileEixst(
511 m_Parameter.GetGlobalParameters()->GetSaveSettingsType() == CParameterGlobal::File);
517 if(m_pFavoriteView) {
518 szMsg = tr(
"Load favorite ......");
519 initMsgBox.setText(szMsg);
521 qApp->processEvents();
522 nRet = m_pFavoriteView->Initial();
524 szErr = tr(
"Initial favorite error");
529 slotEnableSystemTrayIcon();
533 szMsg = tr(
"Load laster operate ......");
534 initMsgBox.setText(szMsg);
536 qApp->processEvents();
537 nRet = LoadOperateLasterClose();
539 szErr = tr(
"Initial load laster close operate error");
550 slotError(nRet, szErr);
551 QMessageBox errMsgBox;
552 errMsgBox.setWindowTitle(QObject::tr(
"Error"));
553 errMsgBox.setText(QObject::tr(
"Initial error:") + szErr);
554 errMsgBox.setIcon(QMessageBox::Critical);
556 auto logMenu = RabbitCommon::CTools::GetLogMenu();
557 QPushButton *pbLog =
new QPushButton(logMenu->title());
558 pbLog->setMenu(logMenu);
560 QPushButton *pbettings =
new QPushButton(ui->actionSettings->text());
561 QMenu* pSettings =
new QMenu(pbettings);
562 pSettings->addAction(ui->actionSettings);
563 pbettings->setMenu(pSettings);
564 errMsgBox.addButton(pbettings, QMessageBox::ActionRole);
565 errMsgBox.addButton(pbLog, QMessageBox::ActionRole);
566 errMsgBox.addButton(QMessageBox::Cancel);
573void MainWindow::SetView(
CView* pView)
575 qDebug(log) << Q_FUNC_INFO;
579 m_pView->disconnect();
582 auto* pContain = centralWidget();
583 if(!pContain)
return;
584 auto* pOldLayout = pContain->layout();
586 pContain->setLayout(
nullptr);
589 while ((item = pOldLayout->takeAt(0)) !=
nullptr) {
590 if (item->widget()) {
591 item->widget()->deleteLater();
597 auto* pLayout =
new QVBoxLayout(pContain);
599 pLayout->setContentsMargins(0, 0, 0, 0);
600 pLayout->setSpacing(0);
601 pContain->setLayout(pLayout);
602 pLayout->addWidget(m_pView);
607 check = connect(m_pView, SIGNAL(sigCloseView(
const QWidget*)),
610 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
611 this, SLOT(slotCurrentViewChanged(
const QWidget*)));
614 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
615 m_pFrmActive, SLOT(slotViewChanged(
const QWidget*)));
618 check = connect(m_pView, SIGNAL(customContextMenuRequested(
const QPoint&)),
622 foreach (
auto c, m_Operates) {
624 m_pView->
AddView(c->GetViewer());
625 m_pView->SetWidowsTitle(
626 c->GetViewer(), c->Name(), c->Icon(), c->Description());
629 szErr += c->metaObject()->className();
630 szErr +=
"::GetViewer() ";
631 szErr +=
"is nullptr.";
632 qWarning(log) << szErr;
635 m_pView->SetVisibleTab(m_Parameter.GetTabBar());
638void MainWindow::on_actionViewTab_triggered()
640 qDebug(log) << Q_FUNC_INFO;
641 if(!ui->actionViewTab->isChecked())
return;
642 m_Parameter.SetViewType(CParameterApp::ViewType::Tab);
646void MainWindow::on_actionViewSplit_triggered()
648 qDebug(log) << Q_FUNC_INFO;
649 if(!ui->actionViewSplit->isChecked())
return;
650 m_Parameter.SetViewType(CParameterApp::ViewType::Splitter);
654void MainWindow::on_actionAbout_triggered()
657 CDlgAbout *about =
new CDlgAbout(
this);
658 QIcon icon = QIcon::fromTheme(
"app");
660 auto sizeList = icon.availableSizes();
661 if(!sizeList.isEmpty()) {
662 QPixmap p = icon.pixmap(*sizeList.begin());
663 about->m_AppIcon = p.toImage();
666 about->m_szBuildTime = QString(
"%1/%2").arg(__DATE__, __TIME__);
667 about->m_szCopyrightStartTime =
"2020";
668 about->m_szVersionRevision = RabbitRemoteControl_REVISION;
669 about->m_szDetails = m_Manager.Details();
670 RC_SHOW_WINDOW(about);
674void MainWindow::on_actionUpdate_triggered()
676 if(!qEnvironmentVariable(
"SNAP").isEmpty()) {
677 QDesktopServices::openUrl(QUrl(
"https://snapcraft.io/rabbitremotecontrol"));
678 }
else if(!qEnvironmentVariable(
"FLATPAK_ID").isEmpty()) {
679 QDesktopServices::openUrl(QUrl(
"https://flathub.org/apps/io.github.KangLin.RabbitRemoteControl"));
682 CFrmUpdater* m_pfrmUpdater =
new CFrmUpdater();
683 QIcon icon = QIcon::fromTheme(
"app");
685 auto sizeList = icon.availableSizes();
686 if(!sizeList.isEmpty()) {
687 QPixmap p = icon.pixmap(*sizeList.begin());
688 m_pfrmUpdater->SetTitle(p.toImage());
691 m_pfrmUpdater->SetInstallAutoStartup();
692 RC_SHOW_WINDOW(m_pfrmUpdater);
697void MainWindow::on_actionFull_screen_F_triggered()
701 m_pView->SetFullScreen(!isFullScreen());
706 qDebug(log) <<
"Exit full screen";
707 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-fullscreen"));
708 ui->actionFull_screen_F->setText(tr(
"Full screen"));
709 ui->actionFull_screen_F->setToolTip(tr(
"Full screen"));
710 ui->actionFull_screen_F->setStatusTip(tr(
"Full screen"));
711 ui->actionFull_screen_F->setWhatsThis(tr(
"Full screen"));
713 ui->toolBar->setVisible(m_FullState.toolBar);
714 ui->statusbar->setVisible(m_FullState.statusbar);
715 ui->menubar->setVisible(m_FullState.menubar);
717 m_pDockActive->setVisible(m_FullState.dockListActive);
718 m_pDockRecent->setVisible(m_FullState.dockListRecent);
719 m_pDockFavorite->setVisible(m_FullState.dockFavorite);
721 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
724 pDockDebugLog->setVisible(m_FullState.dockDebugLog);
727 if(m_pFullScreenToolBar)
730 m_pFullScreenToolBar->close();
731 m_pFullScreenToolBar =
nullptr;
734 emit sigShowNormal();
736 this->activateWindow();
738 emit sigFullScreen(
false);
742 qDebug(log) <<
"Entry full screen";
745 this->showFullScreen();
746 emit sigFullScreen(
true);
748 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-restore"));
749 ui->actionFull_screen_F->setText(tr(
"Exit full screen"));
750 ui->actionFull_screen_F->setToolTip(tr(
"Exit full screen"));
751 ui->actionFull_screen_F->setStatusTip(tr(
"Exit full screen"));
752 ui->actionFull_screen_F->setWhatsThis(tr(
"Exit full screen"));
754 m_FullState.toolBar = ui->toolBar->isVisible();
755 ui->toolBar->setVisible(
false);
756 m_FullState.statusbar = ui->statusbar->isVisible();
757 ui->statusbar->setVisible(
false);
758 m_FullState.menubar = ui->menubar->isVisible();
759 ui->menubar->setVisible(
false);
761 m_FullState.dockListActive = m_pDockActive->isVisible();
762 m_pDockActive->setVisible(
false);
763 m_FullState.dockListRecent = m_pDockRecent->isVisible();
764 m_pDockRecent->setVisible(
false);
765 m_FullState.dockFavorite = m_pDockFavorite->isVisible();
766 m_pDockFavorite->setVisible(
false);
768 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
771 m_FullState.dockDebugLog = pDockDebugLog->isVisible();
772 pDockDebugLog->setVisible(
false);
775 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
778 QScreen* pScreen = qApp->primaryScreen();
780 QPoint pos(pScreen->geometry().left()
781 + (pScreen->geometry().width()
782 - m_pFullScreenToolBar->frameGeometry().width()) / 2,
783 pScreen->geometry().top());
784 qDebug(log) <<
"Primary screen geometry:" << pScreen->geometry()
785 <<
"availableGeometry:" << pScreen->availableGeometry()
786 << pos << mapToGlobal(pos);
787 m_pFullScreenToolBar->move(pos);
789 bool check = connect(m_pFullScreenToolBar, SIGNAL(sigExitFullScreen()),
790 this, SLOT(on_actionFull_screen_F_triggered()));
792 check = connect(m_pFullScreenToolBar, SIGNAL(sigExit()),
793 this, SLOT(on_actionExit_E_triggered()));
796 check = connect(
this, SIGNAL(sigOperateMenuChanged(QAction*)),
797 m_pFullScreenToolBar,
798 SLOT(slotOperateMenuChanged(QAction*)));
801 m_pFullScreenToolBar->show();
804void MainWindow::slotViewerFocusIn(QWidget *pView)
806 COperate* c = qobject_cast<COperate*>(sender());
807 qDebug(log) << Q_FUNC_INFO <<
"Focus:" << c << pView;
813void MainWindow::slotOperateChanged(
COperate *o)
820void MainWindow::slotCurrentViewChanged(
const QWidget* pView)
822 qDebug(log) << Q_FUNC_INFO;
828 foreach(
auto o, m_Operates) {
831 foreach (
auto a, ui->menuActivity->actions()) {
832 if(a->data().value<
COperate*>() == o)
835 ui->actionStop_other->setText(
836 tr(
"Stop other except the current \"%1\"").arg(o->
Name()));
837 ui->actionStop_other->setStatusTip(ui->actionStop_other->text());
838 ui->actionStop_other->setToolTip(ui->actionStop_other->text());
842 QTimer::singleShot(0,
this, SLOT(slotTimeOut()));
845void MainWindow::EnableMenu(
bool bEnable)
847 qDebug(log) << Q_FUNC_INFO << bEnable;
848 ui->actionClone->setEnabled(bEnable);
849 ui->actionAdd_to_favorite->setEnabled(bEnable);
850 ui->actionStop->setEnabled(bEnable);
851 ui->actionStop_All->setEnabled(bEnable);
852 ui->actionStop_other->setEnabled(bEnable);
854 if(m_Operates.size() > 1)
855 ui->actionStop_other->setEnabled(
true);
857 ui->actionStop_other->setEnabled(
false);
859 ui->actionStop_other->setText(tr(
"Stop other"));
861 ui->actionTabBar_B->setEnabled(bEnable);
862 ui->menuActivity->setEnabled(bEnable);
863 m_ptbMenuActivity->setEnabled(bEnable);
864 slotLoadOperateMenu();
867void MainWindow::slotMenuActivity()
869 QAction* pAction = qobject_cast<QAction*>(sender());
874 slotOperateChanged(p);
877void MainWindow::slotLoadOperateMenu()
879 qDebug(log) << Q_FUNC_INFO;
881 if(m_pActionOperateMenu) {
882 ui->menuOperate->removeAction(m_pActionOperateMenu);
883 m_pActionOperateMenu =
nullptr;
885 ui->toolBar->removeAction(m_pActionTBOperate);
891 qDebug(log) <<
"The current view is empty";
894 foreach(
auto op, m_Operates)
896 if(op->GetViewer() == pWin)
898 qDebug(log) <<
"Load plugin menu";
899 auto m = op->GetMenu(ui->menuTools);
902 m_pActionOperateMenu = ui->menuOperate->insertMenu(ui->actionAdd_to_favorite, m);
905 m_pTBOperate =
new QToolButton(ui->toolBar);
907 m_pTBOperate->setFocusPolicy(Qt::NoFocus);
908 m_pTBOperate->setPopupMode(QToolButton::InstantPopup);
909 m_pTBOperate->setMenu(m);
910 m_pTBOperate->setIcon(m->icon());
911 m_pTBOperate->setText(m->title());
912 m_pTBOperate->setToolTip(m->toolTip());
913 m_pTBOperate->setStatusTip(m->statusTip());
914 m_pTBOperate->show();
915 m_pActionTBOperate = ui->toolBar->insertWidget(ui->actionAdd_to_favorite, m_pTBOperate);
917 emit sigOperateMenuChanged(m_pActionOperateMenu);
934 qDebug(log) <<
"The current view is empty";
937 foreach(
auto p, m_Operates)
941 qDebug(log) <<
"Load plugin menu";
942 auto m = p->
GetMenu(ui->menuTools);
950void MainWindow::on_actionExit_E_triggered()
955void MainWindow::keyReleaseEvent(QKeyEvent *event)
961 on_actionFull_screen_F_triggered();
964 QMainWindow::keyReleaseEvent(event);
967void MainWindow::slotUpdateParameters(
COperate *pOperate)
972void MainWindow::on_actionClone_triggered()
976 foreach(
auto pOperate, m_Operates)
980 QString szFile = pOperate->GetSettingsFile();
982 if(!pOperate)
return;
983 Start(pOperate,
false, szFile);
989void MainWindow::slotOpenFile(
const QString& szFile,
bool bOpenSettings)
991 if(szFile.isEmpty())
return;
995 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
999 Start(p, bOpenSettings, szFile);
1002void MainWindow::on_actionOpenRRCFile_triggered()
1004 QString szFile = QFileDialog::getOpenFileName(
1006 tr(
"Open rabbit remote control file"),
1007 RabbitCommon::CDir::Instance()->GetDirUserData(),
1008 tr(
"Rabbit remote control Files (*.rrc);;All files(*.*)"));
1009 if(szFile.isEmpty())
return;
1014 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
1021void MainWindow::slotStart()
1023 if(
nullptr == m_pView)
1028 QAction* pAction = qobject_cast<QAction*>(this->sender());
1031 if(
nullptr == p)
return;
1047 qDebug(log) <<
"MainWindow::Start: set:" << set <<
"; File:" << szFile;
1050 bool check = connect(pOperate, SIGNAL(sigRunning()),
1053 check = connect(pOperate, SIGNAL(sigStop()),
1054 this, SLOT(slotStop()));
1056 check = connect(pOperate, SIGNAL(sigFinished()),
1057 this, SLOT(slotFinished()));
1059 check = connect(pOperate, SIGNAL(sigError(
const int,
const QString &)),
1060 this, SLOT(slotError(
const int,
const QString&)));
1062 check = connect(pOperate, SIGNAL(sigShowMessageBox(
const QString&,
const QString&,
1063 const QMessageBox::Icon&)),
1065 const QMessageBox::Icon&)));
1067 check = connect(pOperate, SIGNAL(sigInformation(
const QString&)),
1070 check = connect(pOperate, SIGNAL(sigUpdateName(
const QString&)),
1071 this, SLOT(slotUpdateName(
const QString&)));
1073 check = connect(pOperate, SIGNAL(sigUpdateParameters(
COperate*)),
1074 this, SLOT(slotUpdateParameters(
COperate*)));
1077 this, [
this, pOperate](
bool bFull) {
1079 if((bFull && !isFullScreen()) || (!bFull && isFullScreen()))
1080 on_actionFull_screen_F_triggered();
1085 this, [
this, pOperate]() {
1086 if(m_pView && pOperate) {
1088 slotCurrentViewChanged(pOperate->
GetViewer());
1098 case QDialog::Rejected:
1101 case QDialog::Accepted:
1107 if(szFile.isEmpty())
1108 szFile = pOperate->GetSettingsFile();
1110 pOperate->SetSettingsFile(szFile);
1116 m_pRecentMenu->addRecentFile(szFile, pOperate->
Name(), pOperate->Icon());
1118 item.szOperateId = pOperate->Id();
1119 item.icon = pOperate->Icon();
1120 item.szName = pOperate->
Name();
1121 item.szProtocol = pOperate->Protocol();
1122 item.szType = pOperate->GetTypeName();
1124 item.SetFile(szFile);
1125 item.time = QDateTime::currentDateTime();
1126 m_pRecent->AddRecent(item);
1129 if(!pOperate->
Name().isEmpty())
1133 if(m_Operates.contains(pOperate)) {
1136 m_pView->SetCurrentView(pOperate->
GetViewer());
1139 szErr += pOperate->metaObject()->className();
1140 szErr +=
"::GetViewer() ";
1141 szErr +=
"is nullptr.";
1142 qWarning(log) << szErr;
1151 m_pView->SetWidowsTitle(pOperate->
GetViewer(), pOperate->
Name(),
1156 szErr += pOperate->metaObject()->className();
1157 szErr +=
"::GetViewer() ";
1158 szErr +=
"is nullptr.";
1159 qWarning(log) << szErr;
1161 check = connect(pOperate, SIGNAL(sigViewerFocusIn(QWidget*)),
1162 this, SLOT(slotViewerFocusIn(QWidget*)));
1165 m_Operates.insert(pOperate);
1168 m_pFrmActive->slotLoad();
1172 vOperate.setValue(pOperate);
1173 QAction* m_pActionmenuActivity = ui->menuActivity->addAction(
1174 pOperate->Icon(), pOperate->
Name(),
this, SLOT(slotMenuActivity()));
1175 m_pActionmenuActivity->setData(vOperate);
1176 m_pActionmenuActivity->setCheckable(
true);
1177 m_pMenuActivityGroup->addAction(m_pActionmenuActivity);
1178 m_pActionmenuActivity->setChecked(
true);
1181 nRet = pOperate->
Start();
1193 COperate* p = qobject_cast<COperate*>(sender());
1218 m->addAction(ui->actionClone);
1219 m->addAction(ui->actionStop_All);
1220 m->addAction(ui->actionStop_other);
1224 qDebug(log) << Q_FUNC_INFO << p->
Name();
1230 qDebug(log) <<
"MainWindow::slotCloseView" << pView;
1232 foreach(
auto p, m_Operates)
1243void MainWindow::on_actionStop_other_triggered()
1245 if(!m_pView)
return;
1246 foreach(
auto p, m_Operates)
1257void MainWindow::on_actionStop_All_triggered()
1259 foreach(
auto p, m_Operates)
1267void MainWindow::on_actionStop_triggered()
1269 qDebug(log) << Q_FUNC_INFO;
1270 if(!m_pView)
return;
1276void MainWindow::slotStop()
1278 COperate* pOperate = qobject_cast<COperate*>(sender());
1279 if(!pOperate)
return;
1280 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
1286void MainWindow::slotFinished()
1288 COperate* pOperate = qobject_cast<COperate*>(sender());
1289 if(!pOperate)
return;
1291 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
1292 foreach(
auto a, ui->menuActivity->actions()) {
1295 ui->menuActivity->removeAction(a);
1296 m_pMenuActivityGroup->removeAction(a);
1299 foreach(
auto p, m_Operates)
1304 m_Operates.remove(p);
1306 m_pFrmActive->slotLoad();
1311 if(m_Operates.isEmpty())
1312 if(m_pActionOperateMenu) {
1313 ui->menuTools->removeAction(m_pActionOperateMenu);
1314 ui->toolBar->removeAction(m_pActionOperateMenu);
1315 m_pActionOperateMenu =
nullptr;
1323void SetIndicator(QLabel* label, QColor color,
int size)
1325 QString min_width = QString(
"min-width: %1px;").arg(size);
1326 QString min_height = QString(
"min-height: %1px;").arg(size);
1327 QString max_width = QString(
"max-width: %1px;").arg(size);
1328 QString max_height = QString(
"max-height: %1px;").arg(size);
1330 QString border_radius = QString(
"border-radius: %1px;").arg(size / 2);
1331 QString border = QString(
"border:1px solid ") + color.name() +
";";
1333 QString background =
"background-color: ";
1334 background += color.name() +
";";
1335 QString SheetStyle = min_width + min_height + max_width + max_height + border_radius + border + background;
1336 label->setStyleSheet(SheetStyle);
1339void MainWindow::SetSecureLevel(
COperate* o)
1341 if(!m_pSecureLevel)
return;
1344 if(szLevel.isEmpty()) {
1345 m_pSecureLevel->hide();
1348 m_pSecureLevel->setText(szLevel);
1349 m_pSecureLevel->setToolTip(CSecurityLevel::GetString(o->
GetSecurityLevel()));
1350 m_pSecureLevel->show();
1352 m_pSecureLevel->hide();
1355void MainWindow::slotSignalConnected()
1357 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Connected"));
1358 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1359 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1361 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wired"));
1364void MainWindow::slotSignalDisconnected()
1366 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Disconnected"));
1367 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1368 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1370 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wireless"));
1373void MainWindow::slotSignalError(
const int nError,
const QString &szInfo)
1375 slotSignalDisconnected();
1376 slotError(nError, szInfo);
1379void MainWindow::slotSignalPushButtonClicked(
bool checked)
1389void MainWindow::slotError(
const int nError,
const QString &szInfo)
1392 slotStatusMessage(szInfo, MessageLevel::Error);
1396 const QString &title,
const QString &message,
1397 const QMessageBox::Icon &icon)
1400 if(!m_Parameter.GetMessageBoxDisplayInformation())
1403 QMessageBox msg(icon, title, message, QMessageBox::Ok,
this);
1404 QCheckBox* cb =
new QCheckBox(
1405 tr(
"Use message box to display information"),
this);
1406 cb->setChecked(
true);
1407 msg.setCheckBox(cb);
1408 RC_SHOW_WINDOW(&msg);
1409 if(!cb->isChecked())
1411 m_Parameter.SetMessageBoxDisplayInformation(
false);
1418 slotStatusMessage(szInfo, MessageLevel::Normal);
1422void MainWindow::slotStatusMessage(QString szMessage, MessageLevel level)
1426 switch ((MessageLevel)level) {
1427 case MessageLevel::Error:
1428 pe.setColor(QPalette::WindowText, Qt::red);
1431 case MessageLevel::Warning:
1432 pe.setColor(QPalette::WindowText, Qt::yellow);
1438 m_StatusBarMessage.setPalette(pe);
1439 m_StatusBarMessage.setToolTip(szMessage);
1444 m_StatusBarMessage.setText(szLevel);
1445 statusBar()->showMessage(szMessage);
1448void MainWindow::slotUpdateName()
1450 foreach (
auto p, m_Operates)
1459 szErr += p->metaObject()->className();
1460 szErr +=
"::GetViewer() ";
1461 szErr +=
"is nullptr.";
1462 qWarning(log) << szErr;
1467void MainWindow::slotUpdateName(
const QString& szName)
1469 COperate* p = qobject_cast<COperate*>(sender());
1472 m_pView->SetWidowsTitle(p->
GetViewer(), szName,
1477 m_pRecentMenu->updateRecentFile(p->GetSettingsFile(), szName, p->Icon());
1480 item.SetFile(p->GetSettingsFile());
1481 item.szName = p->
Name();
1484 m_pRecent->UpdateRecent(item);
1487 foreach(
auto a, ui->menuActivity->actions()) {
1488 if(a->data().value<
COperate*>() == p) {
1490 a->setIcon(p->Icon());
1496 m_pFavoriteView->slotUpdateFavorite(
1497 p->GetSettingsFile(), szName, p->
Description(), p->Icon());
1500 m_pFrmActive->slotLoad();
1503QAction* MainWindow::GetStartAction(QMenu* pMenu,
CPlugin *pPlug)
1507 szTitle = pPlug->
Protocol() +
": ";
1509 QAction* p = pMenu->addAction(szTitle);
1512 p->setData(pPlug->
Id());
1513 p->setIcon(pPlug->Icon());
1517void MainWindow::slotStartByType()
1519 qDebug(log) << Q_FUNC_INFO;
1520 auto m = ui->menuStart->actions();
1521 foreach(
auto a, m) {
1524 foreach (
auto a, m_MenuStartByType) {
1527 ui->menuStart->clear();
1528 m_MenuStartByType.clear();
1535 QMenu* m = ui->menuStart;
1536 if(m_Parameter.GetStartByType()) {
1537 auto it = m_MenuStartByType.find(pPlugin->Type());
1538 if(it == m_MenuStartByType.end()) {
1539 m =
new QMenu(pPlugin->TypeName(pPlugin->Type()), ui->menuStart);
1540 m_MenuStartByType[pPlugin->Type()] = m;
1541 ui->menuStart->addMenu(m);
1546 QAction* p = GetStartAction(m, pPlugin);
1548 check = connect(p, SIGNAL(triggered()),
this, SLOT(slotStart()));
1553void MainWindow::closeEvent(QCloseEvent *event)
1555 qDebug(log) <<
"MainWindow::closeEvent()";
1557 if(m_Parameter.GetSaveMainWindowStatus())
1559 on_actionFull_screen_F_triggered();
1561 SaveOperateLasterClose();
1563 foreach (
auto it, m_Operates)
1566 emit it->sigUpdateParameters(it);
1570 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
1571 QSettings::IniFormat);
1572 if(m_Parameter.GetSaveMainWindowStatus())
1574 set.setValue(
"MainWindow/Status/Geometry", saveGeometry());
1575 set.setValue(
"MainWindow/Status/State", saveState());
1577 m_Parameter.SetTabBar(ui->actionTabBar_B->isChecked());
1578 m_Parameter.SetMenuBar(menuBar()->isVisible());
1579 m_Parameter.SetStatusBar(statusBar()->isVisible());
1581 set.remove(
"MainWindow/Status/Geometry");
1582 set.remove(
"MainWindow/Status/State");
1588 QMainWindow::closeEvent(event);
1594int MainWindow::LoadOperateLasterClose()
1596 if(!m_Parameter.GetOpenLasterClose())
1599 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1600 + QDir::separator() +
"LasterClose.dat");
1601 if(f.open(QFile::ReadOnly))
1607 if(szFile.isEmpty())
1609 slotOpenFile(szFile);
1616int MainWindow::SaveOperateLasterClose()
1618 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1619 + QDir::separator() +
"LasterClose.dat");
1620 bool bRet = f.open(QFile::WriteOnly);
1621 if(bRet && m_Parameter.GetOpenLasterClose())
1624 foreach(
auto it, m_Operates)
1626 d << it->GetSettingsFile();
1633void MainWindow::on_actionTabBar_B_toggled(
bool bShow)
1637 m_pView->SetVisibleTab(bShow);
1638 m_Parameter.SetTabBar(bShow);
1641 m_pDockActive->setVisible(bShow);
1645void MainWindow::on_actionMain_menu_bar_M_toggled(
bool checked)
1647 qDebug(log) << Q_FUNC_INFO << checked;
1648 if(ui->toolBar->isHidden() && !checked)
1650 if( QMessageBox::StandardButton::Yes
1651 == QMessageBox::information(
this, tr(
"Hide menu bar"),
1652 tr(
"The menu bar will be hidden, the tool bar must be showed."),
1653 QMessageBox::StandardButton::Yes
1654 | QMessageBox::StandardButton::No))
1656 ui->actionToolBar_T->setChecked(
true);
1657 if(m_pToolBarMenuAction)
1658 m_pToolBarMenuAction->setVisible(
true);
1660 ui->actionMain_menu_bar_M->setChecked(
true);
1661#if !defined(Q_OS_ANDROID)
1662 if(m_pToolBarMenuAction)
1663 m_pToolBarMenuAction->setVisible(
false);
1669 menuBar()->setVisible(checked);
1670 m_Parameter.SetMenuBar(checked);
1671#if !defined(Q_OS_ANDROID)
1672 if(m_pToolBarMenuAction)
1673 m_pToolBarMenuAction->setVisible(!checked);
1677void MainWindow::on_actionToolBar_T_toggled(
bool checked)
1679 qDebug(log) << Q_FUNC_INFO << checked;
1680 if(menuBar()->isHidden() && !checked)
1682 if( QMessageBox::StandardButton::Yes
1683 == QMessageBox::information(
this, tr(
"Hide tool bar"),
1684 tr(
"The tool bar will be hidden, the menu bar must be showed."),
1685 QMessageBox::StandardButton::Yes
1686 | QMessageBox::StandardButton::No))
1688 ui->actionMain_menu_bar_M->setChecked(
true);
1690 ui->actionToolBar_T->setChecked(
true);
1694 ui->toolBar->setVisible(checked);
1697void MainWindow::on_actionStatus_bar_S_toggled(
bool checked)
1699 statusBar()->setVisible(checked);
1700 m_Parameter.SetStatusBar(checked);
1703void MainWindow::on_actionKeyboard_triggered()
1705 auto inputMethod = QGuiApplication::inputMethod();
1715 inputMethod->show();
1720void MainWindow::on_actionSettings_triggered()
1724 set.AddViewers(viewers);
1725 if(CParameterDlgSettings::Accepted == RC_SHOW_WINDOW(&set))
1730 foreach(
auto v, viewers) {
1736void MainWindow::slotShortCut()
1738 if(m_Parameter.GetReceiveShortCut())
1740 setFocusPolicy(Qt::WheelFocus);
1741 ui->actionFull_screen_F->setShortcuts(QKeySequence::FullScreen);
1743 setFocusPolicy(Qt::NoFocus);
1744 ui->actionFull_screen_F->setShortcut(QKeySequence());
1748void MainWindow::on_actionOpenListRecent_triggered()
1752 bool check = connect(p, SIGNAL(sigStart(
const QString&,
bool)),
1753 this, SLOT(slotOpenFile(
const QString&,
bool)));
1755 check = connect(p, SIGNAL(sigAddToFavorite(QString,QString,QString,QIcon)),
1756 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QString,QIcon)));
1759 int nRet = p->Initial();
1764 d.setWindowIcon(windowIcon());
1765 d.setWindowTitle(p->windowTitle());
1766 QGridLayout* pLayout =
new QGridLayout(&d);
1768 pLayout->addWidget(p);
1769 check = connect(p, SIGNAL(destroyed()), &d, SLOT(reject()));
1771 d.setLayout(pLayout);
1776void MainWindow::on_actionAdd_to_favorite_triggered()
1778 if(!m_pView || !m_pFavoriteView)
return;
1780 foreach(
auto c, m_Operates)
1784 m_pFavoriteView->slotAddToFavorite(
1790void MainWindow::dragEnterEvent(QDragEnterEvent *event)
1792 qDebug(log) <<
"dragEnterEvent";
1794 if(event->mimeData()->hasUrls())
1797 event->acceptProposedAction();
1801void MainWindow::dragMoveEvent(QDragMoveEvent *event)
1806void MainWindow::dropEvent(QDropEvent *event)
1808 qDebug(log) <<
"dropEvent";
1810 if(!event->mimeData()->hasUrls())
1812 auto urls =
event->mimeData()->urls();
1813 foreach(
auto url, urls)
1815 if(url.isLocalFile())
1816 slotOpenFile(url.toLocalFile());
1825void MainWindow::slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
1830#if defined(Q_OS_ANDROID)
1835 case QSystemTrayIcon::Trigger:
1847void MainWindow::slotSystemTrayIconTypeChanged()
1850 if(!QSystemTrayIcon::isSystemTrayAvailable())
1852 qWarning(log) <<
"System tray is not available";
1856 if(!m_Parameter.GetEnableSystemTrayIcon())
1858 qDebug(log) <<
"Disable system tray icon";
1865 m_TrayIcon = QSharedPointer<QSystemTrayIcon>(
new QSystemTrayIcon(
this));
1866 if(QSystemTrayIcon::isSystemTrayAvailable())
1868 bool check = connect(
1870 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
1872 SLOT(slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason)));
1874 m_TrayIcon->setIcon(this->windowIcon());
1875 m_TrayIcon->setToolTip(windowTitle());
1878 qWarning(log) <<
"System tray is not available";
1880 switch (m_Parameter.GetSystemTrayIconMenuType())
1882 case CParameterApp::SystemTrayIconMenuType::MenuBar:
1884 QMenu* pMenu =
new QMenu(
this);
1885 pMenu->addMenu(ui->menuOperate);
1886 pMenu->addMenu(ui->menuView);
1887 pMenu->addMenu(ui->menuTools);
1888 m_TrayIcon->setContextMenu(pMenu);
1891 case CParameterApp::SystemTrayIconMenuType::Operate:
1892 m_TrayIcon->setContextMenu(ui->menuOperate);
1894 case CParameterApp::SystemTrayIconMenuType::RecentOpen:
1895 m_TrayIcon->setContextMenu(m_pRecentMenu);
1897 case CParameterApp::SystemTrayIconMenuType::View:
1898 m_TrayIcon->setContextMenu(ui->menuView);
1900 case CParameterApp::SystemTrayIconMenuType::Tools:
1901 m_TrayIcon->setContextMenu(ui->menuTools);
1903 case CParameterApp::SystemTrayIconMenuType::No:
1904 m_TrayIcon->setContextMenu(
nullptr);
1909void MainWindow::slotEnableSystemTrayIcon()
1914 if(!m_Parameter.GetEnableSystemTrayIcon())
1917 slotSystemTrayIconTypeChanged();
1920void MainWindow::SetStatsVisible(
bool visible)
1922 if(m_SendRate.isVisible() == visible)
1924 m_SendRate.setVisible(visible);
1925 m_ReceivesRate.setVisible(visible);
1926 m_TotalSends.setVisible(visible);
1927 m_TotalReceives.setVisible(visible);
1930void MainWindow::StartTimer()
1932 bool bStart =
false;
1933 int nMinInterval = 1;
1934 foreach(
auto o, m_Operates) {
1941 m_Timer.start(nMinInterval * 1000);
1945 SetStatsVisible(
false);
1949void MainWindow::slotTimeOut()
1954 qDebug(log) <<
"The current view is empty";
1957 foreach(
auto p, m_Operates)
1959 if(p->GetViewer() == pWin)
1961 auto pStats = p->GetStats();
1963 SetStatsVisible(
false);
1966 SetStatsVisible(
true);
1967 pStats->slotCalculating();
1968 m_TotalSends.setText(
"⇈ " + pStats->TotalSends());
1969 m_TotalReceives.setText(
"⇊ " + pStats->TotalReceives());
1970 m_SendRate.setText(
"↑ " + pStats->SendRate());
1971 m_ReceivesRate.setText(
"↓ " + pStats->ReceiveRate());
1977void MainWindow::on_actionUser_manual_triggered()
1979 QString szUrl =
"https://github.com/KangLin/RabbitRemoteControl/wiki/UserManual";
1980 if(RabbitCommon::CTools::GetLanguage() ==
"zh_CN"
1981 || RabbitCommon::CTools::GetLanguage() ==
"zh_TW")
1985void MainWindow::on_actionLayoutDefault_triggered()
1987 qDebug(log) << Q_FUNC_INFO;
1988 if(!m_pDockActive->toggleViewAction()->isChecked())
1989 m_pDockActive->toggleViewAction()->trigger();
1990 if(!m_pDockFavorite->toggleViewAction()->isChecked())
1991 m_pDockFavorite->toggleViewAction()->trigger();
1992 if(!m_pDockRecent->toggleViewAction()->isChecked())
1993 m_pDockRecent->toggleViewAction()->trigger();
1994 m_Parameter.SetTabPosition(QTabWidget::North);
1995 if(!ui->actionTabBar_B->isChecked())
1996 ui->actionTabBar_B->trigger();
1997 if(!ui->actionMain_menu_bar_M->isChecked()) {
1998 ui->actionMain_menu_bar_M->trigger();
1999#if !defined(Q_OS_ANDROID)
2000 m_pToolBarMenuAction->setVisible(
false);
2003 if(!ui->actionToolBar_T->isChecked())
2004 ui->actionToolBar_T->trigger();
2005 addToolBar(Qt::TopToolBarArea, ui->toolBar);
2006 if(!ui->actionStatus_bar_S->isChecked())
2007 ui->actionStatus_bar_S->trigger();
2010void MainWindow::on_actionLayoutSimple_triggered()
2012 qDebug(log) << Q_FUNC_INFO;
2013 if(m_pDockActive->toggleViewAction()->isChecked())
2014 m_pDockActive->toggleViewAction()->trigger();
2015 if(m_pDockFavorite->toggleViewAction()->isChecked())
2016 m_pDockFavorite->toggleViewAction()->trigger();
2017 if(m_pDockRecent->toggleViewAction()->isChecked())
2018 m_pDockRecent->toggleViewAction()->trigger();
2019 m_Parameter.SetTabPosition(QTabWidget::East);
2020 if(!ui->actionTabBar_B->isChecked())
2021 ui->actionTabBar_B->trigger();
2022 if(!ui->actionMain_menu_bar_M->isChecked()) {
2023 ui->actionMain_menu_bar_M->trigger();
2024#if !defined(Q_OS_ANDROID)
2025 m_pToolBarMenuAction->setVisible(
false);
2028 if(!ui->actionToolBar_T->isChecked())
2029 ui->actionToolBar_T->trigger();
2030 addToolBar(Qt::LeftToolBarArea, ui->toolBar);
2031 if(!ui->actionStatus_bar_S->isChecked())
2032 ui->actionStatus_bar_S->trigger();
2035void MainWindow::on_actionLayoutMinimalism_triggered()
2037 qDebug(log) << Q_FUNC_INFO;
2038 if(m_pDockActive->toggleViewAction()->isChecked())
2039 m_pDockActive->toggleViewAction()->trigger();
2040 if(m_pDockFavorite->toggleViewAction()->isChecked())
2041 m_pDockFavorite->toggleViewAction()->trigger();
2042 if(m_pDockRecent->toggleViewAction()->isChecked())
2043 m_pDockRecent->toggleViewAction()->trigger();
2044 m_Parameter.SetTabPosition(QTabWidget::East);
2045 if(ui->actionTabBar_B->isChecked())
2046 ui->actionTabBar_B->trigger();
2047#if !defined(Q_OS_MACOS)
2048 if(ui->actionMain_menu_bar_M->isChecked()) {
2049 ui->actionMain_menu_bar_M->trigger();
2050 m_pToolBarMenuAction->setVisible(
true);
2053 if(!ui->actionToolBar_T->isChecked())
2054 ui->actionToolBar_T->trigger();
2055#if defined(Q_OS_LINUX)
2056 addToolBar(Qt::RightToolBarArea, ui->toolBar);
2058 addToolBar(Qt::LeftToolBarArea, ui->toolBar);
2060 if(ui->actionStatus_bar_S->isChecked())
2061 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.