quarkai/plugins/systemmonitor/systemmonitor.cpp

423 lines
13 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.

/*
* Copyright (C) 2013 ~ 2018 National University of Defense Technology(NUDT) & Tianjin Kylin Ltd.
*
* Authors:
* Kobe Lee xiangli@ubuntukylin.com/kobe24_lixiang@126.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "systemmonitor.h"
#include "util.h"
#include <QFileSystemWatcher>
#include <QLabel>
#include <QDebug>
#include <QMouseEvent>
#include <QDesktopWidget>
#include <QFile>
#include <QHBoxLayout>
#include <QApplication>
#include <QScreen>
#include <QGraphicsDropShadowEffect>
SystemMonitor::SystemMonitor(QWidget *parent)
: QFrame(parent)
, mousePressed(false)
{
// this->setStyleSheet("QFrame{border: 1px solid #121212;border-radius:1px;background-color:#1f1f1f;}");
// this->setAttribute(Qt::WA_DeleteOnClose);
// this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint | Qt::WindowCloseButtonHint);//去掉边框
// this->setAttribute(Qt::WA_TranslucentBackground);//背景透明
//kobe:如果不加Qt::WindowMinimizeButtonHint则调用setFixedSize()之后,调用窗口最小化函数将会没有效果
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint);
// this->setWindowFlags(Qt::FramelessWindowHint);
// this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);//Attention: Qt::WindowCloseButtonHint make showMinimized() valid
this->setAutoFillBackground(true);
this->setMouseTracking(true);
// installEventFilter(this);
this->setWindowTitle(tr("Kylin System Monitor"));
this->setWindowIcon(QIcon(":/model/res/plugin/processmanager.png"));
this->resize(900, 600);
setMinimumSize(640, 480);
proSettings = new QSettings(KYLIN_COMPANY_SETTING, KYLIN_SETTING_FILE_NAME_SETTING);
proSettings->setIniCodec("UTF-8");
this->initTitleWidget();
this->initPanelStack();
this->initConnections();
//边框阴影效果
QGraphicsDropShadowEffect *shadow_effect = new QGraphicsDropShadowEffect(this);
shadow_effect->setBlurRadius(5);
shadow_effect->setColor(QColor(0, 0, 0, 127));
shadow_effect->setOffset(2, 4);
this->setGraphicsEffect(shadow_effect);
this->moveCenter();
}
SystemMonitor::~SystemMonitor()
{
if (m_sysMonitorStack) {
foreach (QObject *child, m_sysMonitorStack->children()) {
QWidget *widget = static_cast<QWidget *>(child);
widget->deleteLater();
}
delete m_sysMonitorStack;
}
if (m_titleWidget) {
delete m_titleWidget;
m_titleWidget = nullptr;
}
if (process_dialog) {
delete process_dialog;
process_dialog = nullptr;
}
if (resources_dialog) {
delete resources_dialog;
resources_dialog = nullptr;
}
if (filesystem_dialog) {
delete filesystem_dialog;
filesystem_dialog = nullptr;
}
if (proSettings != NULL) {
delete proSettings;
proSettings = NULL;
}
}
void SystemMonitor::resizeEvent(QResizeEvent *e)
{
if (m_titleWidget) {
m_titleWidget->resize(width() - 2, MONITOR_TITLE_WIDGET_HEIGHT);
if (e->oldSize() != e->size()) {
emit m_titleWidget->updateMaxBtn();
}
}
if (m_sysMonitorStack) {
m_sysMonitorStack->resize(width() - 2, this->height() - MONITOR_TITLE_WIDGET_HEIGHT - 2);
m_sysMonitorStack->move(1, MONITOR_TITLE_WIDGET_HEIGHT + 1);
}
}
void SystemMonitor::recordProcessVisibleColumn(int, bool, QList<bool> columnVisible)
{
QList<QString> m_visibleColumns;
m_visibleColumns << "name";
if (columnVisible[1]) {
m_visibleColumns << "user";
}
if (columnVisible[2]) {
m_visibleColumns << "status";
}
if (columnVisible[3]) {
m_visibleColumns << "cpu";
}
if (columnVisible[4]) {
m_visibleColumns << "pid";
}
if (columnVisible[5]) {
m_visibleColumns << "command";
}
if (columnVisible[6]) {
m_visibleColumns << "memory";
}
if (columnVisible[7]) {
m_visibleColumns << "priority";
}
QString displayedColumns = "";
for (int i = 0; i < m_visibleColumns.length(); i++) {
if (i != m_visibleColumns.length() - 1) {
displayedColumns += QString("%1,").arg(m_visibleColumns[i]);
} else {
displayedColumns += m_visibleColumns[i];
}
}
proSettings->beginGroup("PROCESS");
proSettings->setValue("DisplayedColumns", displayedColumns);
proSettings->endGroup();
proSettings->sync();
}
void SystemMonitor::recordSortStatus(int index, bool isSort)
{
QList<QString> columnNames = { "name", "user", "status", "cpu", "pid", "command", "memory", "priority"};
proSettings->beginGroup("PROCESS");
proSettings->setValue("CurrentSortColumn", columnNames[index]);
proSettings->setValue("IsSort", isSort);
proSettings->endGroup();
proSettings->sync();
}
void SystemMonitor::recordFileSysVisibleColumn(int, bool, QList<bool> columnVisible)
{
QList<QString> m_visibleColumns;
m_visibleColumns << "device";
if (columnVisible[1]) {
m_visibleColumns << "directory";
}
if (columnVisible[2]) {
m_visibleColumns << "type";
}
if (columnVisible[3]) {
m_visibleColumns << "total";
}
if (columnVisible[4]) {
m_visibleColumns << "free";
}
if (columnVisible[5]) {
m_visibleColumns << "available";
}
if (columnVisible[6]) {
m_visibleColumns << "used";
}
QString displayedColumns = "";
for (int i = 0; i < m_visibleColumns.length(); i++) {
if (i != m_visibleColumns.length() - 1) {
displayedColumns += QString("%1,").arg(m_visibleColumns[i]);
} else {
displayedColumns += m_visibleColumns[i];
}
}
proSettings->beginGroup("FileSystem");
proSettings->setValue("DisplayedColumns", displayedColumns);
proSettings->endGroup();
proSettings->sync();
}
void SystemMonitor::initPanelStack()
{
m_sysMonitorStack = new QStackedWidget(this);
m_sysMonitorStack->setStyleSheet("QStackedWidget{background: rgb(255, 255, 255);}");
m_sysMonitorStack->setObjectName("SystemMonitorStack");
m_sysMonitorStack->resize(width() - 2, this->height() - TITLE_WIDGET_HEIGHT);
m_sysMonitorStack->move(1, TITLE_WIDGET_HEIGHT);
m_sysMonitorStack->setMouseTracking(false);
m_sysMonitorStack->installEventFilter(this);
process_dialog = new ProcessDialog(getReadyDisplayProcessColumns(), getCurrentSortColumnIndex(), isSortOrNot(), proSettings);
process_dialog->getProcessView()->installEventFilter(this);
connect(process_dialog, &ProcessDialog::changeColumnVisible, this, &SystemMonitor::recordProcessVisibleColumn);
connect(process_dialog, &ProcessDialog::changeSortStatus, this, &SystemMonitor::recordSortStatus);
resources_dialog = new ResouresDialog;
filesystem_dialog = new FileSystemDialog(getReadyDisplayFileSysColumns(), proSettings);
filesystem_dialog->getFileSysView()->installEventFilter(this);
connect(filesystem_dialog, SIGNAL(changeColumnVisible(int,bool,QList<bool>)), this, SLOT(recordFileSysVisibleColumn(int,bool,QList<bool>)));
m_sysMonitorStack->addWidget(process_dialog);
m_sysMonitorStack->addWidget(resources_dialog);
m_sysMonitorStack->addWidget(filesystem_dialog);
m_sysMonitorStack->setCurrentWidget(process_dialog);
}
void SystemMonitor::initTitleWidget()
{
m_titleWidget = new MonitorTitleWidget(proSettings, this);
m_titleWidget->resize(width() - 2, MONITOR_TITLE_WIDGET_HEIGHT);
m_titleWidget->move(1, 1);
}
void SystemMonitor::initConnections()
{
connect(m_titleWidget, SIGNAL(changePage(int)), this, SLOT(onChangePage(int)));
connect(m_titleWidget, SIGNAL(canelSearchEditFocus()), process_dialog, SLOT(focusProcessView()));
connect(m_titleWidget, SIGNAL(searchSignal(QString)), process_dialog, SLOT(onSearch(QString)), Qt::QueuedConnection);
}
void SystemMonitor::onChangePage(int index)
{
if (m_sysMonitorStack) {
m_sysMonitorStack->setCurrentIndex(index);
if (index == 1) {
//start time
resources_dialog->startCpuTimer();
}
else {
//stop time
resources_dialog->stopCpuTimer();
}
}
}
int SystemMonitor::getCurrentSortColumnIndex()
{
proSettings->beginGroup("PROCESS");
QString currentSortColumn = proSettings->value("CurrentSortColumn").toString();
proSettings->endGroup();
QList<QString> columnNames = {"name", "user", "status", "cpu", "pid", "command", "memory", "priority"};
return columnNames.indexOf(currentSortColumn);
}
bool SystemMonitor::isSortOrNot()
{
proSettings->beginGroup("PROCESS");
bool value = proSettings->value("IsSort", true).toBool();
proSettings->endGroup();
return value;
}
QList<bool> SystemMonitor::getReadyDisplayProcessColumns()
{
proSettings->beginGroup("PROCESS");
QString displayedColumns = proSettings->value("DisplayedColumns", "name,user,status,cpu,pid,command,memory,priority").toString();
proSettings->endGroup();
if (displayedColumns.isEmpty()) {
proSettings->beginGroup("PROCESS");
displayedColumns = "name,user,status,cpu,pid,command,memory,priority";
proSettings->setValue("DisplayedColumns", displayedColumns);
proSettings->endGroup();
proSettings->sync();
}
QList<bool> m_shows;
m_shows << displayedColumns.contains("name");
m_shows << displayedColumns.contains("user");
m_shows << displayedColumns.contains("status");
m_shows << displayedColumns.contains("cpu");
m_shows << displayedColumns.contains("pid");
m_shows << displayedColumns.contains("command");
m_shows << displayedColumns.contains("memory");
m_shows << displayedColumns.contains("priority");
return m_shows;
}
QList<bool> SystemMonitor::getReadyDisplayFileSysColumns()
{
proSettings->beginGroup("FileSystem");
QString displayedColumns = proSettings->value("DisplayedColumns", "device,directory,type,total,free,available,used").toString();
proSettings->endGroup();
if (displayedColumns.isEmpty()) {
proSettings->beginGroup("FileSystem");
displayedColumns = "device,directory,type,total,free,available,used";
proSettings->setValue("DisplayedColumns", displayedColumns);
proSettings->endGroup();
proSettings->sync();
}
QList<bool> m_shows;
m_shows << displayedColumns.contains("device");
m_shows << displayedColumns.contains("directory");
m_shows << displayedColumns.contains("type");
m_shows << displayedColumns.contains("total");
m_shows << displayedColumns.contains("free");
m_shows << displayedColumns.contains("available");
m_shows << displayedColumns.contains("used");
return m_shows;
}
void SystemMonitor::moveCenter()
{
QPoint pos = QCursor::pos();
QRect primaryGeometry;
for (QScreen *screen : qApp->screens()) {
if (screen->geometry().contains(pos)) {
primaryGeometry = screen->geometry();
}
}
if (primaryGeometry.isEmpty()) {
primaryGeometry = qApp->primaryScreen()->geometry();
}
this->move(primaryGeometry.x() + (primaryGeometry.width() - this->width())/2,
primaryGeometry.y() + (primaryGeometry.height() - this->height())/2);
}
void SystemMonitor::closeEvent(QCloseEvent *event)
{
event->accept();
}
/*void SystemMonitor::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
//绘制背景色
// QPainterPath path;
// path.addRect(QRectF(rect()));
// painter.setOpacity(1);
// painter.fillPath(path, QColor("#FFFFFF"));
painter.setPen(QPen(QColor("#0d87ca"), 0));//边框颜色 #3f96e4
painter.setBrush(QColor("#e9eef0"));//背景色
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setOpacity(1);
QRectF r(0 / 2.0, 0 / 2.0, width() - 0, height() - 0);//左边 上边 右边 下边
painter.drawRoundedRect(r, 4, 4);
QFrame::paintEvent(event);
}*/
void SystemMonitor::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
this->dragPosition = event->globalPos() - frameGeometry().topLeft();
this->mousePressed = true;
}
QFrame::mousePressEvent(event);
}
void SystemMonitor::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
this->mousePressed = false;
}
QFrame::mouseReleaseEvent(event);
}
void SystemMonitor::mouseMoveEvent(QMouseEvent *event)
{
if (this->mousePressed) {
move(event->globalPos() - this->dragPosition);
}
QFrame::mouseMoveEvent(event);
}