From 3887664b14118b646ca5d9b6c97ea5ddf56cfb4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sun, 7 Feb 2021 20:17:19 +0100 Subject: [PATCH] [Editor] Create working base for creating map dialog --- .../editor/controller/main/MainController.kt | 34 ++++++++ .../editor/controller/map/MapController.kt | 14 ---- .../controller/tileset/TileSetController.kt | 10 --- .../base/editor/model/map/map/GameMap.kt | 19 +++-- .../base/editor/view/main/MainMenuView.kt | 27 +++++++ .../base/editor/view/main/MainView.kt | 31 +++----- .../base/editor/view/map/MapFragment.kt | 7 -- .../editor/view/map/MapSettingsFragment.kt | 77 +++++++++++++++++++ .../base/editor/viewmodel/map/GameMapVM.kt | 5 +- 9 files changed, 168 insertions(+), 56 deletions(-) create mode 100755 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/main/MainController.kt delete mode 100755 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/map/MapController.kt delete mode 100755 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/tileset/TileSetController.kt create mode 100755 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/main/MainMenuView.kt create mode 100755 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/map/MapSettingsFragment.kt diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/main/MainController.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/main/MainController.kt new file mode 100755 index 00000000..6b52ab34 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/main/MainController.kt @@ -0,0 +1,34 @@ +package com.bartlomiejpluta.base.editor.controller.main + +import com.bartlomiejpluta.base.editor.command.context.UndoableScope +import com.bartlomiejpluta.base.editor.model.map.map.GameMap +import com.bartlomiejpluta.base.editor.model.tileset.TileSet +import com.bartlomiejpluta.base.editor.view.map.MapSettingsFragment +import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM +import org.springframework.stereotype.Component +import tornadofx.Controller +import tornadofx.Scope +import tornadofx.find +import tornadofx.observableMapOf +import kotlin.collections.set + +@Component +class MainController : Controller() { + // In the future it'll be pulled from TileSetService or something like that + private val tileset = TileSet(resources.image("/textures/tileset.png"), 160, 8) + + val openMaps = observableMapOf() + + fun createEmptyMap() { + val map = GameMap(tileset).apply { name = "Unnamed" } + val scope = UndoableScope() + val vm = GameMapVM(map) + setInScope(vm, scope) + + val modal = find(scope).apply { openModal(block = true, resizable = false) } + + if (modal.result) { + openMaps[scope] = map + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/map/MapController.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/map/MapController.kt deleted file mode 100755 index 6ddeb2a1..00000000 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/map/MapController.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.bartlomiejpluta.base.editor.controller.map - -import com.bartlomiejpluta.base.editor.controller.tileset.TileSetController -import com.bartlomiejpluta.base.editor.model.map.map.GameMap -import com.bartlomiejpluta.base.editor.model.tileset.TileSet -import org.springframework.stereotype.Component -import tornadofx.Controller - -@Component -class MapController : Controller() { - private val tileSetController: TileSetController by inject() - - fun createMap(tileSet: TileSet, rows: Int, columns: Int) = GameMap(tileSet, rows, columns) -} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/tileset/TileSetController.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/tileset/TileSetController.kt deleted file mode 100755 index 9f261633..00000000 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/tileset/TileSetController.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.bartlomiejpluta.base.editor.controller.tileset - -import com.bartlomiejpluta.base.editor.model.tileset.TileSet -import org.springframework.stereotype.Component -import tornadofx.Controller - -@Component -class TileSetController : Controller() { - val tileset = TileSet(resources.image("/textures/tileset.png"), 160, 8) -} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/map/GameMap.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/map/GameMap.kt index ff1fbd98..c86b4bfe 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/map/GameMap.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/map/GameMap.kt @@ -4,28 +4,32 @@ import com.bartlomiejpluta.base.editor.model.map.layer.Layer import com.bartlomiejpluta.base.editor.model.tileset.TileSet import javafx.beans.property.SimpleDoubleProperty import javafx.beans.property.SimpleIntegerProperty +import javafx.beans.property.SimpleStringProperty import tornadofx.getValue import tornadofx.observableListOf import tornadofx.setValue -class GameMap(val tileSet: TileSet, initialColumns: Int, initialRows: Int) { +class GameMap(val tileSet: TileSet) { val layers = observableListOf() + val nameProperty = SimpleStringProperty() + var name by nameProperty + val tileWidth = tileSet.tileWidth.toDouble() val tileHeight = tileSet.tileHeight.toDouble() - val rowsProperty = SimpleIntegerProperty(initialRows) + val rowsProperty = SimpleIntegerProperty(INITIAL_ROWS) val rows by rowsProperty - val columnsProperty = SimpleIntegerProperty(initialColumns) + val columnsProperty = SimpleIntegerProperty(INITIAL_COLUMNS) val columns by columnsProperty - val widthProperty = SimpleDoubleProperty(initialColumns * tileWidth) + val widthProperty = SimpleDoubleProperty(INITIAL_COLUMNS * tileWidth) var width by widthProperty private set - val heightProperty = SimpleDoubleProperty(initialRows * tileHeight) + val heightProperty = SimpleDoubleProperty(INITIAL_ROWS * tileHeight) var height by heightProperty private set @@ -42,4 +46,9 @@ class GameMap(val tileSet: TileSet, initialColumns: Int, initialRows: Int) { layers.forEach { it.resize(rows, newColumns) } } } + + companion object { + private const val INITIAL_ROWS = 20 + private const val INITIAL_COLUMNS = 20 + } } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/main/MainMenuView.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/main/MainMenuView.kt new file mode 100755 index 00000000..ce6e2e7a --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/main/MainMenuView.kt @@ -0,0 +1,27 @@ +package com.bartlomiejpluta.base.editor.view.main + +import com.bartlomiejpluta.base.editor.controller.main.MainController +import com.bartlomiejpluta.base.editor.view.map.MapSettingsFragment +import tornadofx.* + +class MainMenuView : View() { + private val mainController: MainController by di() + + override val root = menubar { + menu("File") { + menu("New") { + item("Project...") + item("Map...") { + action { + mainController.createEmptyMap() + } + } + } + } + + menu("Edit") { + item("Undo") + item("Redo") + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/main/MainView.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/main/MainView.kt index 55ad6908..5bc0d78d 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/main/MainView.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/main/MainView.kt @@ -1,32 +1,25 @@ package com.bartlomiejpluta.base.editor.view.main -import com.bartlomiejpluta.base.editor.command.context.UndoableScope -import com.bartlomiejpluta.base.editor.controller.map.MapController -import com.bartlomiejpluta.base.editor.controller.tileset.TileSetController +import com.bartlomiejpluta.base.editor.controller.main.MainController import com.bartlomiejpluta.base.editor.view.map.MapFragment -import javafx.scene.control.TabPane -import org.kordamp.ikonli.javafx.FontIcon +import javafx.scene.control.Tab import tornadofx.* -class MainView : View() { - private val mapController: MapController by di() - private val tileSetController: TileSetController by di() - private val tabPane = TabPane() +class MainView : View("BASE Game Editor") { + private val mainController: MainController by di() + + private val mainMenuView = find() override val root = borderpane { - top = toolbar { - button(graphic = FontIcon("fa-file-o")) { - action { - val tileSet = tileSetController.tileset - val map = mapController.createMap(tileSet, 5, 5) - tabPane += find(UndoableScope(), MapFragment::map to map).apply { - title = "Map 1" - } + top = mainMenuView.root + + center = tabpane { + tabs.bind(mainController.openMaps) { scope, map -> + Tab(map.name, find(scope).root).apply { + setOnClosed { mainController.openMaps.remove(scope) } } } } - - center = tabPane } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/map/MapFragment.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/map/MapFragment.kt index 18d53e41..787e57d3 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/map/MapFragment.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/map/MapFragment.kt @@ -1,25 +1,18 @@ package com.bartlomiejpluta.base.editor.view.map import com.bartlomiejpluta.base.editor.command.context.UndoableScope -import com.bartlomiejpluta.base.editor.model.map.map.GameMap -import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM import tornadofx.* class MapFragment : Fragment() { override val scope = super.scope as UndoableScope - val map: GameMap by param() - - private val mapVM = find().apply { item = map } - private val mapView = find() private val layersView = find() private val tileSetView = find() private val toolbarView = find() private val statusBarView = find() - override val root = borderpane { top = toolbarView.root diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/map/MapSettingsFragment.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/map/MapSettingsFragment.kt new file mode 100755 index 00000000..07b4be70 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/map/MapSettingsFragment.kt @@ -0,0 +1,77 @@ +package com.bartlomiejpluta.base.editor.view.map + +import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM +import org.kordamp.ikonli.javafx.FontIcon +import tornadofx.* + +class MapSettingsFragment : Fragment("Map Settings") { + private val mapVM = find() + + var result: Boolean = false + private set + + override val root = form { + icon = FontIcon("fa-map-o") + + fieldset("Map Settings") { + field("Map name") { + textfield(mapVM.nameProperty) { + required() + whenDocked { requestFocus() } + } + } + + field("Rows") { + + textfield(mapVM.rowsProperty) { + stripNonInteger() + required() + validator { + when (it?.toIntOrNull()) { + in 1..50 -> null + in 50..100 -> warning("The map sizes over 50 can impact game performance") + else -> error("The map size must be between 1 and 100") + } + } + } + } + + field("Columns") { + textfield(mapVM.columnsProperty) { + stripNonInteger() + required() + validator { + when (it?.toIntOrNull()) { + in 1..50 -> null + in 50..100 -> warning("The map sizes over 50 can impact game performance") + else -> error("The map size must be between 1 and 100") + } + } + } + } + } + + buttonbar { + button("Ok") { + shortcut("Enter") + + action { + mapVM.commit { + result = true + close() + } + } + } + + button("Reset") { + action { + mapVM.rollback() + } + } + + button("Cancel") { + action { close() } + } + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/viewmodel/map/GameMapVM.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/viewmodel/map/GameMapVM.kt index 437dfee8..88f23f97 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/viewmodel/map/GameMapVM.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/viewmodel/map/GameMapVM.kt @@ -8,9 +8,12 @@ import tornadofx.ItemViewModel import tornadofx.getValue import tornadofx.setValue -class GameMapVM : ItemViewModel() { +class GameMapVM(map: GameMap) : ItemViewModel(map) { val layers: SimpleListProperty = bind(GameMap::layers) + val nameProperty = bind(GameMap::nameProperty) + var name by nameProperty + val tileSetProperty = bind(GameMap::tileSet) val tileSet by tileSetProperty