[Editor] Create scaffolding for code editor
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.bartlomiejpluta.base.editor.code.view
|
||||
|
||||
import tornadofx.Fragment
|
||||
import tornadofx.hbox
|
||||
|
||||
class CodeEditorFragment : Fragment() {
|
||||
|
||||
override val root = hbox {}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.bartlomiejpluta.base.editor.code.view
|
||||
|
||||
import tornadofx.View
|
||||
import tornadofx.hbox
|
||||
|
||||
class CodeEditorView : View() {
|
||||
|
||||
override val root = hbox {}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -24,7 +24,7 @@ import kotlin.collections.set
|
||||
class MainController : Controller() {
|
||||
private val projectContext: ProjectContext by di()
|
||||
|
||||
val openMaps = observableMapOf<Scope, GameMap>()
|
||||
val openItems = observableMapOf<Scope, Any>()
|
||||
|
||||
fun createEmptyProject() {
|
||||
val vm = ProjectVM(Project())
|
||||
@@ -32,7 +32,7 @@ class MainController : Controller() {
|
||||
setInScope(vm)
|
||||
find<ProjectSettingsFragment>().apply {
|
||||
onComplete {
|
||||
openMaps.clear()
|
||||
openItems.clear()
|
||||
projectContext.project = it
|
||||
projectContext.save()
|
||||
}
|
||||
@@ -54,7 +54,7 @@ class MainController : Controller() {
|
||||
columns = vm.columns
|
||||
}
|
||||
projectContext.importMap(vm.name, map)
|
||||
openMaps[scope] = map
|
||||
openItems[scope] = map
|
||||
}
|
||||
|
||||
openModal(block = true, resizable = false)
|
||||
@@ -66,19 +66,19 @@ class MainController : Controller() {
|
||||
title = "Load Project",
|
||||
filters = arrayOf(FileChooser.ExtensionFilter("BASE Editor Project (*.bep)", "*.bep")),
|
||||
).getOrNull(0)?.let {
|
||||
openMaps.clear()
|
||||
openItems.clear()
|
||||
projectContext.open(it)
|
||||
}
|
||||
}
|
||||
|
||||
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 vm = GameMapVM(map)
|
||||
val scope = UndoableScope()
|
||||
setInScope(vm, scope)
|
||||
|
||||
openMaps[scope] = map
|
||||
openItems[scope] = map
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,8 +112,8 @@ class MainController : Controller() {
|
||||
|
||||
fun closeAsset(asset: Asset) {
|
||||
when (asset) {
|
||||
is GameMapAsset -> openMaps.entries.firstOrNull { (_, map) -> map.uid == asset.uid }?.key?.let {
|
||||
openMaps.remove(it)
|
||||
is GameMapAsset -> openItems.entries.firstOrNull { (_, item) -> item is GameMap && item.uid == asset.uid }?.key?.let {
|
||||
openItems.remove(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
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.map.model.map.GameMap
|
||||
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.beans.InvalidationListener
|
||||
import javafx.beans.Observable
|
||||
import javafx.collections.MapChangeListener
|
||||
import javafx.scene.control.Tab
|
||||
import org.kordamp.ikonli.javafx.FontIcon
|
||||
import tornadofx.*
|
||||
|
||||
|
||||
@@ -29,21 +32,36 @@ class MainView : View("BASE Game Editor") {
|
||||
top = mainMenuView.root
|
||||
|
||||
center = tabpane {
|
||||
tabs.bind(mainController.openMaps) { scope, map ->
|
||||
Tab().apply {
|
||||
val vm = GameMapVM(map)
|
||||
setInScope(vm, scope)
|
||||
projectContext.project?.maps?.first { it.uid == map.uid }?.let { textProperty().bindBidirectional(it.nameProperty) }
|
||||
content = find<MapFragment>(scope).root
|
||||
setOnClosed { mainController.openMaps.remove(scope) }
|
||||
tabs.bind(mainController.openItems) { scope, item ->
|
||||
when (item) {
|
||||
is GameMap -> Tab().apply {
|
||||
val vm = GameMapVM(item)
|
||||
setInScope(vm, scope)
|
||||
projectContext.project?.maps?.first { it.uid == item.uid }
|
||||
?.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
|
||||
// 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.
|
||||
mainController.openMaps.addListener(MapChangeListener {
|
||||
if(it.map.isEmpty()) {
|
||||
mainController.openItems.addListener(MapChangeListener {
|
||||
if (it.map.isEmpty()) {
|
||||
tabs.clear()
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user