feat: snackbars + made it prettier
This commit is contained in:
parent
c60a36204a
commit
4e7f2b4a68
7 changed files with 104 additions and 26 deletions
|
@ -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()
|
||||||
|
|
|
@ -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) }
|
||||||
|
|
||||||
}
|
}
|
|
@ -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) }
|
||||||
}
|
}
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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()
|
||||||
}
|
}
|
|
@ -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)
|
|
@ -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,12 +29,37 @@ 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun move() {
|
||||||
|
snackBarDataHolder.coroutineScope.launch {
|
||||||
|
var filesTotal = 0
|
||||||
|
var foldersTotal = 0
|
||||||
for (entry: WatcherEntry in watcherManager.getEntries().values) {
|
for (entry: WatcherEntry in watcherManager.getEntries().values) {
|
||||||
|
filesTotal += 1
|
||||||
entry.map.forEach {
|
entry.map.forEach {
|
||||||
//Files.copy(entry.file.toPath(), it.toAbsolutePath())
|
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
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue