ReadViewSDK/Sources/RDReaderView/EPUBUI/RDEPUBReaderSettings.swift
2026-05-21 19:40:51 +08:00

129 lines
3.5 KiB
Swift

import UIKit
public enum RDEPUBReaderDisplayMode: String, Codable, Equatable {
case pageCurl
case horizontalScroll
case verticalScroll
case horizontalCoverScroll
init(displayType: RDReaderView.DisplayType) {
switch displayType {
case .pageCurl:
self = .pageCurl
case .horizontalScroll:
self = .horizontalScroll
case .verticalScroll:
self = .verticalScroll
}
}
var displayType: RDReaderView.DisplayType {
switch self {
case .pageCurl:
return .pageCurl
case .horizontalScroll, .horizontalCoverScroll:
return .horizontalScroll
case .verticalScroll:
return .verticalScroll
}
}
}
public enum RDEPUBReaderThemePreset: String, Codable, CaseIterable, Equatable {
case light
case yellow
case green
case pink
case blue
case dark
public var theme: RDEPUBReaderTheme {
switch self {
case .light:
return .light
case .yellow:
return .yellow
case .green:
return .green
case .pink:
return .pink
case .blue:
return .blue
case .dark:
return .dark
}
}
public init?(theme: RDEPUBReaderTheme) {
switch theme {
case .light:
self = .light
case .yellow:
self = .yellow
case .green:
self = .green
case .pink:
self = .pink
case .blue:
self = .blue
case .dark:
self = .dark
default:
return nil
}
}
}
public struct RDEPUBReaderSettings: Codable, Equatable {
public var brightness: CGFloat?
public var fontSize: CGFloat?
public var lineHeightMultiple: CGFloat?
public var displayMode: RDEPUBReaderDisplayMode?
public var themePreset: RDEPUBReaderThemePreset?
public init(
brightness: CGFloat? = nil,
fontSize: CGFloat? = nil,
lineHeightMultiple: CGFloat? = nil,
displayMode: RDEPUBReaderDisplayMode? = nil,
themePreset: RDEPUBReaderThemePreset? = nil
) {
self.brightness = brightness
self.fontSize = fontSize
self.lineHeightMultiple = lineHeightMultiple
self.displayMode = displayMode
self.themePreset = themePreset
}
public func applying(to configuration: RDEPUBReaderConfiguration) -> RDEPUBReaderConfiguration {
var resolvedConfiguration = configuration
if let fontSize {
resolvedConfiguration.fontSize = fontSize
}
if let lineHeightMultiple {
resolvedConfiguration.lineHeightMultiple = lineHeightMultiple
}
if let displayMode {
resolvedConfiguration.displayType = displayMode.displayType
}
if let themePreset {
resolvedConfiguration.theme = themePreset.theme
}
return resolvedConfiguration
}
public static func capture(
configuration: RDEPUBReaderConfiguration,
brightness: CGFloat
) -> RDEPUBReaderSettings {
RDEPUBReaderSettings(
brightness: max(0, min(1, brightness)),
fontSize: configuration.fontSize,
lineHeightMultiple: configuration.lineHeightMultiple,
displayMode: RDEPUBReaderDisplayMode(displayType: configuration.displayType),
themePreset: RDEPUBReaderThemePreset(theme: configuration.theme)
)
}
}