[Editor] Create project structure panel scaffolding

This commit is contained in:
2021-02-11 19:36:53 +01:00
parent d6f44ff63c
commit eebda465b9
3 changed files with 90 additions and 0 deletions

View File

@@ -13,6 +13,7 @@ class MainView : View("BASE Game Editor") {
private val projectContext: ProjectContext by di()
private val mainMenuView = find<MainMenuView>()
private val projectStructureView = find<ProjectStructureView>()
init {
projectContext.projectProperty.addListener { _, _, project ->
@@ -35,5 +36,7 @@ class MainView : View("BASE Game Editor") {
}
}
}
left = projectStructureView.root
}
}

View File

@@ -0,0 +1,60 @@
package com.bartlomiejpluta.base.editor.main.view
import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import com.bartlomiejpluta.base.editor.util.fx.BindingUtil
import javafx.beans.property.SimpleStringProperty
import javafx.collections.ObservableList
import javafx.scene.control.TreeItem
import org.kordamp.ikonli.javafx.FontIcon
import tornadofx.*
class ProjectStructureView : View() {
private val projectContext: ProjectContext by di()
private val structureMaps = StructureCategory("Maps")
private val structureRoot = StructureCategory(name = "Project", items = observableListOf(structureMaps))
init {
projectContext.projectProperty.addListener { _, _, project ->
project?.let {
structureRoot.nameProperty.bind(it.nameProperty)
BindingUtil.bindMapValues(structureMaps.items, project.maps)
root.refresh()
}
}
}
override val root = treeview<Any> {
root = TreeItem(structureRoot)
cellFormat {
graphic = when(it) {
structureRoot -> FontIcon("fa-cog")
is StructureCategory -> FontIcon("fa-folder")
is GameMapAsset -> FontIcon("fa-map")
else -> null
}
text = when (it) {
is StructureCategory -> it.name
is GameMapAsset -> it.name
else -> throw IllegalStateException("Unsupported structure item type")
}
}
populate {
when (val value = it.value) {
is StructureCategory -> value.items
else -> null
}
}
}
private class StructureCategory(name: String = "", var items: ObservableList<out Any> = observableListOf()) {
val nameProperty = SimpleStringProperty(name)
val name by nameProperty
}
}

View File

@@ -0,0 +1,27 @@
package com.bartlomiejpluta.base.editor.util.fx
import javafx.beans.binding.Bindings
import javafx.collections.MapChangeListener
import javafx.collections.ObservableList
import javafx.collections.ObservableMap
import tornadofx.observableListOf
object BindingUtil {
fun <K, V> observableMapValues(map: ObservableMap<out K, out V>) = observableListOf<V>().apply {
addAll(map.values)
// FIXME:
// It's not really efficient way to track map updates by clearing all
// and putting it all over again, however it preserves the original map order.
// The efficiency should be sufficient for the project purposes (there are no any expectations
// to store a very large collections in here - if the need arose it should be immediately improved).
map.addListener(MapChangeListener {
clear()
addAll(map.values)
})
}
fun <K, V> bindMapValues(target: ObservableList<out V>, map: ObservableMap<out K, out V>) {
Bindings.bindContent(target, observableMapValues(map))
}
}