mirror of
https://gitlab.futo.org/keyboard/latinime.git
synced 2024-09-28 14:54:30 +01:00
Calculate settings/punctuation morekeys based on coord
This commit is contained in:
parent
c644be00a2
commit
b8fc09e25c
File diff suppressed because it is too large
Load Diff
@ -274,11 +274,15 @@ data class KeyAttributes(
|
||||
val shiftable: Boolean? = null,
|
||||
) {
|
||||
fun getEffectiveAttributes(row: Row, keyboard: Keyboard): KeyAttributes {
|
||||
val attrs = listOf(this, row.attributes, keyboard.attributes, DefaultKeyAttributes)
|
||||
val attrs = if(row.isBottomRow) {
|
||||
listOf(this, row.attributes, DefaultKeyAttributes)
|
||||
} else {
|
||||
listOf(this, row.attributes, keyboard.attributes, DefaultKeyAttributes)
|
||||
}
|
||||
|
||||
val effectiveWidth = resolve(attrs) { it.width }
|
||||
|
||||
val defaultMoreKeyMode = if(row.isLetterRow && effectiveWidth == KeyWidth.Regular) {
|
||||
val defaultMoreKeyMode = if((row.isLetterRow || row.isBottomRow) && effectiveWidth == KeyWidth.Regular) {
|
||||
MoreKeyMode.All
|
||||
} else {
|
||||
MoreKeyMode.OnlyFromKeyspec
|
||||
@ -373,6 +377,13 @@ data class BaseKey(
|
||||
*/
|
||||
val hint: String? = null,
|
||||
) : AbstractKey {
|
||||
override fun countsToKeyCoordinate(params: KeyboardParams, row: Row, keyboard: Keyboard): Boolean {
|
||||
val attributes = attributes.getEffectiveAttributes(row, keyboard)
|
||||
val moreKeyMode = attributes.moreKeyMode!!
|
||||
|
||||
return moreKeyMode.autoNumFromCoord && moreKeyMode.autoSymFromCoord
|
||||
}
|
||||
|
||||
override fun computeData(params: KeyboardParams, row: Row, keyboard: Keyboard, coordinate: KeyCoordinate): ComputedKeyData {
|
||||
val attributes = attributes.getEffectiveAttributes(row, keyboard)
|
||||
val shifted = (attributes.shiftable == true) && when(params.mId.mElementId) {
|
||||
@ -407,12 +418,16 @@ data class BaseKey(
|
||||
getDefaultMoreKeysForKey(code, relevantSpecShortcut)
|
||||
} else { null },
|
||||
|
||||
if (moreKeyMode.autoNumFromCoord) {
|
||||
if (moreKeyMode.autoNumFromCoord && row.isLetterRow) {
|
||||
getNumForCoordinate(coordinate)
|
||||
} else { null },
|
||||
|
||||
if (moreKeyMode.autoSymFromCoord) {
|
||||
if (moreKeyMode.autoSymFromCoord && row.isLetterRow) {
|
||||
getSymsForCoordinate(coordinate)
|
||||
} else { null },
|
||||
|
||||
if (moreKeyMode.autoSymFromCoord) {
|
||||
getSpecialFromRow(coordinate, row)
|
||||
} else { null }
|
||||
).joinToString(",")
|
||||
|
||||
@ -492,13 +507,8 @@ data class CaseSelector(
|
||||
*/
|
||||
val symbolsShifted: Key = normal
|
||||
) : AbstractKey {
|
||||
override fun computeData(
|
||||
params: KeyboardParams,
|
||||
row: Row,
|
||||
keyboard: Keyboard,
|
||||
coordinate: KeyCoordinate
|
||||
): ComputedKeyData? =
|
||||
when(params.mId.mElementId) {
|
||||
private fun selectKeyFromElement(elementId: Int): Key =
|
||||
when(elementId) {
|
||||
KeyboardId.ELEMENT_ALPHABET -> normal
|
||||
|
||||
// KeyboardState.kt currently doesn't distinguish between these
|
||||
@ -512,7 +522,18 @@ data class CaseSelector(
|
||||
KeyboardId.ELEMENT_SYMBOLS -> symbols
|
||||
KeyboardId.ELEMENT_SYMBOLS_SHIFTED -> symbolsShifted
|
||||
else -> normal
|
||||
}.computeData(params, row, keyboard, coordinate)
|
||||
}
|
||||
|
||||
override fun countsToKeyCoordinate(params: KeyboardParams, row: Row, keyboard: Keyboard): Boolean =
|
||||
selectKeyFromElement(params.mId.mElementId).countsToKeyCoordinate(params, row, keyboard)
|
||||
|
||||
override fun computeData(
|
||||
params: KeyboardParams,
|
||||
row: Row,
|
||||
keyboard: Keyboard,
|
||||
coordinate: KeyCoordinate
|
||||
): ComputedKeyData? =
|
||||
selectKeyFromElement(params.mId.mElementId).computeData(params, row, keyboard, coordinate)
|
||||
}
|
||||
|
||||
typealias Key = @Serializable(with = KeyPathSerializer::class) AbstractKey
|
||||
@ -601,6 +622,8 @@ enum class KeyVisualStyle {
|
||||
@Serializable
|
||||
@SerialName("gap")
|
||||
class GapKey(val attributes: KeyAttributes = KeyAttributes()) : AbstractKey {
|
||||
override fun countsToKeyCoordinate(params: KeyboardParams, row: Row, keyboard: Keyboard): Boolean = false
|
||||
|
||||
override fun computeData(
|
||||
params: KeyboardParams,
|
||||
row: Row,
|
||||
|
@ -8,11 +8,18 @@ import org.futo.inputmethod.keyboard.internal.MoreKeySpec
|
||||
data class KeyCoordinate(
|
||||
val regularRow: Int,
|
||||
val regularColumn: Int,
|
||||
val element: KeyboardLayoutElement
|
||||
val element: KeyboardLayoutElement,
|
||||
val measurement: KeyCoordinateMeasurement
|
||||
)
|
||||
|
||||
data class KeyCoordinateMeasurement(
|
||||
val totalRows: Int,
|
||||
val numColumnsByRow: List<Int>
|
||||
)
|
||||
|
||||
@Serializable
|
||||
sealed interface AbstractKey {
|
||||
fun countsToKeyCoordinate(params: KeyboardParams, row: Row, keyboard: Keyboard): Boolean
|
||||
fun computeData(params: KeyboardParams, row: Row, keyboard: Keyboard, coordinate: KeyCoordinate): ComputedKeyData?
|
||||
}
|
||||
|
||||
|
@ -2,8 +2,8 @@ package org.futo.inputmethod.v2keyboard
|
||||
|
||||
val KeySpecShortcuts = mapOf(
|
||||
"q" to listOf("keyspec_q"),
|
||||
"," to listOf("keyspec_comma", "morekeys_comma"),
|
||||
"." to listOf("keyspec_period", "morekeys_period"),
|
||||
"," to listOf("keyspec_comma"),
|
||||
"." to listOf("keyspec_period"),
|
||||
"1" to listOf("keyspec_symbols_1", "additional_morekeys_symbols_1", "morekeys_symbols_1"),
|
||||
"2" to listOf("keyspec_symbols_2", "additional_morekeys_symbols_2", "morekeys_symbols_2"),
|
||||
"3" to listOf("keyspec_symbols_3", "additional_morekeys_symbols_3", "morekeys_symbols_3"),
|
||||
@ -30,6 +30,7 @@ val KeySpecShortcuts = mapOf(
|
||||
"]" to listOf("keyspec_right_square_bracket"),
|
||||
"{" to listOf("keyspec_left_curly_bracket"),
|
||||
"}" to listOf("keyspec_right_curly_bracket"),
|
||||
"*" to listOf("*", "morekeys_star"),
|
||||
|
||||
// U+2260: "≠" NOT EQUAL TO
|
||||
// U+2248: "≈" ALMOST EQUAL TO
|
||||
|
@ -361,11 +361,32 @@ data class LayoutEngine(
|
||||
}.toFloat()
|
||||
}
|
||||
|
||||
// Measure key coordinate
|
||||
val numColumnsPerRow = mutableListOf<Int>()
|
||||
rows.forEach { row ->
|
||||
val numColumns = row.keys.sumOf { if(it.countsToKeyCoordinate(params, row, keyboard)) (1 as Int) else 0 }
|
||||
if(numColumns > 0) {
|
||||
numColumnsPerRow.add(numColumns)
|
||||
}
|
||||
}
|
||||
|
||||
val keyCoordinateMeasurement = KeyCoordinateMeasurement(
|
||||
totalRows = numColumnsPerRow.size,
|
||||
numColumnsByRow = numColumnsPerRow.toList()
|
||||
)
|
||||
|
||||
var regularRow = 0
|
||||
val computedRowWithoutWidths = rows.map { row ->
|
||||
var regularColumn = 0
|
||||
row.keys.mapNotNull { key ->
|
||||
key.computeData(params, row, keyboard, KeyCoordinate(regularRow, regularColumn, layoutParams.element))?.let { data ->
|
||||
val coordinate = KeyCoordinate(
|
||||
regularRow,
|
||||
regularColumn,
|
||||
layoutParams.element,
|
||||
keyCoordinateMeasurement
|
||||
)
|
||||
|
||||
key.computeData(params, row, keyboard, coordinate)?.let { data ->
|
||||
if(data.countsToKeyCoordinate) {
|
||||
regularColumn += 1
|
||||
}
|
||||
@ -564,8 +585,6 @@ data class LayoutEngine(
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
params.mIconsSet.loadIcons(null, provider!!)
|
||||
params.mThemeId = 3
|
||||
params.mTextsSet.setLocale(params.mId.locale, context)
|
||||
|
@ -45,3 +45,15 @@ fun getNumForCoordinate(keyCoordinate: KeyCoordinate): String {
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
fun getSpecialFromRow(keyCoordinate: KeyCoordinate, row: Row): String {
|
||||
if(row.isBottomRow) {
|
||||
val numCols = keyCoordinate.measurement.numColumnsByRow.getOrNull(keyCoordinate.regularRow) ?: -10
|
||||
if(keyCoordinate.regularColumn == 0) {
|
||||
return "!text/morekeys_bottomrow_comma"
|
||||
}else if(keyCoordinate.regularColumn == numCols - 1) {
|
||||
return "!text/morekeys_period"
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
@ -104,6 +104,7 @@ val TemplateAlt2Key = BaseKey(
|
||||
data class EnterKey(
|
||||
val attributes: KeyAttributes = KeyAttributes(width = KeyWidth.FunctionalKey)
|
||||
) : AbstractKey {
|
||||
override fun countsToKeyCoordinate(params: KeyboardParams, row: Row, keyboard: Keyboard): Boolean = false
|
||||
override fun computeData(
|
||||
params: KeyboardParams,
|
||||
row: Row,
|
||||
@ -169,6 +170,7 @@ data class EnterKey(
|
||||
data class ActionKey(
|
||||
val attributes: KeyAttributes = KeyAttributes()
|
||||
) : AbstractKey {
|
||||
override fun countsToKeyCoordinate(params: KeyboardParams, row: Row, keyboard: Keyboard): Boolean = false
|
||||
override fun computeData(
|
||||
params: KeyboardParams,
|
||||
row: Row,
|
||||
@ -217,21 +219,27 @@ data class ContextualKey(
|
||||
KeyboardId.MODE_TIME to BaseKey(spec = ":", attributes = attributes),
|
||||
)
|
||||
|
||||
private fun selectKey(params: KeyboardParams, keyboard: Keyboard): Key? {
|
||||
if(keyboard.useZWNJKey) {
|
||||
return TemplateZWNJKey
|
||||
}
|
||||
|
||||
val key = keys[params.mId.mMode] ?: fallbackKey
|
||||
|
||||
return key
|
||||
}
|
||||
|
||||
override fun countsToKeyCoordinate(params: KeyboardParams, row: Row, keyboard: Keyboard): Boolean {
|
||||
return selectKey(params, keyboard)?.countsToKeyCoordinate(params, row, keyboard) ?: false
|
||||
}
|
||||
|
||||
override fun computeData(
|
||||
params: KeyboardParams,
|
||||
row: Row,
|
||||
keyboard: Keyboard,
|
||||
coordinate: KeyCoordinate
|
||||
): ComputedKeyData? {
|
||||
if(keyboard.useZWNJKey) {
|
||||
return TemplateZWNJKey.computeData(params, row, keyboard, coordinate)
|
||||
}
|
||||
|
||||
val key = keys[params.mId.mMode] ?: fallbackKey
|
||||
|
||||
return key?.computeData(
|
||||
params, row, keyboard, coordinate
|
||||
)
|
||||
return selectKey(params, keyboard)?.computeData(params, row, keyboard, coordinate)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -264,6 +264,9 @@
|
||||
"tablet_period": [
|
||||
"!text/morekeys_tablet_punctuation"
|
||||
],
|
||||
"bottomrow_comma": [
|
||||
"!icon/action_settings|!code/action_settings"
|
||||
],
|
||||
"exclamation": [
|
||||
"¡",
|
||||
"‽"
|
||||
|
Loading…
Reference in New Issue
Block a user