229 lines
5.5 KiB
C++
229 lines
5.5 KiB
C++
#include "SARibbonWidget.h"
|
||
#include "SARibbonBar.h"
|
||
#include "SARibbonElementManager.h"
|
||
#include "SARibbonTabBar.h"
|
||
#include <QApplication>
|
||
#include <QDebug>
|
||
#include <QFile>
|
||
#include <QScreen>
|
||
|
||
/**
|
||
* @brief The SARibbonWidget::PrivateData class
|
||
*/
|
||
class SARibbonWidget::PrivateData
|
||
{
|
||
SA_RIBBON_DECLARE_PUBLIC(SARibbonWidget)
|
||
public:
|
||
PrivateData(SARibbonWidget* p);
|
||
void installFrameless(SARibbonWidget* p);
|
||
|
||
public:
|
||
SARibbonTheme mCurrentRibbonTheme { SARibbonTheme::RibbonThemeOffice2021Blue };
|
||
};
|
||
|
||
SARibbonWidget::PrivateData::PrivateData(SARibbonWidget* p) : q_ptr(p)
|
||
{
|
||
}
|
||
|
||
//===================================================
|
||
// SARibbonWidget
|
||
//===================================================
|
||
SARibbonWidget::SARibbonWidget(QWidget* parent) : QWidget(parent), d_ptr(new SARibbonWidget::PrivateData(this))
|
||
{
|
||
// 直接创建SARibbonBar
|
||
QVBoxLayout* verticalLayout = new QVBoxLayout(this);
|
||
verticalLayout->setSpacing(1);
|
||
verticalLayout->setObjectName("verticalLayout");
|
||
verticalLayout->setContentsMargins(0, 0, 0, 0);
|
||
SARibbonBar* ribbon = new SARibbonBar(this);
|
||
setRibbonBar(ribbon);
|
||
connect(qApp, &QApplication::primaryScreenChanged, this, &SARibbonWidget::onPrimaryScreenChanged);
|
||
}
|
||
|
||
SARibbonWidget::~SARibbonWidget()
|
||
{
|
||
}
|
||
|
||
/**
|
||
* @brief 返回ribbonbar,如果不是使用ribbon模式,返回nullptr
|
||
* @return
|
||
*/
|
||
SARibbonBar* SARibbonWidget::ribbonBar() const
|
||
{
|
||
QLayout* lay = layout();
|
||
if (lay) {
|
||
return qobject_cast< SARibbonBar* >(lay->menuBar());
|
||
}
|
||
return nullptr;
|
||
}
|
||
|
||
/**
|
||
* @brief 设置ribbonbar
|
||
* @param bar
|
||
*/
|
||
void SARibbonWidget::setRibbonBar(SARibbonBar* bar)
|
||
{
|
||
QLayout* lay = layout();
|
||
if (lay) {
|
||
lay->setMenuBar(bar);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief SARibbonMainWindow::setRibbonTheme
|
||
*
|
||
* 注意主题在构造函数设置主题会不完全生效,使用QTimer投放到队列最后执行即可
|
||
* @code
|
||
* QTimer::singleShot(0, this, [ this ]() { this->setRibbonTheme(SARibbonMainWindow::RibbonThemeDark); });
|
||
* @endcode
|
||
* @param theme
|
||
*/
|
||
void SARibbonWidget::setRibbonTheme(SARibbonTheme theme)
|
||
{
|
||
sa_set_ribbon_theme(this, theme);
|
||
d_ptr->mCurrentRibbonTheme = theme;
|
||
if (SARibbonBar* bar = ribbonBar()) {
|
||
auto theme = ribbonTheme();
|
||
// 尺寸修正
|
||
switch (theme) {
|
||
case SARibbonTheme::RibbonThemeWindows7:
|
||
case SARibbonTheme::RibbonThemeOffice2013:
|
||
case SARibbonTheme::RibbonThemeOffice2016Blue:
|
||
case SARibbonTheme::RibbonThemeDark:
|
||
case SARibbonTheme::RibbonThemeDark2: {
|
||
//! 在设置qss后需要针对margin信息重新设置进SARibbonTabBar中
|
||
//! office2013.qss的margin信息如下设置
|
||
//! margin-top: 0px;
|
||
//! margin-right: 0px;
|
||
//! margin-left: 5px;
|
||
//! margin-bottom: 0px;
|
||
SARibbonTabBar* tab = bar->ribbonTabBar();
|
||
if (!tab) {
|
||
break;
|
||
}
|
||
tab->setTabMargin(QMargins(5, 0, 0, 0));
|
||
} break;
|
||
case SARibbonTheme::RibbonThemeOffice2021Blue: {
|
||
SARibbonTabBar* tab = bar->ribbonTabBar();
|
||
if (!tab) {
|
||
break;
|
||
}
|
||
//! 在设置qss后需要针对margin信息重新设置进SARibbonTabBar中
|
||
//! office2021.qss的margin信息如下设置
|
||
//! margin-top: 0px;
|
||
//! margin-right: 5px;
|
||
//! margin-left: 5px;
|
||
//! margin-bottom: 0px;
|
||
tab->setTabMargin(QMargins(5, 0, 5, 0));
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
// 上下文标签颜色设置,以及基线颜色设置
|
||
switch (theme) {
|
||
case SARibbonTheme::RibbonThemeWindows7:
|
||
case SARibbonTheme::RibbonThemeOffice2013:
|
||
case SARibbonTheme::RibbonThemeDark:
|
||
bar->setContextCategoryColorList(QList< QColor >()); //< 设置空颜色列表会重置为默认色系
|
||
break;
|
||
case SARibbonTheme::RibbonThemeOffice2016Blue:
|
||
bar->setContextCategoryColorList(QList< QColor >() << QColor(18, 64, 120)); //< 设置空颜色列表会重置为默认色系
|
||
break;
|
||
case SARibbonTheme::RibbonThemeOffice2021Blue:
|
||
bar->setContextCategoryColorList(QList< QColor >() << QColor(209, 207, 209)); //< 设置空颜色列表会重置为默认色系
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
// 基线颜色设置
|
||
if (SARibbonTheme::RibbonThemeOffice2013 == theme) {
|
||
bar->setTabBarBaseLineColor(QColor(186, 201, 219));
|
||
} else {
|
||
bar->setTabBarBaseLineColor(QColor());
|
||
}
|
||
}
|
||
}
|
||
|
||
SARibbonTheme SARibbonWidget::ribbonTheme() const
|
||
{
|
||
return (d_ptr->mCurrentRibbonTheme);
|
||
}
|
||
|
||
bool SARibbonWidget::isUseRibbon() const
|
||
{
|
||
return (nullptr != ribbonBar());
|
||
}
|
||
|
||
/**
|
||
@brief 设置窗口
|
||
|
||
@param 窗口指针
|
||
@note 窗口的所有权归SARibbonWidget管理
|
||
@sa widget
|
||
@note 原来设置的窗口会被delete
|
||
*/
|
||
void SARibbonWidget::setWidget(QWidget* w)
|
||
{
|
||
QWidget* oldwidget = takeWidget();
|
||
if (oldwidget) {
|
||
oldwidget->hide();
|
||
oldwidget->deleteLater();
|
||
}
|
||
if (QLayout* lay = layout()) {
|
||
lay->addWidget(w);
|
||
}
|
||
}
|
||
|
||
/**
|
||
@brief 获取设置的窗口
|
||
|
||
@return 如果没有,返回nullptr
|
||
*/
|
||
QWidget* SARibbonWidget::widget() const
|
||
{
|
||
QLayout* lay = layout();
|
||
if (lay) {
|
||
if (lay->count() == 0) {
|
||
return nullptr;
|
||
}
|
||
return lay->itemAt(0)->widget();
|
||
}
|
||
return nullptr;
|
||
}
|
||
|
||
QWidget* SARibbonWidget::takeWidget()
|
||
{
|
||
QLayout* lay = layout();
|
||
if (nullptr == lay) {
|
||
return nullptr;
|
||
}
|
||
if (lay->count() == 0) {
|
||
return nullptr;
|
||
}
|
||
auto item = lay->itemAt(0);
|
||
if (nullptr == item) {
|
||
return nullptr;
|
||
}
|
||
lay->removeItem(item);
|
||
auto w = item->widget();
|
||
delete item;
|
||
if (!w) {
|
||
return nullptr;
|
||
}
|
||
return w;
|
||
}
|
||
|
||
/**
|
||
* @brief 主屏幕切换触发的信号
|
||
* @param screen
|
||
*/
|
||
void SARibbonWidget::onPrimaryScreenChanged(QScreen* screen)
|
||
{
|
||
Q_UNUSED(screen);
|
||
// 主屏幕切换后,从新计算所有尺寸
|
||
if (SARibbonBar* bar = ribbonBar()) {
|
||
qDebug() << "Primary Screen Changed";
|
||
bar->updateRibbonGeometry();
|
||
}
|
||
}
|