feat: minmode

This commit is contained in:
aro 2022-12-06 00:14:40 +01:00
parent 50b52ecf58
commit 9908cb01ce
11 changed files with 167 additions and 72 deletions

View file

@ -33,9 +33,13 @@ compose.desktop {
application { application {
mainClass = "xyz.atnrch.wrench.WrenchApp" mainClass = "xyz.atnrch.wrench.WrenchApp"
nativeDistributions { nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.AppImage) targetFormats(TargetFormat.AppImage)
packageName = "Wrench" packageName = "Wrench"
packageVersion = "1.0.0" packageVersion = "1.0.0"
linux {
packageName = "Wrench"
//iconFile.set(project.file(""))
}
} }
} }
} }

View file

@ -1,7 +1,10 @@
package xyz.atnrch.wrench package xyz.atnrch.wrench
import androidx.compose.material.MaterialTheme 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.components.WrenchScaffold
import xyz.atnrch.wrench.logger.Logger import xyz.atnrch.wrench.logger.Logger
import javax.swing.UIManager import javax.swing.UIManager
@ -11,10 +14,16 @@ class WrenchApp {
const val PREFIX: String = "(Wrench)" const val PREFIX: String = "(Wrench)"
@JvmStatic @JvmStatic
fun main(args: Array<String>) = singleWindowApplication { fun main(args: Array<String>) = application {
val state = rememberWindowState(width = 1000.dp, height = 1024.dp)
Window(
state = state,
onCloseRequest = ::exitApplication
) {
Logger.info("Starting Wrench...") Logger.info("Starting Wrench...")
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
MaterialTheme { WrenchScaffold() } MaterialTheme { WrenchScaffold(state) }
}
} }
} }
} }

View file

