10#include <QDesktopServices>
11#include <QWidgetAction>
15#include <QKeySequence>
19#include <QLoggingCategory>
22#include "mainwindow.h"
23#include "ui_mainwindow.h"
25 #include "FrmUpdater.h"
27#include "RabbitCommonDir.h"
28#include "RabbitCommonTools.h"
34 #include "QUIWidget/QUIWidget.h"
38#include "FrmFullScreenToolBar.h"
39#include "ParameterDlgSettings.h"
42#include "ViewSplitter.h"
48static Q_LOGGING_CATEGORY(log,
"App.MainWindow")
49static Q_LOGGING_CATEGORY(logRecord, "App.
MainWindow.Record")
53 , m_pToolBarMenuAction(
nullptr)
54 , m_pMenuActivityGroup(
nullptr)
55 , m_ptbMenuActivity(
nullptr)
56 , m_pActionOperateMenu(
nullptr)
57 , m_pTBOperate(
nullptr)
58 , m_pActionTBOperate(
nullptr)
59 , m_pDockListRecent(
nullptr)
60 , m_pDockActive(
nullptr)
61 , m_pFrmActive(
nullptr)
62 , m_pSecureLevel(
nullptr)
63 , m_pSignalStatus(
nullptr)
66 , m_pFullScreenToolBar(
nullptr)
67 , m_pRecentMenu(
nullptr)
68 , m_pDockFavorite(
nullptr)
69 , m_pListRecent(
nullptr)
70 , m_pFavoriteView(
nullptr)
71 , m_StatusBarMessage(this)
78#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) && !defined(Q_OS_MACOS)
80 setWindowIcon(QIcon(
":/images/app"));
83 m_StatusBarMessage.setSizePolicy(QSizePolicy::Policy::Expanding,
84 QSizePolicy::Policy::Fixed);
86 this->statusBar()->addWidget(&m_StatusBarMessage);
88 m_SendRate.setToolTip(tr(
"Send rate"));
89 m_SendRate.setStatusTip(tr(
"Send rate"));
92 this->statusBar()->addPermanentWidget(&m_SendRate);
93 m_ReceivesRate.setToolTip(tr(
"Receives rate"));
94 m_ReceivesRate.setStatusTip(tr(
"Receives rate"));
97 this->statusBar()->addPermanentWidget(&m_ReceivesRate);
98 m_TotalSends.setToolTip(tr(
"Total sends"));
99 m_TotalSends.setStatusTip(tr(
"Total sends"));
102 this->statusBar()->addPermanentWidget(&m_TotalSends);
103 m_TotalReceives.setToolTip(tr(
"Total receives"));
104 m_TotalReceives.setStatusTip(tr(
"Total receives"));
107 this->statusBar()->addPermanentWidget(&m_TotalReceives);
109 check = connect(&m_Timer, SIGNAL(timeout()),
this, SLOT(slotTimeOut()));
112 m_pSecureLevel =
new QLabel(statusBar());
116 m_pSecureLevel->hide();
117 statusBar()->addPermanentWidget(m_pSecureLevel);
121 setAcceptDrops(
true);
123 RabbitCommon::CTools::AddStyleMenu(ui->menuTools);
124 ui->menuTools->addMenu(RabbitCommon::CTools::GetLogMenu(
this));
126 m_pRecentMenu =
new RabbitCommon::CRecentMenu(
127 tr(
"Recently"), QIcon::fromTheme(
"document-open-recent"),
true,
this);
128 check = connect(m_pRecentMenu, SIGNAL(recentFileTriggered(
const QString&)),
129 this, SLOT(slotOpenFile(
const QString&)));
131 check = connect(&m_Parameter, SIGNAL(sigRecentMenuMaxCountChanged(
int)),
132 m_pRecentMenu, SLOT(setMaxCount(
int)));
134 QAction* pRecentAction = ui->menuOperate->insertMenu(
135 ui->actionOpenListRecent, m_pRecentMenu);
136 pRecentAction->setStatusTip(pRecentAction->text());
137 QToolButton* tbRecent =
new QToolButton(ui->toolBar);
138 tbRecent->setFocusPolicy(Qt::NoFocus);
139 tbRecent->setPopupMode(QToolButton::InstantPopup);
140 tbRecent->setMenu(m_pRecentMenu);
141 tbRecent->setIcon(pRecentAction->icon());
142 tbRecent->setText(pRecentAction->text());
143 tbRecent->setToolTip(pRecentAction->toolTip());
144 tbRecent->setStatusTip(pRecentAction->statusTip());
145 ui->toolBar->insertWidget(ui->actionOpenListRecent, tbRecent);
149 ui->actionUpdate->setIcon(updater.windowIcon());
152 QToolButton* tbStart =
new QToolButton(ui->toolBar);
153 tbStart->setFocusPolicy(Qt::NoFocus);
154 tbStart->setPopupMode(QToolButton::InstantPopup);
156 tbStart->setMenu(ui->menuStart);
157 tbStart->setIcon(QIcon::fromTheme(
"media-playback-start"));
158 tbStart->setText(tr(
"Start"));
159 tbStart->setToolTip(tr(
"Start"));
160 tbStart->setStatusTip(tr(
"Start"));
161 ui->toolBar->insertWidget(ui->actionStop, tbStart);
165 check = connect(&m_Parameter, SIGNAL(sigReceiveShortCutChanged()),
166 this, SLOT(slotShortCut()));
168 slotSystemTrayIconTypeChanged();
169 check = connect(&m_Parameter, SIGNAL(sigSystemTrayIconTypeChanged()),
171 SLOT(slotSystemTrayIconTypeChanged()));
173 check = connect(&m_Parameter, SIGNAL(sigEnableSystemTrayIcon()),
174 this, SLOT(slotEnableSystemTrayIcon()));
176 check = connect(&m_Parameter, SIGNAL(sigEnableTabToolTipChanged()),
177 this, SLOT(slotUpdateName()));
179 check = connect(&m_Parameter, SIGNAL(sigEnableTabIconChanged()),
180 this, SLOT(slotUpdateName()));
183 auto pTbMenu =
new QToolButton(ui->toolBar);
184 pTbMenu->setFocusPolicy(Qt::NoFocus);
185 pTbMenu->setPopupMode(QToolButton::InstantPopup);
187 pTbMenu->setText(ui->actionMain_menu_bar_M->text());
188 pTbMenu->setIcon(ui->actionMain_menu_bar_M->icon());
189 pTbMenu->setToolTip(ui->actionMain_menu_bar_M->toolTip());
190 pTbMenu->setStatusTip(ui->actionMain_menu_bar_M->statusTip());
191 QMenu *pMenu =
new QMenu(pTbMenu);
192 pMenu->addActions(this->menuBar()->actions());
193 pTbMenu->setMenu(pMenu);
194 m_pToolBarMenuAction = ui->toolBar->insertWidget(ui->actionTabBar_B, pTbMenu);
195#if defined(Q_OS_ANDROID)
196 m_pToolBarMenuAction->setVisible(
true);
198 m_pToolBarMenuAction->setVisible(
false);
201 check = connect(&m_Parameter, SIGNAL(sigStartByTypeChanged()),
202 this, SLOT(slotStartByType()));
205 m_pDockFavorite =
new QDockWidget(
this);
211 m_pDockFavorite->setTitleBarWidget(m_pFavoriteView->m_pDockTitleBar);
212 check = connect(m_pFavoriteView, SIGNAL(sigStart(
const QString&,
bool)),
213 this, SLOT(slotOpenFile(
const QString&,
bool)));
215 check = connect(m_pFavoriteView, SIGNAL(sigFavorite()),
216 this, SLOT(on_actionAdd_to_favorite_triggered()));
218 check = connect(&m_Parameter, SIGNAL(sigFavoriteEditChanged(
bool)),
219 m_pFavoriteView, SLOT(slotDoubleEditNode(
bool)));
221 emit m_Parameter.sigFavoriteEditChanged(m_Parameter.GetFavoriteEdit());
222 m_pDockFavorite->setWidget(m_pFavoriteView);
223 m_pDockFavorite->setWindowTitle(m_pFavoriteView->windowTitle());
226 m_pDockFavorite->setObjectName(
"dockFavorite");
227#if defined(Q_OS_ANDROID)
228 m_pDockFavorite->hide();
230 ui->menuView->addAction(m_pDockFavorite->toggleViewAction());
231 m_pDockFavorite->toggleViewAction()->setIcon(QIcon::fromTheme(
"emblem-favorite"));
232 addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, m_pDockFavorite);
235 m_pDockListRecent =
new QDockWidget(
this);
236 if(m_pDockListRecent)
242 if(m_pListRecent->m_pDockTitleBar)
243 m_pDockListRecent->setTitleBarWidget(
244 m_pListRecent->m_pDockTitleBar);
245 check = connect(m_pListRecent,
246 SIGNAL(sigStart(
const QString&,
bool)),
247 this, SLOT(slotOpenFile(
const QString&,
bool)));
249 check = connect(m_pListRecent, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
250 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
252 m_pDockListRecent->setWidget(m_pListRecent);
253 m_pDockListRecent->setWindowTitle(
254 m_pListRecent->windowTitle());
257 m_pDockListRecent->setObjectName(
"dockListRecent");
258#if defined(Q_OS_ANDROID)
259 m_pDockListRecent->hide();
261 ui->menuView->addAction(m_pDockListRecent->toggleViewAction());
262 m_pDockListRecent->toggleViewAction()->setIcon(QIcon::fromTheme(
"document-open-recent"));
263 tabifyDockWidget(m_pDockFavorite, m_pDockListRecent);
266 m_pDockActive =
new QDockWidget(
this);
270 m_Operates, m_Parameter,
271 ui->menuStart, ui->actionStop,
272 m_pRecentMenu, m_pDockActive);
274 m_pDockActive->setWidget(m_pFrmActive);
275 if(m_pFrmActive->m_pDockTitleBar)
276 m_pDockActive->setTitleBarWidget(
277 m_pFrmActive->m_pDockTitleBar);
278 m_pDockActive->setWindowTitle(m_pFrmActive->windowTitle());
279 check = connect(m_pFrmActive, SIGNAL(sigChanged(
COperate*)),
280 this, SLOT(slotOperateChanged(
COperate*)));
282 check = connect(m_pFrmActive, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
283 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
286 m_pDockActive->setObjectName(
"dockListActive");
287#if defined(Q_OS_ANDROID)
288 m_pDockActive->hide();
290 ui->menuView->addAction(m_pDockActive->toggleViewAction());
291 m_pDockActive->toggleViewAction()->setIcon(QIcon::fromTheme(
"network-wired"));
292 tabifyDockWidget(m_pDockFavorite, m_pDockActive);
295 QActionGroup* pGBView =
new QActionGroup(
this);
297 pGBView->addAction(ui->actionViewTab);
298 pGBView->addAction(ui->actionViewSplit);
300 qDebug(log) <<
"View type:" << m_Parameter.GetViewType();
301 if(CParameterApp::ViewType::Tab == m_Parameter.GetViewType()) {
302 ui->actionViewTab->setChecked(
true);
303 on_actionViewTab_triggered();
305 if(CParameterApp::ViewType::Splitter == m_Parameter.GetViewType()) {
306 ui->actionViewSplit->setChecked(
true);
307 on_actionViewSplit_triggered();
309 check = connect(&m_Parameter, &CParameterApp::sigViewTypeChanged,
315 m_pMenuActivityGroup =
new QActionGroup(ui->menuActivity);
316 m_ptbMenuActivity =
new QToolButton(ui->toolBar);
317 m_ptbMenuActivity->setFocusPolicy(Qt::NoFocus);
318 m_ptbMenuActivity->setPopupMode(QToolButton::InstantPopup);
319 m_ptbMenuActivity->setMenu(ui->menuActivity);
320 m_ptbMenuActivity->setIcon(ui->menuActivity->icon());
321 m_ptbMenuActivity->setText(ui->menuActivity->title());
322 m_ptbMenuActivity->setToolTip(ui->menuActivity->toolTip());
323 m_ptbMenuActivity->setStatusTip(ui->menuActivity->statusTip());
324 ui->toolBar->insertWidget(ui->actionTabBar_B, m_ptbMenuActivity);
333 SIGNAL(sigConnected()),
334 this, SLOT(slotSignalConnected()));
337 SIGNAL(sigDisconnected()),
338 this, SLOT(slotSignalDisconnected()));
341 SIGNAL(sigError(
const int,
const QString&)),
342 this, SLOT(slotSignalError(
const int,
const QString&)));
346 m_pSignalStatus =
new QPushButton();
347 m_pSignalStatus->setToolTip(tr(
"ICE signal status"));
348 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
349 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
350 slotSignalDisconnected();
351 statusBar()->addPermanentWidget(m_pSignalStatus);
354 if(m_Parameter.GetSaveMainWindowStatus())
356 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
357 QSettings::IniFormat);
359 = set.value(
"MainWindow/Status/Geometry").toByteArray();
360 if(!geometry.isEmpty())
361 restoreGeometry(geometry);
363 QByteArray state = set.value(
"MainWindow/Status/State").toByteArray();
367 ui->actionTabBar_B->setChecked(m_Parameter.GetTabBar());
368 on_actionTabBar_B_toggled(m_Parameter.GetTabBar());
369 ui->actionStatus_bar_S->setChecked(m_Parameter.GetStatusBar());
370 statusBar()->setVisible(m_Parameter.GetStatusBar());
371 ui->actionMain_menu_bar_M->setChecked(m_Parameter.GetMenuBar());
372 menuBar()->setVisible(m_Parameter.GetMenuBar());
373 ui->actionToolBar_T->setChecked(!ui->toolBar->isHidden());
377 ui->actionMain_menu_bar_M->setVisible(
false);
380 if(!m_Parameter.GetMenuBar()) {
381 m_pToolBarMenuAction->setVisible(
true);
387MainWindow::~MainWindow()
389 qDebug(log) <<
"MainWindow::~MainWindow()";
390 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
397 qDebug(log) << Q_FUNC_INFO;
402 qApp->processEvents();
408 qApp->processEvents();
409 m_pRecentMenu->slotRestoreState();
412 if(m_pFavoriteView) {
414 qApp->processEvents();
415 m_pFavoriteView->Load();
420 qApp->processEvents();
421 m_pListRecent->slotLoadFiles();
423 slotEnableSystemTrayIcon();
428 qApp->processEvents();
429 LoadOperateLasterClose();
436void MainWindow::SetView(
CView* pView)
438 qDebug(log) << Q_FUNC_INFO;
442 m_pView->disconnect();
445 setCentralWidget(m_pView);
449 check = connect(m_pView, SIGNAL(sigCloseView(
const QWidget*)),
452 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
453 this, SLOT(slotCurrentViewChanged(
const QWidget*)));
456 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
457 m_pFrmActive, SLOT(slotViewChanged(
const QWidget*)));
460 check = connect(m_pView, SIGNAL(customContextMenuRequested(
const QPoint&)),
464 foreach (
auto c, m_Operates) {
465 m_pView->
AddView(c->GetViewer());
466 m_pView->SetWidowsTitle(
467 c->GetViewer(), c->Name(), c->Icon(), c->Description());
469 m_pView->SetVisibleTab(m_Parameter.GetTabBar());
472void MainWindow::on_actionViewTab_triggered()
474 qDebug(log) << Q_FUNC_INFO;
475 if(!ui->actionViewTab->isChecked())
return;
476 m_Parameter.SetViewType(CParameterApp::ViewType::Tab);
480void MainWindow::on_actionViewSplit_triggered()
482 qDebug(log) << Q_FUNC_INFO;
483 if(!ui->actionViewSplit->isChecked())
return;
484 m_Parameter.SetViewType(CParameterApp::ViewType::Splitter);
488void MainWindow::on_actionAbout_triggered()
491 CDlgAbout *about =
new CDlgAbout(
this);
492 QIcon icon = QIcon::fromTheme(
"app");
494 auto sizeList = icon.availableSizes();
495 if(!sizeList.isEmpty()) {
496 QPixmap p = icon.pixmap(*sizeList.begin());
497 about->m_AppIcon = p.toImage();
500 about->m_szCopyrightStartTime =
"2020";
501 about->m_szVersionRevision = RabbitRemoteControl_REVISION;
502 about->m_szDetails = m_Manager.Details();
503 RC_SHOW_WINDOW(about);
507void MainWindow::on_actionUpdate_triggered()
509 if(!qEnvironmentVariable(
"SNAP").isEmpty()) {
510 QDesktopServices::openUrl(QUrl(
"https://snapcraft.io/rabbitremotecontrol"));
511 }
else if(!qEnvironmentVariable(
"FLATPAK_ID").isEmpty()) {
512 QDesktopServices::openUrl(QUrl(
"https://flathub.org/apps/io.github.KangLin.RabbitRemoteControl"));
515 CFrmUpdater* m_pfrmUpdater =
new CFrmUpdater();
516 QIcon icon = QIcon::fromTheme(
"app");
518 auto sizeList = icon.availableSizes();
519 if(!sizeList.isEmpty()) {
520 QPixmap p = icon.pixmap(*sizeList.begin());
521 m_pfrmUpdater->SetTitle(p.toImage());
524 m_pfrmUpdater->SetInstallAutoStartup();
525 RC_SHOW_WINDOW(m_pfrmUpdater);
530void MainWindow::on_actionFull_screen_F_triggered()
532 CView* pView = qobject_cast<CView*>(this->centralWidget());
535 pView->SetFullScreen(!isFullScreen());
540 qDebug(log) <<
"Exit full screen";
541 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-fullscreen"));
542 ui->actionFull_screen_F->setText(tr(
"Full screen"));
543 ui->actionFull_screen_F->setToolTip(tr(
"Full screen"));
544 ui->actionFull_screen_F->setStatusTip(tr(
"Full screen"));
545 ui->actionFull_screen_F->setWhatsThis(tr(
"Full screen"));
547 ui->toolBar->setVisible(m_FullState.toolBar);
548 ui->statusbar->setVisible(m_FullState.statusbar);
549 ui->menubar->setVisible(m_FullState.menubar);
551 m_pDockActive->setVisible(m_FullState.dockListActive);
552 m_pDockListRecent->setVisible(m_FullState.dockListRecent);
553 m_pDockFavorite->setVisible(m_FullState.dockFavorite);
555 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
558 pDockDebugLog->setVisible(m_FullState.dockDebugLog);
561 if(m_pFullScreenToolBar)
564 m_pFullScreenToolBar->close();
565 m_pFullScreenToolBar =
nullptr;
568 emit sigShowNormal();
570 this->activateWindow();
572 emit sigFullScreen(
false);
576 qDebug(log) <<
"Entry full screen";
579 this->showFullScreen();
580 emit sigFullScreen(
true);
582 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-restore"));
583 ui->actionFull_screen_F->setText(tr(
"Exit full screen"));
584 ui->actionFull_screen_F->setToolTip(tr(
"Exit full screen"));
585 ui->actionFull_screen_F->setStatusTip(tr(
"Exit full screen"));
586 ui->actionFull_screen_F->setWhatsThis(tr(
"Exit full screen"));
588 m_FullState.toolBar = ui->toolBar->isVisible();
589 ui->toolBar->setVisible(
false);
590 m_FullState.statusbar = ui->statusbar->isVisible();
591 ui->statusbar->setVisible(
false);
592 m_FullState.menubar = ui->menubar->isVisible();
593 ui->menubar->setVisible(
false);
595 m_FullState.dockListActive = m_pDockActive->isVisible();
596 m_pDockActive->setVisible(
false);
597 m_FullState.dockListRecent = m_pDockListRecent->isVisible();
598 m_pDockListRecent->setVisible(
false);
599 m_FullState.dockFavorite = m_pDockFavorite->isVisible();
600 m_pDockFavorite->setVisible(
false);
602 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
605 m_FullState.dockDebugLog = pDockDebugLog->isVisible();
606 pDockDebugLog->setVisible(
false);
609 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
612 QScreen* pScreen = qApp->primaryScreen();
614 QPoint pos(pScreen->geometry().left()
615 + (pScreen->geometry().width()
616 - m_pFullScreenToolBar->frameGeometry().width()) / 2,
617 pScreen->geometry().top());
618 qDebug(log) <<
"Primary screen geometry:" << pScreen->geometry()
619 <<
"availableGeometry:" << pScreen->availableGeometry()
620 << pos << mapToGlobal(pos);
621 m_pFullScreenToolBar->move(pos);
623 bool check = connect(m_pFullScreenToolBar, SIGNAL(sigExitFullScreen()),
624 this, SLOT(on_actionFull_screen_F_triggered()));
626 check = connect(m_pFullScreenToolBar, SIGNAL(sigExit()),
627 this, SLOT(on_actionExit_E_triggered()));
630 check = connect(
this, SIGNAL(sigOperateMenuChanged(QAction*)),
631 m_pFullScreenToolBar,
632 SLOT(slotOperateMenuChanged(QAction*)));
635 m_pFullScreenToolBar->show();
638void MainWindow::slotViewerFocusIn(QWidget *pView)
640 COperate* c = qobject_cast<COperate*>(sender());
641 qDebug(log) << Q_FUNC_INFO <<
"Focus:" << c << pView;
647void MainWindow::slotOperateChanged(
COperate *o)
654void MainWindow::slotCurrentViewChanged(
const QWidget* pView)
656 qDebug(log) << Q_FUNC_INFO;
662 foreach(
auto o, m_Operates) {
665 SetStatsVisible(o->GetStats());
666 foreach (
auto a, ui->menuActivity->actions()) {
667 if(a->data().value<
COperate*>() == o)
674void MainWindow::EnableMenu(
bool bEnable)
676 qDebug(log) << Q_FUNC_INFO << bEnable;
677 ui->actionClone->setEnabled(bEnable);
678 ui->actionAdd_to_favorite->setEnabled(bEnable);
679 ui->actionStop->setEnabled(bEnable);
680 ui->actionTabBar_B->setEnabled(bEnable);
681 ui->menuActivity->setEnabled(bEnable);
682 m_ptbMenuActivity->setEnabled(bEnable);
683 slotLoadOperateMenu();
686void MainWindow::slotMenuActivity()
688 QAction* pAction = qobject_cast<QAction*>(sender());
693 slotOperateChanged(p);
696void MainWindow::slotLoadOperateMenu()
698 qDebug(log) << Q_FUNC_INFO;
700 if(m_pActionOperateMenu) {
701 ui->menuOperate->removeAction(m_pActionOperateMenu);
702 m_pActionOperateMenu =
nullptr;
704 ui->toolBar->removeAction(m_pActionTBOperate);
710 qDebug(log) <<
"The current view is empty";
713 foreach(
auto op, m_Operates)
715 if(op->GetViewer() == pWin)
717 qDebug(log) <<
"Load plugin menu";
718 auto m = op->GetMenu(ui->menuTools);
721 m_pActionOperateMenu = ui->menuOperate->insertMenu(ui->actionAdd_to_favorite, m);
724 m_pTBOperate =
new QToolButton(ui->toolBar);
726 m_pTBOperate->setFocusPolicy(Qt::NoFocus);
727 m_pTBOperate->setPopupMode(QToolButton::InstantPopup);
728 m_pTBOperate->setMenu(m);
729 m_pTBOperate->setIcon(m->icon());
730 m_pTBOperate->setText(m->title());
731 m_pTBOperate->setToolTip(m->toolTip());
732 m_pTBOperate->setStatusTip(m->statusTip());
733 m_pTBOperate->show();
734 m_pActionTBOperate = ui->toolBar->insertWidget(ui->actionAdd_to_favorite, m_pTBOperate);
736 emit sigOperateMenuChanged(m_pActionOperateMenu);
753 qDebug(log) <<
"The current view is empty";
756 foreach(
auto p, m_Operates)
760 qDebug(log) <<
"Load plugin menu";
761 auto m = p->
GetMenu(ui->menuTools);
769void MainWindow::on_actionExit_E_triggered()
774void MainWindow::keyReleaseEvent(QKeyEvent *event)
780 on_actionFull_screen_F_triggered();
783 QMainWindow::keyReleaseEvent(event);
786void MainWindow::slotUpdateParameters(
COperate *pOperate)
791void MainWindow::on_actionClone_triggered()
795 foreach(
auto pOperate, m_Operates)
799 QString szFile = pOperate->GetSettingsFile();
801 if(!pOperate)
return;
802 Start(pOperate,
false, szFile);
808void MainWindow::slotOpenFile(
const QString& szFile,
bool bOpenSettings)
810 if(szFile.isEmpty())
return;
814 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
818 Start(p, bOpenSettings, szFile);
821void MainWindow::on_actionOpenRRCFile_triggered()
823 QString szFile = QFileDialog::getOpenFileName(
825 tr(
"Open rabbit remote control file"),
826 RabbitCommon::CDir::Instance()->GetDirUserData(),
827 tr(
"Rabbit remote control Files (*.rrc);;All files(*.*)"));
828 if(szFile.isEmpty())
return;
833 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
840void MainWindow::slotStart()
842 if(
nullptr == m_pView)
847 QAction* pAction = qobject_cast<QAction*>(this->sender());
850 if(
nullptr == p)
return;
866 qDebug(log) <<
"MainWindow::Start: set:" << set <<
"; File:" << szFile;
869 bool check = connect(pOperate, SIGNAL(sigRunning()),
872 check = connect(pOperate, SIGNAL(sigStop()),
873 this, SLOT(slotStop()));
875 check = connect(pOperate, SIGNAL(sigFinished()),
876 this, SLOT(slotFinished()));
878 check = connect(pOperate, SIGNAL(sigError(
const int,
const QString &)),
879 this, SLOT(slotError(
const int,
const QString&)));
881 check = connect(pOperate, SIGNAL(sigShowMessageBox(
const QString&,
const QString&,
882 const QMessageBox::Icon&)),
884 const QMessageBox::Icon&)));
886 check = connect(pOperate, SIGNAL(sigInformation(
const QString&)),
889 check = connect(pOperate, SIGNAL(sigUpdateName(
const QString&)),
890 this, SLOT(slotUpdateName(
const QString&)));
892 check = connect(pOperate, SIGNAL(sigUpdateParameters(
COperate*)),
893 this, SLOT(slotUpdateParameters(
COperate*)));
896 this, [
this, pOperate](
bool bFull) {
898 if((bFull && !isFullScreen()) || (!bFull && isFullScreen()))
899 on_actionFull_screen_F_triggered();
908 case QDialog::Rejected:
911 case QDialog::Accepted:
918 szFile = pOperate->GetSettingsFile();
920 pOperate->SetSettingsFile(szFile);
926 m_pRecentMenu->addRecentFile(szFile, pOperate->
Name());
928 if(!pOperate->
Name().isEmpty())
932 if(-1 < m_Operates.indexOf(pOperate)) {
934 m_pView->SetCurrentView(pOperate->
GetViewer());
940 m_pView->SetWidowsTitle(pOperate->
GetViewer(), pOperate->
Name(),
943 check = connect(pOperate, SIGNAL(sigViewerFocusIn(QWidget*)),
944 this, SLOT(slotViewerFocusIn(QWidget*)));
947 m_Operates.push_back(pOperate);
950 m_pFrmActive->slotLoad();
954 vOperate.setValue(pOperate);
955 QAction* m_pActionmenuActivity = ui->menuActivity->addAction(
956 pOperate->
Icon(), pOperate->
Name(),
this, SLOT(slotMenuActivity()));
957 m_pActionmenuActivity->setData(vOperate);
958 m_pActionmenuActivity->setCheckable(
true);
959 m_pMenuActivityGroup->addAction(m_pActionmenuActivity);
960 m_pActionmenuActivity->setChecked(
true);
963 nRet = pOperate->
Start();
975 COperate* p = qobject_cast<COperate*>(sender());
1000 m->addAction(ui->actionClone);
1002 slotLoadOperateMenu();
1005 qDebug(log) << Q_FUNC_INFO << p->
Name();
1011 qDebug(log) <<
"MainWindow::slotCloseView" << pView;
1013 foreach(
auto p, m_Operates)
1024void MainWindow::on_actionStop_triggered()
1026 qDebug(log) << Q_FUNC_INFO;
1027 if(!m_pView)
return;
1033void MainWindow::slotStop()
1035 COperate* pOperate = qobject_cast<COperate*>(sender());
1036 if(!pOperate)
return;
1037 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
1043void MainWindow::slotFinished()
1045 COperate* pOperate = qobject_cast<COperate*>(sender());
1046 if(!pOperate)
return;
1048 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
1049 foreach(
auto a, ui->menuActivity->actions()) {
1052 ui->menuActivity->removeAction(a);
1053 m_pMenuActivityGroup->removeAction(a);
1056 foreach(
auto p, m_Operates)
1061 m_Operates.removeAll(p);
1063 m_pFrmActive->slotLoad();
1068 if(m_Operates.isEmpty())
1069 if(m_pActionOperateMenu) {
1070 ui->menuTools->removeAction(m_pActionOperateMenu);
1071 ui->toolBar->removeAction(m_pActionOperateMenu);
1072 m_pActionOperateMenu =
nullptr;
1080void SetIndicator(QLabel* label, QColor color,
int size)
1082 QString min_width = QString(
"min-width: %1px;").arg(size);
1083 QString min_height = QString(
"min-height: %1px;").arg(size);
1084 QString max_width = QString(
"max-width: %1px;").arg(size);
1085 QString max_height = QString(
"max-height: %1px;").arg(size);
1087 QString border_radius = QString(
"border-radius: %1px;").arg(size / 2);
1088 QString border = QString(
"border:1px solid ") + color.name() +
";";
1090 QString background =
"background-color: ";
1091 background += color.name() +
";";
1092 QString SheetStyle = min_width + min_height + max_width + max_height + border_radius + border + background;
1093 label->setStyleSheet(SheetStyle);
1096void MainWindow::SetSecureLevel(
COperate* o)
1098 if(!m_pSecureLevel)
return;
1100 if(COperate::SecurityLevel::No == o->GetSecurityLevel())
1102 m_pSecureLevel->hide();
1105 SetIndicator(m_pSecureLevel, o->GetSecurityLevelColor(), statusBar()->height() / 2);
1106 m_pSecureLevel->setToolTip(o->GetSecurityLevelString());
1107 m_pSecureLevel->setStatusTip(o->GetSecurityLevelString());
1108 m_pSecureLevel->show();
1110 m_pSecureLevel->hide();
1113void MainWindow::slotSignalConnected()
1115 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Connected"));
1116 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1117 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1119 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wired"));
1122void MainWindow::slotSignalDisconnected()
1124 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Disconnected"));
1125 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1126 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1128 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wireless"));
1131void MainWindow::slotSignalError(
const int nError,
const QString &szInfo)
1133 slotSignalDisconnected();
1134 slotError(nError, szInfo);
1137void MainWindow::slotSignalPushButtonClicked(
bool checked)
1147void MainWindow::slotError(
const int nError,
const QString &szInfo)
1150 slotStatusMessage(szInfo, MessageLevel::Error);
1154 const QString &title,
const QString &message,
1155 const QMessageBox::Icon &icon)
1158 if(!m_Parameter.GetMessageBoxDisplayInformation())
1161 QMessageBox msg(icon, title, message, QMessageBox::Ok,
this);
1162 QCheckBox* cb =
new QCheckBox(
1163 tr(
"Use message box to display information"),
this);
1164 cb->setChecked(
true);
1165 msg.setCheckBox(cb);
1166 RC_SHOW_WINDOW(&msg);
1167 if(!cb->isChecked())
1169 m_Parameter.SetMessageBoxDisplayInformation(
false);
1176 slotStatusMessage(szInfo, MessageLevel::Normal);
1179void MainWindow::slotStatusMessage(QString szMessage, MessageLevel level)
1182 switch ((MessageLevel)level) {
1183 case MessageLevel::Error:
1184 pe.setColor(QPalette::WindowText, Qt::red);
1186 case MessageLevel::Warning:
1187 pe.setColor(QPalette::WindowText, Qt::yellow);
1193 m_StatusBarMessage.setPalette(pe);
1194 m_StatusBarMessage.setToolTip(szMessage);
1195 QFontMetrics metrics(m_StatusBarMessage.font());
1197 szMessage = metrics.elidedText(szMessage, Qt::ElideRight, m_StatusBarMessage.width());
1199 m_StatusBarMessage.setText(szMessage);
1202void MainWindow::slotUpdateName()
1204 foreach (
auto p, m_Operates)
1213void MainWindow::slotUpdateName(
const QString& szName)
1215 COperate* p = qobject_cast<COperate*>(sender());
1217 m_pView->SetWidowsTitle(p->
GetViewer(), szName,
1219 foreach(
auto a, ui->menuActivity->actions()) {
1220 if(a->data().value<
COperate*>() == p) {
1222 a->setIcon(p->
Icon());
1228QAction* MainWindow::GetStartAction(QMenu* pMenu,
CPlugin *pPlug)
1232 szTitle = pPlug->
Protocol() +
": ";
1234 QAction* p = pMenu->addAction(szTitle);
1237 p->setData(pPlug->
Id());
1238 p->setIcon(pPlug->Icon());
1242void MainWindow::slotStartByType()
1244 qDebug(log) << Q_FUNC_INFO;
1245 auto m = ui->menuStart->actions();
1246 foreach(
auto a, m) {
1249 foreach (
auto a, m_MenuStartByType) {
1252 ui->menuStart->clear();
1253 m_MenuStartByType.clear();
1260 QMenu* m = ui->menuStart;
1261 if(m_Parameter.GetStartByType()) {
1262 auto it = m_MenuStartByType.find(pPlugin->Type());
1263 if(it == m_MenuStartByType.end()) {
1264 m =
new QMenu(pPlugin->TypeName(pPlugin->Type()), ui->menuStart);
1265 m_MenuStartByType[pPlugin->Type()] = m;
1266 ui->menuStart->addMenu(m);
1271 QAction* p = GetStartAction(m, pPlugin);
1273 check = connect(p, SIGNAL(triggered()),
this, SLOT(slotStart()));
1278void MainWindow::closeEvent(QCloseEvent *event)
1280 qDebug(log) <<
"MainWindow::closeEvent()";
1282 if(m_Parameter.GetSaveMainWindowStatus())
1284 on_actionFull_screen_F_triggered();
1286 SaveOperateLasterClose();
1288 foreach (
auto it, m_Operates)
1291 emit it->sigUpdateParameters(it);
1295 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
1296 QSettings::IniFormat);
1297 if(m_Parameter.GetSaveMainWindowStatus())
1299 set.setValue(
"MainWindow/Status/Geometry", saveGeometry());
1300 set.setValue(
"MainWindow/Status/State", saveState());
1302 m_Parameter.SetTabBar(ui->actionTabBar_B->isChecked());
1303 m_Parameter.SetMenuBar(menuBar()->isVisible());
1304 m_Parameter.SetStatusBar(statusBar()->isVisible());
1306 set.remove(
"MainWindow/Status/Geometry");
1307 set.remove(
"MainWindow/Status/State");
1313 QMainWindow::closeEvent(event);
1319int MainWindow::LoadOperateLasterClose()
1321 if(!m_Parameter.GetOpenLasterClose())
1324 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1325 + QDir::separator() +
"LasterClose.dat");
1326 if(f.open(QFile::ReadOnly))
1332 if(szFile.isEmpty())
1334 slotOpenFile(szFile);
1341int MainWindow::SaveOperateLasterClose()
1343 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1344 + QDir::separator() +
"LasterClose.dat");
1345 f.open(QFile::WriteOnly);
1346 if(m_Parameter.GetOpenLasterClose())
1349 foreach(
auto it, m_Operates)
1351 d << it->GetSettingsFile();
1358void MainWindow::on_actionTabBar_B_toggled(
bool bShow)
1362 m_pView->SetVisibleTab(bShow);
1363 m_Parameter.SetTabBar(bShow);
1366 m_pDockActive->setVisible(bShow);
1370void MainWindow::on_actionMain_menu_bar_M_toggled(
bool checked)
1372 qDebug(log) << Q_FUNC_INFO << checked;
1373 if(ui->toolBar->isHidden() && !checked)
1375 if( QMessageBox::StandardButton::Yes
1376 == QMessageBox::information(
this, tr(
"Hide menu bar"),
1377 tr(
"The menu bar will be hidden, the tool bar must be showed."),
1378 QMessageBox::StandardButton::Yes
1379 | QMessageBox::StandardButton::No))
1381 ui->actionToolBar_T->setChecked(
true);
1382 if(m_pToolBarMenuAction)
1383 m_pToolBarMenuAction->setVisible(
true);
1385 ui->actionMain_menu_bar_M->setChecked(
true);
1386#if !defined(Q_OS_ANDROID)
1387 if(m_pToolBarMenuAction)
1388 m_pToolBarMenuAction->setVisible(
false);
1394 menuBar()->setVisible(checked);
1395 m_Parameter.SetMenuBar(checked);
1396#if !defined(Q_OS_ANDROID)
1397 if(m_pToolBarMenuAction)
1398 m_pToolBarMenuAction->setVisible(!checked);
1402void MainWindow::on_actionToolBar_T_toggled(
bool checked)
1404 qDebug(log) << Q_FUNC_INFO << checked;
1405 if(menuBar()->isHidden() && !checked)
1407 if( QMessageBox::StandardButton::Yes
1408 == QMessageBox::information(
this, tr(
"Hide tool bar"),
1409 tr(
"The tool bar will be hidden, the menu bar must be showed."),
1410 QMessageBox::StandardButton::Yes
1411 | QMessageBox::StandardButton::No))
1413 ui->actionMain_menu_bar_M->setChecked(
true);
1415 ui->actionToolBar_T->setChecked(
true);
1419 ui->toolBar->setVisible(checked);
1422void MainWindow::on_actionStatus_bar_S_toggled(
bool checked)
1424 statusBar()->setVisible(checked);
1425 m_Parameter.SetStatusBar(checked);
1429void MainWindow::on_actionSettings_triggered()
1432 if(CParameterDlgSettings::Accepted == RC_SHOW_WINDOW(&set))
1440void MainWindow::slotShortCut()
1442 if(m_Parameter.GetReceiveShortCut())
1444 setFocusPolicy(Qt::WheelFocus);
1445 ui->actionFull_screen_F->setShortcuts(QKeySequence::FullScreen);
1447 setFocusPolicy(Qt::NoFocus);
1448 ui->actionFull_screen_F->setShortcut(QKeySequence());
1452void MainWindow::on_actionOpenListRecent_triggered()
1456 bool check = connect(p, SIGNAL(sigStart(
const QString&,
bool)),
1457 this, SLOT(slotOpenFile(
const QString&,
bool)));
1459 check = connect(p, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
1460 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
1466 d.setWindowIcon(windowIcon());
1467 d.setWindowTitle(p->windowTitle());
1468 QGridLayout* pLayout =
new QGridLayout(&d);
1470 pLayout->addWidget(p);
1471 check = connect(p, SIGNAL(destroyed()), &d, SLOT(reject()));
1472 d.setLayout(pLayout);
1477void MainWindow::on_actionAdd_to_favorite_triggered()
1479 if(!m_pView || !m_pFavoriteView)
return;
1481 foreach(
auto c, m_Operates)
1486 c->
Icon(), c->GetSettingsFile());
1491void MainWindow::dragEnterEvent(QDragEnterEvent *event)
1493 qDebug(log) <<
"dragEnterEvent";
1495 if(event->mimeData()->hasUrls())
1497 qWarning(log) <<
event->mimeData()->urls();
1498 event->acceptProposedAction();
1502void MainWindow::dragMoveEvent(QDragMoveEvent *event)
1507void MainWindow::dropEvent(QDropEvent *event)
1509 qDebug(log) <<
"dropEvent";
1510 if(!event->mimeData()->hasUrls())
1512 auto urls =
event->mimeData()->urls();
1513 foreach(
auto url, urls)
1515 if(url.isLocalFile())
1516 slotOpenFile(url.toLocalFile());
1520void MainWindow::slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
1525#if defined(Q_OS_ANDROID)
1530 case QSystemTrayIcon::Trigger:
1542void MainWindow::slotSystemTrayIconTypeChanged()
1545 if(!QSystemTrayIcon::isSystemTrayAvailable())
1547 qWarning(log) <<
"System tray is not available";
1551 if(!m_Parameter.GetEnableSystemTrayIcon())
1553 qDebug(log) <<
"Disable system tray icon";
1560 m_TrayIcon = QSharedPointer<QSystemTrayIcon>(
new QSystemTrayIcon(
this));
1561 if(QSystemTrayIcon::isSystemTrayAvailable())
1563 bool check = connect(
1565 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
1567 SLOT(slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason)));
1569 m_TrayIcon->setIcon(this->windowIcon());
1570 m_TrayIcon->setToolTip(windowTitle());
1573 qWarning(log) <<
"System tray is not available";
1575 switch (m_Parameter.GetSystemTrayIconMenuType())
1577 case CParameterApp::SystemTrayIconMenuType::MenuBar:
1579 QMenu* pMenu =
new QMenu(
this);
1580 pMenu->addMenu(ui->menuOperate);
1581 pMenu->addMenu(ui->menuView);
1582 pMenu->addMenu(ui->menuTools);
1583 m_TrayIcon->setContextMenu(pMenu);
1586 case CParameterApp::SystemTrayIconMenuType::Operate:
1587 m_TrayIcon->setContextMenu(ui->menuOperate);
1589 case CParameterApp::SystemTrayIconMenuType::RecentOpen:
1590 m_TrayIcon->setContextMenu(m_pRecentMenu);
1592 case CParameterApp::SystemTrayIconMenuType::View:
1593 m_TrayIcon->setContextMenu(ui->menuView);
1595 case CParameterApp::SystemTrayIconMenuType::Tools:
1596 m_TrayIcon->setContextMenu(ui->menuTools);
1598 case CParameterApp::SystemTrayIconMenuType::No:
1599 m_TrayIcon->setContextMenu(
nullptr);
1604void MainWindow::slotEnableSystemTrayIcon()
1609 if(!m_Parameter.GetEnableSystemTrayIcon())
1612 slotSystemTrayIconTypeChanged();
1615void MainWindow::slotTimeOut()
1619 qDebug(log) <<
"The current view is empty";
1622 foreach(
auto p, m_Operates)
1624 if(p->GetViewer() == pWin)
1626 auto pStats = p->GetStats();
1628 SetStatsVisible(
false);
1631 SetStatsVisible(
true);
1632 pStats->slotCalculating();
1633 m_TotalSends.setText(
"⇈ " + pStats->TotalSends());
1634 m_TotalReceives.setText(
"⇊ " + pStats->TotalReceives());
1635 m_SendRate.setText(
"↑ " + pStats->SendRate());
1636 m_ReceivesRate.setText(
"↓ " + pStats->ReceiveRate());
1642void MainWindow::SetStatsVisible(
bool visible)
1644 if(m_SendRate.isVisible() == visible)
1646 m_SendRate.setVisible(visible);
1647 m_ReceivesRate.setVisible(visible);
1648 m_TotalSends.setVisible(visible);
1649 m_TotalReceives.setVisible(visible);
1652void MainWindow::StartTimer()
1654 bool bStart =
false;
1655 int nMinInterval = 60;
1656 foreach(
auto o, m_Operates) {
1657 if(o && o->GetStats()) {
1658 nMinInterval = qMin(nMinInterval, o->GetStats()->
GetInterval());
1663 m_Timer.start(nMinInterval * 1000);
1668void MainWindow::on_actionUser_manual_triggered()
1670 QString szUrl =
"https://github.com/KangLin/RabbitRemoteControl/wiki/UserManual";
1671 if(RabbitCommon::CTools::GetLanguage() ==
"zh_CN"
1672 || RabbitCommon::CTools::GetLanguage() ==
"zh_TW")
1676void MainWindow::on_actionLayoutDefault_triggered()
1678 qDebug(log) << Q_FUNC_INFO;
1679 if(!m_pDockActive->toggleViewAction()->isChecked())
1680 m_pDockActive->toggleViewAction()->trigger();
1681 if(!m_pDockFavorite->toggleViewAction()->isChecked())
1682 m_pDockFavorite->toggleViewAction()->trigger();
1683 if(!m_pDockListRecent->toggleViewAction()->isChecked())
1684 m_pDockListRecent->toggleViewAction()->trigger();
1685 m_Parameter.SetTabPosition(QTabWidget::North);
1686 if(!ui->actionTabBar_B->isChecked())
1687 ui->actionTabBar_B->trigger();
1688 if(!ui->actionMain_menu_bar_M->isChecked()) {
1689 ui->actionMain_menu_bar_M->trigger();
1690#if !defined(Q_OS_ANDROID)
1691 m_pToolBarMenuAction->setVisible(
false);
1694 if(!ui->actionToolBar_T->isChecked())
1695 ui->actionToolBar_T->trigger();
1696 addToolBar(Qt::TopToolBarArea, ui->toolBar);
1697 if(!ui->actionStatus_bar_S->isChecked())
1698 ui->actionStatus_bar_S->trigger();
1701void MainWindow::on_actionLayoutSimple_triggered()
1703 qDebug(log) << Q_FUNC_INFO;
1704 if(m_pDockActive->toggleViewAction()->isChecked())
1705 m_pDockActive->toggleViewAction()->trigger();
1706 if(m_pDockFavorite->toggleViewAction()->isChecked())
1707 m_pDockFavorite->toggleViewAction()->trigger();
1708 if(m_pDockListRecent->toggleViewAction()->isChecked())
1709 m_pDockListRecent->toggleViewAction()->trigger();
1710 m_Parameter.SetTabPosition(QTabWidget::East);
1711 if(!ui->actionTabBar_B->isChecked())
1712 ui->actionTabBar_B->trigger();
1713 if(!ui->actionMain_menu_bar_M->isChecked()) {
1714 ui->actionMain_menu_bar_M->trigger();
1715#if !defined(Q_OS_ANDROID)
1716 m_pToolBarMenuAction->setVisible(
false);
1719 if(!ui->actionToolBar_T->isChecked())
1720 ui->actionToolBar_T->trigger();
1721 addToolBar(Qt::LeftToolBarArea, ui->toolBar);
1722 if(!ui->actionStatus_bar_S->isChecked())
1723 ui->actionStatus_bar_S->trigger();
1726void MainWindow::on_actionLayoutMinimalism_triggered()
1728 qDebug(log) << Q_FUNC_INFO;
1729 if(m_pDockActive->toggleViewAction()->isChecked())
1730 m_pDockActive->toggleViewAction()->trigger();
1731 if(m_pDockFavorite->toggleViewAction()->isChecked())
1732 m_pDockFavorite->toggleViewAction()->trigger();
1733 if(m_pDockListRecent->toggleViewAction()->isChecked())
1734 m_pDockListRecent->toggleViewAction()->trigger();
1735 m_Parameter.SetTabPosition(QTabWidget::East);
1736 if(ui->actionTabBar_B->isChecked())
1737 ui->actionTabBar_B->trigger();
1738#if !defined(Q_OS_MACOS)
1739 if(ui->actionMain_menu_bar_M->isChecked()) {
1740 ui->actionMain_menu_bar_M->trigger();
1741 m_pToolBarMenuAction->setVisible(
true);
1744 if(!ui->actionToolBar_T->isChecked())
1745 ui->actionToolBar_T->trigger();
1746#if defined(Q_OS_LINUX)
1747 addToolBar(Qt::RightToolBarArea, ui->toolBar);
1749 addToolBar(Qt::LeftToolBarArea, ui->toolBar);
1751 if(ui->actionStatus_bar_S->isChecked())
1752 ui->actionStatus_bar_S->trigger();
static CICE * Instance()
Single instance
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
得到设置参数窗口
virtual int EnumPlugins(Handle *handle)
Enum plugins
virtual COperate * CreateOperate(const QString &id)
新建 COperate 指针,所有者是调用者。 当不在使用时,调用者必调用 DeteleOperate() 须释放指针。 调用者必须连接信号 COperate::sigFinished 。 释放指针 (...
virtual COperate * LoadOperate(const QString &szFile)
从文件中新建 COperate 指针,所有者是调用者。 当不再使用时,调用者必须负责调用 DeleteOperate() 删除此指针。 调用者必须连接信号 COperate::sigFinished 。...
virtual int DeleteOperate(COperate *p)
Delete COperate
virtual int SaveOperate(COperate *pOperate)
保存连接参数到文件
virtual int SaveSettings(const QString szFile=QString())
保存客户端参数到文件
virtual int OpenDialogSettings(QWidget *parent=nullptr)
打开设置对话框
virtual const QIcon Icon() const
Icon
void sigFullScreen(bool bFullScreen)
全屏。由操作触发
virtual QWidget * GetViewer()=0
得到显示视图
virtual const QString Name()
Name
virtual const QString Description()
Description
void sigUpdateParameters(COperate *pOperate)
更新参数,通知应用程序保存或显示参数
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get menu
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file
virtual const QString Id()
标识。默认: Type() + ":" + Protocol() + ":" + Name()
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Protocol() const =0
协议
virtual const QString Description() const =0
描述
int GetInterval()
Get interval.
virtual int AddView(QWidget *pView)=0
virtual QWidget * GetCurrentView()=0
virtual int RemoveView(QWidget *pView)=0
int Start(COperate *pOperate, bool set, QString szFile=QString())
Start
virtual int onProcess(const QString &id, CPlugin *pPlugin) override
Process plugins
void slotInitial()
For time-consuming operations
void slotInformation(const QString &szInfo)
显示信息。暂时在状态栏显示。
virtual void slotShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
用消息对话框(QMessageBox)显示信息
void slotRunning()
[MainWindow slotRunning]
void slotCloseView(const QWidget *pView)
[MainWindow slotRunning]
void slotCustomContextMenuRequested(const QPoint &pos)
MainWindow::slotCustomContextMenuRequested