Zonble: Refactor the handling of candidate window types.

This commit is contained in:
ShikiSuen 2022-02-14 09:33:20 +08:00
parent 06c90fd4f2
commit 195d47a6f1
1 changed files with 29 additions and 9 deletions

View File

@ -20,7 +20,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH
import Cocoa import Cocoa
import InputMethodKit import InputMethodKit
extension Bool { private extension Bool {
var state: NSControl.StateValue { var state: NSControl.StateValue {
self ? .on : .off self ? .on : .off
} }
@ -30,11 +30,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(ctlInputMethod) @objc(ctlInputMethod)
class ctlInputMethod: IMKInputController { class ctlInputMethod: IMKInputController {
private static let horizontalCandidateController = HorizontalCandidateController()
private static let verticalCandidateController = VerticalCandidateController()
private static let tooltipController = TooltipController() private static let tooltipController = TooltipController()
// MARK: - // MARK: -
@ -464,20 +467,37 @@ extension ctlInputMethod {
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 = ctlInputMethod.verticalCandidateController gCurrentCandidateController = .vertical
} else if Preferences.useHorizontalCandidateList { } else if Preferences.useHorizontalCandidateList {
gCurrentCandidateController = ctlInputMethod.horizontalCandidateController gCurrentCandidateController = .horizontal
} else { } else {
gCurrentCandidateController = ctlInputMethod.verticalCandidateController gCurrentCandidateController = .vertical
} }
// set the attributes for the candidate panel (which uses NSAttributedString) // set the attributes for the candidate panel (which uses NSAttributedString)
@ -551,7 +571,7 @@ extension ctlInputMethod {
extension ctlInputMethod: KeyHandlerDelegate { extension ctlInputMethod: KeyHandlerDelegate {
func candidateController(for keyHandler: KeyHandler) -> Any { func candidateController(for keyHandler: KeyHandler) -> Any {
gCurrentCandidateController ?? ctlInputMethod.verticalCandidateController gCurrentCandidateController ?? .vertical
} }
func keyHandler(_ keyHandler: KeyHandler, didSelectCandidateAt index: Int, candidateController controller: Any) { func keyHandler(_ keyHandler: KeyHandler, didSelectCandidateAt index: Int, candidateController controller: Any) {