[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 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(
|
||||
|
||||
@@ -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.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 ->
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
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 {
|
||||
|
||||
@@ -60,6 +60,7 @@ class ProtobufMapSerializer : MapSerializer {
|
||||
})
|
||||
}
|
||||
}
|
||||
.setJavaImports(layer.javaImports)
|
||||
.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.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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user