feat: "state machine"
This commit is contained in:
parent
02c9c910a3
commit
7192bbd7fa
4 changed files with 64 additions and 33 deletions
|
@ -7,14 +7,18 @@ import androidx.compose.runtime.remember
|
|||
import androidx.compose.ui.window.Window
|
||||
import androidx.compose.ui.window.application
|
||||
import xyz.atnrch.wrench.display.WrenchDisplay
|
||||
import xyz.atnrch.wrench.scheduler.FileMover
|
||||
import xyz.atnrch.wrench.scheduler.Watcher
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
fun App() {
|
||||
MaterialTheme {
|
||||
val fileMover = remember { FileMover() }
|
||||
WrenchDisplay(onStartButtonClick = fileMover::start)
|
||||
val watcher = remember { Watcher() }
|
||||
WrenchDisplay(
|
||||
onStartButtonClick = watcher::start,
|
||||
onStopButtonClick = watcher::stop,
|
||||
onAddButtonClick = {}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,34 +1,22 @@
|
|||
package xyz.atnrch.wrench.display
|
||||
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material.Button
|
||||
import androidx.compose.material.Text
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import xyz.atnrch.wrench.display.status.WrenchStatus
|
||||
|
||||
@Composable
|
||||
fun WrenchDisplay(
|
||||
onStartButtonClick: () -> Unit
|
||||
onStartButtonClick: () -> Unit,
|
||||
onStopButtonClick: () -> Unit,
|
||||
onAddButtonClick: () -> Unit
|
||||
) {
|
||||
Box(
|
||||
contentAlignment = Alignment.Center,
|
||||
contentAlignment = Alignment.BottomEnd,
|
||||
modifier = Modifier.fillMaxSize()
|
||||
) {
|
||||
Row {
|
||||
|
||||
Button(onStartButtonClick) {
|
||||
Text("Watch")
|
||||
}
|
||||
Spacer(Modifier.width(16.dp))
|
||||
Button({}) {
|
||||
Text("Stop")
|
||||
}
|
||||
Spacer(Modifier.width(16.dp))
|
||||
Button({}) {
|
||||
Text("Add...")
|
||||
}
|
||||
}
|
||||
WrenchStatus(onStartButtonClick, onStopButtonClick, onAddButtonClick)
|
||||
}
|
||||
}
|
|
@ -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))
|
||||
}
|
||||
}
|
|
@ -4,29 +4,28 @@ import kotlinx.coroutines.*
|
|||
import kotlinx.coroutines.swing.Swing
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
class FileMover {
|
||||
class Watcher {
|
||||
companion object {
|
||||
var WATCHING = false
|
||||
}
|
||||
|
||||
private var coroutineScope = CoroutineScope(Dispatchers.Swing)
|
||||
private var isActive = false
|
||||
|
||||
fun start() {
|
||||
if(isActive) return
|
||||
if(WATCHING) return
|
||||
|
||||
coroutineScope.launch {
|
||||
this@FileMover.isActive = true
|
||||
while (isActive) {
|
||||
WATCHING = true
|
||||
while (WATCHING) {
|
||||
delay(TimeUnit.SECONDS.toMillis(5))
|
||||
println("Hello world!")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun pause() {
|
||||
isActive = false
|
||||
}
|
||||
|
||||
fun stop() {
|
||||
coroutineScope.cancel()
|
||||
coroutineScope = CoroutineScope(Dispatchers.Main)
|
||||
isActive = false
|
||||
WATCHING = false
|
||||
}
|
||||
}
|
Reference in a new issue