feat: remove the on/off watcher, too unreliable
This commit is contained in:
parent
4e7f2b4a68
commit
b56fb3b601
5 changed files with 39 additions and 124 deletions
|
@ -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) }
|
||||||
|
|
||||||
}
|
}
|
|
@ -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) }
|
|
||||||
}
|
}
|
|
@ -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)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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 {
|
||||||
|
"Successfully moved $filesTotal ${if (filesTotal > 1) "files" else "file"} to $foldersTotal different ${if (foldersTotal > 1) "folders" else "folder"}."
|
||||||
|
}
|
||||||
|
Logger.info(logMessage)
|
||||||
|
Logger.info("Done moving files.")
|
||||||
|
snackBarDataHolder.scaffoldState.snackbarHostState.currentSnackbarData?.dismiss()
|
||||||
snackBarDataHolder.scaffoldState.snackbarHostState.showSnackbar(
|
snackBarDataHolder.scaffoldState.snackbarHostState.showSnackbar(
|
||||||
message = "Successfully moved $filesTotal ${if (filesTotal > 1) "files" else "file"} to $foldersTotal different ${if (foldersTotal > 1) "folders" else "folder"}",
|
message = logMessage,
|
||||||
duration = SnackbarDuration.Short
|
duration = SnackbarDuration.Short
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun stop() {
|
|
||||||
Logger.info("Stopped Watcher.")
|
|
||||||
coroutineScope.cancel()
|
|
||||||
coroutineScope = CoroutineScope(Dispatchers.Main)
|
|
||||||
WATCHING = false
|
|
||||||
}
|
|
||||||
}
|
|
Reference in a new issue