Skip to content

Commit 72d4541

Browse files
committed
Update FocusContainer
1 parent 50c8a82 commit 72d4541

File tree

2 files changed

+61
-12
lines changed
  • sdk/compose/highlights-core/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/highlights/core
  • tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/jewel/editor

2 files changed

+61
-12
lines changed

sdk/compose/highlights-core/src/commonMain/kotlin/io/github/composegears/valkyrie/sdk/compose/highlights/core/Common.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.compose.ui.text.font.FontWeight
99
import androidx.compose.ui.text.style.TextDecoration
1010
import dev.snipme.highlights.Highlights
1111
import dev.snipme.highlights.model.BoldHighlight
12+
import dev.snipme.highlights.model.CodeHighlight
1213
import dev.snipme.highlights.model.ColorHighlight
1314
import dev.snipme.highlights.model.PhraseLocation
1415
import dev.snipme.highlights.model.SyntaxLanguage
@@ -61,6 +62,27 @@ fun Highlights.buildAnnotatedString() = buildAnnotatedString {
6162
}
6263
}
6364

65+
fun List<CodeHighlight>.generateAnnotatedString(code: String) =
66+
buildAnnotatedString {
67+
append(code)
68+
69+
forEach {
70+
when (it) {
71+
is BoldHighlight -> addStyle(
72+
SpanStyle(fontWeight = FontWeight.Bold),
73+
start = it.location.start,
74+
end = it.location.end,
75+
)
76+
77+
is ColorHighlight -> addStyle(
78+
SpanStyle(color = Color(it.rgb).copy(alpha = 1f)),
79+
start = it.location.start,
80+
end = it.location.end,
81+
)
82+
}
83+
}
84+
}
85+
6486
fun getEmphasisLocations(
6587
codeBlock: String,
6688
highlightText: String,

tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/jewel/editor/CodeEditor.kt

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,28 @@ import androidx.compose.foundation.verticalScroll
1313
import androidx.compose.runtime.Composable
1414
import androidx.compose.runtime.LaunchedEffect
1515
import androidx.compose.runtime.getValue
16+
import androidx.compose.runtime.remember
1617
import androidx.compose.runtime.setValue
1718
import androidx.compose.ui.Alignment
1819
import androidx.compose.ui.Modifier
1920
import androidx.compose.ui.graphics.SolidColor
21+
import androidx.compose.ui.text.AnnotatedString
2022
import androidx.compose.ui.text.TextStyle
2123
import androidx.compose.ui.text.input.OffsetMapping
2224
import androidx.compose.ui.text.input.TransformedText
2325
import androidx.compose.ui.text.style.TextAlign
2426
import androidx.compose.ui.unit.dp
27+
import dev.snipme.highlights.DefaultHighlightsResultListener
2528
import dev.snipme.highlights.Highlights
29+
import dev.snipme.highlights.model.CodeHighlight
2630
import dev.snipme.highlights.model.SyntaxLanguage
2731
import dev.snipme.highlights.model.SyntaxThemes
2832
import io.github.composegears.valkyrie.jewel.VerticalDivider
2933
import io.github.composegears.valkyrie.jewel.tooling.PreviewTheme
3034
import io.github.composegears.valkyrie.sdk.compose.foundation.layout.Spacer
3135
import io.github.composegears.valkyrie.sdk.compose.foundation.rememberMutableIntState
3236
import io.github.composegears.valkyrie.sdk.compose.foundation.rememberMutableState
33-
import io.github.composegears.valkyrie.sdk.compose.highlights.core.buildAnnotatedString
37+
import io.github.composegears.valkyrie.sdk.compose.highlights.core.generateAnnotatedString
3438
import org.jetbrains.compose.ui.tooling.preview.Preview
3539
import org.jetbrains.jewel.foundation.theme.JewelTheme
3640
import org.jetbrains.jewel.ui.component.HorizontalScrollbar
@@ -54,6 +58,27 @@ fun CodeEditor(
5458

5559
val isDark = JewelTheme.isDark
5660

61+
val highlights = remember(syntaxLanguage, isDark) {
62+
Highlights.Builder()
63+
.language(syntaxLanguage)
64+
.theme(SyntaxThemes.darcula(darkMode = isDark))
65+
.build()
66+
}
67+
68+
var transformText by rememberMutableState { AnnotatedString(text) }
69+
var highlightedText by rememberMutableState { AnnotatedString(text) }
70+
71+
LaunchedEffect(transformText) {
72+
highlights.getBuilder()
73+
.code(transformText.text)
74+
.build()
75+
.getHighlightsAsync(object : DefaultHighlightsResultListener() {
76+
override fun onSuccess(result: List<CodeHighlight>) {
77+
highlightedText = result.generateAnnotatedString(text)
78+
}
79+
})
80+
}
81+
5782
val linesCount by rememberMutableIntState(text) { text.count { it == '\n' } + 1 }
5883

5984
LaunchedEffect(linesTextScroll.value) {
@@ -91,17 +116,19 @@ fun CodeEditor(
91116
value = text,
92117
onValueChange = { onValueChange(it.updateTabs(translateTabToSpaces)) },
93118
visualTransformation = { text ->
94-
val code = Highlights.Builder()
95-
.code(text.text)
96-
.language(syntaxLanguage)
97-
.theme(SyntaxThemes.darcula(darkMode = isDark))
98-
.build()
99-
.buildAnnotatedString()
100-
101-
TransformedText(
102-
text = code,
103-
offsetMapping = OffsetMapping.Identity,
104-
)
119+
if (transformText != text) {
120+
transformText = text
121+
122+
TransformedText(
123+
text = text,
124+
offsetMapping = OffsetMapping.Identity,
125+
)
126+
}else {
127+
TransformedText(
128+
text = highlightedText,
129+
offsetMapping = OffsetMapping.Identity,
130+
)
131+
}
105132
},
106133
cursorBrush = SolidColor(JewelTheme.textFieldStyle.colors.caret),
107134
textStyle = textStyle,

0 commit comments

Comments
 (0)