diff --git a/src/dialogs/AccountFormDialog.cpp b/src/dialogs/AccountFormDialog.cpp index 407ab72..aea23e3 100644 --- a/src/dialogs/AccountFormDialog.cpp +++ b/src/dialogs/AccountFormDialog.cpp @@ -10,13 +10,13 @@ #include #include -#include "ChangePasswordFormDialog.h" #include "event/EventCenter.h" #include "log/UserOperationLog.h" #include "db/SQLHelper.h" #include "models/User.h" #include "AlertDialog.h" #include "components/ULineEdit.h" +#include "DialogManager.h" AccountFormDialog::AccountFormDialog(QWidget* parent, AccountEditMode mode, Qt::WindowFlags f) : GUIFormBaseDialog(parent, f) @@ -95,10 +95,7 @@ void AccountFormDialog::resetUserPassword() void AccountFormDialog::changeSelfPassword() { - ChangePasswordFormDialog dia(this); - dia.setGeometry(geometry()); - dia.setWindowModality(Qt::WindowModal); - dia.exec(); + DialogManager::Default()->requestChangePassword(); } void AccountFormDialog::addButtonPwd(QHBoxLayout* layout) diff --git a/src/dialogs/DialogManager.cpp b/src/dialogs/DialogManager.cpp index 015c2cd..46b0f7b 100644 --- a/src/dialogs/DialogManager.cpp +++ b/src/dialogs/DialogManager.cpp @@ -6,10 +6,24 @@ #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); @@ -24,36 +38,86 @@ QWidget *DialogManager::getTopWidget() { 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; + if (msg) { + QString *str = (QString *) msg; dialog->showMessage(*str); - } - else - { + } else { dialog->showMessage("Something went error!"); } dialog->stopLoading(); dialog->showExitButton(); - if (dialog->isHidden()) - { - topWidgetStore.push(dialog); - dialog->setWindowModality(Qt::NonModal); - dialog->exec(); - topWidgetStore.pop(); - } + topWidgetStore.push(dialog); + dialog->setWindowModality(Qt::NonModal); + dialog->exec(); + mErrorCount.fetch_sub(1); + auto lastDialog = topWidgetStore.pop(); + lastDialog->deleteLater(); } +// 扫描过程 dialog 只能为最底层,并且会被error dialog 清除! void DialogManager::invokeOperationStart(QObject *parent, QObject *msg) { - if (mMessageDialog) - { - mMessageDialog->hide(); - delete mMessageDialog; - } + //没有目标parent 撤销操作 + if (!QApplication::activeWindow()) return; + //只能在最底层窗口上模态 + if (!topWidgetStore.isEmpty()) return; + clearMessageDialog(); mMessageDialog = new GUIMessageDialog(this->getTopWidget()); if (msg) { @@ -74,7 +138,8 @@ void DialogManager::invokeOperationStart(QObject *parent, QObject *msg) { } void DialogManager::invokeOperationProgress(QObject *parent, QObject *msg) { - if (!mMessageDialog) mMessageDialog = new GUIMessageDialog(this->getTopWidget()); + //窗口不存在,撤销操作 + if (!mMessageDialog) return; if (msg) { QVariant* var = (QVariant*)msg; @@ -95,6 +160,7 @@ void DialogManager::invokeOperationProgress(QObject *parent, QObject *msg) { } void DialogManager::invokeOperationPending(QObject *parent, QObject *msg) { + //窗口不存在,撤销操作 if (!mMessageDialog) return; if (!mMessageDialog->Pending()) { @@ -105,10 +171,8 @@ void DialogManager::invokeOperationPending(QObject *parent, QObject *msg) { } void DialogManager::invokeOperationEnd(QObject *parent, QObject *msg) { - if (!mMessageDialog) - { - return; - } + //窗口不存在,撤销操作 + if (!mMessageDialog) return; if (!mMessageDialog->isHidden()) { if (msg && ((QVariant*)msg)->toBool()) @@ -128,3 +192,15 @@ void DialogManager::invokeOperationEnd(QObject *parent, QObject *msg) { AppGlobalValues::setInProcessing(false); } } + +void DialogManager::clearMessageDialog() { + if (mMessageDialog){ + if (!mMessageDialog->isHidden()) mMessageDialog->hide(); + delete mMessageDialog; + mMessageDialog = nullptr; + } +} + +DialogManager::~DialogManager() { + clearMessageDialog(); +} diff --git a/src/dialogs/DialogManager.h b/src/dialogs/DialogManager.h index ff29a46..192692e 100644 --- a/src/dialogs/DialogManager.h +++ b/src/dialogs/DialogManager.h @@ -6,11 +6,14 @@ #define GUI_DIALOGMANAGER_H #include +#include #include +#include class QWidget; class QDialog; class GUIMessageDialog; +class QSqlTableModel; class DialogManager:public QObject { public: @@ -19,20 +22,27 @@ public: return &manager; } - DialogManager() = default; + DialogManager(); - ~DialogManager() override = default; + ~DialogManager() override; void init(); QWidget* getTopWidget(); + void requestLogin(); + int requestAddAccount(QSqlTableModel* model); + int requestEditSelfAccount(); + int requestEditAdminAccount(const QMap& values); + void requestChangePassword(); void raiseDeviceError(QObject* parent, QObject* msg); void invokeOperationStart(QObject* parent, QObject* msg); void invokeOperationProgress(QObject* parent, QObject* msg); void invokeOperationPending(QObject* parent, QObject* msg); void invokeOperationEnd(QObject* parent, QObject* msg); private: - QDialog* mDialog = nullptr; - GUIMessageDialog* mMessageDialog = nullptr; + void clearMessageDialog(); + + QDialog* mFunctionDialog; + GUIMessageDialog* mMessageDialog; QStack topWidgetStore; }; diff --git a/src/forms/scan/ScanFormWidget.cpp b/src/forms/scan/ScanFormWidget.cpp index a9ac719..90cd207 100644 --- a/src/forms/scan/ScanFormWidget.cpp +++ b/src/forms/scan/ScanFormWidget.cpp @@ -135,10 +135,11 @@ void ScanFormWidget::initScanControlBar(QHBoxLayout *layout){ mBtnPreview->setEnabled(false); mBtnStop->setEnabled(false); - layout->addWidget(mBtnScan); + layout->addWidget(mBtnRefresh); layout->addWidget(mBtnPreview); layout->addWidget(mBtnStop); + layout->addWidget(mBtnScan); connect(mBtnRefresh, &QToolButton::clicked, [=]() { QString patientInf(mPatInf->getCurrentPatientJsonString(true)); LOG_USER_OPERATION(StartRefresh) diff --git a/src/forms/settings/AccountTableForm.cpp b/src/forms/settings/AccountTableForm.cpp index 3ac1c13..53e123e 100644 --- a/src/forms/settings/AccountTableForm.cpp +++ b/src/forms/settings/AccountTableForm.cpp @@ -11,10 +11,10 @@ #include "components/AccountRoleComboDelegate.h" #include "dialogs/AlertDialog.h" +#include "dialogs/DialogManager.h" #include "db/SQLHelper.h" #include "models/User.h" #include "components/SlideTableView.h" -#include "dialogs/AccountFormDialog.h" #include "event/EventCenter.h" AccountTableForm::AccountTableForm(QWidget* aParent) @@ -87,14 +87,11 @@ AccountTableForm::AccountTableForm(QWidget* aParent) //add new account connect(btnAdd, &QToolButton::clicked, [=]() { - AccountFormDialog dialog(this, New); - dialog.setWindowModality(Qt::WindowModal); - dialog.setReferenceModel(model); - if (dialog.exec() == QDialog::Accepted) + if (DialogManager::Default()->requestAddAccount(model) == QDialog::Accepted) { table->selectRow(0); } - }); + }); connect(btnEdit, &QToolButton::clicked, [=]() { if (mCurrentRow < 0) @@ -107,16 +104,19 @@ AccountTableForm::AccountTableForm(QWidget* aParent) { map[record.fieldName(i)] = record.value(i); } - auto mode = map["UserID"] == User::Current()->getUserID() ? Self : Admin; - AccountFormDialog dialog(this, mode); - dialog.setWindowModality(Qt::WindowModal); - if (mode == Admin)dialog.setAccountInformation(map); - if (dialog.exec() == QDialog::Accepted) + int ret =0; + if (map["UserID"] == User::Current()->getUserID()){ + ret = DialogManager::Default()->requestEditSelfAccount(); + } + else{ + ret = DialogManager::Default()->requestEditAdminAccount(map); + } + if (ret == QDialog::Accepted) { model->select(); table->selectRow(mCurrentRow); } - }); + }); connect(btnDelete, &QToolButton::clicked, [=]() { if (mCurrentRow < 0) diff --git a/src/windows/LoginDialog.cpp b/src/windows/LoginDialog.cpp index dccd6f0..39120b9 100644 --- a/src/windows/LoginDialog.cpp +++ b/src/windows/LoginDialog.cpp @@ -1,6 +1,8 @@ #include "LoginDialog.h" #include +#include +#include #include #include @@ -24,6 +26,7 @@ LoginDialog::LoginDialog(QWidget* aParent) { initializeAllWidget(); setWindowFlags(windowFlags() | Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint); + setGeometry(QApplication::desktop()->screenGeometry()); mAccountEdit->setText(JsonObject::Instance()->defaultUser()); } @@ -148,4 +151,9 @@ void LoginDialog::doLogin() } } +void LoginDialog::accept() { + QDialog::accept(); + clearInputData(); +} + diff --git a/src/windows/LoginDialog.h b/src/windows/LoginDialog.h index fa49d2e..d463bf2 100644 --- a/src/windows/LoginDialog.h +++ b/src/windows/LoginDialog.h @@ -19,6 +19,7 @@ public: LoginDialog(QWidget* aParent = nullptr); ~LoginDialog() override; + void accept() override; void clearInputData(); signals: diff --git a/src/windows/MainWindow.cpp b/src/windows/MainWindow.cpp index 770f2ca..cc84651 100644 --- a/src/windows/MainWindow.cpp +++ b/src/windows/MainWindow.cpp @@ -15,6 +15,7 @@ #include "forms/settings/SettingFormWidget.h" #include "forms/TopBarWidget.h" #include "dialogs/GUIMessageDialog.h" +#include "dialogs/DialogManager.h" #include "device/DeviceManager.h" #include "errorhandle/GUIErrorHandle.h" #include "LoginDialog.h" @@ -64,7 +65,7 @@ MainWindow::MainWindow(QWidget* aParent) } }); mThread->start(); - centerWidgetHide(); + QApplication::setActiveWindow(centralWidget()); } MainWindow::~MainWindow() @@ -266,17 +267,7 @@ void MainWindow::swipeTriggered(QSwipeGesture* aSwipeGesture) void MainWindow::requestLogin() { - mLoginDialog->clearInputData(); - mLoginDialog->setWindowModality(Qt::WindowModal); - mLoginDialog->showFullScreen(); - centerWidgetHide(); - QApplication::setActiveWindow(mLoginDialog); - while (QDialog::Accepted != mLoginDialog->result()) - { - mLoginDialog->exec(); - } - mLoginDialog->setResult(QDialog::Rejected); - centerWidgetShow(); + DialogManager::Default()->requestLogin(); QApplication::setActiveWindow(centralWidget()); }