mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-28 06:16:37 -04:00
Sort maps & accelerate playing a newly edited map (#6267)
* Sort map file lists * Pre-select custom map if saved within last 15min
This commit is contained in:
parent
617f801558
commit
70517b9c3d
@ -6,6 +6,7 @@ import com.badlogic.gdx.graphics.Color
|
|||||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.TextButton
|
import com.badlogic.gdx.scenes.scene2d.ui.TextButton
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.TextField
|
import com.badlogic.gdx.scenes.scene2d.ui.TextField
|
||||||
|
import com.unciv.UncivGame
|
||||||
import com.unciv.logic.MapSaver
|
import com.unciv.logic.MapSaver
|
||||||
import com.unciv.logic.UncivShowableException
|
import com.unciv.logic.UncivShowableException
|
||||||
import com.unciv.logic.map.MapType
|
import com.unciv.logic.map.MapType
|
||||||
@ -14,7 +15,6 @@ import com.unciv.models.ruleset.RulesetCache
|
|||||||
import com.unciv.models.translations.tr
|
import com.unciv.models.translations.tr
|
||||||
import com.unciv.ui.pickerscreens.PickerScreen
|
import com.unciv.ui.pickerscreens.PickerScreen
|
||||||
import com.unciv.ui.utils.*
|
import com.unciv.ui.utils.*
|
||||||
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: BaseScreen)
|
class SaveAndLoadMapScreen(mapToSave: TileMap?, save:Boolean = false, previousScreen: BaseScreen)
|
||||||
@ -184,7 +184,8 @@ class SaveAndLoadMapScreen(mapToSave: TileMap?, save:Boolean = false, previousSc
|
|||||||
deleteButton.setText("Delete map".tr())
|
deleteButton.setText("Delete map".tr())
|
||||||
|
|
||||||
mapsTable.clear()
|
mapsTable.clear()
|
||||||
for (map in MapSaver.getMaps()) {
|
val collator = UncivGame.Current.settings.getCollatorFromLocale()
|
||||||
|
for (map in MapSaver.getMaps().sortedWith(compareBy(collator) { it.name() })) {
|
||||||
val existingMapButton = TextButton(map.name(), skin)
|
val existingMapButton = TextButton(map.name(), skin)
|
||||||
existingMapButton.onClick {
|
existingMapButton.onClick {
|
||||||
for (cell in mapsTable.cells) cell.actor.color = Color.WHITE
|
for (cell in mapsTable.cells) cell.actor.color = Color.WHITE
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package com.unciv.ui.newgamescreen
|
package com.unciv.ui.newgamescreen
|
||||||
|
|
||||||
import com.badlogic.gdx.Gdx
|
|
||||||
import com.badlogic.gdx.files.FileHandle
|
import com.badlogic.gdx.files.FileHandle
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.SelectBox
|
import com.badlogic.gdx.scenes.scene2d.ui.SelectBox
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||||
import com.badlogic.gdx.utils.Array
|
import com.badlogic.gdx.utils.Array
|
||||||
|
import com.unciv.UncivGame
|
||||||
import com.unciv.logic.MapSaver
|
import com.unciv.logic.MapSaver
|
||||||
import com.unciv.logic.UncivShowableException
|
import com.unciv.logic.UncivShowableException
|
||||||
import com.unciv.logic.map.MapType
|
import com.unciv.logic.map.MapType
|
||||||
@ -24,14 +24,14 @@ class MapOptionsTable(private val newGameScreen: NewGameScreen): Table() {
|
|||||||
lateinit var mapTypeSelectBox: TranslatedSelectBox
|
lateinit var mapTypeSelectBox: TranslatedSelectBox
|
||||||
private val mapFileSelectBox = createMapFileSelectBox()
|
private val mapFileSelectBox = createMapFileSelectBox()
|
||||||
|
|
||||||
private val mapFilesSequence = sequence<FileHandleWrapper> {
|
private val mapFilesSequence = sequence<FileHandle> {
|
||||||
yieldAll(MapSaver.getMaps().asSequence().map { FileHandleWrapper(it) })
|
yieldAll(MapSaver.getMaps().asSequence())
|
||||||
for (modFolder in RulesetCache.values.mapNotNull { it.folderLocation }) {
|
for (modFolder in RulesetCache.values.mapNotNull { it.folderLocation }) {
|
||||||
val mapsFolder = modFolder.child("maps")
|
val mapsFolder = modFolder.child("maps")
|
||||||
if (mapsFolder.exists())
|
if (mapsFolder.exists())
|
||||||
yieldAll(mapsFolder.list().asSequence().map { FileHandleWrapper(it) })
|
yieldAll(mapsFolder.list().asSequence())
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}.map { FileHandleWrapper(it) }
|
||||||
|
|
||||||
init {
|
init {
|
||||||
//defaults().pad(5f) - each nested table having the same can give 'stairs' effects,
|
//defaults().pad(5f) - each nested table having the same can give 'stairs' effects,
|
||||||
@ -71,6 +71,10 @@ class MapOptionsTable(private val newGameScreen: NewGameScreen): Table() {
|
|||||||
newGameScreen.updateTables()
|
newGameScreen.updateTables()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pre-select custom if any map saved within last 15 minutes
|
||||||
|
if (mapFilesSequence.any { it.fileHandle.lastModified() > System.currentTimeMillis() - 900000 })
|
||||||
|
mapTypeSelectBox.selected = TranslatedSelectBox.TranslatedString(MapType.custom)
|
||||||
|
|
||||||
// activate once, so when we had a file map before we'll have the right things set for another one
|
// activate once, so when we had a file map before we'll have the right things set for another one
|
||||||
updateOnMapTypeChange()
|
updateOnMapTypeChange()
|
||||||
|
|
||||||
@ -114,16 +118,22 @@ class MapOptionsTable(private val newGameScreen: NewGameScreen): Table() {
|
|||||||
private fun fillMapFileSelectBox() {
|
private fun fillMapFileSelectBox() {
|
||||||
if (!mapFileSelectBox.items.isEmpty) return
|
if (!mapFileSelectBox.items.isEmpty) return
|
||||||
val mapFiles = Array<FileHandleWrapper>()
|
val mapFiles = Array<FileHandleWrapper>()
|
||||||
mapFilesSequence.forEach { mapFiles.add(it) }
|
mapFilesSequence
|
||||||
|
.sortedWith(compareBy(UncivGame.Current.settings.getCollatorFromLocale()) { it.toString() })
|
||||||
|
.forEach { mapFiles.add(it) }
|
||||||
mapFileSelectBox.items = mapFiles
|
mapFileSelectBox.items = mapFiles
|
||||||
val selectedItem = mapFiles.firstOrNull { it.fileHandle.name() == mapParameters.name }
|
|
||||||
if (selectedItem != null) {
|
// Pre-select: a) map saved within last 15min or b) map named in mapParameters or c) alphabetically first
|
||||||
|
// This is a kludge - the better way would be to have a "play this map now" menu button in the editor
|
||||||
|
// (which would ideally not even require a save file - which makes implementation non-trivial)
|
||||||
|
val selectedItem =
|
||||||
|
mapFiles.maxByOrNull { it.fileHandle.lastModified() }
|
||||||
|
?.takeIf { it.fileHandle.lastModified() > System.currentTimeMillis() - 900000 }
|
||||||
|
?: mapFiles.firstOrNull { it.fileHandle.name() == mapParameters.name }
|
||||||
|
?: mapFiles.firstOrNull()
|
||||||
|
?: return
|
||||||
mapFileSelectBox.selected = selectedItem
|
mapFileSelectBox.selected = selectedItem
|
||||||
newGameScreen.gameSetupInfo.mapFile = mapFileSelectBox.selected.fileHandle
|
newGameScreen.gameSetupInfo.mapFile = selectedItem.fileHandle
|
||||||
} else if (!mapFiles.isEmpty) {
|
|
||||||
mapFileSelectBox.selected = mapFiles.first()
|
|
||||||
newGameScreen.gameSetupInfo.mapFile = mapFileSelectBox.selected.fileHandle
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The SelectBox auto displays the text a object.toString(), which on the FileHandle itself includes the folder path.
|
// The SelectBox auto displays the text a object.toString(), which on the FileHandle itself includes the folder path.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user