Automatically uses vertical candidate list if there is a long candidate.

This commit is contained in:
zonble 2022-02-14 01:01:03 +08:00
parent 83184229e6
commit 4d94bb0cd2
1 changed files with 29 additions and 9 deletions

View File

@ -29,7 +29,7 @@ import TooltipUI
import VXHanConvert import VXHanConvert
import OpenCCBridge import OpenCCBridge
extension Bool { private extension Bool {
var state: NSControl.StateValue { var state: NSControl.StateValue {
self ? .on : .off self ? .on : .off
} }
@ -39,11 +39,14 @@ private let kMinKeyLabelSize: CGFloat = 10
private var gCurrentCandidateController: CandidateController? private var gCurrentCandidateController: CandidateController?
private extension CandidateController {
static let horizontal = HorizontalCandidateController()
static let vertical = VerticalCandidateController()
}
@objc(McBopomofoInputMethodController) @objc(McBopomofoInputMethodController)
class McBopomofoInputMethodController: IMKInputController { class McBopomofoInputMethodController: IMKInputController {
private static let horizontalCandidateController = HorizontalCandidateController()
private static let verticalCandidateController = VerticalCandidateController()
private static let tooltipController = TooltipController() private static let tooltipController = TooltipController()
// MARK: - // MARK: -
@ -441,20 +444,37 @@ extension McBopomofoInputMethodController {
private func show(candidateWindowWith state: InputState, client: Any!) { private func show(candidateWindowWith state: InputState, client: Any!) {
let useVerticalMode: Bool = { let useVerticalMode: Bool = {
var useVerticalMode = false
var candidates: [String] = []
if let state = state as? InputState.ChoosingCandidate { if let state = state as? InputState.ChoosingCandidate {
return state.useVerticalMode useVerticalMode = state.useVerticalMode
candidates = state.candidates
} else if let state = state as? InputState.AssociatedPhrases { } else if let state = state as? InputState.AssociatedPhrases {
return state.useVerticalMode useVerticalMode = state.useVerticalMode
candidates = state.candidates
}
if useVerticalMode == true {
return true
}
candidates.sort {
return $0.count > $1.count
}
// If there is a candidate which is too long, we use the vertical
// candidate list window automatically.
if candidates.first?.count ?? 0 > 8 {
return true
} }
return false return false
}() }()
gCurrentCandidateController?.delegate = nil
if useVerticalMode { if useVerticalMode {
gCurrentCandidateController = McBopomofoInputMethodController.verticalCandidateController gCurrentCandidateController = .vertical
} else if Preferences.useHorizontalCandidateList { } else if Preferences.useHorizontalCandidateList {
gCurrentCandidateController = McBopomofoInputMethodController.horizontalCandidateController gCurrentCandidateController = .horizontal
} else { } else {
gCurrentCandidateController = McBopomofoInputMethodController.verticalCandidateController gCurrentCandidateController = .vertical
} }
// set the attributes for the candidate panel (which uses NSAttributedString) // set the attributes for the candidate panel (which uses NSAttributedString)
@ -528,7 +548,7 @@ extension McBopomofoInputMethodController {
extension McBopomofoInputMethodController: KeyHandlerDelegate { extension McBopomofoInputMethodController: KeyHandlerDelegate {
func candidateController(for keyHandler: KeyHandler) -> Any { func candidateController(for keyHandler: KeyHandler) -> Any {
gCurrentCandidateController ?? McBopomofoInputMethodController.verticalCandidateController gCurrentCandidateController ?? .vertical
} }
func keyHandler(_ keyHandler: KeyHandler, didSelectCandidateAt index: Int, candidateController controller: Any) { func keyHandler(_ keyHandler: KeyHandler, didSelectCandidateAt index: Int, candidateController controller: Any) {