Skip to content

Commit

Permalink
Fix menu bar icon
Browse files Browse the repository at this point in the history
  • Loading branch information
chippokiddo authored Dec 21, 2024
1 parent 7b4f0a7 commit 6ba3942
Showing 1 changed file with 24 additions and 28 deletions.
52 changes: 24 additions & 28 deletions FairyLights/FairyLightsApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,44 +6,43 @@ struct FairyLightsApp: App {
@StateObject private var lightsController = LightsController()
@StateObject private var appState = AppState()
@StateObject private var windowManager = WindowManager()

@State private var isCheckingForUpdates = false

var body: some Scene {
MenuBarExtra {
VStack {
Button(lightsController.isLightsOn ? "Turn Off" : "Turn On") {
lightsController.toggleLights()
}

Divider()

Button("About Fairy Lights") {
showAboutWindow()
}

Button(action: { checkForAppUpdates() }) {
Text(isCheckingForUpdates ? "Checking..." : "Check for Updates")
}
.disabled(isCheckingForUpdates)

Button("Settings...") {
showSettingsWindow()
}
.keyboardShortcut(",", modifiers: [.command])

Divider()

Button("Quit") { NSApplication.shared.terminate(nil) }
.keyboardShortcut("Q", modifiers: [.command])
.keyboardShortcut("Q", modifiers: [.command])
}
} label: {
Image(nsImage: menuBarIcon())
.renderingMode(.template)
.opacity(lightsController.isLightsOn ? 1.0 : 0.35)
Image(nsImage: menuBarIcon(for: lightsController.isLightsOn))
.renderingMode(.template)
}
}

// MARK: - Update Check
private func checkForAppUpdates() {
guard !isCheckingForUpdates else { return }
Expand All @@ -59,11 +58,11 @@ struct FairyLightsApp: App {
}
}
}

private func handleUpdateCheckResult(latestVersion: String, downloadURL: URL) {
let currentVersion =
Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "0.0.0"

if isNewerVersion(latestVersion, than: currentVersion) {
showAlert(
title: "New Update Available",
Expand All @@ -82,11 +81,8 @@ struct FairyLightsApp: App {
style: .informational)
}
}

// MARK: - Window Management
private weak var aboutWindow: NSWindow?
private weak var settingsWindow: NSWindow?

private func showAboutWindow() {
if let window = windowManager.aboutWindow {
window.makeKeyAndOrderFront(nil)
Expand All @@ -96,7 +92,7 @@ struct FairyLightsApp: App {
let window = createWindow(controller: hostingController, title: "About Fairy Lights")
windowManager.aboutWindow = window
}

private func showSettingsWindow() {
if let window = windowManager.settingsWindow {
window.makeKeyAndOrderFront(nil)
Expand All @@ -108,7 +104,7 @@ struct FairyLightsApp: App {
let window = createWindow(controller: hostingController, title: "Settings")
windowManager.settingsWindow = window
}

private func createWindow(controller: NSHostingController<some View>, title: String) -> NSWindow {
let window = NSWindow(contentViewController: controller)
window.isReleasedWhenClosed = false
Expand All @@ -122,8 +118,7 @@ struct FairyLightsApp: App {
window.makeKeyAndOrderFront(nil)
return window
}



// MARK: - Alert Handling
private func showAlert(
title: String, message: String, style: NSAlert.Style, buttons: [String] = ["OK"],
Expand All @@ -137,21 +132,22 @@ struct FairyLightsApp: App {
let response = alert.runModal()
completion?(response)
}

// MARK: - Helper Functions
private func menuBarIcon() -> NSImage {
let image = NSImage(named: "MenuBarIcon") ?? NSImage()
private func menuBarIcon(for state: Bool) -> NSImage {
let assetName = state ? "IconOn" : "IconOff"
let image = NSImage(named: assetName) ?? NSImage()
let ratio = image.size.height / image.size.width
image.size.height = 16
image.size.width = 16 / ratio
return image
}

private func isNewerVersion(_ newVersion: String, than currentVersion: String) -> Bool {
let parse = { (version: String) in version.split(separator: ".").compactMap { Int($0) } }
let newComponents = parse(newVersion)
let currentComponents = parse(currentVersion)

for (new, current) in zip(newComponents, currentComponents) {
if new != current { return new > current }
}
Expand Down

0 comments on commit 6ba3942

Please sign in to comment.