Skip to content

Commit

Permalink
Fix for menu bar items not initially showing in layout bars
Browse files Browse the repository at this point in the history
  • Loading branch information
jordanbaird committed Jul 9, 2024
1 parent 8431899 commit 715dcaa
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 17 deletions.
3 changes: 2 additions & 1 deletion Ice/LayoutBar/LayoutBar.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ struct LayoutBar: View {
}

@EnvironmentObject var appState: AppState
@EnvironmentObject var imageCache: MenuBarItemImageCache

let section: MenuBarSection
let spacing: CGFloat
Expand All @@ -44,7 +45,7 @@ struct LayoutBar: View {

@ViewBuilder
private var conditionalBody: some View {
if appState.imageCache.cacheFailed(for: section.name) {
if imageCache.cacheFailed(for: section.name) {
Text("Unable to display menu bar items")
.foregroundStyle(menuBarManager.averageColorInfo?.color.brightness ?? 0 > 0.67 ? .black : .white)
} else {
Expand Down
12 changes: 12 additions & 0 deletions Ice/Main/AppState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,18 @@ final class AppState: ObservableObject {
.store(in: &c)
}

navigationState.$isSettingsPresented
.receive(on: DispatchQueue.main)
.sink { isPresented in
guard isPresented else {
return
}
Task {
await self.imageCache.updateCacheWithoutChecks(sections: MenuBarSection.Name.allCases)
}
}
.store(in: &c)

menuBarManager.objectWillChange
.sink { [weak self] in
self?.objectWillChange.send()
Expand Down
41 changes: 25 additions & 16 deletions Ice/MenuBar/MenuBarItemImageCache.swift
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,30 @@ class MenuBarItemImageCache: ObservableObject {
return await tempCache.images
}

func updateCacheWithoutChecks(sections: [MenuBarSection.Name]) async {
guard
let appState,
let screen = NSScreen.main
else {
return
}
var images = images
for section in sections {
guard !appState.itemManager.itemCache.allItems(for: section).isEmpty else {
continue
}
let sectionImages = await createImages(for: section, screen: screen)
guard !sectionImages.isEmpty else {
Logger.imageCache.warning("Update image cache failed for \(section.logString)")
continue
}
images.merge(sectionImages) { (_, new) in new }
}
self.images = images
self.screen = screen
self.menuBarHeight = screen.getMenuBarHeight()
}

func updateCache() async {
guard let appState else {
return
Expand All @@ -184,9 +208,6 @@ class MenuBarItemImageCache: ObservableObject {
Logger.imageCache.info("Item manager is moving item, so deferring image cache")
return
}
guard let screen = NSScreen.main else {
return
}
var sectionsNeedingDisplay = [MenuBarSection.Name]()
if appState.navigationState.isSettingsPresented {
sectionsNeedingDisplay = MenuBarSection.Name.allCases
Expand All @@ -196,19 +217,7 @@ class MenuBarItemImageCache: ObservableObject {
{
sectionsNeedingDisplay.append(section)
}
for section in sectionsNeedingDisplay {
guard !appState.itemManager.itemCache.allItems(for: section).isEmpty else {
continue
}
let sectionImages = await createImages(for: section, screen: screen)
guard !sectionImages.isEmpty else {
Logger.imageCache.warning("Update image cache failed for \(section.logString)")
continue
}
images.merge(sectionImages) { (_, new) in new }
}
self.screen = screen
self.menuBarHeight = screen.getMenuBarHeight()
await updateCacheWithoutChecks(sections: sectionsNeedingDisplay)
}
}

Expand Down
1 change: 1 addition & 0 deletions Ice/Settings/SettingsPanes/MenuBarItemsSettingsPane.swift
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ struct MenuBarItemsSettingsPane: View {
VStack(alignment: .leading) {
Section {
LayoutBar(section: section)
.environmentObject(appState.imageCache)
} header: {
Text(section.name.menuString)
} footer: {
Expand Down

0 comments on commit 715dcaa

Please sign in to comment.