IMEState // Track the index of unfinished readings / strokes.

This commit is contained in:
ShikiSuen 2023-05-07 10:33:54 +08:00
parent 08a069afde
commit ce611799dc
4 changed files with 18 additions and 3 deletions

View File

@ -44,6 +44,7 @@ public protocol IMEStateDataProtocol {
var textToCommit: String { get set }
var markedReadings: [String] { get set }
var displayTextSegments: [String] { get set }
var highlightAtSegment: Int? { get set }
var isFilterable: Bool { get }
var isMarkedLengthValid: Bool { get }
var candidates: [(keyArray: [String], value: String)] { get set }

View File

@ -111,9 +111,12 @@ public extension IMEState {
return result
}
static func ofInputting(displayTextSegments: [String], cursor: Int) -> IMEState {
static func ofInputting(displayTextSegments: [String], cursor: Int, highlightAt highlightAtSegment: Int? = nil) -> IMEState {
var result = IMEState(displayTextSegments: displayTextSegments, cursor: cursor)
result.type = .ofInputting
if let readingAtSegment = highlightAtSegment {
result.data.highlightAtSegment = readingAtSegment
}
return result
}

View File

@ -91,6 +91,7 @@ public struct IMEStateData: IMEStateDataProtocol {
}
}
public var highlightAtSegment: Int?
public var reading: String = ""
public var markedReadings = [String]()
public var candidates = [(keyArray: [String], value: String)]()

View File

@ -20,6 +20,7 @@ extension InputHandler {
///
public func generateStateOfInputting(sansReading: Bool = false) -> IMEStateProtocol {
if isConsideredEmptyForNow { return IMEState.ofAbortion() }
var segHighlightedAt: Int?
let cpInput = isCodePointInputMode && !sansReading
/// (Update the composing buffer)
/// IMEStateData NSAttributeString
@ -39,6 +40,8 @@ extension InputHandler {
if charCounter == cursor {
newDisplayTextSegments.append(temporaryNode)
temporaryNode = ""
//
segHighlightedAt = newDisplayTextSegments.count
newDisplayTextSegments.append(reading)
}
temporaryNode += String(char)
@ -47,7 +50,11 @@ extension InputHandler {
newDisplayTextSegments.append(temporaryNode)
temporaryNode = ""
}
if newDisplayTextSegments == displayTextSegments { newDisplayTextSegments.append(reading) }
if newDisplayTextSegments == displayTextSegments {
//
segHighlightedAt = newDisplayTextSegments.count
newDisplayTextSegments.append(reading)
}
displayTextSegments = newDisplayTextSegments
cursor += reading.count
}
@ -55,7 +62,10 @@ extension InputHandler {
displayTextSegments[i] = displayTextSegments[i].trimmingCharacters(in: .newlines)
}
///
return IMEState.ofInputting(displayTextSegments: displayTextSegments, cursor: cursor)
return IMEState.ofInputting(
displayTextSegments: displayTextSegments,
cursor: cursor, highlightAt: segHighlightedAt
)
}
///