How to remove fonts from NSFontPanel in macOS

64 Views Asked by At

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.

0

There are 0 best solutions below