[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() {
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user