From 6f994be5b68cc0cb800eb13bec3d2e05c70ff380 Mon Sep 17 00:00:00 2001 From: "Evgeniy.Zhelenskiy" Date: Sun, 7 Apr 2024 04:54:23 +0200 Subject: [PATCH] Add inner padding support --- .../src/commonMain/kotlin/CorrectBracketSequence.kt | 12 ++++++++++++ .../kotlin/editor/basic/BasicSourceCodeTextField.kt | 10 +++++++--- .../src/commonMain/kotlin/editor/basic/Decorators.kt | 9 +++++++-- gradle.properties | 2 +- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/CorrectBracketSequence.kt b/composeApp/src/commonMain/kotlin/CorrectBracketSequence.kt index fcaf964..245ca56 100644 --- a/composeApp/src/commonMain/kotlin/CorrectBracketSequence.kt +++ b/composeApp/src/commonMain/kotlin/CorrectBracketSequence.kt @@ -1,6 +1,9 @@ import CorrectBracketSequenceToken.* import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.background +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.calculateEndPadding +import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.rememberScrollState import androidx.compose.material3.HorizontalDivider @@ -10,6 +13,7 @@ import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.text.* import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.input.TextFieldValue @@ -122,6 +126,12 @@ fun CorrectBracketSequence() { var maximumStickyHeaderHeight: Dp by remember { mutableStateOf(0.dp) } val lineNumbersColor = Color.DarkGray + val innerPadding = PaddingValues(10.dp) + val stickyHeaderInnerPadding = PaddingValues( + start = innerPadding.calculateStartPadding(LocalLayoutDirection.current), + end = innerPadding.calculateEndPadding(LocalLayoutDirection.current), + top = innerPadding.calculateTopPadding(), + ) BasicSourceCodeTextField( state = codeTextFieldState, onStateUpdate = { codeTextFieldState = it }, @@ -153,6 +163,7 @@ fun CorrectBracketSequence() { maximumStickyHeaderHeight = (maxHeight / 3).also { maximumStickyHeaderHeight = it }, onClick = { coroutineScope.launch { externalScrollToFlow.emit(SourceCodePosition(it, 0)) } }, divider = { HorizontalDivider(thickness = 1.dp) }, + innerPadding = stickyHeaderInnerPadding, additionalInnerComposable = { linesToWrite, _ -> AnimatedVisibility(showIndentation) { val lineMapping = linesToWrite.keys.withIndex().associate { (index, line) -> line to index } @@ -171,6 +182,7 @@ fun CorrectBracketSequence() { textStyle = textStyle, verticalScrollState = verticalState, modifier = Modifier.fillMaxWidth().background(color = Color.White), + innerPadding = innerPadding, editorOffsetsForPosition = { EditorOffsets( top = getOffsetForLineToAppearOnTop( diff --git a/editor/src/commonMain/kotlin/editor/basic/BasicSourceCodeTextField.kt b/editor/src/commonMain/kotlin/editor/basic/BasicSourceCodeTextField.kt index ab97e37..92666a3 100644 --- a/editor/src/commonMain/kotlin/editor/basic/BasicSourceCodeTextField.kt +++ b/editor/src/commonMain/kotlin/editor/basic/BasicSourceCodeTextField.kt @@ -31,6 +31,7 @@ import androidx.compose.ui.input.key.KeyEvent import androidx.compose.ui.input.key.onPreviewKeyEvent import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.TextLayoutResult import androidx.compose.ui.text.TextRange @@ -308,15 +309,18 @@ public fun BasicSourceCodeTextField( onHoveredSourceCodePositionChange: (position: SourceCodePosition) -> Unit = {}, horizontalThresholdEdgeChars: Int = 5, verticalThresholdEdgeLines: Int = 1, + innerPadding: PaddingValues = PaddingValues(0.dp), ) { val coroutineScope = rememberCoroutineScope() val textSize = measureText(textStyle) val textHeightDp = with(LocalDensity.current) { textSize.height.toDp() } var textLayout: TextLayoutResult? by remember(state.text) { mutableStateOf(null) } + val innerTopPadding = innerPadding.calculateTopPadding() + val innerBottomPadding = innerPadding.calculateBottomPadding() BoxWithConstraints(modifier) { - val editorOuterHeight = maxHeight - val editorOuterMinHeight = minHeight + val editorOuterHeight = maxHeight - innerBottomPadding - innerTopPadding + val editorOuterMinHeight = minHeight - innerBottomPadding - innerTopPadding val editorOuterHeightPx = with(LocalDensity.current) { editorOuterHeight.toPx() } Wrapper( @@ -324,7 +328,7 @@ public fun BasicSourceCodeTextField( additionalOuterComposable(textLayout, innerComposable) } ) { - Row(modifier = Modifier.verticalScroll(verticalScrollState).widthIn(minWidth)) { + Row(modifier = Modifier.padding(innerPadding).verticalScroll(verticalScrollState).widthIn(minWidth)) { AnimatedVisibility(showLineNumbers) { Column(horizontalAlignment = Alignment.End) { repeat(state.offsets.size) { diff --git a/editor/src/commonMain/kotlin/editor/basic/Decorators.kt b/editor/src/commonMain/kotlin/editor/basic/Decorators.kt index 03e3d38..80cfac0 100644 --- a/editor/src/commonMain/kotlin/editor/basic/Decorators.kt +++ b/editor/src/commonMain/kotlin/editor/basic/Decorators.kt @@ -189,6 +189,7 @@ public inline fun BoxWithConst lineNumberModifier: Modifier = defaultLineNumberModifier, lineStringModifier: Modifier = Modifier, visualTransformation: VisualTransformation = VisualTransformation.None, + innerPadding: PaddingValues = PaddingValues(0.dp), crossinline stickyHeaderLinesChooser: (Bracket) -> IntRange? = { bracket -> state.tokenLines[bracket as T] }, crossinline onClick: (lineNumber: Int) -> Unit = {}, crossinline onHoveredSourceCodePositionChange: (position: SourceCodePosition) -> Unit = {}, @@ -201,12 +202,16 @@ public inline fun BoxWithConst val requestedLinesSet = getStickyHeaderLines(topVisibleRow, state, matchedBrackets, stickyHeaderLinesChooser) if (requestedLinesSet.isEmpty()) return Column { - Column(Modifier.heightIn(max = maximumStickyHeaderHeight)) { + Column( + modifier = Modifier + .heightIn(max = maximumStickyHeaderHeight) + .background(backgroundColor) + .padding(innerPadding) + ) { Row( modifier = Modifier .width(this@StickyHeader.maxWidth) .verticalScroll(rememberScrollState()) - .background(backgroundColor) ) { val lineCount: Int = state.offsets.size val linesToWrite = requestedLinesSet.associateWith { lineNumber -> diff --git a/gradle.properties b/gradle.properties index 20b42f4..4511c6f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,4 @@ development=true #Publication group=com.zhelenskiy -version=0.0.7 +version=0.0.8