From 4bc8999adff0882faa50506c63ca398eb8caf8f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 2 Nov 2023 15:58:07 +0100 Subject: [PATCH] [Editor] Make MapInitializer inherits from MapHandler --- .../generator/MapObjectsCodeGenerator.kt | 77 +++++++------------ .../editor/map/model/layer/ObjectLayer.kt | 5 -- .../base/editor/map/model/map/GameMap.kt | 5 +- .../layer/ObjectLayerParametersBinder.kt | 9 --- .../map/serial/ProtobufMapDeserializer.kt | 3 +- .../map/serial/ProtobufMapSerializer.kt | 2 +- .../editor/map/view/editor/MapParameters.kt | 5 +- .../base/editor/map/viewmodel/GameMapVM.kt | 3 + 8 files changed, 42 insertions(+), 67 deletions(-) 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 9aa14dd2..194fcb62 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 @@ -1,12 +1,9 @@ package com.bartlomiejpluta.base.editor.code.build.generator -import com.bartlomiejpluta.base.api.context.Context -import com.bartlomiejpluta.base.api.map.handler.MapHandler import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset import com.bartlomiejpluta.base.editor.map.model.layer.ObjectLayer import com.bartlomiejpluta.base.editor.map.model.map.GameMap import com.bartlomiejpluta.base.editor.project.context.ProjectContext -import com.bartlomiejpluta.base.editor.project.model.Project import com.bartlomiejpluta.base.internal.map.MapInitializer import com.squareup.javapoet.* import org.springframework.beans.factory.annotation.Autowired @@ -30,32 +27,15 @@ class MapObjectsCodeGenerator : CodeGenerator { projectContext.project?.let { project -> project.maps .map { it to projectContext.loadMap(it.uid) } - .forEach { generateMapObjects(it.first, it.second, project) } + .forEach { generateMapInitializer(project.buildGeneratedCodeDirectory, it.first, it.second) } } } - private fun generateMapObjects(asset: GameMapAsset, map: GameMap, project: Project) { - val runner = className(project.runner) - - map.layers.forEachIndexed { index, layer -> - if (layer is ObjectLayer) { - generateLayerClass(project.buildGeneratedCodeDirectory, asset, map, layer, index, runner) - } - } - } - - private fun generateLayerClass( - directory: File, - asset: GameMapAsset, - map: GameMap, - layer: ObjectLayer, - layerIndex: Int, - runner: ClassName - ) { + private fun generateMapInitializer(directory: File, asset: GameMapAsset, map: GameMap) { val packageName = "com.bartlomiejpluta.base.generated.map" val className = ClassName.get( packageName, - format("MapInitializer_%s\$\$Layer%d", map.uid.replace("-", "_"), map.layers.indexOf(layer)) + format("MapInitializer_%s", map.uid.replace("-", "_")) ) val annotation = AnnotationSpec.builder(Generated::class.java) @@ -64,44 +44,43 @@ class MapObjectsCodeGenerator : CodeGenerator { .addMember("comments", "\$S", "Initializer for map '${asset.name}' (UID: ${asset.uid})") .build() - val handler = className(map.handler) val generatedClass = TypeSpec.classBuilder(className) .addSuperinterface(MapInitializer::class.java) + .superclass(className(map.handler)) .addModifiers(Modifier.FINAL, Modifier.PUBLIC) .addAnnotation(annotation) - layer.objects.forEach { - MethodSpec.methodBuilder("_${it.x}x${it.y}") - .addModifiers(Modifier.PRIVATE, Modifier.FINAL) - .addParameter(Context::class.java, "context", Modifier.FINAL) - .addParameter(runner, "runner", Modifier.FINAL) - .addParameter(handler, "handler", Modifier.FINAL) - .addParameter(EngineGameMap::class.java, "map", Modifier.FINAL) - .addParameter(EngineObjectLayer::class.java, "layer", Modifier.FINAL) - .addParameter(TypeName.INT, "x", Modifier.FINAL) - .addParameter(TypeName.INT, "y", Modifier.FINAL) - .addParameter(MAP_PIN_TYPE, "here", Modifier.FINAL) - .addCode(it.code.replace("\$", "\$\$")) - .build() - .let(generatedClass::addMethod) + map.layers.forEachIndexed { index, layer -> + if (layer is ObjectLayer) { + layer.objects.forEach { + MethodSpec.methodBuilder("_layer${index}_${it.x}x${it.y}") + .addModifiers(Modifier.PRIVATE, Modifier.FINAL) + .addParameter(EngineGameMap::class.java, "map", Modifier.FINAL) + .addParameter(EngineObjectLayer::class.java, "layer", Modifier.FINAL) + .addParameter(TypeName.INT, "x", Modifier.FINAL) + .addParameter(TypeName.INT, "y", Modifier.FINAL) + .addParameter(MAP_PIN_TYPE, "here", Modifier.FINAL) + .addCode(it.code.replace("\$", "\$\$")) + .build() + .let(generatedClass::addMethod) + } + } } - val runMethod = MethodSpec.methodBuilder("run") + val initializeMethod = MethodSpec.methodBuilder("initialize") .addAnnotation(Override::class.java) .addModifiers(Modifier.PUBLIC, Modifier.FINAL) - .addParameter(Context::class.java, "context", Modifier.FINAL) - .addParameter(MapHandler::class.java, "handler", Modifier.FINAL) - .addParameter(EngineGameMap::class.java, "map", Modifier.FINAL) - .addParameter(EngineObjectLayer::class.java, "layer", Modifier.FINAL) - .addStatement("var customRunner = (\$T) context.getGameRunner()", runner) - .addStatement("var customHandler = (\$T) handler", handler) - layer.objects.forEach { - runMethod.addStatement("_${it.x}x${it.y}(context, customRunner, customHandler, map, layer, ${it.x}, ${it.y}, \$T.builder().map(\"${map.uid}\").layer($layerIndex).x(${it.x}).y(${it.y}).build())", MAP_PIN_TYPE) + map.layers.forEachIndexed { index, layer -> + if (layer is ObjectLayer) { + layer.objects.forEach { + initializeMethod.addStatement("_layer${index}_${it.x}x${it.y}(map, map.getObjectLayer(${index}), ${it.x}, ${it.y}, \$T.builder().map(\"${map.uid}\").layer($index).x(${it.x}).y(${it.y}).build())", MAP_PIN_TYPE) + } + } } generatedClass - .addMethod(runMethod.build()) + .addMethod(initializeMethod.build()) val javaFile = JavaFile .builder(packageName, generatedClass.build()) @@ -117,7 +96,7 @@ class MapObjectsCodeGenerator : CodeGenerator { if (s.startsWith("package ")) { println() println("// User imports") - for (i in layer.javaImports.lines()) { + for (i in map.javaImports.lines()) { println(i) } println("// End of user imports") 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 01af4611..1e0381c5 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 @@ -7,14 +7,12 @@ 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 } }, labels: List = mutableListOf() ) : Layer { @@ -27,9 +25,6 @@ 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/model/map/GameMap.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/map/GameMap.kt index 142ac7cb..0f5bcedd 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/map/GameMap.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/map/GameMap.kt @@ -1,13 +1,13 @@ package com.bartlomiejpluta.base.editor.map.model.map import com.bartlomiejpluta.base.editor.map.model.layer.Layer -import com.bartlomiejpluta.base.editor.tileset.model.TileSet import javafx.beans.property.SimpleDoubleProperty import javafx.beans.property.SimpleIntegerProperty import javafx.beans.property.SimpleStringProperty import javafx.collections.FXCollections import tornadofx.getValue import tornadofx.setValue +import tornadofx.toProperty class GameMap(val tileWidth: Double, val tileHeight: Double) { @@ -33,6 +33,9 @@ class GameMap(val tileWidth: Double, val tileHeight: Double) { val handlerProperty = SimpleStringProperty() var handler by handlerProperty + val javaImportsProperty = "".toProperty() + var javaImports by javaImportsProperty + init { rowsProperty.addListener { _, _, newValue -> val newRows = newValue.toInt() 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 index b7778a5f..21b3cda5 100644 --- 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 @@ -1,7 +1,5 @@ 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 @@ -11,13 +9,6 @@ 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 16ef5df4..9bcb926f 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 @@ -37,6 +37,7 @@ class ProtobufMapDeserializer : MapDeserializer { map.rows = proto.rows map.columns = proto.columns map.handler = proto.handler + map.javaImports = proto.javaImports proto.layersList .filter { it.hasTileLayer() || it.hasAutoTileLayer() || it.hasObjectLayer() || it.hasColorLayer() } @@ -126,7 +127,7 @@ class ProtobufMapDeserializer : MapDeserializer { MapLabel(it.x, it.y, it.label) } - return ObjectLayer(proto.name, rows, columns, objects, proto.objectLayer.javaImports, passageMap, labels) + return ObjectLayer(proto.name, rows, columns, objects, passageMap, labels) } 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 9e671764..c28b5de2 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 @@ -19,6 +19,7 @@ class ProtobufMapSerializer : MapSerializer { protoMap.tileWidth = item.tileWidth.toInt() protoMap.tileHeight = item.tileHeight.toInt() protoMap.handler = item.handler + protoMap.javaImports = item.javaImports item.layers.forEach { layer -> protoMap.addLayers(serializeLayer(layer)) } @@ -69,7 +70,6 @@ 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/MapParameters.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapParameters.kt index 8c76cb6b..bd207ff5 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapParameters.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapParameters.kt @@ -1,5 +1,7 @@ package com.bartlomiejpluta.base.editor.map.view.editor +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.IntegerParameter import com.bartlomiejpluta.base.editor.common.parameter.model.JavaClassParameter import com.bartlomiejpluta.base.editor.common.parameter.view.ParametersTableFragment @@ -13,7 +15,8 @@ class MapParameters : View() { private val parameters = observableListOf( IntegerParameter("rows", mapVM.rows, 1, 100).apply { bindBidirectional(mapVM.item.rowsProperty) }, IntegerParameter("columns", mapVM.columns, 1, 100).apply { bindBidirectional(mapVM.item.columnsProperty) }, - JavaClassParameter("handler", mapVM.handler).apply { bindBidirectional(mapVM.item.handlerProperty) } + JavaClassParameter("handler", mapVM.handler).apply { bindBidirectional(mapVM.item.handlerProperty) }, + CodeSnippetParameter("javaImports", mapVM.javaImports, CodeType.JAVA).apply { bindBidirectional(mapVM.item.javaImportsProperty) } ) override val root = find(ParametersTableFragment::parameters to parameters).root diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/viewmodel/GameMapVM.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/viewmodel/GameMapVM.kt index 8e2f8948..ffc57cdf 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/viewmodel/GameMapVM.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/viewmodel/GameMapVM.kt @@ -33,6 +33,9 @@ class GameMapVM(map: GameMap) : ItemViewModel(map) { val handlerProperty = bind(GameMap::handlerProperty) var handler by handlerProperty + + val javaImportsProperty = bind(GameMap::javaImportsProperty) + val javaImports by javaImportsProperty }