mirror of
https://github.com/yairm210/Unciv.git
synced 2025-02-01 02:14:51 +07:00
Untinted embedded symbols - Notifications and Citystate diplomacy (#9051)
This commit is contained in:
parent
3d56c1ba5d
commit
aea988a6bb
107
core/src/com/unciv/ui/components/ColorMarkupLabel.kt
Normal file
107
core/src/com/unciv/ui/components/ColorMarkupLabel.kt
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
@file:Suppress("unused")
|
||||||
|
|
||||||
|
package com.unciv.ui.components
|
||||||
|
|
||||||
|
import com.badlogic.gdx.graphics.Color
|
||||||
|
import com.badlogic.gdx.scenes.scene2d.ui.Label
|
||||||
|
import com.unciv.Constants
|
||||||
|
import com.unciv.models.translations.tr
|
||||||
|
import com.unciv.ui.screens.basescreen.BaseScreen
|
||||||
|
|
||||||
|
/** A Label allowing Gdx markup
|
||||||
|
*
|
||||||
|
* See also [Color Markup Language](https://libgdx.com/wiki/graphics/2d/fonts/color-markup-language)
|
||||||
|
*/
|
||||||
|
class ColorMarkupLabel private constructor(
|
||||||
|
fontSize: Int, // inverted order so it can be differentiated from the translating constructor
|
||||||
|
text: String,
|
||||||
|
) : Label(text, BaseScreen.skin) {
|
||||||
|
|
||||||
|
/** A Label allowing Gdx markup, auto-translated.
|
||||||
|
*
|
||||||
|
* Since Gdx markup markers are interpreted and removed by translation, use «» instead.
|
||||||
|
*/
|
||||||
|
constructor(text: String, fontSize: Int = Constants.defaultFontSize)
|
||||||
|
: this(fontSize, mapMarkup(text))
|
||||||
|
|
||||||
|
/** A Label automatically applying Gdx markup colors to symbols and rest of text separately
|
||||||
|
* - _after_ translating [text].
|
||||||
|
*/
|
||||||
|
constructor(text: String,
|
||||||
|
textColor: Color,
|
||||||
|
symbolColor: Color = Color.WHITE,
|
||||||
|
fontSize: Int = Constants.defaultFontSize)
|
||||||
|
: this (fontSize, prepareText(text, textColor, symbolColor))
|
||||||
|
|
||||||
|
private val originalMarkupEnabled: Boolean
|
||||||
|
|
||||||
|
init {
|
||||||
|
if (fontSize != Constants.defaultFontSize) {
|
||||||
|
val labelStyle = LabelStyle(style) // clone otherwise all default-styled Labels affected
|
||||||
|
style = labelStyle
|
||||||
|
style.font = Fonts.font
|
||||||
|
setFontScale(fontSize / Fonts.ORIGINAL_FONT_SIZE)
|
||||||
|
}
|
||||||
|
originalMarkupEnabled = style.font.data.markupEnabled
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun layout() {
|
||||||
|
style.font.data.markupEnabled = true
|
||||||
|
super.layout()
|
||||||
|
style.font.data.markupEnabled = originalMarkupEnabled
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private fun mapMarkup(text: String): String {
|
||||||
|
val translated = text.tr()
|
||||||
|
if ('«' !in translated) return translated
|
||||||
|
return translated.replace('«', '[').replace('»', ']')
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Color.toMarkup() = when {
|
||||||
|
this == Color.CLEAR -> "CLEAR"
|
||||||
|
this == Color.BLACK -> "BLACK"
|
||||||
|
this == Color.BLUE -> "BLUE"
|
||||||
|
this == Color.CYAN -> "CYAN"
|
||||||
|
this == Color.GOLD -> "GOLD"
|
||||||
|
this == Color.GRAY -> "GRAY"
|
||||||
|
this == Color.GREEN -> "GREEN"
|
||||||
|
this == Color.LIME -> "LIME"
|
||||||
|
this == Color.NAVY -> "NAVY"
|
||||||
|
this == Color.PINK -> "PINK"
|
||||||
|
this == Color.RED -> "RED"
|
||||||
|
this == Color.SKY -> "SKY"
|
||||||
|
this == Color.TAN -> "TAN"
|
||||||
|
this == Color.TEAL -> "TEAL"
|
||||||
|
this == Color.WHITE -> "WHITE"
|
||||||
|
a < 1f -> "#" + toString()
|
||||||
|
else -> "#" + toString().substring(0,6)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun prepareText(text: String, textColor: Color, symbolColor: Color): String {
|
||||||
|
val translated = text.tr()
|
||||||
|
if (textColor == Color.WHITE && symbolColor == Color.WHITE || translated.isBlank())
|
||||||
|
return translated
|
||||||
|
val tc = textColor.toMarkup()
|
||||||
|
if (textColor == symbolColor)
|
||||||
|
return "[$tc]$translated[]"
|
||||||
|
val sc = symbolColor.toMarkup()
|
||||||
|
|
||||||
|
val sb = StringBuilder(translated.length + 42)
|
||||||
|
var currentColor = ' '
|
||||||
|
for (char in translated) {
|
||||||
|
val newColor = if (char in Fonts.allSymbols) 'S' else 'T'
|
||||||
|
if (newColor != currentColor) {
|
||||||
|
if (currentColor != ' ') sb.append("[]")
|
||||||
|
sb.append('[')
|
||||||
|
sb.append((if (newColor == 'S') sc else tc).toString())
|
||||||
|
sb.append(']')
|
||||||
|
currentColor = newColor
|
||||||
|
}
|
||||||
|
sb.append(char)
|
||||||
|
}
|
||||||
|
if (currentColor != ' ') sb.append("[]")
|
||||||
|
return sb.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -249,4 +249,13 @@ object Fonts {
|
|||||||
const val greatMerchant = '⚖' // U+2696 'scale'
|
const val greatMerchant = '⚖' // U+2696 'scale'
|
||||||
const val greatScientist = '⚛' // U+269B 'atom'
|
const val greatScientist = '⚛' // U+269B 'atom'
|
||||||
const val death = '☠' // U+2620 'skull and crossbones'
|
const val death = '☠' // U+2620 'skull and crossbones'
|
||||||
|
|
||||||
|
val allSymbols = arrayOf<Char>(
|
||||||
|
turn,
|
||||||
|
strength, rangedStrength, range, movement,
|
||||||
|
production, gold, food, science, culture, happiness, faith,
|
||||||
|
greatArtist, greatEngineer, greatGeneral, greatMerchant, greatScientist,
|
||||||
|
death,
|
||||||
|
*MayaCalendar.allSymbols
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,15 @@ object MayaCalendar {
|
|||||||
val digits = zero..nineteen
|
val digits = zero..nineteen
|
||||||
fun digitIcon(ch: Char) = iconFolder + (ch.toCode() - zero.toCode()).toString()
|
fun digitIcon(ch: Char) = iconFolder + (ch.toCode() - zero.toCode()).toString()
|
||||||
|
|
||||||
|
val allSymbols = sequence {
|
||||||
|
yield(tun)
|
||||||
|
yield(katun)
|
||||||
|
yield(baktun)
|
||||||
|
yieldAll(digits)
|
||||||
|
}.iterator().run {
|
||||||
|
Array<Char>(23) { next() }
|
||||||
|
}
|
||||||
|
|
||||||
// Calculation
|
// Calculation
|
||||||
private const val daysOn30000101BCE = 36000 + 5040 + 240 + 11
|
private const val daysOn30000101BCE = 36000 + 5040 + 240 + 11
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ import com.unciv.models.ruleset.unique.UniqueType
|
|||||||
import com.unciv.models.translations.tr
|
import com.unciv.models.translations.tr
|
||||||
import com.unciv.ui.audio.MusicMood
|
import com.unciv.ui.audio.MusicMood
|
||||||
import com.unciv.ui.audio.MusicTrackChooserFlags
|
import com.unciv.ui.audio.MusicTrackChooserFlags
|
||||||
|
import com.unciv.ui.components.ColorMarkupLabel
|
||||||
import com.unciv.ui.components.Fonts
|
import com.unciv.ui.components.Fonts
|
||||||
import com.unciv.ui.components.KeyCharAndCode
|
import com.unciv.ui.components.KeyCharAndCode
|
||||||
import com.unciv.ui.components.UncivTooltip.Companion.addTooltip
|
import com.unciv.ui.components.UncivTooltip.Companion.addTooltip
|
||||||
@ -266,12 +267,12 @@ class DiplomacyScreen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val friendBonusLabelColor = if (relationLevel == RelationshipLevel.Friend) Color.GREEN else Color.GRAY
|
val friendBonusLabelColor = if (relationLevel == RelationshipLevel.Friend) Color.GREEN else Color.GRAY
|
||||||
val friendBonusLabel = friendBonusText.toLabel(friendBonusLabelColor)
|
val friendBonusLabel = ColorMarkupLabel(friendBonusText, friendBonusLabelColor)
|
||||||
.apply { setAlignment(Align.center) }
|
.apply { setAlignment(Align.center) }
|
||||||
diplomacyTable.add(friendBonusLabel).row()
|
diplomacyTable.add(friendBonusLabel).row()
|
||||||
|
|
||||||
val allyBonusLabelColor = if (relationLevel == RelationshipLevel.Ally) Color.GREEN else Color.GRAY
|
val allyBonusLabelColor = if (relationLevel == RelationshipLevel.Ally) Color.GREEN else Color.GRAY
|
||||||
val allyBonusLabel = allyBonusText.toLabel(allyBonusLabelColor)
|
val allyBonusLabel = ColorMarkupLabel(allyBonusText, allyBonusLabelColor)
|
||||||
.apply { setAlignment(Align.center) }
|
.apply { setAlignment(Align.center) }
|
||||||
diplomacyTable.add(allyBonusLabel).row()
|
diplomacyTable.add(allyBonusLabel).row()
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table
|
|||||||
import com.badlogic.gdx.utils.Align
|
import com.badlogic.gdx.utils.Align
|
||||||
import com.unciv.logic.civilization.Notification
|
import com.unciv.logic.civilization.Notification
|
||||||
import com.unciv.logic.civilization.NotificationCategory
|
import com.unciv.logic.civilization.NotificationCategory
|
||||||
|
import com.unciv.ui.components.ColorMarkupLabel
|
||||||
import com.unciv.ui.images.ImageGetter
|
import com.unciv.ui.images.ImageGetter
|
||||||
import com.unciv.ui.screens.basescreen.BaseScreen
|
import com.unciv.ui.screens.basescreen.BaseScreen
|
||||||
import com.unciv.ui.components.WrappableLabel
|
import com.unciv.ui.components.WrappableLabel
|
||||||
@ -81,7 +82,7 @@ class NotificationsScroll(
|
|||||||
add(ImageGetter.getWhiteDot()).minHeight(2f).width(worldScreen.stage.width/8)
|
add(ImageGetter.getWhiteDot()).minHeight(2f).width(worldScreen.stage.width/8)
|
||||||
add(Table().apply {
|
add(Table().apply {
|
||||||
background = backgroundDrawable
|
background = backgroundDrawable
|
||||||
add(category.name.toLabel(fontSize = 30, fontColor = Color.BLACK))
|
add(ColorMarkupLabel(category.name, Color.BLACK, fontSize = 30))
|
||||||
}).pad(3f)
|
}).pad(3f)
|
||||||
add(ImageGetter.getWhiteDot()).minHeight(2f).width(worldScreen.stage.width/8)
|
add(ImageGetter.getWhiteDot()).minHeight(2f).width(worldScreen.stage.width/8)
|
||||||
}).row()
|
}).row()
|
||||||
|
Loading…
Reference in New Issue
Block a user