KMEditPDFPopToolBarController.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. //
  2. // KMEditPDFPopToolBarController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2024/6/18.
  6. //
  7. import Cocoa
  8. @objc enum KMEditPDFToolbarItemKey: Int {
  9. case color
  10. case fontStyle
  11. case fontAdd
  12. case fontReduce
  13. case fontBold
  14. case fontItalic
  15. case textAlignment
  16. case leftRotate
  17. case rightRotate
  18. case reverseX // 左右翻转
  19. case reverseY // 上下翻转
  20. case crop
  21. case replace
  22. case export
  23. case alignmentLeft
  24. case alignmentRight
  25. case alignmentCenterX
  26. case alignmentjustifiedX // 左右两端对齐
  27. case alignmentTop
  28. case alignmentBottom
  29. case alignmentCenterY
  30. case alignmentjustifiedY // 上下两端对齐
  31. case separator // 分割线
  32. }
  33. class KMSeparatorLineView: NSView {
  34. var strokeColor: NSColor = .black {
  35. didSet {
  36. self.needsDisplay = true
  37. }
  38. }
  39. override func draw(_ dirtyRect: NSRect) {
  40. super.draw(dirtyRect)
  41. let rect = self.bounds
  42. let ctx = NSGraphicsContext.current?.cgContext
  43. ctx?.saveGState()
  44. ctx?.setLineWidth(1)
  45. ctx?.setStrokeColor(self.strokeColor.cgColor)
  46. let startP = NSPoint(x: rect.size.width*0.5, y: 6+2)
  47. ctx?.move(to: startP)
  48. let endP = NSPoint(x: rect.size.width*0.5, y: rect.size.height-8)
  49. ctx?.addLine(to: endP)
  50. ctx?.strokePath()
  51. ctx?.restoreGState()
  52. }
  53. }
  54. struct KMEditPDFToolbarStyle: OptionSet {
  55. let rawValue: Int
  56. static var text = KMEditPDFToolbarStyle(rawValue: 1 << 0)
  57. static var image = KMEditPDFToolbarStyle(rawValue: 1 << 1)
  58. }
  59. class KMEditPDFPopToolBarController: NSViewController {
  60. deinit {
  61. KMPrint("KMEditPDFPopToolBarController deinit.")
  62. }
  63. convenience init() {
  64. self.init(nibName: "KMEditPDFPopToolBarController", bundle: nil)
  65. }
  66. var toolbarView: KMEditPDFToolbarView?
  67. var itemKeys: [KMEditPDFToolbarItemKey] = [] {
  68. didSet {
  69. self.toolbarView?.reloadData()
  70. }
  71. }
  72. var fontColor: NSColor?
  73. var itemClick: ((KMEditPDFToolbarItemKey, Any?)->Void)?
  74. override func viewDidLoad() {
  75. super.viewDidLoad()
  76. // Do view setup here.
  77. self.view.wantsLayer = true
  78. self.view.layer?.backgroundColor = .white
  79. let toolbarView = KMEditPDFToolbarView()
  80. self.toolbarView = toolbarView
  81. toolbarView.frame = self.view.bounds
  82. toolbarView.autoresizingMask = [.width, .height]
  83. self.view.addSubview(toolbarView)
  84. toolbarView.delegate = self
  85. toolbarView.inset = .init(top: 6, left: 4, bottom: 0, right: 0)
  86. toolbarView.reloadData()
  87. }
  88. @objc func _buttonClick(_ sender: NSButton) {
  89. let idx = sender.tag
  90. if idx >= 0 && idx < self.itemKeys.count {
  91. self.itemClick?(self.itemKeys[idx], nil)
  92. }
  93. }
  94. @objc func textAlignmentItemClick(_ sender: NSButton) {
  95. let vc = KMTextAlignmentController(nibName: "KMTextAlignmentController", bundle: nil)
  96. let createFilePopover: NSPopover = NSPopover.init()
  97. createFilePopover.contentViewController = vc
  98. // createFilePopover.delegate = self
  99. createFilePopover.animates = true
  100. createFilePopover.behavior = .semitransient
  101. createFilePopover.setValue(true, forKey: "shouldHideAnchor")
  102. createFilePopover.show(relativeTo: CGRect(x: sender.bounds.origin.x, y: 20, width: sender.bounds.size.width, height: sender.bounds.size.height), of: sender, preferredEdge: .maxY)
  103. vc.itemAction = { [weak self] idx, _ in
  104. var data: NSTextAlignment = .left
  105. if idx == 0 {
  106. data = .left
  107. } else if idx == 1 {
  108. data = .center
  109. } else if idx == 2 {
  110. data = .right
  111. }
  112. self?.itemClick?(.textAlignment, data)
  113. createFilePopover.close()
  114. }
  115. }
  116. @objc func colorPanelAction(_ sender: NSColorPanel) {
  117. let color = sender.color
  118. let colorView = (self.toolbarView?.itemViews.first as? KMEditPDFToolbarItemView)?.view as? KMEditPDFColorView
  119. colorView?.colorBtn.layer?.backgroundColor = color.cgColor
  120. self.itemClick?(.color, color)
  121. }
  122. }
  123. extension KMEditPDFPopToolBarController: KMEditPDFToolbarViewDelegate {
  124. func numberOfItems(in toolbarView: KMEditPDFToolbarView) -> Int {
  125. return self.itemKeys.count
  126. }
  127. func toolbarView(_ toolbarView: KMEditPDFToolbarView, viewFor index: Int) -> NSView? {
  128. let itemKey = self.itemKeys[index]
  129. if itemKey == .color {
  130. let colorView = KMEditPDFToolbarItemView()
  131. let view = KMEditPDFColorView()
  132. view.colorBtn.layer?.backgroundColor = self.fontColor?.cgColor
  133. view.itemClick = { [weak self] idx, _ in
  134. let panel = NSColorPanel.shared
  135. panel.setTarget(self)
  136. panel.setAction(#selector(self?.colorPanelAction))
  137. panel.orderFront(nil)
  138. }
  139. colorView.view = view
  140. return colorView
  141. } else if itemKey == .fontStyle {
  142. let fontStyleView = KMEditPDFToolbarItemView()
  143. let viewC = KMDesignSelect.init(withType: .Combox)
  144. viewC.isScrollPop = true
  145. fontStyleView.view = viewC.view
  146. fontStyleView.obj = viewC
  147. let familyNames = CPDFFont.familyNames
  148. viewC.removeAllItems()
  149. viewC.addItems(withObjectValues: familyNames)
  150. viewC.selectItem(at: 0)
  151. viewC.delete = self
  152. return fontStyleView
  153. } else if itemKey == .separator {
  154. let colorView = KMEditPDFToolbarItemView()
  155. let view = KMSeparatorLineView()
  156. view.strokeColor = NSColor(hex: "#DADBDE")
  157. colorView.view = view
  158. return colorView
  159. } else if itemKey == .textAlignment {
  160. let colorView = KMEditPDFToolbarItemView()
  161. let viewC = KMDesignButton(withType: .Image)
  162. colorView.view = viewC.view
  163. colorView.obj = viewC
  164. viewC.pagination()
  165. // viewC.tag = index
  166. viewC.target = self
  167. viewC.action = #selector(textAlignmentItemClick)
  168. viewC.image = NSImage(named: "KMImageNameEditPDFAlignCenterSelect")!
  169. return colorView
  170. }
  171. let colorView = KMEditPDFToolbarItemView()
  172. let viewC = KMDesignButton(withType: .Image)
  173. colorView.view = viewC.view
  174. colorView.obj = viewC
  175. viewC.pagination()
  176. viewC.tag = index
  177. viewC.target = self
  178. viewC.action = #selector(_buttonClick)
  179. if itemKey == .fontAdd {
  180. viewC.image = NSImage(named: "KMImageNameEditPDFFontAdd")!
  181. colorView.popToolTip = NSLocalizedString("Larger font size", comment: "")
  182. } else if itemKey == .fontReduce {
  183. viewC.image = NSImage(named: "KMImageNameEditPDFFontReduce")!
  184. colorView.popToolTip = NSLocalizedString("Reduce font size", comment: "")
  185. } else if itemKey == .fontBold {
  186. viewC.image = NSImage(named: "KMImageNameEditPDFFontBold")!
  187. colorView.popToolTip = NSLocalizedString("Bold font", comment: "")
  188. } else if itemKey == .fontItalic {
  189. viewC.image = NSImage(named: "KMImageNameEditPDFFontItalic")!
  190. colorView.popToolTip = NSLocalizedString("Italic font", comment: "")
  191. } else if itemKey == .textAlignment {
  192. viewC.image = NSImage(named: "KMImageNameEditPDFAlignCenterSelect")!
  193. colorView.popToolTip = NSLocalizedString("Center text", comment: "")
  194. }
  195. // 图片
  196. else if itemKey == .leftRotate {
  197. viewC.image = NSImage(named: "KMImageNameEditPDFRotationLeft")!
  198. colorView.popToolTip = NSLocalizedString("Rotate left", comment: "")
  199. } else if itemKey == .rightRotate {
  200. viewC.image = NSImage(named: "KMImageNameEditPDFRotationRight")!
  201. colorView.popToolTip = NSLocalizedString("Rotate right", comment: "")
  202. } else if itemKey == .reverseX {
  203. viewC.image = NSImage(named: "KMImageNameEditPDFReverseX")!
  204. colorView.popToolTip = NSLocalizedString("", comment: "")
  205. } else if itemKey == .reverseY {
  206. viewC.image = NSImage(named: "KMImageNameEditPDFReverseY")!
  207. colorView.popToolTip = NSLocalizedString("", comment: "")
  208. } else if itemKey == .crop {
  209. viewC.image = NSImage(named: "KMImageNameEditPDFCrop")!
  210. colorView.popToolTip = NSLocalizedString("Crop", comment: "")
  211. } else if itemKey == .replace {
  212. viewC.image = NSImage(named: "KMImageNameEditPDFReplace")!
  213. colorView.popToolTip = NSLocalizedString("Replace", comment: "")
  214. } else if itemKey == .export {
  215. viewC.image = NSImage(named: "KMImageNameEditPDFExport")!
  216. colorView.popToolTip = NSLocalizedString("Export file", comment: "")
  217. }
  218. // 对齐
  219. else if itemKey == .alignmentLeft {
  220. viewC.image = NSImage(named: "KMImageNameEditPDFImage45_1")!
  221. colorView.popToolTip = NSLocalizedString("Align left", comment: "")
  222. } else if itemKey == .alignmentCenterX {
  223. viewC.image = NSImage(named: "KMImageNameEditPDFImage46_1")!
  224. colorView.popToolTip = NSLocalizedString("Align center", comment: "")
  225. } else if itemKey == .alignmentRight {
  226. viewC.image = NSImage(named: "KMImageNameEditPDFImage47_1")!
  227. colorView.popToolTip = NSLocalizedString("Align right", comment: "")
  228. } else if itemKey == .alignmentjustifiedX {
  229. viewC.image = NSImage(named: "KMImageNameEditPDFImage21_1")!
  230. colorView.popToolTip = NSLocalizedString("Align both ends", comment: "")
  231. } else if itemKey == .alignmentTop {
  232. viewC.image = NSImage(named: "KMImageNameEditPDFImage48_1")!
  233. colorView.popToolTip = NSLocalizedString("Align top", comment: "")
  234. } else if itemKey == .alignmentCenterY {
  235. viewC.image = NSImage(named: "KMImageNameEditPDFImage49_1")!
  236. colorView.popToolTip = NSLocalizedString("Align center in vertical", comment: "")
  237. } else if itemKey == .alignmentBottom {
  238. viewC.image = NSImage(named: "KMImageNameEditPDFImage50_1")!
  239. colorView.popToolTip = NSLocalizedString("Align bottom", comment: "")
  240. } else if itemKey == .alignmentjustifiedY {
  241. viewC.image = NSImage(named: "KMImageNameEditPDFImage20_1")!
  242. colorView.popToolTip = NSLocalizedString("Align ends in vertical", comment: "")
  243. }
  244. return colorView
  245. }
  246. func toolbarView(_ toolbarView: KMEditPDFToolbarView, sizeForItemAt index: Int) -> NSSize {
  247. let itemKey = self.itemKeys[index]
  248. if itemKey == .color {
  249. return NSMakeSize(56, 32)
  250. } else if itemKey == .fontStyle {
  251. return NSMakeSize(148, 32)
  252. } else if itemKey == .separator {
  253. return NSMakeSize(16, 32)
  254. }
  255. return NSMakeSize(32, 32)
  256. }
  257. }
  258. extension KMEditPDFPopToolBarController: KMSelectPopButtonDelegate {
  259. func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
  260. self.itemClick?(.fontStyle, obj.stringValue)
  261. }
  262. func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
  263. }
  264. }