- Supports choosing from serif, sans, or mono - Remembers preference - Submits the type with the postmaster
@@ -14,12 +14,29 @@ class AppDelegate: NSObject, NSApplicationDelegate { | |||||
var vc: ViewController? | var vc: ViewController? | ||||
@IBOutlet weak var nightModeItem: NSMenuItem! | @IBOutlet weak var nightModeItem: NSMenuItem! | ||||
@IBOutlet weak var formatFontSerifItem: NSMenuItem! | |||||
@IBOutlet weak var formatFontSansItem: NSMenuItem! | |||||
@IBOutlet weak var formatFontMonoItem: NSMenuItem! | |||||
func applicationDidFinishLaunching(_ aNotification: Notification) { | func applicationDidFinishLaunching(_ aNotification: Notification) { | ||||
// Set night mode state | |||||
nightModeItem.state = Int(UserDefaults.standard.string(forKey: "night_mode_state") ?? String(NSOffState))! | nightModeItem.state = Int(UserDefaults.standard.string(forKey: "night_mode_state") ?? String(NSOffState))! | ||||
if nightModeItem.state == NSOnState { | if nightModeItem.state == NSOnState { | ||||
vc?.toggle(isNight: true) | vc?.toggle(isNight: true) | ||||
} | } | ||||
// Set font | |||||
let font = Preferences.getFont() | |||||
if font == Preferences.PostFont.serif { | |||||
formatFontSerifItem.state = NSOnState | |||||
vc?.setFont(.serif) | |||||
} else if font == Preferences.PostFont.sans { | |||||
formatFontSansItem.state = NSOnState | |||||
vc?.setFont(.sans) | |||||
} else if font == Preferences.PostFont.mono { | |||||
formatFontMonoItem.state = NSOnState | |||||
vc?.setFont(.mono) | |||||
} | |||||
} | } | ||||
func applicationWillTerminate(_ aNotification: Notification) { | func applicationWillTerminate(_ aNotification: Notification) { | ||||
@@ -39,6 +56,33 @@ class AppDelegate: NSObject, NSApplicationDelegate { | |||||
UserDefaults.standard.set(String(sender.state), forKey: "night_mode_state") | UserDefaults.standard.set(String(sender.state), forKey: "night_mode_state") | ||||
} | } | ||||
@IBAction func setFontSerif(_ sender: NSMenuItem) { | |||||
deselectAllFonts() | |||||
sender.state = NSOnState | |||||
vc?.setFont(.serif) | |||||
Preferences.setFont(.serif) | |||||
} | |||||
@IBAction func setFontSans(_ sender: NSMenuItem) { | |||||
deselectAllFonts() | |||||
sender.state = NSOnState | |||||
vc?.setFont(.sans) | |||||
Preferences.setFont(.sans) | |||||
} | |||||
@IBAction func setFontMono(_ sender: NSMenuItem) { | |||||
deselectAllFonts() | |||||
sender.state = NSOnState | |||||
vc?.setFont(.mono) | |||||
Preferences.setFont(.mono) | |||||
} | |||||
func deselectAllFonts() { | |||||
formatFontSerifItem.state = NSOffState | |||||
formatFontSansItem.state = NSOffState | |||||
formatFontMonoItem.state = NSOffState | |||||
} | |||||
@IBAction func saveDocument(_ sender: AnyObject) { | @IBAction func saveDocument(_ sender: AnyObject) { | ||||
vc?.saveDocument() | vc?.saveDocument() | ||||
} | } | ||||
@@ -235,6 +235,62 @@ DQ | |||||
</items> | </items> | ||||
</menu> | </menu> | ||||
</menuItem> | </menuItem> | ||||
<menuItem title="Format" id="jxT-CU-nIS"> | |||||
<modifierMask key="keyEquivalentModifierMask"/> | |||||
<menu key="submenu" title="Format" id="GEO-Iw-cKr"> | |||||
<items> | |||||
<menuItem title="Font" id="Gi5-1S-RQB"> | |||||
<modifierMask key="keyEquivalentModifierMask"/> | |||||
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq"> | |||||
<items> | |||||
<menuItem title="Serif" tag="2" id="GB9-OM-e27"> | |||||
<attributedString key="attributedTitle"> | |||||
<fragment content="Serif"> | |||||
<attributes> | |||||
<font key="NSFont" size="13" name="Lora-Regular"/> | |||||
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/> | |||||
</attributes> | |||||
</fragment> | |||||
</attributedString> | |||||
<modifierMask key="keyEquivalentModifierMask"/> | |||||
<connections> | |||||
<action selector="setFontSerif:" target="Voe-Tx-rLC" id="B5Z-AG-dYj"/> | |||||
</connections> | |||||
</menuItem> | |||||
<menuItem title="Sans-serif" tag="1" id="Vjx-xi-njq"> | |||||
<attributedString key="attributedTitle"> | |||||
<fragment content="Sans-serif"> | |||||
<attributes> | |||||
<font key="NSFont" size="13" name="OpenSans-Regular"/> | |||||
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/> | |||||
</attributes> | |||||
</fragment> | |||||
</attributedString> | |||||
<modifierMask key="keyEquivalentModifierMask"/> | |||||
<connections> | |||||
<action selector="setFontSans:" target="Voe-Tx-rLC" id="BCb-aN-CNi"/> | |||||
</connections> | |||||
</menuItem> | |||||
<menuItem title="Monospace" id="WRG-CD-K1S"> | |||||
<attributedString key="attributedTitle"> | |||||
<fragment content="Monospace"> | |||||
<attributes> | |||||
<font key="NSFont" size="13" name="Hack-Regular"/> | |||||
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/> | |||||
</attributes> | |||||
</fragment> | |||||
</attributedString> | |||||
<modifierMask key="keyEquivalentModifierMask"/> | |||||
<connections> | |||||
<action selector="setFontMono:" target="Voe-Tx-rLC" id="bck-1A-bhC"/> | |||||
</connections> | |||||
</menuItem> | |||||
</items> | |||||
</menu> | |||||
</menuItem> | |||||
</items> | |||||
</menu> | |||||
</menuItem> | |||||
<menuItem title="View" id="H8h-7b-M4v"> | <menuItem title="View" id="H8h-7b-M4v"> | ||||
<modifierMask key="keyEquivalentModifierMask"/> | <modifierMask key="keyEquivalentModifierMask"/> | ||||
<menu key="submenu" title="View" id="HyV-fh-RgO"> | <menu key="submenu" title="View" id="HyV-fh-RgO"> | ||||
@@ -304,6 +360,9 @@ DQ | |||||
</application> | </application> | ||||
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Write_as" customModuleProvider="target"> | <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Write_as" customModuleProvider="target"> | ||||
<connections> | <connections> | ||||
<outlet property="formatFontMonoItem" destination="WRG-CD-K1S" id="919-ab-Ig1"/> | |||||
<outlet property="formatFontSansItem" destination="Vjx-xi-njq" id="LIr-Ct-Ied"/> | |||||
<outlet property="formatFontSerifItem" destination="GB9-OM-e27" id="rVW-JC-eyr"/> | |||||
<outlet property="nightModeItem" destination="jYO-0u-qN9" id="8xF-SV-B70"/> | <outlet property="nightModeItem" destination="jYO-0u-qN9" id="8xF-SV-B70"/> | ||||
</connections> | </connections> | ||||
</customObject> | </customObject> | ||||
@@ -6,10 +6,34 @@ | |||||
import Foundation | import Foundation | ||||
class Preferences { | class Preferences { | ||||
enum PostFont: String { | |||||
case serif = "norm" | |||||
case sans = "sans" | |||||
case mono = "wrap" | |||||
var typeface: String { | |||||
switch self { | |||||
case .serif: | |||||
return "Lora" | |||||
case .sans: | |||||
return "Open Sans" | |||||
case .mono: | |||||
return "Hack" | |||||
} | |||||
} | |||||
} | |||||
class func getFontSize() -> CGFloat { | class func getFontSize() -> CGFloat { | ||||
let size = Int(UserDefaults.standard.string(forKey: "editor_text_size") ?? "16") ?? 16 | let size = Int(UserDefaults.standard.string(forKey: "editor_text_size") ?? "16") ?? 16 | ||||
return CGFloat(size) | return CGFloat(size) | ||||
} | } | ||||
class func getFont() -> PostFont { | |||||
return PostFont(rawValue: UserDefaults.standard.string(forKey: "editor_font") ?? PostFont.serif.rawValue) ?? PostFont.serif | |||||
} | |||||
class func setFont(_ font: PostFont) { | |||||
UserDefaults.standard.set(font.rawValue, forKey: "editor_font") | |||||
} | |||||
} | } |
@@ -99,6 +99,7 @@ class ViewController: NSViewController, NSTextViewDelegate, NSUserNotificationCe | |||||
DispatchQueue.global(qos: .background).async { | DispatchQueue.global(qos: .background).async { | ||||
let task = Process() | let task = Process() | ||||
task.launchPath = Bundle.main.executablePath! + "/../../Resources/writeas" | task.launchPath = Bundle.main.executablePath! + "/../../Resources/writeas" | ||||
task.arguments = ["--font", Preferences.getFont().rawValue] | |||||
let pipe = Pipe() | let pipe = Pipe() | ||||
task.standardInput = pipe | task.standardInput = pipe | ||||
task.launch() | task.launch() | ||||
@@ -148,5 +149,9 @@ class ViewController: NSViewController, NSTextViewDelegate, NSUserNotificationCe | |||||
UserDefaults.standard.set(String(Int(size)), forKey: "editor_text_size") | UserDefaults.standard.set(String(Int(size)), forKey: "editor_text_size") | ||||
configureWindow() | configureWindow() | ||||
} | } | ||||
func setFont(_ font: Preferences.PostFont) { | |||||
self.writerText.font = NSFont(name: font.typeface, size: Preferences.getFontSize()) | |||||
} | |||||
} | } | ||||