refactor: move each component into it's separate function (state hoisting)

This commit is contained in:
aro 2022-11-17 17:44:09 +01:00
parent 1a18dade51
commit c9e9cf5265
8 changed files with 168 additions and 111 deletions

View file

@ -6,7 +6,7 @@ import androidx.compose.runtime.Composable
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.logger.Logger import xyz.atnrch.wrench.logger.Logger
import xyz.atnrch.wrench.scaffold.WrenchScaffold import xyz.atnrch.wrench.components.WrenchScaffold
import javax.swing.UIManager import javax.swing.UIManager
class WrenchApp { class WrenchApp {

View file

@ -0,0 +1,37 @@
package xyz.atnrch.wrench.components
import androidx.compose.foundation.layout.size
import androidx.compose.material.FloatingActionButton
import androidx.compose.material.Icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import xyz.atnrch.wrench.colors.WrenchColors
import xyz.atnrch.wrench.logger.Logger
@Composable
fun AddButton() {
//.............
// ADD BUTTON (FLOATING)
//.............
FloatingActionButton(
{
createFileChooser({
Logger.info("Path: ${it.absolutePath}")
}, {
Logger.info("No file selected.")
})
},
backgroundColor = WrenchColors.LIGHT,
) {
Icon(
Icons.Filled.Add,
tint = Color.White,
contentDescription = "Add file...",
modifier = Modifier.size(28.dp)
)
}
}

View file

@ -0,0 +1,21 @@
package xyz.atnrch.wrench.components
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import xyz.atnrch.wrench.colors.WrenchColors
import xyz.atnrch.wrench.watcher.Watcher
@Composable
fun BottomAppBar(
watcher: Watcher,
state: Boolean,
onStateChange: (state: Boolean) -> Unit
) {
androidx.compose.material.BottomAppBar(
cutoutShape = MaterialTheme.shapes.small.copy(
CornerSize(percent = 50)
),
backgroundColor = WrenchColors.PRIMARY
) { BottomRow(watcher, state, onStateChange) }
}

View file

@ -4,7 +4,7 @@ import androidx.compose.ui.awt.ComposeWindow
import java.io.File import java.io.File
import javax.swing.JFileChooser import javax.swing.JFileChooser
fun FilePicker( fun createFileChooser(
onResult: (file: File) -> Unit, onResult: (file: File) -> Unit,
onNoResult: () -> Unit onNoResult: () -> Unit
) { ) {

View file

@ -0,0 +1,42 @@
package xyz.atnrch.wrench.components
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Settings
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.unit.dp
import xyz.atnrch.wrench.colors.WrenchColors
import xyz.atnrch.wrench.logger.Logger
@Composable
fun TopBar() {
TopAppBar(
backgroundColor = WrenchColors.PRIMARY,
contentColor = Color.White,
elevation = 16.dp,
title = { Text("Wrench") },
actions = {
//.............
// Debug Button
//.............
Button(
{ Logger.debug("Empty.") },
colors = ButtonDefaults.buttonColors(WrenchColors.STRESS, Color.White),
shape = RectangleShape
) {
Icon(
Icons.Filled.Settings,
tint = Color.White,
contentDescription = "Debug Settings",
modifier = Modifier.size(18.dp)
)
}
Spacer(Modifier.width(10.dp))
})
}

View file

@ -0,0 +1,57 @@
package xyz.atnrch.wrench.components
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import xyz.atnrch.wrench.colors.WrenchColors
import xyz.atnrch.wrench.watcher.Watcher
@Composable
fun BottomRow(
watcher: Watcher,
state: Boolean,
onStateChange: (state: Boolean) -> Unit
) {
//.............
// START BUTTON
//.............
Spacer(Modifier.width(5.dp))
Button(
{
if (state) {
run { watcher.stop() }
onStateChange(false)
} else {
run { watcher.start() }
onStateChange(true)
}
},
colors = ButtonDefaults.buttonColors(WrenchColors.LIGHT, Color.White),
contentPadding = ButtonDefaults.ContentPadding,
shape = RoundedCornerShape(100),
modifier = Modifier.shadow(15.dp, RoundedCornerShape(100), false)
) {
if (state) Icon(
Icons.Filled.Close,
contentDescription = "Stop",
modifier = Modifier.size(28.dp)
) else Icon(
Icons.Filled.PlayArrow,
tint = Color.White,
contentDescription = "Start",
modifier = Modifier.size(28.dp)
)
}
}

View file

@ -1,122 +1,19 @@
package xyz.atnrch.wrench.scaffold package xyz.atnrch.wrench.components
import androidx.compose.foundation.layout.Spacer import androidx.compose.material.Scaffold
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material.icons.filled.Settings
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.unit.dp
import xyz.atnrch.wrench.colors.WrenchColors
import xyz.atnrch.wrench.components.FilePicker
import xyz.atnrch.wrench.components.WrenchFileManagerInput
import xyz.atnrch.wrench.components.WrenchFileManagerOutput
import xyz.atnrch.wrench.logger.Logger
import xyz.atnrch.wrench.watcher.Watcher import xyz.atnrch.wrench.watcher.Watcher
@Composable @Composable
fun WrenchScaffold() { fun WrenchScaffold() {
val watcher = remember { Watcher() } val watcher = remember { Watcher() }
var status by remember { mutableStateOf(false) } var state by remember { mutableStateOf(false) }
Scaffold( Scaffold(
topBar = { topBar = { TopBar() },
TopAppBar( floatingActionButton = { AddButton() },
backgroundColor = WrenchColors.PRIMARY,
contentColor = Color.White,
elevation = 16.dp,
title = { Text("Wrench") },
actions = {
//.............
// Debug Button
//.............
Button(
{ Logger.debug("Empty.") },
colors = ButtonDefaults.buttonColors(WrenchColors.STRESS, Color.White),
shape = RectangleShape
) {
Icon(
Icons.Filled.Settings,
tint = Color.White,
contentDescription = "Debug Settings",
modifier = Modifier.size(18.dp)
)
}
Spacer(Modifier.width(10.dp))
})
},
floatingActionButton = {
//.............
// ADD BUTTON (FLOATING)
//.............
FloatingActionButton(
{
FilePicker({
Logger.info("Path: ${it.absolutePath}")
}, {
Logger.info("No file selected.")
})
},
backgroundColor = WrenchColors.LIGHT,
) {
Icon(
Icons.Filled.Add,
tint = Color.White,
contentDescription = "Add file...",
modifier = Modifier.size(28.dp)
)
}
},
isFloatingActionButtonDocked = true, isFloatingActionButtonDocked = true,
bottomBar = { bottomBar = { BottomAppBar(watcher, state) { state = it } }
BottomAppBar(
cutoutShape = MaterialTheme.shapes.small.copy(
CornerSize(percent = 50)
),
backgroundColor = WrenchColors.PRIMARY
) {
//.............
// START BUTTON
//.............
Spacer(Modifier.width(5.dp))
Button(
{
status = if (status) {
run { watcher.stop() }
false
} else {
run { watcher.start() }
true
}
},
colors = ButtonDefaults.buttonColors(WrenchColors.LIGHT, Color.White),
contentPadding = ButtonDefaults.ContentPadding,
shape = RoundedCornerShape(100),
modifier = Modifier.shadow(15.dp, RoundedCornerShape(100), false)
) {
if (status) Icon(
Icons.Filled.Close,
contentDescription = "Stop",
modifier = Modifier.size(28.dp)
) else Icon(
Icons.Filled.PlayArrow,
tint = Color.White,
contentDescription = "Start",
modifier = Modifier.size(28.dp)
)
}
}
}
) { ) {
WrenchFileManagerInput() WrenchFileManagerInput()
WrenchFileManagerOutput() WrenchFileManagerOutput()

View file

@ -2,6 +2,7 @@ package xyz.atnrch.wrench.watcher
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.swing.Swing import kotlinx.coroutines.swing.Swing
import xyz.atnrch.wrench.logger.Logger
import java.nio.file.Files import java.nio.file.Files
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -17,6 +18,7 @@ class Watcher {
coroutineScope.launch { coroutineScope.launch {
WATCHING = true WATCHING = true
Logger.info("Started Watcher.")
while (WATCHING) { while (WATCHING) {
delay(TimeUnit.SECONDS.toMillis(5)) delay(TimeUnit.SECONDS.toMillis(5))
val manager = WatcherManager() val manager = WatcherManager()
@ -30,6 +32,7 @@ class Watcher {
} }
fun stop() { fun stop() {
Logger.info("Stopped Watcher.")
coroutineScope.cancel() coroutineScope.cancel()
coroutineScope = CoroutineScope(Dispatchers.Main) coroutineScope = CoroutineScope(Dispatchers.Main)
WATCHING = false WATCHING = false