diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/WatcherDisplay.kt b/src/main/kotlin/xyz/atnrch/wrench/components/WatcherDisplay.kt index c427b5c..5f54036 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/WatcherDisplay.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/WatcherDisplay.kt @@ -1,55 +1,34 @@ package xyz.atnrch.wrench.components -import androidx.compose.foundation.layout.* -import androidx.compose.material.ButtonDefaults -import androidx.compose.material.Icon -import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.QuestionMark -import androidx.compose.runtime.* -import androidx.compose.ui.Alignment +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +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.components.center.empty.DefaultDisplay import xyz.atnrch.wrench.components.center.input.InputEntries import xyz.atnrch.wrench.components.center.output.OutputEntries -import xyz.atnrch.wrench.ui.Fonts import xyz.atnrch.wrench.watcher.WatcherManager import java.io.File +import java.nio.file.Path @Composable -fun WatcherDisplay(watcherManager: WatcherManager) { - var currentClick by remember { mutableStateOf(-1) } +fun WatcherDisplay( + watcherManager: WatcherManager, + currentClick: Int, + outputs: MutableList, + onEntryClick: (id: Int) -> Unit +) { + Row( modifier = Modifier.padding(0.dp, 0.dp, 0.dp, 55.dp) ) { if (watcherManager.getEntries().isEmpty()) { watcherManager.addFile(File("/home/aro/IdeaProjects/Wrench/dummy")) - Box( - contentAlignment = Alignment.Center, - modifier = Modifier.fillMaxWidth().fillMaxHeight() - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceEvenly - ) { - Icon( - imageVector = Icons.Rounded.QuestionMark, - tint = Color.White, - contentDescription = "Open Folder", - modifier = Modifier.size(ButtonDefaults.IconSize) - ) - Spacer(Modifier.size(ButtonDefaults.IconSpacing)) - Text( - text = "Add a file to start...", - fontFamily = Fonts.ROBOTO_REGULAR, - color = Color.White - ) - } - } + DefaultDisplay() } else { - InputEntries(watcherManager) { currentClick = it } - OutputEntries(watcherManager, currentClick) + InputEntries(watcherManager, onEntryClick) + OutputEntries(watcherManager, currentClick, outputs) } } } diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt b/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt index c5982c4..466739c 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt @@ -3,10 +3,7 @@ package xyz.atnrch.wrench.components import androidx.compose.material.Scaffold import androidx.compose.material.ScaffoldState import androidx.compose.material.rememberScaffoldState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateMapOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.* import xyz.atnrch.wrench.components.bottom.BottomAppBar import xyz.atnrch.wrench.components.bottom.FloatingButton import xyz.atnrch.wrench.components.top.TopBar @@ -15,14 +12,17 @@ import xyz.atnrch.wrench.ui.UIColors import xyz.atnrch.wrench.watcher.Watcher import xyz.atnrch.wrench.watcher.WatcherEntry import xyz.atnrch.wrench.watcher.WatcherManager +import java.nio.file.Path @Composable fun WrenchScaffold() { val scaffoldState: ScaffoldState = rememberScaffoldState() val entries: MutableMap = remember { mutableStateMapOf() } + val outputs: MutableList = remember { mutableStateListOf() } val snackBarDataHolder = SnackBarDataHolder(scaffoldState, rememberCoroutineScope()) val watcherManager = remember { WatcherManager(entries) } val watcher = remember { Watcher(watcherManager, snackBarDataHolder) } + var currentClick by remember { mutableStateOf(-1) } Scaffold( scaffoldState = scaffoldState, @@ -30,6 +30,6 @@ fun WrenchScaffold() { floatingActionButton = { FloatingButton(watcherManager) }, isFloatingActionButtonDocked = true, backgroundColor = UIColors.PRIMARY, - bottomBar = { BottomAppBar(watcher) } - ) { WatcherDisplay(watcherManager) } + bottomBar = { BottomAppBar(watcherManager, watcher, currentClick, outputs) } + ) { WatcherDisplay(watcherManager, currentClick, outputs) { currentClick = it } } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/BottomBar.kt b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/BottomBar.kt index eea1293..f57e8bb 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/BottomBar.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/BottomBar.kt @@ -5,15 +5,20 @@ import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable import xyz.atnrch.wrench.ui.UIColors import xyz.atnrch.wrench.watcher.Watcher +import xyz.atnrch.wrench.watcher.WatcherManager +import java.nio.file.Path @Composable fun BottomAppBar( - watcher: Watcher + watcherManager: WatcherManager, + watcher: Watcher, + currentClick: Int, + outputs: MutableList ) { androidx.compose.material.BottomAppBar( cutoutShape = MaterialTheme.shapes.small.copy( CornerSize(percent = 50) ), backgroundColor = UIColors.DARK - ) { BottomRowNew(watcher) } + ) { BottomRowNew(watcherManager, watcher, currentClick, outputs) } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/WatcherStatusButton.kt b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/WatcherStatusButton.kt index 09584be..4be0c0b 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/WatcherStatusButton.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/WatcherStatusButton.kt @@ -18,12 +18,20 @@ 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.components.center.showDirectoryPicker +import xyz.atnrch.wrench.logger.Logger import xyz.atnrch.wrench.ui.UIColors import xyz.atnrch.wrench.watcher.Watcher +import xyz.atnrch.wrench.watcher.WatcherEntry +import xyz.atnrch.wrench.watcher.WatcherManager +import java.nio.file.Path @Composable fun BottomRowNew( - watcher: Watcher + watcherManager: WatcherManager, + watcher: Watcher, + currentClick: Int, + outputs: MutableList ) { Spacer(Modifier.width(10.dp)) Button( @@ -48,27 +56,39 @@ fun BottomRowNew( Spacer(Modifier.size(ButtonDefaults.IconSpacing)) Text("Move files") } - Spacer(Modifier.width(10.dp)) - Button( - onClick = { println("Show Directory Picker") }, - colors = ButtonDefaults.buttonColors(UIColors.DARK, Color.White), - contentPadding = PaddingValues( - start = 14.dp, - top = 6.dp, - end = 14.dp, - bottom = 6.dp - ), - shape = RoundedCornerShape(100), - border = BorderStroke(2.dp, UIColors.ORANGE), - modifier = Modifier.shadow(24.dp, RoundedCornerShape(100), false) - ) { - Icon( - Icons.Filled.NoteAdd, - tint = UIColors.ORANGE, - contentDescription = "Start", - modifier = Modifier.size(22.dp) - ) - Spacer(Modifier.size(ButtonDefaults.IconSpacing)) - Text("Add output...") + if(currentClick != -1) { + Spacer(Modifier.width(10.dp)) + Button( + onClick = + { + val entry: WatcherEntry? = watcherManager.getFromId(currentClick) + showDirectoryPicker({ + Logger.info("Path: ${it.absolutePath}") + entry!!.map.add(it.toPath()) + outputs.add(it.toPath()) + }, { + Logger.info("No file selected.") + }) + }, + colors = ButtonDefaults.buttonColors(UIColors.DARK, Color.White), + contentPadding = PaddingValues( + start = 14.dp, + top = 6.dp, + end = 14.dp, + bottom = 6.dp + ), + shape = RoundedCornerShape(100), + border = BorderStroke(2.dp, UIColors.ORANGE), + modifier = Modifier.shadow(24.dp, RoundedCornerShape(100), false) + ) { + Icon( + Icons.Filled.NoteAdd, + tint = UIColors.ORANGE, + contentDescription = "Start", + modifier = Modifier.size(22.dp) + ) + Spacer(Modifier.size(ButtonDefaults.IconSpacing)) + Text("Add output...") + } } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/center/DummyTextEntry.kt b/src/main/kotlin/xyz/atnrch/wrench/components/center/DummyTextEntry.kt index ec48ebf..5ed1092 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/center/DummyTextEntry.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/center/DummyTextEntry.kt @@ -1,6 +1,7 @@ package xyz.atnrch.wrench.components.center import androidx.compose.runtime.Composable +import xyz.atnrch.wrench.components.center.input.InputTextEntry import xyz.atnrch.wrench.registery.RegisterComposable import xyz.atnrch.wrench.watcher.WatcherEntry import xyz.atnrch.wrench.watcher.WatcherManager @@ -13,7 +14,7 @@ fun DummyTextEntry( ) { val id = 0 RegisterComposable(id) { - WatcherTextEntry( + InputTextEntry( id, WatcherEntry(File("/home/aro/IdeaProjects/Wrench/dummy"), arrayListOf()), onEntrySelected diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/center/empty/DefaultDisplay.kt b/src/main/kotlin/xyz/atnrch/wrench/components/center/empty/DefaultDisplay.kt new file mode 100644 index 0000000..6fb0eb9 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/wrench/components/center/empty/DefaultDisplay.kt @@ -0,0 +1,39 @@ +package xyz.atnrch.wrench.components.center.empty + +import androidx.compose.foundation.layout.* +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.QuestionMark +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import xyz.atnrch.wrench.ui.Fonts + +@Composable +fun DefaultDisplay() { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier.fillMaxWidth().fillMaxHeight() + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly + ) { + Icon( + imageVector = Icons.Rounded.QuestionMark, + tint = Color.White, + contentDescription = "Open Folder", + modifier = Modifier.size(ButtonDefaults.IconSize) + ) + Spacer(Modifier.size(ButtonDefaults.IconSpacing)) + Text( + text = "Add a file to start...", + fontFamily = Fonts.ROBOTO_REGULAR, + color = Color.White + ) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputEntries.kt b/src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputEntries.kt index 4a25b26..7fcc113 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputEntries.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputEntries.kt @@ -9,7 +9,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.unit.dp -import xyz.atnrch.wrench.components.center.WatcherTextEntry import xyz.atnrch.wrench.registery.ACTIVE_COMPOSABLE import xyz.atnrch.wrench.registery.RegisterComposable import xyz.atnrch.wrench.ui.UIColors @@ -37,7 +36,7 @@ fun InputEntries( ) { watcherManager.getEntries().forEach { RegisterComposable(it.key) { - WatcherTextEntry( + InputTextEntry( it.key, it.value, onEntryClick diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/center/WatcherTextEntry.kt b/src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputTextEntry.kt similarity index 88% rename from src/main/kotlin/xyz/atnrch/wrench/components/center/WatcherTextEntry.kt rename to src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputTextEntry.kt index 1a0ee1e..dfb6289 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/center/WatcherTextEntry.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputTextEntry.kt @@ -1,4 +1,4 @@ -package xyz.atnrch.wrench.components.center +package xyz.atnrch.wrench.components.center.input import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.PointerMatcher @@ -20,7 +20,7 @@ import xyz.atnrch.wrench.watcher.WatcherEntry @OptIn(ExperimentalUnitApi::class, ExperimentalFoundationApi::class) @Composable -fun WatcherTextEntry( +fun InputTextEntry( id: Int, entry: WatcherEntry, onEntrySelected: (id: Int) -> Unit @@ -31,8 +31,8 @@ fun WatcherTextEntry( text = entry.file.absolutePath, style = TextStyle( color = if(ACTIVE_COMPOSABLE == id) UIColors.GREEN else Color.White, - fontSize = TextUnit(15F, TextUnitType.Sp), - fontFamily = Fonts.ROBOTO_REGULAR + fontSize = TextUnit(17F, TextUnitType.Sp), + fontFamily = if(ACTIVE_COMPOSABLE == id) Fonts.ROBOTO_BOLD else Fonts.ROBOTO_REGULAR ), modifier = Modifier .onClick( diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/center/output/OutputEntries.kt b/src/main/kotlin/xyz/atnrch/wrench/components/center/output/OutputEntries.kt index d556b8d..f18ebbf 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/center/output/OutputEntries.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/center/output/OutputEntries.kt @@ -3,14 +3,8 @@ package xyz.atnrch.wrench.components.center.output import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.border import androidx.compose.foundation.layout.* -import androidx.compose.material.Button -import androidx.compose.material.Icon import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.PostAdd import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -19,8 +13,6 @@ import androidx.compose.ui.unit.ExperimentalUnitApi import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnitType import androidx.compose.ui.unit.dp -import xyz.atnrch.wrench.components.center.showDirectoryPicker -import xyz.atnrch.wrench.logger.Logger import xyz.atnrch.wrench.ui.UIColors import xyz.atnrch.wrench.watcher.WatcherEntry import xyz.atnrch.wrench.watcher.WatcherManager @@ -31,10 +23,9 @@ import kotlin.io.path.pathString @Composable fun OutputEntries( watcherManager: WatcherManager, - currentSelectedInputId: Int + currentClick: Int, + outputs: MutableList ) { - val outputs: MutableList = remember { mutableStateListOf() } - Box( contentAlignment = Alignment.Center, modifier = Modifier @@ -46,7 +37,7 @@ fun OutputEntries( Column( verticalArrangement = Arrangement.spacedBy(15.dp) ) { - val entry: WatcherEntry? = watcherManager.getFromId(currentSelectedInputId) + val entry: WatcherEntry? = watcherManager.getFromId(currentClick) if (entry != null) { outputs.clear() outputs.addAll(entry.map) @@ -66,28 +57,12 @@ fun OutputEntries( ) } else { outputs.forEach { - Text(it.pathString) + Text( + text = it.pathString, + color = Color.White + ) } } - Spacer(Modifier.height(24.dp)) - Button( - onClick = { - showDirectoryPicker({ - Logger.info("Path: ${it.absolutePath}") - entry.map.add(it.toPath()) - outputs.add(it.toPath()) - }, { - Logger.info("No file selected.") - }) - } - ) { - Icon( - Icons.Filled.PostAdd, - tint = Color.White, - contentDescription = "Add", - modifier = Modifier.size(28.dp) - ) - } } } } diff --git a/src/main/kotlin/xyz/atnrch/wrench/ui/Fonts.kt b/src/main/kotlin/xyz/atnrch/wrench/ui/Fonts.kt index 54c05ba..4d64bbe 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/ui/Fonts.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/ui/Fonts.kt @@ -30,5 +30,13 @@ class Fonts { weight = FontWeight.Medium ) ) + + val ROBOTO_BOLD: FontFamily = FontFamily( + Font( + resource = "font/Roboto-Bold.ttf", + style = FontStyle.Normal, + weight = FontWeight.Medium + ) + ) } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/watcher/Watcher.kt b/src/main/kotlin/xyz/atnrch/wrench/watcher/Watcher.kt index cadd86e..0fbc8d3 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/watcher/Watcher.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/watcher/Watcher.kt @@ -4,9 +4,11 @@ import androidx.compose.material.SnackbarDuration import kotlinx.coroutines.launch import xyz.atnrch.wrench.compose.SnackBarDataHolder import xyz.atnrch.wrench.logger.Logger +import java.io.IOException import java.nio.file.Files import java.nio.file.Path import java.nio.file.StandardCopyOption +import kotlin.io.path.name class Watcher( private val watcherManager: WatcherManager, @@ -21,8 +23,12 @@ class Watcher( filesTotal += 1 entry.map.forEach { val movePath = "${it.toAbsolutePath()}/${entry.file.name}" - Files.copy(entry.file.toPath(), Path.of(movePath), StandardCopyOption.REPLACE_EXISTING) - foldersTotal += 1 + try { + Files.copy(entry.file.toPath(), Path.of(movePath), StandardCopyOption.REPLACE_EXISTING) + foldersTotal += 1 + } catch (exception: IOException) { + Logger.warn("Failed to move ${it.name} to $movePath! (${exception.message}") + } } } val logMessage: String = if (foldersTotal < 1) {