Improve UX (#8633)

* Added double click actions to:
Great person picker screen;
Improvement picker screen;
Policy picker screen;
Promotion picker screen;
Load/Save game screen.

* Removed adding to/removing from construction queue on second click

* Removed default keyboard focus on load/save screen

* Added back adding to construction queue on second click
This commit is contained in:
Gualdimar 2023-02-12 20:48:54 +02:00 committed by GitHub
parent 29deacaca2
commit 82c39f9e99
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 72 additions and 49 deletions

View File

@ -339,14 +339,8 @@ class CityConstructionsTable(private val cityScreen: CityScreen) {
table.touchable = Touchable.enabled
table.onClick {
if (selectedQueueEntry == constructionQueueIndex) {
city.cityConstructions.removeFromQueue(constructionQueueIndex, false)
selectedQueueEntry = -1
cityScreen.clearSelection()
} else {
cityScreen.selectConstruction(constructionName)
selectedQueueEntry = constructionQueueIndex
}
cityScreen.update()
}
return table

View File

@ -8,6 +8,7 @@ import com.unciv.models.translations.tr
import com.unciv.ui.images.ImageGetter
import com.unciv.ui.utils.extensions.isEnabled
import com.unciv.ui.utils.extensions.onClick
import com.unciv.ui.utils.extensions.onDoubleClick
class GreatPersonPickerScreen(val civInfo:Civilization) : PickerScreen() {
private var theChosenOne: BaseUnit? = null
@ -23,15 +24,25 @@ class GreatPersonPickerScreen(val civInfo:Civilization) : PickerScreen() {
val button = PickerPane.getPickerOptionButton(ImageGetter.getUnitIcon(unit.name), unit.name)
button.pack()
button.isEnabled = !useMayaLongCount || unit.name in civInfo.greatPeople.longCountGPPool
if (button.isEnabled) button.onClick {
if (button.isEnabled) {
button.onClick {
theChosenOne = unit
pick("Get [${unit.name}]".tr())
descriptionLabel.setText(unit.getShortDescription())
}
button.onDoubleClick(UncivSound.Choir) { confirmAction(useMayaLongCount) }
}
topTable.add(button).pad(10f).row()
}
rightSideButton.onClick(UncivSound.Choir) {
confirmAction(useMayaLongCount)
}
}
private fun confirmAction(useMayaLongCount: Boolean){
civInfo.units.addUnit(theChosenOne!!.name, civInfo.getCapital())
civInfo.greatPeople.freeGreatPeople--
if (useMayaLongCount) {
@ -40,7 +51,5 @@ class GreatPersonPickerScreen(val civInfo:Civilization) : PickerScreen() {
}
UncivGame.Current.popScreen()
}
}
}

View File

@ -18,6 +18,7 @@ import com.unciv.ui.utils.UncivTooltip.Companion.addTooltip
import com.unciv.ui.utils.extensions.disable
import com.unciv.ui.utils.extensions.keyShortcuts
import com.unciv.ui.utils.extensions.onClick
import com.unciv.ui.utils.extensions.onDoubleClick
import com.unciv.ui.utils.extensions.toLabel
import kotlin.math.roundToInt
@ -185,6 +186,8 @@ class ImprovementPickerScreen(
descriptionLabel.setText(improvement.getDescription(ruleSet))
}
improvementButton.onDoubleClick { accept(improvement) }
if (improvement.name == tile.improvementInProgress) improvementButton.color = Color.GREEN
if (proposedSolutions.isNotEmpty() || tileMarkedForCreatesOneImprovement) {
improvementButton.disable()

View File

@ -31,6 +31,7 @@ import com.unciv.ui.utils.extensions.darken
import com.unciv.ui.utils.extensions.disable
import com.unciv.ui.utils.extensions.enable
import com.unciv.ui.utils.extensions.onClick
import com.unciv.ui.utils.extensions.onDoubleClick
import com.unciv.ui.utils.extensions.pad
import com.unciv.ui.utils.extensions.toGroup
import com.unciv.ui.utils.extensions.toLabel
@ -177,23 +178,7 @@ class PolicyPickerScreen(val worldScreen: WorldScreen, val viewingCiv: Civilizat
closeButton.disable()
rightSideButton.onClick(UncivSound.Policy) {
val policy = selectedPolicyButton!!.policy
// Evil people clicking on buttons too fast to confuse the screen - #4977
if (!policy.isPickable()) return@onClick
viewingCiv.policies.adopt(policy)
// If we've moved to another screen in the meantime (great person pick, victory screen) ignore this
if (game.screen !is PolicyPickerScreen) {
game.popScreen()
} else {
val policyScreen = PolicyPickerScreen(worldScreen)
policyScreen.scrollPane.scrollPercentX = scrollPane.scrollPercentX
policyScreen.scrollPane.scrollPercentY = scrollPane.scrollPercentY
policyScreen.scrollPane.updateVisualScroll()
game.replaceCurrentScreen(policyScreen) // update policies
}
confirmAction()
}
if (!worldScreen.canChangeState)
@ -263,11 +248,6 @@ class PolicyPickerScreen(val worldScreen: WorldScreen, val viewingCiv: Civilizat
} else {
rightSideButton.enable()
}
if (viewingCiv.gameInfo.gameParameters.godMode && selectedPolicyButton?.policy == policy
&& viewingCiv.policies.isAdoptable(policy)) {
viewingCiv.policies.adopt(policy)
game.replaceCurrentScreen(PolicyPickerScreen(worldScreen))
}
selectedPolicyButton?.isSelected = false
selectedPolicyButton = button
@ -671,8 +651,30 @@ class PolicyPickerScreen(val worldScreen: WorldScreen, val viewingCiv: Civilizat
private fun getPolicyButton(policy: Policy, size: Float = 30f): PolicyButton {
val button = PolicyButton(policy, size = size)
button.onClick { pickPolicy(button = button) }
if (policy.isPickable())
button.onDoubleClick(UncivSound.Policy) { confirmAction() }
return button
}
private fun confirmAction() {
val policy = selectedPolicyButton!!.policy
// Evil people clicking on buttons too fast to confuse the screen - #4977
if (!policy.isPickable()) return
viewingCiv.policies.adopt(policy)
// If we've moved to another screen in the meantime (great person pick, victory screen) ignore this
if (game.screen !is PolicyPickerScreen) {
game.popScreen()
} else {
val policyScreen = PolicyPickerScreen(worldScreen)
policyScreen.scrollPane.scrollPercentX = scrollPane.scrollPercentX
policyScreen.scrollPane.scrollPercentY = scrollPane.scrollPercentY
policyScreen.scrollPane.updateVisualScroll()
game.replaceCurrentScreen(policyScreen) // update policies
}
}
override fun recreate(): BaseScreen = PolicyPickerScreen(worldScreen, viewingCiv)
}

View File

@ -21,6 +21,7 @@ import com.unciv.ui.utils.extensions.colorFromRGB
import com.unciv.ui.utils.extensions.darken
import com.unciv.ui.utils.extensions.isEnabled
import com.unciv.ui.utils.extensions.onClick
import com.unciv.ui.utils.extensions.onDoubleClick
import com.unciv.ui.utils.extensions.setFontColor
import com.unciv.ui.utils.extensions.toLabel
import com.unciv.ui.utils.extensions.toTextButton
@ -368,6 +369,11 @@ class PromotionPickerScreen(val unit: MapUnit) : PickerScreen(), RecreateOnResiz
addConnectingLines()
}
if (isPickable)
button.onDoubleClick(UncivSound.Promote) {
acceptPromotion(node)
}
return button
}

View File

@ -23,6 +23,7 @@ import com.unciv.ui.utils.extensions.isEnabled
import com.unciv.ui.utils.extensions.keyShortcuts
import com.unciv.ui.utils.extensions.onActivation
import com.unciv.ui.utils.extensions.onClick
import com.unciv.ui.utils.extensions.onDoubleClick
import com.unciv.ui.utils.extensions.toLabel
import com.unciv.ui.utils.extensions.toTextButton
import com.unciv.utils.Log
@ -100,6 +101,10 @@ class LoadGameScreen : LoadOrSaveScreen() {
rightSideButton.enable()
}
override fun doubleClickAction() {
onLoadGame()
}
private fun Table.initRightSideTable() {
add(getLoadFromClipboardButton()).row()
addLoadFromCustomLocationButton()

View File

@ -18,6 +18,7 @@ import com.unciv.ui.utils.extensions.enable
import com.unciv.ui.utils.extensions.keyShortcuts
import com.unciv.ui.utils.extensions.onActivation
import com.unciv.ui.utils.extensions.onChange
import com.unciv.ui.utils.extensions.onDoubleClick
import com.unciv.ui.utils.extensions.pad
import com.unciv.ui.utils.extensions.toLabel
import com.unciv.ui.utils.extensions.toTextButton
@ -31,6 +32,7 @@ abstract class LoadOrSaveScreen(
) : PickerScreen(disableScroll = true) {
abstract fun onExistingSaveSelected(saveGameFile: FileHandle)
abstract fun doubleClickAction()
protected var selectedSave = ""
private set
@ -42,6 +44,7 @@ abstract class LoadOrSaveScreen(
init {
savesScrollPane.onChange(::selectExistingSave)
savesScrollPane.onDoubleClick { doubleClickAction() }
rightSideTable.defaults().pad(5f, 10f)

View File

@ -35,17 +35,11 @@ class SaveGameScreen(val gameInfo: GameInfo) : LoadOrSaveScreen("Current saves")
rightSideButton.setText("Save game".tr())
rightSideButton.onActivation {
if (game.files.getSave(gameNameTextField.text).exists())
ConfirmPopup(
this,
"Overwrite existing file?",
"Overwrite",
) { saveGame() }.open()
doubleClickAction()
else saveGame()
}
rightSideButton.keyShortcuts.add(KeyCharAndCode.RETURN)
rightSideButton.enable()
stage.keyboardFocus = gameNameTextField
}
private fun Table.initRightSideTable() {
@ -71,7 +65,6 @@ class SaveGameScreen(val gameInfo: GameInfo) : LoadOrSaveScreen("Current saves")
add("Saved game name".toLabel()).row()
add(gameNameTextField).width(300f).row()
stage.keyboardFocus = gameNameTextField
}
private fun copyToClipboardHandler() {
@ -128,4 +121,12 @@ class SaveGameScreen(val gameInfo: GameInfo) : LoadOrSaveScreen("Current saves")
gameNameTextField.text = saveGameFile.name()
}
override fun doubleClickAction() {
ConfirmPopup(
this,
"Overwrite existing file?",
"Overwrite",
) { saveGame() }.open()
}
}