[Editor] Create Project Context object which holds current project model

This commit is contained in:
2021-02-10 22:07:27 +01:00
parent be1de6c68f
commit e60060a217
7 changed files with 68 additions and 50 deletions

View File

@@ -4,11 +4,10 @@ import com.bartlomiejpluta.base.editor.command.context.UndoableScope
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
import com.bartlomiejpluta.base.editor.map.view.wizard.MapCreationWizard
import com.bartlomiejpluta.base.editor.map.viewmodel.GameMapBuilderVM
import com.bartlomiejpluta.base.editor.project.manager.ProjectManager
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
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 javafx.beans.property.SimpleObjectProperty
import javafx.stage.FileChooser
import org.springframework.stereotype.Component
import tornadofx.*
@@ -16,9 +15,8 @@ import kotlin.collections.set
@Component
class MainController : Controller() {
private val projectManager: ProjectManager by di()
private val projectContext: ProjectContext by di()
val openProject = SimpleObjectProperty<Project?>()
val openMaps = observableMapOf<Scope, GameMap>()
fun createEmptyProject() {
@@ -29,8 +27,8 @@ class MainController : Controller() {
val modal = find<ProjectSettingsFragment>().apply { openModal(block = true, resizable = false) }
if(modal.result) {
openProject.value = project
projectManager.saveProject(project)
projectContext.project = project
projectContext.save()
}
}
@@ -52,6 +50,6 @@ class MainController : Controller() {
chooseFile(
title = "Load Project",
filters = arrayOf(FileChooser.ExtensionFilter("BASE Editor Project (*.bep)", "*.bep")),
).getOrNull(0)?.let { openProject.value = projectManager.openProject(it) }
).getOrNull(0)?.let { projectContext.open(it) }
}
}

View File

@@ -1,10 +1,12 @@
package com.bartlomiejpluta.base.editor.main.view
import com.bartlomiejpluta.base.editor.main.controller.MainController
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import tornadofx.*
class MainMenuView : View() {
private val mainController: MainController by di()
private val projectContext: ProjectContext by di()
override val root = menubar {
menu("File") {
@@ -16,7 +18,7 @@ class MainMenuView : View() {
}
item("Map...") {
enableWhen(mainController.openProject.isNotNull)
enableWhen(projectContext.projectProperty.isNotNull)
action {
mainController.createEmptyMap()
}

View File

@@ -3,17 +3,19 @@ package com.bartlomiejpluta.base.editor.main.view
import com.bartlomiejpluta.base.editor.main.controller.MainController
import com.bartlomiejpluta.base.editor.map.view.editor.MapFragment
import com.bartlomiejpluta.base.editor.map.viewmodel.GameMapVM
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import javafx.scene.control.Tab
import tornadofx.*
class MainView : View("BASE Game Editor") {
private val mainController: MainController by di()
private val projectContext: ProjectContext by di()
private val mainMenuView = find<MainMenuView>()
init {
mainController.openProject.addListener { _, _, project ->
projectContext.projectProperty.addListener { _, _, project ->
val projectName = project?.let { " :: ${it.name} (${it.sourceDirectory.absolutePath})" } ?: ""
title = "BASE Game Editor$projectName"
}

View File

@@ -0,0 +1,44 @@
package com.bartlomiejpluta.base.editor.project.context
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 javafx.beans.property.ObjectProperty
import javafx.beans.property.SimpleObjectProperty
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
import tornadofx.getValue
import tornadofx.setValue
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
@Component
class DefaultProjectContext: ProjectContext {
@Autowired
private lateinit var projectSerializer: ProjectSerializer
@Autowired
private lateinit var projectDeserializer: ProjectDeserializer
override val projectProperty = SimpleObjectProperty<Project?>() as ObjectProperty<Project?>
override var project by projectProperty
override fun save() {
project?.let {
it.sourceDirectory.mkdirs()
FileOutputStream(File(it.sourceDirectory, "project.bep")).use { fos ->
projectSerializer.serialize(it, fos)
}
}
}
override fun open(file: File) {
FileInputStream(file)
.use { projectDeserializer.deserialize(it) }
.apply { sourceDirectoryProperty.value = file.parentFile }
.let { project = it }
}
}

View File

@@ -0,0 +1,13 @@
package com.bartlomiejpluta.base.editor.project.context
import com.bartlomiejpluta.base.editor.project.model.Project
import javafx.beans.property.ObjectProperty
import java.io.File
interface ProjectContext {
val projectProperty: ObjectProperty<Project?>
var project: Project?
fun save()
fun open(file: File)
}

View File

@@ -1,32 +0,0 @@
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 }
}

View File

@@ -1,9 +0,0 @@
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
}