TDKCandidates // UI accommodation with long reverse-lookup results.
- Use array to handle reverse-lookup UI representation. - Remove SessionCtl.annotate().
This commit is contained in:
parent
c9c81803b8
commit
5fbc2fb728
|
@ -14,7 +14,7 @@ open class CtlCandidate: NSWindowController, CtlCandidateProtocol {
|
|||
open var currentLayout: NSUserInterfaceLayoutOrientation = .horizontal
|
||||
open var locale: String = ""
|
||||
open var useLangIdentifier: Bool = false
|
||||
open var reverseLookupResult: String = ""
|
||||
open var reverseLookupResult: [String] = []
|
||||
|
||||
open func highlightedColor() -> NSColor {
|
||||
var result = NSColor.alternateSelectedControlColor
|
||||
|
|
|
@ -117,7 +117,7 @@ public class CtlCandidateTDK: CtlCandidate {
|
|||
|
||||
override open func updateDisplay() {
|
||||
guard let window = window else { return }
|
||||
reverseLookupResult = delegate?.annotate(for: currentSelectedCandidateText) ?? ""
|
||||
reverseLookupResult = delegate?.reverseLookup(for: currentSelectedCandidateText) ?? []
|
||||
switch currentLayout {
|
||||
case .horizontal:
|
||||
DispatchQueue.main.async { [self] in
|
||||
|
|
|
@ -36,9 +36,10 @@ struct CandidatePoolViewUIHorizontal_Previews: PreviewProvider {
|
|||
@available(macOS 12, *)
|
||||
public struct VwrCandidateHorizontal: View {
|
||||
public var controller: CtlCandidateTDK
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
@State public var thePool: CandidatePool
|
||||
@State public var tooltip: String = ""
|
||||
@State public var reverseLookupResult: String = ""
|
||||
@State public var reverseLookupResult: [String] = ["MLGB"]
|
||||
|
||||
private var positionLabel: String {
|
||||
(thePool.highlightedIndex + 1).description + "/" + thePool.candidateDataAll.count.description
|
||||
|
@ -90,20 +91,33 @@ public struct VwrCandidateHorizontal: View {
|
|||
}
|
||||
}
|
||||
}
|
||||
.fixedSize(horizontal: false, vertical: true).padding(5)
|
||||
.background(Color(nsColor: NSColor.controlBackgroundColor).ignoresSafeArea())
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
.padding([.horizontal], 5).padding([.top], 5).padding([.bottom], -1)
|
||||
if controller.delegate?.showReverseLookupResult ?? true {
|
||||
ZStack(alignment: .leading) {
|
||||
Color(white: colorScheme == .dark ? 0.15 : 0.97)
|
||||
HStack(alignment: .center, spacing: 4) {
|
||||
Text("→")
|
||||
ForEach(reverseLookupResult, id: \.self) { currentResult in
|
||||
ZStack(alignment: .center) {
|
||||
Color(white: colorScheme == .dark ? 0.3 : 0.9).cornerRadius(3)
|
||||
Text(" \(currentResult) ").lineLimit(1)
|
||||
}.fixedSize()
|
||||
}
|
||||
}
|
||||
.font(.system(size: max(CandidateCellData.unifiedSize * 0.6, 9)))
|
||||
.padding([.horizontal], 4).padding([.vertical], 4)
|
||||
.foregroundColor(colorScheme == .light ? Color(white: 0.1) : Color(white: 0.9))
|
||||
}
|
||||
}
|
||||
ZStack(alignment: .trailing) {
|
||||
Color(nsColor: tooltip.isEmpty ? .windowBackgroundColor : CandidateCellData.highlightBackground)
|
||||
.ignoresSafeArea()
|
||||
HStack(alignment: .bottom) {
|
||||
HStack(alignment: .center) {
|
||||
if !tooltip.isEmpty {
|
||||
Text(tooltip).lineLimit(1)
|
||||
Spacer()
|
||||
}
|
||||
if !reverseLookupResult.isEmpty, !(controller.delegate?.isVerticalTyping ?? true) {
|
||||
Text(reverseLookupResult).lineLimit(1)
|
||||
Spacer()
|
||||
}
|
||||
Text(positionLabel).lineLimit(1)
|
||||
}
|
||||
.font(.system(size: max(CandidateCellData.unifiedSize * 0.7, 11), weight: .bold))
|
||||
|
@ -114,6 +128,7 @@ public struct VwrCandidateHorizontal: View {
|
|||
.fixedSize(horizontal: false, vertical: true)
|
||||
}
|
||||
.frame(minWidth: thePool.maxWindowWidth, maxWidth: thePool.maxWindowWidth)
|
||||
.background(Color(nsColor: NSColor.controlBackgroundColor).ignoresSafeArea())
|
||||
.overlay(
|
||||
RoundedRectangle(cornerRadius: 10).stroke(.white.opacity(0.2), lineWidth: 1)
|
||||
)
|
||||
|
|
|
@ -35,9 +35,10 @@ struct CandidatePoolViewUIVertical_Previews: PreviewProvider {
|
|||
@available(macOS 12, *)
|
||||
public struct VwrCandidateVertical: View {
|
||||
public var controller: CtlCandidateTDK
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
@State public var thePool: CandidatePool
|
||||
@State public var tooltip: String = ""
|
||||
@State public var reverseLookupResult: String = ""
|
||||
@State public var reverseLookupResult: [String] = ["MLGB"]
|
||||
|
||||
private var positionLabel: String {
|
||||
(thePool.highlightedIndex + 1).description + "/" + thePool.candidateDataAll.count.description
|
||||
|
@ -99,19 +100,31 @@ public struct VwrCandidateVertical: View {
|
|||
}
|
||||
}
|
||||
.fixedSize(horizontal: true, vertical: false).padding(5)
|
||||
.background(Color(nsColor: NSColor.controlBackgroundColor).ignoresSafeArea())
|
||||
if controller.delegate?.showReverseLookupResult ?? true {
|
||||
ZStack(alignment: .leading) {
|
||||
Color(white: colorScheme == .dark ? 0.15 : 0.97)
|
||||
HStack(alignment: .center, spacing: 4) {
|
||||
Text("→")
|
||||
ForEach(reverseLookupResult, id: \.self) { currentResult in
|
||||
ZStack(alignment: .center) {
|
||||
Color(white: colorScheme == .dark ? 0.3 : 0.9).cornerRadius(3)
|
||||
Text(" \(currentResult) ").lineLimit(1)
|
||||
}.fixedSize()
|
||||
}
|
||||
}
|
||||
.font(.system(size: max(CandidateCellData.unifiedSize * 0.6, 9)))
|
||||
.padding([.horizontal], 4).padding([.vertical], 4)
|
||||
.foregroundColor(colorScheme == .light ? Color(white: 0.1) : Color(white: 0.9))
|
||||
}
|
||||
}
|
||||
ZStack(alignment: .trailing) {
|
||||
Color(nsColor: tooltip.isEmpty ? .windowBackgroundColor : CandidateCellData.highlightBackground)
|
||||
.ignoresSafeArea()
|
||||
HStack(alignment: .bottom) {
|
||||
HStack(alignment: .center) {
|
||||
if !tooltip.isEmpty {
|
||||
Text(tooltip).lineLimit(1)
|
||||
Spacer()
|
||||
}
|
||||
if !reverseLookupResult.isEmpty, !(controller.delegate?.isVerticalTyping ?? true) {
|
||||
Text(reverseLookupResult).lineLimit(1)
|
||||
Spacer()
|
||||
}
|
||||
Text(positionLabel).lineLimit(1)
|
||||
}
|
||||
.font(.system(size: max(CandidateCellData.unifiedSize * 0.7, 11), weight: .bold))
|
||||
|
@ -121,6 +134,7 @@ public struct VwrCandidateVertical: View {
|
|||
}
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
}
|
||||
.background(Color(nsColor: NSColor.controlBackgroundColor).ignoresSafeArea())
|
||||
.overlay(
|
||||
RoundedRectangle(cornerRadius: 10).stroke(.white.opacity(0.2), lineWidth: 1)
|
||||
)
|
||||
|
|
|
@ -36,11 +36,11 @@ struct CandidatePoolViewUIHorizontalBackports_Previews: PreviewProvider {
|
|||
|
||||
@available(macOS 10.15, *)
|
||||
public struct VwrCandidateHorizontalBackports: View {
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
public var controller: CtlCandidateTDK
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
@State public var thePool: CandidatePool
|
||||
@State public var tooltip: String = ""
|
||||
@State public var reverseLookupResult: String = ""
|
||||
@State public var reverseLookupResult: [String] = ["MLGB"]
|
||||
|
||||
private var positionLabel: String {
|
||||
(thePool.highlightedIndex + 1).description + "/" + thePool.candidateDataAll.count.description
|
||||
|
@ -92,8 +92,25 @@ public struct VwrCandidateHorizontalBackports: View {
|
|||
}
|
||||
}
|
||||
}
|
||||
.fixedSize(horizontal: false, vertical: true).padding(5)
|
||||
.background(Color(white: colorScheme == .dark ? 0.1 : 1))
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
.padding([.horizontal], 5).padding([.top], 5).padding([.bottom], -1)
|
||||
if controller.delegate?.showReverseLookupResult ?? true {
|
||||
ZStack(alignment: .leading) {
|
||||
Color(white: colorScheme == .dark ? 0.15 : 0.97)
|
||||
HStack(alignment: .center, spacing: 4) {
|
||||
Text("→")
|
||||
ForEach(reverseLookupResult, id: \.self) { currentResult in
|
||||
ZStack(alignment: .center) {
|
||||
Color(white: colorScheme == .dark ? 0.3 : 0.9).cornerRadius(3)
|
||||
Text(" \(currentResult) ").lineLimit(1)
|
||||
}.fixedSize()
|
||||
}
|
||||
}
|
||||
.font(.system(size: max(CandidateCellData.unifiedSize * 0.6, 9)))
|
||||
.padding([.horizontal], 4).padding([.vertical], 4)
|
||||
.foregroundColor(colorScheme == .light ? Color(white: 0.1) : Color(white: 0.9))
|
||||
}
|
||||
}
|
||||
ZStack(alignment: .trailing) {
|
||||
if tooltip.isEmpty {
|
||||
Color(white: colorScheme == .dark ? 0.2 : 0.9)
|
||||
|
@ -101,15 +118,11 @@ public struct VwrCandidateHorizontalBackports: View {
|
|||
Color(white: colorScheme == .dark ? 0.0 : 1)
|
||||
controller.highlightedColorUIBackports
|
||||
}
|
||||
HStack(alignment: .bottom) {
|
||||
HStack(alignment: .center) {
|
||||
if !tooltip.isEmpty {
|
||||
Text(tooltip).lineLimit(1)
|
||||
Spacer()
|
||||
}
|
||||
if !reverseLookupResult.isEmpty, !(controller.delegate?.isVerticalTyping ?? true) {
|
||||
Text(reverseLookupResult).lineLimit(1)
|
||||
Spacer()
|
||||
}
|
||||
Text(positionLabel).lineLimit(1)
|
||||
}
|
||||
.font(.system(size: max(CandidateCellData.unifiedSize * 0.7, 11), weight: .bold))
|
||||
|
@ -120,6 +133,7 @@ public struct VwrCandidateHorizontalBackports: View {
|
|||
.fixedSize(horizontal: false, vertical: true)
|
||||
}
|
||||
.frame(minWidth: thePool.maxWindowWidth, maxWidth: thePool.maxWindowWidth)
|
||||
.background(Color(white: colorScheme == .dark ? 0.1 : 1))
|
||||
.overlay(
|
||||
RoundedRectangle(cornerRadius: 10).stroke(.white.opacity(0.2), lineWidth: 1)
|
||||
)
|
||||
|
|
|
@ -35,11 +35,11 @@ struct CandidatePoolViewUIVerticalBackports_Previews: PreviewProvider {
|
|||
|
||||
@available(macOS 10.15, *)
|
||||
public struct VwrCandidateVerticalBackports: View {
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
public var controller: CtlCandidateTDK
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
@State public var thePool: CandidatePool
|
||||
@State public var tooltip: String = ""
|
||||
@State public var reverseLookupResult: String = ""
|
||||
@State public var reverseLookupResult: [String] = ["MLGB"]
|
||||
|
||||
private var positionLabel: String {
|
||||
(thePool.highlightedIndex + 1).description + "/" + thePool.candidateDataAll.count.description
|
||||
|
@ -101,7 +101,23 @@ public struct VwrCandidateVerticalBackports: View {
|
|||
}
|
||||
}
|
||||
.fixedSize(horizontal: true, vertical: false).padding(5)
|
||||
.background(Color(white: colorScheme == .dark ? 0.1 : 1))
|
||||
if controller.delegate?.showReverseLookupResult ?? true {
|
||||
ZStack(alignment: .leading) {
|
||||
Color(white: colorScheme == .dark ? 0.15 : 0.97)
|
||||
HStack(alignment: .center, spacing: 4) {
|
||||
Text("→")
|
||||
ForEach(reverseLookupResult, id: \.self) { currentResult in
|
||||
ZStack(alignment: .center) {
|
||||
Color(white: colorScheme == .dark ? 0.3 : 0.9).cornerRadius(3)
|
||||
Text(" \(currentResult) ").lineLimit(1)
|
||||
}.fixedSize()
|
||||
}
|
||||
}
|
||||
.font(.system(size: max(CandidateCellData.unifiedSize * 0.6, 9)))
|
||||
.padding([.horizontal], 4).padding([.vertical], 4)
|
||||
.foregroundColor(colorScheme == .light ? Color(white: 0.1) : Color(white: 0.9))
|
||||
}
|
||||
}
|
||||
ZStack(alignment: .trailing) {
|
||||
if tooltip.isEmpty {
|
||||
Color(white: colorScheme == .dark ? 0.2 : 0.9)
|
||||
|
@ -109,15 +125,11 @@ public struct VwrCandidateVerticalBackports: View {
|
|||
Color(white: colorScheme == .dark ? 0.0 : 1)
|
||||
controller.highlightedColorUIBackports
|
||||
}
|
||||
HStack(alignment: .bottom) {
|
||||
HStack(alignment: .center) {
|
||||
if !tooltip.isEmpty {
|
||||
Text(tooltip).lineLimit(1)
|
||||
Spacer()
|
||||
}
|
||||
if !reverseLookupResult.isEmpty, !(controller.delegate?.isVerticalTyping ?? true) {
|
||||
Text(reverseLookupResult).lineLimit(1)
|
||||
Spacer()
|
||||
}
|
||||
Text(positionLabel).lineLimit(1)
|
||||
}
|
||||
.font(.system(size: max(CandidateCellData.unifiedSize * 0.7, 11), weight: .bold))
|
||||
|
@ -127,6 +139,7 @@ public struct VwrCandidateVerticalBackports: View {
|
|||
}
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
}
|
||||
.background(Color(white: colorScheme == .dark ? 0.1 : 1))
|
||||
.overlay(
|
||||
RoundedRectangle(cornerRadius: 10).stroke(.white.opacity(0.2), lineWidth: 1)
|
||||
)
|
||||
|
|
|
@ -12,14 +12,15 @@ public protocol CtlCandidateDelegate {
|
|||
func candidatePairs(conv: Bool) -> [(String, String)]
|
||||
func candidatePairSelected(at index: Int)
|
||||
func candidates(_ sender: Any!) -> [Any]!
|
||||
@discardableResult func annotate(for value: String) -> String
|
||||
@discardableResult func reverseLookup(for value: String) -> [String]
|
||||
var selectionKeys: String { get }
|
||||
var isVerticalTyping: Bool { get }
|
||||
var showReverseLookupResult: Bool { get }
|
||||
}
|
||||
|
||||
public protocol CtlCandidateProtocol {
|
||||
var tooltip: String { get set }
|
||||
var reverseLookupResult: String { get set }
|
||||
var reverseLookupResult: [String] { get set }
|
||||
var locale: String { get set }
|
||||
var currentLayout: NSUserInterfaceLayoutOrientation { get set }
|
||||
var delegate: CtlCandidateDelegate? { get set }
|
||||
|
|
|
@ -56,14 +56,19 @@ extension SessionCtl: InputHandlerDelegate {
|
|||
// MARK: - Candidate Controller Delegate
|
||||
|
||||
extension SessionCtl: CtlCandidateDelegate {
|
||||
@discardableResult public func annotate(for value: String) -> String {
|
||||
public var showReverseLookupResult: Bool {
|
||||
!isVerticalTyping && PrefMgr.shared.showReverseLookupInCandidateUI
|
||||
}
|
||||
|
||||
@discardableResult public func reverseLookup(for value: String) -> [String] {
|
||||
let blankResult: [String] = []
|
||||
// 這一段專門處理「反查」。
|
||||
if !PrefMgr.shared.showReverseLookupInCandidateUI { return "" }
|
||||
if isVerticalTyping { return "" } // 縱排輸入的場合,選字窗沒那個空間顯示反查結果。
|
||||
if value.isEmpty { return "" } // 空字串沒有需要反查的東西。
|
||||
if value.contains("_") { return "" }
|
||||
guard let lookupResult = LMMgr.currentLM.currentCassette.reverseLookupMap[value] else { return "" }
|
||||
return lookupResult.stableSort(by: { $0.count < $1.count }).joined(separator: " ")
|
||||
if !PrefMgr.shared.showReverseLookupInCandidateUI { return blankResult }
|
||||
if isVerticalTyping { return blankResult } // 縱排輸入的場合,選字窗沒有足夠的空間顯示反查結果。
|
||||
if value.isEmpty { return blankResult } // 空字串沒有需要反查的東西。
|
||||
if value.contains("_") { return blankResult }
|
||||
guard let lookupResult = LMMgr.currentLM.currentCassette.reverseLookupMap[value] else { return blankResult }
|
||||
return lookupResult.stableSort(by: { $0.count < $1.count })
|
||||
}
|
||||
|
||||
public var selectionKeys: String {
|
||||
|
|
|
@ -12,7 +12,7 @@ import Shared
|
|||
/// 威注音自用的 IMKCandidates 型別。因為有用到 bridging header,所以無法弄成 Swift Package。
|
||||
public class CtlCandidateIMK: IMKCandidates, CtlCandidateProtocol {
|
||||
public var tooltip: String = ""
|
||||
public var reverseLookupResult: String = ""
|
||||
public var reverseLookupResult: [String] = []
|
||||
public var locale: String = ""
|
||||
public var useLangIdentifier: Bool = false
|
||||
public var currentLayout: NSUserInterfaceLayoutOrientation = .horizontal
|
||||
|
|
Loading…
Reference in New Issue