mirror of
https://github.com/yattee/yattee.git
synced 2026-02-20 09:49:46 +00:00
Yattee v2 rewrite
This commit is contained in:
84
Yattee/Models/PlayerControls/MiniPlayerSettings.swift
Normal file
84
Yattee/Models/PlayerControls/MiniPlayerSettings.swift
Normal file
@@ -0,0 +1,84 @@
|
||||
//
|
||||
// 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)
|
||||
]
|
||||
|
||||
/// 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
|
||||
}
|
||||
Reference in New Issue
Block a user