From 95ceb7e0ac48652157c14bc8bf74e450f104eedd Mon Sep 17 00:00:00 2001 From: rainzee Date: Sat, 28 Sep 2024 01:07:20 +0800 Subject: [PATCH 1/2] refactor: font and font token --- siui/core/__init__.py | 8 ++++-- siui/core/token.py | 62 +++++++++++++++++++++++++++++++++++++++++++ siui/gui/font.py | 51 ++++++++++++----------------------- 3 files changed, 85 insertions(+), 36 deletions(-) create mode 100644 siui/core/token.py diff --git a/siui/core/__init__.py b/siui/core/__init__.py index ec466f6..8ecff8f 100644 --- a/siui/core/__init__.py +++ b/siui/core/__init__.py @@ -1,5 +1,9 @@ - import siui.core.animation as animation import siui.core.color as color +import siui.core.globals as globals import siui.core.iconset as iconset -import siui.core.globals as globals \ No newline at end of file + +from .token import FontStyle as FontStyle +from .token import GlobalFont as GlobalFont +from .token import GlobalFontSize as GlobalFontSize +from .token import GlobalFontWeight as GlobalFontWeight diff --git a/siui/core/token.py b/siui/core/token.py new file mode 100644 index 0000000..30458c9 --- /dev/null +++ b/siui/core/token.py @@ -0,0 +1,62 @@ +from enum import Enum, auto + +from PyQt5.QtGui import QFont + + +class GlobalFontSize(Enum): + """Tokenized Global Font Size""" + + S = 14 + M = 20 + L = 24 + XL = 32 + + +class GlobalFontWeight(Enum): + """Tokenized Global Font Weight""" + + NORMAL = QFont.Weight.Normal + DEMI_BOLD = QFont.Weight.DemiBold + BOLD = QFont.Weight.Bold + + +class FontStyle(Enum): + """Tokenized Font Style""" + + REGULAR = QFont.Style.StyleNormal + ITALIC = QFont.Style.StyleItalic + OBLIQUE = QFont.Style.StyleOblique + + +class GlobalFont(Enum): + """Tokenized Global Font""" + + S_NORMAL = (GlobalFontSize.S, GlobalFontWeight.NORMAL, FontStyle.REGULAR) + M_NORMAL = (GlobalFontSize.M, GlobalFontWeight.NORMAL, FontStyle.REGULAR) + L_NORMAL = (GlobalFontSize.L, GlobalFontWeight.NORMAL, FontStyle.REGULAR) + XL_NORMAL = (GlobalFontSize.XL, GlobalFontWeight.NORMAL, FontStyle.REGULAR) + + S_NORMAL_ITALIC = (GlobalFontSize.S, GlobalFontWeight.NORMAL, FontStyle.ITALIC) + M_NORMAL_ITALIC = (GlobalFontSize.M, GlobalFontWeight.NORMAL, FontStyle.ITALIC) + L_NORMAL_ITALIC = (GlobalFontSize.L, GlobalFontWeight.NORMAL, FontStyle.ITALIC) + XL_NORMAL_ITALIC = (GlobalFontSize.XL, GlobalFontWeight.NORMAL, FontStyle.ITALIC) + + S_DEMI_BOLD = (GlobalFontSize.S, GlobalFontWeight.DEMI_BOLD, FontStyle.REGULAR) + M_DEMI_BOLD = (GlobalFontSize.M, GlobalFontWeight.DEMI_BOLD, FontStyle.REGULAR) + L_DEMI_BOLD = (GlobalFontSize.L, GlobalFontWeight.DEMI_BOLD, FontStyle.REGULAR) + XL_DEMI_BOLD = (GlobalFontSize.XL, GlobalFontWeight.DEMI_BOLD, FontStyle.REGULAR) + + S_DEMI_BOLD_ITALIC = (GlobalFontSize.S, GlobalFontWeight.DEMI_BOLD, FontStyle.ITALIC) + M_DEMI_BOLD_ITALIC = (GlobalFontSize.M, GlobalFontWeight.DEMI_BOLD, FontStyle.ITALIC) + L_DEMI_BOLD_ITALIC = (GlobalFontSize.L, GlobalFontWeight.DEMI_BOLD, FontStyle.ITALIC) + XL_DEMI_BOLD_ITALIC = (GlobalFontSize.XL, GlobalFontWeight.DEMI_BOLD, FontStyle.ITALIC) + + S_BOLD = (GlobalFontSize.S, GlobalFontWeight.BOLD, FontStyle.REGULAR) + M_BOLD = (GlobalFontSize.M, GlobalFontWeight.BOLD, FontStyle.REGULAR) + L_BOLD = (GlobalFontSize.L, GlobalFontWeight.BOLD, FontStyle.REGULAR) + XL_BOLD = (GlobalFontSize.XL, GlobalFontWeight.BOLD, FontStyle.REGULAR) + + S_BOLD_ITALIC = (GlobalFontSize.S, GlobalFontWeight.BOLD, FontStyle.ITALIC) + M_BOLD_ITALIC = (GlobalFontSize.M, GlobalFontWeight.BOLD, FontStyle.ITALIC) + L_BOLD_ITALIC = (GlobalFontSize.L, GlobalFontWeight.BOLD, FontStyle.ITALIC) + XL_BOLD_ITALIC = (GlobalFontSize.XL, GlobalFontWeight.BOLD, FontStyle.ITALIC) diff --git a/siui/gui/font.py b/siui/gui/font.py index dbc0b40..3b00b55 100644 --- a/siui/gui/font.py +++ b/siui/gui/font.py @@ -1,58 +1,41 @@ -from collections.abc import Sequence -from enum import Enum +from __future__ import annotations + +from typing import TYPE_CHECKING from PyQt5.QtGui import QFont -# 因DPI缩放而引入的因数 -scale_factor = 1 # TODO: 需要从获取缩放比例的模块中获取 +from siui.core import FontStyle, GlobalFont, GlobalFontSize, GlobalFontWeight + +if TYPE_CHECKING: + from collections.abc import Sequence class SiFont: @staticmethod def getFont( - families: Sequence[str] = ["Microsoft YaHei"], + families: Sequence[str] = ["Segoe UI", "Microsoft YaHei", "PingFang SC"], size: int = 14, weight: QFont.Weight = QFont.Weight.Normal, italic: bool = False, ) -> QFont: font = QFont() font.setFamilies(families) - font.setPixelSize(SiFont.scaled_size(size)) + font.setPixelSize(size) font.setWeight(weight) font.setItalic(italic) return font @staticmethod - def scaled_size(size: int) -> int: - return int(size * scale_factor) + def fromToken(size: GlobalFontSize, weight: GlobalFontWeight, style: FontStyle) -> QFont: + """通过已经令牌化的字体属性构造字体""" + + return SiFont.getFont(size=size.value, weight=weight.value, italic=style == FontStyle.ITALIC) @staticmethod - def fromToken(token) -> QFont: + def tokenized(token: GlobalFont) -> QFont: + """返回一个已经被令牌化的全局字体""" + try: - return token.value + return SiFont.fromToken(*token.value) except KeyError: raise ValueError(f"Invalid token: {token}") - - -class GlobalFont(Enum): - # Normal - S_NORMAL = SiFont.getFont(size=14, weight=QFont.Weight.Normal, italic=False) - M_NORMAL = SiFont.getFont(size=20, weight=QFont.Weight.Normal, italic=False) - L_NORMAL = SiFont.getFont(size=24, weight=QFont.Weight.Normal, italic=False) - XL_NORMAL = SiFont.getFont(size=32, weight=QFont.Weight.Normal, italic=False) - - S_NORMAL_ITALIC = SiFont.getFont(size=14, weight=QFont.Weight.Normal, italic=True) - M_NORMAL_ITALIC = SiFont.getFont(size=20, weight=QFont.Weight.Normal, italic=True) - L_NORMAL_ITALIC = SiFont.getFont(size=24, weight=QFont.Weight.Normal, italic=True) - XL_NORMAL_ITALIC = SiFont.getFont(size=32, weight=QFont.Weight.Normal, italic=True) - - # Bold - S_BOLD = SiFont.getFont(size=14, weight=QFont.Weight.Bold, italic=False) - M_BOLD = SiFont.getFont(size=20, weight=QFont.Weight.Bold, italic=False) - L_BOLD = SiFont.getFont(size=24, weight=QFont.Weight.Bold, italic=False) - XL_BOLD = SiFont.getFont(size=32, weight=QFont.Weight.Bold, italic=False) - - S_BOLD_ITALIC = SiFont.getFont(size=14, weight=QFont.Weight.Bold, italic=True) - M_BOLD_ITALIC = SiFont.getFont(size=20, weight=QFont.Weight.Bold, italic=True) - L_BOLD_ITALIC = SiFont.getFont(size=24, weight=QFont.Weight.Bold, italic=True) - XL_BOLD_ITALIC = SiFont.getFont(size=32, weight=QFont.Weight.Bold, italic=True) From c9f57fbc5265d344431b19b45fefe8791016beef Mon Sep 17 00:00:00 2001 From: rainzee Date: Sat, 28 Sep 2024 01:11:12 +0800 Subject: [PATCH 2/2] fix: remove unused import --- siui/core/token.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/siui/core/token.py b/siui/core/token.py index 30458c9..10ce4d0 100644 --- a/siui/core/token.py +++ b/siui/core/token.py @@ -1,4 +1,4 @@ -from enum import Enum, auto +from enum import Enum from PyQt5.QtGui import QFont