[Editor] Restore map zooming support

This commit is contained in:
2021-02-07 16:57:29 +01:00
parent f96160614f
commit 6051147154
11 changed files with 78 additions and 51 deletions

View File

@@ -1,9 +1,10 @@
package com.bartlomiejpluta.base.editor.model.map.editor package com.bartlomiejpluta.base.editor.model.map.editor
class EditorOptions { class EditorState {
var selectedLayer = 0 var selectedLayer = 0
var showGrid = true var showGrid = true
var coverUnderlyingLayers = true var coverUnderlyingLayers = true
var zoom = 1.0
} }

View File

@@ -3,13 +3,13 @@ package com.bartlomiejpluta.base.editor.render.canvas.map
import com.bartlomiejpluta.base.editor.model.map.layer.Layer import com.bartlomiejpluta.base.editor.model.map.layer.Layer
import com.bartlomiejpluta.base.editor.model.map.layer.TileLayer import com.bartlomiejpluta.base.editor.model.map.layer.TileLayer
import com.bartlomiejpluta.base.editor.render.model.Renderable import com.bartlomiejpluta.base.editor.render.model.Renderable
import com.bartlomiejpluta.base.editor.viewmodel.map.EditorOptionsVM import com.bartlomiejpluta.base.editor.viewmodel.map.EditorStateVM
import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM
import javafx.scene.canvas.GraphicsContext import javafx.scene.canvas.GraphicsContext
import javafx.scene.paint.Color import javafx.scene.paint.Color
class MapCanvas(val map: GameMapVM, private val editorOptionsVM: EditorOptionsVM, private val painter: MapPainter) : Renderable { class MapCanvas(val map: GameMapVM, private val editorStateVM: EditorStateVM, private val painter: MapPainter) : Renderable {
var tileSet = map.tileSet var tileSet = map.tileSet
private var tileWidth = map.tileWidth private var tileWidth = map.tileWidth
private var tileHeight = map.tileHeight private var tileHeight = map.tileHeight
@@ -27,11 +27,11 @@ class MapCanvas(val map: GameMapVM, private val editorOptionsVM: EditorOptionsVM
} }
private fun renderSelectedLayer(gc: GraphicsContext) { private fun renderSelectedLayer(gc: GraphicsContext) {
map.layers.getOrNull(editorOptionsVM.selectedLayer) ?. let { dispatchLayerRender(gc, it) } map.layers.getOrNull(editorStateVM.selectedLayer) ?. let { dispatchLayerRender(gc, it) }
} }
private fun renderCover(gc: GraphicsContext) { private fun renderCover(gc: GraphicsContext) {
if(!editorOptionsVM.coverUnderlyingLayers) { if(!editorStateVM.coverUnderlyingLayers) {
return return
} }
@@ -40,7 +40,7 @@ class MapCanvas(val map: GameMapVM, private val editorOptionsVM: EditorOptionsVM
} }
private fun renderUnderlyingLayers(gc: GraphicsContext) { private fun renderUnderlyingLayers(gc: GraphicsContext) {
for(layer in map.layers.dropLast( map.layers.size - editorOptionsVM.selectedLayer)) { for(layer in map.layers.dropLast( map.layers.size - editorStateVM.selectedLayer)) {
dispatchLayerRender(gc, layer) dispatchLayerRender(gc, layer)
} }
} }
@@ -71,7 +71,7 @@ class MapCanvas(val map: GameMapVM, private val editorOptionsVM: EditorOptionsVM
} }
private fun renderGrid(gc: GraphicsContext) { private fun renderGrid(gc: GraphicsContext) {
if(!editorOptionsVM.showGrid) { if(!editorStateVM.showGrid) {
return return
} }

View File

@@ -5,7 +5,7 @@ import com.bartlomiejpluta.base.editor.render.canvas.input.MapMouseEvent
import com.bartlomiejpluta.base.editor.render.canvas.input.MapMouseEventHandler import com.bartlomiejpluta.base.editor.render.canvas.input.MapMouseEventHandler
import com.bartlomiejpluta.base.editor.render.model.Renderable import com.bartlomiejpluta.base.editor.render.model.Renderable
import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM
import com.bartlomiejpluta.base.editor.viewmodel.map.EditorOptionsVM import com.bartlomiejpluta.base.editor.viewmodel.map.EditorStateVM
import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM
import javafx.scene.canvas.GraphicsContext import javafx.scene.canvas.GraphicsContext
import javafx.scene.input.MouseButton import javafx.scene.input.MouseButton
@@ -15,7 +15,7 @@ import javafx.scene.paint.Color
class MapPainter( class MapPainter(
private val mapVM: GameMapVM, private val mapVM: GameMapVM,
private val brushVM: BrushVM, private val brushVM: BrushVM,
private val editorOptionsVM: EditorOptionsVM, private val editorStateVM: EditorStateVM,
private val paintingCallback: (MapPaintingTrace) -> Unit private val paintingCallback: (MapPaintingTrace) -> Unit
) : Renderable, MapMouseEventHandler { ) : Renderable, MapMouseEventHandler {
private val tileWidth = mapVM.tileSet.tileWidth.toDouble() private val tileWidth = mapVM.tileSet.tileWidth.toDouble()
@@ -67,10 +67,10 @@ class MapPainter(
} }
private fun beginTrace(event: MapMouseEvent) { private fun beginTrace(event: MapMouseEvent) {
if (event.button == MouseButton.PRIMARY && editorOptionsVM.selectedLayer >= 0) { if (event.button == MouseButton.PRIMARY && editorStateVM.selectedLayer >= 0) {
currentTrace = MapPaintingTrace(mapVM, "Paint trace").apply { currentTrace = MapPaintingTrace(mapVM, "Paint trace").apply {
brushVM.forEach { row, column, centerRow, centerColumn, tile -> brushVM.forEach { row, column, centerRow, centerColumn, tile ->
paint(editorOptionsVM.selectedLayer, mouseRow - centerRow + row, mouseColumn - centerColumn + column, tile) paint(editorStateVM.selectedLayer, mouseRow - centerRow + row, mouseColumn - centerColumn + column, tile)
} }
} }
} }
@@ -80,7 +80,7 @@ class MapPainter(
if (event.button == MouseButton.PRIMARY) { if (event.button == MouseButton.PRIMARY) {
currentTrace?.apply { currentTrace?.apply {
brushVM.forEach { row, column, centerRow, centerColumn, tile -> brushVM.forEach { row, column, centerRow, centerColumn, tile ->
paint(editorOptionsVM.selectedLayer, mouseRow - centerRow + row, mouseColumn - centerColumn + column, tile) paint(editorStateVM.selectedLayer, mouseRow - centerRow + row, mouseColumn - centerColumn + column, tile)
} }
} }
} }

View File

@@ -5,7 +5,7 @@ import com.bartlomiejpluta.base.editor.render.canvas.map.MapCanvas
import com.bartlomiejpluta.base.editor.render.canvas.map.MapPainter import com.bartlomiejpluta.base.editor.render.canvas.map.MapPainter
import com.bartlomiejpluta.base.editor.render.canvas.map.MapPaintingTrace import com.bartlomiejpluta.base.editor.render.canvas.map.MapPaintingTrace
import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM
import com.bartlomiejpluta.base.editor.viewmodel.map.EditorOptionsVM import com.bartlomiejpluta.base.editor.viewmodel.map.EditorStateVM
import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM
import javafx.event.EventHandler import javafx.event.EventHandler
import javafx.scene.canvas.Canvas import javafx.scene.canvas.Canvas
@@ -15,11 +15,11 @@ import javafx.scene.input.MouseEvent
class MapPane( class MapPane(
private val mapVM: GameMapVM, private val mapVM: GameMapVM,
brushVM: BrushVM, brushVM: BrushVM,
editorOptionsVM: EditorOptionsVM, editorStateVM: EditorStateVM,
paintingCallback: (MapPaintingTrace) -> Unit paintingCallback: (MapPaintingTrace) -> Unit
) : Canvas(), EventHandler<MouseEvent> { ) : Canvas(), EventHandler<MouseEvent> {
private val painter = MapPainter(mapVM, brushVM, editorOptionsVM, paintingCallback) private val painter = MapPainter(mapVM, brushVM, editorStateVM, paintingCallback)
private val mapCanvas = MapCanvas(mapVM, editorOptionsVM, painter) private val mapCanvas = MapCanvas(mapVM, editorStateVM, painter)
init { init {
onMouseMoved = this onMouseMoved = this
@@ -30,9 +30,9 @@ class MapPane(
widthProperty().bind(mapVM.widthProperty) widthProperty().bind(mapVM.widthProperty)
heightProperty().bind(mapVM.heightProperty) heightProperty().bind(mapVM.heightProperty)
editorOptionsVM.showGridProperty.addListener { _, _, _ -> render() } editorStateVM.showGridProperty.addListener { _, _, _ -> render() }
editorOptionsVM.selectedLayerProperty.addListener { _, _, _ -> render() } editorStateVM.selectedLayerProperty.addListener { _, _, _ -> render() }
editorOptionsVM.coverUnderlyingLayersProperty.addListener { _, _, _ -> render() } editorStateVM.coverUnderlyingLayersProperty.addListener { _, _, _ -> render() }
render() render()
} }

View File

@@ -17,6 +17,7 @@ class MapFragment : Fragment() {
private val layersView = find<MapLayersView>() private val layersView = find<MapLayersView>()
private val tileSetView = find<TileSetView>() private val tileSetView = find<TileSetView>()
private val toolbarView = find<MapToolbarView>() private val toolbarView = find<MapToolbarView>()
private val statusBarView = find<MapStatusBarView>()
override val root = borderpane { override val root = borderpane {
@@ -35,5 +36,7 @@ class MapFragment : Fragment() {
} }
} }
} }
bottom = statusBarView.root
} }
} }

View File

@@ -9,7 +9,7 @@ import com.bartlomiejpluta.base.editor.command.service.UndoRedoService
import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent
import com.bartlomiejpluta.base.editor.model.map.layer.Layer import com.bartlomiejpluta.base.editor.model.map.layer.Layer
import com.bartlomiejpluta.base.editor.model.map.layer.TileLayer import com.bartlomiejpluta.base.editor.model.map.layer.TileLayer
import com.bartlomiejpluta.base.editor.viewmodel.map.EditorOptionsVM import com.bartlomiejpluta.base.editor.viewmodel.map.EditorStateVM
import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM
import javafx.scene.control.TableView import javafx.scene.control.TableView
import org.kordamp.ikonli.javafx.FontIcon import org.kordamp.ikonli.javafx.FontIcon
@@ -22,7 +22,7 @@ class MapLayersView : View() {
private val mapVM = find<GameMapVM>() private val mapVM = find<GameMapVM>()
private val editorOptionsVM = find<EditorOptionsVM>() private val editorOptionsVM = find<EditorStateVM>()
private var layersPane = TableView(mapVM.layers).apply { private var layersPane = TableView(mapVM.layers).apply {
column("Layer Name", Layer::nameProperty).makeEditable().setOnEditCommit { column("Layer Name", Layer::nameProperty).makeEditable().setOnEditCommit {

View File

@@ -0,0 +1,24 @@
package com.bartlomiejpluta.base.editor.view.map
import com.bartlomiejpluta.base.editor.viewmodel.map.EditorStateVM
import javafx.beans.binding.Bindings
import org.kordamp.ikonli.javafx.FontIcon
import tornadofx.*
class MapStatusBarView : View() {
private val editorOptionsVM = find<EditorStateVM>()
override val root = hbox {
spacing = 1.0
paddingAll = 5.0
this += FontIcon("fa-search-minus")
slider(0.5..5.0) {
bind(editorOptionsVM.zoomProperty)
}
this += FontIcon("fa-search-plus")
}
}

View File

@@ -5,13 +5,11 @@ import com.bartlomiejpluta.base.editor.command.service.UndoRedoService
import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent
import com.bartlomiejpluta.base.editor.model.map.brush.BrushMode import com.bartlomiejpluta.base.editor.model.map.brush.BrushMode
import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM
import com.bartlomiejpluta.base.editor.viewmodel.map.EditorOptionsVM import com.bartlomiejpluta.base.editor.viewmodel.map.EditorStateVM
import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM
import javafx.scene.control.ToggleGroup import javafx.scene.control.ToggleGroup
import org.kordamp.ikonli.javafx.FontIcon import org.kordamp.ikonli.javafx.FontIcon
import org.slf4j.LoggerFactory
import tornadofx.* import tornadofx.*
import java.util.*
import kotlin.math.max import kotlin.math.max
class MapToolbarView : View() { class MapToolbarView : View() {
@@ -21,7 +19,7 @@ class MapToolbarView : View() {
private val mapVM = find<GameMapVM>() private val mapVM = find<GameMapVM>()
private val brushVM = find<BrushVM>() private val brushVM = find<BrushVM>()
private val editorOptionsVM = find<EditorOptionsVM>() private val editorOptionsVM = find<EditorStateVM>()
private val brushMode = ToggleGroup().apply { private val brushMode = ToggleGroup().apply {
brushVM.itemProperty.addListener { _, _, brush -> brushVM.itemProperty.addListener { _, _, brush ->

View File

@@ -5,9 +5,8 @@ import com.bartlomiejpluta.base.editor.command.service.UndoRedoService
import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent
import com.bartlomiejpluta.base.editor.view.component.map.MapPane import com.bartlomiejpluta.base.editor.view.component.map.MapPane
import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM
import com.bartlomiejpluta.base.editor.viewmodel.map.EditorOptionsVM import com.bartlomiejpluta.base.editor.viewmodel.map.EditorStateVM
import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM
import javafx.beans.property.SimpleDoubleProperty
import javafx.scene.input.MouseButton import javafx.scene.input.MouseButton
import javafx.scene.input.MouseEvent import javafx.scene.input.MouseEvent
import javafx.scene.transform.Scale import javafx.scene.transform.Scale
@@ -22,21 +21,19 @@ class MapView : View() {
override val scope = super.scope as UndoableScope override val scope = super.scope as UndoableScope
val zoomProperty = SimpleDoubleProperty(1.0)
private val zoom = Scale(1.0, 1.0, 0.0, 0.0).apply {
xProperty().bind(zoomProperty)
yProperty().bind(zoomProperty)
}
private val mapVM = find<GameMapVM>() private val mapVM = find<GameMapVM>()
private val brushVM = find<BrushVM>() private val brushVM = find<BrushVM>()
private val editorOptionsVM = find<EditorOptionsVM>() private val editorOptionsVM = find<EditorStateVM>()
private val mapPane = MapPane(mapVM, brushVM, editorOptionsVM) { undoRedoService.push(it, scope) } private val mapPane = MapPane(mapVM, brushVM, editorOptionsVM) { undoRedoService.push(it, scope) }
private val zoom = Scale(1.0, 1.0, 0.0, 0.0).apply {
xProperty().bind(editorOptionsVM.zoomProperty)
yProperty().bind(editorOptionsVM.zoomProperty)
}
init { init {
brushVM.item = mapVM.tileSet.baseBrush brushVM.item = mapVM.tileSet.baseBrush
brushVM.commit() brushVM.commit()

View File

@@ -1,16 +0,0 @@
package com.bartlomiejpluta.base.editor.viewmodel.map
import com.bartlomiejpluta.base.editor.model.map.editor.EditorOptions
import javafx.beans.property.IntegerProperty
import tornadofx.*
class EditorOptionsVM : ItemViewModel<EditorOptions>(EditorOptions()) {
val selectedLayerProperty = bind(EditorOptions::selectedLayer) as IntegerProperty
var selectedLayer by selectedLayerProperty
val showGridProperty = bind(EditorOptions::showGrid)
var showGrid by showGridProperty
val coverUnderlyingLayersProperty = bind(EditorOptions::coverUnderlyingLayers)
var coverUnderlyingLayers by coverUnderlyingLayersProperty
}

View File

@@ -0,0 +1,20 @@
package com.bartlomiejpluta.base.editor.viewmodel.map
import com.bartlomiejpluta.base.editor.model.map.editor.EditorState
import javafx.beans.property.DoubleProperty
import javafx.beans.property.IntegerProperty
import tornadofx.*
class EditorStateVM : ItemViewModel<EditorState>(EditorState()) {
val selectedLayerProperty = bind(EditorState::selectedLayer) as IntegerProperty
var selectedLayer by selectedLayerProperty
val showGridProperty = bind(EditorState::showGrid)
var showGrid by showGridProperty
val coverUnderlyingLayersProperty = bind(EditorState::coverUnderlyingLayers)
var coverUnderlyingLayers by coverUnderlyingLayersProperty
val zoomProperty = bind(EditorState::zoom) as DoubleProperty
var zoom by zoomProperty
}