feat: minmode
This commit is contained in:
parent
50b52ecf58
commit
9908cb01ce
11 changed files with 167 additions and 72 deletions
build.gradle.kts
src/main/kotlin/xyz/atnrch/wrench
|
@ -33,9 +33,13 @@ compose.desktop {
|
|||
application {
|
||||
mainClass = "xyz.atnrch.wrench.WrenchApp"
|
||||
nativeDistributions {
|
||||
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.AppImage)
|
||||
targetFormats(TargetFormat.AppImage)
|
||||
packageName = "Wrench"
|
||||
packageVersion = "1.0.0"
|
||||
linux {
|
||||
packageName = "Wrench"
|
||||
//iconFile.set(project.file(""))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +1,10 @@
|
|||
package xyz.atnrch.wrench
|
||||
|
||||
import androidx.compose.material.MaterialTheme
|
||||
import androidx.compose.ui.window.singleWindowApplication
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.Window
|
||||
import androidx.compose.ui.window.application
|
||||
import androidx.compose.ui.window.rememberWindowState
|
||||
import xyz.atnrch.wrench.components.WrenchScaffold
|
||||
import xyz.atnrch.wrench.logger.Logger
|
||||
import javax.swing.UIManager
|
||||
|
@ -11,10 +14,16 @@ class WrenchApp {
|
|||
const val PREFIX: String = "(Wrench)"
|
||||
|
||||
@JvmStatic
|
||||
fun main(args: Array<String>) = singleWindowApplication {
|
||||
Logger.info("Starting Wrench...")
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
|
||||
MaterialTheme { WrenchScaffold() }
|
||||
fun main(args: Array<String>) = application {
|
||||
val state = rememberWindowState(width = 1000.dp, height = 1024.dp)
|
||||
Window(
|
||||
state = state,
|
||||
onCloseRequest = ::exitApplication
|
||||
) {
|
||||
Logger.info("Starting Wrench...")
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
|
||||
MaterialTheme { WrenchScaffold(state) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,33 +1,61 @@
|
|||
package xyz.atnrch.wrench.components
|
||||
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.WindowState
|
||||
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.watcher.WatcherManager
|
||||
import java.io.File
|
||||
import java.nio.file.Path
|
||||
|
||||
@Composable
|
||||
fun WatcherDisplay(
|
||||
state: WindowState,
|
||||
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"))
|
||||
DefaultDisplay()
|
||||
} else {
|
||||
InputEntries(watcherManager, onEntryClick)
|
||||
OutputEntries(watcherManager, currentClick, outputs)
|
||||
if (state.size.width <= 600.dp) {
|
||||
Column(
|
||||
modifier = Modifier.padding(0.dp, 0.dp, 0.dp, 55.dp),
|
||||
verticalArrangement = Arrangement.Top,
|
||||
horizontalAlignment = Alignment.CenterHorizontally
|
||||
) {
|
||||
displayEntries(true, watcherManager, currentClick, outputs, onEntryClick)
|
||||
}
|
||||
} else {
|
||||
Row(
|
||||
modifier = Modifier.padding(0.dp, 0.dp, 0.dp, 55.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.Center
|
||||
) {
|
||||
displayEntries(false, watcherManager, currentClick, outputs, onEntryClick)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun displayEntries(
|
||||
minmode: Boolean,
|
||||
watcherManager: WatcherManager,
|
||||
currentClick: Int,
|
||||
outputs: MutableList<Path>,
|
||||
onEntryClick: (id: Int) -> Unit
|
||||
) {
|
||||
if (watcherManager.getEntries().isEmpty()) {
|
||||
watcherManager.addFile(File("/home/aro/IdeaProjects/Wrench/dummy"))
|
||||
DefaultDisplay()
|
||||
} else {
|
||||
InputEntries(minmode, watcherManager, onEntryClick)
|
||||
OutputEntries(minmode, watcherManager, currentClick, outputs)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import androidx.compose.material.Scaffold
|
|||
import androidx.compose.material.ScaffoldState
|
||||
import androidx.compose.material.rememberScaffoldState
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.window.WindowState
|
||||
import xyz.atnrch.wrench.components.bottom.BottomAppBar
|
||||
import xyz.atnrch.wrench.components.bottom.FloatingButton
|
||||
import xyz.atnrch.wrench.components.top.TopBar
|
||||
|
@ -15,7 +16,7 @@ import xyz.atnrch.wrench.watcher.WatcherManager
|
|||
import java.nio.file.Path
|
||||
|
||||
@Composable
|
||||
fun WrenchScaffold() {
|
||||
fun WrenchScaffold(state: WindowState) {
|
||||
val scaffoldState: ScaffoldState = rememberScaffoldState()
|
||||
val entries: MutableMap<Int, WatcherEntry> = remember { mutableStateMapOf() }
|
||||
val outputs: MutableList<Path> = remember { mutableStateListOf() }
|
||||
|
@ -30,6 +31,6 @@ fun WrenchScaffold() {
|
|||
floatingActionButton = { FloatingButton(watcherManager) },
|
||||
isFloatingActionButtonDocked = true,
|
||||
backgroundColor = UIColors.PRIMARY,
|
||||
bottomBar = { BottomAppBar(watcherManager, watcher, currentClick, outputs) { currentClick = it } }
|
||||
) { WatcherDisplay(watcherManager, currentClick, outputs) { currentClick = it } }
|
||||
bottomBar = { BottomAppBar(state, watcherManager, watcher, currentClick, outputs) { currentClick = it } }
|
||||
) { WatcherDisplay(state, watcherManager, currentClick, outputs) { currentClick = it } }
|
||||
}
|
|
@ -13,9 +13,11 @@ import androidx.compose.material.icons.Icons
|
|||
import androidx.compose.material.icons.filled.NoteAdd
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.scale
|
||||
import androidx.compose.ui.draw.shadow
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.WindowState
|
||||
import xyz.atnrch.wrench.components.center.showDirectoryPicker
|
||||
import xyz.atnrch.wrench.logger.Logger
|
||||
import xyz.atnrch.wrench.ui.UIColors
|
||||
|
@ -25,10 +27,13 @@ import java.nio.file.Path
|
|||
|
||||
@Composable
|
||||
fun AddOutputButton(
|
||||
state: WindowState,
|
||||
watcherManager: WatcherManager,
|
||||
outputs: MutableList<Path>,
|
||||
currentClick: Int
|
||||
) {
|
||||
val scaleFactor: Float = if (state.size.width <= 600.dp) 0.85f else 1f
|
||||
|
||||
Button(
|
||||
onClick =
|
||||
{
|
||||
|
@ -50,7 +55,7 @@ fun AddOutputButton(
|
|||
),
|
||||
shape = RoundedCornerShape(100),
|
||||
border = BorderStroke(2.dp, UIColors.ORANGE),
|
||||
modifier = Modifier.shadow(24.dp, RoundedCornerShape(100), false)
|
||||
modifier = Modifier.shadow(24.dp, RoundedCornerShape(100), false).scale(scaleFactor)
|
||||
) {
|
||||
Icon(
|
||||
Icons.Filled.NoteAdd,
|
||||
|
|
|
@ -3,6 +3,7 @@ package xyz.atnrch.wrench.components.bottom
|
|||
import androidx.compose.foundation.shape.CornerSize
|
||||
import androidx.compose.material.MaterialTheme
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.window.WindowState
|
||||
import xyz.atnrch.wrench.ui.UIColors
|
||||
import xyz.atnrch.wrench.watcher.Watcher
|
||||
import xyz.atnrch.wrench.watcher.WatcherManager
|
||||
|
@ -10,6 +11,7 @@ import java.nio.file.Path
|
|||
|
||||
@Composable
|
||||
fun BottomAppBar(
|
||||
state: WindowState,
|
||||
watcherManager: WatcherManager,
|
||||
watcher: Watcher,
|
||||
currentClick: Int,
|
||||
|
@ -21,5 +23,5 @@ fun BottomAppBar(
|
|||
CornerSize(percent = 50)
|
||||
),
|
||||
backgroundColor = UIColors.DARK
|
||||
) { BottomRowNew(watcherManager, watcher, currentClick, outputs, onCurrentClick) }
|
||||
) { BottomRowNew(state, watcherManager, watcher, currentClick, outputs, onCurrentClick) }
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
package xyz.atnrch.wrench.components.bottom
|
||||
|
||||
import androidx.compose.foundation.BorderStroke
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.Button
|
||||
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.filled.Update
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.scale
|
||||
import androidx.compose.ui.draw.shadow
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.WindowState
|
||||
import xyz.atnrch.wrench.ui.UIColors
|
||||
import xyz.atnrch.wrench.watcher.Watcher
|
||||
|
||||
@Composable
|
||||
fun MoveFilesButton(
|
||||
state: WindowState,
|
||||
watcher: Watcher
|
||||
) {
|
||||
val scaleFactor: Float = if (state.size.width <= 600.dp) 0.85f else 1f
|
||||
|
||||
Button(
|
||||
onClick = { watcher.move() },
|
||||
colors = ButtonDefaults.buttonColors(UIColors.DARK, Color.White),
|
||||
contentPadding = PaddingValues(
|
||||
start = 14.dp,
|
||||
top = 6.dp,
|
||||
end = 14.dp,
|
||||
bottom = 6.dp
|
||||
),
|
||||
shape = RoundedCornerShape(100),
|
||||
border = BorderStroke(2.dp, UIColors.GREEN),
|
||||
modifier = Modifier.shadow(24.dp, RoundedCornerShape(100), false).scale(scaleFactor)
|
||||
) {
|
||||
Icon(
|
||||
Icons.Filled.Update,
|
||||
tint = UIColors.GREEN,
|
||||
contentDescription = "Start",
|
||||
modifier = Modifier.size(22.dp)
|
||||
)
|
||||
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
|
||||
Text("Move files")
|
||||
}
|
||||
}
|
|
@ -13,26 +13,29 @@ import androidx.compose.material.icons.Icons
|
|||
import androidx.compose.material.icons.filled.Delete
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.scale
|
||||
import androidx.compose.ui.draw.shadow
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.WindowState
|
||||
import xyz.atnrch.wrench.registery.ACTIVE_COMPOSABLE
|
||||
import xyz.atnrch.wrench.ui.UIColors
|
||||
import xyz.atnrch.wrench.watcher.WatcherEntry
|
||||
import xyz.atnrch.wrench.watcher.WatcherManager
|
||||
import java.nio.file.Path
|
||||
|
||||
@Composable
|
||||
fun RemoveOutputButton(
|
||||
state: WindowState,
|
||||
watcherManager: WatcherManager,
|
||||
outputs: MutableList<Path>,
|
||||
currentClick: Int,
|
||||
onCurrentClick: (Int) -> Unit
|
||||
) {
|
||||
val scaleFactor: Float = if (state.size.width <= 600.dp) 0.85f else 1f
|
||||
|
||||
Button(
|
||||
onClick =
|
||||
{
|
||||
val entry: WatcherEntry? = watcherManager.getFromId(currentClick)
|
||||
watcherManager.removeFile(currentClick)
|
||||
outputs.clear()
|
||||
ACTIVE_COMPOSABLE = -1
|
||||
|
@ -47,7 +50,7 @@ fun RemoveOutputButton(
|
|||
),
|
||||
shape = RoundedCornerShape(100),
|
||||
border = BorderStroke(2.dp, UIColors.STRESS),
|
||||
modifier = Modifier.shadow(24.dp, RoundedCornerShape(100), false)
|
||||
modifier = Modifier.shadow(24.dp, RoundedCornerShape(100), false).scale(scaleFactor)
|
||||
) {
|
||||
Icon(
|
||||
Icons.Filled.Delete,
|
||||
|
|
|
@ -1,62 +1,32 @@
|
|||
package xyz.atnrch.wrench.components.bottom
|
||||
|
||||
import androidx.compose.foundation.BorderStroke
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.Button
|
||||
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.filled.Update
|
||||
import androidx.compose.runtime.Composable
|
||||
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.ui.UIColors
|
||||
import androidx.compose.ui.window.WindowState
|
||||
import xyz.atnrch.wrench.watcher.Watcher
|
||||
import xyz.atnrch.wrench.watcher.WatcherManager
|
||||
import java.nio.file.Path
|
||||
|
||||
@Composable
|
||||
fun BottomRowNew(
|
||||
state: WindowState,
|
||||
watcherManager: WatcherManager,
|
||||
watcher: Watcher,
|
||||
currentClick: Int,
|
||||
outputs: MutableList<Path>,
|
||||
onCurrentClick: (Int) -> Unit,
|
||||
) {
|
||||
val buttonWidth = if (state.size.width <= 600.dp) 0.dp else 10.dp
|
||||
|
||||
Spacer(Modifier.width(10.dp))
|
||||
Button(
|
||||
onClick = { watcher.move() },
|
||||
colors = ButtonDefaults.buttonColors(UIColors.DARK, Color.White),
|
||||
contentPadding = PaddingValues(
|
||||
start = 14.dp,
|
||||
top = 6.dp,
|
||||
end = 14.dp,
|
||||
bottom = 6.dp
|
||||
),
|
||||
shape = RoundedCornerShape(100),
|
||||
border = BorderStroke(2.dp, UIColors.GREEN),
|
||||
modifier = Modifier.shadow(24.dp, RoundedCornerShape(100), false)
|
||||
) {
|
||||
Icon(
|
||||
Icons.Filled.Update,
|
||||
tint = UIColors.GREEN,
|
||||
contentDescription = "Start",
|
||||
modifier = Modifier.size(22.dp)
|
||||
)
|
||||
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
|
||||
Text("Move files")
|
||||
}
|
||||
MoveFilesButton(state, watcher)
|
||||
if (currentClick != -1) {
|
||||
Spacer(Modifier.width(10.dp))
|
||||
AddOutputButton(watcherManager, outputs, currentClick)
|
||||
Spacer(Modifier.width(10.dp))
|
||||
RemoveOutputButton(watcherManager, outputs, currentClick, onCurrentClick)
|
||||
Spacer(Modifier.width(buttonWidth))
|
||||
AddOutputButton(state, watcherManager, outputs, currentClick)
|
||||
Spacer(Modifier.width(buttonWidth))
|
||||
RemoveOutputButton(state, watcherManager, outputs, currentClick, onCurrentClick)
|
||||
}
|
||||
}
|
|
@ -16,19 +16,13 @@ import xyz.atnrch.wrench.watcher.WatcherManager
|
|||
|
||||
@Composable
|
||||
fun InputEntries(
|
||||
minmode: Boolean,
|
||||
watcherManager: WatcherManager,
|
||||
onEntryClick: (id: Int) -> Unit
|
||||
) {
|
||||
Box(
|
||||
contentAlignment = Alignment.Center,
|
||||
modifier = Modifier
|
||||
.fillMaxHeight()
|
||||
.fillMaxWidth(0.5f)
|
||||
.border(BorderStroke(4.dp, UIColors.ORANGE), RectangleShape)
|
||||
.clickable {
|
||||
ACTIVE_COMPOSABLE = -1
|
||||
onEntryClick.invoke(-1)
|
||||
}
|
||||
modifier = getModifier(minmode, onEntryClick)
|
||||
) {
|
||||
InputTopText()
|
||||
Column(
|
||||
|
@ -45,4 +39,29 @@ fun InputEntries(
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun getModifier(
|
||||
minmode: Boolean,
|
||||
onEntryClick: (id: Int) -> Unit
|
||||
): Modifier {
|
||||
return if (minmode)
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.fillMaxHeight(0.5f)
|
||||
.border(BorderStroke(4.dp, UIColors.ORANGE), RectangleShape)
|
||||
.clickable {
|
||||
ACTIVE_COMPOSABLE = -1
|
||||
onEntryClick.invoke(-1)
|
||||
} else {
|
||||
Modifier
|
||||
.fillMaxHeight()
|
||||
.fillMaxWidth(0.5f)
|
||||
.border(BorderStroke(4.dp, UIColors.ORANGE), RectangleShape)
|
||||
.clickable {
|
||||
ACTIVE_COMPOSABLE = -1
|
||||
onEntryClick.invoke(-1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import kotlin.io.path.pathString
|
|||
@OptIn(ExperimentalUnitApi::class)
|
||||
@Composable
|
||||
fun OutputEntries(
|
||||
minmode: Boolean,
|
||||
watcherManager: WatcherManager,
|
||||
currentClick: Int,
|
||||
outputs: MutableList<Path>
|
||||
|
|
Reference in a new issue