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