Gui: Migrate to new styles

Since some time we have new stylesheets based on style parameters. For
compatibility reasons however old stylesheets were left in the project -
this commit removes them by reapplying the theme if old stylesheet is
detected.
This commit is contained in:
Kacper Donat
2026-01-02 00:03:39 +01:00
committed by Chris Hennes
parent f819011d81
commit c938645843
9 changed files with 19 additions and 6438 deletions

View File

@@ -46,6 +46,7 @@
#include <ranges>
#include "StartupProcess.h"
#include "PreferencePackManager.h"
#include "Application.h"
#include "AutoSaver.h"
#include "Dialogs/DlgCheckableMessageBox.h"
@@ -333,6 +334,18 @@ void StartupPostProcess::setQtStyle()
setStyleFromParameters();
}
void StartupPostProcess::migrateOldTheme(const std::string& style)
{
auto prefPackManager = Application::Instance->prefPackManager();
if (style == "FreeCAD Light.qss") {
prefPackManager->apply("FreeCAD Light");
}
else if (style == "FreeCAD Dark.qss") {
prefPackManager->apply("FreeCAD Dark");
}
}
void StartupPostProcess::checkOpenGL()
{
QWindow window;
@@ -536,7 +549,11 @@ void StartupPostProcess::setStyleSheet()
}
}
guiApp.setStyleSheet(QLatin1String(style.c_str()), hGrp->GetBool("TiledBackground", false));
// In 1.1 we migrated to a common parametrized stylesheet.
// if we detect an old style, we need to reapply the theme pack.
migrateOldTheme(style);
guiApp.setStyleSheet(QString::fromStdString(style), hGrp->GetBool("TiledBackground", false));
}
void StartupPostProcess::autoloadModules(const QStringList& wb)

View File

@@ -68,6 +68,7 @@ private:
void setLocale();
void setCursorFlashing();
void setQtStyle();
void migrateOldTheme(const std::string& style);
void checkOpenGL();
void loadOpenInventor();
void setBranding();

View File

