[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.model.map.GameMap
|
||||||
import com.bartlomiejpluta.base.editor.map.view.MapSettingsFragment
|
import com.bartlomiejpluta.base.editor.map.view.MapSettingsFragment
|
||||||
import com.bartlomiejpluta.base.editor.map.viewmodel.GameMapVM
|
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.model.Project
|
||||||
import com.bartlomiejpluta.base.editor.project.view.ProjectSettingsFragment
|
import com.bartlomiejpluta.base.editor.project.view.ProjectSettingsFragment
|
||||||
import com.bartlomiejpluta.base.editor.project.viewmodel.ProjectVM
|
import com.bartlomiejpluta.base.editor.project.viewmodel.ProjectVM
|
||||||
import com.bartlomiejpluta.base.editor.tileset.model.TileSet
|
import com.bartlomiejpluta.base.editor.tileset.model.TileSet
|
||||||
import javafx.beans.property.SimpleObjectProperty
|
import javafx.beans.property.SimpleObjectProperty
|
||||||
|
import javafx.stage.FileChooser
|
||||||
import org.springframework.stereotype.Component
|
import org.springframework.stereotype.Component
|
||||||
import tornadofx.Controller
|
import tornadofx.*
|
||||||
import tornadofx.Scope
|
|
||||||
import tornadofx.find
|
|
||||||
import tornadofx.observableMapOf
|
|
||||||
import kotlin.collections.set
|
import kotlin.collections.set
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
class MainController : Controller() {
|
class MainController : Controller() {
|
||||||
// In the future it'll be pulled from TileSetService or something like that
|
// 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 tileset = TileSet(resources.image("/textures/tileset.png"), 160, 8)
|
||||||
|
private val projectManager: ProjectManager by di()
|
||||||
|
|
||||||
val openProject = SimpleObjectProperty<Project?>()
|
val openProject = SimpleObjectProperty<Project?>()
|
||||||
val openMaps = observableMapOf<Scope, GameMap>()
|
val openMaps = observableMapOf<Scope, GameMap>()
|
||||||
@@ -33,6 +33,7 @@ class MainController : Controller() {
|
|||||||
|
|
||||||
if(modal.result) {
|
if(modal.result) {
|
||||||
openProject.value = project
|
openProject.value = project
|
||||||
|
projectManager.saveProject(project)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,4 +49,11 @@ class MainController : Controller() {
|
|||||||
openMaps[scope] = map
|
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") {
|
menu("Edit") {
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ import java.io.OutputStream
|
|||||||
@Component
|
@Component
|
||||||
class ProtobufMapSerializer : MapSerializer {
|
class ProtobufMapSerializer : MapSerializer {
|
||||||
|
|
||||||
override fun serialize(map: GameMap, output: OutputStream) {
|
override fun serialize(item: GameMap, output: OutputStream) {
|
||||||
val protoMap = GameMapProto.GameMap.newBuilder()
|
val protoMap = GameMapProto.GameMap.newBuilder()
|
||||||
protoMap.name = map.name
|
protoMap.name = item.name
|
||||||
protoMap.rows = map.rows
|
protoMap.rows = item.rows
|
||||||
protoMap.columns = map.columns
|
protoMap.columns = item.columns
|
||||||
|
|
||||||
map.layers.forEach { layer -> protoMap.addLayers(serializeLayer(layer)) }
|
item.layers.forEach { layer -> protoMap.addLayers(serializeLayer(layer)) }
|
||||||
|
|
||||||
protoMap.build().writeTo(output)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
8
proto/src/main/proto/project.proto
Executable file
8
proto/src/main/proto/project.proto
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
package com.bartlomiejpluta.base.proto;
|
||||||
|
|
||||||
|
option java_package = "com.bartlomiejpluta.base.proto";
|
||||||
|
option java_outer_classname = "ProjectProto";
|
||||||
|
|
||||||
|
message Project {
|
||||||
|
required string name = 1;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user