Files
GUI/src/dialogs/DialogManager.cpp

468 lines
14 KiB
C++
Raw Normal View History

2022-07-19 14:15:00 +08:00
//
// Created by Krad on 2022/7/19.
//
#include "DialogManager.h"
#include <QApplication>
2022-07-28 16:27:51 +08:00
#include <QDebug>
2022-07-19 14:15:00 +08:00
#include "event/EventCenter.h"
#include "dialogs/GUIMessageDialog.h"
2022-07-20 16:45:33 +08:00
#include "dialogs/ChangePasswordFormDialog.h"
#include "dialogs/AccountFormDialog.h"
2022-07-28 16:27:51 +08:00
#include "dialogs/MultyMessageDialogManager.h"
#include "dialogs/EditPatientDialog.h"
#include "dialogs/AlertDialog.h"
#include "dialogs/DateSelectDialog.h"
#include "dialogs/SelectDialog.h"
#include "network/DicomCfgDialog.h"
#include "network/GetAdminPsw.h"
#include "network/NetworkCfgDialog.h"
#include "network/GetIPDialog.h"
#include "network/GetRouteDialog.h"
2022-07-20 16:45:33 +08:00
#include "windows/LoginDialog.h"
2022-08-18 17:09:16 +08:00
#include "screensaver/ScreenSaverWindow.h"
#include "appvals/AppGlobalValues.h"
#include "json/jsonobject.h"
2022-07-28 16:27:51 +08:00
#include "shimlib/ShimLib.h"
2022-07-20 16:45:33 +08:00
namespace
2022-07-28 16:27:51 +08:00
{
const int GUIMESSAGEDIALOG_OFFSET = 30;
2022-07-28 16:27:51 +08:00
}
2022-07-20 16:45:33 +08:00
DialogManager::DialogManager()
: QObject()
, mFunctionDialog(nullptr)
2022-08-18 17:09:16 +08:00
, mScreenSaverWindow(nullptr)
, mOperationMessageDialog(nullptr)
, mSyncDialog(nullptr)
2022-07-28 16:27:51 +08:00
, mTopWidget(nullptr)
2022-07-20 16:45:33 +08:00
{
}
2022-07-19 14:15:00 +08:00
2022-07-28 16:27:51 +08:00
void DialogManager::init(QWidget* aParent) {
2022-07-19 14:15:00 +08:00
connect(EventCenter::Default(), &EventCenter::DeviceErrorRaise,this,&DialogManager::raiseDeviceError);
connect(EventCenter::Default(), &EventCenter::DeviceInfoRaise,this,&DialogManager::raiseDeviceInfo);
2022-07-19 14:15:00 +08:00
connect(EventCenter::Default(), &EventCenter::InvokeOperationStart,this,&DialogManager::invokeOperationStart);
connect(EventCenter::Default(), &EventCenter::InvokeOperationProgress,this,&DialogManager::invokeOperationProgress);
connect(EventCenter::Default(), &EventCenter::InvokeOperationPending,this,&DialogManager::invokeOperationPending);
connect(EventCenter::Default(), &EventCenter::InvokeOperationEnd,this,&DialogManager::invokeOperationEnd);
2022-07-28 16:27:51 +08:00
MultyMessageDialogManager::getInstance()->setDialogParent(aParent);
mTopWidget = aParent;
2022-08-18 17:09:16 +08:00
mScreenSaverWindow = new ScreenSaverWindow();
2022-07-19 14:15:00 +08:00
}
2022-07-21 10:39:24 +08:00
//得考虑多线程的问题
void DialogManager::setTopWidget(QWidget* widget) {
2022-07-28 16:27:51 +08:00
std::lock_guard<std::mutex> lockGuard(mMutex);
if (nullptr == widget)
{
return;
}
qDebug()<<"last top:"<<mTopWidget<<", new top:"<<widget;
2022-07-28 16:27:51 +08:00
mTopWidget = widget;
2022-07-21 10:39:24 +08:00
++mDialogCount;
}
void DialogManager::releaseTopWidget(QWidget* expectedTopWidget) {
2022-07-28 16:27:51 +08:00
std::lock_guard<std::mutex> lockGuard(mMutex);
if (nullptr == expectedTopWidget)
{
return;
}
if (mTopWidget == expectedTopWidget){
mTopWidget = expectedTopWidget->parentWidget();
--mDialogCount;
2022-07-21 10:39:24 +08:00
}
2022-07-19 14:15:00 +08:00
}
void DialogManager::requestLogin(QWidget* aParent)
2022-07-20 16:45:33 +08:00
{
//Login 直接最顶层模态
if (!mFunctionDialog){
mFunctionDialog = new LoginDialog(aParent);
2022-07-20 16:45:33 +08:00
}
2022-08-18 17:09:16 +08:00
setTopWidget(mFunctionDialog);
2022-07-21 10:39:24 +08:00
mFunctionDialog->setWindowModality(Qt::WindowModal);
2022-07-20 16:45:33 +08:00
mFunctionDialog->exec();
while (QDialog::Accepted != mFunctionDialog->result())
{
mFunctionDialog->exec();
}
2022-08-18 17:09:16 +08:00
releaseTopWidget(mFunctionDialog);
}
void DialogManager::requestScreenSaverPlay()
{
setFocusToTopDialog();
mScreenSaverWindow->play();
}
void DialogManager::requestScreenSaverStop(bool aIsStopLocker)
{
mScreenSaverWindow->stop(aIsStopLocker);
2022-07-20 16:45:33 +08:00
}
int DialogManager::requestAddAccount(QSqlTableModel* model) {
AccountFormDialog dialog(mTopWidget, New);
2022-07-21 10:39:24 +08:00
setTopWidget(&dialog);
2022-07-20 16:45:33 +08:00
dialog.setWindowModality(Qt::WindowModal);
dialog.setReferenceModel(model);
int ret = dialog.exec();
2022-07-21 10:39:24 +08:00
releaseTopWidget(&dialog);
2022-07-20 16:45:33 +08:00
return ret;
}
int DialogManager::requestEditSelfAccount() {
AccountFormDialog dialog(mTopWidget, Self);
2022-07-21 10:39:24 +08:00
setTopWidget(&dialog);
2022-07-20 16:45:33 +08:00
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
2022-07-21 10:39:24 +08:00
releaseTopWidget(&dialog);
2022-07-20 16:45:33 +08:00
return ret;
}
int DialogManager::requestEditAdminAccount(const QMap<QString, QVariant>& values) {
AccountFormDialog dialog(mTopWidget, Admin);
2022-07-21 10:39:24 +08:00
setTopWidget(&dialog);
2022-07-20 16:45:33 +08:00
dialog.setAccountInformation(values);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
2022-07-21 10:39:24 +08:00
releaseTopWidget(&dialog);
2022-07-20 16:45:33 +08:00
return ret;
}
void DialogManager::requestChangePassword() {
ChangePasswordFormDialog dialog(mTopWidget);
2022-07-21 10:39:24 +08:00
setTopWidget(&dialog);
dialog.setGeometry(dialog.parentWidget()->geometry());
2022-07-20 16:45:33 +08:00
dialog.setWindowModality(Qt::WindowModal);
dialog.exec();
2022-07-21 10:39:24 +08:00
releaseTopWidget(&dialog);
2022-07-20 16:45:33 +08:00
}
int DialogManager::requestEditPatientInfo(PatientInformation* aPatientFrom, QSqlTableModel* aModel)
{
EditPatientDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
dialog.setPatientInformation(aPatientFrom);
dialog.setModel(aModel);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return ret;
}
int DialogManager::requestAlertMessage(const QString& aMessage, DialogButtonMode aButtonMode, const QString& aTitle)
{
AlertDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setAlertMessage(aMessage);
if (!aTitle.isEmpty())
{
dialog.setTitle(aTitle);
}
dialog.setButtonMode(aButtonMode);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return ret;
}
DialogResult DialogManager::requestSelectDate(const QString& aDate)
{
DateSelectDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setSelectedValue(aDate);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return DialogResult(ret,dialog.getSelectedValue());
}
DialogResult DialogManager::requestSelectLanguage()
{
SelectDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
dialog.setValues(JsonObject::Instance()->language());
dialog.setSelectedValue(JsonObject::Instance()->defaultLanguage());
int ret = dialog.exec();
releaseTopWidget(&dialog);
return DialogResult(ret,dialog.getSelectedValue());
}
DialogResult DialogManager::requestSelectProtocal()
{
SelectDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
dialog.setValues(JsonObject::Instance()->protocals());
dialog.setSelectedValue(JsonObject::Instance()->defaultProtocal());
int ret = dialog.exec();
releaseTopWidget(&dialog);
return DialogResult(ret,dialog.getSelectedValue());
}
DialogResult DialogManager::requestSelectFilter()
{
SelectDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
dialog.setValues(JsonObject::Instance()->worklistFilters());
dialog.setSelectedValue(JsonObject::Instance()->defaultFilter());
int ret = dialog.exec();
releaseTopWidget(&dialog);
return DialogResult(ret,dialog.getSelectedValue());
}
int DialogManager::requestEditDicomConfig()
{
DicomCfgDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return ret;
}
int DialogManager::requestInputAdminPasswd()
{
GetAdminPsw dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return ret;
}
int DialogManager::requestEditNetworkConfig()
{
NetworkCfgDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return ret;
}
DialogResult DialogManager::requestEditIpAndNetMask()
{
GetIPDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return DialogResult(ret,dialog.getList());
}
DialogResult DialogManager::requestEditIpAndNetMask(const QStringList& aEditData)
{
GetIPDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
dialog.setList(aEditData);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return DialogResult(ret,dialog.getList());
}
DialogResult DialogManager::requestEditRouteInfo()
{
GetRouteDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return DialogResult(ret,dialog.getList());
}
DialogResult DialogManager::requestEditRouteInfo(const QStringList& aEditData)
{
GetRouteDialog dialog(mTopWidget);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
dialog.setList(aEditData);
int ret = dialog.exec();
releaseTopWidget(&dialog);
return DialogResult(ret,dialog.getList());
}
void DialogManager::raiseDeviceInfo(QObject* parent, QObject* aInfoData)
{
QPair<QString, unsigned int>* infoData = (QPair<QString, unsigned int>*)(aInfoData);
raiseMultyMessageDialog(infoData->first,MessageLevel(infoData->second));
}
2022-07-20 16:45:33 +08:00
//考虑以后使用另外的dialog显示错误
2022-07-19 14:15:00 +08:00
void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) {
2022-07-20 16:45:33 +08:00
clearMessageDialog();
auto dialog = new GUIMessageDialog(mTopWidget);
if (nullptr != mTopWidget && mTopWidget->inherits("GUIMessageDialog"))
{
GUIMessageDialog* parent = qobject_cast<GUIMessageDialog*>(mTopWidget);
if (parent->getDialogPos().y() + 320 + GUIMESSAGEDIALOG_OFFSET < 1080)
{
dialog->moveDialog(parent->getDialogPos() + QPoint(GUIMESSAGEDIALOG_OFFSET, GUIMESSAGEDIALOG_OFFSET));
}
}
2022-07-21 10:39:24 +08:00
2022-07-20 16:45:33 +08:00
if (msg) {
QString *str = (QString *) msg;
2022-07-19 14:15:00 +08:00
dialog->showMessage(*str);
2022-07-20 16:45:33 +08:00
} else {
2022-07-19 14:15:00 +08:00
dialog->showMessage("Something went error!");
}
dialog->stopLoading();
dialog->showExitButton();
2022-07-21 10:39:24 +08:00
setTopWidget(dialog);
dialog->setWindowModality(Qt::WindowModal);
2022-08-18 17:09:16 +08:00
mScreenSaverWindow->stop(true);
2022-07-28 16:27:51 +08:00
dialog->showFullScreen ();
2022-07-20 16:45:33 +08:00
dialog->exec();
2022-07-21 10:39:24 +08:00
releaseTopWidget(dialog);
dialog->deleteLater();
2022-08-18 17:09:16 +08:00
mScreenSaverWindow->startLocker();
2022-07-19 14:15:00 +08:00
}
2022-07-20 16:45:33 +08:00
// 扫描过程 dialog 只能为最底层并且会被error dialog 清除!
2022-07-19 14:15:00 +08:00
void DialogManager::invokeOperationStart(QObject *parent, QObject *msg) {
2022-07-20 16:45:33 +08:00
//没有目标parent 撤销操作
if (!QApplication::activeWindow()) return;
//只能在最底层窗口上模态
2022-07-21 10:39:24 +08:00
if (mDialogCount>0) return;
2022-07-20 16:45:33 +08:00
clearMessageDialog();
mOperationMessageDialog = new GUIMessageDialog(QApplication::activeWindow());
2022-07-19 14:15:00 +08:00
if (msg)
{
QString* str = (QString*)msg;
mOperationMessageDialog->showMessage(*str);
2022-07-19 14:15:00 +08:00
}
else
{
mOperationMessageDialog->hideMessage();
2022-07-19 14:15:00 +08:00
}
mOperationMessageDialog->hideExitButton();
mOperationMessageDialog->startLoading();
2022-07-19 14:15:00 +08:00
AppGlobalValues::setInProcessing(true);
if (mOperationMessageDialog->isHidden())
2022-07-19 14:15:00 +08:00
{
mOperationMessageDialog->showFullScreen();
mOperationMessageDialog->exec();
2022-07-19 14:15:00 +08:00
}
}
void DialogManager::invokeOperationProgress(QObject *parent, QObject *msg) {
2022-07-20 16:45:33 +08:00
//窗口不存在,撤销操作
if (!mOperationMessageDialog) return;
2022-07-19 14:15:00 +08:00
if (msg)
{
QVariant* var = (QVariant*)msg;
if (mOperationMessageDialog->Pending())
2022-07-19 14:15:00 +08:00
{
mOperationMessageDialog->stopPending();
2022-07-19 14:15:00 +08:00
}
mOperationMessageDialog->showMessage(var->toString());
2022-07-19 14:15:00 +08:00
}
else
{
mOperationMessageDialog->hideMessage();
2022-07-19 14:15:00 +08:00
}
if (mOperationMessageDialog->isHidden())
2022-07-19 14:15:00 +08:00
{
mOperationMessageDialog->showFullScreen();
mOperationMessageDialog->exec();
2022-07-19 14:15:00 +08:00
}
}
void DialogManager::invokeOperationPending(QObject *parent, QObject *msg) {
2022-07-20 16:45:33 +08:00
//窗口不存在,撤销操作
if (!mOperationMessageDialog) return;
if (!mOperationMessageDialog->Pending())
2022-07-19 14:15:00 +08:00
{
mOperationMessageDialog->startPending();
2022-07-19 14:15:00 +08:00
QVariant* var = (QVariant*)msg;
mOperationMessageDialog->showMessage(var->toString());
2022-07-19 14:15:00 +08:00
}
}
void DialogManager::invokeOperationEnd(QObject *parent, QObject *msg) {
2022-07-20 16:45:33 +08:00
//窗口不存在,撤销操作
if (!mOperationMessageDialog) return;
if (!mOperationMessageDialog->isHidden())
2022-07-19 14:15:00 +08:00
{
if (msg && ((QVariant*)msg)->toBool())
{
mOperationMessageDialog->stopLoading();
mOperationMessageDialog->showMessage("Scan completed!");
mOperationMessageDialog->showExitButton();
mOperationMessageDialog->setWindowModality(Qt::WindowModal);
mOperationMessageDialog->showFullScreen();
mOperationMessageDialog->exec();
2022-07-19 14:15:00 +08:00
}
else
{
mOperationMessageDialog->accept();
2022-07-19 14:15:00 +08:00
}
delete mOperationMessageDialog;
2022-07-19 14:15:00 +08:00
AppGlobalValues::setInProcessing(false);
}
}
2022-07-20 16:45:33 +08:00
void DialogManager::clearMessageDialog() {
if (mOperationMessageDialog)
{
releaseTopWidget(mOperationMessageDialog);
delete mOperationMessageDialog;
2022-07-20 16:45:33 +08:00
}
}
DialogManager::~DialogManager() {
clearMessageDialog();
2022-08-18 17:09:16 +08:00
delete mScreenSaverWindow;
2022-07-20 16:45:33 +08:00
}
2022-07-28 16:27:51 +08:00
void DialogManager::raiseMultyMessageDialog(const QString& aMessage, MessageLevel aMessageLevel)
2022-07-28 16:27:51 +08:00
{
MultyMessageDialogManager::getInstance()->raiseDialog(aMessage, aMessageLevel);
}
void DialogManager::raiseSyncDialog(const QString& aMessage)
{
if (!mSyncDialog)
{
mSyncDialog = new GUIMessageDialog(mTopWidget);
}
mSyncDialog->showMessage(aMessage);
setTopWidget(mSyncDialog);
mSyncDialog->setWindowModality(Qt::WindowModal);
mSyncDialog->showFullScreen ();
mSyncDialog->exec();
releaseTopWidget(mSyncDialog);
delete mSyncDialog;
}
void DialogManager::hideTopSyncDialog()
{
if (mSyncDialog)
{
mSyncDialog->accept();
}
}
void DialogManager::setFocusToTopDialog()
{
if (0 < mDialogCount && nullptr != mTopWidget)
{
mTopWidget->setFocus();
}
}