@@ -2,9 +2,6 @@
SET(Stylesheets_Files
"FreeCAD.qss"
"defaults.qss"
#remove below after testing new stylesheet system 8/6/2025
"FreeCAD Dark.qss"
"FreeCAD Light.qss"
)
SET(Parameters_Files
@@ -14,11 +11,6 @@ SET(Parameters_Files
SET(Overlay_Stylesheets_Files
"overlay/Freecad Overlay.qss"
#remove below after testing new stylesheet system 8/6/2025
"overlay/Dark Theme + Dark Background.qss"
"overlay/Dark Theme + Light Background.qss"
"overlay/Light Theme + Dark Background.qss"
"overlay/Light Theme + Light Background.qss"
)
# Find all the image files

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,127 +0,0 @@
Gui--DockWnd--ReportOutput,
Gui--TaskView--TaskView QScrollArea {
border: none;
}
QTabWidget::pane{
background-color: transparent;
border: transparent;
}
QAbstractItemView {
alternate-background-color: rgba(0, 0, 0, 0.119);
color: #ffffff;
border: 1px solid #252525;
}
Gui--OverlayTitleBar,
Gui--OverlaySplitterHandle {
background-color: #252525;
}
/* The OverlayTabWidget is named as OverlayLeft, OverlayRight, OverlayTop, OverlayBottom.
To customize for each overlay docking site, use the following selector
Gui--OverlayTabWidget#OverlayLeft {}
*/
Gui--OverlayTabWidget {
qproperty-effectColor: rgba(25, 25, 25, 220);
qproperty-effectBlurRadius: 0;
qproperty-effectOffsetX: 0;
qproperty-effectOffsetY: 0;
qproperty-effectWidth: 1;
qproperty-effectHeight: 1;
qproperty-enableEffect: 1;
}
Gui--OverlayTabWidget#OverlayBottom {
qproperty-effectColor: rgba(100, 100, 100, 220);
qproperty-effectBlurRadius: 0;
qproperty-effectOffsetX: 0.0;
qproperty-effectOffsetY: 0.0;
qproperty-effectWidth: 1;
qproperty-effectHeight: 1;
qproperty-enableEffect: 1;
}
Gui--PropertyEditor--PropertyEditor {
qproperty-itemBackground: #333333;
}
Gui--OverlayTabWidget::pane {
background-color: transparent;
border: transparent;
}
QSint--ActionGroup QFrame[class="content"] {
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
}
Gui--OverlayTabWidget::tab-bar:top,
Gui--OverlayTabWidget::tab-bar:bottom {
left: 10px;
alignment: left;
}
Gui--OverlayTabWidget::tab-bar:left,
Gui--OverlayTabWidget::tab-bar:right {
top: 10px;
alignment: top;
}
Gui--OverlayProxyWidget {
qproperty-hintColor: rgba(250, 250, 250, 0.6);
}
Gui--OverlayToolButton {
border: 1px solid transparent;
border-radius: 2px;
}
Gui--OverlayToolButton:hover {
border: 1px solid #000000;
background: #000000;
border-radius: 2px;
}
Gui--OverlayToolButton:focus {
border: 1px solid #0099ff;
border-radius: 2px;
}
Gui--OverlayToolButton::pressed,
Gui--OverlayToolButton:checked {
border: 1px solid #696969;
border-radius: 2px;
background-color: #696969;
}
Gui--OverlayToolButton:checked:hover {
border: 1px solid #000000;
background: #000000;
}
Gui--OverlayToolButton[objectName="OBTN Transparent"] {
image: url(qss:images_classic/transparent-lightgray.png) ;
}
Gui--OverlayToolButton[objectName="OBTN Transparent"]:hover {
image: url(qss:images_classic/transparent-white.png) ;
}
Gui--OverlayToolButton[objectName="OBTN Overlay"] {
image: url(qss:images_classic/overlay-lightgray.png) ;
}
Gui--OverlayToolButton[objectName="OBTN Overlay"]:hover {
image: url(qss:images_classic/overlay-white.png) ;
}
Gui--OverlayToolButton[objectName="OBTN AutoMode"] {
image: url(qss:images_classic/mode-lightgray.png) ;
}
Gui--OverlayToolButton[objectName="OBTN AutoMode"]:hover {
image: url(qss:images_classic/mode-white.png) ;
}

View File

@@ -1,197 +0,0 @@
Gui--DockWnd--ReportOutput,
Gui--TaskView--TaskView QScrollArea {
border: none;
}
QTabWidget::pane{
background-color: transparent;
border: transparent;
}
QAbstractItemView {
alternate-background-color: rgba(0, 0, 0, 0.273);
color: #ffffff;
border: 1px solid #696968;
}
Gui--OverlayTitleBar,
Gui--OverlaySplitterHandle {
background-color: #252525;
}
Gui--TreePanel QTreeView {
background-color: rgba(0, 0, 0, 0.55);
border: 0px solid #696968;
/* alternate-background-color: rgba(255, 0, 0, 0.611); */
color: #fdfdfd;
gridline-color: #696968;
border-radius: 0px;
}
Gui--TreePanel QTreeView::item {
color: #ffffff;
}
Gui--OverlayTabWidget[transparent="false"] Gui--TreePanel QTreeView::item {
color: #ffffff;
}
Gui--OverlayTabWidget[transparent="true"] Gui--TreePanel QTreeView::item {
color: #000000;
}
/* The OverlayTabWidget is named as OverlayLeft, OverlayRight, OverlayTop, OverlayBottom.
To customize for each overlay docking site, use the following selector
Gui--OverlayTabWidget#OverlayLeft {}
*/
Gui--OverlayTabWidget {
qproperty-effectColor: rgba(255, 255, 255, 200);
qproperty-effectBlurRadius: 0;
qproperty-effectOffsetX: 0;
qproperty-effectOffsetY: 0;
qproperty-effectWidth: 1;
qproperty-effectHeight: 1;
qproperty-enableEffect: 1;
}
Gui--OverlayTabWidget#OverlayBottom {
qproperty-effectColor: rgba(225, 225, 225, 200);
qproperty-effectBlurRadius: 0;
qproperty-effectOffsetX: 0.0;
qproperty-effectOffsetY: 0.0;
qproperty-effectWidth: 1;
qproperty-effectHeight: 1;
qproperty-enableEffect: 1;
}
Gui--PropertyEditor--PropertyEditor {
qproperty-itemBackground: #333333;
}
Gui--OverlayTabWidget::pane {
background-color: transparent;
border: transparent;
}
QSint--ActionGroup QFrame[class="content"] {
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
}
Gui--OverlayTabWidget::tab-bar:top,
Gui--OverlayTabWidget::tab-bar:bottom {
left: 10px;
alignment: left;
}
Gui--OverlayTabWidget::tab-bar:left,
Gui--OverlayTabWidget::tab-bar:right {
top: 10px;
alignment: top;
}
Gui--OverlayProxyWidget {
qproperty-hintColor: rgba(250, 250, 250, 0.6);
}
Gui--OverlayToolButton {
border: 1px solid transparent;
border-radius: 2px;
}
Gui--OverlayToolButton:hover {
border: 1px solid #000000;
background: #000000;
border-radius: 2px;
}
Gui--OverlayToolButton:focus {
border: 1px solid #0099ff;
border-radius: 2px;
}
Gui--OverlayToolButton::pressed,
Gui--OverlayToolButton:checked {
border: 1px solid #696969;
border-radius: 2px;
background-color: #696969;
}
Gui--OverlayToolButton:checked:hover {
border: 1px solid #000000;
background: #000000;
}
Gui--OverlayToolButton[objectName="OBTN Transparent"] {
image: url(qss:images_classic/transparent-lightgray.png);
}
Gui--OverlayToolButton[objectName="OBTN Transparent"]:hover {
image: url(qss:images_classic/transparent-white.png);
}
Gui--OverlayToolButton[objectName="OBTN Overlay"] {
image: url(qss:images_classic/overlay-lightgray.png);
}
Gui--OverlayToolButton[objectName="OBTN Overlay"]:hover {
image: url(qss:images_classic/overlay-white.png);
}
Gui--OverlayToolButton[objectName="OBTN AutoMode"] {
image: url(qss:images_classic/mode-lightgray.png);
}
Gui--OverlayToolButton[objectName="OBTN AutoMode"]:hover {
image: url(qss:images_classic/mode-white.png);
}
Gui--OverlaySplitterHandle Gui--OverlayToolButton,
Gui--OverlayToolButton[objectName="OBTN Float"] {
image: url(qss:images_classic/float-lightgray.png);
}
Gui--OverlaySplitterHandle Gui--OverlayToolButton:hover,
Gui--OverlayToolButton[objectName="OBTN Float"]:hover {
image: url(qss:images_classic/float-white.png);
}
QTreeView::branch:open:has-children:has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-down-white.png);
}
QTreeView::branch:open:has-children:!has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-down-white.png);
}
QTreeView::branch:closed:has-children:has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-right-white.png);
}
QTreeView::branch:has-children:!has-siblings:closed {
border-image: none;
image: url(qss:images_classic/Arrow-right-white.png);
}
Gui--TreePanel QTreeView::branch:open:has-children:has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-down-black.png);
}
Gui--TreePanel QTreeView::branch:open:has-children:!has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-down-black.png);
}
Gui--TreePanel QTreeView::branch:closed:has-children:has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-right-black.png);
}
Gui--TreePanel QTreeView::branch:has-children:!has-siblings:closed {
border-image: none;
image: url(qss:images_classic/Arrow-right-black.png);
}

