[Gui] Prefer Dark-Outline as default overlay stylesheet

FreeCAD 3D View is often somewhat dark even if the UI is in light
colors. So if user has not speficially applied "Light" stylesheet we
should prefer to use "Dark-Outline" stylesheet which provides proper and
fully transparent overlay panels.
This commit is contained in:
Kacper Donat
2023-10-08 14:24:15 +02:00
committed by wwmayer
parent 06af8b2bd8
commit 9d5390ed83

View File

@@ -94,128 +94,155 @@ public:
OverlayStyleSheet() {
handle = App::GetApplication().GetParameterGroupByPath(
"User parameter:BaseApp/Preferences/MainWindow");
"User parameter:BaseApp/Preferences/MainWindow");
update();
handle->Attach(this);
}
static OverlayStyleSheet *instance() {
static OverlayStyleSheet *inst;
if(!inst)
inst = new OverlayStyleSheet;
return inst;
static OverlayStyleSheet* instance;
if (!instance) {
instance = new OverlayStyleSheet;
}
return instance;
}
void OnChange(Base::Subject<const char*> &, const char* sReason) {
if(!sReason)
if (!sReason) {
return;
if(strcmp(sReason, "StyleSheet")==0
|| strcmp(sReason, "OverlayActiveStyleSheet")==0)
{
}
if (strcmp(sReason, "StyleSheet") == 0 ||
strcmp(sReason, "OverlayActiveStyleSheet") == 0) {
OverlayManager::instance()->refresh(nullptr, true);
}
}
void update() {
QString mainstyle = QString::fromUtf8(handle->GetASCII("StyleSheet").c_str());
QString prefix;
if(!mainstyle.isEmpty()) {
int dark = mainstyle.indexOf(QStringLiteral("dark"),0,Qt::CaseInsensitive);
prefix = QStringLiteral("overlay:%1").arg(
dark<0 ? QStringLiteral("Light") : QStringLiteral("Dark"));
}
QString name;
name = QString::fromUtf8(handle->GetASCII("OverlayActiveStyleSheet").c_str());
if(name.isEmpty() && !prefix.isEmpty())
name = prefix + QStringLiteral(".qss");
else if (!QFile::exists(name))
name = QStringLiteral("overlay:%1").arg(name);
activeStyleSheet.clear();
if(QFile::exists(name)) {
QFile f(name);
if(f.open(QFile::ReadOnly)) {
QTextStream str(&f);
activeStyleSheet = str.readAll();
}
}
if(activeStyleSheet.isEmpty()) {
static QString _default = QStringLiteral(
"* {alternate-background-color: rgba(250,250,250,120)}"
"QComboBox, QComboBox:editable, QComboBox:!editable, QLineEdit,"
"QTextEdit, QPlainTextEdit, QAbstractSpinBox, QDateEdit, QDateTimeEdit,"
"Gui--PropertyEditor--PropertyEditor QLabel "
"{background : palette(base);}"
QString overlayStylesheetFileName = detectOverlayStyleSheetFileName();
loadFromFile(overlayStylesheetFileName);
"QScrollBar { background: rgba(0,0,0,10);}"
"QTabWidget::pane { background-color: transparent; border: transparent }"
"Gui--OverlayTabWidget { qproperty-effectColor: rgba(0,0,0,0) }"
"Gui--OverlayTabWidget::pane { background-color: rgba(250,250,250,80) }"
"QTabBar {border : none;}"
"QTabBar::tab {color: palette(text);"
"background-color: rgba(100,100,100,50);"
"padding: 5px}"
"QTabBar::tab:selected {background-color: rgba(250,250,250,80);}"
"QTabBar::tab:hover {background-color: rgba(250,250,250,200);}"
"QHeaderView { background:transparent }"
"QHeaderView::section {color: palette(text);"
"background-color: rgba(250,250,250,50);"
"border: 1px solid palette(dark);"
"padding: 2px}"
"QTreeView, QListView, QTableView {"
"background: rgb(250,250,250);"
"border: transparent;"
"selection-background-color: rgba(94, 144, 250, 0.7);}"
"QListView::item:selected, QTreeView::item:selected {"
"background-color: rgba(94, 144, 250, 0.7);}"
"Gui--PropertyEditor--PropertyEditor {"
"border: 1px solid palette(dark);"
"qproperty-groupTextColor: rgb(100, 100, 100);"
"qproperty-groupBackground: rgba(180, 180, 180, 0.7);}"
"QToolTip {background-color: rgba(250,250,250,180);}"
"Gui--TreeWidget QHeaderView:section {"
"height: 0px;"
"background-color: transparent;"
"padding: 0px;"
"border: transparent;}"
"Gui--CallTipsList::item { background-color: rgba(200,200,200,200);}"
"Gui--CallTipsList::item::selected { background-color: palette(highlight);}"
"QPushButton { background: rgba(250,250,250,80);padding: 2px 4px;}"
"QPushButton::hover { background: rgba(250,250,250,200);}"
"QPushButton::focus { background: rgba(250,250,250,255);}"
"QPushButton::pressed { background-color: #5e90fa;"
"border: 1px inset palette(dark) }"
"QPushButton::checked { background: rgba(100,100,100,100);"
"border: 1px inset palette(dark) }"
"QPushButton::checked:hover { background: rgba(150,150,150,200);"
"border: 1px inset palette(dark) }"
"Gui--OverlayToolButton { background: transparent; padding: 0px; border: none }"
"Gui--OverlayTitleBar,"
"Gui--OverlaySplitterHandle { background-color: rgba(200, 200, 200, 150); }"
"QWidget#ClippingScrollAreaContents, "
"QScrollArea#ClippingScrollArea { border: none; background-color: #a0e6e6e6; }"
"Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton {text-align:left;padding-left:2px;}"
);
// If after loading the result is still empty we need to apply some defaults
if (activeStyleSheet.isEmpty()) {
activeStyleSheet = _default;
}
}
ParameterGrp::handle handle;
QString activeStyleSheet;
bool hideTab = false;
bool hideTab;
private:
QString detectOverlayStyleSheetFileName() const {
QString mainStyleSheet = QString::fromUtf8(handle->GetASCII("StyleSheet").c_str());
QString overlayStyleSheet = QString::fromUtf8(handle->GetASCII("OverlayActiveStyleSheet").c_str());
if (overlayStyleSheet.isEmpty()) {
// User did not choose any stylesheet, we need to choose one based on main stylesheet
if (mainStyleSheet.contains(QStringLiteral("light"), Qt::CaseInsensitive)) {
overlayStyleSheet = QStringLiteral("overlay:Light-Outline.qss");
}
else {
// by default FreeCAD uses somewhat dark background for 3D View.
// if user has not explicitly selected light theme, the "Dark Outline" looks best
overlayStyleSheet = QStringLiteral("overlay:Dark-Outline.qss");
}
}
else if (!overlayStyleSheet.isEmpty() && !QFile::exists(overlayStyleSheet)) {
// User did choose one of predefined stylesheets, we need to qualify it with namespace
overlayStyleSheet = QStringLiteral("overlay:%s").arg(overlayStyleSheet);
}
return overlayStyleSheet;
}
void loadFromFile(const QString& name) {
if (!QFile::exists(name)) {
return;
}
QFile file(name);
if (file.open(QFile::ReadOnly)) {
activeStyleSheet = QTextStream(&file).readAll();
}
}
static const QString _default;
};
const QString OverlayStyleSheet::_default = QStringLiteral(
"* {alternate-background-color: rgba(250,250,250,120)}"
"QComboBox, QComboBox:editable, QComboBox:!editable, QLineEdit,"
"QTextEdit, QPlainTextEdit, QAbstractSpinBox, QDateEdit, QDateTimeEdit,"
"Gui--PropertyEditor--PropertyEditor QLabel "
"{background : palette(base);}"
"QScrollBar { background: rgba(0,0,0,10);}"
"QTabWidget::pane { background-color: transparent; border: transparent }"
"Gui--OverlayTabWidget { qproperty-effectColor: rgba(0,0,0,0) }"
"Gui--OverlayTabWidget::pane { background-color: rgba(250,250,250,80) }"
"QTabBar {border : none;}"
"QTabBar::tab {color: palette(text);"
"background-color: rgba(100,100,100,50);"
"padding: 5px}"
"QTabBar::tab:selected {background-color: rgba(250,250,250,80);}"
"QTabBar::tab:hover {background-color: rgba(250,250,250,200);}"
"QHeaderView { background:transparent }"
"QHeaderView::section {color: palette(text);"
"background-color: rgba(250,250,250,50);"
"border: 1px solid palette(dark);"
"padding: 2px}"
"QTreeView, QListView, QTableView {"
"background: rgb(250,250,250);"
"border: transparent;"
"selection-background-color: rgba(94, 144, 250, 0.7);}"
"QListView::item:selected, QTreeView::item:selected {"
"background-color: rgba(94, 144, 250, 0.7);}"
"Gui--PropertyEditor--PropertyEditor {"
"border: 1px solid palette(dark);"
"qproperty-groupTextColor: rgb(100, 100, 100);"
"qproperty-groupBackground: rgba(180, 180, 180, 0.7);}"
"QToolTip {background-color: rgba(250,250,250,180);}"
"Gui--TreeWidget QHeaderView:section {"
"height: 0px;"
"background-color: transparent;"
"padding: 0px;"
"border: transparent;}"
"Gui--CallTipsList::item { background-color: rgba(200,200,200,200);}"
"Gui--CallTipsList::item::selected { background-color: palette(highlight);}"
"QPushButton { background: rgba(250,250,250,80);padding: 2px 4px;}"
"QPushButton::hover { background: rgba(250,250,250,200);}"
"QPushButton::focus { background: rgba(250,250,250,255);}"
"QPushButton::pressed { background-color: #5e90fa;"
"border: 1px inset palette(dark) }"
"QPushButton::checked { background: rgba(100,100,100,100);"
"border: 1px inset palette(dark) }"
"QPushButton::checked:hover { background: rgba(150,150,150,200);"
"border: 1px inset palette(dark) }"
"Gui--OverlayToolButton { background: transparent; padding: 0px; border: none }"
"Gui--OverlayTitleBar,"
"Gui--OverlaySplitterHandle { background-color: rgba(200, 200, 200, 150); }"
"QWidget#ClippingScrollAreaContents, "
"QScrollArea#ClippingScrollArea { border: none; background-color: #a0e6e6e6; }"
"Gui--PropertyEditor--PropertyEditor > QWidget > QPushButton {text-align:left;padding-left:2px;}"
);
// -----------------------------------------------------------
struct OverlayInfo {