diff --git a/build.gradle.kts b/build.gradle.kts index 37cd80a..af8dfc1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,8 +3,8 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - kotlin("jvm") version "1.8.10" - id("org.jetbrains.compose") version "1.3.1" + kotlin("jvm") version "1.9.10" + id("org.jetbrains.compose") version "1.5.2" } group = "xyz.atnrch" @@ -20,8 +20,8 @@ dependencies { implementation(compose.desktop.currentOs) implementation(compose.materialIconsExtended) implementation(compose.material3) - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.6.4") - implementation("com.google.code.gson:gson:2.10") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.7.3") + implementation("com.google.code.gson:gson:2.10.1") } tasks.withType { @@ -30,7 +30,7 @@ tasks.withType { compose.desktop { application { - mainClass = "xyz.atnrch.wrench.WrenchApp" + mainClass = "xyz.atnrch.wrench.Wrench" nativeDistributions { includeAllModules = true targetFormats(TargetFormat.AppImage) diff --git a/src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt b/src/main/kotlin/xyz/atnrch/wrench/Wrench.kt similarity index 51% rename from src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt rename to src/main/kotlin/xyz/atnrch/wrench/Wrench.kt index 7737e1e..5225592 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/WrenchApp.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/Wrench.kt @@ -7,22 +7,37 @@ import androidx.compose.ui.window.application import androidx.compose.ui.window.rememberWindowState import xyz.atnrch.wrench.gui.WrenchScaffold import xyz.atnrch.wrench.logger.Logger +import java.io.File import java.nio.file.Paths import javax.swing.UIManager -class WrenchApp { +class Wrench { companion object { const val PREFIX: String = "(Wrench)" + private val ROOT_FOLDER_PATH = System.getProperty("user.dir") + File.separator + "WrenchData" + private val SERVER_FOLDER_PATH = ROOT_FOLDER_PATH + File.separator + "servers" + val ROOT_FOLDER: File = Paths.get(ROOT_FOLDER_PATH).toFile() + val SERVER_FOLDER: File = Paths.get(SERVER_FOLDER_PATH).toFile() @JvmStatic fun main(args: Array) = application { val state = rememberWindowState(width = 1000.dp, height = 1024.dp) Window( state = state, - onCloseRequest = ::exitApplication + onCloseRequest = { + // For debug purposes, clean the server folder on exit + SERVER_FOLDER.listFiles()?.forEach { it.delete() } + SERVER_FOLDER.delete() + exitApplication() + } ) { Logger.info("Starting Wrench...") - Logger.info("Working Directory: ${Paths.get("").toAbsolutePath()}") + + Logger.info("Creating folders...") + ROOT_FOLDER.mkdir() + SERVER_FOLDER.mkdir() + + Logger.info("Root folder location: $ROOT_FOLDER") UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) MaterialTheme { WrenchScaffold(state) } } diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/WrenchScaffold.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/WrenchScaffold.kt index 3ebc313..c04079b 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/WrenchScaffold.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/WrenchScaffold.kt @@ -10,7 +10,7 @@ import androidx.compose.ui.window.WindowState import xyz.atnrch.wrench.gui.appearance.UIColors import xyz.atnrch.wrench.gui.component.SnackBarDataHolder import xyz.atnrch.wrench.gui.filemanager.bottom.FileAppBottomBar -import xyz.atnrch.wrench.gui.filemanager.bottom.FloatingAddButton +import xyz.atnrch.wrench.gui.filemanager.bottom.FileManagerAddButton import xyz.atnrch.wrench.gui.server.bottom.ServerAppBottomBar import xyz.atnrch.wrench.storage.LayoutStorage import xyz.atnrch.wrench.watcher.Watcher @@ -45,7 +45,7 @@ fun WrenchScaffold(state: WindowState) { Scaffold( scaffoldState = scaffoldState, topBar = { TopBar(layoutStorage, tabIndex, entries.values) }, - floatingActionButton = { if (tabIndex == 0) FloatingAddButton(watcherManager) }, + floatingActionButton = { if (tabIndex == 0) FileManagerAddButton(watcherManager) }, isFloatingActionButtonDocked = true, backgroundColor = UIColors.PRIMARY, bottomBar = { diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/bottom/FloatingAddButton.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/bottom/FileManagerAddButton.kt similarity index 98% rename from src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/bottom/FloatingAddButton.kt rename to src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/bottom/FileManagerAddButton.kt index 06af812..9de2628 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/bottom/FloatingAddButton.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/bottom/FileManagerAddButton.kt @@ -18,7 +18,7 @@ import xyz.atnrch.wrench.logger.Logger import xyz.atnrch.wrench.watcher.WatcherManager @Composable -fun FloatingAddButton( +fun FileManagerAddButton( watcherManager: WatcherManager ) { FloatingActionButton( diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/EmptyFileManagerView.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/EmptyFileManagerView.kt index 7cf6ffc..a24f28a 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/EmptyFileManagerView.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/EmptyFileManagerView.kt @@ -9,14 +9,12 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -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.gui.appearance.Fonts import xyz.atnrch.wrench.gui.appearance.UIColors -@OptIn(ExperimentalUnitApi::class) @Composable fun EmptyFileManagerView() { Box( diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/input/InputTextEntry.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/input/InputTextEntry.kt index cd9fd7b..97514c7 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/input/InputTextEntry.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/input/InputTextEntry.kt @@ -9,7 +9,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.PointerButton import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.unit.ExperimentalUnitApi import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnitType import xyz.atnrch.wrench.gui.appearance.Fonts @@ -17,7 +16,7 @@ import xyz.atnrch.wrench.gui.appearance.UIColors import xyz.atnrch.wrench.gui.component.ACTIVE_COMPOSABLE import xyz.atnrch.wrench.watcher.WatcherEntry -@OptIn(ExperimentalUnitApi::class, ExperimentalFoundationApi::class) +@OptIn(ExperimentalFoundationApi::class) @Composable fun InputTextEntry( id: Int, diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/input/InputTopText.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/input/InputTopText.kt index 5ea2654..bbf19f6 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/input/InputTopText.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/input/InputTopText.kt @@ -10,12 +10,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.ExperimentalUnitApi import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnitType import androidx.compose.ui.unit.dp -@OptIn(ExperimentalUnitApi::class) @Composable fun InputTopText() { Box( diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/output/OutputEntries.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/output/OutputEntries.kt index 595eb16..d588b50 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/output/OutputEntries.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/output/OutputEntries.kt @@ -9,7 +9,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape -import androidx.compose.ui.unit.ExperimentalUnitApi import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnitType import androidx.compose.ui.unit.dp @@ -20,7 +19,6 @@ import xyz.atnrch.wrench.watcher.WatcherManager import java.nio.file.Path import kotlin.io.path.pathString -@OptIn(ExperimentalUnitApi::class) @Composable fun OutputEntries( watcherManager: WatcherManager, diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/output/OutputTopText.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/output/OutputTopText.kt index 1ce3388..067929a 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/output/OutputTopText.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/filemanager/center/output/OutputTopText.kt @@ -12,7 +12,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.* -@OptIn(ExperimentalUnitApi::class) @Composable fun OutputTopText() { Box( diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/server/ServerManagerDisplay.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/server/ServerManagerDisplay.kt index 127747b..2ab2270 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/server/ServerManagerDisplay.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/server/ServerManagerDisplay.kt @@ -1,9 +1,9 @@ package xyz.atnrch.wrench.gui.server import androidx.compose.runtime.Composable -import xyz.atnrch.wrench.gui.server.center.UnderConstructionView +import xyz.atnrch.wrench.gui.server.center.ServerList @Composable fun ServerManagerDisplay() { - UnderConstructionView() + ServerList() } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/server/bottom/ServerBottomRow.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/server/bottom/ServerBottomRow.kt index fa07d52..8a42aad 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/server/bottom/ServerBottomRow.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/server/bottom/ServerBottomRow.kt @@ -13,7 +13,7 @@ fun ServerButtonBar( onCurrentClick: (Int) -> Unit, ) { Spacer(Modifier.width(10.dp)) - AddServerStateButton(minMode) + StartServerStateButton(minMode) /*if (currentClick != -1) { Spacer(Modifier.width(10.dp)) AddOutputButton(minMode, watcherManager, outputs, currentClick) diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/server/bottom/ServerStateButton.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/server/bottom/ServerStateButton.kt index 1d7155a..9cc3136 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/server/bottom/ServerStateButton.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/server/bottom/ServerStateButton.kt @@ -19,7 +19,7 @@ import androidx.compose.ui.unit.dp import xyz.atnrch.wrench.gui.appearance.UIColors @Composable -fun AddServerStateButton( +fun StartServerStateButton( minMode: Boolean, ) { Button( @@ -34,13 +34,13 @@ fun AddServerStateButton( bottom = 6.dp ), shape = RoundedCornerShape(100), - border = BorderStroke(2.dp, UIColors.ORANGE), + border = BorderStroke(2.dp, UIColors.GREEN), modifier = Modifier.shadow(24.dp, RoundedCornerShape(100), false) ) { Icon( Icons.Filled.Start, - tint = UIColors.ORANGE, - contentDescription = "Add output", + tint = UIColors.GREEN, + contentDescription = "Start Server", modifier = Modifier.size(22.dp) ) if(!minMode) { diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/server/center/EmptyServerManagerView.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/server/center/EmptyServerManagerView.kt index 0cbf196..58fbe3e 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/gui/server/center/EmptyServerManagerView.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/server/center/EmptyServerManagerView.kt @@ -9,14 +9,12 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -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.gui.appearance.Fonts import xyz.atnrch.wrench.gui.appearance.UIColors -@OptIn(ExperimentalUnitApi::class) @Composable fun UnderConstructionView() { Box( diff --git a/src/main/kotlin/xyz/atnrch/wrench/gui/server/center/ServerList.kt b/src/main/kotlin/xyz/atnrch/wrench/gui/server/center/ServerList.kt new file mode 100644 index 0000000..18f9618 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/wrench/gui/server/center/ServerList.kt @@ -0,0 +1,51 @@ +package xyz.atnrch.wrench.gui.server.center + +import androidx.compose.foundation.* +import androidx.compose.foundation.layout.* +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.TextUnitType +import androidx.compose.ui.unit.dp +import xyz.atnrch.wrench.gui.appearance.Fonts +import xyz.atnrch.wrench.gui.appearance.UIColors + +@Composable +fun ServerList() { + Box( + modifier = Modifier.fillMaxSize() + .background(UIColors.PRIMARY) + .padding(10.dp) + ) { + val stateVertical = rememberScrollState(0) + + Box( + modifier = Modifier + .fillMaxSize() + .verticalScroll(stateVertical) + .padding(end = 12.dp, bottom = 12.dp) + ) { + Column { + for (item in 0..5) { + Text( + text = "SERVER $item", + fontSize = TextUnit(20F, TextUnitType.Sp), + fontFamily = Fonts.ROBOTO_BOLD, + color = Color.White + ) + if (item < 5) { + Spacer(modifier = Modifier.height(50.dp)) + } + } + } + } + VerticalScrollbar( + modifier = Modifier.align(Alignment.CenterEnd) + .fillMaxHeight(), + adapter = rememberScrollbarAdapter(stateVertical) + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/logger/Logger.kt b/src/main/kotlin/xyz/atnrch/wrench/logger/Logger.kt index e43b6e1..e1d3df5 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/logger/Logger.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/logger/Logger.kt @@ -1,11 +1,11 @@ package xyz.atnrch.wrench.logger -import xyz.atnrch.wrench.WrenchApp +import xyz.atnrch.wrench.Wrench class Logger { companion object { private fun log(level: Level, log: String) { - println("${WrenchApp.PREFIX} ${level.getName()} - $log") + println("${Wrench.PREFIX} ${level.getName()} - $log") } fun debug(log: String) { diff --git a/src/main/kotlin/xyz/atnrch/wrench/server/Server.kt b/src/main/kotlin/xyz/atnrch/wrench/server/Server.kt new file mode 100644 index 0000000..bcb83d2 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/wrench/server/Server.kt @@ -0,0 +1,20 @@ +package xyz.atnrch.wrench.server + +import xyz.atnrch.wrench.Wrench +import xyz.atnrch.wrench.logger.Logger +import java.io.File +import java.util.* +import kotlin.random.Random + +class Server internal constructor(var name: String, var type: ServerType) { + var id = UUID.randomUUID().toString().take(5) // Much ❤ to Dave Brubeck! + var folder = File(Wrench.SERVER_FOLDER, "${File.separator}${id}") + + internal constructor(type: ServerType) : this("Server ${Random.nextInt(99)}", type) + + init { + Logger.info("(Server) Registering new server \"${name}\" (${type.name}/${id})") + Logger.info("(Server/$id) Creating folders...") + folder.mkdir() + } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/server/ServerStatus.kt b/src/main/kotlin/xyz/atnrch/wrench/server/ServerStatus.kt new file mode 100644 index 0000000..e2dd630 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/wrench/server/ServerStatus.kt @@ -0,0 +1,23 @@ +package xyz.atnrch.wrench.server + +enum class ServerStatus { + /** + * Servers in this state are waiting to be cleaned up. + */ + DEAD, + + /** + * Servers in this state are offline and can be started at any moment. + */ + OFFLINE, + + /** + * Servers in this state are running and can be stopped at any moment. + */ + RUNNING, + + /** + * Servers in this state are actively restarting. + */ + RESTARTING +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/server/ServerType.kt b/src/main/kotlin/xyz/atnrch/wrench/server/ServerType.kt new file mode 100644 index 0000000..b9d7745 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/wrench/server/ServerType.kt @@ -0,0 +1,6 @@ +package xyz.atnrch.wrench.server + +enum class ServerType { + UNDEFINED, + MINECRAFT +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/wrench/storage/LayoutStorage.kt b/src/main/kotlin/xyz/atnrch/wrench/storage/LayoutStorage.kt index b43f275..1c00c4f 100644 --- a/src/main/kotlin/xyz/atnrch/wrench/storage/LayoutStorage.kt +++ b/src/main/kotlin/xyz/atnrch/wrench/storage/LayoutStorage.kt @@ -2,6 +2,7 @@ package xyz.atnrch.wrench.storage import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import xyz.atnrch.wrench.Wrench import xyz.atnrch.wrench.watcher.WatcherEntry import java.io.File import java.io.FileReader @@ -12,7 +13,7 @@ class LayoutStorage(private val onWatcherEntriesUpdate: (List) -> private val gson: Gson = Gson().newBuilder() .setPrettyPrinting() .create() - private val file = File("./layout.json") + private val file = File(Wrench.ROOT_FOLDER, "${File.separator}layout.json") fun storeLayout(list: List) { val writer = FileWriter(file)