feat: remove the on/off watcher, too unreliable

This commit is contained in:
aro 2022-11-27 21:48:11 +01:00
parent 4e7f2b4a68
commit b56fb3b601
5 changed files with 39 additions and 124 deletions

View file

@ -3,8 +3,12 @@ package xyz.atnrch.wrench.components
import androidx.compose.material.Scaffold import androidx.compose.material.Scaffold
import androidx.compose.material.ScaffoldState import androidx.compose.material.ScaffoldState
import androidx.compose.material.rememberScaffoldState import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.* import androidx.compose.runtime.Composable
import xyz.atnrch.wrench.components.center.AddButton import androidx.compose.runtime.mutableStateMapOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import xyz.atnrch.wrench.components.bottom.BottomAppBar
import xyz.atnrch.wrench.components.bottom.FloatingButton
import xyz.atnrch.wrench.components.top.TopBar import xyz.atnrch.wrench.components.top.TopBar
import xyz.atnrch.wrench.compose.SnackBarDataHolder import xyz.atnrch.wrench.compose.SnackBarDataHolder
import xyz.atnrch.wrench.watcher.Watcher import xyz.atnrch.wrench.watcher.Watcher
@ -18,14 +22,12 @@ fun WrenchScaffold() {
val snackBarDataHolder = SnackBarDataHolder(scaffoldState, rememberCoroutineScope()) val snackBarDataHolder = SnackBarDataHolder(scaffoldState, rememberCoroutineScope())
val watcherManager = remember { WatcherManager(entries) } val watcherManager = remember { WatcherManager(entries) }
val watcher = remember { Watcher(watcherManager, snackBarDataHolder) } val watcher = remember { Watcher(watcherManager, snackBarDataHolder) }
var watcherState by remember { mutableStateOf(false) }
Scaffold( Scaffold(
scaffoldState = scaffoldState, scaffoldState = scaffoldState,
topBar = { TopBar() }, topBar = { TopBar() },
floatingActionButton = { AddButton(watcherManager) }, floatingActionButton = { FloatingButton(watcherManager) },
isFloatingActionButtonDocked = true, isFloatingActionButtonDocked = true,
bottomBar = { BottomAppBar(watcher, watcherState, snackBarDataHolder) { watcherState = it } } bottomBar = { BottomAppBar(watcher) }
) { WatcherDisplay(watcherManager) } ) { WatcherDisplay(watcherManager) }
} }

View file

@ -1,27 +1,19 @@
package xyz.atnrch.wrench.components package xyz.atnrch.wrench.components.bottom
import androidx.compose.foundation.shape.CornerSize import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
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
@Composable @Composable
fun BottomAppBar( fun BottomAppBar(
watcher: Watcher, watcher: Watcher
state: Boolean,
snackBarDataHolder: SnackBarDataHolder,
onStateChange: (state: Boolean) -> Unit
) { ) {
androidx.compose.material.BottomAppBar( androidx.compose.material.BottomAppBar(
cutoutShape = MaterialTheme.shapes.small.copy( cutoutShape = MaterialTheme.shapes.small.copy(
CornerSize(percent = 50) CornerSize(percent = 50)
), ),
backgroundColor = UIColors.PRIMARY, backgroundColor = UIColors.PRIMARY
modifier = Modifier.shadow(20.dp, MaterialTheme.shapes.small, true) ) { BottomRowNew(watcher) }
) { BottomRow(watcher, state, onStateChange, snackBarDataHolder) }
} }

View file

@ -1,20 +1,24 @@
package xyz.atnrch.wrench.components.center package xyz.atnrch.wrench.components.bottom
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material.FloatingActionButton import androidx.compose.material.FloatingActionButton
import androidx.compose.material.Icon import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.PostAdd import androidx.compose.material.icons.rounded.PostAdd
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
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.components.center.showFilePicker
import xyz.atnrch.wrench.logger.Logger import xyz.atnrch.wrench.logger.Logger
import xyz.atnrch.wrench.ui.UIColors import xyz.atnrch.wrench.ui.UIColors
import xyz.atnrch.wrench.watcher.WatcherManager import xyz.atnrch.wrench.watcher.WatcherManager
@Composable @Composable
fun AddButton( fun FloatingButton(
watcherManager: WatcherManager watcherManager: WatcherManager
) { ) {
FloatingActionButton( FloatingActionButton(
@ -27,12 +31,19 @@ fun AddButton(
}) })
}, },
backgroundColor = UIColors.PRIMARY, backgroundColor = UIColors.PRIMARY,
modifier = Modifier.border(
4.dp,
UIColors.ORANGE,
MaterialTheme.shapes.small.copy(
CornerSize(percent = 50)
)
)
) { ) {
Icon( Icon(
Icons.Rounded.PostAdd, Icons.Rounded.PostAdd,
tint = Color.White, tint = Color.White,
contentDescription = "Add file...", contentDescription = "Add file...",
modifier = Modifier.size(28.dp) modifier = Modifier.size(32.dp)
) )
} }
} }

View file

