diff --git a/src/ShimLib/ShimLib.c b/src/ShimLib/ShimLib.c index d0deddf..98918bc 100644 --- a/src/ShimLib/ShimLib.c +++ b/src/ShimLib/ShimLib.c @@ -15,10 +15,13 @@ #include -typedef void(*error_cb)(const char* msg); +typedef void(*error_cb)(const char* msg); +// level:0 infomation,1 warning,2 error,3 sucessed +typedef void(*message_callback)(const char* msg, unsigned int level); int statusCountFlag = 0; error_cb innerCallback = NULL; +message_callback msgCallback = NULL; #ifdef _WIN32 void ThreadFunc(void*); @@ -47,6 +50,15 @@ int InitLib(error_cb cb) return 0; } +void SetMessageCallback(message_callback cb) +{ + msgCallback = cb; + msgCallback("info message", 0); + msgCallback("warning message", 1); + msgCallback("error message", 2); + msgCallback("sucess message", 3); +} + volatile int running = 1; volatile int progress = 0; volatile int status = READY; diff --git a/src/ShimLib/ShimLib.h b/src/ShimLib/ShimLib.h index 4ba9fb3..8057bc9 100644 --- a/src/ShimLib/ShimLib.h +++ b/src/ShimLib/ShimLib.h @@ -37,6 +37,8 @@ typedef enum { extern int InitLib(void(*)(const char *msg)); +extern void SetMessageCallback(void(*)(const char* msg,unsigned int level)); + extern int ScanControl(ScanAction actionType); extern StatusInfo GetStatus(); diff --git a/src/dialogs/DialogManager.cpp b/src/dialogs/DialogManager.cpp index 7fe5d77..3ae027b 100644 --- a/src/dialogs/DialogManager.cpp +++ b/src/dialogs/DialogManager.cpp @@ -7,60 +7,67 @@ #include #include #include -#include +#include #include "event/EventCenter.h" #include "dialogs/GUIMessageDialog.h" #include "dialogs/ChangePasswordFormDialog.h" #include "dialogs/AccountFormDialog.h" +#include "dialogs/MultyMessageDialogManager.h" #include "appvals/AppGlobalValues.h" #include "windows/LoginDialog.h" +#include "shimlib/ShimLib.h" - +void messageCallback(const char* aMessage,unsigned int aMessageLevel) +{ + DialogManager::Default()->raiseMultyMessageDialog(QString::fromLatin1(aMessage),MessageLevel(aMessageLevel)); +} DialogManager::DialogManager() : QObject() , mFunctionDialog(nullptr) , mMessageDialog(nullptr) -, topWidget(nullptr) +, mTopWidget(nullptr) { } -void DialogManager::init() { +void DialogManager::init(QWidget* aParent) { 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); + MultyMessageDialogManager::getInstance()->setDialogParent(aParent); + SetMessageCallback(messageCallback); } //得考虑多线程的问题 void DialogManager::setTopWidget(QWidget* widget) { - std::lock_guard lockGuard(mutex); - if (!topWidget&& QApplication::activeWindow()){ - topWidget = QApplication::activeWindow(); + std::lock_guard lockGuard(mMutex); + if (nullptr == widget) + { + return; } - qDebug()<<"last top:"<objectName()<<", new top:"<objectName(); - widget->setParent(topWidget,widget->windowFlags()); - topWidget = widget; + if (!mTopWidget&& QApplication::activeWindow()){ + mTopWidget = QApplication::activeWindow(); + } + qDebug()<<"last top:"<objectName()<<", new top:"<objectName(); + widget->setParent(mTopWidget,widget->windowFlags()); + mTopWidget = widget; ++mDialogCount; } void DialogManager::releaseTopWidget(QWidget* expectedTopWidget) { - std::lock_guard lockGuard(mutex); - if (topWidget == expectedTopWidget){ - topWidget = expectedTopWidget->parentWidget(); + std::lock_guard lockGuard(mMutex); + if (nullptr == expectedTopWidget) + { + return; } - else{ - while (auto tempWidget = topWidget->parentWidget()){ - if (tempWidget->parentWidget() == expectedTopWidget){ - tempWidget->setParent(expectedTopWidget->parentWidget()); - break; - } - } + if (mTopWidget == expectedTopWidget){ + mTopWidget = expectedTopWidget->parentWidget(); + --mDialogCount; } - --mDialogCount; } void DialogManager::requestLogin() @@ -119,7 +126,6 @@ void DialogManager::requestChangePassword() { //考虑以后使用另外的dialog显示错误 void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) { clearMessageDialog(); - //new dialog auto dialog = new GUIMessageDialog; if (msg) { @@ -132,6 +138,7 @@ void DialogManager::raiseDeviceError(QObject *parent, QObject *msg) { dialog->showExitButton(); setTopWidget(dialog); dialog->setWindowModality(Qt::NonModal); + dialog->showFullScreen (); dialog->exec(); releaseTopWidget(dialog); dialog->deleteLater(); @@ -214,7 +221,6 @@ void DialogManager::invokeOperationEnd(QObject *parent, QObject *msg) { mMessageDialog->accept(); } delete mMessageDialog; - mMessageDialog = nullptr; AppGlobalValues::setInProcessing(false); } } @@ -223,10 +229,14 @@ void DialogManager::clearMessageDialog() { if (mMessageDialog){ if (!mMessageDialog->isHidden()) mMessageDialog->hide(); delete mMessageDialog; - mMessageDialog = nullptr; } } DialogManager::~DialogManager() { clearMessageDialog(); } + +void DialogManager::raiseMultyMessageDialog(const QString aMessage, MessageLevel aMessageLevel) +{ + MultyMessageDialogManager::getInstance()->raiseDialog(aMessage, aMessageLevel); +} diff --git a/src/dialogs/DialogManager.h b/src/dialogs/DialogManager.h index d045be9..edcce69 100644 --- a/src/dialogs/DialogManager.h +++ b/src/dialogs/DialogManager.h @@ -6,6 +6,7 @@ #define GUI_DIALOGMANAGER_H #include +#include #include #include #include @@ -14,6 +15,7 @@ class QWidget; class QDialog; class GUIMessageDialog; class QSqlTableModel; +enum MessageLevel:unsigned int; class DialogManager:public QObject { public: @@ -26,7 +28,7 @@ public: ~DialogManager() override; - void init(); + void init(QWidget* aParent); void setTopWidget(QWidget* widget); void releaseTopWidget(QWidget* expectedTopWidget); void requestLogin(); @@ -35,6 +37,7 @@ public: int requestEditAdminAccount(const QMap& values); void requestChangePassword(); void raiseDeviceError(QObject* parent, QObject* msg); + void raiseMultyMessageDialog(const QString aMessage,MessageLevel aMessageLevel); void invokeOperationStart(QObject* parent, QObject* msg); void invokeOperationProgress(QObject* parent, QObject* msg); void invokeOperationPending(QObject* parent, QObject* msg); @@ -43,9 +46,9 @@ private: void clearMessageDialog(); QDialog* mFunctionDialog; - GUIMessageDialog* mMessageDialog; - QWidget* topWidget; - std::mutex mutex; + QPointer mMessageDialog; + QWidget* mTopWidget; + std::mutex mMutex; int mDialogCount = 0; }; diff --git a/src/dialogs/GUIMessageDialog.cpp b/src/dialogs/GUIMessageDialog.cpp index 4cefef2..c2cf6c4 100644 --- a/src/dialogs/GUIMessageDialog.cpp +++ b/src/dialogs/GUIMessageDialog.cpp @@ -19,7 +19,6 @@ GUIMessageDialog::GUIMessageDialog(QWidget *parent) mUI->setupUi(this); this->setObjectName("MessageDialog"); this->setWindowFlags (Qt :: FramelessWindowHint | Qt :: Dialog); - this->showFullScreen (); initBaseLayout(); this->setWindowOpacity(0.6); initLoadingFrameString(); diff --git a/src/dialogs/MultyMessageDialog.cpp b/src/dialogs/MultyMessageDialog.cpp new file mode 100644 index 0000000..03a52e9 --- /dev/null +++ b/src/dialogs/MultyMessageDialog.cpp @@ -0,0 +1,112 @@ +#include "MultyMessageDialog.h" +#include + +namespace +{ + const int AUTO_DISAPPEAR_TIME = 5000; + const int DIALOG_WIDTH = 240; + const int DIALOG_HEIGHT = 50; + +} + +MultyMessageDialog::MultyMessageDialog(const QString& aMessage,MessageLevel aMessageLevel,QWidget* aParent) + : QDialog(aParent) + , mAutoDisappearTime(AUTO_DISAPPEAR_TIME) + , mTimer(new QTimer(this)) + , mDisappearAnimation(new QPropertyAnimation(this,"pos",this)) + , mShowAnimation(new QPropertyAnimation(this,"pos",this)) + , mMessage(new QLabel(aMessage,this)) + , mIcon(new QLabel(this)) + , mLevel(aMessageLevel) +{ + setWindowFlags(Qt::FramelessWindowHint| Qt::WindowStaysOnTopHint| Qt::BypassWindowManagerHint); + resize(DIALOG_WIDTH,DIALOG_HEIGHT); + mTimer->setSingleShot(true); + connect(mTimer,&QTimer::timeout,this,&MultyMessageDialog::startHideAnimation); + initializeAnimation(); + initializeIcon(); + QHBoxLayout* layout = new QHBoxLayout(this); + layout->addWidget(mIcon); + layout->addWidget(mMessage); +} + +MultyMessageDialog::~MultyMessageDialog() +{ + emit dialogDestroyed(); +} + +void MultyMessageDialog::initializeAnimation() +{ + mDisappearAnimation->setDuration(100); + + mShowAnimation->setDuration(100); + + connect(mDisappearAnimation, &QPropertyAnimation::finished, this, &MultyMessageDialog::hideDialog); +} + +void MultyMessageDialog::initializeIcon() +{ + switch (mLevel) + { + case Info: + mIcon->setObjectName("MultyMessageDialogInfo"); + break; + case Warning: + mIcon->setObjectName("MultyMessageDialogWarning"); + break; + case Error: + mIcon->setObjectName("MultyMessageDialogError"); + break; + case Sucess: + mIcon->setObjectName("MultyMessageDialogSucess"); + break; + default: + mIcon->setObjectName("MultyMessageDialogInfo"); + break; + } +} + +void MultyMessageDialog::setMessage(const QString& aMessage) +{ + mMessage->setText(aMessage); +} + +void MultyMessageDialog::startHideAnimation() +{ + if (mTimer->isActive()) + { + mTimer->stop(); + } + mDisappearAnimation->setStartValue(pos()); + mDisappearAnimation->setEndValue(QPoint(pos().x(),pos().y()-30-height())); + mDisappearAnimation->start(); +} + +void MultyMessageDialog::hideDialog() +{ + hide(); + deleteLater(); +} + +void MultyMessageDialog::setAutoDisappearTime(int aAutoDisappearTime) +{ + mAutoDisappearTime = aAutoDisappearTime; +} + +void MultyMessageDialog::showEvent(QShowEvent* aEvent) +{ + mTimer->start(mAutoDisappearTime); + mShowAnimation->setStartValue(QPoint(pos().x(),pos().y()-30-height())); + mShowAnimation->setEndValue(pos()); + mShowAnimation->start(); + QDialog::showEvent(aEvent); +} + +void MultyMessageDialog::stopShowAnimation() +{ + if (QAbstractAnimation::Running == mShowAnimation->state()) + { + mShowAnimation->stop(); + move(mShowAnimation->endValue().toPoint()); + } +} diff --git a/src/dialogs/MultyMessageDialog.h b/src/dialogs/MultyMessageDialog.h new file mode 100644 index 0000000..1b2654a --- /dev/null +++ b/src/dialogs/MultyMessageDialog.h @@ -0,0 +1,55 @@ +#ifndef MULTYMESSAGEDIALOG_H +#define MULTYMESSAGEDIALOG_H + +#include +#include +#include +#include + +enum MessageLevel:unsigned int +{ + Info = 0, + Warning, + Error, + Sucess, +}; + +class MultyMessageDialog : public QDialog +{ + Q_OBJECT +public: + MultyMessageDialog(const QString& aMessage = "",MessageLevel aMessageLevel = MessageLevel::Info,QWidget* aParent = nullptr); + ~MultyMessageDialog() override; + void setAutoDisappearTime(int aAutoDisappearTime); + void setMessage(const QString& aMessage); + void stopShowAnimation(); + +signals: + void dialogDestroyed(); + +public slots: + void hideDialog(); + void startHideAnimation(); + +protected: + void showEvent(QShowEvent* aEvent) override; + +private: + void initializeAnimation(); + void initializeIcon(); + +private: + int mAutoDisappearTime; + QTimer* mTimer; + QSize mSize; + QPropertyAnimation* mDisappearAnimation; + QPropertyAnimation* mShowAnimation; + QLabel* mMessage; + QLabel* mIcon; + MessageLevel mLevel; + + + +}; + +#endif // MULTYMESSAGEDIALOG_H \ No newline at end of file diff --git a/src/dialogs/MultyMessageDialogManager.cpp b/src/dialogs/MultyMessageDialogManager.cpp new file mode 100644 index 0000000..7478100 --- /dev/null +++ b/src/dialogs/MultyMessageDialogManager.cpp @@ -0,0 +1,71 @@ +#include "MultyMessageDialogManager.h" +#include "MultyMessageDialog.h" + +#include + +namespace +{ + const int DIALOGS_MARGIN = 30; + const int GEOMETY_X = 1620; + const int GEOMETY_Y = 30; +} +MultyMessageDialogManager* MultyMessageDialogManager::getInstance() +{ + static MultyMessageDialogManager instance; + return &instance; +} + +MultyMessageDialogManager::MultyMessageDialogManager() + : QObject() + , mDialogParent(nullptr) + , mDialogList() + , mMutex() +{ +} + +MultyMessageDialogManager::~MultyMessageDialogManager() +{ +} + +void MultyMessageDialogManager::setDialogParent(QWidget* aParent) +{ + mDialogParent = aParent; +} + +void MultyMessageDialogManager::raiseDialog(const QString& aMessage,MessageLevel aMessageLevel) +{ + QMutexLocker locker(&mMutex); + MultyMessageDialog* dialog = new MultyMessageDialog(aMessage,aMessageLevel,mDialogParent); + mDialogList.append(dialog); + int yDistance = GEOMETY_Y; + for (int i = 0; i < mDialogList.count() - 1; ++i) + { + yDistance += mDialogList.at(i)->size().height() + DIALOGS_MARGIN; + } + + dialog->move(GEOMETY_X,yDistance); + dialog->show(); + connect(dialog,&MultyMessageDialog::dialogDestroyed,this,&MultyMessageDialogManager::removeDestoryedDialog); +} + +void MultyMessageDialogManager::removeDestoryedDialog() +{ + QMutexLocker locker(&mMutex); + MultyMessageDialog* dialog = qobject_cast(sender()); + if (nullptr == dialog) + { + return; + } + int index = mDialogList.indexOf(dialog); + if (index >= 0) + { + mDialogList.removeAt(index); + for (int i = 0; i < mDialogList.count(); ++i) + { + MultyMessageDialog* target = mDialogList.at(i); + target->stopShowAnimation(); + QPoint position = target->mapToGlobal(QPoint(0, 0)); + target->move(position.x(),position.y()-dialog->height()-DIALOGS_MARGIN); + } + } +} diff --git a/src/dialogs/MultyMessageDialogManager.h b/src/dialogs/MultyMessageDialogManager.h new file mode 100644 index 0000000..ea2fcf5 --- /dev/null +++ b/src/dialogs/MultyMessageDialogManager.h @@ -0,0 +1,30 @@ +#ifndef MULTYMESSAGEDIALOGMANAGER_H +#define MULTYMESSAGEDIALOGMANAGER_H + +#include +#include +#include + +class MultyMessageDialog; +enum MessageLevel:unsigned int; + +class MultyMessageDialogManager : public QObject +{ + Q_OBJECT +public: + static MultyMessageDialogManager* getInstance(); + void raiseDialog(const QString& aMessage,MessageLevel aMessageLevel); + void setDialogParent(QWidget* aParent); + +private slots: + void removeDestoryedDialog(); + +private: + MultyMessageDialogManager(); + ~MultyMessageDialogManager(); + QWidget* mDialogParent; + QList mDialogList; + QMutex mMutex; +}; + +#endif // MULTYMESSAGEDIALOGMANAGER_H \ No newline at end of file diff --git a/src/icons/dicom/info.png b/src/icons/dicom/info.png new file mode 100644 index 0000000..745cbab Binary files /dev/null and b/src/icons/dicom/info.png differ diff --git a/src/icons/dicom/warning.png b/src/icons/dicom/warning.png new file mode 100644 index 0000000..6350f0e Binary files /dev/null and b/src/icons/dicom/warning.png differ diff --git a/src/main.cpp b/src/main.cpp index af8a367..b1faf30 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,10 +12,12 @@ #include #include #include "dialogs/DialogManager.h" +#include "dialogs/MultyMessageDialogManager.h" #include "json/jsonobject.h" #include "src/utilities/Locker.h" #include "src/utilities/LanguageSwitcher.h" #include "utilities/TouchScreenSignalSender.h" +#include "Keyboard/KeyboardManager.h" QString loadFontFromFile(QString path) { @@ -83,6 +85,7 @@ int main(int argc, char* argv[]) QStringList app_args = a.arguments(); int ret = 0; + KeyboardManager::getInstance(); if (app_args.contains("-d")) //if (true) @@ -104,7 +107,7 @@ int main(int argc, char* argv[]) w.requestLogin(); - DialogManager::Default()->init(); + DialogManager::Default()->init(&w); DeviceManager::Default()->initDevice(); ret = a.exec(); @@ -115,7 +118,7 @@ int main(int argc, char* argv[]) { w.showFullScreen(); w.requestLogin(); - DialogManager::Default()->init(); + DialogManager::Default()->init(&w); DeviceManager::Default()->initDevice(); ret = a.exec(); } diff --git a/src/res.qrc b/src/res.qrc index bba3ab3..3c6c4b6 100644 --- a/src/res.qrc +++ b/src/res.qrc @@ -30,6 +30,8 @@ icons/dicom/echo_suc.png icons/dicom/echo_ing.png icons/dicom/echo_fail.png + icons/dicom/info.png + icons/dicom/warning.png icons/dicomsettings.png icons/dicomsettings_d.png icons/networksettings.png diff --git a/src/stylesheet/Dark2.css b/src/stylesheet/Dark2.css index 5741f09..7e89d0b 100644 --- a/src/stylesheet/Dark2.css +++ b/src/stylesheet/Dark2.css @@ -795,3 +795,52 @@ QWidget#EditMenu QListWidget:item:hover { background: #006dc7; color: white; } + +MultyMessageDialog { + border: 2px solid #2db7f5; + border-radius: 16px; + /*background: rgba(249,250,250,180);*/ + background: rgba(239,240,241,200); +} + +MultyMessageDialog QLabel { + background: rgba(255,0,0,0); + color: black; + font: normal 14px; +} + +QLabel#MultyMessageDialogInfo { + min-width: 30px; + max-width: 30px; + min-height: 30px; + max-height: 30px; + qproperty-pixmap: url(":/icons/dicom/info.png"); + qproperty-scaledContents: true; +} + +QLabel#MultyMessageDialogWarning { + min-width: 30px; + max-width: 30px; + min-height: 30px; + max-height: 30px; + qproperty-pixmap: url(":/icons/dicom/warning.png"); + qproperty-scaledContents: true; +} + +QLabel#MultyMessageDialogError { + min-width: 30px; + max-width: 30px; + min-height: 30px; + max-height: 30px; + qproperty-pixmap: url(":/icons/dicom/echo_fail.png"); + qproperty-scaledContents: true; +} + +QLabel#MultyMessageDialogSucess { + min-width: 30px; + max-width: 30px; + min-height: 30px; + max-height: 30px; + qproperty-pixmap: url(":/icons/dicom/echo_suc.png"); + qproperty-scaledContents: true; +} diff --git a/src/windows/LoginDialog.cpp b/src/windows/LoginDialog.cpp index 39120b9..046bcd6 100644 --- a/src/windows/LoginDialog.cpp +++ b/src/windows/LoginDialog.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include @@ -25,7 +25,7 @@ LoginDialog::LoginDialog(QWidget* aParent) , mErrorMessage(new QLabel(this)) { initializeAllWidget(); - setWindowFlags(windowFlags() | Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint); + setWindowFlags(windowFlags() | Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint| Qt::BypassWindowManagerHint); setGeometry(QApplication::desktop()->screenGeometry()); mAccountEdit->setText(JsonObject::Instance()->defaultUser()); }