mirror of
https://github.com/yattee/yattee.git
synced 2026-07-21 06:42:01 +00:00
Pin view options button to leading toolbar edge on macOS
Place the view options control on the leading (`.navigation`) edge on macOS so it is consistently the first/leftmost toolbar button across all views, instead of sitting on the right next to the search field in search views and on the left in non-search views. Each affected view gains a computed `viewOptionsPlacement` (`.navigation` on macOS, `.primaryAction` elsewhere) so iOS/iPadOS/tvOS keep the button trailing. Search-style views (Search, InstanceBrowse) declare the view options item first so it renders left of the search-filters button; their flexible spacer is kept to right-pin the search field. Channel's fixed spacer between view options and the channel menu is now iOS-only.
This commit is contained in:
@@ -122,6 +122,15 @@ struct InstanceBrowseView: View {
|
||||
)
|
||||
}
|
||||
|
||||
/// View options button lives on the leading edge on macOS, trailing elsewhere.
|
||||
private var viewOptionsPlacement: ToolbarItemPlacement {
|
||||
#if os(macOS)
|
||||
.navigation
|
||||
#else
|
||||
.primaryAction
|
||||
#endif
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
let backgroundStyle: ListBackgroundStyle = listStyle == .inset ? .grouped : .plain
|
||||
GeometryReader { geometry in
|
||||
@@ -332,6 +341,20 @@ struct InstanceBrowseView: View {
|
||||
.navigationTitle(instance.displayName)
|
||||
.toolbarTitleDisplayMode(.inlineLarge)
|
||||
.toolbar {
|
||||
// View options first so it is the leftmost navigation item on macOS.
|
||||
ToolbarItem(placement: viewOptionsPlacement) {
|
||||
Button {
|
||||
showViewOptions = true
|
||||
} label: {
|
||||
Label(String(localized: "viewOptions.title"), systemImage: "slider.horizontal.3")
|
||||
}
|
||||
.liquidGlassTransitionSource(id: "instanceBrowseViewOptions", in: sheetTransition)
|
||||
#if os(macOS)
|
||||
.popover(isPresented: $showViewOptions, arrowEdge: .bottom) {
|
||||
viewOptionsSheetContent
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#if os(macOS)
|
||||
if #available(macOS 26, *) {
|
||||
// Search filters button appears only while showing search results.
|
||||
@@ -372,25 +395,12 @@ struct InstanceBrowseView: View {
|
||||
.fixedSize()
|
||||
}
|
||||
}
|
||||
// Pin the trailing group (search field + toolbar buttons) to the right edge,
|
||||
// Pin the trailing group (search field) to the right edge,
|
||||
// matching the global Search view.
|
||||
if #available(macOS 26, *) {
|
||||
ToolbarSpacer(.flexible, placement: .primaryAction)
|
||||
}
|
||||
#endif
|
||||
ToolbarItem(placement: .primaryAction) {
|
||||
Button {
|
||||
showViewOptions = true
|
||||
} label: {
|
||||
Label(String(localized: "viewOptions.title"), systemImage: "slider.horizontal.3")
|
||||
}
|
||||
.liquidGlassTransitionSource(id: "instanceBrowseViewOptions", in: sheetTransition)
|
||||
#if os(macOS)
|
||||
.popover(isPresented: $showViewOptions, arrowEdge: .bottom) {
|
||||
viewOptionsSheetContent
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if !os(macOS)
|
||||
|
||||
Reference in New Issue
Block a user