Skip to content

Commit

Permalink
feat: client-cli
Browse files Browse the repository at this point in the history
  • Loading branch information
storytellerF committed Oct 20, 2024
1 parent 53722fb commit d2b0fe6
Show file tree
Hide file tree
Showing 5 changed files with 189 additions and 5 deletions.
4 changes: 0 additions & 4 deletions cli/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@ plugins {
group = "com.storyteller_f"
version = "unspecified"

repositories {
mavenCentral()
}

dependencies {
implementation(projects.shared)
testImplementation(kotlin("test"))
Expand Down
12 changes: 12 additions & 0 deletions client-cli/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
plugins {
alias(libs.plugins.kotlinJvm)
alias(libs.plugins.jetbrainsCompose)
alias(libs.plugins.compose.compiler)
application
}
application {
mainClass.set("example.MainKt")
}
dependencies {
implementation(libs.mosaic.runtime)
}
173 changes: 173 additions & 0 deletions client-cli/src/main/kotlin/example/main.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
package example

import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import com.jakewharton.mosaic.LocalTerminal
import com.jakewharton.mosaic.layout.background
import com.jakewharton.mosaic.layout.height
import com.jakewharton.mosaic.layout.size
import com.jakewharton.mosaic.modifier.Modifier
import com.jakewharton.mosaic.runMosaicBlocking
import com.jakewharton.mosaic.text.SpanStyle
import com.jakewharton.mosaic.text.buildAnnotatedString
import com.jakewharton.mosaic.text.withStyle
import com.jakewharton.mosaic.ui.Box
import com.jakewharton.mosaic.ui.Color
import com.jakewharton.mosaic.ui.Column
import com.jakewharton.mosaic.ui.ColumnScope
import com.jakewharton.mosaic.ui.Filler
import com.jakewharton.mosaic.ui.Row
import com.jakewharton.mosaic.ui.Spacer
import com.jakewharton.mosaic.ui.Text
import com.jakewharton.mosaic.ui.TextStyle
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.delay

private val BrightGreen = Color(100, 255, 100)
private val BrightBlue = Color(60, 140, 230)

fun main() = runMosaicBlocking {
Column {
val terminal = LocalTerminal.current
Text(
buildAnnotatedString {
append("\uD83D\uDDA5\uFE0F")
append(" ")
append("Terminal(")
withStyle(SpanStyle(color = BrightGreen)) {
append("width=")
}
withStyle(
SpanStyle(
color = BrightBlue,
textStyle = TextStyle.Bold + TextStyle.Underline,
),
) {
append(terminal.size.width.toString())
}
append(", ")
withStyle(SpanStyle(color = BrightGreen)) {
append("height=")
}
withStyle(
SpanStyle(
color = BrightBlue,
textStyle = TextStyle.Bold + TextStyle.Underline,
),
) {
append(terminal.size.height.toString())
}
append(")")
append(" ")
append("\uD83D\uDDA5\uFE0F")
},
)
Spacer(modifier = Modifier.height(1))
GradientsBlock()
}

LaunchedEffect(Unit) {
awaitCancellation()
}
}

@Suppress("UnusedReceiverParameter") // instead of ignore rule: compose:multiple-emitters-check
@Composable
private fun ColumnScope.GradientsBlock() {
val screenHalfWidth = LocalTerminal.current.size.width / 2
var gradientWidth by remember { mutableIntStateOf(0) }
val gradientWidthDiff by remember(screenHalfWidth) {
derivedStateOf { (screenHalfWidth - gradientWidth) / 5 }
}
Gradient(
repeatedWord = "Red",
width = gradientWidth,
textColorProvider = { percent -> Color(1.0f - percent, 0.0f, 0.0f) },
backgroundColorProvider = { percent -> Color(percent, 0.0f, 0.0f) },
)
Gradient(
repeatedWord = "Yellow",
width = gradientWidth,
textColorProvider = { percent -> Color(1.0f - percent, 1.0f - percent, 0.0f) },
backgroundColorProvider = { percent -> Color(percent, percent, 0.0f) },
)
Gradient(
repeatedWord = "Green",
width = gradientWidth,
textColorProvider = { percent -> Color(0.0f, 1.0f - percent, 0.0f) },
backgroundColorProvider = { percent -> Color(0.0f, percent, 0.0f) },
)
Gradient(
repeatedWord = "Cyan",
width = gradientWidth,
textColorProvider = { percent -> Color(0.0f, 1.0f - percent, 1.0f - percent) },
backgroundColorProvider = { percent -> Color(0.0f, percent, percent) },
)
Gradient(
repeatedWord = "Blue",
width = gradientWidth,
textColorProvider = { percent -> Color(0.0f, 0.0f, 1.0f - percent) },
backgroundColorProvider = { percent -> Color(0.0f, 0.0f, percent) },
)
Gradient(
repeatedWord = "Magenta",
width = gradientWidth,
textColorProvider = { percent -> Color(1.0f - percent, 0.0f, 1.0f - percent) },
backgroundColorProvider = { percent -> Color(percent, 0.0f, percent) },
)
LaunchedEffect(screenHalfWidth) {
while (true) {
delay(100L)
gradientWidth += gradientWidthDiff
}
}
}

@Composable
private fun Gradient(
repeatedWord: String,
width: Int,
textColorProvider: (percent: Float) -> Color,
backgroundColorProvider: (percent: Float) -> Color,
) {
var textBias by remember { mutableIntStateOf(0) }
Box {
Row {
var wordCharIndex = textBias
repeat(width) { index ->
if (wordCharIndex == repeatedWord.length) {
wordCharIndex = 0
}
Filler(
char = repeatedWord[wordCharIndex],
foreground = textColorProvider.invoke(index / width.toFloat()),
modifier = Modifier.size(1),
)
wordCharIndex++
}
}
Row {
repeat(width) { index ->
Spacer(
modifier = Modifier
.size(1)
.background(backgroundColorProvider.invoke(index / width.toFloat())),
)
}
}
}
LaunchedEffect(Unit) {
while (true) {
delay(200L)
textBias--
if (textBias < 0) {
textBias = repeatedWord.length - 1
}
}
}
}
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ kotlinxCoroutinesCore = "1.9.0"
kotlinxDatetime = "0.6.0"
ktomlCore = "0.5.1"
luceneCore = "9.11.1"
mosaicRuntime = "0.14.0"
multiplatformCryptoLibsodiumBindings = "0.9.2"
multiplatformMarkdownRenderer = "0.25.0"
napier = "2.7.1"
Expand Down Expand Up @@ -72,6 +73,7 @@ lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version.r
lucene-analysis-common = { module = "org.apache.lucene:lucene-analysis-common", version.ref = "luceneCore" }
lucene-core = { module = "org.apache.lucene:lucene-core", version.ref = "luceneCore" }
lucene-queryparser = { module = "org.apache.lucene:lucene-queryparser", version.ref = "luceneCore" }
mosaic-runtime = { module = "com.jakewharton.mosaic:mosaic-runtime", version.ref = "mosaicRuntime" }
multiplatform-crypto-libsodium-bindings = { module = "com.ionspin.kotlin:multiplatform-crypto-libsodium-bindings", version.ref = "multiplatformCryptoLibsodiumBindings" }
multiplatform-markdown-renderer = { module = "com.mikepenz:multiplatform-markdown-renderer", version.ref = "multiplatformMarkdownRenderer" }
multiplatform-markdown-renderer-coil3 = { module = "com.mikepenz:multiplatform-markdown-renderer-coil3", version.ref = "multiplatformMarkdownRenderer" }
Expand Down
3 changes: 2 additions & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,5 @@ include(":cli")
include(":backend")
include(":client-lib")
include(":bot-lib")
include(":builtin-bot")
include(":builtin-bot")
include(":client-cli")

0 comments on commit d2b0fe6

Please sign in to comment.