quarkai/plugins/systemmonitor/networkindicator.cpp

260 lines
6.7 KiB
C++
Raw Permalink 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 "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>();
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:
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画贝塞尔曲线
painter.setPen(QPen(QColor("#009944"), 1));
painter.setBrush(QBrush());
painter.drawPath(m_downloadPath);//绘制前面创建的path:m_downloadPath
painter.translate(0, -8);//将点0-8设为原点
painter.setPen(QPen(QColor("#e60012"), 1));
painter.setBrush(QBrush());
painter.drawPath(m_uploadPath);
QWidget::paintEvent(event);
}