diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/tileset/TileSet.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/tileset/TileSet.kt index e7691f95..a9e22792 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/tileset/TileSet.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/tileset/TileSet.kt @@ -8,10 +8,11 @@ import java.nio.ByteBuffer class TileSet(private val image: Image, val rows: Int, val columns: Int) { val tileWidth = image.width.toInt() / columns - val tileHeight = image.height.toInt() / rows + val width = tileWidth * columns + val height = tileHeight * rows - private val tiles: Array> = + val tiles: Array> = Array(rows) { row -> Array(columns) { column -> cropTile(row, column) } } private fun cropTile(row: Int, column: Int): Tile { diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapBrush.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapBrush.kt index 5a50befd..4efbbee5 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapBrush.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapBrush.kt @@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.editor.model.map.map.GameMap import com.bartlomiejpluta.base.editor.model.tileset.Tile import com.bartlomiejpluta.base.editor.render.model.Renderable import javafx.scene.canvas.GraphicsContext +import javafx.scene.input.MouseButton import javafx.scene.input.MouseEvent class MapBrush( @@ -57,17 +58,19 @@ class MapBrush( mouseColumn = event.column when (event.type) { - MouseEvent.MOUSE_PRESSED -> beginTrace() + MouseEvent.MOUSE_PRESSED -> beginTrace(event) MouseEvent.MOUSE_DRAGGED -> proceedTrace() - MouseEvent.MOUSE_RELEASED -> commitTrace() + MouseEvent.MOUSE_RELEASED -> commitTrace(event) } } - private fun beginTrace() { - currentTrace = MapPaintingTrace(map, "Paint trace").apply { - for ((row, columns) in brush.withIndex()) { - for ((column, tile) in columns.withIndex()) { - paint(0, mouseRow - centerRow + row, mouseColumn - centerColumn + column, tile) + private fun beginTrace(event: MapMouseEvent) { + if (event.button == MouseButton.PRIMARY) { + currentTrace = MapPaintingTrace(map, "Paint trace").apply { + for ((row, columns) in brush.withIndex()) { + for ((column, tile) in columns.withIndex()) { + paint(0, mouseRow - centerRow + row, mouseColumn - centerColumn + column, tile) + } } } } @@ -83,10 +86,12 @@ class MapBrush( } } - private fun commitTrace() { - currentTrace?.let { - paintingCallback(it) - currentTrace = null + private fun commitTrace(event: MapMouseEvent) { + if (event.button == MouseButton.PRIMARY) { + currentTrace?.let { + paintingCallback(it) + currentTrace = null + } } } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapMouseEvent.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapMouseEvent.kt index 0671b3f5..7b6e6ee4 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapMouseEvent.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapMouseEvent.kt @@ -2,15 +2,17 @@ package com.bartlomiejpluta.base.editor.render.canvas.map import com.bartlomiejpluta.base.editor.model.tileset.TileSet import javafx.event.EventType +import javafx.scene.input.MouseButton import javafx.scene.input.MouseEvent -class MapMouseEvent(val row: Int, val column: Int, val type: EventType) { +class MapMouseEvent(val row: Int, val column: Int, val type: EventType, val button: MouseButton) { companion object { fun of(event: MouseEvent, tileSet: TileSet) = MapMouseEvent( (event.y / tileSet.tileHeight).toInt(), (event.x / tileSet.tileWidth).toInt(), - event.eventType + event.eventType, + event.button ) } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetCanvas.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetCanvas.kt new file mode 100755 index 00000000..a198e863 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/tileset/TileSetCanvas.kt @@ -0,0 +1,27 @@ +package com.bartlomiejpluta.base.editor.render.canvas.tileset + +import com.bartlomiejpluta.base.editor.model.tileset.TileSet +import com.bartlomiejpluta.base.editor.render.canvas.map.MapMouseEvent +import com.bartlomiejpluta.base.editor.render.canvas.map.MapMouseEventHandler +import com.bartlomiejpluta.base.editor.render.model.Renderable +import javafx.scene.canvas.GraphicsContext + +class TileSetCanvas(private val tileSet: TileSet) : Renderable, MapMouseEventHandler { + private val tiles = tileSet.tiles + + override fun render(gc: GraphicsContext) { + renderTiles(gc) + } + + private fun renderTiles(gc: GraphicsContext) { + for ((row, columns) in tiles.withIndex()) { + for ((column, tile) in columns.withIndex()) { + gc.drawImage(tile.image, column * tile.image.width, row * tile.image.height) + } + } + } + + override fun handleMouseInput(event: MapMouseEvent) { + + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/tileset/TileSetPane.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/tileset/TileSetPane.kt new file mode 100755 index 00000000..f969ea5c --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/tileset/TileSetPane.kt @@ -0,0 +1,36 @@ +package com.bartlomiejpluta.base.editor.view.component.tileset + +import com.bartlomiejpluta.base.editor.model.tileset.TileSet +import com.bartlomiejpluta.base.editor.render.canvas.map.MapMouseEvent +import com.bartlomiejpluta.base.editor.render.canvas.tileset.TileSetCanvas +import javafx.event.EventHandler +import javafx.scene.canvas.Canvas +import javafx.scene.input.MouseEvent + +class TileSetPane(private val tileSet: TileSet) : Canvas(), EventHandler { + private val tileSetCanvas = TileSetCanvas(tileSet) + + init { + onMouseMoved = this + onMouseDragged = this + onMousePressed = this + onMouseReleased = this + + width = tileSet.width.toDouble() + height = tileSet.height.toDouble() + + render() + } + + fun render() { + tileSetCanvas.render(graphicsContext2D) + } + + override fun handle(event: MouseEvent?) { + if (event != null) { + tileSetCanvas.handleMouseInput(MapMouseEvent.of(event, tileSet)) + } + + tileSetCanvas.render(graphicsContext2D) + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt index 1adc6eaa..14197cfd 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt @@ -4,7 +4,10 @@ import com.bartlomiejpluta.base.editor.command.service.UndoRedoService import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent import com.bartlomiejpluta.base.editor.model.map.map.GameMap import com.bartlomiejpluta.base.editor.view.component.map.MapPane +import com.bartlomiejpluta.base.editor.view.component.tileset.TileSetPane import javafx.beans.property.SimpleDoubleProperty +import javafx.scene.input.MouseButton +import javafx.scene.input.MouseEvent import javafx.scene.transform.Scale import tornadofx.* @@ -25,15 +28,30 @@ class MapFragment : Fragment() { subscribe { pane.render() } } - override val root = scrollpane { - prefWidth = 640.0 - prefHeight = 480.0 + override val root = borderpane { + center = scrollpane { + prefWidth = 640.0 + prefHeight = 480.0 + isPannable = true - group { group { - this += pane - transforms += transformation + + // Let the ScrollPane.viewRect only pan on middle button. + addEventHandler(MouseEvent.ANY) { + if(it.button != MouseButton.MIDDLE) { + it.consume() + } + } + + group { + this += pane + transforms += transformation + } } } + + right = scrollpane { + this += TileSetPane(map.tileSet) + } } }