[Editor] Create working base for brush range selection
Also: "brush size" has been renamed to "brush range" for the sake of clarity
This commit is contained in:
@@ -8,15 +8,22 @@ import tornadofx.setValue
|
||||
|
||||
class Brush(newBrush: Array<Array<Tile>>) {
|
||||
val brush = observableListOf<Tile>()
|
||||
|
||||
val rowsProperty = SimpleIntegerProperty(this, "", 0)
|
||||
var rows by rowsProperty
|
||||
|
||||
val columnsProperty = SimpleIntegerProperty(0)
|
||||
var columns by columnsProperty
|
||||
|
||||
val centerRowProperty = SimpleIntegerProperty(0)
|
||||
var centerRow by centerRowProperty
|
||||
|
||||
val centerColumnProperty = SimpleIntegerProperty(0)
|
||||
var centerColumn by centerColumnProperty
|
||||
|
||||
val brushRangeProperty = SimpleIntegerProperty(1)
|
||||
var brushRange by brushRangeProperty
|
||||
|
||||
init {
|
||||
rowsProperty.value = newBrush.size
|
||||
|
||||
@@ -35,4 +42,6 @@ class Brush(newBrush: Array<Array<Tile>>) {
|
||||
consumer(id / columns, id % columns, tile)
|
||||
}
|
||||
}
|
||||
|
||||
fun withBrushRange(range: Int) = Brush(Array(range) { Array(range) { brush[0] } }).apply { brushRange = range }
|
||||
}
|
||||
|
||||
@@ -16,8 +16,6 @@ class MapCanvas(val map: GameMapVM, private val painter: MapPainter) : Renderabl
|
||||
|
||||
|
||||
override fun render(gc: GraphicsContext) {
|
||||
log.debug("vm.dim = ${map.rows}x${map.columns} | map.dim = ${map.item.rows}x${map.item.columns}")
|
||||
log.debug("vm.size = ${map.width}x${map.height} | map.size = ${map.item.width}x${map.item.height}")
|
||||
gc.clearRect(0.0, 0.0, gc.canvas.width, gc.canvas.height)
|
||||
|
||||
renderBackground(gc)
|
||||
@@ -72,7 +70,6 @@ class MapCanvas(val map: GameMapVM, private val painter: MapPainter) : Renderabl
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val log = LoggerFactory.getLogger(MapCanvas::class.java)
|
||||
private val BACKGROUND_COLOR1 = Color.color(1.0, 1.0, 1.0, 1.0)
|
||||
private val BACKGROUND_COLOR2 = Color.color(0.95, 0.95, 0.95, 0.95)
|
||||
}
|
||||
|
||||
@@ -10,9 +10,7 @@ import javafx.scene.input.MouseButton
|
||||
import javafx.scene.input.MouseEvent
|
||||
import javafx.scene.paint.Color
|
||||
|
||||
class TileSetCanvas(private val gameMapVM: GameMapVM, brushVM: BrushVM) : Renderable, MapMouseEventHandler {
|
||||
private var selection = TileSetSelection(gameMapVM, brushVM)
|
||||
|
||||
class TileSetCanvas(private val gameMapVM: GameMapVM, private val selection: TileSetSelection) : Renderable, MapMouseEventHandler {
|
||||
private var mouseRow = -1
|
||||
private var mouseColumn = -1
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package com.bartlomiejpluta.base.editor.render.canvas.tileset
|
||||
|
||||
import com.bartlomiejpluta.base.editor.model.map.brush.Brush
|
||||
import com.bartlomiejpluta.base.editor.model.tileset.Tile
|
||||
import com.bartlomiejpluta.base.editor.model.tileset.TileSet
|
||||
import com.bartlomiejpluta.base.editor.render.model.Renderable
|
||||
import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM
|
||||
import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM
|
||||
@@ -23,7 +21,13 @@ class TileSetSelection(private val gameMapVM: GameMapVM, private val brushVM: Br
|
||||
private var height = gameMapVM.tileSet.tileHeight.toDouble()
|
||||
|
||||
|
||||
fun shrinkToTopLeftTile() {
|
||||
proceed(startRow, startColumn)
|
||||
}
|
||||
|
||||
fun begin(row: Double, column: Double) {
|
||||
resetBrushRange()
|
||||
|
||||
startRow = row
|
||||
offsetRow = 0.0
|
||||
startColumn = column
|
||||
@@ -32,6 +36,10 @@ class TileSetSelection(private val gameMapVM: GameMapVM, private val brushVM: Br
|
||||
updateRect(row, column)
|
||||
}
|
||||
|
||||
private fun resetBrushRange() {
|
||||
brushVM.brushRange = 1
|
||||
}
|
||||
|
||||
private fun updateRect(row: Double, column: Double) {
|
||||
x = min(column, startColumn) * gameMapVM.tileSet.tileWidth
|
||||
y = min(row, startRow) * gameMapVM.tileSet.tileHeight
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.bartlomiejpluta.base.editor.view.component.tileset
|
||||
|
||||
import com.bartlomiejpluta.base.editor.render.canvas.input.MapMouseEvent
|
||||
import com.bartlomiejpluta.base.editor.render.canvas.tileset.TileSetCanvas
|
||||
import com.bartlomiejpluta.base.editor.render.canvas.tileset.TileSetSelection
|
||||
import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM
|
||||
import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM
|
||||
import javafx.event.EventHandler
|
||||
@@ -9,7 +10,8 @@ import javafx.scene.canvas.Canvas
|
||||
import javafx.scene.input.MouseEvent
|
||||
|
||||
class TileSetPane(private val gameMapVM: GameMapVM, brushVM: BrushVM) : Canvas(), EventHandler<MouseEvent> {
|
||||
private val tileSetCanvas = TileSetCanvas(gameMapVM, brushVM)
|
||||
private val selection = TileSetSelection(gameMapVM, brushVM)
|
||||
private val tileSetCanvas = TileSetCanvas(gameMapVM, selection)
|
||||
|
||||
init {
|
||||
onMouseMoved = this
|
||||
@@ -20,6 +22,17 @@ class TileSetPane(private val gameMapVM: GameMapVM, brushVM: BrushVM) : Canvas()
|
||||
width = gameMapVM.tileSet.width.toDouble()
|
||||
height = gameMapVM.tileSet.height.toDouble()
|
||||
|
||||
// Shrink the selection just one tile (the top left one)
|
||||
// when brush range (size) is increased to 2 or more
|
||||
// (because the range-increased brush can only include
|
||||
// the tile of one type).
|
||||
brushVM.brushRangeProperty.addListener { _, _, newValue ->
|
||||
if (newValue.toInt() > 1) {
|
||||
selection.shrinkToTopLeftTile()
|
||||
render()
|
||||
}
|
||||
}
|
||||
|
||||
render()
|
||||
}
|
||||
|
||||
|
||||
@@ -1,19 +1,14 @@
|
||||
package com.bartlomiejpluta.base.editor.view.map
|
||||
|
||||
import com.bartlomiejpluta.base.editor.command.context.UndoableScope
|
||||
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.viewmodel.map.GameMapVM
|
||||
import org.kordamp.ikonli.javafx.FontIcon
|
||||
import tornadofx.*
|
||||
import kotlin.math.max
|
||||
|
||||
|
||||
class MapFragment : Fragment() {
|
||||
private val undoRedoService: UndoRedoService by di()
|
||||
|
||||
override val scope = super.scope as UndoableScope
|
||||
|
||||
val map: GameMap by param()
|
||||
|
||||
private val mapVM = find<GameMapVM>().apply { item = map }
|
||||
@@ -21,57 +16,11 @@ class MapFragment : Fragment() {
|
||||
private val mapView = find<MapView>()
|
||||
private val layersView = find<MapLayersView>()
|
||||
private val tileSetView = find<TileSetView>()
|
||||
private val toolbarView = find<MapToolbarView>()
|
||||
|
||||
|
||||
override val root = borderpane {
|
||||
top = toolbar {
|
||||
button(graphic = FontIcon("fa-undo")) {
|
||||
shortcut("Ctrl+Z")
|
||||
action {
|
||||
undoRedoService.undo(scope)
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
button(graphic = FontIcon("fa-repeat")) {
|
||||
shortcut("Ctrl+Shift+Z")
|
||||
action {
|
||||
undoRedoService.redo(scope)
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
button(text = "Rows", graphic = FontIcon("fa-minus")) {
|
||||
action {
|
||||
mapVM.rows = max(mapVM.rows - 1, 1)
|
||||
mapVM.commit()
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
button(text = "Columns", graphic = FontIcon("fa-minus")) {
|
||||
action {
|
||||
mapVM.columns = max(mapVM.columns - 1, 1)
|
||||
mapVM.commit()
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
button(text = "Rows", graphic = FontIcon("fa-plus")) {
|
||||
action {
|
||||
++mapVM.rows
|
||||
mapVM.commit()
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
button(text = "Columns", graphic = FontIcon("fa-plus")) {
|
||||
action {
|
||||
++mapVM.columns
|
||||
mapVM.commit()
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
}
|
||||
top = toolbarView.root
|
||||
|
||||
center = mapView.root
|
||||
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
package com.bartlomiejpluta.base.editor.view.map
|
||||
|
||||
import com.bartlomiejpluta.base.editor.command.context.UndoableScope
|
||||
import com.bartlomiejpluta.base.editor.command.service.UndoRedoService
|
||||
import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent
|
||||
import com.bartlomiejpluta.base.editor.viewmodel.map.BrushVM
|
||||
import com.bartlomiejpluta.base.editor.viewmodel.map.GameMapVM
|
||||
import javafx.scene.control.ToggleGroup
|
||||
import org.kordamp.ikonli.javafx.FontIcon
|
||||
import tornadofx.*
|
||||
import kotlin.math.max
|
||||
|
||||
class MapToolbarView : View() {
|
||||
private val undoRedoService: UndoRedoService by di()
|
||||
|
||||
override val scope = super.scope as UndoableScope
|
||||
|
||||
private val mapVM = find<GameMapVM>()
|
||||
private val brushVM = find<BrushVM>()
|
||||
|
||||
private val tool = ToggleGroup()
|
||||
|
||||
|
||||
override val root = toolbar {
|
||||
button(graphic = FontIcon("fa-undo")) {
|
||||
shortcut("Ctrl+Z")
|
||||
action {
|
||||
undoRedoService.undo(scope)
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
button(graphic = FontIcon("fa-repeat")) {
|
||||
shortcut("Ctrl+Shift+Z")
|
||||
action {
|
||||
undoRedoService.redo(scope)
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
button(text = "Rows", graphic = FontIcon("fa-minus")) {
|
||||
action {
|
||||
mapVM.rows = max(mapVM.rows - 1, 1)
|
||||
mapVM.commit()
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
button(text = "Columns", graphic = FontIcon("fa-minus")) {
|
||||
action {
|
||||
mapVM.columns = max(mapVM.columns - 1, 1)
|
||||
mapVM.commit()
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
button(text = "Rows", graphic = FontIcon("fa-plus")) {
|
||||
action {
|
||||
++mapVM.rows
|
||||
mapVM.commit()
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
button(text = "Columns", graphic = FontIcon("fa-plus")) {
|
||||
action {
|
||||
++mapVM.columns
|
||||
mapVM.commit()
|
||||
fire(RedrawMapRequestEvent)
|
||||
}
|
||||
}
|
||||
|
||||
togglebutton(tool) {
|
||||
graphic = FontIcon("fa-paint-brush")
|
||||
}
|
||||
|
||||
togglebutton(tool) {
|
||||
graphic = FontIcon("fa-eraser")
|
||||
}
|
||||
|
||||
this += FontIcon("fa-paint-brush")
|
||||
|
||||
button(graphic = FontIcon("fa-plus")) {
|
||||
enableWhen(brushVM.brushRangeProperty.lessThan(5))
|
||||
action {
|
||||
brushVM.item = brushVM.withBrushRange(brushVM.brushRange + 1)
|
||||
}
|
||||
}
|
||||
|
||||
button(graphic = FontIcon("fa-minus")) {
|
||||
enableWhen(brushVM.brushRangeProperty.greaterThan(1))
|
||||
action {
|
||||
brushVM.item = brushVM.withBrushRange(brushVM.brushRange - 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,8 +2,7 @@ package com.bartlomiejpluta.base.editor.viewmodel.map
|
||||
|
||||
import com.bartlomiejpluta.base.editor.model.map.brush.Brush
|
||||
import com.bartlomiejpluta.base.editor.model.tileset.Tile
|
||||
import tornadofx.ItemViewModel
|
||||
import tornadofx.getValue
|
||||
import tornadofx.*
|
||||
|
||||
class BrushVM : ItemViewModel<Brush>(Brush(arrayOf(arrayOf()))) {
|
||||
val brush = bind(Brush::brush)
|
||||
@@ -20,5 +19,10 @@ class BrushVM : ItemViewModel<Brush>(Brush(arrayOf(arrayOf()))) {
|
||||
val centerColumnProperty = bind(Brush::centerColumnProperty)
|
||||
val centerColumn by centerColumnProperty
|
||||
|
||||
val brushRangeProperty = bind(Brush::brushRangeProperty)
|
||||
var brushRange by brushRangeProperty
|
||||
|
||||
fun forEach(consumer: (row: Int, column: Int, tile: Tile) -> Unit) = item.forEach(consumer)
|
||||
|
||||
fun withBrushRange(range: Int) = item.withBrushRange(range)
|
||||
}
|
||||
Reference in New Issue
Block a user