GUI error level Warn, ui logic(topbarWidget rolling message)
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
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)<messages.length()?(current_index+1):0;
|
|
||||||
//find next visible message
|
|
||||||
for (int i = new_index; ; ++i) {
|
|
||||||
if (i == current_index)
|
|
||||||
{
|
|
||||||
needRolling = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (visibleValues[i])
|
|
||||||
{
|
|
||||||
label_next->setText(messages[i]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (i>=messages.length())
|
|
||||||
{
|
|
||||||
i=0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else{
|
} else{
|
||||||
waitStep++;
|
waitStep++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RollingMessageWidget::setMessageList(const QStringList &message, QList<bool> visible) {
|
void RollingMessageWidget::setMessageList(const QStringList &message) {
|
||||||
messages = message;
|
//empty, don't set
|
||||||
visibleValues = visible;
|
if (message.isEmpty()) return;
|
||||||
int first_index = 0;
|
messages.clear();
|
||||||
for (int i = 0; i < messages.length(); ++i) {
|
needRolling = false;
|
||||||
if (visibleValues[i])
|
// set default label
|
||||||
|
label_current->setText(message[0]);
|
||||||
|
messages.push_back({0,message[0],0});
|
||||||
|
//add list
|
||||||
|
if (message.length()>0)
|
||||||
{
|
{
|
||||||
label_current->setText(messages[i]);
|
|
||||||
first_index = i;
|
for (int k = 1; k < message.length(); ++k) {
|
||||||
break;
|
messages.push_front({k, message[k],-1});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
for (int j = first_index+1; j < messages.length(); ++j) {
|
|
||||||
if (visibleValues[j])
|
|
||||||
{
|
|
||||||
label_next->setText(messages[j]);
|
|
||||||
needRolling = true;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
locker.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString RollingMessageWidget::getNextMessage() {
|
||||||
|
|
||||||
|
QString ret = "No message";
|
||||||
|
int retryCount = 0;
|
||||||
|
bool priorityFlag = false;
|
||||||
|
while (retryCount<messages.length()){
|
||||||
|
messages.move(0,messages.length()-1);
|
||||||
|
retryCount++;
|
||||||
|
if(messages.last().priority>=0)
|
||||||
|
{
|
||||||
|
qDebug()<<"get next:"<<messages.last().toString();
|
||||||
|
priorityFlag = messages.last().priority>0;
|
||||||
|
ret = messages.last().msg;
|
||||||
|
messages.last().priority = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (priorityFlag && waitPriorityCount > 0) waitPriorityCount--;
|
||||||
|
rollStep = 0;
|
||||||
|
rolling = true;
|
||||||
|
waitStep = 0;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user