Make 'Home Home' shortcut always open capital's city screen (#7186)

This commit is contained in:
Paul Pogonyshev 2022-06-18 01:53:29 +02:00 committed by GitHub
parent 4d9f99fff3
commit 71160b2e63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 48 deletions

View File

@ -1,6 +1,5 @@
package com.unciv.ui.mapeditor package com.unciv.ui.mapeditor
import com.badlogic.gdx.math.Interpolation
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.Action import com.badlogic.gdx.scenes.scene2d.Action
import com.badlogic.gdx.scenes.scene2d.EventListener import com.badlogic.gdx.scenes.scene2d.EventListener
@ -9,7 +8,6 @@ import com.badlogic.gdx.scenes.scene2d.InputListener
import com.badlogic.gdx.scenes.scene2d.Stage import com.badlogic.gdx.scenes.scene2d.Stage
import com.badlogic.gdx.scenes.scene2d.Touchable import com.badlogic.gdx.scenes.scene2d.Touchable
import com.badlogic.gdx.scenes.scene2d.actions.Actions import com.badlogic.gdx.scenes.scene2d.actions.Actions
import com.badlogic.gdx.scenes.scene2d.actions.FloatAction
import com.unciv.UncivGame import com.unciv.UncivGame
import com.unciv.logic.HexMath import com.unciv.logic.HexMath
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
@ -131,25 +129,9 @@ class EditorMapHolder(
fun setCenterPosition(vector: Vector2, blink: Boolean = false) { fun setCenterPosition(vector: Vector2, blink: Boolean = false) {
val tileGroup = allTileGroups.firstOrNull { it.tileInfo.position == vector } ?: return val tileGroup = allTileGroups.firstOrNull { it.tileInfo.position == vector } ?: return
val originalScrollX = scrollX // The Y axis of [scrollY] is inverted - when at 0 we're at the top, not bottom - so we invert it back.
val originalScrollY = scrollY if (!scrollTo(tileGroup.x + tileGroup.width / 2, maxY - (tileGroup.y + tileGroup.width / 2)))
return
val finalScrollX = tileGroup.x + tileGroup.width / 2
/** The Y axis of [scrollY] is inverted - when at 0 we're at the top, not bottom - so we invert it back. */
val finalScrollY = maxY - (tileGroup.y + tileGroup.width / 2)
if (finalScrollX == originalScrollX && finalScrollY == originalScrollY) return
val action = object : FloatAction(0f, 1f, 0.4f) {
override fun update(percent: Float) {
scrollX = finalScrollX * percent + originalScrollX * (1 - percent)
scrollY = finalScrollY * percent + originalScrollY * (1 - percent)
updateVisualScroll()
}
}
action.interpolation = Interpolation.sine
addAction(action)
if (!blink) return if (!blink) return

View File

@ -1,10 +1,15 @@
package com.unciv.ui.utils package com.unciv.ui.utils
import com.badlogic.gdx.math.Interpolation
import com.badlogic.gdx.math.Rectangle import com.badlogic.gdx.math.Rectangle
import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.Action
import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.Actor
import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.Group
import com.badlogic.gdx.scenes.scene2d.InputEvent import com.badlogic.gdx.scenes.scene2d.InputEvent
import com.badlogic.gdx.scenes.scene2d.InputListener import com.badlogic.gdx.scenes.scene2d.InputListener
import com.badlogic.gdx.scenes.scene2d.actions.Actions
import com.badlogic.gdx.scenes.scene2d.actions.FloatAction
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane
import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener
import com.badlogic.gdx.scenes.scene2d.utils.Cullable import com.badlogic.gdx.scenes.scene2d.utils.Cullable
@ -189,6 +194,51 @@ open class ZoomableScrollPane(
} }
} }
private var scrollingTo: Vector2? = null
private var scrollingAction: Action? = null
fun isScrolling(): Boolean = scrollingAction != null && actions.any { it == scrollingAction }
/** Get the scrolling destination if currently scrolling, else the current scroll position. */
fun scrollingDestination(): Vector2 {
if (isScrolling())
return scrollingTo!!
else
return Vector2(scrollX, scrollY)
}
/** Scroll the pane to specified coordinates.
* @return `true` if scroll position got changed or started being changed, `false`
* if already centered there or already scrolling there
*/
fun scrollTo(x: Float, y: Float, immediately: Boolean = false): Boolean {
if (scrollingDestination() == Vector2(x, y)) return false
removeAction(scrollingAction)
if (immediately) {
scrollX = x
scrollY = y
updateVisualScroll()
} else {
val originalScrollX = scrollX
val originalScrollY = scrollY
scrollingTo = Vector2(x, y)
val action = object : FloatAction(0f, 1f, 0.4f) {
override fun update(percent: Float) {
scrollX = scrollingTo!!.x * percent + originalScrollX * (1 - percent)
scrollY = scrollingTo!!.y * percent + originalScrollY * (1 - percent)
updateVisualScroll()
}
}
action.interpolation = Interpolation.sine
addAction(action)
scrollingAction = action
}
return true
}
/** @return the currently scrolled-to viewport of the whole scrollable area */ /** @return the currently scrolled-to viewport of the whole scrollable area */
fun getViewport(): Rectangle { fun getViewport(): Rectangle {
val viewportFromLeft = scrollX val viewportFromLeft = scrollX

View File

@ -5,7 +5,6 @@ import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Input import com.badlogic.gdx.Input
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.Batch import com.badlogic.gdx.graphics.g2d.Batch
import com.badlogic.gdx.math.Interpolation
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.Action import com.badlogic.gdx.scenes.scene2d.Action
import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.Actor
@ -13,7 +12,6 @@ import com.badlogic.gdx.scenes.scene2d.Group
import com.badlogic.gdx.scenes.scene2d.InputEvent import com.badlogic.gdx.scenes.scene2d.InputEvent
import com.badlogic.gdx.scenes.scene2d.Touchable import com.badlogic.gdx.scenes.scene2d.Touchable
import com.badlogic.gdx.scenes.scene2d.actions.Actions import com.badlogic.gdx.scenes.scene2d.actions.Actions
import com.badlogic.gdx.scenes.scene2d.actions.FloatAction
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener import com.badlogic.gdx.scenes.scene2d.utils.ClickListener
import com.badlogic.gdx.utils.Align import com.badlogic.gdx.utils.Align
@ -723,31 +721,9 @@ class WorldMapHolder(
if (selectUnit || forceSelectUnit != null) if (selectUnit || forceSelectUnit != null)
worldScreen.bottomUnitTable.tileSelected(selectedTile!!, forceSelectUnit) worldScreen.bottomUnitTable.tileSelected(selectedTile!!, forceSelectUnit)
val originalScrollX = scrollX // The Y axis of [scrollY] is inverted - when at 0 we're at the top, not bottom - so we invert it back.
val originalScrollY = scrollY if (!scrollTo(tileGroup.x + tileGroup.width / 2, maxY - (tileGroup.y + tileGroup.width / 2), immediately))
return false
val finalScrollX = tileGroup.x + tileGroup.width / 2
/** The Y axis of [scrollY] is inverted - when at 0 we're at the top, not bottom - so we invert it back. */
val finalScrollY = maxY - (tileGroup.y + tileGroup.width / 2)
if (finalScrollX == originalScrollX && finalScrollY == originalScrollY) return false
if (immediately) {
scrollX = finalScrollX
scrollY = finalScrollY
updateVisualScroll()
} else {
val action = object : FloatAction(0f, 1f, 0.4f) {
override fun update(percent: Float) {
scrollX = finalScrollX * percent + originalScrollX * (1 - percent)
scrollY = finalScrollY * percent + originalScrollY * (1 - percent)
updateVisualScroll()
}
}
action.interpolation = Interpolation.sine
addAction(action)
}
removeAction(blinkAction) // so we don't have multiple blinks at once removeAction(blinkAction) // so we don't have multiple blinks at once
blinkAction = Actions.repeat(3, Actions.sequence( blinkAction = Actions.repeat(3, Actions.sequence(