~feng-kylin/youker-assistant/youker-assistant

« back to all changes in this revision

Viewing changes to plugins/systemmonitor/networkindicator.cpp

  • Committer: lixiang
  • Date: 2018-03-06 03:13:06 UTC
  • Revision ID: lixiang@kylinos.cn-20180306031306-fd7qnru3vm4a1xjd
Rewrite with Qt5, and add system monitor

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "networkindicator.h"
 
2
#include "smoothcurvegenerator.h"
 
3
 
 
4
#include <QMouseEvent>
 
5
#include <QEvent>
 
6
#include <QPainter>
 
7
#include <QVBoxLayout>
 
8
#include <QHBoxLayout>
 
9
#include <QDebug>
 
10
 
 
11
NetworkIndicator::NetworkIndicator(QWidget *parent)
 
12
    : QWidget(parent)
 
13
    ,m_state(Normal)
 
14
    ,m_isChecked(false)
 
15
    ,m_rectTopPadding(9)
 
16
    ,m_rectTotalHeight(38)
 
17
    ,m_rectTotalWidth(58)
 
18
    ,m_outsideBorderColor(Qt::transparent)
 
19
    ,m_bgColor(QColor("#ffffff"))
 
20
{
 
21
    this->setFixedSize(188, 56);
 
22
    m_netMaxHeight = 30;
 
23
    m_pointSpace = 5;
 
24
 
 
25
    m_pointsCount = int((this->width() -2) / m_pointSpace);
 
26
    m_downloadSpeedList = new QList<long>();
 
27
    for (int i = 0; i < m_pointsCount; i++) {
 
28
        m_downloadSpeedList->append(0);
 
29
    }
 
30
 
 
31
    m_uploadSpeedList = new QList<long>();
 
32
    for (int i = 0; i < m_pointsCount; i++) {
 
33
        m_uploadSpeedList->append(0);
 
34
    }
 
35
 
 
36
    m_gridY = new QList<int>();
 
37
 
 
38
    setNetworkState(Normal);
 
39
}
 
40
 
 
41
NetworkIndicator::~NetworkIndicator()
 
42
{
 
43
    delete m_downloadSpeedList;
 
44
    delete m_uploadSpeedList;
 
45
    delete m_gridY;
 
46
}
 
47
 
 
48
void NetworkIndicator::enterEvent(QEvent *event)
 
49
{
 
50
    setCursor(Qt::PointingHandCursor);
 
51
 
 
52
    if (!m_isChecked) {
 
53
        setNetworkState(Hover);
 
54
    }
 
55
 
 
56
    event->accept();
 
57
    //QWidget::enterEvent(event);
 
58
}
 
59
 
 
60
void NetworkIndicator::leaveEvent(QEvent *event)
 
61
{
 
62
    if (!m_isChecked) {
 
63
        setNetworkState(Normal);
 
64
    }
 
65
 
 
66
    event->accept();
 
67
    //QWidget::leaveEvent(event);
 
68
}
 
69
 
 
70
void NetworkIndicator::mousePressEvent(QMouseEvent *event)
 
71
{
 
72
    if (event->button() != Qt::LeftButton)
 
73
        return;
 
74
 
 
75
    setNetworkState(Press);
 
76
 
 
77
    event->accept();
 
78
    //QWidget::mousePressEvent(event);
 
79
}
 
80
 
 
81
void NetworkIndicator::mouseReleaseEvent(QMouseEvent *event)
 
82
{
 
83
    if (!rect().contains(event->pos()))
 
84
        return;
 
85
 
 
86
    m_isChecked = !m_isChecked;
 
87
    if (m_isChecked) {
 
88
        setNetworkState(Checked);
 
89
    } else {
 
90
        setNetworkState(Normal);
 
91
    }
 
92
 
 
93
    event->accept();
 
94
    //QWidget::mouseReleaseEvent(event);
 
95
 
 
96
    if (event->button() == Qt::LeftButton)
 
97
        emit clicked();
 
98
}
 
99
 
 
100
void NetworkIndicator::mouseMoveEvent(QMouseEvent *event)
 
101
{
 
102
    if (!rect().contains(event->pos())) {
 
103
        setNetworkState(Normal);
 
104
    }
 
105
}
 
106
 
 
107
void NetworkIndicator::updateBgColor()
 
108
{
 
109
    switch (m_state) {
 
110
    case Hover:
 
111
        this->m_outsideBorderColor = Qt::transparent;
 
112
        this->m_bgColor = QColor("#f6fcfe");
 
113
        break;
 
114
    case Press:
 
115
        this->m_outsideBorderColor = Qt::transparent;
 
116
        this->m_bgColor = QColor("#f6fcfe");
 
117
        break;
 
118
    case Checked:
 
119
        this->m_outsideBorderColor = QColor("#009944");
 
120
        this->m_bgColor = QColor("#e9f8fd");
 
121
        break;
 
122
    default:
 
123
        this->m_outsideBorderColor = Qt::transparent;
 
124
        this->m_bgColor = QColor("#ffffff");
 
125
        break;
 
126
    }
 
127
    repaint();
 
128
}
 
129
 
 
130
void NetworkIndicator::setNetworkState(NetworkIndicator::NetworkState state)
 
131
{
 
132
    if (m_state == state)
 
133
        return;
 
134
 
 
135
    m_state = state;
 
136
    updateBgColor();
 
137
}
 
138
 
 
139
void NetworkIndicator::setChecked(bool flag)
 
140
{
 
141
    m_isChecked = flag;
 
142
    if (m_isChecked){
 
143
        setNetworkState(Checked);
 
144
    } else {
 
145
        setNetworkState(Normal);
 
146
    }
 
147
}
 
