KMEditPDFPopToolBarController.swift 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694
  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 none
  10. case color
  11. case fontStyle
  12. case fontAdd
  13. case fontReduce
  14. case fontBold
  15. case fontItalic
  16. case textAlignment
  17. case leftRotate
  18. case rightRotate
  19. case reverseX // 左右翻转
  20. case reverseY // 上下翻转
  21. case crop
  22. case replace
  23. case export
  24. case alignmentLeft
  25. case alignmentRight
  26. case alignmentCenterX
  27. case alignmentjustifiedX // 左右两端对齐
  28. case alignmentTop
  29. case alignmentBottom
  30. case alignmentCenterY
  31. case alignmentjustifiedY // 上下两端对齐
  32. case separator // 分割线
  33. func isRotate() -> Bool {
  34. return self == .leftRotate || self == .rightRotate
  35. }
  36. func isReverse() -> Bool {
  37. return self == .reverseX || self == .reverseY
  38. }
  39. func isAlign() -> Bool {
  40. return self.isHorAlign() || self.isVerAlign()
  41. }
  42. func isHorAlign() -> Bool {
  43. return self == .alignmentLeft || self == .alignmentCenterX || self == .alignmentRight || self == .alignmentjustifiedX
  44. }
  45. func isVerAlign() -> Bool {
  46. return self == .alignmentTop || self == .alignmentCenterY || self == .alignmentBottom || self == .alignmentjustifiedY
  47. }
  48. }
  49. class KMEditPDFToolbarModel: NSObject {
  50. var itemKey: KMEditPDFToolbarItemKey = .none
  51. var isEnabled = true
  52. var isSelected = false
  53. var fontName: String?
  54. var state: NSControl.StateValue = .mixed
  55. var textAlign: NSTextAlignment = .center
  56. }
  57. class KMSeparatorLineView: NSView {
  58. var strokeColor: NSColor = .black {
  59. didSet {
  60. self.needsDisplay = true
  61. }
  62. }
  63. override func draw(_ dirtyRect: NSRect) {
  64. super.draw(dirtyRect)
  65. let rect = self.bounds
  66. let ctx = NSGraphicsContext.current?.cgContext
  67. ctx?.saveGState()
  68. ctx?.setLineWidth(1)
  69. ctx?.setStrokeColor(self.strokeColor.cgColor)
  70. let startP = NSPoint(x: rect.size.width*0.5, y: 6+2)
  71. ctx?.move(to: startP)
  72. let endP = NSPoint(x: rect.size.width*0.5, y: rect.size.height-8)
  73. ctx?.addLine(to: endP)
  74. ctx?.strokePath()
  75. ctx?.restoreGState()
  76. }
  77. }
  78. struct KMEditPDFToolbarStyle: OptionSet {
  79. let rawValue: Int
  80. static var text = KMEditPDFToolbarStyle(rawValue: 1 << 0)
  81. static var image = KMEditPDFToolbarStyle(rawValue: 1 << 1)
  82. }
  83. class KMEditPDFPopToolBarController: NSViewController {
  84. deinit {
  85. KMPrint("KMEditPDFPopToolBarController deinit.")
  86. }
  87. convenience init() {
  88. self.init(nibName: "KMEditPDFPopToolBarController", bundle: nil)
  89. }
  90. var toolbarView: KMEditPDFToolbarView?
  91. var itemKeys: [KMEditPDFToolbarItemKey] = [] {
  92. didSet {
  93. // self.toolbarView?.reloadData()
  94. }
  95. }
  96. var datas: [KMEditPDFToolbarModel] = [] {
  97. didSet {
  98. self.toolbarView?.reloadData()
  99. }
  100. }
  101. var fontColor: NSColor?
  102. var fontName: String?
  103. var areaCount: Int = 0
  104. var itemClick: ((KMEditPDFToolbarItemKey, Any?)->Void)?
  105. private weak var popover_: NSPopover?
  106. override func viewWillAppear() {
  107. super.viewWillAppear()
  108. self.interfaceThemeDidChanged(NSApp.appearance?.name ?? .aqua)
  109. }
  110. override func viewDidLoad() {
  111. super.viewDidLoad()
  112. // Do view setup here.
  113. // self.interfaceThemeDidChanged(NSApp.appearance?.name ?? .aqua)
  114. let toolbarView = KMEditPDFToolbarView()
  115. self.toolbarView = toolbarView
  116. toolbarView.frame = self.view.bounds
  117. toolbarView.autoresizingMask = [.width, .height]
  118. self.view.addSubview(toolbarView)
  119. toolbarView.delegate = self
  120. toolbarView.inset = .init(top: 6, left: 4, bottom: 0, right: 0)
  121. toolbarView.reloadData()
  122. }
  123. override func viewDidDisappear() {
  124. super.viewDidDisappear()
  125. let itemView = (self.toolbarView?.itemViews.safe_element(for: 1) as? KMEditPDFToolbarItemView)
  126. (itemView?.obj as? KMDesignSelect)?.createFilePopover.close()
  127. self.popover_?.close()
  128. }
  129. @objc func _buttonClick(_ sender: NSButton) {
  130. let idx = sender.tag
  131. if idx >= 0 && idx < self.itemKeys.count {
  132. let key = self.itemKeys[idx]
  133. self.itemClick?(key, sender)
  134. let itemView = (self.toolbarView?.itemViews.safe_element(for: idx) as? KMEditPDFToolbarItemView)
  135. let viewC = (itemView?.obj as? KMDesignButton)
  136. if key == .fontAdd || key == .fontReduce {
  137. } else {
  138. let state = viewC?.state ?? .None
  139. if state == .Act {
  140. viewC?.state = .Norm
  141. } else {
  142. viewC?.state = .Act
  143. }
  144. }
  145. self._trackEvent(key: key, style: self._fetchStyle())
  146. }
  147. }
  148. @objc func alignmentItemClick(_ sender: NSButton) {
  149. self._trackEvent(key: .alignmentTop, style: self._fetchStyle())
  150. let key = self.itemKeys.safe_element(for: sender.tag) as? KMEditPDFToolbarItemKey ?? .none
  151. let isHor = (key == .alignmentLeft || key == .alignmentCenterX || key == .alignmentRight || key == .alignmentjustifiedX)
  152. let vc = KMAlignmentController(withIsHor: isHor, areaCount: self.areaCount)
  153. let createFilePopover: NSPopover = NSPopover.init()
  154. createFilePopover.contentViewController = vc
  155. // createFilePopover.delegate = self
  156. createFilePopover.animates = true
  157. createFilePopover.behavior = .semitransient
  158. createFilePopover.setValue(true, forKey: "shouldHideAnchor")
  159. 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)
  160. self.popover_ = createFilePopover
  161. vc.itemAction = { [weak self] idx, _ in
  162. var key: KMEditPDFToolbarItemKey = .none
  163. if idx == 0 {
  164. key = isHor ? .alignmentLeft : .alignmentTop
  165. } else if idx == 1 {
  166. key = isHor ? .alignmentCenterX : .alignmentCenterY
  167. } else if idx == 2 {
  168. key = isHor ? .alignmentRight : .alignmentBottom
  169. } else if idx == 3 {
  170. key = isHor ? .alignmentjustifiedX : .alignmentjustifiedY
  171. }
  172. self?.itemClick?(key, nil)
  173. let model = self?.datas.safe_element(for: sender.tag) as? KMEditPDFToolbarModel
  174. model?.itemKey = key
  175. self?.toolbarView?.reloadData()
  176. self?.popover_?.close()
  177. }
  178. }
  179. @objc func textAlignmentItemClick(_ sender: NSButton) {
  180. self._trackEvent(key: .textAlignment)
  181. let itemView = (self.toolbarView?.itemViews.safe_element(for: sender.tag) as? KMEditPDFToolbarItemView)
  182. let viewC = (itemView?.obj as? KMDesignButton)
  183. viewC?.state = .Act
  184. let vc = KMTextAlignmentController(nibName: "KMTextAlignmentController", bundle: nil)
  185. vc.view.appearance = self.view.appearance
  186. let createFilePopover: NSPopover = NSPopover.init()
  187. createFilePopover.contentViewController = vc
  188. // createFilePopover.delegate = self
  189. createFilePopover.animates = true
  190. createFilePopover.behavior = .semitransient
  191. createFilePopover.setValue(true, forKey: "shouldHideAnchor")
  192. 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)
  193. let model = self.datas.safe_element(for: sender.tag) as? KMEditPDFToolbarModel
  194. vc.align = model?.textAlign ?? .center
  195. self.popover_ = createFilePopover
  196. vc.itemAction = { [weak self] idx, _ in
  197. viewC?.state = .Norm
  198. var data: NSTextAlignment = .left
  199. if idx == 0 {
  200. data = .left
  201. } else if idx == 1 {
  202. data = .center
  203. } else if idx == 2 {
  204. data = .right
  205. }
  206. self?.itemClick?(.textAlignment, data)
  207. self?.popover_?.close()
  208. let model = self?.datas.safe_element(for: sender.tag) as? KMEditPDFToolbarModel
  209. model?.textAlign = data
  210. // self?.toolbarView?.reloadData()
  211. if data == .left {
  212. viewC?.image = NSImage(named: "KMImageNameEditPDFAlignLeftSelect")!
  213. } else if data == .center {
  214. viewC?.image = NSImage(named: "KMImageNameEditPDFAlignCenterSelect")!
  215. } else if data == .right {
  216. viewC?.image = NSImage(named: "KMImageNameEditPDFAlignRightSelect")!
  217. }
  218. }
  219. }
  220. @objc func colorPanelAction(_ sender: NSColorPanel) {
  221. let color = sender.color
  222. let colorView = (self.toolbarView?.itemViews.first as? KMEditPDFToolbarItemView)?.view as? KMEditPDFColorView
  223. colorView?.colorBtn.image = nil
  224. colorView?.colorBtn.layer?.backgroundColor = color.cgColor
  225. self.itemClick?(.color, color)
  226. }
  227. override func interfaceThemeDidChanged(_ appearance: NSAppearance.Name) {
  228. super.interfaceThemeDidChanged(appearance)
  229. self.view.wantsLayer = true
  230. if appearance == .darkAqua {
  231. self.view.layer?.backgroundColor = NSColor(red: 37/255.0, green: 37/255.0, blue: 38/255.0, alpha: 1.0).cgColor
  232. } else {
  233. self.view.layer?.backgroundColor = .white
  234. }
  235. Task { @MainActor in
  236. self.toolbarView?.reloadData()
  237. }
  238. }
  239. // MARK: - Track Events
  240. private func _trackEvent(key: KMEditPDFToolbarItemKey, style: KMEditPDFToolbarStyle = []) {
  241. let catetoryString = "SubTbr_EditPDF"
  242. let label_text = "SubTbr_EditText"
  243. let label_image = "SubTbr_EditImage"
  244. // Text
  245. if key == .color {
  246. let eventString = "SubTbr_EditText_FloatBar_Color"
  247. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_text : eventString])
  248. } else if key == .fontStyle {
  249. let eventString = "SubTbr_EditText_FloatBar_FontStyle"
  250. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_text : eventString])
  251. } else if key == .fontAdd || key == .fontReduce {
  252. let eventString = "SubTbr_EditText_FloatBar_FontSize"
  253. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_text : eventString])
  254. } else if key == .fontBold {
  255. let eventString = "SubTbr_EditText_FloatBar_Bold"
  256. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_text : eventString])
  257. } else if key == .fontItalic {
  258. let eventString = "SubTbr_EditText_FloatBar_Italic"
  259. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_text : eventString])
  260. } else if key == .textAlignment {
  261. let eventString = "SubTbr_EditText_FloatBar_AlignText"
  262. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_text : eventString])
  263. }
  264. // Image
  265. else if key.isRotate() {
  266. let eventString = "SubTbr_EditImage_FloatBar_Rotate"
  267. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_image : eventString])
  268. } else if key.isReverse() {
  269. let eventString = "SubTbr_EditImage_FloatBar_Flip"
  270. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_image : eventString])
  271. } else if key == .crop {
  272. let eventString = "SubTbr_EditImage_FloatBar_Crop"
  273. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_image : eventString])
  274. } else if key == .replace {
  275. let eventString = "SubTbr_EditImage_FloatBar_Replace"
  276. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_image : eventString])
  277. } else if key == .export {
  278. let eventString = "SubTbr_EditImage_FloatBar_Export"
  279. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_image : eventString])
  280. }
  281. // 对齐
  282. else if key.isAlign() {
  283. if style.contains(.text) && style.contains(.image) {
  284. let eventString = "SubTbr_EditContent_AlignContent"
  285. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_text : eventString])
  286. } else if style.contains(.text) {
  287. let eventString = "SubTbr_EditText_FloatBar_AlignTextBoxes"
  288. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_text : eventString])
  289. } else if style.contains(.image) {
  290. let eventString = "SubTbr_EditImage_FloatBar_Align"
  291. kTrackEventManager.trackEvent(event: catetoryString, withProperties: [label_image : eventString])
  292. }
  293. }
  294. }
  295. private func _fetchStyle() -> KMEditPDFToolbarStyle {
  296. var style: KMEditPDFToolbarStyle = []
  297. if let data = self.itemKeys.first {
  298. if data == .color {
  299. style.insert(.text)
  300. } else if data.isRotate() {
  301. style.insert(.image)
  302. } else if data.isAlign() {
  303. style.insert(.text)
  304. style.insert(.image)
  305. }
  306. }
  307. return style
  308. }
  309. }
  310. extension KMEditPDFPopToolBarController: KMEditPDFToolbarViewDelegate {
  311. func numberOfItems(in toolbarView: KMEditPDFToolbarView) -> Int {
  312. return self.datas.count
  313. }
  314. func toolbarView(_ toolbarView: KMEditPDFToolbarView, viewFor index: Int) -> NSView? {
  315. let model = self.datas[index]
  316. let itemKey = model.itemKey
  317. if itemKey == .color {
  318. let colorView = KMEditPDFToolbarItemView()
  319. let view = KMEditPDFColorView()
  320. // view.isEnabled = model.isEnabled
  321. if model.isEnabled {
  322. view.colorBtn.layer?.backgroundColor = self.fontColor?.cgColor
  323. } else {
  324. view.colorBtn.layer?.backgroundColor = .clear
  325. view.colorBtn.image = NSImage(named: "KMImageNameEditPDFColorDisabled")
  326. }
  327. view.itemClick = { [weak self] idx, _ in
  328. self?._trackEvent(key: .color)
  329. let panel = NSColorPanel.shared
  330. panel.setTarget(self)
  331. panel.setAction(#selector(self?.colorPanelAction))
  332. panel.orderFront(nil)
  333. }
  334. colorView.view = view
  335. return colorView
  336. } else if itemKey == .fontStyle {
  337. let fontStyleView = KMEditPDFToolbarItemView()
  338. let viewC = KMDesignSelect.init(withType: .Combox)
  339. viewC.isScrollPop = true
  340. viewC.showVerticalScroller = true
  341. fontStyleView.view = viewC.view
  342. fontStyleView.obj = viewC
  343. viewC.borderColor = KMAppearance.Interactive.s0Color()
  344. viewC.background = KMAppearance.Layout.l1Color()
  345. viewC.background_hov = KMAppearance.Layout.l1Color()
  346. viewC.background_focus = KMAppearance.Layout.l1Color()
  347. viewC.textColor = KMAppearance.Layout.h1Color()
  348. viewC.textColor_hov = KMAppearance.Layout.h1Color()
  349. viewC.textColor_focus = KMAppearance.Layout.h1Color()
  350. if KMAppearance.isDarkMode() {
  351. let color = NSColor(hex: "#0E1114")
  352. viewC.popViewControllerBackground = color
  353. } else {
  354. let color = NSColor(hex: "#DADBDE")
  355. // viewC.popViewControllerBackground = color
  356. }
  357. // viewC.popViewControllerBackground = KMAppearance.Layout.bgColor()
  358. viewC.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  359. viewC.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  360. viewC.updateUI()
  361. let familyNames = CPDFFont.familyNames
  362. viewC.removeAllItems()
  363. viewC.addItems(withObjectValues: familyNames)
  364. if let data = model.fontName {
  365. viewC.stringValue = data
  366. } else {
  367. // viewC.selectItem(at: 0)
  368. viewC.stringValue = "--"
  369. }
  370. viewC.delete = self
  371. return fontStyleView
  372. } else if itemKey == .separator {
  373. let colorView = KMEditPDFToolbarItemView()
  374. let view = KMSeparatorLineView()
  375. view.strokeColor = KMAppearance.separatorLineColor()
  376. colorView.view = view
  377. return colorView
  378. } else if itemKey == .textAlignment {
  379. let colorView = KMEditPDFToolbarItemView()
  380. let viewC = KMDesignButton(withType: .Image)
  381. colorView.view = viewC.view
  382. colorView.obj = viewC
  383. viewC.pagination()
  384. if KMAppearance.isDarkMode() {
  385. viewC.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  386. viewC.background_sel = KMAppearance.Interactive.m1Color()
  387. } else {
  388. viewC.background_hov = NSColor(hex: "#EDEEF0")
  389. }
  390. viewC.tag = index
  391. viewC.target = self
  392. viewC.action = #selector(textAlignmentItemClick)
  393. if model.textAlign == .left {
  394. viewC.image = NSImage(named: "KMImageNameEditPDFAlignLeftSelect")!
  395. } else if model.textAlign == .center {
  396. viewC.image = NSImage(named: "KMImageNameEditPDFAlignCenterSelect")!
  397. } else if model.textAlign == .right {
  398. viewC.image = NSImage(named: "KMImageNameEditPDFAlignRightSelect")!
  399. }
  400. viewC.initDefaultValue()
  401. viewC.borderWidth = 0
  402. viewC.borderWidth_hov = 0
  403. viewC.borderWidth_act = 0
  404. if KMAppearance.isDarkMode() {
  405. viewC.background = NSColor.clear
  406. viewC.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  407. viewC.background_act = KMAppearance.Interactive.m1Color()
  408. } else {
  409. }
  410. DispatchQueue.main.async {
  411. viewC.state = model.isSelected ? .Act : .Norm
  412. }
  413. return colorView
  414. } else if itemKey.isAlign() {
  415. let itemView = KMEditPDFToolbarItemView()
  416. let viewC = KMDesignButton(withType: .Image)
  417. itemView.view = viewC.view
  418. itemView.obj = viewC
  419. viewC.pagination()
  420. if KMAppearance.isDarkMode() {
  421. viewC.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  422. viewC.background_sel = KMAppearance.Interactive.m1Color()
  423. } else {
  424. viewC.background_hov = NSColor(hex: "#EDEEF0")
  425. }
  426. viewC.tag = index
  427. viewC.state = model.isEnabled ? .Norm : .Disabled
  428. viewC.button.isEnabled = model.isEnabled
  429. viewC.target = self
  430. viewC.background_disabled = .clear
  431. viewC.borderColor_disabled = .clear
  432. let style = self._fetchStyle()
  433. if style.contains(.text) && style.contains(.image) {
  434. viewC.action = #selector(_buttonClick)
  435. } else {
  436. viewC.action = #selector(alignmentItemClick)
  437. }
  438. let hasTip = style.contains(.text) && style.contains(.image)
  439. if itemKey == .alignmentLeft {
  440. viewC.image = NSImage(named: "KMImageNameEditPDFImage45_1")!
  441. if hasTip {
  442. itemView.popToolTip = NSLocalizedString("Align left", comment: "")
  443. }
  444. } else if itemKey == .alignmentCenterX {
  445. viewC.image = NSImage(named: "KMImageNameEditPDFImage46_1")!
  446. if hasTip {
  447. itemView.popToolTip = NSLocalizedString("Align center", comment: "")
  448. }
  449. } else if itemKey == .alignmentRight {
  450. viewC.image = NSImage(named: "KMImageNameEditPDFImage47_1")!
  451. if hasTip {
  452. itemView.popToolTip = NSLocalizedString("Align right", comment: "")
  453. }
  454. } else if itemKey == .alignmentjustifiedX {
  455. viewC.image = NSImage(named: "KMImageNameEditPDFImage21_1")!
  456. viewC._image_disabled = NSImage(named: "KMImageNameEditPDFImage21")!
  457. if hasTip {
  458. itemView.popToolTip = NSLocalizedString("Align both ends", comment: "")
  459. }
  460. } else if itemKey == .alignmentTop {
  461. viewC.image = NSImage(named: "KMImageNameEditPDFImage48_1")!
  462. if hasTip {
  463. itemView.popToolTip = NSLocalizedString("Align top", comment: "")
  464. }
  465. } else if itemKey == .alignmentCenterY {
  466. viewC.image = NSImage(named: "KMImageNameEditPDFImage49_1")!
  467. if hasTip {
  468. itemView.popToolTip = NSLocalizedString("Align center in vertical", comment: "")
  469. }
  470. } else if itemKey == .alignmentBottom {
  471. viewC.image = NSImage(named: "KMImageNameEditPDFImage50_1")!
  472. if hasTip {
  473. itemView.popToolTip = NSLocalizedString("Align bottom", comment: "")
  474. }
  475. } else if itemKey == .alignmentjustifiedY {
  476. viewC.image = NSImage(named: "KMImageNameEditPDFImage20_1")!
  477. viewC._image_disabled = NSImage(named: "KMImageNameEditPDFImage20")!
  478. if hasTip {
  479. itemView.popToolTip = NSLocalizedString("Align ends in vertical", comment: "")
  480. }
  481. }
  482. viewC.updateUI()
  483. return itemView
  484. }
  485. let colorView = KMEditPDFToolbarItemView()
  486. let viewC = KMDesignButton(withType: .Image)
  487. colorView.view = viewC.view
  488. colorView.obj = viewC
  489. viewC.pagination()
  490. if KMAppearance.isDarkMode() {
  491. viewC.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  492. } else {
  493. // viewC.background_hov = NSColor(hex: "#365898")
  494. }
  495. viewC.tag = index
  496. viewC.state = model.isEnabled ? .Norm : .Disabled
  497. viewC.button.isEnabled = model.isEnabled
  498. viewC.target = self
  499. viewC.action = #selector(_buttonClick)
  500. viewC.background_disabled = .clear
  501. viewC.borderColor_disabled = .clear
  502. if itemKey == .fontAdd {
  503. viewC.image = NSImage(named: "KMImageNameEditPDFFontAdd")!
  504. viewC.image_disabled = NSImage(named: "KMImageNameEditPDFFontAddDisabled")!
  505. colorView.popToolTip = NSLocalizedString("Larger font size", comment: "")
  506. } else if itemKey == .fontReduce {
  507. viewC.image = NSImage(named: "KMImageNameEditPDFFontReduce")!
  508. viewC.image_disabled = NSImage(named: "KMImageNameEditPDFFontReduceDisabled")!
  509. colorView.popToolTip = NSLocalizedString("Reduce font size", comment: "")
  510. } else if itemKey == .fontBold {
  511. viewC.image = NSImage(named: "KMImageNameEditPDFFontBold")!
  512. colorView.popToolTip = NSLocalizedString("Bold font", comment: "")
  513. // viewC.button.keyEquivalent = "b"
  514. // viewC.button.keyEquivalentModifierMask = [.control]
  515. viewC.initDefaultValue()
  516. viewC.borderWidth = 0
  517. viewC.borderWidth_hov = 0
  518. viewC.borderWidth_act = 0
  519. DispatchQueue.main.async {
  520. if model.isEnabled {
  521. viewC.state = model.isSelected ? .Act : .Norm
  522. } else {
  523. viewC.state = .Disabled
  524. }
  525. }
  526. if KMAppearance.isDarkMode() {
  527. viewC.background = NSColor.clear
  528. viewC.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  529. viewC.background_act = KMAppearance.Interactive.m1Color()
  530. } else {
  531. }
  532. } else if itemKey == .fontItalic {
  533. viewC.image = NSImage(named: "KMImageNameEditPDFFontItalic")!
  534. colorView.popToolTip = NSLocalizedString("Italic font", comment: "")
  535. viewC.initDefaultValue()
  536. viewC.borderWidth = 0
  537. viewC.borderWidth_hov = 0
  538. viewC.borderWidth_act = 0
  539. DispatchQueue.main.async {
  540. if model.isEnabled {
  541. viewC.state = model.isSelected ? .Act : .Norm
  542. } else {
  543. viewC.state = .Disabled
  544. }
  545. }
  546. if KMAppearance.isDarkMode() {
  547. viewC.background = NSColor.clear
  548. viewC.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  549. viewC.background_act = KMAppearance.Interactive.m1Color()
  550. } else {
  551. }
  552. } else if itemKey == .textAlignment {
  553. viewC.image = NSImage(named: "KMImageNameEditPDFAlignCenterSelect")!
  554. colorView.popToolTip = NSLocalizedString("Center text", comment: "")
  555. }
  556. // 图片
  557. else if itemKey == .leftRotate {
  558. viewC.image = NSImage(named: "KMImageNameEditPDFLeftRotateNew")!
  559. colorView.popToolTip = NSLocalizedString("Rotate left", comment: "")
  560. } else if itemKey == .rightRotate {
  561. viewC.image = NSImage(named: "KMImageNameEditPDFRightRotateNew")!
  562. colorView.popToolTip = NSLocalizedString("Rotate right", comment: "")
  563. } else if itemKey == .reverseX {
  564. viewC.image = NSImage(named: "KMImageNameEditPDFReverseX")!
  565. colorView.popToolTip = NSLocalizedString("Flip horizontal", comment: "")
  566. } else if itemKey == .reverseY {
  567. viewC.image = NSImage(named: "KMImageNameEditPDFReverseY")!
  568. colorView.popToolTip = NSLocalizedString("Flip vertical", comment: "")
  569. } else if itemKey == .crop {
  570. viewC.image = NSImage(named: "KMImageNameEditPDFCrop")!
  571. viewC.image_disabled = NSImage(named: "KMImageNameEditPDFCropDisabled")!
  572. colorView.popToolTip = NSLocalizedString("Crop", comment: "")
  573. } else if itemKey == .replace {
  574. viewC.image = NSImage(named: "KMImageNameEditPDFReplace")!
  575. viewC.image_disabled = NSImage(named: "KMImageNameEditPDFReplaceDisabled")!
  576. colorView.popToolTip = NSLocalizedString("Replace", comment: "")
  577. } else if itemKey == .export {
  578. viewC.image = NSImage(named: "KMImageNameEditPDFExport")!
  579. colorView.popToolTip = NSLocalizedString("Export file", comment: "")
  580. }
  581. viewC.updateUI()
  582. return colorView
  583. }
  584. func toolbarView(_ toolbarView: KMEditPDFToolbarView, sizeForItemAt index: Int) -> NSSize {
  585. let itemKey = self.itemKeys[index]
  586. if itemKey == .color {
  587. return NSMakeSize(56, 32)
  588. } else if itemKey == .fontStyle {
  589. return NSMakeSize(148, 32)
  590. } else if itemKey == .separator {
  591. return NSMakeSize(16, 32)
  592. }
  593. return NSMakeSize(32, 32)
  594. }
  595. }
  596. extension KMEditPDFPopToolBarController: KMSelectPopButtonDelegate {
  597. func km_SelectPopoverWillShow(_ obj: KMDesignSelect) {
  598. self._trackEvent(key: .fontStyle)
  599. }
  600. func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
  601. self.itemClick?(.fontStyle, obj.stringValue)
  602. }
  603. func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
  604. }
  605. }