@ -1,10 +1,9 @@
package xyz.atnrch.wrench.components package xyz.atnrch.wrench.components.bottom
import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.PaddingValues 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.shape.RoundedCornerShape 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
@ -13,72 +12,15 @@ import androidx.compose.material.Text
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Update import androidx.compose.material.icons.filled.Update
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
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
@Composable @Composable
fun BottomRow( fun BottomRowNew(watcher: Watcher) {
watcher: Watcher,
state: Boolean,
onStateChange: (state: Boolean) -> Unit,
snackBarDataHolder: SnackBarDataHolder
) {
val buttonColors = remember { arrayOf(UIColors.WATCHER_START_BG) }
Spacer(Modifier.width(5.dp))
/*Button(
{
if (state) {
buttonColors[0] = UIColors.WATCHER_START_BG
run { watcher.stop() }
onStateChange(false)
snackBarDataHolder.coroutineScope.launch {
snackBarDataHolder.scaffoldState.snackbarHostState.currentSnackbarData?.dismiss()
snackBarDataHolder.scaffoldState.snackbarHostState.showSnackbar(
message = "Stopped Watcher.",
duration = SnackbarDuration.Short,
)
}
} else {
buttonColors[0] = UIColors.WATCHER_STOP_BG
run { watcher.start() }
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),
contentPadding = ButtonDefaults.ContentPadding,
shape = RoundedCornerShape(100),
modifier = Modifier.shadow(15.dp, RoundedCornerShape(100), false)
) {
if (state) {
Icon(
Icons.Filled.Close,
tint = UIColors.WATCHER_STOP_FG,
contentDescription = "Stop",
modifier = Modifier.size(28.dp)
)
} else {
Icon(
Icons.Filled.PlayArrow,
tint = UIColors.WATCHER_START_FG,
contentDescription = "Start",
modifier = Modifier.size(28.dp)
)
}
}*/
Button( Button(
onClick = { watcher.move() }, onClick = { watcher.move() },
colors = ButtonDefaults.buttonColors(UIColors.PRIMARY, Color.White), colors = ButtonDefaults.buttonColors(UIColors.PRIMARY, Color.White),
@ -101,5 +43,4 @@ fun BottomRow(
Spacer(Modifier.size(ButtonDefaults.IconSpacing)) Spacer(Modifier.size(ButtonDefaults.IconSpacing))
Text("Move files") Text("Move files")
} }
} }

View file

@ -1,11 +1,7 @@
package xyz.atnrch.wrench.watcher package xyz.atnrch.wrench.watcher
import androidx.compose.material.SnackbarDuration import androidx.compose.material.SnackbarDuration
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.swing.Swing
import xyz.atnrch.wrench.compose.SnackBarDataHolder import xyz.atnrch.wrench.compose.SnackBarDataHolder
import xyz.atnrch.wrench.logger.Logger import xyz.atnrch.wrench.logger.Logger
import java.nio.file.Files import java.nio.file.Files
@ -16,25 +12,8 @@ class Watcher(
private val watcherManager: WatcherManager, private val watcherManager: WatcherManager,
private val snackBarDataHolder: SnackBarDataHolder private val snackBarDataHolder: SnackBarDataHolder
) { ) {
companion object {
var WATCHING = false
}
private var coroutineScope = CoroutineScope(Dispatchers.Swing)
fun start() {
if (WATCHING) return
coroutineScope.launch {
WATCHING = true
Logger.info("Started Watcher.")
while (WATCHING) {
move()
}
}
}
fun move() { fun move() {
Logger.info("Moving files...")
snackBarDataHolder.coroutineScope.launch { snackBarDataHolder.coroutineScope.launch {
var filesTotal = 0 var filesTotal = 0
var foldersTotal = 0 var foldersTotal = 0
@ -42,32 +21,22 @@ class Watcher(
filesTotal += 1 filesTotal += 1
entry.map.forEach { entry.map.forEach {
val movePath = "${it.toAbsolutePath()}/${entry.file.name}" val movePath = "${it.toAbsolutePath()}/${entry.file.name}"
println(movePath)
Files.copy(entry.file.toPath(), Path.of(movePath), StandardCopyOption.REPLACE_EXISTING) Files.copy(entry.file.toPath(), Path.of(movePath), StandardCopyOption.REPLACE_EXISTING)
foldersTotal += 1 foldersTotal += 1
} }
} }
snackBarDataHolder.scaffoldState.snackbarHostState.currentSnackbarData?.dismiss() val logMessage: String = if (foldersTotal < 1) {
println(foldersTotal) "No files to move!"
if (foldersTotal < 1) {
println(foldersTotal)
snackBarDataHolder.scaffoldState.snackbarHostState.showSnackbar(
message = "No files to move, skipped.",
duration = SnackbarDuration.Short
)
} else { } else {
snackBarDataHolder.scaffoldState.snackbarHostState.showSnackbar( "Successfully moved $filesTotal ${if (filesTotal > 1) "files" else "file"} to $foldersTotal different ${if (foldersTotal > 1) "folders" else "folder"}."
message = "Successfully moved $filesTotal ${if (filesTotal > 1) "files" else "file"} to $foldersTotal different ${if (foldersTotal > 1) "folders" else "folder"}",
duration = SnackbarDuration.Short
)
} }
Logger.info(logMessage)
Logger.info("Done moving files.")
snackBarDataHolder.scaffoldState.snackbarHostState.currentSnackbarData?.dismiss()
snackBarDataHolder.scaffoldState.snackbarHostState.showSnackbar(
message = logMessage,
duration = SnackbarDuration.Short
)
} }
} }
fun stop() {
Logger.info("Stopped Watcher.")
coroutineScope.cancel()
coroutineScope = CoroutineScope(Dispatchers.Main)
WATCHING = false
}
} }