InputState // Let attributedString drawn as node segments when OK.

This commit is contained in:
ShikiSuen 2022-08-01 23:32:19 +08:00
parent e977694888
commit ebcc0a0479
2 changed files with 34 additions and 14 deletions

View File

@ -175,6 +175,8 @@ public enum InputState {
public var type: StateType { .ofNotEmpty } public var type: StateType { .ofNotEmpty }
private(set) var composingBuffer: String private(set) var composingBuffer: String
private(set) var cursorIndex: Int = 0 { didSet { cursorIndex = max(cursorIndex, 0) } } private(set) var cursorIndex: Int = 0 { didSet { cursorIndex = max(cursorIndex, 0) } }
private(set) var reading: String = ""
private(set) var nodeValuesArray = [String]()
public var composingBufferConverted: String { public var composingBufferConverted: String {
let converted = IME.kanjiConversionIfRequired(composingBuffer) let converted = IME.kanjiConversionIfRequired(composingBuffer)
if converted.utf16.count != composingBuffer.utf16.count if converted.utf16.count != composingBuffer.utf16.count
@ -185,21 +187,37 @@ public enum InputState {
return converted return converted
} }
init(composingBuffer: String, cursorIndex: Int) { init(composingBuffer: String, cursorIndex: Int, reading: String = "", nodeValuesArray: [String] = []) {
self.composingBuffer = composingBuffer self.composingBuffer = composingBuffer
self.reading = reading
self.nodeValuesArray = nodeValuesArray
defer { self.cursorIndex = cursorIndex } defer { self.cursorIndex = cursorIndex }
} }
var attributedString: NSMutableAttributedString { var attributedString: NSMutableAttributedString {
/// ///
/// JIS /// JIS
let attributedString = NSMutableAttributedString( guard reading.isEmpty else {
string: composingBufferConverted, let attributedString = NSMutableAttributedString(
attributes: [ string: composingBufferConverted,
.underlineStyle: NSUnderlineStyle.single.rawValue, attributes: [
.markedClauseSegment: 0, .underlineStyle: NSUnderlineStyle.thick.rawValue,
] .markedClauseSegment: 0,
) ]
)
return attributedString
}
let attributedString = NSMutableAttributedString(string: composingBufferConverted)
var newBegin = 0
for (i, neta) in nodeValuesArray.enumerated() {
attributedString.setAttributes(
[
.underlineStyle: NSUnderlineStyle.thick.rawValue,
.markedClauseSegment: i,
], range: NSRange(location: newBegin, length: neta.utf16.count)
)
newBegin += neta.utf16.count
}
return attributedString return attributedString
} }
@ -216,8 +234,9 @@ public enum InputState {
var textToCommit: String = "" var textToCommit: String = ""
var tooltip: String = "" var tooltip: String = ""
override init(composingBuffer: String, cursorIndex: Int) { override init(composingBuffer: String, cursorIndex: Int, reading: String = "", nodeValuesArray: [String] = []) {
super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex) super.init(
composingBuffer: composingBuffer, cursorIndex: cursorIndex, reading: reading, nodeValuesArray: nodeValuesArray)
} }
override var description: String { override var description: String {

View File

@ -38,7 +38,7 @@ extension KeyHandler {
/// (Update the composing buffer) /// (Update the composing buffer)
/// NSAttributeString /// NSAttributeString
var tooltipParameterRef: [String] = ["", ""] var tooltipParameterRef: [String] = ["", ""]
var composingBuffer = "" let nodeValuesArray: [String] = walkedAnchors.map(\.node.currentPair.value)
var composedStringCursorIndex = 0 var composedStringCursorIndex = 0
var readingCursorIndex = 0 var readingCursorIndex = 0
/// IMK UTF8 emoji /// IMK UTF8 emoji
@ -47,7 +47,6 @@ extension KeyHandler {
for theAnchor in walkedAnchors { for theAnchor in walkedAnchors {
let theNode = theAnchor.node let theNode = theAnchor.node
let strNodeValue = theNode.currentPair.value let strNodeValue = theNode.currentPair.value
composingBuffer += strNodeValue
let arrSplit: [String] = Array(strNodeValue).map { String($0) } let arrSplit: [String] = Array(strNodeValue).map { String($0) }
let codepointCount = arrSplit.count let codepointCount = arrSplit.count
/// ///
@ -95,7 +94,7 @@ extension KeyHandler {
var arrHead = [String.UTF16View.Element]() var arrHead = [String.UTF16View.Element]()
var arrTail = [String.UTF16View.Element]() var arrTail = [String.UTF16View.Element]()
for (i, n) in composingBuffer.utf16.enumerated() { for (i, n) in nodeValuesArray.joined().utf16.enumerated() {
if i < composedStringCursorIndex { if i < composedStringCursorIndex {
arrHead.append(n) arrHead.append(n)
} else { } else {
@ -121,7 +120,9 @@ extension KeyHandler {
} }
/// 使 /// 使
return InputState.Inputting(composingBuffer: cleanedComposition, cursorIndex: cursorIndex) return InputState.Inputting(
composingBuffer: cleanedComposition, cursorIndex: cursorIndex, reading: reading, nodeValuesArray: nodeValuesArray
)
} }
// MARK: - // MARK: -