fix(mac): toolbar strip with inspector, player close button and titlebar
This commit is contained in:
1 parent
9775248485
commit
581140d4da
6 files changed
+53
-13
No files matched your search
@@ -140,6 +140,7 @@ private struct PageTitle: ViewModifier {
|
|||||||
.padding(.horizontal, Metrics.margin)
|
.padding(.horizontal, Metrics.margin)
|
||||||
.padding(.bottom, 8)
|
.padding(.bottom, 8)
|
||||||
}
|
}
|
||||||
|
.toolbarBackgroundVisibility(.hidden, for: .windowToolbar)
|
||||||
#else
|
#else
|
||||||
content.navigationTitle(title)
|
content.navigationTitle(title)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ struct ScrollRevealedTitle: ViewModifier {
|
|||||||
.toolbarTitleDisplayMode(.inline)
|
.toolbarTitleDisplayMode(.inline)
|
||||||
#if os(macOS)
|
#if os(macOS)
|
||||||
.toolbar(removing: .title)
|
.toolbar(removing: .title)
|
||||||
|
.toolbarBackgroundVisibility(.hidden, for: .windowToolbar)
|
||||||
.toolbar {
|
.toolbar {
|
||||||
ToolbarItem(placement: .principal) {
|
ToolbarItem(placement: .principal) {
|
||||||
Text(title).font(.headline).lineLimit(1).opacity(isRevealed ? 1 : 0)
|
Text(title).font(.headline).lineLimit(1).opacity(isRevealed ? 1 : 0)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ struct ArtistDetailView: View {
|
|||||||
MacArtistPage(id: id, artist: artist, albums: albums, tracks: topTracks)
|
MacArtistPage(id: id, artist: artist, albums: albums, tracks: topTracks)
|
||||||
}
|
}
|
||||||
.background { Backdrop(artwork: artist?.artwork) }
|
.background { Backdrop(artwork: artist?.artwork) }
|
||||||
|
.scrollEdgeEffectHidden(true, for: .top)
|
||||||
.modifier(ScrollRevealedTitle(title: artist?.name ?? "", threshold: 120))
|
.modifier(ScrollRevealedTitle(title: artist?.name ?? "", threshold: 120))
|
||||||
.task(id: app.revision) {
|
.task(id: app.revision) {
|
||||||
artist = await app.library.artist(id)
|
artist = await app.library.artist(id)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
}
|
}
|
||||||
.animation(reduceMotion ? nil : .spring(response: 0.4, dampingFraction: 1), value: mode)
|
.animation(reduceMotion ? nil : .spring(response: 0.4, dampingFraction: 1), value: mode)
|
||||||
}
|
}
|
||||||
.overlay(alignment: .topLeading) { windowButtons }
|
.overlay(alignment: .top) { MacTitlebarArea().frame(height: 52) }
|
||||||
.overlay(alignment: .topTrailing) { output }
|
.overlay(alignment: .topTrailing) { output }
|
||||||
.overlay(alignment: .bottomTrailing) { modeToggles }
|
.overlay(alignment: .bottomTrailing) { modeToggles }
|
||||||
.background { Backdrop(artwork: player.current?.artwork) }
|
.background { Backdrop(artwork: player.current?.artwork) }
|
||||||
@@ -53,17 +53,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private var windowButtons: some View {
|
|
||||||
Button("Close", systemImage: "xmark") { router.showsNowPlaying = false }
|
|
||||||
.labelStyle(.iconOnly)
|
|
||||||
.buttonStyle(MacPlayerButtonStyle())
|
|
||||||
.font(.system(size: 16, weight: .medium))
|
|
||||||
.frame(width: 38, height: 36)
|
|
||||||
.glassEffect(.regular, in: .capsule)
|
|
||||||
.padding(.leading, 100)
|
|
||||||
.padding(.top, 8)
|
|
||||||
}
|
|
||||||
|
|
||||||
private var output: some View {
|
private var output: some View {
|
||||||
HStack(spacing: 12) {
|
HStack(spacing: 12) {
|
||||||
RoutePicker().frame(width: 24, height: 24).accessibilityLabel("AirPlay")
|
RoutePicker().frame(width: 24, height: 24).accessibilityLabel("AirPlay")
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
MacSidebar(selection: Binding { selection } set: { select($0) })
|
MacSidebar(selection: Binding { selection } set: { select($0) })
|
||||||
.toolbar(removing: .sidebarToggle)
|
.toolbar(removing: .sidebarToggle)
|
||||||
.toolbar {
|
.toolbar {
|
||||||
ToolbarItem(id: MacWindowChrome.anchor) { Color.clear.frame(width: 1, height: 1) }
|
ToolbarItem(id: MacWindowChrome.anchor) { MacCloseButton() }
|
||||||
.sharedBackgroundVisibility(.hidden)
|
.sharedBackgroundVisibility(.hidden)
|
||||||
}
|
}
|
||||||
} detail: {
|
} detail: {
|
||||||
@@ -76,6 +76,23 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private struct MacCloseButton: View {
|
||||||
|
@Environment(Router.self) private var router
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
Button("Close", systemImage: "xmark") { router.showsNowPlaying = false }
|
||||||
|
.labelStyle(.iconOnly)
|
||||||
|
.buttonStyle(MacPlayerButtonStyle())
|
||||||
|
.font(.system(size: 16, weight: .medium))
|
||||||
|
.frame(width: 38, height: 36)
|
||||||
|
.glassEffect(.regular, in: .capsule)
|
||||||
|
.environment(\.colorScheme, .dark)
|
||||||
|
.opacity(router.showsNowPlaying ? 1 : 0)
|
||||||
|
.allowsHitTesting(router.showsNowPlaying)
|
||||||
|
.accessibilityHidden(!router.showsNowPlaying)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private struct MacPlaybackKeys: ViewModifier {
|
private struct MacPlaybackKeys: ViewModifier {
|
||||||
@Environment(Router.self) private var router
|
@Environment(Router.self) private var router
|
||||||
@Environment(PlayerModel.self) private var player
|
@Environment(PlayerModel.self) private var player
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
#if os(macOS)
|
||||||
|
import AppKit
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct MacTitlebarArea: NSViewRepresentable {
|
||||||
|
func makeNSView(context _: Context) -> TitlebarView {
|
||||||
|
TitlebarView()
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateNSView(_: TitlebarView, context _: Context) {}
|
||||||
|
|
||||||
|
final class TitlebarView: NSView {
|
||||||
|
override var mouseDownCanMoveWindow: Bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
override func mouseDown(with event: NSEvent) {
|
||||||
|
guard let window else { return }
|
||||||
|
guard event.clickCount == 2 else {
|
||||||
|
window.performDrag(with: event)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
switch UserDefaults.standard.string(forKey: "AppleActionOnDoubleClick") {
|
||||||
|
case "Minimize": window.performMiniaturize(nil)
|
||||||
|
case "None": break
|
||||||
|
default: window.performZoom(nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
Reference in new issue
Block a user