Options screen cleanup (#3934)

* Options popup linting and minor visual improvements

* Options popup - mod checker - missing test?
This commit is contained in:
SomeTroglodyte 2021-05-16 15:43:57 +02:00 committed by GitHub
parent 7b0ea32c47
commit fc7859e4e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 60 additions and 45 deletions

View File

@ -328,7 +328,7 @@ class Ruleset {
val allOtherPrereqs = tech.prerequisites.asSequence().filterNot { it == prereq }.flatMap { getPrereqTree(it) } val allOtherPrereqs = tech.prerequisites.asSequence().filterNot { it == prereq }.flatMap { getPrereqTree(it) }
if (allOtherPrereqs.contains(prereq)) if (allOtherPrereqs.contains(prereq))
println("No need to add $prereq as a prerequisite of ${tech.name} - it is already implicit from the other prerequisites!") lines += "No need to add $prereq as a prerequisite of ${tech.name} - it is already implicit from the other prerequisites!"
} }
} }
return lines.joinToString("\n") return lines.joinToString("\n")
@ -409,4 +409,4 @@ class Specialist: NamedStats() {
else -> TODO() else -> TODO()
} }
} }
} }

View File

@ -29,15 +29,16 @@ class Language(val language:String, val percentComplete:Int){
class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScreen) { class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScreen) {
private var selectedLanguage: String = "English" private var selectedLanguage: String = "English"
private val settings = previousScreen.game.settings private val settings = previousScreen.game.settings
private val innerTable2 = Table(CameraStageBaseScreen.skin) private val optionsTable = Table(CameraStageBaseScreen.skin)
private val resolutionArray = GdxArray(arrayOf("750x500", "900x600", "1050x700", "1200x800", "1500x1000")) private val resolutionArray = GdxArray(arrayOf("750x500", "900x600", "1050x700", "1200x800", "1500x1000"))
init { init {
settings.addCompletedTutorialTask("Open the options table") settings.addCompletedTutorialTask("Open the options table")
rebuildInnerTable() optionsTable.defaults().pad(2.5f)
rebuildOptionsTable()
val scrollPane = ScrollPane(innerTable2, skin) val scrollPane = ScrollPane(optionsTable, skin)
scrollPane.setOverscroll(false, false) scrollPane.setOverscroll(false, false)
scrollPane.fadeScrollBars = false scrollPane.fadeScrollBars = false
scrollPane.setScrollingDisabled(true, false) scrollPane.setScrollingDisabled(true, false)
@ -53,18 +54,18 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
} }
private fun addHeader(text: String) { private fun addHeader(text: String) {
innerTable2.add(text.toLabel(fontSize = 24)).colspan(2).padTop(if (innerTable2.cells.isEmpty) 0f else 20f).row() optionsTable.add(text.toLabel(fontSize = 24)).colspan(2).padTop(if (optionsTable.cells.isEmpty) 0f else 20f).row()
} }
private fun addYesNoRow(text: String, initialValue: Boolean, updateWorld: Boolean = false, action: ((Boolean) -> Unit)) { private fun addYesNoRow(text: String, initialValue: Boolean, updateWorld: Boolean = false, action: ((Boolean) -> Unit)) {
innerTable2.add(text.toLabel()) optionsTable.add(text.toLabel())
val button = YesNoButton(initialValue, CameraStageBaseScreen.skin) { val button = YesNoButton(initialValue, CameraStageBaseScreen.skin) {
action(it) action(it)
settings.save() settings.save()
if (updateWorld && previousScreen is WorldScreen) if (updateWorld && previousScreen is WorldScreen)
previousScreen.shouldUpdate = true previousScreen.shouldUpdate = true
} }
innerTable2.add(button).row() optionsTable.add(button).row()
} }
private fun reloadWorldAndOptions() { private fun reloadWorldAndOptions() {
@ -78,9 +79,9 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
OptionsPopup(previousScreen.game.screen as CameraStageBaseScreen).open() OptionsPopup(previousScreen.game.screen as CameraStageBaseScreen).open()
} }
private fun rebuildInnerTable() { private fun rebuildOptionsTable() {
settings.save() settings.save()
innerTable2.clear() optionsTable.clear()
addHeader("Display options") addHeader("Display options")
@ -88,7 +89,6 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
addYesNoRow("Show resources and improvements", settings.showResourcesAndImprovements, true) { settings.showResourcesAndImprovements = it } addYesNoRow("Show resources and improvements", settings.showResourcesAndImprovements, true) { settings.showResourcesAndImprovements = it }
addYesNoRow("Show tile yields", settings.showTileYields, true) { settings.showTileYields = it } // JN addYesNoRow("Show tile yields", settings.showTileYields, true) { settings.showTileYields = it } // JN
addYesNoRow("Show tutorials", settings.showTutorials, true) { settings.showTutorials = it } addYesNoRow("Show tutorials", settings.showTutorials, true) { settings.showTutorials = it }
//addYesNoRow("Show minimap", settings.showMinimap, true) { settings.showMinimap = it }
addMinimapSizeSlider() addMinimapSizeSlider()
addYesNoRow("Show pixel units", settings.showPixelUnits, true) { settings.showPixelUnits = it } addYesNoRow("Show pixel units", settings.showPixelUnits, true) { settings.showPixelUnits = it }
@ -106,7 +106,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
} }
val continuousRenderingDescription = "When disabled, saves battery life but certain animations will be suspended" val continuousRenderingDescription = "When disabled, saves battery life but certain animations will be suspended"
innerTable2.add(continuousRenderingDescription.toLabel(fontSize = 14)).colspan(2).padTop(20f).row() optionsTable.add(continuousRenderingDescription.toLabel(fontSize = 14)).colspan(2).padTop(20f).row()
addHeader("Gameplay options") addHeader("Gameplay options")
@ -141,15 +141,22 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
addSoundEffectsVolumeSlider() addSoundEffectsVolumeSlider()
addMusicVolumeSlider() addMusicVolumeSlider()
addTranslationGeneration() addTranslationGeneration()
addModPopup() addModCheckerPopup()
addSetUserId() addSetUserId()
innerTable2.add("Version".toLabel()).pad(10f) optionsTable.add("Version".toLabel()).pad(10f)
innerTable2.add(previousScreen.game.version.toLabel()).pad(10f).row() val versionLabel = previousScreen.game.version.toLabel()
if (previousScreen.game.version[0] in '0'..'9')
versionLabel.onClick {
val url = "https://github.com/yairm210/Unciv/blob/master/changelog.md#" +
previousScreen.game.version.replace(".","")
Gdx.net.openURI(url)
}
optionsTable.add(versionLabel).pad(10f).row()
} }
private fun addMinimapSizeSlider() { private fun addMinimapSizeSlider() {
innerTable2.add("Show minimap".tr()) optionsTable.add("Show minimap".tr())
val minimapSliderLimit = resolutionArray.indexOf(settings.resolution) + 1 val minimapSliderLimit = resolutionArray.indexOf(settings.resolution) + 1
val minimapSlider = Slider(0f, minimapSliderLimit.toFloat(), 1f, false, skin) val minimapSlider = Slider(0f, minimapSliderLimit.toFloat(), 1f, false, skin)
@ -167,7 +174,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
if (previousScreen is WorldScreen) if (previousScreen is WorldScreen)
previousScreen.shouldUpdate = true previousScreen.shouldUpdate = true
} }
innerTable2.add(minimapSlider).pad(10f).row() optionsTable.add(minimapSlider).pad(10f).row()
} }
private fun addSetUserId() { private fun addSetUserId() {
@ -189,8 +196,8 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
idSetLabel.setFontColor(Color.RED).setText("Invalid ID!".tr()) idSetLabel.setFontColor(Color.RED).setText("Invalid ID!".tr())
} }
} }
innerTable2.add(takeUserIdFromClipboardButton).pad(5f).colspan(2).row() optionsTable.add(takeUserIdFromClipboardButton).pad(5f).colspan(2).row()
innerTable2.add(idSetLabel).colspan(2).row() optionsTable.add(idSetLabel).colspan(2).row()
} }
private fun addNotificationOptions() { private fun addNotificationOptions() {
@ -220,30 +227,38 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
generateTranslationsButton.setText("Translation files are generated successfully.".tr()) generateTranslationsButton.setText("Translation files are generated successfully.".tr())
generateTranslationsButton.disable() generateTranslationsButton.disable()
} }
innerTable2.add(generateTranslationsButton).colspan(2).row() optionsTable.add(generateTranslationsButton).colspan(2).row()
} }
} }
private fun addModPopup() { private fun addModCheckerPopup() {
val generateTranslationsButton = "Locate mod errors".toTextButton() //if (RulesetCache.isEmpty()) return
generateTranslationsButton.onClick { val modCheckerButton = "Locate mod errors".toTextButton()
var text = "" modCheckerButton.onClick {
val lines = ArrayList<String>()
for (mod in RulesetCache.values) { for (mod in RulesetCache.values) {
val modLinks = mod.checkModLinks() val modLinks = mod.checkModLinks()
if (modLinks != "") if (modLinks != "") {
text += "\n\n" + mod.name + "\n\n" + modLinks lines += ""
lines += mod.name
lines += ""
lines += modLinks
lines += ""
}
} }
if (lines.isEmpty()) lines += "{No problems found}."
val popup = Popup(screen) val popup = Popup(screen)
popup.add(ScrollPane(text.toLabel()).apply { setOverscroll(false, false) }) popup.name = "ModCheckerPopup"
popup.add(ScrollPane(lines.joinToString("\n").toLabel()).apply { setOverscroll(false, false) })
.maxHeight(screen.stage.height / 2).row() .maxHeight(screen.stage.height / 2).row()
popup.addCloseButton() popup.addCloseButton()
popup.open(true) popup.open(true)
} }
innerTable2.add(generateTranslationsButton).colspan(2).row() optionsTable.add(modCheckerButton).colspan(2).row()
} }
private fun addSoundEffectsVolumeSlider() { private fun addSoundEffectsVolumeSlider() {
innerTable2.add("Sound effects volume".tr()) optionsTable.add("Sound effects volume".tr())
val soundEffectsVolumeSlider = Slider(0f, 1.0f, 0.1f, false, skin) val soundEffectsVolumeSlider = Slider(0f, 1.0f, 0.1f, false, skin)
soundEffectsVolumeSlider.value = settings.soundEffectsVolume soundEffectsVolumeSlider.value = settings.soundEffectsVolume
@ -252,13 +267,13 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
settings.save() settings.save()
Sounds.play(UncivSound.Click) Sounds.play(UncivSound.Click)
} }
innerTable2.add(soundEffectsVolumeSlider).pad(10f).row() optionsTable.add(soundEffectsVolumeSlider).pad(5f).row()
} }
private fun addMusicVolumeSlider() { private fun addMusicVolumeSlider() {
val musicLocation = Gdx.files.local(previousScreen.game.musicLocation) val musicLocation = Gdx.files.local(previousScreen.game.musicLocation)
if (musicLocation.exists()) { if (musicLocation.exists()) {
innerTable2.add("Music volume".tr()) optionsTable.add("Music volume".tr())
val musicVolumeSlider = Slider(0f, 1.0f, 0.1f, false, skin) val musicVolumeSlider = Slider(0f, 1.0f, 0.1f, false, skin)
musicVolumeSlider.value = settings.musicVolume musicVolumeSlider.value = settings.musicVolume
@ -272,12 +287,12 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
music?.volume = 0.4f * musicVolumeSlider.value music?.volume = 0.4f * musicVolumeSlider.value
} }
innerTable2.add(musicVolumeSlider).pad(10f).row() optionsTable.add(musicVolumeSlider).pad(5f).row()
} else { } else {
val downloadMusicButton = "Download music".toTextButton() val downloadMusicButton = "Download music".toTextButton()
innerTable2.add(downloadMusicButton).colspan(2).row() optionsTable.add(downloadMusicButton).colspan(2).row()
val errorTable = Table() val errorTable = Table()
innerTable2.add(errorTable).colspan(2).row() optionsTable.add(errorTable).colspan(2).row()
downloadMusicButton.onClick { downloadMusicButton.onClick {
downloadMusicButton.disable() downloadMusicButton.disable()
@ -290,7 +305,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
val file = DropBox.downloadFile("/Music/thatched-villagers.mp3") val file = DropBox.downloadFile("/Music/thatched-villagers.mp3")
musicLocation.write(file, false) musicLocation.write(file, false)
Gdx.app.postRunnable { Gdx.app.postRunnable {
rebuildInnerTable() rebuildOptionsTable()
previousScreen.game.startMusic() previousScreen.game.startMusic()
} }
} catch (ex: Exception) { } catch (ex: Exception) {
@ -305,12 +320,12 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
} }
private fun addResolutionSelectBox() { private fun addResolutionSelectBox() {
innerTable2.add("Resolution".toLabel()) optionsTable.add("Resolution".toLabel())
val resolutionSelectBox = SelectBox<String>(skin) val resolutionSelectBox = SelectBox<String>(skin)
resolutionSelectBox.items = resolutionArray resolutionSelectBox.items = resolutionArray
resolutionSelectBox.selected = settings.resolution resolutionSelectBox.selected = settings.resolution
innerTable2.add(resolutionSelectBox).minWidth(240f).pad(10f).row() optionsTable.add(resolutionSelectBox).minWidth(240f).pad(10f).row()
resolutionSelectBox.onChange { resolutionSelectBox.onChange {
settings.resolution = resolutionSelectBox.selected settings.resolution = resolutionSelectBox.selected
@ -319,7 +334,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
} }
private fun addTileSetSelectBox() { private fun addTileSetSelectBox() {
innerTable2.add("Tileset".toLabel()) optionsTable.add("Tileset".toLabel())
val tileSetSelectBox = SelectBox<String>(skin) val tileSetSelectBox = SelectBox<String>(skin)
val tileSetArray = GdxArray<String>() val tileSetArray = GdxArray<String>()
@ -327,7 +342,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
for (tileset in tileSets) tileSetArray.add(tileset) for (tileset in tileSets) tileSetArray.add(tileset)
tileSetSelectBox.items = tileSetArray tileSetSelectBox.items = tileSetArray
tileSetSelectBox.selected = settings.tileSet tileSetSelectBox.selected = settings.tileSet
innerTable2.add(tileSetSelectBox).minWidth(240f).pad(10f).row() optionsTable.add(tileSetSelectBox).minWidth(240f).pad(10f).row()
tileSetSelectBox.onChange { tileSetSelectBox.onChange {
settings.tileSet = tileSetSelectBox.selected settings.tileSet = tileSetSelectBox.selected
@ -336,7 +351,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
} }
private fun addAutosaveTurnsSelectBox() { private fun addAutosaveTurnsSelectBox() {
innerTable2.add("Turns between autosaves".toLabel()) optionsTable.add("Turns between autosaves".toLabel())
val autosaveTurnsSelectBox = SelectBox<Int>(skin) val autosaveTurnsSelectBox = SelectBox<Int>(skin)
val autosaveTurnsArray = GdxArray<Int>() val autosaveTurnsArray = GdxArray<Int>()
@ -344,7 +359,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
autosaveTurnsSelectBox.items = autosaveTurnsArray autosaveTurnsSelectBox.items = autosaveTurnsArray
autosaveTurnsSelectBox.selected = settings.turnsBetweenAutosaves autosaveTurnsSelectBox.selected = settings.turnsBetweenAutosaves
innerTable2.add(autosaveTurnsSelectBox).pad(10f).row() optionsTable.add(autosaveTurnsSelectBox).pad(10f).row()
autosaveTurnsSelectBox.onChange { autosaveTurnsSelectBox.onChange {
settings.turnsBetweenAutosaves = autosaveTurnsSelectBox.selected settings.turnsBetweenAutosaves = autosaveTurnsSelectBox.selected
@ -353,7 +368,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
} }
private fun addMultiplayerTurnCheckerDelayBox() { private fun addMultiplayerTurnCheckerDelayBox() {
innerTable2.add("Time between turn checks out-of-game (in minutes)".toLabel()) optionsTable.add("Time between turn checks out-of-game (in minutes)".toLabel())
val checkDelaySelectBox = SelectBox<Int>(skin) val checkDelaySelectBox = SelectBox<Int>(skin)
val possibleDelaysArray = GdxArray<Int>() val possibleDelaysArray = GdxArray<Int>()
@ -361,7 +376,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
checkDelaySelectBox.items = possibleDelaysArray checkDelaySelectBox.items = possibleDelaysArray
checkDelaySelectBox.selected = settings.multiplayerTurnCheckerDelayInMinutes checkDelaySelectBox.selected = settings.multiplayerTurnCheckerDelayInMinutes
innerTable2.add(checkDelaySelectBox).pad(10f).row() optionsTable.add(checkDelaySelectBox).pad(10f).row()
checkDelaySelectBox.onChange { checkDelaySelectBox.onChange {
settings.multiplayerTurnCheckerDelayInMinutes = checkDelaySelectBox.selected settings.multiplayerTurnCheckerDelayInMinutes = checkDelaySelectBox.selected
@ -378,11 +393,11 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
.forEach { languageArray.add(it) } .forEach { languageArray.add(it) }
if (languageArray.size == 0) return if (languageArray.size == 0) return
innerTable2.add("Language".toLabel()) optionsTable.add("Language".toLabel())
languageSelectBox.items = languageArray languageSelectBox.items = languageArray
val matchingLanguage = languageArray.firstOrNull { it.language == settings.language } val matchingLanguage = languageArray.firstOrNull { it.language == settings.language }
languageSelectBox.selected = matchingLanguage ?: languageArray.first() languageSelectBox.selected = matchingLanguage ?: languageArray.first()
innerTable2.add(languageSelectBox).minWidth(240f).pad(10f).row() optionsTable.add(languageSelectBox).minWidth(240f).pad(10f).row()
languageSelectBox.onChange { languageSelectBox.onChange {
// Sometimes the "changed" is triggered even when we didn't choose something // Sometimes the "changed" is triggered even when we didn't choose something