PowerMaster/source/alarmEventRealTimeDock.cpp

225 lines
6.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "alarmEventRealTimeDock.h"
#include "./ui_alarmEventRealTimeDock.h"
#include "alarmEventDataView.h"
#include <QPropertyAnimation>
#include <QTimer>
#define bottomMargin 0
AlarmEventRealTimeDock::AlarmEventRealTimeDock(QWidget* parent)
: QWidget(parent)
, ui(new Ui::alarmEventRealTimeDock)
{
ui->setupUi(this);
setAttribute(Qt::WA_TranslucentBackground);
m_isInAnimationExpand = false;
m_isInAnimationAlert = false;
m_curState = "collapse";
m_tableView = new AlarmEventDataView(RealTime, this);
ui->tableLayout->addWidget(m_tableView);
connect(m_tableView->model(), &AlarmEventDataModel::receivedNewAlarm, this, &AlarmEventRealTimeDock::onSIG_receivedNewAlarm);
m_animationExpand = new QPropertyAnimation(this, "geometry", this);
m_animationExpand->setDuration(120);
connect(m_animationExpand, &QPropertyAnimation::finished, this, [this]{m_isInAnimationExpand = false;});
m_animationAlert = new QPropertyAnimation(this, "alertWidgetBGColorAlpha", this);
m_animationAlert->setDuration(2500);
m_animationAlert->setStartValue(0.0);
m_animationAlert->setEndValue(1.0);
m_animationAlert->setLoopCount(-1);//无限循环
m_alertWidgetStyleSheet = QString(
"background-color: qradialgradient("
"spread:pad, "
"cx:0.5, cy:0.5, radius:0.5, "
"fx:0.5, fy:0.5, "
"stop:0 rgba(200, 0, 0, 0), "
"stop:1 rgba(255, 255, 255, 0));"
);
ui->btnClose->setVisible(false);
connect(ui->btnOpen, &QPushButton::clicked, this, &AlarmEventRealTimeDock::onBtnClicked_open);
connect(ui->btnClose, &QPushButton::clicked, this, &AlarmEventRealTimeDock::onBtnClicked_close);
connect(ui->btnConfirmAll, &QPushButton::clicked, this, &AlarmEventRealTimeDock::onBtnClicked_confirmAll);
connect(ui->btnCheckAll, &QPushButton::clicked, this, &AlarmEventRealTimeDock::onBtnClicked_checkAll);
/*if(parent)
{
int parentWidth = parent->width();
int parentHeight = parent->height();
int selfWidth = parentWidth * 0.8;
int x = (parentWidth - selfWidth) * 0.5;
int y = parentHeight - ui->tobBar->height();
setGeometry(x, y, selfWidth, height());
}*/
}
AlarmEventRealTimeDock::~AlarmEventRealTimeDock()
{}
void AlarmEventRealTimeDock::expand()
{
if(m_isInAnimationExpand || m_curState == "expand" )
return;
QWidget* parent = this->parentWidget();
if(parent)
{
QRect startRect(x(), y(), width(), height());
QRect endRect(x(), parent->height() - height() - bottomMargin, width(), height());
m_animationExpand->setStartValue(startRect);
m_animationExpand->setEndValue(endRect);
m_animationExpand->start();
m_curState = "expand";
m_isInAnimationExpand = true;
stopAlarmAlert();
}
}
void AlarmEventRealTimeDock::collapse()
{
if(m_isInAnimationExpand || m_curState == "collapse" )
return;
QWidget* parent = this->parentWidget();
if(parent)
{
QRect startRect(x(), y(), width(), height());
QRect endRect(x(), parent->height() - ui->tobBar->height() - ui->alertWidget->height(), width(), height());
m_animationExpand->setStartValue(startRect);
m_animationExpand->setEndValue(endRect);
m_animationExpand->start();
m_curState = "collapse";
m_isInAnimationExpand = true;
}
}
void AlarmEventRealTimeDock::updateGeometry()
{
QWidget* parent = this->parentWidget();
if(parent)
{
int parentWidth = parent->width();
int parentHeight = parent->height();
int selfWidth = parentWidth * 0.8;
int x = (parentWidth - selfWidth) * 0.5;
int y = parentHeight - ui->tobBar->height() - ui->alertWidget->height();
if(m_curState == "expand")
y = parentHeight - this->height() - bottomMargin;
setGeometry(x, y, selfWidth, height());
}
}
void AlarmEventRealTimeDock::startAlarmAlert()
{
if(m_isInAnimationAlert || m_curState == "expand")
return;
m_animationAlert->start();
m_isInAnimationAlert = true;
}
void AlarmEventRealTimeDock::stopAlarmAlert()
{
if(!m_isInAnimationAlert)
return;
m_animationAlert->stop();
m_isInAnimationAlert = false;
m_alertWidgetStyleSheet = QString(
"background-color: qradialgradient("
"spread:pad, "
"cx:0.5, cy:0.5, radius:0.5, "
"fx:0.5, fy:0.5, "
"stop:0 rgba(200, 0, 0, 0), "
"stop:1 rgba(255, 255, 255, 0));"
);
ui->alertWidget->setStyleSheet(m_alertWidgetStyleSheet);
}
void AlarmEventRealTimeDock::setAlertWidgetBGColorAlpha(float value)
{
m_alertWidgetBGColorAlpha = value;
updateAlertWidgetBGColorAlpha();
}
void AlarmEventRealTimeDock::updateAlertWidgetBGColorAlpha()
{
// 计算透明度 (从0到200再到0)
int alpha = 200 * (1 - qAbs(2 * m_alertWidgetBGColorAlpha - 1));
if(alpha == 1) //1表示不透具体原因未探究舍弃该值
return;
QString styleSheet = QString(
"background-color: qradialgradient("
"spread:pad, "
"cx:0.5, cy:0.5, radius:0.5, "
"fx:0.5, fy:0.5, "
"stop:0 rgba(200, 0, 0, %1), "
"stop:1 rgba(255, 255, 255, 0));"
).arg(alpha);
if(m_alertWidgetStyleSheet != styleSheet)
{
//qDebug() << alpha;
ui->alertWidget->setStyleSheet(styleSheet);
m_alertWidgetStyleSheet = styleSheet;
}
}
void AlarmEventRealTimeDock::onBtnClicked_open()
{
expand();
ui->btnOpen->setVisible(false);
ui->btnClose->setVisible(true);
}
void AlarmEventRealTimeDock::onBtnClicked_close()
{
collapse();
ui->btnOpen->setVisible(true);
ui->btnClose->setVisible(false);
}
void AlarmEventRealTimeDock::onBtnClicked_confirmAll()
{
//stopAlarmAlert();
}
void AlarmEventRealTimeDock::onBtnClicked_checkAll()
{
emit viewAllRealTimeEvents();
}
void AlarmEventRealTimeDock::onSIG_receivedNewAlarm(const EventData& event)
{
startAlarmAlert();
m_alarmDataStatics.allCount++;
ui->alarmCount->setText(QString::number(m_alarmDataStatics.allCount));
if(event.severity == "事故")
{
m_alarmDataStatics.accidentCount++;
ui->accidentCount->setText(QString::number(m_alarmDataStatics.accidentCount));
}
else if(event.severity == "异常")
{
m_alarmDataStatics.abnormalCount++;
ui->abnormalCount->setText(QString::number(m_alarmDataStatics.abnormalCount));
}
else if(event.severity == "预警")
{
m_alarmDataStatics.alertCount++;
ui->alertCount->setText(QString::number(m_alarmDataStatics.alertCount));
}
else if(event.severity == "告知")
{
m_alarmDataStatics.informCount++;
ui->informCount->setText(QString::number(m_alarmDataStatics.informCount));
}
}