[Editor] Create Project Context object which holds current project model
This commit is contained in:
@@ -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) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
@@ -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 }
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user