diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt index 72e25ad5..40dd3bab 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt @@ -26,7 +26,7 @@ class MainController : Controller() { setInScope(vm) val modal = find().apply { openModal(block = true, resizable = false) } - if(modal.result) { + if (modal.result) { projectContext.project = project projectContext.save() } @@ -39,9 +39,12 @@ class MainController : Controller() { find(scope).apply { onComplete { - openMaps[scope] = vm.item.build() + vm.item.build().let { map -> + projectContext.attachMap(map) + openMaps[scope] = map + } } - + openModal(block = true) } } 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 59618e0a..b40cf851 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 @@ -2,6 +2,7 @@ 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.ReadOnlyStringWrapper import javafx.beans.property.SimpleDoubleProperty import javafx.beans.property.SimpleIntegerProperty import javafx.beans.property.SimpleStringProperty @@ -11,6 +12,9 @@ import tornadofx.setValue class GameMap(val tileSet: TileSet) { + val uidProperty = SimpleStringProperty() + var uid by uidProperty + val layers = observableListOf() val nameProperty = SimpleStringProperty() 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 4f267f37..9ff0a46a 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 @@ -18,6 +18,7 @@ class ProtobufMapDeserializer : MapDeserializer { override fun deserialize(input: InputStream): GameMap { val map = GameMap(tileset) val proto = GameMapProto.GameMap.parseFrom(input) + map.uid = proto.uid map.name = proto.name map.rows = proto.rows map.columns = proto.columns 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 a08a89c4..c11fb1ea 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 @@ -12,6 +12,7 @@ class ProtobufMapSerializer : MapSerializer { override fun serialize(item: GameMap, output: OutputStream) { val protoMap = GameMapProto.GameMap.newBuilder() + protoMap.uid = item.uid protoMap.name = item.name protoMap.rows = item.rows protoMap.columns = item.columns diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt index 637fc6de..dd7fcb9c 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt @@ -1,8 +1,11 @@ package com.bartlomiejpluta.base.editor.project.context +import com.bartlomiejpluta.base.editor.map.model.map.GameMap +import com.bartlomiejpluta.base.editor.map.serial.MapSerializer import com.bartlomiejpluta.base.editor.project.model.Project import com.bartlomiejpluta.base.editor.project.serial.ProjectDeserializer import com.bartlomiejpluta.base.editor.project.serial.ProjectSerializer +import com.bartlomiejpluta.base.editor.util.uid.UID import javafx.beans.property.ObjectProperty import javafx.beans.property.SimpleObjectProperty import org.springframework.beans.factory.annotation.Autowired @@ -14,7 +17,7 @@ import java.io.FileInputStream import java.io.FileOutputStream @Component -class DefaultProjectContext: ProjectContext { +class DefaultProjectContext : ProjectContext { @Autowired private lateinit var projectSerializer: ProjectSerializer @@ -22,6 +25,9 @@ class DefaultProjectContext: ProjectContext { @Autowired private lateinit var projectDeserializer: ProjectDeserializer + @Autowired + private lateinit var mapSerializer: MapSerializer + override val projectProperty = SimpleObjectProperty() as ObjectProperty override var project by projectProperty @@ -41,4 +47,22 @@ class DefaultProjectContext: ProjectContext { .apply { sourceDirectoryProperty.value = file.parentFile } .let { project = it } } + + override fun attachMap(map: GameMap) { + project?.let { + UID.next(it.maps).let { uid -> + map.uid = uid + it.maps += uid + } + + saveMap(it, map) + save() + } + } + + private fun saveMap(project: Project, map: GameMap) { + val dir = File(project.sourceDirectory, "maps") + dir.mkdirs() + File(dir, "${map.uid}.dat").outputStream().use { mapSerializer.serialize(map, it) } + } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt index 89ea1cce..d3d4271d 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt @@ -1,5 +1,6 @@ package com.bartlomiejpluta.base.editor.project.context +import com.bartlomiejpluta.base.editor.map.model.map.GameMap import com.bartlomiejpluta.base.editor.project.model.Project import javafx.beans.property.ObjectProperty import java.io.File @@ -10,4 +11,6 @@ interface ProjectContext { fun save() fun open(file: File) + + fun attachMap(map: GameMap) } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt index 4dadc9fe..c1f6dcec 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/model/Project.kt @@ -11,4 +11,6 @@ class Project { val sourceDirectoryProperty = SimpleObjectProperty() val sourceDirectory by sourceDirectoryProperty + + val maps = observableListOf() } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt index 739b8a1e..9705683a 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt @@ -12,6 +12,7 @@ class ProtobufProjectDeserializer : ProjectDeserializer { val proto = ProjectProto.Project.parseFrom(input) val project = Project() project.name = proto.name + project.maps.addAll(proto.mapsList) return project } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectSerializer.kt index 7bc1ad73..be14086b 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectSerializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectSerializer.kt @@ -11,6 +11,7 @@ class ProtobufProjectSerializer : ProjectSerializer { override fun serialize(item: Project, output: OutputStream) { val proto = ProjectProto.Project.newBuilder() proto.name = item.name + proto.addAllMaps(item.maps) proto.build().writeTo(output) } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/viewmodel/ProjectVM.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/viewmodel/ProjectVM.kt index 51409011..972e099c 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/viewmodel/ProjectVM.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/viewmodel/ProjectVM.kt @@ -9,4 +9,6 @@ class ProjectVM(project: Project) : ItemViewModel(project) { val sourceDirectoryProperty = bind(Project::sourceDirectoryProperty) val sourceDirectory by sourceDirectoryProperty + + val maps = bind(Project::maps) } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/resource/uid/manager/UIDManager.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/resource/uid/manager/UIDManager.kt deleted file mode 100644 index ea4f0995..00000000 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/resource/uid/manager/UIDManager.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.bartlomiejpluta.base.editor.resource.uid.manager - -import com.bartlomiejpluta.base.editor.resource.uid.model.UIDTarget - -interface UIDManager { - fun nextUID(target: UIDTarget): String - fun loadData(target: UIDTarget, uids: Set) -} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/resource/uid/manager/UUIDBasedUIDManager.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/resource/uid/manager/UUIDBasedUIDManager.kt deleted file mode 100644 index a812b9cf..00000000 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/resource/uid/manager/UUIDBasedUIDManager.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.bartlomiejpluta.base.editor.resource.uid.manager - -import com.bartlomiejpluta.base.editor.resource.uid.model.UIDTarget -import org.springframework.stereotype.Component -import java.util.* - -@Component -class UUIDBasedUIDManager : UIDManager { - private val registry = mutableMapOf>() - - override fun nextUID(target: UIDTarget): String { - val set = registry.putIfAbsent(target, mutableSetOf())!! - - var uid = "" - - do { - uid = UUID.randomUUID().toString() - } while (uid !in set) - - return uid - } - - override fun loadData(target: UIDTarget, uids: Set) { - TODO("Not yet implemented") - } -} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/resource/uid/model/UIDTarget.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/resource/uid/model/UIDTarget.kt deleted file mode 100644 index b80b5c3c..00000000 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/resource/uid/model/UIDTarget.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.bartlomiejpluta.base.editor.resource.uid.model - -enum class UIDTarget { - MAP -} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/util/uid/UID.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/util/uid/UID.kt new file mode 100644 index 00000000..c1af6c65 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/util/uid/UID.kt @@ -0,0 +1,15 @@ +package com.bartlomiejpluta.base.editor.util.uid + +import java.util.* + +object UID { + fun next(sequence: List): String { + var uid: String + + do { + uid = UUID.randomUUID().toString() + } while(uid in sequence) + + return uid + } +} \ No newline at end of file diff --git a/proto/src/main/proto/map.proto b/proto/src/main/proto/map.proto index d87cbfe2..3eaa50dc 100644 --- a/proto/src/main/proto/map.proto +++ b/proto/src/main/proto/map.proto @@ -4,10 +4,11 @@ option java_package = "com.bartlomiejpluta.base.proto"; option java_outer_classname = "GameMapProto"; message GameMap { - required string name = 1; - required uint32 rows = 2; - required uint32 columns = 3; - repeated Layer layers = 4; + required string uid = 1; + required string name = 2; + required uint32 rows = 3; + required uint32 columns = 4; + repeated Layer layers = 5; } message Layer { diff --git a/proto/src/main/proto/project.proto b/proto/src/main/proto/project.proto index 897da3ce..7beab0d3 100644 --- a/proto/src/main/proto/project.proto +++ b/proto/src/main/proto/project.proto @@ -5,4 +5,5 @@ option java_outer_classname = "ProjectProto"; message Project { required string name = 1; + repeated string maps = 2; } \ No newline at end of file