From e3ffa9bd889117f0e309e36d560a467f66c2b4f4 Mon Sep 17 00:00:00 2001 From: Krad Date: Mon, 20 Dec 2021 13:25:31 +0800 Subject: [PATCH] GUI error level Warn, ui logic(topbarWidget rolling message) --- src/TopBarWidget.cpp | 21 +++- src/components/RollingMessageWidget.cpp | 148 ++++++++++++++++-------- src/components/RollingMessageWidget.h | 29 +++-- src/mainwindow.cpp | 19 +++ 4 files changed, 157 insertions(+), 60 deletions(-) diff --git a/src/TopBarWidget.cpp b/src/TopBarWidget.cpp index 6cc5a0d..f39f5bf 100644 --- a/src/TopBarWidget.cpp +++ b/src/TopBarWidget.cpp @@ -8,6 +8,7 @@ #include #include #include "event/EventCenter.h" +#include "errorhandle/GUIErrorLW.h" TopBarWidget::TopBarWidget(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) { QHBoxLayout* layout = new QHBoxLayout(this); @@ -64,10 +65,8 @@ TopBarWidget::TopBarWidget(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, QVBoxLayout* l = new QVBoxLayout(widgetMsg); l->setMargin(0); auto w = new RollingMessageWidget(this); - QStringList msgs; - msgs<<"message 1!"<<"message 2!"<<"message 3!"<<"message 4!"<<"message 5!"; - QList visibleValues = {true,true,true,true,true}; - w->setMessageList(msgs, visibleValues); + + w->setMessageList(GUIErrorLW::getWARNMessages()); w->setObjectName("need_border"); l->addWidget(w); connect(EventCenter::Default(), &EventCenter::ResponseDeviceTemperature, [=](QObject*, QObject* msg) { @@ -76,4 +75,18 @@ TopBarWidget::TopBarWidget(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, QString* s = (QString*)msg; lockIcon->setText(QString("%1%2").arg(*s).arg(tr("°C"))); }); + connect(EventCenter::Default(), &EventCenter::WarnStateFlagChange, [=](QObject*, QObject* msg) { + QVariant* var = (QVariant*)msg; + int v = var->toInt(); + int f = 0x00000001; + for (int i = 0; i < 32; ++i) { + int d = (f<updateMessagePriority(i,1); + } else{ + w->updateMessagePriority(i,-1); + } + } + }); } diff --git a/src/components/RollingMessageWidget.cpp b/src/components/RollingMessageWidget.cpp index e9e2e3c..d752589 100644 --- a/src/components/RollingMessageWidget.cpp +++ b/src/components/RollingMessageWidget.cpp @@ -5,6 +5,11 @@ #include "RollingMessageWidget.h" #include #include +#include + + +const int ROLL_DISTANCE = 32; +const int WAIT_TIMES = 30; RollingMessageWidget::RollingMessageWidget(QWidget *parent) :QWidget(parent){ this->setFixedHeight(36); @@ -26,67 +31,116 @@ RollingMessageWidget::RollingMessageWidget(QWidget *parent) :QWidget(parent){ void RollingMessageWidget::timerEvent(QTimerEvent *e) { if (!this->isVisible()) return; - if (!needRolling) return; - if (waitStep == 50){ + //滚动 + if (rolling) { + //end rolling, reset next + if (rollStep == ROLL_DISTANCE){ + std::swap(label_current,label_next); + rolling = false; + QPoint p3 = this->mapToGlobal({5,-30}); + p3.setX(label_next->geometry().x()); + label_next->move(p3); + return; + } + //rolling QPoint p1 = label_current->geometry().topLeft(); p1.setY(p1.y()+1); label_current->move(p1); QPoint p2 = label_next->geometry().topLeft(); p2.setY(p2.y()+1); label_next->move(p2); + rollStep++; + return ; + } + else{ - movingStep++; - if (movingStep == 32) - { - movingStep = 0; - waitStep = 0; - std::swap(label_next,label_current); - QPoint p3 = this->mapToGlobal({5,-30}); - p3.setX(label_next->geometry().x()); - label_next->move(p3); - int current_index = messages.indexOf(label_current->text()); - int new_index = (current_index+1)setText(messages[i]); - break; - } - if (i>=messages.length()) - { - i=0; - } + //有等待的高优先级消息时,不停顿 + if (waitStep == WAIT_TIMES || waitPriorityCount > 0){ + locker.lock(); + label_next->setText(getNextMessage()); + locker.unlock(); + } else{ + waitStep++; + } + } +} + +void RollingMessageWidget::setMessageList(const QStringList &message) { + //empty, don't set + if (message.isEmpty()) return; + messages.clear(); + needRolling = false; + // set default label + label_current->setText(message[0]); + messages.push_back({0,message[0],0}); + //add list + if (message.length()>0) + { + + for (int k = 1; k < message.length(); ++k) { + messages.push_front({k, message[k],-1}); + } + needRolling = true; + } + +} + +void RollingMessageWidget::updateMessagePriority(int innerIndex, int priority) { + //lock thread + locker.lock(); + //高优先级,需要插入 + if (priority > 0) + { + int idx = -1, insert_idx = -1; + for (int i = 0; i < messages.length(); ++i) { + if (messages[i].innerId == innerIndex) + { + messages[i].priority = priority; + idx = i; + } + else if (insert_idx < 0 && messages[i].priority<1) + { + insert_idx = i; + } + if (idx>=0 && insert_idx >=0) break; + } + insert_idx = insert_idx==-1?0:insert_idx; + //move + if(insert_idx visible) { - messages = message; - visibleValues = visible; - int first_index = 0; - for (int i = 0; i < messages.length(); ++i) { - if (visibleValues[i]) +QString RollingMessageWidget::getNextMessage() { + + QString ret = "No message"; + int retryCount = 0; + bool priorityFlag = false; + while (retryCount=0) { - label_current->setText(messages[i]); - first_index = i; - break; - } - } - for (int j = first_index+1; j < messages.length(); ++j) { - if (visibleValues[j]) - { - label_next->setText(messages[j]); - needRolling = true; + qDebug()<<"get next:"<0; + ret = messages.last().msg; + messages.last().priority = 0; break; } } + if (priorityFlag && waitPriorityCount > 0) waitPriorityCount--; + rollStep = 0; + rolling = true; + waitStep = 0; + return ret; } diff --git a/src/components/RollingMessageWidget.h b/src/components/RollingMessageWidget.h index 1584ed0..33814d9 100644 --- a/src/components/RollingMessageWidget.h +++ b/src/components/RollingMessageWidget.h @@ -6,30 +6,41 @@ #define GUI_ROLLINGMESSAGEWIDGET_H #include +#include class QThread; class QLabel; class QTimerEvent; class RollingMessageWidget:public QWidget { + struct WarnMessage{ + int innerId; + QString msg; + /** + * 优先级,默认为0,-1不显示,1代表插入优先显示 + */ + int priority; + QString toString(){ + return QString("{innerId:%1, msg:%2, priority:%3}").arg(innerId).arg(msg).arg(priority); + } + }; Q_OBJECT public: explicit RollingMessageWidget(QWidget *parent = nullptr); - void setMessageList(const QStringList& message,const QList visible); - void setMessageVisibility(int index, bool visible) - { - visibleValues[index] = visible; - } + void setMessageList(const QStringList& message); + void updateMessagePriority(int innerIndex, int priority); protected: void timerEvent(QTimerEvent* event) override ; - + QString getNextMessage(); private: int timerId = -1; + int waitPriorityCount = 0; int waitStep = 0; - int movingStep = 0; + int rollStep = 0; bool needRolling = false; + bool rolling = false; QLabel* label_current = nullptr; QLabel* label_next = nullptr; - QStringList messages; - QList visibleValues; + QList messages; + QMutex locker; }; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index eabe87b..55aa251 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -221,6 +221,25 @@ MainWindow::MainWindow(QWidget* parent) : }); GUIErrorHandle::Default()->init(); DeviceManager::Default()->initDevice(); + + QThread* t = QThread::create([](){ + QThread::sleep(10); + int f = 0x00100001; + for (int i = 0; i < 8; ++i) { + QThread::sleep(10); + f= f << (i*4); + printf("invoke %d\r\n", f); + char* v = (char*)&f; + QString msg; + msg.append("w "); + msg.append(v[0]); + msg.append(v[1]); + msg.append(v[2]); + msg.append(v[3]); + EventCenter::Default()->triggerEvent(GUIErrorRaise,nullptr,(QObject*)&msg); + } + }); + t->start(); centerWidgetHide(); }