Rabbit Remote Control 0.1.0-de
Loading...
Searching...
No Matches
mainwindow.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include "mainwindow.h"
4#include "ui_mainwindow.h"
5#ifdef HAVE_UPDATE
6#include "FrmUpdater.h"
7#endif
8#include "RabbitCommonDir.h"
9#include "RabbitCommonTools.h"
10
11#ifdef HAVE_ABOUT
12#include "DlgAbout.h"
13#endif
14#ifdef BUILD_QUIWidget
15#include "QUIWidget/QUIWidget.h"
16#endif
17
18#include "Operate.h"
19#include "FrmFullScreenToolBar.h"
20#include "ParameterDlgSettings.h"
21#include "FrmListRecent.h"
22
23#include "ViewTable.h"
24#include "ViewSplitter.h"
25
26#ifdef HAVE_ICE
27#include "Ice.h"
28#endif
29
30#include <QGridLayout>
31#include <QMessageBox>
32#include <QCheckBox>
33#include <QScreen>
34#include <QApplication>
35#include <QDebug>
36#include <QDesktopServices>
37#include <QWidgetAction>
38#include <QMouseEvent>
39#include <QDrag>
40#include <QMimeData>
41#include <QKeySequence>
42#include <QPushButton>
43#include <QDateTime>
44#include <QFileDialog>
45#include <QLoggingCategory>
46#include <QThread>
47
48static Q_LOGGING_CATEGORY(log, "App.MainWindow")
49static Q_LOGGING_CATEGORY(logRecord, "App.MainWindow.Record")
50
51MainWindow::MainWindow(QWidget *parent)
52 : QMainWindow(parent)
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)
63 , ui(new Ui::MainWindow)
64 , m_pView(nullptr)
65 , m_pFullScreenToolBar(nullptr)
66 , m_pRecentMenu(nullptr)
67 , m_pDockFavorite(nullptr)
68 , m_pFavoriteView(nullptr)
69 , m_StatusBarMessage(this)
70{
71 bool check = false;
72
73 ui->setupUi(this);
74 ui->menubar->show();
75
76 m_StatusBarMessage.setSizePolicy(QSizePolicy::Policy::Expanding,
77 QSizePolicy::Policy::Preferred);
78 this->statusBar()->addWidget(&m_StatusBarMessage);
79
80 //setFocusPolicy(Qt::NoFocus);
81 //addToolBar(Qt::LeftToolBarArea, ui->toolBar);
82 setAcceptDrops(true);
83
84 RabbitCommon::CTools::AddStyleMenu(ui->menuTools);
85 ui->menuTools->addMenu(RabbitCommon::CTools::GetLogMenu(this));
86
87 m_pRecentMenu = new RabbitCommon::CRecentMenu(
88 tr("Recently"),
89 QIcon::fromTheme("document-open-recent"),
90 this);
91 check = connect(m_pRecentMenu, SIGNAL(recentFileTriggered(const QString&)),
92 this, SLOT(slotOpenFile(const QString&)));
93 Q_ASSERT(check);
94 check = connect(&m_Parameter, SIGNAL(sigRecentMenuMaxCountChanged(int)),
95 m_pRecentMenu, SLOT(setMaxCount(int)));
96 Q_ASSERT(check);
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);
109
110#ifdef HAVE_UPDATE
111 CFrmUpdater updater;
112 ui->actionUpdate->setIcon(updater.windowIcon());
113#endif
114
115 QToolButton* tbStart = new QToolButton(ui->toolBar);
116 tbStart->setFocusPolicy(Qt::NoFocus);
117 tbStart->setPopupMode(QToolButton::InstantPopup);
118 //tbStart->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
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);
125
126 m_Parameter.Load();
127
128 check = connect(&m_Parameter, SIGNAL(sigReceiveShortCutChanged()),
129 this, SLOT(slotShortCut()));
130 Q_ASSERT(check);
131 slotSystemTrayIconTypeChanged();
132 check = connect(&m_Parameter, SIGNAL(sigSystemTrayIconTypeChanged()),
133 this,
134 SLOT(slotSystemTrayIconTypeChanged()));
135 Q_ASSERT(check);
136 check = connect(&m_Parameter, SIGNAL(sigEnableSystemTrayIcon()),
137 this, SLOT(slotEnableSystemTrayIcon()));
138 Q_ASSERT(check);
139 check = connect(&m_Parameter, SIGNAL(sigEnableTabToolTipChanged()),
140 this, SLOT(slotUpdateName()));
141 Q_ASSERT(check);
142 check = connect(&m_Parameter, SIGNAL(sigEnableTabIconChanged()),
143 this, SLOT(slotUpdateName()));
144 Q_ASSERT(check);
145
146 m_Manager.EnumPlugins(this);
147 check = connect(&m_Parameter, SIGNAL(sigStartByTypeChanged()),
148 this, SLOT(slotStartByType()));
149 Q_ASSERT(check);
150
151 m_pDockFavorite = new QDockWidget(this);
152 if(m_pDockFavorite)
153 {
154 m_pFavoriteView = new CFavoriteView(m_pDockFavorite);
155 if(m_pFavoriteView)
156 {
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)));
160 Q_ASSERT(check);
161 check = connect(m_pFavoriteView, SIGNAL(sigFavorite()),
162 this, SLOT(on_actionAdd_to_favorite_triggered()));
163 Q_ASSERT(check);
164 check = connect(&m_Parameter, SIGNAL(sigFavoriteEditChanged(bool)),
165 m_pFavoriteView, SLOT(slotDoubleEditNode(bool)));
166 Q_ASSERT(check);
167 emit m_Parameter.sigFavoriteEditChanged(m_Parameter.GetFavoriteEdit());
168 m_pDockFavorite->setWidget(m_pFavoriteView);
169 m_pDockFavorite->setWindowTitle(m_pFavoriteView->windowTitle());
170 }
171 // Must set ObjectName then restore it. See: saveState help document
172 m_pDockFavorite->setObjectName("dockFavorite");
173#if defined(Q_OS_ANDROID)
174 m_pDockFavorite->hide();
175#endif
176 ui->menuView->addAction(m_pDockFavorite->toggleViewAction());
177 m_pDockFavorite->toggleViewAction()->setIcon(QIcon::fromTheme("emblem-favorite"));
178 addDockWidget(Qt::DockWidgetArea::LeftDockWidgetArea, m_pDockFavorite);
179 }
180
181 m_pDockListRecent = new QDockWidget(this);
182 if(m_pDockListRecent)
183 {
184 CFrmListRecent* pListRecent
185 = new CFrmListRecent(this, &m_Manager, m_Parameter, true,
186 m_pDockListRecent);
187 if(pListRecent) {
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)));
194 Q_ASSERT(check);
195 check = connect(pListRecent, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
196 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
197 Q_ASSERT(check);
198 m_pDockListRecent->setWidget(pListRecent);
199 m_pDockListRecent->setWindowTitle(
200 pListRecent->windowTitle());
201 }
202 // Must set ObjectName then restore it. See: saveState help document
203 m_pDockListRecent->setObjectName("dockListRecent");
204#if defined(Q_OS_ANDROID)
205 m_pDockListRecent->hide();
206#endif
207 ui->menuView->addAction(m_pDockListRecent->toggleViewAction());
208 m_pDockListRecent->toggleViewAction()->setIcon(QIcon::fromTheme("document-open-recent"));
209 tabifyDockWidget(m_pDockFavorite, m_pDockListRecent);
210 }
211
212 m_pDockActive = new QDockWidget(this);
213 if(m_pDockActive)
214 {
215 m_pFrmActive = new CFrmActive(
216 m_Operates, m_Parameter,
217 ui->menuStart, ui->actionStop,
218 m_pRecentMenu, m_pDockActive);
219 if(m_pFrmActive) {
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*)));
227 Q_ASSERT(check);
228 check = connect(m_pFrmActive, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
229 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
230 Q_ASSERT(check);
231 }
232 m_pDockActive->setObjectName("dockListActive");
233#if defined(Q_OS_ANDROID)
234 m_pDockActive->hide();
235#endif
236 ui->menuView->addAction(m_pDockActive->toggleViewAction());
237 m_pDockActive->toggleViewAction()->setIcon(QIcon::fromTheme("network-wired"));
238 tabifyDockWidget(m_pDockFavorite, m_pDockActive);
239 }
240
241 QActionGroup* pGBView = new QActionGroup(this);
242 if(pGBView) {
243 pGBView->addAction(ui->actionViewTab);
244 pGBView->addAction(ui->actionViewSplit);
245 }
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();
250 }
251 if(CParameterApp::ViewType::Splitter == m_Parameter.GetViewType()) {
252 ui->actionViewSplit->setChecked(true);
253 on_actionViewSplit_triggered();
254 }
255 check = connect(&m_Parameter, &CParameterApp::sigViewTypeChanged,
256 this, [&](){
257 m_Parameter.Save();
258 });
259 Q_ASSERT(check);
260
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);
271
272 EnableMenu(false);
273 slotShortCut();
274
275 m_pSecureLevel = new QLabel(statusBar());
276 // QIcon icon = QIcon::fromTheme("newwork-wired");
277 // QPixmap pixmap = icon.pixmap(icon.actualSize(QSize(64, 64)));
278 // m_pSecureLevel->setPixmap(pixmap);
279 m_pSecureLevel->hide();
280 statusBar()->addPermanentWidget(m_pSecureLevel);
281
282#ifdef HAVE_ICE
283 if(CICE::Instance()->GetSignal())
284 {
285 check = connect(CICE::Instance()->GetSignal().data(),
286 SIGNAL(sigConnected()),
287 this, SLOT(slotSignalConnected()));
288 Q_ASSERT(check);
289 check = connect(CICE::Instance()->GetSignal().data(),
290 SIGNAL(sigDisconnected()),
291 this, SLOT(slotSignalDisconnected()));
292 Q_ASSERT(check);
293 check = connect(CICE::Instance()->GetSignal().data(),
294 SIGNAL(sigError(const int, const QString&)),
295 this, SLOT(slotSignalError(const int, const QString&)));
296 Q_ASSERT(check);
297 }
298 CICE::Instance()->slotStart(statusBar());
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);
305#endif
306
307 if(m_Parameter.GetSaveMainWindowStatus())
308 {
309 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
310 QSettings::IniFormat);
311 QByteArray geometry
312 = set.value("MainWindow/Status/Geometry").toByteArray();
313 if(!geometry.isEmpty())
314 restoreGeometry(geometry);
315 // Restores the state of this mainwindow's toolbars and dockwidgets
316 QByteArray state = set.value("MainWindow/Status/State").toByteArray();
317 if(!state.isEmpty())
318 restoreState(state);
319
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);
330 }
331
332 slotEnableSystemTrayIcon();
333
334 LoadOperateLasterClose();
335}
336
337MainWindow::~MainWindow()
338{
339 qDebug(log) << "MainWindow::~MainWindow()";
340 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
341 delete ui;
342}
343
344void MainWindow::SetView(CView* pView)
345{
346 qDebug(log) << Q_FUNC_INFO;
347 if(!pView)
348 return;
349 if(m_pView)
350 m_pView->disconnect();
351
352 m_pView = pView;
353 setCentralWidget(m_pView);
354
355 bool check = false;
356 //m_pView->setFocusPolicy(Qt::NoFocus);
357 check = connect(m_pView, SIGNAL(sigCloseView(const QWidget*)),
358 this, SLOT(slotCloseView(const QWidget*)));
359 Q_ASSERT(check);
360 check = connect(m_pView, SIGNAL(sigCurrentChanged(const QWidget*)),
361 this, SLOT(slotCurrentViewChanged(const QWidget*)));
362 Q_ASSERT(check);
363 if(m_pFrmActive) {
364 check = connect(m_pView, SIGNAL(sigCurrentChanged(const QWidget*)),
365 m_pFrmActive, SLOT(slotViewChanged(const QWidget*)));
366 Q_ASSERT(check);
367 }
368 check = connect(m_pView, SIGNAL(customContextMenuRequested(const QPoint&)),
369 this, SLOT(slotCustomContextMenuRequested(const QPoint&)));
370 Q_ASSERT(check);
371
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());
376 }
377 m_pView->SetVisibleTab(m_Parameter.GetTabBar());
378}
379
380void MainWindow::on_actionViewTab_triggered()
381{
382 qDebug(log) << Q_FUNC_INFO;
383 if(!ui->actionViewTab->isChecked()) return;
384 m_Parameter.SetViewType(CParameterApp::ViewType::Tab);
385 SetView(new CViewTable(&m_Parameter, this));
386}
387
388void MainWindow::on_actionViewSplit_triggered()
389{
390 qDebug(log) << Q_FUNC_INFO;
391 if(!ui->actionViewSplit->isChecked()) return;
392 m_Parameter.SetViewType(CParameterApp::ViewType::Splitter);
393 SetView(new CViewSplitter(&m_Parameter, this));
394}
395
396void MainWindow::on_actionAbout_triggered()
397{
398#ifdef HAVE_ABOUT
399 CDlgAbout *about = new CDlgAbout(this);
400 QIcon icon = QIcon::fromTheme("app");
401 if(!icon.isNull()) {
402 auto sizeList = icon.availableSizes();
403 if(!sizeList.isEmpty()) {
404 QPixmap p = icon.pixmap(*sizeList.begin());
405 about->m_AppIcon = p.toImage();
406 }
407 }
408 about->m_szCopyrightStartTime = "2020";
409 about->m_szVersionRevision = RabbitRemoteControl_REVISION;
410 about->m_szDetails = m_Manager.Details();
411 RC_SHOW_WINDOW(about);
412#endif
413}
414
415void MainWindow::on_actionUpdate_triggered()
416{
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"));
421 } else {
422#ifdef HAVE_UPDATE
423 CFrmUpdater* m_pfrmUpdater = new CFrmUpdater();
424 QIcon icon = QIcon::fromTheme("app");
425 if(!icon.isNull()) {
426 auto sizeList = icon.availableSizes();
427 if(!sizeList.isEmpty()) {
428 QPixmap p = icon.pixmap(*sizeList.begin());
429 m_pfrmUpdater->SetTitle(p.toImage());
430 }
431 }
432 m_pfrmUpdater->SetInstallAutoStartup();
433 RC_SHOW_WINDOW(m_pfrmUpdater);
434#endif
435 }
436}
437
438void MainWindow::on_actionFull_screen_F_triggered()
439{
440 CView* pView = qobject_cast<CView*>(this->centralWidget());
441 if(pView)
442 {
443 pView->SetFullScreen(!isFullScreen());
444 }
445
446 if(isFullScreen())
447 {
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"));
454
455 ui->toolBar->setVisible(m_FullState.toolBar);
456 ui->statusbar->setVisible(m_FullState.statusbar);
457 ui->menubar->setVisible(m_FullState.menubar);
458
459 m_pDockActive->setVisible(m_FullState.dockListActive);
460 m_pDockListRecent->setVisible(m_FullState.dockListRecent);
461 m_pDockFavorite->setVisible(m_FullState.dockFavorite);
462 // TODO: This is hade code. it is in RabbitCommon
463 QDockWidget* pDockDebugLog = findChild<QDockWidget*>("dockDebugLog");
464 if(pDockDebugLog)
465 {
466 pDockDebugLog->setVisible(m_FullState.dockDebugLog);
467 }
468
469 if(m_pFullScreenToolBar)
470 {
471 // Delete it when the widget is close
472 m_pFullScreenToolBar->close();
473 m_pFullScreenToolBar = nullptr;
474 }
475
476 emit sigShowNormal();
477 this->showNormal();
478 this->activateWindow();
479
480 return;
481 }
482
483 qDebug(log) << "Entry full screen";
484 emit sigFullScreen();
485 //setWindowFlags(Qt::FramelessWindowHint | windowFlags());
486 this->showFullScreen();
487
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"));
493
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);
500
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);
507 // This is hade code. it is in RabbitCommon
508 QDockWidget* pDockDebugLog = findChild<QDockWidget*>("dockDebugLog");
509 if(pDockDebugLog)
510 {
511 m_FullState.dockDebugLog = pDockDebugLog->isVisible();
512 pDockDebugLog->setVisible(false);
513 }
514
515 if(m_pFullScreenToolBar) m_pFullScreenToolBar->close();
516 // Delete it when the widget is close
517 m_pFullScreenToolBar = new CFrmFullScreenToolBar(this);
518 QScreen* pScreen = qApp->primaryScreen();
519 if(pScreen) {
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);
528 }
529 bool check = connect(m_pFullScreenToolBar, SIGNAL(sigExitFullScreen()),
530 this, SLOT(on_actionFull_screen_F_triggered()));
531 Q_ASSERT(check);
532 check = connect(m_pFullScreenToolBar, SIGNAL(sigExit()),
533 this, SLOT(on_actionExit_E_triggered()));
534 Q_ASSERT(check);
535 Q_ASSERT(check);
536 check = connect(this, SIGNAL(sigOperateMenuChanged(QAction*)),
537 m_pFullScreenToolBar,
538 SLOT(slotOperateMenuChanged(QAction*)));
539 Q_ASSERT(check);
540
541 m_pFullScreenToolBar->show();
542}
543
544void MainWindow::slotViewerFocusIn(QWidget *pView)
545{
546 COperate* c = qobject_cast<COperate*>(sender());
547 qDebug(log) << Q_FUNC_INFO << "Focus:" << c << pView;
548 if(c && m_pView) {
549 m_pView->SetCurrentView(c->GetViewer());
550 }
551}
552
553void MainWindow::slotOperateChanged(COperate *o)
554{
555 if(o && m_pView) {
556 m_pView->SetCurrentView(o->GetViewer());
557 }
558}
559
560void MainWindow::slotCurrentViewChanged(const QWidget* pView)
561{
562 qDebug(log) << Q_FUNC_INFO;
563 if(m_pView && pView)
564 EnableMenu(true);
565 else
566 EnableMenu(false);
567
568 foreach(auto o, m_Operates) {
569 if(o->GetViewer() == pView) {
570 SetSecureLevel(o);
571 foreach (auto a, ui->menuActivity->actions()) {
572 if(a->data().value<COperate*>() == o)
573 a->setChecked(true);
574 }
575 }
576 }
577}
578
579void MainWindow::EnableMenu(bool bEnable)
580{
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();
589}
590
591void MainWindow::slotMenuActivity()
592{
593 QAction* pAction = qobject_cast<QAction*>(sender());
594 Q_ASSERT(pAction);
595 if(!pAction) return;
596 COperate* p = pAction->data().value<COperate*>();
597 if(p)
598 slotOperateChanged(p);
599}
600
601void MainWindow::slotLoadOperateMenu()
602{
603 qDebug(log) << Q_FUNC_INFO;
604
605 if(m_pActionOperateMenu) {
606 ui->menuOperate->removeAction(m_pActionOperateMenu);
607 m_pActionOperateMenu = nullptr;
608 }
609 ui->toolBar->removeAction(m_pActionTBOperate);
610
611 if(!m_pView)
612 return;
613 auto pWin = m_pView->GetCurrentView();
614 if(!pWin) {
615 qDebug(log) << "The current view is empty";
616 return;
617 }
618 foreach(auto op, m_Operates)
619 {
620 if(op->GetViewer() == pWin)
621 {
622 qDebug(log) << "Load plugin menu";
623 auto m = op->GetMenu(ui->menuTools);
624 if(!m) return;
625 // Menu tool bar
626 m_pActionOperateMenu = ui->menuOperate->insertMenu(ui->actionAdd_to_favorite, m);
627 // ToolBar
628 if(!m_pTBOperate)
629 m_pTBOperate = new QToolButton(ui->toolBar);
630 if(m_pTBOperate) {
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);
640 }
641 emit sigOperateMenuChanged(m_pActionOperateMenu);
642 }
643 }
644}
645
653{
654 if(!m_pView)
655 return;
656 auto pWin = m_pView->GetCurrentView();
657 if(!pWin) {
658 qDebug(log) << "The current view is empty";
659 return;
660 }
661 foreach(auto p, m_Operates)
662 {
663 if(p->GetViewer() == pWin)
664 {
665 qDebug(log) << "Load plugin menu";
666 auto m = p->GetMenu(ui->menuTools);
667 if(!m) return;
668 // Note: The view is converted to global coordinates
669 m->exec(pos);
670 }
671 }
672}
673
674void MainWindow::on_actionExit_E_triggered()
675{
676 close();
677}
678
679void MainWindow::keyReleaseEvent(QKeyEvent *event)
680{
681 switch(event->key())
682 {
683 case Qt::Key_Escape:
684 if(isFullScreen())
685 on_actionFull_screen_F_triggered();
686 break;
687 }
688 QMainWindow::keyReleaseEvent(event);
689}
690
691void MainWindow::slotUpdateParameters(COperate *pOperate)
692{
693 m_Manager.SaveOperate(pOperate);
694}
695
696void MainWindow::on_actionClone_triggered()
697{
698 if(!m_pView) return;
699 QWidget* p = m_pView->GetCurrentView();
700 foreach(auto pOperate, m_Operates)
701 {
702 if(pOperate->GetViewer() == p)
703 {
704 QString szFile = pOperate->GetSettingsFile();
705 auto pOperate = m_Manager.LoadOperate(szFile);
706 if(!pOperate) return;
707 Start(pOperate, false, szFile);
708 return;
709 }
710 }
711}
712
713void MainWindow::slotOpenFile(const QString& szFile, bool bOpenSettings)
714{
715 if(szFile.isEmpty()) return;
716 COperate* p = m_Manager.LoadOperate(szFile);
717 if(nullptr == p)
718 {
719 slotStatusMessage(tr("Load file fail: ") + szFile, MessageLevel::Error);
720 return;
721 }
722
723 Start(p, bOpenSettings, szFile);
724}
725
726void MainWindow::on_actionOpenRRCFile_triggered()
727{
728 QString szFile = QFileDialog::getOpenFileName(
729 this,
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;
734
735 COperate* p = m_Manager.LoadOperate(szFile);
736 if(nullptr == p)
737 {
738 slotStatusMessage(tr("Load file fail: ") + szFile, MessageLevel::Error);
739 return;
740 }
741
742 Start(p, true);
743}
744
745void MainWindow::slotStart()
746{
747 if(nullptr == m_pView)
748 {
749 Q_ASSERT(false);
750 return;
751 }
752 QAction* pAction = qobject_cast<QAction*>(this->sender());
753 Q_ASSERT(pAction);
754 COperate* p = m_Manager.CreateOperate(pAction->data().toString());
755 if(nullptr == p) return;
756 Start(p, true);
757}
758
769int MainWindow::Start(COperate *pOperate, bool set, QString szFile)
770{
771 qDebug(log) << "MainWindow::Start: set:" << set << "; File:" << szFile;
772 bool bSave = false; //whether is save configure file
773 Q_ASSERT(pOperate);
774 bool check = connect(pOperate, SIGNAL(sigRunning()),
775 this, SLOT(slotRunning()));
776 Q_ASSERT(check);
777 check = connect(pOperate, SIGNAL(sigStop()),
778 this, SLOT(slotStop()));
779 Q_ASSERT(check);
780 check = connect(pOperate, SIGNAL(sigFinished()),
781 this, SLOT(slotFinished()));
782 Q_ASSERT(check);
783 check = connect(pOperate, SIGNAL(sigError(const int, const QString &)),
784 this, SLOT(slotError(const int, const QString&)));
785 Q_ASSERT(check);
786 check = connect(pOperate, SIGNAL(sigShowMessageBox(const QString&, const QString&,
787 const QMessageBox::Icon&)),
788 this, SLOT(slotShowMessageBox(const QString&, const QString&,
789 const QMessageBox::Icon&)));
790 Q_ASSERT(check);
791 check = connect(pOperate, SIGNAL(sigInformation(const QString&)),
792 this, SLOT(slotInformation(const QString&)));
793 Q_ASSERT(check);
794 check = connect(pOperate, SIGNAL(sigUpdateName(const QString&)),
795 this, SLOT(slotUpdateName(const QString&)));
796 Q_ASSERT(check);
797 check = connect(pOperate, SIGNAL(sigUpdateParameters(COperate*)),
798 this, SLOT(slotUpdateParameters(COperate*)));
799 Q_ASSERT(check);
800
801 if(set)
802 {
803 int nRet = pOperate->OpenDialogSettings(this);
804 switch(nRet)
805 {
806 case QDialog::Rejected:
807 m_Manager.DeleteOperate(pOperate);
808 return 0;
809 case QDialog::Accepted:
810 bSave = true;
811 break;
812 }
813 }
814
815 if(szFile.isEmpty())
816 szFile = pOperate->GetSettingsFile();
817 else
818 pOperate->SetSettingsFile(szFile);
819
820 int nRet = 0;
821 if(bSave)
822 nRet = m_Manager.SaveOperate(pOperate);
823 if(0 == nRet)
824 m_pRecentMenu->addRecentFile(szFile, pOperate->Name());
825
826 if(!pOperate->Name().isEmpty())
827 slotInformation(tr("Starting: ") + pOperate->Name());
828
829 //* Show view. \see: slotRunning()
830 if(-1 < m_Operates.indexOf(pOperate)) {
831 if(m_pView)
832 m_pView->SetCurrentView(pOperate->GetViewer());
833 return 0;
834 }
835 if(m_pView)
836 {
837 m_pView->AddView(pOperate->GetViewer());
838 m_pView->SetWidowsTitle(pOperate->GetViewer(), pOperate->Name(),
839 pOperate->Icon(), pOperate->Description());
840 //qDebug(log) << "View:" << p->GetViewer();
841 check = connect(pOperate, SIGNAL(sigViewerFocusIn(QWidget*)),
842 this, SLOT(slotViewerFocusIn(QWidget*)));
843 Q_ASSERT(check);
844 }
845 m_Operates.push_back(pOperate);
846
847 m_pFrmActive->slotLoad();
848 m_pFrmActive->slotViewChanged(m_pView->GetCurrentView());
849
850 QVariant vOperate;
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);
858 //*/
859
860 nRet = pOperate->Start();
861 if(nRet)
862 pOperate->Stop();
863 return nRet;
864}
865
867
871{
872 COperate* p = qobject_cast<COperate*>(sender());
873 if(!p) return;
874
875 /* If you put it here, when running, the view is not displayed.
876 So put it in the Start() display view.
877 See: Start(COperate *p, bool set, QString szFile)
878 */
879 /*
880 if(-1 == m_Operates.indexOf(p)) {
881 m_Operates.push_back(p);
882 if(m_pView)
883 {
884 m_pView->AddView(p->GetViewer());
885 m_pView->SetWidowsTitle(p->GetViewer(), p->Name(), p->Icon(), p->Description());
886 }
887 } else {
888 m_pView->SetCurrentView(p->GetViewer());
889 }
890 //*/
891
892 SetSecureLevel(p);
893
894 auto m = p->GetMenu();
895 m->addSeparator();
896 m->addAction(ui->actionClone);
897
898 slotLoadOperateMenu();
899
900 slotInformation(tr("Connected to ") + p->Name());
901 qDebug(log) << Q_FUNC_INFO << p->Name();
902}
904
905void MainWindow::slotCloseView(const QWidget* pView)
906{
907 qDebug(log) << "MainWindow::slotCloseView" << pView;
908 if(!pView) return;
909 foreach(auto p, m_Operates)
910 {
911 if(p->GetViewer() == pView)
912 {
913 //TODO: Whether to save the setting
914 emit p->sigUpdateParameters(p);
915 p->Stop();
916 }
917 }
918}
919
920void MainWindow::on_actionStop_triggered()
921{
922 qDebug(log) << Q_FUNC_INFO;
923 if(!m_pView) return;
924
925 QWidget* pView = m_pView->GetCurrentView();
926 slotCloseView(pView);
927}
928
929void MainWindow::slotStop()
930{
931 COperate* pOperate = qobject_cast<COperate*>(sender());
932 if(!pOperate) return;
933 qDebug(log) << Q_FUNC_INFO << pOperate->Name();
934 //TODO: Whether to save the setting
935 emit pOperate->sigUpdateParameters(pOperate);
936 pOperate->Stop();
937}
938
939void MainWindow::slotFinished()
940{
941 COperate* pOperate = qobject_cast<COperate*>(sender());
942 if(!pOperate) return;
943
944 qDebug(log) << Q_FUNC_INFO << pOperate->Name();
945 foreach(auto a, ui->menuActivity->actions()) {
946 COperate* o = a->data().value<COperate*>();
947 if(o == pOperate) {
948 ui->menuActivity->removeAction(a);
949 m_pMenuActivityGroup->removeAction(a);
950 }
951 }
952 foreach(auto p, m_Operates)
953 {
954 if(p == pOperate)
955 {
956 m_pView->RemoveView(p->GetViewer());
957 m_Operates.removeAll(p);
958 m_Manager.DeleteOperate(p);
959 m_pFrmActive->slotLoad();
960 m_pFrmActive->slotViewChanged(m_pView->GetCurrentView());
961 break;
962 }
963 }
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;
969 }
970}
971
972// 该函数将label控件变成一个圆形指示灯,需要指定颜色color以及直径size
973// size 单位是像素
974void SetIndicator(QLabel* label, QColor color, int size)
975{
976 QString min_width = QString("min-width: %1px;").arg(size); // 最小宽度:size
977 QString min_height = QString("min-height: %1px;").arg(size); // 最小高度:size
978 QString max_width = QString("max-width: %1px;").arg(size); // 最小宽度:size
979 QString max_height = QString("max-height: %1px;").arg(size); // 最小高度:size
980 // 再设置边界形状及边框
981 QString border_radius = QString("border-radius: %1px;").arg(size / 2); // 边框是圆角,半径为size/2
982 QString border = QString("border:1px solid ") + color.name() + ";"; // 边框为1px
983 // 最后设置背景颜色
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);
988}
989
990void MainWindow::SetSecureLevel(COperate* o)
991{
992 if(!m_pSecureLevel) return;
993 if(o) {
994 if(COperate::SecurityLevel::No == o->GetSecurityLevel())
995 {
996 m_pSecureLevel->hide();
997 return;
998 }
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();
1003 } else
1004 m_pSecureLevel->hide();
1005}
1006
1007void MainWindow::slotSignalConnected()
1008{
1009 m_pSignalStatus->setToolTip(tr("ICE signal status: Connected"));
1010 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1011 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1012 //m_pSignalStatus->setText(tr("Connected"));
1013 m_pSignalStatus->setIcon(QIcon::fromTheme("newwork-wired"));
1014}
1015
1016void MainWindow::slotSignalDisconnected()
1017{
1018 m_pSignalStatus->setToolTip(tr("ICE signal status: Disconnected"));
1019 m_pSignalStatus->setStatusTip(m_pSignalStatus->toolTip());
1020 m_pSignalStatus->setWhatsThis(m_pSignalStatus->toolTip());
1021 //m_pSignalStatus->setText(tr("Disconnected"));
1022 m_pSignalStatus->setIcon(QIcon::fromTheme("network-wireless"));
1023}
1024
1025void MainWindow::slotSignalError(const int nError, const QString &szInfo)
1026{
1027 slotSignalDisconnected();
1028 slotError(nError, szInfo);
1029}
1030
1031void MainWindow::slotSignalPushButtonClicked(bool checked)
1032{
1033#ifdef HAVE_ICE
1034 if(checked)
1035 CICE::Instance()->slotStart();
1036 else
1037 CICE::Instance()->slotStop();
1038#endif
1039}
1040
1041void MainWindow::slotError(const int nError, const QString &szInfo)
1042{
1043 Q_UNUSED(nError);
1044 slotStatusMessage(szInfo, MessageLevel::Error);
1045}
1046
1048 const QString &title, const QString &message,
1049 const QMessageBox::Icon &icon)
1050{
1051 slotInformation(message);
1052 if(!m_Parameter.GetMessageBoxDisplayInformation())
1053 return;
1054
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())
1062 {
1063 m_Parameter.SetMessageBoxDisplayInformation(false);
1064 m_Parameter.Save();
1065 }
1066}
1067
1068void MainWindow::slotInformation(const QString& szInfo)
1069{
1070 slotStatusMessage(szInfo, MessageLevel::Normal);
1071}
1072
1073void MainWindow::slotStatusMessage(QString szMessage, MessageLevel level)
1074{
1075 QPalette pe;
1076 switch ((MessageLevel)level) {
1077 case MessageLevel::Error:
1078 pe.setColor(QPalette::WindowText, Qt::red);
1079 break;
1080 case MessageLevel::Warning:
1081 pe.setColor(QPalette::WindowText, Qt::yellow);
1082 break;
1083 default:
1084 break;
1085 }
1086
1087 m_StatusBarMessage.setPalette(pe);
1088 m_StatusBarMessage.setText(szMessage);
1089}
1090
1091void MainWindow::slotUpdateName()
1092{
1093 foreach (auto p, m_Operates)
1094 {
1095 m_pView->SetWidowsTitle(p->GetViewer(),
1096 p->Name(),
1097 p->Icon(),
1098 p->Description());
1099 }
1100}
1101
1102void MainWindow::slotUpdateName(const QString& szName)
1103{
1104 COperate* p = qobject_cast<COperate*>(sender());
1105 if(!p) return;
1106 m_pView->SetWidowsTitle(p->GetViewer(), szName,
1107 p->Icon(), p->Description());
1108 foreach(auto a, ui->menuActivity->actions()) {
1109 if(a->data().value<COperate*>() == p) {
1110 a->setText(szName);
1111 break;
1112 }
1113 }
1114}
1115
1116QAction* MainWindow::GetStartAction(QMenu* pMenu, CPlugin *pPlug)
1117{
1118 QString szTitle;
1119 if(!pPlug->Protocol().isEmpty())
1120 szTitle = pPlug->Protocol() + ": ";
1121 szTitle += pPlug->DisplayName();
1122 QAction* p = pMenu->addAction(szTitle);
1123 p->setToolTip(pPlug->Description());
1124 p->setStatusTip(pPlug->Description());
1125 p->setData(pPlug->Id());
1126 p->setIcon(pPlug->Icon());
1127 return p;
1128}
1129
1130void MainWindow::slotStartByType()
1131{
1132 qDebug(log) << Q_FUNC_INFO;
1133 auto m = ui->menuStart->actions();
1134 foreach(auto a, m) {
1135 a->deleteLater();
1136 }
1137 foreach (auto a, m_MenuStartByType) {
1138 a->deleteLater();
1139 }
1140 ui->menuStart->clear();
1141 m_MenuStartByType.clear();
1142 m_Manager.EnumPlugins(this);
1143}
1144
1145int MainWindow::onProcess(const QString &id, CPlugin *pPlugin)
1146{
1147 Q_UNUSED(id);
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);
1155 } else
1156 m = *it;
1157 }
1158 // Start menu and toolbar
1159 QAction* p = GetStartAction(m, pPlugin);
1160 bool check = false;
1161 check = connect(p, SIGNAL(triggered()), this, SLOT(slotStart()));
1162 Q_ASSERT(check);
1163 return 0;
1164}
1165
1166void MainWindow::closeEvent(QCloseEvent *event)
1167{
1168 qDebug(log) << "MainWindow::closeEvent()";
1169
1170 if(m_Parameter.GetSaveMainWindowStatus())
1171 if(isFullScreen())
1172 on_actionFull_screen_F_triggered();
1173
1174 SaveOperateLasterClose();
1175
1176 foreach (auto it, m_Operates)
1177 {
1178 //TODO: Whether to save the setting
1179 emit it->sigUpdateParameters(it);
1180 it->Stop();
1181 }
1182
1183 QSettings set(RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
1184 QSettings::IniFormat);
1185 if(m_Parameter.GetSaveMainWindowStatus())
1186 {
1187 set.setValue("MainWindow/Status/Geometry", saveGeometry());
1188 set.setValue("MainWindow/Status/State", saveState());
1189
1190 m_Parameter.SetTabBar(ui->actionTabBar_B->isChecked());
1191 m_Parameter.SetMenuBar(menuBar()->isVisible());
1192 m_Parameter.SetStatusBar(statusBar()->isVisible());
1193 } else {
1194 set.remove("MainWindow/Status/Geometry");
1195 set.remove("MainWindow/Status/State");
1196 }
1197
1198 m_Manager.SaveSettings();
1199 m_Parameter.Save();
1200
1201 QMainWindow::closeEvent(event);
1202
1203 //TODO: Wait for the background thread to exit
1204 QThread::sleep(1);
1205}
1206
1207int MainWindow::LoadOperateLasterClose()
1208{
1209 if(!m_Parameter.GetOpenLasterClose())
1210 return 0;
1211
1212 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1213 + QDir::separator() + "LasterClose.dat");
1214 if(f.open(QFile::ReadOnly))
1215 {
1216 QDataStream d(&f);
1217 while(1){
1218 QString szFile;
1219 d >> szFile;
1220 if(szFile.isEmpty())
1221 break;
1222 slotOpenFile(szFile);
1223 }
1224 f.close();
1225 }
1226 return 0;
1227}
1228
1229int MainWindow::SaveOperateLasterClose()
1230{
1231 QFile f(RabbitCommon::CDir::Instance()->GetDirUserConfig()
1232 + QDir::separator() + "LasterClose.dat");
1233 f.open(QFile::WriteOnly);
1234 if(m_Parameter.GetOpenLasterClose())
1235 {
1236 QDataStream d(&f);
1237 foreach(auto it, m_Operates)
1238 {
1239 d << it->GetSettingsFile();
1240 }
1241 }
1242 f.close();
1243 return 0;
1244}
1245
1246void MainWindow::on_actionTabBar_B_toggled(bool bShow)
1247{
1248 if(m_pView)
1249 {
1250 m_pView->SetVisibleTab(bShow);
1251 m_Parameter.SetTabBar(bShow);
1252 } else {
1253 if(m_pDockActive)
1254 m_pDockActive->setVisible(bShow);
1255 }
1256}
1257
1258void MainWindow::on_actionMain_menu_bar_M_toggled(bool checked)
1259{
1260 qDebug(log) << Q_FUNC_INFO << checked;
1261 if(ui->toolBar->isHidden() && !checked)
1262 {
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))
1268 {
1269 ui->actionToolBar_T->setChecked(true);
1270 } else {
1271 ui->actionMain_menu_bar_M->setChecked(true);
1272 return;
1273 }
1274 }
1275
1276 menuBar()->setVisible(checked);
1277 m_Parameter.SetMenuBar(checked);
1278 if(checked)
1279 {
1280 ui->toolBar->removeAction(ui->actionMain_menu_bar_M);
1281 }
1282 else
1283 {
1284 ui->toolBar->insertAction(ui->actionTabBar_B,
1285 ui->actionMain_menu_bar_M);
1286 }
1287}
1288
1289void MainWindow::on_actionToolBar_T_toggled(bool checked)
1290{
1291 qDebug(log) << Q_FUNC_INFO << checked;
1292 if(menuBar()->isHidden() && !checked)
1293 {
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))
1299 {
1300 ui->actionMain_menu_bar_M->setChecked(true);
1301 } else {
1302 ui->actionToolBar_T->setChecked(true);
1303 return;
1304 }
1305 }
1306 ui->toolBar->setVisible(checked);
1307}
1308
1309void MainWindow::on_actionStatus_bar_S_toggled(bool checked)
1310{
1311 statusBar()->setVisible(checked);
1312 m_Parameter.SetStatusBar(checked);
1313}
1314
1315// [Get the widget that settings client parameters]
1316void MainWindow::on_actionSettings_triggered()
1317{
1318 CParameterDlgSettings set(&m_Parameter, m_Manager.GetSettingsWidgets(this), this);
1319 if(CParameterDlgSettings::Accepted == RC_SHOW_WINDOW(&set))
1320 {
1321 m_Manager.SaveSettings();
1322 m_Parameter.Save();
1323 }
1324}
1325// [Get the widget that settings client parameters]
1326
1327void MainWindow::slotShortCut()
1328{
1329 if(m_Parameter.GetReceiveShortCut())
1330 {
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)));
1339#else
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));
1342#endif
1343 } else {
1344 setFocusPolicy(Qt::NoFocus);
1345 ui->actionFull_screen_F->setShortcut(QKeySequence());
1346 ui->actionScreenshot->setShortcut(QKeySequence());
1347 }
1348}
1349
1350void MainWindow::on_actionOpenListRecent_triggered()
1351{
1352 CFrmListRecent* p = new CFrmListRecent(this, &m_Manager, m_Parameter, false);
1353 if(!p) return;
1354 bool check = connect(p, SIGNAL(sigStart(const QString&, bool)),
1355 this, SLOT(slotOpenFile(const QString&, bool)));
1356 Q_ASSERT(check);
1357 check = connect(p, SIGNAL(sigAddToFavorite(QString,QString,QIcon,QString)),
1358 m_pFavoriteView, SLOT(slotAddToFavorite(QString,QString,QIcon,QString)));
1359 Q_ASSERT(check);
1360
1361 QDialog d;
1362 d.resize(540, 400);
1363 d.setWindowIcon(windowIcon());
1364 d.setWindowTitle(p->windowTitle());
1365 QGridLayout* pLayout = new QGridLayout(&d);
1366 if(pLayout){
1367 pLayout->addWidget(p);
1368 check = connect(p, SIGNAL(destroyed()), &d, SLOT(reject()));
1369 d.setLayout(pLayout);
1370 }
1371 RC_SHOW_WINDOW(&d);
1372}
1373
1374void MainWindow::on_actionAdd_to_favorite_triggered()
1375{
1376 if(!m_pView || !m_pFavoriteView) return;
1377 QWidget* p = m_pView->GetCurrentView();
1378 foreach(auto c, m_Operates)
1379 {
1380 if(c->GetViewer() == p)
1381 {
1382 m_pFavoriteView->slotAddToFavorite(c->Name(), c->Description(),
1383 c->Icon(), c->GetSettingsFile());
1384 }
1385 }
1386}
1387
1388void MainWindow::dragEnterEvent(QDragEnterEvent *event)
1389{
1390 qDebug(log) << "dragEnterEvent";
1391
1392 if(event->mimeData()->hasUrls())
1393 {
1394 qWarning(log) << event->mimeData()->urls();
1395 event->acceptProposedAction();
1396 }
1397}
1398
1399void MainWindow::dragMoveEvent(QDragMoveEvent *event)
1400{
1401 //qDebug(log) << "dragMoveEvent";
1402}
1403
1404void MainWindow::dropEvent(QDropEvent *event)
1405{
1406 qDebug(log) << "dropEvent";
1407 if(!event->mimeData()->hasUrls())
1408 return;
1409 auto urls = event->mimeData()->urls();
1410 foreach(auto url, urls)
1411 {
1412 if(url.isLocalFile())
1413 slotOpenFile(url.toLocalFile());
1414 }
1415}
1416
1417void MainWindow::slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
1418{
1419 //qDebug(log) << "MainWindow::slotSystemTrayIconActivated";
1420
1421 Q_UNUSED(reason)
1422#if defined(Q_OS_ANDROID)
1423 showMaximized();
1424#else
1425 switch(reason)
1426 {
1427 case QSystemTrayIcon::Trigger:
1428 {
1429 showNormal();
1430 activateWindow();
1431 break;
1432 }
1433 default:
1434 break;
1435 }
1436#endif
1437}
1438
1439void MainWindow::slotSystemTrayIconTypeChanged()
1440{
1441 //qDebug(log) << "MainWindow::slotSystemTrayIconTypeChanged:" << m_Parameter.GetEnableSystemTrayIcon();
1442 if(!QSystemTrayIcon::isSystemTrayAvailable())
1443 {
1444 qWarning(log) << "System tray is not available";
1445 return;
1446 }
1447
1448 if(!m_Parameter.GetEnableSystemTrayIcon())
1449 {
1450 qDebug(log) << "Disable system tray icon";
1451 return;
1452 }
1453
1454 if(m_TrayIcon)
1455 m_TrayIcon.reset();
1456
1457 m_TrayIcon = QSharedPointer<QSystemTrayIcon>(new QSystemTrayIcon(this));
1458 if(QSystemTrayIcon::isSystemTrayAvailable())
1459 {
1460 bool check = connect(
1461 m_TrayIcon.data(),
1462 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
1463 this,
1464 SLOT(slotSystemTrayIconActivated(QSystemTrayIcon::ActivationReason)));
1465 Q_ASSERT(check);
1466 m_TrayIcon->setIcon(this->windowIcon());
1467 m_TrayIcon->setToolTip(windowTitle());
1468 m_TrayIcon->show();
1469 } else
1470 qWarning(log) << "System tray is not available";
1471
1472 switch (m_Parameter.GetSystemTrayIconMenuType())
1473 {
1474 case CParameterApp::SystemTrayIconMenuType::MenuBar:
1475 {
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);
1481 break;
1482 }
1483 case CParameterApp::SystemTrayIconMenuType::Operate:
1484 m_TrayIcon->setContextMenu(ui->menuOperate);
1485 break;
1486 case CParameterApp::SystemTrayIconMenuType::RecentOpen:
1487 m_TrayIcon->setContextMenu(m_pRecentMenu);
1488 break;
1489 case CParameterApp::SystemTrayIconMenuType::View:
1490 m_TrayIcon->setContextMenu(ui->menuView);
1491 break;
1492 case CParameterApp::SystemTrayIconMenuType::Tools:
1493 m_TrayIcon->setContextMenu(ui->menuTools);
1494 break;
1495 case CParameterApp::SystemTrayIconMenuType::No:
1496 m_TrayIcon->setContextMenu(nullptr);
1497 break;
1498 }
1499}
1500
1501void MainWindow::slotEnableSystemTrayIcon()
1502{
1503 //qDebug(log) << "MainWindow::slotEnableSystemTryIcon()";
1504 if(m_TrayIcon)
1505 {
1506 if(!m_Parameter.GetEnableSystemTrayIcon())
1507 m_TrayIcon.reset();
1508 } else
1509 slotSystemTrayIconTypeChanged();
1510}
List the connect of be existed.
static CICE * Instance()
Single instance.
Definition Ice.cpp:55
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
Get parameter settings widget.
Definition Manager.cpp:383
virtual int EnumPlugins(Handle *handle)
Enum plugins.
Definition Manager.cpp:409
virtual COperate * CreateOperate(const QString &id)
New COperate pointer, the owner is caller.
Definition Manager.cpp:207
virtual COperate * LoadOperate(const QString &szFile)
New COperate pointer from file, the owner is caller.
Definition Manager.cpp:268
virtual int DeleteOperate(COperate *p)
Delete COperate.
Definition Manager.cpp:235
virtual int SaveOperate(COperate *pOperate)
Accept Operate parameters to file.
Definition Manager.cpp:307
virtual int SaveSettings(const QString szFile=QString())
Save Client parameters to file.
Definition Manager.cpp:369
Operate interface.
Definition Operate.h:51
virtual int OpenDialogSettings(QWidget *parent=nullptr)
Open settings dialog.
Definition Operate.cpp:87
virtual const QIcon Icon() const
Icon.
Definition Operate.cpp:82
virtual int Start()=0
Start.
virtual QWidget * GetViewer()=0
Get Viewer.
virtual const QString Name()
Name.
Definition Operate.cpp:41
virtual int Stop()=0
Stop.
virtual const QString Description()
Description.
Definition Operate.cpp:46
void sigUpdateParameters(COperate *pOperate)
Update parameters, notify application to save or show parameters.
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get menu.
Definition Operate.cpp:107
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file.
Definition Parameter.cpp:46
Plugin interface.
Definition Plugin.h:15
virtual const QString Id()
ID. Default: Type() + ":" + Protocol() + ":" + Name()
Definition Plugin.cpp:68
virtual const QString DisplayName() const
The plugin display name.
Definition Plugin.cpp:73
virtual const QString Protocol() const =0
Plugin Protocol.
virtual const QString Description() const =0
Plugin description.
The split view class.
The CViewTable class.
Definition ViewTable.h:16
The CView class.
Definition View.h:25
virtual int AddView(QWidget *pView)=0
virtual QWidget * GetCurrentView()=0
virtual int RemoveView(QWidget *pView)=0
The MainWindow class.
Definition mainwindow.h:34
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.