[Editor] Enable attaching maps to project

This commit is contained in:
2021-02-11 08:47:18 +01:00
parent e60060a217
commit f914bfcb31
16 changed files with 67 additions and 47 deletions

View File

@@ -26,7 +26,7 @@ class MainController : Controller() {
setInScope(vm)
val modal = find<ProjectSettingsFragment>().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<MapCreationWizard>(scope).apply {
onComplete {
openMaps[scope] = vm.item.build()
vm.item.build().let { map ->
projectContext.attachMap(map)
openMaps[scope] = map
}
}
openModal(block = true)
}
}

View File

@@ -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<Layer>()
val nameProperty = SimpleStringProperty()

View File

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

View File

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

View File

@@ -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<Project?>() as ObjectProperty<Project?>
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) }
}
}

View File

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

View File

@@ -11,4 +11,6 @@ class Project {
val sourceDirectoryProperty = SimpleObjectProperty<File>()
val sourceDirectory by sourceDirectoryProperty
val maps = observableListOf<String>()
}

View File

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

View File

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

View File

@@ -9,4 +9,6 @@ class ProjectVM(project: Project) : ItemViewModel<Project>(project) {
val sourceDirectoryProperty = bind(Project::sourceDirectoryProperty)
val sourceDirectory by sourceDirectoryProperty
val maps = bind(Project::maps)
}

View File

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

View File

@@ -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<UIDTarget, Set<String>>()
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<String>) {
TODO("Not yet implemented")
}
}

View File

@@ -1,5 +0,0 @@
package com.bartlomiejpluta.base.editor.resource.uid.model
enum class UIDTarget {
MAP
}

View File

@@ -0,0 +1,15 @@
package com.bartlomiejpluta.base.editor.util.uid
import java.util.*
object UID {
fun next(sequence: List<String>): String {
var uid: String
do {
uid = UUID.randomUUID().toString()
} while(uid in sequence)
return uid
}
}