Refactor DialogManager.3

This commit is contained in:
Krad
2022-07-21 10:39:24 +08:00
parent 0291c7d995
commit b86b19e91d
3 changed files with 57 additions and 31 deletions

View File

@@ -7,6 +7,7 @@
#include <QApplication>
#include <QWidget>
#include <QThread>
#include <qDebug>
#include "event/EventCenter.h"
#include "dialogs/GUIMessageDialog.h"
@@ -21,6 +22,7 @@ DialogManager::DialogManager()
: QObject()
, mFunctionDialog(nullptr)
, mMessageDialog(nullptr)
, topWidget(nullptr)
{
}
@@ -33,9 +35,32 @@ void DialogManager::init() {
connect(EventCenter::Default(), &EventCenter::InvokeOperationEnd,this,&DialogManager::invokeOperationEnd);
}
QWidget *DialogManager::getTopWidget() {
if (!topWidgetStore.isEmpty()) return topWidgetStore.top();
return QApplication::activeWindow();
//得考虑多线程的问题
void DialogManager::setTopWidget(QWidget* widget) {
std::lock_guard<std::mutex> lockGuard(mutex);
if (!topWidget&& QApplication::activeWindow()){
topWidget = QApplication::activeWindow();
}
qDebug()<<"last top:"<<topWidget->objectName()<<", new top:"<<widget->objectName();
widget->setParent(topWidget,widget->windowFlags());
topWidget = widget;
++mDialogCount;
}
void DialogManager::releaseTopWidget(QWidget* expectedTopWidget) {
std::lock_guard<std::mutex> 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()
@@ -44,57 +69,59 @@ void DialogManager::requestLogin()
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(getTopWidget(), New);
topWidgetStore.push(&dialog);
AccountFormDialog dialog(nullptr, New);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
dialog.setReferenceModel(model);
int ret = dialog.exec();
topWidgetStore.pop();
releaseTopWidget(&dialog);
return ret;
}
int DialogManager::requestEditSelfAccount() {
AccountFormDialog dialog(getTopWidget(), Self);
topWidgetStore.push(&dialog);
AccountFormDialog dialog(nullptr, Self);
setTopWidget(&dialog);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
topWidgetStore.pop();
releaseTopWidget(&dialog);
return ret;
}
int DialogManager::requestEditAdminAccount(const QMap<QString, QVariant>& values) {
AccountFormDialog dialog(getTopWidget(), Admin);
topWidgetStore.push(&dialog);
AccountFormDialog dialog(nullptr, Admin);
setTopWidget(&dialog);
dialog.setAccountInformation(values);
dialog.setWindowModality(Qt::WindowModal);
int ret = dialog.exec();
topWidgetStore.pop();
releaseTopWidget(&dialog);
return ret;
}
void DialogManager::requestChangePassword() {
ChangePasswordFormDialog dialog(getTopWidget());
topWidgetStore.push(&dialog);
dialog.setGeometry(getTopWidget()->geometry());
ChangePasswordFormDialog dialog;
setTopWidget(&dialog);
dialog.setGeometry(dialog.parentWidget()->geometry());
dialog.setWindowModality(Qt::WindowModal);
dialog.exec();
topWidgetStore.pop();
releaseTopWidget(&dialog);
}
//考虑以后使用另外的dialog显示错误
void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) {
if (!this->getTopWidget()->isVisible()) return;
clearMessageDialog();
//new dialog
auto dialog = new GUIMessageDialog(this->getTopWidget());
auto dialog = new GUIMessageDialog;
if (msg) {
QString *str = (QString *) msg;
dialog->showMessage(*str);
@@ -103,11 +130,11 @@ void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) {
}
dialog->stopLoading();
dialog->showExitButton();
topWidgetStore.push(dialog);
setTopWidget(dialog);
dialog->setWindowModality(Qt::NonModal);
dialog->exec();
auto lastDialog = topWidgetStore.pop();
lastDialog->deleteLater();
releaseTopWidget(dialog);
dialog->deleteLater();
}
// 扫描过程 dialog 只能为最底层并且会被error dialog 清除!
@@ -115,9 +142,9 @@ void DialogManager::invokeOperationStart(QObject *parent, QObject *msg) {
//没有目标parent 撤销操作
if (!QApplication::activeWindow()) return;
//只能在最底层窗口上模态
if (!topWidgetStore.isEmpty()) return;
if (mDialogCount>0) return;
clearMessageDialog();
mMessageDialog = new GUIMessageDialog(this->getTopWidget());
mMessageDialog = new GUIMessageDialog(QApplication::activeWindow());
if (msg)
{
QString* str = (QString*)msg;

View File

@@ -27,7 +27,8 @@ public:
~DialogManager() override;
void init();
QWidget* getTopWidget();
void setTopWidget(QWidget* widget);
void releaseTopWidget(QWidget* expectedTopWidget);
void requestLogin();
int requestAddAccount(QSqlTableModel* model);
int requestEditSelfAccount();
@@ -43,7 +44,9 @@ private:
QDialog* mFunctionDialog;
GUIMessageDialog* mMessageDialog;
QStack<QDialog*> topWidgetStore;
QWidget* topWidget;
std::mutex mutex;
int mDialogCount = 0;
};
#endif //GUI_DIALOGMANAGER_H

View File

@@ -15,7 +15,7 @@
#include "components/SlideTableView.h"
#include "db/SQLHelper.h"
#include "event/EventCenter.h"
#include "dialogs/AccountFormDialog.h"
#include "dialogs/DialogManager.h"
#include "dialogs/AlertDialog.h"
#include "log/UserOperationLog.h"
#include "components/VerticalTextToolButton.h"
@@ -83,11 +83,7 @@ void SelectFormWidget::initGeneralButtons(QHBoxLayout *layout) {
layout->addWidget(mBtnAccount);
layout->addWidget(mBtnWorklist);
// mBtn account slot
connect(mBtnAccount, &QToolButton::clicked, [=]() {
AccountFormDialog dialog(this);
dialog.setWindowModality(Qt::WindowModal);
dialog.exec();
});
connect(mBtnAccount, &QToolButton::clicked, DialogManager::Default(),&DialogManager::requestEditSelfAccount);
}
void SelectFormWidget::initPatEditButtons(QHBoxLayout *layout) {