diff --git a/core/src/com/unciv/UncivGame.kt b/core/src/com/unciv/UncivGame.kt index 64d70692c0..10c24cca16 100644 --- a/core/src/com/unciv/UncivGame.kt +++ b/core/src/com/unciv/UncivGame.kt @@ -256,11 +256,7 @@ open class UncivGame(val isConsoleMode: Boolean = false) : Game(), PlatformSpeci throw UnsupportedOperationException("Use pushScreen or replaceCurrentScreen instead") } - override fun getScreen(): BaseScreen? { - val curScreen = super.getScreen() - return if (curScreen == null) { null } else { curScreen as BaseScreen - } - } + override fun getScreen(): BaseScreen? = super.getScreen() as? BaseScreen private fun setScreen(newScreen: BaseScreen) { debug("Setting new screen: %s, screenStack: %s", newScreen, screenStack) diff --git a/core/src/com/unciv/ui/components/extensions/Scene2dExtensions.kt b/core/src/com/unciv/ui/components/extensions/Scene2dExtensions.kt index 3e5ce865c7..0b0b6d44f8 100644 --- a/core/src/com/unciv/ui/components/extensions/Scene2dExtensions.kt +++ b/core/src/com/unciv/ui/components/extensions/Scene2dExtensions.kt @@ -366,6 +366,8 @@ object GdxKeyCodeFixes { } } +fun Input.isShiftKeyPressed() = isKeyPressed(Input.Keys.SHIFT_LEFT) || isKeyPressed(Input.Keys.SHIFT_RIGHT) +fun Input.isControlKeyPressed() = isKeyPressed(Input.Keys.CONTROL_LEFT) || isKeyPressed(Input.Keys.CONTROL_RIGHT) fun Input.areSecretKeysPressed() = isKeyPressed(Input.Keys.SHIFT_RIGHT) && (isKeyPressed(Input.Keys.CONTROL_RIGHT) || isKeyPressed(Input.Keys.ALT_RIGHT)) diff --git a/core/src/com/unciv/ui/components/input/KeyShortcutListener.kt b/core/src/com/unciv/ui/components/input/KeyShortcutListener.kt index 83441e95ef..f18f67fcb1 100644 --- a/core/src/com/unciv/ui/components/input/KeyShortcutListener.kt +++ b/core/src/com/unciv/ui/components/input/KeyShortcutListener.kt @@ -1,11 +1,11 @@ package com.unciv.ui.components.input import com.badlogic.gdx.Gdx -import com.badlogic.gdx.Input import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.InputEvent import com.badlogic.gdx.scenes.scene2d.InputListener +import com.unciv.ui.components.extensions.isControlKeyPressed import com.unciv.ui.components.input.KeyShortcutDispatcherVeto.DispatcherVetoResult @@ -20,7 +20,7 @@ import com.unciv.ui.components.input.KeyShortcutDispatcherVeto.DispatcherVetoRes val key = when { event == null -> KeyCharAndCode.UNKNOWN - Gdx.input.isKeyPressed(Input.Keys.CONTROL_LEFT) || Gdx.input.isKeyPressed(Input.Keys.CONTROL_RIGHT) -> + Gdx.input.isControlKeyPressed() -> KeyCharAndCode.ctrlFromCode(event.keyCode) else -> KeyCharAndCode(event.keyCode) diff --git a/core/src/com/unciv/ui/components/input/KeyboardPanningListener.kt b/core/src/com/unciv/ui/components/input/KeyboardPanningListener.kt index 91245fd645..03b92d77db 100644 --- a/core/src/com/unciv/ui/components/input/KeyboardPanningListener.kt +++ b/core/src/com/unciv/ui/components/input/KeyboardPanningListener.kt @@ -1,12 +1,12 @@ package com.unciv.ui.components.input import com.badlogic.gdx.Gdx -import com.badlogic.gdx.Input import com.badlogic.gdx.scenes.scene2d.InputEvent import com.badlogic.gdx.scenes.scene2d.InputListener import com.badlogic.gdx.scenes.scene2d.actions.Actions import com.badlogic.gdx.scenes.scene2d.actions.RepeatAction import com.badlogic.gdx.scenes.scene2d.ui.TextField +import com.unciv.ui.components.extensions.isControlKeyPressed import com.unciv.ui.components.widgets.ZoomableScrollPane class KeyboardPanningListener( @@ -40,9 +40,8 @@ class KeyboardPanningListener( if (event.target is TextField) return false if (keycode !in allowedKeys) return false // Without the following Ctrl-S would leave WASD map scrolling stuck - // Might be obsolete with keyboard shortcut refactoring - if (Gdx.input.isKeyPressed(Input.Keys.CONTROL_LEFT)) return false - if (Gdx.input.isKeyPressed(Input.Keys.CONTROL_RIGHT)) return false + // _Not_ obsolete with keyboard shortcut refactoring + if (Gdx.input.isControlKeyPressed()) return false pressedKeys.add(keycode) startLoop() return true diff --git a/core/src/com/unciv/ui/components/widgets/KeyCapturingButton.kt b/core/src/com/unciv/ui/components/widgets/KeyCapturingButton.kt index 5c6fb3cf50..0f87f320e5 100644 --- a/core/src/com/unciv/ui/components/widgets/KeyCapturingButton.kt +++ b/core/src/com/unciv/ui/components/widgets/KeyCapturingButton.kt @@ -11,6 +11,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable import com.badlogic.gdx.utils.Align import com.unciv.ui.components.UncivTooltip.Companion.addTooltip +import com.unciv.ui.components.extensions.isControlKeyPressed import com.unciv.ui.components.fonts.Fonts import com.unciv.ui.components.input.KeyCharAndCode import com.unciv.ui.images.ImageGetter @@ -116,10 +117,6 @@ class KeyCapturingButton( // Instead of storing a button reference one could use `(event?.listenerActor as? KeyCapturingButton)?.` private class ButtonListener(private val myButton: KeyCapturingButton) : ClickListener() { - private fun controlDown() = - Gdx.input.isKeyPressed(Input.Keys.CONTROL_LEFT) || - Gdx.input.isKeyPressed(Input.Keys.CONTROL_RIGHT) - override fun enter(event: InputEvent?, x: Float, y: Float, pointer: Int, fromActor: Actor?) { if (myButton.stage == null) return myButton.savedFocus = myButton.stage.keyboardFocus @@ -135,7 +132,7 @@ class KeyCapturingButton( override fun keyDown(event: InputEvent?, keycode: Int): Boolean { if (keycode == Input.Keys.ESCAPE || keycode == Input.Keys.UNKNOWN) return false if (keycode == Input.Keys.CONTROL_LEFT || keycode == Input.Keys.CONTROL_RIGHT) return false - myButton.handleKey(keycode, controlDown()) + myButton.handleKey(keycode, Gdx.input.isControlKeyPressed()) return true } diff --git a/core/src/com/unciv/ui/components/widgets/UncivSlider.kt b/core/src/com/unciv/ui/components/widgets/UncivSlider.kt index 3ba8e6e164..a7214679e8 100644 --- a/core/src/com/unciv/ui/components/widgets/UncivSlider.kt +++ b/core/src/com/unciv/ui/components/widgets/UncivSlider.kt @@ -1,7 +1,6 @@ package com.unciv.ui.components.widgets import com.badlogic.gdx.Gdx -import com.badlogic.gdx.Input import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.math.Interpolation import com.badlogic.gdx.math.Vector2 @@ -21,10 +20,12 @@ import com.badlogic.gdx.utils.Timer import com.unciv.Constants import com.unciv.models.UncivSound import com.unciv.ui.audio.SoundPlayer -import com.unciv.ui.images.IconCircleGroup -import com.unciv.ui.components.input.onClick +import com.unciv.ui.components.extensions.isShiftKeyPressed import com.unciv.ui.components.extensions.surroundWithCircle import com.unciv.ui.components.extensions.toLabel +import com.unciv.ui.components.input.onClick +import com.unciv.ui.components.widgets.UncivSlider.Companion.formatPercent +import com.unciv.ui.images.IconCircleGroup import com.unciv.ui.screens.basescreen.BaseScreen import kotlin.math.abs import kotlin.math.sign @@ -132,10 +133,10 @@ class UncivSlider ( setPlusMinusEnabled() } /** Will make this slider snap to the specified values, if the knob is within the threshold. */ - fun setSnapToValues(values: FloatArray?, threshold: Float) { + fun setSnapToValues(threshold: Float, vararg values: Float) { snapToValues = values // make a copy so our plus/minus code can snap snapThreshold = threshold - slider.setSnapToValues(values, threshold) + slider.setSnapToValues(threshold, *values) } // java format string for the value tip, set by changing stepSize @@ -206,10 +207,7 @@ class UncivSlider ( // un-snapping with Shift is taken from Slider source, and the loop mostly as well // with snap active, plus/minus buttons will go to the next snap position regardless of stepSize // this could be shorter if Slider.snap(), Slider.snapValues and Slider.threshold weren't protected - if (snapToValues?.isEmpty() != false || - Gdx.input.isKeyPressed(Input.Keys.SHIFT_LEFT) || - Gdx.input.isKeyPressed(Input.Keys.SHIFT_RIGHT) - ) { + if (snapToValues?.isEmpty() != false || Gdx.input.isShiftKeyPressed()) { value += delta onChange?.invoke(value) return diff --git a/core/src/com/unciv/ui/components/widgets/ZoomableScrollPane.kt b/core/src/com/unciv/ui/components/widgets/ZoomableScrollPane.kt index 9fce1b10d3..fc8e853749 100644 --- a/core/src/com/unciv/ui/components/widgets/ZoomableScrollPane.kt +++ b/core/src/com/unciv/ui/components/widgets/ZoomableScrollPane.kt @@ -15,8 +15,8 @@ import com.badlogic.gdx.scenes.scene2d.actions.TemporalAction import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener import com.badlogic.gdx.scenes.scene2d.utils.Cullable -import com.unciv.models.metadata.GameSettings import com.unciv.UncivGame +import com.unciv.models.metadata.GameSettings import com.unciv.ui.components.ZoomGestureListener import com.unciv.ui.components.input.KeyboardPanningListener import java.lang.Float.max @@ -70,6 +70,8 @@ open class ZoomableScrollPane( return if (group.hasChildren()) group.children[0] else null } + // This override will be called from ScrollPane's constructor to store the empty Group() we're passing, + // therefore super.getActor() _can_ return null. override fun setActor(content: Actor?) { val group: Group? = super.getActor() as Group? if (group != null) { diff --git a/core/src/com/unciv/ui/popups/options/DisplayTab.kt b/core/src/com/unciv/ui/popups/options/DisplayTab.kt index 6f4d21bb42..cbef717eba 100644 --- a/core/src/com/unciv/ui/popups/options/DisplayTab.kt +++ b/core/src/com/unciv/ui/popups/options/DisplayTab.kt @@ -12,15 +12,15 @@ import com.unciv.models.metadata.GameSettings.ScreenSize import com.unciv.models.skins.SkinCache import com.unciv.models.tilesets.TileSetCache import com.unciv.models.translations.tr -import com.unciv.ui.components.widgets.TranslatedSelectBox -import com.unciv.ui.components.widgets.UncivSlider -import com.unciv.ui.components.widgets.WrappableLabel import com.unciv.ui.components.extensions.addSeparator import com.unciv.ui.components.extensions.brighten import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toTextButton import com.unciv.ui.components.input.onChange import com.unciv.ui.components.input.onClick +import com.unciv.ui.components.widgets.TranslatedSelectBox +import com.unciv.ui.components.widgets.UncivSlider +import com.unciv.ui.components.widgets.WrappableLabel import com.unciv.ui.images.ImageGetter import com.unciv.ui.popups.ConfirmPopup import com.unciv.ui.screens.basescreen.BaseScreen @@ -169,7 +169,7 @@ private fun addPediaUnitArtSizeSlider(table: Table, settings: GameSettings, sele settings.pediaUnitArtSize = it GUI.setUpdateWorldOnNextRender() } - unitArtSizeSlider.setSnapToValues(floatArrayOf(0f, 32f, 48f, 64f, 96f, 120f, 180f, 240f, 360f), 60f) + unitArtSizeSlider.setSnapToValues(threshold = 60f, 0f, 32f, 48f, 64f, 96f, 120f, 180f, 240f, 360f) table.add(unitArtSizeSlider).minWidth(selectBoxMinWidth).pad(10f).row() } diff --git a/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorViewTab.kt b/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorViewTab.kt index 9260e2ca0f..8163f668ec 100644 --- a/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorViewTab.kt +++ b/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorViewTab.kt @@ -16,16 +16,16 @@ import com.unciv.models.ruleset.nation.Nation import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.stats.Stats import com.unciv.models.translations.tr -import com.unciv.ui.components.widgets.ExpanderTab -import com.unciv.ui.components.widgets.TabbedPager -import com.unciv.ui.components.widgets.UncivSlider -import com.unciv.ui.components.widgets.WrappableLabel import com.unciv.ui.components.extensions.addSeparator import com.unciv.ui.components.extensions.darken import com.unciv.ui.components.extensions.pad import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toTextButton import com.unciv.ui.components.input.onClick +import com.unciv.ui.components.widgets.ExpanderTab +import com.unciv.ui.components.widgets.TabbedPager +import com.unciv.ui.components.widgets.UncivSlider +import com.unciv.ui.components.widgets.WrappableLabel import com.unciv.ui.popups.ToastPopup import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.screens.civilopediascreen.CivilopediaScreen @@ -230,7 +230,7 @@ class MapEditorViewTab( editorScreen.updateTile(tile) editorScreen.isDirty = true } - slider.setSnapToValues(floatArrayOf(0f,1f,2f,3f,4f,5f,6f,7f,8f,9f,10f,12f,15f,20f,30f,40f), 5f) + slider.setSnapToValues(threshold = 5f, 0f,1f,2f,3f,4f,5f,6f,7f,8f,9f,10f,12f,15f,20f,30f,40f) add(slider).right().minWidth(80f).fillX().padTop(15f) }).fillX() } diff --git a/core/src/com/unciv/ui/screens/newgamescreen/GameOptionsTable.kt b/core/src/com/unciv/ui/screens/newgamescreen/GameOptionsTable.kt index 71a71ec4cb..3f87c8502f 100644 --- a/core/src/com/unciv/ui/screens/newgamescreen/GameOptionsTable.kt +++ b/core/src/com/unciv/ui/screens/newgamescreen/GameOptionsTable.kt @@ -338,7 +338,7 @@ class GameOptionsTable( } slider.isDisabled = locked val snapValues = floatArrayOf(100f,150f,200f,250f,300f,350f,400f,450f,500f,550f,600f,650f,700f,750f,800f,900f,1000f,1250f,1500f) - slider.setSnapToValues(snapValues, 125f) + slider.setSnapToValues(threshold = 125f, *snapValues) return slider } diff --git a/core/src/com/unciv/ui/screens/worldscreen/WorldMapHolder.kt b/core/src/com/unciv/ui/screens/worldscreen/WorldMapHolder.kt index 0b2e9f41f9..fc6c36d9f6 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/WorldMapHolder.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/WorldMapHolder.kt @@ -2,7 +2,6 @@ package com.unciv.ui.screens.worldscreen import com.badlogic.gdx.Application import com.badlogic.gdx.Gdx -import com.badlogic.gdx.Input import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.Batch import com.badlogic.gdx.math.Vector2 @@ -35,6 +34,7 @@ import com.unciv.ui.components.MiscArrowTypes import com.unciv.ui.components.extensions.center import com.unciv.ui.components.extensions.colorFromRGB import com.unciv.ui.components.extensions.darken +import com.unciv.ui.components.extensions.isShiftKeyPressed import com.unciv.ui.components.extensions.surroundWithCircle import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.input.ActivationTypes @@ -423,7 +423,7 @@ class WorldMapHolder( if (unit.currentMovement == 0f) unitGroup.color.a = 0.66f unitGroup.touchable = Touchable.enabled unitGroup.onClick { - worldScreen.bottomUnitTable.selectUnit(unit, Gdx.input.isKeyPressed(Input.Keys.SHIFT_LEFT)) + worldScreen.bottomUnitTable.selectUnit(unit, Gdx.input.isShiftKeyPressed()) worldScreen.shouldUpdate = true removeUnitActionOverlay() } diff --git a/core/src/com/unciv/ui/screens/worldscreen/unit/UnitTable.kt b/core/src/com/unciv/ui/screens/worldscreen/unit/UnitTable.kt index 38c041b0d5..6d489b7dd1 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/unit/UnitTable.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/unit/UnitTable.kt @@ -1,7 +1,6 @@ package com.unciv.ui.screens.worldscreen.unit import com.badlogic.gdx.Gdx -import com.badlogic.gdx.Input import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.Touchable @@ -16,6 +15,7 @@ import com.unciv.models.translations.tr import com.unciv.ui.components.extensions.addSeparator import com.unciv.ui.components.extensions.center import com.unciv.ui.components.extensions.darken +import com.unciv.ui.components.extensions.isShiftKeyPressed import com.unciv.ui.components.extensions.toImageButton import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.input.onClick @@ -352,7 +352,7 @@ class UnitTable(val worldScreen: WorldScreen) : Table() { selectedTile.isCityCenter() && (selectedTile.getOwner() == worldScreen.viewingCiv || worldScreen.viewingCiv.isSpectator()) -> citySelected(selectedTile.getCity()!!) - nextUnit != null -> selectUnit(nextUnit, Gdx.input.isKeyPressed(Input.Keys.SHIFT_LEFT)) + nextUnit != null -> selectUnit(nextUnit, Gdx.input.isShiftKeyPressed()) selectedTile == previouslySelectedUnit?.currentTile -> { selectUnit() isVisible = false