[Editor] Enable controlling color and opacity of ImageLayer via parameters

This commit is contained in:
2021-02-18 20:00:49 +01:00
parent df74c40107
commit f85fa5ecc2
6 changed files with 111 additions and 2 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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<ImageLayer> {
override fun bind(layer: ImageLayer, parameters: ObservableList<Parameter<*>>, 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<Parameter<*>>) {
(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)
}
}

View File

@@ -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<T : Layer> {
fun bind(layer: T, parameters: ObservableList<Parameter<*>>, onCommit: () -> Unit)
fun unbind(layer: T, parameters: ObservableList<Parameter<*>>)
}

View File

@@ -18,6 +18,7 @@ class MapFragment : Fragment() {
private val tileSetView = find<TileSetView>()
private val toolbarView = find<MapToolbarView>()
private val statusBarView = find<MapStatusBarView>()
private val layerParameters = find<MapLayerParameters>()
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

View File

@@ -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<EditorStateVM>()
// 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<Parameter<*>>()
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>(ParametersTableFragment::parameters to parameters).root
}