Revert "Revert "Redraw TechPickerScreen and PickerScreen, Make map symmetrical if it's not wrapped (#3757)"" (#3991)

This reverts commit 6d5cb002715aeb41afec0a79f6b0e2c2e9519547.
This commit is contained in:
lishaoxia1985 2021-06-09 13:38:20 -05:00 committed by GitHub
parent 856fe1174a
commit 298693ab03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 49 additions and 47 deletions

View File

@ -34,7 +34,7 @@ class LanguageTable(val language:String, val percentComplete: Int):Table(){
} }
class LanguagePickerScreen : PickerScreen(){ class LanguagePickerScreen : PickerScreen() {
var chosenLanguage = "English" var chosenLanguage = "English"
private val languageTables = ArrayList<LanguageTable>() private val languageTables = ArrayList<LanguageTable>()

View File

@ -120,9 +120,11 @@ class TileGroupMap<T: TileGroup>(tileGroups: Collection<T>, private val leftAndR
// there are tiles "below the zero", // there are tiles "below the zero",
// so we zero out the starting position of the whole board so they will be displayed as well // 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. // 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)
} }
/** /**

View File

@ -16,7 +16,7 @@ import com.unciv.ui.utils.*
* updates [mapEditorScreen] and switches to it. * updates [mapEditorScreen] and switches to it.
* @param [mapEditorScreen] previous screen from map editor. * @param [mapEditorScreen] previous screen from map editor.
*/ */
class GameParametersScreen(var mapEditorScreen: MapEditorScreen): IPreviousScreen, PickerScreen(disableScroll = true) { class GameParametersScreen(var mapEditorScreen: MapEditorScreen): IPreviousScreen, PickerScreen() {
override var gameSetupInfo = mapEditorScreen.gameSetupInfo.clone() override var gameSetupInfo = mapEditorScreen.gameSetupInfo.clone()
override var ruleset = RulesetCache.getComplexRuleset(gameSetupInfo.gameParameters.mods) override var ruleset = RulesetCache.getComplexRuleset(gameSetupInfo.gameParameters.mods)
var playerPickerTable = PlayerPickerTable(this, gameSetupInfo.gameParameters) var playerPickerTable = PlayerPickerTable(this, gameSetupInfo.gameParameters)

View File

@ -18,7 +18,7 @@ import kotlin.concurrent.thread
import com.unciv.ui.utils.AutoScrollPane as ScrollPane import com.unciv.ui.utils.AutoScrollPane as ScrollPane
class SaveAndLoadMapScreen(mapToSave: TileMap?, save:Boolean = false, previousScreen: CameraStageBaseScreen) class SaveAndLoadMapScreen(mapToSave: TileMap?, save:Boolean = false, previousScreen: CameraStageBaseScreen)
: PickerScreen(disableScroll = true) { : PickerScreen() {
private var chosenMap: FileHandle? = null private var chosenMap: FileHandle? = null
val deleteButton = "Delete map".toTextButton() val deleteButton = "Delete map".toTextButton()
val mapsTable = Table().apply { defaults().pad(10f) } val mapsTable = Table().apply { defaults().pad(10f) }

View File

@ -13,7 +13,7 @@ import com.unciv.ui.utils.onClick
import com.unciv.ui.utils.toLabel import com.unciv.ui.utils.toLabel
import java.util.* import java.util.*
class AddMultiplayerGameScreen(backScreen: MultiplayerScreen) : PickerScreen(){ class AddMultiplayerGameScreen(backScreen: MultiplayerScreen) : PickerScreen() {
init { init {
val gameNameTextField = TextField("", skin) val gameNameTextField = TextField("", skin)
val gameIDTextField = TextField("", skin) val gameIDTextField = TextField("", skin)

View File

@ -14,7 +14,7 @@ import kotlin.concurrent.thread
/** Subscreen of MultiplayerScreen to edit and delete saves /** Subscreen of MultiplayerScreen to edit and delete saves
* backScreen is used for getting back to the MultiplayerScreen so it doesn't have to be created over and over again */ * backScreen is used for getting back to the MultiplayerScreen so it doesn't have to be created over and over again */
class EditMultiplayerGameInfoScreen(game: GameInfo?, gameName: String, backScreen: MultiplayerScreen): PickerScreen(){ class EditMultiplayerGameInfoScreen(game: GameInfo?, gameName: String, backScreen: MultiplayerScreen): PickerScreen() {
init { init {
val textField = TextField(gameName, skin) val textField = TextField(gameName, skin)

View File

@ -37,7 +37,7 @@ class GameSetupInfo(var gameId:String, var gameParameters: GameParameters, var m
} }
} }
class NewGameScreen(private val previousScreen: CameraStageBaseScreen, _gameSetupInfo: GameSetupInfo?=null): IPreviousScreen, PickerScreen(disableScroll = true) { class NewGameScreen(private val previousScreen: CameraStageBaseScreen, _gameSetupInfo: GameSetupInfo?=null): IPreviousScreen, PickerScreen() {
override val gameSetupInfo = _gameSetupInfo ?: GameSetupInfo() override val gameSetupInfo = _gameSetupInfo ?: GameSetupInfo()
override var ruleset = RulesetCache.getComplexRuleset(gameSetupInfo.gameParameters.mods) // needs to be set because the GameOptionsTable etc. depend on this override var ruleset = RulesetCache.getComplexRuleset(gameSetupInfo.gameParameters.mods) // needs to be set because the GameOptionsTable etc. depend on this
var newGameOptionsTable = GameOptionsTable(this) { desiredCiv: String -> playerPickerTable.update(desiredCiv) } var newGameOptionsTable = GameOptionsTable(this) { desiredCiv: String -> playerPickerTable.update(desiredCiv) }

View File

@ -26,7 +26,7 @@ import kotlin.concurrent.thread
*/ */
// All picker screens auto-wrap the top table in a ScrollPane. // All picker screens auto-wrap the top table in a ScrollPane.
// Since we want the different parts to scroll separately, we disable the default ScrollPane, which would scroll everything at once. // Since we want the different parts to scroll separately, we disable the default ScrollPane, which would scroll everything at once.
class ModManagementScreen: PickerScreen(disableScroll = true) { class ModManagementScreen: PickerScreen() {
private val modTable = Table().apply { defaults().pad(10f) } private val modTable = Table().apply { defaults().pad(10f) }
private val scrollInstalledMods = ScrollPane(modTable) private val scrollInstalledMods = ScrollPane(modTable)

View File

@ -6,13 +6,12 @@ import com.unciv.UncivGame
import com.unciv.ui.utils.* import com.unciv.ui.utils.*
import com.unciv.ui.utils.AutoScrollPane as ScrollPane import com.unciv.ui.utils.AutoScrollPane as ScrollPane
open class PickerScreen(val disableScroll: Boolean = false) : CameraStageBaseScreen() { open class PickerScreen : CameraStageBaseScreen() {
internal var closeButton: TextButton = Constants.close.toTextButton() internal var closeButton: TextButton = Constants.close.toTextButton()
protected var descriptionLabel: Label protected var descriptionLabel: Label
protected var rightSideGroup = VerticalGroup() private var rightSideGroup = VerticalGroup()
protected var rightSideButton: TextButton protected var rightSideButton: TextButton
private var screenSplit = 0.85f
/** /**
* The table displaying the choices from which to pick (usually). * The table displaying the choices from which to pick (usually).
@ -20,15 +19,15 @@ open class PickerScreen(val disableScroll: Boolean = false) : CameraStageBaseScr
*/ */
protected var topTable: Table protected var topTable: Table
var bottomTable:Table = Table() var bottomTable:Table = Table()
internal var splitPane: SplitPane
protected var scrollPane: ScrollPane protected var scrollPane: ScrollPane
init { init {
val bottomTableHeight = 150f
bottomTable.add(closeButton).pad(10f) bottomTable.add(closeButton).pad(10f)
descriptionLabel = "".toLabel() descriptionLabel = "".toLabel()
descriptionLabel.wrap = true descriptionLabel.wrap = true
val labelScroll = ScrollPane(descriptionLabel,skin) val labelScroll = ScrollPane(descriptionLabel)
bottomTable.add(labelScroll).pad(5f).fill().expand() bottomTable.add(labelScroll).pad(5f).fill().expand()
rightSideButton = "".toTextButton() rightSideButton = "".toTextButton()
@ -36,18 +35,16 @@ open class PickerScreen(val disableScroll: Boolean = false) : CameraStageBaseScr
rightSideGroup.addActor(rightSideButton) rightSideGroup.addActor(rightSideButton)
bottomTable.add(rightSideGroup).pad(10f).right() bottomTable.add(rightSideGroup).pad(10f).right()
bottomTable.height = stage.height * (1 - screenSplit)
topTable = Table() topTable = Table()
scrollPane = ScrollPane(topTable) scrollPane = ScrollPane(topTable)
scrollPane.setScrollingDisabled(disableScroll, disableScroll) val pickerScreenTable = Table()
scrollPane.setSize(stage.width, stage.height * screenSplit) pickerScreenTable.add(scrollPane).height(stage.height - bottomTableHeight - 2f).row()
pickerScreenTable.addSeparator()
splitPane = SplitPane(scrollPane, bottomTable, true, skin) pickerScreenTable.add(bottomTable).height(bottomTableHeight).fillX().expandX().row()
splitPane.splitAmount = screenSplit pickerScreenTable.setFillParent(true)
splitPane.setFillParent(true) stage.addActor(pickerScreenTable)
stage.addActor(splitPane)
} }
fun setDefaultCloseAction(previousScreen: CameraStageBaseScreen?=null) { fun setDefaultCloseAction(previousScreen: CameraStageBaseScreen?=null) {

View File

@ -15,6 +15,7 @@ import com.unciv.models.translations.tr
import com.unciv.ui.utils.* import com.unciv.ui.utils.*
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
import kotlin.math.max
class TechPickerScreen(internal val civInfo: CivilizationInfo, centerOnTech: Technology? = null) : PickerScreen() { class TechPickerScreen(internal val civInfo: CivilizationInfo, centerOnTech: Technology? = null) : PickerScreen() {
@ -60,7 +61,7 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo, centerOnTech: Tec
createTechTable() createTechTable()
setButtonsInfo() setButtonsInfo()
topTable.add(techTable) topTable.add(techTable).fill().expand()
rightSideButton.setText("Pick a tech".tr()) rightSideButton.setText("Pick a tech".tr())
rightSideButton.onClick(UncivSound.Paper) { rightSideButton.onClick(UncivSound.Paper) {
@ -95,30 +96,30 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo, centerOnTech: Tec
val allTechs = civInfo.gameInfo.ruleSet.technologies.values val allTechs = civInfo.gameInfo.ruleSet.technologies.values
if (allTechs.isEmpty()) return if (allTechs.isEmpty()) return
val columns = allTechs.map { it.column!!.columnNumber }.maxOrNull()!! + 1 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<Array<Technology?>>(columns) { arrayOfNulls(rows) } // Divided into columns, then rows val techMatrix = Array<Array<Technology?>>(columns) { arrayOfNulls(rows) } // Divided into columns, then rows
for (technology in allTechs) {
techMatrix[technology.column!!.columnNumber][technology.row - 1] = technology
}
val erasNamesToColumns = LinkedHashMap<String, ArrayList<Int>>() val erasNamesToColumns = LinkedHashMap<String, ArrayList<Int>>()
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() if (!erasNamesToColumns.containsKey(era)) erasNamesToColumns[era] = ArrayList()
val columnNumber = tech.column!!.columnNumber val columnNumber = technology.column!!.columnNumber
if (!erasNamesToColumns[era]!!.contains(columnNumber)) erasNamesToColumns[era]!!.add(columnNumber) if (!erasNamesToColumns[era]!!.contains(columnNumber))
erasNamesToColumns[era]!!.add(columnNumber)
} }
var i = 0 var i = 0
for ((era, columns) in erasNamesToColumns) { erasNamesToColumns.forEach { (era, columns) ->
val columnSpan = columns.size val columnSpan = columns.size
val color = if (i % 2 == 0) Color.BLUE else Color.FIREBRICK val color = if (i % 2 == 0) Color.BLUE else Color.FIREBRICK
i++ 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) { for (rowIndex in 0 until rows) {
techTable.row().pad(5f).padRight(40f) 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) { for (columnIndex in techMatrix.indices) {
val tech = techMatrix[columnIndex][rowIndex] val tech = techMatrix[columnIndex][rowIndex]
@ -130,7 +131,7 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo, centerOnTech: Tec
techNameToButton[tech.name] = techButton techNameToButton[tech.name] = techButton
techButton.onClick { selectTechnology(tech, false) } 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))
}
}
} }

View File

@ -20,7 +20,7 @@ import java.util.concurrent.CancellationException
import kotlin.concurrent.thread import kotlin.concurrent.thread
import com.unciv.ui.utils.AutoScrollPane as ScrollPane import com.unciv.ui.utils.AutoScrollPane as ScrollPane
class LoadGameScreen(previousScreen:CameraStageBaseScreen) : PickerScreen(disableScroll = true) { class LoadGameScreen(previousScreen:CameraStageBaseScreen) : PickerScreen() {
lateinit var selectedSave: String lateinit var selectedSave: String
private val copySavedGameToClipboardButton = "Copy saved game to clipboard".toTextButton() private val copySavedGameToClipboardButton = "Copy saved game to clipboard".toTextButton()
private val saveTable = Table() private val saveTable = Table()

View File

@ -17,7 +17,7 @@ import kotlin.concurrent.thread
import com.unciv.ui.utils.AutoScrollPane as ScrollPane import com.unciv.ui.utils.AutoScrollPane as ScrollPane
class SaveGameScreen(val gameInfo: GameInfo) : PickerScreen(disableScroll = true) { class SaveGameScreen(val gameInfo: GameInfo) : PickerScreen() {
private val gameNameTextField = TextField("", skin) private val gameNameTextField = TextField("", skin)
val currentSaves = Table() val currentSaves = Table()

View File

@ -4,7 +4,6 @@ import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Screen import com.badlogic.gdx.Screen
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.GL20 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.BitmapFont
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureAtlas import com.badlogic.gdx.graphics.g2d.TextureAtlas
@ -90,7 +89,6 @@ open class CameraStageBaseScreen : Screen {
skin.get(SelectBox.SelectBoxStyle::class.java).listStyle.font = Fonts.font.apply { data.setScale(20 / Fonts.ORIGINAL_FONT_SIZE) } skin.get(SelectBox.SelectBoxStyle::class.java).listStyle.font = Fonts.font.apply { data.setScale(20 / Fonts.ORIGINAL_FONT_SIZE) }
skin skin
} }
internal var batch: Batch = SpriteBatch()
} }
fun onBackButtonClicked(action: () -> Unit) { fun onBackButtonClicked(action: () -> Unit) {

View File

@ -11,10 +11,6 @@ open class ZoomableScrollPane: ScrollPane(null) {
var continuousScrollingX = false var continuousScrollingX = false
init{ 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() addZoomListeners()
} }
@ -30,7 +26,10 @@ open class ZoomableScrollPane: ScrollPane(null) {
} }
private fun addZoomListeners() { 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() { addListener(object : InputListener() {
override fun scrolled(event: InputEvent?, x: Float, y: Float, amountX: Float, amountY: Float): Boolean { override fun scrolled(event: InputEvent?, x: Float, y: Float, amountX: Float, amountY: Float): Boolean {
if (amountX > 0 || amountY > 0) zoomOut() if (amountX > 0 || amountY > 0) zoomOut()