From faac24a2a5fa923842a8ac19e2b38ca97a52132f Mon Sep 17 00:00:00 2001 From: lishaoxia1985 <49801619+lishaoxia1985@users.noreply.github.com> Date: Mon, 5 Apr 2021 19:13:34 +0800 Subject: [PATCH] Redraw TechPickerScreen and PickerScreen, Make map symmetrical if it's not wrapped (#3757) * Redraw TechPickerScreen and PickerScreen * Make map symmetrical if it's not wrapped --- core/src/com/unciv/ui/map/TileGroupMap.kt | 6 ++- .../unciv/ui/pickerscreens/PickerScreen.kt | 20 +++++----- .../ui/pickerscreens/TechPickerScreen.kt | 38 +++++++++++-------- .../com/unciv/ui/tilegroups/WorldTileGroup.kt | 1 - .../unciv/ui/utils/CameraStageBaseScreen.kt | 10 ++--- .../com/unciv/ui/utils/ZoomableScrollPane.kt | 9 ++--- 6 files changed, 42 insertions(+), 42 deletions(-) diff --git a/core/src/com/unciv/ui/map/TileGroupMap.kt b/core/src/com/unciv/ui/map/TileGroupMap.kt index 9bdf51e490..4206e3449b 100644 --- a/core/src/com/unciv/ui/map/TileGroupMap.kt +++ b/core/src/com/unciv/ui/map/TileGroupMap.kt @@ -120,9 +120,11 @@ class TileGroupMap(tileGroups: Collection, private val leftAndR // there are tiles "below the zero", // so we zero out the starting position of the whole board so they will be displayed as well - // The width has to be lowered by groupSize because wrapped maps are missing a tile on the right. + // Map's width is reduced by groupSize if it is wrapped, because wrapped map will miss a tile on the right. // This ensures that wrapped maps have a smooth transition. - setSize(topX - bottomX + leftAndRightPadding * 2 - groupSize, topY - bottomY + topAndBottomPadding * 2) + // If map is not wrapped, Map's width doesn't need to be reduce by groupSize + if (worldWrap) setSize(topX - bottomX + leftAndRightPadding * 2 - groupSize, topY - bottomY + topAndBottomPadding * 2) + else setSize(topX - bottomX + leftAndRightPadding * 2, topY - bottomY + topAndBottomPadding * 2) } /** diff --git a/core/src/com/unciv/ui/pickerscreens/PickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/PickerScreen.kt index aff9468c76..10427ab6ed 100644 --- a/core/src/com/unciv/ui/pickerscreens/PickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/PickerScreen.kt @@ -11,9 +11,8 @@ open class PickerScreen : CameraStageBaseScreen() { internal var closeButton: TextButton = Constants.close.toTextButton() protected var descriptionLabel: Label - protected var rightSideGroup = VerticalGroup() + private var rightSideGroup = VerticalGroup() protected var rightSideButton: TextButton - private var screenSplit = 0.85f /** * The table displaying the choices from which to pick (usually). @@ -21,15 +20,15 @@ open class PickerScreen : CameraStageBaseScreen() { */ protected var topTable: Table var bottomTable:Table = Table() - internal var splitPane: SplitPane protected var scrollPane: ScrollPane init { + val bottomTableHeight = 150f bottomTable.add(closeButton).pad(10f) descriptionLabel = "".toLabel() descriptionLabel.wrap = true - val labelScroll = ScrollPane(descriptionLabel,skin) + val labelScroll = ScrollPane(descriptionLabel) bottomTable.add(labelScroll).pad(5f).fill().expand() rightSideButton = "".toTextButton() @@ -37,17 +36,16 @@ open class PickerScreen : CameraStageBaseScreen() { rightSideGroup.addActor(rightSideButton) bottomTable.add(rightSideGroup).pad(10f).right() - bottomTable.height = stage.height * (1 - screenSplit) topTable = Table() scrollPane = ScrollPane(topTable) - scrollPane.setSize(stage.width, stage.height * screenSplit) - - splitPane = SplitPane(scrollPane, bottomTable, true, skin) - splitPane.splitAmount = screenSplit - splitPane.setFillParent(true) - stage.addActor(splitPane) + val pickerScreenTable = Table() + pickerScreenTable.add(scrollPane).height(stage.height - bottomTableHeight - 2f).row() + pickerScreenTable.addSeparator() + pickerScreenTable.add(bottomTable).height(bottomTableHeight).fillX().expandX().row() + pickerScreenTable.setFillParent(true) + stage.addActor(pickerScreenTable) } fun setDefaultCloseAction(previousScreen: CameraStageBaseScreen?=null) { diff --git a/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt index ecfab27d4e..73824565ee 100644 --- a/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt @@ -15,6 +15,7 @@ import com.unciv.models.translations.tr import com.unciv.ui.utils.* import java.util.* import kotlin.collections.ArrayList +import kotlin.math.max class TechPickerScreen(internal val civInfo: CivilizationInfo, centerOnTech: Technology? = null) : PickerScreen() { @@ -60,7 +61,7 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo, centerOnTech: Tec createTechTable() setButtonsInfo() - topTable.add(techTable) + topTable.add(techTable).fill().expand() rightSideButton.setText("Pick a tech".tr()) rightSideButton.onClick(UncivSound.Paper) { @@ -95,30 +96,30 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo, centerOnTech: Tec val allTechs = civInfo.gameInfo.ruleSet.technologies.values if (allTechs.isEmpty()) return val columns = allTechs.map { it.column!!.columnNumber }.maxOrNull()!! + 1 - val rows = allTechs.map { it.row }.maxOrNull()!! + 1 + val rows = allTechs.map { it.row }.maxOrNull()!! val techMatrix = Array>(columns) { arrayOfNulls(rows) } // Divided into columns, then rows - - for (technology in allTechs) { - techMatrix[technology.column!!.columnNumber][technology.row - 1] = technology - } - val erasNamesToColumns = LinkedHashMap>() - for (tech in allTechs) { - val era = tech.era() + + allTechs.forEach { technology -> + techMatrix[technology.column!!.columnNumber][technology.row - 1] = technology + + val era = technology.era() if (!erasNamesToColumns.containsKey(era)) erasNamesToColumns[era] = ArrayList() - val columnNumber = tech.column!!.columnNumber - if (!erasNamesToColumns[era]!!.contains(columnNumber)) erasNamesToColumns[era]!!.add(columnNumber) + val columnNumber = technology.column!!.columnNumber + if (!erasNamesToColumns[era]!!.contains(columnNumber)) + erasNamesToColumns[era]!!.add(columnNumber) } var i = 0 - for ((era, columns) in erasNamesToColumns) { + erasNamesToColumns.forEach { (era, columns) -> val columnSpan = columns.size val color = if (i % 2 == 0) Color.BLUE else Color.FIREBRICK i++ - techTable.add(era.toLabel().addBorder(2f, color)).fill().colspan(columnSpan) + techTable.add(era.toLabel().addBorder(2f, color)).fill().expand().colspan(columnSpan) } - for (rowIndex in 0..rows - 1) { - techTable.row().pad(5f).padRight(40f) + for (rowIndex in 0 until rows) { + val rowPadding = max(5f,(stage.height - 40 - 150 - 2 - 100 * rows) / (2 * rows)) + techTable.row().pad(rowPadding).padLeft(20f).padRight(20f) for (columnIndex in techMatrix.indices) { val tech = techMatrix[columnIndex][rowIndex] @@ -130,7 +131,7 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo, centerOnTech: Tec techNameToButton[tech.name] = techButton techButton.onClick { selectTechnology(tech, false) } - techTable.add(techButton).fillX() + techTable.add(techButton).height(100f).fillX() } } } @@ -285,4 +286,9 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo, centerOnTech: Tec } } + override fun resize(width: Int, height: Int) { + if (stage.viewport.screenWidth != width || stage.viewport.screenHeight != height) { + game.setScreen(TechPickerScreen(civInfo)) + } + } } \ No newline at end of file diff --git a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt index 7ae16da1fa..788a6b872b 100644 --- a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt @@ -1,6 +1,5 @@ package com.unciv.ui.tilegroups -import com.badlogic.gdx.graphics.g2d.Batch import com.unciv.UncivGame import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.CivilizationInfo diff --git a/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt b/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt index c0db1d1d21..5a497efe74 100644 --- a/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt +++ b/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt @@ -5,7 +5,6 @@ import com.badlogic.gdx.Input import com.badlogic.gdx.Screen import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.GL20 -import com.badlogic.gdx.graphics.g2d.Batch import com.badlogic.gdx.graphics.g2d.BitmapFont import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureAtlas @@ -33,10 +32,9 @@ open class CameraStageBaseScreen : Screen { // An initialized val always turned out to illegally be null... // Remember to always set LOWER CASE chars as the keys! - var keyPressDispatcher: HashMap Unit)> + var keyPressDispatcher: HashMap Unit)> = hashMapOf() init { - keyPressDispatcher = hashMapOf() val resolutions: List = game.settings.resolution.split("x").map { it.toInt().toFloat() } val width = resolutions[0] val height = resolutions[1] @@ -81,7 +79,7 @@ open class CameraStageBaseScreen : Screen { override fun hide() {} - override fun dispose() {} + override fun dispose() { stage.dispose() } fun displayTutorial(tutorial: Tutorial, test: (() -> Boolean)? = null) { if (!game.settings.showTutorials) return @@ -110,7 +108,6 @@ open class CameraStageBaseScreen : Screen { skin.get(SelectBox.SelectBoxStyle::class.java).listStyle.font = Fonts.font.apply { data.setScale(20 / ORIGINAL_FONT_SIZE) } skin } - internal var batch: Batch = SpriteBatch() } /** It returns the assigned [InputListener] */ @@ -210,8 +207,7 @@ fun Table.addSeparator(): Cell { fun Table.addSeparatorVertical(): Cell { val image = ImageGetter.getWhiteDot() - val cell = add(image).width(2f).fillY() - return cell + return add(image).width(2f).fillY() } fun Table.addCell(actor: T): Table { diff --git a/core/src/com/unciv/ui/utils/ZoomableScrollPane.kt b/core/src/com/unciv/ui/utils/ZoomableScrollPane.kt index 42858af83b..31d8ccbf2a 100644 --- a/core/src/com/unciv/ui/utils/ZoomableScrollPane.kt +++ b/core/src/com/unciv/ui/utils/ZoomableScrollPane.kt @@ -11,10 +11,6 @@ open class ZoomableScrollPane: ScrollPane(null) { var continousScrollingX = false init{ - // Remove the existing inputListener - // which defines that mouse scroll = vertical movement - val zoomListener = listeners.last { it is InputListener && it !in captureListeners } - removeListener(zoomListener) addZoomListeners() } @@ -24,7 +20,10 @@ open class ZoomableScrollPane: ScrollPane(null) { } private fun addZoomListeners() { - + // At first, Remove the existing inputListener + // which defines that mouse scroll = vertical movement + val zoomListener = listeners.last { it is InputListener && it !in captureListeners } + removeListener(zoomListener) addListener(object : InputListener() { override fun scrolled(event: InputEvent?, x: Float, y: Float, amountX: Float, amountY: Float): Boolean { if (amountX > 0 || amountY > 0) zoom(scaleX * 0.8f)