From e2082f79a055f791f57958ba5d3cba6a99bf02ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hans=20Sch=C3=BClein?= Date: Mon, 14 Feb 2022 16:06:38 +0100 Subject: [PATCH] Dynamically load font weights --- .../project.pbxproj | 4 +- .../UserInterfaceState.xcuserstate | Bin 49804 -> 47127 bytes Padbury Clock Revived/ClockView.swift | 2 +- Padbury Clock Revived/ConfigureSheet.xib | 31 ++-- .../ConfigureSheetController.swift | 25 ++- Padbury Clock Revived/Preferences.swift | 151 ++++++------------ 6 files changed, 89 insertions(+), 124 deletions(-) diff --git a/Padbury Clock Revived.xcodeproj/project.pbxproj b/Padbury Clock Revived.xcodeproj/project.pbxproj index df01648..c0efe9b 100644 --- a/Padbury Clock Revived.xcodeproj/project.pbxproj +++ b/Padbury Clock Revived.xcodeproj/project.pbxproj @@ -286,7 +286,7 @@ "@loader_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.1.1; + MARKETING_VERSION = 1.1.2; PRODUCT_BUNDLE_IDENTIFIER = "com.hans.Padbury-Clock-Revived"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -312,7 +312,7 @@ "@loader_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.1.1; + MARKETING_VERSION = 1.1.2; PRODUCT_BUNDLE_IDENTIFIER = "com.hans.Padbury-Clock-Revived"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/Padbury Clock Revived.xcodeproj/project.xcworkspace/xcuserdata/hans.xcuserdatad/UserInterfaceState.xcuserstate b/Padbury Clock Revived.xcodeproj/project.xcworkspace/xcuserdata/hans.xcuserdatad/UserInterfaceState.xcuserstate index 5f2eaf4e3ae0a5c1074c3e1bb5b82be31b1c94a0..e130e9dee090d1648477cccc5bd4707505fc4523 100644 GIT binary patch literal 47127 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 literal 49804 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 C*SQq{ diff --git a/Padbury Clock Revived/ClockView.swift b/Padbury Clock Revived/ClockView.swift index 9cdce82..9c994c9 100644 --- a/Padbury Clock Revived/ClockView.swift +++ b/Padbury Clock Revived/ClockView.swift @@ -83,7 +83,7 @@ final class ClockView: ScreenSaverView { // of a better system please make a pull request or write me an email! // >>> contact.kamik423@gmail.com <<< let fontSizeScaleFactor : CGFloat - switch preferences.font { + switch preferences.fontFamily { case .sanFrancisco, .neueHelvetica: fontSizeScaleFactor = 0.20 case .sanFranciscoMono: diff --git a/Padbury Clock Revived/ConfigureSheet.xib b/Padbury Clock Revived/ConfigureSheet.xib index 9fdfeda..7c7be67 100644 --- a/Padbury Clock Revived/ConfigureSheet.xib +++ b/Padbury Clock Revived/ConfigureSheet.xib @@ -13,6 +13,7 @@ + @@ -33,7 +34,7 @@ - + @@ -48,7 +49,7 @@ - + @@ -58,7 +59,7 @@ - + @@ -204,10 +215,12 @@ + + diff --git a/Padbury Clock Revived/ConfigureSheetController.swift b/Padbury Clock Revived/ConfigureSheetController.swift index 5e615bf..be9ec63 100644 --- a/Padbury Clock Revived/ConfigureSheetController.swift +++ b/Padbury Clock Revived/ConfigureSheetController.swift @@ -22,6 +22,7 @@ class ConfigureSheetController: NSObject { @IBOutlet var showTimeSeparatorsCheckbox: NSButton! @IBOutlet var fontSelector: NSPopUpButton! @IBOutlet var fontWeightSelector: NSPopUpButton! + @IBOutlet var plainFontsOnlyCheckbox: NSButton! @IBOutlet var mainScreenCheckbox: NSButton! override init() { @@ -51,23 +52,32 @@ class ConfigureSheetController: NSObject { twentyfourHoursCheckbox.state = preferences.useAmPm ? .off : .on showSecondsCheckbox.state = preferences.showSeconds ? .on : .off showTimeSeparatorsCheckbox.state = preferences.showTimeSeparators ? .on : .off - fontSelector.selectItem(withTitle: preferences.font.name) + fontSelector.selectItem(withTitle: preferences.fontFamily.name) mainScreenCheckbox.state = preferences.mainScreenOnly ? .on : .off + plainFontsOnlyCheckbox.state = preferences.plainFontsOnly ? .on : .off // Remove all options from the font selector and add the ones corresponding to the fonts fontSelector.removeAllItems() fontSelector.addItems(withTitles: SupportedFont.allCases.map { $0.name }) - fontSelector.selectItem(withTitle: preferences.font.name) + fontSelector.selectItem(withTitle: preferences.fontFamily.name) + // Apply font style + for (index, font) in SupportedFont.allCases.enumerated() { + fontSelector.item(at: index)?.attributedTitle = NSAttributedString(string: font.name, attributes: [.font: NSFont(name: font.fontFamilyName, size: NSFont.systemFontSize) ?? NSFont.menuFont(ofSize: NSFont.systemFontSize)]) + } // Remove all the options from the font weight selector // and add the ones corresponding to the current font fontWeightSelector.removeAllItems() - fontWeightSelector.addItems(withTitles: preferences.font.availableWeights.map({ $0.name })) + fontWeightSelector.addItems(withTitles: preferences.fontFamily.availableWeights) // Select the correct item // If the weight is not available for this font select the first option - fontWeightSelector.selectItem(at: preferences.font.availableWeights.firstIndex(where: { $0.name == preferences.fontWeight.name }) ?? 0 ) + fontWeightSelector.selectItem(at: preferences.fontFamily.availableWeights.firstIndex(of: preferences.styleName) ?? 0) + // Preview font + for (index, typeName) in preferences.fontFamily.availableWeights.enumerated() { + fontWeightSelector.item(at: index)?.attributedTitle = NSAttributedString(string: typeName, attributes: [.font: NSFont(name: preferences.fontFamily.postscriptName(for: typeName) ?? "", size: NSFont.systemFontSize) ?? NSFont.menuFont(ofSize: NSFont.systemFontSize)]) + } // Store said option back to the settings in case it changed - preferences.fontWeight = NSFont.Weight.from(name: fontWeightSelector.selectedItem?.title ?? "") + preferences.styleName = fontWeightSelector.selectedItem?.title ?? "" // Trigger update of the preview window ClockView.shared?.setup(force: true) @@ -84,9 +94,10 @@ class ConfigureSheetController: NSObject { preferences.useAmPm = twentyfourHoursCheckbox.state == .off preferences.showSeconds = showSecondsCheckbox.state == .on preferences.showTimeSeparators = showTimeSeparatorsCheckbox.state == .on - preferences.font = SupportedFont.named(fontSelector.selectedItem?.title ?? "") - preferences.fontWeight = NSFont.Weight.from(name: fontWeightSelector.selectedItem?.title ?? "") + preferences.fontFamily = SupportedFont.named(fontSelector.selectedItem?.title ?? "") + preferences.styleName = fontWeightSelector.selectedItem?.title ?? "" preferences.mainScreenOnly = mainScreenCheckbox.state == .on + preferences.plainFontsOnly = plainFontsOnlyCheckbox.state == .on // Update the options. Font weight might have changed. self.setup() diff --git a/Padbury Clock Revived/Preferences.swift b/Padbury Clock Revived/Preferences.swift index 236aea9..3519ebb 100644 --- a/Padbury Clock Revived/Preferences.swift +++ b/Padbury Clock Revived/Preferences.swift @@ -21,69 +21,38 @@ class Preferences: NSObject { Preferences.shared = self } - var font: SupportedFont { + var fontFamily: SupportedFont { // Which font should be used - get { return SupportedFont.named(defaults.value(forKey: "Font") as? String ?? "") } + get { return SupportedFont.named(defaults.value(forKey: "FontFamily") as? String ?? "") } set { - defaults.setValue(newValue.name, forKey: "Font") + defaults.setValue(newValue.name, forKey: "FontFamily") defaults.synchronize() } } func nsFont(ofSize fontSize: CGFloat) -> NSFont { // The NSFont to use with correct weight and size set - let fallback = NSFont.monospacedDigitSystemFont(ofSize: fontSize, weight: fontWeight) - switch font { - case .sanFrancisco: - // Default system font - return .monospacedDigitSystemFont(ofSize: fontSize, weight: fontWeight) - case .sanFranciscoMono: - // Monospace default system font - return .monospacedSystemFont(ofSize: fontSize, weight: fontWeight) - case .newYork: - // Serif default system font - let descriptor = NSFont.monospacedDigitSystemFont(ofSize: fontSize, weight: fontWeight).fontDescriptor - return NSFont(descriptor: descriptor.withDesign(.serif) ?? descriptor, size: 0.0) ?? fallback - case .neueHelvetica: - // Neue Helvetica - // Get the name of the font file to load - let fontName: String - switch fontWeight { - case .ultraLight: - fontName = "Helvetica Neue UltraLight" - case .thin: - fontName = "Helvetica Neue Thin" - case .light: - fontName = "Helvetica Neue Light" - case .regular: - fontName = "Helvetica Neue" - case .medium: - fontName = "Helvetica Neue Medium" - case .bold: - fontName = "Helvetica Neue Bold" - default: - fontName = "Helvetica Neue" - } - // Load the font - guard var font = NSFont(name: fontName, size: fontSize) else { return fallback } - // Apply TrueType stylistic sets to get proportional numbers and the raised colon. - let fontAttributes: [NSFontDescriptor.AttributeName: Any] = [ - .featureSettings: [ - [ - // Proportional Numbers - NSFontDescriptor.FeatureKey.typeIdentifier: 6, - NSFontDescriptor.FeatureKey.selectorIdentifier: 1 - ], - [ - // Alternate Punctuation (rounded, raised colon) - NSFontDescriptor.FeatureKey.typeIdentifier: 17, - NSFontDescriptor.FeatureKey.selectorIdentifier: 1 - ] - ] - ] - // Apply the attributes - font = NSFont(descriptor: font.fontDescriptor.addingAttributes(fontAttributes), size: 0.0) ?? font - return font + let fallback = NSFont.monospacedDigitSystemFont(ofSize: fontSize, weight: .regular) + + // Load the font + guard var font = NSFont(name: fontFamily.postscriptName(for: styleName) ?? "", size: fontSize) else { return fallback } + // Apply TrueType stylistic sets to get proportional numbers. + var featureSettings: [[NSFontDescriptor.FeatureKey: Int]] = [[.typeIdentifier: kNumberSpacingType, .selectorIdentifier: kMonospacedNumbersSelector]] + if fontFamily == .neueHelvetica { + // Alternate Punctuation (rounded, raised colon) + featureSettings.append([.typeIdentifier: kCharacterAlternativesType, .selectorIdentifier: 1]) + } + // Apply the attributes + font = NSFont(descriptor: font.fontDescriptor.addingAttributes([.featureSettings: featureSettings]), size: 0.0) ?? font + return font + } + + var plainFontsOnly: Bool { + // Only use Regular Width Roman Fonts + get { return (defaults.value(forKey: "PlainFontsOnly") as? Bool) ?? true } + set { + defaults.setValue(newValue, forKey: "PlainFontsOnly") + defaults.synchronize() } } @@ -123,11 +92,11 @@ class Preferences: NSObject { } } - var fontWeight: NSFont.Weight { + var styleName: String { // The font weight to be used - get { return NSFont.Weight.from(name: (defaults.value(forKey: "fontWeight") as? String) ?? "Ultra Light") } + get { return defaults.value(forKey: "styleName") as? String ?? "UltraLight" } set { - defaults.setValue(newValue.name, forKey: "fontWeight") + defaults.setValue(newValue, forKey: "styleName") defaults.synchronize() } } @@ -174,60 +143,32 @@ enum SupportedFont: String, CaseIterable { } } - static func named(_ name: String) -> SupportedFont { - // Get the font from the name - SupportedFont.allCases.first(where: { $0.name == name }) ?? .sanFrancisco - } - - var availableWeights: [NSFont.Weight] { - // List of available font weights for each font + var fontFamilyName: String { + // The name of the font family ".AppleSystemUIFontUltraLight" switch self { case .sanFrancisco: - return [.ultraLight, .thin, .light, .regular, .medium, .semibold, .bold, .heavy, .black] + return ".AppleSystemUIFont" case .sanFranciscoMono: - return [.light, .regular, .medium, .semibold, .bold, .heavy, .black] + return ".AppleSystemUIFontMonospaced" case .newYork: - return [.regular, .medium, .semibold, .bold, .heavy, .black] + return ".AppleSystemUIFontSerif" case .neueHelvetica: - return [.ultraLight, .thin, .light, .regular, .medium, .bold] + return "Helvetica Neue" } } -} - -// MARK: - NSFont.Weight Names - -extension NSFont.Weight { - var name: String { - // Names for font weights - get { - switch self { - case .ultraLight: return "Ultra Light" - case .thin: return "Thin" - case .light: return "Light" - case .regular: return "Regular" - case .medium: return "Medium" - case .semibold: return "Semibold" - case .bold: return "Bold" - case .heavy: return "Heavy" - case .black: return "Black" - default: return "Regular" - } - } + + static func named(_ name: String) -> SupportedFont { + // Get the font from the name + SupportedFont.allCases.first(where: { $0.name == name }) ?? .sanFrancisco } - - static func from(name: String) -> NSFont.Weight { - // Font weight from name - switch name { - case "Ultra Light": return .ultraLight - case "Thin": return .thin - case "Light": return .light - case "Regular": return .regular - case "Medium": return .medium - case "Semibold": return .semibold - case "Bold": return .bold - case "Heavy": return .heavy - case "Black": return .black - default: return .regular - } + + var availableWeights: [String] { + // List of available font weights for each font + return (NSFontManager.shared.availableMembers(ofFontFamily: self.fontFamilyName)?.filter({ !(Preferences.shared?.plainFontsOnly ?? true) || Int(truncating: $0[3] as? NSNumber ?? 0)&0b1000001 == 0 }).map({ $0[1] as? String ?? "Error" })) ?? [] + } + + func postscriptName(for styleName: String) -> String? { + // Get + return NSFontManager.shared.availableMembers(ofFontFamily: self.fontFamilyName)?.first(where: { $0[1] as? String == styleName })?[0] as? String } }