From c9010c5fdc05468c3ca187cbdc16a76f7319eb48 Mon Sep 17 00:00:00 2001 From: SomeTroglodyte <63000004+SomeTroglodyte@users.noreply.github.com> Date: Tue, 13 Jul 2021 19:55:22 +0200 Subject: [PATCH] Tweaked Slider, use in MapParametersTable (#4506) --- .../ui/newgamescreen/MapParametersTable.kt | 22 +- core/src/com/unciv/ui/utils/UncivSlider.kt | 227 ++++++++++++++++++ 2 files changed, 237 insertions(+), 12 deletions(-) create mode 100644 core/src/com/unciv/ui/utils/UncivSlider.kt diff --git a/core/src/com/unciv/ui/newgamescreen/MapParametersTable.kt b/core/src/com/unciv/ui/newgamescreen/MapParametersTable.kt index 85a0775fa3..fec0e10779 100644 --- a/core/src/com/unciv/ui/newgamescreen/MapParametersTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/MapParametersTable.kt @@ -2,7 +2,6 @@ package com.unciv.ui.newgamescreen import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.scenes.scene2d.ui.CheckBox -import com.badlogic.gdx.scenes.scene2d.ui.Slider import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.TextField import com.badlogic.gdx.scenes.scene2d.ui.TextField.TextFieldFilter.DigitsOnlyFilter @@ -226,12 +225,11 @@ class MapParametersTable(val mapParameters: MapParameters, val isEmptyMapAllowed advancedSettingsTable.add("RNG Seed".toLabel()).left() advancedSettingsTable.add(seedTextField).fillX().row() - val sliders = HashMapFloat>() + val sliders = HashMapFloat>() - fun addSlider(text: String, getValue:()->Float, min:Float, max:Float, onChange: (value:Float)->Unit): Slider { - val slider = Slider(min, max, (max - min) / 20, false, skin) + fun addSlider(text: String, getValue:()->Float, min:Float, max:Float, onChange: (value:Float)->Unit): UncivSlider { + val slider = UncivSlider(min, max, (max - min) / 20, onChange = onChange) slider.value = getValue() - slider.onChange { onChange(slider.value) } advancedSettingsTable.add(text.toLabel()).left() advancedSettingsTable.add(slider).fillX().row() sliders[slider] = getValue @@ -239,25 +237,25 @@ class MapParametersTable(val mapParameters: MapParameters, val isEmptyMapAllowed } addSlider("Map Height", {mapParameters.elevationExponent}, 0.6f,0.8f) - {mapParameters.elevationExponent=it} + { mapParameters.elevationExponent = it } addSlider("Temperature extremeness", {mapParameters.temperatureExtremeness}, 0.4f,0.8f) - { mapParameters.temperatureExtremeness = it} + { mapParameters.temperatureExtremeness = it } addSlider("Resource richness", {mapParameters.resourceRichness},0f,0.5f) - { mapParameters.resourceRichness=it } + { mapParameters.resourceRichness = it } addSlider("Vegetation richness", {mapParameters.vegetationRichness}, 0f, 1f) - { mapParameters.vegetationRichness=it } + { mapParameters.vegetationRichness = it } addSlider("Rare features richness", {mapParameters.rareFeaturesRichness}, 0f, 0.5f) { mapParameters.rareFeaturesRichness = it } addSlider("Max Coast extension", {mapParameters.maxCoastExtension.toFloat()}, 0f, 5f) - { mapParameters.maxCoastExtension =it.toInt() }.apply { stepSize=1f } + { mapParameters.maxCoastExtension = it.toInt() }.apply { stepSize = 1f } addSlider("Biome areas extension", {mapParameters.tilesPerBiomeArea.toFloat()}, 1f, 15f) - { mapParameters.tilesPerBiomeArea = it.toInt() }.apply { stepSize=1f } + { mapParameters.tilesPerBiomeArea = it.toInt() }.apply { stepSize = 1f } addSlider("Water level", {mapParameters.waterThreshold}, -0.1f, 0.1f) { mapParameters.waterThreshold = it } @@ -266,7 +264,7 @@ class MapParametersTable(val mapParameters: MapParameters, val isEmptyMapAllowed resetToDefaultButton.onClick { mapParameters.resetAdvancedSettings() seedTextField.text = mapParameters.seed.toString() - for(entry in sliders) + for (entry in sliders) entry.key.value = entry.value() } advancedSettingsTable.add(resetToDefaultButton).colspan(2).row() diff --git a/core/src/com/unciv/ui/utils/UncivSlider.kt b/core/src/com/unciv/ui/utils/UncivSlider.kt new file mode 100644 index 0000000000..72c5966c21 --- /dev/null +++ b/core/src/com/unciv/ui/utils/UncivSlider.kt @@ -0,0 +1,227 @@ +package com.unciv.ui.utils + +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.math.Interpolation +import com.badlogic.gdx.math.Vector2 +import com.badlogic.gdx.scenes.scene2d.* +import com.badlogic.gdx.scenes.scene2d.actions.Actions +import com.badlogic.gdx.scenes.scene2d.ui.* +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener +import com.badlogic.gdx.utils.Align +import com.badlogic.gdx.utils.Timer + +/** + * Modified Gdx [Slider] + * + * Has +/- buttons at the end for easier single steps + * Shows a timed tip with the actual value every time it changes + * Disables listeners of any ScrollPanes this is nested in while dragging + * + * Note: No attempt is made to distinguish sources of value changes, so the initial setting + * of the value when a screen is initialized will also trigger the 'tip'. This is intentional. + * + * @param min Initializes [Slider.min] + * @param max Initializes [Slider.max] + * @param step Initializes [Slider.stepSize] + * @param vertical Initializes [Slider.vertical] + * @param plusMinus Enable +/- buttons + * @param onChange Optional lambda gets called with the current value on change + */ +class UncivSlider ( + min: Float, + max: Float, + step: Float, + vertical: Boolean = false, + plusMinus: Boolean = true, + onChange: ((Float) -> Unit)? = null +): Table(CameraStageBaseScreen.skin) { + // constants for geometry tuning + companion object { + const val plusMinusFontSize = 18 + const val plusMinusCircleSize = 20f + const val padding = 5f // padding around the Slider, doubled between it and +/- buttons + const val hideDelay = 3f // delay in s to hide tooltip + const val tipAnimationDuration = 0.2f // tip show/hide duration in s + } + + // component widgets + private val slider = Slider(min, max, step, vertical, CameraStageBaseScreen.skin) + private val minusButton: IconCircleGroup? + private val plusButton: IconCircleGroup? + private val tipLabel = "".toLabel(Color.LIGHT_GRAY) + private val tipContainer: Container