[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.model.map.GameMap
import com.bartlomiejpluta.base.editor.map.view.wizard.MapCreationWizard import com.bartlomiejpluta.base.editor.map.view.wizard.MapCreationWizard
import com.bartlomiejpluta.base.editor.map.viewmodel.GameMapBuilderVM 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.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 javafx.beans.property.SimpleObjectProperty
import javafx.stage.FileChooser import javafx.stage.FileChooser
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import tornadofx.* import tornadofx.*
@@ -16,9 +15,8 @@ import kotlin.collections.set
@Component @Component
class MainController : Controller() { class MainController : Controller() {
private val projectManager: ProjectManager by di() private val projectContext: ProjectContext by di()
val openProject = SimpleObjectProperty<Project?>()
val openMaps = observableMapOf<Scope, GameMap>() val openMaps = observableMapOf<Scope, GameMap>()
fun createEmptyProject() { fun createEmptyProject() {
@@ -29,8 +27,8 @@ class MainController : Controller() {
val modal = find<ProjectSettingsFragment>().apply { openModal(block = true, resizable = false) } val modal = find<ProjectSettingsFragment>().apply { openModal(block = true, resizable = false) }
if(modal.result) { if(modal.result) {
openProject.value = project projectContext.project = project
projectManager.saveProject(project) projectContext.save()
} }
} }
@@ -52,6 +50,6 @@ class MainController : Controller() {
chooseFile( chooseFile(
title = "Load Project", title = "Load Project",
filters = arrayOf(FileChooser.ExtensionFilter("BASE Editor Project (*.bep)", "*.bep")), 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 package com.bartlomiejpluta.base.editor.main.view
import com.bartlomiejpluta.base.editor.main.controller.MainController import com.bartlomiejpluta.base.editor.main.controller.MainController
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import tornadofx.* import tornadofx.*
class MainMenuView : View() { class MainMenuView : View() {
private val mainController: MainController by di() private val mainController: MainController by di()
private val projectContext: ProjectContext by di()
override val root = menubar { override val root = menubar {
menu("File") { menu("File") {
@@ -16,7 +18,7 @@ class MainMenuView : View() {
} }
item("Map...") { item("Map...") {
enableWhen(mainController.openProject.isNotNull) enableWhen(projectContext.projectProperty.isNotNull)
action { action {
mainController.createEmptyMap() 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.main.controller.MainController
import com.bartlomiejpluta.base.editor.map.view.editor.MapFragment import com.bartlomiejpluta.base.editor.map.view.editor.MapFragment
import com.bartlomiejpluta.base.editor.map.viewmodel.GameMapVM import com.bartlomiejpluta.base.editor.map.viewmodel.GameMapVM
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import javafx.scene.control.Tab import javafx.scene.control.Tab
import tornadofx.* import tornadofx.*
class MainView : View("BASE Game Editor") { class MainView : View("BASE Game Editor") {
private val mainController: MainController by di() private val mainController: MainController by di()
private val projectContext: ProjectContext by di()
private val mainMenuView = find<MainMenuView>() private val mainMenuView = find<MainMenuView>()
init { init {
mainController.openProject.addListener { _, _, project -> projectContext.projectProperty.addListener { _, _, project ->
val projectName = project?.let { " :: ${it.name} (${it.sourceDirectory.absolutePath})" } ?: "" val projectName = project?.let { " :: ${it.name} (${it.sourceDirectory.absolutePath})" } ?: ""
title = "BASE Game Editor$projectName" 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
}