From 4c51260363c35f0753f18d67555843ab9e018931 Mon Sep 17 00:00:00 2001 From: Jordan Baird Date: Mon, 8 Jul 2024 00:15:53 -0600 Subject: [PATCH] More efficient image cache --- Ice.xcodeproj/project.pbxproj | 4 --- Ice/IceBar/IceBar.swift | 6 +++- Ice/Main/AppState.swift | 5 ++- Ice/MenuBar/MenuBarItemImageCache.swift | 35 +++++++++---------- Ice/Navigation/AppNavigationState.swift | 3 +- .../AppNavigationIdentifier.swift | 10 ------ 6 files changed, 28 insertions(+), 35 deletions(-) delete mode 100644 Ice/Navigation/NavigationIdentifiers/AppNavigationIdentifier.swift diff --git a/Ice.xcodeproj/project.pbxproj b/Ice.xcodeproj/project.pbxproj index 77743875..aa3c9d25 100644 --- a/Ice.xcodeproj/project.pbxproj +++ b/Ice.xcodeproj/project.pbxproj @@ -131,7 +131,6 @@ 71F428112C3B5CE90025706C /* NavigationIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71F428102C3B5CE90025706C /* NavigationIdentifier.swift */; }; 71F428132C3B5E030025706C /* IconResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71F428122C3B5E030025706C /* IconResource.swift */; }; 71F428152C3B5F3D0025706C /* AppNavigationState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71F428142C3B5F3D0025706C /* AppNavigationState.swift */; }; - 71F428172C3B60070025706C /* AppNavigationIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71F428162C3B60070025706C /* AppNavigationIdentifier.swift */; }; 71FEA2542A8D701B0048341A /* LocalEventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71FEA2532A8D701B0048341A /* LocalEventMonitor.swift */; }; /* End PBXBuildFile section */ @@ -260,7 +259,6 @@ 71F428102C3B5CE90025706C /* NavigationIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationIdentifier.swift; sourceTree = ""; }; 71F428122C3B5E030025706C /* IconResource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconResource.swift; sourceTree = ""; }; 71F428142C3B5F3D0025706C /* AppNavigationState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppNavigationState.swift; sourceTree = ""; }; - 71F428162C3B60070025706C /* AppNavigationIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppNavigationIdentifier.swift; sourceTree = ""; }; 71FEA2532A8D701B0048341A /* LocalEventMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalEventMonitor.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -788,7 +786,6 @@ 71F428182C3B605B0025706C /* NavigationIdentifiers */ = { isa = PBXGroup; children = ( - 71F428162C3B60070025706C /* AppNavigationIdentifier.swift */, 71F428102C3B5CE90025706C /* NavigationIdentifier.swift */, 71F4280E2C3B5C870025706C /* SettingsNavigationIdentifier.swift */, ); @@ -967,7 +964,6 @@ 173C248C2B8E821C0096F7A1 /* UpdatesSettingsPane.swift in Sources */, 171C6F9C2C0356BC0097A5C8 /* GeneralSettingsPane.swift in Sources */, 7150A7B12AA427F80045EA68 /* KeyCode.swift in Sources */, - 71F428172C3B60070025706C /* AppNavigationIdentifier.swift in Sources */, 71829E0A2C2FDCC200503604 /* NSScreen+getMenuBarHeight.swift in Sources */, 17B331D02B9916E70084EBB0 /* SettingsManager.swift in Sources */, 17B331D32B991D290084EBB0 /* GeneralSettingsManager.swift in Sources */, diff --git a/Ice/IceBar/IceBar.swift b/Ice/IceBar/IceBar.swift index 59f02f63..deb598da 100644 --- a/Ice/IceBar/IceBar.swift +++ b/Ice/IceBar/IceBar.swift @@ -161,8 +161,11 @@ class IceBarPanel: NSPanel { return } - // important that we set the current section before updating the cache + // important that we set the navigation state and current section + // before updating the cache + appState.navigationState.isIceBarPresented = true currentSection = section + await appState.imageCache.updateCache() contentView = IceBarHostingView( @@ -181,6 +184,7 @@ class IceBarPanel: NSPanel { super.close() contentView = nil currentSection = nil + appState?.navigationState.isIceBarPresented = false } } diff --git a/Ice/Main/AppState.swift b/Ice/Main/AppState.swift index dd0e62b8..270289e4 100644 --- a/Ice/Main/AppState.swift +++ b/Ice/Main/AppState.swift @@ -108,7 +108,10 @@ final class AppState: ObservableObject { settingsWindow.publisher(for: \.isVisible) .receive(on: DispatchQueue.main) .sink { [weak self] isVisible in - self?.navigationState.appNavigationIdentifier = if isVisible { .settings } else { .idle } + guard let self else { + return + } + navigationState.isSettingsPresented = isVisible } .store(in: &c) } diff --git a/Ice/MenuBar/MenuBarItemImageCache.swift b/Ice/MenuBar/MenuBarItemImageCache.swift index d95809e6..acbc15dc 100644 --- a/Ice/MenuBar/MenuBarItemImageCache.swift +++ b/Ice/MenuBar/MenuBarItemImageCache.swift @@ -63,18 +63,6 @@ class MenuBarItemImageCache: ObservableObject { .store(in: &c) } - Timer.publish(every: 3, on: .main, in: .default) - .autoconnect() - .sink { [weak self] _ in - guard let self else { - return - } - Task { - await self.updateCache() - } - } - .store(in: &c) - cancellables = c } @@ -181,6 +169,17 @@ class MenuBarItemImageCache: ObservableObject { guard let appState else { return } + if !appState.navigationState.isIceBarPresented { + Logger.imageCache.info("Ice Bar not visible") + guard appState.navigationState.isSettingsPresented else { + Logger.imageCache.info("Settings not visible, so deferring image cache") + return + } + guard case .menuBarItems = appState.navigationState.settingsNavigationIdentifier else { + Logger.imageCache.info("Settings visible but not viewing menu bar items, so deferring image cache") + return + } + } guard !appState.itemManager.isMovingItem else { Logger.imageCache.info("Item manager is moving item, so deferring image cache") return @@ -189,12 +188,12 @@ class MenuBarItemImageCache: ObservableObject { return } var sectionsNeedingDisplay = [MenuBarSection.Name]() - if - let settingsWindow = appState.settingsWindow, - settingsWindow.isVisible - { + if appState.navigationState.isSettingsPresented { sectionsNeedingDisplay = MenuBarSection.Name.allCases - } else if let section = appState.menuBarManager.iceBarPanel.currentSection { + } else if + appState.navigationState.isIceBarPresented, + let section = appState.menuBarManager.iceBarPanel.currentSection + { sectionsNeedingDisplay.append(section) } for section in sectionsNeedingDisplay { @@ -203,7 +202,7 @@ class MenuBarItemImageCache: ObservableObject { } let sectionImages = await createImages(for: section, screen: screen) guard !sectionImages.isEmpty else { - Logger.imageCache.warning("Update cache failed for \(section.logString)") + Logger.imageCache.warning("Update image cache failed for \(section.logString)") continue } images.merge(sectionImages) { (_, new) in new } diff --git a/Ice/Navigation/AppNavigationState.swift b/Ice/Navigation/AppNavigationState.swift index 8249f725..51fe1127 100644 --- a/Ice/Navigation/AppNavigationState.swift +++ b/Ice/Navigation/AppNavigationState.swift @@ -8,6 +8,7 @@ import Combine /// The model for app-wide navigation. @MainActor final class AppNavigationState: ObservableObject { - @Published var appNavigationIdentifier: AppNavigationIdentifier = .idle + @Published var isSettingsPresented = false + @Published var isIceBarPresented = false @Published var settingsNavigationIdentifier: SettingsNavigationIdentifier = .general } diff --git a/Ice/Navigation/NavigationIdentifiers/AppNavigationIdentifier.swift b/Ice/Navigation/NavigationIdentifiers/AppNavigationIdentifier.swift deleted file mode 100644 index ede119a3..00000000 --- a/Ice/Navigation/NavigationIdentifiers/AppNavigationIdentifier.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// AppNavigationIdentifier.swift -// Ice -// - -/// An identifier used for app-wide navigation. -enum AppNavigationIdentifier: String, NavigationIdentifier { - case idle - case settings -}