mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-23 19:43:13 -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.touchable = Touchable.enabled
|
||||||
table.onClick {
|
table.onClick {
|
||||||
if (selectedQueueEntry == constructionQueueIndex) {
|
cityScreen.selectConstruction(constructionName)
|
||||||
city.cityConstructions.removeFromQueue(constructionQueueIndex, false)
|
selectedQueueEntry = constructionQueueIndex
|
||||||
selectedQueueEntry = -1
|
|
||||||
cityScreen.clearSelection()
|
|
||||||
} else {
|
|
||||||
cityScreen.selectConstruction(constructionName)
|
|
||||||
selectedQueueEntry = constructionQueueIndex
|
|
||||||
}
|
|
||||||
cityScreen.update()
|
cityScreen.update()
|
||||||
}
|
}
|
||||||
return table
|
return table
|
||||||
|
@ -8,6 +8,7 @@ import com.unciv.models.translations.tr
|
|||||||
import com.unciv.ui.images.ImageGetter
|
import com.unciv.ui.images.ImageGetter
|
||||||
import com.unciv.ui.utils.extensions.isEnabled
|
import com.unciv.ui.utils.extensions.isEnabled
|
||||||
import com.unciv.ui.utils.extensions.onClick
|
import com.unciv.ui.utils.extensions.onClick
|
||||||
|
import com.unciv.ui.utils.extensions.onDoubleClick
|
||||||
|
|
||||||
class GreatPersonPickerScreen(val civInfo:Civilization) : PickerScreen() {
|
class GreatPersonPickerScreen(val civInfo:Civilization) : PickerScreen() {
|
||||||
private var theChosenOne: BaseUnit? = null
|
private var theChosenOne: BaseUnit? = null
|
||||||
@ -23,24 +24,32 @@ class GreatPersonPickerScreen(val civInfo:Civilization) : PickerScreen() {
|
|||||||
val button = PickerPane.getPickerOptionButton(ImageGetter.getUnitIcon(unit.name), unit.name)
|
val button = PickerPane.getPickerOptionButton(ImageGetter.getUnitIcon(unit.name), unit.name)
|
||||||
button.pack()
|
button.pack()
|
||||||
button.isEnabled = !useMayaLongCount || unit.name in civInfo.greatPeople.longCountGPPool
|
button.isEnabled = !useMayaLongCount || unit.name in civInfo.greatPeople.longCountGPPool
|
||||||
if (button.isEnabled) button.onClick {
|
if (button.isEnabled) {
|
||||||
theChosenOne = unit
|
button.onClick {
|
||||||
pick("Get [${unit.name}]".tr())
|
theChosenOne = unit
|
||||||
descriptionLabel.setText(unit.getShortDescription())
|
pick("Get [${unit.name}]".tr())
|
||||||
|
descriptionLabel.setText(unit.getShortDescription())
|
||||||
|
}
|
||||||
|
|
||||||
|
button.onDoubleClick(UncivSound.Choir) { confirmAction(useMayaLongCount) }
|
||||||
}
|
}
|
||||||
topTable.add(button).pad(10f).row()
|
topTable.add(button).pad(10f).row()
|
||||||
}
|
}
|
||||||
|
|
||||||
rightSideButton.onClick(UncivSound.Choir) {
|
rightSideButton.onClick(UncivSound.Choir) {
|
||||||
civInfo.units.addUnit(theChosenOne!!.name, civInfo.getCapital())
|
confirmAction(useMayaLongCount)
|
||||||
civInfo.greatPeople.freeGreatPeople--
|
|
||||||
if (useMayaLongCount) {
|
|
||||||
civInfo.greatPeople.mayaLimitedFreeGP--
|
|
||||||
civInfo.greatPeople.longCountGPPool.remove(theChosenOne!!.name)
|
|
||||||
}
|
|
||||||
UncivGame.Current.popScreen()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun confirmAction(useMayaLongCount: Boolean){
|
||||||
|
civInfo.units.addUnit(theChosenOne!!.name, civInfo.getCapital())
|
||||||
|
civInfo.greatPeople.freeGreatPeople--
|
||||||
|
if (useMayaLongCount) {
|
||||||
|
civInfo.greatPeople.mayaLimitedFreeGP--
|
||||||
|
civInfo.greatPeople.longCountGPPool.remove(theChosenOne!!.name)
|
||||||
|
}
|
||||||
|
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.disable
|
||||||
import com.unciv.ui.utils.extensions.keyShortcuts
|
import com.unciv.ui.utils.extensions.keyShortcuts
|
||||||
import com.unciv.ui.utils.extensions.onClick
|
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.toLabel
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
@ -185,6 +186,8 @@ class ImprovementPickerScreen(
|
|||||||
descriptionLabel.setText(improvement.getDescription(ruleSet))
|
descriptionLabel.setText(improvement.getDescription(ruleSet))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
improvementButton.onDoubleClick { accept(improvement) }
|
||||||
|
|
||||||
if (improvement.name == tile.improvementInProgress) improvementButton.color = Color.GREEN
|
if (improvement.name == tile.improvementInProgress) improvementButton.color = Color.GREEN
|
||||||
if (proposedSolutions.isNotEmpty() || tileMarkedForCreatesOneImprovement) {
|
if (proposedSolutions.isNotEmpty() || tileMarkedForCreatesOneImprovement) {
|
||||||
improvementButton.disable()
|
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.disable
|
||||||
import com.unciv.ui.utils.extensions.enable
|
import com.unciv.ui.utils.extensions.enable
|
||||||
import com.unciv.ui.utils.extensions.onClick
|
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.pad
|
||||||
import com.unciv.ui.utils.extensions.toGroup
|
import com.unciv.ui.utils.extensions.toGroup
|
||||||
import com.unciv.ui.utils.extensions.toLabel
|
import com.unciv.ui.utils.extensions.toLabel
|
||||||
@ -177,23 +178,7 @@ class PolicyPickerScreen(val worldScreen: WorldScreen, val viewingCiv: Civilizat
|
|||||||
closeButton.disable()
|
closeButton.disable()
|
||||||
|
|
||||||
rightSideButton.onClick(UncivSound.Policy) {
|
rightSideButton.onClick(UncivSound.Policy) {
|
||||||
val policy = selectedPolicyButton!!.policy
|
confirmAction()
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!worldScreen.canChangeState)
|
if (!worldScreen.canChangeState)
|
||||||
@ -263,11 +248,6 @@ class PolicyPickerScreen(val worldScreen: WorldScreen, val viewingCiv: Civilizat
|
|||||||
} else {
|
} else {
|
||||||
rightSideButton.enable()
|
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?.isSelected = false
|
||||||
selectedPolicyButton = button
|
selectedPolicyButton = button
|
||||||
@ -671,8 +651,30 @@ class PolicyPickerScreen(val worldScreen: WorldScreen, val viewingCiv: Civilizat
|
|||||||
private fun getPolicyButton(policy: Policy, size: Float = 30f): PolicyButton {
|
private fun getPolicyButton(policy: Policy, size: Float = 30f): PolicyButton {
|
||||||
val button = PolicyButton(policy, size = size)
|
val button = PolicyButton(policy, size = size)
|
||||||
button.onClick { pickPolicy(button = button) }
|
button.onClick { pickPolicy(button = button) }
|
||||||
|
if (policy.isPickable())
|
||||||
|
button.onDoubleClick(UncivSound.Policy) { confirmAction() }
|
||||||
return button
|
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)
|
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.darken
|
||||||
import com.unciv.ui.utils.extensions.isEnabled
|
import com.unciv.ui.utils.extensions.isEnabled
|
||||||
import com.unciv.ui.utils.extensions.onClick
|
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.setFontColor
|
||||||
import com.unciv.ui.utils.extensions.toLabel
|
import com.unciv.ui.utils.extensions.toLabel
|
||||||
import com.unciv.ui.utils.extensions.toTextButton
|
import com.unciv.ui.utils.extensions.toTextButton
|
||||||
@ -368,6 +369,11 @@ class PromotionPickerScreen(val unit: MapUnit) : PickerScreen(), RecreateOnResiz
|
|||||||
addConnectingLines()
|
addConnectingLines()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isPickable)
|
||||||
|
button.onDoubleClick(UncivSound.Promote) {
|
||||||
|
acceptPromotion(node)
|
||||||
|
}
|
||||||
|
|
||||||
return button
|
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.keyShortcuts
|
||||||
import com.unciv.ui.utils.extensions.onActivation
|
import com.unciv.ui.utils.extensions.onActivation
|
||||||
import com.unciv.ui.utils.extensions.onClick
|
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.toLabel
|
||||||
import com.unciv.ui.utils.extensions.toTextButton
|
import com.unciv.ui.utils.extensions.toTextButton
|
||||||
import com.unciv.utils.Log
|
import com.unciv.utils.Log
|
||||||
@ -100,6 +101,10 @@ class LoadGameScreen : LoadOrSaveScreen() {
|
|||||||
rightSideButton.enable()
|
rightSideButton.enable()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun doubleClickAction() {
|
||||||
|
onLoadGame()
|
||||||
|
}
|
||||||
|
|
||||||
private fun Table.initRightSideTable() {
|
private fun Table.initRightSideTable() {
|
||||||
add(getLoadFromClipboardButton()).row()
|
add(getLoadFromClipboardButton()).row()
|
||||||
addLoadFromCustomLocationButton()
|
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.keyShortcuts
|
||||||
import com.unciv.ui.utils.extensions.onActivation
|
import com.unciv.ui.utils.extensions.onActivation
|
||||||
import com.unciv.ui.utils.extensions.onChange
|
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.pad
|
||||||
import com.unciv.ui.utils.extensions.toLabel
|
import com.unciv.ui.utils.extensions.toLabel
|
||||||
import com.unciv.ui.utils.extensions.toTextButton
|
import com.unciv.ui.utils.extensions.toTextButton
|
||||||
@ -31,6 +32,7 @@ abstract class LoadOrSaveScreen(
|
|||||||
) : PickerScreen(disableScroll = true) {
|
) : PickerScreen(disableScroll = true) {
|
||||||
|
|
||||||
abstract fun onExistingSaveSelected(saveGameFile: FileHandle)
|
abstract fun onExistingSaveSelected(saveGameFile: FileHandle)
|
||||||
|
abstract fun doubleClickAction()
|
||||||
|
|
||||||
protected var selectedSave = ""
|
protected var selectedSave = ""
|
||||||
private set
|
private set
|
||||||
@ -42,6 +44,7 @@ abstract class LoadOrSaveScreen(
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
savesScrollPane.onChange(::selectExistingSave)
|
savesScrollPane.onChange(::selectExistingSave)
|
||||||
|
savesScrollPane.onDoubleClick { doubleClickAction() }
|
||||||
|
|
||||||
rightSideTable.defaults().pad(5f, 10f)
|
rightSideTable.defaults().pad(5f, 10f)
|
||||||
|
|
||||||
|
@ -35,17 +35,11 @@ class SaveGameScreen(val gameInfo: GameInfo) : LoadOrSaveScreen("Current saves")
|
|||||||
rightSideButton.setText("Save game".tr())
|
rightSideButton.setText("Save game".tr())
|
||||||
rightSideButton.onActivation {
|
rightSideButton.onActivation {
|
||||||
if (game.files.getSave(gameNameTextField.text).exists())
|
if (game.files.getSave(gameNameTextField.text).exists())
|
||||||
ConfirmPopup(
|
doubleClickAction()
|
||||||
this,
|
|
||||||
"Overwrite existing file?",
|
|
||||||
"Overwrite",
|
|
||||||
) { saveGame() }.open()
|
|
||||||
else saveGame()
|
else saveGame()
|
||||||
}
|
}
|
||||||
rightSideButton.keyShortcuts.add(KeyCharAndCode.RETURN)
|
rightSideButton.keyShortcuts.add(KeyCharAndCode.RETURN)
|
||||||
rightSideButton.enable()
|
rightSideButton.enable()
|
||||||
|
|
||||||
stage.keyboardFocus = gameNameTextField
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Table.initRightSideTable() {
|
private fun Table.initRightSideTable() {
|
||||||
@ -71,7 +65,6 @@ class SaveGameScreen(val gameInfo: GameInfo) : LoadOrSaveScreen("Current saves")
|
|||||||
|
|
||||||
add("Saved game name".toLabel()).row()
|
add("Saved game name".toLabel()).row()
|
||||||
add(gameNameTextField).width(300f).row()
|
add(gameNameTextField).width(300f).row()
|
||||||
stage.keyboardFocus = gameNameTextField
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun copyToClipboardHandler() {
|
private fun copyToClipboardHandler() {
|
||||||
@ -128,4 +121,12 @@ class SaveGameScreen(val gameInfo: GameInfo) : LoadOrSaveScreen("Current saves")
|
|||||||
gameNameTextField.text = saveGameFile.name()
|
gameNameTextField.text = saveGameFile.name()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun doubleClickAction() {
|
||||||
|
ConfirmPopup(
|
||||||
|
this,
|
||||||
|
"Overwrite existing file?",
|
||||||
|
"Overwrite",
|
||||||
|
) { saveGame() }.open()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user