From f85fa5ecc220124b02e58dbc166804d0d588c64f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 18 Feb 2021 20:00:49 +0100 Subject: [PATCH] [Editor] Enable controlling color and opacity of ImageLayer via parameters --- .../base/editor/map/canvas/MapCanvas.kt | 14 ++++++++ .../base/editor/map/model/layer/ImageLayer.kt | 17 +++++++-- .../layer/ImageLayerParametersBinder.kt | 31 ++++++++++++++++ .../parameter/layer/LayerParametersBinder.kt | 10 ++++++ .../editor/map/view/editor/MapFragment.kt | 5 +++ .../map/view/editor/MapLayerParameters.kt | 36 +++++++++++++++++++ 6 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/ImageLayerParametersBinder.kt create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/LayerParametersBinder.kt create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapLayerParameters.kt diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/MapCanvas.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/MapCanvas.kt index a9714a7e..f35f217b 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/MapCanvas.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/MapCanvas.kt @@ -1,5 +1,6 @@ package com.bartlomiejpluta.base.editor.map.canvas +import com.bartlomiejpluta.base.editor.map.model.layer.ImageLayer import com.bartlomiejpluta.base.editor.map.model.layer.Layer import com.bartlomiejpluta.base.editor.map.model.layer.ObjectLayer import com.bartlomiejpluta.base.editor.map.model.layer.TileLayer @@ -50,6 +51,7 @@ class MapCanvas(val map: GameMapVM, private val editorStateVM: EditorStateVM, pr when (layer) { is TileLayer -> renderTileLayer(gc, layer) is ObjectLayer -> renderObjectPassageMap(gc, layer) + is ImageLayer -> renderImageLayer(gc, layer) } } @@ -84,6 +86,18 @@ class MapCanvas(val map: GameMapVM, private val editorStateVM: EditorStateVM, pr } } + private fun renderImageLayer(gc: GraphicsContext, imageLayer: ImageLayer) { + val alpha = gc.globalAlpha + val color = gc.fill + + gc.globalAlpha = imageLayer.alpha / 100.0 + gc.fill = Color.color(imageLayer.red / 100.0, imageLayer.green / 100.0, imageLayer.blue / 100.0) + gc.fillRect(0.0, 0.0, map.width, map.height) + + gc.globalAlpha = alpha + gc.fill = color + } + private fun renderGrid(gc: GraphicsContext) { if (!editorStateVM.showGrid) { return diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/layer/ImageLayer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/layer/ImageLayer.kt index a4ff62f9..b0de9d33 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/layer/ImageLayer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/layer/ImageLayer.kt @@ -1,5 +1,6 @@ package com.bartlomiejpluta.base.editor.map.model.layer +import javafx.beans.property.SimpleObjectProperty import javafx.beans.property.SimpleStringProperty import tornadofx.getValue import tornadofx.setValue @@ -7,9 +8,21 @@ import tornadofx.setValue class ImageLayer(name: String) : Layer { override val nameProperty = SimpleStringProperty(name) + override var name by nameProperty + + val redProperty = SimpleObjectProperty(100) + var red by redProperty + + val greenProperty = SimpleObjectProperty(100) + var green by greenProperty + + val blueProperty = SimpleObjectProperty(100) + var blue by blueProperty + + val alphaProperty = SimpleObjectProperty(100) + var alpha by alphaProperty + override fun resize(rows: Int, columns: Int) { // We essentially need to do nothing } - - override var name by nameProperty } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/ImageLayerParametersBinder.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/ImageLayerParametersBinder.kt new file mode 100644 index 00000000..628de902 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/ImageLayerParametersBinder.kt @@ -0,0 +1,31 @@ +package com.bartlomiejpluta.base.editor.map.parameter.layer + +import com.bartlomiejpluta.base.editor.common.parameter.model.IntegerParameter +import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter +import com.bartlomiejpluta.base.editor.map.model.layer.ImageLayer +import javafx.collections.ObservableList +import org.springframework.stereotype.Component + +@Component +class ImageLayerParametersBinder : LayerParametersBinder { + override fun bind(layer: ImageLayer, parameters: ObservableList>, onCommit: () -> Unit) { + val red = IntegerParameter("red", 100, 0, 100, autocommit = true) { _, _, _ -> onCommit() } + val green = IntegerParameter("green", 100, 0, 100, autocommit = true) { _, _, _ -> onCommit() } + val blue = IntegerParameter("blue", 100, 0, 100, autocommit = true) { _, _, _ -> onCommit() } + val alpha = IntegerParameter("alpha", 100, 0, 100, autocommit = true) { _, _, _ -> onCommit() } + + red.valueProperty.bindBidirectional(layer.redProperty) + green.valueProperty.bindBidirectional(layer.greenProperty) + blue.valueProperty.bindBidirectional(layer.blueProperty) + alpha.valueProperty.bindBidirectional(layer.alphaProperty) + + parameters.addAll(red, green, blue, alpha) + } + + override fun unbind(layer: ImageLayer, parameters: ObservableList>) { + (parameters[0] as IntegerParameter).valueProperty.unbindBidirectional(layer.redProperty) + (parameters[1] as IntegerParameter).valueProperty.unbindBidirectional(layer.greenProperty) + (parameters[2] as IntegerParameter).valueProperty.unbindBidirectional(layer.blueProperty) + (parameters[3] as IntegerParameter).valueProperty.unbindBidirectional(layer.alphaProperty) + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/LayerParametersBinder.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/LayerParametersBinder.kt new file mode 100644 index 00000000..274c916d --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/parameter/layer/LayerParametersBinder.kt @@ -0,0 +1,10 @@ +package com.bartlomiejpluta.base.editor.map.parameter.layer + +import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter +import com.bartlomiejpluta.base.editor.map.model.layer.Layer +import javafx.collections.ObservableList + +interface LayerParametersBinder { + fun bind(layer: T, parameters: ObservableList>, onCommit: () -> Unit) + fun unbind(layer: T, parameters: ObservableList>) +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapFragment.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapFragment.kt index 2e2399a7..71ca7fb8 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapFragment.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapFragment.kt @@ -18,6 +18,7 @@ class MapFragment : Fragment() { private val tileSetView = find() private val toolbarView = find() private val statusBarView = find() + private val layerParameters = find() private val isTileLayerSelected = Bindings.createBooleanBinding( { editorStateVM.selectedLayer is TileLayer }, @@ -41,6 +42,10 @@ class MapFragment : Fragment() { maxHeightProperty().bind(this@item.heightProperty()) } } + + item("Layer Parameters", expanded = false) { + this += layerParameters + } } bottom = statusBarView.root diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapLayerParameters.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapLayerParameters.kt new file mode 100644 index 00000000..3c450309 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/view/editor/MapLayerParameters.kt @@ -0,0 +1,36 @@ +package com.bartlomiejpluta.base.editor.map.view.editor + +import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter +import com.bartlomiejpluta.base.editor.common.parameter.view.ParametersTableFragment +import com.bartlomiejpluta.base.editor.event.RedrawMapRequestEvent +import com.bartlomiejpluta.base.editor.map.model.layer.ImageLayer +import com.bartlomiejpluta.base.editor.map.parameter.layer.ImageLayerParametersBinder +import com.bartlomiejpluta.base.editor.map.viewmodel.EditorStateVM +import tornadofx.View +import tornadofx.observableListOf + +class MapLayerParameters : View() { + private val editorStateVM = find() + + // For some reason Spring does not want to autowire a list of beans + // of LayerParametersBinder<> type + private val imageLayerParametersBinder: ImageLayerParametersBinder by di() + + private val parameters = observableListOf>() + + init { + editorStateVM.selectedLayerProperty.addListener { _, previousLayer, layer -> + when (previousLayer) { + is ImageLayer -> imageLayerParametersBinder.unbind(previousLayer, parameters) + } + + parameters.clear() + + when (layer) { + is ImageLayer -> imageLayerParametersBinder.bind(layer, parameters) { fire(RedrawMapRequestEvent) } + } + } + } + + override val root = find(ParametersTableFragment::parameters to parameters).root +} \ No newline at end of file