Skip to content

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
jordanbaird committed Feb 4, 2024
1 parent a8655f1 commit 7038583
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 8 deletions.
10 changes: 8 additions & 2 deletions Ice/MenuBar/MenuBarAppearanceManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,17 +61,23 @@ final class MenuBarAppearanceManager: ObservableObject {
private let encoder: JSONEncoder
private let decoder: JSONDecoder

private let defaults = UserDefaults.standard
private let defaults: UserDefaults

private(set) weak var menuBarManager: MenuBarManager?

private lazy var backingPanel = MenuBarBackingPanel(appearanceManager: self)
private lazy var overlayPanel = MenuBarOverlayPanel(appearanceManager: self)

init(menuBarManager: MenuBarManager, encoder: JSONEncoder, decoder: JSONDecoder) {
init(
menuBarManager: MenuBarManager,
encoder: JSONEncoder,
decoder: JSONDecoder,
defaults: UserDefaults
) {
self.menuBarManager = menuBarManager
self.encoder = encoder
self.decoder = decoder
self.defaults = defaults
}

func performSetup() {
Expand Down
10 changes: 5 additions & 5 deletions Ice/MenuBar/MenuBarAppearancePanel/MenuBarAppearancePanel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,14 @@ class MenuBarAppearancePanel: NSPanel {
/// - Parameter screen: The screen to use to compute the
/// frame of the menu bar.
func menuBarFrame(forScreen screen: NSScreen) -> CGRect {
guard let frame: CGRect = try? appearanceManager?.menuBarManager?.menuBar?.attribute(.frame) else {
guard let menuBarFrame = appearanceManager?.menuBarManager?.menuBarFrame else {
return .zero
}
return CGRect(
x: frame.origin.x,
y: screen.frame.maxY - frame.origin.y - frame.height,
width: frame.width,
height: frame.height
x: menuBarFrame.origin.x,
y: screen.frame.maxY - menuBarFrame.origin.y - menuBarFrame.height,
width: menuBarFrame.width,
height: menuBarFrame.height
)
}

Expand Down
45 changes: 44 additions & 1 deletion Ice/MenuBar/MenuBarManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@ import SwiftUI

/// Manager for the state of the menu bar.
final class MenuBarManager: ObservableObject {
/// An error that can be thrown during menu bar operations.
enum MenuBarError: Error {
/// The given accessibility role of a UI element is not
/// what was expected.
case invalidRole(expected: Role, found: Role?)
}

/// Set to `true` to tell the menu bar to save its sections.
@Published var needsSave = false

Expand Down Expand Up @@ -49,6 +56,9 @@ final class MenuBarManager: ObservableObject {
/// The UI element that represents the menu bar.
@Published var menuBar: UIElement?

/// The frame of the menu bar.
@Published var menuBarFrame: CGRect?

/// The sections currently in the menu bar.
@Published private(set) var sections = [MenuBarSection]() {
willSet {
Expand Down Expand Up @@ -78,7 +88,8 @@ final class MenuBarManager: ObservableObject {
private(set) lazy var appearanceManager = MenuBarAppearanceManager(
menuBarManager: self,
encoder: encoder,
decoder: decoder
decoder: decoder,
defaults: defaults
)

private lazy var mouseMonitor = UniversalEventMonitor(
Expand Down Expand Up @@ -306,6 +317,19 @@ final class MenuBarManager: ObservableObject {
}
.store(in: &c)

$menuBar
.receive(on: DispatchQueue.main)
.sink { [weak self] menuBar in
guard
let self,
let menuBar
else {
return
}
updateMenuBarFrame(menuBar: menuBar)
}
.store(in: &c)

// propagate changes up from child observable objects
appearanceManager.objectWillChange
.sink { [weak self] in
Expand Down Expand Up @@ -437,6 +461,25 @@ final class MenuBarManager: ObservableObject {
sections[index].controlItem = sortedControlItems[index]
}
}

/// Updates the menu bar frame using the given UI element.
///
/// - IMPORTANT: The UI element that is passed to the `menuBar`
/// parameter _must_ have the `menuBar` role, or an error will
/// be logged and the menu bar frame will not be updated.
///
/// - Parameter menuBar: The UI element representing the menu bar.
private func updateMenuBarFrame(menuBar: UIElement) {
do {
let role = try menuBar.role()
guard role == .menuBar else {
throw MenuBarError.invalidRole(expected: .menuBar, found: role)
}
menuBarFrame = try menuBar.attribute(.frame)
} catch {
Logger.menuBarManager.error("Error updating menu bar frame: \(error)")
}
}
}

// MARK: MenuBarManager: BindingExposable
Expand Down

0 comments on commit 7038583

Please sign in to comment.