// // Swiftfin is subject to the terms of the Mozilla Public // License, v2.0. If a copy of the MPL was not distributed with this // file, you can obtain one at https://mozilla.org/MPL/2.0/. // // Copyright (c) 2024 Jellyfin & Jellyfin Contributors // import SwiftUI // https://movingparts.io/variadic-views-in-swiftui /// An `HStack` that inserts an optional `separator` between views. /// /// - Note: Default spacing is removed. The separator view is responsible /// for spacing. struct SeparatorHStack: View { private var content: () -> Content private var separator: () -> any View var body: some View { _VariadicView.Tree(SeparatorHStackLayout(separator: separator)) { content() } } } extension SeparatorHStack { init(@ViewBuilder _ content: @escaping () -> Content) { self.init( content: content, separator: { RowDivider() } ) } func separator(@ViewBuilder _ content: @escaping () -> any View) -> Self { copy(modifying: \.separator, with: content) } } extension SeparatorHStack { struct SeparatorHStackLayout: _VariadicView_UnaryViewRoot { var separator: () -> any View @ViewBuilder func body(children: _VariadicView.Children) -> some View { let last = children.last?.id localHStack { ForEach(children) { child in child if child.id != last { separator() .eraseToAnyView() } } } } @ViewBuilder private func localHStack(@ViewBuilder content: @escaping () -> some View) -> some View { HStack(spacing: 0) { content() } } } }