feat: "state machine"

This commit is contained in:
aro 2022-11-13 23:01:59 +01:00
parent 02c9c910a3
commit 7192bbd7fa
4 changed files with 64 additions and 33 deletions

View file

@ -7,14 +7,18 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.window.Window import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application import androidx.compose.ui.window.application
import xyz.atnrch.wrench.display.WrenchDisplay import xyz.atnrch.wrench.display.WrenchDisplay
import xyz.atnrch.wrench.scheduler.FileMover import xyz.atnrch.wrench.scheduler.Watcher
@Composable @Composable
@Preview @Preview
fun App() { fun App() {
MaterialTheme { MaterialTheme {
val fileMover = remember { FileMover() } val watcher = remember { Watcher() }
WrenchDisplay(onStartButtonClick = fileMover::start) WrenchDisplay(
onStartButtonClick = watcher::start,
onStopButtonClick = watcher::stop,
onAddButtonClick = {}
)
} }
} }

View file

@ -1,34 +1,22 @@
package xyz.atnrch.wrench.display package xyz.atnrch.wrench.display
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.Box
import androidx.compose.material.Button import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import xyz.atnrch.wrench.display.status.WrenchStatus
@Composable @Composable
fun WrenchDisplay( fun WrenchDisplay(
onStartButtonClick: () -> Unit onStartButtonClick: () -> Unit,
onStopButtonClick: () -> Unit,
onAddButtonClick: () -> Unit
) { ) {
Box( Box(
contentAlignment = Alignment.Center, contentAlignment = Alignment.BottomEnd,
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
Row { WrenchStatus(onStartButtonClick, onStopButtonClick, onAddButtonClick)
Button(onStartButtonClick) {
Text("Watch")
}
Spacer(Modifier.width(16.dp))
Button({}) {
Text("Stop")
}
Spacer(Modifier.width(16.dp))
Button({}) {
Text("Add...")
}
}
} }
} }

View file

@ -0,0 +1,40 @@
package xyz.atnrch.wrench.display.status
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.width
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
fun WrenchStatus(
onStartButtonClick: () -> Unit,
onStopButtonClick: () -> Unit,
onAddButtonClick: () -> Unit
) {
var status by remember { mutableStateOf(false) }
var startStopButtonText by remember { mutableStateOf("Start") }
Row {
Button({
status = if (status) {
onStopButtonClick.invoke()
false
} else {
onStartButtonClick.invoke()
true
}
startStopButtonText = if (status) "Stop" else "Start"
}) {
Text(startStopButtonText)
}
Spacer(Modifier.width(10.dp))
Button(onAddButtonClick) {
Text("Add...")
}
Spacer(Modifier.width(10.dp))
}
}

View file

@ -4,29 +4,28 @@ import kotlinx.coroutines.*
import kotlinx.coroutines.swing.Swing import kotlinx.coroutines.swing.Swing
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
class FileMover { class Watcher {
companion object {
var WATCHING = false
}
private var coroutineScope = CoroutineScope(Dispatchers.Swing) private var coroutineScope = CoroutineScope(Dispatchers.Swing)
private var isActive = false
fun start() { fun start() {
if(isActive) return if(WATCHING) return
coroutineScope.launch { coroutineScope.launch {
this@FileMover.isActive = true WATCHING = true
while (isActive) { while (WATCHING) {
delay(TimeUnit.SECONDS.toMillis(5)) delay(TimeUnit.SECONDS.toMillis(5))
println("Hello world!") println("Hello world!")
} }
} }
} }
fun pause() {
isActive = false
}
fun stop() { fun stop() {
coroutineScope.cancel() coroutineScope.cancel()
coroutineScope = CoroutineScope(Dispatchers.Main) coroutineScope = CoroutineScope(Dispatchers.Main)
isActive = false WATCHING = false
} }
} }