[Editor] Add support for object layer Java imports #2

This commit is contained in:
2022-08-30 19:13:44 +02:00
parent 42fb0a3a0f
commit b5b423b278
7 changed files with 125 additions and 13 deletions

View File

@@ -11,6 +11,7 @@ import com.bartlomiejpluta.base.internal.map.MapInitializer
import com.squareup.javapoet.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
import java.io.File
import java.lang.String.format
import java.time.Instant
import java.time.format.DateTimeFormatter
@@ -38,11 +39,16 @@ class MapObjectsCodeGenerator : CodeGenerator {
map.layers
.mapNotNull { it as? ObjectLayer }
.map { generateLayerClass(asset, map, it, runner) }
.forEach { it.writeTo(project.buildGeneratedCodeDirectory) }
.forEach { generateLayerClass(project.buildGeneratedCodeDirectory, asset, map, it, runner) }
}
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 className = ClassName.get(
packageName,
@@ -93,9 +99,30 @@ class MapObjectsCodeGenerator : CodeGenerator {
generatedClass
.addMethod(runMethod.build())
return JavaFile
val javaFile = JavaFile
.builder(packageName, generatedClass.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(

View File

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

View File

@@ -6,12 +6,14 @@ import javafx.beans.property.SimpleStringProperty
import tornadofx.asObservable
import tornadofx.getValue
import tornadofx.setValue
import tornadofx.toProperty
class ObjectLayer(
name: String,
rows: Int,
columns: Int,
objects: List<MapObject> = mutableListOf(),
javaImports: String = "",
passageMap: Array<Array<PassageAbility>> = Array(rows) { Array(columns) { PassageAbility.ALLOW } }
) : Layer {
var passageMap = passageMap
@@ -21,6 +23,9 @@ class ObjectLayer(
override val nameProperty = SimpleStringProperty(name)
val javaImportsProperty = javaImports.toProperty()
var javaImports by javaImportsProperty
override fun resize(rows: Int, columns: Int) {
passageMap = Array(rows) { row ->
Array(columns) { column ->

View File

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

View File

@@ -121,7 +121,7 @@ class ProtobufMapDeserializer : MapDeserializer {
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 {

View File

@@ -60,6 +60,7 @@ class ProtobufMapSerializer : MapSerializer {
})
}
}
.setJavaImports(layer.javaImports)
.build()
.let { GameMapProto.Layer.newBuilder().setName(layer.name).setObjectLayer(it).build() }

View File

@@ -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.view.ParametersTableFragment
import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent
import com.bartlomiejpluta.base.editor.map.model.layer.AutoTileLayer
import com.bartlomiejpluta.base.editor.map.model.layer.ColorLayer
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.model.layer.*
import com.bartlomiejpluta.base.editor.map.parameter.layer.*
import com.bartlomiejpluta.base.editor.map.viewmodel.EditorStateVM
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import tornadofx.View
@@ -26,6 +20,7 @@ class MapLayerParameters : View() {
private val imageLayerParametersBinder: ImageLayerParametersBinder by di()
private val tileLayerParametersBinder: TileLayerParametersBinder by di()
private val autoTileLayerParametersBinder: AutoTileLayerParametersBinder by di()
private val objectLayerParametersBinder: ObjectLayerParametersBinder by di()
private val parameters = observableListOf<Parameter<*>>()
@@ -50,6 +45,10 @@ class MapLayerParameters : View() {
is ImageLayer -> imageLayerParametersBinder.bind(layer, parameters, projectContext.project!!) {
fire(RedrawMapRequestEvent)
}
is ObjectLayer -> objectLayerParametersBinder.bind(layer, parameters, projectContext.project!!) {
fire(RedrawMapRequestEvent)
}
}
}
}