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) }
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")
@ -409,4 +409,4 @@ class Specialist: NamedStats() {
else -> TODO()
}
}
}
}

View File

@ -29,15 +29,16 @@ class Language(val language:String, val percentComplete:Int){
class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScreen) {
private var selectedLanguage: String = "English"
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"))
init {
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.fadeScrollBars = false
scrollPane.setScrollingDisabled(true, false)
@ -53,18 +54,18 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
}
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)) {
innerTable2.add(text.toLabel())
optionsTable.add(text.toLabel())
val button = YesNoButton(initialValue, CameraStageBaseScreen.skin) {
action(it)
settings.save()
if (updateWorld && previousScreen is WorldScreen)
previousScreen.shouldUpdate = true
}
innerTable2.add(button).row()
optionsTable.add(button).row()
}
private fun reloadWorldAndOptions() {
@ -78,9 +79,9 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
OptionsPopup(previousScreen.game.screen as CameraStageBaseScreen).open()
}
private fun rebuildInnerTable() {
private fun rebuildOptionsTable() {
settings.save()
innerTable2.clear()
optionsTable.clear()
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 tile yields", settings.showTileYields, true) { settings.showTileYields = it } // JN
addYesNoRow("Show tutorials", settings.showTutorials, true) { settings.showTutorials = it }
//addYesNoRow("Show minimap", settings.showMinimap, true) { settings.showMinimap = it }
addMinimapSizeSlider()
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"
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")
@ -141,15 +141,22 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
addSoundEffectsVolumeSlider()
addMusicVolumeSlider()
addTranslationGeneration()
addModPopup()
addModCheckerPopup()
addSetUserId()
innerTable2.add("Version".toLabel()).pad(10f)
innerTable2.add(previousScreen.game.version.toLabel()).pad(10f).row()
optionsTable.add("Version".toLabel()).pad(10f)
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() {
innerTable2.add("Show minimap".tr())
optionsTable.add("Show minimap".tr())
val minimapSliderLimit = resolutionArray.indexOf(settings.resolution) + 1
val minimapSlider = Slider(0f, minimapSliderLimit.toFloat(), 1f, false, skin)
@ -167,7 +174,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
if (previousScreen is WorldScreen)
previousScreen.shouldUpdate = true
}
innerTable2.add(minimapSlider).pad(10f).row()
optionsTable.add(minimapSlider).pad(10f).row()
}
private fun addSetUserId() {
@ -189,8 +196,8 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
idSetLabel.setFontColor(Color.RED).setText("Invalid ID!".tr())
}
}
innerTable2.add(takeUserIdFromClipboardButton).pad(5f).colspan(2).row()
innerTable2.add(idSetLabel).colspan(2).row()
optionsTable.add(takeUserIdFromClipboardButton).pad(5f).colspan(2).row()
optionsTable.add(idSetLabel).colspan(2).row()
}
private fun addNotificationOptions() {
@ -220,30 +227,38 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
generateTranslationsButton.setText("Translation files are generated successfully.".tr())
generateTranslationsButton.disable()
}
innerTable2.add(generateTranslationsButton).colspan(2).row()
optionsTable.add(generateTranslationsButton).colspan(2).row()
}
}
private fun addModPopup() {
val generateTranslationsButton = "Locate mod errors".toTextButton()
generateTranslationsButton.onClick {
var text = ""
private fun addModCheckerPopup() {
//if (RulesetCache.isEmpty()) return
val modCheckerButton = "Locate mod errors".toTextButton()
modCheckerButton.onClick {
val lines = ArrayList<String>()
for (mod in RulesetCache.values) {
val modLinks = mod.checkModLinks()
if (modLinks != "")
text += "\n\n" + mod.name + "\n\n" + modLinks
if (modLinks != "") {
lines += ""
lines += mod.name
lines += ""
lines += modLinks
lines += ""
}
}
if (lines.isEmpty()) lines += "{No problems found}."
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()
popup.addCloseButton()
popup.open(true)
}
innerTable2.add(generateTranslationsButton).colspan(2).row()
optionsTable.add(modCheckerButton).colspan(2).row()
}
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)
soundEffectsVolumeSlider.value = settings.soundEffectsVolume
@ -252,13 +267,13 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
settings.save()
Sounds.play(UncivSound.Click)
}
innerTable2.add(soundEffectsVolumeSlider).pad(10f).row()
optionsTable.add(soundEffectsVolumeSlider).pad(5f).row()
}
private fun addMusicVolumeSlider() {
val musicLocation = Gdx.files.local(previousScreen.game.musicLocation)
if (musicLocation.exists()) {
innerTable2.add("Music volume".tr())
optionsTable.add("Music volume".tr())
val musicVolumeSlider = Slider(0f, 1.0f, 0.1f, false, skin)
musicVolumeSlider.value = settings.musicVolume
@ -272,12 +287,12 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
music?.volume = 0.4f * musicVolumeSlider.value
}
innerTable2.add(musicVolumeSlider).pad(10f).row()
optionsTable.add(musicVolumeSlider).pad(5f).row()
} else {
val downloadMusicButton = "Download music".toTextButton()
innerTable2.add(downloadMusicButton).colspan(2).row()
optionsTable.add(downloadMusicButton).colspan(2).row()
val errorTable = Table()
innerTable2.add(errorTable).colspan(2).row()
optionsTable.add(errorTable).colspan(2).row()
downloadMusicButton.onClick {
downloadMusicButton.disable()
@ -290,7 +305,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
val file = DropBox.downloadFile("/Music/thatched-villagers.mp3")
musicLocation.write(file, false)
Gdx.app.postRunnable {
rebuildInnerTable()
rebuildOptionsTable()
previousScreen.game.startMusic()
}
} catch (ex: Exception) {
@ -305,12 +320,12 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
}
private fun addResolutionSelectBox() {
innerTable2.add("Resolution".toLabel())
optionsTable.add("Resolution".toLabel())
val resolutionSelectBox = SelectBox<String>(skin)
resolutionSelectBox.items = resolutionArray
resolutionSelectBox.selected = settings.resolution
innerTable2.add(resolutionSelectBox).minWidth(240f).pad(10f).row()
optionsTable.add(resolutionSelectBox).minWidth(240f).pad(10f).row()
resolutionSelectBox.onChange {
settings.resolution = resolutionSelectBox.selected
@ -319,7 +334,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
}
private fun addTileSetSelectBox() {
innerTable2.add("Tileset".toLabel())
optionsTable.add("Tileset".toLabel())
val tileSetSelectBox = SelectBox<String>(skin)
val tileSetArray = GdxArray<String>()
@ -327,7 +342,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
for (tileset in tileSets) tileSetArray.add(tileset)
tileSetSelectBox.items = tileSetArray
tileSetSelectBox.selected = settings.tileSet
innerTable2.add(tileSetSelectBox).minWidth(240f).pad(10f).row()
optionsTable.add(tileSetSelectBox).minWidth(240f).pad(10f).row()
tileSetSelectBox.onChange {
settings.tileSet = tileSetSelectBox.selected
@ -336,7 +351,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
}
private fun addAutosaveTurnsSelectBox() {
innerTable2.add("Turns between autosaves".toLabel())
optionsTable.add("Turns between autosaves".toLabel())
val autosaveTurnsSelectBox = SelectBox<Int>(skin)
val autosaveTurnsArray = GdxArray<Int>()
@ -344,7 +359,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
autosaveTurnsSelectBox.items = autosaveTurnsArray
autosaveTurnsSelectBox.selected = settings.turnsBetweenAutosaves
innerTable2.add(autosaveTurnsSelectBox).pad(10f).row()
optionsTable.add(autosaveTurnsSelectBox).pad(10f).row()
autosaveTurnsSelectBox.onChange {
settings.turnsBetweenAutosaves = autosaveTurnsSelectBox.selected
@ -353,7 +368,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
}
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 possibleDelaysArray = GdxArray<Int>()
@ -361,7 +376,7 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
checkDelaySelectBox.items = possibleDelaysArray
checkDelaySelectBox.selected = settings.multiplayerTurnCheckerDelayInMinutes
innerTable2.add(checkDelaySelectBox).pad(10f).row()
optionsTable.add(checkDelaySelectBox).pad(10f).row()
checkDelaySelectBox.onChange {
settings.multiplayerTurnCheckerDelayInMinutes = checkDelaySelectBox.selected
@ -378,11 +393,11 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr
.forEach { languageArray.add(it) }
if (languageArray.size == 0) return
innerTable2.add("Language".toLabel())
optionsTable.add("Language".toLabel())
languageSelectBox.items = languageArray
val matchingLanguage = languageArray.firstOrNull { it.language == settings.language }
languageSelectBox.selected = matchingLanguage ?: languageArray.first()
innerTable2.add(languageSelectBox).minWidth(240f).pad(10f).row()
optionsTable.add(languageSelectBox).minWidth(240f).pad(10f).row()
languageSelectBox.onChange {
// Sometimes the "changed" is triggered even when we didn't choose something