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.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 = {}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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...")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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 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
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in a new issue