mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-28 06:16:37 -04:00
Options screen cleanup (#3934)
* Options popup linting and minor visual improvements * Options popup - mod checker - missing test?
This commit is contained in:
parent
7b0ea32c47
commit
fc7859e4e7
@ -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")
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user