diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/MapObjectsCodeGenerator.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/MapObjectsCodeGenerator.kt index ea1fc137..bde8a754 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/MapObjectsCodeGenerator.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/MapObjectsCodeGenerator.kt @@ -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( diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/CodeSnippetParameter.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/CodeSnippetParameter.kt new file mode 100644 index 00000000..448439f3 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/CodeSnippetParameter.kt @@ -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(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(scope).apply { + this.title = title + + onComplete { code -> + editorValueProperty.value = code + commit() + } + + openModal(block = true) + } + + + it.consume() + } + } + } + + override val valueString = prompt + + init { + super.init() + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/layer/ObjectLayer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/layer/ObjectLayer.kt index 65912695..3250d1b1 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/layer/ObjectLayer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/layer/ObjectLayer.kt @@ -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 = mutableListOf(), + javaImports: String = "", passageMap: Array> = 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 -> diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/ObjectLayerParametersBinder.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/ObjectLayerParametersBinder.kt new file mode 100644 index 00000000..b7778a5f --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/ObjectLayerParametersBinder.kt @@ -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 { + override fun bind(layer: ObjectLayer, parameters: ObservableList>, 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) + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapDeserializer.kt index 18536b15..89abcd22 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapDeserializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapDeserializer.kt @@ -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 { diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapSerializer.kt index 5ebf3ece..50a92c6e 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapSerializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/serial/ProtobufMapSerializer.kt @@ -60,6 +60,7 @@ class ProtobufMapSerializer : MapSerializer { }) } } + .setJavaImports(layer.javaImports) .build() .let { GameMapProto.Layer.newBuilder().setName(layer.name).setObjectLayer(it).build() } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapLayerParameters.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapLayerParameters.kt index 6b0df79e..93986627 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapLayerParameters.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapLayerParameters.kt @@ -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>() @@ -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) + } } } }