quarkai/plugins/systemmonitor/memorycircle.cpp

206 lines
7.7 KiB
C++
Raw Normal View History

2018-01-25 18:58:26 +08:00
#include "memorycircle.h"
#include "util.h"
#include <QDebug>
#include <QObject>
inline QString formatMemory(guint64 size)
{
enum {
K_INDEX,
M_INDEX,
G_INDEX,
T_INDEX
};
QList<guint64> factorList;
factorList.append(G_GUINT64_CONSTANT(1) << 10);//KiB
factorList.append(G_GUINT64_CONSTANT(1) << 20);//MiB
factorList.append(G_GUINT64_CONSTANT(1) << 30);//GiB
factorList.append(G_GUINT64_CONSTANT(1) << 40);//TiB
if (size < factorList.at(K_INDEX)) {
if ((guint) size > 1) {
return QString("%1 %2").arg((guint) size).arg(QObject::tr("byte"));
}
else {
return QString("%1 %2").arg((guint) size).arg(QObject::tr("bytes"));
}
} else {
guint64 factor;
QString format;
if (size < factorList.at(M_INDEX)) {
factor = factorList.at(K_INDEX);
format = QObject::tr("KiB");
}else if (size < factorList.at(G_INDEX)) {
factor = factorList.at(M_INDEX);
format = QObject::tr("MiB");
} else if (size < factorList.at(T_INDEX)) {
factor = factorList.at(G_INDEX);
format = QObject::tr("GiB");
} else {
factor = factorList.at(T_INDEX);
format = QObject::tr("TiB");
}
std::string formatted_result(make_string(g_strdup_printf("%.1f", size / (double)factor)));
return QString::fromStdString(formatted_result) + format;
}
}
MemoryCircle::MemoryCircle(QWidget *parent)
: QWidget(parent)
{
this->setFixedSize(400, 300);
circleRadius = 128/2; //半径
rectWidth = 100; //文本框宽
rectHeight = 20; // 文本框高
center = rect().center();
center.setX(center.x()/2);
center.setY(center.y()/2);
swapcenter = rect().center();
swapcenter.setX(swapcenter.x()*3/2);
swapcenter.setY(swapcenter.y()/2);
}
MemoryCircle::~MemoryCircle()
{
}
2018-01-26 18:20:43 +08:00
void MemoryCircle::drawCircle(QPainter &painter, bool isSwap)
2018-01-25 18:58:26 +08:00
{
//渐变效果设置
/*QRadialGradient circleGradient(center, circleRadius, center);
circleGradient.setColorAt(0.0, QColor(220, 220, 220));
circleGradient.setColorAt(0.2, QColor(220, 220, 220));
circleGradient.setColorAt(0.4, QColor(240, 240, 240));
circleGradient.setColorAt(1.0, QColor(220, 220, 220));*/
QPen pen;
if (isSwap)
pen.setColor(QColor("#fc7416"));
else
pen.setColor(QColor("#9528b4"));
pen.setWidth(1);
2018-01-26 18:20:43 +08:00
painter.setPen(pen);
// painter.setBrush(circleGradient);
painter.setBrush(QBrush(QColor("#ffffff")));
2018-01-25 18:58:26 +08:00
if (isSwap)
2018-01-26 18:20:43 +08:00
painter.drawEllipse(swapcenter, circleRadius, circleRadius);
2018-01-25 18:58:26 +08:00
else
2018-01-26 18:20:43 +08:00
painter.drawEllipse(center, circleRadius, circleRadius);
2018-01-25 18:58:26 +08:00
}
2018-01-26 18:20:43 +08:00
void MemoryCircle::drawColorPie(QPainter &painter, bool isSwap)
2018-01-25 18:58:26 +08:00
{
//内存矩形,绘制扇形需要的参数,圆在矩形内且与矩形相切
QPointF pieRectLeftTop(center.x()-circleRadius, center.y()-circleRadius);
QPointF pieRectRightBottom(center.x()+circleRadius, center.y()+circleRadius);
pieRect = QRectF(pieRectLeftTop, pieRectRightBottom);
//SWAP矩形范围绘制扇形需要的参数圆在矩形内且与矩形相切
QPointF swapRectLeftTop(swapcenter.x()-circleRadius, swapcenter.y()-circleRadius);
QPointF swapRectRightBottom(swapcenter.x()+circleRadius, swapcenter.y()+circleRadius);
swappieRect = QRectF(swapRectLeftTop, swapRectRightBottom);
if (isSwap) {
if (mi.swappercent == 0)
2018-01-26 18:20:43 +08:00
painter.setPen(Qt::NoPen);
2018-01-25 18:58:26 +08:00
else {
QPen pen;
pen.setColor(QColor("#fc7416"));
pen.setWidth(1);
2018-01-26 18:20:43 +08:00
painter.setPen(pen);
2018-01-25 18:58:26 +08:00
}
2018-01-26 18:20:43 +08:00
painter.setBrush(QBrush(QColor("#fef5f1")));
2018-01-25 18:58:26 +08:00
float swapcurrentPie = - (360 * (mi.swappercent/100)); //负数顺时针
2018-01-26 18:20:43 +08:00
painter.drawPie(swappieRect, 90*16, swapcurrentPie*16);//绘制扇形90*16为初始12点钟位置
2018-01-25 18:58:26 +08:00
}
else {
if (mi.percent == 0)
2018-01-26 18:20:43 +08:00
painter.setPen(Qt::NoPen);
2018-01-25 18:58:26 +08:00
else {
QPen pen;
pen.setColor(QColor("#9528b4"));
pen.setWidth(1);
2018-01-26 18:20:43 +08:00
painter.setPen(pen);
2018-01-25 18:58:26 +08:00
}
2018-01-26 18:20:43 +08:00
painter.setBrush(QBrush(QColor("#f4e9f7")));
2018-01-25 18:58:26 +08:00
float currentPie = - (360 * (mi.percent/100)); //负数顺时针0*16为3点钟位置
2018-01-26 18:20:43 +08:00
painter.drawPie(pieRect, 90*16, currentPie*16); //绘制扇形90*16为初始12点钟位置
2018-01-25 18:58:26 +08:00
}
}
2018-01-26 18:20:43 +08:00
void MemoryCircle::drawTextInfo(QPainter &painter)
2018-01-25 18:58:26 +08:00
{
2018-01-26 18:20:43 +08:00
setFontSize(painter, 20);
painter.setPen(QPen(QColor("#000000")));
painter.drawText(QRect(center.x()-circleRadius, center.y() + circleRadius + 10, circleRadius*2, 30), Qt::AlignCenter, tr("Memory"));
painter.drawText(QRect(swapcenter.x()-circleRadius, swapcenter.y() + circleRadius + 10, circleRadius*2, 30), Qt::AlignCenter, tr("Swap"));
2018-01-25 18:58:26 +08:00
//draw title
2018-01-26 18:20:43 +08:00
setFontSize(painter, 12);
painter.setPen(QPen(QColor("#999999")));
painter.drawText(QRect(center.x()-circleRadius, center.y() + circleRadius + 40, circleRadius*2, 30), Qt::AlignLeft |Qt::AlignVCenter, tr("Used(Percent)"));
painter.drawText(QRect(swapcenter.x()-circleRadius, swapcenter.y() + circleRadius + 40, circleRadius*2, 30), Qt::AlignLeft |Qt::AlignVCenter, tr("Used(Percent)"));
painter.drawText(QRect(center.x()-circleRadius, center.y() + circleRadius + 100, circleRadius*2, 30), Qt::AlignLeft |Qt::AlignVCenter, tr("Total"));
painter.drawText(QRect(swapcenter.x()-circleRadius, swapcenter.y() + circleRadius + 100, circleRadius*2, 30), Qt::AlignLeft |Qt::AlignVCenter, tr("Total"));
2018-01-25 18:58:26 +08:00
//draw text data
2018-01-26 18:20:43 +08:00
setFontSize(painter, 20);
QFontMetrics fm = painter.fontMetrics();
painter.setPen(QPen(QColor("#000000")));
2018-01-25 18:58:26 +08:00
const QString memeryUsed = tr("%1(%2%)").arg(formatMemory(mi.user)).arg(QString::number(mi.percent, 'f', 1));
const QString swapUsed = tr("%1(%2%)").arg(formatMemory(mi.swapused)).arg(QString::number(mi.swappercent, 'f', 1));
2018-01-26 18:20:43 +08:00
painter.drawText(QRect(center.x()-circleRadius, center.y() + circleRadius + 70, fm.width(memeryUsed), 30), Qt::AlignLeft |Qt::AlignVCenter, memeryUsed);
painter.drawText(QRect(swapcenter.x()-circleRadius, swapcenter.y() + circleRadius + 70, fm.width(swapUsed), 30), Qt::AlignLeft |Qt::AlignVCenter, swapUsed);
painter.drawText(QRect(center.x()-circleRadius, center.y() + circleRadius + 130, circleRadius*2, 30), Qt::AlignLeft |Qt::AlignVCenter, formatMemory(mi.total));
painter.drawText(QRect(swapcenter.x()-circleRadius, swapcenter.y() + circleRadius + 130, circleRadius*2, 30), Qt::AlignLeft |Qt::AlignVCenter, formatMemory(mi.swaptotal));
2018-01-25 18:58:26 +08:00
}
void MemoryCircle::onUpdateMemoryStatus()
{
glibtop_mem mem;
glibtop_swap swap;
glibtop_get_mem(&mem);
glibtop_get_swap(&swap);
float swappercent = (swap.total ? (float)swap.used / (float)swap.total : 0.0f);
float mempercent = (float)mem.user / (float)mem.total;
mi.percent = mempercent * 100;
mi.swappercent = swappercent * 100;
//初始单位为字节,需要修正
mi.user = mem.user;
mi.total = mem.total;
mi.swapused = swap.used;
mi.swaptotal = swap.total;
2018-01-26 18:20:43 +08:00
const QString info = QString("%1/%2(%3%)").arg(formatMemory(mi.user)).arg(formatMemory(mi.total)).arg(QString::number(mi.percent, 'f', 1));
emit rebackMemoryInfo(info, mi.percent);
repaint();//this->update();
2018-01-25 18:58:26 +08:00
}
void MemoryCircle::paintEvent(QPaintEvent *event)
{
2018-01-26 18:20:43 +08:00
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);//反走样,绘制出来的线条会出现锯齿
2018-01-25 18:58:26 +08:00
//draw memory circle
2018-01-26 18:20:43 +08:00
drawCircle(painter);
drawColorPie(painter);
2018-01-25 18:58:26 +08:00
//draw swap circle
2018-01-26 18:20:43 +08:00
drawCircle(painter, true);
drawColorPie(painter, true);
2018-01-25 18:58:26 +08:00
painter.setRenderHint(QPainter::Antialiasing, false);
2018-01-26 18:20:43 +08:00
drawTextInfo(painter);
2018-01-25 18:58:26 +08:00
}