KMEditImagePropertyViewController.swift 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036
  1. //
  2. // KMEditImagePropertyViewController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by lxy on 2022/12/28.
  6. //
  7. import Cocoa
  8. public enum KMOperationState {
  9. case none
  10. case began
  11. case changed
  12. case ended
  13. }
  14. enum KMEditImagePropertyViewControllerChangeType {
  15. case rotate
  16. case flip
  17. case add
  18. case move
  19. }
  20. protocol KMEditImagePropertyViewControllerDelegate: NSObject {
  21. func editImagePropertyViewControllerDidChanged(controller: KMEditImagePropertyViewController, type: KMEditImagePropertyViewControllerChangeType)
  22. }
  23. class KMEditImagePropertyViewController: NSViewController {
  24. @IBOutlet weak var backgroundView: NSView!
  25. @IBOutlet weak var titleLabel: NSTextField!
  26. @IBOutlet weak var headerBox: NSBox!
  27. @IBOutlet weak var headerBoxHeight: NSLayoutConstraint!
  28. @IBOutlet weak var whTitleLabel: NSTextField!
  29. @IBOutlet weak var wTextFieldItemView: KMCustomTextField!
  30. @IBOutlet weak var whBox: NSBox!
  31. @IBOutlet weak var hTextFieldItemView: KMCustomTextField!
  32. var whVC: KMDesignButton?
  33. @IBOutlet weak var rotateTitleLabel: NSTextField!
  34. @IBOutlet weak var rotateTextFieldItemView: KMDesignTextField!
  35. @IBOutlet weak var leftRotateBox: NSBox!
  36. @IBOutlet weak var rightRotateBox: NSBox!
  37. var leftRotateVC: KMDesignButton?
  38. var rightRotateVC: KMDesignButton?
  39. @IBOutlet weak var opacityTitleLabel: NSTextField!
  40. @IBOutlet weak var opacitySlider: NSSlider!
  41. @IBOutlet weak var opacityBox: NSBox!
  42. @IBOutlet weak var opacityBoxBottomMaginConstraint: NSLayoutConstraint!
  43. @IBOutlet weak var opacityBoxTopConstraint: NSLayoutConstraint!
  44. @IBOutlet weak var turnOverBox: NSBox!
  45. @IBOutlet weak var turnOverTitleLabel: NSTextField!
  46. @IBOutlet weak var reverseXBox: NSView!
  47. @IBOutlet weak var reverseYBox: NSView!
  48. var reverseXVC: KMDesignButton?
  49. var reverseYVC: KMDesignButton?
  50. @IBOutlet weak var cropBox: NSBox!
  51. @IBOutlet weak var confirmBox: NSBox!
  52. @IBOutlet weak var cancelBox: NSBox!
  53. @IBOutlet weak var replaceBox: NSBox!
  54. @IBOutlet weak var exportBox: NSBox!
  55. @IBOutlet weak var opacityBoxHeight: NSLayoutConstraint!
  56. @IBOutlet weak var buttonBoxHeight: NSLayoutConstraint!
  57. @IBOutlet weak var buttonBox: NSBox!
  58. @IBOutlet weak var alignmentView: KMEditPropertyAlignmentView!
  59. @IBOutlet weak var alignmentViewTopConstraint: NSLayoutConstraint!
  60. //NO Image
  61. @IBOutlet weak var noImageView: NSImageView!
  62. @IBOutlet weak var noTitleLabel: NSTextField!
  63. @IBOutlet weak var noSubtitleLabel: NSTextField!
  64. @IBOutlet weak var noBackgroundView: NSView!
  65. var rotateLeftVC: KMDesignPropertySelector?
  66. var rotateRightVC: KMDesignPropertySelector?
  67. var flipHorizontalVC: KMDesignPropertySelector?
  68. var flipVerticalVC: KMDesignPropertySelector?
  69. var opacityVC: KMDesignSelect?
  70. @IBOutlet weak var toolsTitleLabel: NSTextField!
  71. var cropVC: KMDesignButton?
  72. var confirmVC: KMDesignButton?
  73. var cancelVC: KMDesignButton?
  74. var replaceVC: KMDesignButton?
  75. var exportVC: KMDesignButton?
  76. var imagesAreas : [CPDFEditImageArea] = []
  77. var listView : CPDFListView!
  78. var editingAreas: [Any] {
  79. get {
  80. return self.listView.editingAreas() ?? []
  81. }
  82. }
  83. weak var delegate: KMEditImagePropertyViewControllerDelegate?
  84. weak var handdler: KMEditPDfHanddler?
  85. static let keepProportionsKey = "KMEditPDFKeepProportionsKey"
  86. deinit {
  87. KMPrint("KMEditImagePropertyViewController deinit.")
  88. self.removeNotification()
  89. }
  90. override func viewDidLoad() {
  91. super.viewDidLoad()
  92. self.setup()
  93. self.initData()
  94. self.updateLanguage()
  95. self.updateButtonState(hidden: true)
  96. self.reloadData()
  97. self.addNotification()
  98. self.updateUI()
  99. }
  100. func initData() {
  101. self.updateButtonState(hidden: true)
  102. }
  103. func setup() {
  104. self.titleLabel.font = NSFont.SFProTextSemiboldFont(14.0)
  105. self.titleLabel.textColor = KMAppearance.Layout.h0Color()
  106. self.opacityTitleLabel.font = NSFont.SFProTextSemiboldFont(12.0)
  107. self.opacityTitleLabel.textColor = KMAppearance.Layout.h0Color()
  108. self.whTitleLabel.stringValue = NSLocalizedString("Size", comment: "")
  109. self.wTextFieldItemView.backgroundView.wantsLayer = true
  110. self.wTextFieldItemView.backgroundView.layer?.backgroundColor = .white
  111. self.wTextFieldItemView.backgroundView.layer?.borderWidth = 1
  112. self.wTextFieldItemView.backgroundView.layer?.borderColor = NSColor(hex: "#DFE1E5").cgColor
  113. self.wTextFieldItemView.backgroundView.layer?.cornerRadius = 4
  114. self.wTextFieldItemView.delegate = self
  115. self.wTextFieldItemView.offset = 8
  116. self.wTextFieldItemView.rightViewMode = .always
  117. let wRightView = NSView()
  118. wRightView.frame = NSMakeRect(0, 0, 24, 32)
  119. let wIv = NSImageView()
  120. wIv.frame = NSMakeRect(0, 8, 16, 16)
  121. wIv.image = NSImage(named: "KMImageNameEditPDFWidthIcon")
  122. wRightView.addSubview(wIv)
  123. self.wTextFieldItemView.rightView = wRightView
  124. var formatter = NumberFormatter()
  125. formatter.numberStyle = .decimal
  126. // formatter.maximum = NSNumber(value: 999)
  127. // formatter.minimum = NSNumber(value: 1)
  128. self.wTextFieldItemView.textFiled.formatter = formatter
  129. self.hTextFieldItemView.backgroundView.wantsLayer = true
  130. self.hTextFieldItemView.backgroundView.layer?.backgroundColor = .white
  131. self.hTextFieldItemView.backgroundView.layer?.borderWidth = 1
  132. self.hTextFieldItemView.backgroundView.layer?.borderColor = NSColor(hex: "#DFE1E5").cgColor
  133. self.hTextFieldItemView.backgroundView.layer?.cornerRadius = 4
  134. self.hTextFieldItemView.delegate = self
  135. self.hTextFieldItemView.textFiled.formatter = formatter
  136. let hRightView = NSView()
  137. hRightView.frame = NSMakeRect(0, 0, 24, 32)
  138. let hIv = NSImageView()
  139. hIv.frame = NSMakeRect(0, 8, 16, 16)
  140. hIv.image = NSImage(named: "KMImageNameEditPDFHeightIcon")
  141. hRightView.addSubview(hIv)
  142. self.hTextFieldItemView.rightView = hRightView
  143. self.hTextFieldItemView.rightViewMode = .always
  144. self.alignmentView.didChange = {[unowned self] view, areasArray, boundsArray in
  145. self._trackEvent()
  146. let textAreas = self.handdler?.editingTextAreas ?? []
  147. let imageAreas = self.handdler?.editingImageAreas ?? []
  148. if textAreas.count > 0 && imageAreas.count > 0 {
  149. self._trackAlignEvent()
  150. }
  151. self.changeAreasAlign(areas: areasArray, newBounds: boundsArray)
  152. }
  153. self.whVC = KMDesignButton(withType: .Image)
  154. self.whBox.contentView = self.whVC?.view
  155. self.whBox.borderWidth = 0
  156. self.whVC?.target = self
  157. self.whVC?.action = #selector(whAction)
  158. self.whVC?.image = NSImage(named: "KMImageNameEditPDFWhExchange")!
  159. self.whVC?.image_act = NSImage(named: "KMImageNameEditPDFWhExchangeSelected")!
  160. self.whVC?.pagination()
  161. whVC?.borderColor_hov = KMAppearance.Interactive.s0Color()
  162. whVC?.borderColor_act = KMAppearance.Interactive.s0Color()
  163. whVC?.borderColor_disabled = KMAppearance.Interactive.s0Color()
  164. whVC?.cornerRadius = 4
  165. whVC?.cornerRadius_hov = 4
  166. whVC?.cornerRadius_act = 4
  167. whVC?.cornerRadius_disabled = 4
  168. whVC?.background_hov = KMAppearance.view_bg_dis_color()
  169. whVC?.background_focus = KMAppearance.Layout.l1Color()
  170. whVC?.background_act = KMAppearance.buttonSelectedColor()
  171. whVC?.background_disabled = KMAppearance.buttonDisabledColor()
  172. self.whVC?.toolTip = NSLocalizedString("Keep Proportions", comment: "")
  173. self.whVC?.state = self._getKeepProportionsButtonState() ? .Act : .Norm
  174. self.rotateTitleLabel.stringValue = NSLocalizedString("Rotate", comment: "")
  175. self.rotateTextFieldItemView.delegate = self
  176. self.rotateTextFieldItemView.enterKeyEndEdit = true
  177. self.leftRotateVC = KMDesignButton(withType: .Image)
  178. self.leftRotateBox.contentView = self.leftRotateVC?.view
  179. self.leftRotateBox.borderWidth = 0
  180. self.leftRotateVC?.target = self
  181. self.leftRotateVC?.action = #selector(leftRotationImageAction)
  182. self.leftRotateVC?.image = NSImage(named: "KMImageNameEditPDFRotationLeft")!
  183. self.leftRotateVC?.pagination()
  184. leftRotateVC?.borderColor = KMAppearance.Interactive.s0Color()
  185. leftRotateVC?.background = KMAppearance.Layout.l1Color()
  186. leftRotateVC?.background_hov = KMAppearance.view_bg_dis_color()
  187. leftRotateVC?.background_focus = KMAppearance.Layout.l1Color()
  188. leftRotateVC?.textColor = KMAppearance.Layout.h1Color()
  189. leftRotateVC?.textColor_hov = KMAppearance.Layout.h1Color()
  190. leftRotateVC?.textColor_focus = KMAppearance.Layout.h1Color()
  191. leftRotateVC?.borderColor_hov = KMAppearance.Interactive.s0Color()
  192. leftRotateVC?.updateUI()
  193. self.rightRotateVC = KMDesignButton(withType: .Image)
  194. self.rightRotateBox.contentView = self.rightRotateVC?.view
  195. self.rightRotateBox.borderWidth = 0
  196. self.rightRotateVC?.target = self
  197. self.rightRotateVC?.action = #selector(rightRotationImageAction)
  198. self.rightRotateVC?.image = NSImage(named: "KMImageNameEditPDFRotationRight")!
  199. self.rightRotateVC?.pagination()
  200. rightRotateVC?.borderColor = KMAppearance.Interactive.s0Color()
  201. rightRotateVC?.background = KMAppearance.Layout.l1Color()
  202. rightRotateVC?.background_hov = KMAppearance.view_bg_dis_color()
  203. rightRotateVC?.background_focus = KMAppearance.Layout.l1Color()
  204. rightRotateVC?.textColor = KMAppearance.Layout.h1Color()
  205. rightRotateVC?.textColor_hov = KMAppearance.Layout.h1Color()
  206. rightRotateVC?.textColor_focus = KMAppearance.Layout.h1Color()
  207. rightRotateVC?.borderColor_hov = KMAppearance.Interactive.s0Color()
  208. rightRotateVC?.updateUI()
  209. opacityVC = KMDesignSelect.init(withType: .PopButton)
  210. opacityBox.contentView = opacityVC?.view
  211. opacityBox.fillColor = KMAppearance.Layout.bgDrakColor()
  212. opacityVC?.addItems(withObjectValues: ["25%","50%","75%","100%"])
  213. opacityVC?.selectItem(at: 0)
  214. opacityVC?.delete = self
  215. opacityVC?.borderColor = KMAppearance.Interactive.s0Color()
  216. opacityVC?.borderColor_disabled = KMAppearance.Interactive.s0Color()
  217. opacityVC?.background = KMAppearance.Layout.l1Color()
  218. opacityVC?.background_hov = KMAppearance.Layout.l1Color()
  219. opacityVC?.background_focus = KMAppearance.Layout.l1Color()
  220. opacityVC?.background_disabled = KMAppearance.Layout.l1Color()
  221. opacityVC?.textColor = KMAppearance.Layout.h1Color()
  222. opacityVC?.textColor_hov = KMAppearance.Layout.h1Color()
  223. opacityVC?.textColor_focus = KMAppearance.Layout.h1Color()
  224. opacityVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  225. opacityVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  226. opacityVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  227. opacityVC?.updateUI()
  228. let customCell = CustomSliderCell()
  229. customCell.knobImage = NSImage(named: "KMImageNameEditPDFSlider")
  230. opacitySlider.cell = customCell
  231. opacitySlider.target = self
  232. opacitySlider.action = #selector(sliderValueChanged(_:))
  233. opacitySlider.isContinuous = false
  234. self.turnOverTitleLabel.stringValue = NSLocalizedString("Flip", comment: "")
  235. self.reverseXVC = KMDesignButton(withType: .Image)
  236. self.reverseXBox.addSubview(self.reverseXVC!.view)
  237. self.reverseXVC?.view.frame = self.reverseXBox.bounds
  238. self.reverseXVC?.view.autoresizingMask = [.width, .height]
  239. self.reverseXVC?.target = self
  240. self.reverseXVC?.action = #selector(flipHorizontalImageAction)
  241. self.reverseXVC?.image = NSImage(named: "KMImageNameEditPDFReverseX")!
  242. self.reverseXVC?.pagination()
  243. reverseXVC?.borderColor = KMAppearance.Interactive.s0Color()
  244. reverseXVC?.background = KMAppearance.Layout.l1Color()
  245. reverseXVC?.background_hov = KMAppearance.view_bg_dis_color()
  246. reverseXVC?.background_focus = KMAppearance.Layout.l1Color()
  247. reverseXVC?.textColor = KMAppearance.Layout.h1Color()
  248. reverseXVC?.textColor_hov = KMAppearance.Layout.h1Color()
  249. reverseXVC?.textColor_focus = KMAppearance.Layout.h1Color()
  250. reverseXVC?.borderColor_hov = KMAppearance.Interactive.s0Color()
  251. reverseXVC?.updateUI()
  252. self.reverseYVC = KMDesignButton(withType: .Image)
  253. self.reverseYBox.addSubview(self.reverseYVC!.view)
  254. self.reverseYVC?.view.frame = self.reverseXBox.bounds
  255. self.reverseYVC?.view.autoresizingMask = [.width, .height]
  256. self.reverseYVC?.target = self
  257. self.reverseYVC?.action = #selector(flipVerticalImageAction)
  258. self.reverseYVC?.image = NSImage(named: "KMImageNameEditPDFReverseY")!
  259. self.reverseYVC?.pagination()
  260. reverseYVC?.borderColor = KMAppearance.Interactive.s0Color()
  261. reverseYVC?.background = KMAppearance.Layout.l1Color()
  262. reverseYVC?.background_hov = KMAppearance.view_bg_dis_color()
  263. reverseYVC?.background_focus = KMAppearance.Layout.l1Color()
  264. reverseYVC?.textColor = KMAppearance.Layout.h1Color()
  265. reverseYVC?.textColor_hov = KMAppearance.Layout.h1Color()
  266. reverseYVC?.textColor_focus = KMAppearance.Layout.h1Color()
  267. reverseYVC?.borderColor_hov = KMAppearance.Interactive.s0Color()
  268. reverseYVC?.updateUI()
  269. self.toolsTitleLabel.stringValue = NSLocalizedString("Tools", comment: "")
  270. cropVC = KMDesignButton.init(withType: .Text)
  271. cropBox.contentView = cropVC?.view
  272. cropBox.fillColor = NSColor.clear
  273. cropVC?.target = self
  274. cropVC?.action = #selector(cutImageAction)
  275. cropVC?.button(type: .Sec, size: .m)
  276. cropVC?.stringValue = NSLocalizedString("Crop", comment: "")
  277. cropVC?.borderColor = KMAppearance.Interactive.s0Color()
  278. cropVC?.background = KMAppearance.Layout.l1Color()
  279. cropVC?.background_hov = KMAppearance.Layout.l1Color()
  280. cropVC?.background_focus = KMAppearance.Layout.l1Color()
  281. cropVC?.textColor = KMAppearance.Layout.h1Color()
  282. cropVC?.textColor_hov = KMAppearance.Layout.h1Color()
  283. cropVC?.textColor_focus = KMAppearance.Layout.h1Color()
  284. cropVC?.updateUI()
  285. confirmVC = KMDesignButton.init(withType: .Text)
  286. confirmBox.contentView = confirmVC?.view
  287. confirmBox.fillColor = NSColor.clear
  288. confirmVC?.target = self
  289. confirmVC?.action = #selector(confirmVCImageAction)
  290. confirmVC?.button(type: .Cta, size: .m)
  291. confirmVC?.stringValue = NSLocalizedString("Confirm", comment: "")
  292. confirmVC?.updateUI()
  293. cancelVC = KMDesignButton.init(withType: .Text)
  294. cancelBox.contentView = cancelVC?.view
  295. cancelBox.fillColor = NSColor.clear
  296. cancelVC?.target = self
  297. cancelVC?.action = #selector(cancelCutImageAction)
  298. cancelVC?.button(type: .Sec, size: .m)
  299. cancelVC?.stringValue = NSLocalizedString("Cancel", comment: "")
  300. cancelVC?.borderColor = KMAppearance.Interactive.s0Color()
  301. cancelVC?.background = KMAppearance.Layout.l1Color()
  302. cancelVC?.background_hov = KMAppearance.Layout.l1Color()
  303. cancelVC?.background_focus = KMAppearance.Layout.l1Color()
  304. cancelVC?.textColor = KMAppearance.Layout.h1Color()
  305. cancelVC?.textColor_hov = KMAppearance.Layout.h1Color()
  306. cancelVC?.textColor_focus = KMAppearance.Layout.h1Color()
  307. cancelVC?.updateUI()
  308. replaceVC = KMDesignButton.init(withType: .Text)
  309. replaceBox.contentView = replaceVC?.view
  310. replaceBox.fillColor = NSColor.clear
  311. replaceVC?.target = self
  312. replaceVC?.action = #selector(replaceImageAction)
  313. replaceVC?.button(type: .Sec, size: .m)
  314. replaceVC?.stringValue = NSLocalizedString("Replace", comment: "")
  315. replaceVC?.borderColor = KMAppearance.Interactive.s0Color()
  316. replaceVC?.borderColor_hov = KMAppearance.Interactive.s0Color()
  317. // replaceVC?.borderColor_disabled = KMAppearance.Interactive.s0Color()
  318. replaceVC?.background = KMAppearance.Layout.l1Color()
  319. replaceVC?.background_hov = KMAppearance.Layout.l1Color()
  320. replaceVC?.background_focus = KMAppearance.Layout.l1Color()
  321. // replaceVC?.background_disabled = KMAppearance.Layout.l1Color()
  322. replaceVC?.textColor = KMAppearance.Layout.h1Color()
  323. replaceVC?.textColor_hov = KMAppearance.Layout.h1Color()
  324. replaceVC?.textColor_focus = KMAppearance.Layout.h1Color()
  325. replaceVC?.updateUI()
  326. exportVC = KMDesignButton.init(withType: .Text)
  327. exportBox.contentView = exportVC?.view
  328. exportBox.fillColor = NSColor.clear
  329. exportVC?.target = self
  330. exportVC?.action = #selector(exportImageAction)
  331. exportVC?.button(type: .Sec, size: .m)
  332. exportVC?.stringValue = NSLocalizedString("Export", comment: "")
  333. exportVC?.borderColor = KMAppearance.Interactive.s0Color()
  334. exportVC?.borderColor_hov = KMAppearance.Interactive.s0Color()
  335. exportVC?.borderColor_disabled = KMAppearance.Interactive.s0Color()
  336. exportVC?.background = KMAppearance.Layout.l1Color()
  337. exportVC?.background_hov = KMAppearance.Layout.l1Color()
  338. exportVC?.background_focus = KMAppearance.Layout.l1Color()
  339. exportVC?.background_disabled = KMAppearance.Layout.l1Color()
  340. exportVC?.textColor = KMAppearance.Layout.h1Color()
  341. exportVC?.textColor_hov = KMAppearance.Layout.h1Color()
  342. exportVC?.textColor_focus = KMAppearance.Layout.h1Color()
  343. exportVC?.updateUI()
  344. self.noTitleLabel.textColor = KMAppearance.Layout.h1Color()
  345. self.noTitleLabel.font = NSFont.SFProTextRegularFont(14)
  346. self.noImageView.image = NSImage(named: "No_addimage")
  347. self.noImageView.alphaValue = 0.4
  348. let string = self.noSubtitleLabel.stringValue
  349. let paragraphStyle = NSMutableParagraphStyle()
  350. paragraphStyle.lineHeightMultiple = 1.32
  351. paragraphStyle.alignment = .center
  352. self.noSubtitleLabel.attributedStringValue = NSMutableAttributedString(string: NSLocalizedString(string, comment: ""), attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle, .foregroundColor : NSColor.km_init(hex: "#94989C"), NSAttributedString.Key.font: NSFont.SFProTextRegularFont(12.0)])
  353. self.noBackgroundView.backgroundColor(NSColor.km_init(hex: "#F7F8FA"))
  354. }
  355. func addNotification() {
  356. NotificationCenter.default.addObserver(self, selector: #selector(changeEffectiveAppearance), name: NSNotification.Name(rawValue: "kEffectiveAppearance"), object: nil)
  357. }
  358. func removeNotification() {
  359. NotificationCenter.default.removeObserver(self)
  360. DistributedNotificationCenter.default().removeObserver(self)
  361. }
  362. @objc func changeEffectiveAppearance() {
  363. let isDarkModel = KMAdvertisementConfig.isDarkModel()
  364. if isDarkModel {
  365. self.view.appearance = NSAppearance(named: .darkAqua)
  366. } else {
  367. self.view.appearance = NSAppearance(named: .aqua)
  368. }
  369. self.updateUI()
  370. }
  371. func updateUI() {
  372. let isDarkModel = KMAdvertisementConfig.isDarkModel()
  373. if isDarkModel {
  374. self.backgroundView.backgroundColor(NSColor.km_init(hex: "#252526"))
  375. self.noBackgroundView.backgroundColor(NSColor.km_init(hex: "#252526"))
  376. } else {
  377. self.backgroundView.backgroundColor(NSColor.km_init(hex: "#FAFAFA"))
  378. self.noBackgroundView.backgroundColor(NSColor.km_init(hex: "#F7F8FA"))
  379. }
  380. for label in [self.whTitleLabel, self.opacityTitleLabel,
  381. self.turnOverTitleLabel] {
  382. label?.font = NSFont.SFProTextSemiboldFont(12.0)
  383. label?.textColor = NSColor.km_init(hex: "#616469")
  384. }
  385. }
  386. func updateLanguage() {
  387. let areas = self.editingAreas
  388. if imagesAreas.count > 0 && imagesAreas.count != areas.count { //多选图片跟文字
  389. self.titleLabel.stringValue = NSLocalizedString("General Properties", comment: "")
  390. } else {
  391. self.titleLabel.stringValue = NSLocalizedString("Image", comment: "")
  392. }
  393. self.noTitleLabel.stringValue = NSLocalizedString("Add Image", comment: "")
  394. self.opacityTitleLabel.stringValue = NSLocalizedString("Opacity", comment: "")
  395. self.cropVC?.stringValue = NSLocalizedString("Crop", comment: "")
  396. self.confirmVC?.stringValue = NSLocalizedString("Confirm", comment: "")
  397. self.cancelVC?.stringValue = NSLocalizedString("Cancel", comment: "")
  398. self.replaceVC?.stringValue = NSLocalizedString("Replace", comment: "")
  399. self.exportVC?.stringValue = NSLocalizedString("Export", comment: "")
  400. }
  401. func reloadData() {
  402. imagesAreas = []
  403. if self.editingAreas.count > 0 {
  404. self.noBackgroundView.isHidden = true
  405. let areas = self.editingAreas
  406. self.alignmentView.editingAreas = areas
  407. for i in 0 ... areas.count-1 {
  408. if areas[i] is CPDFEditImageArea {
  409. imagesAreas.append(areas[i] as! CPDFEditImageArea)
  410. }
  411. }
  412. if imagesAreas.count == 1 && imagesAreas.count == areas.count{ //单个图片
  413. self.listView.selectImageAreas = imagesAreas.first
  414. self.headerBox.isHidden = false
  415. self.headerBoxHeight.constant = 176
  416. self.opacityBox.isHidden = false
  417. self.opacityBoxHeight.constant = 56
  418. self.opacityBoxBottomMaginConstraint.constant = 66
  419. self.opacityBoxTopConstraint.constant = 16
  420. self.buttonBox.isHidden = false
  421. self.buttonBoxHeight.constant = 112+16+8
  422. self.alignmentViewTopConstraint.constant = 16
  423. let opacity: CGFloat = self.listView.opacity(for: imagesAreas.first)
  424. self.updateImageAreasOpacity(opacity: opacity, state: .ended, needListView: false)
  425. self.turnOverBox.isHidden = false
  426. self.opacityTitleLabel.isHidden = false
  427. self.whVC?.state = self._getKeepProportionsButtonState() ? .Act : .Norm
  428. self.cropVC?.state = .Norm
  429. self.replaceVC?.state = .Norm
  430. } else if imagesAreas.count > 1 && imagesAreas.count == areas.count { //多选图片
  431. self.headerBox.isHidden = false
  432. self.headerBoxHeight.constant = 176
  433. self.opacityBox.isHidden = false
  434. self.opacityBoxHeight.constant = 56
  435. self.opacityBoxBottomMaginConstraint.constant = 66
  436. self.opacityBoxTopConstraint.constant = 0
  437. self.buttonBox.isHidden = false
  438. self.buttonBoxHeight.constant = 112+16+8
  439. self.alignmentViewTopConstraint.constant = 16
  440. var opacity = self.listView.opacity(for: imagesAreas.first)
  441. for area in imagesAreas {
  442. let newOpacity = self.listView.opacity(for: area)
  443. if (opacity < newOpacity) {
  444. opacity = newOpacity
  445. }
  446. }
  447. self.updateImageAreasOpacity(opacity: opacity, state: .ended, needListView: false)
  448. self.turnOverBox.isHidden = false
  449. self.opacityTitleLabel.isHidden = false
  450. self.whVC?.state = .Disabled
  451. self.cropVC?.state = .Disabled
  452. self.replaceVC?.state = .Disabled
  453. if let data = self.handdler?.editAreasOpacityIsEqual(), data {
  454. self.opacitySlider.isEnabled = true
  455. self.opacityVC?.state = .Norm
  456. } else {
  457. self.opacitySlider.isEnabled = true
  458. self.opacityVC?.state = .Norm
  459. self.opacitySlider.doubleValue = 0
  460. self.opacityVC?.stringValue = "--";
  461. }
  462. } else if imagesAreas.count > 0 && imagesAreas.count != areas.count { //多选图片跟文字
  463. self.opacityBoxBottomMaginConstraint.constant = 8
  464. self.alignmentViewTopConstraint.constant = 0
  465. self.opacityBoxTopConstraint.constant = 0
  466. self.headerBoxHeight.constant = 40
  467. self.opacityBox.isHidden = true
  468. self.opacityBoxHeight.constant = 0
  469. self.buttonBox.isHidden = true
  470. self.buttonBoxHeight.constant = 0
  471. self.turnOverBox.isHidden = true
  472. self.opacityTitleLabel.isHidden = true
  473. }
  474. self.updateLanguage()
  475. } else {
  476. self.noBackgroundView.isHidden = false
  477. }
  478. self.updateWHData()
  479. self.updateRotateData()
  480. }
  481. func updateButtonState(hidden: Bool) {
  482. if hidden {
  483. self.cancelBox.isHidden = true
  484. self.confirmBox.isHidden = true
  485. self.cropBox.isHidden = false
  486. self.replaceVC?.enabled = true
  487. self.exportVC?.enabled = true
  488. self.opacitySlider.isEnabled = true
  489. self.opacityVC?.enabled = true
  490. self.rotateLeftVC?.button.isEnabled = true
  491. self.rotateLeftVC?.view.alphaValue = 1.0
  492. self.rotateRightVC?.button.isEnabled = true
  493. self.rotateRightVC?.view.alphaValue = 1.0
  494. self.flipVerticalVC?.button.isEnabled = true
  495. self.flipVerticalVC?.view.alphaValue = 1.0
  496. self.flipHorizontalVC?.button.isEnabled = true
  497. self.flipHorizontalVC?.view.alphaValue = 1.0
  498. self.wTextFieldItemView.textFiled.isEnabled = true
  499. self.hTextFieldItemView.textFiled.isEnabled = true
  500. self.whVC?.state = self._getKeepProportionsButtonState() ? .Act : .Norm
  501. self.rotateTextFieldItemView.state = .Norm
  502. self.rotateTextFieldItemView.kmEnabled = true
  503. self.leftRotateVC?.state = .Norm
  504. self.rightRotateVC?.state = .Norm
  505. self.reverseXVC?.state = .Norm
  506. self.reverseYVC?.state = .Norm
  507. self.leftRotateVC?.button.isEnabled = true
  508. self.rightRotateVC?.button.isEnabled = true
  509. self.reverseXVC?.button.isEnabled = true
  510. self.reverseYVC?.button.isEnabled = true
  511. } else {
  512. self.cancelBox.isHidden = false
  513. self.confirmBox.isHidden = false
  514. self.cropBox.isHidden = true
  515. self.replaceVC?.enabled = false
  516. self.exportVC?.enabled = false
  517. self.opacitySlider.isEnabled = false
  518. self.opacityVC?.enabled = false
  519. self.rotateLeftVC?.button.isEnabled = false
  520. self.rotateLeftVC?.view.alphaValue = 0.5
  521. self.rotateRightVC?.button.isEnabled = false
  522. self.rotateRightVC?.view.alphaValue = 0.5
  523. self.flipVerticalVC?.button.isEnabled = false
  524. self.flipVerticalVC?.view.alphaValue = 0.5
  525. self.flipHorizontalVC?.button.isEnabled = false
  526. self.flipHorizontalVC?.view.alphaValue = 0.5
  527. self.wTextFieldItemView.textFiled.isEnabled = false
  528. self.hTextFieldItemView.textFiled.isEnabled = false
  529. self.whVC?.state = .Disabled
  530. self.rotateTextFieldItemView.state = .Disabled
  531. self.rotateTextFieldItemView.kmEnabled = false
  532. self.leftRotateVC?.state = .Disabled
  533. self.rightRotateVC?.state = .Disabled
  534. self.reverseXVC?.state = .Disabled
  535. self.reverseYVC?.state = .Disabled
  536. self.leftRotateVC?.button.isEnabled = false
  537. self.rightRotateVC?.button.isEnabled = false
  538. self.reverseXVC?.button.isEnabled = false
  539. self.reverseYVC?.button.isEnabled = false
  540. }
  541. self.reloadData()
  542. }
  543. func updateWHData() {
  544. if let data = self.handdler?.editAreasBoundsIsEqualForWidth(), data {
  545. let areaFrame = self.handdler?.editingAreas.first?.bounds ?? .zero
  546. self.wTextFieldItemView.stringValue = String(format: "%.1f", areaFrame.size.width)
  547. } else {
  548. self.wTextFieldItemView.stringValue = "--"
  549. }
  550. if let data = self.handdler?.editAreasBoundsIsEqualForHeight(), data {
  551. let areaFrame = self.handdler?.editingAreas.first?.bounds ?? .zero
  552. self.hTextFieldItemView.stringValue = String(format: "%.1f", areaFrame.size.height)
  553. } else {
  554. self.hTextFieldItemView.stringValue = "--"
  555. }
  556. }
  557. func updateRotateData() {
  558. if let data = self.handdler?.editAreasRotateIsEqual(), data {
  559. let area = self.handdler?.editingImageAreas.first
  560. let rotate = self.listView.getRotateWith(area)
  561. let stringValue = self.rotateTextFieldItemView.stringValue?.replacingOccurrences(of: "°", with: "")
  562. let number = NSNumber(value: rotate)
  563. let formatter = NumberFormatter()
  564. let string = formatter.string(for: number)
  565. self.rotateTextFieldItemView.stringValue = "\(string ?? "0") °"
  566. } else {
  567. self.rotateTextFieldItemView.stringValue = "--"
  568. }
  569. }
  570. func updateImageAreasOpacity(opacity: CGFloat, state: KMOperationState, needListView: Bool = true) {
  571. if self.editingAreas.count >= 1 {
  572. if needListView {
  573. for area in imagesAreas {
  574. self.listView.setOpacityEditArea(area, opacity: opacity)
  575. }
  576. }
  577. // self.listView.editingAreas()!.count == 1 &&
  578. if (self.listView.editingAreas()?.first is CPDFEditImageArea) {
  579. self.listView.selectImageAreas = self.listView.editingAreas()!.first as? CPDFEditImageArea
  580. // self.editImageView.image = self.listView.selectImageAreas.thumbnailImage
  581. self.opacitySlider.objectValue = self.listView.opacity(for: self.listView.selectImageAreas)
  582. self.opacityVC?.stringValue = Int(opacity * 100).description + "%"
  583. // self.editImageView.alphaValue = opacity
  584. }
  585. }
  586. }
  587. private func changeAreasAlign(areas:[Any],newBounds:[String]) {
  588. var oldBounds : [String] = []
  589. for i in 0 ... areas.count-1 {
  590. let area : CPDFEditArea = areas[i] as! CPDFEditArea
  591. oldBounds.append(NSStringFromRect(area.bounds))
  592. self.listView.setBoundsEditArea(area, withBounds: NSRectFromString(newBounds[i]))
  593. }
  594. self.listView.setNeedsDisplayForVisiblePages()
  595. }
  596. private func _setKeepProportionsButtonState(state: Bool) {
  597. KMDataManager.ud_set(state, forKey: Self.keepProportionsKey)
  598. }
  599. private func _getKeepProportionsButtonState() -> Bool {
  600. let defaultV = true
  601. guard let state = KMDataManager.ud_object(forKey: Self.keepProportionsKey) else {
  602. return defaultV
  603. }
  604. return state as? Bool ?? defaultV
  605. }
  606. private func _trackEvent() {
  607. kTrackEventManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_EditImage":"SubTbr_EditImage_PropertiesPanel_All"])
  608. }
  609. private func _trackAlignEvent() {
  610. kTrackEventManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_EditText":"SubTbr_EditContent_AlignContent"])
  611. }
  612. }
  613. //MARK: - Action
  614. extension KMEditImagePropertyViewController {
  615. @objc func sliderValueChanged(_ sender: NSSlider) {
  616. let sliderValue = sender.floatValue
  617. self.updateImageAreasOpacity(opacity:CGFloat(sliderValue), state: .changed)
  618. }
  619. @objc func whAction(_ sender: AnyObject) {
  620. let state = self.whVC?.state ?? .None
  621. if state == .Disabled {
  622. return
  623. }
  624. if state == .Act {
  625. self.whVC?.state = .Norm
  626. self._setKeepProportionsButtonState(state: false)
  627. } else {
  628. self.whVC?.state = .Act
  629. self._setKeepProportionsButtonState(state: true)
  630. }
  631. }
  632. @IBAction func rightRotationImageAction(_ sender: Any) {
  633. if self.listView.editingAreas()?.count ?? 0 < 1 {
  634. return
  635. }
  636. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_PageEdit", withProperties: ["SubTbr_Btn": "Btn_SubTbr_PageEdit_Rotate"])
  637. self._trackEvent()
  638. let areas = self.listView.editingAreas()
  639. if areas!.count == 1 && (areas!.first is CPDFEditImageArea) {
  640. let imageArea = areas!.first as! CPDFEditImageArea
  641. self.listView.rotate(with: imageArea, rotate: 90)
  642. self.listView.selectImageAreas = imageArea
  643. // self.editImageView.image = self.listView.selectImageAreas.thumbnailImage
  644. } else if areas!.count > 1 {
  645. for imagesArea in imagesAreas {
  646. self.listView.rotate(with: imagesArea, rotate: 90)
  647. }
  648. }
  649. self.delegate?.editImagePropertyViewControllerDidChanged(controller: self, type: .rotate)
  650. }
  651. @IBAction func leftRotationImageAction(_ sender: Any) {
  652. if self.listView.editingAreas()?.count ?? 0 < 1 {
  653. return
  654. }
  655. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_PageEdit", withProperties: ["SubTbr_Btn": "Btn_SubTbr_PageEdit_Rotate"])
  656. self._trackEvent()
  657. let areas = self.listView.editingAreas()
  658. if areas!.count == 1 && (areas!.first is CPDFEditImageArea) {
  659. self.listView.rotate(with: self.listView.selectImageAreas, rotate: -90)
  660. if self.listView.editingAreas()!.count == 1 && (self.listView.editingAreas()!.first is CPDFEditImageArea) {
  661. self.listView.selectImageAreas = self.listView.editingAreas()!.first as? CPDFEditImageArea
  662. }
  663. // self.editImageView.image = self.listView.selectImageAreas.thumbnailImage
  664. } else {
  665. for imagesArea in imagesAreas {
  666. self.listView.rotate(with: imagesArea, rotate: -90)
  667. }
  668. }
  669. self.delegate?.editImagePropertyViewControllerDidChanged(controller: self, type: .rotate)
  670. }
  671. @IBAction func flipHorizontalImageAction(_ sender: Any) {
  672. if self.listView.editingAreas()?.count ?? 0 < 1 {
  673. return
  674. }
  675. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_PageEdit", withProperties: ["SubTbr_Btn": "Btn_SubTbr_PageEdit_Reverse"])
  676. self._trackEvent()
  677. let areas = self.listView.editingAreas()
  678. if areas != nil {
  679. for item in areas! {
  680. if item is CPDFEditImageArea {
  681. self.listView.horizontalMirror(with: item as? CPDFEditImageArea)
  682. if areas?.count == 1 {
  683. // self.editImageView.image = (item as AnyObject).thumbnailImage
  684. }
  685. } else {
  686. for imagesArea in imagesAreas {
  687. self.listView.horizontalMirror(with: imagesArea)
  688. }
  689. }
  690. }
  691. }
  692. self.delegate?.editImagePropertyViewControllerDidChanged(controller: self, type: .flip)
  693. }
  694. @IBAction func flipVerticalImageAction(_ sender: Any) {
  695. if self.listView.editingAreas()?.count ?? 0 < 1 {
  696. return
  697. }
  698. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_PageEdit", withProperties: ["SubTbr_Btn": "Btn_SubTbr_PageEdit_Reverse"])
  699. self._trackEvent()
  700. let areas = self.listView.editingAreas()
  701. if areas != nil {
  702. for item in areas! {
  703. if item is CPDFEditImageArea {
  704. self.listView.verticalMirror(with: item as? CPDFEditImageArea)
  705. // self.editImageView.image = self.listView.selectImageAreas.thumbnailImage
  706. } else {
  707. for imagesArea in imagesAreas {
  708. self.listView.verticalMirror(with: imagesArea)
  709. }
  710. }
  711. }
  712. }
  713. self.delegate?.editImagePropertyViewControllerDidChanged(controller: self, type: .flip)
  714. }
  715. @IBAction func cutImageAction(_ sender: Any) {
  716. let state = self.cropVC?.state ?? .None
  717. if state == .Disabled {
  718. return
  719. }
  720. self._trackEvent()
  721. self.handdler?.cropAction()
  722. }
  723. @IBAction func confirmVCImageAction(_ sender: Any) {
  724. self.handdler?.cropComfirmAction()
  725. }
  726. @IBAction func cancelCutImageAction(_ sender: Any) {
  727. self.handdler?.cropCancelAction()
  728. }
  729. @IBAction func restoreCutImageAction(_ sender: Any) {
  730. if self.listView.selectImageAreas == nil {
  731. return
  732. }
  733. self.listView.resetCrop(with: self.listView.selectImageAreas)
  734. }
  735. @IBAction func replaceImageAction(_ sender: NSButton) {
  736. let state = self.replaceVC?.state ?? .None
  737. if state == .Disabled {
  738. return
  739. }
  740. if self.listView.selectImageAreas == nil {
  741. return
  742. }
  743. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_PageEdit", withProperties: ["SubTbr_Btn": "Btn_SubTbr_PageEdit_Replace"])
  744. self._trackEvent()
  745. self.handdler?.replaceAction()
  746. }
  747. @IBAction func exportImageAction(_ sender: Any) {
  748. self._trackEvent()
  749. if let data = sender as? NSView {
  750. self.handdler?.showExportMenu(data)
  751. }
  752. }
  753. }
  754. // MARK: - KMSelectPopButtonDelegate
  755. extension KMEditImagePropertyViewController: KMSelectPopButtonDelegate {
  756. func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
  757. if obj == opacityVC {
  758. let index = obj.indexOfSelectedItem
  759. var string = obj.items[index]
  760. string = string.replacingOccurrences(of: "%", with: "")
  761. let value = CGFloat(Float(string)! * 0.01)
  762. self.updateImageAreasOpacity(opacity: value, state: .changed)
  763. }
  764. }
  765. func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
  766. if obj == opacityVC {
  767. let index = obj.indexOfSelectedItem
  768. var string = obj.items[index]
  769. string = string.replacingOccurrences(of: "%", with: "")
  770. let value = CGFloat(Float(string)! * 0.01)
  771. self.updateImageAreasOpacity(opacity: value, state: .ended)
  772. }
  773. }
  774. }
  775. // MARK: - KMTextFieldDelegate
  776. extension KMEditImagePropertyViewController: KMTextFieldDelegate {
  777. func km_didBecomeFirstResponder(textField: AnyObject) {
  778. if self.wTextFieldItemView.isEqual(to: textField) {
  779. self.wTextFieldItemView.backgroundView.layer?.backgroundColor = .white
  780. self.wTextFieldItemView.backgroundView.layer?.borderWidth = 1
  781. self.wTextFieldItemView.backgroundView.layer?.borderColor = NSColor(hex: "#4982E6").cgColor
  782. self.wTextFieldItemView.backgroundView.layer?.cornerRadius = 4
  783. } else if self.hTextFieldItemView.isEqual(to: textField) {
  784. self.hTextFieldItemView.backgroundView.layer?.borderColor = NSColor(hex: "#4982E6").cgColor
  785. }
  786. }
  787. func km_controlTextDidEndEditing(textField: AnyObject) {
  788. if self.wTextFieldItemView.isEqual(to: textField) {
  789. self.wTextFieldItemView.backgroundView.layer?.backgroundColor = .white
  790. self.wTextFieldItemView.backgroundView.layer?.borderWidth = 1
  791. self.wTextFieldItemView.backgroundView.layer?.borderColor = NSColor(hex: "#DFE1E5").cgColor
  792. self.wTextFieldItemView.backgroundView.layer?.cornerRadius = 4
  793. let value = self.wTextFieldItemView.stringValue?.stringToCGFloat() ?? 0
  794. let ss = String(format: "%.1f", value)
  795. self.wTextFieldItemView.stringValue = ss
  796. } else if self.hTextFieldItemView.isEqual(to: textField) {
  797. self.hTextFieldItemView.backgroundView.layer?.borderColor = NSColor(hex: "#DFE1E5").cgColor
  798. let value = self.hTextFieldItemView.stringValue?.stringToCGFloat() ?? 0
  799. let ss = String(format: "%.1f", value)
  800. self.hTextFieldItemView.stringValue = ss
  801. } else if self.rotateTextFieldItemView.isEqual(to: textField) {
  802. let stringValue = self.rotateTextFieldItemView.stringValue?.replacingOccurrences(of: "°", with: "")
  803. let formatter = NumberFormatter()
  804. let number = NSNumber(value: Int(stringValue ?? "") ?? 0)
  805. let string = formatter.string(for: number)
  806. self.rotateTextFieldItemView.stringValue = "\(string ?? "0") °"
  807. let areas = self.handdler?.editingImageAreas ?? []
  808. for area in areas {
  809. let rotate = self.listView.getRotateWith(area)
  810. let rotate2 = string?.stringToCGFloat() ?? 0
  811. let offset = rotate2-rotate
  812. if offset != 0 {
  813. self.listView.rotate(with: area, rotate: offset)
  814. kTrackEventManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_EditImage":"SubTbr_EditImage_PropertiesPanel_CustomRotate"])
  815. }
  816. }
  817. }
  818. }
  819. func km_controlTextDidChange(textField: AnyObject) {
  820. if self.wTextFieldItemView.isEqual(to: textField) {
  821. let number = NSNumber(value: Int(self.wTextFieldItemView.stringValue ?? "") ?? 0)
  822. let string = self.wTextFieldItemView.textFiled.formatter?.string(for: number)
  823. self.wTextFieldItemView.stringValue = string ?? ""
  824. let areas = self.handdler?.editingImageAreas ?? []
  825. self.listView.editAreaBoundUpdating = true
  826. for area in areas {
  827. let state = self.whVC?.state ?? .None
  828. var bounds = area.bounds
  829. var width = string?.stringToCGFloat() ?? 0
  830. if width == 0 {
  831. return
  832. }
  833. let pageBounds = area.page?.bounds ?? .zero
  834. if width > NSWidth(pageBounds) {
  835. width = NSWidth(pageBounds)
  836. let value = String(format: "%.1f", width)
  837. self.wTextFieldItemView.stringValue = value
  838. }
  839. bounds.origin.x = max(0, (pageBounds.size.width-width)*0.5)
  840. if state == .Act { // 寛高约束
  841. var scale: CGFloat = 0
  842. if bounds.size.width != 0 {
  843. scale = width / bounds.size.width
  844. }
  845. bounds.size.height *= scale
  846. bounds.size.width = width
  847. let value = String(format: "%.1f", bounds.size.height)
  848. self.hTextFieldItemView.stringValue = value
  849. } else {
  850. bounds.size.width = width
  851. }
  852. self.listView.setBoundsEditArea(area, withBounds: bounds)
  853. }
  854. } else if self.hTextFieldItemView.isEqual(to: textField) {
  855. let number = NSNumber(value: Int(self.hTextFieldItemView.stringValue ?? "") ?? 0)
  856. let string = self.hTextFieldItemView.textFiled.formatter?.string(for: number)
  857. self.hTextFieldItemView.stringValue = string ?? ""
  858. // let areas = self.listView?.editingAreas() as? [CPDFEditArea] ?? []
  859. let areas = self.handdler?.editingImageAreas ?? []
  860. self.listView.editAreaBoundUpdating = true
  861. for area in areas {
  862. // if let area = areas.first as? CPDFEditImageArea {
  863. let state = self.whVC?.state ?? .None
  864. var bounds = area.bounds
  865. var height = string?.stringToCGFloat() ?? 0
  866. if height == 0 {
  867. return
  868. }
  869. let pageBounds = area.page?.bounds ?? .zero
  870. if height > NSHeight(pageBounds) {
  871. height = NSHeight(pageBounds)
  872. let value = String(format: "%.1f", height)
  873. self.hTextFieldItemView.stringValue = value
  874. }
  875. bounds.origin.y = max(0, (pageBounds.size.height-height)*0.5)
  876. if state == .Act { // 寛高约束
  877. var scale: CGFloat = 0
  878. if bounds.size.height != 0 {
  879. scale = height / bounds.size.height
  880. }
  881. bounds.size.width *= scale
  882. bounds.size.height = height
  883. let value = String(format: "%.1f", bounds.size.width)
  884. self.wTextFieldItemView.stringValue = value
  885. } else {
  886. bounds.size.height = height
  887. }
  888. self.listView.setBoundsEditArea(area, withBounds: bounds)
  889. }
  890. } else if self.rotateTextFieldItemView.isEqual(to: textField) {
  891. // let stringValue = self.rotateTextFieldItemView.stringValue
  892. // let number = NSNumber(value: Int(stringValue ?? "") ?? 0)
  893. // let formatter = NumberFormatter()
  894. // let string = formatter.string(for: stringValue)
  895. // let string = self.rotateTextFieldItemView.kFormatter?.string(for: number)
  896. // self.rotateTextFieldItemView.stringValue = string
  897. }
  898. }
  899. }
  900. class CustomSliderCell: NSSliderCell {
  901. var knobImage: NSImage?
  902. override func drawKnob(_ knobRect: NSRect) {
  903. if let image = knobImage {
  904. let imageSize = NSSize(width: knobRect.size.height, height: knobRect.size.height)
  905. let imageRect = NSRect(origin: knobRect.origin, size: imageSize)
  906. image.draw(in: imageRect)
  907. } else {
  908. super.drawKnob(knobRect)
  909. }
  910. }
  911. }