KMPDFSecToolbarController.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. //
  2. // KMPDFSecToolbarController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/10/8.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. @objc protocol KMPDFSecToolbarControllerDelegate: AnyObject {
  10. @objc optional func kmPDFSecToolbarControllerDidItemClicked(_ controller: KMPDFSecToolbarController, _ property: Any)
  11. }
  12. class KMPDFSecToolbarController: NSViewController {
  13. @IBOutlet var contendBox: NSBox!
  14. @IBOutlet var infoContendView: NSView!
  15. @IBOutlet var rightContendView: NSView!
  16. @IBOutlet var moreToolsBGView: NSView!
  17. @IBOutlet var moreToolsView: ComponentDropdownTool!
  18. @IBOutlet var contendLeftConst: NSLayoutConstraint!
  19. @IBOutlet var contendViewWidthConst: NSLayoutConstraint!
  20. @IBOutlet var rightContendViewWidthConst: NSLayoutConstraint!
  21. private var propertys: [Any] = []
  22. private var propertysWidthValue: CGFloat = 0
  23. private var lastPropertyWidth: CGFloat = 0
  24. private var hidePropertys: [Any] = []
  25. private var rightPropertys: [Any] = []
  26. weak open var delegate: KMPDFSecToolbarControllerDelegate?
  27. override func viewWillLayout() {
  28. super.viewWillLayout()
  29. let contendXValue = CGRectGetWidth(view.frame)/2 - propertysWidthValue/2
  30. contendLeftConst.constant = max(0, contendXValue)
  31. if contendXValue <= 0 {
  32. contendViewWidthConst.constant = CGRectGetWidth(view.frame)
  33. } else {
  34. contendViewWidthConst.constant = propertysWidthValue
  35. }
  36. hidePropertys.removeAll()
  37. moreToolsBGView.isHidden = true
  38. let subviews = infoContendView.subviews
  39. for view in subviews {
  40. if CGRectGetMidX(view.frame) > CGRectGetWidth(self.view.frame) - lastPropertyWidth {
  41. moreToolsBGView.isHidden = false
  42. view.isHidden = true
  43. if view is ComponentButton {
  44. hidePropertys.append((view as! ComponentButton).properties)
  45. } else if view is ComponentDropdownTool {
  46. hidePropertys.append((view as! ComponentDropdownTool).properties)
  47. }
  48. } else {
  49. view.isHidden = false
  50. }
  51. }
  52. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(setUpHidePropertys), object: nil)
  53. self.perform(#selector(setUpHidePropertys), with: nil, afterDelay: 0.35)
  54. }
  55. override func viewDidLoad() {
  56. super.viewDidLoad()
  57. // Do view setup here.
  58. setUpProperty()
  59. }
  60. func setUpProperty() {
  61. contendBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle")
  62. moreToolsBGView.wantsLayer = true
  63. moreToolsBGView.layer?.backgroundColor = contendBox.fillColor.cgColor
  64. moreToolsBGView.isHidden = true
  65. moreToolsView.properties = ComponentDropdownToolProperty(state: .normal, leftIcon: NSImage(named: "toolbar_doubleArrow_right"))
  66. moreToolsView.delegate = self
  67. }
  68. @objc func setUpHidePropertys() {
  69. var menuItemArr: [ComponentMenuitemProperty] = []
  70. for item in hidePropertys {
  71. if item is ComponentButtonProperty {
  72. let menuItem = ComponentMenuitemProperty(type: .normal, text: (item as! ComponentButtonProperty).buttonText ?? "", identifier: (item as! ComponentButtonProperty).identifier)
  73. menuItemArr.append(menuItem)
  74. } else if item is ComponentDropdownToolProperty {
  75. let menuItem = ComponentMenuitemProperty(type: .normal, text: (item as! ComponentDropdownToolProperty).text ?? "testtest", identifier: "")
  76. if let subItems = (item as! ComponentDropdownToolProperty).menuItemArr {
  77. menuItem.subPropertys = subItems
  78. }
  79. menuItemArr.append(menuItem)
  80. }
  81. }
  82. moreToolsView.properties.menuItemArr = menuItemArr
  83. }
  84. //MARK: - reload
  85. public func reloadMainPropertys(_ arr: [Any]) {
  86. propertys.removeAll()
  87. for item in arr {
  88. propertys.append(item)
  89. }
  90. reloadMainView()
  91. }
  92. public func reloadRightPropertys(_ arr: [Any]) {
  93. rightPropertys.removeAll()
  94. for item in arr {
  95. rightPropertys.append(item)
  96. }
  97. reloadRightView()
  98. }
  99. func reloadMainView() {
  100. let subviews = infoContendView.subviews
  101. for view in subviews {
  102. view.removeFromSuperview()
  103. }
  104. var itemXvalue: CGFloat = 0
  105. for property in propertys {
  106. if property is ComponentButtonProperty {
  107. let buttonProperty = (property as! ComponentButtonProperty)
  108. let button = ComponentButton.init()
  109. button.properties = buttonProperty
  110. if buttonProperty.onlyIcon {
  111. button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 28, 28)
  112. } else {
  113. button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, button.properties.propertyInfo.viewWidth, 28)
  114. }
  115. button.setTarget(self, action: #selector(buttonClicked(_:)))
  116. infoContendView.addSubview(button)
  117. itemXvalue += CGRectGetWidth(button.frame)
  118. itemXvalue += 12
  119. lastPropertyWidth = CGRectGetWidth(button.frame)
  120. } else if property is ComponentDividerProperty {
  121. let divider = ComponentDivider.init()
  122. divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-8, 1, 16)
  123. divider.properties = (property as! ComponentDividerProperty)
  124. infoContendView.addSubview(divider)
  125. itemXvalue += 1
  126. itemXvalue += 12
  127. lastPropertyWidth = CGRectGetWidth(divider.frame)
  128. } else if property is ComponentDropdownToolProperty {
  129. let dropdownTool = ComponentDropdownTool.init()
  130. dropdownTool.properties = property as! ComponentDropdownToolProperty
  131. dropdownTool.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, dropdownTool.properties.propertyInfo.viewWidth, 28)
  132. dropdownTool.delegate = self
  133. infoContendView.addSubview(dropdownTool)
  134. itemXvalue += CGRectGetWidth(dropdownTool.frame)
  135. itemXvalue += 12
  136. lastPropertyWidth = CGRectGetWidth(dropdownTool.frame)
  137. } else if property is ComponentSelectProperties {
  138. let selectView = ComponentSelect.init()
  139. selectView.properties = property as! ComponentSelectProperties
  140. selectView.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 144, 28)
  141. if let items = selectView.properties.menuItemArr {
  142. selectView.updateMenuItemsArr(items)
  143. }
  144. selectView.delegate = self
  145. infoContendView.addSubview(selectView)
  146. itemXvalue += CGRectGetWidth(selectView.frame)
  147. itemXvalue += 12
  148. lastPropertyWidth = CGRectGetWidth(selectView.frame)
  149. }
  150. }
  151. itemXvalue -= 12
  152. propertysWidthValue = itemXvalue
  153. contendViewWidthConst.constant = propertysWidthValue
  154. contendLeftConst.constant = CGRectGetWidth(view.frame)/2 - propertysWidthValue/2
  155. }
  156. func reloadRightView() {
  157. let subviews = rightContendView.subviews
  158. for view in subviews {
  159. view.removeFromSuperview()
  160. }
  161. var itemXvalue: CGFloat = 0
  162. for property in rightPropertys {
  163. if property is ComponentButtonProperty {
  164. let buttonProperty = (property as! ComponentButtonProperty)
  165. let button = ComponentButton.init()
  166. button.properties = buttonProperty
  167. if buttonProperty.onlyIcon {
  168. button.frame = CGRectMake(itemXvalue, 0, 28, 28)
  169. } else {
  170. button.frame = CGRectMake(itemXvalue, 0, button.properties.propertyInfo.viewWidth, 28)
  171. }
  172. button.setTarget(self, action: #selector(buttonClicked(_:)))
  173. rightContendView.addSubview(button)
  174. itemXvalue += CGRectGetWidth(button.frame)
  175. itemXvalue += 12
  176. } else if property is ComponentDividerProperty {
  177. let divider = ComponentDivider.init()
  178. divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-8, 1, 16)
  179. divider.properties = (property as! ComponentDividerProperty)
  180. rightContendView.addSubview(divider)
  181. itemXvalue += 1
  182. itemXvalue += 12
  183. }
  184. }
  185. itemXvalue -= 12
  186. rightContendViewWidthConst.constant = itemXvalue
  187. }
  188. func refreshMainview() {
  189. let subviews = infoContendView.subviews
  190. for view in subviews {
  191. if view is ComponentButton {
  192. (view as! ComponentButton).reloadData()
  193. } else if view is ComponentDropdownTool {
  194. (view as! ComponentDropdownTool).reloadData()
  195. } else if view is ComponentSelect {
  196. (view as! ComponentSelect).reloadData()
  197. }
  198. }
  199. }
  200. func refreshRightview() {
  201. let subviews = rightContendView.subviews
  202. for view in subviews {
  203. if view is ComponentButton {
  204. (view as! ComponentButton).reloadData()
  205. }
  206. }
  207. }
  208. //MARK: -
  209. @objc func buttonClicked(_ sender: ComponentButton) {
  210. delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, sender.properties)
  211. }
  212. //MARK: - Mouse
  213. override func mouseDown(with event: NSEvent) {
  214. super.mouseDown(with: event)
  215. view.window?.makeFirstResponder(self)
  216. }
  217. }
  218. //MARK: - ComponentDropdownToolDelegate
  219. extension KMPDFSecToolbarController: ComponentDropdownToolDelegate {
  220. func componentDropdownToolDidClicked(_ view: ComponentDropdownTool, menuItem: ComponentMenuitemProperty?) {
  221. if let property = menuItem {
  222. property.itemSelected = false
  223. property.state = .normal
  224. delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, property)
  225. }
  226. }
  227. }
  228. //MARK: - ComponentSelectDelegate
  229. extension KMPDFSecToolbarController: ComponentSelectDelegate {
  230. func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) {
  231. if let property = menuItemProperty {
  232. property.itemSelected = false
  233. property.state = .normal
  234. delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, property)
  235. }
  236. }
  237. }