KMEditPDFPopToolBarController.swift 24 KB

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