Files
GUI/src/windows/MainWindow.cpp

385 lines
12 KiB
C++
Raw Normal View History

2022-06-08 17:06:38 +08:00
#include "MainWindow.h"
2022-07-13 11:34:26 +08:00
#include "ui_MainWindow.h"
2022-06-08 17:06:38 +08:00
2022-07-13 11:34:26 +08:00
#include <fstream>
2022-06-08 17:06:38 +08:00
#include <QHBoxLayout>
#include <QScrollBar>
#include <QDateTime>
#include <QGestureEvent>
#include <QDockWidget>
2023-08-31 14:26:54 +08:00
#include "InitializeWidget.h"
2023-09-11 16:29:30 +08:00
#include "ShutdownWidget.h"
2022-06-08 17:06:38 +08:00
#include "event/EventCenter.h"
#include "forms/TabFormWidget.h"
2023-08-21 11:21:35 +08:00
#include "forms/recon/ReconFormWidget.h"
2022-06-08 17:06:38 +08:00
#include "forms/select/SelectFormWidget.h"
#include "forms/scan/ScanFormWidget.h"
#include "forms/settings/SettingFormWidget.h"
2022-06-08 17:06:38 +08:00
#include "forms/TopBarWidget.h"
2022-07-20 16:45:33 +08:00
#include "dialogs/DialogManager.h"
2022-06-08 17:06:38 +08:00
#include "device/DeviceManager.h"
#include "errorhandle/GUIErrorHandle.h"
#include "LoginDialog.h"
#include "models/User.h"
#include "appvals/AppGlobalValues.h"
#include "components/UTextEdit.h"
#include "components/WarningMessageWidget.h"
2023-09-15 11:42:40 +08:00
#include "json/jsonobject.h"
2024-05-09 16:33:57 +08:00
#include "db/SQLHelper.h"
2023-09-15 11:42:40 +08:00
2022-06-08 17:06:38 +08:00
MainWindow::MainWindow(QWidget* aParent)
: QMainWindow(aParent)
, mUI(new Ui::MainWindow)
, mDebugConsoleWidget(nullptr)
, mTabWidget(new QTabWidget(this))
2023-08-31 14:26:54 +08:00
, mInitializWidget(new InitializeWidget(this))
2023-09-11 16:29:30 +08:00
, mShutdownWidget(new ShutdownWidget(nullptr))
, mTabInited(false)
2022-06-08 17:06:38 +08:00
{
mUI->setupUi(this);
this->setWindowFlags(Qt::Window);
2022-06-08 17:06:38 +08:00
initializeLayout();
2022-07-13 11:34:26 +08:00
connect(EventCenter::Default(), &EventCenter::PatientSelected, this,&MainWindow::switchToScanTab);
connect(EventCenter::Default(), &EventCenter::RequestLogin, this,&MainWindow::requestLogin, Qt::QueuedConnection);
2022-07-13 11:34:26 +08:00
connect(EventCenter::Default(), &EventCenter::LoginRoleChanged, this,&MainWindow::resetRoleLayout);
2022-06-08 17:06:38 +08:00
connect(DeviceManager::Default(), &DeviceManager::raiseGlobalError, this, &MainWindow::triggerError);
connect(DeviceManager::Default(), &DeviceManager::raiseGlobalInfo, this, &MainWindow::triggerInfo);
2022-07-13 11:34:26 +08:00
connect(EventCenter::Default(), &EventCenter::ReloadLanguage, this, &MainWindow::reloadLanguage);
2022-08-18 17:09:16 +08:00
connect(EventCenter::Default(), &EventCenter::RequestScreenSaver, this, &MainWindow::requestScreenSaver);
2023-08-31 14:26:54 +08:00
connect(DeviceManager::Default(), &DeviceManager::initializeFinished, this, &MainWindow::requestLogin);
connect(DeviceManager::Default(), &DeviceManager::initializeProgress, mInitializWidget, &InitializeWidget::setMessage);
2023-09-11 16:29:30 +08:00
connect(DeviceManager::Default(), &DeviceManager::shutdownDmsSended, this, &MainWindow::showShutdownWidget);
connect(DeviceManager::Default(), &DeviceManager::shutdownDmsFailed, this, &MainWindow::processShutdownDmsFailed);
2023-11-21 15:09:23 +08:00
2023-11-16 13:41:04 +08:00
connect(EventCenter::Default(), &EventCenter::LoginSuccess, this, [this]()
2023-08-31 14:26:54 +08:00
{
mInitializWidget->setVisible(false);
});
2023-11-16 14:46:36 +08:00
connect(EventCenter::Default(), &EventCenter::UserVerificationSuccess, this, [this]()
{
if(!mTabInited){
mTabInited = true;
initializeTabWidget();
mTabWidget->setCurrentIndex(0);
}
2023-08-31 14:26:54 +08:00
mTabWidget->setVisible(true);
2023-11-16 14:46:36 +08:00
this->update();
2023-11-21 13:39:52 +08:00
QApplication::processEvents();
2022-07-13 11:34:26 +08:00
});
2024-04-01 16:02:40 +08:00
2024-05-09 16:33:57 +08:00
connect(EventCenter::Default(), &EventCenter::LoginSuccess, this,&MainWindow::checkEmptyScanValidity);
connect(EventCenter::Default(), &EventCenter::EmptyScanFinished, this,&MainWindow::enableAllTabWidget);
connect(EventCenter::Default(), &EventCenter::EmptyScanDataCorrupted, this, &MainWindow::handleEmptyScanDataCorrupted);
2024-05-09 16:33:57 +08:00
2024-04-01 16:02:40 +08:00
connect(mTabWidget, &QTabWidget::currentChanged, this, [this](int aIndex)
{
if(aIndex == 0)
2024-04-01 16:02:40 +08:00
{
mTabWidget->widget(0)->setFocus();
2024-04-01 16:02:40 +08:00
}
});
2024-05-24 13:49:54 +08:00
connect(DeviceManager::Default(), &DeviceManager::startAutoLocateResult, [this](bool aIsSucceed)
{
if(aIsSucceed)
{
for(int i=0; i<mTabWidget->count(); ++i)
{
if(i != mTabWidget->currentIndex())
{
mTabWidget->setTabEnabled(i, false);
}
}
}
});
connect(EventCenter::Default(), &EventCenter::StopScanProcess, this, [this]()
{
for(int i=0; i<mTabWidget->count(); ++i)
{
if(i != mTabWidget->currentIndex())
{
mTabWidget->setTabEnabled(i, true);
}
}
});
2023-08-31 14:26:54 +08:00
GUIErrorHandle::Default()->init();
2022-07-20 16:45:33 +08:00
QApplication::setActiveWindow(centralWidget());
2022-06-08 17:06:38 +08:00
}
MainWindow::~MainWindow()
{
delete mUI;
2023-09-11 16:29:30 +08:00
delete mShutdownWidget;
2022-06-08 17:06:38 +08:00
}
2022-07-13 11:34:26 +08:00
//------Layout-----------------------------------------------------------------
2022-06-08 17:06:38 +08:00
void MainWindow::loadStyleSheet(const QString& aSheetName)
{
2022-07-19 14:15:00 +08:00
// QFile file(":/stylesheet/" + aSheetName + ".css");
// file.open(QFile::ReadOnly);
// if (file.isOpen())
// {
// QString styleSheet = this->styleSheet();
// styleSheet += QLatin1String(file.readAll());
// this->setStyleSheet(styleSheet);
// }
2022-06-08 17:06:38 +08:00
}
2022-07-13 11:34:26 +08:00
void MainWindow::initializeLayout()
2022-06-08 17:06:38 +08:00
{
auto layout = new QVBoxLayout(mUI->mCentralWidget);
2022-07-13 11:34:26 +08:00
layout->setMargin(0);
layout->setSpacing(0);
TopBarWidget* topBarWidget = new TopBarWidget(this);
auto popNotifications = new WarningMessageWidget(this);
popNotifications->hide();
connect(topBarWidget,&TopBarWidget::warnBtnClicked,[=](){
auto pos = topBarWidget->mapToGlobal(QPoint(topBarWidget->width(),topBarWidget->height()));
popNotifications->setPopupArgs(height(),pos.x(),pos.y());
popNotifications->show();
});
2022-07-13 11:34:26 +08:00
layout->addWidget(topBarWidget);
layout->addWidget(mTabWidget);
2023-08-31 14:26:54 +08:00
layout->addWidget(mInitializWidget);
mTabWidget->setVisible(false);
2023-09-11 16:29:30 +08:00
mShutdownWidget->setVisible(false);
2022-06-08 17:06:38 +08:00
}
2024-05-09 16:33:57 +08:00
void MainWindow::checkEmptyScanValidity()
{
QDate lastScanDate = SQLHelper::queryValue("SELECT ScanDateTime FROM EScan ORDER BY ScanDateTime DESC LIMIT 1").toDate();
QDate expirationScanDate = lastScanDate.addMonths(1);
QDate currentDate = QDate::currentDate();
if(currentDate.daysTo(expirationScanDate) < 0)
{
mTabWidget->setTabEnabled(0, false);
mTabWidget->setTabEnabled(1, false);
mTabWidget->setTabEnabled(2, false);
mTabWidget->setCurrentIndex(3);
DialogManager::Default()->requestAlertMessage(tr("Please execute the empty scan, assist with system calibration, when empty scan is completed, the system should operate normally."), OkOnly, tr("Warning"));
return;
}
if(currentDate.daysTo(expirationScanDate) < 3)
{
DialogManager::Default()->requestAlertMessage(tr("There are %1 days left until the next empty scan. Please remind users to conduct the empty scan in time.").arg(currentDate.daysTo(expirationScanDate) + 1), OkOnly, tr("Warning"));
return;
}
}
2022-07-13 11:34:26 +08:00
void MainWindow::initializeTabWidget()
2022-06-08 17:06:38 +08:00
{
2022-07-13 11:34:26 +08:00
mTabWidget->setTabPosition(QTabWidget::South);
mTabWidget->setContentsMargins(0, 0, 0, 0);
2024-05-24 13:49:54 +08:00
auto* systemForm = new SettingFormWidget(this);
mTabWidget->insertTab(0 ,systemForm, tr("Settings"));
2023-08-21 11:21:35 +08:00
auto verifyForm = new ReconFormWidget(this);
mTabWidget->insertTab(0,verifyForm, tr("Recon"));
auto selectForm = new SelectFormWidget(this);
mTabWidget->insertTab(0,selectForm, tr("Select"));
auto scanForm = new ScanFormWidget(this);
mTabWidget->insertTab(0,scanForm, tr("Scan"));
2022-07-13 11:34:26 +08:00
mTabWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
2024-05-09 16:33:57 +08:00
2022-07-13 11:34:26 +08:00
}
2022-06-08 17:06:38 +08:00
2022-07-13 11:34:26 +08:00
void MainWindow::reloadLanguage() {
mTabWidget->setTabText(0, tr("Scan"));
mTabWidget->setTabText(1, tr("Select"));
mTabWidget->setTabText(2, tr("Recon"));
2022-07-13 11:34:26 +08:00
mTabWidget->setTabText(3, tr("Settings"));
2022-06-08 17:06:38 +08:00
}
2023-09-11 16:29:30 +08:00
void MainWindow::showShutdownWidget()
{
mShutdownWidget->setVisible(true);
}
void MainWindow::processShutdownDmsFailed()
{
mShutdownWidget->setVisible(false);
triggerError(tr("Shut down failed, please push emergency button to shutdown."));
}
2023-09-15 11:42:40 +08:00
void MainWindow::switchToScanTab(QObject* sender, QObject* data) {
if (data)mTabWidget->setCurrentIndex(0);
2023-09-15 11:42:40 +08:00
}
2022-07-13 11:34:26 +08:00
void MainWindow::centerWidgetHide()
2022-06-08 17:06:38 +08:00
{
2022-07-13 11:34:26 +08:00
mUI->mCentralWidget->setVisible(false);
2022-06-08 17:06:38 +08:00
}
2022-07-13 11:34:26 +08:00
void MainWindow::centerWidgetShow()
2022-06-08 17:06:38 +08:00
{
2022-07-13 11:34:26 +08:00
mUI->mCentralWidget->setVisible(true);
2022-06-08 17:06:38 +08:00
}
void MainWindow::triggerError(const QString& aMessage)
{
QString message(aMessage);
EventCenter::Default()->triggerEvent(GUIErrorRaise, nullptr, (QObject*)&message);
}
void MainWindow::triggerInfo(const QPair<QString, unsigned int>& aInfoData)
{
QPair<QString, unsigned int> infoData = aInfoData;
EventCenter::Default()->triggerEvent(DeviceInfoRaise, nullptr, (QObject*)&infoData);
}
2022-07-13 11:34:26 +08:00
//------events-----------------------------------------------------------------
2022-06-08 17:06:38 +08:00
//! [event handler]
bool MainWindow::event(QEvent* aEvent)
{
if (aEvent->type() == QEvent::Gesture)
{
return gestureEvent(static_cast<QGestureEvent*>(aEvent));
}
return QMainWindow::event(aEvent);
2022-06-08 17:06:38 +08:00
}
2022-07-13 11:34:26 +08:00
void MainWindow::changeEvent(QEvent* aEvent)
{
if (aEvent->type() == QEvent::LanguageChange)
{
mUI->retranslateUi(this);
}
QWidget::changeEvent(aEvent);
}
2022-07-13 11:34:26 +08:00
void MainWindow::keyPressEvent(QKeyEvent *event) {
if (event->modifiers()==Qt::ControlModifier &&event->key()==Qt::Key_R){
QFile file("D:\\workdir\\GUI\\src\\stylesheet\\Dark2.css");
file.open(QFile::ReadOnly);
if (file.isOpen())
{
QString styleSheet = this->styleSheet();
styleSheet += QLatin1String(file.readAll());
this->setStyleSheet(styleSheet);
}
this->update();
}
QWidget::keyPressEvent(event);
}
2022-06-08 17:06:38 +08:00
bool MainWindow::gestureEvent(QGestureEvent* aGestureEvent)
{
if (QGesture* swipe = aGestureEvent->gesture(Qt::SwipeGesture))
{
swipeTriggered(static_cast<QSwipeGesture*>(swipe));
}
if (QGesture* pan = aGestureEvent->gesture(Qt::PanGesture))
{
panTriggered(static_cast<QPanGesture*>(pan));
}
return true;
}
2022-07-13 11:34:26 +08:00
void MainWindow::grabGestures(const QList<Qt::GestureType>& aGestures)
{
//! [enable gestures]
foreach(Qt::GestureType gesture, aGestures)
{
grabGesture(gesture);
}
//! [enable gestures]
}
2022-06-08 17:06:38 +08:00
void MainWindow::panTriggered(QPanGesture* aPanGesture)
{
if (aPanGesture->state() == Qt::GestureFinished)
{
QPointF delta = aPanGesture->offset();
int index = mTabWidget->currentIndex();
if (delta.x() > 50)
{
index--;
if (index >= 0)
{
mTabWidget->setCurrentIndex(index);
}
}
if (delta.x() < -50)
{
index++;
if (index < mTabWidget->count())
{
mTabWidget->setCurrentIndex(index);
}
}
}
}
void MainWindow::swipeTriggered(QSwipeGesture* aSwipeGesture)
{
if (aSwipeGesture->state() == Qt::GestureFinished)
{
}
}
2022-07-12 16:13:09 +08:00
2022-07-13 11:34:26 +08:00
//------actions & slots--------------------------------------------------------
void MainWindow::requestLogin()
{
DialogManager::Default()->requestLogin(this);
2022-07-19 14:15:00 +08:00
QApplication::setActiveWindow(centralWidget());
2022-07-13 11:34:26 +08:00
}
2022-07-12 16:13:09 +08:00
2022-08-18 17:09:16 +08:00
void MainWindow::requestScreenSaver()
{
DialogManager::Default()->requestScreenSaverPlay();
}
void MainWindow::resetRoleLayout() {
2024-05-24 13:49:54 +08:00
SettingFormWidget* settingWidget = dynamic_cast<SettingFormWidget*>(mTabWidget->widget(3));
if(settingWidget == nullptr)
{
return;
}
if (User::Current()->isAdmin())
{
2024-05-24 13:49:54 +08:00
settingWidget->showAdminArea();
}
else
{
2024-05-24 13:49:54 +08:00
settingWidget->hideAdminArea();
}
}
2024-05-09 16:33:57 +08:00
void MainWindow::enableAllTabWidget()
{
for(int i=0; i<mTabWidget->count(); ++i)
{
mTabWidget->setTabEnabled(i, true);
}
}
void MainWindow::handleEmptyScanDataCorrupted()
{
mTabWidget->setTabEnabled(0, false);
mTabWidget->setTabEnabled(1, false);
mTabWidget->setTabEnabled(2, false);
mTabWidget->setCurrentIndex(3);
DialogManager::Default()->requestAlertMessage(tr("Due to empty scan data corruption on the server, needs to be execute the empty scan. No other operations can be conducted until the scan is complete."), OkOnly, tr("Warning"));
}