#include "DialogManager.h" #include #include #include "event/EventCenter.h" #include "dialogs/GUIMessageDialog.h" #include "dialogs/ChangePasswordFormDialog.h" #include "dialogs/AccountFormDialog.h" #include "dialogs/MultyMessageDialogManager.h" #include "dialogs/EditPatientDialog.h" #include "dialogs/AlertDialog.h" #include "dialogs/DateSelectDialog.h" #include "dialogs/TimeSelectDialog.h" #include "dialogs/SelectDialog.h" #include "dialogs/GetWorkListDialog.h" #include "dialogs/PatientConfirmDialog.h" #include "dialogs/AdminSPwdDialog.h" #include "dialogs/WorklistSettingsDialog.h" #include "dialogs/PacsSettingsDialog.h" #include "dialogs/ReconSettingsDialog.h" #include "dialogs/IpSettingsDialog.h" #include "dialogs/MppsSettingsDialog.h" #include "dialogs/StartScanProcessDialog.h" #include "network/DicomCfgDialog.h" #include "network/GetAdminPsw.h" #include "network/NetworkCfgDialog.h" #include "network/GetIPDialog.h" #include "network/GetRouteDialog.h" #include "dicom/WorkListManager.h" #include "windows/LoginDialog.h" #include "screensaver/ScreenSaverWindow.h" #include "appvals/AppGlobalValues.h" #include "json/jsonobject.h" //#include "shimlib/ShimLib.h" namespace { const int GUIMESSAGEDIALOG_OFFSET = 30; } DialogManager::DialogManager() : QObject() , mFunctionDialog(nullptr) , mScreenSaverWindow(nullptr) , mOperationMessageDialog(nullptr) , mSyncDialog(nullptr) , mTopWidget(nullptr) , mGetWorkListDialog(nullptr) { } void DialogManager::init(QWidget* aParent) { connect(EventCenter::Default(), &EventCenter::DeviceErrorRaise,this,&DialogManager::raiseDeviceError); connect(EventCenter::Default(), &EventCenter::DeviceInfoRaise,this,&DialogManager::raiseDeviceInfo); 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); connect(EventCenter::Default(), &EventCenter::InputWorkListSearchValue,this,&DialogManager::receiveWorkListInput); MultyMessageDialogManager::getInstance()->setDialogParent(aParent); mTopWidget = aParent; mScreenSaverWindow = new ScreenSaverWindow(); } //得考虑多线程的问题 void DialogManager::setTopWidget(QWidget* widget) { std::lock_guard lockGuard(mMutex); if (nullptr == widget) { return; } qDebug()<<"last top:"< lockGuard(mMutex); if (nullptr == expectedTopWidget) { return; } if (mTopWidget == expectedTopWidget){ mTopWidget = expectedTopWidget->parentWidget(); --mDialogCount; } } void DialogManager::requestLogin(QWidget* aParent) { //Login 直接最顶层模态 if (!mFunctionDialog){ mFunctionDialog = new LoginDialog(aParent); connect(mFunctionDialog, &LoginDialog::loginDialogShown, this, &DialogManager::loginDialogShown, Qt::QueuedConnection); } if(mFunctionDialog->isRunning()) { return; } setTopWidget(mFunctionDialog); mFunctionDialog->setWindowModality(Qt::WindowModal); mFunctionDialog->exec(); while (QDialog::Accepted != mFunctionDialog->result()) { mFunctionDialog->exec(); } releaseTopWidget(mFunctionDialog); } void DialogManager::requestScreenSaverPlay() { setFocusToTopDialog(); mScreenSaverWindow->play(); } void DialogManager::requestScreenSaverStop(bool aIsStopLocker) { mScreenSaverWindow->stop(aIsStopLocker); } DialogResult DialogManager::requestResetAdminPwd() { AdminSPwdDialog dialog(mTopWidget); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return DialogResult(ret, dialog.getNewPwd()); } int DialogManager::requestAddAccount(QSqlTableModel* model) { AccountFormDialog dialog(mTopWidget, New); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); dialog.setReferenceModel(model); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } int DialogManager::requestEditSelfAccount() { AccountFormDialog dialog(mTopWidget, Self); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } int DialogManager::requestEditAdminAccount(const QMap& values) { AccountFormDialog dialog(mTopWidget, Admin); setTopWidget(&dialog); dialog.setAccountInformation(values); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } void DialogManager::requestChangePassword() { ChangePasswordFormDialog dialog(mTopWidget); setTopWidget(&dialog); dialog.setGeometry(dialog.parentWidget()->geometry()); dialog.setWindowModality(Qt::WindowModal); dialog.exec(); releaseTopWidget(&dialog); } 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); if(dialog.parentWidget()->inherits("LoginDialog")) { dialog.setWindowFlags(dialog.windowFlags() | Qt::WindowStaysOnTopHint | Qt::BypassWindowManagerHint ); } 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::requestSelectTime(const int& aSeconds) { TimeSelectDialog dialog(mTopWidget); setTopWidget(&dialog); dialog.setSelectedValue(aSeconds); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return DialogResult(ret, dialog.getTotalSeconds()); } 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()); } DialogResult DialogManager::requestSelectLockScreenTime() { SelectDialog dialog(mTopWidget); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); dialog.setValues(JsonObject::Instance()->lockScreenTimes()); dialog.setSelectedValue(JsonObject::Instance()->defaultLockScreenTime()); 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::requestWorklistSettings() { WorklistSettingsDialog dialog(mTopWidget); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } int DialogManager::requestPacsSettings() { PacsSettingsDialog dialog(mTopWidget); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } int DialogManager::requestReconSettings() { ReconSettingsDialog dialog(mTopWidget); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } int DialogManager::requestMppsSettings() { MppsSettingsDialog dialog(mTopWidget); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } DialogResult DialogManager::requestInputAdminPasswd() { GetAdminPsw dialog(mTopWidget); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return DialogResult(ret, dialog.getPsw()); } int DialogManager::requestEditNetworkConfig() { // NetworkCfgDialog dialog(mTopWidget); // setTopWidget(&dialog); // dialog.setWindowModality(Qt::WindowModal); // int ret = dialog.exec(); // releaseTopWidget(&dialog); // return ret; IpSettingsDialog 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()); } DialogResult DialogManager::reuqestConfirmStartScan(PatientInformation* aPatient) { StartScanProcessDialog dialog(mTopWidget); dialog.setPatientDetailForm(aPatient); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal);; int ret = dialog.exec(); releaseTopWidget(&dialog); return DialogResult(ret,QVariant("")); } int DialogManager::requestPatientConfirm(PatientInformation* patientInf, int type) { PatientConfirmDialog dialog(mTopWidget); setTopWidget(&dialog); dialog.setPatientInformation(patientInf, type); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } int DialogManager::requestGetWorkList() { GetWorkListDialog dialog(WorkListManager::getInstance()->getTableModel(), WorkListManager::getInstance()->getTableView(), mTopWidget); mGetWorkListDialog = &dialog; setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); mGetWorkListDialog = nullptr; return ret; } int DialogManager::requestGetWorkList(const QString& aInputValue) { GetWorkListDialog dialog(WorkListManager::getInstance()->getTableModel(), WorkListManager::getInstance()->getTableView(), mTopWidget); mGetWorkListDialog = &dialog; setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); mGetWorkListDialog->search(aInputValue); int ret = dialog.exec(); releaseTopWidget(&dialog); mGetWorkListDialog = nullptr; return ret; } void DialogManager::receiveWorkListInput(QObject *parent, QObject *msg) { QString inputValue = *(QString*)msg; if(mGetWorkListDialog == nullptr) { requestGetWorkList(inputValue); } } void DialogManager::raiseDeviceInfo(QObject* parent, QObject* aInfoData) { QPair* infoData = (QPair*)(aInfoData); raiseMultyMessageDialog(infoData->first,MessageLevel(infoData->second)); } //考虑以后使用另外的dialog显示错误 void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) { clearMessageDialog(); auto dialog = new GUIMessageDialog(mTopWidget); if(mFunctionDialog!= nullptr && mFunctionDialog->isRunning()) { dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint | Qt::BypassWindowManagerHint ); } if (nullptr != mTopWidget && mTopWidget->inherits("GUIMessageDialog")) { GUIMessageDialog* parent = qobject_cast(mTopWidget); if (parent->getDialogPos().y() + 320 + GUIMESSAGEDIALOG_OFFSET < 1080) { dialog->moveDialog(parent->getDialogPos() + QPoint(GUIMESSAGEDIALOG_OFFSET, GUIMESSAGEDIALOG_OFFSET)); } } if (msg) { QString *str = (QString *) msg; dialog->showMessage(*str); } else { dialog->showMessage("Something went error!"); } dialog->stopLoading(); dialog->showExitButton(); setTopWidget(dialog); dialog->setWindowModality(Qt::WindowModal); mScreenSaverWindow->stop(true); dialog->showFullScreen (); dialog->exec(); releaseTopWidget(dialog); dialog->deleteLater(); if (nullptr != mTopWidget && !mTopWidget->inherits("GUIMessageDialog")) { mScreenSaverWindow->startLocker(); } } // 扫描过程 dialog 只能为最底层,并且会被error dialog 清除! void DialogManager::invokeOperationStart(QObject *parent, QObject *msg) { //没有目标parent 撤销操作 if (!QApplication::activeWindow()) return; //只能在最底层窗口上模态 if (mDialogCount>0) return; clearMessageDialog(); mOperationMessageDialog = new GUIMessageDialog(QApplication::activeWindow()); if (msg) { QString* str = (QString*)msg; mOperationMessageDialog->showMessage(*str); } else { mOperationMessageDialog->hideMessage(); } mOperationMessageDialog->hideExitButton(); mOperationMessageDialog->startLoading(); if (mOperationMessageDialog->isHidden()) { mOperationMessageDialog->showFullScreen(); //mOperationMessageDialog->exec(); } } void DialogManager::invokeOperationProgress(QObject *parent, QObject *msg) { //窗口不存在,撤销操作 if (!mOperationMessageDialog) return; if (msg) { QVariant* var = (QVariant*)msg; if (mOperationMessageDialog->Pending()) { mOperationMessageDialog->stopPending(); } mOperationMessageDialog->showMessage(var->toString()); } else { mOperationMessageDialog->hideMessage(); } if (mOperationMessageDialog->isHidden()) { mOperationMessageDialog->showFullScreen(); //mOperationMessageDialog->exec(); } } void DialogManager::invokeOperationPending(QObject *parent, QObject *msg) { //窗口不存在,撤销操作 if (!mOperationMessageDialog) return; if (!mOperationMessageDialog->Pending()) { mOperationMessageDialog->startPending(); QVariant* var = (QVariant*)msg; mOperationMessageDialog->showMessage(var->toString()); } } void DialogManager::invokeOperationEnd(QObject *parent, QObject *msg) { //窗口不存在,撤销操作 if (!mOperationMessageDialog) return; if (!mOperationMessageDialog->isHidden()) { if (msg != nullptr) { mOperationMessageDialog->stopLoading(); mOperationMessageDialog->showExitButton(); mOperationMessageDialog->showMessage(*(QString*)msg); mOperationMessageDialog->setWindowModality(Qt::WindowModal); mOperationMessageDialog->showFullScreen(); mOperationMessageDialog->exec(); } else { mOperationMessageDialog->accept(); } delete mOperationMessageDialog; } } void DialogManager::clearMessageDialog() { if (mOperationMessageDialog) { releaseTopWidget(mOperationMessageDialog); delete mOperationMessageDialog; } } DialogManager::~DialogManager() { clearMessageDialog(); //delete mScreenSaverWindow; } void DialogManager::raiseMultyMessageDialog(const QString& aMessage, MessageLevel aMessageLevel) { 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(); } }