mirror of
https://github.com/jellyfin/Swiftfin.git
synced 2025-02-19 23:02:49 +00:00
71 lines
1.9 KiB
Swift
71 lines
1.9 KiB
Swift
//
|
|
// 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) 2025 Jellyfin & Jellyfin Contributors
|
|
//
|
|
|
|
import SwiftUI
|
|
import UIKit
|
|
|
|
struct SFSymbolButton: UIViewRepresentable {
|
|
|
|
private var onSelect: () -> Void
|
|
private let pointSize: CGFloat
|
|
private let systemName: String
|
|
private let systemNameFocused: String?
|
|
|
|
private func makeButtonConfig(_ button: UIButton) {
|
|
let symbolImageConfig = UIImage.SymbolConfiguration(pointSize: pointSize)
|
|
let symbolImage = UIImage(systemName: systemName, withConfiguration: symbolImageConfig)
|
|
|
|
button.setImage(symbolImage, for: .normal)
|
|
|
|
if let systemNameFocused {
|
|
let focusedSymbolImage = UIImage(systemName: systemNameFocused, withConfiguration: symbolImageConfig)
|
|
|
|
button.setImage(focusedSymbolImage, for: .focused)
|
|
}
|
|
}
|
|
|
|
func makeUIView(context: Context) -> some UIButton {
|
|
var configuration = UIButton.Configuration.plain()
|
|
configuration.cornerStyle = .capsule
|
|
|
|
let buttonAction = UIAction(title: "") { _ in
|
|
self.onSelect()
|
|
}
|
|
|
|
let button = UIButton(configuration: configuration, primaryAction: buttonAction)
|
|
|
|
makeButtonConfig(button)
|
|
|
|
return button
|
|
}
|
|
|
|
func updateUIView(_ uiView: UIViewType, context: Context) {
|
|
makeButtonConfig(uiView)
|
|
}
|
|
}
|
|
|
|
extension SFSymbolButton {
|
|
|
|
init(
|
|
systemName: String,
|
|
systemNameFocused: String? = nil,
|
|
pointSize: CGFloat = 32
|
|
) {
|
|
self.init(
|
|
onSelect: {},
|
|
pointSize: pointSize,
|
|
systemName: systemName,
|
|
systemNameFocused: systemNameFocused
|
|
)
|
|
}
|
|
|
|
func onSelect(_ action: @escaping () -> Void) -> Self {
|
|
copy(modifying: \.onSelect, with: action)
|
|
}
|
|
}
|