// 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 } } }