kylin-connectivity/ui/view/titlebar.cpp

261 lines
8.0 KiB
C++

#include "titlebar.h"
#include <QHBoxLayout>
#include <QDebug>
#include <QDBusMessage>
#include <QDBusConnection>
#include <usermanual.h>
const int DEFAULT_HEIGHT = 40;
const int TABLET_HEIGHT = 52;
const int ICON_SIZE = 16;
const int BTN_SIZE = 36;
Titlebar::Titlebar(QWidget *parent) : QWidget(parent)
{
initMenu();
initUI();
connectInit();
}
Titlebar::~Titlebar()
{
}
void Titlebar::initUI()
{
setFocusPolicy(Qt::ClickFocus);
setObjectName("titlebar");
setFixedHeight(DEFAULT_HEIGHT);
m_titleNameLab = new QLabel(this);
m_titleIcon = new QPushButton(this);
m_titleIcon->setIconSize(QSize(24, 24));
QString m_titleIconStyle = "QPushButton{border:0px;border-radius:4px;background:transparent;}"
"QPushButton:Hover{border:0px;border-radius:4px;background:transparent;}"
"QPushButton:Pressed{border:0px;border-radius:4px;background:transparent;}";
m_titleIcon->setStyleSheet(m_titleIconStyle);
m_titleIcon->setIcon(QIcon::fromTheme("kylin-connectivity"));
m_titleIcon->setContentsMargins(8, 8, 8, 8);
m_minBtn = new QPushButton(this);
m_maxBtn = new QPushButton(this);
m_closeBtn = new QPushButton(this);
m_titleNameLab->setText(tr("kylin-connectivity"));
// 固定高度
setAutoFillBackground(true);
// 最小化按钮
m_minBtn->setIcon(QIcon::fromTheme("window-minimize-symbolic"));
m_minBtn->setFixedSize(BTN_SIZE, BTN_SIZE);
m_minBtn->setIconSize(QSize(ICON_SIZE, ICON_SIZE));
m_minBtn->setProperty("isWindowButton", 0x1);
m_minBtn->setProperty("useIconHighlightEffect", 0x2);
m_minBtn->setFlat(true);
m_minBtn->setContentsMargins(4, 0, 4, 0);
m_minBtn->setFocusPolicy(Qt::NoFocus);
m_minBtn->setToolTip(tr("Minimize"));
// 最大化按钮
m_maxBtn->setIcon(QIcon::fromTheme("window-maximize-symbolic"));
m_maxBtn->setFixedSize(BTN_SIZE, BTN_SIZE);
m_maxBtn->setIconSize(QSize(ICON_SIZE, ICON_SIZE));
m_maxBtn->setProperty("isWindowButton", 0x1);
m_maxBtn->setProperty("useIconHighlightEffect", 0x2);
m_maxBtn->setFlat(true);
m_maxBtn->setContentsMargins(4, 0, 4, 0);
m_maxBtn->setFocusPolicy(Qt::NoFocus);
m_maxBtn->setToolTip(tr("Maximize"));
// 关闭按钮
m_closeBtn->setIcon(QIcon::fromTheme("window-close-symbolic"));
m_closeBtn->setFixedSize(BTN_SIZE, BTN_SIZE);
m_closeBtn->setIconSize(QSize(ICON_SIZE, ICON_SIZE));
m_closeBtn->setProperty("isWindowButton", 0x2);
m_closeBtn->setProperty("useIconHighlightEffect", 0x8);
m_closeBtn->setFlat(true);
m_closeBtn->setContentsMargins(4, 0, 4, 0);
m_closeBtn->setFocusPolicy(Qt::NoFocus);
m_closeBtn->setToolTip(tr("Close"));
// 整体布局
QHBoxLayout *layout = new QHBoxLayout;
layout->addSpacing(8);
layout->addWidget(m_titleIcon);
layout->addWidget(m_titleNameLab);
layout->addStretch();
layout->addWidget(m_menuBtn);
layout->addWidget(m_minBtn);
layout->addWidget(m_maxBtn);
layout->addWidget(m_closeBtn);
layout->addSpacing(4);
layout->setContentsMargins(0, 4, 0, 0);
setLayout(layout);
}
void Titlebar::changeMode(PublicAttributes::Model model)
{
if (window()->isMaximized()) {
m_isMaximize = true;
} else {
m_isMaximize = false;
}
if (model == PublicAttributes::Model::Table) {
m_isMaximize = true;
m_maxBtn->hide();
} else {
m_maxBtn->show();
}
}
void Titlebar::setMaxBtnMode(bool isMax)
{
if (!isMax) {
m_maxBtn->setIcon(QIcon::fromTheme("window-maximize-symbolic"));
m_isMaximize = false;
} else {
m_maxBtn->setIcon(QIcon::fromTheme("window-restore-symbolic"));
m_isMaximize = true;
}
}
void Titlebar::setTheme(PublicAttributes::Theme theme)
{
m_theme = theme;
if (m_isDefault) {
switch (m_theme) {
case PublicAttributes::Theme::Light: {
setStyleSheet("QWidget#titlebar{background-color: #FFFFFF;}");
} break;
case PublicAttributes::Theme::Dark: {
setStyleSheet("QWidget#titlebar{background-color: #1D1D1D;}");
} break;
}
}
}
void Titlebar::setBackground(bool isDefault)
{
m_isDefault = isDefault;
if (isDefault) {
switch (m_theme) {
case PublicAttributes::Theme::Light: {
setStyleSheet("QWidget#titlebar{background-color: #FFFFFF;}");
} break;
case PublicAttributes::Theme::Dark: {
setStyleSheet("QWidget#titlebar{background-color: #1D1D1D;}");
} break;
}
} else {
setAttribute(Qt::WA_StyledBackground);
setStyleSheet("QWidget#titlebar{background-color: rgba(98, 142, 255, 0.1);}");
}
}
void Titlebar::changeFontSize(double fontSize)
{
QFont font;
font.setPointSizeF(fontSize);
m_titleNameLab->setFont(font);
}
void Titlebar::mouseDoubleClickEvent(QMouseEvent *event)
{
if (window()->isMaximized()) {
window()->showNormal();
} else {
window()->showMaximized();
}
}
// 连接槽
void Titlebar::connectInit()
{
// 连接最大、小化、关闭按钮信号槽
connect(m_minBtn, &QPushButton::clicked, this, &Titlebar::onClicked);
connect(m_maxBtn, &QPushButton::clicked, this, &Titlebar::onClicked);
connect(m_closeBtn, &QPushButton::clicked, this, &Titlebar::onClicked);
// 连接菜单信号槽
connect(m_menu, &QMenu::triggered, this, &Titlebar::triggerMenu);
}
// 设置菜单按钮
void Titlebar::initMenu()
{
m_menuBtn = new QToolButton(this);
m_menuBtn->setFixedSize(BTN_SIZE, BTN_SIZE);
m_menuBtn->setToolTip(tr("Menu"));
// 菜单按钮
m_menuBtn->setIcon(QIcon::fromTheme("open-menu-symbolic"));
m_menuBtn->setIconSize(QSize(ICON_SIZE, ICON_SIZE));
m_menuBtn->setFixedSize(BTN_SIZE, BTN_SIZE);
m_menuBtn->setProperty("isWindowButton", 0x1);
m_menuBtn->setProperty("useIconHighlightEffect", 0x2);
m_menuBtn->setPopupMode(QToolButton::InstantPopup);
m_menuBtn->setFocusPolicy(Qt::NoFocus);
m_menuBtn->setAutoRaise(true);
m_menuBtn->setContentsMargins(4, 0, 4, 0);
m_menu = new QMenu(this);
// 创建Action
QAction *actionHelp = new QAction(m_menu);
QAction *actionAbout = new QAction(m_menu);
QAction *actionQuit = new QAction(m_menu);
actionHelp->setText(tr("Help"));
actionAbout->setText(tr("About"));
actionQuit->setText(tr("Quit"));
// 将Action添加到菜单中
m_actions << actionHelp << actionAbout << actionQuit;
m_menu->addActions(m_actions);
// 为菜单按钮设置菜单
m_menuBtn->setMenu(m_menu);
}
// 处理点击信号
void Titlebar::onClicked()
{
QPushButton *clickBtn = qobject_cast<QPushButton *>(sender());
if (clickBtn == m_minBtn) {
// 最小化
if (m_isMaximize) {
window()->showMaximized();
} else {
window()->showNormal();
}
window()->showMinimized();
} else if (clickBtn == m_closeBtn) {
window()->close();
} else if (clickBtn == m_maxBtn) {
// 当前窗口是否最大化,最大化:点击后还原,更换图标。窗口化:点击后最大化,更换图标
if (window()->isMaximized()) {
window()->showNormal();
} else {
window()->showMaximized();
}
}
}
// Action处理
void Titlebar::triggerMenu(QAction *act)
{
QString str = act->text();
if (tr("Help") == str) {
initHelp();
} else if (tr("About") == str) {
Q_EMIT sigAboutWinShow();
} else if (tr("Quit") == str) {
window()->close();
}
}
// 帮助入口,调用用户手册
void Titlebar::initHelp()
{
QString service_name = "com.kylinUserGuide.hotel_" + QString::number(getuid());
QDBusMessage msg = QDBusMessage::createMethodCall(QString(service_name), KYLIN_USER_GUIDE_PATH,
KYLIN_USER_GUIDE_INTERFACE, "showGuide");
msg << "kylin-connectivity";
if (QDBusConnection::sessionBus().isConnected())
QDBusConnection::sessionBus().call(msg);
}