[Editor] Create scaffolding for code editor

This commit is contained in:
2021-02-22 22:45:05 +01:00
parent c707a84484
commit a261378a35
6 changed files with 76 additions and 19 deletions

View File

@@ -0,0 +1,10 @@
package com.bartlomiejpluta.base.editor.code.model
import tornadofx.getValue
import tornadofx.setValue
import tornadofx.toProperty
class Code(code: String) {
val codeProperty = code.toProperty()
var code by codeProperty
}

View File

@@ -0,0 +1,9 @@
package com.bartlomiejpluta.base.editor.code.view
import tornadofx.Fragment
import tornadofx.hbox
class CodeEditorFragment : Fragment() {
override val root = hbox {}
}

View File

@@ -0,0 +1,9 @@
package com.bartlomiejpluta.base.editor.code.view
import tornadofx.View
import tornadofx.hbox
class CodeEditorView : View() {
override val root = hbox {}
}

View File

@@ -0,0 +1,11 @@
package com.bartlomiejpluta.base.editor.code.viewmodel
import com.bartlomiejpluta.base.editor.code.model.Code
import tornadofx.ItemViewModel
import tornadofx.getValue
import tornadofx.setValue
class CodeVM(code: Code) : ItemViewModel<Code>(code) {
val codeProperty = bind(Code::codeProperty)
var code by codeProperty
}

View File

@@ -24,7 +24,7 @@ import kotlin.collections.set
class MainController : Controller() { class MainController : Controller() {
private val projectContext: ProjectContext by di() private val projectContext: ProjectContext by di()
val openMaps = observableMapOf<Scope, GameMap>() val openItems = observableMapOf<Scope, Any>()
fun createEmptyProject() { fun createEmptyProject() {
val vm = ProjectVM(Project()) val vm = ProjectVM(Project())
@@ -32,7 +32,7 @@ class MainController : Controller() {
setInScope(vm) setInScope(vm)
find<ProjectSettingsFragment>().apply { find<ProjectSettingsFragment>().apply {
onComplete { onComplete {
openMaps.clear() openItems.clear()
projectContext.project = it projectContext.project = it
projectContext.save() projectContext.save()
} }
@@ -54,7 +54,7 @@ class MainController : Controller() {
columns = vm.columns columns = vm.columns
} }
projectContext.importMap(vm.name, map) projectContext.importMap(vm.name, map)
openMaps[scope] = map openItems[scope] = map
} }
openModal(block = true, resizable = false) openModal(block = true, resizable = false)
@@ -66,19 +66,19 @@ class MainController : Controller() {
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 { ).getOrNull(0)?.let {
openMaps.clear() openItems.clear()
projectContext.open(it) projectContext.open(it)
} }
} }
fun openMap(uid: String) { fun openMap(uid: String) {
if (openMaps.count { (_, map) -> map.uid == uid } == 0) { if (openItems.count { (_, item) -> item is GameMap && item.uid == uid } == 0) {
val map = projectContext.loadMap(uid) val map = projectContext.loadMap(uid)
val vm = GameMapVM(map) val vm = GameMapVM(map)
val scope = UndoableScope() val scope = UndoableScope()
setInScope(vm, scope) setInScope(vm, scope)
openMaps[scope] = map openItems[scope] = map
} }
} }
@@ -112,8 +112,8 @@ class MainController : Controller() {
fun closeAsset(asset: Asset) { fun closeAsset(asset: Asset) {
when (asset) { when (asset) {
is GameMapAsset -> openMaps.entries.firstOrNull { (_, map) -> map.uid == asset.uid }?.key?.let { is GameMapAsset -> openItems.entries.firstOrNull { (_, item) -> item is GameMap && item.uid == asset.uid }?.key?.let {
openMaps.remove(it) openItems.remove(it)
} }
} }
} }

View File

@@ -1,13 +1,16 @@
package com.bartlomiejpluta.base.editor.main.view package com.bartlomiejpluta.base.editor.main.view
import com.bartlomiejpluta.base.editor.code.model.Code
import com.bartlomiejpluta.base.editor.code.view.CodeEditorFragment
import com.bartlomiejpluta.base.editor.code.viewmodel.CodeVM
import com.bartlomiejpluta.base.editor.main.controller.MainController import com.bartlomiejpluta.base.editor.main.controller.MainController
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
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 com.bartlomiejpluta.base.editor.project.context.ProjectContext
import javafx.beans.InvalidationListener
import javafx.beans.Observable
import javafx.collections.MapChangeListener import javafx.collections.MapChangeListener
import javafx.scene.control.Tab import javafx.scene.control.Tab
import org.kordamp.ikonli.javafx.FontIcon
import tornadofx.* import tornadofx.*
@@ -29,21 +32,36 @@ class MainView : View("BASE Game Editor") {
top = mainMenuView.root top = mainMenuView.root
center = tabpane { center = tabpane {
tabs.bind(mainController.openMaps) { scope, map -> tabs.bind(mainController.openItems) { scope, item ->
Tab().apply { when (item) {
val vm = GameMapVM(map) is GameMap -> Tab().apply {
setInScope(vm, scope) val vm = GameMapVM(item)
projectContext.project?.maps?.first { it.uid == map.uid }?.let { textProperty().bindBidirectional(it.nameProperty) } setInScope(vm, scope)
content = find<MapFragment>(scope).root projectContext.project?.maps?.first { it.uid == item.uid }
setOnClosed { mainController.openMaps.remove(scope) } ?.let { textProperty().bindBidirectional(it.nameProperty) }
content = find<MapFragment>(scope).root
graphic = FontIcon("fa-map")
setOnClosed { mainController.openItems.remove(scope) }
}
is Code -> Tab().apply {
val vm = CodeVM(item)
setInScope(vm, scope)
content = find<CodeEditorFragment>(scope).root
text = "Test.java"
graphic = FontIcon("fa-code")
setOnClosed { mainController.openItems.remove(scope) }
}
else -> throw IllegalStateException("Unsupported tab item")
} }
} }
// FIXME // FIXME
// For some reason cleaning mainController.openMaps just takes off the tabs content keeping open themselves. // For some reason cleaning mainController.openMaps just takes off the tabs content keeping open themselves.
// The workaround is to detect if map is cleaned and the clean the tabs by hand. // The workaround is to detect if map is cleaned and the clean the tabs by hand.
mainController.openMaps.addListener(MapChangeListener { mainController.openItems.addListener(MapChangeListener {
if(it.map.isEmpty()) { if (it.map.isEmpty()) {
tabs.clear() tabs.clear()
} }
}) })