feat: snackbars + made it prettier

This commit is contained in:
aro 2022-11-27 21:27:36 +01:00
parent c60a36204a
commit 4e7f2b4a68
7 changed files with 104 additions and 26 deletions

View file

@ -11,17 +11,14 @@ import androidx.compose.ui.Modifier
import xyz.atnrch.wrench.components.center.input.InputEntries import xyz.atnrch.wrench.components.center.input.InputEntries
import xyz.atnrch.wrench.components.center.output.OutputEntries import xyz.atnrch.wrench.components.center.output.OutputEntries
import xyz.atnrch.wrench.watcher.WatcherManager import xyz.atnrch.wrench.watcher.WatcherManager
import java.io.File
@Composable @Composable
fun WatcherDisplay( fun WatcherDisplay(watcherManager: WatcherManager) {
watcherManager: WatcherManager
) {
var currentClick by remember { mutableStateOf(-1) } var currentClick by remember { mutableStateOf(-1) }
Row { Row {
if (watcherManager.getEntries().isEmpty()) { if (watcherManager.getEntries().isEmpty()) {
watcherManager.addFile(File("/home/aro/IdeaProjects/Wrench/dummy")) //watcherManager.addFile(File("/home/aro/IdeaProjects/Wrench/dummy"))
Box( Box(
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxWidth().fillMaxHeight() modifier = Modifier.fillMaxWidth().fillMaxHeight()

View file

@ -6,6 +6,7 @@ import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.* import androidx.compose.runtime.*
import xyz.atnrch.wrench.components.center.AddButton import xyz.atnrch.wrench.components.center.AddButton
import xyz.atnrch.wrench.components.top.TopBar import xyz.atnrch.wrench.components.top.TopBar
import xyz.atnrch.wrench.compose.SnackBarDataHolder
import xyz.atnrch.wrench.watcher.Watcher import xyz.atnrch.wrench.watcher.Watcher
import xyz.atnrch.wrench.watcher.WatcherEntry import xyz.atnrch.wrench.watcher.WatcherEntry
import xyz.atnrch.wrench.watcher.WatcherManager import xyz.atnrch.wrench.watcher.WatcherManager
@ -14,8 +15,9 @@ import xyz.atnrch.wrench.watcher.WatcherManager
fun WrenchScaffold() { fun WrenchScaffold() {
val scaffoldState: ScaffoldState = rememberScaffoldState() val scaffoldState: ScaffoldState = rememberScaffoldState()
val entries: MutableMap<Int, WatcherEntry> = remember { mutableStateMapOf() } val entries: MutableMap<Int, WatcherEntry> = remember { mutableStateMapOf() }
val snackBarDataHolder = SnackBarDataHolder(scaffoldState, rememberCoroutineScope())
val watcherManager = remember { WatcherManager(entries) } val watcherManager = remember { WatcherManager(entries) }
val watcher = remember { Watcher(watcherManager) } val watcher = remember { Watcher(watcherManager, snackBarDataHolder) }
var watcherState by remember { mutableStateOf(false) } var watcherState by remember { mutableStateOf(false) }
Scaffold( Scaffold(
@ -23,7 +25,7 @@ fun WrenchScaffold() {
topBar = { TopBar() }, topBar = { TopBar() },
floatingActionButton = { AddButton(watcherManager) }, floatingActionButton = { AddButton(watcherManager) },
isFloatingActionButtonDocked = true, isFloatingActionButtonDocked = true,
bottomBar = { BottomAppBar(watcher, watcherState) { watcherState = it } } bottomBar = { BottomAppBar(watcher, watcherState, snackBarDataHolder) { watcherState = it } }
) { WatcherDisplay(watcherManager) } ) { WatcherDisplay(watcherManager) }
} }

View file

@ -6,6 +6,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow import androidx.compose.ui.draw.shadow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import xyz.atnrch.wrench.compose.SnackBarDataHolder
import xyz.atnrch.wrench.ui.UIColors import xyz.atnrch.wrench.ui.UIColors
import xyz.atnrch.wrench.watcher.Watcher import xyz.atnrch.wrench.watcher.Watcher
@ -13,6 +14,7 @@ import xyz.atnrch.wrench.watcher.Watcher
fun BottomAppBar( fun BottomAppBar(
watcher: Watcher, watcher: Watcher,
state: Boolean, state: Boolean,
snackBarDataHolder: SnackBarDataHolder,
onStateChange: (state: Boolean) -> Unit onStateChange: (state: Boolean) -> Unit
) { ) {
androidx.compose.material.BottomAppBar( androidx.compose.material.BottomAppBar(
@ -21,5 +23,5 @@ fun BottomAppBar(
), ),
backgroundColor = UIColors.PRIMARY, backgroundColor = UIColors.PRIMARY,
modifier = Modifier.shadow(20.dp, MaterialTheme.shapes.small, true) modifier = Modifier.shadow(20.dp, MaterialTheme.shapes.small, true)
) { BottomRow(watcher, state, onStateChange) } ) { BottomRow(watcher, state, onStateChange, snackBarDataHolder) }
} }

View file

@ -1,5 +1,7 @@
package xyz.atnrch.wrench.components package xyz.atnrch.wrench.components
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
@ -7,15 +9,16 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Icon import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Update
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import xyz.atnrch.wrench.compose.SnackBarDataHolder
import xyz.atnrch.wrench.ui.UIColors import xyz.atnrch.wrench.ui.UIColors
import xyz.atnrch.wrench.watcher.Watcher import xyz.atnrch.wrench.watcher.Watcher
@ -23,21 +26,36 @@ import xyz.atnrch.wrench.watcher.Watcher
fun BottomRow( fun BottomRow(
watcher: Watcher, watcher: Watcher,
state: Boolean, state: Boolean,
onStateChange: (state: Boolean) -> Unit onStateChange: (state: Boolean) -> Unit,
snackBarDataHolder: SnackBarDataHolder
) { ) {
val buttonColors = remember { arrayOf(UIColors.WATCHER_START_BG) } val buttonColors = remember { arrayOf(UIColors.WATCHER_START_BG) }
Spacer(Modifier.width(5.dp)) Spacer(Modifier.width(5.dp))
Button( /*Button(
{ {
if (state) { if (state) {
buttonColors[0] = UIColors.WATCHER_START_BG buttonColors[0] = UIColors.WATCHER_START_BG
run { watcher.stop() } run { watcher.stop() }
onStateChange(false) onStateChange(false)
snackBarDataHolder.coroutineScope.launch {
snackBarDataHolder.scaffoldState.snackbarHostState.currentSnackbarData?.dismiss()
snackBarDataHolder.scaffoldState.snackbarHostState.showSnackbar(
message = "Stopped Watcher.",
duration = SnackbarDuration.Short,
)
}
} else { } else {
buttonColors[0] = UIColors.WATCHER_STOP_BG buttonColors[0] = UIColors.WATCHER_STOP_BG
run { watcher.start() } run { watcher.start() }
onStateChange(true) onStateChange(true)
snackBarDataHolder.coroutineScope.launch {
snackBarDataHolder.scaffoldState.snackbarHostState.currentSnackbarData?.dismiss()
snackBarDataHolder.scaffoldState.snackbarHostState.showSnackbar(
message = "Started Watcher.",
duration = SnackbarDuration.Short
)
}
} }
}, },
colors = ButtonDefaults.buttonColors(buttonColors[0], Color.White), colors = ButtonDefaults.buttonColors(buttonColors[0], Color.White),
@ -60,5 +78,28 @@ fun BottomRow(
modifier = Modifier.size(28.dp) modifier = Modifier.size(28.dp)
) )
} }
}*/
Button(
onClick = { watcher.move() },
colors = ButtonDefaults.buttonColors(UIColors.PRIMARY, Color.White),
contentPadding = PaddingValues(
start = 18.dp,
top = 6.dp,
end = 18.dp,
bottom = 6.dp
),
shape = RoundedCornerShape(100),
border = BorderStroke(2.dp, UIColors.WATCHER_START_FG),
modifier = Modifier.shadow(24.dp, RoundedCornerShape(100), false)
) {
Icon(
Icons.Filled.Update,
tint = UIColors.WATCHER_START_FG,
contentDescription = "Start",
modifier = Modifier.size(22.dp)
)
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
Text("Move files")
} }
} }

View file

@ -1,6 +1,5 @@
package xyz.atnrch.wrench.components.center package xyz.atnrch.wrench.components.center
import androidx.compose.ui.awt.ComposeWindow
import java.io.File import java.io.File
import javax.swing.JFileChooser import javax.swing.JFileChooser
@ -14,7 +13,7 @@ fun showFilePicker(
approveButtonText = "Confirm" approveButtonText = "Confirm"
approveButtonToolTipText = "Select source file" approveButtonToolTipText = "Select source file"
} }
filePicker.showOpenDialog(ComposeWindow()) filePicker.showOpenDialog(null)
if (filePicker.selectedFile != null) onResult.invoke(filePicker.selectedFile) else onNoResult.invoke() if (filePicker.selectedFile != null) onResult.invoke(filePicker.selectedFile) else onNoResult.invoke()
} }
@ -26,8 +25,8 @@ fun showDirectoryPicker(
fileSelectionMode = JFileChooser.DIRECTORIES_ONLY fileSelectionMode = JFileChooser.DIRECTORIES_ONLY
dialogTitle = "Select a directory" dialogTitle = "Select a directory"
approveButtonText = "Confirm" approveButtonText = "Confirm"
approveButtonToolTipText = "Select source file" approveButtonToolTipText = "Select output directory"
} }
filePicker.showOpenDialog(ComposeWindow()) filePicker.showOpenDialog(null)
if (filePicker.selectedFile != null) onResult.invoke(filePicker.selectedFile) else onNoResult.invoke() if (filePicker.selectedFile != null) onResult.invoke(filePicker.selectedFile) else onNoResult.invoke()
} }

View file

@ -1,4 +1,6 @@
package xyz.atnrch.wrench.compose package xyz.atnrch.wrench.compose
class SnackBarDataHolder { import androidx.compose.material.ScaffoldState
} import kotlinx.coroutines.CoroutineScope
data class SnackBarDataHolder(val scaffoldState: ScaffoldState, val coroutineScope: CoroutineScope)

View file

@ -1,11 +1,21 @@
package xyz.atnrch.wrench.watcher package xyz.atnrch.wrench.watcher
import kotlinx.coroutines.* import androidx.compose.material.SnackbarDuration
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import kotlinx.coroutines.swing.Swing import kotlinx.coroutines.swing.Swing
import xyz.atnrch.wrench.compose.SnackBarDataHolder
import xyz.atnrch.wrench.logger.Logger import xyz.atnrch.wrench.logger.Logger
import java.util.concurrent.TimeUnit import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.StandardCopyOption
class Watcher(private val watcherManager: WatcherManager) { class Watcher(
private val watcherManager: WatcherManager,
private val snackBarDataHolder: SnackBarDataHolder
) {
companion object { companion object {
var WATCHING = false var WATCHING = false
} }
@ -19,13 +29,38 @@ class Watcher(private val watcherManager: WatcherManager) {
WATCHING = true WATCHING = true
Logger.info("Started Watcher.") Logger.info("Started Watcher.")
while (WATCHING) { while (WATCHING) {
delay(TimeUnit.SECONDS.toMillis(5)) move()
for (entry: WatcherEntry in watcherManager.getEntries().values) { }
entry.map.forEach { }
//Files.copy(entry.file.toPath(), it.toAbsolutePath()) }
}
fun move() {
snackBarDataHolder.coroutineScope.launch {
var filesTotal = 0
var foldersTotal = 0
for (entry: WatcherEntry in watcherManager.getEntries().values) {
filesTotal += 1
entry.map.forEach {
val movePath = "${it.toAbsolutePath()}/${entry.file.name}"
println(movePath)
Files.copy(entry.file.toPath(), Path.of(movePath), StandardCopyOption.REPLACE_EXISTING)
foldersTotal += 1
} }
} }
snackBarDataHolder.scaffoldState.snackbarHostState.currentSnackbarData?.dismiss()
println(foldersTotal)
if (foldersTotal < 1) {
println(foldersTotal)
snackBarDataHolder.scaffoldState.snackbarHostState.showSnackbar(
message = "No files to move, skipped.",
duration = SnackbarDuration.Short
)
} else {
snackBarDataHolder.scaffoldState.snackbarHostState.showSnackbar(
message = "Successfully moved $filesTotal ${if (filesTotal > 1) "files" else "file"} to $foldersTotal different ${if (foldersTotal > 1) "folders" else "folder"}",
duration = SnackbarDuration.Short
)
}
} }
} }