[Editor] Create working base for creating map dialog
This commit is contained in:
@@ -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<Scope, GameMap>()
|
||||
|
||||
fun createEmptyMap() {
|
||||
val map = GameMap(tileset).apply { name = "Unnamed" }
|
||||
val scope = UndoableScope()
|
||||
val vm = GameMapVM(map)
|
||||
setInScope(vm, scope)
|
||||
|
||||
val modal = find<MapSettingsFragment>(scope).apply { openModal(block = true, resizable = false) }
|
||||
|
||||
if (modal.result) {
|
||||
openMaps[scope] = map
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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<Layer>()
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<MainMenuView>()
|
||||
|
||||
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<MapFragment>(UndoableScope(), MapFragment::map to map).apply {
|
||||
title = "Map 1"
|
||||
}
|
||||
top = mainMenuView.root
|
||||
|
||||
center = tabpane {
|
||||
tabs.bind(mainController.openMaps) { scope, map ->
|
||||
Tab(map.name, find<MapFragment>(scope).root).apply {
|
||||
setOnClosed { mainController.openMaps.remove(scope) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
center = tabPane
|
||||
}
|
||||
}
|
||||
@@ -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<GameMapVM>().apply { item = map }
|
||||
|
||||
private val mapView = find<MapView>()
|
||||
private val layersView = find<MapLayersView>()
|
||||
private val tileSetView = find<TileSetView>()
|
||||
private val toolbarView = find<MapToolbarView>()
|
||||
private val statusBarView = find<MapStatusBarView>()
|
||||
|
||||
|
||||
override val root = borderpane {
|
||||
top = toolbarView.root
|
||||
|
||||
|
||||
@@ -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<GameMapVM>()
|
||||
|
||||
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() }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,9 +8,12 @@ import tornadofx.ItemViewModel
|
||||
import tornadofx.getValue
|
||||
import tornadofx.setValue
|
||||
|
||||
class GameMapVM : ItemViewModel<GameMap>() {
|
||||
class GameMapVM(map: GameMap) : ItemViewModel<GameMap>(map) {
|
||||
val layers: SimpleListProperty<Layer> = bind(GameMap::layers)
|
||||
|
||||
val nameProperty = bind(GameMap::nameProperty)
|
||||
var name by nameProperty
|
||||
|
||||
val tileSetProperty = bind(GameMap::tileSet)
|
||||
val tileSet by tileSetProperty
|
||||
|
||||
|
||||
Reference in New Issue
Block a user