GUI error level Warn, ui logic(topbarWidget rolling message)

This commit is contained in:
Krad
2021-12-20 13:25:31 +08:00
parent 8feee9b113
commit e3ffa9bd88
4 changed files with 157 additions and 60 deletions

View File

@@ -8,6 +8,7 @@
#include <src/components/RollingMessageWidget.h> #include <src/components/RollingMessageWidget.h>
#include <QDateTime> #include <QDateTime>
#include "event/EventCenter.h" #include "event/EventCenter.h"
#include "errorhandle/GUIErrorLW.h"
TopBarWidget::TopBarWidget(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) { TopBarWidget::TopBarWidget(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) {
QHBoxLayout* layout = new QHBoxLayout(this); QHBoxLayout* layout = new QHBoxLayout(this);
@@ -64,10 +65,8 @@ TopBarWidget::TopBarWidget(QWidget *parent, Qt::WindowFlags f) : QWidget(parent,
QVBoxLayout* l = new QVBoxLayout(widgetMsg); QVBoxLayout* l = new QVBoxLayout(widgetMsg);
l->setMargin(0); l->setMargin(0);
auto w = new RollingMessageWidget(this); auto w = new RollingMessageWidget(this);
QStringList msgs;
msgs<<"message 1!"<<"message 2!"<<"message 3!"<<"message 4!"<<"message 5!"; w->setMessageList(GUIErrorLW::getWARNMessages());
QList<bool> visibleValues = {true,true,true,true,true};
w->setMessageList(msgs, visibleValues);
w->setObjectName("need_border"); w->setObjectName("need_border");
l->addWidget(w); l->addWidget(w);
connect(EventCenter::Default(), &EventCenter::ResponseDeviceTemperature, [=](QObject*, QObject* msg) { 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; QString* s = (QString*)msg;
lockIcon->setText(QString("%1%2").arg(*s).arg(tr("°C"))); 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<<i);
if (d & v){
printf("warn %d, val:%d\r\n", i, v);
w->updateMessagePriority(i,1);
} else{
w->updateMessagePriority(i,-1);
}
}
});
} }

View File

