diff --git a/BrewBar/LogWindowController.swift b/BrewBar/LogWindowController.swift index 062cd35..f46d166 100644 --- a/BrewBar/LogWindowController.swift +++ b/BrewBar/LogWindowController.swift @@ -14,22 +14,41 @@ class LogWindowController: NSWindowController { self.init(window: window) - window.title = "Logs" + window.title = "BrewBar Logs" + // the controller keeps the window alive; without this, closing the + // window would deallocate it and reopening would crash + window.isReleasedWhenClosed = false + window.center() let scrollView = NSScrollView(frame: window.contentView!.bounds) scrollView.autoresizingMask = [.width, .height] + scrollView.hasVerticalScroller = true textView = NSTextView(frame: scrollView.bounds) textView.isEditable = false textView.autoresizingMask = [.width, .height] + textView.font = .monospacedSystemFont(ofSize: 12, weight: .regular) + textView.textColor = .textColor // adapts to light/dark mode + textView.backgroundColor = .textBackgroundColor + textView.textContainerInset = NSSize(width: 8, height: 8) scrollView.documentView = textView window.contentView?.addSubview(scrollView) } func update(text: String) { + // only follow the tail if the user is already at the bottom — don't + // yank the scroll position away while they are reading older output + let wasAtBottom: Bool = if let scrollView = textView.enclosingScrollView { + scrollView.contentView.bounds.maxY >= textView.frame.height - 30 + } else { + true + } + textView.string = text - textView.scrollToEndOfDocument(nil) + if wasAtBottom { + textView.scrollToEndOfDocument(nil) + } } }