Skip to content
This repository has been archived by the owner on Dec 23, 2024. It is now read-only.

Farsi/Persian Layout #206

Merged
merged 22 commits into from
Aug 2, 2024
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion app/src/main/java/se/nullable/flickboard/model/KeyM.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package se.nullable.flickboard.model

import se.nullable.flickboard.R
import se.nullable.flickboard.model.layouts.MESSAGEASE_SYMBOLS_LAYER
import se.nullable.flickboard.model.layouts.MINI_NUMBERS_SYMBOLS_LAYER
import se.nullable.flickboard.util.HardLineBreakIterator
import se.nullable.flickboard.util.flipIfBracket
import java.text.BreakIterator
Expand All @@ -9,6 +11,8 @@ data class Layout(
val mainLayer: Layer,
val shiftLayer: Layer = mainLayer.autoShift(),
val controlLayer: Layer? = null,
val symbolLayer: Layer = MESSAGEASE_SYMBOLS_LAYER,
val miniSymbolLayer: Layer = MINI_NUMBERS_SYMBOLS_LAYER,
val digits: String = "0123456789",
val textDirection: TextDirection = TextDirection.LeftToRight,
)
Expand Down Expand Up @@ -365,7 +369,11 @@ enum class ActionClass {

sealed class ActionVisual {
data class Icon(val resource: Int) : ActionVisual()
data class Label(val label: String) : ActionVisual()
data class Label(
val label: String,
val directionOverride: TextDirection? = null
) : ActionVisual()

data object None : ActionVisual()
}

Expand Down
133 changes: 133 additions & 0 deletions app/src/main/java/se/nullable/flickboard/model/layouts/FAMessagEase.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package se.nullable.flickboard.model.layouts

import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import se.nullable.flickboard.model.Action
import se.nullable.flickboard.model.ActionVisual
import se.nullable.flickboard.model.Direction
import se.nullable.flickboard.model.KeyM
import se.nullable.flickboard.model.Layer
import se.nullable.flickboard.model.Layout
import se.nullable.flickboard.model.TextDirection
import se.nullable.flickboard.ui.KeyboardLayoutPreview

val FA_MESSAGEASE_MAIN_LAYER = Layer(
keyRows = listOf(
listOf(
KeyM(
actions = mapOf(
Direction.CENTER to Action.Text("ه"),
Direction.RIGHT to Action.Text("ـ"),
Direction.BOTTOM to Action.Text("ۀ"),
Direction.BOTTOM_RIGHT to Action.Text("ق"),

)
),
KeyM(
actions = mapOf(
Direction.CENTER to Action.Text("ب"),
Direction.BOTTOM_LEFT to Action.Text("ض"),
Direction.BOTTOM to Action.Text("خ"),
Direction.BOTTOM_RIGHT to Action.Text("پ"),
)
),
KeyM(
actions = mapOf(
Direction.CENTER to Action.Text("م"),
Direction.TOP_RIGHT to Action.Text(
"\u200F", //RLM
visualOverride = ActionVisual.Label(
"¶‹",
directionOverride = TextDirection.RightToLeft
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it should be TextDirection.LeftToRight to be displayed as ¶‹

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

),
),
Direction.BOTTOM_LEFT to Action.Text("چ"),
)
),
),
listOf(
KeyM(
actions = mapOf(
Direction.CENTER to Action.Text("ی"),
Direction.TOP_RIGHT to Action.Text("ص"),
Direction.RIGHT to Action.Text("ش"),
Direction.BOTTOM_RIGHT to Action.Text("ط"),
)
),
KeyM(
actions = mapOf(
Direction.CENTER to Action.Text("ا"),
Direction.TOP_LEFT to Action.Text("ف"),
Direction.TOP to Action.Text("ح"),
Direction.TOP_RIGHT to Action.Text("ج"),
Direction.LEFT to Action.Text("س"),
Direction.RIGHT to Action.Text("آ"),
Direction.BOTTOM_LEFT to Action.Text("ل"),
Direction.BOTTOM to Action.Text("ت"),
Direction.BOTTOM_RIGHT to Action.Text("ک"),
)
),
KeyM(
actions = mapOf(
Direction.CENTER to Action.Text("ر"),
Direction.TOP_LEFT to Action.Text("ژ"),
Direction.LEFT to Action.Text("ز"),
Direction.BOTTOM_LEFT to Action.Text("ع"),
)
),
),
listOf(
KeyM(
actions = mapOf(
Direction.CENTER to Action.Text("و"),
Direction.TOP_RIGHT to Action.Text("ؤ"),
Direction.RIGHT to Action.Text(
"\u200C", //ZWNJ
visualOverride = ActionVisual.Label("‹›"),
),
)
),
KeyM(
actions = mapOf(
Direction.CENTER to Action.Text("ن"),
Direction.TOP_LEFT to Action.Text("ظ"),
Direction.TOP to Action.Text("ث"),
Direction.TOP_RIGHT to Action.Text("غ"),
Direction.LEFT to Action.Text("ء"),
Direction.RIGHT to Action.Text("أ"),
Direction.BOTTOM to Action.Text("."),
Direction.BOTTOM_RIGHT to Action.Text("ئ"),
)
),
KeyM(
actions = mapOf(
Direction.CENTER to Action.Text("د"),
Direction.TOP_LEFT to Action.Text("گ"),
Direction.LEFT to Action.Text("ذ"),
)
),
),
listOf(SPACE)
)
)

val FA_MESSAGEASE = Layout(
mainLayer = FA_MESSAGEASE_MAIN_LAYER,
controlLayer = CONTROL_MESSAGEASE_LAYER,
digits = "۰۱۲۳۴۵۶۷۸۹",
textDirection = TextDirection.RightToLeft,
symbolLayer = FA_SYMBOLS_LAYER,
miniSymbolLayer = FA_MINI_NUMBERS_SYMBOLS_LAYER,
)

@Composable
@Preview
fun FaMessagEaseKeyboardPreview() {
KeyboardLayoutPreview(layout = Layout(FA_MESSAGEASE_MAIN_LAYER))
}

@Composable
@Preview
fun FaMessagEaseFullKeyboardPreview() {
KeyboardLayoutPreview(layout = FA_MESSAGEASE, showAllModifiers = true)
}
194 changes: 194 additions & 0 deletions app/src/main/java/se/nullable/flickboard/model/layouts/FASymbols.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
package se.nullable.flickboard.model.layouts

import se.nullable.flickboard.R
import se.nullable.flickboard.model.Action
import se.nullable.flickboard.model.ActionVisual
import se.nullable.flickboard.model.Direction
import se.nullable.flickboard.model.KeyM
import se.nullable.flickboard.model.Layer

val FA_SYMBOLS_LAYER = Layer(
keyRows = listOf(
listOf(
KeyM(
actions = mapOf(
Direction.BOTTOM_LEFT to Action.Text("﷼"),
Direction.BOTTOM to Action.Text("٫"),
Direction.RIGHT to Action.Text(
"ّ",
visualOverride = ActionVisual.Label("ـّ")
)
),
shift = KeyM(
actions = mapOf(
Direction.RIGHT to Action.Text("÷"),
Direction.BOTTOM_LEFT to Action.Text("¥"),
Direction.BOTTOM to Action.Text("•")
)
)
),
KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text("`"),
Direction.TOP to Action.Text("^"),
Direction.TOP_RIGHT to Action.Text("´"),
Direction.LEFT to Action.Text("+"),
Direction.RIGHT to Action.Text("!"),
Direction.BOTTOM_LEFT to Action.Text("/"),
Direction.BOTTOM_RIGHT to Action.Text("\\")
),
shift = KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text("‘"),
Direction.TOP to Action.Text("ˇ"),
Direction.TOP_RIGHT to Action.Text("’"),
Direction.LEFT to Action.Text("×"),
Direction.RIGHT to Action.Text("¡"),
Direction.BOTTOM_LEFT to Action.Text("–"),
Direction.BOTTOM_RIGHT to Action.Text("—")
)
)
),
KeyM(
actions = mapOf(
Direction.LEFT to Action.Text("؟"),
Direction.BOTTOM to Action.Text("="),
Direction.BOTTOM_RIGHT to Action.Text("$"),
),
shift = KeyM(
actions = mapOf(
Direction.LEFT to Action.Text("¿"),
Direction.BOTTOM to Action.Text("±"),
Direction.BOTTOM_RIGHT to Action.Text("£")
)
)
),
),
listOf(
KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text("{"),
Direction.TOP_RIGHT to Action.Text("٪"),
Direction.LEFT to Action.Text("("),
Direction.BOTTOM_LEFT to Action.Text("["),
Direction.BOTTOM_RIGHT to Action.Text("_"),
),
shift = KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text("}"),
Direction.TOP_RIGHT to Action.Text("‰"),
Direction.LEFT to Action.Text(")"),
Direction.BOTTOM_LEFT to Action.Text("]"),
Direction.BOTTOM to Action.Text("¯"),
Direction.BOTTOM_RIGHT to Action.Text("¬")
)
)
),
KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text(
"ُ",
visualOverride = ActionVisual.Label("ـُ")
),
Direction.TOP_RIGHT to Action.Text(
"َ",
visualOverride = ActionVisual.Label("ـَ")
),
Direction.BOTTOM to Action.Text(
"ِ",
visualOverride = ActionVisual.Label("ـِ")
)
)
),
KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text("|"),
Direction.TOP_RIGHT to Action.Text("}"),
Direction.RIGHT to Action.Text(")"),
Direction.BOTTOM_LEFT to Action.Text("@"),
Direction.BOTTOM_RIGHT to Action.Text("]"),
),
shift = KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text("¶"),
Direction.TOP_RIGHT to Action.Text("{"),
Direction.RIGHT to Action.Text("("),
Direction.BOTTOM_LEFT to Action.Text("ª"),
Direction.BOTTOM_RIGHT to Action.Text("[")
)
)
),
),
listOf(
KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text("~"),
Direction.TOP_RIGHT to Action.Text(
"ً",
visualOverride = ActionVisual.Label("ـً")
),
Direction.LEFT to Action.Text("«"),
Direction.BOTTOM_LEFT to Action.Text("<"),
Direction.BOTTOM_RIGHT to Action.Text(":")
),
shift = KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text("˜"),
Direction.TOP to Action.Text("˝"),
Direction.LEFT to Action.Text("‹"),
Direction.RIGHT to Action.Text("†"),
Direction.BOTTOM_LEFT to Action.Text("«"),
Direction.BOTTOM_RIGHT to Action.Text(
"\t",
forceRawKeyEvent = true,
visualOverride = ActionVisual.Icon(R.drawable.baseline_keyboard_tab_24)
)
)
)
),
KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text("\""),
Direction.TOP_RIGHT to Action.Text("'"),
Direction.LEFT to Action.Text("،"),
Direction.BOTTOM_LEFT to Action.Text("*"),
Direction.BOTTOM to Action.Text("."),
Direction.BOTTOM_RIGHT to Action.Text("-"),
),
shift = KeyM(
actions = mapOf(
Direction.TOP_LEFT to Action.Text("“"),
Direction.TOP_RIGHT to Action.Text("”"),
Direction.BOTTOM_LEFT to Action.Text("‚"),
Direction.BOTTOM to Action.Text("…"),
Direction.BOTTOM_RIGHT to Action.Text("„")
)
)
),
KeyM(
actions = mapOf(
Direction.TOP to Action.Text("&"),
Direction.TOP_RIGHT to Action.Text("°"),
Direction.LEFT to Action.Text("#"),
Direction.RIGHT to Action.Text("»"),
Direction.BOTTOM_LEFT to Action.Text("؛"),
Direction.BOTTOM_RIGHT to Action.Text(">")
),
shift = KeyM(
actions = mapOf(
Direction.TOP to Action.Text("§"),
Direction.TOP_RIGHT to Action.Text("º"),
Direction.LEFT to Action.Text("£"),
Direction.RIGHT to Action.Text("›"),
Direction.BOTTOM_LEFT to Action.Text("¸"),
Direction.BOTTOM_RIGHT to Action.Text("»")
)
)
),
),
listOf(
KeyM(actions = mapOf(), colspan = 2),
SPACE.copy(colspan = 1)
)
)
)
Loading