instAdmin/Cpp/GisDes/SaRibbon/SARibbonBar/SARibbonWidget.cpp
2024-10-29 22:24:50 +08:00

229 lines
5.5 KiB
C++
Raw 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.

#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();
}
}