[Editor] Create Application Runner which allows to run game from the UI
This commit is contained in:
@@ -98,7 +98,6 @@ class DefaultBuildPipelineService : BuildPipelineService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val OUTPUT_JAR_NAME = "game.jar"
|
|
||||||
private const val TAG = "Build"
|
private const val TAG = "Build"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,12 +3,14 @@ package com.bartlomiejpluta.base.editor.main.view
|
|||||||
import com.bartlomiejpluta.base.editor.code.build.pipeline.BuildPipelineService
|
import com.bartlomiejpluta.base.editor.code.build.pipeline.BuildPipelineService
|
||||||
import com.bartlomiejpluta.base.editor.main.controller.MainController
|
import com.bartlomiejpluta.base.editor.main.controller.MainController
|
||||||
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
|
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
|
||||||
|
import com.bartlomiejpluta.base.editor.process.runner.app.ApplicationRunner
|
||||||
import tornadofx.*
|
import tornadofx.*
|
||||||
|
|
||||||
class MainMenuView : View() {
|
class MainMenuView : View() {
|
||||||
private val mainController: MainController by di()
|
private val mainController: MainController by di()
|
||||||
private val projectContext: ProjectContext by di()
|
private val projectContext: ProjectContext by di()
|
||||||
private val buildPipelineService: BuildPipelineService by di()
|
private val buildPipelineService: BuildPipelineService by di()
|
||||||
|
private val applicationRunner: ApplicationRunner by di()
|
||||||
|
|
||||||
override val root = menubar {
|
override val root = menubar {
|
||||||
menu("File") {
|
menu("File") {
|
||||||
@@ -18,7 +20,6 @@ class MainMenuView : View() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
item("Open project...") {
|
item("Open project...") {
|
||||||
action {
|
action {
|
||||||
mainController.openProject()
|
mainController.openProject()
|
||||||
@@ -61,6 +62,13 @@ class MainMenuView : View() {
|
|||||||
buildPipelineService.build()
|
buildPipelineService.build()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
item("Run") {
|
||||||
|
enableWhen(applicationRunner.isRunningProperty.not())
|
||||||
|
action {
|
||||||
|
applicationRunner.run()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.bartlomiejpluta.base.editor.process.runner.app
|
||||||
|
|
||||||
|
import javafx.beans.binding.BooleanExpression
|
||||||
|
|
||||||
|
interface ApplicationRunner {
|
||||||
|
val isRunningProperty: BooleanExpression
|
||||||
|
fun run()
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package com.bartlomiejpluta.base.editor.process.runner.app
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.editor.code.build.pipeline.BuildPipelineService
|
||||||
|
import com.bartlomiejpluta.base.editor.process.runner.jar.JarRunner
|
||||||
|
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
|
||||||
|
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||||
|
import javafx.event.EventHandler
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
|
import org.springframework.stereotype.Component
|
||||||
|
import tornadofx.getValue
|
||||||
|
import tornadofx.runAsync
|
||||||
|
import tornadofx.setValue
|
||||||
|
import tornadofx.toProperty
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class DefaultApplicationRunner : ApplicationRunner {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private lateinit var projectContext: ProjectContext
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private lateinit var pipelineService: BuildPipelineService
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private lateinit var jarRunner: JarRunner
|
||||||
|
|
||||||
|
override val isRunningProperty = false.toProperty()
|
||||||
|
private var isRunning by isRunningProperty
|
||||||
|
|
||||||
|
override fun run() {
|
||||||
|
projectContext.project?.let { project ->
|
||||||
|
if (isRunning) {
|
||||||
|
return@let
|
||||||
|
}
|
||||||
|
|
||||||
|
isRunning = true
|
||||||
|
pipelineService.build().onSucceeded = EventHandler { runApplication(project) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun runApplication(project: Project) {
|
||||||
|
val builder = jarRunner.run(project.buildOutputJarFile)
|
||||||
|
val process = builder.start()
|
||||||
|
|
||||||
|
runAsync {
|
||||||
|
process.inputStream.bufferedReader().forEachLine {
|
||||||
|
println("OUTPUT -> $it")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
runAsync {
|
||||||
|
process.errorStream.bufferedReader().forEachLine {
|
||||||
|
println("ERROR -> $it")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process.onExit().thenApply {
|
||||||
|
println("EXIT WITH ${it.exitValue()}")
|
||||||
|
isRunning = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.bartlomiejpluta.base.editor.process.runner.jar
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class DefaultJarRunner : JarRunner {
|
||||||
|
private val javaHome = System.getProperty("java.home")
|
||||||
|
private val classpath = System.getProperty("java.class.path")
|
||||||
|
private val javaBin = "$javaHome${FS}bin${FS}java" // == $JAVA_HOME/bin/java
|
||||||
|
|
||||||
|
override fun run(jarFile: File, jvmArgs: Array<String>, args: Array<String>) = listOf(
|
||||||
|
javaBin, *jvmArgs, "-cp", classpath, "-jar", jarFile.absolutePath, *args
|
||||||
|
).let { ProcessBuilder(it) }
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val FS = File.separator
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.bartlomiejpluta.base.editor.process.runner.jar
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
interface JarRunner {
|
||||||
|
fun run(jarFile: File, jvmArgs: Array<String> = emptyArray(), args: Array<String> = emptyArray()): ProcessBuilder
|
||||||
|
}
|
||||||
@@ -59,6 +59,10 @@ class Project {
|
|||||||
var buildOutDirectory by buildOutDirectoryProperty
|
var buildOutDirectory by buildOutDirectoryProperty
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
val buildOutputJarFileProperty =
|
||||||
|
createObjectBinding({ File(buildOutDirectory, PROJECT_OUTPUT_JAR_FILE) }, buildOutDirectoryProperty)
|
||||||
|
val buildOutputJarFile by buildOutputJarFileProperty
|
||||||
|
|
||||||
init {
|
init {
|
||||||
sourceDirectoryProperty.addListener { _, _, dir ->
|
sourceDirectoryProperty.addListener { _, _, dir ->
|
||||||
dir?.let {
|
dir?.let {
|
||||||
@@ -83,6 +87,8 @@ class Project {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val PROJECT_FILE = "project.bep"
|
const val PROJECT_FILE = "project.bep"
|
||||||
|
const val PROJECT_OUTPUT_JAR_FILE = "game.jar"
|
||||||
|
|
||||||
const val MAPS_DIR = "maps"
|
const val MAPS_DIR = "maps"
|
||||||
const val TILESETS_DIR = "tilesets"
|
const val TILESETS_DIR = "tilesets"
|
||||||
const val IMAGES_DIR = "images"
|
const val IMAGES_DIR = "images"
|
||||||
|
|||||||
Reference in New Issue
Block a user