Files
yattee/Yattee/Models/PlayerControls/MiniPlayerSettings.swift
2026-02-12 08:58:44 +01:00

86 lines
3.0 KiB
Swift

//
// MiniPlayerSettings.swift
// Yattee
//
// Settings for the mini player component.
//
import Foundation
import SwiftUI
// MARK: - MiniPlayerSettings
/// Complete settings for the mini player component.
/// Note: Minimize behavior is intentionally NOT stored here as it's a system UI setting
/// that configures the tab bar and needs to be available synchronously at view creation time.
/// The minimize behavior remains in SettingsManager for the tab bar to access directly.
struct MiniPlayerSettings: Codable, Hashable, Sendable {
/// Whether to show video preview in the mini player.
var showVideo: Bool
/// Action to perform when tapping on the video preview.
var videoTapAction: MiniPlayerVideoTapAction
/// Ordered list of buttons to display in the mini player.
var buttons: [ControlButtonConfiguration]
// MARK: - Initialization
init(
showVideo: Bool = true,
videoTapAction: MiniPlayerVideoTapAction = .startPiP,
buttons: [ControlButtonConfiguration] = MiniPlayerSettings.defaultButtons
) {
self.showVideo = showVideo
self.videoTapAction = videoTapAction
self.buttons = buttons
}
// MARK: - Mutation Helpers
/// Adds a button of the given type to the mini player.
/// - Parameter buttonType: The type of button to add.
mutating func add(buttonType: ControlButtonType) {
let config = ControlButtonConfiguration(buttonType: buttonType)
buttons.append(config)
}
/// Removes the button at the given index.
/// - Parameter index: The index of the button to remove.
mutating func remove(at index: Int) {
guard buttons.indices.contains(index) else { return }
buttons.remove(at: index)
}
/// Moves buttons within the list.
/// - Parameters:
/// - source: Source indices to move from.
/// - destination: Destination index to move to.
mutating func move(fromOffsets source: IndexSet, toOffset destination: Int) {
buttons.move(fromOffsets: source, toOffset: destination)
}
/// Updates a button configuration by matching ID.
/// - Parameter configuration: The updated configuration.
mutating func update(_ configuration: ControlButtonConfiguration) {
guard let index = buttons.firstIndex(where: { $0.id == configuration.id }) else { return }
buttons[index] = configuration
}
// MARK: - Default Configuration
/// Default buttons for the mini player: play/pause and play next.
private static let defaultButtons: [ControlButtonConfiguration] = [
ControlButtonConfiguration(buttonType: .playPause),
ControlButtonConfiguration(buttonType: .playNext),
ControlButtonConfiguration(buttonType: .close)
]
/// Default mini player settings.
static let `default` = MiniPlayerSettings()
/// Cached settings for instant access (avoids flash on view recreation).
/// Updated whenever settings are loaded from the active preset.
nonisolated(unsafe) static var cached: MiniPlayerSettings = .default
}