diff --git a/src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt b/src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt index cecac3a..504a2ed 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt @@ -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 { diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/AddButton.kt b/src/main/kotlin/xyz/atnrch/wrench/components/AddButton.kt new file mode 100644 index 0000000..a314a91 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/wrench/components/AddButton.kt @@ -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) + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/BottomAppBar.kt b/src/main/kotlin/xyz/atnrch/wrench/components/BottomAppBar.kt new file mode 100644 index 0000000..3b67c70 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/wrench/components/BottomAppBar.kt @@ -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) } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/FilePicker.kt b/src/main/kotlin/xyz/atnrch/wrench/components/FilePicker.kt index aa62097..018a4ab 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/FilePicker.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/FilePicker.kt @@ -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 ) { diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/TopBar.kt b/src/main/kotlin/xyz/atnrch/wrench/components/TopBar.kt new file mode 100644 index 0000000..fdc041e --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/wrench/components/TopBar.kt @@ -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)) + }) +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/WrenchBottomRow.kt b/src/main/kotlin/xyz/atnrch/wrench/components/WrenchBottomRow.kt new file mode 100644 index 0000000..54e91cb --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/wrench/components/WrenchBottomRow.kt @@ -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) + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt b/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt index e2d45dc..c951444 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt @@ -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() diff --git a/src/main/kotlin/xyz/atnrch/wrench/watcher/Watcher.kt b/src/main/kotlin/xyz/atnrch/wrench/watcher/Watcher.kt index c2636f5..adc6642 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/watcher/Watcher.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/watcher/Watcher.kt @@ -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