forked from openkylin/quarkai
402 lines
13 KiB
C++
402 lines
13 KiB
C++
/*
|
|
* 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 "monitortitlewidget.h"
|
|
#include "../widgets/mytristatebutton.h"
|
|
#include "../widgets/myunderlinebutton.h"
|
|
#include "../widgets/mysearchedit.h"
|
|
#include "util.h"
|
|
|
|
#include <QApplication>
|
|
#include <QDebug>
|
|
#include <QVBoxLayout>
|
|
#include <QHBoxLayout>
|
|
#include <QPushButton>
|
|
#include <QPainter>
|
|
#include <QResizeEvent>
|
|
#include <QStyleFactory>
|
|
|
|
MonitorTitleWidget::MonitorTitleWidget(QSettings *settings, QWidget *parent)
|
|
:QFrame(parent)
|
|
,proSettings(settings)
|
|
{
|
|
this->setWindowFlags(Qt::FramelessWindowHint);//this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint | Qt::WindowCloseButtonHint);
|
|
|
|
installEventFilter(this);
|
|
setMouseTracking(true);
|
|
setFixedHeight(MONITOR_TITLE_WIDGET_HEIGHT);
|
|
|
|
this->setAutoFillBackground(true);
|
|
// this->setAttribute(Qt::WA_TranslucentBackground);
|
|
|
|
QPalette palette;
|
|
palette.setColor(QPalette::Background, QColor("#0d87ca"));
|
|
this->setPalette(palette);
|
|
// this->setStyleSheet("QFrame{background:transparent;background-color:#0d87ca;border-radius:5px;border:1px solid red;}");
|
|
// this->setStyleSheet("QFrame {padding: 5px 0;} QFrame:hover {background-color: rgba(255, 245, 250, 0.1);border-radius: 5px;}");
|
|
|
|
m_searchTimer = new QTimer(this);
|
|
m_searchTimer->setSingleShot(true);
|
|
connect(m_searchTimer, SIGNAL(timeout()), this, SLOT(onRefreshSearchResult()));
|
|
|
|
initWidgets();
|
|
}
|
|
|
|
MonitorTitleWidget::~MonitorTitleWidget()
|
|
{
|
|
delete emptyLabel;
|
|
delete m_searchEdit;
|
|
delete m_cancelSearchBtn;
|
|
|
|
if (m_searchTimer) {
|
|
disconnect(m_searchTimer, SIGNAL(timeout()), this, SLOT(onRefreshSearchResult()));
|
|
if(m_searchTimer->isActive()) {
|
|
m_searchTimer->stop();
|
|
}
|
|
delete m_searchTimer;
|
|
m_searchTimer = nullptr;
|
|
}
|
|
|
|
//Segmentation fault
|
|
QLayoutItem *child;
|
|
while ((child = m_titleLeftLayout->takeAt(0)) != 0) {
|
|
if (child->widget())
|
|
child->widget()->deleteLater();
|
|
delete child;
|
|
}
|
|
while ((child = m_titleMiddleLayout->takeAt(0)) != 0) {
|
|
if (child->widget())
|
|
child->widget()->deleteLater();
|
|
delete child;
|
|
}
|
|
while ((child = m_titleRightLayout->takeAt(0)) != 0) {
|
|
if (child->widget())
|
|
child->widget()->deleteLater();
|
|
delete child;
|
|
}
|
|
while ((child = m_toolLeftLayout->takeAt(0)) != 0) {
|
|
if (child->widget())
|
|
child->widget()->deleteLater();
|
|
delete child;
|
|
}
|
|
while ((child = m_toolRightLayout->takeAt(0)) != 0) {
|
|
if (child->widget())
|
|
child->widget()->deleteLater();
|
|
delete child;
|
|
}
|
|
while ((child = m_topLayout->takeAt(0)) != 0) {
|
|
if (child->widget())
|
|
child->widget()->deleteLater();
|
|
delete child;
|
|
}
|
|
while ((child = m_bottomLayout->takeAt(0)) != 0) {
|
|
if (child->widget())
|
|
child->widget()->deleteLater();
|
|
delete child;
|
|
}
|
|
delete m_layout;
|
|
}
|
|
|
|
bool MonitorTitleWidget::eventFilter(QObject *obj, QEvent *event)
|
|
{
|
|
if (event->type() == QEvent::KeyPress) {
|
|
if (obj == this) {
|
|
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
|
|
if (keyEvent->key() == Qt::Key_Escape) {
|
|
m_searchEdit->clearEdit();
|
|
emit canelSearchEditFocus();
|
|
}
|
|
}
|
|
else if (obj == m_searchEdit->getLineEdit()) {
|
|
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
|
|
if (keyEvent->key() == Qt::Key_Tab) {
|
|
emit canelSearchEditFocus();
|
|
}
|
|
}
|
|
}
|
|
|
|
return QFrame::eventFilter(obj, event);
|
|
}
|
|
|
|
void MonitorTitleWidget::setSearchEditFocus()
|
|
{
|
|
if (m_searchEdit->searchedText() != "") {
|
|
m_searchEdit->getLineEdit()->setFocus();
|
|
} else {
|
|
m_searchEdit->setFocus();
|
|
}
|
|
}
|
|
|
|
void MonitorTitleWidget::onRefreshSearchResult()
|
|
{
|
|
if (m_searchEdit->searchedText() == searchTextCache) {
|
|
emit this->searchSignal(searchTextCache);
|
|
}
|
|
}
|
|
|
|
void MonitorTitleWidget::handleSearchTextChanged()
|
|
{
|
|
searchTextCache = m_searchEdit->searchedText();
|
|
|
|
this->m_cancelSearchBtn->setVisible(!searchTextCache.isEmpty());
|
|
|
|
if (m_searchTimer->isActive()) {
|
|
m_searchTimer->stop();
|
|
}
|
|
m_searchTimer->start(300);
|
|
}
|
|
|
|
void MonitorTitleWidget::onCancelSearchBtnClicked(bool b)
|
|
{
|
|
this->m_cancelSearchBtn->setVisible(false);
|
|
m_searchEdit->clearAndFocusEdit();
|
|
emit canelSearchEditFocus();
|
|
}
|
|
|
|
void MonitorTitleWidget::mouseDoubleClickEvent(QMouseEvent *e)
|
|
{
|
|
if (e->button() == Qt::LeftButton) {
|
|
if (window()->isMaximized())
|
|
window()->showNormal();
|
|
else if (! window()->isFullScreen())
|
|
window()->showMaximized();
|
|
}
|
|
|
|
QFrame::mouseDoubleClickEvent(e);
|
|
}
|
|
|
|
/*void MonitorTitleWidget::paintEvent(QPaintEvent *event)
|
|
{
|
|
// QFrame::paintEvent(event);
|
|
|
|
QPainter painter(this);
|
|
painter.setRenderHint(QPainter::Antialiasing, true);
|
|
|
|
//draw background
|
|
QPainterPath path;
|
|
path.addRect(QRectF(0, 0, width(), height()));
|
|
painter.setOpacity(1);
|
|
painter.fillPath(path, QColor("#0d87ca"));
|
|
|
|
|
|
//draw line
|
|
// const QColor color(QColor(255, 255, 255, 127));
|
|
// int borderHeight = 1;
|
|
// QPainterPath path;
|
|
// path.moveTo(QPointF(x(), y() + borderHeight - 0.5));
|
|
// path.lineTo(QPointF(x() + width(), y() + borderHeight - 0.5));
|
|
// painter.setPen(QPen(color));
|
|
// painter.drawPath(path);
|
|
|
|
//绘制圆角矩形
|
|
// painter.setPen(QPen(QColor("#e9eef0"), 0));//边框颜色
|
|
// painter.setBrush(QColor("#0d87ca"));//背景色
|
|
// painter.setOpacity(1);
|
|
// QRectF r(1, 1, width() - 2, height() - 2);//左边 上边 右边 下边
|
|
// painter.drawRoundedRect(r, 5, 5);
|
|
|
|
QFrame::paintEvent(event);
|
|
}*/
|
|
|
|
void MonitorTitleWidget::initTitlebarLeftContent()
|
|
{
|
|
QWidget *w = new QWidget;
|
|
m_titleLeftLayout = new QHBoxLayout(w);
|
|
m_titleLeftLayout->setContentsMargins(6, 0, 0, 0);
|
|
m_titleLeftLayout->setSpacing(0);
|
|
|
|
emptyLabel = new QLabel;
|
|
emptyLabel->setStyleSheet("QLabel{background-color:transparent;}");
|
|
m_titleLeftLayout->addWidget(emptyLabel);
|
|
|
|
m_topLayout->addWidget(w, 1, Qt::AlignLeft);
|
|
}
|
|
|
|
void MonitorTitleWidget::initTitlebarMiddleContent()
|
|
{
|
|
QWidget *w = new QWidget;
|
|
m_titleMiddleLayout = new QHBoxLayout(w);
|
|
m_titleMiddleLayout->setContentsMargins(0, 0, 0, 0);
|
|
|
|
QLabel *titleLabel = new QLabel;
|
|
titleLabel->setStyleSheet("QLabel{background-color:transparent;color:#ffffff; font-size:12px;}");
|
|
titleLabel->setText(tr("Kylin System Monitor"));
|
|
m_titleMiddleLayout->addWidget(titleLabel);
|
|
m_topLayout->addWidget(w);
|
|
}
|
|
|
|
void MonitorTitleWidget::initTitlebarRightContent()
|
|
{
|
|
QWidget *w = new QWidget;
|
|
m_titleRightLayout = new QHBoxLayout(w);
|
|
m_titleRightLayout->setContentsMargins(0, 0, 1, 0);
|
|
m_titleRightLayout->setSpacing(0);
|
|
|
|
m_topLayout->addWidget(w, 1, Qt::AlignRight);
|
|
|
|
MyTristateButton *minBtn = new MyTristateButton;
|
|
minBtn->setObjectName("MinButton");
|
|
connect(minBtn, &MyTristateButton::clicked, this, [=] {
|
|
if (parentWidget() && parentWidget()->parentWidget()) {
|
|
parentWidget()->parentWidget()->showMinimized();
|
|
}
|
|
});
|
|
MyTristateButton *maxBtn = new MyTristateButton;
|
|
maxBtn->setObjectName("MaxButton");
|
|
connect(maxBtn, &MyTristateButton::clicked, this, [=] {
|
|
if (window()->isMaximized()) {
|
|
window()->showNormal();
|
|
maxBtn->setObjectName("MaxButton");
|
|
}
|
|
else {
|
|
window()->showMaximized();
|
|
maxBtn->setObjectName("UnMaxButton");
|
|
}
|
|
});
|
|
connect(this, &MonitorTitleWidget::updateMaxBtn, this, [=]{
|
|
if (window()->isMaximized()) {
|
|
maxBtn->setObjectName("UnMaxButton");
|
|
} else {
|
|
maxBtn->setObjectName("MaxButton");
|
|
}
|
|
});
|
|
MyTristateButton *closeBtn = new MyTristateButton;
|
|
closeBtn->setObjectName("CloseButton");
|
|
connect(closeBtn, &MyTristateButton::clicked, this, [=] {
|
|
window()->close();
|
|
});
|
|
|
|
m_titleRightLayout->addWidget(minBtn);
|
|
m_titleRightLayout->addWidget(maxBtn);
|
|
m_titleRightLayout->addWidget(closeBtn);
|
|
}
|
|
|
|
void MonitorTitleWidget::initToolbarLeftContent()
|
|
{
|
|
QWidget *w = new QWidget;
|
|
w->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
|
m_toolLeftLayout = new QHBoxLayout(w);
|
|
m_toolLeftLayout->setContentsMargins(0, 0, 0, 0);
|
|
m_toolLeftLayout->setSpacing(0);
|
|
|
|
MyUnderLineButton *processButton = new MyUnderLineButton();
|
|
processButton->setName(tr("Processes"));
|
|
processButton->setChecked(true);
|
|
|
|
MyUnderLineButton *resourcesButton = new MyUnderLineButton();
|
|
resourcesButton->setName(tr("Resources"));
|
|
resourcesButton->setChecked(false);
|
|
|
|
MyUnderLineButton *disksButton = new MyUnderLineButton();
|
|
disksButton->setName(tr("File Systems"));
|
|
disksButton->setChecked(false);
|
|
|
|
connect(processButton, &MyUnderLineButton::clicked, this, [=] {
|
|
emit this->changePage(0);
|
|
processButton->setChecked(true);
|
|
resourcesButton->setChecked(false);
|
|
disksButton->setChecked(false);
|
|
if (!m_searchEdit->isVisible())
|
|
m_searchEdit->setVisible(true);
|
|
});
|
|
connect(resourcesButton, &MyUnderLineButton::clicked, this, [=] {
|
|
emit this->changePage(1);
|
|
processButton->setChecked(false);
|
|
resourcesButton->setChecked(true);
|
|
disksButton->setChecked(false);
|
|
if (m_searchEdit->isVisible())
|
|
m_searchEdit->setVisible(false);
|
|
m_searchEdit->clearEdit();
|
|
emit canelSearchEditFocus();
|
|
});
|
|
connect(disksButton, &MyUnderLineButton::clicked, this, [=] {
|
|
emit this->changePage(2);
|
|
processButton->setChecked(false);
|
|
resourcesButton->setChecked(false);
|
|
disksButton->setChecked(true);
|
|
if (m_searchEdit->isVisible())
|
|
m_searchEdit->setVisible(false);
|
|
m_searchEdit->clearEdit();
|
|
emit canelSearchEditFocus();
|
|
});
|
|
|
|
m_toolLeftLayout->setContentsMargins(0, 0, 0, 0);
|
|
m_toolLeftLayout->setSpacing(10);
|
|
m_toolLeftLayout->addStretch();
|
|
m_toolLeftLayout->addWidget(processButton);
|
|
m_toolLeftLayout->addWidget(resourcesButton);
|
|
m_toolLeftLayout->addWidget(disksButton);
|
|
m_toolLeftLayout->addStretch();
|
|
|
|
// m_bottomLayout->addWidget(w);
|
|
m_bottomLayout->addWidget(w, 1, Qt::AlignLeft);
|
|
}
|
|
|
|
void MonitorTitleWidget::initToolbarRightContent()
|
|
{
|
|
QWidget *w = new QWidget;
|
|
m_toolRightLayout = new QHBoxLayout(w);
|
|
m_toolRightLayout->setContentsMargins(0, 3, 6, 10);
|
|
m_toolRightLayout->setSpacing(5);
|
|
|
|
m_cancelSearchBtn = new QPushButton;
|
|
m_cancelSearchBtn->setStyleSheet("QPushButton{background-color:transparent;text-align:center;font-family: 方正黑体_GBK;font-size:11px;color:#ffffff;}QPushButton:hover{color:#000000;}");
|
|
m_cancelSearchBtn->setText(tr("Cancel"));
|
|
m_cancelSearchBtn->setFocusPolicy(Qt::NoFocus);
|
|
m_cancelSearchBtn->setFixedSize(46, 25);
|
|
m_cancelSearchBtn->setVisible(false);
|
|
connect(m_cancelSearchBtn, SIGNAL(clicked(bool)), SLOT(onCancelSearchBtnClicked(bool)));
|
|
connect(m_searchEdit, &MySearchEdit::textChanged, this, &MonitorTitleWidget::handleSearchTextChanged, Qt::QueuedConnection);
|
|
m_toolRightLayout->addWidget(m_searchEdit);
|
|
m_toolRightLayout->addWidget(m_cancelSearchBtn);
|
|
m_bottomLayout->addWidget(w, 1, Qt::AlignRight);
|
|
}
|
|
|
|
void MonitorTitleWidget::initWidgets()
|
|
{
|
|
m_searchEdit = new MySearchEdit();
|
|
m_searchEdit->setPlaceHolder(tr("Enter the relevant info of process"));
|
|
m_searchEdit->setFixedSize(222, 30);
|
|
m_searchEdit->getLineEdit()->installEventFilter(this);
|
|
|
|
m_layout = new QVBoxLayout(this);
|
|
m_layout->setContentsMargins(0, 0, 0, 0);
|
|
m_layout->setSpacing(0);
|
|
|
|
QWidget *topWidget = new QWidget;
|
|
m_topLayout = new QHBoxLayout(topWidget);
|
|
m_topLayout->setContentsMargins(0, 0, 0, 0);
|
|
m_topLayout->setSpacing(0);
|
|
m_layout->addWidget(topWidget, 0, Qt::AlignTop);
|
|
|
|
QWidget *bottomWidget = new QWidget;
|
|
m_bottomLayout = new QHBoxLayout(bottomWidget);
|
|
m_bottomLayout->setContentsMargins(0, 0, 0, 0);
|
|
m_bottomLayout->setSpacing(0);
|
|
m_layout->addWidget(bottomWidget, 0, Qt::AlignBottom);
|
|
|
|
this->setLayout(m_layout);
|
|
|
|
initTitlebarLeftContent();
|
|
initTitlebarMiddleContent();
|
|
initTitlebarRightContent();
|
|
initToolbarLeftContent();
|
|
initToolbarRightContent();
|
|
}
|