From 67caf5f6149c5399756f6a5db8e9eead90e61ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 25 Mar 2021 16:54:29 +0100 Subject: [PATCH] [Editor] Make MainController holds open items as ViewModels instead of Models themselves --- .../editor/main/controller/MainController.kt | 43 +++++++++---------- .../base/editor/main/view/MainView.kt | 20 +++------ .../base/editor/map/viewmodel/GameMapVM.kt | 3 ++ 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt index 125f7672..c0fe534c 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt @@ -5,7 +5,6 @@ import com.bartlomiejpluta.base.editor.animation.viewmodel.AnimationAssetDataVM import com.bartlomiejpluta.base.editor.asset.model.Asset import com.bartlomiejpluta.base.editor.audio.view.importing.ImportSoundFragment import com.bartlomiejpluta.base.editor.audio.viewmodel.SoundAssetDataVM -import com.bartlomiejpluta.base.editor.code.model.Code import com.bartlomiejpluta.base.editor.code.model.CodeScope import com.bartlomiejpluta.base.editor.code.viewmodel.CodeVM import com.bartlomiejpluta.base.editor.command.context.UndoableScope @@ -42,7 +41,7 @@ import kotlin.collections.set class MainController : Controller() { private val projectContext: ProjectContext by di() - val openItems = observableMapOf() + val openItems = observableMapOf>() fun createEmptyProject() { val vm = ProjectVM(Project()) @@ -72,7 +71,7 @@ class MainController : Controller() { handler = vm.handler } projectContext.importMap(vm.name, map) - openItems[scope] = map + openItems[scope] = GameMapVM(map) } openModal(block = true, resizable = false) @@ -90,13 +89,13 @@ class MainController : Controller() { } fun openMap(uid: String) { - openItem({ it.uid == uid }) { + openItem({ it.uid == uid }) { val map = projectContext.loadMap(uid) val vm = GameMapVM(map) val scope = UndoableScope() setInScope(vm, scope) - scope to map + scope to vm } } @@ -107,7 +106,7 @@ class MainController : Controller() { execute: ((String) -> Unit)? = null, saveable: Boolean = true ) { - val findScript = { script: Code -> script.fileNode.absolutePath == fsNode.absolutePath } + val findScript = { script: CodeVM -> script.fileNode.absolutePath == fsNode.absolutePath } val updateExistingScope = { scope: CodeScope -> scope.setCaretPosition(line, column) } openItem(findScript, updateExistingScope) { @@ -116,36 +115,33 @@ class MainController : Controller() { val scope = CodeScope(line, column) setInScope(vm, scope) - scope to code + scope to vm } } fun openQuery(query: Query) { - val findQuery = { q: Query -> q.name == query.name } - val updateQuery = { scope: Scope -> - openItems -= scope -// openItems[scope] = query -// find(scope).item = query - } + val findQuery = { q: QueryVM -> q.name == query.name } + val updateModel = { vm: QueryVM -> vm.item = query } - openItem(findQuery, updateQuery) { + openItem(findQuery, updateViewModel = updateModel) { val vm = QueryVM(query) val scope = Scope() setInScope(vm, scope) - scope to query + scope to vm } } - private inline fun openItem( - findItem: (item: T) -> Boolean, + private inline fun , S : Scope> openItem( + findItem: (item: VM) -> Boolean, updateExistingScope: (S) -> Unit = {}, - createItem: () -> Pair + updateViewModel: (VM) -> Unit = {}, + createItem: () -> Pair ) { @Suppress("UNCHECKED_CAST") val pair = openItems.entries - .filter { (_, item) -> item is T } - .map { (scope, item) -> (scope as S) to (item as T) } + .filter { (_, item) -> item is VM } + .map { (scope, item) -> (scope as S) to (item as VM) } .firstOrNull { (_, item) -> findItem(item) } if (pair == null) { @@ -155,6 +151,7 @@ class MainController : Controller() { } else { val scope = pair.first updateExistingScope(scope) + updateViewModel(pair.second) fire(SelectMainViewTabEvent(scope)) } } @@ -257,7 +254,7 @@ class MainController : Controller() { fun closeAsset(asset: Asset) { when (asset) { - is GameMapAsset -> openItems.entries.firstOrNull { (_, item) -> item is GameMap && item.uid == asset.uid }?.key?.let { + is GameMapAsset -> openItems.entries.firstOrNull { (_, item) -> item is GameMapVM && item.uid == asset.uid }?.key?.let { openItems.remove(it) } @@ -266,12 +263,12 @@ class MainController : Controller() { } fun closeScript(fsNode: FileNode) { - openItems.entries.firstOrNull { (_, item) -> item is Code && item.fileNode.absolutePath == fsNode.absolutePath }?.key?.let { + openItems.entries.firstOrNull { (_, item) -> item is CodeVM && item.fileNode.absolutePath == fsNode.absolutePath }?.key?.let { openItems.remove(it) } fsNode.allChildren.forEach { child -> - openItems.entries.firstOrNull { (_, item) -> item is Code && item.fileNode.absolutePath == child.absolutePath }?.key?.let { + openItems.entries.firstOrNull { (_, item) -> item is CodeVM && item.fileNode.absolutePath == child.absolutePath }?.key?.let { openItems.remove(it) } } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainView.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainView.kt index ace9657d..80f04b0c 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainView.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/view/MainView.kt @@ -1,12 +1,10 @@ package com.bartlomiejpluta.base.editor.main.view import com.bartlomiejpluta.base.editor.asset.view.list.AssetsListView -import com.bartlomiejpluta.base.editor.code.model.Code import com.bartlomiejpluta.base.editor.code.view.build.BuildLogsView import com.bartlomiejpluta.base.editor.code.view.editor.CodeEditorFragment import com.bartlomiejpluta.base.editor.code.view.list.ScriptFilesView import com.bartlomiejpluta.base.editor.code.viewmodel.CodeVM -import com.bartlomiejpluta.base.editor.database.model.Query import com.bartlomiejpluta.base.editor.database.view.list.TablesListView import com.bartlomiejpluta.base.editor.database.view.query.QueryResultFragment import com.bartlomiejpluta.base.editor.database.viewmodel.QueryVM @@ -15,7 +13,6 @@ import com.bartlomiejpluta.base.editor.event.AppendProcessLogsEvent import com.bartlomiejpluta.base.editor.event.SelectMainViewTabEvent import com.bartlomiejpluta.base.editor.main.component.EditorTab 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.process.view.ProcessLogsView @@ -149,27 +146,25 @@ class MainView : View("BASE Game Editor") { } } - private fun createTab(scope: Scope, item: Any) = when (item) { - is GameMap -> { - val vm = GameMapVM(item) + private fun createTab(scope: Scope, vm: Any) = when (vm) { + is GameMapVM -> { setInScope(vm, scope) EditorTab(find(scope), FontIcon("fa-map")).apply { projectContext.project ?.maps - ?.first { it.uid == item.uid } + ?.first { it.uid == vm.uid } ?.let { textProperty().bindBidirectional(it.nameProperty) } setOnClosed { mainController.openItems.remove(scope) } } } - is Code -> { - val vm = CodeVM(item) + is CodeVM -> { setInScope(vm, scope) EditorTab(find(scope), FontIcon("fa-code")).apply { - textProperty().bind(item.fileNode.nameProperty) + textProperty().bind(vm.fileNode.nameProperty) setOnClosed { fragment.shutdown() @@ -178,12 +173,11 @@ class MainView : View("BASE Game Editor") { } } - is Query -> { - val vm = QueryVM(item) + is QueryVM -> { setInScope(vm, scope) EditorTab(find(scope), FontIcon("fa-table")).apply { - textProperty().bind(item.nameProperty) + textProperty().bind(vm.nameProperty) setOnClosed { mainController.openItems.remove(scope) } } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/viewmodel/GameMapVM.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/viewmodel/GameMapVM.kt index 52700c74..03a1e6b9 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/viewmodel/GameMapVM.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/viewmodel/GameMapVM.kt @@ -10,6 +10,9 @@ import tornadofx.setValue class GameMapVM(map: GameMap) : ItemViewModel(map) { val layers: SimpleListProperty = bind(GameMap::layers) + val uidProperty = bind(GameMap::uidProperty) + val uid by uidProperty + val tileSetProperty = bind(GameMap::tileSet) val tileSet by tileSetProperty