Repo // InputState -> InputStateProtocol, plus clang-format.

This commit is contained in:
ShikiSuen 2022-06-24 17:36:29 +08:00
parent dedc8770cf
commit 63659ee662
8 changed files with 101 additions and 71 deletions

View File

@ -28,6 +28,25 @@ import Cocoa
// InputState 使 Struct Struct
// enum
enum StateType {
case ofDeactivated
case ofAssociatedPhrases
case ofEmpty
case ofEmptyIgnorePreviousState
case ofCommitting
case ofNotEmpty
case ofInputting
case ofMarking
case ofChooseCandidate
case ofSymbolTable
}
// InputState
protocol InputStateProtocol {
var type: StateType { get }
}
/// ctlInputMethod
///
/// Finite State Machine/
@ -60,9 +79,10 @@ import Cocoa
///
/// - .ChoosingCandidate: 使
/// - .SymbolTable:
class InputState {
enum InputState {
/// .Deactivated: 使使
class Deactivated: InputState {
class Deactivated: InputStateProtocol {
public var type: StateType { .ofDeactivated }
var description: String {
"<InputState.Deactivated>"
}
@ -72,7 +92,9 @@ class InputState {
/// .Empty: 使
///
class Empty: InputState {
class Empty: InputStateProtocol {
public var type: StateType { .ofEmpty }
var composingBuffer: String {
""
}
@ -87,6 +109,7 @@ class InputState {
/// .EmptyIgnorePreviousState: Empty
///
class EmptyIgnoringPreviousState: Empty {
override public var type: StateType { .ofEmptyIgnorePreviousState }
override var description: String {
"<InputState.EmptyIgnoringPreviousState>"
}
@ -95,7 +118,8 @@ class InputState {
// MARK: -
/// .Committing:
class Committing: InputState {
class Committing: InputStateProtocol {
public var type: StateType { .ofCommitting }
private(set) var textToCommit: String = ""
convenience init(textToCommit: String) {
@ -112,13 +136,13 @@ class InputState {
/// .AssociatedPhrases:
/// 西 .NotEmpty
class AssociatedPhrases: InputState {
class AssociatedPhrases: InputStateProtocol {
public var type: StateType { .ofAssociatedPhrases }
private(set) var candidates: [String] = []
private(set) var isTypingVertical: Bool = false
init(candidates: [String], isTypingVertical: Bool) {
self.candidates = candidates
self.isTypingVertical = isTypingVertical
super.init()
}
var description: String {
@ -134,7 +158,8 @@ class InputState {
///
/// - .ChoosingCandidate: 使
/// - .SymbolTable:
class NotEmpty: InputState {
class NotEmpty: InputStateProtocol {
public var type: StateType { .ofNotEmpty }
private(set) var composingBuffer: String
private(set) var cursorIndex: Int = 0 { didSet { cursorIndex = max(cursorIndex, 0) } }
public var composingBufferConverted: String {
@ -149,7 +174,6 @@ class InputState {
init(composingBuffer: String, cursorIndex: Int) {
self.composingBuffer = composingBuffer
super.init()
defer { self.cursorIndex = cursorIndex }
}
@ -175,6 +199,7 @@ class InputState {
/// .Inputting: 使Compositor
class Inputting: NotEmpty {
override public var type: StateType { .ofInputting }
var textToCommit: String = ""
var tooltip: String = ""
@ -192,6 +217,7 @@ class InputState {
/// .Marking: 使
///
class Marking: NotEmpty {
override public var type: StateType { .ofMarking }
private var allowedMarkRange: ClosedRange<Int> = mgrPrefs.minCandidateLength...mgrPrefs.maxCandidateLength
private(set) var markerIndex: Int = 0 { didSet { markerIndex = max(markerIndex, 0) } }
private(set) var markedRange: Range<Int>
@ -358,6 +384,7 @@ class InputState {
/// .ChoosingCandidate: 使
class ChoosingCandidate: NotEmpty {
override public var type: StateType { .ofChooseCandidate }
private(set) var candidates: [String]
private(set) var isTypingVertical: Bool
@ -376,6 +403,7 @@ class InputState {
/// .SymbolTable:
class SymbolTable: ChoosingCandidate {
override public var type: StateType { .ofSymbolTable }
var node: SymbolNode
init(node: SymbolNode, isTypingVertical: Bool) {

View File

@ -39,7 +39,7 @@ protocol KeyHandlerDelegate {
_: KeyHandler, didSelectCandidateAt index: Int,
ctlCandidate controller: ctlCandidate
)
func keyHandler(_ keyHandler: KeyHandler, didRequestWriteUserPhraseWith state: InputState)
func keyHandler(_ keyHandler: KeyHandler, didRequestWriteUserPhraseWith state: InputStateProtocol)
-> Bool
}
@ -264,7 +264,7 @@ class KeyHandler {
}
if mgrPrefs.fetchSuggestionsFromUserOverrideModel, !mgrPrefs.useSCPCTypingMode {
let arrSuggestedUnigrams: [Megrez.Unigram] = fetchSuggestedCandidates().stableSort { $0.score > $1.score }
let arrSuggestedCandidates: [String] = arrSuggestedUnigrams.map { $0.keyValue.value }
let arrSuggestedCandidates: [String] = arrSuggestedUnigrams.map(\.keyValue.value)
arrCandidates = arrSuggestedCandidates.filter { arrCandidates.contains($0) } + arrCandidates
arrCandidates = arrCandidates.deduplicate
arrCandidates = arrCandidates.stableSort { $0.count > $1.count }
@ -276,7 +276,8 @@ class KeyHandler {
func fetchSuggestedCandidates() -> [Megrez.Unigram] {
currentUOM.suggest(
walkedAnchors: walkedAnchors, cursorIndex: compositorCursorIndex,
timestamp: NSDate().timeIntervalSince1970)
timestamp: NSDate().timeIntervalSince1970
)
}
///

View File

@ -32,9 +32,9 @@ import Cocoa
extension KeyHandler {
func handleCandidate(
state: InputState,
state: InputStateProtocol,
input: InputSignal,
stateCallback: @escaping (InputState) -> Void,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
let inputText = input.inputText

View File

@ -34,8 +34,8 @@ import Cocoa
extension KeyHandler {
func handle(
input: InputSignal,
state: InputState,
stateCallback: @escaping (InputState) -> Void,
state: InputStateProtocol,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
let charCode: UniChar = input.charCode

View File

@ -211,7 +211,7 @@ extension KeyHandler {
func handleMarkingState(
_ state: InputState.Marking,
input: InputSignal,
stateCallback: @escaping (InputState) -> Void,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
if input.isESC {
@ -288,9 +288,9 @@ extension KeyHandler {
/// - Returns: ctlInputMethod IMK
func handlePunctuation(
_ customPunctuation: String,
state: InputState,
state: InputStateProtocol,
usingVerticalTyping isTypingVertical: Bool,
stateCallback: @escaping (InputState) -> Void,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
if !ifLangModelHasUnigrams(forKey: customPunctuation) {
@ -339,8 +339,8 @@ extension KeyHandler {
/// - stateCallback:
/// - Returns: ctlInputMethod IMK
func handleEnter(
state: InputState,
stateCallback: @escaping (InputState) -> Void,
state: InputStateProtocol,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback _: @escaping () -> Void
) -> Bool {
guard let currentState = state as? InputState.Inputting else { return false }
@ -359,8 +359,8 @@ extension KeyHandler {
/// - stateCallback:
/// - Returns: ctlInputMethod IMK
func handleCtrlCommandEnter(
state: InputState,
stateCallback: @escaping (InputState) -> Void,
state: InputStateProtocol,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback _: @escaping () -> Void
) -> Bool {
guard state is InputState.Inputting else { return false }
@ -390,8 +390,8 @@ extension KeyHandler {
/// - stateCallback:
/// - Returns: ctlInputMethod IMK
func handleCtrlOptionCommandEnter(
state: InputState,
stateCallback: @escaping (InputState) -> Void,
state: InputStateProtocol,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback _: @escaping () -> Void
) -> Bool {
guard state is InputState.Inputting else { return false }
@ -435,8 +435,8 @@ extension KeyHandler {
/// - errorCallback:
/// - Returns: ctlInputMethod IMK
func handleBackspace(
state: InputState,
stateCallback: @escaping (InputState) -> Void,
state: InputStateProtocol,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
guard state is InputState.Inputting else { return false }
@ -474,8 +474,8 @@ extension KeyHandler {
/// - errorCallback:
/// - Returns: ctlInputMethod IMK
func handleDelete(
state: InputState,
stateCallback: @escaping (InputState) -> Void,
state: InputStateProtocol,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
guard state is InputState.Inputting else { return false }
@ -514,8 +514,8 @@ extension KeyHandler {
/// - errorCallback:
/// - Returns: ctlInputMethod IMK
func handleAbsorbedArrowKey(
state: InputState,
stateCallback: @escaping (InputState) -> Void,
state: InputStateProtocol,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
guard state is InputState.Inputting else { return false }
@ -536,8 +536,8 @@ extension KeyHandler {
/// - errorCallback:
/// - Returns: ctlInputMethod IMK
func handleHome(
state: InputState,
stateCallback: @escaping (InputState) -> Void,
state: InputStateProtocol,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
guard state is InputState.Inputting else { return false }
@ -570,8 +570,8 @@ extension KeyHandler {
/// - errorCallback:
/// - Returns: ctlInputMethod IMK
func handleEnd(
state: InputState,
stateCallback: @escaping (InputState) -> Void,
state: InputStateProtocol,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
guard state is InputState.Inputting else { return false }
@ -603,8 +603,8 @@ extension KeyHandler {
/// - stateCallback:
/// - Returns: ctlInputMethod IMK
func handleEsc(
state: InputState,
stateCallback: @escaping (InputState) -> Void,
state: InputStateProtocol,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback _: @escaping () -> Void
) -> Bool {
guard state is InputState.Inputting else { return false }
@ -638,9 +638,9 @@ extension KeyHandler {
/// - errorCallback:
/// - Returns: ctlInputMethod IMK
func handleForward(
state: InputState,
state: InputStateProtocol,
input: InputSignal,
stateCallback: @escaping (InputState) -> Void,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
guard let currentState = state as? InputState.Inputting else { return false }
@ -694,9 +694,9 @@ extension KeyHandler {
/// - errorCallback:
/// - Returns: ctlInputMethod IMK
func handleBackward(
state: InputState,
state: InputStateProtocol,
input: InputSignal,
stateCallback: @escaping (InputState) -> Void,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
guard let currentState = state as? InputState.Inputting else { return false }
@ -750,12 +750,12 @@ extension KeyHandler {
/// - errorCallback:
/// - Returns: ctlInputMethod IMK
func handleInlineCandidateRotation(
state: InputState,
state: InputStateProtocol,
reverseModifier: Bool,
stateCallback: @escaping (InputState) -> Void,
stateCallback: @escaping (InputStateProtocol) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
if composer.isEmpty && (compositor.isEmpty || walkedAnchors.isEmpty) { return false }
if composer.isEmpty, compositor.isEmpty || walkedAnchors.isEmpty { return false }
guard state is InputState.Inputting else {
guard state is InputState.Empty else {
IME.prtDebugIntel("6044F081")

View File

@ -46,7 +46,7 @@ extension String {
/// in an NSString (or .utf16).
public func charIndexLiteral(from utf16Index: Int) -> Int {
var length = 0
for (i, character) in self.enumerated() {
for (i, character) in enumerated() {
length += character.utf16.count
if length > utf16Index {
return (i)
@ -65,8 +65,8 @@ extension String {
return self[..<self.index(startIndex, offsetBy: fixedIndex)].utf16.count
}
func utf16SubString(with r: Range<Int>) -> String {
let arr = Array(self.utf16)[r].map { $0 }
internal func utf16SubString(with r: Range<Int>) -> String {
let arr = Array(utf16)[r].map { $0 }
return String(utf16CodeUnits: arr, count: arr.count)
}
}

View File

@ -54,7 +54,7 @@ class ctlInputMethod: IMKInputController {
/// 調
private var keyHandler: KeyHandler = .init()
///
private var state: InputState = .Empty()
private var state: InputStateProtocol = InputState.Empty()
// MARK: -
@ -107,7 +107,7 @@ class ctlInputMethod: IMKInputController {
if client().bundleIdentifier() != Bundle.main.bundleIdentifier {
// 使
setKeyLayout()
handle(state: .Empty())
handle(state: InputState.Empty())
} //
(NSApp.delegate as? AppDelegate)?.checkForUpdate()
}
@ -117,8 +117,8 @@ class ctlInputMethod: IMKInputController {
override func deactivateServer(_ sender: Any!) {
_ = sender //
keyHandler.clear()
handle(state: .Empty())
handle(state: .Deactivated())
handle(state: InputState.Empty())
handle(state: InputState.Deactivated())
}
///
@ -149,7 +149,7 @@ class ctlInputMethod: IMKInputController {
if client().bundleIdentifier() != Bundle.main.bundleIdentifier {
// 使
setKeyLayout()
handle(state: .Empty())
handle(state: InputState.Empty())
} //
}
@ -245,7 +245,7 @@ extension ctlInputMethod {
///
///
/// - Parameter newState:
private func handle(state newState: InputState) {
private func handle(state newState: InputStateProtocol) {
let prevState = state
state = newState
@ -341,7 +341,7 @@ extension ctlInputMethod {
)
}
private func handle(state: InputState.Deactivated, previous: InputState) {
private func handle(state: InputState.Deactivated, previous: InputStateProtocol) {
_ = state //
ctlCandidateCurrent.delegate = nil
ctlCandidateCurrent.visible = false
@ -352,7 +352,7 @@ extension ctlInputMethod {
clearInlineDisplay()
}
private func handle(state: InputState.Empty, previous: InputState) {
private func handle(state: InputState.Empty, previous: InputStateProtocol) {
_ = state //
ctlCandidateCurrent.visible = false
hideTooltip()
@ -365,7 +365,7 @@ extension ctlInputMethod {
}
private func handle(
state: InputState.EmptyIgnoringPreviousState, previous: InputState
state: InputState.EmptyIgnoringPreviousState, previous: InputStateProtocol
) {
_ = state //
_ = previous //
@ -374,7 +374,7 @@ extension ctlInputMethod {
clearInlineDisplay()
}
private func handle(state: InputState.Committing, previous: InputState) {
private func handle(state: InputState.Committing, previous: InputStateProtocol) {
_ = previous //
ctlCandidateCurrent.visible = false
hideTooltip()
@ -385,7 +385,7 @@ extension ctlInputMethod {
clearInlineDisplay()
}
private func handle(state: InputState.Inputting, previous: InputState) {
private func handle(state: InputState.Inputting, previous: InputStateProtocol) {
_ = previous //
ctlCandidateCurrent.visible = false
hideTooltip()
@ -402,7 +402,7 @@ extension ctlInputMethod {
}
}
private func handle(state: InputState.Marking, previous: InputState) {
private func handle(state: InputState.Marking, previous: InputStateProtocol) {
_ = previous //
ctlCandidateCurrent.visible = false
setInlineDisplayWithCursor()
@ -416,21 +416,21 @@ extension ctlInputMethod {
}
}
private func handle(state: InputState.ChoosingCandidate, previous: InputState) {
private func handle(state: InputState.ChoosingCandidate, previous: InputStateProtocol) {
_ = previous //
hideTooltip()
setInlineDisplayWithCursor()
show(candidateWindowWith: state)
}
private func handle(state: InputState.SymbolTable, previous: InputState) {
private func handle(state: InputState.SymbolTable, previous: InputStateProtocol) {
_ = previous //
hideTooltip()
setInlineDisplayWithCursor()
show(candidateWindowWith: state)
}
private func handle(state: InputState.AssociatedPhrases, previous: InputState) {
private func handle(state: InputState.AssociatedPhrases, previous: InputStateProtocol) {
_ = previous //
hideTooltip()
clearInlineDisplay()
@ -441,7 +441,7 @@ extension ctlInputMethod {
// MARK: -
extension ctlInputMethod {
private func show(candidateWindowWith state: InputState) {
private func show(candidateWindowWith state: InputStateProtocol) {
var isTypingVertical: Bool {
if let state = state as? InputState.ChoosingCandidate {
return state.isTypingVertical
@ -595,7 +595,7 @@ extension ctlInputMethod: KeyHandlerDelegate {
ctlCandidate(controller, didSelectCandidateAtIndex: index)
}
func keyHandler(_ keyHandler: KeyHandler, didRequestWriteUserPhraseWith state: InputState)
func keyHandler(_ keyHandler: KeyHandler, didRequestWriteUserPhraseWith state: InputStateProtocol)
-> Bool
{
guard let state = state as? InputState.Marking else {
@ -656,13 +656,13 @@ extension ctlInputMethod: ctlCandidateDelegate {
let node = state.node.children?[index]
{
if let children = node.children, !children.isEmpty {
handle(state: .Empty()) //
handle(state: InputState.Empty()) //
handle(
state: .SymbolTable(node: node, isTypingVertical: state.isTypingVertical)
state: InputState.SymbolTable(node: node, isTypingVertical: state.isTypingVertical)
)
} else {
handle(state: .Committing(textToCommit: node.title))
handle(state: .Empty())
handle(state: InputState.Committing(textToCommit: node.title))
handle(state: InputState.Empty())
}
return
}
@ -676,7 +676,7 @@ extension ctlInputMethod: ctlCandidateDelegate {
if mgrPrefs.useSCPCTypingMode {
keyHandler.clear()
let composingBuffer = inputting.composingBuffer
handle(state: .Committing(textToCommit: composingBuffer))
handle(state: InputState.Committing(textToCommit: composingBuffer))
if mgrPrefs.associatedPhrasesEnabled,
let associatePhrases = keyHandler.buildAssociatePhraseState(
withKey: composingBuffer, isTypingVertical: state.isTypingVertical
@ -684,7 +684,7 @@ extension ctlInputMethod: ctlCandidateDelegate {
{
handle(state: associatePhrases)
} else {
handle(state: .Empty())
handle(state: InputState.Empty())
}
} else {
handle(state: inputting)
@ -694,7 +694,7 @@ extension ctlInputMethod: ctlCandidateDelegate {
if let state = state as? InputState.AssociatedPhrases {
let selectedValue = state.candidates[index]
handle(state: .Committing(textToCommit: selectedValue))
handle(state: InputState.Committing(textToCommit: selectedValue))
if mgrPrefs.associatedPhrasesEnabled,
let associatePhrases = keyHandler.buildAssociatePhraseState(
withKey: selectedValue, isTypingVertical: state.isTypingVertical
@ -702,7 +702,7 @@ extension ctlInputMethod: ctlCandidateDelegate {
{
handle(state: associatePhrases)
} else {
handle(state: .Empty())
handle(state: InputState.Empty())
}
}
}

View File

@ -51,6 +51,7 @@ public class ctlCandidate: NSWindowController {
case horizontal
case vertical
}
public var currentLayout: Layout = .horizontal
public weak var delegate: ctlCandidateDelegate? {
didSet {