View File

@@ -1,188 +0,0 @@
Gui--DockWnd--ReportOutput,
Gui--TaskView--TaskView QScrollArea {
border: none;
}
QTabWidget::pane{
background-color: transparent;
border: transparent;
}
QAbstractItemView {
alternate-background-color: #f0f0f0;
color: #000000;
border: 1px solid #ababab;
}
Gui--OverlayTitleBar,
Gui--OverlaySplitterHandle {
background-color: #f0f0f0;
}
/* Overwrites Properties panel to use white text. */
Gui--TreePanel QTreeView {
background-color: rgba(70, 70, 70, 0.539);
border: 0px solid #696968;
/* alternate-background-color: rgba(255, 0, 0, 0.611); */
color: #fdfdfd;
gridline-color: #696968;
border-radius: 0px;
}
Gui--TreePanel QTreeView::item {
color: #000000;
}
Gui--TreePanel QTreeView:disabled {
color: #696968;
}
Gui--PropertyEditor--PropertyEditor {
qproperty-itemBackground: #ffffff;
}
Gui--OverlayTabWidget[transparent="false"] Gui--TreePanel QTreeView::item {
color: #ffffff;
}
Gui--OverlayTabWidget[transparent="true"] Gui--TreePanel QTreeView::item {
color: #ffffff;
}
Gui--OverlayTabWidget[transparent="true"] Gui--TreePanel QTreeView::item:disabled {
color: #9a9a9a;
}
Gui--OverlayTabWidget {
qproperty-effectColor: rgba(25, 25, 25, 220);
qproperty-effectBlurRadius: 0;
qproperty-effectOffsetX: 0;
qproperty-effectOffsetY: 0;
qproperty-effectWidth: 1;
qproperty-effectHeight: 1;
qproperty-enableEffect: 1;
}
Gui--OverlayTabWidget#OverlayBottom {
qproperty-effectColor: rgba(225, 225, 225, 220);
qproperty-effectBlurRadius: 0;
qproperty-effectOffsetX: 0.0;
qproperty-effectOffsetY: 0.0;
qproperty-effectWidth: 1;
qproperty-effectHeight: 1;
qproperty-enableEffect: 1;
}
Gui--OverlayTabWidget::pane {
background-color: transparent;
border: transparent;
}
QSint--ActionGroup QFrame[class="content"] {
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
}
Gui--OverlayTabWidget::tab-bar:top,
Gui--OverlayTabWidget::tab-bar:bottom {
left: 10px;
alignment: left;
}
Gui--OverlayTabWidget::tab-bar:left,
Gui--OverlayTabWidget::tab-bar:right {
top: 10px;
alignment: top;
}
Gui--OverlayProxyWidget {
qproperty-hintColor: rgba(250, 250, 250, 0.6);
}
Gui--OverlayToolButton {
border: 0.5px solid transparent;
border-radius: 2px;
}
Gui--OverlayToolButton:hover {
border: 0.5px solid #ffffff;
background-color: #ffffff;
border-radius: 2px;
}
Gui--OverlayToolButton::pressed,
Gui--OverlayToolButton:checked {
border: 0.5px solid #ababab;
border-radius: 2px;
background-color: #ababab;
}
Gui--OverlayToolButton:checked:hover {
border: 0.5px solid #ffffff;
background-color: #ffffff;
}
Gui--OverlayToolButton[objectName="OBTN Transparent"] {
image: url(qss:images_classic/transparent-lightgray.png);
}
Gui--OverlayToolButton[objectName="OBTN Transparent"]:hover {
image: url(qss:images_classic/transparent-black.png);
}
Gui--OverlayToolButton[objectName="OBTN Overlay"] {
image: url(qss:images_classic/overlay-lightgray.png);
}
Gui--OverlayToolButton[objectName="OBTN Overlay"]:hover {
image: url(qss:images_classic/overlay-black.png);
}
Gui--OverlayToolButton[objectName="OBTN AutoMode"] {
image: url(qss:images_classic/mode-lightgray.png);
}
Gui--OverlayToolButton[objectName="OBTN AutoMode"]:hover {
image: url(qss:images_classic/mode-black.png);
}
QTreeView::branch:open:has-children:has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-down-black.png);
}
QTreeView::branch:open:has-children:!has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-down-black.png);
}
QTreeView::branch:closed:has-children:has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-right-black.png);
}
QTreeView::branch:has-children:!has-siblings:closed {
border-image: none;
image: url(qss:images_classic/Arrow-right-black.png);
}
Gui--TreePanel QTreeView::branch:open:has-children:has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-down-white.png);
}
Gui--TreePanel QTreeView::branch:open:has-children:!has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-down-white.png);
}
Gui--TreePanel QTreeView::branch:closed:has-children:has-siblings {
border-image: none;
image: url(qss:images_classic/Arrow-right-white.png);
}
Gui--TreePanel QTreeView::branch:has-children:!has-siblings:closed {
border-image: none;
image: url(qss:images_classic/Arrow-right-white.png);
}

