From 108484481acd9aa694437a8d72244af3e2f7ac4f Mon Sep 17 00:00:00 2001 From: jess Date: Mon, 6 Apr 2026 02:20:32 -0700 Subject: [PATCH] add Cmd+=/Cmd+- zoom with persistent zoom level in config --- src/AppDelegate.swift | 33 +++++++++++++++++++++++++++++++++ src/ConfigManager.swift | 5 +++++ src/SidebarView.swift | 8 +++++--- src/Theme.swift | 16 ++++++++++++---- 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/AppDelegate.swift b/src/AppDelegate.swift index 8bd4bc0..16f9e82 100644 --- a/src/AppDelegate.swift +++ b/src/AppDelegate.swift @@ -132,6 +132,21 @@ class AppDelegate: NSObject, NSApplicationDelegate { toggleItem.keyEquivalentModifierMask = .control toggleItem.target = self menu.addItem(toggleItem) + + menu.addItem(.separator()) + + let zoomInItem = NSMenuItem(title: "Zoom In", action: #selector(zoomIn), keyEquivalent: "=") + zoomInItem.target = self + menu.addItem(zoomInItem) + + let zoomOutItem = NSMenuItem(title: "Zoom Out", action: #selector(zoomOut), keyEquivalent: "-") + zoomOutItem.target = self + menu.addItem(zoomOutItem) + + let actualSizeItem = NSMenuItem(title: "Actual Size", action: #selector(zoomReset), keyEquivalent: "0") + actualSizeItem.target = self + menu.addItem(actualSizeItem) + item.submenu = menu return item } @@ -191,6 +206,24 @@ class AppDelegate: NSObject, NSApplicationDelegate { NotificationCenter.default.post(name: .toggleSidebar, object: nil) } + @objc private func zoomIn() { + ConfigManager.shared.zoomLevel += 1 + NotificationCenter.default.post(name: .settingsChanged, object: nil) + } + + @objc private func zoomOut() { + let current = ConfigManager.shared.zoomLevel + if 11 + current > 8 { + ConfigManager.shared.zoomLevel -= 1 + NotificationCenter.default.post(name: .settingsChanged, object: nil) + } + } + + @objc private func zoomReset() { + ConfigManager.shared.zoomLevel = 0 + NotificationCenter.default.post(name: .settingsChanged, object: nil) + } + private func setupTitleBar() { let accessory = TitleBarAccessoryController() window.addTitlebarAccessoryViewController(accessory) diff --git a/src/ConfigManager.swift b/src/ConfigManager.swift index 4306824..5905b79 100644 --- a/src/ConfigManager.swift +++ b/src/ConfigManager.swift @@ -52,4 +52,9 @@ class ConfigManager { get { config["lineIndicatorMode"] ?? "on" } set { config["lineIndicatorMode"] = newValue; save() } } + + var zoomLevel: CGFloat { + get { CGFloat(Double(config["zoomLevel"] ?? "0") ?? 0) } + set { config["zoomLevel"] = String(Double(newValue)); save() } + } } diff --git a/src/SidebarView.swift b/src/SidebarView.swift index 62efefc..a370aec 100644 --- a/src/SidebarView.swift +++ b/src/SidebarView.swift @@ -36,7 +36,7 @@ struct SidebarView: View { Spacer() Text("No notes yet") .foregroundColor(Color(ns: Theme.current.overlay1)) - .font(.system(size: 13)) + .font(Font(Theme.sidebarFont as CTFont)) Spacer() } } else { @@ -124,11 +124,13 @@ struct NoteRow: View { var body: some View { VStack(alignment: .leading, spacing: 2) { Text(note.title) - .font(.system(size: 13, weight: isActive ? .semibold : .regular)) + .font(Font(isActive + ? NSFontManager.shared.convert(Theme.sidebarFont, toHaveTrait: .boldFontMask) as CTFont + : Theme.sidebarFont as CTFont)) .foregroundColor(Color(ns: Theme.current.text)) .lineLimit(1) Text(dateFormatter.string(from: note.lastModified)) - .font(.system(size: 11)) + .font(Font(Theme.sidebarDateFont as CTFont)) .foregroundColor(Color(ns: Theme.current.subtext0)) } .frame(maxWidth: .infinity, alignment: .leading) diff --git a/src/Theme.swift b/src/Theme.swift index de82cbb..d99ef22 100644 --- a/src/Theme.swift +++ b/src/Theme.swift @@ -101,10 +101,18 @@ struct Theme { } } - static let editorFont = NSFont.monospacedSystemFont(ofSize: 13, weight: .regular) - static let gutterFont = NSFont.monospacedSystemFont(ofSize: 11, weight: .regular) - static let sidebarFont = NSFont.systemFont(ofSize: 13, weight: .regular) - static let sidebarDateFont = NSFont.systemFont(ofSize: 11, weight: .regular) + static var editorFont: NSFont { + NSFont.monospacedSystemFont(ofSize: max(8, 13 + ConfigManager.shared.zoomLevel), weight: .regular) + } + static var gutterFont: NSFont { + NSFont.monospacedSystemFont(ofSize: max(8, 11 + ConfigManager.shared.zoomLevel), weight: .regular) + } + static var sidebarFont: NSFont { + NSFont.systemFont(ofSize: max(8, 13 + ConfigManager.shared.zoomLevel), weight: .regular) + } + static var sidebarDateFont: NSFont { + NSFont.systemFont(ofSize: max(8, 11 + ConfigManager.shared.zoomLevel), weight: .regular) + } struct SyntaxColors { let keyword: NSColor