KMSegmentedControl.swift 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. //
  2. // KMSegmentedControl.swift
  3. // PDF Master
  4. //
  5. // Created by tangchao on 2023/11/16.
  6. //
  7. import Cocoa
  8. class KMSegmentedControl: NSControl {
  9. private var _segmentCount: UInt8 = 0
  10. var segmentCount: UInt8 {
  11. get {
  12. return self._segmentCount
  13. }
  14. set {
  15. self._segmentCount = newValue
  16. self.setSegmentCount(self.segmentCount, with: 55)
  17. }
  18. }
  19. var selectedSegment: UInt8 = 0 {
  20. didSet {
  21. if (self.block != nil) {
  22. self.block!(self.selectedSegment)
  23. }
  24. for i in 0 ..< self.segments.count {
  25. let button = self.segments[i]
  26. if (self.isBackgroundHighlighted) {
  27. if (i == self.selectedSegment) {
  28. button.wantsLayer = true
  29. button.layer?.cornerRadius = 6.0
  30. if (KMAppearance.isDarkMode()) {
  31. button.layer?.backgroundColor = NSColor(red: 0.133, green: 0.478, blue: 1, alpha: 0.3).cgColor
  32. } else {
  33. button.layer?.backgroundColor = NSColor(red: 0.286, green: 0.510, blue: 0.902, alpha: 0.2).cgColor
  34. }
  35. if (i == 0) {
  36. button.image = NSImage(named: KMImageNameUXIconBtnSidebarListPre)
  37. } else if (i == 1) {
  38. button.image = NSImage(named: KMImageNameUXIconBtnSidebarPagePre)
  39. }
  40. } else {
  41. button.wantsLayer = true;
  42. button.layer?.backgroundColor = .clear
  43. if (i == 0) {
  44. button.image = NSImage(named: KMImageNameUXIconBtnSidebarListNor)
  45. } else if (i == 1) {
  46. button.image = NSImage(named: KMImageNameUXIconBtnSidebarPageNor)
  47. }
  48. }
  49. } else {
  50. if (i == self.selectedSegment) {
  51. if (i == 0) {
  52. button.image = NSImage(named: KMImageNameUXIconSidetabbarThumbnailSel)
  53. } else if (i == 1) {
  54. button.image = NSImage(named: KMImageNameUXIconSidetabbarOutlineSel)
  55. } else if (i == 2) {
  56. button.image = NSImage(named: KMImageNameUXIconSidetabbarAnnotationSel)
  57. } else if (i == 3) {
  58. button.image = NSImage(named: KMImageNameUXIconSidetabbarSnapshotSel)
  59. } else if (i == 4) {
  60. button.image = NSImage(named: KMImageNameUXIconSidetabbarSearchSel)
  61. }
  62. button.wantsLayer = true
  63. if (KMAppearance.isDarkMode()) {
  64. button.layer?.backgroundColor = NSColor(red: 0.133, green: 0.478, blue: 1.000, alpha: 1).cgColor
  65. } else {
  66. button.layer?.backgroundColor = NSColor(red: 0.286, green: 0.510, blue: 0.902, alpha: 1).cgColor
  67. }
  68. } else {
  69. if (i == 0) {
  70. button.image = NSImage(named: KMImageNameUXIconSidetabbarThumbnailNor)
  71. } else if (i == 1) {
  72. button.image = NSImage(named: KMImageNameUXIconSidetabbarOutlineNor)
  73. } else if (i == 2) {
  74. button.image = NSImage(named: KMImageNameUXIconSidetabbarAnnotationNor)
  75. } else if (i == 3) {
  76. button.image = NSImage(named: KMImageNameUXIconSidetabbarSnapshotNor)
  77. } else if (i == 4) {
  78. button.image = NSImage(named: KMImageNameUXIconSidetabbarSearchNor)
  79. }
  80. button.wantsLayer = true
  81. if (KMAppearance.isDarkMode()) {
  82. button.layer?.backgroundColor = NSColor(red: 0.224, green: 0.235, blue: 0.243, alpha: 1).cgColor
  83. } else {
  84. button.layer?.backgroundColor = NSColor(red: 0.922, green: 0.925, blue: 0.941, alpha: 1).cgColor
  85. }
  86. }
  87. }
  88. }
  89. }
  90. }
  91. var isBackgroundHighlighted = false
  92. var block: ((_ segmentCount: UInt8) -> Void)?
  93. var buttonActionHandle: ((_ segmentCount: UInt8) -> Void)?
  94. private var _segments: [NSButton] = []
  95. var segments: [NSButton] {
  96. get {
  97. return self._segments
  98. }
  99. }
  100. private var _contentView: NSView?
  101. var contentView: NSView? {
  102. get {
  103. return self._contentView
  104. }
  105. }
  106. override func updateLayer() {
  107. super.updateLayer()
  108. if #available(macOS 10.14, *) {
  109. self.selectedSegment = self._segmentCount
  110. }
  111. }
  112. // MARK: - Public Methods
  113. func setSegmentCount(_ segmentCount: uint8, with width: Float) {
  114. self._segmentCount = segmentCount
  115. let height = self.frame.size.height
  116. if (self.contentView?.superview != nil) {
  117. self.contentView?.removeFromSuperview()
  118. }
  119. self._contentView = NSView()
  120. let x = (self.frame.size.width - (Float(self.segmentCount) * width).cgFloat) / 2.0
  121. let y = (self.frame.size.height-height)/2.0
  122. self._contentView?.frame = NSMakeRect(x, y, (Float(self.segmentCount)*width).cgFloat, height)
  123. self._contentView?.autoresizingMask = [.minXMargin, .maxXMargin, .minYMargin, .maxYMargin]
  124. self.addSubview(self.contentView!)
  125. self._segments.removeAll()
  126. for i in 0 ..< self.segmentCount {
  127. let button = NSButton()
  128. button.bezelStyle = .regularSquare
  129. button.isBordered = false
  130. button.imageScaling = .scaleProportionallyDown
  131. button.imagePosition = .imageOnly
  132. button.frame = NSMakeRect((Float(i)*width).cgFloat, 0, width.cgFloat, height)
  133. button.tag = Int(i)
  134. button.target = self
  135. button.action = #selector(_buttonAction)
  136. self.contentView?.addSubview(button)
  137. self._segments.append(button)
  138. }
  139. }
  140. func setImage(_ image: NSImage, for segment: UInt8) {
  141. if (segment >= self.segments.count) {
  142. return
  143. }
  144. let button = self.segments[Int(segment)]
  145. button.image = image
  146. button.alternateImage = image
  147. }
  148. func setToolTip(_ toolTip: String, for segment: uint8) {
  149. if (segment >= self.segments.count) {
  150. return
  151. }
  152. let button = self.segments[Int(segment)]
  153. button.toolTip = toolTip
  154. }
  155. }
  156. // MARK: - Private Methods
  157. extension KMSegmentedControl {
  158. @objc private func _buttonAction(_ sender: NSButton) {
  159. self.selectedSegment = UInt8(sender.tag)
  160. if (self.buttonActionHandle != nil) {
  161. self.buttonActionHandle!(self.selectedSegment)
  162. }
  163. }
  164. /*
  165. - (NSImage *)image:(NSImage *)image withColor:(NSColor *)color {
  166. NSImage *newImage = [image copy];
  167. [newImage lockFocus];
  168. [color set];
  169. NSRectFillUsingOperation(NSMakeRect(0, 0, image.size.width, image.size.height), NSCompositingOperationSourceAtop);
  170. [newImage unlockFocus];
  171. return [newImage autorelease];
  172. }
  173. */
  174. }