InputSignal // Reformat & refactor.

This commit is contained in:
ShikiSuen 2022-07-26 13:09:18 +08:00
parent 50cb3c7106
commit 74785b0df2
4 changed files with 61 additions and 168 deletions

View File

@ -128,7 +128,7 @@ enum CharCode: UInt16 {
struct InputSignal: CustomStringConvertible {
private(set) var isTypingVertical: Bool
private(set) var inputText: String?
private(set) var inputText: String
private(set) var inputTextIgnoringModifiers: String?
private(set) var charCode: UInt16
private(set) var keyCode: UInt16
@ -139,16 +139,16 @@ struct InputSignal: CustomStringConvertible {
private var extraChooseCandidateKey: KeyCode = .kNone
private var extraChooseCandidateKeyReverse: KeyCode = .kNone
private var absorbedArrowKey: KeyCode = .kNone
private var verticalTypingOnlyChooseCandidateKey: KeyCode = .kNone
private var verticalTypingCandidateKey: KeyCode = .kNone
private(set) var emacsKey: EmacsKey
public init(
inputText: String?, keyCode: UInt16, charCode: UInt16, flags: NSEvent.ModifierFlags,
inputText: String = "", keyCode: UInt16, charCode: UInt16, flags: NSEvent.ModifierFlags,
isVerticalTyping: Bool = false, inputTextIgnoringModifiers: String? = nil
) {
self.inputText = AppleKeyboardConverter.cnvStringApple2ABC(inputText ?? "")
self.inputText = AppleKeyboardConverter.cnvStringApple2ABC(inputText)
self.inputTextIgnoringModifiers = AppleKeyboardConverter.cnvStringApple2ABC(
inputTextIgnoringModifiers ?? inputText ?? "")
inputTextIgnoringModifiers ?? inputText)
self.flags = flags
isFlagChanged = false
isTypingVertical = isVerticalTyping
@ -164,7 +164,7 @@ struct InputSignal: CustomStringConvertible {
public init(event: NSEvent, isVerticalTyping: Bool = false) {
inputText = AppleKeyboardConverter.cnvStringApple2ABC(event.characters ?? "")
inputTextIgnoringModifiers = AppleKeyboardConverter.cnvStringApple2ABC(
event.charactersIgnoringModifiers ?? "")
event.charactersIgnoringModifiers ?? inputText)
keyCode = event.keyCode
flags = event.modifierFlags
isFlagChanged = (event.type == .flagsChanged)
@ -191,170 +191,64 @@ struct InputSignal: CustomStringConvertible {
extraChooseCandidateKey = isTypingVertical ? .kLeftArrow : .kDownArrow
extraChooseCandidateKeyReverse = isTypingVertical ? .kRightArrow : .kUpArrow
absorbedArrowKey = isTypingVertical ? .kRightArrow : .kUpArrow
verticalTypingOnlyChooseCandidateKey = isTypingVertical ? absorbedArrowKey : .kNone
verticalTypingCandidateKey = isTypingVertical ? absorbedArrowKey : .kNone
}
var description: String {
"<inputText:\(String(describing: inputText)), inputTextIgnoringModifiers:\(String(describing: inputTextIgnoringModifiers)) charCode:\(charCode), keyCode:\(keyCode), flags:\(flags), cursorForwardKey:\(cursorForwardKey), cursorBackwardKey:\(cursorBackwardKey), extraChooseCandidateKey:\(extraChooseCandidateKey), extraChooseCandidateKeyReverse:\(extraChooseCandidateKeyReverse), absorbedArrowKey:\(absorbedArrowKey), verticalTypingOnlyChooseCandidateKey:\(verticalTypingOnlyChooseCandidateKey), emacsKey:\(emacsKey), isTypingVertical:\(isTypingVertical)>"
"<inputText:\(String(describing: inputText)), inputTextIgnoringModifiers:\(String(describing: inputTextIgnoringModifiers)) charCode:\(charCode), keyCode:\(keyCode), flags:\(flags), cursorForwardKey:\(cursorForwardKey), cursorBackwardKey:\(cursorBackwardKey), extraChooseCandidateKey:\(extraChooseCandidateKey), extraChooseCandidateKeyReverse:\(extraChooseCandidateKeyReverse), absorbedArrowKey:\(absorbedArrowKey), verticalTypingCandidateKey:\(verticalTypingCandidateKey), emacsKey:\(emacsKey), isTypingVertical:\(isTypingVertical)>"
}
// ANSI charCode Swift KeyHandler
var isInvalidInput: Bool {
switch charCode {
case 0x20...0xFF: // ANSI charCode
return false
default:
if isReservedKey, !isKeyCodeBlacklisted {
return false
}
return true
}
}
var isInvalid: Bool { (0x20...0xFF).contains(charCode) ? false : !(isReservedKey && !isKeyCodeBlacklisted) }
var isKeyCodeBlacklisted: Bool {
guard let code = KeyCodeBlackListed(rawValue: keyCode) else {
return false
}
guard let code = KeyCodeBlackListed(rawValue: keyCode) else { return false }
return code.rawValue != KeyCode.kNone.rawValue
}
var isShiftHold: Bool {
flags.contains([.shift])
}
var isCommandHold: Bool {
flags.contains([.command])
}
var isControlHold: Bool {
flags.contains([.control])
}
var isControlHotKey: Bool {
flags.contains([.control]) && inputText?.first?.isLetter ?? false
}
var isOptionHold: Bool {
flags.contains([.option])
}
var isOptionHotKey: Bool {
flags.contains([.option]) && inputText?.first?.isLetter ?? false
}
var isCapsLockOn: Bool {
flags.contains([.capsLock])
}
var isNumericPad: Bool {
flags.contains([.numericPad])
}
var isFunctionKeyHold: Bool {
flags.contains([.function])
}
var isReservedKey: Bool {
guard let code = KeyCode(rawValue: keyCode) else {
return false
}
guard let code = KeyCode(rawValue: keyCode) else { return false }
return code.rawValue != KeyCode.kNone.rawValue
}
/// flags KeyCode
var isNumericPadAreaKey: Bool {
arrNumpadKeyCodes.contains(keyCode)
}
var isNumericPadKey: Bool { arrNumpadKeyCodes.contains(keyCode) }
var isShiftHold: Bool { flags.contains([.shift]) }
var isCommandHold: Bool { flags.contains([.command]) }
var isControlHold: Bool { flags.contains([.control]) }
var isControlHotKey: Bool { flags.contains([.control]) && inputText.first?.isLetter ?? false }
var isOptionHold: Bool { flags.contains([.option]) }
var isOptionHotKey: Bool { flags.contains([.option]) && inputText.first?.isLetter ?? false }
var isCapsLockOn: Bool { flags.contains([.capsLock]) }
var isFunctionKeyHold: Bool { flags.contains([.function]) }
var isNonLaptopFunctionKey: Bool { flags.contains([.numericPad]) && !isNumericPadKey }
var isEnter: Bool { [KeyCode.kCarriageReturn, KeyCode.kLineFeed].contains(KeyCode(rawValue: keyCode)) }
var isTab: Bool { KeyCode(rawValue: keyCode) == KeyCode.kTab }
var isUp: Bool { KeyCode(rawValue: keyCode) == KeyCode.kUpArrow }
var isDown: Bool { KeyCode(rawValue: keyCode) == KeyCode.kDownArrow }
var isLeft: Bool { KeyCode(rawValue: keyCode) == KeyCode.kLeftArrow }
var isRight: Bool { KeyCode(rawValue: keyCode) == KeyCode.kRightArrow }
var isPageUp: Bool { KeyCode(rawValue: keyCode) == KeyCode.kPageUp }
var isPageDown: Bool { KeyCode(rawValue: keyCode) == KeyCode.kPageDown }
var isSpace: Bool { KeyCode(rawValue: keyCode) == KeyCode.kSpace }
var isBackSpace: Bool { KeyCode(rawValue: keyCode) == KeyCode.kBackSpace }
var isEsc: Bool { KeyCode(rawValue: keyCode) == KeyCode.kEscape }
var isHome: Bool { KeyCode(rawValue: keyCode) == KeyCode.kHome }
var isEnd: Bool { KeyCode(rawValue: keyCode) == KeyCode.kEnd }
var isDelete: Bool { KeyCode(rawValue: keyCode) == KeyCode.kWindowsDelete }
var isCursorBackward: Bool { KeyCode(rawValue: keyCode) == cursorBackwardKey }
var isCursorForward: Bool { KeyCode(rawValue: keyCode) == cursorForwardKey }
var isAbsorbedArrowKey: Bool { KeyCode(rawValue: keyCode) == absorbedArrowKey }
var isExtraChooseCandidateKey: Bool { KeyCode(rawValue: keyCode) == extraChooseCandidateKey }
var isExtraChooseCandidateKeyReverse: Bool { KeyCode(rawValue: keyCode) == extraChooseCandidateKeyReverse }
var isVerticalTypingCandidateKey: Bool { KeyCode(rawValue: keyCode) == verticalTypingCandidateKey }
var isTab: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kTab
}
var isEnter: Bool {
(KeyCode(rawValue: keyCode) == KeyCode.kCarriageReturn)
|| (KeyCode(rawValue: keyCode) == KeyCode.kLineFeed)
}
var isUp: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kUpArrow
}
var isDown: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kDownArrow
}
var isLeft: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kLeftArrow
}
var isRight: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kRightArrow
}
var isPageUp: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kPageUp
}
var isPageDown: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kPageDown
}
var isSpace: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kSpace
}
var isBackSpace: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kBackSpace
}
var isEsc: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kEscape
}
var isHome: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kHome
}
var isEnd: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kEnd
}
var isDelete: Bool {
KeyCode(rawValue: keyCode) == KeyCode.kWindowsDelete
}
var isCursorBackward: Bool {
KeyCode(rawValue: keyCode) == cursorBackwardKey
}
var isCursorForward: Bool {
KeyCode(rawValue: keyCode) == cursorForwardKey
}
var isAbsorbedArrowKey: Bool {
KeyCode(rawValue: keyCode) == absorbedArrowKey
}
var isExtraChooseCandidateKey: Bool {
KeyCode(rawValue: keyCode) == extraChooseCandidateKey
}
var isExtraChooseCandidateKeyReverse: Bool {
KeyCode(rawValue: keyCode) == extraChooseCandidateKeyReverse
}
var isVerticalTypingOnlyChooseCandidateKey: Bool {
KeyCode(rawValue: keyCode) == verticalTypingOnlyChooseCandidateKey
}
var isUpperCaseASCIILetterKey: Bool {
// flags == .shift Shift
(65...90).contains(charCode) && flags == .shift
}
// flags == .shift Shift
var isUpperCaseASCIILetterKey: Bool { (65...90).contains(charCode) && flags == .shift }
// KeyCode macOS Apple
// ![input isShift] 使 Shift
var isSymbolMenuPhysicalKey: Bool {
// KeyCode macOS Apple
// ![input isShift] 使 Shift
[KeyCode.kSymbolMenuPhysicalKeyIntl, KeyCode.kSymbolMenuPhysicalKeyJIS].contains(KeyCode(rawValue: keyCode))
}
}

