From fc7859e4e742897e898abc4846da23f661225e84 Mon Sep 17 00:00:00 2001 From: SomeTroglodyte <63000004+SomeTroglodyte@users.noreply.github.com> Date: Sun, 16 May 2021 15:43:57 +0200 Subject: [PATCH] Options screen cleanup (#3934) * Options popup linting and minor visual improvements * Options popup - mod checker - missing test? --- core/src/com/unciv/models/ruleset/Ruleset.kt | 4 +- .../ui/worldscreen/mainmenu/OptionsPopup.kt | 101 ++++++++++-------- 2 files changed, 60 insertions(+), 45 deletions(-) diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index a3a3ad154c..b2ee69979a 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -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() } } -} \ No newline at end of file +} diff --git a/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt b/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt index c36c3628da..d61730089b 100644 --- a/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt +++ b/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt @@ -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() 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(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(skin) val tileSetArray = GdxArray() @@ -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(skin) val autosaveTurnsArray = GdxArray() @@ -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(skin) val possibleDelaysArray = GdxArray() @@ -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