refactor: move each component into it's separate function (state hoisting)
This commit is contained in:
parent
1a18dade51
commit
c9e9cf5265
8 changed files with 168 additions and 111 deletions
|
@ -6,7 +6,7 @@ import androidx.compose.runtime.Composable
|
|||
import androidx.compose.ui.window.Window
|
||||
import androidx.compose.ui.window.application
|
||||
import xyz.atnrch.wrench.logger.Logger
|
||||
import xyz.atnrch.wrench.scaffold.WrenchScaffold
|
||||
import xyz.atnrch.wrench.components.WrenchScaffold
|
||||
import javax.swing.UIManager
|
||||
|
||||
class WrenchApp {
|
||||
|
|
37
src/main/kotlin/xyz/atnrch/wrench/components/AddButton.kt
Normal file
37
src/main/kotlin/xyz/atnrch/wrench/components/AddButton.kt
Normal 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)
|
||||
)
|
||||
}
|
||||
}
|
21
src/main/kotlin/xyz/atnrch/wrench/components/BottomAppBar.kt
Normal file
21
src/main/kotlin/xyz/atnrch/wrench/components/BottomAppBar.kt
Normal 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) }
|
||||
}
|
|
@ -4,7 +4,7 @@ import androidx.compose.ui.awt.ComposeWindow
|
|||
import java.io.File
|
||||
import javax.swing.JFileChooser
|
||||
|
||||
fun FilePicker(
|
||||
fun createFileChooser(
|
||||
onResult: (file: File) -> Unit,
|
||||
onNoResult: () -> Unit
|
||||
) {
|
||||
|
|
42
src/main/kotlin/xyz/atnrch/wrench/components/TopBar.kt
Normal file
42
src/main/kotlin/xyz/atnrch/wrench/components/TopBar.kt
Normal 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))
|
||||
})
|
||||
}
|
|
@ -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)
|
||||
)
|
||||
}
|
||||
}
|
|
@ -1,122 +1,19 @@
|
|||
package xyz.atnrch.wrench.scaffold
|
||||
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.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.material.Scaffold
|
||||
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
|
||||
|
||||
@Composable
|
||||
fun WrenchScaffold() {
|
||||
val watcher = remember { Watcher() }
|
||||
var status by remember { mutableStateOf(false) }
|
||||
var state by remember { mutableStateOf(false) }
|
||||
|
||||
Scaffold(
|
||||
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))
|
||||
})
|
||||
},
|
||||
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)
|
||||
)
|
||||
}
|
||||
},
|
||||
topBar = { TopBar() },
|
||||
floatingActionButton = { AddButton() },
|
||||
isFloatingActionButtonDocked = true,
|
||||
bottomBar = {
|
||||
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)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
bottomBar = { BottomAppBar(watcher, state) { state = it } }
|
||||
) {
|
||||
WrenchFileManagerInput()
|
||||
WrenchFileManagerOutput()
|
||||
|
|
|
@ -2,6 +2,7 @@ package xyz.atnrch.wrench.watcher
|
|||
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.swing.Swing
|
||||
import xyz.atnrch.wrench.logger.Logger
|
||||
import java.nio.file.Files
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
|
@ -17,6 +18,7 @@ class Watcher {
|
|||
|
||||
coroutineScope.launch {
|
||||
WATCHING = true
|
||||
Logger.info("Started Watcher.")
|
||||
while (WATCHING) {
|
||||
delay(TimeUnit.SECONDS.toMillis(5))
|
||||
val manager = WatcherManager()
|
||||
|
@ -30,6 +32,7 @@ class Watcher {
|
|||
}
|
||||
|
||||
fun stop() {
|
||||
Logger.info("Stopped Watcher.")
|
||||
coroutineScope.cancel()
|
||||
coroutineScope = CoroutineScope(Dispatchers.Main)
|
||||
WATCHING = false
|
||||
|
|
Reference in a new issue