@@ -5,6 +5,11 @@
#include "RollingMessageWidget.h" #include "RollingMessageWidget.h"
#include <QLabel> #include <QLabel>
#include <QThread> #include <QThread>
#include <qDebug>
const int ROLL_DISTANCE = 32;
const int WAIT_TIMES = 30;
RollingMessageWidget::RollingMessageWidget(QWidget *parent) :QWidget(parent){ RollingMessageWidget::RollingMessageWidget(QWidget *parent) :QWidget(parent){
this->setFixedHeight(36); this->setFixedHeight(36);
@@ -26,67 +31,116 @@ RollingMessageWidget::RollingMessageWidget(QWidget *parent) :QWidget(parent){
void RollingMessageWidget::timerEvent(QTimerEvent *e) { void RollingMessageWidget::timerEvent(QTimerEvent *e) {
if (!this->isVisible()) return; 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(); QPoint p1 = label_current->geometry().topLeft();
p1.setY(p1.y()+1); p1.setY(p1.y()+1);
label_current->move(p1); label_current->move(p1);
QPoint p2 = label_next->geometry().topLeft(); QPoint p2 = label_next->geometry().topLeft();
p2.setY(p2.y()+1); p2.setY(p2.y()+1);
label_next->move(p2); label_next->move(p2);
rollStep++;
return ;
}
else{
movingStep++; //有等待的高优先级消息时,不停顿
if (movingStep == 32) if (waitStep == WAIT_TIMES || waitPriorityCount > 0){
{ locker.lock();
movingStep = 0; label_next->setText(getNextMessage());
waitStep = 0; locker.unlock();
std::swap(label_next,label_current); } else{
QPoint p3 = this->mapToGlobal({5,-30}); waitStep++;
p3.setX(label_next->geometry().x()); }
label_next->move(p3); }
int current_index = messages.indexOf(label_current->text()); }
int new_index = (current_index+1)<messages.length()?(current_index+1):0;
//find next visible message void RollingMessageWidget::setMessageList(const QStringList &message) {
for (int i = new_index; ; ++i) { //empty, don't set
if (i == current_index) if (message.isEmpty()) return;
{ messages.clear();
needRolling = false; needRolling = false;
break; // set default label
} label_current->setText(message[0]);
if (visibleValues[i]) messages.push_back({0,message[0],0});
{ //add list
label_next->setText(messages[i]); if (message.length()>0)
break; {
}
if (i>=messages.length()) for (int k = 1; k < message.length(); ++k) {
{ messages.push_front({k, message[k],-1});
i=0; }
} 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<idx)messages.move(idx,insert_idx);
waitPriorityCount++;
}
// 低优先级,更新状态即可
else{
for (WarnMessage & message : messages) {
if (message.innerId == innerIndex) {
message.priority = -1;
break;
} }
} }
} else{
waitStep++;
} }
locker.unlock();
} }
void RollingMessageWidget::setMessageList(const QStringList &message, QList<bool> visible) { QString RollingMessageWidget::getNextMessage() {
messages = message;
visibleValues = visible; QString ret = "No message";
int first_index = 0; int retryCount = 0;
for (int i = 0; i < messages.length(); ++i) { bool priorityFlag = false;
if (visibleValues[i]) while (retryCount<messages.length()){
messages.move(0,messages.length()-1);
retryCount++;
if(messages.last().priority>=0)
{ {
label_current->setText(messages[i]); qDebug()<<"get next:"<<messages.last().toString();
first_index = i; priorityFlag = messages.last().priority>0;
break; ret = messages.last().msg;
} messages.last().priority = 0;
}
for (int j = first_index+1; j < messages.length(); ++j) {
if (visibleValues[j])
{
label_next->setText(messages[j]);
needRolling = true;
break; break;
} }
} }
if (priorityFlag && waitPriorityCount > 0) waitPriorityCount--;
rollStep = 0;
rolling = true;
waitStep = 0;
return ret;
} }

View File

@@ -6,30 +6,41 @@
#define GUI_ROLLINGMESSAGEWIDGET_H #define GUI_ROLLINGMESSAGEWIDGET_H
#include <QWidget> #include <QWidget>
#include <QMutex>
class QThread; class QThread;
class QLabel; class QLabel;
class QTimerEvent; class QTimerEvent;
class RollingMessageWidget:public QWidget { 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 Q_OBJECT
public: public:
explicit RollingMessageWidget(QWidget *parent = nullptr); explicit RollingMessageWidget(QWidget *parent = nullptr);
void setMessageList(const QStringList& message,const QList<bool> visible); void setMessageList(const QStringList& message);
void setMessageVisibility(int index, bool visible) void updateMessagePriority(int innerIndex, int priority);
{
visibleValues[index] = visible;
}
protected: protected:
void timerEvent(QTimerEvent* event) override ; void timerEvent(QTimerEvent* event) override ;
QString getNextMessage();
private: private:
int timerId = -1; int timerId = -1;
int waitPriorityCount = 0;
int waitStep = 0; int waitStep = 0;
int movingStep = 0; int rollStep = 0;
bool needRolling = false; bool needRolling = false;
bool rolling = false;
QLabel* label_current = nullptr; QLabel* label_current = nullptr;
QLabel* label_next = nullptr; QLabel* label_next = nullptr;
QStringList messages; QList<WarnMessage> messages;
QList<bool> visibleValues; QMutex locker;
}; };

View File

@@ -221,6 +221,25 @@ MainWindow::MainWindow(QWidget* parent) :
}); });
GUIErrorHandle::Default()->init(); GUIErrorHandle::Default()->init();
DeviceManager::Default()->initDevice(); 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(); centerWidgetHide();
} }