diff --git a/build.gradle.kts b/build.gradle.kts index d54e51e..5c392ed 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -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("")) + } } } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt b/src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt index f844fdc..e0c7b4c 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt @@ -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) = singleWindowApplication { - Logger.info("Starting Wrench...") - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) - MaterialTheme { WrenchScaffold() } + fun main(args: Array) = 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) } + } } } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/WatcherDisplay.kt b/src/main/kotlin/xyz/atnrch/wrench/components/WatcherDisplay.kt index c3acc87..fc872e2 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/WatcherDisplay.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/WatcherDisplay.kt @@ -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, 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, + 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) + } +} diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt b/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt index d649f7c..f13669d 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/WrenchScaffold.kt @@ -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 = remember { mutableStateMapOf() } val outputs: MutableList = 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 } } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/AddOutputButton.kt b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/AddOutputButton.kt index ced9ad8..b5ba3bb 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/AddOutputButton.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/AddOutputButton.kt @@ -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, 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, diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/BottomBar.kt b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/BottomBar.kt index fdc1714..0208337 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/BottomBar.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/BottomBar.kt @@ -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) } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/MoveFilesButton.kt b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/MoveFilesButton.kt new file mode 100644 index 0000000..baf0ce6 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/MoveFilesButton.kt @@ -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") + } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/RemoveOutputButton.kt b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/RemoveOutputButton.kt index bc54a64..edbbcd5 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/RemoveOutputButton.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/RemoveOutputButton.kt @@ -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, 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, diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/WatcherStatusButton.kt b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/WatcherStatusButton.kt index 361358a..def0556 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/bottom/WatcherStatusButton.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/bottom/WatcherStatusButton.kt @@ -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, 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) } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputEntries.kt b/src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputEntries.kt index 7fcc113..36bd110 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputEntries.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/center/input/InputEntries.kt @@ -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( } } } -} \ No newline at end of file +} + +@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) + } + } +} diff --git a/src/main/kotlin/xyz/atnrch/wrench/components/center/output/OutputEntries.kt b/src/main/kotlin/xyz/atnrch/wrench/components/center/output/OutputEntries.kt index f18ebbf..fd6ea59 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/components/center/output/OutputEntries.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/components/center/output/OutputEntries.kt @@ -22,6 +22,7 @@ import kotlin.io.path.pathString @OptIn(ExperimentalUnitApi::class) @Composable fun OutputEntries( + minmode: Boolean, watcherManager: WatcherManager, currentClick: Int, outputs: MutableList