KMToolbarView.swift 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139
  1. //
  2. // KMToolbarView.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2023/10/24.
  6. //
  7. import Cocoa
  8. private let KMToolbarSpaceItemWidth = 30.0
  9. private let KMToolbarLineItemWidth = 1.0
  10. private let KMToolbarItemSpace = 8.0
  11. @objc protocol KMToolbarViewDelegate: NSObjectProtocol {
  12. @objc optional func toolbar(_ toolbar: KMToolbarView, itemFor identifier: String) -> KMToolbarItemView
  13. @objc optional func toolbarAllowedItemIdentifiers(_ toolbar: KMToolbarView) -> [String]
  14. @objc optional func toolbarDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String]
  15. @objc optional func toolbarLeftDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String]
  16. @objc optional func toolbarRightDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String]
  17. }
  18. @objcMembers class KMToolbarView: NSView {
  19. private var _toolbarIdentifier: String?
  20. var toolbarIdentifier: String? {
  21. get {
  22. return self._toolbarIdentifier
  23. }
  24. }
  25. private var _items: [KMToolbarItemView] = []
  26. var items: [KMToolbarItemView] {
  27. get {
  28. return self._items
  29. }
  30. }
  31. weak var delegate: KMToolbarViewDelegate?
  32. private var _visibleItems: [KMToolbarItemView] = []
  33. private var _invisibleItems: [KMToolbarItemView] = []
  34. private var _contentView: NSView?
  35. var contentView: NSView {
  36. get {
  37. if (self._contentView == nil) {
  38. self._contentView = NSView()
  39. }
  40. return self._contentView!
  41. }
  42. }
  43. lazy var moreButton: NSButton = {
  44. let _moreButton = NSButton()
  45. _moreButton.bezelStyle = .regularSquare
  46. _moreButton.isBordered = false
  47. _moreButton.font = .systemFont(ofSize: 20)
  48. _moreButton.title = " »"
  49. _moreButton.isHidden = true
  50. _moreButton.target = self
  51. _moreButton.action = #selector(_moreButtonAction)
  52. _moreButton.wantsLayer = true
  53. _moreButton.layer?.backgroundColor = NSColor.clear.cgColor
  54. return _moreButton
  55. }()
  56. private lazy var centerView: NSView = {
  57. let view = NSView()
  58. return view
  59. }()
  60. private lazy var leftView: NSView = {
  61. let view = NSView()
  62. // view.wantsLayer = true
  63. // view.layer?.backgroundColor = NSColor(red: 247/255.0, green: 248/255.0, blue: 250/255.0 , alpha: 1).cgColor
  64. return view
  65. }()
  66. private class KMToolbarView_rightView: NSView {}
  67. private lazy var rightView: NSView = {
  68. let view = KMToolbarView_rightView()
  69. // view.wantsLayer = true
  70. // view.layer?.backgroundColor = NSColor(red: 247/255.0, green: 248/255.0, blue: 250/255.0, alpha: 1).cgColor
  71. return view
  72. }()
  73. static let kLeftMargin: CGFloat = 8
  74. static let kHSpace: CGFloat = 8
  75. static let kRightMargin: CGFloat = 8
  76. static let kMoreWidth: CGFloat = 30
  77. private var _leftWidth: CGFloat = 0
  78. private var _centerWidth: CGFloat = 0
  79. private var _rightWidth: CGFloat = 0
  80. var allowsUserCustomization = false
  81. deinit {
  82. Swift.debugPrint("KMToolbarView deinit")
  83. NotificationCenter.default.removeObserver(self)
  84. }
  85. convenience init(identifier: String) {
  86. self.init()
  87. self._toolbarIdentifier = identifier
  88. self._addTrackingArea()
  89. NotificationCenter.default.addObserver(self, selector: #selector(toolbarCustomChangeNotification), name: KMToolbarCustomChangeNotification, object: nil)
  90. // self.leftView.wantsLayer = true
  91. // self.contentView.wantsLayer = true
  92. // self.rightView.wantsLayer = true
  93. // self.leftView.layer?.backgroundColor = NSColor.red.cgColor
  94. // self.contentView.layer?.backgroundColor = NSColor.blue.cgColor
  95. // self.rightView.layer?.backgroundColor = NSColor.green.cgColor
  96. }
  97. override func menu(for event: NSEvent) -> NSMenu? {
  98. if self.allowsUserCustomization == false {
  99. return super.menu(for: event)
  100. }
  101. let menu = NSMenu()
  102. let item = NSMenuItem(title: NSLocalizedString("Customize Toolbar", comment: ""), action: #selector(_customToolbarItemAction), keyEquivalent: "")
  103. menu.addItem(item)
  104. return menu
  105. }
  106. // MARK: - Private Methods
  107. @objc private func _customToolbarItemAction(_ sender: NSMenuItem?) {
  108. }
  109. private func _addTrackingArea() {
  110. let trackingArea = NSTrackingArea(rect: self.bounds, options: [.inVisibleRect, .activeInKeyWindow, .mouseMoved], owner: self)
  111. self.addTrackingArea(trackingArea)
  112. }
  113. override func mouseMoved(with event: NSEvent) {
  114. // self.window?.mouseMoved(with: event)
  115. super.mouseMoved(with: event)
  116. }
  117. @objc private func _moreButtonAction() {
  118. let menu = NSMenu()
  119. for item in self._invisibleItems {
  120. if (item.itemIdentifier == KMToolbarDividerItemIdentifier) {
  121. menu.addItem(NSMenuItem.separator())
  122. } else if (item.menuFormRepresentation != nil) {
  123. menu.addItem(item.menuFormRepresentation!)
  124. }
  125. }
  126. menu.popUp(positioning: menu.items.first, at: NSMakePoint(CGRectGetMaxX(self.moreButton.frame), CGRectGetMaxY(self.moreButton.frame)-5), in: self)
  127. }
  128. private func _updateMainView(_ left: Bool = true, _ right: Bool = true) {
  129. if (self.centerView.superview == nil) {
  130. self.addSubview(self.centerView)
  131. }
  132. if left {
  133. self._updateLeftView()
  134. }
  135. if right {
  136. self._updateRightView()
  137. }
  138. // self.centerView.mas_remakeConstraints { make in
  139. // make?.right.equalTo()(0)
  140. // make?.top.equalTo()(self.mas_top)?.offset()(0)
  141. // make?.bottom.equalTo()(self.mas_bottom)?.offset()(0)
  142. // make?.left.mas_equalTo()(0)
  143. // }
  144. if(self.contentView.superview == nil) {
  145. self.centerView.addSubview(self.contentView)
  146. }
  147. // self.contentView.mas_remakeConstraints { make in
  148. // make?.centerX.equalTo()(0)
  149. // make?.centerY.equalTo()(0)
  150. // }
  151. for item in self.items {
  152. item.removeFromSuperview()
  153. }
  154. self._items = []
  155. var posX = 0.0
  156. var items: [KMToolbarItemView] = []
  157. var itemIdentifiers = self.delegate?.toolbarDefaultItemIdentifiers?(self) ?? []
  158. var lastItem: KMToolbarItemView?
  159. var iWidth: CGFloat = 0
  160. for i in 0 ..< (itemIdentifiers.count-self._invisibleItems.count) {
  161. let itemIdentifier = itemIdentifiers[i]
  162. var item: KMToolbarItemView?
  163. if itemIdentifier == KMToolbarDividerItemIdentifier {
  164. item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
  165. } else if itemIdentifier == KMNewToolbarSpaceItemIdentifier {
  166. item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
  167. item?.layer?.backgroundColor = .clear
  168. item?.imageViewBox.borderColor = .clear
  169. item?.layer?.cornerRadius = 0.0
  170. } else if let data = self.delegate?.toolbar?(self, itemFor: itemIdentifier) {
  171. item = data
  172. }
  173. guard let data = item else {
  174. continue
  175. }
  176. self.contentView.addSubview(data)
  177. // if (lastItem != nil) {
  178. // if (i == itemIdentifiers.count - 1) {
  179. // item?.mas_makeConstraints({ make in
  180. // make?.top.bottom().equalTo()(0)
  181. // make?.left.equalTo()(lastItem!.mas_right)?.offset()(KMToolbarItemSpace)
  182. // make?.right.equalTo()(self.contentView.mas_right)?.offset()(0)
  183. // })
  184. // } else {
  185. // item?.mas_makeConstraints({ make in
  186. // make?.top.bottom().equalTo()(0)
  187. // make?.left.equalTo()(lastItem!.mas_right)?.offset()(KMToolbarItemSpace)
  188. // })
  189. // }
  190. //
  191. // } else {
  192. // if (item?.image != nil) {
  193. // item?.mas_makeConstraints({ make in
  194. // make?.top.bottom().equalTo()(0)
  195. // make?.left.equalTo()(0)
  196. // })
  197. // } else {
  198. // item?.mas_makeConstraints({ make in
  199. // make?.top.bottom().equalTo()(0)
  200. // make?.left.equalTo()(0)
  201. // make?.height.offset()(40)
  202. // })
  203. // }
  204. // }
  205. items.append(data)
  206. iWidth += data.itemWidth
  207. if lastItem != nil {
  208. // + 前一个的间距
  209. iWidth += Self.kHSpace
  210. }
  211. lastItem = item
  212. // posX += item!.frame.size.width
  213. }
  214. self._items = items
  215. self._centerWidth = iWidth
  216. self.addSubview(self.moreButton)
  217. }
  218. // UI 20 16
  219. // item w 28 h 24
  220. private func _updateView(_ left: Bool = true, _ right: Bool = true) {
  221. if left {
  222. self._updateLeftView()
  223. }
  224. if right {
  225. self._updateRightView()
  226. }
  227. if(self.contentView.superview == nil) {
  228. self.addSubview(self.contentView)
  229. }
  230. // self.contentView.mas_remakeConstraints { make in
  231. // make?.centerX.equalTo()(0)
  232. // make?.centerY.equalTo()(0)
  233. // }
  234. for item in self.items {
  235. item.removeFromSuperview()
  236. }
  237. self._items = []
  238. var posX = 0.0
  239. var items: [KMToolbarItemView] = []
  240. var itemIdentifiers = self.delegate?.toolbarDefaultItemIdentifiers?(self) ?? []
  241. var lastItem: KMToolbarItemView?
  242. // -self._invisibleItems.count
  243. var iWidth: CGFloat = 0
  244. for i in 0 ..< itemIdentifiers.count {
  245. let itemIdentifier = itemIdentifiers[i]
  246. var item: KMToolbarItemView?
  247. if itemIdentifier == KMToolbarDividerItemIdentifier {
  248. item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
  249. } else if itemIdentifier == KMNewToolbarSpaceItemIdentifier {
  250. item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
  251. item?.layer?.backgroundColor = .clear
  252. item?.imageViewBox.borderColor = .clear
  253. item?.layer?.cornerRadius = 0.0
  254. } else if let data = self.delegate?.toolbar?(self, itemFor: itemIdentifier) {
  255. item = data
  256. }
  257. guard let data = item else {
  258. continue
  259. }
  260. self.contentView.addSubview(data)
  261. // if (lastItem != nil) {
  262. // if (i == itemIdentifiers.count - 1) {
  263. // item?.mas_makeConstraints({ make in
  264. // make?.top.bottom().equalTo()(0)
  265. // make?.left.equalTo()(lastItem!.mas_right)?.offset()(KMToolbarItemSpace)
  266. // make?.right.equalTo()(self.contentView.mas_right)?.offset()(0)
  267. // })
  268. // } else {
  269. // if itemIdentifier == KMNewToolbarSpaceItemIdentifier {
  270. // item?.mas_makeConstraints({ make in
  271. // make?.top.bottom().equalTo()(0)
  272. // make?.left.equalTo()(lastItem!.mas_right)?.offset()(2)
  273. // })
  274. // } else {
  275. // if lastItem?.itemIdentifier == KMNewToolbarSpaceItemIdentifier {
  276. // item?.mas_makeConstraints({ make in
  277. // make?.top.bottom().equalTo()(0)
  278. // make?.left.equalTo()(lastItem!.mas_right)?.offset()(2)
  279. // })
  280. // } else {
  281. // item?.mas_makeConstraints({ make in
  282. // make?.top.bottom().equalTo()(0)
  283. // make?.left.equalTo()(lastItem!.mas_right)?.offset()(KMToolbarItemSpace)
  284. // })
  285. // }
  286. // }
  287. // }
  288. // } else {
  289. // if (item?.image != nil) {
  290. // item?.mas_makeConstraints({ make in
  291. // make?.top.bottom().equalTo()(0)
  292. // make?.left.equalTo()(0)
  293. // })
  294. // } else {
  295. // item?.mas_makeConstraints({ make in
  296. // make?.top.bottom().equalTo()(0)
  297. // make?.left.equalTo()(0)
  298. // make?.height.offset()(40)
  299. // })
  300. // }
  301. // }
  302. items.append(data)
  303. iWidth += data.itemWidth
  304. if lastItem != nil {
  305. // + 前一个的间距
  306. iWidth += Self.kHSpace
  307. }
  308. lastItem = item
  309. // posX += item!.frame.size.width
  310. }
  311. self._items = items
  312. self._centerWidth = iWidth
  313. self.addSubview(self.moreButton)
  314. }
  315. private func _updateLeftView() {
  316. // 刷新前移除视图
  317. for item in self.leftView.subviews {
  318. item.removeFromSuperview()
  319. }
  320. if (self.leftView.superview != nil) {
  321. self.leftView.removeFromSuperview()
  322. }
  323. var iWidth: CGFloat = 0
  324. if let itemIdentifiers = self.delegate?.toolbarLeftDefaultItemIdentifiers?(self), itemIdentifiers.count > 0 {
  325. if (self.leftView.superview == nil) {
  326. self.addSubview(self.leftView)
  327. }
  328. self.leftView.mas_remakeConstraints { make in
  329. make?.left.equalTo()(self.mas_left)?.offset()(0)
  330. make?.top.equalTo()(self.mas_top)?.offset()(0)
  331. make?.bottom.equalTo()(self.mas_bottom)?.offset()(0)
  332. }
  333. var lastItem: KMToolbarItemView?
  334. for i in 0 ..< itemIdentifiers.count {
  335. let itemIdentifier = itemIdentifiers[i]
  336. var item: KMToolbarItemView?
  337. if itemIdentifier == KMToolbarDividerItemIdentifier {
  338. item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
  339. } else if itemIdentifier == KMNewToolbarSpaceItemIdentifier {
  340. item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
  341. item?.layer?.backgroundColor = .clear
  342. item?.imageViewBox.borderColor = .clear
  343. item?.layer?.cornerRadius = 0.0
  344. } else if let data = self.delegate?.toolbar?(self, itemFor: itemIdentifier) {
  345. item = data
  346. }
  347. guard let data = item else {
  348. continue
  349. }
  350. self.leftView.addSubview(data)
  351. // if (lastItem != nil) {
  352. // if (i == itemIdentifiers.count - 1) {
  353. // item?.mas_makeConstraints({ make in
  354. // make?.height.mas_equalTo()(40)
  355. // make?.centerY.mas_equalTo()(0)
  356. // make?.left.equalTo()(lastItem!.mas_right)?.offset()(KMToolbarItemSpace)
  357. // make?.right.equalTo()(self.leftView.mas_right)?.offset()(0)
  358. // })
  359. // } else {
  360. // item?.mas_makeConstraints({ make in
  361. // make?.height.mas_equalTo()(40)
  362. // make?.centerY.mas_equalTo()(0)
  363. // make?.left.equalTo()(lastItem!.mas_right)?.offset()(KMToolbarItemSpace)
  364. // })
  365. // }
  366. //
  367. // } else {
  368. // if (i == itemIdentifiers.count - 1) {
  369. // item?.mas_makeConstraints({ make in
  370. // make?.height.mas_equalTo()(40)
  371. // make?.centerY.mas_equalTo()(0)
  372. // make?.left.equalTo()(self.leftView.mas_left)?.offset()(KMToolbarItemSpace)
  373. // make?.right.equalTo()(self.leftView.mas_right)?.offset()(-20)
  374. // })
  375. // } else {
  376. // item?.mas_makeConstraints({ make in
  377. // make?.height.mas_equalTo()(40)
  378. // make?.centerY.mas_equalTo()(0)
  379. // make?.left.equalTo()(KMToolbarItemSpace)
  380. // })
  381. // }
  382. // }
  383. iWidth += data.itemWidth
  384. if lastItem != nil {
  385. // + 前一个的间距
  386. iWidth += Self.kHSpace
  387. }
  388. lastItem = item
  389. }
  390. iWidth += (Self.kLeftMargin + Self.kHSpace)
  391. }
  392. self._leftWidth = iWidth
  393. }
  394. private func _updateRightView() {
  395. // 刷新前移除视图
  396. for item in self.rightView.subviews {
  397. item.removeFromSuperview()
  398. }
  399. if (self.rightView.superview != nil) {
  400. self.rightView.removeFromSuperview()
  401. }
  402. var iWidth: CGFloat = 0
  403. if let itemIdentifiers = self.delegate?.toolbarRightDefaultItemIdentifiers?(self), itemIdentifiers.isEmpty == false {
  404. if (self.rightView.superview == nil) {
  405. self.addSubview(self.rightView)
  406. }
  407. // self.rightView.mas_remakeConstraints { make in
  408. // make?.right.equalTo()(self.mas_right)?.offset()(0)
  409. // make?.top.equalTo()(self.mas_top)?.offset()(0)
  410. // make?.bottom.equalTo()(self.mas_bottom)?.offset()(0)
  411. // }
  412. var lastItem: KMToolbarItemView?
  413. for i in 0 ..< itemIdentifiers.count {
  414. let itemIdentifier = itemIdentifiers[i]
  415. var item: KMToolbarItemView?
  416. if itemIdentifier == KMToolbarDividerItemIdentifier {
  417. item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
  418. } else if itemIdentifier == KMNewToolbarSpaceItemIdentifier {
  419. item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
  420. item?.layer?.backgroundColor = .clear
  421. item?.imageViewBox.borderColor = .clear
  422. item?.layer?.cornerRadius = 0.0;
  423. } else if let data = self.delegate?.toolbar?(self, itemFor: itemIdentifier) {
  424. item = data
  425. }
  426. guard let data = item else {
  427. continue
  428. }
  429. self.rightView.addSubview(data)
  430. // if (lastItem != nil) {
  431. // if (i == itemIdentifiers.count - 1) {
  432. // item?.mas_makeConstraints({ make in
  433. // make?.height.offset()(40)
  434. // make?.centerY.mas_equalTo()(0)
  435. // make?.left.equalTo()(lastItem!.mas_right)?.offset()(KMToolbarItemSpace)
  436. // make?.right.equalTo()(self.rightView.mas_right)?.offset()(-KMToolbarItemSpace)
  437. // })
  438. // } else {
  439. // item?.mas_makeConstraints({ make in
  440. // make?.height.offset()(40)
  441. // make?.centerY.mas_equalTo()(0)
  442. // make?.left.equalTo()(lastItem!.mas_right)?.offset()(KMToolbarItemSpace)
  443. // })
  444. // }
  445. // } else {
  446. // if (i == itemIdentifiers.count - 1) {
  447. // item?.mas_makeConstraints({ make in
  448. // make?.centerY.mas_equalTo()(0)
  449. // make?.height.offset()(40)
  450. // make?.left.equalTo()(self.rightView.mas_left)?.offset()(KMToolbarItemSpace)
  451. // make?.right.equalTo()(self.rightView.mas_right)?.offset()(-KMToolbarItemSpace)
  452. // })
  453. // } else {
  454. // item?.mas_makeConstraints({ make in
  455. // make?.height.offset()(40)
  456. // make?.centerY.mas_equalTo()(0)
  457. // make?.left.equalTo()(0)
  458. // })
  459. // }
  460. // }
  461. iWidth += data.itemWidth
  462. if lastItem != nil {
  463. // + 前一个的间距
  464. iWidth += Self.kHSpace
  465. }
  466. lastItem = item
  467. }
  468. iWidth += Self.kRightMargin
  469. }
  470. self._rightWidth = iWidth
  471. }
  472. override func updateLayer() {
  473. super.updateLayer()
  474. if KMAppearance.isDarkMode() {
  475. self.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
  476. } else {
  477. self.layer?.backgroundColor = .clear
  478. }
  479. for item in self._items {
  480. item.interfaceThemeDidChanged(self.window?.appearance?.name ?? .aqua)
  481. item.customizeView?.interfaceThemeDidChanged(self.appearance?.name ?? .aqua)
  482. item.nameBtn.setTitleColor(KMAppearance.titleColor())
  483. }
  484. }
  485. // MARK: - View Methods
  486. override func viewWillMove(toWindow newWindow: NSWindow?) {
  487. super.viewWillMove(toWindow: newWindow)
  488. if (newWindow != nil && self._contentView == nil) {
  489. let leftitemIdentifiers = self.delegate?.toolbarLeftDefaultItemIdentifiers?(self) ?? []
  490. if (leftitemIdentifiers.count > 0) {
  491. self._updateMainView()
  492. }else {
  493. self._updateView()
  494. }
  495. self.resizeSubviews(withOldSize: self.frame.size)
  496. // NotificationCenter.default.addObserver(self, selector: #selector(toolbarCustomChangeNotification), name: KMToolbarCustomChangeNotification, object: nil)
  497. let topLine = NSBox(frame: CGRectMake(0, 0, self.frame.size.width, 0.5))
  498. topLine.boxType = .separator
  499. topLine.fillColor = .black
  500. self.addSubview(topLine)
  501. topLine.mas_makeConstraints { make in
  502. make?.left.right().equalTo()(self)
  503. make?.bottom.equalTo()(self.mas_bottom)?.offset()(-0.5)
  504. make?.height.offset()(0.5)
  505. }
  506. let bottomLine = NSBox(frame: CGRectMake(0, 0, self.frame.size.width, 0.5))
  507. bottomLine.boxType = .separator
  508. bottomLine.fillColor = .black
  509. self.addSubview(bottomLine)
  510. bottomLine.mas_makeConstraints { make in
  511. make?.left.right().equalTo()(self)
  512. make?.top.equalTo()(self.mas_top)?.offset()(0.1)
  513. make?.height.offset()(0.5)
  514. }
  515. // DispatchQueue.main.async {
  516. // self._layoutSubViewsIfNeed()
  517. // }
  518. }
  519. if (newWindow != nil) {
  520. self._addTrackingArea()
  521. }
  522. }
  523. private func _right_layoutSubViewIfNeed() {
  524. if self._rightWidth < 0 { // 没有item
  525. return
  526. }
  527. if self.rightView.superview == nil { // 没有item
  528. return
  529. }
  530. if self.rightView.subviews.isEmpty { // 没有item
  531. return
  532. }
  533. let width = NSWidth(self.bounds)
  534. let contentW = self._leftWidth + self._centerWidth + self._rightWidth
  535. if width >= contentW { // 左 1 中 1 右 1
  536. self._updateRightView()
  537. return
  538. }
  539. if width >= self._leftWidth + self._centerWidth { // 左 1 中 1 右 0
  540. let leftMargin = self._leftWidth-self._centerWidth
  541. self.rightView.mas_remakeConstraints { make in
  542. make?.right.mas_equalTo()(-Self.kMoreWidth)
  543. make?.top.bottom().mas_equalTo()(0)
  544. make?.width.mas_equalTo()(width-leftMargin)
  545. }
  546. var itemX: CGFloat = leftMargin
  547. for sv in self.rightView.subviews {
  548. guard let item = sv as? KMToolbarItemView else {
  549. continue
  550. }
  551. let itemMaxX = itemX + item.itemWidth + Self.kHSpace
  552. if itemMaxX > width { // 隐藏
  553. item.isHidden = true
  554. self._invisibleItems.append(item)
  555. } else { // 显示
  556. item.isHidden = false
  557. }
  558. }
  559. return
  560. }
  561. // 右边完全显示不下
  562. self.rightView.mas_remakeConstraints { make in
  563. make?.right.mas_equalTo()(0)
  564. make?.top.bottom().mas_equalTo()(0)
  565. make?.width.mas_equalTo()(0)
  566. }
  567. }
  568. private func _center_layoutSubViewIfNeed() {
  569. if self._centerWidth < 0 { // 没有item
  570. return
  571. }
  572. if self.contentView.superview == nil { // 没有item
  573. return
  574. }
  575. if self.contentView.subviews.isEmpty { // 没有item
  576. return
  577. }
  578. let width = NSWidth(self.bounds)
  579. let contentW = self._leftWidth + self._centerWidth + self._rightWidth
  580. if width >= contentW { // 左 1 中 1 右 1
  581. if self.contentView.superview == self {
  582. self._updateView(false, false)
  583. } else {
  584. self._updateMainView(false, false)
  585. }
  586. return
  587. }
  588. if width >= self._leftWidth + self._centerWidth { // 左 1 中 1 右 0 (中 完全显示)
  589. if self.contentView.superview == self {
  590. self._updateView(false, false)
  591. } else {
  592. self._updateMainView(false, false)
  593. }
  594. return
  595. }
  596. if width >= self._leftWidth { // 左 1 中 1 右 0 (中 不完全显示)
  597. let leftMargin = self._leftWidth
  598. self.contentView.mas_remakeConstraints { make in
  599. make?.right.mas_equalTo()(-Self.kMoreWidth)
  600. make?.top.bottom().mas_equalTo()(0)
  601. make?.width.mas_equalTo()(width-leftMargin)
  602. }
  603. var itemX: CGFloat = leftMargin
  604. for sv in self.contentView.subviews {
  605. guard let item = sv as? KMToolbarItemView else {
  606. continue
  607. }
  608. let itemMaxX = itemX + item.itemWidth + Self.kHSpace
  609. if itemMaxX > width { // 隐藏
  610. item.isHidden = true
  611. self._invisibleItems.append(item)
  612. } else { // 显示
  613. item.isHidden = false
  614. }
  615. }
  616. return
  617. }
  618. // 中间完全显示不下
  619. if self.centerView.superview != nil {
  620. self.centerView.mas_remakeConstraints { make in
  621. make?.center.mas_equalTo()(0)
  622. make?.width.mas_equalTo()(0)
  623. }
  624. }
  625. self.contentView.mas_remakeConstraints { make in
  626. make?.center.mas_equalTo()(0)
  627. make?.width.mas_equalTo()(0)
  628. }
  629. }
  630. private func _layoutSubViewsIfNeed() {
  631. if (self._contentView == nil) {
  632. return
  633. }
  634. let moreButtonWidth = 18.0
  635. // let leftButtonWidth = 10.0
  636. // let leftW = NSWidth(self.leftView.frame)
  637. // let contentW = NSWidth(self.contentView.frame)
  638. // let rightW = NSWidth(self.rightView.frame)
  639. let leftW = self._leftWidth
  640. let contentW = self._centerWidth
  641. let rightW = self._rightWidth
  642. // KMPrint("width: \(leftW), \(contentW), \(rightW)")
  643. // KMPrint("\(self.frame.size.width)")
  644. // self._right_layoutSubViewIfNeed()
  645. // self._center_layoutSubViewIfNeed()
  646. let width = NSWidth(self.bounds)
  647. let height = NSHeight(self.bounds)
  648. let leftMargin = Self.kLeftMargin
  649. let hSpace = Self.kHSpace
  650. let itemH: CGFloat = 40
  651. var itemY: CGFloat = (height-itemH)*0.5
  652. let contentLength = leftW + contentW + rightW
  653. if (contentLength <= 0) {
  654. return
  655. }
  656. self._invisibleItems.removeAll()
  657. if width >= contentLength { // 左 + 中 + 右 显示(全)
  658. self.moreButton.isHidden = true
  659. let offset = width - contentLength
  660. self.leftView.frame = NSMakeRect(0, 0, leftW, height)
  661. var itemX: CGFloat = leftMargin
  662. for sv in self.leftView.subviews {
  663. guard let item = sv as? KMToolbarItemView else {
  664. continue
  665. }
  666. item.isHidden = false
  667. itemY = (height-item.itemHeight)*0.5
  668. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  669. itemX += item.itemWidth + hSpace
  670. }
  671. if self.isMain() {
  672. self.centerView.frame = NSMakeRect(leftW, 0, contentW + offset, height)
  673. self.contentView.frame = NSMakeRect(offset*0.5, 0, contentW, height)
  674. } else {
  675. self.contentView.frame = NSMakeRect(offset*0.5, 0, contentW, height)
  676. }
  677. itemX = 0
  678. for sv in self.contentView.subviews {
  679. guard let item = sv as? KMToolbarItemView else {
  680. continue
  681. }
  682. item.isHidden = false
  683. itemY = (height-item.itemHeight)*0.5
  684. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  685. itemX += item.itemWidth + hSpace
  686. }
  687. self.rightView.frame = NSMakeRect(leftW+contentW+offset, 0, rightW, height)
  688. itemX = 0
  689. for sv in self.rightView.subviews {
  690. guard let item = sv as? KMToolbarItemView else {
  691. continue
  692. }
  693. item.isHidden = false
  694. itemY = (height-item.itemHeight)*0.5
  695. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  696. itemX += item.itemWidth + hSpace
  697. }
  698. return
  699. } else { // 显示更多
  700. self.moreButton.isHidden = false
  701. self.moreButton.mas_remakeConstraints { make in
  702. make?.top.bottom().equalTo()(0)
  703. make?.width.mas_equalTo()(moreButtonWidth)
  704. make?.right.mas_equalTo()(0)
  705. }
  706. if width >= leftW + contentW { // 左 + 中 显示(全) 右显示不全
  707. let offset = width - leftW - contentW
  708. self.leftView.frame = NSMakeRect(0, 0, leftW, height)
  709. var itemX: CGFloat = leftMargin
  710. for sv in self.leftView.subviews {
  711. guard let item = sv as? KMToolbarItemView else {
  712. continue
  713. }
  714. item.isHidden = false
  715. itemY = (height-item.itemHeight)*0.5
  716. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  717. itemX += item.itemWidth + hSpace
  718. }
  719. if self.isMain() {
  720. self.centerView.frame = NSMakeRect(leftW, 0, contentW, height)
  721. self.contentView.frame = NSMakeRect(0, 0, contentW + offset, height)
  722. } else {
  723. self.contentView.frame = NSMakeRect(leftW, 0, contentW, height)
  724. }
  725. itemX = 0
  726. for sv in self.contentView.subviews {
  727. guard let item = sv as? KMToolbarItemView else {
  728. continue
  729. }
  730. item.isHidden = false
  731. itemY = (height-item.itemHeight)*0.5
  732. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  733. itemX += item.itemWidth + hSpace
  734. }
  735. self.rightView.frame = NSMakeRect(leftW+contentW, 0, offset, height)
  736. itemX = 0
  737. for sv in self.rightView.subviews {
  738. guard let item = sv as? KMToolbarItemView else {
  739. continue
  740. }
  741. itemY = (height-item.itemHeight)*0.5
  742. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  743. itemX += item.itemWidth + hSpace
  744. let itemMinX = NSMinX(self.rightView.frame) + itemX
  745. if itemMinX <= width {
  746. item.isHidden = false
  747. } else {
  748. item.isHidden = true
  749. self._invisibleItems.append(item)
  750. }
  751. }
  752. return
  753. } else if width >= leftW { // 左 显示(全) 中 显示不全 右不显示
  754. let offset = width - leftW
  755. self.leftView.frame = NSMakeRect(0, 0, leftW, height)
  756. var itemX: CGFloat = leftMargin
  757. for sv in self.leftView.subviews {
  758. guard let item = sv as? KMToolbarItemView else {
  759. continue
  760. }
  761. itemY = (height-item.itemHeight)*0.5
  762. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  763. itemX += item.itemWidth + hSpace
  764. item.isHidden = false
  765. }
  766. if self.isMain() {
  767. self.centerView.frame = NSMakeRect(leftW, 0, offset, height)
  768. self.contentView.frame = NSMakeRect(0, 0, offset, height)
  769. } else {
  770. self.contentView.frame = NSMakeRect(leftW, 0, offset, height)
  771. }
  772. itemX = 0
  773. for sv in self.contentView.subviews {
  774. guard let item = sv as? KMToolbarItemView else {
  775. continue
  776. }
  777. itemY = (height-item.itemHeight)*0.5
  778. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  779. itemX += item.itemWidth + hSpace
  780. let itemMinX = leftW + itemX
  781. if itemMinX <= width {
  782. item.isHidden = false
  783. } else {
  784. item.isHidden = true
  785. self._invisibleItems.append(item)
  786. }
  787. }
  788. self.rightView.frame = NSMakeRect(leftW+contentW, 0, 0, height)
  789. itemX = 0
  790. for sv in self.rightView.subviews {
  791. guard let item = sv as? KMToolbarItemView else {
  792. continue
  793. }
  794. itemY = (height-item.itemHeight)*0.5
  795. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  796. itemX += item.itemWidth + hSpace
  797. item.isHidden = true
  798. self._invisibleItems.append(item)
  799. }
  800. return
  801. } else { // 左显示不全 中 + 右 不显示
  802. let offset = width - leftW
  803. self.leftView.frame = NSMakeRect(0, 0, offset, height)
  804. var itemX: CGFloat = leftMargin
  805. for sv in self.leftView.subviews {
  806. guard let item = sv as? KMToolbarItemView else {
  807. continue
  808. }
  809. itemY = (height-item.itemHeight)*0.5
  810. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  811. itemX += item.itemWidth + hSpace
  812. if itemX <= width {
  813. item.isHidden = false
  814. } else {
  815. item.isHidden = true
  816. self._invisibleItems.append(item)
  817. }
  818. }
  819. if self.isMain() {
  820. self.centerView.frame = NSMakeRect(leftW, 0, 0, height)
  821. self.contentView.frame = NSMakeRect(0, 0, 0, height)
  822. } else {
  823. self.contentView.frame = NSMakeRect(leftW, 0, 0, height)
  824. }
  825. itemX = 0
  826. for sv in self.contentView.subviews {
  827. guard let item = sv as? KMToolbarItemView else {
  828. continue
  829. }
  830. itemY = (height-item.itemHeight)*0.5
  831. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  832. itemX += item.itemWidth + hSpace
  833. item.isHidden = true
  834. self._invisibleItems.append(item)
  835. }
  836. self.rightView.frame = NSMakeRect(leftW+contentW, 0, 0, height)
  837. itemX = 0
  838. for sv in self.rightView.subviews {
  839. guard let item = sv as? KMToolbarItemView else {
  840. continue
  841. }
  842. itemY = (height-item.itemHeight)*0.5
  843. item.frame = NSMakeRect(itemX, itemY, item.itemWidth, item.itemHeight)
  844. itemX += item.itemWidth + hSpace
  845. item.isHidden = true
  846. self._invisibleItems.append(item)
  847. }
  848. return
  849. }
  850. }
  851. #if false
  852. if contentLength <= self.frame.size.width { // 能正常显示
  853. if self.leftView.superview != nil {
  854. self.leftView.mas_remakeConstraints { make in
  855. make?.top.bottom().equalTo()(self)
  856. make?.left.equalTo()(self)
  857. make?.width.mas_equalTo()(leftW)
  858. }
  859. }
  860. if self.centerView.superview != nil {
  861. self.centerView.mas_remakeConstraints { make in
  862. make?.center.equalTo()(self)
  863. }
  864. } else {
  865. self.contentView.mas_remakeConstraints { make in
  866. make?.center.equalTo()(self)
  867. }
  868. }
  869. if self.rightView.superview != nil {
  870. self.rightView.mas_remakeConstraints { make in
  871. make?.top.bottom().equalTo()(self)
  872. make?.right.mas_equalTo()(0)
  873. make?.width.mas_equalTo()(rightW)
  874. // if self.centerView.superview != nil {
  875. // make?.left.equalTo()(self.centerView.mas_right)
  876. // } else {
  877. // make?.left.equalTo()(self.contentView.mas_right)
  878. // }
  879. }
  880. } else {
  881. }
  882. self.moreButton.isHidden = true
  883. } else { // 需要显示更多
  884. self.moreButton.isHidden = false
  885. self.moreButton.mas_remakeConstraints { make in
  886. make?.top.bottom().equalTo()(0)
  887. make?.width.mas_equalTo()(moreButtonWidth)
  888. make?.right.mas_equalTo()(0)
  889. }
  890. if self.frame.size.width > leftW + contentW { // 能显示 left + content, right 显示不下
  891. if self.centerView.superview != nil {
  892. self.centerView.mas_remakeConstraints { make in
  893. make?.center.equalTo()(self)
  894. }
  895. } else {
  896. self.contentView.mas_remakeConstraints { make in
  897. make?.center.equalTo()(self)
  898. }
  899. }
  900. if self.rightView.superview != nil {
  901. self.rightView.mas_remakeConstraints { make in
  902. make?.top.bottom().equalTo()(self)
  903. make?.right.mas_equalTo()(0)
  904. make?.width.mas_equalTo()(contentLength-self.frame.size.width)
  905. // if self.centerView.superview != nil {
  906. // make?.left.equalTo()(self.centerView.mas_right)
  907. // } else {
  908. // make?.left.equalTo()(self.contentView.mas_right)
  909. // }
  910. }
  911. }
  912. }
  913. }
  914. #endif
  915. // var frame = self.contentView.frame
  916. #if false
  917. let allItems: [KMToolbarItemView] = self.leftView.subviews as! [KMToolbarItemView] + self.items + self.rightView.subviews as! [KMToolbarItemView]
  918. var count = allItems.count
  919. var idx = count-1
  920. for item in allItems.reversed() {
  921. let tempFrame = item.superview?.convert(item.frame, to: item.superview!.superview) ?? .zero
  922. if (CGRectGetMaxX(tempFrame) <= self.frame.size.width) {
  923. count = idx
  924. break
  925. }
  926. idx -= 1
  927. }
  928. if (count >= allItems.count) {
  929. return
  930. }
  931. // frame.size.width = CGRectGetMaxX(self.items[count].frame)
  932. if (count == allItems.count-1) {
  933. // frame.origin.x = (self.frame.size.width-frame.size.width)/2.0;
  934. // self.moreButton.isHidden = true
  935. self._visibleItems = allItems
  936. self._invisibleItems = []
  937. for item in allItems {
  938. item.isHidden = false
  939. }
  940. // self.contentView.mas_remakeConstraints { make in
  941. // make?.centerX.equalTo()(0)
  942. // make?.centerY.equalTo()(0)
  943. // }
  944. } else {
  945. //// frame.origin.x = leftButtonWidth
  946. // self.moreButton.mas_makeConstraints { make in
  947. // make?.top.bottom().equalTo()(0)
  948. // make?.width.offset()(moreButtonWidth)
  949. // make?.right.equalTo()(self.mas_right)?.offset()(0)
  950. // }
  951. // self.moreButton.isHidden = false
  952. self._visibleItems.removeAll()
  953. for i in 0 ... count+1 {
  954. self._visibleItems.append(allItems[i])
  955. }
  956. // self.contentView.mas_remakeConstraints { make in
  957. // make?.left.equalTo()(self.mas_left)?.offset()(10)
  958. // make?.centerY.equalTo()(0)
  959. // }
  960. }
  961. self._invisibleItems.removeAll()
  962. for item in allItems.reversed() {
  963. let tempFrame = item.superview?.convert(item.frame, to: item.superview!.superview) ?? .zero
  964. KMPrint("\(item.itemIdentifier): \(tempFrame)")
  965. if (CGRectGetMaxX(tempFrame) <= self.frame.size.width) {
  966. item.isHidden = false
  967. } else {
  968. item.isHidden = true
  969. self._invisibleItems.append(item)
  970. }
  971. }
  972. if self._invisibleItems.isEmpty {
  973. KMPrint("无更多菜单")
  974. } else {
  975. for item in self._invisibleItems {
  976. KMPrint(item.itemIdentifier)
  977. }
  978. }
  979. #endif
  980. // KMPrint(self._visibleItems)
  981. }
  982. func hasLeft() -> Bool {
  983. if let items = self.delegate?.toolbarLeftDefaultItemIdentifiers?(self) {
  984. return items.count > 0
  985. }
  986. return false
  987. }
  988. func hasRight() -> Bool {
  989. if let items = self.delegate?.toolbarRightDefaultItemIdentifiers?(self) {
  990. return items.count > 0
  991. }
  992. return false
  993. }
  994. func hasCenter() -> Bool {
  995. if let items = self.delegate?.toolbarDefaultItemIdentifiers?(self) {
  996. return items.count > 0
  997. }
  998. return false
  999. }
  1000. func isMain() -> Bool {
  1001. if self.contentView.superview == self {
  1002. return false
  1003. }
  1004. return true
  1005. }
  1006. override func resizeSubviews(withOldSize oldSize: NSSize) {
  1007. super.resizeSubviews(withOldSize: oldSize)
  1008. self._layoutSubViewsIfNeed()
  1009. }
  1010. func reloadData() {
  1011. let leftitemIdentifiers = self.delegate?.toolbarLeftDefaultItemIdentifiers?(self) ?? []
  1012. if (leftitemIdentifiers.count > 0) {
  1013. self._updateMainView()
  1014. } else {
  1015. self._updateView()
  1016. }
  1017. self.resizeSubviews(withOldSize: self.frame.size)
  1018. }
  1019. func itemForItemIdentifier(_ itemIdentifier: String) -> KMToolbarItemView? {
  1020. for item in self.items {
  1021. if (item.itemIdentifier == itemIdentifier) {
  1022. return item
  1023. }
  1024. }
  1025. return nil
  1026. }
  1027. @objc func toolbarCustomChangeNotification() {
  1028. self.reloadData()
  1029. }
  1030. }