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 textToCommit: String { get set }
var markedReadings: [String] { get set } var markedReadings: [String] { get set }
var displayTextSegments: [String] { get set } var displayTextSegments: [String] { get set }
var highlightAtSegment: Int? { get set }
var isFilterable: Bool { get } var isFilterable: Bool { get }
var isMarkedLengthValid: Bool { get } var isMarkedLengthValid: Bool { get }
var candidates: [(keyArray: [String], value: String)] { get set } var candidates: [(keyArray: [String], value: String)] { get set }

View File

@ -111,9 +111,12 @@ public extension IMEState {
return result 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) var result = IMEState(displayTextSegments: displayTextSegments, cursor: cursor)
result.type = .ofInputting result.type = .ofInputting
if let readingAtSegment = highlightAtSegment {
result.data.highlightAtSegment = readingAtSegment
}
return result return result
} }

View File

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

View File

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