macos/writeas/ViewController.swift
Matt Baer cda7517224 Add fonts
- Supports choosing from serif, sans, or mono
- Remembers preference
- Submits the type with the post
2017-07-31 19:05:54 -04:00

158 lines
4.9 KiB
Swift

//
// ViewController.swift
// writeas
//
// Created by Matt Baer on 12/29/15.
// Copyright © 2015 A Bunch Tell. All rights reserved.
//
import Cocoa
class ViewController: NSViewController, NSTextViewDelegate, NSUserNotificationCenterDelegate {
@IBOutlet var writerText: NSTextView!
let draftFile = "Write.as/draft.txt"
override func viewDidLoad() {
super.viewDidLoad()
loadDocument()
writerText.font = NSFont(name: "Lora", size: Preferences.getFontSize())
writerText.isHorizontallyResizable = false
writerText.textContainerInset = NSSize(width: 16, height: 16)
writerText.isAutomaticQuoteSubstitutionEnabled = false
writerText.isAutomaticDashSubstitutionEnabled = false
NSUserNotificationCenter.default.delegate = self
// Do any additional setup after loading the view.
writerText.delegate = self
}
override func viewDidAppear() {
super.viewDidAppear()
configureWindow()
// Style the window
self.view.window!.title = "Write.as"
self.view.window!.titlebarAppearsTransparent = true
self.view.window!.isMovableByWindowBackground = true
self.view.window!.titleVisibility = .hidden
self.view.window!.backgroundColor = NSColor.white
}
func configureWindow() {
// Fit textview to window size
writerText.setFrameSize(NSSize(width: self.view.window!.frame.width, height: self.view.window!.frame.height))
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
fileprivate func getDraftPath() -> URL? {
do {
let baseDir = try FileManager.default.url(for: .documentDirectory, in: .allDomainsMask, appropriateFor: nil, create: true)
return baseDir.appendingPathComponent(draftFile)
} catch (let err) {
print("ERROR getting path: \(err)")
return nil
}
}
func saveDocument() {
// Save whatever's written
let path = getDraftPath()
if path == nil {
return
}
//writing
do {
try writerText.textStorage!.string.write(to: path!, atomically: false, encoding: .utf8)// .write(toFile: path.absoluteString, atomically: true, encoding: .utf8)
} catch (let err) {
print("ERROR writing: \(err)")
}
}
func loadDocument() {
let path = getDraftPath()
if path == nil {
return
}
do {
let draftText = try String(contentsOf: path!, encoding: .utf8)
writerText.string = draftText
} catch (let err) {
print("ERROR loading: \(err)")
}
}
func publish() {
saveDocument()
DispatchQueue.global(qos: .background).async {
let task = Process()
task.launchPath = Bundle.main.executablePath! + "/../../Resources/writeas"
task.arguments = ["--font", Preferences.getFont().rawValue]
let pipe = Pipe()
task.standardInput = pipe
task.launch()
let fh: FileHandle = pipe.fileHandleForWriting
fh.write(self.writerText.textStorage!.string.data(using: .utf8)!)
fh.closeFile()
task.waitUntilExit()
DispatchQueue.main.async {
var notification = NSUserNotification()
// All these values are optional
notification.title = "Published!"
notification.informativeText = "The link is copied — press ⌘+V to share it."
notification.soundName = NSUserNotificationDefaultSoundName
NSUserNotificationCenter.default.deliver(notification)
}
}
}
func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
return true
}
func toggle(isNight: Bool) {
let darkBG = NSColor(red:0.13, green:0.13, blue:0.13, alpha:1.0)
if isNight {
self.view.window!.backgroundColor = darkBG
self.writerText.backgroundColor = darkBG
self.writerText.textColor = NSColor.white
} else {
self.view.window!.backgroundColor = NSColor.white
self.writerText.backgroundColor = NSColor.white
self.writerText.textColor = NSColor.black
}
}
func adjustTextSize(increment: Bool) {
var size = Preferences.getFontSize()
if increment {
size += 2
} else {
size -= 1
}
self.writerText.font = NSFont(name: "Lora", size: size)
UserDefaults.standard.set(String(Int(size)), forKey: "editor_text_size")
configureWindow()
}
func setFont(_ font: Preferences.PostFont) {
self.writerText.font = NSFont(name: font.typeface, size: Preferences.getFontSize())
}
}