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 0f49c72d..8a1daad0 100755 --- 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 @@ -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() val openMaps = observableMapOf() @@ -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) } + } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainMenuView.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainMenuView.kt index b624f2a9..daf7d569 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainMenuView.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainMenuView.kt @@ -22,6 +22,14 @@ class MainMenuView : View() { } } } + + menu("Open") { + item("Project...") { + action { + mainController.loadProject() + } + } + } } menu("Edit") { 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 b8e915af..12d411a8 100755 --- 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 @@ -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) } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/manager/DefaultProjectManager.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/manager/DefaultProjectManager.kt new file mode 100755 index 00000000..50a82c43 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/manager/DefaultProjectManager.kt @@ -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 } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/manager/ProjectManager.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/manager/ProjectManager.kt new file mode 100755 index 00000000..6c6cc8a8 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/manager/ProjectManager.kt @@ -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 +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectDeserializer.kt new file mode 100755 index 00000000..85f17115 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectDeserializer.kt @@ -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 \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectSerializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectSerializer.kt new file mode 100755 index 00000000..82a0f2a5 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProjectSerializer.kt @@ -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 \ No newline at end of file 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 new file mode 100755 index 00000000..70c4ed51 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt @@ -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 + } +} \ No newline at end of file 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 new file mode 100755 index 00000000..d351731b --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectSerializer.kt @@ -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) + } +} \ No newline at end of file diff --git a/proto/src/main/proto/project.proto b/proto/src/main/proto/project.proto new file mode 100755 index 00000000..eff1bd92 --- /dev/null +++ b/proto/src/main/proto/project.proto @@ -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; +} \ No newline at end of file