View File

@@ -1,125 +0,0 @@
Gui--DockWnd--ReportOutput,
Gui--TaskView--TaskView QScrollArea {
border: none;
}
QTabWidget::pane{
background-color: transparent;
border: transparent;
}
QAbstractItemView {
alternate-background-color: #f0f0f0;
color: #000000;
border: 1px solid #ababab;
}
Gui--PropertyEditor--PropertyEditor {
qproperty-itemBackground: #ffffff;
}
Gui--OverlayTitleBar,
Gui--OverlaySplitterHandle {
background-color: #f0f0f0;
}
/* The OverlayTabWidget is named as OverlayLeft, OverlayRight, OverlayTop, OverlayBottom.
To customize for each overlay docking site, use the following selector
Gui--OverlayTabWidget#OverlayLeft {}
*/
Gui--OverlayTabWidget {
qproperty-effectColor: rgba(247, 247, 247, 255);
qproperty-effectBlurRadius: 0;
qproperty-effectOffsetX: 0;
qproperty-effectOffsetY: 0;
qproperty-effectWidth: 1;
qproperty-effectHeight: 1;
qproperty-enableEffect: 1;
}
Gui--OverlayTabWidget#OverlayBottom {
qproperty-effectColor: rgba(247, 247, 247, 255);
qproperty-effectBlurRadius: 0;
qproperty-effectOffsetX: 0.0;
qproperty-effectOffsetY: 0.0;
qproperty-effectWidth: 1;
qproperty-effectHeight: 1;
qproperty-enableEffect: 1;
}
Gui--OverlayTabWidget::pane {
background-color: transparent;
border: transparent;
}
QSint--ActionGroup QFrame[class="content"] {
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
}
Gui--OverlayTabWidget::tab-bar:top,
Gui--OverlayTabWidget::tab-bar:bottom {
left: 10px;
alignment: left;
}
Gui--OverlayTabWidget::tab-bar:left,
Gui--OverlayTabWidget::tab-bar:right {
top: 10px;
alignment: top;
}
Gui--OverlayProxyWidget {
qproperty-hintColor: rgba(250, 250, 250, 0.6);
}
Gui--OverlayToolButton {
border: 1px solid transparent;
border-radius: 2px;
}
Gui--OverlayToolButton:hover {
border: 1px solid white;
background-color: #ffffff;
border-radius: 2px;
}
Gui--OverlayToolButton:focus {
border: 1px solid #0099ff;
border-radius: 2px;
}
Gui--OverlayToolButton::pressed,
Gui--OverlayToolButton:checked {
border: 1px solid #ababab;
border-radius: 2px;
background-color: #ababab;
}
Gui--OverlayToolButton:checked:hover {
border: 1px solid #ffffff;
background-color: #ffffff;
}
Gui--OverlayToolButton[objectName="OBTN Transparent"] {
image: url(qss:images_classic/transparent-lightgray.png);
}
Gui--OverlayToolButton[objectName="OBTN Transparent"]:hover {
image: url(qss:images_classic/transparent-black.png);
}
Gui--OverlayToolButton[objectName="OBTN Overlay"] {
image: url(qss:images_classic/overlay-lightgray.png);
}
Gui--OverlayToolButton[objectName="OBTN Overlay"]:hover {
image: url(qss:images_classic/overlay-black.png);
}
Gui--OverlayToolButton[objectName="OBTN AutoMode"] {
image: url(qss:images_classic/mode-lightgray.png);
}
Gui--OverlayToolButton[objectName="OBTN AutoMode"]:hover {
image: url(qss:images_classic/mode-black.png);
}