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 "FrmListRecentConnects.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")
52 : QMainWindow(parent),
53 m_pActionConnecterMenu(
nullptr),
54 m_pDockListRecentConnects(
nullptr),
55 m_pDockListConnecters(
nullptr),
56 m_pFrmConnecters(
nullptr),
57 m_pSignalStatus(
nullptr),
60 m_pFullScreenToolBar(
nullptr),
61 m_pRecentMenu(
nullptr),
62 m_pDockFavorite(
nullptr),
63 m_pFavoriteView(
nullptr)
69 setFocusPolicy(Qt::NoFocus);
73 RabbitCommon::CTools::AddStyleMenu(ui->menuTools);
74 ui->menuTools->addMenu(RabbitCommon::CTools::GetLogMenu(
this));
76 m_pRecentMenu =
new RabbitCommon::CRecentMenu(
77 tr(
"Recently connected"),
78 QIcon::fromTheme(
"document-open-recent"),
80 check = connect(m_pRecentMenu, SIGNAL(recentFileTriggered(
const QString&)),
81 this, SLOT(slotOpenFile(
const QString&)));
83 check = connect(&m_Parameter, SIGNAL(sigRecentMenuMaxCountChanged(
int)),
84 m_pRecentMenu, SLOT(setMaxCount(
int)));
86 QAction* pRecentAction = ui->menuRemote->insertMenu(
87 ui->actionOpenListRecentConnections, m_pRecentMenu);
88 pRecentAction->setStatusTip(pRecentAction->text());
89 QToolButton* tbRecent =
new QToolButton(ui->toolBar);
90 tbRecent->setFocusPolicy(Qt::NoFocus);
91 tbRecent->setPopupMode(QToolButton::InstantPopup);
92 tbRecent->setMenu(m_pRecentMenu);
93 tbRecent->setIcon(pRecentAction->icon());
94 tbRecent->setText(pRecentAction->text());
95 tbRecent->setToolTip(pRecentAction->toolTip());
96 tbRecent->setStatusTip(pRecentAction->statusTip());
97 ui->toolBar->insertWidget(ui->actionOpenListRecentConnections, tbRecent);
101 ui->actionUpdate->setIcon(updater.windowIcon());
104 QToolButton* tbConnect =
new QToolButton(ui->toolBar);
105 tbConnect->setFocusPolicy(Qt::NoFocus);
106 tbConnect->setPopupMode(QToolButton::InstantPopup);
108 tbConnect->setMenu(ui->menuConnect_C);
109 tbConnect->setIcon(QIcon::fromTheme(
"network-wired"));
110 tbConnect->setText(tr(
"Connect"));
111 tbConnect->setToolTip(tr(
"Connect"));
112 tbConnect->setStatusTip(tr(
"Connect"));
113 m_pActionConnect = ui->toolBar->insertWidget(ui->actionDisconnect_D, tbConnect);
115 m_Client.EnumPlugins(
this);
119 check = connect(&m_Parameter, SIGNAL(sigReceiveShortCutChanged()),
120 this, SLOT(slotShortCut()));
122 slotSystemTrayIconTypeChanged();
123 check = connect(&m_Parameter, SIGNAL(sigSystemTrayIconTypeChanged()),
125 SLOT(slotSystemTrayIconTypeChanged()));
127 check = connect(&m_Parameter, SIGNAL(sigEnableSystemTrayIcon()),
128 this, SLOT(slotEnableSystemTrayIcon()));
130 check = connect(&m_Parameter, SIGNAL(sigEnableTabToolTipChanged()),
131 this, SLOT(slotUpdateName()));
133 check = connect(&m_Parameter, SIGNAL(sigEnableTabIconChanged()),
134 this, SLOT(slotUpdateName()));
137 m_pDockFavorite =
new QDockWidget(
this);
143 m_pDockFavorite->setTitleBarWidget(m_pFavoriteView->m_pDockTitleBar);
144 check = connect(m_pFavoriteView, SIGNAL(sigConnect(
const QString&,
bool)),
145 this, SLOT(slotOpenFile(
const QString&,
bool)));
147 check = connect(m_pFavoriteView, SIGNAL(sigFavorite()),
148 this, SLOT(on_actionAdd_to_favorite_triggered()));
150 check = connect(&m_Parameter, SIGNAL(sigFavoriteEditChanged(
bool)),
151 m_pFavoriteView, SLOT(slotDoubleEditNode(
bool)));
153 emit m_Parameter.sigFavoriteEditChanged(m_Parameter.GetFavoriteEdit());
154 m_pDockFavorite->setWidget(m_pFavoriteView);
155 m_pDockFavorite->setWindowTitle(m_pFavoriteView->windowTitle());
158 m_pDockFavorite->setObjectName(
"dockFavorite");
160 ui->menuView->addAction(m_pDockFavorite->toggleViewAction());
161 m_pDockFavorite->toggleViewAction()->setIcon(QIcon::fromTheme(
"emblem-favorite"));
162 addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, m_pDockFavorite);
165 m_pDockListRecentConnects =
new QDockWidget(
this);
166 if(m_pDockListRecentConnects)
170 &m_Client, m_Parameter,
true, m_pDockListRecentConnects);
171 if(pListRecentConnects) {
172 if(pListRecentConnects->m_pDockTitleBar)
173 m_pDockListRecentConnects->setTitleBarWidget(
174 pListRecentConnects->m_pDockTitleBar);
175 check = connect(pListRecentConnects,
176 SIGNAL(sigConnect(
const QString&,
bool)),
177 this, SLOT(slotOpenFile(
const QString&,
bool)));
179 m_pDockListRecentConnects->setWidget(pListRecentConnects);
180 m_pDockListRecentConnects->setWindowTitle(
181 pListRecentConnects->windowTitle());
184 m_pDockListRecentConnects->setObjectName(
"dockListRecentConnects");
186 ui->menuView->addAction(m_pDockListRecentConnects->toggleViewAction());
187 m_pDockListRecentConnects->toggleViewAction()->setIcon(QIcon::fromTheme(
"document-open-recent"));
188 tabifyDockWidget(m_pDockFavorite, m_pDockListRecentConnects);
191 m_pDockListConnecters =
new QDockWidget(
this);
192 if(m_pDockListConnecters)
195 m_Connecters, m_Parameter,
196 ui->menuConnect_C, ui->actionDisconnect_D,
197 m_pRecentMenu, m_pDockListConnecters);
198 if(m_pFrmConnecters) {
199 m_pDockListConnecters->setWidget(m_pFrmConnecters);
200 if(m_pFrmConnecters->m_pDockTitleBar)
201 m_pDockListConnecters->setTitleBarWidget(
202 m_pFrmConnecters->m_pDockTitleBar);
203 m_pDockListConnecters->setWindowTitle(m_pFrmConnecters->windowTitle());
204 check = connect(m_pFrmConnecters, SIGNAL(sigConnecterChanged(
CConnecter*)),
205 this, SLOT(slotConnecterChanged(
CConnecter*)));
208 m_pDockListConnecters->setObjectName(
"dockListConnects");
210 ui->menuView->addAction(m_pDockListConnecters->toggleViewAction());
211 m_pDockListConnecters->toggleViewAction()->setIcon(QIcon::fromTheme(
"network-wired"));
212 tabifyDockWidget(m_pDockFavorite, m_pDockListConnecters);
215 QActionGroup* pGBView =
new QActionGroup(
this);
217 pGBView->addAction(ui->actionViewTab);
218 pGBView->addAction(ui->actionViewSplit);
220 qDebug(log) <<
"View type:" << m_Parameter.GetViewType();
221 if(CParameterApp::ViewType::Tab == m_Parameter.GetViewType()) {
222 ui->actionViewTab->setChecked(
true);
223 on_actionViewTab_triggered();
225 if(CParameterApp::ViewType::Splitter == m_Parameter.GetViewType()) {
226 ui->actionViewSplit->setChecked(
true);
227 on_actionViewSplit_triggered();
229 check = connect(&m_Parameter, &CParameterApp::sigViewTypeChanged,
240 SIGNAL(sigConnected()),
241 this, SLOT(slotSignalConnected()));
244 SIGNAL(sigDisconnected()),
245 this, SLOT(slotSignalDisconnected()));
248 SIGNAL(sigError(
const int,
const QString&)),
249 this, SLOT(slotSignalError(
const int,
const QString&)));
253 m_pSignalStatus =
new QPushButton();
254 m_pSignalStatus->setToolTip(tr(
"ICE signal status"));
255 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
256 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
257 slotSignalDisconnected();
258 statusBar()->addPermanentWidget(m_pSignalStatus);
261 if(m_Parameter.GetSaveMainWindowStatus())
263 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
264 QSettings::IniFormat);
266 = set.value(
"MainWindow/Status/Geometry").toByteArray();
267 if(!geometry.isEmpty())
268 restoreGeometry(geometry);
270 QByteArray state = set.value(
"MainWindow/Status/State").toByteArray();
274 ui->actionTabBar_B->setChecked(m_Parameter.GetTabBar());
275 on_actionTabBar_B_toggled(m_Parameter.GetTabBar());
276 ui->actionStatus_bar_S->setChecked(m_Parameter.GetStatusBar());
277 statusBar()->setVisible(m_Parameter.GetStatusBar());
278 ui->actionMain_menu_bar_M->setChecked(m_Parameter.GetMenuBar());
279 menuBar()->setVisible(m_Parameter.GetMenuBar());
280 ui->actionToolBar_T->setChecked(!ui->toolBar->isHidden());
281 if(!m_Parameter.GetMenuBar())
282 ui->toolBar->insertAction(ui->actionTabBar_B,
283 ui->actionMain_menu_bar_M);
286 slotEnableSystemTrayIcon();
288 LoadConnectLasterClose();
291MainWindow::~MainWindow()
293 qDebug(log) <<
"MainWindow::~MainWindow()";
294 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
298void MainWindow::SetView(
CView* pView)
300 qDebug(log) << Q_FUNC_INFO;
304 m_pView->disconnect();
307 setCentralWidget(m_pView);
310 m_pView->setFocusPolicy(Qt::NoFocus);
311 check = connect(m_pView, SIGNAL(sigCloseView(
const QWidget*)),
314 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
315 this, SLOT(slotCurrentViewChanged(
const QWidget*)));
317 if(m_pFrmConnecters) {
318 check = connect(m_pView, SIGNAL(sigCurrentChanged(
const QWidget*)),
319 m_pFrmConnecters, SLOT(slotViewChanged(
const QWidget*)));
322 check = connect(m_pView, SIGNAL(customContextMenuRequested(
const QPoint&)),
326 foreach (
auto c, m_Connecters) {
327 m_pView->
AddView(c->GetViewer());
328 m_pView->SetWidowsTitle(
329 c->GetViewer(), c->Name(), c->Icon(), c->Description());
331 m_pView->SetVisibleTab(m_Parameter.GetTabBar());
334void MainWindow::on_actionViewTab_triggered()
336 qDebug(log) << Q_FUNC_INFO;
337 if(!ui->actionViewTab->isChecked())
return;
338 m_Parameter.SetViewType(CParameterApp::ViewType::Tab);
342void MainWindow::on_actionViewSplit_triggered()
344 qDebug(log) << Q_FUNC_INFO;
345 if(!ui->actionViewSplit->isChecked())
return;
346 m_Parameter.SetViewType(CParameterApp::ViewType::Splitter);
350void MainWindow::on_actionAbout_triggered()
353 CDlgAbout *about =
new CDlgAbout(
this);
354 QIcon icon = QIcon::fromTheme(
"app");
356 auto sizeList = icon.availableSizes();
357 if(!sizeList.isEmpty()) {
358 QPixmap p = icon.pixmap(*sizeList.begin());
359 about->m_AppIcon = p.toImage();
362 about->m_szCopyrightStartTime =
"2020";
363 about->m_szVersionRevision = RabbitRemoteControl_REVISION;
364 about->m_szDetails = m_Client.Details();
365 RC_SHOW_WINDOW(about);
369void MainWindow::on_actionUpdate_triggered()
371 if(!qEnvironmentVariable(
"SNAP").isEmpty()) {
372 QDesktopServices::openUrl(QUrl(
"https://snapcraft.io/rabbitremotecontrol"));
373 }
else if(!qEnvironmentVariable(
"FLATPAK_ID").isEmpty()) {
374 QDesktopServices::openUrl(QUrl(
"https://flathub.org/apps/io.github.KangLin.RabbitRemoteControl"));
377 CFrmUpdater* m_pfrmUpdater =
new CFrmUpdater();
378 QIcon icon = QIcon::fromTheme(
"app");
380 auto sizeList = icon.availableSizes();
381 if(!sizeList.isEmpty()) {
382 QPixmap p = icon.pixmap(*sizeList.begin());
383 m_pfrmUpdater->SetTitle(p.toImage());
386 m_pfrmUpdater->SetInstallAutoStartup();
387 RC_SHOW_WINDOW(m_pfrmUpdater);
392void MainWindow::on_actionFull_screen_F_triggered()
394 CView* pView = qobject_cast<CView*>(this->centralWidget());
397 pView->SetFullScreen(!isFullScreen());
402 qDebug(log) <<
"Exit full screen";
403 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-fullscreen"));
404 ui->actionFull_screen_F->setText(tr(
"Full screen(&F)"));
405 ui->actionFull_screen_F->setToolTip(tr(
"Full screen"));
406 ui->actionFull_screen_F->setStatusTip(tr(
"Full screen"));
407 ui->actionFull_screen_F->setWhatsThis(tr(
"Full screen"));
409 ui->toolBar->setVisible(m_FullState.toolBar);
410 ui->statusbar->setVisible(m_FullState.statusbar);
411 ui->menubar->setVisible(m_FullState.menubar);
413 m_pDockListConnecters->setVisible(m_FullState.dockListConnects);
414 m_pDockListRecentConnects->setVisible(m_FullState.dockListRecentConnects);
415 m_pDockFavorite->setVisible(m_FullState.dockFavorite);
417 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
420 pDockDebugLog->setVisible(m_FullState.dockDebugLog);
423 if(m_pFullScreenToolBar)
426 m_pFullScreenToolBar->close();
427 m_pFullScreenToolBar =
nullptr;
430 emit sigShowNormal();
432 this->activateWindow();
437 qDebug(log) <<
"Entry full screen";
438 emit sigFullScreen();
440 this->showFullScreen();
442 ui->actionFull_screen_F->setIcon(QIcon::fromTheme(
"view-restore"));
443 ui->actionFull_screen_F->setText(tr(
"Exit full screen(&E)"));
444 ui->actionFull_screen_F->setToolTip(tr(
"Exit full screen"));
445 ui->actionFull_screen_F->setStatusTip(tr(
"Exit full screen"));
446 ui->actionFull_screen_F->setWhatsThis(tr(
"Exit full screen"));
448 m_FullState.toolBar = ui->toolBar->isVisible();
449 ui->toolBar->setVisible(
false);
450 m_FullState.statusbar = ui->statusbar->isVisible();
451 ui->statusbar->setVisible(
false);
452 m_FullState.menubar = ui->menubar->isVisible();
453 ui->menubar->setVisible(
false);
455 m_FullState.dockListConnects = m_pDockListConnecters->isVisible();
456 m_pDockListConnecters->setVisible(
false);
457 m_FullState.dockListRecentConnects = m_pDockListRecentConnects->isVisible();
458 m_pDockListRecentConnects->setVisible(
false);
459 m_FullState.dockFavorite = m_pDockFavorite->isVisible();
460 m_pDockFavorite->setVisible(
false);
462 QDockWidget* pDockDebugLog = findChild<QDockWidget*>(
"dockDebugLog");
465 m_FullState.dockDebugLog = pDockDebugLog->isVisible();
466 pDockDebugLog->setVisible(
false);
469 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
472 QScreen* pScreen = qApp->primaryScreen();
474 QPoint pos(pScreen->geometry().left()
475 + (pScreen->geometry().width()
476 - m_pFullScreenToolBar->frameGeometry().width()) / 2,
477 pScreen->geometry().top());
478 qDebug(log) <<
"Primary screen geometry:" << pScreen->geometry()
479 <<
"availableGeometry:" << pScreen->availableGeometry()
480 << pos << mapToGlobal(pos);
481 m_pFullScreenToolBar->move(pos);
483 bool check = connect(m_pFullScreenToolBar, SIGNAL(sigExitFullScreen()),
484 this, SLOT(on_actionFull_screen_F_triggered()));
486 check = connect(m_pFullScreenToolBar, SIGNAL(sigExit()),
487 this, SLOT(on_actionExit_E_triggered()));
489 check = connect(m_pFullScreenToolBar, SIGNAL(sigDisconnect()),
490 this, SLOT(on_actionDisconnect_D_triggered()));
492 check = connect(
this, SIGNAL(sigConnecterMenuChanged(QAction*)),
493 m_pFullScreenToolBar,
494 SLOT(slotConnecterMenuChanged(QAction*)));
497 m_pFullScreenToolBar->show();
500void MainWindow::slotViewerFocusIn(QWidget *pView)
503 qDebug(log) << Q_FUNC_INFO <<
"Focus:" << sender() << pView;
509void MainWindow::slotConnecterChanged(
CConnecter *c)
516void MainWindow::slotCurrentViewChanged(
const QWidget* pView)
518 qDebug(log) << Q_FUNC_INFO;
525void MainWindow::EnableMenu(
bool bEnable)
527 qDebug(log) << Q_FUNC_INFO << bEnable;
528 ui->actionClone->setEnabled(bEnable);
529 ui->actionAdd_to_favorite->setEnabled(bEnable);
530 ui->actionDisconnect_D->setEnabled(bEnable);
531 ui->actionTabBar_B->setEnabled(bEnable);
532 slotLoadConnecterMenu();
535void MainWindow::slotLoadConnecterMenu()
537 qDebug(log) << Q_FUNC_INFO;
539 if(m_pActionConnecterMenu) {
540 ui->menuTools->removeAction(m_pActionConnecterMenu);
541 ui->toolBar->removeAction(m_pActionConnecterMenu);
542 m_pActionConnecterMenu =
nullptr;
549 qDebug(log) <<
"The current view is empty";
552 foreach(
auto c, m_Connecters)
556 qDebug(log) <<
"Load plugin menu";
557 auto m = c->
GetMenu(ui->menuTools);
559 m_pActionConnecterMenu = ui->menuTools->addMenu(m);
560 ui->toolBar->insertAction(ui->actionFull_screen_F, m_pActionConnecterMenu);
561 emit sigConnecterMenuChanged(m_pActionConnecterMenu);
578 qDebug(log) <<
"The current view is empty";
581 foreach(
auto c, m_Connecters)
585 qDebug(log) <<
"Load plugin menu";
586 auto m = c->
GetMenu(ui->menuTools);
594void MainWindow::on_actionExit_E_triggered()
599void MainWindow::keyReleaseEvent(QKeyEvent *event)
605 on_actionFull_screen_F_triggered();
608 QMainWindow::keyReleaseEvent(event);
611void MainWindow::slotUpdateParameters(
CConnecter* pConnecter)
616void MainWindow::on_actionClone_triggered()
620 foreach(
auto c, m_Connecters)
624 QString szFile = c->GetSettingsFile();
626 if(!pConnecter)
return;
627 Connect(pConnecter,
false, szFile);
633void MainWindow::slotOpenFile(
const QString& szFile,
bool bOpenSettings)
635 if(szFile.isEmpty())
return;
643 Connect(p, bOpenSettings, szFile);
646void MainWindow::on_actionOpenRRCFile_triggered()
648 QString szFile = QFileDialog::getOpenFileName(
650 tr(
"Open rabbit remote control file"),
651 RabbitCommon::CDir::Instance()->GetDirUserData(),
652 tr(
"Rabbit remote control Files (*.rrc);;All files(*.*)"));
653 if(szFile.isEmpty())
return;
665void MainWindow::slotConnect()
667 if(
nullptr == m_pView)
672 QAction* pAction =
dynamic_cast<QAction*
>(this->sender());
674 if(
nullptr == p)
return;
690 qDebug(log) <<
"MainWindow::Connect: set:" << set <<
"; File:" << szFile;
693 bool check = connect(c, SIGNAL(sigConnected()),
696 check = connect(c, SIGNAL(sigDisconnect()),
697 this, SLOT(slotDisconnect()));
699 check = connect(c, SIGNAL(sigDisconnected()),
700 this, SLOT(slotDisconnected()));
702 check = connect(c, SIGNAL(sigError(
const int,
const QString &)),
703 this, SLOT(slotError(
const int,
const QString&)));
705 check = connect(c, SIGNAL(sigShowMessageBox(
const QString&,
const QString&,
706 const QMessageBox::Icon&)),
708 const QMessageBox::Icon&)));
710 check = connect(c, SIGNAL(sigInformation(
const QString&)),
713 check = connect(c, SIGNAL(sigUpdateName(
const QString&)),
714 this, SLOT(slotUpdateName(
const QString&)));
716 check = connect(c, SIGNAL(sigUpdateParameters(
CConnecter*)),
717 this, SLOT(slotUpdateParameters(
CConnecter*)));
725 case QDialog::Rejected:
728 case QDialog::Accepted:
735 szFile = c->GetSettingsFile();
737 c->SetSettingsFile(szFile);
743 m_pRecentMenu->addRecentFile(szFile, c->
Name());
745 if(!c->
Name().isEmpty())
749 if(-1 < m_Connecters.indexOf(c)) {
759 check = connect(c, SIGNAL(sigViewerFocusIn(QWidget*)),
760 this, SLOT(slotViewerFocusIn(QWidget*)));
763 m_Connecters.push_back(c);
764 m_pFrmConnecters->slotLoadConnecters();
799 slotLoadConnecterMenu();
802 qDebug(log) <<
"MainWindow::slotConnected()" << p->
Name();
808 qDebug(log) <<
"MainWindow::slotCloseView" << pView;
810 foreach(
auto c, m_Connecters)
821void MainWindow::on_actionDisconnect_D_triggered()
823 qDebug(log) <<
"MainWindow::on_actionDisconnect_D_triggered()";
830void MainWindow::slotDisconnect()
832 qDebug(log) <<
"MainWindow::slotDisconnect()";
834 if(!pConnecter)
return;
840void MainWindow::slotDisconnected()
842 qDebug(log) <<
"MainWindow::slotDisconnected()";
844 foreach(
auto c, m_Connecters)
849 m_Connecters.removeAll(c);
851 m_pFrmConnecters->slotLoadConnecters();
856 if(m_Connecters.isEmpty())
857 if(m_pActionConnecterMenu) {
858 ui->menuTools->removeAction(m_pActionConnecterMenu);
859 ui->toolBar->removeAction(m_pActionConnecterMenu);
860 m_pActionConnecterMenu =
nullptr;
864void MainWindow::slotSignalConnected()
866 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Connected"));
867 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
868 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
870 m_pSignalStatus->setIcon(QIcon::fromTheme(
"newwork-wired"));
873void MainWindow::slotSignalDisconnected()
875 m_pSignalStatus->setToolTip(tr(
"ICE signal status: Disconnected"));
876 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
877 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
879 m_pSignalStatus->setIcon(QIcon::fromTheme(
"network-wireless"));
882void MainWindow::slotSignalError(
const int nError,
const QString &szInfo)
884 slotSignalDisconnected();
888void MainWindow::slotSignalPushButtonClicked(
bool checked)
898void MainWindow::slotError(
const int nError,
const QString &szInfo)
905 const QString &title,
const QString &message,
906 const QMessageBox::Icon &icon)
909 if(!m_Parameter.GetMessageBoxDisplayInformation())
912 QMessageBox msg(icon, title, message, QMessageBox::Ok,
this);
913 QCheckBox* cb =
new QCheckBox(
914 tr(
"Use message box to display information"),
this);
915 cb->setChecked(
true);
917 RC_SHOW_WINDOW(&msg);
920 m_Parameter.SetMessageBoxDisplayInformation(
false);
927 statusBar()->showMessage(szInfo);
930void MainWindow::slotUpdateName()
932 foreach (
auto pConnecter, m_Connecters)
934 m_pView->SetWidowsTitle(pConnecter->
GetViewer(),
941void MainWindow::slotUpdateName(
const QString& szName)
944 if(!pConnecter)
return;
945 m_pView->SetWidowsTitle(pConnecter->
GetViewer(), szName,
953 QAction* p = ui->menuConnect_C->addAction(pPlug->
Protocol()
955 this, SLOT(slotConnect()));
959 p->setIcon(pPlug->Icon());
964void MainWindow::closeEvent(QCloseEvent *event)
966 qDebug(log) <<
"MainWindow::closeEvent()";
968 if(m_Parameter.GetSaveMainWindowStatus())
970 on_actionFull_screen_F_triggered();
972 SaveConnectLasterClose();
974 foreach (
auto it, m_Connecters)
977 emit it->sigUpdateParameters(it);
981 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
982 QSettings::IniFormat);
983 if(m_Parameter.GetSaveMainWindowStatus())
985 set.setValue(
"MainWindow/Status/Geometry", saveGeometry());
986 set.setValue(
"MainWindow/Status/State", saveState());
988 m_Parameter.SetTabBar(ui->actionTabBar_B->isChecked());
989 m_Parameter.SetMenuBar(menuBar()->isVisible());
990 m_Parameter.SetStatusBar(statusBar()->isVisible());
992 set.remove(
"MainWindow/Status/Geometry");
993 set.remove(
"MainWindow/Status/State");
999 QMainWindow::closeEvent(event);
1005int MainWindow::LoadConnectLasterClose()
1007 if(!m_Parameter.GetOpenLasterClose())
1010 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1011 + QDir::separator() +
"LasterClose.dat");
1012 if(f.open(QFile::ReadOnly))
1018 if(szFile.isEmpty())
1020 slotOpenFile(szFile);
1027int MainWindow::SaveConnectLasterClose()
1029 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1030 + QDir::separator() +
"LasterClose.dat");
1031 f.open(QFile::WriteOnly);
1032 if(m_Parameter.GetOpenLasterClose())
1035 foreach(
auto it, m_Connecters)
1037 d << it->GetSettingsFile();
1044void MainWindow::on_actionTabBar_B_toggled(
bool bShow)
1048 m_pView->SetVisibleTab(bShow);
1049 m_Parameter.SetTabBar(bShow);
1051 if(m_pDockListConnecters)
1052 m_pDockListConnecters->setVisible(bShow);
1056void MainWindow::on_actionMain_menu_bar_M_toggled(
bool checked)
1058 qDebug(log) << Q_FUNC_INFO << checked;
1059 if(ui->toolBar->isHidden() && !checked)
1061 if( QMessageBox::StandardButton::Yes
1062 == QMessageBox::information(
this, tr(
"Hide menu bar"),
1063 tr(
"The menu bar will be hidden, the tool bar must be showed."),
1064 QMessageBox::StandardButton::Yes
1065 | QMessageBox::StandardButton::No))
1067 ui->actionToolBar_T->setChecked(
true);
1069 ui->actionMain_menu_bar_M->setChecked(
true);
1074 menuBar()->setVisible(checked);
1075 m_Parameter.SetMenuBar(checked);
1078 ui->toolBar->removeAction(ui->actionMain_menu_bar_M);
1082 ui->toolBar->insertAction(ui->actionTabBar_B,
1083 ui->actionMain_menu_bar_M);
1087void MainWindow::on_actionToolBar_T_toggled(
bool checked)
1089 qDebug(log) << Q_FUNC_INFO << checked;
1090 if(menuBar()->isHidden() && !checked)
1092 if( QMessageBox::StandardButton::Yes
1093 == QMessageBox::information(
this, tr(
"Hide tool bar"),
1094 tr(
"The tool bar will be hidden, the menu bar must be showed."),
1095 QMessageBox::StandardButton::Yes
1096 | QMessageBox::StandardButton::No))
1098 ui->actionMain_menu_bar_M->setChecked(
true);
1100 ui->actionToolBar_T->setChecked(
true);
1104 ui->toolBar->setVisible(checked);
1107void MainWindow::on_actionStatus_bar_S_toggled(
bool checked)
1109 statusBar()->setVisible(checked);
1110 m_Parameter.SetStatusBar(checked);
1114void MainWindow::on_actionSettings_triggered()
1117 if(CParameterDlgSettings::Accepted == RC_SHOW_WINDOW(&set))
1125void MainWindow::slotShortCut()
1127 if(m_Parameter.GetReceiveShortCut())
1129 setFocusPolicy(Qt::WheelFocus);
1130#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
1131 ui->actionFull_screen_F->setShortcut(
1132 QKeySequence(QKeyCombination(Qt::CTRL, Qt::Key_R),
1133 QKeyCombination(Qt::Key_F)));
1134 ui->actionScreenshot->setShortcut(
1135 QKeySequence(QKeyCombination(Qt::CTRL, Qt::Key_R),
1136 QKeyCombination(Qt::Key_S)));
1138 ui->actionFull_screen_F->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R, Qt::Key_F));
1139 ui->actionScreenshot->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R, Qt::Key_S));
1142 setFocusPolicy(Qt::NoFocus);
1143 ui->actionFull_screen_F->setShortcut(QKeySequence());
1144 ui->actionScreenshot->setShortcut(QKeySequence());
1148void MainWindow::on_actionOpenListRecentConnections_triggered()
1151 &m_Client, m_Parameter,
false);
1153 bool check = connect(p, SIGNAL(sigConnect(
const QString&,
bool)),
1154 this, SLOT(slotOpenFile(
const QString&,
bool)));
1159 d.setWindowIcon(windowIcon());
1160 d.setWindowTitle(p->windowTitle());
1161 QGridLayout* pLayout =
new QGridLayout(&d);
1163 pLayout->addWidget(p);
1164 check = connect(p, SIGNAL(destroyed()), &d, SLOT(reject()));
1165 d.setLayout(pLayout);
1170void MainWindow::on_actionAdd_to_favorite_triggered()
1172 if(!m_pView || !m_pFavoriteView)
return;
1174 foreach(
auto c, m_Connecters)
1178 m_pFavoriteView->AddFavorite(c->
Name(), c->GetSettingsFile());
1183void MainWindow::dragEnterEvent(QDragEnterEvent *event)
1185 qDebug(log) <<
"dragEnterEvent";
1187 if(event->mimeData()->hasUrls())
1189 qWarning(log) <<
event->mimeData()->urls();
1190 event->acceptProposedAction();
1194void MainWindow::dragMoveEvent(QDragMoveEvent *event)
1199void MainWindow::dropEvent(QDropEvent *event)
1201 qDebug(log) <<
"dropEvent";
1202 if(!event->mimeData()->hasUrls())
1204 auto urls =
event->mimeData()->urls();
1205 foreach(
auto url, urls)
1207 if(url.isLocalFile())
1208 slotOpenFile(url.toLocalFile());
1212void MainWindow::slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
1217#if defined(Q_OS_ANDROID)
1222 case QSystemTrayIcon::Trigger:
1234void MainWindow::slotSystemTrayIconTypeChanged()
1237 if(!QSystemTrayIcon::isSystemTrayAvailable())
1239 qWarning(log) <<
"System tray is not available";
1243 if(!m_Parameter.GetEnableSystemTrayIcon())
1245 qDebug(log) <<
"Disable system tray icon";
1252 m_TrayIcon = QSharedPointer<QSystemTrayIcon>(
new QSystemTrayIcon(
this));
1253 if(QSystemTrayIcon::isSystemTrayAvailable())
1255 bool check = connect(
1257 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
1259 SLOT(slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason)));
1261 m_TrayIcon->setIcon(this->windowIcon());
1262 m_TrayIcon->setToolTip(windowTitle());
1265 qWarning(log) <<
"System tray is not available";
1267 switch (m_Parameter.GetSystemTrayIconMenuType())
1269 case CParameterApp::SystemTrayIconMenuType::MenuBar:
1271 QMenu* pMenu =
new QMenu(
this);
1272 pMenu->addMenu(ui->menuRemote);
1273 pMenu->addMenu(ui->menuView);
1274 pMenu->addMenu(ui->menuTools);
1275 m_TrayIcon->setContextMenu(pMenu);
1278 case CParameterApp::SystemTrayIconMenuType::Remote:
1279 m_TrayIcon->setContextMenu(ui->menuRemote);
1281 case CParameterApp::SystemTrayIconMenuType::RecentOpen:
1282 m_TrayIcon->setContextMenu(m_pRecentMenu);
1284 case CParameterApp::SystemTrayIconMenuType::View:
1285 m_TrayIcon->setContextMenu(ui->menuView);
1287 case CParameterApp::SystemTrayIconMenuType::Tools:
1288 m_TrayIcon->setContextMenu(ui->menuTools);
1290 case CParameterApp::SystemTrayIconMenuType::No:
1291 m_TrayIcon->setContextMenu(
nullptr);
1296void MainWindow::slotEnableSystemTrayIcon()
1301 if(!m_Parameter.GetEnableSystemTrayIcon())
1304 slotSystemTrayIconTypeChanged();
virtual CConnecter * LoadConnecter(const QString &szFile)
New CConnecter pointer from file, the owner is caller.
virtual CConnecter * CreateConnecter(const QString &id)
New CConnecter pointer, the owner is caller.
virtual int DeleteConnecter(CConnecter *p)
Delete CConnecter.
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
Get parameter settings widget.
virtual int SaveConnecter(CConnecter *pConnecter)
Accept connecter parameters to file.
virtual int SaveSettings(const QString szFile=QString())
Save Client parameters to file.
virtual int DisConnect()=0
Close connect.
virtual const QIcon Icon() const
Icon.
virtual int OpenDialogSettings(QWidget *parent=nullptr)
Open settings dialog.
virtual QWidget * GetViewer()=0
Get Viewer.
virtual const QString Description()
Description.
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get operate menu.
virtual int Connect()=0
Start connect.
virtual const QString Name()
Name.
void sigUpdateParameters(CConnecter *pConnecter)
Update parameters, notify application to save or show parameters.
List the connect of be existed.
static CICE * Instance()
Single instance.
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file.
virtual const QString DisplayName() const
The plugin display name.
virtual const QString Description() const =0
Plugin description.
virtual const QString Protocol() const =0
Plugin Protocol.
virtual int AddView(QWidget *pView)=0
virtual QWidget * GetCurrentView()=0
virtual int RemoveView(QWidget *pView)=0
virtual int onProcess(const QString &id, CPluginClient *pPlug) override
Process plugins.
void slotInformation(const QString &szInfo)
Show information.
int Connect(CConnecter *c, bool set, QString szFile=QString())
Connect.
void slotConnected()
[MainWindow slotConnected]
virtual void slotShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
Use message box display information.
void slotCloseView(const QWidget *pView)
[MainWindow slotConnected]
void slotCustomContextMenuRequested(const QPoint &pos)
MainWindow::slotCustomContextMenuRequested.