mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-23 03:23:17 -04:00
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:
parent
29deacaca2
commit
82c39f9e99
@ -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
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user