4#include "ui_mainwindow.h"
8#include "RabbitCommonDir.h"
9#include "RabbitCommonTools.h"
15#include "QUIWidget/QUIWidget.h"
19#include "FrmFullScreenToolBar.h"
20#include "ParameterDlgSettings.h"
21#include "FrmListRecent.h"
24#include "ViewSplitter.h"
34#include <QApplication>
36#include <QDesktopServices>
37#include <QWidgetAction>
41#include <QKeySequence>
45#include <QLoggingCategory>
48static Q_LOGGING_CATEGORY(log,
"App.MainWindow")
49static Q_LOGGING_CATEGORY(logRecord, "App.
MainWindow.Record")
53 , m_pMenuActivityGroup(
nullptr)
54 , m_ptbMenuActivity(
nullptr)
55 , m_pActionOperateMenu(
nullptr)
56 , m_pTBOperate(
nullptr)
57 , m_pActionTBOperate(
nullptr)
58 , m_pDockListRecent(
nullptr)
59 , m_pDockActive(
nullptr)
60 , m_pFrmActive(
nullptr)
61 , m_pSecureLevel(
nullptr)
62 , m_pSignalStatus(
nullptr)
65 , m_pFullScreenToolBar(
nullptr)
66 , m_pRecentMenu(
nullptr)
67 , m_pDockFavorite(
nullptr)
68 , m_pFavoriteView(
nullptr)
78 RabbitCommon::CTools::AddStyleMenu(ui->menuTools);
79 ui->menuTools->addMenu(RabbitCommon::CTools::GetLogMenu(
this));
81 m_pRecentMenu =
new RabbitCommon::CRecentMenu(
83 QIcon::fromTheme(
"document-open-recent"),
85 check = connect(m_pRecentMenu, SIGNAL(recentFileTriggered(
const QString&)),
86 this, SLOT(slotOpenFile(
const QString&)));
88 check = connect(&m_Parameter, SIGNAL(sigRecentMenuMaxCountChanged(
int)),
89 m_pRecentMenu, SLOT(setMaxCount(
int)));
91 QAction* pRecentAction = ui->menuOperate->insertMenu(
92 ui->actionOpenListRecent, m_pRecentMenu);
93 pRecentAction->setStatusTip(pRecentAction->text());
94 QToolButton* tbRecent =
new QToolButton(ui->toolBar);
95 tbRecent->setFocusPolicy(Qt::NoFocus);
96 tbRecent->setPopupMode(QToolButton::InstantPopup);
97 tbRecent->setMenu(m_pRecentMenu);
98 tbRecent->setIcon(pRecentAction->icon());
99 tbRecent->setText(pRecentAction->text());
100 tbRecent->setToolTip(pRecentAction->toolTip());
101 tbRecent->setStatusTip(pRecentAction->statusTip());
102 ui->toolBar->insertWidget(ui->actionOpenListRecent, tbRecent);
106 ui->actionUpdate->setIcon(updater.windowIcon());
109 QToolButton* tbStart =
new QToolButton(ui->toolBar);
110 tbStart->setFocusPolicy(Qt::NoFocus);
111 tbStart->setPopupMode(QToolButton::InstantPopup);
113 tbStart->setMenu(ui->menuStart);
114 tbStart->setIcon(QIcon::fromTheme(
"media-playback-start"));
115 tbStart->setText(tr(
"Start"));
116 tbStart->setToolTip(tr(
"Start"));
117 tbStart->setStatusTip(tr(
"Start"));
118 ui->toolBar->insertWidget(ui->actionStop, tbStart);
122 check = connect(&m_Parameter, SIGNAL(sigReceiveShortCutChanged()),
123 this, SLOT(slotShortCut()));
125 slotSystemTrayIconTypeChanged();
126 check = connect(&m_Parameter, SIGNAL(sigSystemTrayIconTypeChanged()),
128 SLOT(slotSystemTrayIconTypeChanged()));
130 check = connect(&m_Parameter, SIGNAL(sigEnableSystemTrayIcon()),
131 this, SLOT(slotEnableSystemTrayIcon()));
133 check = connect(&m_Parameter, SIGNAL(sigEnableTabToolTipChanged()),
134 this, SLOT(slotUpdateName()));
136 check = connect(&m_Parameter, SIGNAL(sigEnableTabIconChanged()),
137 this, SLOT(slotUpdateName()));
140 m_Manager.EnumPlugins(
this);
141 check = connect(&m_Parameter, SIGNAL(sigStartByTypeChanged()),
142 this, SLOT(slotStartByType()));
145 m_pDockFavorite =
new QDockWidget(
this);
151 m_pDockFavorite->setTitleBarWidget(m_pFavoriteView->m_pDockTitleBar);
152 check = connect(m_pFavoriteView, SIGNAL(sigStart(
const QString&,
bool)),
153 this, SLOT(slotOpenFile(
const QString&,
bool)));
155 check = connect(m_pFavoriteView, SIGNAL(sigFavorite()),
156 this, SLOT(on_actionAdd_to_favorite_triggered()));
158 check = connect(&m_Parameter, SIGNAL(sigFavoriteEditChanged(
bool)),
159 m_pFavoriteView, SLOT(slotDoubleEditNode(
bool)));
161 emit m_Parameter.sigFavoriteEditChanged(m_Parameter.GetFavoriteEdit());
162 m_pDockFavorite->setWidget(m_pFavoriteView);
163 m_pDockFavorite->setWindowTitle(m_pFavoriteView->windowTitle());
166 m_pDockFavorite->setObjectName(
"dockFavorite");
167#if defined(Q_OS_ANDROID)
168 m_pDockFavorite->hide();
170 ui->menuView->addAction(m_pDockFavorite->toggleViewAction());
171 m_pDockFavorite->toggleViewAction()->setIcon(QIcon::fromTheme(
"emblem-favorite"));
172 addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, m_pDockFavorite);
175 m_pDockListRecent =
new QDockWidget(
this);
176 if(m_pDockListRecent)
182 if(pListRecent->m_pDockTitleBar)
183 m_pDockListRecent->setTitleBarWidget(
184 pListRecent->m_pDockTitleBar);
185 check = connect(pListRecent,
186 SIGNAL(sigStart(
const QString&,
bool)),
187 this, SLOT(slotOpenFile(
const QString&,
bool)));
189 m_pDockListRecent->setWidget(pListRecent);
190 m_pDockListRecent->setWindowTitle(
191 pListRecent->windowTitle());
194 m_pDockListRecent->setObjectName(
"dockListRecent");
195#if defined(Q_OS_ANDROID)
196 m_pDockListRecent->hide();
198 ui->menuView->addAction(m_pDockListRecent->toggleViewAction());
199 m_pDockListRecent->toggleViewAction()->setIcon(QIcon::fromTheme(
"document-open-recent"));
200 tabifyDockWidget(m_pDockFavorite, m_pDockListRecent);
203 m_pDockActive =
new QDockWidget(
this);
207 m_Operates, m_Parameter,
208 ui->menuStart, ui->actionStop,
209 m_pRecentMenu, m_pDockActive);
211 m_pDockActive->setWidget(m_pFrmActive);
212 if(m_pFrmActive->m_pDockTitleBar)
213 m_pDockActive->setTitleBarWidget(
214 m_pFrmActive->m_pDockTitleBar);
215 m_pDockActive->setWindowTitle(m_pFrmActive->windowTitle());
216 check = connect(m_pFrmActive, SIGNAL(sigChanged(
COperate*)),
217 this, SLOT(slotOperateChanged(
COperate*)));
220 m_pDockActive->setObjectName(
"dockListActive");
221#if defined(Q_OS_ANDROID)
222 m_pDockActive->hide();
224 ui->menuView->addAction(m_pDockActive->toggleViewAction());
225 m_pDockActive->toggleViewAction()->setIcon(QIcon::fromTheme(
"network-wired"));
226 tabifyDockWidget(m_pDockFavorite, m_pDockActive);
229 QActionGroup* pGBView =
new QActionGroup(
this);
231 pGBView->addAction(ui->actionViewTab);
232 pGBView->addAction(ui->actionViewSplit);
234 qDebug(log) <<
"View type:" << m_Parameter.GetViewType();
235 if(CParameterApp::ViewType::Tab == m_Parameter.GetViewType()) {
236 ui->actionViewTab->setChecked(
true);
237 on_actionViewTab_triggered();
239 if(CParameterApp::ViewType::Splitter == m_Parameter.GetViewType()) {
240 ui->actionViewSplit->setChecked(
true);
241 on_actionViewSplit_triggered();
243 check = connect(&m_Parameter, &CParameterApp::sigViewTypeChanged,
249 m_pMenuActivityGroup =
new QActionGroup(ui->menuActivity);
250 m_ptbMenuActivity =
new QToolButton(ui->toolBar);
251 m_ptbMenuActivity->setFocusPolicy(Qt::NoFocus);
252 m_ptbMenuActivity->setPopupMode(QToolButton::InstantPopup);
253 m_ptbMenuActivity->setMenu(ui->menuActivity);
254 m_ptbMenuActivity->setIcon(ui->menuActivity->icon());
255 m_ptbMenuActivity->setText(ui->menuActivity->title());
256 m_ptbMenuActivity->setToolTip(ui->menuActivity->toolTip());
257 m_ptbMenuActivity->setStatusTip(ui->menuActivity->statusTip());
258 ui->toolBar->insertWidget(ui->actionTabBar_B, m_ptbMenuActivity);
263 m_pSecureLevel =
new QLabel(statusBar());
267 m_pSecureLevel->hide();
268 statusBar()->addPermanentWidget(m_pSecureLevel);
274 SIGNAL(sigConnected()),
275 this, SLOT(slotSignalConnected()));
278 SIGNAL(sigDisconnected()),
279 this, SLOT(slotSignalDisconnected()));
282 SIGNAL(sigError(
const int,
const QString&)),
283 this, SLOT(slotSignalError(
const int,
const QString&)));
287 m_pSignalStatus =
new QPushButton();
288 m_pSignalStatus->setToolTip(tr(
"ICE signal status"));
289 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
290 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
291 slotSignalDisconnected();
292 statusBar()->addPermanentWidget(m_pSignalStatus);
295 if(m_Parameter.GetSaveMainWindowStatus())
297 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
298 QSettings::IniFormat);
300 = set.value(
"MainWindow/Status/Geometry").toByteArray();
301 if(!geometry.isEmpty())
302 restoreGeometry(geometry);
304 QByteArray state = set.value(
"MainWindow/Status/State").toByteArray();
308 ui->actionTabBar_B->setChecked(m_Parameter.GetTabBar());
309 on_actionTabBar_B_toggled(m_Parameter.GetTabBar());
310 ui->actionStatus_bar_S->setChecked(m_Parameter.GetStatusBar());
311 statusBar()->setVisible(m_Parameter.GetStatusBar());
312 ui->actionMain_menu_bar_M->setChecked(m_Parameter.GetMenuBar());
313 menuBar()->setVisible(m_Parameter.GetMenuBar());
314 ui->actionToolBar_T->setChecked(!ui->toolBar->isHidden());
315 if(!m_Parameter.GetMenuBar())
316 ui->toolBar->insertAction(ui->actionTabBar_B,
317 ui->actionMain_menu_bar_M);
320 slotEnableSystemTrayIcon();
322 LoadOperateLasterClose();
325MainWindow::~MainWindow()
327 qDebug(log) <<
"MainWindow::~MainWindow()";
328 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
332void MainWindow::SetView(
CView* pView)
334 qDebug(log) << Q_FUNC_INFO;
338 m_pView->disconnect();
341 setCentralWidget(m_pView);
345 check = connect(m_pView, SIGNAL(sigCloseView(
const QWidget*)),
348 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
349 this, SLOT(slotCurrentViewChanged(
const QWidget*)));
352 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
353 m_pFrmActive, SLOT(slotViewChanged(
const QWidget*)));
356 check = connect(m_pView, SIGNAL(customContextMenuRequested(
const QPoint&)),
360 foreach (
auto c, m_Operates) {
361 m_pView->
AddView(c->GetViewer());
362 m_pView->SetWidowsTitle(
363 c->GetViewer(), c->Name(), c->Icon(), c->Description());
365 m_pView->SetVisibleTab(m_Parameter.GetTabBar());
368void MainWindow::on_actionViewTab_triggered()
370 qDebug(log) << Q_FUNC_INFO;
371 if(!ui->actionViewTab->isChecked())
return;
372 m_Parameter.SetViewType(CParameterApp::ViewType::Tab);
376void MainWindow::on_actionViewSplit_triggered()
378 qDebug(log) << Q_FUNC_INFO;
379 if(!ui->actionViewSplit->isChecked())
return;
380 m_Parameter.SetViewType(CParameterApp::ViewType::Splitter);
384void MainWindow::on_actionAbout_triggered()
387 CDlgAbout *about =
new CDlgAbout(
this);
388 QIcon icon = QIcon::fromTheme(
"app");
390 auto sizeList = icon.availableSizes();
391 if(!sizeList.isEmpty()) {
392 QPixmap p = icon.pixmap(*sizeList.begin());
393 about->m_AppIcon = p.toImage();
396 about->m_szCopyrightStartTime =
"2020";
397 about->m_szVersionRevision = RabbitRemoteControl_REVISION;
398 about->m_szDetails = m_Manager.Details();
399 RC_SHOW_WINDOW(about);
403void MainWindow::on_actionUpdate_triggered()
405 if(!qEnvironmentVariable(
"SNAP").isEmpty()) {
406 QDesktopServices::openUrl(QUrl(
"https://snapcraft.io/rabbitremotecontrol"));
407 }
else if(!qEnvironmentVariable(
"FLATPAK_ID").isEmpty()) {
408 QDesktopServices::openUrl(QUrl(
"https://flathub.org/apps/io.github.KangLin.RabbitRemoteControl"));
411 CFrmUpdater* m_pfrmUpdater =
new CFrmUpdater();
412 QIcon icon = QIcon::fromTheme(
"app");
414 auto sizeList = icon.availableSizes();
415 if(!sizeList.isEmpty()) {
416 QPixmap p = icon.pixmap(*sizeList.begin());
417 m_pfrmUpdater->SetTitle(p.toImage());
420 m_pfrmUpdater->SetInstallAutoStartup();
421 RC_SHOW_WINDOW(m_pfrmUpdater);
426void MainWindow::on_actionFull_screen_F_triggered()
428 CView* pView = qobject_cast<CView*>(this->centralWidget());
431 pView->SetFullScreen(!isFullScreen());
436 qDebug(log) <<
"Exit full screen";
437 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-fullscreen"));
438 ui->actionFull_screen_F->setText(tr(
"Full screen(&F)"));
439 ui->actionFull_screen_F->setToolTip(tr(
"Full screen"));
440 ui->actionFull_screen_F->setStatusTip(tr(
"Full screen"));
441 ui->actionFull_screen_F->setWhatsThis(tr(
"Full screen"));
443 ui->toolBar->setVisible(m_FullState.toolBar);
444 ui->statusbar->setVisible(m_FullState.statusbar);
445 ui->menubar->setVisible(m_FullState.menubar);
447 m_pDockActive->setVisible(m_FullState.dockListActive);
448 m_pDockListRecent->setVisible(m_FullState.dockListRecent);
449 m_pDockFavorite->setVisible(m_FullState.dockFavorite);
451 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
454 pDockDebugLog->setVisible(m_FullState.dockDebugLog);
457 if(m_pFullScreenToolBar)
460 m_pFullScreenToolBar->close();
461 m_pFullScreenToolBar =
nullptr;
464 emit sigShowNormal();
466 this->activateWindow();
471 qDebug(log) <<
"Entry full screen";
472 emit sigFullScreen();
474 this->showFullScreen();
476 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-restore"));
477 ui->actionFull_screen_F->setText(tr(
"Exit full screen(&E)"));
478 ui->actionFull_screen_F->setToolTip(tr(
"Exit full screen"));
479 ui->actionFull_screen_F->setStatusTip(tr(
"Exit full screen"));
480 ui->actionFull_screen_F->setWhatsThis(tr(
"Exit full screen"));
482 m_FullState.toolBar = ui->toolBar->isVisible();
483 ui->toolBar->setVisible(
false);
484 m_FullState.statusbar = ui->statusbar->isVisible();
485 ui->statusbar->setVisible(
false);
486 m_FullState.menubar = ui->menubar->isVisible();
487 ui->menubar->setVisible(
false);
489 m_FullState.dockListActive = m_pDockActive->isVisible();
490 m_pDockActive->setVisible(
false);
491 m_FullState.dockListRecent = m_pDockListRecent->isVisible();
492 m_pDockListRecent->setVisible(
false);
493 m_FullState.dockFavorite = m_pDockFavorite->isVisible();
494 m_pDockFavorite->setVisible(
false);
496 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
499 m_FullState.dockDebugLog = pDockDebugLog->isVisible();
500 pDockDebugLog->setVisible(
false);
503 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
506 QScreen* pScreen = qApp->primaryScreen();
508 QPoint pos(pScreen->geometry().left()
509 + (pScreen->geometry().width()
510 - m_pFullScreenToolBar->frameGeometry().width()) / 2,
511 pScreen->geometry().top());
512 qDebug(log) <<
"Primary screen geometry:" << pScreen->geometry()
513 <<
"availableGeometry:" << pScreen->availableGeometry()
514 << pos << mapToGlobal(pos);
515 m_pFullScreenToolBar->move(pos);
517 bool check = connect(m_pFullScreenToolBar, SIGNAL(sigExitFullScreen()),
518 this, SLOT(on_actionFull_screen_F_triggered()));
520 check = connect(m_pFullScreenToolBar, SIGNAL(sigExit()),
521 this, SLOT(on_actionExit_E_triggered()));
524 check = connect(
this, SIGNAL(sigOperateMenuChanged(QAction*)),
525 m_pFullScreenToolBar,
526 SLOT(slotOperateMenuChanged(QAction*)));
529 m_pFullScreenToolBar->show();
532void MainWindow::slotViewerFocusIn(QWidget *pView)
534 COperate* c = qobject_cast<COperate*>(sender());
535 qDebug(log) << Q_FUNC_INFO <<
"Focus:" << c << pView;
541void MainWindow::slotOperateChanged(
COperate *o)
548void MainWindow::slotCurrentViewChanged(
const QWidget* pView)
550 qDebug(log) << Q_FUNC_INFO;
556 foreach(
auto o, m_Operates) {
559 foreach (
auto a, ui->menuActivity->actions()) {
560 if(a->data().value<
COperate*>() == o)
567void MainWindow::EnableMenu(
bool bEnable)
569 qDebug(log) << Q_FUNC_INFO << bEnable;
570 ui->actionClone->setEnabled(bEnable);
571 ui->actionAdd_to_favorite->setEnabled(bEnable);
572 ui->actionStop->setEnabled(bEnable);
573 ui->actionTabBar_B->setEnabled(bEnable);
574 ui->menuActivity->setEnabled(bEnable);
575 m_ptbMenuActivity->setEnabled(bEnable);
576 slotLoadOperateMenu();
579void MainWindow::slotMenuActivity()
581 QAction* pAction = qobject_cast<QAction*>(sender());
586 slotOperateChanged(p);
589void MainWindow::slotLoadOperateMenu()
591 qDebug(log) << Q_FUNC_INFO;
593 if(m_pActionOperateMenu) {
594 ui->menuOperate->removeAction(m_pActionOperateMenu);
595 m_pActionOperateMenu =
nullptr;
597 ui->toolBar->removeAction(m_pActionTBOperate);
603 qDebug(log) <<
"The current view is empty";
606 foreach(
auto op, m_Operates)
608 if(op->GetViewer() == pWin)
610 qDebug(log) <<
"Load plugin menu";
611 auto m = op->GetMenu(ui->menuTools);
614 m_pActionOperateMenu = ui->menuOperate->insertMenu(ui->actionAdd_to_favorite, m);
617 m_pTBOperate =
new QToolButton(ui->toolBar);
619 m_pTBOperate->setFocusPolicy(Qt::NoFocus);
620 m_pTBOperate->setPopupMode(QToolButton::InstantPopup);
621 m_pTBOperate->setMenu(m);
622 m_pTBOperate->setIcon(m->icon());
623 m_pTBOperate->setText(m->title());
624 m_pTBOperate->setToolTip(m->toolTip());
625 m_pTBOperate->setStatusTip(m->statusTip());
626 m_pTBOperate->show();
627 m_pActionTBOperate = ui->toolBar->insertWidget(ui->actionAdd_to_favorite, m_pTBOperate);
629 emit sigOperateMenuChanged(m_pActionOperateMenu);
646 qDebug(log) <<
"The current view is empty";
649 foreach(
auto p, m_Operates)
653 qDebug(log) <<
"Load plugin menu";
654 auto m = p->
GetMenu(ui->menuTools);
662void MainWindow::on_actionExit_E_triggered()
667void MainWindow::keyReleaseEvent(QKeyEvent *event)
673 on_actionFull_screen_F_triggered();
676 QMainWindow::keyReleaseEvent(event);
679void MainWindow::slotUpdateParameters(
COperate *pOperate)
684void MainWindow::on_actionClone_triggered()
688 foreach(
auto pOperate, m_Operates)
692 QString szFile = pOperate->GetSettingsFile();
694 if(!pOperate)
return;
695 Start(pOperate,
false, szFile);
701void MainWindow::slotOpenFile(
const QString& szFile,
bool bOpenSettings)
703 if(szFile.isEmpty())
return;
711 Start(p, bOpenSettings, szFile);
714void MainWindow::on_actionOpenRRCFile_triggered()
716 QString szFile = QFileDialog::getOpenFileName(
718 tr(
"Open rabbit remote control file"),
719 RabbitCommon::CDir::Instance()->GetDirUserData(),
720 tr(
"Rabbit remote control Files (*.rrc);;All files(*.*)"));
721 if(szFile.isEmpty())
return;
733void MainWindow::slotStart()
735 if(
nullptr == m_pView)
740 QAction* pAction = qobject_cast<QAction*>(this->sender());
743 if(
nullptr == p)
return;
759 qDebug(log) <<
"MainWindow::Start: set:" << set <<
"; File:" << szFile;
762 bool check = connect(pOperate, SIGNAL(sigRunning()),
765 check = connect(pOperate, SIGNAL(sigStop()),
766 this, SLOT(slotStop()));
768 check = connect(pOperate, SIGNAL(sigFinished()),
769 this, SLOT(slotFinished()));
771 check = connect(pOperate, SIGNAL(sigError(
const int,
const QString &)),
772 this, SLOT(slotError(
const int,
const QString&)));
774 check = connect(pOperate, SIGNAL(sigShowMessageBox(
const QString&,
const QString&,
775 const QMessageBox::Icon&)),
777 const QMessageBox::Icon&)));
779 check = connect(pOperate, SIGNAL(sigInformation(
const QString&)),
782 check = connect(pOperate, SIGNAL(sigUpdateName(
const QString&)),
783 this, SLOT(slotUpdateName(
const QString&)));
785 check = connect(pOperate, SIGNAL(sigUpdateParameters(
COperate*)),
786 this, SLOT(slotUpdateParameters(
COperate*)));
794 case QDialog::Rejected:
797 case QDialog::Accepted:
804 szFile = pOperate->GetSettingsFile();
806 pOperate->SetSettingsFile(szFile);
812 m_pRecentMenu->addRecentFile(szFile, pOperate->
Name());
814 if(!pOperate->
Name().isEmpty())
818 if(-1 < m_Operates.indexOf(pOperate)) {
820 m_pView->SetCurrentView(pOperate->
GetViewer());
826 m_pView->SetWidowsTitle(pOperate->
GetViewer(), pOperate->
Name(),
829 check = connect(pOperate, SIGNAL(sigViewerFocusIn(QWidget*)),
830 this, SLOT(slotViewerFocusIn(QWidget*)));
833 m_Operates.push_back(pOperate);
835 m_pFrmActive->slotLoad();
839 vOperate.setValue(pOperate);
840 QAction* m_pActionmenuActivity = ui->menuActivity->addAction(
841 pOperate->
Icon(), pOperate->
Name(),
this, SLOT(slotMenuActivity()));
842 m_pActionmenuActivity->setData(vOperate);
843 m_pActionmenuActivity->setCheckable(
true);
844 m_pMenuActivityGroup->addAction(m_pActionmenuActivity);
845 m_pActionmenuActivity->setChecked(
true);
848 nRet = pOperate->
Start();
860 COperate* p = qobject_cast<COperate*>(sender());
884 m->addAction(ui->actionClone);
886 slotLoadOperateMenu();
889 qDebug(log) << Q_FUNC_INFO << p->
Name();
895 qDebug(log) <<
"MainWindow::slotCloseView" << pView;
897 foreach(
auto p, m_Operates)
908void MainWindow::on_actionStop_triggered()
910 qDebug(log) << Q_FUNC_INFO;
917void MainWindow::slotStop()
919 COperate* pOperate = qobject_cast<COperate*>(sender());
920 if(!pOperate)
return;
921 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
927void MainWindow::slotFinished()
929 COperate* pOperate = qobject_cast<COperate*>(sender());
930 if(!pOperate)
return;
932 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
933 foreach(
auto a, ui->menuActivity->actions()) {
936 ui->menuActivity->removeAction(a);
937 m_pMenuActivityGroup->removeAction(a);
940 foreach(
auto p, m_Operates)
945 m_Operates.removeAll(p);
947 m_pFrmActive->slotLoad();
952 if(m_Operates.isEmpty())
953 if(m_pActionOperateMenu) {
954 ui->menuTools->removeAction(m_pActionOperateMenu);
955 ui->toolBar->removeAction(m_pActionOperateMenu);
956 m_pActionOperateMenu =
nullptr;
962void SetIndicator(QLabel* label, QColor color,
int size)
964 QString min_width = QString(
"min-width: %1px;").arg(size);
965 QString min_height = QString(
"min-height: %1px;").arg(size);
966 QString max_width = QString(
"max-width: %1px;").arg(size);
967 QString max_height = QString(
"max-height: %1px;").arg(size);
969 QString border_radius = QString(
"border-radius: %1px;").arg(size / 2);
970 QString border = QString(
"border:1px solid ") + color.name() +
";";
972 QString background =
"background-color: ";
973 background += color.name() +
";";
974 QString SheetStyle = min_width + min_height + max_width + max_height + border_radius + border + background;
975 label->setStyleSheet(SheetStyle);
978void MainWindow::SetSecureLevel(
COperate* o)
980 if(!m_pSecureLevel)
return;
982 if(COperate::SecurityLevel::No == o->GetSecurityLevel())
984 m_pSecureLevel->hide();
987 SetIndicator(m_pSecureLevel, o->GetSecurityLevelColor(), statusBar()->height() / 2);
988 m_pSecureLevel->setToolTip(o->GetSecurityLevelString());
989 m_pSecureLevel->setStatusTip(o->GetSecurityLevelString());
990 m_pSecureLevel->show();
992 m_pSecureLevel->hide();
995void MainWindow::slotSignalConnected()
997 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Connected"));
998 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
999 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1001 m_pSignalStatus->setIcon(QIcon::fromTheme(
"newwork-wired"));
1004void MainWindow::slotSignalDisconnected()
1006 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Disconnected"));
1007 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1008 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1010 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wireless"));
1013void MainWindow::slotSignalError(
const int nError,
const QString &szInfo)
1015 slotSignalDisconnected();
1019void MainWindow::slotSignalPushButtonClicked(
bool checked)
1029void MainWindow::slotError(
const int nError,
const QString &szInfo)
1036 const QString &title,
const QString &message,
1037 const QMessageBox::Icon &icon)
1040 if(!m_Parameter.GetMessageBoxDisplayInformation())
1043 QMessageBox msg(icon, title, message, QMessageBox::Ok,
this);
1044 QCheckBox* cb =
new QCheckBox(
1045 tr(
"Use message box to display information"),
this);
1046 cb->setChecked(
true);
1047 msg.setCheckBox(cb);
1048 RC_SHOW_WINDOW(&msg);
1049 if(!cb->isChecked())
1051 m_Parameter.SetMessageBoxDisplayInformation(
false);
1058 statusBar()->showMessage(szInfo);
1061void MainWindow::slotUpdateName()
1063 foreach (
auto p, m_Operates)
1072void MainWindow::slotUpdateName(
const QString& szName)
1074 COperate* p = qobject_cast<COperate*>(sender());
1076 m_pView->SetWidowsTitle(p->
GetViewer(), szName,
1078 foreach(
auto a, ui->menuActivity->actions()) {
1079 if(a->data().value<
COperate*>() == p) {
1086QAction* MainWindow::GetStartAction(QMenu* pMenu,
CPlugin *pPlug)
1090 szTitle = pPlug->
Protocol() +
": ";
1092 QAction* p = pMenu->addAction(szTitle);
1095 p->setData(pPlug->
Id());
1096 p->setIcon(pPlug->Icon());
1100void MainWindow::slotStartByType()
1102 qDebug(log) << Q_FUNC_INFO;
1103 auto m = ui->menuStart->actions();
1104 foreach(
auto a, m) {
1107 foreach (
auto a, m_MenuStartByType) {
1110 ui->menuStart->clear();
1111 m_MenuStartByType.clear();
1118 QMenu* m = ui->menuStart;
1119 if(m_Parameter.GetStartByType()) {
1120 auto it = m_MenuStartByType.find(pPlugin->Type());
1121 if(it == m_MenuStartByType.end()) {
1122 m =
new QMenu(pPlugin->TypeName(pPlugin->Type()), ui->menuStart);
1123 m_MenuStartByType[pPlugin->Type()] = m;
1124 ui->menuStart->addMenu(m);
1129 QAction* p = GetStartAction(m, pPlugin);
1131 check = connect(p, SIGNAL(triggered()),
this, SLOT(slotStart()));
1136void MainWindow::closeEvent(QCloseEvent *event)
1138 qDebug(log) <<
"MainWindow::closeEvent()";
1140 if(m_Parameter.GetSaveMainWindowStatus())
1142 on_actionFull_screen_F_triggered();
1144 SaveOperateLasterClose();
1146 foreach (
auto it, m_Operates)
1149 emit it->sigUpdateParameters(it);
1153 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
1154 QSettings::IniFormat);
1155 if(m_Parameter.GetSaveMainWindowStatus())
1157 set.setValue(
"MainWindow/Status/Geometry", saveGeometry());
1158 set.setValue(
"MainWindow/Status/State", saveState());
1160 m_Parameter.SetTabBar(ui->actionTabBar_B->isChecked());
1161 m_Parameter.SetMenuBar(menuBar()->isVisible());
1162 m_Parameter.SetStatusBar(statusBar()->isVisible());
1164 set.remove(
"MainWindow/Status/Geometry");
1165 set.remove(
"MainWindow/Status/State");
1171 QMainWindow::closeEvent(event);
1177int MainWindow::LoadOperateLasterClose()
1179 if(!m_Parameter.GetOpenLasterClose())
1182 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1183 + QDir::separator() +
"LasterClose.dat");
1184 if(f.open(QFile::ReadOnly))
1190 if(szFile.isEmpty())
1192 slotOpenFile(szFile);
1199int MainWindow::SaveOperateLasterClose()
1201 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1202 + QDir::separator() +
"LasterClose.dat");
1203 f.open(QFile::WriteOnly);
1204 if(m_Parameter.GetOpenLasterClose())
1207 foreach(
auto it, m_Operates)
1209 d << it->GetSettingsFile();
1216void MainWindow::on_actionTabBar_B_toggled(
bool bShow)
1220 m_pView->SetVisibleTab(bShow);
1221 m_Parameter.SetTabBar(bShow);
1224 m_pDockActive->setVisible(bShow);
1228void MainWindow::on_actionMain_menu_bar_M_toggled(
bool checked)
1230 qDebug(log) << Q_FUNC_INFO << checked;
1231 if(ui->toolBar->isHidden() && !checked)
1233 if( QMessageBox::StandardButton::Yes
1234 == QMessageBox::information(
this, tr(
"Hide menu bar"),
1235 tr(
"The menu bar will be hidden, the tool bar must be showed."),
1236 QMessageBox::StandardButton::Yes
1237 | QMessageBox::StandardButton::No))
1239 ui->actionToolBar_T->setChecked(
true);
1241 ui->actionMain_menu_bar_M->setChecked(
true);
1246 menuBar()->setVisible(checked);
1247 m_Parameter.SetMenuBar(checked);
1250 ui->toolBar->removeAction(ui->actionMain_menu_bar_M);
1254 ui->toolBar->insertAction(ui->actionTabBar_B,
1255 ui->actionMain_menu_bar_M);
1259void MainWindow::on_actionToolBar_T_toggled(
bool checked)
1261 qDebug(log) << Q_FUNC_INFO << checked;
1262 if(menuBar()->isHidden() && !checked)
1264 if( QMessageBox::StandardButton::Yes
1265 == QMessageBox::information(
this, tr(
"Hide tool bar"),
1266 tr(
"The tool bar will be hidden, the menu bar must be showed."),
1267 QMessageBox::StandardButton::Yes
1268 | QMessageBox::StandardButton::No))
1270 ui->actionMain_menu_bar_M->setChecked(
true);
1272 ui->actionToolBar_T->setChecked(
true);
1276 ui->toolBar->setVisible(checked);
1279void MainWindow::on_actionStatus_bar_S_toggled(
bool checked)
1281 statusBar()->setVisible(checked);
1282 m_Parameter.SetStatusBar(checked);
1286void MainWindow::on_actionSettings_triggered()
1289 if(CParameterDlgSettings::Accepted == RC_SHOW_WINDOW(&set))
1297void MainWindow::slotShortCut()
1299 if(m_Parameter.GetReceiveShortCut())
1301 setFocusPolicy(Qt::WheelFocus);
1302#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
1303 ui->actionFull_screen_F->setShortcut(
1304 QKeySequence(QKeyCombination(Qt::CTRL, Qt::Key_R),
1305 QKeyCombination(Qt::Key_F)));
1306 ui->actionScreenshot->setShortcut(
1307 QKeySequence(QKeyCombination(Qt::CTRL, Qt::Key_R),
1308 QKeyCombination(Qt::Key_S)));
1310 ui->actionFull_screen_F->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R, Qt::Key_F));
1311 ui->actionScreenshot->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R, Qt::Key_S));
1314 setFocusPolicy(Qt::NoFocus);
1315 ui->actionFull_screen_F->setShortcut(QKeySequence());
1316 ui->actionScreenshot->setShortcut(QKeySequence());
1320void MainWindow::on_actionOpenListRecent_triggered()
1324 bool check = connect(p, SIGNAL(sigStart(
const QString&,
bool)),
1325 this, SLOT(slotOpenFile(
const QString&,
bool)));
1330 d.setWindowIcon(windowIcon());
1331 d.setWindowTitle(p->windowTitle());
1332 QGridLayout* pLayout =
new QGridLayout(&d);
1334 pLayout->addWidget(p);
1335 check = connect(p, SIGNAL(destroyed()), &d, SLOT(reject()));
1336 d.setLayout(pLayout);
1341void MainWindow::on_actionAdd_to_favorite_triggered()
1343 if(!m_pView || !m_pFavoriteView)
return;
1345 foreach(
auto c, m_Operates)
1350 c->
Icon(), c->GetSettingsFile());
1355void MainWindow::dragEnterEvent(QDragEnterEvent *event)
1357 qDebug(log) <<
"dragEnterEvent";
1359 if(event->mimeData()->hasUrls())
1361 qWarning(log) <<
event->mimeData()->urls();
1362 event->acceptProposedAction();
1366void MainWindow::dragMoveEvent(QDragMoveEvent *event)
1371void MainWindow::dropEvent(QDropEvent *event)
1373 qDebug(log) <<
"dropEvent";
1374 if(!event->mimeData()->hasUrls())
1376 auto urls =
event->mimeData()->urls();
1377 foreach(
auto url, urls)
1379 if(url.isLocalFile())
1380 slotOpenFile(url.toLocalFile());
1384void MainWindow::slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
1389#if defined(Q_OS_ANDROID)
1394 case QSystemTrayIcon::Trigger:
1406void MainWindow::slotSystemTrayIconTypeChanged()
1409 if(!QSystemTrayIcon::isSystemTrayAvailable())
1411 qWarning(log) <<
"System tray is not available";
1415 if(!m_Parameter.GetEnableSystemTrayIcon())
1417 qDebug(log) <<
"Disable system tray icon";
1424 m_TrayIcon = QSharedPointer<QSystemTrayIcon>(
new QSystemTrayIcon(
this));
1425 if(QSystemTrayIcon::isSystemTrayAvailable())
1427 bool check = connect(
1429 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
1431 SLOT(slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason)));
1433 m_TrayIcon->setIcon(this->windowIcon());
1434 m_TrayIcon->setToolTip(windowTitle());
1437 qWarning(log) <<
"System tray is not available";
1439 switch (m_Parameter.GetSystemTrayIconMenuType())
1441 case CParameterApp::SystemTrayIconMenuType::MenuBar:
1443 QMenu* pMenu =
new QMenu(
this);
1444 pMenu->addMenu(ui->menuOperate);
1445 pMenu->addMenu(ui->menuView);
1446 pMenu->addMenu(ui->menuTools);
1447 m_TrayIcon->setContextMenu(pMenu);
1450 case CParameterApp::SystemTrayIconMenuType::Operate:
1451 m_TrayIcon->setContextMenu(ui->menuOperate);
1453 case CParameterApp::SystemTrayIconMenuType::RecentOpen:
1454 m_TrayIcon->setContextMenu(m_pRecentMenu);
1456 case CParameterApp::SystemTrayIconMenuType::View:
1457 m_TrayIcon->setContextMenu(ui->menuView);
1459 case CParameterApp::SystemTrayIconMenuType::Tools:
1460 m_TrayIcon->setContextMenu(ui->menuTools);
1462 case CParameterApp::SystemTrayIconMenuType::No:
1463 m_TrayIcon->setContextMenu(
nullptr);
1468void MainWindow::slotEnableSystemTrayIcon()
1473 if(!m_Parameter.GetEnableSystemTrayIcon())
1476 slotSystemTrayIconTypeChanged();
List the connect of be existed.
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.
virtual int SaveSettings(const QString szFile=QString())
Save Client parameters to file.
virtual int OpenDialogSettings(QWidget *parent=nullptr)
Open settings dialog.
virtual const QIcon Icon() const
Icon.
virtual int Start()=0
Start.
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.
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get menu.
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file.
virtual const QString Id()
ID. Default: Type() + ":" + Protocol() + ":" + Name()
virtual const QString DisplayName() const
The plugin display name.
virtual const QString Protocol() const =0
Plugin Protocol.
virtual const QString Description() const =0
Plugin description.
virtual int AddView(QWidget *pView)=0
virtual QWidget * GetCurrentView()=0
virtual int RemoveView(QWidget *pView)=0
int Start(COperate *pOperate, bool set, QString szFile=QString())
Start.
virtual int onProcess(const QString &id, CPlugin *pPlugin) override
Process plugins.
void slotInformation(const QString &szInfo)
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.