Refactor DialogManager.3
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
#include <qDebug>
|
||||||
|
|
||||||
#include "event/EventCenter.h"
|
#include "event/EventCenter.h"
|
||||||
#include "dialogs/GUIMessageDialog.h"
|
#include "dialogs/GUIMessageDialog.h"
|
||||||
@@ -21,6 +22,7 @@ DialogManager::DialogManager()
|
|||||||
: QObject()
|
: QObject()
|
||||||
, mFunctionDialog(nullptr)
|
, mFunctionDialog(nullptr)
|
||||||
, mMessageDialog(nullptr)
|
, mMessageDialog(nullptr)
|
||||||
|
, topWidget(nullptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -33,9 +35,32 @@ void DialogManager::init() {
|
|||||||
connect(EventCenter::Default(), &EventCenter::InvokeOperationEnd,this,&DialogManager::invokeOperationEnd);
|
connect(EventCenter::Default(), &EventCenter::InvokeOperationEnd,this,&DialogManager::invokeOperationEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget *DialogManager::getTopWidget() {
|
//得考虑多线程的问题
|
||||||
if (!topWidgetStore.isEmpty()) return topWidgetStore.top();
|
void DialogManager::setTopWidget(QWidget* widget) {
|
||||||
return QApplication::activeWindow();
|
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()
|
void DialogManager::requestLogin()
|
||||||
@@ -44,57 +69,59 @@ void DialogManager::requestLogin()
|
|||||||
if (!mFunctionDialog){
|
if (!mFunctionDialog){
|
||||||
mFunctionDialog = new LoginDialog;
|
mFunctionDialog = new LoginDialog;
|
||||||
}
|
}
|
||||||
|
mFunctionDialog->setWindowModality(Qt::WindowModal);
|
||||||
mFunctionDialog->exec();
|
mFunctionDialog->exec();
|
||||||
while (QDialog::Accepted != mFunctionDialog->result())
|
while (QDialog::Accepted != mFunctionDialog->result())
|
||||||
{
|
{
|
||||||
|
|
||||||
mFunctionDialog->exec();
|
mFunctionDialog->exec();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int DialogManager::requestAddAccount(QSqlTableModel* model) {
|
int DialogManager::requestAddAccount(QSqlTableModel* model) {
|
||||||
AccountFormDialog dialog(getTopWidget(), New);
|
AccountFormDialog dialog(nullptr, New);
|
||||||
topWidgetStore.push(&dialog);
|
setTopWidget(&dialog);
|
||||||
dialog.setWindowModality(Qt::WindowModal);
|
dialog.setWindowModality(Qt::WindowModal);
|
||||||
dialog.setReferenceModel(model);
|
dialog.setReferenceModel(model);
|
||||||
int ret = dialog.exec();
|
int ret = dialog.exec();
|
||||||
topWidgetStore.pop();
|
releaseTopWidget(&dialog);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DialogManager::requestEditSelfAccount() {
|
int DialogManager::requestEditSelfAccount() {
|
||||||
AccountFormDialog dialog(getTopWidget(), Self);
|
AccountFormDialog dialog(nullptr, Self);
|
||||||
topWidgetStore.push(&dialog);
|
setTopWidget(&dialog);
|
||||||
dialog.setWindowModality(Qt::WindowModal);
|
dialog.setWindowModality(Qt::WindowModal);
|
||||||
int ret = dialog.exec();
|
int ret = dialog.exec();
|
||||||
topWidgetStore.pop();
|
releaseTopWidget(&dialog);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DialogManager::requestEditAdminAccount(const QMap<QString, QVariant>& values) {
|
int DialogManager::requestEditAdminAccount(const QMap<QString, QVariant>& values) {
|
||||||
AccountFormDialog dialog(getTopWidget(), Admin);
|
AccountFormDialog dialog(nullptr, Admin);
|
||||||
topWidgetStore.push(&dialog);
|
setTopWidget(&dialog);
|
||||||
dialog.setAccountInformation(values);
|
dialog.setAccountInformation(values);
|
||||||
dialog.setWindowModality(Qt::WindowModal);
|
dialog.setWindowModality(Qt::WindowModal);
|
||||||
int ret = dialog.exec();
|
int ret = dialog.exec();
|
||||||
topWidgetStore.pop();
|
releaseTopWidget(&dialog);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DialogManager::requestChangePassword() {
|
void DialogManager::requestChangePassword() {
|
||||||
ChangePasswordFormDialog dialog(getTopWidget());
|
ChangePasswordFormDialog dialog;
|
||||||
topWidgetStore.push(&dialog);
|
setTopWidget(&dialog);
|
||||||
dialog.setGeometry(getTopWidget()->geometry());
|
dialog.setGeometry(dialog.parentWidget()->geometry());
|
||||||
dialog.setWindowModality(Qt::WindowModal);
|
dialog.setWindowModality(Qt::WindowModal);
|
||||||
dialog.exec();
|
dialog.exec();
|
||||||
topWidgetStore.pop();
|
releaseTopWidget(&dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
//考虑以后使用另外的dialog显示错误
|
//考虑以后使用另外的dialog显示错误
|
||||||
void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) {
|
void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) {
|
||||||
if (!this->getTopWidget()->isVisible()) return;
|
|
||||||
clearMessageDialog();
|
clearMessageDialog();
|
||||||
//new dialog
|
//new dialog
|
||||||
auto dialog = new GUIMessageDialog(this->getTopWidget());
|
auto dialog = new GUIMessageDialog;
|
||||||
|
|
||||||
if (msg) {
|
if (msg) {
|
||||||
QString *str = (QString *) msg;
|
QString *str = (QString *) msg;
|
||||||
dialog->showMessage(*str);
|
dialog->showMessage(*str);
|
||||||
@@ -103,11 +130,11 @@ void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) {
|
|||||||
}
|
}
|
||||||
dialog->stopLoading();
|
dialog->stopLoading();
|
||||||
dialog->showExitButton();
|
dialog->showExitButton();
|
||||||
topWidgetStore.push(dialog);
|
setTopWidget(dialog);
|
||||||
dialog->setWindowModality(Qt::NonModal);
|
dialog->setWindowModality(Qt::NonModal);
|
||||||
dialog->exec();
|
dialog->exec();
|
||||||
auto lastDialog = topWidgetStore.pop();
|
releaseTopWidget(dialog);
|
||||||
lastDialog->deleteLater();
|
dialog->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 扫描过程 dialog 只能为最底层,并且会被error dialog 清除!
|
// 扫描过程 dialog 只能为最底层,并且会被error dialog 清除!
|
||||||
@@ -115,9 +142,9 @@ void DialogManager::invokeOperationStart(QObject *parent, QObject *msg) {
|
|||||||
//没有目标parent 撤销操作
|
//没有目标parent 撤销操作
|
||||||
if (!QApplication::activeWindow()) return;
|
if (!QApplication::activeWindow()) return;
|
||||||
//只能在最底层窗口上模态
|
//只能在最底层窗口上模态
|
||||||
if (!topWidgetStore.isEmpty()) return;
|
if (mDialogCount>0) return;
|
||||||
clearMessageDialog();
|
clearMessageDialog();
|
||||||
mMessageDialog = new GUIMessageDialog(this->getTopWidget());
|
mMessageDialog = new GUIMessageDialog(QApplication::activeWindow());
|
||||||
if (msg)
|
if (msg)
|
||||||
{
|
{
|
||||||
QString* str = (QString*)msg;
|
QString* str = (QString*)msg;
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ public:
|
|||||||
~DialogManager() override;
|
~DialogManager() override;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
QWidget* getTopWidget();
|
void setTopWidget(QWidget* widget);
|
||||||
|
void releaseTopWidget(QWidget* expectedTopWidget);
|
||||||
void requestLogin();
|
void requestLogin();
|
||||||
int requestAddAccount(QSqlTableModel* model);
|
int requestAddAccount(QSqlTableModel* model);
|
||||||
int requestEditSelfAccount();
|
int requestEditSelfAccount();
|
||||||
@@ -43,7 +44,9 @@ private:
|
|||||||
|
|
||||||
QDialog* mFunctionDialog;
|
QDialog* mFunctionDialog;
|
||||||
GUIMessageDialog* mMessageDialog;
|
GUIMessageDialog* mMessageDialog;
|
||||||
QStack<QDialog*> topWidgetStore;
|
QWidget* topWidget;
|
||||||
|
std::mutex mutex;
|
||||||
|
int mDialogCount = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //GUI_DIALOGMANAGER_H
|
#endif //GUI_DIALOGMANAGER_H
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
#include "components/SlideTableView.h"
|
#include "components/SlideTableView.h"
|
||||||
#include "db/SQLHelper.h"
|
#include "db/SQLHelper.h"
|
||||||
#include "event/EventCenter.h"
|
#include "event/EventCenter.h"
|
||||||
#include "dialogs/AccountFormDialog.h"
|
#include "dialogs/DialogManager.h"
|
||||||
#include "dialogs/AlertDialog.h"
|
#include "dialogs/AlertDialog.h"
|
||||||
#include "log/UserOperationLog.h"
|
#include "log/UserOperationLog.h"
|
||||||
#include "components/VerticalTextToolButton.h"
|
#include "components/VerticalTextToolButton.h"
|
||||||
@@ -83,11 +83,7 @@ void SelectFormWidget::initGeneralButtons(QHBoxLayout *layout) {
|
|||||||
layout->addWidget(mBtnAccount);
|
layout->addWidget(mBtnAccount);
|
||||||
layout->addWidget(mBtnWorklist);
|
layout->addWidget(mBtnWorklist);
|
||||||
// mBtn account slot
|
// mBtn account slot
|
||||||
connect(mBtnAccount, &QToolButton::clicked, [=]() {
|
connect(mBtnAccount, &QToolButton::clicked, DialogManager::Default(),&DialogManager::requestEditSelfAccount);
|
||||||
AccountFormDialog dialog(this);
|
|
||||||
dialog.setWindowModality(Qt::WindowModal);
|
|
||||||
dialog.exec();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelectFormWidget::initPatEditButtons(QHBoxLayout *layout) {
|
void SelectFormWidget::initPatEditButtons(QHBoxLayout *layout) {
|
||||||
|
|||||||
Reference in New Issue
Block a user