From 9ebd8c3dd7ba19fe889123e1b0a92c7bc9eed5cb Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Mon, 14 Feb 2022 09:33:20 +0800 Subject: [PATCH] Zonble: Refactor the handling of candidate window types. --- .../Modules/IMEModules/ctlInputMethod.swift | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/Source/Modules/IMEModules/ctlInputMethod.swift b/Source/Modules/IMEModules/ctlInputMethod.swift index 38de5d9e..303714be 100644 --- a/Source/Modules/IMEModules/ctlInputMethod.swift +++ b/Source/Modules/IMEModules/ctlInputMethod.swift @@ -20,7 +20,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR TH import Cocoa import InputMethodKit -extension Bool { +private extension Bool { var state: NSControl.StateValue { self ? .on : .off } @@ -30,11 +30,14 @@ private let kMinKeyLabelSize: CGFloat = 10 private var gCurrentCandidateController: CandidateController? +private extension CandidateController { + static let horizontal = HorizontalCandidateController() + static let vertical = VerticalCandidateController() +} + @objc(ctlInputMethod) class ctlInputMethod: IMKInputController { - private static let horizontalCandidateController = HorizontalCandidateController() - private static let verticalCandidateController = VerticalCandidateController() private static let tooltipController = TooltipController() // MARK: - @@ -464,20 +467,37 @@ extension ctlInputMethod { private func show(candidateWindowWith state: InputState, client: Any!) { let useVerticalMode: Bool = { + var useVerticalMode = false + var candidates: [String] = [] if let state = state as? InputState.ChoosingCandidate { - return state.useVerticalMode + useVerticalMode = state.useVerticalMode + candidates = state.candidates } 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 }() + + gCurrentCandidateController?.delegate = nil if useVerticalMode { - gCurrentCandidateController = ctlInputMethod.verticalCandidateController + gCurrentCandidateController = .vertical } else if Preferences.useHorizontalCandidateList { - gCurrentCandidateController = ctlInputMethod.horizontalCandidateController + gCurrentCandidateController = .horizontal } else { - gCurrentCandidateController = ctlInputMethod.verticalCandidateController + gCurrentCandidateController = .vertical } // set the attributes for the candidate panel (which uses NSAttributedString) @@ -551,7 +571,7 @@ extension ctlInputMethod { extension ctlInputMethod: KeyHandlerDelegate { func candidateController(for keyHandler: KeyHandler) -> Any { - gCurrentCandidateController ?? ctlInputMethod.verticalCandidateController + gCurrentCandidateController ?? .vertical } func keyHandler(_ keyHandler: KeyHandler, didSelectCandidateAt index: Int, candidateController controller: Any) {