Files
ReadViewSDK/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBSelectionState.swift
T
shenandshen 6f75b083f7 feat: EPUB 阅读器搜索、选中注释、书签 chrome 状态及大量重构优化
- 新增 RDEPUBReaderSearchCoordinator 与 RDEPUBSelectionState 管理搜索和选中状态
- 新增 BookmarkChromeStateTests、NavigationBackwardTests、SelectionAnnotateTests 等 UI 测试
- 新增多个边界测试 epub 样本(损坏结构、空归档、缺失文件、流式外链验证)
- 重构阅读器 chrome 状态管理,统一 tool bar 与 search bar 交互
- 优化大书分页缓存策略(RDEPUBChapterSummaryDiskCache、RDEPUBPageCountCache)
- 移除废弃的 RDEPUBLocationConverter 和 RDEPUBPageBreakPolicy
- 更新 epub-bridge.js 与 JS bridge 通信协议
- 全面更新现有 UI 测试以适配新的 helper 和状态管理
2026-06-13 22:48:56 +08:00

40 lines
1.3 KiB
Swift

// RDEPUBSelectionState.swift
// 统一选区状态模型
// 收口选区相关状态的冗余表达,降低 view 层与 controller 层各持有一份选区状态
// 所带来的维护成本和时序问题。
import Foundation
/// 统一选区状态枚举
/// 替代原先散落在 view/controller/coordinator 的 `currentSelection != nil` 判断
enum RDEPUBSelectionState: Equatable {
/// 无选区
case idle
/// 用户正在拖拽选区(长按手势已开始,尚未松手)
case selecting(anchor: Int)
/// 选区已完成(用户松手,有有效文本)
case selected(RDEPUBSelection)
/// 正在执行选区菜单动作(拷贝/高亮/批注),动作完成后回到 idle
case committingAction(RDEPUBSelection, action: RDEPUBAnnotationMenuAction)
/// 当前是否有有效选区(selecting / selected / committingAction 均视为有选区)
var hasSelection: Bool {
switch self {
case .idle:
return false
case .selecting, .selected, .committingAction:
return true
}
}
/// 当前选区数据(如有)
var selection: RDEPUBSelection? {
switch self {
case .idle, .selecting:
return nil
case .selected(let selection), .committingAction(let selection, _):
return selection
}
}
}