// // Created by Krad on 2022/7/19. // #include "DialogManager.h" #include #include #include #include #include "event/EventCenter.h" #include "dialogs/GUIMessageDialog.h" #include "dialogs/ChangePasswordFormDialog.h" #include "dialogs/AccountFormDialog.h" #include "appvals/AppGlobalValues.h" #include "windows/LoginDialog.h" DialogManager::DialogManager() : QObject() , mFunctionDialog(nullptr) , mMessageDialog(nullptr) , topWidget(nullptr) { } void DialogManager::init() { connect(EventCenter::Default(), &EventCenter::DeviceErrorRaise,this,&DialogManager::raiseDeviceError); 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); } //得考虑多线程的问题 void DialogManager::setTopWidget(QWidget* widget) { std::lock_guard lockGuard(mutex); if (!topWidget&& QApplication::activeWindow()){ topWidget = QApplication::activeWindow(); } qDebug()<<"last top:"<objectName()<<", new top:"<objectName(); widget->setParent(topWidget,widget->windowFlags()); topWidget = widget; ++mDialogCount; } void DialogManager::releaseTopWidget(QWidget* expectedTopWidget) { std::lock_guard lockGuard(mutex); if (topWidget == expectedTopWidget){ topWidget = expectedTopWidget->parentWidget(); } else{ while (auto tempWidget = topWidget->parentWidget()){ if (tempWidget->parentWidget() == expectedTopWidget){ tempWidget->setParent(expectedTopWidget->parentWidget()); break; } } } --mDialogCount; } void DialogManager::requestLogin() { //Login 直接最顶层模态 if (!mFunctionDialog){ mFunctionDialog = new LoginDialog; } mFunctionDialog->setWindowModality(Qt::WindowModal); mFunctionDialog->exec(); while (QDialog::Accepted != mFunctionDialog->result()) { mFunctionDialog->exec(); } } int DialogManager::requestAddAccount(QSqlTableModel* model) { AccountFormDialog dialog(nullptr, New); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); dialog.setReferenceModel(model); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } int DialogManager::requestEditSelfAccount() { AccountFormDialog dialog(nullptr, Self); setTopWidget(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } int DialogManager::requestEditAdminAccount(const QMap& values) { AccountFormDialog dialog(nullptr, Admin); setTopWidget(&dialog); dialog.setAccountInformation(values); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); releaseTopWidget(&dialog); return ret; } void DialogManager::requestChangePassword() { ChangePasswordFormDialog dialog; setTopWidget(&dialog); dialog.setGeometry(dialog.parentWidget()->geometry()); dialog.setWindowModality(Qt::WindowModal); dialog.exec(); releaseTopWidget(&dialog); } //考虑以后使用另外的dialog显示错误 void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) { clearMessageDialog(); //new dialog auto dialog = new GUIMessageDialog; if (msg) { QString *str = (QString *) msg; dialog->showMessage(*str); } else { dialog->showMessage("Something went error!"); } dialog->stopLoading(); dialog->showExitButton(); setTopWidget(dialog); dialog->setWindowModality(Qt::NonModal); dialog->exec(); releaseTopWidget(dialog); dialog->deleteLater(); } // 扫描过程 dialog 只能为最底层,并且会被error dialog 清除! void DialogManager::invokeOperationStart(QObject *parent, QObject *msg) { //没有目标parent 撤销操作 if (!QApplication::activeWindow()) return; //只能在最底层窗口上模态 if (mDialogCount>0) return; clearMessageDialog(); mMessageDialog = new GUIMessageDialog(QApplication::activeWindow()); if (msg) { QString* str = (QString*)msg; mMessageDialog->showMessage(*str); } else { mMessageDialog->hideMessage(); } mMessageDialog->hideExitButton(); mMessageDialog->startLoading(); AppGlobalValues::setInProcessing(true); if (mMessageDialog->isHidden()) { mMessageDialog->open(); } } void DialogManager::invokeOperationProgress(QObject *parent, QObject *msg) { //窗口不存在,撤销操作 if (!mMessageDialog) return; if (msg) { QVariant* var = (QVariant*)msg; if (mMessageDialog->Pending()) { mMessageDialog->stopPending(); } mMessageDialog->showMessage(var->toString()); } else { mMessageDialog->hideMessage(); } if (mMessageDialog->isHidden()) { mMessageDialog->show(); } } void DialogManager::invokeOperationPending(QObject *parent, QObject *msg) { //窗口不存在,撤销操作 if (!mMessageDialog) return; if (!mMessageDialog->Pending()) { mMessageDialog->startPending(); QVariant* var = (QVariant*)msg; mMessageDialog->showMessage(var->toString()); } } void DialogManager::invokeOperationEnd(QObject *parent, QObject *msg) { //窗口不存在,撤销操作 if (!mMessageDialog) return; if (!mMessageDialog->isHidden()) { if (msg && ((QVariant*)msg)->toBool()) { mMessageDialog->stopLoading(); mMessageDialog->showMessage("Scan completed!"); mMessageDialog->showExitButton(); mMessageDialog->setWindowModality(Qt::WindowModal); mMessageDialog->exec(); } else { mMessageDialog->accept(); } delete mMessageDialog; mMessageDialog = nullptr; AppGlobalValues::setInProcessing(false); } } void DialogManager::clearMessageDialog() { if (mMessageDialog){ if (!mMessageDialog->isHidden()) mMessageDialog->hide(); delete mMessageDialog; mMessageDialog = nullptr; } } DialogManager::~DialogManager() { clearMessageDialog(); }