app style: some tweaking and new button on bottom bar to add outputs

This commit is contained in:
aro 2022-11-28 09:40:40 +01:00
parent ac17437a71
commit d1600d389e
11 changed files with 140 additions and 108 deletions

View file

@ -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<Path>,
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)
}
}
}

View file

@ -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<Int, WatcherEntry> = remember { mutableStateMapOf() }
val outputs: MutableList<Path> = 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 } }
}

View file

@ -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<Path>
) {
androidx.compose.material.BottomAppBar(
cutoutShape = MaterialTheme.shapes.small.copy(
CornerSize(percent = 50)
),
backgroundColor = UIColors.DARK
) { BottomRowNew(watcher) }
) { BottomRowNew(watcherManager, watcher, currentClick, outputs) }
}

View file

@ -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<Path>
) {
Spacer(Modifier.width(10.dp))
Button(
@ -48,9 +56,20 @@ fun BottomRowNew(
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
Text("Move files")
}
if(currentClick != -1) {
Spacer(Modifier.width(10.dp))
Button(
onClick = { println("Show Directory Picker") },
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,
@ -72,3 +91,4 @@ fun BottomRowNew(
Text("Add output...")
}
}
}

View file

@ -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

View file

@ -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
)
}
}
}

View file

@ -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

View file

@ -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(

View file

@ -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<Path>
) {
val outputs: MutableList<Path> = 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,26 +57,9 @@ fun OutputEntries(
)
} else {
outputs.forEach {
Text(it.pathString)
}
}
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)
Text(
text = it.pathString,
color = Color.White
)
}
}
@ -94,3 +68,4 @@ fun OutputEntries(
}
}
}
}

View file

@ -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
)
)
}
}

View file

@ -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}"
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) {