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)
69 , m_StatusBarMessage(this)
76 m_StatusBarMessage.setSizePolicy(QSizePolicy::Policy::Expanding,
77 QSizePolicy::Policy::Preferred);
78 this->statusBar()->addWidget(&m_StatusBarMessage);
84 RabbitCommon::CTools::AddStyleMenu(ui->menuTools);
85 ui->menuTools->addMenu(RabbitCommon::CTools::GetLogMenu(
this));
87 m_pRecentMenu =
new RabbitCommon::CRecentMenu(
89 QIcon::fromTheme(
"document-open-recent"),
91 check = connect(m_pRecentMenu, SIGNAL(recentFileTriggered(
const QString&)),
92 this, SLOT(slotOpenFile(
const QString&)));
94 check = connect(&m_Parameter, SIGNAL(sigRecentMenuMaxCountChanged(
int)),
95 m_pRecentMenu, SLOT(setMaxCount(
int)));
97 QAction* pRecentAction = ui->menuOperate->insertMenu(
98 ui->actionOpenListRecent, m_pRecentMenu);
99 pRecentAction->setStatusTip(pRecentAction->text());
100 QToolButton* tbRecent =
new QToolButton(ui->toolBar);
101 tbRecent->setFocusPolicy(Qt::NoFocus);
102 tbRecent->setPopupMode(QToolButton::InstantPopup);
103 tbRecent->setMenu(m_pRecentMenu);
104 tbRecent->setIcon(pRecentAction->icon());
105 tbRecent->setText(pRecentAction->text());
106 tbRecent->setToolTip(pRecentAction->toolTip());
107 tbRecent->setStatusTip(pRecentAction->statusTip());
108 ui->toolBar->insertWidget(ui->actionOpenListRecent, tbRecent);
112 ui->actionUpdate->setIcon(updater.windowIcon());
115 QToolButton* tbStart =
new QToolButton(ui->toolBar);
116 tbStart->setFocusPolicy(Qt::NoFocus);
117 tbStart->setPopupMode(QToolButton::InstantPopup);
119 tbStart->setMenu(ui->menuStart);
120 tbStart->setIcon(QIcon::fromTheme(
"media-playback-start"));
121 tbStart->setText(tr(
"Start"));
122 tbStart->setToolTip(tr(
"Start"));
123 tbStart->setStatusTip(tr(
"Start"));
124 ui->toolBar->insertWidget(ui->actionStop, tbStart);
128 check = connect(&m_Parameter, SIGNAL(sigReceiveShortCutChanged()),
129 this, SLOT(slotShortCut()));
131 slotSystemTrayIconTypeChanged();
132 check = connect(&m_Parameter, SIGNAL(sigSystemTrayIconTypeChanged()),
134 SLOT(slotSystemTrayIconTypeChanged()));
136 check = connect(&m_Parameter, SIGNAL(sigEnableSystemTrayIcon()),
137 this, SLOT(slotEnableSystemTrayIcon()));
139 check = connect(&m_Parameter, SIGNAL(sigEnableTabToolTipChanged()),
140 this, SLOT(slotUpdateName()));
142 check = connect(&m_Parameter, SIGNAL(sigEnableTabIconChanged()),
143 this, SLOT(slotUpdateName()));
146 m_Manager.EnumPlugins(
this);
147 check = connect(&m_Parameter, SIGNAL(sigStartByTypeChanged()),
148 this, SLOT(slotStartByType()));
151 m_pDockFavorite =
new QDockWidget(
this);
157 m_pDockFavorite->setTitleBarWidget(m_pFavoriteView->m_pDockTitleBar);
158 check = connect(m_pFavoriteView, SIGNAL(sigStart(
const QString&,
bool)),
159 this, SLOT(slotOpenFile(
const QString&,
bool)));
161 check = connect(m_pFavoriteView, SIGNAL(sigFavorite()),
162 this, SLOT(on_actionAdd_to_favorite_triggered()));
164 check = connect(&m_Parameter, SIGNAL(sigFavoriteEditChanged(
bool)),
165 m_pFavoriteView, SLOT(slotDoubleEditNode(
bool)));
167 emit m_Parameter.sigFavoriteEditChanged(m_Parameter.GetFavoriteEdit());
168 m_pDockFavorite->setWidget(m_pFavoriteView);
169 m_pDockFavorite->setWindowTitle(m_pFavoriteView->windowTitle());
172 m_pDockFavorite->setObjectName(
"dockFavorite");
173#if defined(Q_OS_ANDROID)
174 m_pDockFavorite->hide();
176 ui->menuView->addAction(m_pDockFavorite->toggleViewAction());
177 m_pDockFavorite->toggleViewAction()->setIcon(QIcon::fromTheme(
"emblem-favorite"));
178 addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, m_pDockFavorite);
181 m_pDockListRecent =
new QDockWidget(
this);
182 if(m_pDockListRecent)
188 if(pListRecent->m_pDockTitleBar)
189 m_pDockListRecent->setTitleBarWidget(
190 pListRecent->m_pDockTitleBar);
191 check = connect(pListRecent,
192 SIGNAL(sigStart(
const QString&,
bool)),
193 this, SLOT(slotOpenFile(
const QString&,
bool)));
195 check = connect(pListRecent, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
196 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
198 m_pDockListRecent->setWidget(pListRecent);
199 m_pDockListRecent->setWindowTitle(
200 pListRecent->windowTitle());
203 m_pDockListRecent->setObjectName(
"dockListRecent");
204#if defined(Q_OS_ANDROID)
205 m_pDockListRecent->hide();
207 ui->menuView->addAction(m_pDockListRecent->toggleViewAction());
208 m_pDockListRecent->toggleViewAction()->setIcon(QIcon::fromTheme(
"document-open-recent"));
209 tabifyDockWidget(m_pDockFavorite, m_pDockListRecent);
212 m_pDockActive =
new QDockWidget(
this);
216 m_Operates, m_Parameter,
217 ui->menuStart, ui->actionStop,
218 m_pRecentMenu, m_pDockActive);
220 m_pDockActive->setWidget(m_pFrmActive);
221 if(m_pFrmActive->m_pDockTitleBar)
222 m_pDockActive->setTitleBarWidget(
223 m_pFrmActive->m_pDockTitleBar);
224 m_pDockActive->setWindowTitle(m_pFrmActive->windowTitle());
225 check = connect(m_pFrmActive, SIGNAL(sigChanged(
COperate*)),
226 this, SLOT(slotOperateChanged(
COperate*)));
228 check = connect(m_pFrmActive, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
229 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
232 m_pDockActive->setObjectName(
"dockListActive");
233#if defined(Q_OS_ANDROID)
234 m_pDockActive->hide();
236 ui->menuView->addAction(m_pDockActive->toggleViewAction());
237 m_pDockActive->toggleViewAction()->setIcon(QIcon::fromTheme(
"network-wired"));
238 tabifyDockWidget(m_pDockFavorite, m_pDockActive);
241 QActionGroup* pGBView =
new QActionGroup(
this);
243 pGBView->addAction(ui->actionViewTab);
244 pGBView->addAction(ui->actionViewSplit);
246 qDebug(log) <<
"View type:" << m_Parameter.GetViewType();
247 if(CParameterApp::ViewType::Tab == m_Parameter.GetViewType()) {
248 ui->actionViewTab->setChecked(
true);
249 on_actionViewTab_triggered();
251 if(CParameterApp::ViewType::Splitter == m_Parameter.GetViewType()) {
252 ui->actionViewSplit->setChecked(
true);
253 on_actionViewSplit_triggered();
255 check = connect(&m_Parameter, &CParameterApp::sigViewTypeChanged,
261 m_pMenuActivityGroup =
new QActionGroup(ui->menuActivity);
262 m_ptbMenuActivity =
new QToolButton(ui->toolBar);
263 m_ptbMenuActivity->setFocusPolicy(Qt::NoFocus);
264 m_ptbMenuActivity->setPopupMode(QToolButton::InstantPopup);
265 m_ptbMenuActivity->setMenu(ui->menuActivity);
266 m_ptbMenuActivity->setIcon(ui->menuActivity->icon());
267 m_ptbMenuActivity->setText(ui->menuActivity->title());
268 m_ptbMenuActivity->setToolTip(ui->menuActivity->toolTip());
269 m_ptbMenuActivity->setStatusTip(ui->menuActivity->statusTip());
270 ui->toolBar->insertWidget(ui->actionTabBar_B, m_ptbMenuActivity);
275 m_pSecureLevel =
new QLabel(statusBar());
279 m_pSecureLevel->hide();
280 statusBar()->addPermanentWidget(m_pSecureLevel);
286 SIGNAL(sigConnected()),
287 this, SLOT(slotSignalConnected()));
290 SIGNAL(sigDisconnected()),
291 this, SLOT(slotSignalDisconnected()));
294 SIGNAL(sigError(
const int,
const QString&)),
295 this, SLOT(slotSignalError(
const int,
const QString&)));
299 m_pSignalStatus =
new QPushButton();
300 m_pSignalStatus->setToolTip(tr(
"ICE signal status"));
301 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
302 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
303 slotSignalDisconnected();
304 statusBar()->addPermanentWidget(m_pSignalStatus);
307 if(m_Parameter.GetSaveMainWindowStatus())
309 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
310 QSettings::IniFormat);
312 = set.value(
"MainWindow/Status/Geometry").toByteArray();
313 if(!geometry.isEmpty())
314 restoreGeometry(geometry);
316 QByteArray state = set.value(
"MainWindow/Status/State").toByteArray();
320 ui->actionTabBar_B->setChecked(m_Parameter.GetTabBar());
321 on_actionTabBar_B_toggled(m_Parameter.GetTabBar());
322 ui->actionStatus_bar_S->setChecked(m_Parameter.GetStatusBar());
323 statusBar()->setVisible(m_Parameter.GetStatusBar());
324 ui->actionMain_menu_bar_M->setChecked(m_Parameter.GetMenuBar());
325 menuBar()->setVisible(m_Parameter.GetMenuBar());
326 ui->actionToolBar_T->setChecked(!ui->toolBar->isHidden());
327 if(!m_Parameter.GetMenuBar())
328 ui->toolBar->insertAction(ui->actionTabBar_B,
329 ui->actionMain_menu_bar_M);
332 slotEnableSystemTrayIcon();
334 LoadOperateLasterClose();
337MainWindow::~MainWindow()
339 qDebug(log) <<
"MainWindow::~MainWindow()";
340 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
344void MainWindow::SetView(
CView* pView)
346 qDebug(log) << Q_FUNC_INFO;
350 m_pView->disconnect();
353 setCentralWidget(m_pView);
357 check = connect(m_pView, SIGNAL(sigCloseView(
const QWidget*)),
360 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
361 this, SLOT(slotCurrentViewChanged(
const QWidget*)));
364 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
365 m_pFrmActive, SLOT(slotViewChanged(
const QWidget*)));
368 check = connect(m_pView, SIGNAL(customContextMenuRequested(
const QPoint&)),
372 foreach (
auto c, m_Operates) {
373 m_pView->
AddView(c->GetViewer());
374 m_pView->SetWidowsTitle(
375 c->GetViewer(), c->Name(), c->Icon(), c->Description());
377 m_pView->SetVisibleTab(m_Parameter.GetTabBar());
380void MainWindow::on_actionViewTab_triggered()
382 qDebug(log) << Q_FUNC_INFO;
383 if(!ui->actionViewTab->isChecked())
return;
384 m_Parameter.SetViewType(CParameterApp::ViewType::Tab);
388void MainWindow::on_actionViewSplit_triggered()
390 qDebug(log) << Q_FUNC_INFO;
391 if(!ui->actionViewSplit->isChecked())
return;
392 m_Parameter.SetViewType(CParameterApp::ViewType::Splitter);
396void MainWindow::on_actionAbout_triggered()
399 CDlgAbout *about =
new CDlgAbout(
this);
400 QIcon icon = QIcon::fromTheme(
"app");
402 auto sizeList = icon.availableSizes();
403 if(!sizeList.isEmpty()) {
404 QPixmap p = icon.pixmap(*sizeList.begin());
405 about->m_AppIcon = p.toImage();
408 about->m_szCopyrightStartTime =
"2020";
409 about->m_szVersionRevision = RabbitRemoteControl_REVISION;
410 about->m_szDetails = m_Manager.Details();
411 RC_SHOW_WINDOW(about);
415void MainWindow::on_actionUpdate_triggered()
417 if(!qEnvironmentVariable(
"SNAP").isEmpty()) {
418 QDesktopServices::openUrl(QUrl(
"https://snapcraft.io/rabbitremotecontrol"));
419 }
else if(!qEnvironmentVariable(
"FLATPAK_ID").isEmpty()) {
420 QDesktopServices::openUrl(QUrl(
"https://flathub.org/apps/io.github.KangLin.RabbitRemoteControl"));
423 CFrmUpdater* m_pfrmUpdater =
new CFrmUpdater();
424 QIcon icon = QIcon::fromTheme(
"app");
426 auto sizeList = icon.availableSizes();
427 if(!sizeList.isEmpty()) {
428 QPixmap p = icon.pixmap(*sizeList.begin());
429 m_pfrmUpdater->SetTitle(p.toImage());
432 m_pfrmUpdater->SetInstallAutoStartup();
433 RC_SHOW_WINDOW(m_pfrmUpdater);
438void MainWindow::on_actionFull_screen_F_triggered()
440 CView* pView = qobject_cast<CView*>(this->centralWidget());
443 pView->SetFullScreen(!isFullScreen());
448 qDebug(log) <<
"Exit full screen";
449 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-fullscreen"));
450 ui->actionFull_screen_F->setText(tr(
"Full screen(&F)"));
451 ui->actionFull_screen_F->setToolTip(tr(
"Full screen"));
452 ui->actionFull_screen_F->setStatusTip(tr(
"Full screen"));
453 ui->actionFull_screen_F->setWhatsThis(tr(
"Full screen"));
455 ui->toolBar->setVisible(m_FullState.toolBar);
456 ui->statusbar->setVisible(m_FullState.statusbar);
457 ui->menubar->setVisible(m_FullState.menubar);
459 m_pDockActive->setVisible(m_FullState.dockListActive);
460 m_pDockListRecent->setVisible(m_FullState.dockListRecent);
461 m_pDockFavorite->setVisible(m_FullState.dockFavorite);
463 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
466 pDockDebugLog->setVisible(m_FullState.dockDebugLog);
469 if(m_pFullScreenToolBar)
472 m_pFullScreenToolBar->close();
473 m_pFullScreenToolBar =
nullptr;
476 emit sigShowNormal();
478 this->activateWindow();
483 qDebug(log) <<
"Entry full screen";
484 emit sigFullScreen();
486 this->showFullScreen();
488 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-restore"));
489 ui->actionFull_screen_F->setText(tr(
"Exit full screen(&E)"));
490 ui->actionFull_screen_F->setToolTip(tr(
"Exit full screen"));
491 ui->actionFull_screen_F->setStatusTip(tr(
"Exit full screen"));
492 ui->actionFull_screen_F->setWhatsThis(tr(
"Exit full screen"));
494 m_FullState.toolBar = ui->toolBar->isVisible();
495 ui->toolBar->setVisible(
false);
496 m_FullState.statusbar = ui->statusbar->isVisible();
497 ui->statusbar->setVisible(
false);
498 m_FullState.menubar = ui->menubar->isVisible();
499 ui->menubar->setVisible(
false);
501 m_FullState.dockListActive = m_pDockActive->isVisible();
502 m_pDockActive->setVisible(
false);
503 m_FullState.dockListRecent = m_pDockListRecent->isVisible();
504 m_pDockListRecent->setVisible(
false);
505 m_FullState.dockFavorite = m_pDockFavorite->isVisible();
506 m_pDockFavorite->setVisible(
false);
508 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
511 m_FullState.dockDebugLog = pDockDebugLog->isVisible();
512 pDockDebugLog->setVisible(
false);
515 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
518 QScreen* pScreen = qApp->primaryScreen();
520 QPoint pos(pScreen->geometry().left()
521 + (pScreen->geometry().width()
522 - m_pFullScreenToolBar->frameGeometry().width()) / 2,
523 pScreen->geometry().top());
524 qDebug(log) <<
"Primary screen geometry:" << pScreen->geometry()
525 <<
"availableGeometry:" << pScreen->availableGeometry()
526 << pos << mapToGlobal(pos);
527 m_pFullScreenToolBar->move(pos);
529 bool check = connect(m_pFullScreenToolBar, SIGNAL(sigExitFullScreen()),
530 this, SLOT(on_actionFull_screen_F_triggered()));
532 check = connect(m_pFullScreenToolBar, SIGNAL(sigExit()),
533 this, SLOT(on_actionExit_E_triggered()));
536 check = connect(
this, SIGNAL(sigOperateMenuChanged(QAction*)),
537 m_pFullScreenToolBar,
538 SLOT(slotOperateMenuChanged(QAction*)));
541 m_pFullScreenToolBar->show();
544void MainWindow::slotViewerFocusIn(QWidget *pView)
546 COperate* c = qobject_cast<COperate*>(sender());
547 qDebug(log) << Q_FUNC_INFO <<
"Focus:" << c << pView;
553void MainWindow::slotOperateChanged(
COperate *o)
560void MainWindow::slotCurrentViewChanged(
const QWidget* pView)
562 qDebug(log) << Q_FUNC_INFO;
568 foreach(
auto o, m_Operates) {
571 foreach (
auto a, ui->menuActivity->actions()) {
572 if(a->data().value<
COperate*>() == o)
579void MainWindow::EnableMenu(
bool bEnable)
581 qDebug(log) << Q_FUNC_INFO << bEnable;
582 ui->actionClone->setEnabled(bEnable);
583 ui->actionAdd_to_favorite->setEnabled(bEnable);
584 ui->actionStop->setEnabled(bEnable);
585 ui->actionTabBar_B->setEnabled(bEnable);
586 ui->menuActivity->setEnabled(bEnable);
587 m_ptbMenuActivity->setEnabled(bEnable);
588 slotLoadOperateMenu();
591void MainWindow::slotMenuActivity()
593 QAction* pAction = qobject_cast<QAction*>(sender());
598 slotOperateChanged(p);
601void MainWindow::slotLoadOperateMenu()
603 qDebug(log) << Q_FUNC_INFO;
605 if(m_pActionOperateMenu) {
606 ui->menuOperate->removeAction(m_pActionOperateMenu);
607 m_pActionOperateMenu =
nullptr;
609 ui->toolBar->removeAction(m_pActionTBOperate);
615 qDebug(log) <<
"The current view is empty";
618 foreach(
auto op, m_Operates)
620 if(op->GetViewer() == pWin)
622 qDebug(log) <<
"Load plugin menu";
623 auto m = op->GetMenu(ui->menuTools);
626 m_pActionOperateMenu = ui->menuOperate->insertMenu(ui->actionAdd_to_favorite, m);
629 m_pTBOperate =
new QToolButton(ui->toolBar);
631 m_pTBOperate->setFocusPolicy(Qt::NoFocus);
632 m_pTBOperate->setPopupMode(QToolButton::InstantPopup);
633 m_pTBOperate->setMenu(m);
634 m_pTBOperate->setIcon(m->icon());
635 m_pTBOperate->setText(m->title());
636 m_pTBOperate->setToolTip(m->toolTip());
637 m_pTBOperate->setStatusTip(m->statusTip());
638 m_pTBOperate->show();
639 m_pActionTBOperate = ui->toolBar->insertWidget(ui->actionAdd_to_favorite, m_pTBOperate);
641 emit sigOperateMenuChanged(m_pActionOperateMenu);
658 qDebug(log) <<
"The current view is empty";
661 foreach(
auto p, m_Operates)
665 qDebug(log) <<
"Load plugin menu";
666 auto m = p->
GetMenu(ui->menuTools);
674void MainWindow::on_actionExit_E_triggered()
679void MainWindow::keyReleaseEvent(QKeyEvent *event)
685 on_actionFull_screen_F_triggered();
688 QMainWindow::keyReleaseEvent(event);
691void MainWindow::slotUpdateParameters(
COperate *pOperate)
696void MainWindow::on_actionClone_triggered()
700 foreach(
auto pOperate, m_Operates)
704 QString szFile = pOperate->GetSettingsFile();
706 if(!pOperate)
return;
707 Start(pOperate,
false, szFile);
713void MainWindow::slotOpenFile(
const QString& szFile,
bool bOpenSettings)
715 if(szFile.isEmpty())
return;
719 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
723 Start(p, bOpenSettings, szFile);
726void MainWindow::on_actionOpenRRCFile_triggered()
728 QString szFile = QFileDialog::getOpenFileName(
730 tr(
"Open rabbit remote control file"),
731 RabbitCommon::CDir::Instance()->GetDirUserData(),
732 tr(
"Rabbit remote control Files (*.rrc);;All files(*.*)"));
733 if(szFile.isEmpty())
return;
738 slotStatusMessage(tr(
"Load file fail: ") + szFile, MessageLevel::Error);
745void MainWindow::slotStart()
747 if(
nullptr == m_pView)
752 QAction* pAction = qobject_cast<QAction*>(this->sender());
755 if(
nullptr == p)
return;
771 qDebug(log) <<
"MainWindow::Start: set:" << set <<
"; File:" << szFile;
774 bool check = connect(pOperate, SIGNAL(sigRunning()),
777 check = connect(pOperate, SIGNAL(sigStop()),
778 this, SLOT(slotStop()));
780 check = connect(pOperate, SIGNAL(sigFinished()),
781 this, SLOT(slotFinished()));
783 check = connect(pOperate, SIGNAL(sigError(
const int,
const QString &)),
784 this, SLOT(slotError(
const int,
const QString&)));
786 check = connect(pOperate, SIGNAL(sigShowMessageBox(
const QString&,
const QString&,
787 const QMessageBox::Icon&)),
789 const QMessageBox::Icon&)));
791 check = connect(pOperate, SIGNAL(sigInformation(
const QString&)),
794 check = connect(pOperate, SIGNAL(sigUpdateName(
const QString&)),
795 this, SLOT(slotUpdateName(
const QString&)));
797 check = connect(pOperate, SIGNAL(sigUpdateParameters(
COperate*)),
798 this, SLOT(slotUpdateParameters(
COperate*)));
806 case QDialog::Rejected:
809 case QDialog::Accepted:
816 szFile = pOperate->GetSettingsFile();
818 pOperate->SetSettingsFile(szFile);
824 m_pRecentMenu->addRecentFile(szFile, pOperate->
Name());
826 if(!pOperate->
Name().isEmpty())
830 if(-1 < m_Operates.indexOf(pOperate)) {
832 m_pView->SetCurrentView(pOperate->
GetViewer());
838 m_pView->SetWidowsTitle(pOperate->
GetViewer(), pOperate->
Name(),
841 check = connect(pOperate, SIGNAL(sigViewerFocusIn(QWidget*)),
842 this, SLOT(slotViewerFocusIn(QWidget*)));
845 m_Operates.push_back(pOperate);
847 m_pFrmActive->slotLoad();
851 vOperate.setValue(pOperate);
852 QAction* m_pActionmenuActivity = ui->menuActivity->addAction(
853 pOperate->
Icon(), pOperate->
Name(),
this, SLOT(slotMenuActivity()));
854 m_pActionmenuActivity->setData(vOperate);
855 m_pActionmenuActivity->setCheckable(
true);
856 m_pMenuActivityGroup->addAction(m_pActionmenuActivity);
857 m_pActionmenuActivity->setChecked(
true);
860 nRet = pOperate->
Start();
872 COperate* p = qobject_cast<COperate*>(sender());
896 m->addAction(ui->actionClone);
898 slotLoadOperateMenu();
901 qDebug(log) << Q_FUNC_INFO << p->
Name();
907 qDebug(log) <<
"MainWindow::slotCloseView" << pView;
909 foreach(
auto p, m_Operates)
920void MainWindow::on_actionStop_triggered()
922 qDebug(log) << Q_FUNC_INFO;
929void MainWindow::slotStop()
931 COperate* pOperate = qobject_cast<COperate*>(sender());
932 if(!pOperate)
return;
933 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
939void MainWindow::slotFinished()
941 COperate* pOperate = qobject_cast<COperate*>(sender());
942 if(!pOperate)
return;
944 qDebug(log) << Q_FUNC_INFO << pOperate->
Name();
945 foreach(
auto a, ui->menuActivity->actions()) {
948 ui->menuActivity->removeAction(a);
949 m_pMenuActivityGroup->removeAction(a);
952 foreach(
auto p, m_Operates)
957 m_Operates.removeAll(p);
959 m_pFrmActive->slotLoad();
964 if(m_Operates.isEmpty())
965 if(m_pActionOperateMenu) {
966 ui->menuTools->removeAction(m_pActionOperateMenu);
967 ui->toolBar->removeAction(m_pActionOperateMenu);
968 m_pActionOperateMenu =
nullptr;
974void SetIndicator(QLabel* label, QColor color,
int size)
976 QString min_width = QString(
"min-width: %1px;").arg(size);
977 QString min_height = QString(
"min-height: %1px;").arg(size);
978 QString max_width = QString(
"max-width: %1px;").arg(size);
979 QString max_height = QString(
"max-height: %1px;").arg(size);
981 QString border_radius = QString(
"border-radius: %1px;").arg(size / 2);
982 QString border = QString(
"border:1px solid ") + color.name() +
";";
984 QString background =
"background-color: ";
985 background += color.name() +
";";
986 QString SheetStyle = min_width + min_height + max_width + max_height + border_radius + border + background;
987 label->setStyleSheet(SheetStyle);
990void MainWindow::SetSecureLevel(
COperate* o)
992 if(!m_pSecureLevel)
return;
994 if(COperate::SecurityLevel::No == o->GetSecurityLevel())
996 m_pSecureLevel->hide();
999 SetIndicator(m_pSecureLevel, o->GetSecurityLevelColor(), statusBar()->height() / 2);
1000 m_pSecureLevel->setToolTip(o->GetSecurityLevelString());
1001 m_pSecureLevel->setStatusTip(o->GetSecurityLevelString());
1002 m_pSecureLevel->show();
1004 m_pSecureLevel->hide();
1007void MainWindow::slotSignalConnected()
1009 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Connected"));
1010 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1011 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1013 m_pSignalStatus->setIcon(QIcon::fromTheme(
"newwork-wired"));
1016void MainWindow::slotSignalDisconnected()
1018 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Disconnected"));
1019 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1020 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1022 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wireless"));
1025void MainWindow::slotSignalError(
const int nError,
const QString &szInfo)
1027 slotSignalDisconnected();
1028 slotError(nError, szInfo);
1031void MainWindow::slotSignalPushButtonClicked(
bool checked)
1041void MainWindow::slotError(
const int nError,
const QString &szInfo)
1044 slotStatusMessage(szInfo, MessageLevel::Error);
1048 const QString &title,
const QString &message,
1049 const QMessageBox::Icon &icon)
1052 if(!m_Parameter.GetMessageBoxDisplayInformation())
1055 QMessageBox msg(icon, title, message, QMessageBox::Ok,
this);
1056 QCheckBox* cb =
new QCheckBox(
1057 tr(
"Use message box to display information"),
this);
1058 cb->setChecked(
true);
1059 msg.setCheckBox(cb);
1060 RC_SHOW_WINDOW(&msg);
1061 if(!cb->isChecked())
1063 m_Parameter.SetMessageBoxDisplayInformation(
false);
1070 slotStatusMessage(szInfo, MessageLevel::Normal);
1073void MainWindow::slotStatusMessage(QString szMessage, MessageLevel level)
1076 switch ((MessageLevel)level) {
1077 case MessageLevel::Error:
1078 pe.setColor(QPalette::WindowText, Qt::red);
1080 case MessageLevel::Warning:
1081 pe.setColor(QPalette::WindowText, Qt::yellow);
1087 m_StatusBarMessage.setPalette(pe);
1088 m_StatusBarMessage.setText(szMessage);
1091void MainWindow::slotUpdateName()
1093 foreach (
auto p, m_Operates)
1102void MainWindow::slotUpdateName(
const QString& szName)
1104 COperate* p = qobject_cast<COperate*>(sender());
1106 m_pView->SetWidowsTitle(p->
GetViewer(), szName,
1108 foreach(
auto a, ui->menuActivity->actions()) {
1109 if(a->data().value<
COperate*>() == p) {
1116QAction* MainWindow::GetStartAction(QMenu* pMenu,
CPlugin *pPlug)
1120 szTitle = pPlug->
Protocol() +
": ";
1122 QAction* p = pMenu->addAction(szTitle);
1125 p->setData(pPlug->
Id());
1126 p->setIcon(pPlug->Icon());
1130void MainWindow::slotStartByType()
1132 qDebug(log) << Q_FUNC_INFO;
1133 auto m = ui->menuStart->actions();
1134 foreach(
auto a, m) {
1137 foreach (
auto a, m_MenuStartByType) {
1140 ui->menuStart->clear();
1141 m_MenuStartByType.clear();
1148 QMenu* m = ui->menuStart;
1149 if(m_Parameter.GetStartByType()) {
1150 auto it = m_MenuStartByType.find(pPlugin->Type());
1151 if(it == m_MenuStartByType.end()) {
1152 m =
new QMenu(pPlugin->TypeName(pPlugin->Type()), ui->menuStart);
1153 m_MenuStartByType[pPlugin->Type()] = m;
1154 ui->menuStart->addMenu(m);
1159 QAction* p = GetStartAction(m, pPlugin);
1161 check = connect(p, SIGNAL(triggered()),
this, SLOT(slotStart()));
1166void MainWindow::closeEvent(QCloseEvent *event)
1168 qDebug(log) <<
"MainWindow::closeEvent()";
1170 if(m_Parameter.GetSaveMainWindowStatus())
1172 on_actionFull_screen_F_triggered();
1174 SaveOperateLasterClose();
1176 foreach (
auto it, m_Operates)
1179 emit it->sigUpdateParameters(it);
1183 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
1184 QSettings::IniFormat);
1185 if(m_Parameter.GetSaveMainWindowStatus())
1187 set.setValue(
"MainWindow/Status/Geometry", saveGeometry());
1188 set.setValue(
"MainWindow/Status/State", saveState());
1190 m_Parameter.SetTabBar(ui->actionTabBar_B->isChecked());
1191 m_Parameter.SetMenuBar(menuBar()->isVisible());
1192 m_Parameter.SetStatusBar(statusBar()->isVisible());
1194 set.remove(
"MainWindow/Status/Geometry");
1195 set.remove(
"MainWindow/Status/State");
1201 QMainWindow::closeEvent(event);
1207int MainWindow::LoadOperateLasterClose()
1209 if(!m_Parameter.GetOpenLasterClose())
1212 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1213 + QDir::separator() +
"LasterClose.dat");
1214 if(f.open(QFile::ReadOnly))
1220 if(szFile.isEmpty())
1222 slotOpenFile(szFile);
1229int MainWindow::SaveOperateLasterClose()
1231 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1232 + QDir::separator() +
"LasterClose.dat");
1233 f.open(QFile::WriteOnly);
1234 if(m_Parameter.GetOpenLasterClose())
1237 foreach(
auto it, m_Operates)
1239 d << it->GetSettingsFile();
1246void MainWindow::on_actionTabBar_B_toggled(
bool bShow)
1250 m_pView->SetVisibleTab(bShow);
1251 m_Parameter.SetTabBar(bShow);
1254 m_pDockActive->setVisible(bShow);
1258void MainWindow::on_actionMain_menu_bar_M_toggled(
bool checked)
1260 qDebug(log) << Q_FUNC_INFO << checked;
1261 if(ui->toolBar->isHidden() && !checked)
1263 if( QMessageBox::StandardButton::Yes
1264 == QMessageBox::information(
this, tr(
"Hide menu bar"),
1265 tr(
"The menu bar will be hidden, the tool bar must be showed."),
1266 QMessageBox::StandardButton::Yes
1267 | QMessageBox::StandardButton::No))
1269 ui->actionToolBar_T->setChecked(
true);
1271 ui->actionMain_menu_bar_M->setChecked(
true);
1276 menuBar()->setVisible(checked);
1277 m_Parameter.SetMenuBar(checked);
1280 ui->toolBar->removeAction(ui->actionMain_menu_bar_M);
1284 ui->toolBar->insertAction(ui->actionTabBar_B,
1285 ui->actionMain_menu_bar_M);
1289void MainWindow::on_actionToolBar_T_toggled(
bool checked)
1291 qDebug(log) << Q_FUNC_INFO << checked;
1292 if(menuBar()->isHidden() && !checked)
1294 if( QMessageBox::StandardButton::Yes
1295 == QMessageBox::information(
this, tr(
"Hide tool bar"),
1296 tr(
"The tool bar will be hidden, the menu bar must be showed."),
1297 QMessageBox::StandardButton::Yes
1298 | QMessageBox::StandardButton::No))
1300 ui->actionMain_menu_bar_M->setChecked(
true);
1302 ui->actionToolBar_T->setChecked(
true);
1306 ui->toolBar->setVisible(checked);
1309void MainWindow::on_actionStatus_bar_S_toggled(
bool checked)
1311 statusBar()->setVisible(checked);
1312 m_Parameter.SetStatusBar(checked);
1316void MainWindow::on_actionSettings_triggered()
1319 if(CParameterDlgSettings::Accepted == RC_SHOW_WINDOW(&set))
1327void MainWindow::slotShortCut()
1329 if(m_Parameter.GetReceiveShortCut())
1331 setFocusPolicy(Qt::WheelFocus);
1332#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
1333 ui->actionFull_screen_F->setShortcut(
1334 QKeySequence(QKeyCombination(Qt::CTRL, Qt::Key_R),
1335 QKeyCombination(Qt::Key_F)));
1336 ui->actionScreenshot->setShortcut(
1337 QKeySequence(QKeyCombination(Qt::CTRL, Qt::Key_R),
1338 QKeyCombination(Qt::Key_S)));
1340 ui->actionFull_screen_F->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R, Qt::Key_F));
1341 ui->actionScreenshot->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R, Qt::Key_S));
1344 setFocusPolicy(Qt::NoFocus);
1345 ui->actionFull_screen_F->setShortcut(QKeySequence());
1346 ui->actionScreenshot->setShortcut(QKeySequence());
1350void MainWindow::on_actionOpenListRecent_triggered()
1354 bool check = connect(p, SIGNAL(sigStart(
const QString&,
bool)),
1355 this, SLOT(slotOpenFile(
const QString&,
bool)));
1357 check = connect(p, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
1358 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
1363 d.setWindowIcon(windowIcon());
1364 d.setWindowTitle(p->windowTitle());
1365 QGridLayout* pLayout =
new QGridLayout(&d);
1367 pLayout->addWidget(p);
1368 check = connect(p, SIGNAL(destroyed()), &d, SLOT(reject()));
1369 d.setLayout(pLayout);
1374void MainWindow::on_actionAdd_to_favorite_triggered()
1376 if(!m_pView || !m_pFavoriteView)
return;
1378 foreach(
auto c, m_Operates)
1383 c->
Icon(), c->GetSettingsFile());
1388void MainWindow::dragEnterEvent(QDragEnterEvent *event)
1390 qDebug(log) <<
"dragEnterEvent";
1392 if(event->mimeData()->hasUrls())
1394 qWarning(log) <<
event->mimeData()->urls();
1395 event->acceptProposedAction();
1399void MainWindow::dragMoveEvent(QDragMoveEvent *event)
1404void MainWindow::dropEvent(QDropEvent *event)
1406 qDebug(log) <<
"dropEvent";
1407 if(!event->mimeData()->hasUrls())
1409 auto urls =
event->mimeData()->urls();
1410 foreach(
auto url, urls)
1412 if(url.isLocalFile())
1413 slotOpenFile(url.toLocalFile());
1417void MainWindow::slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
1422#if defined(Q_OS_ANDROID)
1427 case QSystemTrayIcon::Trigger:
1439void MainWindow::slotSystemTrayIconTypeChanged()
1442 if(!QSystemTrayIcon::isSystemTrayAvailable())
1444 qWarning(log) <<
"System tray is not available";
1448 if(!m_Parameter.GetEnableSystemTrayIcon())
1450 qDebug(log) <<
"Disable system tray icon";
1457 m_TrayIcon = QSharedPointer<QSystemTrayIcon>(
new QSystemTrayIcon(
this));
1458 if(QSystemTrayIcon::isSystemTrayAvailable())
1460 bool check = connect(
1462 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
1464 SLOT(slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason)));
1466 m_TrayIcon->setIcon(this->windowIcon());
1467 m_TrayIcon->setToolTip(windowTitle());
1470 qWarning(log) <<
"System tray is not available";
1472 switch (m_Parameter.GetSystemTrayIconMenuType())
1474 case CParameterApp::SystemTrayIconMenuType::MenuBar:
1476 QMenu* pMenu =
new QMenu(
this);
1477 pMenu->addMenu(ui->menuOperate);
1478 pMenu->addMenu(ui->menuView);
1479 pMenu->addMenu(ui->menuTools);
1480 m_TrayIcon->setContextMenu(pMenu);
1483 case CParameterApp::SystemTrayIconMenuType::Operate:
1484 m_TrayIcon->setContextMenu(ui->menuOperate);
1486 case CParameterApp::SystemTrayIconMenuType::RecentOpen:
1487 m_TrayIcon->setContextMenu(m_pRecentMenu);
1489 case CParameterApp::SystemTrayIconMenuType::View:
1490 m_TrayIcon->setContextMenu(ui->menuView);
1492 case CParameterApp::SystemTrayIconMenuType::Tools:
1493 m_TrayIcon->setContextMenu(ui->menuTools);
1495 case CParameterApp::SystemTrayIconMenuType::No:
1496 m_TrayIcon->setContextMenu(
nullptr);
1501void MainWindow::slotEnableSystemTrayIcon()
1506 if(!m_Parameter.GetEnableSystemTrayIcon())
1509 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.