View File

@ -288,7 +288,7 @@ extension KeyHandler {
var index: Int = NSNotFound
let match: String =
(state is InputState.AssociatedPhrases) ? input.inputTextIgnoringModifiers ?? "" : inputText ?? ""
(state is InputState.AssociatedPhrases) ? input.inputTextIgnoringModifiers ?? "" : inputText
var j = 0
while j < ctlCandidateCurrent.keyLabels.count {

View File

@ -45,16 +45,15 @@ extension KeyHandler {
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
// inputTest
guard !input.inputText.isEmpty else { return false }
let charCode: UniChar = input.charCode
let inputText: String = input.inputText
var state = state //
// inputTest
guard let inputText: String = input.inputText, !inputText.isEmpty else {
return false
}
// Megrez
if input.isInvalidInput {
if input.isInvalid {
// .Empty(IgnoringPreviousState) .Deactivated
// .EmptyIgnorePreviousState.Empty
if state is InputState.Empty || state is InputState.Deactivated {
@ -68,7 +67,7 @@ extension KeyHandler {
//
let isFunctionKey: Bool =
input.isControlHotKey || (input.isCommandHold || input.isOptionHotKey || input.isNumericPad)
input.isControlHotKey || (input.isCommandHold || input.isOptionHotKey || input.isNonLaptopFunctionKey)
if !(state is InputState.NotEmpty) && !(state is InputState.AssociatedPhrases) && isFunctionKey {
return false
}
@ -108,10 +107,10 @@ extension KeyHandler {
// MARK: (Numeric Pad Processing)
// isNumericPadAreaKey KeyCode
//
// isNumericPadKey KeyCode
// 使 Cocoa flags
//
if input.isNumericPadAreaKey {
if input.isNumericPadKey {
if !(state is InputState.ChoosingCandidate || state is InputState.AssociatedPhrases
|| state is InputState.SymbolTable)
{
@ -268,7 +267,7 @@ extension KeyHandler {
if let currentState = state as? InputState.NotEmpty, composer.isEmpty, !input.isOptionHold,
input.isExtraChooseCandidateKey || input.isExtraChooseCandidateKeyReverse || input.isSpace
|| input.isPageDown || input.isPageUp || (input.isTab && mgrPrefs.specifyShiftTabKeyBehavior)
|| (input.isTypingVertical && (input.isVerticalTypingOnlyChooseCandidateKey))
|| (input.isTypingVertical && (input.isVerticalTypingCandidateKey))
{
if input.isSpace {
/// Space
@ -479,11 +478,11 @@ extension KeyHandler {
/// 使
if state is InputState.Empty {
if input.isSpace, !input.isOptionHold, !input.isFunctionKeyHold, !input.isControlHold, !input.isCommandHold {
if input.isSpace, !input.isOptionHold, !input.isControlHold, !input.isCommandHold {
stateCallback(InputState.Committing(textToCommit: input.isShiftHold ? " " : " "))
stateCallback(InputState.Empty())
return true
}
stateCallback(InputState.Empty())
return true
}
// MARK: - (Still Nothing)

View File

@ -296,7 +296,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
XCTAssertTrue(state is InputState.Empty, "\(state)")
}
func testisNumericPad() {
func testisNumericPadKey() {
var input = InputSignal(inputText: "b", keyCode: 0, charCode: charCode("b"), flags: [], isVerticalTyping: false)
var state: InputStateProtocol = InputState.Empty()
_ = handler.handle(input: input, state: state) { newState in
@ -304,7 +304,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
} errorCallback: {
}
input = InputSignal(
inputText: "1", keyCode: 0, charCode: charCode("1"), flags: .numericPad, isVerticalTyping: false
inputText: "1", keyCode: 83, charCode: charCode("1"), flags: [], isVerticalTyping: false
)
var count = 0
var empty: InputStateProtocol = InputState.Empty()