// // Created by Krad on 2022/7/19. // #include "DialogManager.h" #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) { } 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); } QWidget *DialogManager::getTopWidget() { if (!topWidgetStore.isEmpty()) return topWidgetStore.top(); return QApplication::activeWindow(); } void DialogManager::requestLogin() { //Login 直接最顶层模态 if (!mFunctionDialog){ mFunctionDialog = new LoginDialog; } mFunctionDialog->exec(); while (QDialog::Accepted != mFunctionDialog->result()) { mFunctionDialog->exec(); } } int DialogManager::requestAddAccount(QSqlTableModel* model) { AccountFormDialog dialog(getTopWidget(), New); topWidgetStore.push(&dialog); dialog.setWindowModality(Qt::WindowModal); dialog.setReferenceModel(model); int ret = dialog.exec(); topWidgetStore.pop(); return ret; } int DialogManager::requestEditSelfAccount() { AccountFormDialog dialog(getTopWidget(), Self); topWidgetStore.push(&dialog); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); topWidgetStore.pop(); return ret; } int DialogManager::requestEditAdminAccount(const QMap& values) { AccountFormDialog dialog(getTopWidget(), Admin); topWidgetStore.push(&dialog); dialog.setAccountInformation(values); dialog.setWindowModality(Qt::WindowModal); int ret = dialog.exec(); topWidgetStore.pop(); return ret; } void DialogManager::requestChangePassword() { ChangePasswordFormDialog dialog(getTopWidget()); topWidgetStore.push(&dialog); dialog.setGeometry(getTopWidget()->geometry()); dialog.setWindowModality(Qt::WindowModal); dialog.exec(); topWidgetStore.pop(); } //考虑以后使用另外的dialog显示错误 void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) { if (!this->getTopWidget()->isVisible()) return; clearMessageDialog(); //new dialog auto dialog = new GUIMessageDialog(this->getTopWidget()); if (msg) { QString *str = (QString *) msg; dialog->showMessage(*str); } else { dialog->showMessage("Something went error!"); } dialog->stopLoading(); dialog->showExitButton(); topWidgetStore.push(dialog); dialog->setWindowModality(Qt::NonModal); dialog->exec(); auto lastDialog = topWidgetStore.pop(); lastDialog->deleteLater(); } // 扫描过程 dialog 只能为最底层,并且会被error dialog 清除! void DialogManager::invokeOperationStart(QObject *parent, QObject *msg) { //没有目标parent 撤销操作 if (!QApplication::activeWindow()) return; //只能在最底层窗口上模态 if (!topWidgetStore.isEmpty()) return; clearMessageDialog(); mMessageDialog = new GUIMessageDialog(this->getTopWidget()); 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(); }