[Editor] Enable basic project serialization/deserialization
This commit is contained in:
@@ -4,22 +4,22 @@ import com.bartlomiejpluta.base.editor.command.context.UndoableScope
|
||||
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
|
||||
import com.bartlomiejpluta.base.editor.map.view.MapSettingsFragment
|
||||
import com.bartlomiejpluta.base.editor.map.viewmodel.GameMapVM
|
||||
import com.bartlomiejpluta.base.editor.project.manager.ProjectManager
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
import com.bartlomiejpluta.base.editor.project.view.ProjectSettingsFragment
|
||||
import com.bartlomiejpluta.base.editor.project.viewmodel.ProjectVM
|
||||
import com.bartlomiejpluta.base.editor.tileset.model.TileSet
|
||||
import javafx.beans.property.SimpleObjectProperty
|
||||
import javafx.stage.FileChooser
|
||||
import org.springframework.stereotype.Component
|
||||
import tornadofx.Controller
|
||||
import tornadofx.Scope
|
||||
import tornadofx.find
|
||||
import tornadofx.observableMapOf
|
||||
import tornadofx.*
|
||||
import kotlin.collections.set
|
||||
|
||||
@Component
|
||||
class MainController : Controller() {
|
||||
// In the future it'll be pulled from TileSetService or something like that
|
||||
private val tileset = TileSet(resources.image("/textures/tileset.png"), 160, 8)
|
||||
private val projectManager: ProjectManager by di()
|
||||
|
||||
val openProject = SimpleObjectProperty<Project?>()
|
||||
val openMaps = observableMapOf<Scope, GameMap>()
|
||||
@@ -33,6 +33,7 @@ class MainController : Controller() {
|
||||
|
||||
if(modal.result) {
|
||||
openProject.value = project
|
||||
projectManager.saveProject(project)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,4 +49,11 @@ class MainController : Controller() {
|
||||
openMaps[scope] = map
|
||||
}
|
||||
}
|
||||
|
||||
fun loadProject() {
|
||||
chooseFile(
|
||||
title = "Load Project",
|
||||
filters = arrayOf(FileChooser.ExtensionFilter("BASE Editor Project (*.bep)", "*.bep")),
|
||||
).getOrNull(0)?.let { openProject.value = projectManager.openProject(it) }
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,14 @@ class MainMenuView : View() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
menu("Open") {
|
||||
item("Project...") {
|
||||
action {
|
||||
mainController.loadProject()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
menu("Edit") {
|
||||
|
||||
@@ -10,13 +10,13 @@ import java.io.OutputStream
|
||||
@Component
|
||||
class ProtobufMapSerializer : MapSerializer {
|
||||
|
||||
override fun serialize(map: GameMap, output: OutputStream) {
|
||||
override fun serialize(item: GameMap, output: OutputStream) {
|
||||
val protoMap = GameMapProto.GameMap.newBuilder()
|
||||
protoMap.name = map.name
|
||||
protoMap.rows = map.rows
|
||||
protoMap.columns = map.columns
|
||||
protoMap.name = item.name
|
||||
protoMap.rows = item.rows
|
||||
protoMap.columns = item.columns
|
||||
|
||||
map.layers.forEach { layer -> protoMap.addLayers(serializeLayer(layer)) }
|
||||
item.layers.forEach { layer -> protoMap.addLayers(serializeLayer(layer)) }
|
||||
|
||||
protoMap.build().writeTo(output)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.bartlomiejpluta.base.editor.project.manager
|
||||
|
||||
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 org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.stereotype.Component
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import java.io.FileOutputStream
|
||||
|
||||
@Component
|
||||
class DefaultProjectManager : ProjectManager {
|
||||
|
||||
@Autowired
|
||||
private lateinit var projectSerializer: ProjectSerializer
|
||||
|
||||
@Autowired
|
||||
private lateinit var projectDeserializer: ProjectDeserializer
|
||||
|
||||
override fun saveProject(project: Project) {
|
||||
project.sourceDirectory.mkdirs()
|
||||
|
||||
FileOutputStream(File(project.sourceDirectory, "project.bep")).use {
|
||||
projectSerializer.serialize(project, it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun openProject(file: File) = FileInputStream(file)
|
||||
.use { projectDeserializer.deserialize(it) }
|
||||
.apply { sourceDirectoryProperty.value = file.parentFile }
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.bartlomiejpluta.base.editor.project.manager
|
||||
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
import java.io.File
|
||||
|
||||
interface ProjectManager {
|
||||
fun saveProject(project: Project)
|
||||
fun openProject(file: File): Project
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.bartlomiejpluta.base.editor.project.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.common.serial.Deserializer
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
|
||||
interface ProjectDeserializer : Deserializer<Project>
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.bartlomiejpluta.base.editor.project.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.common.serial.Serializer
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
|
||||
interface ProjectSerializer : Serializer<Project>
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.bartlomiejpluta.base.editor.project.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
import com.bartlomiejpluta.base.proto.ProjectProto
|
||||
import org.springframework.stereotype.Component
|
||||
import java.io.InputStream
|
||||
|
||||
@Component
|
||||
class ProtobufProjectDeserializer : ProjectDeserializer {
|
||||
|
||||
override fun deserialize(input: InputStream): Project {
|
||||
val proto = ProjectProto.Project.parseFrom(input)
|
||||
val project = Project()
|
||||
project.name = proto.name
|
||||
|
||||
return project
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.bartlomiejpluta.base.editor.project.serial
|
||||
|
||||
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||
import com.bartlomiejpluta.base.proto.ProjectProto
|
||||
import org.springframework.stereotype.Component
|
||||
import java.io.OutputStream
|
||||
|
||||
@Component
|
||||
class ProtobufProjectSerializer : ProjectSerializer {
|
||||
|
||||
override fun serialize(item: Project, output: OutputStream) {
|
||||
val proto = ProjectProto.Project.newBuilder()
|
||||
proto.name = item.name
|
||||
proto.build().writeTo(output)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user