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

@@ -5,6 +5,11 @@
#include "RollingMessageWidget.h"
#include <QLabel>
#include <QThread>
#include <qDebug>
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)<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;
}
//有等待的高优先级消息时,不停顿
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<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) {
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<messages.length()){
messages.move(0,messages.length()-1);
retryCount++;
if(messages.last().priority>=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:"<<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;
}