From 5d33e4a55896b6d253c86ffd35f5c9112c3a49cb Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Wed, 16 Sep 2026 18:16:10 +0200 Subject: [PATCH] Hide toolbar account switchers where the sidebar already shows one --- .../Views/Components/DataContextSwitcherMenu.swift | 14 ++++++++++++++ Yattee/Views/Home/HistoryListView.swift | 10 +++++++--- Yattee/Views/Home/HomeView.swift | 10 +++++++--- Yattee/Views/Home/PlaylistsListView.swift | 10 +++++++--- Yattee/Views/Subscriptions/SubscriptionsView.swift | 8 +++++--- 5 files changed, 40 insertions(+), 12 deletions(-) diff --git a/Yattee/Views/Components/DataContextSwitcherMenu.swift b/Yattee/Views/Components/DataContextSwitcherMenu.swift index 57b5d1cb..b95d46b7 100644 --- a/Yattee/Views/Components/DataContextSwitcherMenu.swift +++ b/Yattee/Views/Components/DataContextSwitcherMenu.swift @@ -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 diff --git a/Yattee/Views/Home/HistoryListView.swift b/Yattee/Views/Home/HistoryListView.swift index 4c8327f9..7e0dcd12 100644 --- a/Yattee/Views/Home/HistoryListView.swift +++ b/Yattee/Views/Home/HistoryListView.swift @@ -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() } diff --git a/Yattee/Views/Home/HomeView.swift b/Yattee/Views/Home/HomeView.swift index b923123e..92a96e54 100644 --- a/Yattee/Views/Home/HomeView.swift +++ b/Yattee/Views/Home/HomeView.swift @@ -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() } diff --git a/Yattee/Views/Home/PlaylistsListView.swift b/Yattee/Views/Home/PlaylistsListView.swift index b0628fa4..49ff06ac 100644 --- a/Yattee/Views/Home/PlaylistsListView.swift +++ b/Yattee/Views/Home/PlaylistsListView.swift @@ -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() } diff --git a/Yattee/Views/Subscriptions/SubscriptionsView.swift b/Yattee/Views/Subscriptions/SubscriptionsView.swift index 8ec2e842..ff585fc4 100644 --- a/Yattee/Views/Subscriptions/SubscriptionsView.swift +++ b/Yattee/Views/Subscriptions/SubscriptionsView.swift @@ -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() }