148
 
 
149
bool NetworkIndicator::isChecked()
 
150
{
 
151
    return m_isChecked;
 
152
}
 
153
 
 
154
void NetworkIndicator::setTitle(const QString &title)
 
155
{
 
156
    this->m_title = title;
 
157
}
 
158
 
 
159
//void NetworkIndicator::updateNetworkPainterPath(QPainterPath downloadPath, QPainterPath uploadPath)
 
160
//{
 
161
//    this->m_downloadPath = downloadPath;
 
162
//    this->m_uploadPath = uploadPath;
 
163
//    repaint();
 
164
//}
 
165
 
 
166
NetworkIndicator::NetworkState NetworkIndicator::getNetworkState() const
 
167
{
 
168
    return m_state;
 
169
}
 
170
 
 
171
void NetworkIndicator::onUpdateNetworkStatus(long recvTotalBytes, long sentTotalBytes, long recvRateBytes, long sentRateBytes)
 
172
{
 
173
    m_recvTotalBytes = recvTotalBytes;
 
174
    m_sentTotalBytes = sentTotalBytes;
 
175
    m_recvRateBytes = recvRateBytes;
 
176
    m_sentRateBytes = sentRateBytes;
 
177
 
 
178
    //download
 
179
    QList<QPointF> downloadPoints;
 
180
    m_downloadSpeedList->append(m_recvRateBytes);
 
181
    if (m_downloadSpeedList->size() > m_pointsCount) {
 
182
        m_downloadSpeedList->pop_front();
 
183
    }
 
184
    //计算出下载速度中最大的值
 
185
    long downloadMaxHeight = 0;
 
186
    for (int i = 0; i < m_downloadSpeedList->size(); i++) {
 
187
        if (m_downloadSpeedList->at(i) > downloadMaxHeight) {
 
188
            downloadMaxHeight = m_downloadSpeedList->at(i);
 
189
        }
 
190
    }
 
191
    for (int i = 0; i < m_downloadSpeedList->size(); i++) {
 
192
        if (downloadMaxHeight < m_netMaxHeight) {
 
193
            downloadPoints.append(QPointF(i * m_pointSpace, m_downloadSpeedList->at(i)));
 
194
        }
 
195
        else {
 
196
            downloadPoints.append(QPointF(i * m_pointSpace, m_downloadSpeedList->at(i) * m_netMaxHeight / downloadMaxHeight));
 
197
        }
 
198
    }
 
199
    m_downloadPath = SmoothCurveGenerator::generateSmoothCurve(downloadPoints);
 
200
 
 
201
    //upload
 
202
    QList<QPointF> uploadPoints;
 
203
    m_uploadSpeedList->append(m_sentRateBytes);
 
204
    if (m_uploadSpeedList->size() > m_pointsCount) {
 
205
        m_uploadSpeedList->pop_front();
 
206
    }
 
207
    //计算出上传速度中最大的值
 
208
    long uploadMaxHeight = 0;
 
209
    for (int i = 0; i < m_uploadSpeedList->size(); i++) {
 
210
        if (m_uploadSpeedList->at(i) > uploadMaxHeight) {
 
211
            uploadMaxHeight = m_uploadSpeedList->at(i);
 
212
        }
 
213
    }
 
214
 
 
215
    for (int i = 0; i < m_uploadSpeedList->size(); i++) {
 
216
        if (uploadMaxHeight < m_netMaxHeight) {
 
217
            uploadPoints.append(QPointF(i * m_pointSpace, m_uploadSpeedList->at(i)));
 
218
        }
 
219
        else {
 
220
            uploadPoints.append(QPointF(i * m_pointSpace, m_uploadSpeedList->at(i) * m_netMaxHeight / uploadMaxHeight));
 
221
        }
 
222
    }
 
223
    m_uploadPath = SmoothCurveGenerator::generateSmoothCurve(uploadPoints);
 
224
 
 
225
    repaint();
 
226
}
 
227
 
 
228
void NetworkIndicator::paintEvent(QPaintEvent *event)
 
229
{
 
230
    QPainter painter(this);
 
231
    painter.setRenderHint(QPainter::Antialiasing, true);
 
232
 
 
233
    //border of rect
 
234
    QPainterPath borderPath;
 
235
    borderPath.addRoundedRect(this->rect(), 0, 0);
 
236
    QPen pen(this->m_outsideBorderColor, 1);
 
237
    painter.setPen(pen);
 
238
    painter.drawPath(borderPath);
 
239
 
 
240
    //background of rect
 
241
    painter.setOpacity(1);
 
242
    QPainterPath path;
 
243
    path.addRect(QRectF(1, 1, width()-2, height()-2));
 
244
    painter.fillPath(path, this->m_bgColor);
 
245
 
 
246
    painter.translate((rect().width() - m_pointsCount * m_pointSpace) / 2 + 2, 40);//将坐标第原点移动到该点
 
247
    painter.scale(1, -1);//将横坐标扩大1倍,将纵坐标缩小1倍
 
248
    //使用QPainterPath画贝塞尔曲线
 
249
    painter.setPen(QPen(QColor("#009944"), 1));
 
250
    painter.setBrush(QBrush());
 
251
    painter.drawPath(m_downloadPath);//绘制前面创建的path:m_downloadPath
 
252
    painter.translate(0, -8);//将点(0,-8)设为原点
 
253
    painter.setPen(QPen(QColor("#e60012"), 1));
 
254
    painter.setBrush(QBrush());
 
255
    painter.drawPath(m_uploadPath);
 
256
 
 
257
    QWidget::paintEvent(event);
 
258
}
 
259