Skip to content

Commit 4346417

Browse files
committed
[Fix] Improve font fallback
fix #917, #915
1 parent 6f1a6b4 commit 4346417

File tree

1 file changed

+55
-27
lines changed

1 file changed

+55
-27
lines changed

sources/SquirrelTheme.swift

+55-27
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,41 @@ final class SquirrelTheme {
6868
private var fonts = [NSFont]()
6969
private var labelFonts = [NSFont]()
7070
private var commentFonts = [NSFont]()
71+
private var fontSize: CGFloat?
72+
private var labelFontSize: CGFloat?
73+
private var commentFontSize: CGFloat?
7174

7275
private var candidateTemplate = "[label]. [candidate] [comment]"
7376
var statusMessageType: StatusMessageType = .mix
77+
78+
private var defaultFont: NSFont {
79+
if let size = fontSize {
80+
Self.defaultFont.withSize(size)
81+
} else {
82+
Self.defaultFont
83+
}
84+
}
7485

7586
var font: NSFont {
76-
return combineFonts(fonts) ?? Self.defaultFont
87+
return combineFonts(fonts, size: fontSize) ?? defaultFont
7788
}
78-
var labelFont: NSFont? {
79-
return combineFonts(labelFonts)
89+
var labelFont: NSFont {
90+
if let font = combineFonts(labelFonts, size: labelFontSize ?? fontSize) {
91+
return font
92+
} else if let size = labelFontSize {
93+
return self.font.withSize(size)
94+
} else {
95+
return self.font
96+
}
8097
}
81-
var commentFont: NSFont? {
82-
return combineFonts(commentFonts)
98+
var commentFont: NSFont {
99+
if let font = combineFonts(commentFonts, size: commentFontSize ?? fontSize) {
100+
return font
101+
} else if let size = commentFontSize {
102+
return self.font.withSize(size)
103+
} else {
104+
return self.font
105+
}
83106
}
84107
var attrs: [NSAttributedString.Key: Any] {
85108
[.foregroundColor: candidateTextColor,
@@ -93,23 +116,23 @@ final class SquirrelTheme {
93116
}
94117
var labelAttrs: [NSAttributedString.Key: Any] {
95118
return [.foregroundColor: candidateLabelColor ?? blendColor(foregroundColor: self.candidateTextColor, backgroundColor: self.backgroundColor),
96-
.font: labelFont ?? font,
97-
.baselineOffset: baseOffset + (labelFont != nil && !vertical ? (font.pointSize - labelFont!.pointSize) / 2 : 0)]
119+
.font: labelFont,
120+
.baselineOffset: baseOffset + (!vertical ? (font.pointSize - labelFont.pointSize) / 2 : 0)]
98121
}
99122
var labelHighlightedAttrs: [NSAttributedString.Key: Any] {
100123
return [.foregroundColor: highlightedCandidateLabelColor ?? blendColor(foregroundColor: highlightedCandidateTextColor, backgroundColor: highlightedBackColor),
101-
.font: labelFont ?? font,
102-
.baselineOffset: baseOffset + (labelFont != nil && !vertical ? (font.pointSize - labelFont!.pointSize) / 2 : 0)]
124+
.font: labelFont,
125+
.baselineOffset: baseOffset + (!vertical ? (font.pointSize - labelFont.pointSize) / 2 : 0)]
103126
}
104127
var commentAttrs: [NSAttributedString.Key: Any] {
105128
return [.foregroundColor: commentTextColor ?? candidateTextColor,
106-
.font: commentFont ?? font,
107-
.baselineOffset: baseOffset + (commentFont != nil && !vertical ? (font.pointSize - commentFont!.pointSize) / 2 : 0)]
129+
.font: commentFont,
130+
.baselineOffset: baseOffset + (!vertical ? (font.pointSize - commentFont.pointSize) / 2 : 0)]
108131
}
109132
var commentHighlightedAttrs: [NSAttributedString.Key: Any] {
110133
return [.foregroundColor: highlightedCommentTextColor ?? highlightedCandidateTextColor,
111-
.font: commentFont ?? font,
112-
.baselineOffset: baseOffset + (commentFont != nil && !vertical ? (font.pointSize - commentFont!.pointSize) / 2 : 0)]
134+
.font: commentFont,
135+
.baselineOffset: baseOffset + (!vertical ? (font.pointSize - commentFont.pointSize) / 2 : 0)]
113136
}
114137
var preeditAttrs: [NSAttributedString.Key: Any] {
115138
[.foregroundColor: textColor,
@@ -246,28 +269,33 @@ final class SquirrelTheme {
246269
} else {
247270
native = true
248271
}
249-
if let name = fontName {
250-
fonts = decodeFonts(from: name, size: fontSize)
251-
}
252-
if let name = labelFontName ?? fontName {
253-
labelFonts = decodeFonts(from: name, size: labelFontSize ?? fontSize)
254-
}
255-
if let name = commentFontName ?? fontName {
256-
commentFonts = decodeFonts(from: name, size: commentFontSize ?? fontSize)
257-
}
272+
273+
fonts = decodeFonts(from: fontName)
274+
self.fontSize = fontSize
275+
labelFonts = decodeFonts(from: labelFontName ?? fontName)
276+
self.labelFontSize = labelFontSize
277+
commentFonts = decodeFonts(from: commentFontName ?? fontName)
278+
self.commentFontSize = commentFontSize
258279
}
259280
}
260281

261282
private extension SquirrelTheme {
262-
func combineFonts(_ fonts: [NSFont]) -> NSFont? {
283+
func combineFonts(_ fonts: [NSFont], size: CGFloat?) -> NSFont? {
263284
if fonts.count == 0 { return nil }
264-
if fonts.count == 1 { return fonts[0] }
285+
if fonts.count == 1 {
286+
if let size = size {
287+
return fonts[0].withSize(size)
288+
} else {
289+
return fonts[0]
290+
}
291+
}
265292
let attribute = [NSFontDescriptor.AttributeName.cascadeList: fonts[1...].map { $0.fontDescriptor } ]
266293
let fontDescriptor = fonts[0].fontDescriptor.addingAttributes(attribute)
267-
return NSFont.init(descriptor: fontDescriptor, size: fonts[0].pointSize)
294+
return NSFont.init(descriptor: fontDescriptor, size: size ?? fonts[0].pointSize)
268295
}
269296

270-
func decodeFonts(from fontString: String, size: CGFloat?) -> [NSFont] {
297+
func decodeFonts(from fontString: String?) -> [NSFont] {
298+
guard let fontString = fontString else { return [] }
271299
var seenFontFamilies = Set<String>()
272300
let fontStrings = fontString.split(separator: ",")
273301
var fonts = [NSFont]()
@@ -280,7 +308,7 @@ private extension SquirrelTheme {
280308
}
281309
if !seenFontFamilies.contains(familyName) {
282310
seenFontFamilies.insert(familyName)
283-
if let validFont = NSFont(name: trimedString, size: size ?? Self.defaultFontSize) {
311+
if let validFont = NSFont(name: trimedString, size: Self.defaultFontSize) {
284312
fonts.append(validFont)
285313
}
286314
}

0 commit comments

Comments
 (0)