IMEState // Track the index of unfinished readings / strokes.
This commit is contained in:
parent
08a069afde
commit
ce611799dc
|
@ -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 }
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)]()
|
||||||
|
|
|
@ -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
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 生成「正在輸入」狀態。
|
/// 生成「正在輸入」狀態。
|
||||||
|
|
Loading…
Reference in New Issue