重写QSS组件,让主题和元素更改更方便

This commit is contained in:
RigoLigoRLC 2021-08-19 02:00:16 +08:00
parent dd00465d83
commit 04ebc6ed20
7 changed files with 288 additions and 200 deletions

View File

@ -54,6 +54,7 @@ set(SOURCE_FILES
inc/dtk/spkdtkplugin.h
inc/spkutils.h src/spkutils.cpp
inc/telemetry/collectid.h
inc/spkqsshelper.h
inc/spkwindow.h gui/spkwindow.cpp
inc/spktitlebar.h gui/spktitlebar.cpp

View File

@ -20,7 +20,7 @@ void SpkLoading::paintEvent(QPaintEvent *e)
{
QPainter p(this);
QPen pen(Qt::NoPen);
QBrush b(SpkUi::CurrentColorSet[SpkUi::AccentColor], Qt::SolidPattern);
QBrush b(SpkUi::CurrentColorSet[SpkUi::Qss::AccentColor], Qt::SolidPattern);
p.setBrush(b);
p.setPen(pen);
p.setRenderHint(QPainter::Antialiasing);

View File

@ -24,14 +24,14 @@
namespace SpkUi
{
UiMetaObject SpkUiMetaObject;
SpkUiStyle CurrentStyle;
QString StylesheetBase, CurrentStylesheet;
QColor ColorLine, ColorBack;
QSize PrimaryScreenSize;
SpkDtkPlugin *DtkPlugin = nullptr;
QStyle *OldSystemStyle = nullptr;
QList<QColor> CurrentColorSet;
std::map<Qss::ColorSetIndex, QColor> CurrentColorSet;
SpkPopup *Popup;
@ -141,38 +141,17 @@ namespace SpkUi
switch(aStyle)
{
case Light:
static auto LightColor = QList<QColor>{
0x282828, 0x282828, 0xff0000, 0x0070ff, QColor(0x70ff).lighter(120),
0x6b6b6b, 0x656565, 0x606060, 0x404040, 0x383838,
ColorTextOnBackground(0x0070ff),
ColorTextOnBackground(0x282828),
ColorTextOnBackground(0x282828),
/* TODO: %14 lighter text */
};
CurrentStylesheet = StylesheetFromColors(LightColor);
CurrentStylesheet = StylesheetFromColors(Qss::LightColorSet);
CurrentColorSet = Qss::LightColorSet;
qApp->setStyleSheet(CurrentStylesheet);
// TODO
ColorLine = Qt::black;
break;
case Dark:
static auto DarkColor = QList<QColor>{
0x282828, 0x282828, 0xff0000, 0x0070ff, QColor(0x70ff).lighter(120),
0x6b6b6b, 0x656565, 0x606060, 0x404040, 0x383838,
ColorTextOnBackground(0x0070ff),
ColorTextOnBackground(0x282828),
ColorTextOnBackground(0x282828),
0xd5d5d5
};
CurrentStylesheet = StylesheetFromColors(DarkColor);
CurrentColorSet = DarkColor;
CurrentStylesheet = StylesheetFromColors(Qss::DarkColorSet);
CurrentColorSet = Qss::DarkColorSet;
qApp->setStyleSheet(CurrentStylesheet);
ColorLine = Qt::white;
break;
// IDE complains about default label covering all conditions, commented
// default:
// sWarn(QObject::tr("SetGlobalStyle invoked with unknown style %1.")
// .arg(static_cast<int>(aStyle)));
// break;
}
}
@ -251,11 +230,11 @@ namespace SpkUi
return QIcon(":/icons/" + name + ".svg");
}
QString StylesheetFromColors(QList<QColor> aColors)
QString StylesheetFromColors(Qss::ColorSet aColors)
{
QString ret = StylesheetBase;
foreach(auto &i, aColors)
ret = ret.arg(i.name());
ret = ret.replace(Qss::ColorSet2Token.at(i.first), i.second.name());
return ret;
}
@ -268,9 +247,9 @@ namespace SpkUi
void UiMetaObject::SetAccentColor(QColor aColor)
{
CurrentColorSet[AccentColor] = aColor.lighter(80);
CurrentColorSet[AccentColorHighlighted] = aColor;
CurrentColorSet[TextOnAccentColor] = ColorTextOnBackground(aColor);
CurrentColorSet[Qss::AccentColor] = aColor.lighter(80);
CurrentColorSet[Qss::AccentColorHighlighted] = aColor;
CurrentColorSet[Qss::TextOnAccentColor] = ColorTextOnBackground(aColor);
qApp->setStyleSheet(StylesheetFromColors(CurrentColorSet));
}

94
inc/spkqsshelper.h Normal file
View File

@ -0,0 +1,94 @@
#pragma once
#include <map>
#include <QColor>
namespace SpkUi
{
QColor ColorTextOnBackground(QColor);
namespace Qss
{
enum ColorSetIndex
{
GlobalBgnd = 0,
ControlsBgnd,
ControlsBgndHighlighted,
SelectionBgnd, AccentColor = SelectionBgnd,
SelectionBgndHighlighted, AccentColorHighlighted = SelectionBgndHighlighted,
LightCtrlsGradLight,
LightCtrlsGradDark,
LightCtrlsGradDarker,
DarkCtrlsGradLight,
DarkCtrlsGradDark,
TextOnSelection, TextOnAccentColor = TextOnSelection,
TextOnGlobalBgnd,
TextOnControlsBgnd,
TextLighter,
GlossyEdge,
ShadesEdge,
};
const std::map<ColorSetIndex, const char *> ColorSet2Token
{
{ GlobalBgnd, "GBG_" },
{ ControlsBgnd, "CBG_" },
{ ControlsBgndHighlighted, "CBGH" },
{ SelectionBgnd, "ACC_" },
{ SelectionBgndHighlighted, "ACCH" },
{ LightCtrlsGradLight, "LCTL1" },
{ LightCtrlsGradDark, "LCTL2" },
{ LightCtrlsGradDarker, "LCTL3" },
{ DarkCtrlsGradLight, "DCTL1" },
{ DarkCtrlsGradDark, "DCTL2" },
{ TextOnSelection, "TXACC" },
{ TextOnGlobalBgnd, "TXGBG" },
{ TextOnControlsBgnd, "TXCBG" },
{ TextLighter, "TXL" },
{ GlossyEdge, "GLS" },
{ ShadesEdge, "SHD" }
};
const std::map<ColorSetIndex, QColor>
DarkColorSet
{
{ GlobalBgnd, 0x282828 },
{ ControlsBgnd, 0x323232 },
{ ControlsBgndHighlighted, 0xff0000 },
{ SelectionBgnd, 0x0070ff },
{ SelectionBgndHighlighted, QColor(0x0070ff).lighter(120) },
{ LightCtrlsGradLight, 0x6b6b6b },
{ LightCtrlsGradDark, 0x656565 },
{ LightCtrlsGradDarker, 0x606060 },
{ DarkCtrlsGradLight, 0x404040 },
{ DarkCtrlsGradDark, 0x383838 },
{ TextOnSelection, ColorTextOnBackground(0x0070ff) },
{ TextOnGlobalBgnd, ColorTextOnBackground(0x282828) },
{ TextOnControlsBgnd, ColorTextOnBackground(0x282828) },
{ TextLighter, 0xd5d5d5 },
{ GlossyEdge, 0x656565 },
{ ShadesEdge, 0x7b7b7b }
},
LightColorSet // TODO: Use real light color set
{
// { GlobalBgnd, 0x282828 },
// { ControlsBgnd, 0x282828 },
// { ControlsBgndHighlighted, 0xff0000 },
// { SelectionBgnd, 0x0070ff },
// { SelectionBgndHighlighted, QColor(0x0070ff).lighter(120) },
// { LightCtrlsGradLight, 0x6b6b6b },
// { LightCtrlsGradDark, 0x656565 },
// { LightCtrlsGradDarker, 0x606060 },
// { DarkCtrlsGradLight, 0x404040 },
// { DarkCtrlsGradDark, 0x383838 },
// { TextOnSelection, ColorTextOnBackground(0x0070ff) },
// { TextOnGlobalBgnd, ColorTextOnBackground(0x282828) },
// { TextOnControlsBgnd, ColorTextOnBackground(0x282828) },
// { TextLighter, 0xd5d5d5 }
};
using ColorSet = std::map<Qss::ColorSetIndex, QColor>;
}
}

View File

@ -1,4 +1,14 @@
#ifndef SPKRESOURCE_H
#define SPKRESOURCE_H
#endif // SPKRESOURCE_H
#pragma once
#include <QObject>
class SpkResource : public QObject
{
Q_OBJECT
public:
SpkResource(QObject *parent = nullptr);
private:
};

View File

@ -8,30 +8,16 @@
#include <QString>
#include <QSize>
#include <QColor>
#include <map>
#include "spkqsshelper.h"
#include "dtk/spkdtkplugin.h"
namespace SpkUi
{
enum SpkUiStyle { Light, Dark };
enum SpkButtonStyle { Normal = 0, Recommend, Warn };
enum ColorSetIndex
{
GlobalBgnd = 0,
ControlsBgnd,
ControlsBgndHighlighted,
SelectionBgnd, AccentColor = SelectionBgnd,
SelectionBgndHighlighted, AccentColorHighlighted = SelectionBgndHighlighted,
LightCtrlsGradLight,
LightCtrlsGradDark,
LightCtrlsGradDarker,
DarkCtrlsGradLight,
DarkCtrlsGradDark,
TextOnSelection, TextOnAccentColor = TextOnSelection,
TextOnGlobalBgnd,
TextOnControlsBgnd,
TextLighter
};
class SpkPopup;
@ -56,7 +42,7 @@ namespace SpkUi
extern QSize PrimaryScreenSize;
extern SpkDtkPlugin *DtkPlugin;
extern QStyle *OldSystemStyle;
extern QList<QColor> CurrentColorSet;
extern std::map<Qss::ColorSetIndex, QColor> CurrentColorSet;
extern SpkPopup *Popup;
@ -68,16 +54,16 @@ namespace SpkUi
namespace Priv
{
extern bool CrashHandlerActivated;
using namespace SpkUi::Qss;
}
void Initialize();
void GuessAppropriateTheme();
void PrepareForDeepinDesktop();
bool CheckIsDeepinDesktop();
QString StylesheetFromColors(QList<QColor>);
QString StylesheetFromColors(Qss::ColorSet);
QIcon GetThemedIcon(QString);
QColor ColorTextOnBackground(QColor);
void CrashSignalHandler(int);

View File

@ -1,32 +1,172 @@
/*
Spark Customizable style sheet conventions
%1 : Global background color
%2 : Controls background color
%3 : Controls background color highlighted
%4 : Selection/Activation background color
%5 : Selection/Activation background color hightlighted
%6 : Light controls gradient light
%7 : Light controls gradient dark
%8 : Light controls gradient darker
%9 : Dark controls gradient light
%10: Dark controls gradient dark
%11: Text on Selection/Activation
%12: Text on Global background
%13: Text on controls background
%14: Text slightly lighter
GBG_ : Global background color
CBG_ : Controls background color
CBGH : Controls background color highlighted
ACC_ : Selection/Activation background color
ACCH : Selection/Activation background color hightlighted
LCTL1 : Light controls gradient light
LCTL2 : Light controls gradient dark
LCTL3 : Light controls gradient darker
DCTL1 : Dark controls gradient light
DCTL2: Dark controls gradient dark
TXACC: Text on Selection/Activation
TXGBG: Text on Global background
TXCBG: Text on controls background
TXL: Text slightly lighter
GLS: Glossy edge on controls
SHD: Shades edge on controls
*/
QWidget
{
background-color: %1;
background-color: GBG_;
color: #ffffff;
}
QLabel
{
background: transparent;
font-size: 14px;
}
QScrollArea
{
border-width: 1px;
border-radius: 5px;
}
QLineEdit
{
background:qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 LCTL1, stop:1 LCTL2);
padding: 3px;
border-radius: 7px;
border: 1px solid SHD;
border-bottom: 1px solid GLS;
selection-color: TXACC;
selection-background-color: ACC_;
}
QPushButton
{
border-width: 1px;
padding: 2px;
font-size: 14px;
font-weight: 300;
border-radius: 8px;
border-color: LCTL2;
border-top-color: SHD;
border-style: solid;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 LCTL1, stop:1 LCTL2)
}
QPushButton::pressed
{
border-top-color: GLS;
border-bottom-color: SHD;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 LCTL3, stop:1 LCTL1)
}
QScrollBar::handle
{
border: 0px;
border-radius: 5px;
background-color: DCTL1
}
QScrollBar::horizontal{height: 10px}
QScrollBar::vertical{width:10px}
QScrollBar::handle:hover
{
background-color: LCTL2
}
QScrollBar::add-line, QScrollBar::sub-line
{
height:0px
}
/* Custom widgets */
#styAboutDesc
{
color: TXL
}
SpkAppItem
{
background: DCTL2;
border-radius: 11px;
}
SpkAppItem::hover
{
background: DCTL1;
border-radius: 11px;
}
#styAppItmTitle
{
font-weight: 500;
font-size: 17px;
}
#styChkBtn
{
border-width: 0px;
background-color: DCTL1
}
#styChkBtn:pressed
{
background-color: ACCH
}
#styChkBtn:checked
{
background-color: ACC_
}
#styPlainChkBtn
{
border-width: 0px;
background-color: GBG_
}
#styPlainChkBtn:pressed
{
background-color: ACCH
}
#styPlainChkBtn:checked
{
background-color: ACC_
}
SpkTitleBar
{
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 DCTL2, stop:1 DCTL1)
}
SpkTitleBarDefaultButton
{
margin: 0px;
border-radius: 0px;
border-width: 0px;
background-color: CBG_;
}
SpkTitleBarDefaultButton:hover
{
background-color: DCTL1;
}
SpkTitleBarDefaultButton:pressed
{
background-color: LCTL3;
}
/* Window widgets */
#styMwCateg
{
border: none;
@ -38,143 +178,21 @@ QLabel
{
height: 35px;
border: none;
color: %13;
color: TXCBG;
}
#styMwCateg::item:selected
{
color: %11;
background-color: %4;
color: TXACC;
background-color: ACC_;
}
#styMwCateg::branch:!has-children
{
background: %1;
background: GBG_;
}
#styMwCateg::branch:selected
{
background-color: %4;
}
QLabel
{
font-size: 14px
}
QScrollArea
{
border-width: 1px;
border-radius: 5px;
}
QPushButton
{
border-width: 1px;
padding: 2px;
font-size: 14px;
font-weight: 300;
border-radius: 11px;
border-color: %7;
border-top-color: #7b7b7b;
border-style: solid;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 %6, stop:1 %7)
}
QPushButton::pressed
{
border-top-color: #656565;
border-bottom-color: #7b7b7b;
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 %8, stop:1 %6)
}
#styChkBtn
{
border-width: 0px;
background-color: %9
}
#styChkBtn:pressed
{
background-color: %5
}
#styChkBtn:checked
{
background-color: %4
}
#styPlainChkBtn
{
border-width: 0px;
background-color: %1
}
#styPlainChkBtn:pressed
{
background-color: %5
}
#styPlainChkBtn:checked
{
background-color: %4
}
SpkTitleBar
{
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 %10, stop:1 %9)
}
SpkTitleBarDefaultButton
{
margin: 0px;
border-radius: 0px;
border-width: 0px;
background-color: %2;
}
SpkTitleBarDefaultButton:hover
{
background-color: %9;
}
SpkTitleBarDefaultButton:pressed
{
background-color: %8;
}
QScrollBar::handle
{
border: 0px;
border-radius: 5px;
background-color: #606060
}
QScrollBar::horizontal{height: 10px}
QScrollBar::vertical{width:10px}
QScrollBar::handle:hover
{
background-color: #606060
}
QScrollBar::add-line, QScrollBar::sub-line
{
height:0px
}
#styAboutDesc
{
color: %14
}
SpkAppItem
{
background: %10;
border-radius: 11px;
}
#styAppItmTitle
{
font-weight: 500;
font-size: 17px;
}
background-color: ACC_;
}