1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-05-11 14:59:38 -04:00

fonts: native rendering + add settings to override renderType

fixes #2371
This commit is contained in:
bbedward
2026-05-11 10:49:29 -04:00
parent 676219bc09
commit 2690305724
14 changed files with 209 additions and 4 deletions

View File

@@ -61,6 +61,20 @@ Singleton {
Colorful
}
enum TextRenderType {
Qt,
Native,
Curve
}
enum TextRenderQuality {
Default,
Low,
Normal,
High,
VeryHigh
}
readonly property string _homeUrl: StandardPaths.writableLocation(StandardPaths.HomeLocation)
readonly property string _configUrl: StandardPaths.writableLocation(StandardPaths.ConfigLocation)
readonly property string _configDir: Paths.strip(_configUrl)
@@ -483,6 +497,8 @@ Singleton {
property int fontWeight: Font.Normal
property real fontScale: 1.0
property real dankBarFontScale: 1.0
property int textRenderType: SettingsData.TextRenderType.Native
property int textRenderQuality: SettingsData.TextRenderQuality.Default
property bool notepadUseMonospace: true
property string notepadFontFamily: ""

View File

@@ -242,6 +242,8 @@ var SPEC = {
monoFontFamily: { def: "Fira Code" },
fontWeight: { def: 400 },
fontScale: { def: 1.0 },
textRenderType: { def: 1 },
textRenderQuality: { def: 0 },
notepadUseMonospace: { def: true },
notepadFontFamily: { def: "" },

View File

@@ -448,6 +448,7 @@ Rectangle {
name: "sync"
size: 24
color: Qt.rgba(Theme.surfaceText.r || 0.8, Theme.surfaceText.g || 0.8, Theme.surfaceText.b || 0.8, 0.4)
smoothTransform: BluetoothService.adapter?.discovering ?? false
RotationAnimator on rotation {
running: parent.visible

View File

@@ -177,6 +177,7 @@ Rectangle {
name: "sync"
size: 32
color: Theme.primary
smoothTransform: NetworkService.wifiToggling
RotationAnimator on rotation {
running: NetworkService.wifiToggling
@@ -493,6 +494,7 @@ Rectangle {
name: "refresh"
size: 48
color: Qt.rgba(Theme.surfaceText.r || 0.8, Theme.surfaceText.g || 0.8, Theme.surfaceText.b || 0.8, 0.3)
smoothTransform: wifiScanningOverlay.visible
RotationAnimator on rotation {
running: wifiScanningOverlay.visible

View File

@@ -55,6 +55,7 @@ BasePill {
id: statusIcon
anchors.centerIn: parent
visible: root.isVerticalOrientation
smoothTransform: root.isChecking
name: {
if (root.isChecking)
return "refresh";
@@ -109,6 +110,7 @@ BasePill {
DankIcon {
id: statusIconHorizontal
anchors.verticalCenter: parent.verticalCenter
smoothTransform: root.isChecking
name: {
if (root.isChecking)
return "refresh";

View File

@@ -146,6 +146,7 @@ Item {
color: Theme.withAlpha(Theme.surfaceText, 0.4)
anchors.top: parent.top
anchors.verticalCenter: parent.verticalCenter
smoothTransform: isRefreshing
property bool isRefreshing: false
enabled: !isRefreshing
@@ -884,6 +885,7 @@ Item {
color: Theme.withAlpha(Theme.surfaceText, 0.4)
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
smoothTransform: isRefreshing
property bool isRefreshing: false
enabled: !isRefreshing

View File

@@ -483,6 +483,7 @@ Item {
size: 40
color: Theme.primary
anchors.centerIn: parent
smoothTransform: loadingOverlay.visible
RotationAnimator {
target: spinningIcon

View File

@@ -562,6 +562,7 @@ Item {
size: 20
color: Theme.primary
anchors.verticalCenter: parent.verticalCenter
smoothTransform: KeybindsService.loading
RotationAnimator on rotation {
from: 0

View File

@@ -375,6 +375,7 @@ FloatingWindow {
size: 48
color: Theme.primary
anchors.horizontalCenter: parent.horizontalCenter
smoothTransform: root.isLoading
RotationAnimator on rotation {
from: 0

View File

@@ -343,6 +343,7 @@ FloatingWindow {
size: 48
color: Theme.primary
anchors.horizontalCenter: parent.horizontalCenter
smoothTransform: root.isLoading
RotationAnimator on rotation {
from: 0

View File

@@ -671,6 +671,7 @@ Item {
color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.4)
anchors.right: parent.right
anchors.top: parent.top
smoothTransform: isRefreshing
property bool isRefreshing: false
enabled: !isRefreshing

View File

@@ -329,6 +329,153 @@ Item {
}
}
SettingsCard {
tab: "typography"
tags: ["text", "render", "rendering", "quality", "anti-aliasing", "freetype", "distance", "field"]
title: I18n.tr("Text Rendering")
settingKey: "textRenderType"
iconName: "text_format"
Item {
width: parent.width
height: renderTypeGroup.implicitHeight
clip: true
DankButtonGroup {
id: renderTypeGroup
anchors.horizontalCenter: parent.horizontalCenter
buttonPadding: parent.width < 480 ? Theme.spacingS : Theme.spacingL
minButtonWidth: parent.width < 480 ? 64 : 96
textSize: parent.width < 480 ? Theme.fontSizeSmall : Theme.fontSizeMedium
model: ["Native", "Qt", "Curve"]
selectionMode: "single"
currentIndex: {
switch (SettingsData.textRenderType) {
case SettingsData.TextRenderType.Qt:
return 1;
case SettingsData.TextRenderType.Curve:
return 2;
default:
return 0;
}
}
onSelectionChanged: (index, selected) => {
if (!selected)
return;
switch (index) {
case 1:
SettingsData.set("textRenderType", SettingsData.TextRenderType.Qt);
break;
case 2:
SettingsData.set("textRenderType", SettingsData.TextRenderType.Curve);
break;
default:
SettingsData.set("textRenderType", SettingsData.TextRenderType.Native);
break;
}
}
Connections {
target: SettingsData
function onTextRenderTypeChanged() {
switch (SettingsData.textRenderType) {
case SettingsData.TextRenderType.Qt:
renderTypeGroup.currentIndex = 1;
break;
case SettingsData.TextRenderType.Curve:
renderTypeGroup.currentIndex = 2;
break;
default:
renderTypeGroup.currentIndex = 0;
break;
}
}
}
}
}
Rectangle {
width: parent.width
height: 1
color: Theme.outline
opacity: 0.15
}
Item {
width: parent.width
height: renderTypeDescription.implicitHeight + Theme.spacingS * 2
StyledText {
id: renderTypeDescription
x: Theme.spacingM
y: Theme.spacingS
width: parent.width - Theme.spacingM * 2
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceVariantText
wrapMode: Text.WordWrap
text: {
switch (SettingsData.textRenderType) {
case SettingsData.TextRenderType.Qt:
return I18n.tr("Qt: distance-field renderer.");
case SettingsData.TextRenderType.Curve:
return I18n.tr("Curve: curve rasterizer.");
default:
return I18n.tr("Native: platform renderer (FreeType).");
}
}
}
}
Rectangle {
width: parent.width
height: 1
color: Theme.outline
opacity: 0.15
visible: SettingsData.textRenderType === SettingsData.TextRenderType.Qt
}
Item {
width: parent.width
height: visible ? qualityGroup.implicitHeight + qualityLabel.implicitHeight + Theme.spacingS : 0
visible: SettingsData.textRenderType === SettingsData.TextRenderType.Qt
clip: true
StyledText {
id: qualityLabel
x: Theme.spacingM
text: I18n.tr("Quality")
font.pixelSize: Theme.fontSizeSmall
font.weight: Font.Medium
color: Theme.surfaceText
}
DankButtonGroup {
id: qualityGroup
anchors.top: qualityLabel.bottom
anchors.topMargin: Theme.spacingS
anchors.horizontalCenter: parent.horizontalCenter
buttonPadding: parent.width < 480 ? Theme.spacingXS : Theme.spacingS
minButtonWidth: parent.width < 480 ? 40 : 56
textSize: parent.width < 480 ? Theme.fontSizeSmall : Theme.fontSizeMedium
model: ["Default", "Low", "Normal", "High", "Very High"]
selectionMode: "single"
currentIndex: SettingsData.textRenderQuality
onSelectionChanged: (index, selected) => {
if (!selected)
return;
SettingsData.set("textRenderQuality", index);
}
Connections {
target: SettingsData
function onTextRenderQualityChanged() {
qualityGroup.currentIndex = SettingsData.textRenderQuality;
}
}
}
}
}
SettingsCard {
tab: "typography"
tags: ["animation", "speed", "motion", "duration"]

View File

@@ -11,6 +11,7 @@ Item {
property real fill: filled ? 1.0 : 0.0
property int grade: Theme.isLightMode ? 0 : -25
property int weight: filled ? 500 : 400
property bool smoothTransform: false
implicitWidth: Math.round(size)
implicitHeight: Math.round(size)
@@ -28,12 +29,13 @@ Item {
anchors.fill: parent
font.family: materialSymbolsFont.name
font.pixelSize: Theme.fontSizeMedium
font.pixelSize: Math.round(Theme.fontSizeMedium)
font.weight: root.weight
font.hintingPreference: Font.PreferNoHinting
color: Theme.surfaceText
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
antialiasing: true
renderType: root.smoothTransform ? Text.QtRendering : Text.NativeRendering
Behavior on color {
enabled: Theme.currentAnimationSpeed !== SettingsData.AnimationSpeed.None

View File

@@ -3,7 +3,6 @@ import qs.Common
Text {
property bool isMonospace: false
FontLoader {
id: interFont
source: Qt.resolvedUrl("../assets/fonts/inter/InterVariable.ttf")
@@ -24,6 +23,32 @@ Text {
return requestedFont;
}
readonly property int resolvedRenderType: {
switch (SettingsData.textRenderType) {
case SettingsData.TextRenderType.Qt:
return Text.QtRendering;
case SettingsData.TextRenderType.Curve:
return Text.CurveRendering;
default:
return Text.NativeRendering;
}
}
readonly property int resolvedRenderQuality: {
switch (SettingsData.textRenderQuality) {
case SettingsData.TextRenderQuality.Low:
return Text.LowRenderTypeQuality;
case SettingsData.TextRenderQuality.Normal:
return Text.NormalRenderTypeQuality;
case SettingsData.TextRenderQuality.High:
return Text.HighRenderTypeQuality;
case SettingsData.TextRenderQuality.VeryHigh:
return Text.VeryHighRenderTypeQuality;
default:
return Text.DefaultRenderTypeQuality;
}
}
readonly property var standardAnimation: {
"duration": Appearance.anim.durations.normal,
"easing.type": Easing.BezierSpline,
@@ -37,7 +62,8 @@ Text {
wrapMode: Text.WordWrap
elide: Text.ElideRight
verticalAlignment: Text.AlignVCenter
//renderType: Text.NativeRendering
renderType: resolvedRenderType
renderTypeQuality: resolvedRenderQuality
Behavior on opacity {
NumberAnimation {