Hide toolbar account switchers where the sidebar already shows one

This commit is contained in:
Arkadiusz Fal
2026-09-16 18:16:10 +02:00
parent a5ed91620f
commit 5d33e4a558
5 changed files with 40 additions and 12 deletions

View File

@@ -256,6 +256,20 @@ enum DataContextSwitcherVisibility {
guard let appEnvironment else { return false }
return appEnvironment.settingsManager.showAccountPickers && showsSwitcher(in: appEnvironment)
}
#if os(iOS)
/// The iOS toolbar menus: same rule again, minus the regular widths, where
/// the sidebar layout already pins the switcher in its bottom bar — a
/// toolbar button there would say the same thing twice, the way macOS
/// toolbars already leave it to the sidebar row.
@MainActor
static func showsToolbarPickers(
in appEnvironment: AppEnvironment?,
horizontalSizeClass: UserInterfaceSizeClass?
) -> Bool {
horizontalSizeClass == .compact && showsPickers(in: appEnvironment)
}
#endif
}
// MARK: - Glyph

View File

@@ -9,6 +9,9 @@ import SwiftUI
struct HistoryListView: View {
@Environment(\.appEnvironment) private var appEnvironment
#if os(iOS)
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
#endif
@Namespace private var sheetTransition
/// One row, from whichever history the screen is reading.
@@ -331,10 +334,11 @@ struct HistoryListView: View {
ToolbarSpacer(.flexible, placement: .primaryAction)
}
#endif
// No switcher on macOS: the sidebar row is the one persistent
// switcher surface there.
// No switcher wherever a sidebar shows one: the macOS sidebar row
// and the iPad sidebar's bottom bar are the persistent switcher
// surfaces there, so the toolbar menu is compact-width-only.
#if !os(macOS)
if DataContextSwitcherVisibility.showsPickers(in: appEnvironment) {
if DataContextSwitcherVisibility.showsToolbarPickers(in: appEnvironment, horizontalSizeClass: horizontalSizeClass) {
ToolbarItem(placement: viewOptionsPlacement) {
DataContextSwitcherMenu()
}

View File

@@ -9,6 +9,9 @@ import SwiftUI
struct HomeView: View {
@Environment(\.appEnvironment) private var appEnvironment
#if os(iOS)
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
#endif
@Environment(\.scenePhase) private var scenePhase
#if !os(tvOS) && !os(macOS)
@Namespace private var sheetTransition
@@ -166,10 +169,11 @@ struct HomeView: View {
.toolbarTitleDisplayMode(.inlineLarge)
#endif
.toolbar {
// No switcher on macOS: the sidebar row is the one persistent
// switcher surface there.
// No switcher wherever a sidebar shows one: the macOS sidebar row
// and the iPad sidebar's bottom bar are the persistent switcher
// surfaces there, so the toolbar menu is compact-width-only.
#if !os(tvOS) && !os(macOS)
if DataContextSwitcherVisibility.showsPickers(in: appEnvironment) {
if DataContextSwitcherVisibility.showsToolbarPickers(in: appEnvironment, horizontalSizeClass: horizontalSizeClass) {
ToolbarItem(placement: .primaryAction) {
DataContextSwitcherMenu()
}

View File

@@ -9,6 +9,9 @@ import SwiftUI
struct PlaylistsListView: View {
@Environment(\.appEnvironment) private var appEnvironment
#if os(iOS)
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
#endif
@Namespace private var sheetTransition
@State private var localPlaylists: [LocalPlaylist] = []
@State private var searchText = ""
@@ -229,10 +232,11 @@ struct PlaylistsListView: View {
ToolbarSpacer(.flexible, placement: .primaryAction)
}
#endif
// No switcher on macOS: the sidebar row is the one persistent
// switcher surface there.
// No switcher wherever a sidebar shows one: the macOS sidebar row
// and the iPad sidebar's bottom bar are the persistent switcher
// surfaces there, so the toolbar menu is compact-width-only.
#if !os(macOS)
if DataContextSwitcherVisibility.showsPickers(in: appEnvironment) {
if DataContextSwitcherVisibility.showsToolbarPickers(in: appEnvironment, horizontalSizeClass: horizontalSizeClass) {
ToolbarItem(placement: viewOptionsPlacement) {
DataContextSwitcherMenu()
}

View File

@@ -492,10 +492,12 @@ struct SubscriptionsView: View {
.toolbarTitleDisplayMode(.inlineLarge)
#endif
.toolbar {
// No switcher on macOS: the sidebar row is the one persistent
// switcher surface there.
// No switcher wherever a sidebar shows one: the macOS
// sidebar row and the iPad sidebar's bottom bar are the
// persistent switcher surfaces there, so the toolbar menu
// is compact-width-only.
#if !os(macOS)
if DataContextSwitcherVisibility.showsPickers(in: appEnvironment) {
if DataContextSwitcherVisibility.showsToolbarPickers(in: appEnvironment, horizontalSizeClass: horizontalSizeClass) {
ToolbarItem(placement: viewOptionsPlacement) {
DataContextSwitcherMenu()
}