KMReadModelView.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. //
  2. // KMReadModelView.swift
  3. // PDF Master
  4. //
  5. // Created by lizhe on 2023/3/23.
  6. //
  7. import Cocoa
  8. enum KMReadModelViewScaleType: String, CaseIterable {
  9. case fitWidth = "Fit Width"
  10. case actualSize = "Actual Size"
  11. case autoSize = "Auto Size"
  12. case _10 = "10%"
  13. case _25 = "25%"
  14. case _50 = "50%"
  15. case _100 = "100%"
  16. case _150 = "150%"
  17. case _200 = "200%"
  18. case _400 = "400%"
  19. case _800 = "800%"
  20. static func allValues() -> [String] {
  21. var array: [String] = []
  22. for key in KMReadModelViewScaleType.allCases {
  23. array.append(NSLocalizedString(key.rawValue, comment: ""))
  24. }
  25. return array
  26. }
  27. static func typeOfRawValue(value: String) -> KMReadModelViewScaleType {
  28. var type: KMReadModelViewScaleType
  29. switch value {
  30. case NSLocalizedString(KMReadModelViewScaleType.fitWidth.rawValue, comment: ""): type = .fitWidth
  31. case NSLocalizedString(KMReadModelViewScaleType.actualSize.rawValue, comment: ""): type = .actualSize
  32. case NSLocalizedString(KMReadModelViewScaleType.autoSize.rawValue, comment: ""): type = .autoSize
  33. case KMReadModelViewScaleType._10.rawValue: type = ._10
  34. case KMReadModelViewScaleType._25.rawValue: type = ._25
  35. case KMReadModelViewScaleType._50.rawValue: type = ._50
  36. case KMReadModelViewScaleType._100.rawValue: type = ._100
  37. case KMReadModelViewScaleType._150.rawValue: type = ._150
  38. case KMReadModelViewScaleType._200.rawValue: type = ._200
  39. case KMReadModelViewScaleType._400.rawValue: type = ._400
  40. case KMReadModelViewScaleType._800.rawValue: type = ._800
  41. default:
  42. type = .autoSize
  43. }
  44. return type
  45. }
  46. }
  47. protocol KMReadModelViewDelegate: NSObject {
  48. func firstPageButtonDidChange(view: KMReadModelView, sender: Any)
  49. func beforePageButtonDidChange(view: KMReadModelView, sender: Any)
  50. func afterPageButtonDidChange(view: KMReadModelView, sender: Any)
  51. func lastPageButtonDidChange(view: KMReadModelView, sender: Any)
  52. func currentPageButtonDidChange(view: KMReadModelView, sender: Any, pageIndex: Int)
  53. func scaleDidChange(view: KMReadModelView, sender: Any, type: KMReadModelViewScaleType)
  54. func cancelReadModel(view: KMReadModelView, sender: Any)
  55. }
  56. class KMReadModelView: KMBaseXibView {
  57. @IBOutlet weak var firstPageView: NSView!
  58. @IBOutlet weak var beforePageView: NSView!
  59. @IBOutlet weak var currentPageView: NSView!
  60. @IBOutlet weak var totalPageView: NSTextField!
  61. @IBOutlet weak var afterPageView: NSView!
  62. @IBOutlet weak var lastPageView: NSView!
  63. @IBOutlet weak var totalLable: NSTextField!
  64. @IBOutlet weak var zoomView: NSView!
  65. @IBOutlet weak var backgroundContentView: NSView!
  66. @IBOutlet weak var currentPageTextField: NSTextField!
  67. @IBOutlet weak var currentPageBackgroundView: NSView!
  68. @IBOutlet weak var contentBox: KMBox!
  69. fileprivate var firstPageButton: KMDesignButton!
  70. fileprivate var beforePageButton: KMDesignButton!
  71. fileprivate var afterPageButton: KMDesignButton!
  72. fileprivate var lastPageButton: KMDesignButton!
  73. fileprivate var zoomButton: KMDesignSelect!
  74. var timer: Timer?
  75. weak var delegate: KMReadModelViewDelegate?
  76. var currentPageIndex: Int? {
  77. didSet {
  78. self.currentPageTextField.stringValue = (currentPageIndex! + 1).description
  79. self.updateButtonState()
  80. }
  81. }
  82. var totalPagesCount: Int? {
  83. didSet {
  84. self.totalLable.stringValue = totalPagesCount?.description ?? "1"
  85. self.updateButtonState()
  86. }
  87. }
  88. var scaleType: KMReadModelViewScaleType? {
  89. didSet {
  90. self.zoomButton.selectItem(at: KMReadModelViewScaleType.allValues().firstIndex(of: scaleType!.rawValue)!)
  91. }
  92. }
  93. deinit {
  94. self.endTimer()
  95. }
  96. override func draw(_ dirtyRect: NSRect) {
  97. super.draw(dirtyRect)
  98. // Drawing code here.
  99. }
  100. override func setup() {
  101. self.backgroundColor(NSColor(hex: "#FFFFFF"))
  102. self.shadow = NSShadow()
  103. self.wantsLayer = true
  104. self.layer?.shadowColor = NSColor(hex: "#000000", alpha: 0.16).cgColor
  105. self.layer?.shadowOffset = CGSize(width: 0, height: -2)
  106. self.layer?.shadowRadius = 8
  107. self.layer?.shadowOpacity = 1
  108. self.layer?.cornerRadius = 4
  109. firstPageButton = KMDesignButton(withType: .Image)
  110. self.firstPageView.addSubview(firstPageButton.view)
  111. firstPageButton.view.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
  112. firstPageButton.target = self
  113. firstPageButton.image = NSImage(named: "icon_btn_readModel_first")!
  114. firstPageButton.image_disabled = NSImage(named: "icon_btn_readModel_first_dis")!
  115. firstPageButton.action = #selector(firstPageButtonAction)
  116. firstPageButton.pagination()
  117. firstPageButton.updateUI()
  118. beforePageButton = KMDesignButton(withType: .Image)
  119. self.beforePageView.addSubview(beforePageButton.view)
  120. beforePageButton.view.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
  121. beforePageButton.target = self
  122. beforePageButton.image = NSImage(named: "icon_btn_readModel_before")!
  123. beforePageButton.image_disabled = NSImage(named: "icon_btn_readModel_before_dis")!
  124. beforePageButton.action = #selector(beforePageButtonAction)
  125. beforePageButton.pagination()
  126. afterPageButton = KMDesignButton(withType: .Image)
  127. self.afterPageView.addSubview(afterPageButton.view)
  128. afterPageButton.view.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
  129. afterPageButton.target = self
  130. afterPageButton.image = NSImage(named: "icon_btn_readModel_after")!
  131. afterPageButton.image_disabled = NSImage(named: "icon_btn_readModel_after_dis")!
  132. afterPageButton.action = #selector(afterPageButtonAction)
  133. afterPageButton.pagination()
  134. lastPageButton = KMDesignButton(withType: .Image)
  135. self.lastPageView.addSubview(lastPageButton.view)
  136. lastPageButton.view.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
  137. lastPageButton.target = self
  138. lastPageButton.image = NSImage(named: "icon_btn_readModel_last")!
  139. lastPageButton.image_disabled = NSImage(named: "icon_btn_readModel_last_dis")!
  140. lastPageButton.action = #selector(lastPageButtonAction)
  141. lastPageButton.pagination()
  142. zoomButton = KMDesignSelect(withType: .PopButton)
  143. self.zoomView.addSubview(zoomButton.view)
  144. zoomButton.view.frame = CGRect(x: 0, y: 0, width: 65, height: 24)
  145. zoomButton.selectItem(at: 0)
  146. zoomButton.delete = self
  147. zoomButton.font = NSFont.SFProTextRegular(12.0)
  148. zoomButton.font_hov = NSFont.SFProTextRegular(12.0)
  149. zoomButton.font_focus = NSFont.SFProTextRegular(12.0)
  150. zoomButton.font_disabled = NSFont.SFProTextRegular(12.0)
  151. zoomButton.updateUI()
  152. currentPageBackgroundView.border(NSColor(hex: "#DFE1E5"), 1, 4)
  153. currentPageTextField.textColor = NSColor(hex: "#252629")
  154. currentPageTextField.font = NSFont.SFProTextRegular(12.0)
  155. currentPageTextField.delegate = self
  156. totalLable.textColor = NSColor(hex: "#252629")
  157. totalLable.font = NSFont.SFProTextRegular(12.0)
  158. contentBox.moveCallback = { [unowned self] (enter, box) in
  159. if enter {
  160. self.inReadModelView()
  161. } else {
  162. self.beginTimer()
  163. }
  164. }
  165. }
  166. //刷新界面UI 和 数据
  167. override func reloadData() {
  168. }
  169. override func updateLanguage() {
  170. zoomButton.removeAllItems()
  171. zoomButton.addItems(withObjectValues: KMReadModelViewScaleType.allValues())
  172. }
  173. override func updateUI() {
  174. }
  175. override func resetData() {
  176. }
  177. override func addNotification() {
  178. }
  179. override func removeNotification() {
  180. }
  181. @IBAction func escButtonAction(_ sender: Any) {
  182. print("read model escButtonAction")
  183. self.delegate?.cancelReadModel(view: self, sender: sender)
  184. }
  185. }
  186. //MARK: Mouse
  187. extension KMReadModelView {
  188. override func mouseDown(with event: NSEvent) {
  189. print("mouseDown")
  190. }
  191. override func mouseUp(with event: NSEvent) {
  192. print("mouseUp")
  193. }
  194. override func mouseMoved(with event: NSEvent) {
  195. print("mouseMoved")
  196. }
  197. override func mouseEntered(with event: NSEvent) {
  198. print("mouseEntered")
  199. }
  200. override func mouseExited(with event: NSEvent) {
  201. print("mouseExited")
  202. }
  203. }
  204. //MARK: PopButton
  205. extension KMReadModelView: KMSelectPopButtonDelegate {
  206. func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
  207. print("km_comboBoxSelectionDidChange")
  208. self.delegate?.scaleDidChange(view: self, sender: obj, type: KMReadModelViewScaleType(rawValue: KMReadModelViewScaleType.allValues()[obj.indexOfSelectedItem]) ?? .autoSize)
  209. }
  210. }
  211. //MARK:
  212. extension KMReadModelView: NSTextFieldDelegate {
  213. func controlTextDidEndEditing(_ obj: Notification) {
  214. let string = Int(self.currentPageTextField.stringValue)?.description ?? "1"
  215. currentPageTextField.stringValue = string
  216. self.delegate?.currentPageButtonDidChange(view: self, sender: obj, pageIndex: Int(string) ?? 1)
  217. }
  218. }
  219. //MARK: In out
  220. extension KMReadModelView {
  221. @objc fileprivate func inReadModelView() {
  222. self.endTimer()
  223. NSAnimationContext.runAnimationGroup { NSAnimationContext in
  224. self.animator().alphaValue = 1
  225. }
  226. }
  227. @objc fileprivate func outReadModelView() {
  228. NSAnimationContext.runAnimationGroup { NSAnimationContext in
  229. self.animator().alphaValue = 0
  230. self.endTimer()
  231. }
  232. }
  233. func resetTimer() {
  234. self.endTimer()
  235. self.beginTimer()
  236. }
  237. func beginTimer() {
  238. if self.timer != nil {
  239. self.endTimer()
  240. }
  241. self.inReadModelView()
  242. self.timer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(outReadModelView), userInfo: nil, repeats: true)
  243. }
  244. func endTimer() {
  245. self.timer?.invalidate()
  246. self.timer = nil
  247. }
  248. }
  249. //MARK: Action
  250. extension KMReadModelView {
  251. func updateButtonState() {
  252. self.firstPageButton.enabled = self.canFirstPageButtonAction()
  253. self.beforePageButton.enabled = self.canBeforePageButtonAction()
  254. self.afterPageButton.enabled = self.canAfterPageButtonAction()
  255. self.lastPageButton.enabled = self.canLastPageButtonAction()
  256. }
  257. @objc func firstPageButtonAction(sender: Any) {
  258. print("firstPageButtonAction")
  259. if self.canFirstPageButtonAction() {
  260. self.delegate?.firstPageButtonDidChange(view: self, sender: sender)
  261. }
  262. self.updateButtonState()
  263. }
  264. @objc func beforePageButtonAction(sender: Any) {
  265. print("beforePageButtonAction")
  266. if self.canBeforePageButtonAction() {
  267. self.delegate?.beforePageButtonDidChange(view: self, sender: sender)
  268. }
  269. self.updateButtonState()
  270. }
  271. @objc func afterPageButtonAction(sender: Any) {
  272. print("afterPageButtonAction")
  273. if self.canAfterPageButtonAction() {
  274. self.delegate?.afterPageButtonDidChange(view: self, sender: sender)
  275. }
  276. self.updateButtonState()
  277. }
  278. @objc func lastPageButtonAction(sender: Any) {
  279. print("lastPageButtonAction")
  280. if self.canLastPageButtonAction() {
  281. self.delegate?.lastPageButtonDidChange(view: self, sender: sender)
  282. }
  283. self.updateButtonState()
  284. }
  285. func canFirstPageButtonAction() -> Bool {
  286. guard let pageIndex = self.currentPageIndex else { return false }
  287. if pageIndex != 0 {
  288. return true
  289. } else {
  290. return false
  291. }
  292. }
  293. func canBeforePageButtonAction() -> Bool {
  294. guard let pageIndex = self.currentPageIndex else { return false }
  295. if pageIndex != 0 {
  296. return true
  297. } else {
  298. return false
  299. }
  300. }
  301. func canAfterPageButtonAction() -> Bool {
  302. guard let totalCount = self.totalPagesCount else { return false }
  303. guard let pageIndex = self.currentPageIndex else { return false }
  304. if pageIndex < totalCount - 1 {
  305. return true
  306. } else {
  307. return false
  308. }
  309. }
  310. func canLastPageButtonAction() -> Bool {
  311. guard let totalCount = self.totalPagesCount else { return false }
  312. guard let pageIndex = self.currentPageIndex else { return false }
  313. if pageIndex != totalCount - 1 {
  314. return true
  315. } else {
  316. return false
  317. }
  318. }
  319. }