I am wondering how I can limit the available fonts in NSFontPanel as the app is written for different operating systems, and I want a consistent user fonts across them. I have been struggling with how to do this in macOS. As you can see I have tried to
in @main/AppDelegate init I call
NSFontManager.setFontManagerFactory(FontManager.self)
NSFontPanel.shared.reloadDefaultFontFamilies()
FontManager looks like follows, but NSFontPanel is still showing all fonts on the system.
class FontManager: NSFontManager {
static let fontList: [String] = ["Anton-Regular","EBGaramond-Bold","EBGaramond-BoldItalic","EBGaramond-Italic","EBGaramond-Regular","Jost-Bold","Jost-BoldItalic","Jost-Italic","Jost-Regular","Kameron-Bold", "Kameron-Regular","Licorice-Regular","OpenSans-Bold","OpenSans-BoldItalic","OpenSans-Italic","OpenSans-Regular","Roboto-Regular","Tinos-Bold","Tinos-Bolditalic","Tinos-Italic","Tinos-Regular","WaitingfortheSunrise-Regular"]
static let familyList: [String] = ["Anton","EB Garamond","Jost","Kameron","Licorice","Open Sans","Roboto","Tinos","Waiting for the Sunrise"]
static let bold:[String] = ["EBGaramond-Bold","Jost-Bold","Kameron-Bold","OpenSans-Bold","Tinos-Bold"]
static let boldItalic: [String] = ["EBGaramond-BoldItalic","Jost-BoldItalic","OpenSans-Bolditalic","Tinos-Bolditalic"]
static let italic: [String] = ["EBGaramond-Italic","Jost-Italic","OpenSans-Italic","Tinos-Italic"]
static let regular: [String] = ["Anton-Regular","EBGaramond-Regular","Jost-Bold","Jost-Regular", "Kameron-Regular","Licorice-Regular","OpenSans-Bold","OpenSans-Regular","Roboto-Regular","Tinos-Regular","WaitingfortheSunrise-Regular"]
override required init() {
super.init()
}
static let menu:NSMenu = createFontMenu()
static func createFontMenu()->NSMenu {
let menu = NSMenu()
var anton = NSMenuItem(title: "Anton", action: nil, keyEquivalent: "")
menu.addItem(anton)
return menu
}
override func fontMenu(_ create: Bool) -> NSMenu? {
return FontManager.menu
}
override var availableFonts: [String] {
get {
return FontManager.fontList
}
}
override var availableFontFamilies: [String] {
get {
return FontManager.familyList
}
}
public override func fontManager(_ sender: Any, willIncludeFont fontName: String) -> Bool {
return FontManager.fontList.contains(fontName)
}
override func availableMembers(ofFontFamily fam: String) -> [[Any]]? {
var members: [[Any]]? = []
if FontManager.familyList.contains(fam) {
members = super.availableMembers(ofFontFamily: fam)
}
return members
}
override func availableFontNames(with someTraits: NSFontTraitMask) -> [String]? {
if someTraits == NSFontTraitMask.boldFontMask {
return FontManager.bold
}
else if someTraits == [NSFontTraitMask.boldFontMask, NSFontTraitMask.italicFontMask] {
return FontManager.boldItalic
}
else if someTraits == NSFontTraitMask.italicFontMask {
return FontManager.italic
} else if someTraits == [NSFontTraitMask.unboldFontMask, NSFontTraitMask.italicFontMask] {
return FontManager.regular
}
else {
return []
}
}
}
As you can see I have tried to override fontMenu, but that seems to do nothing. Perhaps NSFontCollection is the answer, but I can't figure out how to use that to inform NSFontPanel that it is the only collection, and even how to specify the desired fonts in that collection.