@ -1,33 +1,61 @@
package xyz.atnrch.wrench.components 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.Row
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp 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.empty.DefaultDisplay
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
import java.nio.file.Path import java.nio.file.Path
@Composable @Composable
fun WatcherDisplay( fun WatcherDisplay(
state: WindowState,
watcherManager: WatcherManager, watcherManager: WatcherManager,
currentClick: Int, currentClick: Int,
outputs: MutableList<Path>, outputs: MutableList<Path>,
onEntryClick: (id: Int) -> Unit onEntryClick: (id: Int) -> Unit
) { ) {
if (state.size.width <= 600.dp) {
Row( Column(
modifier = Modifier.padding(0.dp, 0.dp, 0.dp, 55.dp) modifier = Modifier.padding(0.dp, 0.dp, 0.dp, 55.dp),
verticalArrangement = Arrangement.Top,
horizontalAlignment = Alignment.CenterHorizontally
) { ) {
if (watcherManager.getEntries().isEmpty()) { displayEntries(true, watcherManager, currentClick, outputs, onEntryClick)
//watcherManager.addFile(File("/home/aro/IdeaProjects/Wrench/dummy")) }
DefaultDisplay()
} else { } else {
InputEntries(watcherManager, onEntryClick) Row(
OutputEntries(watcherManager, currentClick, outputs) 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)
}
}

View file

@ -4,6 +4,7 @@ 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.*
import androidx.compose.ui.window.WindowState
import xyz.atnrch.wrench.components.bottom.BottomAppBar import xyz.atnrch.wrench.components.bottom.BottomAppBar
import xyz.atnrch.wrench.components.bottom.FloatingButton import xyz.atnrch.wrench.components.bottom.FloatingButton
import xyz.atnrch.wrench.components.top.TopBar import xyz.atnrch.wrench.components.top.TopBar
@ -15,7 +16,7 @@ import xyz.atnrch.wrench.watcher.WatcherManager
import java.nio.file.Path import java.nio.file.Path
@Composable @Composable
fun WrenchScaffold() { fun WrenchScaffold(state: WindowState) {
val scaffoldState: ScaffoldState = rememberScaffoldState() val scaffoldState: ScaffoldState = rememberScaffoldState()
val entries: MutableMap<Int, WatcherEntry> = remember { mutableStateMapOf() } val entries: MutableMap<Int, WatcherEntry> = remember { mutableStateMapOf() }
val outputs: MutableList<Path> = remember { mutableStateListOf() } val outputs: MutableList<Path> = remember { mutableStateListOf() }
@ -30,6 +31,6 @@ fun WrenchScaffold() {
floatingActionButton = { FloatingButton(watcherManager) }, floatingActionButton = { FloatingButton(watcherManager) },
isFloatingActionButtonDocked = true, isFloatingActionButtonDocked = true,
backgroundColor = UIColors.PRIMARY, backgroundColor = UIColors.PRIMARY,
bottomBar = { BottomAppBar(watcherManager, watcher, currentClick, outputs) { currentClick = it } } bottomBar = { BottomAppBar(state, watcherManager, watcher, currentClick, outputs) { currentClick = it } }
) { WatcherDisplay(watcherManager, currentClick, outputs) { currentClick = it } } ) { WatcherDisplay(state, watcherManager, currentClick, outputs) { currentClick = it } }
} }

View file

@ -13,9 +13,11 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.NoteAdd import androidx.compose.material.icons.filled.NoteAdd
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
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 androidx.compose.ui.window.WindowState
import xyz.atnrch.wrench.components.center.showDirectoryPicker import xyz.atnrch.wrench.components.center.showDirectoryPicker
import xyz.atnrch.wrench.logger.Logger import xyz.atnrch.wrench.logger.Logger
import xyz.atnrch.wrench.ui.UIColors import xyz.atnrch.wrench.ui.UIColors
@ -25,10 +27,13 @@ import java.nio.file.Path
@Composable @Composable
fun AddOutputButton( fun AddOutputButton(
state: WindowState,
watcherManager: WatcherManager, watcherManager: WatcherManager,
outputs: MutableList<Path>, outputs: MutableList<Path>,
currentClick: Int currentClick: Int
) { ) {
val scaleFactor: Float = if (state.size.width <= 600.dp) 0.85f else 1f
Button( Button(
onClick = onClick =
{ {
@ -50,7 +55,7 @@ fun AddOutputButton(
), ),
shape = RoundedCornerShape(100), shape = RoundedCornerShape(100),
border = BorderStroke(2.dp, UIColors.ORANGE), 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( Icon(
Icons.Filled.NoteAdd, Icons.Filled.NoteAdd,

View file

@ -3,6 +3,7 @@ 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.window.WindowState
import xyz.atnrch.wrench.ui.UIColors import xyz.atnrch.wrench.ui.UIColors
import xyz.atnrch.wrench.watcher.Watcher import xyz.atnrch.wrench.watcher.Watcher
import xyz.atnrch.wrench.watcher.WatcherManager import xyz.atnrch.wrench.watcher.WatcherManager
@ -10,6 +11,7 @@ import java.nio.file.Path
@Composable @Composable
fun BottomAppBar( fun BottomAppBar(
state: WindowState,
watcherManager: WatcherManager, watcherManager: WatcherManager,
watcher: Watcher, watcher: Watcher,
currentClick: Int, currentClick: Int,
@ -21,5 +23,5 @@ fun BottomAppBar(
CornerSize(percent = 50) CornerSize(percent = 50)
), ),
backgroundColor = UIColors.DARK backgroundColor = UIColors.DARK
) { BottomRowNew(watcherManager, watcher, currentClick, outputs, onCurrentClick) } ) { BottomRowNew(state, watcherManager, watcher, currentClick, outputs, onCurrentClick) }
} }

View file

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

View file

@ -13,26 +13,29 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Delete
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
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 androidx.compose.ui.window.WindowState
import xyz.atnrch.wrench.registery.ACTIVE_COMPOSABLE import xyz.atnrch.wrench.registery.ACTIVE_COMPOSABLE
import xyz.atnrch.wrench.ui.UIColors import xyz.atnrch.wrench.ui.UIColors
import xyz.atnrch.wrench.watcher.WatcherEntry
import xyz.atnrch.wrench.watcher.WatcherManager import xyz.atnrch.wrench.watcher.WatcherManager
import java.nio.file.Path import java.nio.file.Path
@Composable @Composable
fun RemoveOutputButton( fun RemoveOutputButton(
state: WindowState,
watcherManager: WatcherManager, watcherManager: WatcherManager,
outputs: MutableList<Path>, outputs: MutableList<Path>,
currentClick: Int, currentClick: Int,
onCurrentClick: (Int) -> Unit onCurrentClick: (Int) -> Unit
) { ) {
val scaleFactor: Float = if (state.size.width <= 600.dp) 0.85f else 1f
Button( Button(
onClick = onClick =
{ {
val entry: WatcherEntry? = watcherManager.getFromId(currentClick)
watcherManager.removeFile(currentClick) watcherManager.removeFile(currentClick)
outputs.clear() outputs.clear()
ACTIVE_COMPOSABLE = -1 ACTIVE_COMPOSABLE = -1
@ -47,7 +50,7 @@ fun RemoveOutputButton(
), ),
shape = RoundedCornerShape(100), shape = RoundedCornerShape(100),
border = BorderStroke(2.dp, UIColors.STRESS), 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( Icon(
Icons.Filled.Delete, Icons.Filled.Delete,

View file

@ -1,62 +1,32 @@
package xyz.atnrch.wrench.components.bottom 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.Spacer
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width 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.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp 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.Watcher
import xyz.atnrch.wrench.watcher.WatcherManager import xyz.atnrch.wrench.watcher.WatcherManager
import java.nio.file.Path import java.nio.file.Path
@Composable @Composable
fun BottomRowNew( fun BottomRowNew(
state: WindowState,
watcherManager: WatcherManager, watcherManager: WatcherManager,
watcher: Watcher, watcher: Watcher,
currentClick: Int, currentClick: Int,
outputs: MutableList<Path>, outputs: MutableList<Path>,
onCurrentClick: (Int) -> Unit, onCurrentClick: (Int) -> Unit,
) { ) {
val buttonWidth = if (state.size.width <= 600.dp) 0.dp else 10.dp
Spacer(Modifier.width(10.dp)) Spacer(Modifier.width(10.dp))
Button( MoveFilesButton(state, watcher)
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")
}
if (currentClick != -1) { if (currentClick != -1) {
Spacer(Modifier.width(10.dp)) Spacer(Modifier.width(buttonWidth))
AddOutputButton(watcherManager, outputs, currentClick) AddOutputButton(state, watcherManager, outputs, currentClick)
Spacer(Modifier.width(10.dp)) Spacer(Modifier.width(buttonWidth))
RemoveOutputButton(watcherManager, outputs, currentClick, onCurrentClick) RemoveOutputButton(state, watcherManager, outputs, currentClick, onCurrentClick)
} }
} }

View file

@ -16,19 +16,13 @@ import xyz.atnrch.wrench.watcher.WatcherManager
@Composable @Composable
fun InputEntries( fun InputEntries(
minmode: Boolean,
watcherManager: WatcherManager, watcherManager: WatcherManager,
onEntryClick: (id: Int) -> Unit onEntryClick: (id: Int) -> Unit
) { ) {
Box( Box(
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center,
modifier = Modifier modifier = getModifier(minmode, onEntryClick)
.fillMaxHeight()
.fillMaxWidth(0.5f)
.border(BorderStroke(4.dp, UIColors.ORANGE), RectangleShape)
.clickable {
ACTIVE_COMPOSABLE = -1
onEntryClick.invoke(-1)
}
) { ) {
InputTopText() InputTopText()
Column( Column(
@ -46,3 +40,28 @@ 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)
}
}
}

View file

@ -22,6 +22,7 @@ import kotlin.io.path.pathString
@OptIn(ExperimentalUnitApi::class) @OptIn(ExperimentalUnitApi::class)
@Composable @Composable
fun OutputEntries( fun OutputEntries(
minmode: Boolean,
watcherManager: WatcherManager, watcherManager: WatcherManager,
currentClick: Int, currentClick: Int,
outputs: MutableList<Path> outputs: MutableList<Path>