mirror of
https://github.com/yattee/yattee.git
synced 2026-02-19 17:29:45 +00:00
86 lines
3.0 KiB
Swift
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
|
|
}
|