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 new file mode 100644 index 00000000..41643ed4 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/component/ParameterValueEditingCell.kt @@ -0,0 +1,48 @@ +package com.bartlomiejpluta.base.editor.common.parameter.component + +import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter +import javafx.scene.control.TableCell + +class ParameterValueEditingCell : TableCell, Any>() { + + override fun updateItem(item: Any?, empty: Boolean) { + super.updateItem(item, empty) + + when { + empty || item == null -> { + text = null + graphic = null + } + + isEditing -> { + text = null + graphic = tableView.items[index].editor + } + + else -> { + text = tableView.items[index].valueString + graphic = null + } + } + } + + override fun startEdit() { + if (index < 0 || index >= tableView.items.size) { + return + } + + if (!tableView.items[index].editable) { + return + } + + super.startEdit() + text = null + graphic = tableView.items[index].editor + } + + override fun cancelEdit() { + super.cancelEdit() + text = tableView.items[index]?.valueString + graphic = null + } +} \ 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 new file mode 100644 index 00000000..72f61d9c --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/EnumParameter.kt @@ -0,0 +1,14 @@ +package com.bartlomiejpluta.base.editor.common.parameter.model + +import javafx.scene.control.ComboBox + +class EnumParameter>( + key: String, + initialValue: E, + editable: Boolean = true +) : Parameter(key, initialValue, editable) { + override val editor = ComboBox().apply { + items.setAll(initialValue.javaClass.enumConstants.toList()) + valueProperty().bindBidirectional(valueProperty) + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..c088be83 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/IntegerParameter.kt @@ -0,0 +1,16 @@ +package com.bartlomiejpluta.base.editor.common.parameter.model + +import javafx.scene.control.Spinner + +class IntegerParameter( + key: String, + initialValue: Int, + minValue: Int, + maxValue: Int, + editable: Boolean = true, +) : Parameter(key, initialValue, editable) { + override val editor = Spinner(minValue, maxValue, initialValue).apply { + isEditable = true + valueFactory.valueProperty().bindBidirectional(valueProperty) + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..bca44c88 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/Parameter.kt @@ -0,0 +1,22 @@ +package com.bartlomiejpluta.base.editor.common.parameter.model + +import javafx.beans.property.* +import javafx.scene.Node +import tornadofx.getValue +import tornadofx.setValue + +abstract class Parameter(key: String, initialValue: T? = null, editable: Boolean = true) { + val keyProperty = ReadOnlyStringWrapper(key) + val key by keyProperty + + val editableProperty: BooleanProperty = SimpleBooleanProperty(editable) + var editable by editableProperty + + val valueProperty: ObjectProperty = SimpleObjectProperty(initialValue) + var value by valueProperty + + abstract val editor: Node + + open val valueString: String + get() = value.toString() +} \ 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 new file mode 100644 index 00000000..4197c74a --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/model/StringParameter.kt @@ -0,0 +1,8 @@ +package com.bartlomiejpluta.base.editor.common.parameter.model + +import javafx.scene.control.TextField + +class StringParameter(key: String, initialValue: String? = null, editable: Boolean = true) : + Parameter(key, initialValue, editable) { + override val editor = TextField().apply { textProperty().bind(valueProperty) } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/view/ParametersTableFragment.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/view/ParametersTableFragment.kt new file mode 100644 index 00000000..b61ca751 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/common/parameter/view/ParametersTableFragment.kt @@ -0,0 +1,24 @@ +package com.bartlomiejpluta.base.editor.common.parameter.view + +import com.bartlomiejpluta.base.editor.common.parameter.component.ParameterValueEditingCell +import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter +import javafx.beans.value.ObservableValue +import javafx.collections.ObservableList +import javafx.scene.control.TableColumn +import javafx.scene.control.TableView +import tornadofx.* + +class ParametersTableFragment : Fragment() { + val parameters: ObservableList> by param() + + override val root = tableview(parameters) { + isEditable = true + columnResizePolicy = TableView.CONSTRAINED_RESIZE_POLICY + + column("Key", Parameter<*>::keyProperty) + TableColumn, Any>("Value").apply { + setCellValueFactory { it.value.valueProperty as ObservableValue } + setCellFactory { ParameterValueEditingCell() } + }.let { addColumnInternal(it) } + } +} \ No newline at end of file