quarkai/plugins/systemmonitor/networkindicator.cpp

260 lines
6.7 KiB
C++
Raw Normal View History

#include "networkindicator.h"
#include "smoothcurvegenerator.h"
#include <QMouseEvent>
#include <QEvent>
#include <QPainter>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QDebug>
NetworkIndicator::NetworkIndicator(QWidget *parent)
: QWidget(parent)
,m_state(Normal)
,m_isChecked(false)
,m_rectTopPadding(9)
,m_rectTotalHeight(38)
,m_rectTotalWidth(58)
,m_outsideBorderColor(Qt::transparent)
,m_bgColor(QColor("#ffffff"))
{
this->setFixedSize(188, 56);
m_netMaxHeight = 30;
m_pointSpace = 5;
m_pointsCount = int((this->width() -2) / m_pointSpace);
m_downloadSpeedList = new QList<long>();
for (int i = 0; i < m_pointsCount; i++) {
m_downloadSpeedList->append(0);
}
m_uploadSpeedList = new QList<long>();
for (int i = 0; i < m_pointsCount; i++) {
m_uploadSpeedList->append(0);
}
m_gridY = new QList<int>();
2018-01-25 18:58:26 +08:00
setNetworkState(Normal);
}
NetworkIndicator::~NetworkIndicator()
{
delete m_downloadSpeedList;
delete m_uploadSpeedList;
delete m_gridY;
}
void NetworkIndicator::enterEvent(QEvent *event)
{
setCursor(Qt::PointingHandCursor);
if (!m_isChecked) {
setNetworkState(Hover);
}
event->accept();
//QWidget::enterEvent(event);
}
void NetworkIndicator::leaveEvent(QEvent *event)
{
if (!m_isChecked) {
setNetworkState(Normal);
}
event->accept();
//QWidget::leaveEvent(event);
}
void NetworkIndicator::mousePressEvent(QMouseEvent *event)
{
if (event->button() != Qt::LeftButton)
return;
setNetworkState(Press);
event->accept();
//QWidget::mousePressEvent(event);
}
void NetworkIndicator::mouseReleaseEvent(QMouseEvent *event)
{
if (!rect().contains(event->pos()))
return;
m_isChecked = !m_isChecked;
if (m_isChecked) {
setNetworkState(Checked);
} else {
setNetworkState(Normal);
}
event->accept();
//QWidget::mouseReleaseEvent(event);
if (event->button() == Qt::LeftButton)
emit clicked();
}
void NetworkIndicator::mouseMoveEvent(QMouseEvent *event)
{
if (!rect().contains(event->pos())) {
setNetworkState(Normal);
}
}
void NetworkIndicator::updateBgColor()
{
switch (m_state) {
case Hover:
this->m_outsideBorderColor = Qt::transparent;
this->m_bgColor = QColor("#f6fcfe");
break;
case Press:
this->m_outsideBorderColor = Qt::transparent;
this->m_bgColor = QColor("#f6fcfe");
break;
case Checked:
2018-01-30 17:09:06 +08:00
this->m_outsideBorderColor = QColor("#009944");
this->m_bgColor = QColor("#e9f8fd");
break;
default:
this->m_outsideBorderColor = Qt::transparent;
this->m_bgColor = QColor("#ffffff");
break;
}
repaint();
}
void NetworkIndicator::setNetworkState(NetworkIndicator::NetworkState state)
{
if (m_state == state)
return;
m_state = state;
updateBgColor();
}
void NetworkIndicator::setChecked(bool flag)
{
m_isChecked = flag;
if (m_isChecked){
setNetworkState(Checked);
} else {
setNetworkState(Normal);
}
}
bool NetworkIndicator::isChecked()
{
return m_isChecked;
}
void NetworkIndicator::setTitle(const QString &title)
{
this->m_title = title;
}
//void NetworkIndicator::updateNetworkPainterPath(QPainterPath downloadPath, QPainterPath uploadPath)
//{
// this->m_downloadPath = downloadPath;
// this->m_uploadPath = uploadPath;
// repaint();
//}
NetworkIndicator::NetworkState NetworkIndicator::getNetworkState() const
{
return m_state;
}
void NetworkIndicator::onUpdateNetworkStatus(long recvTotalBytes, long sentTotalBytes, long recvRateBytes, long sentRateBytes)
{
m_recvTotalBytes = recvTotalBytes;
m_sentTotalBytes = sentTotalBytes;
m_recvRateBytes = recvRateBytes;
m_sentRateBytes = sentRateBytes;
//download
QList<QPointF> downloadPoints;
m_downloadSpeedList->append(m_recvRateBytes);
if (m_downloadSpeedList->size() > m_pointsCount) {
m_downloadSpeedList->pop_front();
}
//计算出下载速度中最大的值
long downloadMaxHeight = 0;
for (int i = 0; i < m_downloadSpeedList->size(); i++) {
if (m_downloadSpeedList->at(i) > downloadMaxHeight) {
downloadMaxHeight = m_downloadSpeedList->at(i);
}
}
for (int i = 0; i < m_downloadSpeedList->size(); i++) {
if (downloadMaxHeight < m_netMaxHeight) {
downloadPoints.append(QPointF(i * m_pointSpace, m_downloadSpeedList->at(i)));
}
else {
downloadPoints.append(QPointF(i * m_pointSpace, m_downloadSpeedList->at(i) * m_netMaxHeight / downloadMaxHeight));
}
}
m_downloadPath = SmoothCurveGenerator::generateSmoothCurve(downloadPoints);
//upload
QList<QPointF> uploadPoints;
m_uploadSpeedList->append(m_sentRateBytes);
if (m_uploadSpeedList->size() > m_pointsCount) {
m_uploadSpeedList->pop_front();
}
//计算出上传速度中最大的值
long uploadMaxHeight = 0;
for (int i = 0; i < m_uploadSpeedList->size(); i++) {
if (m_uploadSpeedList->at(i) > uploadMaxHeight) {
uploadMaxHeight = m_uploadSpeedList->at(i);
}
}
for (int i = 0; i < m_uploadSpeedList->size(); i++) {
if (uploadMaxHeight < m_netMaxHeight) {
uploadPoints.append(QPointF(i * m_pointSpace, m_uploadSpeedList->at(i)));
}
else {
uploadPoints.append(QPointF(i * m_pointSpace, m_uploadSpeedList->at(i) * m_netMaxHeight / uploadMaxHeight));
}
}
m_uploadPath = SmoothCurveGenerator::generateSmoothCurve(uploadPoints);
repaint();
}
void NetworkIndicator::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
//border of rect
QPainterPath borderPath;
borderPath.addRoundedRect(this->rect(), 0, 0);
QPen pen(this->m_outsideBorderColor, 1);
painter.setPen(pen);
painter.drawPath(borderPath);
//background of rect
painter.setOpacity(1);
QPainterPath path;
path.addRect(QRectF(1, 1, width()-2, height()-2));
painter.fillPath(path, this->m_bgColor);
painter.translate((rect().width() - m_pointsCount * m_pointSpace) / 2 + 2, 40);//将坐标第原点移动到该点
painter.scale(1, -1);//将横坐标扩大1倍,将纵坐标缩小1倍
//使用QPainterPath画贝塞尔曲线
2018-01-30 17:09:06 +08:00
painter.setPen(QPen(QColor("#009944"), 1));
painter.setBrush(QBrush());
painter.drawPath(m_downloadPath);//绘制前面创建的path:m_downloadPath
painter.translate(0, -8);//将点0-8设为原点
2018-01-30 17:09:06 +08:00
painter.setPen(QPen(QColor("#e60012"), 1));
painter.setBrush(QBrush());
painter.drawPath(m_uploadPath);
QWidget::paintEvent(event);
}