Files
yattee/Yattee/Models/PlayerControls/ControlButtonConfiguration.swift
2026-02-08 18:33:56 +01:00

104 lines
3.5 KiB
Swift

//
// ControlButtonConfiguration.swift
// Yattee
//
// Configuration for a single control button in the player layout.
//
import Foundation
/// Configuration for a single control button, including its type, visibility, and settings.
struct ControlButtonConfiguration: Identifiable, Codable, Hashable, Sendable {
/// Unique identifier for this button configuration.
let id: UUID
/// The type of control button.
let buttonType: ControlButtonType
/// When this button should be visible based on orientation.
var visibilityMode: VisibilityMode
/// Type-specific settings for this button (if applicable).
var settings: ButtonSettings?
// MARK: - Initialization
/// Creates a new button configuration.
/// - Parameters:
/// - id: Unique identifier. Defaults to a new UUID.
/// - buttonType: The type of control button.
/// - visibilityMode: When to show the button. Defaults to `.both`.
/// - settings: Type-specific settings. Defaults to the button type's default settings.
init(
id: UUID = UUID(),
buttonType: ControlButtonType,
visibilityMode: VisibilityMode = .both,
settings: ButtonSettings? = nil
) {
self.id = id
self.buttonType = buttonType
self.visibilityMode = visibilityMode
self.settings = settings ?? buttonType.defaultSettings
}
// MARK: - Factory Methods
/// Creates a default configuration for the given button type.
/// - Parameter type: The button type.
/// - Returns: A new configuration with default settings.
static func defaultConfiguration(for type: ControlButtonType) -> ControlButtonConfiguration {
ControlButtonConfiguration(buttonType: type)
}
/// Creates a configuration for a flexible spacer.
/// - Returns: A spacer configuration with flexible width.
static func flexibleSpacer() -> ControlButtonConfiguration {
ControlButtonConfiguration(
buttonType: .spacer,
settings: .spacer(SpacerSettings(isFlexible: true))
)
}
/// Creates a configuration for a fixed-width spacer.
/// - Parameter width: The fixed width in points.
/// - Returns: A spacer configuration with fixed width.
static func fixedSpacer(width: Int) -> ControlButtonConfiguration {
ControlButtonConfiguration(
buttonType: .spacer,
settings: .spacer(SpacerSettings(isFlexible: false, fixedWidth: width))
)
}
// MARK: - Convenience Accessors
/// Returns the spacer settings if this is a spacer button.
var spacerSettings: SpacerSettings? {
guard case .spacer(let settings) = settings else { return nil }
return settings
}
/// Returns the slider settings if this is a slider button.
var sliderSettings: SliderSettings? {
guard case .slider(let settings) = settings else { return nil }
return settings
}
/// Returns the seek settings if this is a seek button.
var seekSettings: SeekSettings? {
guard case .seek(let settings) = settings else { return nil }
return settings
}
/// Returns the time display settings if this is a time display.
var timeDisplaySettings: TimeDisplaySettings? {
guard case .timeDisplay(let settings) = settings else { return nil }
return settings
}
/// Returns the title/author settings if this is a title/author button.
var titleAuthorSettings: TitleAuthorSettings? {
guard case .titleAuthor(let settings) = settings else { return nil }
return settings
}
}