[Editor] Add support for object layer Java imports #2
This commit is contained in:
@@ -11,6 +11,7 @@ import com.bartlomiejpluta.base.internal.map.MapInitializer
|
|||||||
import com.squareup.javapoet.*
|
import com.squareup.javapoet.*
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Component
|
import org.springframework.stereotype.Component
|
||||||
|
import java.io.File
|
||||||
import java.lang.String.format
|
import java.lang.String.format
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
import java.time.format.DateTimeFormatter
|
import java.time.format.DateTimeFormatter
|
||||||
@@ -38,11 +39,16 @@ class MapObjectsCodeGenerator : CodeGenerator {
|
|||||||
|
|
||||||
map.layers
|
map.layers
|
||||||
.mapNotNull { it as? ObjectLayer }
|
.mapNotNull { it as? ObjectLayer }
|
||||||
.map { generateLayerClass(asset, map, it, runner) }
|
.forEach { generateLayerClass(project.buildGeneratedCodeDirectory, asset, map, it, runner) }
|
||||||
.forEach { it.writeTo(project.buildGeneratedCodeDirectory) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun generateLayerClass(asset: GameMapAsset, map: GameMap, layer: ObjectLayer, runner: ClassName): JavaFile {
|
private fun generateLayerClass(
|
||||||
|
directory: File,
|
||||||
|
asset: GameMapAsset,
|
||||||
|
map: GameMap,
|
||||||
|
layer: ObjectLayer,
|
||||||
|
runner: ClassName
|
||||||
|
) {
|
||||||
val packageName = "com.bartlomiejpluta.base.generated.map"
|
val packageName = "com.bartlomiejpluta.base.generated.map"
|
||||||
val className = ClassName.get(
|
val className = ClassName.get(
|
||||||
packageName,
|
packageName,
|
||||||
@@ -93,9 +99,30 @@ class MapObjectsCodeGenerator : CodeGenerator {
|
|||||||
generatedClass
|
generatedClass
|
||||||
.addMethod(runMethod.build())
|
.addMethod(runMethod.build())
|
||||||
|
|
||||||
return JavaFile
|
val javaFile = JavaFile
|
||||||
.builder(packageName, generatedClass.build())
|
.builder(packageName, generatedClass.build())
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
|
val rawSource = javaFile.toString()
|
||||||
|
val path = javaFile.toJavaFileObject().toUri().path
|
||||||
|
val file = File(directory, path)
|
||||||
|
file.parentFile.mkdirs()
|
||||||
|
file.printWriter().apply {
|
||||||
|
for (s in rawSource.lines()) {
|
||||||
|
println(s)
|
||||||
|
if (s.startsWith("package ")) {
|
||||||
|
println()
|
||||||
|
println("// User imports")
|
||||||
|
for (i in layer.javaImports.lines()) {
|
||||||
|
println(i)
|
||||||
|
}
|
||||||
|
println("// End of user imports")
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flush()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun className(canonical: String) = ClassName.get(
|
private fun className(canonical: String) = ClassName.get(
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
package com.bartlomiejpluta.base.editor.common.parameter.model
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.editor.code.model.Code
|
||||||
|
import com.bartlomiejpluta.base.editor.code.model.CodeScope
|
||||||
|
import com.bartlomiejpluta.base.editor.code.model.CodeType
|
||||||
|
import com.bartlomiejpluta.base.editor.code.view.editor.CodeSnippetFragment
|
||||||
|
import com.bartlomiejpluta.base.editor.code.viewmodel.CodeVM
|
||||||
|
import com.bartlomiejpluta.base.editor.file.model.DummyFileNode
|
||||||
|
import javafx.beans.property.SimpleObjectProperty
|
||||||
|
import javafx.scene.control.Button
|
||||||
|
import javafx.scene.control.Label
|
||||||
|
import javafx.scene.input.MouseButton
|
||||||
|
import javafx.scene.input.MouseEvent
|
||||||
|
import tornadofx.*
|
||||||
|
|
||||||
|
class CodeSnippetParameter(
|
||||||
|
key: String,
|
||||||
|
initialValue: String = "",
|
||||||
|
codeType: CodeType = CodeType.JAVA,
|
||||||
|
title: String = "Input code",
|
||||||
|
prompt: String = "Edit...",
|
||||||
|
editable: Boolean = true,
|
||||||
|
onCommit: (oldValue: String, newValue: String, submit: () -> Unit) -> Unit = { _, _, submit -> submit() }
|
||||||
|
) : Parameter<String>(key, initialValue, editable, false, onCommit) {
|
||||||
|
override val editorValueProperty = SimpleObjectProperty(initialValue)
|
||||||
|
|
||||||
|
override val editor = Label(prompt).apply {
|
||||||
|
addEventHandler(MouseEvent.MOUSE_CLICKED) {
|
||||||
|
if (it.button == MouseButton.PRIMARY) {
|
||||||
|
val scope = CodeScope(1, 1)
|
||||||
|
val code = Code(DummyFileNode(), codeType.toProperty(), editorValueProperty.value)
|
||||||
|
val vm = CodeVM(code)
|
||||||
|
setInScope(vm, scope)
|
||||||
|
|
||||||
|
find<CodeSnippetFragment>(scope).apply {
|
||||||
|
this.title = title
|
||||||
|
|
||||||
|
onComplete { code ->
|
||||||
|
editorValueProperty.value = code
|
||||||
|
commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
openModal(block = true)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
it.consume()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override val valueString = prompt
|
||||||
|
|
||||||
|
init {
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,12 +6,14 @@ import javafx.beans.property.SimpleStringProperty
|
|||||||
import tornadofx.asObservable
|
import tornadofx.asObservable
|
||||||
import tornadofx.getValue
|
import tornadofx.getValue
|
||||||
import tornadofx.setValue
|
import tornadofx.setValue
|
||||||
|
import tornadofx.toProperty
|
||||||
|
|
||||||
class ObjectLayer(
|
class ObjectLayer(
|
||||||
name: String,
|
name: String,
|
||||||
rows: Int,
|
rows: Int,
|
||||||
columns: Int,
|
columns: Int,
|
||||||
objects: List<MapObject> = mutableListOf(),
|
objects: List<MapObject> = mutableListOf(),
|
||||||
|
javaImports: String = "",
|
||||||
passageMap: Array<Array<PassageAbility>> = Array(rows) { Array(columns) { PassageAbility.ALLOW } }
|
passageMap: Array<Array<PassageAbility>> = Array(rows) { Array(columns) { PassageAbility.ALLOW } }
|
||||||
) : Layer {
|
) : Layer {
|
||||||
var passageMap = passageMap
|
var passageMap = passageMap
|
||||||
@@ -21,6 +23,9 @@ class ObjectLayer(
|
|||||||
|
|
||||||
override val nameProperty = SimpleStringProperty(name)
|
override val nameProperty = SimpleStringProperty(name)
|
||||||
|
|
||||||
|
val javaImportsProperty = javaImports.toProperty()
|
||||||
|
var javaImports by javaImportsProperty
|
||||||
|
|
||||||
override fun resize(rows: Int, columns: Int) {
|
override fun resize(rows: Int, columns: Int) {
|
||||||
passageMap = Array(rows) { row ->
|
passageMap = Array(rows) { row ->
|
||||||
Array(columns) { column ->
|
Array(columns) { column ->
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.bartlomiejpluta.base.editor.map.parameter.layer
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.editor.code.model.CodeType
|
||||||
|
import com.bartlomiejpluta.base.editor.common.parameter.model.CodeSnippetParameter
|
||||||
|
import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter
|
||||||
|
import com.bartlomiejpluta.base.editor.map.model.layer.ObjectLayer
|
||||||
|
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||||
|
import javafx.collections.ObservableList
|
||||||
|
import org.springframework.stereotype.Component
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class ObjectLayerParametersBinder : LayerParametersBinder<ObjectLayer> {
|
||||||
|
override fun bind(layer: ObjectLayer, parameters: ObservableList<Parameter<*>>, project: Project, onCommit: () -> Unit) {
|
||||||
|
val imports = CodeSnippetParameter("javaImports", layer.javaImports, CodeType.JAVA, "Provide Java imports") { _, _, submit ->
|
||||||
|
onCommit()
|
||||||
|
submit()
|
||||||
|
}
|
||||||
|
|
||||||
|
imports.bindBidirectional(layer.javaImportsProperty)
|
||||||
|
|
||||||
|
parameters.addAll(imports)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -121,7 +121,7 @@ class ProtobufMapDeserializer : MapDeserializer {
|
|||||||
MapObject(it.x, it.y, it.code)
|
MapObject(it.x, it.y, it.code)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ObjectLayer(proto.name, rows, columns, objects, passageMap)
|
return ObjectLayer(proto.name, rows, columns, objects, proto.objectLayer.javaImports, passageMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun deserializeColorLayer(proto: GameMapProto.Layer): Layer {
|
private fun deserializeColorLayer(proto: GameMapProto.Layer): Layer {
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ class ProtobufMapSerializer : MapSerializer {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.setJavaImports(layer.javaImports)
|
||||||
.build()
|
.build()
|
||||||
.let { GameMapProto.Layer.newBuilder().setName(layer.name).setObjectLayer(it).build() }
|
.let { GameMapProto.Layer.newBuilder().setName(layer.name).setObjectLayer(it).build() }
|
||||||
|
|
||||||
|
|||||||
@@ -3,14 +3,8 @@ package com.bartlomiejpluta.base.editor.map.view.editor
|
|||||||
import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter
|
import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter
|
||||||
import com.bartlomiejpluta.base.editor.common.parameter.view.ParametersTableFragment
|
import com.bartlomiejpluta.base.editor.common.parameter.view.ParametersTableFragment
|
||||||
import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent
|
import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent
|
||||||
import com.bartlomiejpluta.base.editor.map.model.layer.AutoTileLayer
|
import com.bartlomiejpluta.base.editor.map.model.layer.*
|
||||||
import com.bartlomiejpluta.base.editor.map.model.layer.ColorLayer
|
import com.bartlomiejpluta.base.editor.map.parameter.layer.*
|
||||||
import com.bartlomiejpluta.base.editor.map.model.layer.ImageLayer
|
|
||||||
import com.bartlomiejpluta.base.editor.map.model.layer.TileLayer
|
|
||||||
import com.bartlomiejpluta.base.editor.map.parameter.layer.AutoTileLayerParametersBinder
|
|
||||||
import com.bartlomiejpluta.base.editor.map.parameter.layer.ColorLayerParametersBinder
|
|
||||||
import com.bartlomiejpluta.base.editor.map.parameter.layer.ImageLayerParametersBinder
|
|
||||||
import com.bartlomiejpluta.base.editor.map.parameter.layer.TileLayerParametersBinder
|
|
||||||
import com.bartlomiejpluta.base.editor.map.viewmodel.EditorStateVM
|
import com.bartlomiejpluta.base.editor.map.viewmodel.EditorStateVM
|
||||||
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
|
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
|
||||||
import tornadofx.View
|
import tornadofx.View
|
||||||
@@ -26,6 +20,7 @@ class MapLayerParameters : View() {
|
|||||||
private val imageLayerParametersBinder: ImageLayerParametersBinder by di()
|
private val imageLayerParametersBinder: ImageLayerParametersBinder by di()
|
||||||
private val tileLayerParametersBinder: TileLayerParametersBinder by di()
|
private val tileLayerParametersBinder: TileLayerParametersBinder by di()
|
||||||
private val autoTileLayerParametersBinder: AutoTileLayerParametersBinder by di()
|
private val autoTileLayerParametersBinder: AutoTileLayerParametersBinder by di()
|
||||||
|
private val objectLayerParametersBinder: ObjectLayerParametersBinder by di()
|
||||||
|
|
||||||
private val parameters = observableListOf<Parameter<*>>()
|
private val parameters = observableListOf<Parameter<*>>()
|
||||||
|
|
||||||
@@ -50,6 +45,10 @@ class MapLayerParameters : View() {
|
|||||||
is ImageLayer -> imageLayerParametersBinder.bind(layer, parameters, projectContext.project!!) {
|
is ImageLayer -> imageLayerParametersBinder.bind(layer, parameters, projectContext.project!!) {
|
||||||
fire(RedrawMapRequestEvent)
|
fire(RedrawMapRequestEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is ObjectLayer -> objectLayerParametersBinder.bind(layer, parameters, projectContext.project!!) {
|
||||||
|
fire(RedrawMapRequestEvent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user