KMConvertOCRSettingItemView.swift 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. //
  2. // KMConvertOCRSettingItemView.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2022/12/6.
  6. //
  7. import KMComponentLibrary
  8. class KMConvertOCRSettingItemView: KMConvertBaseView {
  9. @IBOutlet weak var titleLabel: NSTextField!
  10. @IBOutlet weak var checkBox: NSBox!
  11. @IBOutlet weak var languageBox: NSBox!
  12. private var _checkVC: KMDesignButton?
  13. var checkVC: KMDesignButton? {
  14. get {
  15. return self._checkVC
  16. }
  17. }
  18. private lazy var checkView_: ComponentCheckBox = {
  19. let view = ComponentCheckBox()
  20. view.properties = ComponentCheckBoxProperty(size: .s,
  21. state: .normal,
  22. isDisabled: false,
  23. showhelp: false,
  24. text: NSLocalizedString("Recognize text if needed", comment: ""),
  25. checkboxType: .normal)
  26. return view
  27. }()
  28. var checkView: ComponentCheckBox {
  29. get {
  30. return checkView_
  31. }
  32. }
  33. private var _languageVC: KMDesignSelect?
  34. var progressController: SKProgressController?
  35. private lazy var languageView_: ComponentSelect = {
  36. let view = ComponentSelect()
  37. view.properties = ComponentSelectProperties(size: .s,
  38. state: .normal,
  39. isDisabled: false,
  40. isError: false,
  41. leftIcon: false,
  42. placeholder: nil,
  43. errorText: nil,
  44. creatable: false,
  45. text: KMLocalizedString("Odd Pages Only", comment: ""))
  46. view.delegate = self
  47. return view
  48. }()
  49. private lazy var languages_: [String] = {
  50. return ["Chinese", "Chinese Traditional", "English", "Japanese",
  51. "Kroean",
  52. "Serbian",
  53. "Occitan",
  54. "Danish",
  55. "German",
  56. "French",
  57. "Italian",
  58. "Spanish",
  59. "Portuguese",
  60. "Maori",
  61. "Malay",
  62. "Maltese",
  63. "Dutch",
  64. "Norwegian",
  65. "Polish",
  66. "Romanian",
  67. "Slovak",
  68. "Slovenian",
  69. "Albanian",
  70. "Swedish",
  71. "Swahili",
  72. "Tagalog",
  73. "Turish",
  74. "Uzbek",
  75. "Vietnamese",
  76. "Afrikaans",
  77. "Azerbaijani",
  78. "Bosnian",
  79. "Czech",
  80. "Welsh",
  81. "Estonian",
  82. "Irish",
  83. "Croatian",
  84. "Hungarian",
  85. "Indonesian",
  86. "Icelandic",
  87. "Kurdish",
  88. "Lithuanian",
  89. "Latvian"]
  90. }()
  91. private var _languageIndex: Int = 0
  92. var languageIndex: Int {
  93. get {
  94. return self._languageIndex
  95. }
  96. set {
  97. self._languageIndex = newValue
  98. self.languageView_.properties.text = self.languages_.safe_element(for: newValue) as? String ?? ""
  99. self.languageView_.selectItemAtIndex(newValue)
  100. }
  101. }
  102. var lanugageDidSelected: KMValueDidChangeBlock?
  103. var needOCRAction: ((_ needOCR: Bool) -> Void)?
  104. var reachabilityAlert: NSAlert?
  105. override func awakeFromNib() {
  106. super.awakeFromNib()
  107. self._checkAction()
  108. }
  109. override func initSubViews() {
  110. super.initSubViews()
  111. self.checkBox.contentView = self.checkView_
  112. self._languageVC = KMDesignSelect(withType: .Combox)
  113. self.languageBox.contentView = self._languageVC?.view
  114. }
  115. override func initDefaultVlaue() {
  116. super.initDefaultVlaue()
  117. self.titleLabel.stringValue = NSLocalizedString("Text Recognition Settings", comment: "")
  118. self.titleLabel.textColor = NSColor.km_init(hex: "#616469")
  119. self.titleLabel.font = .SFProTextRegularFont(12)
  120. self.checkBox.fillColor = .clear
  121. self.checkView_.setTarget(self, action: #selector(checkBoxAction))
  122. self.languageBox.fillColor = .clear
  123. self.languageBox.contentView = self.languageView_
  124. var menuItemArr: [ComponentMenuitemProperty] = []
  125. for language in languages_ {
  126. let itemProperty: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
  127. itemSelected: false,
  128. isDisabled: false,
  129. keyEquivalent: nil,
  130. text: language)
  131. menuItemArr.append(itemProperty)
  132. }
  133. languageView_.updateMenuItemsArr(menuItemArr)
  134. languageView_.selectItemAtIndex(0)
  135. languageView_.properties.creatable = false
  136. languageView_.properties.text = ""
  137. languageView_.reloadData()
  138. }
  139. @objc func checkBoxAction(sender: NSButton) {
  140. self._checkAction()
  141. }
  142. #if VERSION_DMG
  143. func downLoad() {
  144. DispatchQueue.main.async {
  145. self.showProgressWindow()
  146. self.progressController?.maxValue = Double(100)
  147. }
  148. KMResourceDownloadManager.manager.downloadFramework(progress: { progress in
  149. self.progressController?.doubleValue = Double(progress*100)
  150. }, result: { result, downloadState in
  151. if result {
  152. if let state = self._checkVC?.state {
  153. self._checkVC?.state = state == .Checked ? .Norm : .Checked
  154. }
  155. self._checkAction()
  156. if let state = self._checkVC?.state {
  157. self._checkVC?.state = state == .Checked ? .Norm : .Checked
  158. }
  159. self._checkAction()
  160. self.hiddenProgressWindow()
  161. } else if downloadState == .retry {
  162. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2, execute: { [weak self] in
  163. self?.downLoad()
  164. })
  165. } else {
  166. self.hiddenProgressWindow()
  167. }
  168. })
  169. }
  170. #endif
  171. public func checkAction() {
  172. self._checkAction()
  173. }
  174. private func _checkAction() {
  175. let state = self.checkView_.properties.checkboxType
  176. languageView_.properties.isDisabled = state != .selected
  177. languageView_.reloadData()
  178. needOCRAction?(!languageView_.properties.isDisabled)
  179. }
  180. func showProgressWindow() {
  181. let progress = SKProgressController()
  182. progress.window?.backgroundColor = NSColor.km_init(hex: "#36383B")
  183. progress.window?.contentView?.wantsLayer = true
  184. progress.window?.contentView?.layer?.backgroundColor = NSColor.km_init(hex: "#36383B").cgColor
  185. progress.progressField.textColor = NSColor.white
  186. progress.message = NSLocalizedString("Download...", comment: "")
  187. progress.closeBlock = { [weak self] in
  188. #if VERSION_DMG
  189. KMResourceDownloadManager.manager.cancelDownload()
  190. #endif
  191. }
  192. self.progressController = progress
  193. self.window?.beginSheet(progress.window!)
  194. }
  195. func hiddenProgressWindow() {
  196. DispatchQueue.main.async {
  197. self.progressController?.doubleValue = 100.0
  198. if (self.progressController != nil) {
  199. self.window?.endSheet((self.progressController?.window)!)
  200. self.progressController = nil
  201. }
  202. }
  203. }
  204. }
  205. extension KMConvertOCRSettingItemView: KMSelectPopButtonDelegate {
  206. func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
  207. if (obj.isEqual(to: self._languageVC)) {
  208. guard let index = self._languageVC?.indexOfSelectedItem, index >= 0 else {
  209. return
  210. }
  211. self._languageIndex = index
  212. guard let callback = self.lanugageDidSelected else {
  213. return
  214. }
  215. callback(index, nil)
  216. }
  217. }
  218. }
  219. extension KMConvertOCRSettingItemView: ComponentSelectDelegate {
  220. func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) {
  221. guard let index = view?.indexOfSelect(), index >= 0 else {
  222. return
  223. }
  224. self._languageIndex = index
  225. guard let callback = self.lanugageDidSelected else {
  226. return
  227. }
  228. callback(index, nil)
  229. }
  230. }