// // Copyright 2023, 2024 New Vector Ltd. // // SPDX-License-Identifier: AGPL-3.0-only // Please see LICENSE in the repository root for full details. // import SwiftUI struct SegmentedPicker: View { private let segments: [Segment] private let selection: Binding private let interSegmentSpacing: CGFloat @Environment(\.theme) private var theme init(segments: [Segment], selection: Binding, interSegmentSpacing: CGFloat) { self.segments = segments self.selection = selection self.interSegmentSpacing = interSegmentSpacing } var body: some View { HStack(spacing: interSegmentSpacing) { ForEach(segments, id: \.hashValue) { segment in let isSelectedSegment = segment == selection.wrappedValue Button { selection.wrappedValue = segment } label: { Text(segment.description) .font(isSelectedSegment ? theme.fonts.headline : theme.fonts.body) .underlineBar(isSelectedSegment) } .accentColor(isSelectedSegment ? Color(ThemeService.shared().theme.tintColor) : theme.colors.primaryContent) .accessibilityLabel(segment.description) .accessibilityValue(isSelectedSegment ? VectorL10n.accessibilitySelected : "") } } } } private extension Text { @ViewBuilder func underlineBar(_ isActive: Bool) -> some View { if #available(iOS 15.0, *) { overlay(alignment: .bottom) { if isActive { Rectangle() .frame(height: 1) .offset(y: 2) } } } else { underline(isActive) } } } struct SegmentedPicker_Previews: PreviewProvider { static var previews: some View { SegmentedPicker( segments: [ "Segment 1", "Segment 2" ], selection: .constant("Segment 1"), interSegmentSpacing: 14 ) SegmentedPicker( segments: [ "Segment 1", "Segment 2" ], selection: .constant("Segment 2"), interSegmentSpacing: 14 ) } }