Skip to content

Commit

Permalink
Make key events customizable
Browse files Browse the repository at this point in the history
  • Loading branch information
zhelenskiy committed Apr 1, 2024
1 parent d91b920 commit cd31669
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 16 deletions.
10 changes: 5 additions & 5 deletions composeApp/src/commonMain/kotlin/CorrectBracketSequence.kt
Original file line number Diff line number Diff line change
Expand Up @@ -255,25 +255,25 @@ fun CorrectBracketSequence() {
textFieldState = codeTextFieldState,
matchedBrackets = matchedBrackets,
),
removeIndentBackPressCharEventHandler(
removeIndentBackspaceCharEventHandler(
textFieldState = codeTextFieldState,
),
removeEmptyBracesBackPressCharEventHandler(
removeEmptyBracesBackspaceCharEventHandler(
textFieldState = codeTextFieldState,
openingBracket = "[",
closingBracket = "]",
),
removeEmptyBracesBackPressCharEventHandler(
removeEmptyBracesBackspaceCharEventHandler(
textFieldState = codeTextFieldState,
openingBracket = "(",
closingBracket = ")",
),
removeEmptyBracesBackPressCharEventHandler(
removeEmptyBracesBackspaceCharEventHandler(
textFieldState = codeTextFieldState,
openingBracket = "<",
closingBracket = ">",
),
removeEmptyBracesBackPressCharEventHandler(
removeEmptyBracesBackspaceCharEventHandler(
textFieldState = codeTextFieldState,
openingBracket = "{",
closingBracket = "}",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ public fun combineCharEventHandlers(vararg handlers: CharEventHandler?): CharEve
{ event -> handlers.firstNotNullOfOrNull { it?.invoke(event) } }

public typealias KeyEventHandler = (KeyEvent) -> TextFieldValue?
public typealias KeyEventFilter = (KeyEvent) -> Boolean

public fun combineKeyEventHandlers(vararg handlers: KeyEventHandler?): KeyEventHandler =
{ event -> handlers.firstNotNullOfOrNull { it?.invoke(event) } }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ public inline fun <reified T : Token, reified Bracket : ScopeChangingToken> newL
)
}

public fun <T : Token> removeIndentBackPressCharEventHandler(
public fun <T : Token> removeIndentBackspaceCharEventHandler(
textFieldState: BasicSourceCodeTextFieldState<T>,
indent: String = " ".repeat(4),
): CharEventHandler = f@{ keyEvent ->
Expand All @@ -252,7 +252,7 @@ public fun <T : Token> removeIndentBackPressCharEventHandler(
)
}

public fun <T : Token> removeEmptyBracesBackPressCharEventHandler(
public fun <T : Token> removeEmptyBracesBackspaceCharEventHandler(
textFieldState: BasicSourceCodeTextFieldState<T>,
openingBracket: String,
closingBracket: String,
Expand Down
23 changes: 15 additions & 8 deletions editor/src/commonMain/kotlin/editor/basic/KeyEventHandlers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,19 @@ import androidx.compose.ui.text.input.TextFieldValue

public fun <T : Token> handleMovingOffsets(
state: BasicSourceCodeTextFieldState<T>,
indent: String = " ".repeat(4)
indent: String = " ".repeat(4),
moveForwardFilter: KeyEventFilter = { keyEvent ->
!keyEvent.isShiftPressed && keyEvent.key == Key.Tab && keyEvent.type == KeyEventType.KeyDown &&
!keyEvent.isAltPressed && !keyEvent.isCtrlPressed && !keyEvent.isMetaPressed
},
moveBackwardFilter: KeyEventFilter = { keyEvent ->
keyEvent.isShiftPressed && keyEvent.key == Key.Tab && keyEvent.type == KeyEventType.KeyDown &&
!keyEvent.isAltPressed && !keyEvent.isCtrlPressed && !keyEvent.isMetaPressed
},
): KeyEventHandler = f@{ keyEvent: KeyEvent ->
if (
state.selection.collapsed && !keyEvent.isShiftPressed || keyEvent.key != Key.Tab ||
keyEvent.type != KeyEventType.KeyDown || keyEvent.isAltPressed || keyEvent.isCtrlPressed ||
keyEvent.isMetaPressed
) return@f null
val moveForward = !state.selection.collapsed && moveForwardFilter(keyEvent)
val moveBackward = moveBackwardFilter(keyEvent)
if (moveBackward == moveForward) return@f null
val selectionLines =
state.sourceCodePositions[state.selection.min].line..state.sourceCodePositions[state.selection.max].line
val offsetBefore = state.offsets.getOrNull(selectionLines.first - 1)?.last()
Expand All @@ -21,7 +27,7 @@ public fun <T : Token> handleMovingOffsets(
var newSelectionEnd = state.selection.end
var newCompositionStart = state.composition?.start
var newCompositionEnd = state.composition?.end
if (keyEvent.isShiftPressed) {
if (moveBackward) {
fun increment(length: Int, oldOffsetStart: Int) {
if (state.selection.start >= oldOffsetStart)
newSelectionStart -= minOf(length, state.selection.start - oldOffsetStart)
Expand All @@ -31,7 +37,8 @@ public fun <T : Token> handleMovingOffsets(

if (state.composition != null) {
if (state.composition.start >= oldOffsetStart)
newCompositionStart = newCompositionStart!! - minOf(length, state.composition.start - oldOffsetStart)
newCompositionStart =
newCompositionStart!! - minOf(length, state.composition.start - oldOffsetStart)

if (state.composition.end >= oldOffsetStart)
newCompositionEnd = newCompositionEnd!! - minOf(length, state.composition.end - oldOffsetStart)
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ development=true

#Publication
group=com.zhelenskiy
version=0.0.3
version=0.0.4

0 comments on commit cd31669

Please sign in to comment.