2018-01-24 18:30:21 +08:00
|
|
|
|
#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);
|
2018-01-24 18:30:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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");
|
2018-01-24 18:30:21 +08:00
|
|
|
|
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));
|
2018-01-24 18:30:21 +08:00
|
|
|
|
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));
|
2018-01-24 18:30:21 +08:00
|
|
|
|
painter.setBrush(QBrush());
|
|
|
|
|
painter.drawPath(m_uploadPath);
|
|
|
|
|
|
|
|
|
|
QWidget::paintEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|