11#include <QDesktopServices>
12#include <QWidgetAction>
16#include <QKeySequence>
20#include <QLoggingCategory>
22#include <QInputMethod>
23#include <QGuiApplication>
25#include "mainwindow.h"
26#include "ui_mainwindow.h"
28 #include "FrmUpdater.h"
30#include "RabbitCommonDir.h"
31#include "RabbitCommonTools.h"
37 #include "QUIWidget/QUIWidget.h"
41#include "FrmFullScreenToolBar.h"
42#include "ParameterDlgSettings.h"
45#include "ViewSplitter.h"
51static Q_LOGGING_CATEGORY(log,
"App.MainWindow")
52static Q_LOGGING_CATEGORY(logRecord,
"App.MainWindow.Record")
56 , m_pToolBarMenuAction(
nullptr)
57 , m_pMenuActivityGroup(
nullptr)
58 , m_ptbMenuActivity(
nullptr)
59 , m_pActionOperateMenu(
nullptr)
60 , m_pTBOperate(
nullptr)
61 , m_pActionTBOperate(
nullptr)
62 , m_pDockRecent(
nullptr)
64 , m_pDockActive(
nullptr)
65 , m_pFrmActive(
nullptr)
66 , m_pSecureLevel(
nullptr)
67 , m_pSignalStatus(
nullptr)
70 , m_pFullScreenToolBar(
nullptr)
71 , m_pRecentMenu(
nullptr)
72 , m_pDockFavorite(
nullptr)
73 , m_pFavoriteView(
nullptr)
74 , m_StatusBarMessage(this)
85 QWidget* pContain =
new QWidget(
this);
87 pContain->setContentsMargins(0, 0, 0, 0);
88 setCentralWidget(pContain);
91 ui->actionKeyboard->setVisible(
false);
93 bool bVisible = (
nullptr != QGuiApplication::inputMethod());
94 ui->actionKeyboard->setVisible(bVisible);
95 ui->actionKeyboard->setEnabled(bVisible);
99 this, [&](
COperate* pOperate,
bool bOpenSettingsDialog) {
100 Start(pOperate, bOpenSettingsDialog);
104#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) && !defined(Q_OS_MACOS)
106 setWindowIcon(QIcon(
":/images/app"));
123 this->statusBar()->addPermanentWidget(&m_StatusBarMessage);
125 m_SendRate.setToolTip(tr(
"Send rate"));
126 m_SendRate.setStatusTip(tr(
"Send rate"));
129 this->statusBar()->addPermanentWidget(&m_SendRate);
130 m_ReceivesRate.setToolTip(tr(
"Receives rate"));
131 m_ReceivesRate.setStatusTip(tr(
"Receives rate"));
134 this->statusBar()->addPermanentWidget(&m_ReceivesRate);
135 m_TotalSends.setToolTip(tr(
"Total sends"));
136 m_TotalSends.setStatusTip(tr(
"Total sends"));
139 this->statusBar()->addPermanentWidget(&m_TotalSends);
140 m_TotalReceives.setToolTip(tr(
"Total receives"));
141 m_TotalReceives.setStatusTip(tr(
"Total receives"));
144 this->statusBar()->addPermanentWidget(&m_TotalReceives);
146 check = connect(&m_Timer, SIGNAL(timeout()),
this, SLOT(slotTimeOut()));
149 m_pSecureLevel =
new QLabel(statusBar());
153 m_pSecureLevel->hide();
154 statusBar()->addPermanentWidget(m_pSecureLevel);
158 setAcceptDrops(
true);
160 RabbitCommon::CTools::AddStyleMenu(ui->menuTools);
161 ui->menuTools->addMenu(RabbitCommon::CTools::GetLogMenu(
this));
163 m_pRecentMenu =
new RabbitCommon::CRecentMenu(
164 tr(
"Recently"), QIcon::fromTheme(
"document-open-recent"),
false,
true,
this);
165 check = connect(m_pRecentMenu, SIGNAL(recentFileTriggered(
const QString&)),
166 this, SLOT(slotOpenFile(
const QString&)));
168 check = connect(&m_Parameter, SIGNAL(sigRecentMenuMaxCountChanged(
int)),
169 m_pRecentMenu, SLOT(setMaxCount(
int)));
171 QAction* pRecentAction = ui->menuOperate->insertMenu(
172 ui->actionOpenListRecent, m_pRecentMenu);
173 pRecentAction->setStatusTip(pRecentAction->text());
174 QToolButton* tbRecent =
new QToolButton(ui->toolBar);
175 tbRecent->setFocusPolicy(Qt::NoFocus);
176 tbRecent->setPopupMode(QToolButton::InstantPopup);
177 tbRecent->setMenu(m_pRecentMenu);
178 tbRecent->setIcon(pRecentAction->icon());
179 tbRecent->setText(pRecentAction->text());
180 tbRecent->setToolTip(pRecentAction->toolTip());
181 tbRecent->setStatusTip(pRecentAction->statusTip());
182 ui->toolBar->insertWidget(ui->actionOpenListRecent, tbRecent);
186 ui->actionUpdate->setIcon(updater.windowIcon());
189 QToolButton* tbStart =
new QToolButton(ui->toolBar);
190 tbStart->setFocusPolicy(Qt::NoFocus);
191 tbStart->setPopupMode(QToolButton::InstantPopup);
193 tbStart->setMenu(ui->menuStart);
194 tbStart->setIcon(QIcon::fromTheme(
"media-playback-start"));
195 tbStart->setText(tr(
"Start"));
196 tbStart->setToolTip(tr(
"Start"));
197 tbStart->setStatusTip(tr(
"Start"));
198 ui->toolBar->insertWidget(ui->actionStop, tbStart);
202 check = connect(&m_Parameter, SIGNAL(sigReceiveShortCutChanged()),
203 this, SLOT(slotShortCut()));
205 slotSystemTrayIconTypeChanged();
206 check = connect(&m_Parameter, SIGNAL(sigSystemTrayIconTypeChanged()),
208 SLOT(slotSystemTrayIconTypeChanged()));
210 check = connect(&m_Parameter, SIGNAL(sigEnableSystemTrayIcon()),
211 this, SLOT(slotEnableSystemTrayIcon()));
213 check = connect(&m_Parameter, SIGNAL(sigEnableTabToolTipChanged()),
214 this, SLOT(slotUpdateName()));
216 check = connect(&m_Parameter, SIGNAL(sigEnableTabIconChanged()),
217 this, SLOT(slotUpdateName()));
220 auto pTbMenu =
new QToolButton(ui->toolBar);
221 pTbMenu->setFocusPolicy(Qt::NoFocus);
222 pTbMenu->setPopupMode(QToolButton::InstantPopup);
224 pTbMenu->setText(ui->actionMain_menu_bar_M->text());
225 pTbMenu->setIcon(ui->actionMain_menu_bar_M->icon());
226 pTbMenu->setToolTip(ui->actionMain_menu_bar_M->toolTip());
227 pTbMenu->setStatusTip(ui->actionMain_menu_bar_M->statusTip());
228 QMenu *pMenu =
new QMenu(pTbMenu);
229 pMenu->addActions(this->menuBar()->actions());
230 pTbMenu->setMenu(pMenu);
231 m_pToolBarMenuAction = ui->toolBar->insertWidget(ui->actionTabBar_B, pTbMenu);
232#if defined(Q_OS_ANDROID)
233 m_pToolBarMenuAction->setVisible(
true);
235 m_pToolBarMenuAction->setVisible(
false);
238 check = connect(&m_Parameter, SIGNAL(sigStartByTypeChanged()),
239 this, SLOT(slotStartByType()));
242 m_pDockFavorite =
new QDockWidget(
this);
245 m_pFavoriteView =
new CFavoriteView(&m_Parameter, m_pDockFavorite);
248 if(m_pFavoriteView->m_pDockTitleBar)
249 m_pDockFavorite->setTitleBarWidget(m_pFavoriteView->m_pDockTitleBar);
250 check = connect(m_pFavoriteView, SIGNAL(sigStart(
const QString&,
bool)),
251 this, SLOT(slotOpenFile(
const QString&,
bool)));
253 check = connect(m_pFavoriteView, SIGNAL(sigFavorite()),
254 this, SLOT(on_actionAdd_to_favorite_triggered()));
259 check = connect(&m_Parameter, SIGNAL(sigFavoriteEditChanged(
bool)),
260 m_pFavoriteView, SLOT(slotDoubleEditNode(
bool)));
262 emit m_Parameter.sigFavoriteEditChanged(m_Parameter.GetFavoriteEdit());
263 m_pDockFavorite->setWidget(m_pFavoriteView);
264 m_pDockFavorite->setWindowTitle(m_pFavoriteView->windowTitle());
267 m_pDockFavorite->setObjectName(
"dockFavorite");
268#if defined(Q_OS_ANDROID)
269 m_pDockFavorite->hide();
271 ui->menuView->addAction(m_pDockFavorite->toggleViewAction());
272 m_pDockFavorite->toggleViewAction()->setIcon(QIcon::fromTheme(
"emblem-favorite"));
273 addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, m_pDockFavorite);
276 m_pDockRecent =
new QDockWidget(
this);
280 =
new CFrmRecent(
this, &m_Manager, m_Parameter,
true,
283 if(m_pRecent->m_pDockTitleBar)
284 m_pDockRecent->setTitleBarWidget(
285 m_pRecent->m_pDockTitleBar);
286 check = connect(m_pRecent,
287 SIGNAL(sigStart(
const QString&,
bool)),
288 this, SLOT(slotOpenFile(
const QString&,
bool)));
290 check = connect(m_pRecent, &CFrmRecent::sigAddToFavorite,
291 m_pFavoriteView, &CFavoriteView::slotAddToFavorite);
296 m_pDockRecent->setWidget(m_pRecent);
297 m_pDockRecent->setWindowTitle(
298 m_pRecent->windowTitle());
301 m_pDockRecent->setObjectName(
"dockRecent");
302#if defined(Q_OS_ANDROID)
303 m_pDockRecent->hide();
305 ui->menuView->addAction(m_pDockRecent->toggleViewAction());
306 m_pDockRecent->toggleViewAction()->setIcon(QIcon::fromTheme(
"document-open-recent"));
307 tabifyDockWidget(m_pDockFavorite, m_pDockRecent);
310 m_pDockActive =
new QDockWidget(
this);
314 m_Operates, m_Parameter,
315 ui->menuStart, ui->actionStop,
316 m_pRecentMenu, m_pDockActive);
318 m_pDockActive->setWidget(m_pFrmActive);
319 if(m_pFrmActive->m_pDockTitleBar)
320 m_pDockActive->setTitleBarWidget(
321 m_pFrmActive->m_pDockTitleBar);
322 m_pDockActive->setWindowTitle(m_pFrmActive->windowTitle());
323 check = connect(m_pFrmActive, SIGNAL(sigChanged(
COperate*)),
324 this, SLOT(slotOperateChanged(
COperate*)));
326 check = connect(m_pFrmActive, &CFrmActive::sigAddToFavorite,
327 m_pFavoriteView, &CFavoriteView::slotAddToFavorite);
330 m_pDockActive->setObjectName(
"dockListActive");
331#if defined(Q_OS_ANDROID)
332 m_pDockActive->hide();
334 ui->menuView->addAction(m_pDockActive->toggleViewAction());
335 m_pDockActive->toggleViewAction()->setIcon(QIcon::fromTheme(
"network-wired"));
336 tabifyDockWidget(m_pDockFavorite, m_pDockActive);
339 QActionGroup* pGBView =
new QActionGroup(
this);
341 pGBView->addAction(ui->actionViewTab);
342 pGBView->addAction(ui->actionViewSplit);
344 qDebug(log) <<
"View type:" << m_Parameter.GetViewType();
345 if(CParameterApp::ViewType::Tab == m_Parameter.GetViewType()) {
346 ui->actionViewTab->setChecked(
true);
347 on_actionViewTab_triggered();
349 if(CParameterApp::ViewType::Splitter == m_Parameter.GetViewType()) {
350 ui->actionViewSplit->setChecked(
true);
351 on_actionViewSplit_triggered();
353 check = connect(&m_Parameter, &CParameterApp::sigViewTypeChanged,
359 m_pMenuActivityGroup =
new QActionGroup(ui->menuActivity);
360 m_ptbMenuActivity =
new QToolButton(ui->toolBar);
361 m_ptbMenuActivity->setFocusPolicy(Qt::NoFocus);
362 m_ptbMenuActivity->setPopupMode(QToolButton::InstantPopup);
363 m_ptbMenuActivity->setMenu(ui->menuActivity);
364 m_ptbMenuActivity->setIcon(ui->menuActivity->icon());
365 m_ptbMenuActivity->setText(ui->menuActivity->title());
366 m_ptbMenuActivity->setToolTip(ui->menuActivity->toolTip());
367 m_ptbMenuActivity->setStatusTip(ui->menuActivity->statusTip());
368 ui->toolBar->insertWidget(ui->actionTabBar_B, m_ptbMenuActivity);
377 SIGNAL(sigConnected()),
378 this, SLOT(slotSignalConnected()));
381 SIGNAL(sigDisconnected()),
382 this, SLOT(slotSignalDisconnected()));
385 SIGNAL(sigError(
const int,
const QString&)),
386 this, SLOT(slotSignalError(
const int,
const QString&)));
390 m_pSignalStatus =
new QPushButton();
391 m_pSignalStatus->setToolTip(tr(
"ICE signal status"));
392 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
393 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
394 slotSignalDisconnected();
395 statusBar()->addPermanentWidget(m_pSignalStatus);
398 if(m_Parameter.GetSaveMainWindowStatus())
400 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
401 QSettings::IniFormat);
403 = set.value(
"MainWindow/Status/Geometry").toByteArray();
404 if(!geometry.isEmpty())
405 restoreGeometry(geometry);
407 QByteArray state = set.value(
"MainWindow/Status/State").toByteArray();
411 ui->actionTabBar_B->setChecked(m_Parameter.GetTabBar());
412 on_actionTabBar_B_toggled(m_Parameter.GetTabBar());
413 ui->actionStatus_bar_S->setChecked(m_Parameter.GetStatusBar());
414 statusBar()->setVisible(m_Parameter.GetStatusBar());
415 ui->actionMain_menu_bar_M->setChecked(m_Parameter.GetMenuBar());
416 menuBar()->setVisible(m_Parameter.GetMenuBar());
417 ui->actionToolBar_T->setChecked(!ui->toolBar->isHidden());
421 ui->actionMain_menu_bar_M->setVisible(
false);
424 if(!m_Parameter.GetMenuBar()) {
425 m_pToolBarMenuAction->setVisible(
true);
431MainWindow::~MainWindow()
433 qDebug(log) <<
"MainWindow::~MainWindow()";
434 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
441 qDebug(log) << Q_FUNC_INFO;
448 QMessageBox initMsgBox(QMessageBox::Information, tr(
"Load"), tr(
"Load ......"));
449 initMsgBox.showNormal();
450 qApp->processEvents();
453 szMsg = tr(
"Load plugins ......");
454 initMsgBox.setText(szMsg);
456 qApp->processEvents();
457 nRet = m_Manager.Initial();
459 szErr = tr(
"Initial manage error");
462 m_Manager.EnumPlugins(
this);
464 auto pg = m_Manager.GetGlobalParameters();
467 bool bRet = QMetaObject::invokeMethod(
469 "SetGlobalParameters",
470 Qt::DirectConnection,
473 szErr = tr(
"Failed to set global parameters");
474 qCritical(log) << szErr;
481 szMsg = tr(
"Load list recent dock ......");
482 initMsgBox.setText(szMsg);
484 qApp->processEvents();
485 nRet = m_pRecent->Initial();
487 szErr = tr(
"Initial recent dock error");
493 szMsg = tr(
"Load recent menu ......");
494 initMsgBox.setText(szMsg);
496 qApp->processEvents();
498 auto recents = m_pRecent->GetRecents(m_Parameter.GetRecentMenuMaxCount());
500 for(
auto it = recents.rbegin(); it != recents.rend(); it++) {
501 m_pRecentMenu->addRecentFile(it->GetFile(), it->szName, it->icon);
503 m_pRecentMenu->slotShowFileEixst(
504 m_Parameter.GetGlobalParameters()->GetSaveSettingsType() == CParameterGlobal::File);
505 bool check = connect(
506 m_Parameter.GetGlobalParameters(),
507 &CParameterGlobal::sigSaveSettingsTypeChanged,
508 m_pRecentMenu, [
this]() {
509 if(!(m_pRecentMenu && m_Parameter.GetGlobalParameters()))
511 m_pRecentMenu->slotShowFileEixst(
512 m_Parameter.GetGlobalParameters()->GetSaveSettingsType() == CParameterGlobal::File);
518 if(m_pFavoriteView) {
519 szMsg = tr(
"Load favorite ......");
520 initMsgBox.setText(szMsg);
522 qApp->processEvents();
523 nRet = m_pFavoriteView->Initial();
525 szErr = tr(
"Initial favorite error");
530 slotEnableSystemTrayIcon();
534 szMsg = tr(
"Load laster operate ......");
535 initMsgBox.setText(szMsg);
537 qApp->processEvents();
538 nRet = LoadOperateLasterClose();
540 szErr = tr(
"Initial load laster close operate error");
551 slotError(nRet, szErr);
552 QMessageBox errMsgBox;
553 errMsgBox.setWindowTitle(QObject::tr(
"Error"));
554 errMsgBox.setText(QObject::tr(
"Initial error:") + szErr);
555 errMsgBox.setIcon(QMessageBox::Critical);
557 auto logMenu = RabbitCommon::CTools::GetLogMenu();
558 QPushButton *pbLog =
new QPushButton(logMenu->title());
559 pbLog->setMenu(logMenu);
561 QPushButton *pbettings =
new QPushButton(ui->actionSettings->text());
562 QMenu* pSettings =
new QMenu(pbettings);
563 pSettings->addAction(ui->actionSettings);
564 pbettings->setMenu(pSettings);
565 errMsgBox.addButton(pbettings, QMessageBox::ActionRole);
566 errMsgBox.addButton(pbLog, QMessageBox::ActionRole);
567 errMsgBox.addButton(QMessageBox::Cancel);
574void MainWindow::SetView(
CView* pView)
576 qDebug(log) << Q_FUNC_INFO;
580 m_pView->disconnect();
583 auto* pContain = centralWidget();
584 if(!pContain)
return;
585 auto* pOldLayout = pContain->layout();
587 pContain->setLayout(
nullptr);
590 while ((item = pOldLayout->takeAt(0)) !=
nullptr) {
591 if (item->widget()) {
592 item->widget()->deleteLater();
598 auto* pLayout =
new QVBoxLayout(pContain);
600 pLayout->setContentsMargins(0, 0, 0, 0);
601 pLayout->setSpacing(0);
602 pContain->setLayout(pLayout);
603 pLayout->addWidget(m_pView);
608 check = connect(m_pView, SIGNAL(sigCloseView(
const QWidget*)),
611 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
612 this, SLOT(slotCurrentViewChanged(
const QWidget*)));
615 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
616 m_pFrmActive, SLOT(slotViewChanged(
const QWidget*)));
619 check = connect(m_pView, SIGNAL(customContextMenuRequested(
const QPoint&)),
623 foreach (
auto c, m_Operates) {
625 m_pView->AddView(c->GetViewer());
626 m_pView->SetWidowsTitle(
627 c->GetViewer(), c->Name(), c->Icon(), c->Description());
630 szErr += c->metaObject()->className();
631 szErr +=
"::GetViewer() ";
632 szErr +=
"is nullptr.";
633 qWarning(log) << szErr;
636 m_pView->SetVisibleTab(m_Parameter.GetTabBar());
639void MainWindow::on_actionViewTab_triggered()
641 qDebug(log) << Q_FUNC_INFO;
642 if(!ui->actionViewTab->isChecked())
return;
643 m_Parameter.SetViewType(CParameterApp::ViewType::Tab);
644 SetView(
new CViewTable(&m_Parameter,
this));
647void MainWindow::on_actionViewSplit_triggered()
649 qDebug(log) << Q_FUNC_INFO;
650 if(!ui->actionViewSplit->isChecked())
return;
651 m_Parameter.SetViewType(CParameterApp::ViewType::Splitter);
652 SetView(
new CViewSplitter(&m_Parameter,
this));
655void MainWindow::on_actionAbout_triggered()
658 CDlgAbout *about =
new CDlgAbout(
this);
659 QIcon icon = windowIcon();
661 auto sizeList = icon.availableSizes();
662 if(!sizeList.isEmpty()) {
663 QPixmap p = icon.pixmap(*sizeList.begin());
664 about->m_AppIcon = p.toImage();
667 about->m_szBuildTime = QString(
"%1/%2").arg(__DATE__, __TIME__);
668 about->m_szCopyrightStartTime =
"2020";
669 about->m_szVersionRevision = RabbitRemoteControl_REVISION;
670 about->m_szDetails = m_Manager.Details();
671 RC_SHOW_WINDOW(about);
675void MainWindow::on_actionUpdate_triggered()
677 if(!qEnvironmentVariable(
"SNAP").isEmpty()) {
678 QDesktopServices::openUrl(QUrl(
"https://snapcraft.io/rabbitremotecontrol"));
679 }
else if(!qEnvironmentVariable(
"FLATPAK_ID").isEmpty()) {
680 QDesktopServices::openUrl(QUrl(
"https://flathub.org/apps/io.github.KangLin.RabbitRemoteControl"));
683 CFrmUpdater* m_pfrmUpdater =
new CFrmUpdater();
684 QIcon icon = windowIcon();
686 auto sizeList = icon.availableSizes();
687 if(!sizeList.isEmpty()) {
688 QPixmap p = icon.pixmap(*sizeList.begin());
689 m_pfrmUpdater->SetTitle(p.toImage());
692 m_pfrmUpdater->SetInstallAutoStartup();
693 RC_SHOW_WINDOW(m_pfrmUpdater);
698void MainWindow::on_actionFull_screen_F_triggered()
702 m_pView->SetFullScreen(!isFullScreen());
707 qDebug(log) <<
"Exit full screen";
708 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-fullscreen"));
709 ui->actionFull_screen_F->setText(tr(
"Full screen"));
710 ui->actionFull_screen_F->setToolTip(tr(
"Full screen"));
711 ui->actionFull_screen_F->setStatusTip(tr(
"Full screen"));
712 ui->actionFull_screen_F->setWhatsThis(tr(
"Full screen"));
714 ui->toolBar->setVisible(m_FullState.toolBar);
715 ui->statusbar->setVisible(m_FullState.statusbar);
716 ui->menubar->setVisible(m_FullState.menubar);
718 m_pDockActive->setVisible(m_FullState.dockListActive);
719 m_pDockRecent->setVisible(m_FullState.dockListRecent);
720 m_pDockFavorite->setVisible(m_FullState.dockFavorite);
722 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
725 pDockDebugLog->setVisible(m_FullState.dockDebugLog);
728 if(m_pFullScreenToolBar)
731 m_pFullScreenToolBar->close();
732 m_pFullScreenToolBar =
nullptr;
735 emit sigShowNormal();
737 this->activateWindow();
739 emit sigFullScreen(
false);
743 qDebug(log) <<
"Entry full screen";
746 this->showFullScreen();
747 emit sigFullScreen(
true);
749 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-restore"));
750 ui->actionFull_screen_F->setText(tr(
"Exit full screen"));
751 ui->actionFull_screen_F->setToolTip(tr(
"Exit full screen"));
752 ui->actionFull_screen_F->setStatusTip(tr(
"Exit full screen"));
753 ui->actionFull_screen_F->setWhatsThis(tr(
"Exit full screen"));
755 m_FullState.toolBar = ui->toolBar->isVisible();
756 ui->toolBar->setVisible(
false);
757 m_FullState.statusbar = ui->statusbar->isVisible();
758 ui->statusbar->setVisible(
false);
759 m_FullState.menubar = ui->menubar->isVisible();
760 ui->menubar->setVisible(
false);
762 m_FullState.dockListActive = m_pDockActive->isVisible();
763 m_pDockActive->setVisible(
false);
764 m_FullState.dockListRecent = m_pDockRecent->isVisible();
765 m_pDockRecent->setVisible(
false);
766 m_FullState.dockFavorite = m_pDockFavorite->isVisible();
767 m_pDockFavorite->setVisible(
false);
769 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
772 m_FullState.dockDebugLog = pDockDebugLog->isVisible();
773 pDockDebugLog->setVisible(
false);
776 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
778 m_pFullScreenToolBar =
new CFrmFullScreenToolBar(
this);
779 if(!m_pFullScreenToolBar)
return;
780 m_pFullScreenToolBar->show();
782 bool check = connect(m_pFullScreenToolBar, SIGNAL(sigExitFullScreen()),
783 this, SLOT(on_actionFull_screen_F_triggered()));
785 check = connect(m_pFullScreenToolBar, SIGNAL(sigExit()),
786 this, SLOT(on_actionExit_E_triggered()));
789 check = connect(
this, SIGNAL(sigOperateMenuChanged(QAction*)),
790 m_pFullScreenToolBar,
791 SLOT(slotOperateMenuChanged(QAction*)));
794 QScreen* pScreen = QGuiApplication::primaryScreen();
795 QPoint pos(pScreen->geometry().left()
796 + (pScreen->geometry().width()
797 - m_pFullScreenToolBar->frameGeometry().width()) / 2,
798 pScreen->geometry().top());
800 qDebug(log) <<
"Primary screen geometry:" << pScreen->geometry()
801 <<
"Primary screen available geometry:" << pScreen->availableGeometry()
802 <<
"Main window frameGeometry:" << frameGeometry()
803 <<
"Position:" << pos <<
"local position:" << mapFromGlobal(pos);
808 m_pFullScreenToolBar->move(pos);
811void MainWindow::slotViewerFocusIn(QWidget *pView)
813 COperate* c = qobject_cast<COperate*>(sender());
814 qDebug(log) << Q_FUNC_INFO <<
"Focus:" << c << pView;
820void MainWindow::slotOperateChanged(
COperate *o)
827void MainWindow::slotCurrentViewChanged(
const QWidget* pView)
829 qDebug(log) << Q_FUNC_INFO;
835 foreach(
auto o, m_Operates) {
838 foreach (
auto a, ui->menuActivity->actions()) {
839 if(a->data().value<COperate*>() == o)
842 ui->actionStop_other->setText(
843 tr(
"Stop other except the current \"%1\"").arg(o->
Name()));
844 ui->actionStop_other->setStatusTip(ui->actionStop_other->text());
845 ui->actionStop_other->setToolTip(ui->actionStop_other->text());
849 QTimer::singleShot(0,
this, SLOT(slotTimeOut()));
852void MainWindow::EnableMenu(
bool bEnable)
854 qDebug(log) << Q_FUNC_INFO << bEnable;
855 ui->actionClone->setEnabled(bEnable);
856 ui->actionAdd_to_favorite->setEnabled(bEnable);
857 ui->actionStop->setEnabled(bEnable);
858 ui->actionStop_All->setEnabled(bEnable);
859 ui->actionStop_other->setEnabled(bEnable);
861 if(m_Operates.size() > 1)
862 ui->actionStop_other->setEnabled(
true);
864 ui->actionStop_other->setEnabled(
false);
866 ui->actionStop_other->setText(tr(
"Stop other"));
868 ui->actionTabBar_B->setEnabled(bEnable);
869 ui->menuActivity->setEnabled(bEnable);
870 m_ptbMenuActivity->setEnabled(bEnable);
871 slotLoadOperateMenu();
874void MainWindow::slotMenuActivity()
876 QAction* pAction = qobject_cast<QAction*>(sender());
879 COperate* p = pAction->data().value<COperate*>();
881 slotOperateChanged(p);
884void MainWindow::slotLoadOperateMenu()
886 qDebug(log) << Q_FUNC_INFO;
888 if(m_pActionOperateMenu) {
889 ui->menuOperate->removeAction(m_pActionOperateMenu);
890 m_pActionOperateMenu =
nullptr;
892 ui->toolBar->removeAction(m_pActionTBOperate);
896 auto pWin = m_pView->GetCurrentView();
898 qDebug(log) <<
"The current view is empty";
901 foreach(
auto op, m_Operates)
903 if(op->GetViewer() == pWin)
905 qDebug(log) <<
"Load plugin menu";
906 auto m = op->GetMenu(ui->menuTools);
909 m_pActionOperateMenu = ui->menuOperate->insertMenu(ui->actionAdd_to_favorite, m);
912 m_pTBOperate =
new QToolButton(ui->toolBar);
914 m_pTBOperate->setFocusPolicy(Qt::NoFocus);
915 m_pTBOperate->setPopupMode(QToolButton::InstantPopup);
916 m_pTBOperate->setMenu(m);
917 m_pTBOperate->setIcon(m->icon());
918 m_pTBOperate->setText(m->title());
919 m_pTBOperate->setToolTip(m->toolTip());
920 m_pTBOperate->setStatusTip(m->statusTip());
921 m_pTBOperate->show();
922 m_pActionTBOperate = ui->toolBar->insertWidget(ui->actionAdd_to_favorite, m_pTBOperate);
924 emit sigOperateMenuChanged(m_pActionOperateMenu);
939 auto pWin = m_pView->GetCurrentView();
941 qDebug(log) <<
"The current view is empty";
944 foreach(
auto p, m_Operates)
948 qDebug(log) <<
"Load plugin menu";
949 auto m = p->
GetMenu(ui->menuTools);
957void MainWindow::on_actionExit_E_triggered()
962void MainWindow::keyReleaseEvent(QKeyEvent *event)
968 on_actionFull_screen_F_triggered();
971 QMainWindow::keyReleaseEvent(event);
974void MainWindow::slotUpdateParameters(
COperate *pOperate)
976 m_Manager.SaveOperate(pOperate);
979void MainWindow::on_actionClone_triggered()
982 QWidget* p = m_pView->GetCurrentView();
983 foreach(
auto pOperate, m_Operates)
987 QString szFile = pOperate->GetSettingsFile();
988 auto pOperate = m_Manager.LoadOperate(szFile);
989 if(!pOperate)
return;
990 Start(pOperate,
false, szFile);
996void MainWindow::slotOpenFile(
const QString& szFile,
bool bOpenSettings)
998 if(szFile.isEmpty())
return;
999 COperate* p = m_Manager.LoadOperate(szFile);
1002 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
1006 Start(p, bOpenSettings, szFile);
1009void MainWindow::on_actionOpenRRCFile_triggered()
1011 QString szFile = QFileDialog::getOpenFileName(
1013 tr(
"Open rabbit remote control file"),
1014 RabbitCommon::CDir::Instance()->GetDirUserData(),
1015 tr(
"Rabbit remote control Files (*.rrc);;All files(*.*)"));
1016 if(szFile.isEmpty())
return;
1018 COperate* p = m_Manager.LoadOperate(szFile);
1021 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
1028void MainWindow::slotStart()
1030 if(
nullptr == m_pView)
1035 QAction* pAction = qobject_cast<QAction*>(this->sender());
1037 COperate* p = m_Manager.CreateOperate(pAction->data().toString());
1038 if(
nullptr == p)
return;
1054 qDebug(log) <<
"MainWindow::Start: set:" << set <<
"; File:" << szFile;
1057 bool check = connect(pOperate, SIGNAL(sigRunning()),
1060 check = connect(pOperate, SIGNAL(sigStop()),
1061 this, SLOT(slotStop()));
1063 check = connect(pOperate, SIGNAL(sigFinished()),
1064 this, SLOT(slotFinished()));
1066 check = connect(pOperate, SIGNAL(sigError(
const int,
const QString &)),
1067 this, SLOT(slotError(
const int,
const QString&)));
1069 check = connect(pOperate, SIGNAL(sigShowMessageBox(
const QString&,
const QString&,
1070 const QMessageBox::Icon&)),
1072 const QMessageBox::Icon&)));
1074 check = connect(pOperate, SIGNAL(sigInformation(
const QString&)),
1077 check = connect(pOperate, SIGNAL(sigUpdateName(
const QString&)),
1078 this, SLOT(slotUpdateName(
const QString&)));
1080 check = connect(pOperate, SIGNAL(sigUpdateParameters(
COperate*)),
1081 this, SLOT(slotUpdateParameters(
COperate*)));
1084 this, [
this, pOperate](
bool bFull) {
1085 if(m_pView && m_pView->GetCurrentView() == pOperate->
GetViewer()) {
1086 if((bFull && !isFullScreen()) || (!bFull && isFullScreen()))
1087 on_actionFull_screen_F_triggered();
1092 this, [
this, pOperate]() {
1093 if(m_pView && pOperate) {
1094 if(m_pView->GetCurrentView() == pOperate->
GetViewer())
1095 slotCurrentViewChanged(pOperate->
GetViewer());
1105 case QDialog::Rejected:
1106 m_Manager.DeleteOperate(pOperate);
1108 case QDialog::Accepted:
1114 if(szFile.isEmpty())
1115 szFile = pOperate->GetSettingsFile();
1117 pOperate->SetSettingsFile(szFile);
1121 nRet = m_Manager.SaveOperate(pOperate);
1123 m_pRecentMenu->addRecentFile(szFile, pOperate->
Name(), pOperate->
Icon());
1125 item.szOperateId = pOperate->
Id();
1126 item.icon = pOperate->
Icon();
1127 item.szName = pOperate->
Name();
1128 item.szProtocol = pOperate->
Protocol();
1131 item.SetFile(szFile);
1132 item.time = QDateTime::currentDateTime();
1133 m_pRecent->AddRecent(item);
1136 if(!pOperate->
Name().isEmpty())
1140 if(m_Operates.contains(pOperate)) {
1143 m_pView->SetCurrentView(pOperate->
GetViewer());
1146 szErr += pOperate->metaObject()->className();
1147 szErr +=
"::GetViewer() ";
1148 szErr +=
"is nullptr.";
1149 qWarning(log) << szErr;
1157 m_pView->AddView(pOperate->
GetViewer());
1158 m_pView->SetWidowsTitle(pOperate->
GetViewer(), pOperate->
Name(),
1163 szErr += pOperate->metaObject()->className();
1164 szErr +=
"::GetViewer() ";
1165 szErr +=
"is nullptr.";
1166 qWarning(log) << szErr;
1168 check = connect(pOperate, SIGNAL(sigViewerFocusIn(QWidget*)),
1169 this, SLOT(slotViewerFocusIn(QWidget*)));
1172 m_Operates.insert(pOperate);
1175 m_pFrmActive->slotLoad();
1176 m_pFrmActive->slotViewChanged(m_pView->GetCurrentView());
1179 vOperate.setValue(pOperate);
1180 QAction* m_pActionmenuActivity = ui->menuActivity->addAction(
1181 pOperate->
Icon(), pOperate->
Name(),
this, SLOT(slotMenuActivity()));
1182 m_pActionmenuActivity->setData(vOperate);
1183 m_pActionmenuActivity->setCheckable(
true);
1184 m_pMenuActivityGroup->addAction(m_pActionmenuActivity);
1185 m_pActionmenuActivity->setChecked(
true);
1188 nRet = pOperate->
Start();
1200 COperate* p = qobject_cast<COperate*>(sender());
1225 m->addAction(ui->actionClone);
1226 m->addAction(ui->actionStop_All);
1227 m->addAction(ui->actionStop_other);
1231 qDebug(log) << Q_FUNC_INFO << p->
Name();
1237 qDebug(log) <<
"MainWindow::slotCloseView" << pView;
1239 foreach(
auto p, m_Operates)
1250void MainWindow::on_actionStop_other_triggered()
1252 if(!m_pView)
return;
1253 foreach(
auto p, m_Operates)
1264void MainWindow::on_actionStop_All_triggered()
1266 foreach(
auto p, m_Operates)
1274void MainWindow::on_actionStop_triggered()
1276 qDebug(log) << Q_FUNC_INFO;
1277 if(!m_pView)
return;
1279 QWidget* pView = m_pView->GetCurrentView();
1283void MainWindow::slotStop()
1285 COperate* pOperate = qobject_cast<COperate*>(sender());
1286 if(!pOperate)
return;
1287 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
1293void MainWindow::slotFinished()
1295 COperate* pOperate = qobject_cast<COperate*>(sender());
1296 if(!pOperate)
return;
1298 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
1299 foreach(
auto a, ui->menuActivity->actions()) {
1300 COperate* o = a->data().value<COperate*>();
1302 ui->menuActivity->removeAction(a);
1303 m_pMenuActivityGroup->removeAction(a);
1306 foreach(
auto p, m_Operates)
1311 m_Operates.remove(p);
1312 m_Manager.DeleteOperate(p);
1313 m_pFrmActive->slotLoad();
1314 m_pFrmActive->slotViewChanged(m_pView->GetCurrentView());
1318 if(m_Operates.isEmpty())
1319 if(m_pActionOperateMenu) {
1320 ui->menuTools->removeAction(m_pActionOperateMenu);
1321 ui->toolBar->removeAction(m_pActionOperateMenu);
1322 m_pActionOperateMenu =
nullptr;
1330void SetIndicator(QLabel* label, QColor color,
int size)
1332 QString min_width = QString(
"min-width: %1px;").arg(size);
1333 QString min_height = QString(
"min-height: %1px;").arg(size);
1334 QString max_width = QString(
"max-width: %1px;").arg(size);
1335 QString max_height = QString(
"max-height: %1px;").arg(size);
1337 QString border_radius = QString(
"border-radius: %1px;").arg(size / 2);
1338 QString border = QString(
"border:1px solid ") + color.name() +
";";
1340 QString background =
"background-color: ";
1341 background += color.name() +
";";
1342 QString SheetStyle = min_width + min_height + max_width + max_height + border_radius + border + background;
1343 label->setStyleSheet(SheetStyle);
1346void MainWindow::SetSecureLevel(
COperate* o)
1348 if(!m_pSecureLevel)
return;
1351 if(szLevel.isEmpty()) {
1352 m_pSecureLevel->hide();
1355 m_pSecureLevel->setText(szLevel);
1356 m_pSecureLevel->setToolTip(CSecurityLevel::GetString(o->
GetSecurityLevel()));
1357 m_pSecureLevel->show();
1359 m_pSecureLevel->hide();
1362void MainWindow::slotSignalConnected()
1364 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Connected"));
1365 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1366 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1368 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wired"));
1371void MainWindow::slotSignalDisconnected()
1373 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Disconnected"));
1374 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1375 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1377 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wireless"));
1380void MainWindow::slotSignalError(
const int nError,
const QString &szInfo)
1382 slotSignalDisconnected();
1383 slotError(nError, szInfo);
1386void MainWindow::slotSignalPushButtonClicked(
bool checked)
1396void MainWindow::slotError(
const int nError,
const QString &szInfo)
1399 slotStatusMessage(szInfo, MessageLevel::Error);
1403 const QString &title,
const QString &message,
1404 const QMessageBox::Icon &icon)
1407 if(!m_Parameter.GetMessageBoxDisplayInformation())
1410 QMessageBox msg(icon, title, message, QMessageBox::Ok,
this);
1411 QCheckBox* cb =
new QCheckBox(
1412 tr(
"Use message box to display information"),
this);
1413 cb->setChecked(
true);
1414 msg.setCheckBox(cb);
1415 RC_SHOW_WINDOW(&msg);
1416 if(!cb->isChecked())
1418 m_Parameter.SetMessageBoxDisplayInformation(
false);
1425 slotStatusMessage(szInfo, MessageLevel::Normal);
1429void MainWindow::slotStatusMessage(QString szMessage, MessageLevel level)
1433 switch ((MessageLevel)level) {
1434 case MessageLevel::Error:
1435 pe.setColor(QPalette::WindowText, Qt::red);
1438 case MessageLevel::Warning:
1439 pe.setColor(QPalette::WindowText, Qt::yellow);
1445 m_StatusBarMessage.setPalette(pe);
1446 m_StatusBarMessage.setToolTip(szMessage);
1451 m_StatusBarMessage.setText(szLevel);
1452 statusBar()->showMessage(szMessage);
1455void MainWindow::slotUpdateName()
1457 foreach (
auto p, m_Operates)
1466 szErr += p->metaObject()->className();
1467 szErr +=
"::GetViewer() ";
1468 szErr +=
"is nullptr.";
1469 qWarning(log) << szErr;
1474void MainWindow::slotUpdateName(
const QString& szName)
1476 COperate* p = qobject_cast<COperate*>(sender());
1479 m_pView->SetWidowsTitle(p->
GetViewer(), szName,
1484 m_pRecentMenu->updateRecentFile(p->GetSettingsFile(), szName, p->
Icon());
1486 CRecentDatabase::RecentItem item;
1487 item.SetFile(p->GetSettingsFile());
1488 item.szName = p->
Name();
1491 m_pRecent->UpdateRecent(item);
1494 foreach(
auto a, ui->menuActivity->actions()) {
1495 if(a->data().value<COperate*>() == p) {
1497 a->setIcon(p->
Icon());
1503 m_pFavoriteView->slotUpdateFavorite(
1507 m_pFrmActive->slotLoad();
1510QAction* MainWindow::GetStartAction(QMenu* pMenu,
CPlugin *pPlug)
1514 szTitle = pPlug->
Protocol() +
": ";
1516 QAction* p = pMenu->addAction(szTitle);
1519 p->setData(pPlug->
Id());
1520 p->setIcon(pPlug->Icon());
1524void MainWindow::slotStartByType()
1526 qDebug(log) << Q_FUNC_INFO;
1527 auto m = ui->menuStart->actions();
1528 foreach(
auto a, m) {
1531 foreach (
auto a, m_MenuStartByType) {
1534 ui->menuStart->clear();
1535 m_MenuStartByType.clear();
1536 m_Manager.EnumPlugins(
this);
1542 QMenu* m = ui->menuStart;
1543 if(m_Parameter.GetStartByType()) {
1544 auto it = m_MenuStartByType.find(pPlugin->Type());
1545 if(it == m_MenuStartByType.end()) {
1546 m =
new QMenu(pPlugin->TypeName(pPlugin->Type()), ui->menuStart);
1547 m_MenuStartByType[pPlugin->Type()] = m;
1548 ui->menuStart->addMenu(m);
1553 QAction* p = GetStartAction(m, pPlugin);
1555 check = connect(p, SIGNAL(triggered()),
this, SLOT(slotStart()));
1560void MainWindow::closeEvent(QCloseEvent *event)
1562 qDebug(log) <<
"MainWindow::closeEvent()";
1564 if(m_Parameter.GetSaveMainWindowStatus())
1566 on_actionFull_screen_F_triggered();
1568 SaveOperateLasterClose();
1570 foreach (
auto it, m_Operates)
1573 emit it->sigUpdateParameters(it);
1577 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
1578 QSettings::IniFormat);
1579 if(m_Parameter.GetSaveMainWindowStatus())
1581 set.setValue(
"MainWindow/Status/Geometry", saveGeometry());
1582 set.setValue(
"MainWindow/Status/State", saveState());
1584 m_Parameter.SetTabBar(ui->actionTabBar_B->isChecked());
1585 m_Parameter.SetMenuBar(menuBar()->isVisible());
1586 m_Parameter.SetStatusBar(statusBar()->isVisible());
1588 set.remove(
"MainWindow/Status/Geometry");
1589 set.remove(
"MainWindow/Status/State");
1592 m_Manager.SaveSettings();
1595 QMainWindow::closeEvent(event);
1601int MainWindow::LoadOperateLasterClose()
1603 if(!m_Parameter.GetOpenLasterClose())
1606 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1607 + QDir::separator() +
"LasterClose.dat");
1608 if(f.open(QFile::ReadOnly))
1614 if(szFile.isEmpty())
1616 slotOpenFile(szFile);
1623int MainWindow::SaveOperateLasterClose()
1625 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1626 + QDir::separator() +
"LasterClose.dat");
1627 bool bRet = f.open(QFile::WriteOnly);
1628 if(bRet && m_Parameter.GetOpenLasterClose())
1631 foreach(
auto it, m_Operates)
1633 d << it->GetSettingsFile();
1640void MainWindow::on_actionTabBar_B_toggled(
bool bShow)
1644 m_pView->SetVisibleTab(bShow);
1645 m_Parameter.SetTabBar(bShow);
1648 m_pDockActive->setVisible(bShow);
1652void MainWindow::on_actionMain_menu_bar_M_toggled(
bool checked)
1654 qDebug(log) << Q_FUNC_INFO << checked;
1655 if(ui->toolBar->isHidden() && !checked)
1657 if( QMessageBox::StandardButton::Yes
1658 == QMessageBox::information(
this, tr(
"Hide menu bar"),
1659 tr(
"The menu bar will be hidden, the tool bar must be showed."),
1660 QMessageBox::StandardButton::Yes
1661 | QMessageBox::StandardButton::No))
1663 ui->actionToolBar_T->setChecked(
true);
1664 if(m_pToolBarMenuAction)
1665 m_pToolBarMenuAction->setVisible(
true);
1667 ui->actionMain_menu_bar_M->setChecked(
true);
1668#if !defined(Q_OS_ANDROID)
1669 if(m_pToolBarMenuAction)
1670 m_pToolBarMenuAction->setVisible(
false);
1676 menuBar()->setVisible(checked);
1677 m_Parameter.SetMenuBar(checked);
1678#if !defined(Q_OS_ANDROID)
1679 if(m_pToolBarMenuAction)
1680 m_pToolBarMenuAction->setVisible(!checked);
1684void MainWindow::on_actionToolBar_T_toggled(
bool checked)
1686 qDebug(log) << Q_FUNC_INFO << checked;
1687 if(menuBar()->isHidden() && !checked)
1689 if( QMessageBox::StandardButton::Yes
1690 == QMessageBox::information(
this, tr(
"Hide tool bar"),
1691 tr(
"The tool bar will be hidden, the menu bar must be showed."),
1692 QMessageBox::StandardButton::Yes
1693 | QMessageBox::StandardButton::No))
1695 ui->actionMain_menu_bar_M->setChecked(
true);
1697 ui->actionToolBar_T->setChecked(
true);
1701 ui->toolBar->setVisible(checked);
1704void MainWindow::on_actionStatus_bar_S_toggled(
bool checked)
1706 statusBar()->setVisible(checked);
1707 m_Parameter.SetStatusBar(checked);
1710void MainWindow::on_actionKeyboard_triggered()
1712 auto inputMethod = QGuiApplication::inputMethod();
1722 inputMethod->show();
1727void MainWindow::on_actionSettings_triggered()
1729 CParameterDlgSettings set(&m_Parameter,
this);
1730 auto viewers = m_Manager.GetSettingsWidgets(&set);
1731 set.AddViewers(viewers);
1732 if(CParameterDlgSettings::Accepted == RC_SHOW_WINDOW(&set))
1734 m_Manager.SaveSettings();
1737 foreach(
auto v, viewers) {
1743void MainWindow::slotShortCut()
1745 if(m_Parameter.GetReceiveShortCut())
1747 setFocusPolicy(Qt::WheelFocus);
1748 ui->actionFull_screen_F->setShortcuts(QKeySequence::FullScreen);
1750 setFocusPolicy(Qt::NoFocus);
1751 ui->actionFull_screen_F->setShortcut(QKeySequence());
1755void MainWindow::on_actionOpenListRecent_triggered()
1757 CFrmRecent* p =
new CFrmRecent(
this, &m_Manager, m_Parameter,
false);
1759 bool check = connect(p, SIGNAL(sigStart(
const QString&,
bool)),
1760 this, SLOT(slotOpenFile(
const QString&,
bool)));
1762 check = connect(p, SIGNAL(sigAddToFavorite(QString,QString,QString,QIcon)),
1763 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QString,QIcon)));
1766 int nRet = p->Initial();
1771 d.setWindowIcon(windowIcon());
1772 d.setWindowTitle(p->windowTitle());
1773 QGridLayout* pLayout =
new QGridLayout(&d);
1775 pLayout->addWidget(p);
1776 check = connect(p, SIGNAL(destroyed()), &d, SLOT(reject()));
1778 d.setLayout(pLayout);
1783void MainWindow::on_actionAdd_to_favorite_triggered()
1785 if(!m_pView || !m_pFavoriteView)
return;
1786 QWidget* p = m_pView->GetCurrentView();
1787 foreach(
auto c, m_Operates)
1791 m_pFavoriteView->slotAddToFavorite(
1797void MainWindow::dragEnterEvent(QDragEnterEvent *event)
1799 qDebug(log) <<
"dragEnterEvent";
1801 if(event->mimeData()->hasUrls())
1804 event->acceptProposedAction();
1808void MainWindow::dragMoveEvent(QDragMoveEvent *event)
1813void MainWindow::dropEvent(QDropEvent *event)
1815 qDebug(log) <<
"dropEvent";
1817 if(!event->mimeData()->hasUrls())
1819 auto urls =
event->mimeData()->urls();
1820 foreach(
auto url, urls)
1822 if(url.isLocalFile())
1823 slotOpenFile(url.toLocalFile());
1832void MainWindow::slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
1837#if defined(Q_OS_ANDROID)
1842 case QSystemTrayIcon::Trigger:
1854void MainWindow::slotSystemTrayIconTypeChanged()
1857 if(!QSystemTrayIcon::isSystemTrayAvailable())
1859 qWarning(log) <<
"System tray is not available";
1863 if(!m_Parameter.GetEnableSystemTrayIcon())
1865 qDebug(log) <<
"Disable system tray icon";
1872 m_TrayIcon = QSharedPointer<QSystemTrayIcon>(
new QSystemTrayIcon(
this));
1873 if(QSystemTrayIcon::isSystemTrayAvailable())
1875 bool check = connect(
1877 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
1879 SLOT(slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason)));
1881 m_TrayIcon->setIcon(this->windowIcon());
1882 m_TrayIcon->setToolTip(windowTitle());
1885 qWarning(log) <<
"System tray is not available";
1887 switch (m_Parameter.GetSystemTrayIconMenuType())
1889 case CParameterApp::SystemTrayIconMenuType::MenuBar:
1891 QMenu* pMenu =
new QMenu(
this);
1892 pMenu->addMenu(ui->menuOperate);
1893 pMenu->addMenu(ui->menuView);
1894 pMenu->addMenu(ui->menuTools);
1895 m_TrayIcon->setContextMenu(pMenu);
1898 case CParameterApp::SystemTrayIconMenuType::Operate:
1899 m_TrayIcon->setContextMenu(ui->menuOperate);
1901 case CParameterApp::SystemTrayIconMenuType::RecentOpen:
1902 m_TrayIcon->setContextMenu(m_pRecentMenu);
1904 case CParameterApp::SystemTrayIconMenuType::View:
1905 m_TrayIcon->setContextMenu(ui->menuView);
1907 case CParameterApp::SystemTrayIconMenuType::Tools:
1908 m_TrayIcon->setContextMenu(ui->menuTools);
1910 case CParameterApp::SystemTrayIconMenuType::No:
1911 m_TrayIcon->setContextMenu(
nullptr);
1916void MainWindow::slotEnableSystemTrayIcon()
1921 if(!m_Parameter.GetEnableSystemTrayIcon())
1924 slotSystemTrayIconTypeChanged();
1927void MainWindow::SetStatsVisible(
bool visible)
1929 if(m_SendRate.isVisible() == visible)
1931 m_SendRate.setVisible(visible);
1932 m_ReceivesRate.setVisible(visible);
1933 m_TotalSends.setVisible(visible);
1934 m_TotalReceives.setVisible(visible);
1937void MainWindow::StartTimer()
1939 bool bStart =
false;
1940 int nMinInterval = 1;
1941 foreach(
auto o, m_Operates) {
1948 m_Timer.start(nMinInterval * 1000);
1952 SetStatsVisible(
false);
1956void MainWindow::slotTimeOut()
1959 auto pWin = m_pView->GetCurrentView();
1961 qDebug(log) <<
"The current view is empty";
1964 foreach(
auto p, m_Operates)
1966 if(p->GetViewer() == pWin)
1968 auto pStats = p->GetStats();
1970 SetStatsVisible(
false);
1973 SetStatsVisible(
true);
1974 pStats->slotCalculating();
1975 m_TotalSends.setText(
"⇈ " + pStats->TotalSends());
1976 m_TotalReceives.setText(
"⇊ " + pStats->TotalReceives());
1977 m_SendRate.setText(
"↑ " + pStats->SendRate());
1978 m_ReceivesRate.setText(
"↓ " + pStats->ReceiveRate());
1984void MainWindow::on_actionUser_manual_triggered()
1986 QString szUrl =
"https://github.com/KangLin/RabbitRemoteControl/wiki/UserManual";
1987 if(RabbitCommon::CTools::GetLanguage() ==
"zh_CN"
1988 || RabbitCommon::CTools::GetLanguage() ==
"zh_TW")
1990 QDesktopServices::openUrl(QUrl(szUrl));
1993void MainWindow::on_actionLayoutDefault_triggered()
1995 qDebug(log) << Q_FUNC_INFO;
1996 if(!m_pDockActive->toggleViewAction()->isChecked())
1997 m_pDockActive->toggleViewAction()->trigger();
1998 if(!m_pDockFavorite->toggleViewAction()->isChecked())
1999 m_pDockFavorite->toggleViewAction()->trigger();
2000 if(!m_pDockRecent->toggleViewAction()->isChecked())
2001 m_pDockRecent->toggleViewAction()->trigger();
2002 m_Parameter.SetTabPosition(QTabWidget::North);
2003 if(!ui->actionTabBar_B->isChecked())
2004 ui->actionTabBar_B->trigger();
2005 if(!ui->actionMain_menu_bar_M->isChecked()) {
2006 ui->actionMain_menu_bar_M->trigger();
2007#if !defined(Q_OS_ANDROID)
2008 m_pToolBarMenuAction->setVisible(
false);
2011 if(!ui->actionToolBar_T->isChecked())
2012 ui->actionToolBar_T->trigger();
2013 addToolBar(Qt::TopToolBarArea, ui->toolBar);
2014 if(!ui->actionStatus_bar_S->isChecked())
2015 ui->actionStatus_bar_S->trigger();
2018void MainWindow::on_actionLayoutSimple_triggered()
2020 qDebug(log) << Q_FUNC_INFO;
2021 if(m_pDockActive->toggleViewAction()->isChecked())
2022 m_pDockActive->toggleViewAction()->trigger();
2023 if(m_pDockFavorite->toggleViewAction()->isChecked())
2024 m_pDockFavorite->toggleViewAction()->trigger();
2025 if(m_pDockRecent->toggleViewAction()->isChecked())
2026 m_pDockRecent->toggleViewAction()->trigger();
2027 m_Parameter.SetTabPosition(QTabWidget::East);
2028 if(!ui->actionTabBar_B->isChecked())
2029 ui->actionTabBar_B->trigger();
2030 if(!ui->actionMain_menu_bar_M->isChecked()) {
2031 ui->actionMain_menu_bar_M->trigger();
2032#if !defined(Q_OS_ANDROID)
2033 m_pToolBarMenuAction->setVisible(
false);
2036 if(!ui->actionToolBar_T->isChecked())
2037 ui->actionToolBar_T->trigger();
2038 addToolBar(Qt::LeftToolBarArea, ui->toolBar);
2039 if(!ui->actionStatus_bar_S->isChecked())
2040 ui->actionStatus_bar_S->trigger();
2043void MainWindow::on_actionLayoutMinimalism_triggered()
2045 qDebug(log) << Q_FUNC_INFO;
2046 if(m_pDockActive->toggleViewAction()->isChecked())
2047 m_pDockActive->toggleViewAction()->trigger();
2048 if(m_pDockFavorite->toggleViewAction()->isChecked())
2049 m_pDockFavorite->toggleViewAction()->trigger();
2050 if(m_pDockRecent->toggleViewAction()->isChecked())
2051 m_pDockRecent->toggleViewAction()->trigger();
2052 m_Parameter.SetTabPosition(QTabWidget::East);
2053 if(ui->actionTabBar_B->isChecked())
2054 ui->actionTabBar_B->trigger();
2055#if !defined(Q_OS_MACOS)
2056 if(ui->actionMain_menu_bar_M->isChecked()) {
2057 ui->actionMain_menu_bar_M->trigger();
2058 m_pToolBarMenuAction->setVisible(
true);
2061 if(!ui->actionToolBar_T->isChecked())
2062 ui->actionToolBar_T->trigger();
2063#if defined(Q_OS_LINUX)
2064 addToolBar(Qt::RightToolBarArea, ui->toolBar);
2066 addToolBar(Qt::LeftToolBarArea, ui->toolBar);
2068 if(ui->actionStatus_bar_S->isChecked())
2069 ui->actionStatus_bar_S->trigger();
virtual void sigShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
用消息对话框(QMessageBox)显示信息
virtual void sigShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
用消息对话框(QMessageBox)显示信息
static CICE * Instance()
Single instance
void sigNewOperate(COperate *pOperate, bool bOpenSettingsDialog)
当在插件中新建操作时,触发此信号
virtual int OpenDialogSettings(QWidget *parent=nullptr)
打开设置对话框
virtual CSecurityLevel::Levels GetSecurityLevel() const
Get Security Level
virtual const QIcon Icon() const
图标
virtual CStats * GetStats()
得到统计信息。如果有,其派生类则需要重载此函数提供统计信息。
void sigFullScreen(bool bFullScreen)
全屏。由操作触发
virtual QWidget * GetViewer()=0
得到显示视图
virtual const QString Protocol() const
协议
virtual const QString Name()
名称
virtual const QString Description()
描述
void sigUpdateParameters(COperate *pOperate)
更新参数,通知应用程序保存或显示参数
virtual const QString Id()
标识
void sigSecurityLevel()
当安全级别改变时触发。其派生类不要直接触发,需要使用 slotSetSecurityLevel 触发
virtual const QString GetTypeName() const
类型名
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get menu
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Protocol() const =0
协议
virtual const QString Id() const
标识。默认: Type() + ":" + Protocol() + ":" + Name()
virtual const QString Description() const =0
描述
int GetInterval()
Get interval.
virtual QWidget * GetCurrentView()=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)
显示信息。暂时在状态栏显示。
MainWindow(QWidget *parent=nullptr)
virtual void slotShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
用消息对话框(QMessageBox)显示信息
void slotRunning()
[MainWindow slotRunning]
void slotCloseView(const QWidget *pView)
[MainWindow slotRunning]
void slotCustomContextMenuRequested(const QPoint &pos)
MainWindow::slotCustomContextMenuRequested
int Initial()
For time-consuming operations