diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/component/ParameterValueEditingCell.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/component/ParameterValueEditingCell.kt index 1f8b800e..8839c1f5 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/component/ParameterValueEditingCell.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/component/ParameterValueEditingCell.kt @@ -1,11 +1,21 @@ package com.bartlomiejpluta.base.editor.common.parameter.component import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter +import javafx.event.EventHandler import javafx.scene.control.TableCell import javafx.scene.input.KeyCode import javafx.scene.input.KeyEvent class ParameterValueEditingCell : TableCell, Any>() { + private val parameter: Parameter<*>? + get() = tableView.items.getOrNull(index) + + private val commitKeyHandler = EventHandler { + if (it.code == KeyCode.ENTER) { + commitEdit(null) + it.consume() + } + } override fun updateItem(item: Any?, empty: Boolean) { super.updateItem(item, empty) @@ -18,46 +28,41 @@ class ParameterValueEditingCell : TableCell, Any>() { isEditing -> { text = null - graphic = tableView.items[index].editor + graphic = parameter?.editor } else -> { - text = tableView.items[index].valueString + text = parameter?.valueString graphic = null } } } - override fun commitEdit(newValue: Any?) { - super.commitEdit(newValue) - tableView.items[index]?.commit() - } - override fun startEdit() { if (index < 0 || index >= tableView.items.size) { return } - if (!tableView.items[index].editable) { + if (parameter?.editable?.let { !it } == true) { return } super.startEdit() text = null - val parameter = tableView.items[index] - graphic = parameter.editor.apply { - addEventHandler(KeyEvent.KEY_PRESSED) { - if (it.code == KeyCode.ENTER) { - commitEdit(parameter.value) - it.consume() - } - } - } + graphic = parameter?.editor + parameter?.editor?.addEventHandler(KeyEvent.KEY_PRESSED, commitKeyHandler) + } + + override fun commitEdit(newValue: Any?) { + parameter?.commit() + super.commitEdit(parameter?.value) + parameter?.editor?.removeEventFilter(KeyEvent.KEY_PRESSED, commitKeyHandler) } override fun cancelEdit() { super.cancelEdit() - text = tableView.items[index]?.valueString + text = parameter?.valueString graphic = null + parameter?.editor?.removeEventFilter(KeyEvent.KEY_PRESSED, commitKeyHandler) } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/EnumParameter.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/EnumParameter.kt index 0d289d25..8e0263e5 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/EnumParameter.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/EnumParameter.kt @@ -7,8 +7,9 @@ class EnumParameter>( key: String, initialValue: E, editable: Boolean = true, - autocommit: Boolean = false -) : Parameter(key, initialValue, editable, autocommit) { + autocommit: Boolean = false, + onCommit: (oldValue: E, newValue: E, submit: () -> Unit) -> Unit = { _, _, submit -> submit() } +) : Parameter(key, initialValue, editable, autocommit, onCommit) { override val editor = ComboBox().apply { items.setAll(initialValue.javaClass.enumConstants.toList()) } override val editorValueProperty: Property get() = editor.valueProperty() diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/IntegerParameter.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/IntegerParameter.kt index aa8dd3b3..56b7644b 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/IntegerParameter.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/IntegerParameter.kt @@ -9,8 +9,9 @@ class IntegerParameter( minValue: Int, maxValue: Int, editable: Boolean = true, - autocommit: Boolean = false -) : Parameter(key, initialValue, editable, autocommit) { + autocommit: Boolean = false, + onCommit: (oldValue: Int, newValue: Int, submit: () -> Unit) -> Unit = { _, _, submit -> submit() }, +) : Parameter(key, initialValue, editable, autocommit, onCommit) { override val editor = Spinner(minValue, maxValue, initialValue).apply { isEditable = true } override val editorValueProperty: Property get() = editor.valueFactory.valueProperty() diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/Parameter.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/Parameter.kt index b0bea015..4a3a2938 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/Parameter.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/Parameter.kt @@ -9,7 +9,8 @@ abstract class Parameter( key: String, initialValue: T? = null, editable: Boolean = true, - private val autocommit: Boolean = false + private val autocommit: Boolean = false, + private val onCommit: (oldValue: T, newValue: T, submit: () -> Unit) -> Unit = { _, _, submit -> submit() } ) { val keyProperty = ReadOnlyStringWrapper(key) val key by keyProperty @@ -22,13 +23,18 @@ abstract class Parameter( fun commit() { if (!autocommit) { - value = editorValueProperty.value + onCommit(value, editorValueProperty.value, this::submit) } } + private fun submit() { + value = editorValueProperty.value + } + protected fun init() { if (autocommit) { editorValueProperty.bindBidirectional(valueProperty) + valueProperty.addListener { _, oldValue, newValue -> onCommit(oldValue, newValue, NOOP) } } else { editorValueProperty.value = value valueProperty.addListener { _, _, v -> editorValueProperty.value = v } @@ -41,4 +47,8 @@ abstract class Parameter( open val valueString: String get() = value.toString() + + companion object { + private val NOOP = {} + } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/StringParameter.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/StringParameter.kt index 6a74c24c..48c5630f 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/StringParameter.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/StringParameter.kt @@ -5,11 +5,12 @@ import javafx.scene.control.TextField class StringParameter( key: String, - initialValue: String? = null, + initialValue: String = "", editable: Boolean = true, - autocommit: Boolean = false + autocommit: Boolean = false, + onCommit: (oldValue: String, newValue: String, submit: () -> Unit) -> Unit = { _, _, submit -> submit() } ) : - Parameter(key, initialValue, editable, autocommit) { + Parameter(key, initialValue, editable, autocommit, onCommit) { override val editor = TextField() override val editorValueProperty: Property get() = editor.textProperty()