PowerMaster/source/functionNavigationBar.cpp

134 lines
4.7 KiB
C++
Raw Normal View History

2024-10-10 16:59:51 +08:00
#include "functionNavigationBar.h"
#include "./ui_functionNavigationBar.h"
#include <QPropertyAnimation>
#include <QTimer>
#define WIDTH 59
FunctionNavigationBar::FunctionNavigationBar(QWidget *parent)
: QWidget(parent)
, ui(new Ui::functionNavigationBar)
{
ui->setupUi(this);
setAttribute(Qt::WA_TranslucentBackground);
initialzie();
}
FunctionNavigationBar::~FunctionNavigationBar()
{
delete ui;
}
void FunctionNavigationBar::initialzie()
{
ui->funBtn_Dvie->setProperty("skin", "icon_dashboard");
ui->funBtn_Dvie->setProperty("funName", "DVIE");
connect(ui->funBtn_Dvie, SIGNAL(clicked()), this, SLOT(onBtnClicked_funBtn()));
ui->funBtn_TCC->setProperty("skin", "icon_chart");
ui->funBtn_TCC->setProperty("funName", "TCC");
connect(ui->funBtn_TCC, SIGNAL(clicked()), this, SLOT(onBtnClicked_funBtn()));
m_pLastFunButton = ui->funBtn_Dvie;
m_strCurState = "shrink";
m_bInAnimation = false;
m_pAni_geo = new QPropertyAnimation(this, "geometry");
m_pAni_geo->setDuration(100);
connect(m_pAni_geo, &QPropertyAnimation::finished, this, [this]{m_bInAnimation = false;});
int nMargin_left = 0, nMargin_top = 0, nMargin_right = 0, nMargin_bottom = 0;
ui->mainLayout->getContentsMargins(&nMargin_left, &nMargin_top, &nMargin_right, &nMargin_bottom);
resize(ui->dockWidget->width()+nMargin_left,height());
}
void FunctionNavigationBar::enterEvent(QEnterEvent* e)
{
Q_UNUSED(e);
//防止非意图操作,加一个定时器进行延时执行
QTimer::singleShot(300,[this]{
if(rect().contains(mapFromGlobal(cursor().pos())))
expand();
});
}
void FunctionNavigationBar::leaveEvent(QEvent* e)
{
Q_UNUSED(e);
shrink();
}
void FunctionNavigationBar::expand()
{
if(m_bInAnimation || m_strCurState == "expand" )
return;
QWidget* pParent = parentWidget();
if(pParent)
{
int nY = (pParent->height() - this->height()) * 0.5;
int nMargin_left = 0, nMargin_top = 0, nMargin_right = 0, nMargin_bottom = 0;
ui->mainLayout->getContentsMargins(&nMargin_left, &nMargin_top, &nMargin_right, &nMargin_bottom);
QRect startRect = QRect(0, nY, ui->dockWidget->width() + nMargin_left, this->height());
QRect endRect = QRect(0, nY, WIDTH, this->height());
m_pAni_geo->setStartValue(startRect);
m_pAni_geo->setEndValue(endRect);
m_pAni_geo->start();
m_strCurState = "expand";
}
}
void FunctionNavigationBar::shrink()
{
if(m_bInAnimation || m_strCurState == "shrink" )
return;
QWidget* pParent = parentWidget();
if(pParent)
{
int nY = (pParent->height() - this->height()) * 0.5;
QRect startRect = QRect(0, nY, WIDTH, this->height());
int nMargin_left = 0, nMargin_top = 0, nMargin_right = 0, nMargin_bottom = 0;
ui->mainLayout->getContentsMargins(&nMargin_left, &nMargin_top, &nMargin_right, &nMargin_bottom);
QRect endRect = QRect(0, nY, ui->dockWidget->width() + nMargin_left, this->height());
m_pAni_geo->setStartValue(startRect);
m_pAni_geo->setEndValue(endRect);
m_pAni_geo->start();
m_strCurState = "shrink";
}
}
void FunctionNavigationBar::onBtnClicked_funBtn()
{
QPushButton* pBtn = qobject_cast<QPushButton*>(sender());
if(pBtn == m_pLastFunButton)
return;
//先将上一个被选中的按钮复原
if(m_pLastFunButton)
{
QString strIcon = m_pLastFunButton->property("skin").toString();
m_pLastFunButton->setStyleSheet("QPushButton\n"
"{\n"
" padding:2px;\n"
" image: url(:/images/" + strIcon + "_notSelected);\n"
" background-color:transparent;\n"
"}\n"
"QPushButton::hover\n"
"{\n"
" background-color: rgba(58, 63, 75, 200);\n"
"}");
}
//将当前按钮置为选中状态
QString strIcon = pBtn->property("skin").toString();
pBtn->setStyleSheet("QPushButton\n"
"{\n"
" padding:2px;\n"
" image: url(:/images/" + strIcon + "_selected);\n"
" background-color:transparent;\n"
"}\n");
m_pLastFunButton = pBtn;
QString strFunName = pBtn->property("funName").toString();
emit sgl_funBtnClicke(strFunName);
}