From f3c64d3d82077c2a01100945243906929a17cf0d Mon Sep 17 00:00:00 2001 From: Alyssa Date: Sat, 18 Apr 2026 23:06:33 +0100 Subject: [PATCH 01/10] wip pride theme --- .../dartzee/bean/InteractiveDartboard.kt | 4 +- .../dartzee/bean/PresentationDartboard.kt | 6 +-- .../dartzee/dart/DartzeeDartRuleColour.kt | 2 +- .../dartzee/screen/GameplayDartboard.kt | 4 +- src/main/kotlin/dartzee/screen/MenuScreen.kt | 3 ++ .../screen/ai/AbstractVisualisationPanel.kt | 2 +- .../screen/ai/VisualisationPanelDensity.kt | 2 +- .../screen/ai/VisualisationPanelScatter.kt | 6 +-- .../dartzee/DartboardSegmentSelectDialog.kt | 4 +- .../dartzee/DartzeeRuleVerificationPanel.kt | 2 +- .../screen/game/dartzee/GamePanelDartzee.kt | 2 +- .../preference/PreferencesPanelDartboard.kt | 2 +- src/main/kotlin/dartzee/theme/Birthday.kt | 1 - .../{object => theme}/ColourWrapper.kt | 28 ++++++------ src/main/kotlin/dartzee/theme/Easter.kt | 1 - src/main/kotlin/dartzee/theme/Halloween.kt | 1 - .../kotlin/dartzee/theme/IDartboardPainter.kt | 17 +++++++ src/main/kotlin/dartzee/theme/Oktoberfest.kt | 1 - src/main/kotlin/dartzee/theme/Pride.kt | 19 ++++++++ .../dartzee/theme/PrideDartboardPainter.kt | 42 ++++++++++++++++++ src/main/kotlin/dartzee/theme/Theme.kt | 5 +-- src/main/kotlin/dartzee/theme/ThemeId.kt | 3 +- src/main/kotlin/dartzee/theme/ThemeUtils.kt | 9 +++- .../kotlin/dartzee/utils/DartboardUtil.kt | 9 ++-- src/main/resources/theme/pride/font.ttf | Bin 0 -> 43972 bytes .../kotlin/dartzee/ai/TestStrategyUtils.kt | 2 +- .../dartzee/bean/PresentationDartboardTest.kt | 6 +-- .../dartzee/bean/TestInteractiveDartboard.kt | 2 +- .../dartzee/TestDartzeeAimCalculator.kt | 2 +- src/test/kotlin/dartzee/helper/TestFactory.kt | 4 +- .../object/TestComputationalDartboard.kt | 1 + .../dartzee/screen/TestGameplayDartboard.kt | 8 ++-- .../PreferencesPanelDartboardTest.kt | 2 +- 33 files changed, 145 insertions(+), 57 deletions(-) rename src/main/kotlin/dartzee/{object => theme}/ColourWrapper.kt (75%) create mode 100644 src/main/kotlin/dartzee/theme/IDartboardPainter.kt create mode 100644 src/main/kotlin/dartzee/theme/Pride.kt create mode 100644 src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt create mode 100644 src/main/resources/theme/pride/font.ttf diff --git a/src/main/kotlin/dartzee/bean/InteractiveDartboard.kt b/src/main/kotlin/dartzee/bean/InteractiveDartboard.kt index 53572abc7..bc1abee8d 100644 --- a/src/main/kotlin/dartzee/bean/InteractiveDartboard.kt +++ b/src/main/kotlin/dartzee/bean/InteractiveDartboard.kt @@ -1,15 +1,15 @@ package dartzee.bean import dartzee.core.util.getParentWindow -import dartzee.`object`.ColourWrapper import dartzee.`object`.DartboardSegment +import dartzee.theme.IDartboardPainter import dartzee.utils.UPPER_BOUND_OUTSIDE_BOARD_RATIO import dartzee.utils.getColourWrapperFromPrefs import dartzee.utils.getHighlightedColour import java.awt.Point import java.awt.event.MouseEvent -class InteractiveDartboard(colourWrapper: ColourWrapper = getColourWrapperFromPrefs()) : +class InteractiveDartboard(colourWrapper: IDartboardPainter = getColourWrapperFromPrefs()) : PresentationDartboard(colourWrapper, true), IMouseListener { private var hoveredSegment: DartboardSegment? = null private var allowInteraction = true diff --git a/src/main/kotlin/dartzee/bean/PresentationDartboard.kt b/src/main/kotlin/dartzee/bean/PresentationDartboard.kt index 5aa2c08ab..5de2646f3 100644 --- a/src/main/kotlin/dartzee/bean/PresentationDartboard.kt +++ b/src/main/kotlin/dartzee/bean/PresentationDartboard.kt @@ -3,13 +3,13 @@ package dartzee.bean import com.github.weisj.jsvg.view.ViewBox import dartzee.logging.CODE_SLOW_DARTBOARD_RENDER import dartzee.logging.KEY_DURATION -import dartzee.`object`.ColourWrapper import dartzee.`object`.ComputedPoint import dartzee.`object`.DartboardSegment -import dartzee.`object`.GREY_COLOUR_WRAPPER import dartzee.`object`.IDartboard import dartzee.screen.game.SegmentStatuses import dartzee.screen.game.getSegmentStatus +import dartzee.theme.GREY_COLOUR_WRAPPER +import dartzee.theme.IDartboardPainter import dartzee.theme.getBaseFont import dartzee.utils.DurationTimer import dartzee.utils.InjectedThings @@ -34,7 +34,7 @@ import javax.swing.JComponent import kotlin.math.roundToInt open class PresentationDartboard( - private val colourWrapper: ColourWrapper = getColourWrapperFromPrefs(), + private val colourWrapper: IDartboardPainter = getColourWrapperFromPrefs(), private val renderScoreLabels: Boolean = false, private val renderThemeBanner: Boolean = false, ) : JComponent(), IDartboard { diff --git a/src/main/kotlin/dartzee/dartzee/dart/DartzeeDartRuleColour.kt b/src/main/kotlin/dartzee/dartzee/dart/DartzeeDartRuleColour.kt index 27d763057..4536bfb40 100644 --- a/src/main/kotlin/dartzee/dartzee/dart/DartzeeDartRuleColour.kt +++ b/src/main/kotlin/dartzee/dartzee/dart/DartzeeDartRuleColour.kt @@ -1,7 +1,7 @@ package dartzee.dartzee.dart -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.`object`.DartboardSegment +import dartzee.theme.DEFAULT_COLOUR_WRAPPER import dartzee.utils.DartsColour import java.awt.Color import java.awt.FlowLayout diff --git a/src/main/kotlin/dartzee/screen/GameplayDartboard.kt b/src/main/kotlin/dartzee/screen/GameplayDartboard.kt index 59e7edd58..f3191de4d 100644 --- a/src/main/kotlin/dartzee/screen/GameplayDartboard.kt +++ b/src/main/kotlin/dartzee/screen/GameplayDartboard.kt @@ -7,10 +7,10 @@ import dartzee.core.util.getAllChildComponentsForType import dartzee.core.util.getParentWindow import dartzee.core.util.runOnEventThreadBlocking import dartzee.listener.DartboardListener -import dartzee.`object`.ColourWrapper import dartzee.`object`.ComputedPoint import dartzee.screen.game.AbstractDartsGameScreen import dartzee.screen.game.SegmentStatuses +import dartzee.theme.IDartboardPainter import dartzee.theme.makeDartLabel import dartzee.utils.getColourWrapperFromPrefs import dartzee.utils.getDartForSegment @@ -25,7 +25,7 @@ import javax.swing.SwingUtilities const val LAYER_DARTS = 2 const val LAYER_DODGY = 3 -class GameplayDartboard(colourWrapper: ColourWrapper = getColourWrapperFromPrefs()) : +class GameplayDartboard(colourWrapper: IDartboardPainter = getColourWrapperFromPrefs()) : JLayeredPane(), IMouseListener { var latestClip: Clip? = null diff --git a/src/main/kotlin/dartzee/screen/MenuScreen.kt b/src/main/kotlin/dartzee/screen/MenuScreen.kt index d5ea81220..909bf15b9 100644 --- a/src/main/kotlin/dartzee/screen/MenuScreen.kt +++ b/src/main/kotlin/dartzee/screen/MenuScreen.kt @@ -14,6 +14,7 @@ import dartzee.theme.getBaseFont import dartzee.theme.themedIcon import dartzee.utils.DARTS_VERSION_NUMBER import dartzee.utils.InjectedThings +import java.awt.Color import java.awt.Dimension import java.awt.Font import java.awt.event.ActionEvent @@ -71,6 +72,8 @@ class MenuScreen : EmbeddedScreen() { btnDartzeeTemplates.icon = ImageIcon(javaClass.getResource("/buttons/dartzeeTemplates.png")) btnLeaderboards.icon = ImageIcon(javaClass.getResource("/buttons/leaderboards.png")) + btnNewGame.background = Color.red + getAllChildComponentsForType().forEach { button -> button.font = getBaseFont().deriveFont(Font.PLAIN, InjectedThings.theme?.menuFontSize ?: 18f) diff --git a/src/main/kotlin/dartzee/screen/ai/AbstractVisualisationPanel.kt b/src/main/kotlin/dartzee/screen/ai/AbstractVisualisationPanel.kt index d57c530cb..8e046ef96 100644 --- a/src/main/kotlin/dartzee/screen/ai/AbstractVisualisationPanel.kt +++ b/src/main/kotlin/dartzee/screen/ai/AbstractVisualisationPanel.kt @@ -2,7 +2,7 @@ package dartzee.screen.ai import dartzee.ai.DartsAiModel import dartzee.bean.PresentationDartboard -import dartzee.`object`.ColourWrapper +import dartzee.theme.ColourWrapper import dartzee.utils.DartsColour import java.awt.Point import java.awt.image.BufferedImage diff --git a/src/main/kotlin/dartzee/screen/ai/VisualisationPanelDensity.kt b/src/main/kotlin/dartzee/screen/ai/VisualisationPanelDensity.kt index 67e376e3c..67e189a7d 100644 --- a/src/main/kotlin/dartzee/screen/ai/VisualisationPanelDensity.kt +++ b/src/main/kotlin/dartzee/screen/ai/VisualisationPanelDensity.kt @@ -2,7 +2,7 @@ package dartzee.screen.ai import dartzee.ai.DartsAiModel import dartzee.core.bean.paint -import dartzee.`object`.WIREFRAME_COLOUR_WRAPPER +import dartzee.theme.WIREFRAME_COLOUR_WRAPPER import dartzee.utils.ResourceCache import java.awt.Color import java.awt.Font diff --git a/src/main/kotlin/dartzee/screen/ai/VisualisationPanelScatter.kt b/src/main/kotlin/dartzee/screen/ai/VisualisationPanelScatter.kt index 80be9fc5b..7ad145b60 100644 --- a/src/main/kotlin/dartzee/screen/ai/VisualisationPanelScatter.kt +++ b/src/main/kotlin/dartzee/screen/ai/VisualisationPanelScatter.kt @@ -2,7 +2,7 @@ package dartzee.screen.ai import dartzee.ai.DartsAiModel import dartzee.core.bean.paint -import dartzee.`object`.ColourWrapper +import dartzee.theme.ColourWrapper import dartzee.utils.DartsColour import dartzee.utils.ResourceCache import java.awt.Color @@ -60,9 +60,9 @@ class VisualisationPanelScatter : AbstractVisualisationPanel() { oddTreble, evenDouble, oddDouble, + outerDartboardColour = Color.WHITE, + missedBoardColour = Color.WHITE, ) - wrapper.missedBoardColour = Color.WHITE - wrapper.outerDartboardColour = Color.WHITE return wrapper } diff --git a/src/main/kotlin/dartzee/screen/dartzee/DartboardSegmentSelectDialog.kt b/src/main/kotlin/dartzee/screen/dartzee/DartboardSegmentSelectDialog.kt index 0e3e4a1d3..986c9d77d 100644 --- a/src/main/kotlin/dartzee/screen/dartzee/DartboardSegmentSelectDialog.kt +++ b/src/main/kotlin/dartzee/screen/dartzee/DartboardSegmentSelectDialog.kt @@ -4,10 +4,10 @@ import dartzee.bean.IMouseListener import dartzee.bean.PresentationDartboard import dartzee.core.screen.SimpleDialog import dartzee.core.util.setMargins -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.`object`.DartboardSegment -import dartzee.`object`.WIREFRAME_COLOUR_WRAPPER import dartzee.screen.ScreenCache +import dartzee.theme.DEFAULT_COLOUR_WRAPPER +import dartzee.theme.WIREFRAME_COLOUR_WRAPPER import dartzee.utils.DartsColour import dartzee.utils.getAllNonMissSegments import java.awt.BorderLayout diff --git a/src/main/kotlin/dartzee/screen/dartzee/DartzeeRuleVerificationPanel.kt b/src/main/kotlin/dartzee/screen/dartzee/DartzeeRuleVerificationPanel.kt index 4b60b1532..8612bc08f 100644 --- a/src/main/kotlin/dartzee/screen/dartzee/DartzeeRuleVerificationPanel.kt +++ b/src/main/kotlin/dartzee/screen/dartzee/DartzeeRuleVerificationPanel.kt @@ -5,9 +5,9 @@ import dartzee.core.util.setMargins import dartzee.dartzee.DartzeeRuleCalculationResult import dartzee.dartzee.DartzeeRuleDto import dartzee.listener.DartboardListener -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.`object`.Dart import dartzee.screen.GameplayDartboard +import dartzee.theme.DEFAULT_COLOUR_WRAPPER import dartzee.utils.DartsColour import dartzee.utils.InjectedThings.dartzeeCalculator import dartzee.utils.ResourceCache diff --git a/src/main/kotlin/dartzee/screen/game/dartzee/GamePanelDartzee.kt b/src/main/kotlin/dartzee/screen/game/dartzee/GamePanelDartzee.kt index 8c30268ee..7cbaac874 100644 --- a/src/main/kotlin/dartzee/screen/game/dartzee/GamePanelDartzee.kt +++ b/src/main/kotlin/dartzee/screen/game/dartzee/GamePanelDartzee.kt @@ -12,12 +12,12 @@ import dartzee.db.GameEntity import dartzee.game.GameType import dartzee.game.state.DartzeePlayerState import dartzee.game.state.IWrappedParticipant -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.`object`.Dart import dartzee.screen.game.AbstractDartsGameScreen import dartzee.screen.game.GamePanelFixedLength import dartzee.screen.game.SegmentStatuses import dartzee.screen.game.scorer.DartsScorerDartzee +import dartzee.theme.DEFAULT_COLOUR_WRAPPER import dartzee.utils.factoryHighScoreResult import dartzee.utils.generateDartzeeTemplateFromGame import dartzee.utils.getQuotedIdStr diff --git a/src/main/kotlin/dartzee/screen/preference/PreferencesPanelDartboard.kt b/src/main/kotlin/dartzee/screen/preference/PreferencesPanelDartboard.kt index f7057245b..ded2d15cf 100644 --- a/src/main/kotlin/dartzee/screen/preference/PreferencesPanelDartboard.kt +++ b/src/main/kotlin/dartzee/screen/preference/PreferencesPanelDartboard.kt @@ -5,9 +5,9 @@ import dartzee.core.bean.ColourPicker import dartzee.core.bean.ColourSelectionListener import dartzee.core.util.alignCentrally import dartzee.core.util.setFontSize -import dartzee.`object`.ColourWrapper import dartzee.preferences.Preference import dartzee.preferences.Preferences +import dartzee.theme.ColourWrapper import dartzee.utils.InjectedThings import dartzee.utils.InjectedThings.preferenceService import java.awt.BorderLayout diff --git a/src/main/kotlin/dartzee/theme/Birthday.kt b/src/main/kotlin/dartzee/theme/Birthday.kt index b314e296a..8ceba59b2 100644 --- a/src/main/kotlin/dartzee/theme/Birthday.kt +++ b/src/main/kotlin/dartzee/theme/Birthday.kt @@ -4,7 +4,6 @@ import dartzee.bean.DartLabel import dartzee.core.util.toLocalDate import dartzee.db.PlayerEntity import dartzee.game.GameType -import dartzee.`object`.ColourWrapper import dartzee.screen.animation.Animation import dartzee.screen.animation.CompositeAnimation import dartzee.screen.animation.DartScoreTrigger diff --git a/src/main/kotlin/dartzee/object/ColourWrapper.kt b/src/main/kotlin/dartzee/theme/ColourWrapper.kt similarity index 75% rename from src/main/kotlin/dartzee/object/ColourWrapper.kt rename to src/main/kotlin/dartzee/theme/ColourWrapper.kt index 36bf26989..e6ed92e70 100644 --- a/src/main/kotlin/dartzee/object/ColourWrapper.kt +++ b/src/main/kotlin/dartzee/theme/ColourWrapper.kt @@ -1,5 +1,6 @@ -package dartzee.`object` +package dartzee.theme +import dartzee.`object`.DartboardSegment import dartzee.utils.DartsColour import dartzee.utils.ResourceCache import dartzee.utils.hmScoreToOrdinal @@ -18,13 +19,11 @@ val DEFAULT_COLOUR_WRAPPER = Color.GREEN, ) -val WIREFRAME_COLOUR_WRAPPER = - ColourWrapper(DartsColour.TRANSPARENT).also { it.edgeColour = Color.BLACK } +val WIREFRAME_COLOUR_WRAPPER = ColourWrapper(DartsColour.TRANSPARENT).copy(edgeColour = Color.BLACK) val GREY_COLOUR_WRAPPER = - makeMonochromeWrapper(Color.GRAY.brighter(), Color.LIGHT_GRAY).also { - it.outerDartboardColour = Color.GRAY - } + makeMonochromeWrapper(Color.GRAY.brighter(), Color.LIGHT_GRAY) + .copy(outerDartboardColour = Color.GRAY) fun makeMonochromeWrapper(dark: Color, light: Color) = ColourWrapper(dark, light, light, light, dark, dark, dark, light) @@ -38,12 +37,12 @@ data class ColourWrapper( private val oddTrebleColour: Color, private val innerBullColour: Color, private val outerBullColour: Color, - var outerDartboardColour: Color = Color.black, - val fontColor: Color = Color.white, - val font: Font = ResourceCache.BASE_FONT, -) { - var missedBoardColour: Color = DartsColour.TRANSPARENT - var edgeColour: Color? = null + override val outerDartboardColour: Color = Color.black, + override val missedBoardColour: Color = DartsColour.TRANSPARENT, + override val edgeColour: Color? = null, + override val fontColor: Color = Color.white, + override val font: Font = ResourceCache.BASE_FONT, +) : IDartboardPainter { constructor( singleColour: Color @@ -59,6 +58,8 @@ data class ColourWrapper( singleColour, ) + override fun withFont(font: Font) = copy(font = font) + /** Helpers */ private fun getBullColour(multiplier: Int): Color { return when (multiplier) { @@ -67,7 +68,8 @@ data class ColourWrapper( } } - fun getColour(segment: DartboardSegment) = getColour(segment.getMultiplier(), segment.score) + override fun getColour(segment: DartboardSegment) = + getColour(segment.getMultiplier(), segment.score) private fun getColour(multiplier: Int, score: Int): Color { if (score == 25) { diff --git a/src/main/kotlin/dartzee/theme/Easter.kt b/src/main/kotlin/dartzee/theme/Easter.kt index a6114540b..d8db40be2 100644 --- a/src/main/kotlin/dartzee/theme/Easter.kt +++ b/src/main/kotlin/dartzee/theme/Easter.kt @@ -1,7 +1,6 @@ package dartzee.theme import dartzee.game.GameType -import dartzee.`object`.ColourWrapper import dartzee.screen.animation.Animation import dartzee.screen.animation.DartScoreTrigger import dartzee.screen.animation.IAnimation diff --git a/src/main/kotlin/dartzee/theme/Halloween.kt b/src/main/kotlin/dartzee/theme/Halloween.kt index 16565c534..a1b8fb060 100644 --- a/src/main/kotlin/dartzee/theme/Halloween.kt +++ b/src/main/kotlin/dartzee/theme/Halloween.kt @@ -1,7 +1,6 @@ package dartzee.theme import dartzee.game.GameType -import dartzee.`object`.ColourWrapper import dartzee.screen.animation.Animation import dartzee.screen.animation.CompositeAnimation import dartzee.screen.animation.DartScoreTrigger diff --git a/src/main/kotlin/dartzee/theme/IDartboardPainter.kt b/src/main/kotlin/dartzee/theme/IDartboardPainter.kt new file mode 100644 index 000000000..ab67b51b8 --- /dev/null +++ b/src/main/kotlin/dartzee/theme/IDartboardPainter.kt @@ -0,0 +1,17 @@ +package dartzee.theme + +import dartzee.`object`.DartboardSegment +import java.awt.Color +import java.awt.Font + +interface IDartboardPainter { + val outerDartboardColour: Color + val missedBoardColour: Color + val edgeColour: Color? + val fontColor: Color + val font: Font + + fun getColour(segment: DartboardSegment): Color + + fun withFont(font: Font): IDartboardPainter +} diff --git a/src/main/kotlin/dartzee/theme/Oktoberfest.kt b/src/main/kotlin/dartzee/theme/Oktoberfest.kt index ded98f1ca..4fa258dbb 100644 --- a/src/main/kotlin/dartzee/theme/Oktoberfest.kt +++ b/src/main/kotlin/dartzee/theme/Oktoberfest.kt @@ -1,7 +1,6 @@ package dartzee.theme import dartzee.game.GameType -import dartzee.`object`.ColourWrapper import dartzee.screen.animation.Animation import dartzee.screen.animation.CompositeAnimation import dartzee.screen.animation.DartScoreTrigger diff --git a/src/main/kotlin/dartzee/theme/Pride.kt b/src/main/kotlin/dartzee/theme/Pride.kt new file mode 100644 index 000000000..c6afb1794 --- /dev/null +++ b/src/main/kotlin/dartzee/theme/Pride.kt @@ -0,0 +1,19 @@ +package dartzee.theme + +import java.awt.Color + +val Themes.PRIDE: Theme + get() = + Theme( + ThemeId.Pride, + "Beep boop.", + Color.decode("#1e6239"), + Color.decode("#31343a"), + Color.decode("#FFFFC5"), + fontColor = Color.black, + lightBackground = Color.YELLOW, + dartboardColours = PrideDartboardPainter(), + svgWidthScaleFactor = 0.8f, + menuFontSize = 24f, + linkColour = Color.decode("#90D5FF"), + ) diff --git a/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt b/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt new file mode 100644 index 000000000..ba6d5bc40 --- /dev/null +++ b/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt @@ -0,0 +1,42 @@ +package dartzee.theme + +import dartzee.`object`.DartboardSegment +import dartzee.utils.DartsColour +import dartzee.utils.numberOrder +import java.awt.Color +import java.awt.Font + +data class PrideDartboardPainter(override val font: Font = getBaseFont()) : IDartboardPainter { + override val outerDartboardColour: Color = Color.BLACK + override val missedBoardColour = DartsColour.TRANSPARENT + override val edgeColour = null + override val fontColor: Color = Color.WHITE + + private val colours = + listOf( + "#ED1C24", // Red + "#FF7F27", // Orange + "#FFF200", // Yellow + "#B5E61D", // Light green + "#22B14C", // Dark green + "#00A2E8", // Dark blue + "#99D9EA", // Light blue + "#B19CD7", // Light purple + "#A349A4", // Purple + "#FFAEC9", // Pink + ) + .map(Color::decode) + + override fun getColour(segment: DartboardSegment): Color = + if (segment.isMiss()) Color.BLACK + else if (segment.score == 25) { + if (segment.getMultiplier() == 1) Color.black else Color.white + } else { + val index = numberOrder.indexOf(segment.score) % colours.size + + val rawColour = colours[index] + if (segment.getMultiplier() > 1) rawColour.darker() else rawColour + } + + override fun withFont(font: Font) = copy(font = font) +} diff --git a/src/main/kotlin/dartzee/theme/Theme.kt b/src/main/kotlin/dartzee/theme/Theme.kt index d11b6111b..d76b81a37 100644 --- a/src/main/kotlin/dartzee/theme/Theme.kt +++ b/src/main/kotlin/dartzee/theme/Theme.kt @@ -1,7 +1,6 @@ package dartzee.theme import dartzee.logging.CODE_THEME_APPLIED -import dartzee.`object`.ColourWrapper import dartzee.screen.animation.IAnimation import dartzee.screen.animation.IAnimationTrigger import dartzee.utils.InjectedThings.logger @@ -20,7 +19,7 @@ data class Theme( private val primaryDark: Color, val background: Color, val lightBackground: Color, - private val dartboardColours: ColourWrapper?, + private val dartboardColours: IDartboardPainter?, val linkColour: Color = Color.BLUE, val fontColor: Color = Color.BLACK, val menuFontSize: Float? = null, @@ -41,7 +40,7 @@ data class Theme( val newGameSfx = clipForResource("/theme/$resourcePath/newGame.wav") val dartboardColourWrapper = - dartboardColours?.copy(font = dartboardFont ?: ResourceCache.BASE_FONT) + dartboardColours?.withFont(dartboardFont ?: ResourceCache.BASE_FONT) fun apply() { logger.info(CODE_THEME_APPLIED, "Applying theme $name") diff --git a/src/main/kotlin/dartzee/theme/ThemeId.kt b/src/main/kotlin/dartzee/theme/ThemeId.kt index 32b852b0d..9e2c769cd 100644 --- a/src/main/kotlin/dartzee/theme/ThemeId.kt +++ b/src/main/kotlin/dartzee/theme/ThemeId.kt @@ -9,7 +9,8 @@ enum class ThemeId { Easter, Oktoberfest, Halloween, - Birthday; + Birthday, + Pride; companion object { fun parseFromPreference(preference: String): ThemeId = diff --git a/src/main/kotlin/dartzee/theme/ThemeUtils.kt b/src/main/kotlin/dartzee/theme/ThemeUtils.kt index eb29ea501..fcd084e1d 100644 --- a/src/main/kotlin/dartzee/theme/ThemeUtils.kt +++ b/src/main/kotlin/dartzee/theme/ThemeUtils.kt @@ -45,7 +45,14 @@ fun simpleBannerRenderer(themeId: ThemeId): BannerTextRenderer = { svgBounds, da object Themes fun themeMap() = - listOf(Themes.EASTER, Themes.OKTOBERFEST, Themes.HALLOWEEN, Themes.BIRTHDAY, Themes.DARTZEE) + listOf( + Themes.EASTER, + Themes.OKTOBERFEST, + Themes.HALLOWEEN, + Themes.BIRTHDAY, + Themes.DARTZEE, + Themes.PRIDE, + ) .associateBy { it.id } fun themeDescription(id: ThemeId): String { diff --git a/src/main/kotlin/dartzee/utils/DartboardUtil.kt b/src/main/kotlin/dartzee/utils/DartboardUtil.kt index ff527fe94..6ec170c92 100644 --- a/src/main/kotlin/dartzee/utils/DartboardUtil.kt +++ b/src/main/kotlin/dartzee/utils/DartboardUtil.kt @@ -1,18 +1,17 @@ package dartzee.utils import dartzee.core.util.mapStepped -import dartzee.`object`.ColourWrapper import dartzee.`object`.Dart import dartzee.`object`.DartboardSegment import dartzee.`object`.SegmentType import dartzee.preferences.Preferences +import dartzee.theme.ColourWrapper +import dartzee.theme.IDartboardPainter import dartzee.utils.InjectedThings.preferenceService import java.awt.Color import java.awt.Point -/** Utilities for the Dartboard object. */ -private val numberOrder = - listOf(20, 1, 18, 4, 13, 6, 10, 15, 2, 17, 3, 19, 7, 16, 8, 11, 14, 9, 12, 5, 20) +val numberOrder = listOf(20, 1, 18, 4, 13, 6, 10, 15, 2, 17, 3, 19, 7, 16, 8, 11, 14, 9, 12, 5, 20) val hmScoreToOrdinal = initialiseOrdinalHashMap() private var colourWrapperFromPrefs: ColourWrapper? = null @@ -215,7 +214,7 @@ fun getPotentialAimPoints(centerPt: Point, radius: Double): Set { return points.toSet() } -fun getColourWrapperFromPrefs(): ColourWrapper { +fun getColourWrapperFromPrefs(): IDartboardPainter { val themeColours = InjectedThings.theme?.dartboardColourWrapper if (themeColours != null) { return themeColours diff --git a/src/main/resources/theme/pride/font.ttf b/src/main/resources/theme/pride/font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..30edb6376bf8bc9a10200dd2cc5732ccb50949fa GIT binary patch literal 43972 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 literal 0 HcmV?d00001 diff --git a/src/test/kotlin/dartzee/ai/TestStrategyUtils.kt b/src/test/kotlin/dartzee/ai/TestStrategyUtils.kt index c2a1d8f6a..34cadad62 100644 --- a/src/test/kotlin/dartzee/ai/TestStrategyUtils.kt +++ b/src/test/kotlin/dartzee/ai/TestStrategyUtils.kt @@ -4,8 +4,8 @@ import com.github.alyssaburlton.swingtest.shouldMatchImage import dartzee.bean.PresentationDartboard import dartzee.helper.AbstractTest import dartzee.helper.markPoints -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.`object`.SegmentType +import dartzee.theme.DEFAULT_COLOUR_WRAPPER import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test diff --git a/src/test/kotlin/dartzee/bean/PresentationDartboardTest.kt b/src/test/kotlin/dartzee/bean/PresentationDartboardTest.kt index e0c58a4a6..dd863e091 100644 --- a/src/test/kotlin/dartzee/bean/PresentationDartboardTest.kt +++ b/src/test/kotlin/dartzee/bean/PresentationDartboardTest.kt @@ -4,21 +4,21 @@ import com.github.alyssaburlton.swingtest.shouldMatchImage import dartzee.core.bean.getPointList import dartzee.helper.AbstractTest import dartzee.helper.makeSegmentStatuses -import dartzee.`object`.ColourWrapper import dartzee.`object`.ComputationalDartboard -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.`object`.DartboardSegment import dartzee.`object`.SegmentType -import dartzee.`object`.WIREFRAME_COLOUR_WRAPPER import dartzee.screen.game.SegmentStatuses import dartzee.theme.BIRTHDAY import dartzee.theme.BirthdayInfo +import dartzee.theme.ColourWrapper import dartzee.theme.DARTZEE +import dartzee.theme.DEFAULT_COLOUR_WRAPPER import dartzee.theme.EASTER import dartzee.theme.HALLOWEEN import dartzee.theme.OKTOBERFEST import dartzee.theme.Theme import dartzee.theme.Themes +import dartzee.theme.WIREFRAME_COLOUR_WRAPPER import dartzee.utils.InjectedThings import dartzee.utils.getAllNonMissSegments import io.kotest.matchers.shouldBe diff --git a/src/test/kotlin/dartzee/bean/TestInteractiveDartboard.kt b/src/test/kotlin/dartzee/bean/TestInteractiveDartboard.kt index 438f4da90..5acbd56a2 100644 --- a/src/test/kotlin/dartzee/bean/TestInteractiveDartboard.kt +++ b/src/test/kotlin/dartzee/bean/TestInteractiveDartboard.kt @@ -2,10 +2,10 @@ package dartzee.bean import com.github.alyssaburlton.swingtest.shouldMatchImage import dartzee.helper.AbstractTest -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.`object`.DartboardSegment import dartzee.`object`.SegmentType import dartzee.screen.game.SegmentStatuses +import dartzee.theme.DEFAULT_COLOUR_WRAPPER import dartzee.utils.getAllNonMissSegments import dartzee.utils.getAllSegmentsForDartzee import java.awt.Point diff --git a/src/test/kotlin/dartzee/dartzee/TestDartzeeAimCalculator.kt b/src/test/kotlin/dartzee/dartzee/TestDartzeeAimCalculator.kt index b95f14dcb..34eb7ca68 100644 --- a/src/test/kotlin/dartzee/dartzee/TestDartzeeAimCalculator.kt +++ b/src/test/kotlin/dartzee/dartzee/TestDartzeeAimCalculator.kt @@ -9,8 +9,8 @@ import dartzee.helper.AbstractTest import dartzee.helper.markPoints import dartzee.missTwenty import dartzee.`object`.ComputationalDartboard -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.screen.game.SegmentStatuses +import dartzee.theme.DEFAULT_COLOUR_WRAPPER import dartzee.utils.DurationTimer import dartzee.utils.getAllNonMissSegments import io.kotest.matchers.comparables.shouldBeLessThan diff --git a/src/test/kotlin/dartzee/helper/TestFactory.kt b/src/test/kotlin/dartzee/helper/TestFactory.kt index 8009139bc..c50ac9daf 100644 --- a/src/test/kotlin/dartzee/helper/TestFactory.kt +++ b/src/test/kotlin/dartzee/helper/TestFactory.kt @@ -16,8 +16,6 @@ import dartzee.game.state.ClockPlayerState import dartzee.game.state.GolfPlayerState import dartzee.game.state.SingleParticipant import dartzee.game.state.X01PlayerState -import dartzee.`object`.ColourWrapper -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.`object`.Dart import dartzee.`object`.SegmentType import dartzee.reporting.IncludedPlayerParameters @@ -28,6 +26,8 @@ import dartzee.reporting.ReportParametersPlayers import dartzee.screen.animation.IAnimation import dartzee.screen.animation.IAnimationTrigger import dartzee.stats.GameWrapper +import dartzee.theme.ColourWrapper +import dartzee.theme.DEFAULT_COLOUR_WRAPPER import dartzee.theme.Theme import dartzee.theme.ThemeId import dartzee.utils.InjectedThings.mainDatabase diff --git a/src/test/kotlin/dartzee/object/TestComputationalDartboard.kt b/src/test/kotlin/dartzee/object/TestComputationalDartboard.kt index a558ca250..c3376a74c 100644 --- a/src/test/kotlin/dartzee/object/TestComputationalDartboard.kt +++ b/src/test/kotlin/dartzee/object/TestComputationalDartboard.kt @@ -4,6 +4,7 @@ import com.github.alyssaburlton.swingtest.shouldMatchImage import dartzee.bean.PresentationDartboard import dartzee.helper.AbstractTest import dartzee.helper.markPoints +import dartzee.theme.WIREFRAME_COLOUR_WRAPPER import io.kotest.matchers.shouldBe import java.awt.Dimension import java.awt.Point diff --git a/src/test/kotlin/dartzee/screen/TestGameplayDartboard.kt b/src/test/kotlin/dartzee/screen/TestGameplayDartboard.kt index 10d2c38f5..8744c0776 100644 --- a/src/test/kotlin/dartzee/screen/TestGameplayDartboard.kt +++ b/src/test/kotlin/dartzee/screen/TestGameplayDartboard.kt @@ -11,13 +11,13 @@ import dartzee.core.helper.verifyNotCalled import dartzee.getPointForSegment import dartzee.helper.AbstractTest import dartzee.listener.DartboardListener -import dartzee.`object`.ColourWrapper -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.`object`.Dart import dartzee.`object`.DartboardSegment import dartzee.`object`.SegmentType import dartzee.screen.game.FakeDartsScreen import dartzee.theme.BIRTHDAY +import dartzee.theme.DEFAULT_COLOUR_WRAPPER +import dartzee.theme.IDartboardPainter import dartzee.theme.Themes import dartzee.throwDartByClick import dartzee.utils.InjectedThings @@ -160,7 +160,9 @@ class TestGameplayDartboard : AbstractTest() { dartboard.shouldMatchImage("darts-original-size") } - private fun factoryGameplayDartboard(colourWrapper: ColourWrapper? = null): GameplayDartboard { + private fun factoryGameplayDartboard( + colourWrapper: IDartboardPainter? = null + ): GameplayDartboard { val dartboard = GameplayDartboard(colourWrapper ?: DEFAULT_COLOUR_WRAPPER) dartboard.setBounds(0, 0, 400, 400) flushEdt() diff --git a/src/test/kotlin/dartzee/screen/preference/PreferencesPanelDartboardTest.kt b/src/test/kotlin/dartzee/screen/preference/PreferencesPanelDartboardTest.kt index a7dc7b831..2d0dc93b5 100644 --- a/src/test/kotlin/dartzee/screen/preference/PreferencesPanelDartboardTest.kt +++ b/src/test/kotlin/dartzee/screen/preference/PreferencesPanelDartboardTest.kt @@ -7,8 +7,8 @@ import com.github.alyssaburlton.swingtest.waitForAssertion import dartzee.bean.PresentationDartboard import dartzee.core.util.runOnEventThreadBlocking import dartzee.helper.makeTheme -import dartzee.`object`.DEFAULT_COLOUR_WRAPPER import dartzee.preferences.Preferences +import dartzee.theme.DEFAULT_COLOUR_WRAPPER import dartzee.theme.ThemeId import dartzee.utils.DartsColour import dartzee.utils.InjectedThings From ba8ecc5e56795af4130e4bfd4b0891008aedc5be Mon Sep 17 00:00:00 2001 From: Alyssa Date: Sun, 19 Apr 2026 17:49:32 +0100 Subject: [PATCH 02/10] more colours --- src/main/kotlin/dartzee/screen/DartsApp.kt | 2 +- .../kotlin/dartzee/screen/EmbeddedScreen.kt | 21 ++++++- src/main/kotlin/dartzee/screen/MenuScreen.kt | 4 +- .../dartzee/theme/ButtonHoverListener.kt | 25 ++++++++ src/main/kotlin/dartzee/theme/Pride.kt | 56 ++++++++++++++++-- .../dartzee/theme/PrideDartboardPainter.kt | 23 ++++--- src/main/kotlin/dartzee/theme/Theme.kt | 1 + src/main/resources/theme/pride/font.ttf | Bin 43972 -> 87064 bytes .../kotlin/dartzee/screen/MenuScreenTest.kt | 8 +-- 9 files changed, 114 insertions(+), 26 deletions(-) create mode 100644 src/main/kotlin/dartzee/theme/ButtonHoverListener.kt diff --git a/src/main/kotlin/dartzee/screen/DartsApp.kt b/src/main/kotlin/dartzee/screen/DartsApp.kt index c459929ef..d548d9bee 100644 --- a/src/main/kotlin/dartzee/screen/DartsApp.kt +++ b/src/main/kotlin/dartzee/screen/DartsApp.kt @@ -111,7 +111,7 @@ class DartsApp(commandBar: CheatBar) : AbstractDevScreen(commandBar), WindowList fun switchScreen(scrn: EmbeddedScreen, reInit: Boolean = true) { try { if (reInit) { - scrn.initialise() + scrn.init() } } catch (t: Throwable) { logger.error(CODE_SCREEN_LOAD_ERROR, "Failed to load screen ${scrn.getScreenName()}", t) diff --git a/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt b/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt index 058b252ab..efcfff7dc 100644 --- a/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt +++ b/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt @@ -1,8 +1,11 @@ package dartzee.screen +import dartzee.core.util.getAllChildComponentsForType import dartzee.logging.CODE_SWING_ERROR +import dartzee.theme.ButtonHoverListener import dartzee.theme.getBaseFont import dartzee.theme.themedIcon +import dartzee.utils.InjectedThings import dartzee.utils.InjectedThings.logger import java.awt.BorderLayout import java.awt.Dimension @@ -59,11 +62,25 @@ abstract class EmbeddedScreen : JPanel(), ActionListener { abstract fun getScreenName(): String - /** Called after the new screen has been switched in etc */ + fun init() { + val overrides = InjectedThings.theme?.buttonOverrideColours?.mapKeys { it.key.lowercase() } + if (overrides != null) { + getAllChildComponentsForType().forEach { button -> + val overrideColour = + overrides[button.text.lowercase()] ?: overrides[button.name?.lowercase()] + if (overrideColour != null && button.background != overrideColour) { + button.background = overrideColour + button.addMouseListener(ButtonHoverListener(button)) + } + } + } + + initialise() + } + open fun postInit() { btnBack.isVisible = showBackButton() btnNext.isVisible = showNextButton() - lblNext.text = getNextText() } diff --git a/src/main/kotlin/dartzee/screen/MenuScreen.kt b/src/main/kotlin/dartzee/screen/MenuScreen.kt index 909bf15b9..5add68386 100644 --- a/src/main/kotlin/dartzee/screen/MenuScreen.kt +++ b/src/main/kotlin/dartzee/screen/MenuScreen.kt @@ -30,10 +30,10 @@ class MenuScreen : EmbeddedScreen() { private val changeLog = ChangeLog() private val dartboard = PresentationDartboard(renderThemeBanner = true) private val btnNewGame = JButton("New Game") - private val btnManagePlayers = JButton("Manage Players") + private val btnManagePlayers = JButton("Players") private val btnLeaderboards = JButton("Leaderboards") private val btnPreferences = JButton("Preferences") - private val btnDartzeeTemplates = JButton("Dartzee Rules") + private val btnDartzeeTemplates = JButton("Dartzee") private val btnUtilities = JButton("Utilities") private val btnSyncSummary = JButton("Sync Setup") private val btnGameReport = JButton("Game Report") diff --git a/src/main/kotlin/dartzee/theme/ButtonHoverListener.kt b/src/main/kotlin/dartzee/theme/ButtonHoverListener.kt new file mode 100644 index 000000000..57f9395f1 --- /dev/null +++ b/src/main/kotlin/dartzee/theme/ButtonHoverListener.kt @@ -0,0 +1,25 @@ +package dartzee.theme + +import java.awt.event.MouseAdapter +import java.awt.event.MouseEvent +import javax.swing.JButton + +class ButtonHoverListener(private val button: JButton) : MouseAdapter() { + private val bgColour = button.background + + override fun mousePressed(e: MouseEvent?) { + button.background = bgColour.darker() + } + + override fun mouseReleased(e: MouseEvent?) { + button.background = bgColour + } + + override fun mouseEntered(e: MouseEvent?) { + button.background = bgColour.brighter() + } + + override fun mouseExited(e: MouseEvent?) { + button.background = bgColour + } +} diff --git a/src/main/kotlin/dartzee/theme/Pride.kt b/src/main/kotlin/dartzee/theme/Pride.kt index c6afb1794..332691e45 100644 --- a/src/main/kotlin/dartzee/theme/Pride.kt +++ b/src/main/kotlin/dartzee/theme/Pride.kt @@ -2,18 +2,64 @@ package dartzee.theme import java.awt.Color +object PrideColors { + val red = Color.decode("#ED1C24") + val orange = Color.decode("#FF7F27") + val yellow = Color.decode("#FFF200") + val lightGreen = Color.decode("#B5E61D") + val darkGreen = Color.decode("#22B14C") + val darkBlue = Color.decode("#00A2E8") + val lightBlue = Color.decode("#99D9EA") + val lightPurple = Color.decode("#B19CD7") + val purple = Color.decode("#A349A4") + val pink = Color.decode("#FFAEC9") +} + +private val buttonOverrideColours = + mapOf( + "New Game" to PrideColors.red, + "Players" to PrideColors.orange, + "Leaderboards" to PrideColors.yellow, + "Game Report" to PrideColors.darkGreen, + "Sync Setup" to PrideColors.darkBlue, + "Utilities" to PrideColors.lightBlue, + "Dartzee" to PrideColors.pink, + "Preferences" to PrideColors.purple, + + // Utilities + "Delete Game" to PrideColors.red, + "Create Backup" to PrideColors.orange, + "Restore from backup" to PrideColors.yellow, + "Perform database check" to PrideColors.lightGreen, + "Thread stacks" to PrideColors.darkGreen, + "Check for updates" to PrideColors.darkBlue, + "View logs" to PrideColors.lightBlue, + "Run achievement conversion" to PrideColors.pink, + "Enter party mode" to PrideColors.purple, + + // Game setup + "Launch game" to PrideColors.darkGreen, + "Select" to PrideColors.lightGreen, + "Unselect" to PrideColors.orange, + + // Navigation + "Back" to PrideColors.red, + "Next" to PrideColors.darkGreen, + ) + val Themes.PRIDE: Theme get() = Theme( ThemeId.Pride, "Beep boop.", - Color.decode("#1e6239"), - Color.decode("#31343a"), + PrideColors.red, + PrideColors.purple, Color.decode("#FFFFC5"), fontColor = Color.black, - lightBackground = Color.YELLOW, + lightBackground = PrideColors.pink, dartboardColours = PrideDartboardPainter(), svgWidthScaleFactor = 0.8f, - menuFontSize = 24f, - linkColour = Color.decode("#90D5FF"), + menuFontSize = 15f, + linkColour = PrideColors.darkBlue, + buttonOverrideColours = buttonOverrideColours, ) diff --git a/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt b/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt index ba6d5bc40..1b4a93137 100644 --- a/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt +++ b/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt @@ -14,18 +14,17 @@ data class PrideDartboardPainter(override val font: Font = getBaseFont()) : IDar private val colours = listOf( - "#ED1C24", // Red - "#FF7F27", // Orange - "#FFF200", // Yellow - "#B5E61D", // Light green - "#22B14C", // Dark green - "#00A2E8", // Dark blue - "#99D9EA", // Light blue - "#B19CD7", // Light purple - "#A349A4", // Purple - "#FFAEC9", // Pink - ) - .map(Color::decode) + PrideColors.red, + PrideColors.orange, + PrideColors.yellow, + PrideColors.lightGreen, + PrideColors.darkGreen, + PrideColors.darkBlue, + PrideColors.lightBlue, + PrideColors.lightPurple, + PrideColors.purple, + PrideColors.pink, + ) override fun getColour(segment: DartboardSegment): Color = if (segment.isMiss()) Color.BLACK diff --git a/src/main/kotlin/dartzee/theme/Theme.kt b/src/main/kotlin/dartzee/theme/Theme.kt index d76b81a37..fbc06e511 100644 --- a/src/main/kotlin/dartzee/theme/Theme.kt +++ b/src/main/kotlin/dartzee/theme/Theme.kt @@ -29,6 +29,7 @@ data class Theme( val festivalInfo: FestivalInfo? = null, val unlockDate: LocalDate? = null, val dartFactory: DartFactory? = null, + val buttonOverrideColours: Map = emptyMap(), ) { val name = id.name private val resourcePath = name.lowercase() diff --git a/src/main/resources/theme/pride/font.ttf b/src/main/resources/theme/pride/font.ttf index 30edb6376bf8bc9a10200dd2cc5732ccb50949fa..b9a14a77cdbc6782468378f44d50d292b4b1c3a8 100644 GIT binary patch literal 87064 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 HclrMWI;UVg literal 43972 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 diff --git a/src/test/kotlin/dartzee/screen/MenuScreenTest.kt b/src/test/kotlin/dartzee/screen/MenuScreenTest.kt index 0d7524dae..becadce32 100644 --- a/src/test/kotlin/dartzee/screen/MenuScreenTest.kt +++ b/src/test/kotlin/dartzee/screen/MenuScreenTest.kt @@ -84,7 +84,7 @@ class MenuScreenTest : AbstractTest() { @Test fun `Should go to the player management screen`() { val scrn = MenuScreen() - scrn.clickChild(text = "Manage Players") + scrn.clickChild(text = "Players") ScreenCache.currentScreen().shouldBeInstanceOf() } @@ -128,7 +128,7 @@ class MenuScreenTest : AbstractTest() { @Test fun `Should go to the dartzee template setup screen`() { val scrn = MenuScreen() - scrn.clickChild(text = "Dartzee Rules") + scrn.clickChild(text = "Dartzee") ScreenCache.currentScreen().shouldBeInstanceOf() } @@ -153,10 +153,10 @@ class MenuScreenTest : AbstractTest() { scrn.getChild(text = "Leaderboards").shouldBeVisible() scrn.getChild(text = "Sync Setup").shouldNotBeVisible() - scrn.getChild(text = "Manage Players").shouldNotBeVisible() + scrn.getChild(text = "Players").shouldNotBeVisible() scrn.getChild(text = "Game Report").shouldNotBeVisible() scrn.getChild(text = "Utilities").shouldNotBeVisible() scrn.getChild(text = "Preferences").shouldNotBeVisible() - scrn.getChild(text = "Dartzee Rules").shouldNotBeVisible() + scrn.getChild(text = "Dartzee").shouldNotBeVisible() } } From 7b07dba7bd463f451d26dd31010e74678dc73cd7 Mon Sep 17 00:00:00 2001 From: Alyssa Date: Sun, 19 Apr 2026 19:30:49 +0100 Subject: [PATCH 03/10] more recolouring of buttons --- .../kotlin/dartzee/screen/EmbeddedScreen.kt | 24 ++++++------------- src/main/kotlin/dartzee/screen/MenuScreen.kt | 8 ++----- .../kotlin/dartzee/screen/UtilitiesScreen.kt | 4 ++-- .../dartzee/DartzeeTemplateSetupScreen.kt | 2 +- .../screen/player/PlayerAchievementsButton.kt | 1 + .../screen/player/PlayerManagementPanel.kt | 7 ++++-- .../screen/player/PlayerStatsButton.kt | 2 ++ src/main/kotlin/dartzee/theme/Pride.kt | 21 ++++++++++++++++ src/main/kotlin/dartzee/theme/ThemeUtils.kt | 21 ++++++++++++++++ .../dartzee/TestDartzeeTemplateSetupScreen.kt | 12 +++++----- 10 files changed, 68 insertions(+), 34 deletions(-) diff --git a/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt b/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt index efcfff7dc..feb416ca6 100644 --- a/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt +++ b/src/main/kotlin/dartzee/screen/EmbeddedScreen.kt @@ -1,11 +1,10 @@ package dartzee.screen -import dartzee.core.util.getAllChildComponentsForType import dartzee.logging.CODE_SWING_ERROR -import dartzee.theme.ButtonHoverListener +import dartzee.theme.applyButtonOverrides import dartzee.theme.getBaseFont +import dartzee.theme.getMenuFont import dartzee.theme.themedIcon -import dartzee.utils.InjectedThings import dartzee.utils.InjectedThings.logger import java.awt.BorderLayout import java.awt.Dimension @@ -47,12 +46,13 @@ abstract class EmbeddedScreen : JPanel(), ActionListener { btnBack.name = "Back" val baseFont = getBaseFont() + val size = minOf(20f, getMenuFont().size2D) iconNext.icon = themedIcon("/buttons/rightArrow.png") btnBack.icon = themedIcon("/buttons/leftArrow.png") - lblNext.font = baseFont.deriveFont(Font.PLAIN, 20f) - btnBack.font = baseFont.deriveFont(Font.PLAIN, 20f) + lblNext.font = baseFont.deriveFont(Font.PLAIN, size) + btnBack.font = baseFont.deriveFont(Font.PLAIN, size) btnBack.addActionListener(this) btnNext.addActionListener(this) @@ -63,19 +63,9 @@ abstract class EmbeddedScreen : JPanel(), ActionListener { abstract fun getScreenName(): String fun init() { - val overrides = InjectedThings.theme?.buttonOverrideColours?.mapKeys { it.key.lowercase() } - if (overrides != null) { - getAllChildComponentsForType().forEach { button -> - val overrideColour = - overrides[button.text.lowercase()] ?: overrides[button.name?.lowercase()] - if (overrideColour != null && button.background != overrideColour) { - button.background = overrideColour - button.addMouseListener(ButtonHoverListener(button)) - } - } - } - initialise() + + applyButtonOverrides() } open fun postInit() { diff --git a/src/main/kotlin/dartzee/screen/MenuScreen.kt b/src/main/kotlin/dartzee/screen/MenuScreen.kt index 5add68386..5948ea7fd 100644 --- a/src/main/kotlin/dartzee/screen/MenuScreen.kt +++ b/src/main/kotlin/dartzee/screen/MenuScreen.kt @@ -10,13 +10,12 @@ import dartzee.screen.reporting.ReportingSetupScreen import dartzee.screen.stats.overall.LeaderboardsScreen import dartzee.screen.stats.overall.SimplifiedLeaderboardScreen import dartzee.screen.sync.SyncManagementScreen -import dartzee.theme.getBaseFont +import dartzee.theme.getMenuFont import dartzee.theme.themedIcon import dartzee.utils.DARTS_VERSION_NUMBER import dartzee.utils.InjectedThings import java.awt.Color import java.awt.Dimension -import java.awt.Font import java.awt.event.ActionEvent import java.awt.event.ComponentAdapter import java.awt.event.ComponentEvent @@ -74,10 +73,7 @@ class MenuScreen : EmbeddedScreen() { btnNewGame.background = Color.red - getAllChildComponentsForType().forEach { button -> - button.font = - getBaseFont().deriveFont(Font.PLAIN, InjectedThings.theme?.menuFontSize ?: 18f) - } + getAllChildComponentsForType().forEach { button -> button.font = getMenuFont() } addComponentListener( object : ComponentAdapter() { diff --git a/src/main/kotlin/dartzee/screen/UtilitiesScreen.kt b/src/main/kotlin/dartzee/screen/UtilitiesScreen.kt index 46ce2fdc3..476793238 100644 --- a/src/main/kotlin/dartzee/screen/UtilitiesScreen.kt +++ b/src/main/kotlin/dartzee/screen/UtilitiesScreen.kt @@ -6,7 +6,7 @@ import dartzee.core.util.runInOtherThread import dartzee.db.sanity.DatabaseSanityCheck import dartzee.logging.CODE_PARTY_MODE import dartzee.`object`.DartsClient -import dartzee.theme.getBaseFont +import dartzee.theme.getMenuFont import dartzee.utils.DARTS_VERSION_NUMBER import dartzee.utils.DartsDatabaseUtil import dartzee.utils.DevUtilities @@ -44,7 +44,7 @@ class UtilitiesScreen : EmbeddedScreen() { panel.add(btnAchievementConversion, "cell 0 11,alignx center") panel.add(btnPartyMode, "cell 0 12,alignx center") - val font = getBaseFont().deriveFont(InjectedThings.theme?.menuFontSize ?: 18f) + val font = getMenuFont() val buttons = panel.getAllChildComponentsForType() for (button in buttons) { button.font = font diff --git a/src/main/kotlin/dartzee/screen/dartzee/DartzeeTemplateSetupScreen.kt b/src/main/kotlin/dartzee/screen/dartzee/DartzeeTemplateSetupScreen.kt index 6a8dbfc73..9401c660b 100644 --- a/src/main/kotlin/dartzee/screen/dartzee/DartzeeTemplateSetupScreen.kt +++ b/src/main/kotlin/dartzee/screen/dartzee/DartzeeTemplateSetupScreen.kt @@ -54,7 +54,7 @@ class DartzeeTemplateSetupScreen : EmbeddedScreen(), RowSelectionListener { btnCopy.toolTipText = "Copy Template" btnCopy.preferredSize = Dimension(40, 40) - btnDelete.name = "delete" + btnDelete.name = "deleteTemplate" btnDelete.icon = ImageIcon(javaClass.getResource("/buttons/remove.png")) btnDelete.toolTipText = "Delete Template" btnDelete.preferredSize = Dimension(40, 40) diff --git a/src/main/kotlin/dartzee/screen/player/PlayerAchievementsButton.kt b/src/main/kotlin/dartzee/screen/player/PlayerAchievementsButton.kt index 8790179b9..53a0ccc2f 100644 --- a/src/main/kotlin/dartzee/screen/player/PlayerAchievementsButton.kt +++ b/src/main/kotlin/dartzee/screen/player/PlayerAchievementsButton.kt @@ -17,6 +17,7 @@ class PlayerAchievementsButton( init { icon = ImageIcon(javaClass.getResource("/achievements/trophy.png")) text = defaultText + name = "Achievements" rolloverIcon = ImageIcon(javaClass.getResource("/buttons/achievement.png")) selectedIcon = ImageIcon(javaClass.getResource("/buttons/achievement.png")) diff --git a/src/main/kotlin/dartzee/screen/player/PlayerManagementPanel.kt b/src/main/kotlin/dartzee/screen/player/PlayerManagementPanel.kt index a54b26616..b72d1f341 100644 --- a/src/main/kotlin/dartzee/screen/player/PlayerManagementPanel.kt +++ b/src/main/kotlin/dartzee/screen/player/PlayerManagementPanel.kt @@ -15,7 +15,8 @@ import dartzee.screen.ScreenCache import dartzee.screen.ai.AIConfigurationDialog import dartzee.screen.ai.AISimulationSetupDialog import dartzee.stats.getGameCounts -import dartzee.utils.ResourceCache +import dartzee.theme.applyButtonOverrides +import dartzee.theme.getMenuFont import java.awt.BorderLayout import java.awt.Dimension import java.awt.Font @@ -74,7 +75,7 @@ class PlayerManagementPanel : JPanel(), ActionListener { add(panelNorth, BorderLayout.NORTH) lblPlayerName.preferredSize = Dimension(0, 25) - lblPlayerName.font = ResourceCache.BASE_FONT.deriveFont(Font.BOLD, 20f) + lblPlayerName.font = getMenuFont() lblPlayerName.horizontalAlignment = SwingConstants.CENTER add(panelCenter, BorderLayout.CENTER) @@ -101,6 +102,8 @@ class PlayerManagementPanel : JPanel(), ActionListener { addSummaryPanels(player) } + panelCenter.applyButtonOverrides() + repaint() revalidate() } diff --git a/src/main/kotlin/dartzee/screen/player/PlayerStatsButton.kt b/src/main/kotlin/dartzee/screen/player/PlayerStatsButton.kt index f74c4fa12..e47844258 100644 --- a/src/main/kotlin/dartzee/screen/player/PlayerStatsButton.kt +++ b/src/main/kotlin/dartzee/screen/player/PlayerStatsButton.kt @@ -21,6 +21,8 @@ class PlayerStatsButton( icon = ImageIcon(iconUrl) text = defaultText + name = "STATS_${gameType.name}" + rolloverIcon = ImageIcon(javaClass.getResource("/buttons/stats_large.png")) selectedIcon = ImageIcon(javaClass.getResource("/buttons/stats_large.png")) diff --git a/src/main/kotlin/dartzee/theme/Pride.kt b/src/main/kotlin/dartzee/theme/Pride.kt index 332691e45..02299cc70 100644 --- a/src/main/kotlin/dartzee/theme/Pride.kt +++ b/src/main/kotlin/dartzee/theme/Pride.kt @@ -26,6 +26,27 @@ private val buttonOverrideColours = "Dartzee" to PrideColors.pink, "Preferences" to PrideColors.purple, + // Sync + "Perform Sync" to PrideColors.darkBlue, + "Push" to PrideColors.lightGreen, + "Pull" to PrideColors.orange, + "Reset" to Color.black, + + // dartzee rules + "Add" to PrideColors.lightGreen, + "Rename" to PrideColors.orange, + "Copy" to PrideColors.lightBlue, + "deleteTemplate" to PrideColors.pink, + + // Player management + "STATS_X01" to PrideColors.darkGreen, + "STATS_GOLF" to PrideColors.darkBlue, + "STATS_ROUND_THE_CLOCK" to PrideColors.orange, + "Achievements" to PrideColors.yellow, + "Edit" to PrideColors.lightBlue, + "Run simulation" to PrideColors.lightGreen, + "Delete" to PrideColors.red, + // Utilities "Delete Game" to PrideColors.red, "Create Backup" to PrideColors.orange, diff --git a/src/main/kotlin/dartzee/theme/ThemeUtils.kt b/src/main/kotlin/dartzee/theme/ThemeUtils.kt index fcd084e1d..4f7b1e86d 100644 --- a/src/main/kotlin/dartzee/theme/ThemeUtils.kt +++ b/src/main/kotlin/dartzee/theme/ThemeUtils.kt @@ -3,6 +3,7 @@ package dartzee.theme import com.github.weisj.jsvg.SVGDocument import com.github.weisj.jsvg.parser.SVGLoader import dartzee.bean.DartLabel +import dartzee.core.util.getAllChildComponentsForType import dartzee.logging.CODE_AUDIO_ERROR import dartzee.preferences.Preferences import dartzee.utils.InjectedThings @@ -18,6 +19,9 @@ import java.time.LocalDate import java.time.format.DateTimeFormatter import javax.sound.sampled.AudioSystem import javax.swing.ImageIcon +import javax.swing.JButton +import javax.swing.JPanel +import kotlin.collections.get val DEFAULT_BACKGROUND = Color(214, 217, 223) val DEFAULT_BUTTON_COLOUR = Color(169, 176, 190) @@ -75,6 +79,20 @@ fun themeDescription(id: ThemeId): String { } } +fun JPanel.applyButtonOverrides() { + val overrides = InjectedThings.theme?.buttonOverrideColours?.mapKeys { it.key.lowercase() } + if (overrides != null) { + getAllChildComponentsForType().forEach { button -> + val overrideColour = + overrides[button.text.lowercase()] ?: overrides[button.name?.lowercase()] + if (overrideColour != null && button.background != overrideColour) { + button.background = overrideColour + button.addMouseListener(ButtonHoverListener(button)) + } + } + } +} + fun LocalDate.fmt(): String = format(DateTimeFormatter.ofPattern("d MMM uuuu")) private fun basicDescription(id: ThemeId): String = @@ -151,6 +169,9 @@ fun svgForResource(resourcePath: String): SVGDocument? { fun getBaseFont(): Font = InjectedThings.theme?.font ?: ResourceCache.BASE_FONT +fun getMenuFont(): Font = + getBaseFont().deriveFont(Font.PLAIN, InjectedThings.theme?.menuFontSize ?: 18f) + fun themedIcon(path: String, theme: Theme? = InjectedThings.theme): ImageIcon { val default = ImageIcon(Theme::class.java.getResource(path)) diff --git a/src/test/kotlin/dartzee/screen/dartzee/TestDartzeeTemplateSetupScreen.kt b/src/test/kotlin/dartzee/screen/dartzee/TestDartzeeTemplateSetupScreen.kt index 28ca1317f..efec16808 100644 --- a/src/test/kotlin/dartzee/screen/dartzee/TestDartzeeTemplateSetupScreen.kt +++ b/src/test/kotlin/dartzee/screen/dartzee/TestDartzeeTemplateSetupScreen.kt @@ -67,17 +67,17 @@ class TestDartzeeTemplateSetupScreen : AbstractTest() { scrn.initialise() scrn.getChild("copy").shouldBeDisabled() - scrn.getChild("delete").shouldBeDisabled() + scrn.getChild("deleteTemplate").shouldBeDisabled() scrn.getChild("rename").shouldBeDisabled() scrn.getChild().selectRow(0) scrn.getChild("copy").shouldBeEnabled() - scrn.getChild("delete").shouldBeEnabled() + scrn.getChild("deleteTemplate").shouldBeEnabled() scrn.getChild("rename").shouldBeEnabled() scrn.getChild().selectRow(-1) scrn.getChild("copy").shouldBeDisabled() - scrn.getChild("delete").shouldBeDisabled() + scrn.getChild("deleteTemplate").shouldBeDisabled() scrn.getChild("rename").shouldBeDisabled() } @@ -90,7 +90,7 @@ class TestDartzeeTemplateSetupScreen : AbstractTest() { scrn.initialise() scrn.getChild().selectRow(0) - scrn.clickChild("delete") + scrn.clickChild("deleteTemplate") dialogFactory.questionsShown.shouldContainExactly( "Are you sure you want to delete the ABC Template?" @@ -108,7 +108,7 @@ class TestDartzeeTemplateSetupScreen : AbstractTest() { scrn.initialise() scrn.getChild().selectRow(0) - scrn.clickChild("delete") + scrn.clickChild("deleteTemplate") dialogFactory.questionsShown.shouldContainExactly( "Are you sure you want to delete the ABC Template?" @@ -168,7 +168,7 @@ class TestDartzeeTemplateSetupScreen : AbstractTest() { scrn.initialise() scrn.getChild().selectRow(0) - scrn.clickChild("delete") + scrn.clickChild("deleteTemplate") dialogFactory.questionsShown.shouldContainExactly( "You have played 2 games using the ABC Template." + From d094ae1ede91f1b5bfe88330fa61bbb904d4d085 Mon Sep 17 00:00:00 2001 From: Alyssa Date: Sun, 19 Apr 2026 22:48:44 +0100 Subject: [PATCH 04/10] icons and banner --- .../dartzee/core/bean/ScrollTableOrdered.kt | 5 +- src/main/kotlin/dartzee/screen/MenuScreen.kt | 2 +- src/main/kotlin/dartzee/theme/Pride.kt | 37 ++++- src/main/kotlin/dartzee/theme/Theme.kt | 7 +- src/main/resources/flags/humanFlag.png | Bin 364 -> 742 bytes src/main/resources/theme/pride/banner.svg | 136 ++++++++++++++++++ .../theme/pride/buttons/downArrow.png | Bin 0 -> 809 bytes .../theme/pride/buttons/leftArrow.png | Bin 0 -> 841 bytes .../resources/theme/pride/buttons/newGame.png | Bin 0 -> 9342 bytes .../theme/pride/buttons/playerManagement.png | Bin 0 -> 9367 bytes .../theme/pride/buttons/preferences.png | Bin 0 -> 9417 bytes .../theme/pride/buttons/rightArrow.png | Bin 0 -> 814 bytes .../resources/theme/pride/buttons/teams.png | Bin 0 -> 758 bytes .../resources/theme/pride/buttons/upArrow.png | Bin 0 -> 799 bytes .../resources/theme/pride/flags/humanBlue.png | Bin 0 -> 736 bytes .../theme/pride/flags/humanGreen.png | Bin 0 -> 740 bytes .../theme/pride/flags/humanLightBlue.png | Bin 0 -> 742 bytes .../theme/pride/flags/humanLightGreen.png | Bin 0 -> 739 bytes .../theme/pride/flags/humanOrange.png | Bin 0 -> 734 bytes .../theme/pride/flags/humanPurple.png | Bin 0 -> 738 bytes .../resources/theme/pride/flags/humanRed.png | Bin 0 -> 739 bytes .../theme/pride/flags/humanYellow.png | Bin 0 -> 728 bytes 22 files changed, 181 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/theme/pride/banner.svg create mode 100644 src/main/resources/theme/pride/buttons/downArrow.png create mode 100644 src/main/resources/theme/pride/buttons/leftArrow.png create mode 100644 src/main/resources/theme/pride/buttons/newGame.png create mode 100644 src/main/resources/theme/pride/buttons/playerManagement.png create mode 100644 src/main/resources/theme/pride/buttons/preferences.png create mode 100644 src/main/resources/theme/pride/buttons/rightArrow.png create mode 100644 src/main/resources/theme/pride/buttons/teams.png create mode 100644 src/main/resources/theme/pride/buttons/upArrow.png create mode 100644 src/main/resources/theme/pride/flags/humanBlue.png create mode 100644 src/main/resources/theme/pride/flags/humanGreen.png create mode 100644 src/main/resources/theme/pride/flags/humanLightBlue.png create mode 100644 src/main/resources/theme/pride/flags/humanLightGreen.png create mode 100644 src/main/resources/theme/pride/flags/humanOrange.png create mode 100644 src/main/resources/theme/pride/flags/humanPurple.png create mode 100644 src/main/resources/theme/pride/flags/humanRed.png create mode 100644 src/main/resources/theme/pride/flags/humanYellow.png diff --git a/src/main/kotlin/dartzee/core/bean/ScrollTableOrdered.kt b/src/main/kotlin/dartzee/core/bean/ScrollTableOrdered.kt index 7b2f326a2..c4a0699c4 100644 --- a/src/main/kotlin/dartzee/core/bean/ScrollTableOrdered.kt +++ b/src/main/kotlin/dartzee/core/bean/ScrollTableOrdered.kt @@ -1,6 +1,7 @@ package dartzee.core.bean import dartzee.core.util.InjectedCore +import dartzee.theme.themedIcon import java.awt.BorderLayout import java.awt.Dimension import java.awt.event.ActionEvent @@ -21,12 +22,12 @@ class ScrollTableOrdered(customButtons: Int = 0) : ScrollTable(), ActionListener init { add(panelOrdering, BorderLayout.EAST) panelOrdering.layout = MigLayout("al center center, wrap, gapy 20") - btnMoveUp.icon = ImageIcon(javaClass.getResource("/buttons/upArrow.png")) + btnMoveUp.icon = themedIcon("/buttons/upArrow.png") btnMoveUp.preferredSize = Dimension(40, 40) btnMoveUp.toolTipText = "Move row up" panelOrdering.add(btnMoveUp, "cell 0 $customButtons") - btnMoveDown.icon = ImageIcon(javaClass.getResource("/buttons/downArrow.png")) + btnMoveDown.icon = themedIcon("/buttons/downArrow.png") btnMoveDown.preferredSize = Dimension(40, 40) btnMoveDown.toolTipText = "Move row down" diff --git a/src/main/kotlin/dartzee/screen/MenuScreen.kt b/src/main/kotlin/dartzee/screen/MenuScreen.kt index 5948ea7fd..0d6aea621 100644 --- a/src/main/kotlin/dartzee/screen/MenuScreen.kt +++ b/src/main/kotlin/dartzee/screen/MenuScreen.kt @@ -65,7 +65,7 @@ class MenuScreen : EmbeddedScreen() { btnNewGame.icon = themedIcon("/buttons/newGame.png") btnManagePlayers.icon = themedIcon("/buttons/playerManagement.png") btnUtilities.icon = themedIcon("/buttons/utilities.png") - btnPreferences.icon = ImageIcon(javaClass.getResource("/buttons/preferences.png")) + btnPreferences.icon = themedIcon("/buttons/preferences.png") btnGameReport.icon = themedIcon("/buttons/gameReport.png") btnSyncSummary.icon = ImageIcon(javaClass.getResource("/buttons/sync.png")) btnDartzeeTemplates.icon = ImageIcon(javaClass.getResource("/buttons/dartzeeTemplates.png")) diff --git a/src/main/kotlin/dartzee/theme/Pride.kt b/src/main/kotlin/dartzee/theme/Pride.kt index 02299cc70..0b989b2f9 100644 --- a/src/main/kotlin/dartzee/theme/Pride.kt +++ b/src/main/kotlin/dartzee/theme/Pride.kt @@ -1,6 +1,9 @@ package dartzee.theme import java.awt.Color +import java.awt.Point +import java.awt.Rectangle +import java.net.URL object PrideColors { val red = Color.decode("#ED1C24") @@ -68,6 +71,36 @@ private val buttonOverrideColours = "Next" to PrideColors.darkGreen, ) +private val humanFlags = + listOf( + "humanBlue.png", + "humanGreen.png", + "humanLightBlue.png", + "humanLightGreen.png", + "humanOrange.png", + "humanPurple.png", + "humanRed.png", + "humanYellow.png", + ) + +private fun randomHumanFlag(): URL { + return Theme::class.java.getResource("/theme/pride/flags/${humanFlags.random()}") +} + +private fun getBannerDetails( + svgBounds: Rectangle, + dartboardCenter: Point, +): List { + val center = + Point( + dartboardCenter.x + (0.02 * svgBounds.width).toInt(), + dartboardCenter.y - (0.15 * svgBounds.height).toInt(), + ) + val topBanner = BannerRenderDetails("Pride", (svgBounds.height * 0.45).toInt(), center) + + return listOf(topBanner) +} + val Themes.PRIDE: Theme get() = Theme( @@ -79,8 +112,8 @@ val Themes.PRIDE: Theme fontColor = Color.black, lightBackground = PrideColors.pink, dartboardColours = PrideDartboardPainter(), - svgWidthScaleFactor = 0.8f, + bannerTextRenderer = ::getBannerDetails, menuFontSize = 15f, - linkColour = PrideColors.darkBlue, buttonOverrideColours = buttonOverrideColours, + customIcons = mapOf("/flags/humanFlag.png" to ::randomHumanFlag), ) diff --git a/src/main/kotlin/dartzee/theme/Theme.kt b/src/main/kotlin/dartzee/theme/Theme.kt index fbc06e511..2d9cd3a1e 100644 --- a/src/main/kotlin/dartzee/theme/Theme.kt +++ b/src/main/kotlin/dartzee/theme/Theme.kt @@ -8,6 +8,7 @@ import dartzee.utils.InjectedThings.now import dartzee.utils.ResourceCache import java.awt.Color import java.awt.GraphicsEnvironment +import java.net.URL import java.time.LocalDate import javax.swing.ImageIcon import javax.swing.UIManager @@ -30,6 +31,7 @@ data class Theme( val unlockDate: LocalDate? = null, val dartFactory: DartFactory? = null, val buttonOverrideColours: Map = emptyMap(), + val customIcons: Map URL> = emptyMap(), ) { val name = id.name private val resourcePath = name.lowercase() @@ -66,7 +68,10 @@ data class Theme( font?.let { GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(it) } } - fun icon(path: String) = javaClass.getResource("/theme/$resourcePath$path")?.let(::ImageIcon) + fun icon(path: String): ImageIcon? { + val icon = customIcons[path]?.invoke() ?: javaClass.getResource("/theme/$resourcePath$path") + return icon?.let(::ImageIcon) + } fun isLocked() = unlockDate != null && now.isBefore(unlockDate) diff --git a/src/main/resources/flags/humanFlag.png b/src/main/resources/flags/humanFlag.png index a2ece9042c3a1a7fd1d6ed73ee10b0b65b17d712..735dca79af03090ec548af448fbb5277dbb888c9 100644 GIT binary patch literal 742 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g)!3HFq6y&A?DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpdee4x4R3&e-K=-cll(X2z!aAuPgflb^!r) zLB=}$7eG_nGeaUuB7A+UlJj%*5>xV%QuQiw3xH}F7;Nk-3KEmEQ%e+*Qqwc@Y}McI z-mk8ZnPRIRZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+Zg0oSWm91VG$A*&BvGLvHz%*y zs=`(YY_JuO4HDK@va=~lNwW%aaf7M=@@$ndN=gc>^!3Zj%k|2Q_413-^$jg8E%gnI z^o@*kfhu&1EAvVcD|GXUm7xZ>q!uR^WfqiV=I1GZ3`|VQFDQZyZ*7yXGEm-1E** z{r#;sKe&81mYEhKSA#33Jv$YOSqa(@~uB4lISu?={%7YYDu zjFZJKu$>^!)aTRSxoRzg!{8(F7fe#L)FschD}$ud0B~w`H*nt9#x#bkH;9O^?grbh z%!oSkCsvseC=w@w*axl57;fn6?bLSURRI7+;#FIvPXO?~k9-!ONU-RyqV9$z{HOZz za$76c!9@}boJv%yRxB1ReFmLg^IEs?nH`b3XcyRF%dKpCln+1-Ld&-Qio5%)usd(^ jW{ + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/theme/pride/buttons/downArrow.png b/src/main/resources/theme/pride/buttons/downArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..3c50f68f25db41515840d50ed2e7a372976c1922 GIT binary patch literal 809 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLAE4scNd2LAh=-f^2tCE_7YEDSN2CNjG|23 zskz*;KvUZ@Ln2Bde0{8v^KTBRz;GCL~=}}db8eHWUl3bOYY?-2NZ^z4JQ(*-(Avd)oQK2F?C$HG5 z!d3}vuoaLE64qC;vnfhRvkG!?gQ@`XY?U%fN(!v>^~=l4^~#O)@{7{-4J|D#^$m>l zjf`}GDs+o0^GXscbn}Xpp$5357AF^F7L;V>=P7^;OiaozEwNQ9EzL}^N=r;LO-e~I z)lEt?PSG_qOi9#DOffdpO))l3F*h}|FiJB_Qi57vl9`6EKd%@X48Q=<2g&Fg>KTBX z3}RdP7iFdbT>-Mv&d>%dk0NHH4{`{S!|Wg;K)(W6@Q?uo6FhWN^MFBG4h%b;DKof% zQNrfw;uzxLeRr~L7L%h$gT1fjiEWx|l4ojN-ym4j+)&ZT62vx1X>A4D!DHDKO*wm8 z*K$ld9kIiDkL>ZA-#emy9MrLXe|C0$UD?C97cGq(dOR*3=O+7v?JzojXvXu0nclZ; z?iv*EPSRfS!FuMNx?c}!KC+&gn^BNDZ|C;s@!`*A=9k77r<+@@o9$te{`0-Hr<%6j zH_q$g64_FRX1VQ+X=I+!`HcxLqS-IV1b@SN0$MIhboJ@Qg_3)B?}Y}DQtMeU@rY# o+I|+>Ypo|ou0;vIlD#9(o?O$nIk2wa0w^hZy85}Sb4q9e01!TBRz;GCL~=}}db8eHWUl3bOYY?-2NZ^z4JQ(*-(Avd)oQK2F?C$HG5 z!d3}vuoaLE64qC;vnfhRvkG!?gQ@`XY?U%fN(!v>^~=l4^~#O)@{7{-4J|D#^$m>l zjf`}GDs+o0^GXscbn}Xpp$5357AF^F7L;V>=P7^;OiaozEwNQ9EzL}^N=r;LO-e~I z)lEt?PSG_qOi9#DOffdpO))l3F*h}|FiJB_Qi57vl9`6EKd%@X48Q=<2g&Fg>KTBX z3}RdP7iFdbT>-Mv&d>%dk0NHH4{`{S!|Wg;K)(W6@Q?uo6FhWN^MFBG4h%b;DKof% zQKIJQ;uzxLeRlFjFJ?yphx?hTrv$ybuVkf*+8+$+X8!LWQ19^2>!8TC_WJ@GI_3*1 z?%l|HBur&mVa}b@&2R3$nHT=#;GsM3-q@u*7c-Ois6Ok)Cv_zcp$krvbQA)W7(yrh z{;aie(lsU})$FGJ-RAYNu9N>nHz;v(I{ndwXLY21*yedLb8T+j z_+PgE^xMuT$LJVOwt~-pSPvXLEXZ)UPQKy&^l)|4-V1YAiZ1=8qT(oA`mtOx%e7j3 z`RkcqQ#ATFZgj7IeT%`>X|9H-uao#93C?{QQ}{yH9tqS?M3tM18Xykf3W_& WI&Z_)oDf}5QuTE8b6Mw<&;$U8T{yD< literal 0 HcmV?d00001 diff --git a/src/main/resources/theme/pride/buttons/newGame.png b/src/main/resources/theme/pride/buttons/newGame.png new file mode 100644 index 0000000000000000000000000000000000000000..da9b2c2fde85304d2ebe197fa5fa460ec0b05dbb GIT binary patch literal 9342 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 OYouqUTdVC9`F{WxR>o}r literal 0 HcmV?d00001 diff --git a/src/main/resources/theme/pride/buttons/preferences.png b/src/main/resources/theme/pride/buttons/preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a6dc0859bf05316ba922778c56c578d3807bc4 GIT binary patch literal 9417 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/theme/pride/buttons/teams.png b/src/main/resources/theme/pride/buttons/teams.png new file mode 100644 index 0000000000000000000000000000000000000000..ec28960e69e5bc4e42c0f2a212f6380ec0de8bef GIT binary patch literal 758 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLAE4scNd2LAh=-f^2tCE_7YEDSN3Nt5+ba8 zZ&@M}fu^=+hD4M^`1)8S=jZArrsOB3>Q&?x0M#-u*w|MTBqnF4mMA2prf25as=wd8 zUtJ+H#a2Ds)Yrhbz&SM|)1#^=HMq(zB)KX(*)m1l-j0{croswnLT+kFqC!P(PF}H9 zg{>0UU@IUSB&@GwXH%4tW)z9|8>y;bpKhp8 z8yV>WRp=I1=9MH?=;jqGLk)0AElw`VEGWs$&r<*yn3$AbT4JkITAG<+m6n)hnv{}a zs+*K(oT6)Jn3AZQm||?Gn__I7Vs2_^VU%W=qy)9TBr^?Re_k;(7=Qty50cS0)H47% z8N{~oFUm{>x&maSouLg_9!1PXALI}uhuJ|yfPMwC;2{GFCV1$k<^hAW92j;wQ)X}j z!~L?Si(`m~_uDDEc@G%~wApWF%01=LbAV^d6$9=hu@#v!8wDq5WEvk1e6sLyO&_n2 zX2bf9cOPHZ{Y;Xq>sz*J>B_8)g`5Y)Y>u&=d%yin&zc3tjkOFF5`}nQm)`P_RQa06 z)GTBRz;GCL~=}}db8eHWUl3bOYY?-2NZ^z4JQ(*-(Avd)oQK2F?C$HG5 z!d3}vuoaLE64qC;vnfhRvkG!?gQ@`XY?U%fN(!v>^~=l4^~#O)@{7{-4J|D#^$m>l zjf`}GDs+o0^GXscbn}Xpp$5357AF^F7L;V>=P7^;OiaozEwNQ9EzL}^N=r;LO-e~I z)lEt?PSG_qOi9#DOffdpO))l3F*h}|FiJB_Qi57vl9`6EKd%@X48Q=<2g&Fg>KTBX z3}RdP7iFdbT>-Mv&d>%dk0NHH4{`{S!|Wg;K)(W6@Q?uo6FhWN^MFBG4h%b;DKof% z;r_?d#WBRg`{^V@u0sYQZU0|sc!al~v$Cq>6+bA=@rYGKhE+D^s4<6L++pDxJDXQ? z^r`BpshywkXFDJ?7rgVd;D&N(NNrNHc>np#r2j;nP8Qhxp zHMxXs@)1E9b@m&klQqh?)-y0jeHL?2<5K;|b% z)~wfOd3LBLK4S??owv%ddgUn_Q}62=S09@k|Kn|q%b`0@Pv2Mh@u_X%j|7$b#j%?n eHqQLa9K&dwR{M8D)$0gQ0`zqCb6Mw<&;$VQuNp%D literal 0 HcmV?d00001 diff --git a/src/main/resources/theme/pride/flags/humanBlue.png b/src/main/resources/theme/pride/flags/humanBlue.png new file mode 100644 index 0000000000000000000000000000000000000000..efa1cb10c50354f4342395a5a3ee8ebcb49ae45b GIT binary patch literal 736 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g)!3HFq6y&A?DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpdee4x4R3&e-K=-cll(X2z!aAuPgflb^!r) zLB=}$7eG_nGeaUuB7A+UlJj%*5>xV%QuQiw3xH}F7;Nk-3KEmEQ%e+*Qqwc@Y}McI z-mk8ZnPRIRZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+Zg0oSWm91VG$A*&BvGLvHz%*y zs=`(YY_JuO4HDK@va=~lNwW%aaf7M=@@$ndN=gc>^!3Zj%k|2Q_413-^$jg8E%gnI z^o@*kfhu&1EAvVcD|GXUm7xZ>q!uR^WfqiV=I1GZ3`|VQFD$c-=vEQ|=cRzC8 zN_swn)hkcreR9T~4bC2)&MF32?`u$*me|PSy|bEO-Tt+YWxjrY^CYKMK7PsanMpdee4x4R3&e-K=-cll(X2z!aAuPgflb^!r) zLB=}$7eG_nGeaUuB7A+UlJj%*5>xV%QuQiw3xH}F7;Nk-3KEmEQ%e+*Qqwc@Y}McI z-mk8ZnPRIRZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+Zg0oSWm91VG$A*&BvGLvHz%*y zs=`(YY_JuO4HDK@va=~lNwW%aaf7M=@@$ndN=gc>^!3Zj%k|2Q_413-^$jg8E%gnI z^o@*kfhu&1EAvVcD|GXUm7xZ>q!uR^WfqiV=I1GZ3`|VQFDD2QFXTSDd@0kZv!}aH`mV8U>g&$?o~gRN`pn7Q zX4danMpdee4x4R3&e-K=-cll(X2z!aAuPgflb^!r) zLB=}$7eG_nGeaUuB7A+UlJj%*5>xV%QuQiw3xH}F7;Nk-3KEmEQ%e+*Qqwc@Y}McI z-mk8ZnPRIRZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+Zg0oSWm91VG$A*&BvGLvHz%*y zs=`(YY_JuO4HDK@va=~lNwW%aaf7M=@@$ndN=gc>^!3Zj%k|2Q_413-^$jg8E%gnI z^o@*kfhu&1EAvVcD|GXUm7xZ>q!uR^WfqiV=I1GZ3`|VQFDQZyZ*7yXGEm-1E** z{r#;sKe&81mYanMpdee4x4R3&e-K=-cll(X2z!aAuPgflb^!r) zLB=}$7eG_nGeaUuB7A+UlJj%*5>xV%QuQiw3xH}F7;Nk-3KEmEQ%e+*Qqwc@Y}McI z-mk8ZnPRIRZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+Zg0oSWm91VG$A*&BvGLvHz%*y zs=`(YY_JuO4HDK@va=~lNwW%aaf7M=@@$ndN=gc>^!3Zj%k|2Q_413-^$jg8E%gnI z^o@*kfhu&1EAvVcD|GXUm7xZ>q!uR^WfqiV=I1GZ3`|VQFDufxzqHHx6I7xKb9}85eh1JbG*B` zGjCDCfrf{+Yq*6wI(~k&V?Fh2$%<=tWjeVg{$OTSUgfd*D0BH8FyDxd*&G0$lcF8ASH|Z?wq1ymXn?pRZS5?)r6GCi~1spQ5dH$JtNj V1kP?*?->kAM4qmGF6*2UngAqz3anMpdee4x4R3&e-K=-cll(X2z!aAuPgflb^!r) zLB=}$7eG_nGeaUuB7A+UlJj%*5>xV%QuQiw3xH}F7;Nk-3KEmEQ%e+*Qqwc@Y}McI z-mk8ZnPRIRZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+Zg0oSWm91VG$A*&BvGLvHz%*y zs=`(YY_JuO4HDK@va=~lNwW%aaf7M=@@$ndN=gc>^!3Zj%k|2Q_413-^$jg8E%gnI z^o@*kfhu&1EAvVcD|GXUm7xZ>q!uR^WfqiV=I1GZ3`|VQFDP?kf$}cLe>-ux2-c9zqTYBT8 zq)%bl87cknqpu}C2w5de6>pz#{iFSjBj11S?qm8oy)@?Wzj<@#tbPBOStHAn&CEpd QGAR9cy85}Sb4q9e02reLcmMzZ literal 0 HcmV?d00001 diff --git a/src/main/resources/theme/pride/flags/humanPurple.png b/src/main/resources/theme/pride/flags/humanPurple.png new file mode 100644 index 0000000000000000000000000000000000000000..f2f299029e5b5312d1cf7dc076529918248d802e GIT binary patch literal 738 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g)!3HFq6y&A?DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpdee4x4R3&e-K=-cll(X2z!aAuPgflb^!r) zLB=}$7eG_nGeaUuB7A+UlJj%*5>xV%QuQiw3xH}F7;Nk-3KEmEQ%e+*Qqwc@Y}McI z-mk8ZnPRIRZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+Zg0oSWm91VG$A*&BvGLvHz%*y zs=`(YY_JuO4HDK@va=~lNwW%aaf7M=@@$ndN=gc>^!3Zj%k|2Q_413-^$jg8E%gnI z^o@*kfhu&1EAvVcD|GXUm7xZ>q!uR^WfqiV=I1GZ3`|VQFD6h_4MYm)p61r+wO%|&MxnnspGCvvhc^25Qm+Wm6|)dx4K^_y!y7t<mdKI;Vst05dKJ-2eap literal 0 HcmV?d00001 diff --git a/src/main/resources/theme/pride/flags/humanRed.png b/src/main/resources/theme/pride/flags/humanRed.png new file mode 100644 index 0000000000000000000000000000000000000000..930f7930f466e8102b4c3006dfc81933e5e87c0b GIT binary patch literal 739 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g)!3HFq6y&A?DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpdee4x4R3&e-K=-cll(X2z!aAuPgflb^!r) zLB=}$7eG_nGeaUuB7A+UlJj%*5>xV%QuQiw3xH}F7;Nk-3KEmEQ%e+*Qqwc@Y}McI z-mk8ZnPRIRZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+Zg0oSWm91VG$A*&BvGLvHz%*y zs=`(YY_JuO4HDK@va=~lNwW%aaf7M=@@$ndN=gc>^!3Zj%k|2Q_413-^$jg8E%gnI z^o@*kfhu&1EAvVcD|GXUm7xZ>q!uR^WfqiV=I1GZ3`|VQFD(Aa(GsN-Zb|$YyF)njL%3!MqM*f z+SS>_$lUgQgPxCq(zENoMKoSdUKCYctfJ-eh@Yoth0@(y%BpK(qtzXP4((6)=5g_> z<*W7Vr;E>cM_X^~yBPj+hIr3TpWkjPS`Wo{b7{Pbi}RIx^j6TqZs*)@y-MF_ERNmX zx86XcuW#kXBG(;T8TAz%1wXDjm}2>l{m~lV>9baSxE{Rx^{f2iHHOEHPhR~cBfoiN V(8iPg36`Kl=v=1ttIh literal 0 HcmV?d00001 diff --git a/src/main/resources/theme/pride/flags/humanYellow.png b/src/main/resources/theme/pride/flags/humanYellow.png new file mode 100644 index 0000000000000000000000000000000000000000..ed417f7e362d19b2a4c079bc8d9e616454f4d1c3 GIT binary patch literal 728 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g)!3HFq6y&A?DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpdee4x4R3&e-K=-cll(X2z!aAuPgflb^!r) zLB=}$7eG_nGeaUuB7A+UlJj%*5>xV%QuQiw3xH}F7;Nk-3KEmEQ%e+*Qqwc@Y}McI z-mk8ZnPRIRZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+Zg0oSWm91VG$A*&BvGLvHz%*y zs=`(YY_JuO4HDK@va=~lNwW%aaf7M=@@$ndN=gc>^!3Zj%k|2Q_413-^$jg8E%gnI z^o@*kfhu&1EAvVcD|GXUm7xZ>q!uR^WfqiV=I1GZ3`|VQFDC0}&P&#b0NJS^MTK&S5mh^&Z6^UPSzM3~x zT&O$Se52uO_@dbMqykI(SRcJK7fD^YxHxaK&TkHu@9sQeny~Y_<)zXWKlqjvl=*Z{ zKYeJw*$Z!t2Az8*95%=QKM?wt_k4!yRr_ZVkL=DXmA}rG`PA!R_rcUd1e9_-UHx3v IIVCg!05lr> Date: Tue, 21 Apr 2026 20:29:49 +0100 Subject: [PATCH 05/10] fixes --- src/main/kotlin/dartzee/theme/Pride.kt | 26 ++++++++---------- src/main/kotlin/dartzee/theme/Theme.kt | 2 +- ...{TestScreenCache.kt => ScreenCacheTest.kt} | 6 ++-- ...rImageUtils.kt => PlayerImageUtilsTest.kt} | 2 +- .../ai-human.png | Bin 371 -> 358 bytes .../human-ai.png | Bin 376 -> 368 bytes .../human-human.png | Bin 323 -> 329 bytes 7 files changed, 17 insertions(+), 19 deletions(-) rename src/test/kotlin/dartzee/screen/{TestScreenCache.kt => ScreenCacheTest.kt} (96%) rename src/test/kotlin/dartzee/utils/{TestPlayerImageUtils.kt => PlayerImageUtilsTest.kt} (98%) diff --git a/src/main/kotlin/dartzee/theme/Pride.kt b/src/main/kotlin/dartzee/theme/Pride.kt index 0b989b2f9..de1ca7ab4 100644 --- a/src/main/kotlin/dartzee/theme/Pride.kt +++ b/src/main/kotlin/dartzee/theme/Pride.kt @@ -3,19 +3,18 @@ package dartzee.theme import java.awt.Color import java.awt.Point import java.awt.Rectangle -import java.net.URL object PrideColors { - val red = Color.decode("#ED1C24") - val orange = Color.decode("#FF7F27") - val yellow = Color.decode("#FFF200") - val lightGreen = Color.decode("#B5E61D") - val darkGreen = Color.decode("#22B14C") - val darkBlue = Color.decode("#00A2E8") - val lightBlue = Color.decode("#99D9EA") - val lightPurple = Color.decode("#B19CD7") - val purple = Color.decode("#A349A4") - val pink = Color.decode("#FFAEC9") + val red: Color = Color.decode("#ED1C24") + val orange: Color = Color.decode("#FF7F27") + val yellow: Color = Color.decode("#FFF200") + val lightGreen: Color = Color.decode("#B5E61D") + val darkGreen: Color = Color.decode("#22B14C") + val darkBlue: Color = Color.decode("#00A2E8") + val lightBlue: Color = Color.decode("#99D9EA") + val lightPurple: Color = Color.decode("#B19CD7") + val purple: Color = Color.decode("#A349A4") + val pink: Color = Color.decode("#FFAEC9") } private val buttonOverrideColours = @@ -83,9 +82,8 @@ private val humanFlags = "humanYellow.png", ) -private fun randomHumanFlag(): URL { - return Theme::class.java.getResource("/theme/pride/flags/${humanFlags.random()}") -} +private fun randomHumanFlag() = + Theme::class.java.getResource("/theme/pride/flags/${humanFlags.random()}") private fun getBannerDetails( svgBounds: Rectangle, diff --git a/src/main/kotlin/dartzee/theme/Theme.kt b/src/main/kotlin/dartzee/theme/Theme.kt index 2d9cd3a1e..dc34bcd73 100644 --- a/src/main/kotlin/dartzee/theme/Theme.kt +++ b/src/main/kotlin/dartzee/theme/Theme.kt @@ -31,7 +31,7 @@ data class Theme( val unlockDate: LocalDate? = null, val dartFactory: DartFactory? = null, val buttonOverrideColours: Map = emptyMap(), - val customIcons: Map URL> = emptyMap(), + val customIcons: Map URL?> = emptyMap(), ) { val name = id.name private val resourcePath = name.lowercase() diff --git a/src/test/kotlin/dartzee/screen/TestScreenCache.kt b/src/test/kotlin/dartzee/screen/ScreenCacheTest.kt similarity index 96% rename from src/test/kotlin/dartzee/screen/TestScreenCache.kt rename to src/test/kotlin/dartzee/screen/ScreenCacheTest.kt index f119df272..fb83e9d2e 100644 --- a/src/test/kotlin/dartzee/screen/TestScreenCache.kt +++ b/src/test/kotlin/dartzee/screen/ScreenCacheTest.kt @@ -12,7 +12,7 @@ import io.mockk.mockk import io.mockk.verify import org.junit.jupiter.api.Test -class TestScreenCache : AbstractTest() { +class ScreenCacheTest : AbstractTest() { @Test fun `Should construct an instance and return it on subsequent calls`() { val scrn = ScreenCache.get() @@ -40,7 +40,7 @@ class TestScreenCache : AbstractTest() { ScreenCache.switch(scrn) ScreenCache.currentScreen() shouldBeSameInstanceAs scrn - verify { scrn.initialise() } + verify { scrn.init() } } @Test @@ -50,7 +50,7 @@ class TestScreenCache : AbstractTest() { ScreenCache.switch(scrn, false) ScreenCache.currentScreen() shouldBeSameInstanceAs scrn - verifyNotCalled { scrn.initialise() } + verifyNotCalled { scrn.init() } } @Test diff --git a/src/test/kotlin/dartzee/utils/TestPlayerImageUtils.kt b/src/test/kotlin/dartzee/utils/PlayerImageUtilsTest.kt similarity index 98% rename from src/test/kotlin/dartzee/utils/TestPlayerImageUtils.kt rename to src/test/kotlin/dartzee/utils/PlayerImageUtilsTest.kt index 8cc4cffd0..7c7c337c0 100644 --- a/src/test/kotlin/dartzee/utils/TestPlayerImageUtils.kt +++ b/src/test/kotlin/dartzee/utils/PlayerImageUtilsTest.kt @@ -12,7 +12,7 @@ import javax.swing.ImageIcon import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test -class TestPlayerImageUtils : AbstractTest() { +class PlayerImageUtilsTest : AbstractTest() { @Test @Tag("screenshot") fun `Should match screenshot - 50-50 split, inactive`() { diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/ai-human.png b/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/ai-human.png index 8736033eca92429efca8ce74f1b3dc680b0bb000..8b2bb1e7a91791923043dd68cf2995316191610e 100644 GIT binary patch delta 331 zcmV-R0kr<}0_FmcB!4YQL_t(|Ufos84Z<)KV-Suk$B_v-2TQO-PmI8+cO*^>5cJxn zyx1?Hc?2P_WVL-C+p4N&v-xM-w!45eCqzfHE&9H1B^tu%oKR{w~JZXt#!QSTYTXiDLbI5$5h2y&c8>Hx2(_dwV(q;N=U zR@J74HuVxjEkrX4hqPu@ZEB#ghahU5P81HQXN~;@WL`r<&@!WNNIh%pCx{IXEtGm| d@b3Qi@BjwNU{Icgb2tD1002ovPDHLkV1mvLmf8RS delta 344 zcmV-e0jK`v0`mfpB!4IBwMmvB5F?Ee?=dq(5eea+ab2w=)|?<6&SlZ}{ZgVa9*%-k!yz|58FcZ$ONY%@ zeot4JZ35q;Ih+dhL_JS74#VIk?W14?D&*X-%G^WJLE#GAL4OG~V^weUQoV+w?R zeWO-|GQDlK56IfMk5d*5QjljZ`8LN7$ zm+A-=0K=7#_`_^HZR{cGpe~wYK%}(;n!gz~pFuOkuImahM2mdS5JpoK4vBN=ED-5) zn#lvaBHsgH%TZ8;L*lIUDhN|ALDVu+;gHrWtBnmb_7Fs^uagRgxa5@(hjZ61nS(YJwrs(LxqlyZ) zV!Gs0m-Q$!E;o?(d$=2>WJlSsu4^~to`x+vtZ1hA&{$*p7=OOLfB3O@S`D>eqqk;B zcM;1Rq1@0U!GvBuJ|mCL3fBZvWH05GW|I>tU;ed1ty$rkU<$BQZ6<$U3zFQCH$55LL&w(!vmD7CdDD}@J#>8kg458HBe|E}8eyL2jV#fkzN4=fXv&e^ zuF|3|Kc|_xz)mgdJ9xTbrX1<*DlO_dw3qNK|EOe*Z2~b6g|`rnG?!y4*gCjUK$_T7O2}!i2#FH~ z7>#AG#@~z$7)vC1(mU+@y!p_gglYPR3h;1UcKac@A$)xomKuj%(XuQ<@(k!`;8CEW z4NOD+YFN+G<8VWHzQ+&CKz6`}bzQqH`wVR9ZJ^nb!(grLHGdp_&U`Iit)|*xQ*ZTB z-BpCio{p#DnU=onFeJ$wy?%T~Kiex(lS+tW0vgylusJG!{A)n1UXhw)00_51@`L$- z#Zh(G)LXq&FJz7rkoI<%$-_N%a_wQl(VUTIX7X^4om>T*UI*c5&ZTFqFwgU5LbR;+ znCl%ha5QI~uU0~kf2Y|R;GXp!GTmbaj`n6%E!OqXUL&*op^|HaqxGz_AL~5aV`RF= v3>>Xzo&79x{24oWQPswSYVGG7_9QITKo4B>r00000NkvXXu0mjf@;$F{ diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/human-human.png b/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/human-human.png index 06f82dbc2946e0c8bf5607ce6ca73f91d982940f..d0efa7bd9a2abe9a909c7d3e39f39b5045c92f2f 100644 GIT binary patch delta 302 zcmV+}0nz@$0?7i9B!3V|L_t(|Ufq?;4Z|=DL$m(|U7~w*gs#vf9LV`Vd6ZJ8wNao1 zh(r?k4!LBS{!|6-r6Jr>?vI0Q$Iu5F!WC#IxbQl07x4D<@AgFYibipVeF@=p;tm4~ zuM@Xw2z2Vq-OAk{T9`Bqz(FfR!c zklkzs%S*E4WjC9_+9g54Xl85%((^b delta 296 zcmV+@0oVS?0>c83B!3D?L_t(|Ufq__4Z<)GL$m(|{4xN0FajGOmIz8oqU8A!TF40r zOIDjZ`>ASw8p59{!mH%Mjq!5roMsGtAQ!Gc7r}+Mi2DMUYkQxr$R3dw*X>ORZxPoG zEWAbBO)k)|m|M#6bbHkM$!xD?3~RPaTd_Et@7+ z*Zdl8{wz(HpbF$e%)u^P2@*zI9Waw5Lk?|qz}zGuf@o&a8O$UvZUcS=1Vl5J&lLB< zp_$9)PS#RDG_%I%8)j!_*5H~80nt{rnbo-ixBm$#GlJ+gYxGBR;m~c?=noeHqT8&| uAI*hBw^^fKWg!j^Xw)Cg_v+jJZ}kL(1FsQLYD#SY0000 Date: Tue, 21 Apr 2026 21:49:17 +0100 Subject: [PATCH 06/10] more bits --- .../game/dartzee/DartzeeRuleCarousel.kt | 2 ++ .../screen/game/dartzee/DartzeeRuleTile.kt | 1 + src/main/kotlin/dartzee/theme/Pride.kt | 26 +++++++++++++++++- .../dartzee/theme/PrideDartboardPainter.kt | 19 ++----------- src/main/resources/theme/pride/dartboard.ttf | Bin 0 -> 316020 bytes .../kotlin/dartzee/theme/ThemeUtilsTest.kt | 8 ++++++ 6 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 src/main/resources/theme/pride/dartboard.ttf diff --git a/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleCarousel.kt b/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleCarousel.kt index e57ac5edf..56974764d 100644 --- a/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleCarousel.kt +++ b/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleCarousel.kt @@ -10,6 +10,7 @@ import dartzee.dartzee.DartzeeRuleDto import dartzee.db.DartzeeRoundResultEntity import dartzee.`object`.Dart import dartzee.screen.game.SegmentStatuses +import dartzee.theme.applyButtonOverrides import java.awt.BorderLayout import java.awt.Dimension import java.awt.event.ActionEvent @@ -177,6 +178,7 @@ class DartzeeRuleCarousel(private val dtos: List) : private fun displayTiles(tiles: List) { tilePanel.removeAll() tiles.forEach { tilePanel.add(it) } + tilePanel.applyButtonOverrides() tilePanel.validate() tilePanel.repaint() tileScroller.validate() diff --git a/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleTile.kt b/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleTile.kt index 47ee13e8e..3dbb32ed5 100644 --- a/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleTile.kt +++ b/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleTile.kt @@ -14,6 +14,7 @@ abstract class DartzeeRuleTile(val dto: DartzeeRuleDto, val ruleNumber: Int) : init { preferredSize = Dimension(150, 80) text = getButtonText(false) + name = "DARTZEE_TILE_${ruleNumber - 1}" addMouseListener(this) } diff --git a/src/main/kotlin/dartzee/theme/Pride.kt b/src/main/kotlin/dartzee/theme/Pride.kt index de1ca7ab4..ed4c50125 100644 --- a/src/main/kotlin/dartzee/theme/Pride.kt +++ b/src/main/kotlin/dartzee/theme/Pride.kt @@ -3,6 +3,8 @@ package dartzee.theme import java.awt.Color import java.awt.Point import java.awt.Rectangle +import java.time.LocalDate +import java.time.Month object PrideColors { val red: Color = Color.decode("#ED1C24") @@ -15,6 +17,24 @@ object PrideColors { val lightPurple: Color = Color.decode("#B19CD7") val purple: Color = Color.decode("#A349A4") val pink: Color = Color.decode("#FFAEC9") + + val all = + listOf( + red, + orange, + yellow, + lightGreen, + darkGreen, + darkBlue, + lightBlue, + lightPurple, + purple, + pink, + ) + + fun forIndex(index: Int): Color { + return all[index % all.size] + } } private val buttonOverrideColours = @@ -68,7 +88,7 @@ private val buttonOverrideColours = // Navigation "Back" to PrideColors.red, "Next" to PrideColors.darkGreen, - ) + ) + (0..20).map { "DARTZEE_TILE_$it" to PrideColors.forIndex(it) } private val humanFlags = listOf( @@ -113,5 +133,9 @@ val Themes.PRIDE: Theme bannerTextRenderer = ::getBannerDetails, menuFontSize = 15f, buttonOverrideColours = buttonOverrideColours, + festivalInfo = FestivalInfo(::findPride, "The next parade begins"), customIcons = mapOf("/flags/humanFlag.png" to ::randomHumanFlag), ) + +private fun findPride(year: Int): Pair = + LocalDate.of(year, Month.JUNE, 1) to LocalDate.of(year, Month.JUNE, 30) diff --git a/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt b/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt index 1b4a93137..cdbc45ae9 100644 --- a/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt +++ b/src/main/kotlin/dartzee/theme/PrideDartboardPainter.kt @@ -12,28 +12,13 @@ data class PrideDartboardPainter(override val font: Font = getBaseFont()) : IDar override val edgeColour = null override val fontColor: Color = Color.WHITE - private val colours = - listOf( - PrideColors.red, - PrideColors.orange, - PrideColors.yellow, - PrideColors.lightGreen, - PrideColors.darkGreen, - PrideColors.darkBlue, - PrideColors.lightBlue, - PrideColors.lightPurple, - PrideColors.purple, - PrideColors.pink, - ) - override fun getColour(segment: DartboardSegment): Color = if (segment.isMiss()) Color.BLACK else if (segment.score == 25) { if (segment.getMultiplier() == 1) Color.black else Color.white } else { - val index = numberOrder.indexOf(segment.score) % colours.size - - val rawColour = colours[index] + val index = numberOrder.indexOf(segment.score) + val rawColour = PrideColors.forIndex(index) if (segment.getMultiplier() > 1) rawColour.darker() else rawColour } diff --git a/src/main/resources/theme/pride/dartboard.ttf b/src/main/resources/theme/pride/dartboard.ttf new file mode 100644 index 0000000000000000000000000000000000000000..32fb1dc31ece0c883f2672480142f05ccec29711 GIT binary patch literal 316020 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⪻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

-O2IDWTo$Zb11CFrIZuA8+1*a?e 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∾b+3b>hg2=0?QtOFWuWwvngR{7W}A6w;P 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 yZJ_-e``3>dpw$y6cS@*vE#kYKaYUj?V Date: Tue, 21 Apr 2026 21:51:20 +0100 Subject: [PATCH 07/10] more bits --- .../ai-ai.png | Bin .../ai-human.png | Bin .../human-ai.png | Bin .../human-human.png | Bin .../outer-wilds-avatar.png | Bin .../split-50-game-over-selected.png | Bin .../split-50-game-over.png | Bin .../split-50-inactive.png | Bin .../split-p1.png | Bin .../split-p2.png | Bin 10 files changed, 0 insertions(+), 0 deletions(-) rename src/test/resources/__snapshots__/{dartzee.utils.TestPlayerImageUtils => dartzee.utils.PlayerImageUtilsTest}/ai-ai.png (100%) rename src/test/resources/__snapshots__/{dartzee.utils.TestPlayerImageUtils => dartzee.utils.PlayerImageUtilsTest}/ai-human.png (100%) rename src/test/resources/__snapshots__/{dartzee.utils.TestPlayerImageUtils => dartzee.utils.PlayerImageUtilsTest}/human-ai.png (100%) rename src/test/resources/__snapshots__/{dartzee.utils.TestPlayerImageUtils => dartzee.utils.PlayerImageUtilsTest}/human-human.png (100%) rename src/test/resources/__snapshots__/{dartzee.utils.TestPlayerImageUtils => dartzee.utils.PlayerImageUtilsTest}/outer-wilds-avatar.png (100%) rename src/test/resources/__snapshots__/{dartzee.utils.TestPlayerImageUtils => dartzee.utils.PlayerImageUtilsTest}/split-50-game-over-selected.png (100%) rename src/test/resources/__snapshots__/{dartzee.utils.TestPlayerImageUtils => dartzee.utils.PlayerImageUtilsTest}/split-50-game-over.png (100%) rename src/test/resources/__snapshots__/{dartzee.utils.TestPlayerImageUtils => dartzee.utils.PlayerImageUtilsTest}/split-50-inactive.png (100%) rename src/test/resources/__snapshots__/{dartzee.utils.TestPlayerImageUtils => dartzee.utils.PlayerImageUtilsTest}/split-p1.png (100%) rename src/test/resources/__snapshots__/{dartzee.utils.TestPlayerImageUtils => dartzee.utils.PlayerImageUtilsTest}/split-p2.png (100%) diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/ai-ai.png b/src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/ai-ai.png similarity index 100% rename from src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/ai-ai.png rename to src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/ai-ai.png diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/ai-human.png b/src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/ai-human.png similarity index 100% rename from src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/ai-human.png rename to src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/ai-human.png diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/human-ai.png b/src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/human-ai.png similarity index 100% rename from src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/human-ai.png rename to src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/human-ai.png diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/human-human.png b/src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/human-human.png similarity index 100% rename from src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/human-human.png rename to src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/human-human.png diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/outer-wilds-avatar.png b/src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/outer-wilds-avatar.png similarity index 100% rename from src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/outer-wilds-avatar.png rename to src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/outer-wilds-avatar.png diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/split-50-game-over-selected.png b/src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/split-50-game-over-selected.png similarity index 100% rename from src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/split-50-game-over-selected.png rename to src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/split-50-game-over-selected.png diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/split-50-game-over.png b/src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/split-50-game-over.png similarity index 100% rename from src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/split-50-game-over.png rename to src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/split-50-game-over.png diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/split-50-inactive.png b/src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/split-50-inactive.png similarity index 100% rename from src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/split-50-inactive.png rename to src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/split-50-inactive.png diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/split-p1.png b/src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/split-p1.png similarity index 100% rename from src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/split-p1.png rename to src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/split-p1.png diff --git a/src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/split-p2.png b/src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/split-p2.png similarity index 100% rename from src/test/resources/__snapshots__/dartzee.utils.TestPlayerImageUtils/split-p2.png rename to src/test/resources/__snapshots__/dartzee.utils.PlayerImageUtilsTest/split-p2.png From f2cb32762b5f229568aacac6943094ee8cfebdb2 Mon Sep 17 00:00:00 2001 From: Alyssa Date: Wed, 22 Apr 2026 21:09:34 +0100 Subject: [PATCH 08/10] more tests, keep complete dartzee tiles as red/green --- src/main/kotlin/dartzee/screen/MenuScreen.kt | 3 -- .../game/dartzee/DartzeeRuleCarousel.kt | 4 +-- ...Listener.kt => ButtonBackgroundUpdater.kt} | 2 +- src/main/kotlin/dartzee/theme/Pride.kt | 4 +-- src/main/kotlin/dartzee/theme/ThemeUtils.kt | 21 +++++------ ...Carousel.kt => DartzeeRuleCarouselTest.kt} | 36 ++++++++++++++++++- .../dartzee/theme/ButtonHoverListenerTest.kt | 35 ++++++++++++++++++ 7 files changed, 85 insertions(+), 20 deletions(-) rename src/main/kotlin/dartzee/theme/{ButtonHoverListener.kt => ButtonBackgroundUpdater.kt} (87%) rename src/test/kotlin/dartzee/screen/dartzee/{TestDartzeeRuleCarousel.kt => DartzeeRuleCarouselTest.kt} (92%) create mode 100644 src/test/kotlin/dartzee/theme/ButtonHoverListenerTest.kt diff --git a/src/main/kotlin/dartzee/screen/MenuScreen.kt b/src/main/kotlin/dartzee/screen/MenuScreen.kt index 0d6aea621..a283cf7dd 100644 --- a/src/main/kotlin/dartzee/screen/MenuScreen.kt +++ b/src/main/kotlin/dartzee/screen/MenuScreen.kt @@ -14,7 +14,6 @@ import dartzee.theme.getMenuFont import dartzee.theme.themedIcon import dartzee.utils.DARTS_VERSION_NUMBER import dartzee.utils.InjectedThings -import java.awt.Color import java.awt.Dimension import java.awt.event.ActionEvent import java.awt.event.ComponentAdapter @@ -71,8 +70,6 @@ class MenuScreen : EmbeddedScreen() { btnDartzeeTemplates.icon = ImageIcon(javaClass.getResource("/buttons/dartzeeTemplates.png")) btnLeaderboards.icon = ImageIcon(javaClass.getResource("/buttons/leaderboards.png")) - btnNewGame.background = Color.red - getAllChildComponentsForType().forEach { button -> button.font = getMenuFont() } addComponentListener( diff --git a/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleCarousel.kt b/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleCarousel.kt index 56974764d..d926185f8 100644 --- a/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleCarousel.kt +++ b/src/main/kotlin/dartzee/screen/game/dartzee/DartzeeRuleCarousel.kt @@ -10,7 +10,7 @@ import dartzee.dartzee.DartzeeRuleDto import dartzee.db.DartzeeRoundResultEntity import dartzee.`object`.Dart import dartzee.screen.game.SegmentStatuses -import dartzee.theme.applyButtonOverrides +import dartzee.theme.applyThemeOverride import java.awt.BorderLayout import java.awt.Dimension import java.awt.event.ActionEvent @@ -121,6 +121,7 @@ class DartzeeRuleCarousel(private val dtos: List) : incompleteRules.map { rule -> DartzeeRuleTilePending(rule, getRuleNumber(rule)) } ) pendingTiles.forEach { tile -> + tile.applyThemeOverride() tile.addActionListener(this) tile.addMouseListener(this) tile.updateState(dartsThrown) @@ -178,7 +179,6 @@ class DartzeeRuleCarousel(private val dtos: List) : private fun displayTiles(tiles: List) { tilePanel.removeAll() tiles.forEach { tilePanel.add(it) } - tilePanel.applyButtonOverrides() tilePanel.validate() tilePanel.repaint() tileScroller.validate() diff --git a/src/main/kotlin/dartzee/theme/ButtonHoverListener.kt b/src/main/kotlin/dartzee/theme/ButtonBackgroundUpdater.kt similarity index 87% rename from src/main/kotlin/dartzee/theme/ButtonHoverListener.kt rename to src/main/kotlin/dartzee/theme/ButtonBackgroundUpdater.kt index 57f9395f1..dffedaf53 100644 --- a/src/main/kotlin/dartzee/theme/ButtonHoverListener.kt +++ b/src/main/kotlin/dartzee/theme/ButtonBackgroundUpdater.kt @@ -4,7 +4,7 @@ import java.awt.event.MouseAdapter import java.awt.event.MouseEvent import javax.swing.JButton -class ButtonHoverListener(private val button: JButton) : MouseAdapter() { +class ButtonBackgroundUpdater(private val button: JButton) : MouseAdapter() { private val bgColour = button.background override fun mousePressed(e: MouseEvent?) { diff --git a/src/main/kotlin/dartzee/theme/Pride.kt b/src/main/kotlin/dartzee/theme/Pride.kt index ed4c50125..78c19b6bf 100644 --- a/src/main/kotlin/dartzee/theme/Pride.kt +++ b/src/main/kotlin/dartzee/theme/Pride.kt @@ -32,9 +32,7 @@ object PrideColors { pink, ) - fun forIndex(index: Int): Color { - return all[index % all.size] - } + fun forIndex(index: Int) = all[index % all.size] } private val buttonOverrideColours = diff --git a/src/main/kotlin/dartzee/theme/ThemeUtils.kt b/src/main/kotlin/dartzee/theme/ThemeUtils.kt index 4f7b1e86d..42d6ffd6b 100644 --- a/src/main/kotlin/dartzee/theme/ThemeUtils.kt +++ b/src/main/kotlin/dartzee/theme/ThemeUtils.kt @@ -80,16 +80,17 @@ fun themeDescription(id: ThemeId): String { } fun JPanel.applyButtonOverrides() { - val overrides = InjectedThings.theme?.buttonOverrideColours?.mapKeys { it.key.lowercase() } - if (overrides != null) { - getAllChildComponentsForType().forEach { button -> - val overrideColour = - overrides[button.text.lowercase()] ?: overrides[button.name?.lowercase()] - if (overrideColour != null && button.background != overrideColour) { - button.background = overrideColour - button.addMouseListener(ButtonHoverListener(button)) - } - } + getAllChildComponentsForType().forEach { it.applyThemeOverride() } +} + +fun JButton.applyThemeOverride() { + val overrides = + InjectedThings.theme?.buttonOverrideColours?.mapKeys { it.key.lowercase() } ?: return + + val overrideColour = overrides[text.lowercase()] ?: overrides[name?.lowercase()] + if (overrideColour != null && background != overrideColour) { + background = overrideColour + addMouseListener(ButtonBackgroundUpdater(this)) } } diff --git a/src/test/kotlin/dartzee/screen/dartzee/TestDartzeeRuleCarousel.kt b/src/test/kotlin/dartzee/screen/dartzee/DartzeeRuleCarouselTest.kt similarity index 92% rename from src/test/kotlin/dartzee/screen/dartzee/TestDartzeeRuleCarousel.kt rename to src/test/kotlin/dartzee/screen/dartzee/DartzeeRuleCarouselTest.kt index ca10330b4..8cd00d342 100644 --- a/src/test/kotlin/dartzee/screen/dartzee/TestDartzeeRuleCarousel.kt +++ b/src/test/kotlin/dartzee/screen/dartzee/DartzeeRuleCarouselTest.kt @@ -22,6 +22,9 @@ import dartzee.screen.game.SegmentStatuses import dartzee.screen.game.dartzee.DartzeeRuleCarousel import dartzee.screen.game.dartzee.DartzeeRuleTile import dartzee.screen.game.dartzee.IDartzeeCarouselListener +import dartzee.theme.PRIDE +import dartzee.theme.PrideColors +import dartzee.theme.Themes import dartzee.utils.InjectedThings import dartzee.utils.getAllNonMissSegments import io.kotest.matchers.collections.shouldBeEmpty @@ -36,7 +39,7 @@ import java.awt.Color import java.util.concurrent.locks.ReentrantLock import org.junit.jupiter.api.Test -class TestDartzeeRuleCarousel : AbstractTest() { +class DartzeeRuleCarouselTest : AbstractTest() { private val dtos = listOf(twoBlackOneWhite, scoreEighteens, innerOuterInner, totalIsFifty, allTwenties) @@ -362,6 +365,37 @@ class TestDartzeeRuleCarousel : AbstractTest() { result.success shouldBe true } + @Test + fun `Should apply pride colours to pending rule tiles`() { + InjectedThings.theme = Themes.PRIDE + + val carousel = makeCarousel() + carousel.update(emptyList(), emptyList(), 20) + + carousel.pendingTiles + .map { it.background } + .shouldContainExactly( + PrideColors.red, + PrideColors.orange, + PrideColors.yellow, + PrideColors.lightGreen, + PrideColors.darkGreen, + ) + + val results = + makeRoundResultEntities( + DartzeeRoundResult(3, true, 36), + DartzeeRoundResult(1, false, -38), + ) + carousel.update(results, emptyList(), 38) + + carousel.pendingTiles + .map { it.background } + .shouldContainExactly(PrideColors.orange, PrideColors.lightGreen, PrideColors.darkGreen) + + carousel.completeTiles.map { it.background }.shouldContainExactly(Color.GREEN, Color.RED) + } + private class TrackingCarouselListener : IDartzeeCarouselListener { var segmentStatuses: SegmentStatuses = SegmentStatuses(emptySet(), emptySet()) var roundResult: DartzeeRoundResult? = null diff --git a/src/test/kotlin/dartzee/theme/ButtonHoverListenerTest.kt b/src/test/kotlin/dartzee/theme/ButtonHoverListenerTest.kt new file mode 100644 index 000000000..bf0ba458c --- /dev/null +++ b/src/test/kotlin/dartzee/theme/ButtonHoverListenerTest.kt @@ -0,0 +1,35 @@ +package dartzee.theme + +import com.github.alyssaburlton.swingtest.doHover +import com.github.alyssaburlton.swingtest.doHoverAway +import com.github.alyssaburlton.swingtest.makeMouseEvent +import dartzee.helper.AbstractTest +import io.kotest.matchers.shouldBe +import java.awt.Color +import javax.swing.JButton +import org.junit.jupiter.api.Test + +class ButtonHoverListenerTest : AbstractTest() { + @Test + fun `Should update background accordingly`() { + val button = JButton() + button.background = Color.RED + val listener = ButtonBackgroundUpdater(button) + button.addMouseListener(listener) + + val lighter = Color.RED.brighter() + val darker = Color.RED.darker() + + button.doHover() + button.background shouldBe lighter + + button.doHoverAway() + button.background shouldBe Color.RED + + listener.mousePressed(makeMouseEvent(button)) + button.background shouldBe darker + + listener.mouseReleased(makeMouseEvent(button)) + button.background shouldBe Color.RED + } +} From 59461d5c3226c7f3ffbca9252fd80d73ae368674 Mon Sep 17 00:00:00 2001 From: alyssa Date: Thu, 23 Apr 2026 08:28:41 +0100 Subject: [PATCH 09/10] final tests --- src/main/kotlin/dartzee/theme/Pride.kt | 3 +- .../dartzee/bean/PresentationDartboardTest.kt | 7 +++ src/test/kotlin/dartzee/helper/TestFactory.kt | 5 ++ src/test/kotlin/dartzee/theme/ThemeTest.kt | 44 ++++++++++++++++++ .../pride-banner.png | Bin 0 -> 32631 bytes .../pride.png | Bin 0 -> 27277 bytes 6 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/__snapshots__/dartzee.bean.PresentationDartboardTest/pride-banner.png create mode 100644 src/test/resources/__snapshots__/dartzee.bean.PresentationDartboardTest/pride.png diff --git a/src/main/kotlin/dartzee/theme/Pride.kt b/src/main/kotlin/dartzee/theme/Pride.kt index 78c19b6bf..bd218adcf 100644 --- a/src/main/kotlin/dartzee/theme/Pride.kt +++ b/src/main/kotlin/dartzee/theme/Pride.kt @@ -121,7 +121,7 @@ val Themes.PRIDE: Theme get() = Theme( ThemeId.Pride, - "Beep boop.", + "TODO", PrideColors.red, PrideColors.purple, Color.decode("#FFFFC5"), @@ -133,6 +133,7 @@ val Themes.PRIDE: Theme buttonOverrideColours = buttonOverrideColours, festivalInfo = FestivalInfo(::findPride, "The next parade begins"), customIcons = mapOf("/flags/humanFlag.png" to ::randomHumanFlag), + unlockDate = LocalDate.of(2026, Month.JUNE, 1), ) private fun findPride(year: Int): Pair = diff --git a/src/test/kotlin/dartzee/bean/PresentationDartboardTest.kt b/src/test/kotlin/dartzee/bean/PresentationDartboardTest.kt index dd863e091..60e655236 100644 --- a/src/test/kotlin/dartzee/bean/PresentationDartboardTest.kt +++ b/src/test/kotlin/dartzee/bean/PresentationDartboardTest.kt @@ -16,6 +16,7 @@ import dartzee.theme.DEFAULT_COLOUR_WRAPPER import dartzee.theme.EASTER import dartzee.theme.HALLOWEEN import dartzee.theme.OKTOBERFEST +import dartzee.theme.PRIDE import dartzee.theme.Theme import dartzee.theme.Themes import dartzee.theme.WIREFRAME_COLOUR_WRAPPER @@ -96,6 +97,12 @@ class PresentationDartboardTest : AbstractTest() { snapshotTheme(Themes.BIRTHDAY) } + @Test + @Tag("screenshot") + fun `Should match snapshot - pride`() { + snapshotTheme(Themes.PRIDE) + } + @Test @Tag("screenshot") fun `Should match snapshot - dartzee banner`() { diff --git a/src/test/kotlin/dartzee/helper/TestFactory.kt b/src/test/kotlin/dartzee/helper/TestFactory.kt index c50ac9daf..20fc62b45 100644 --- a/src/test/kotlin/dartzee/helper/TestFactory.kt +++ b/src/test/kotlin/dartzee/helper/TestFactory.kt @@ -34,6 +34,7 @@ import dartzee.utils.InjectedThings.mainDatabase import dartzee.utils.isBust import io.kotest.matchers.shouldBe import java.awt.Color +import java.net.URL import java.sql.Timestamp fun factoryClockHit(score: Int, multiplier: Int = 1): Dart { @@ -328,6 +329,8 @@ fun makeTheme( fontColor: Color = Color.BLACK, menuFontSize: Float? = null, animations: Map = emptyMap(), + buttonOverrideColours: Map = emptyMap(), + customIcons: Map URL?> = emptyMap(), ) = Theme( id, @@ -341,4 +344,6 @@ fun makeTheme( fontColor, menuFontSize, animations, + buttonOverrideColours = buttonOverrideColours, + customIcons = customIcons, ) diff --git a/src/test/kotlin/dartzee/theme/ThemeTest.kt b/src/test/kotlin/dartzee/theme/ThemeTest.kt index 4a8a82ffb..c2fa1e49e 100644 --- a/src/test/kotlin/dartzee/theme/ThemeTest.kt +++ b/src/test/kotlin/dartzee/theme/ThemeTest.kt @@ -4,9 +4,11 @@ import com.github.alyssaburlton.swingtest.shouldMatch import com.github.alyssaburlton.swingtest.shouldMatchImage import dartzee.helper.AbstractTest import dartzee.helper.makeTheme +import dartzee.utils.InjectedThings import io.kotest.matchers.shouldBe import java.awt.Color import java.awt.Dimension +import java.net.URL import javax.swing.ImageIcon import javax.swing.JButton import javax.swing.JPanel @@ -76,4 +78,46 @@ class ThemeTest : AbstractTest() { fun `Should return null if no resource is found`() { Themes.HALLOWEEN.icon("/buttons/blah.png") shouldBe null } + + @Test + fun `Should make use of custom icon functions`() { + val location = javaClass.getResource("/theme/halloween/buttons/playerManagement.png") + val fn = + fun(): URL? { + return location + } + + val theme = makeTheme(customIcons = mapOf("/buttons/newGame.png" to fn)) + + theme.icon("/buttons/newGame.png")!!.shouldMatch(ImageIcon(location)) + theme.icon("/buttons/preferences.png") shouldBe null + } + + @Test + fun `Should be able to override buttons based on text and name`() { + val panel = JPanel() + + val buttonOk = JButton("Ok") + val buttonDeleteGame = JButton().also { it.name = "deleteGame" } + val buttonOkTwo = JButton("OK") + val buttonOther = JButton("Other").also { it.name = "something" } + + val originalBg = buttonOther.background + + panel.add(buttonOk) + panel.add(buttonDeleteGame) + panel.add(buttonOkTwo) + panel.add(buttonOther) + + val buttonOverrideColours = mapOf("ok" to Color.green, "deletegame" to Color.red) + + InjectedThings.theme = makeTheme(buttonOverrideColours = buttonOverrideColours) + + panel.applyButtonOverrides() + + buttonOk.background shouldBe Color.green + buttonOkTwo.background shouldBe Color.green + buttonDeleteGame.background shouldBe Color.red + buttonOther.background shouldBe originalBg + } } diff --git a/src/test/resources/__snapshots__/dartzee.bean.PresentationDartboardTest/pride-banner.png b/src/test/resources/__snapshots__/dartzee.bean.PresentationDartboardTest/pride-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..f5debdd5ad86d8ce008150ad26eba1b060d3bc99 GIT binary patch literal 32631 zcmd3O^;=Y5^sXX}gn*!=K`97=(p^#l11Q}HNS8E2hqUAnLkWU3(hU+K-9vXb0s}JC z-Q(wepL>6}f53eneH@r`_E~$cde^(wF%+UCLx@j>f9uvQLOEF})myi2pP>KZVuRoG zA{N4K-SQEUlM;XDroWqpHA~ys)Z#9@&)z{ML5j=Z_9NJ^hJhsW%Q87kl}$57mEq$v z2*d9t%^y4v-LUwX@Twt+82!~~y)Y|>R39^=g#mZ7L4MYXjotlosA$H9q}$;B?!a!J zkc@hww)~SASq9QjssB&^i7ike`cFX8SMiqV|32m%W?fR@{S(>oe%RaZQU8Q@#tUM| z3HkSNK%yHLDT&@u>`<0e;O@V@$(gg@J#InoHRq?qJ>1TJ-(%fn_RRY81^iZysJ&a4 z_3!Dzo&`Y!l+Rz$d;iTkqna4Cu9-}o33(%VF`KAU-TU&K%+uE%9jdai20$6sm$ntUK-C@Qv21ZiB8z#`-Fjy9wF6h*~kZ+5?AMg zKI_Yj!*;kQje@Dn>svITp@WgJ-=y*hd!?~p9ctFt8r{SRaVyu^=C4w=aV!``D zYlgA_ttG;TO2HEMMgA@ZkZ#R8Pw36(ADP>{_l|Hau!(9SIE74ScSu&Z;h` ztcvdawYVuLEGe(%2z&$Xr+Nav4E*xZFICGl;eBI^=${TUMxP1y)fgFp3D2G4n!n|! z75baWbJTKY_<6a)S38o$tk54Xg*?oE&DylKJ1 z4Rarvt=mZNg*9y|%+xAA=0qD$p*<;?>S7xKM@~Q!*@n8F^Z0-%Lf_MdeR-|vZ2oxQ z13jO8CTc_UrW@82LCrfbox6A!sJ8nPpT#&K)F~c|fZ}^zx`#XzwUxJBSlWD~M0YW> zaJ{bABJ6f(Xq6^(?}WRqWTQx{LOyYnxj7+Rzj-A2*uBXK-W)go&>X&$rjvOPoHzJ* z5*%>x8kaxX&Y#0`wg>1uce9j){zx4#J)f(0KDM>9To0nuKiseUg*<9)zS!4MrKE-K z{YCAR+P!G_iA`-kJTz?HTG7asJ@~A4(Vt)}fLP@F`aoKt2Xgxx5&tSlDLX1sK}RRG zN+}qad2D@foT^#v&Gki7X&ln74>jrzLFm{CTQwDBi#p(pZ>*=YmZq2gX<8$}9{mMP+7?^2~iw zvr4=B6qrGNaGa8vQLb`E$@I)jQ$;gU1JO9)PRF+tNTyjF_E6BJ$aQ9-c6i5$zPvBh zuDSbp{A%kR;z~sKZJ^j?A^1lw!dG5@?X8jy=mCCfQo8k`mhenU_{$3H-kfZX?W_=skCT)CoOi-?UnlA7;khMxNMp zt2kZk)#%I&5}+7O-7jBl6^_T7O)7fwYf+0l2exZzJ?k)=pQKV;vmra#`(o46d6MX~=K72}ctx z*W(Q{R1^Kr&C}hP3L!jpjemk&rxIIAnnNSJFD9tA2-0#T&BCVnF}i`E5F|%;%jZ-R~q6a(f)FM4&~cR0)nX4dZrhwbp*Y@D*WmG@UOoWqL=jFo9RmS_^FLvxrC#rPo1DjT3bzVP# z0NvxI`8v`X!M!F^vn_-ucq#lG(?5ey+XzEurE9UkHiSP(=fEDP@(U!#W=8H znmzd0?4d++-Aa_8TasX0-UU&PF9;D1e3{h#Hq}$X$8LuB_Nz|)SEiRopu0--`_wu|1@eF6F)kafY$A%jT z0!#HV-DZZ@QK-kFAI{i-;K3{ljDwp2l`9C0GNXPgH+AglY@yV)b_x3+rjGDau%{+? zPH_8eR;DBCh|y`^is%0*2WZ}bhKNg?Bv2a|EKT4YR*HYQcO~N07@4xrlJJ|8 z;+lEYhW&c0MaPW{pJtEsWb-le3}~(hYV#>_GdsFqC0bOUkea7YTb~5;3>{QGR}Vm# z&lkBmQ9}X+=6A<2>-1Wf4W<{DG@WWALGUTyXt^9|h#A?dStzNVwq&)M3Iuw4Z|5qYUaUFQ~Un;M8oYQ{)D#VOvKYKA<_-uC6vvmmE@f~%t zmCataN@{nx)zy~LyVXF;u3h=tlj&z59$6#u!PP2%7w`L6Sq9EFKl1R3K@puarvd(X zwcpspbVWp>m-YvvH5nG8x$eC-Emx=8U&Gl|U%Yr>*_Xt*9j~UOQrdKy!pZGLedQaT zua>7hb8lJPX#F8V@pBYi2-s;k6{m6F*^TxlilSNorB+|JtM9qD22IVq5w@EbLhe=! z8drL!N)ii?O)E(NEd|=&>Rg|5T|hP$q>B19pM}DwK8-3ith`K<#sEl~Jiie@5en6;0QV<-LchJ}* zD?iK6C*oN+KV8V0rG4)3KvAEZ+whp}C*8LeT6{LjQITh!2Tc>_(;)RXwM5eiPisCM z@A@Ur5R1R$E7!-~u)BP9s>hC!;%}P8q4$CuodJ95y{Nnf;RtrAw*kzcx_b0C1Ywkg z8-A;kmZI7syG?l_BC)Aumw=-Yax@K2WA6&OJNW}Z4(475K{Rf?y(H!!Ut>Fm(IP*= zJhnMe)!JWF-t&BZ0jc$;4+KKvgauhhpF`H&@LSTfl-2IpWguE;+LiQMm;J;}>rHo= zw(y#wE(KBeP4|M5=+!4H!6>loLQud{ZvVjjmcj|<`mNs4lY>uaz~bt1*%3-M4nFq3 zAK~j}8ijO}WP+tTck$`szGf?j5%g5g*v{1T0U*{7yHjz#o~pB!7brC{wB#!rS)$kA z2=^RjUb5Fxw6ZF!2T8KF))l*iJ-n9^FO2sEOZyYCdwE#VTEh=s8r}*?hXJ==@YFLX z&*hLIB)byyth1U_6MJIu+x}5bShI>WolW3&=0`T0ws-2sKnzfPS0Mk9Exs_jWI&I|? z;W-Sea?qNGypdTbwnP+ZA4wZ!>))bvT_rl7c^;IpSOpWM-D zlk$-_Jl6`0RU``&V2d|S&#G;gxSfZ0A*()YP>dtJAe1|Mu!BmiG`K-cY;WadtSjiB zXdKNdMShXRzwdIGl1;x0VMkFR9bI#uQ$mmNZJ)A2sx8DgyMk2vUXeTNvMjwe%;=^< z#koOjf#umXTDr^hYni8++T;bxG6dlYy66oZ4D?DH1XKKjIW65z)X3lwXFTa$e0k16 zNMA{2gkGCS{QdpLVh?`$iqzzk%W>S{F;hFIMY+Irhrhb~&0g|y)b zxJ(_a0gXV7Y_jzs%_W&$qrPZq9H=0_OAIp#c!`A$Z-u}quU5IQPyq1IyEQA+ZFW7` zVP^LXiWQ3?C8X9u^4a>s9$p(3 zQ_8aFaRO+2Uglq7!{Obsb|ODl#}5Ej-9L!=J^O|>M%MAZ%VND#$2}Q);1Mm|TN8sq z$8Ve8@u2jFn>>)^)hetkOF5A8s$k>3r|~w$SxIqiA{tivbsKat-yK7}!}@sNm4p z`=ZczUJ)~*`F3RU{oNQDx-C7N-lNfAQkUDE+8iuhLJ~g_1YuKHyWv%a`?Gb7gAx<& z+xdB8AX5~Xa`&<~6iwUI%#Cq&(PVp{R%Ezu)ZTr_)uGL9BFm6WBxub(d^ABEG87l$ zeJil}f*h8AAE%EmlMJ7qDBgl1ljaz=GX;xfT~oK|9rJFg#b}eKYZXG59eSOg|kP zb?2g)1TQp)$*7A=LV{C9I(#+|m|*;e^s>Mt^Tgk?fw58eUB2KFhVim?yvLbI*%C3~ zLlr@cokDlA!Y6m4q+;bKhXY9<11g!V0hteu?@A}*usvQ+2Ac{Kz^9>>_{cz-XM{sm zAjU7_H&TL$jsm?xhH{*Pn7EBJ@y_IY>VXhhhJm&L#&^E{Q5ZqA*kPQdkVN;^SYv&> zFD~3H+bs5dxbI_R;eoUYEO*vuu;c~s$xZaL*p7V}e>IXm+AV`1R2CnQK7SI!fG-#i z!Nvy>!bulxGFt1m6(Zaj#6}!4i`v_MFuVhF!F?Both@1_G+EXdAW`mt<$ZS&X^v%m z;VTkaAweec-#<%{^6yGvWM;NYJZ$jy@1u@4r7K%a;>F0>#lRP2qcM?qL@Jk4b_dTl zmWY6HmlU5X8j_^-E7pV#@5>KXmYp*DB0N7(W3)v*y(KSjH{MPgC^BHAj|)8Jjc?$n zZyV8_E;yiFR5^EF`rl@xrI6=UWcl4FZejLN;fwoIv1SW#BOnQ+?2BwqaGLaAB6$He za@!Y~49A$?l1T!l_xyz_4Dac5|Thf7rCbkYQY!i#yW zIeFXoI4&1$A{=#m%VgZDk*nnw&Y(shbg|xnqVG29#}10nGB&TCy~o*1F%V zP%}b#!MilQT80B~{`tm91R{3;1l5C?9za5A^rs2J)UsjC&b z2)r-miCL9}KRNa6287Ras{ooTI6vNS9q=I*y)2ssRdK|_KMM~wUhaZ+_V&dY#q$cbVW|p^L^T;%vIn{kZRXdo7sSwyftnZ@e=%@K-UT_1pNb6*Pgj z+#cx@hM8@+Jj46z4T4rgtwAQiY8>nbjkYX8_Map*( z3z{ifc1=i(LC%rk1;=t499euix7-7d*OVR)?B^hdlr;wz@B=*HUaD=@}1$OsvF{zXh*dte- zFb6QalKMZtsL#zgp5f~~eP-zPg$#`}D-6{8Rb*&Q6Vw#El0y;%(6R4-uayGUigFJ+ zB5I@b5dNmW|Mpb=UY5ewK%B{kAvBJkU2{Dr;r4BK>JO{@xk{Ow@qge#;95bX{iKPn zE98C2kBPAKmDZ8*_01n%SgKOgzft{i*eYN?U1?$YXSs8`pLgM12J|%9;Q3f*PD|1R zrna_r5pp!Jt)%0C!)rPKgY6002j5osG7hkjK5BX5cq}TTyF_zmKQ3>K>2c z-+;GU42L(rN$bsxV31k*sgR&y08O|W?E!V=hhi87xeFtUg9IK09{y`9NUl~Z=|=?a z7sHs$-^WZyV2Y_~*_6;|SN2q{Sa=`~yK_m)wa4jT?56S|3iDnG3>$s>fg>bP+8=~C za!cVKtI6CLn40A1U(O~h&Z-blywL908ul!EPgo*JED;-UnE5U0`btLBjgbY#S%4al z(`6=P*_DS(k7weBV_>Clvy6KfDmM+h~)j-L3Hyi_a^?$1=V9J8kCXLXm)q&L} zjR~CR-8b?9mGQ%DL04TYcKA?i919wN3B`K@3e}>C5&yOlOh(%KJ!QC%uUh`9glPUi zJ!mKJXY9vBToR-Ctek8K2MvEG`GCjWz~88_{=LqSM%OW`@lGf(1<=Y)2Wts4BY)7;!lyzuxV0-{Rx|Rc( zUt63VF_h&Zr-KLk0@xC?iy;qyQ%RLC2C=_!F;2WYN#aK{y?gq}EBZpAx~yMcpIVF0EySDhp_7Q_K5wWbKm<23g8Pq|b>gZ9) z`VtpgojDq)>dJI>>mSyC0d#-J$3qe;5R8+32$^2Xw70t538L6$8KlEu@ejK|;`esa zN1Z|vO9+gf1{xuCLjN44B|jFScwkI3+T#4{_j~GT$Q{YuyjBh`BamEJXB)-ZVh!u%bJDdS!FCr^PS!A2{TRA^mVHf23J zexn(4?DpQDl7h}4&)c`SjKKTYIWj5Q!B zTEXCiW=a-iRq?6o%h2+%9bler@B z9IVIBchy9s6YBo$GN)CRG?-9ZlV$%A%g?Xk;vqpcTkUdn_YA3X2x}H_%Lu*D&g%~7 zEEc|4Od}Ht(lFo}hWE0HSbw^lEMe-BYYsNHdXQrwMnljw3fKcS)|=Qz)_vf)IO2cq zKMYGPyYk{&TEBb;;Vx@W3*yeE#j11&je`k)Du}MafU}ZsE{L*`w9pNmF zh^NoV?bR2(-vsT&Q)&{^qw)Nrc-cJG8`7uN9c|)ZOXXJNVN8zuKHMxlPg(_n{q~Za zYj3FVx$HogFl-_SV=$id4GLT)@{hH8J!wXzl&KYTp@$b%I&A3q&VLX7zIK5sj7u3Z zFJ9IRR()*U_-|EzEAmNwDy1Z?fD0X>p0~Kcd+J1VAw@s0#(~0pfx>sRAq@B0ezDS! zyOPA~K5cawvG?yIot=2Z^87KK^~57LuX4<@_mThx0<|N4WXehe6Ke3CikxvN%!@-@ zq=Rj8mI9OR*JcDhAszACQ*xUv$2f}v;2$V9AX>A#z(hPI5SO~x{$th!WckUlwNl5d zjKmafRZv&Jp&NpFKO-2O=4+oh(j$t&>Vc8!d~dU0WP;x`q$b&^l)R9E7jIbZKc+t9 zyGOU-(FPrbWNKx{{+8Y(ePvzNCLR;_<_rIfRC{QNzI_Ys+T#z@bS-SB{Dfzbz=_tR z*i~UkMke=(@P$4f-<&Bb_)GikWi73$6W1y;#Rq;-cGEo`!g)5r_VV;hv}~0Yb4L}z zaKG&rerK)2%2ZA=!tiuaR(wL;6Qu>JWy;zleh}-GkCD;p% zl_;jvUS%S8BPj}3XzRO3F=`La2j$GXryj={SSG*a8d1AIA}=axXe1pjOQuSJA>kYB@Nx8a!NiubwQqtDio!4olk9E(LE#^3ETw zULhw8JbN$P(cM{_T7O`v5*+@MQ$+AqOTx3RK(ZEywcBOIh;khV6@IlkWL1mABgx&M z0zl3}P%UU({p}J}2Q>2gxdvAafM2aQyl&7i8x%t$&qbfa`j*8MlwY0Bc;Z-fe7-k- zvvbFDRFT&mN4|yn7?%3VJgR;@#p)esS_&NZy&4DfVBS3ROpn`je|F%GRj%DaGom^c z?P8%g;#y`8tNnt>G+rz<|Fw^$q#`>FXFJvE;ZX!(0Q}Jm$q7t5<3`TJ1 zeY`hz{-W+GPkCW(z~j_i{*AaJ(AbE%*g%rSz^Mq9a8xQ zQefS)XaB@NL*Nu1n-l?1f<`=?AJ}g=u(e@+0{j{d*(_B!v0Gt=+hasW!>+F`JbQ&v zo7wXk8~~p=Z&>|LEt7cds!NatT)T~kKsp5rJQh;rf3eh#r%U2**wU@-llwUiO&kDJ zaFHHZcHI2tMxBlc4dJWOKFdawIY|5gB2_-p{ z6ssly6ZmhK!1H)ZVZ$bFc)aE9v!5YkF2jaUtJ`N;pUVbBc3rD{FEXjIY;ZGSB?R6Bq7vn|A^Y-IO@;1HK;q7Qe^U5-$ z-Ba<0uRng7HVUErYtA7VeD_E7eM%4rd-(C<0wLIi(xT9bxRmXlQcK zpSEkaLNjyP#WKVTdGj-#<<9N)@iR|ih*|?uRdS}`dvmc( zfsRwSrG@3u=I}@Xc4bweY5gf=hfT}&Lj37?n@Vp%YNDRBFy+f+EX9u^aNoGYCF#QN zf<$`iv_H0RtA>xDV;xy~?@LQw6jas8Rn_q1i_GbaC;8ECd&YU>+aMlfDy4|_=v?m| zYn1ok`(Myu$@8+>i?+8_cMHt=5MF$ow!esXoqocb)f%vP&6G9LXvgk~?i$1lY+l4} z_9kn&yk$_BiX=^zi(~r3=gtp^h^B=%Uvp(8&axun+UikceQK;;25ABwVJXAe(ae_Y zlp)u}dzKZ~lH)-ud4=Zc@cVo*7JN%gOFqgv;D@k!7~75Xi&{4uZ~7*U)H>q5%5~m~ zDw(IA8TUL@qduiwZJN5;D*LgWGu&HX#ax_oEdZrem>pj{wE{^7c)`9o>GS@Jbw?l6 zXhyB9Tr(K5YLrJE}WJ|S)~5K>33PK~xe+j+fZDXm2HUKV7h zPB-4XbpDl;zy0HjzxhKnJJ*VL#)+4(4t1(?KVHuVOm}K{f|L)kdAp!cd*-vaWJu&a zf~!}=RXtH{uQZ}nJgpHj&K9o6k&(pF z1~1&!iXP5WH?!MRdA3iOb~Afj5svSvsaG&4)v^br@_@89+g1B6^(?g6WD}51jXGX9 zYpyL9X;n&hsRXPeG&fTTFr^J#_c^jTOowU+#(F`QGiy7^BwL*t|sF{x0hOah}shu4lHc)NHb<%so1ora1_ET zmwq^RE?+U{+wR%UKVmc;Plt|^u@+f{!tI57Krhk0?J7*6%KZk6Ik|T)*fs3&99W@1 zLllf?n9;yR$IFZ)JAO6Zfj@+5QNg%}4f-)nza_*v3jnvk=VlE|s52XUoLxMz6C|>8 zdDO(DN#?+9EA%lr#hZ)R_@?-xK>6Uuw+Aryot)$2F3}Pi6B|Hn?VlVpIFA$1?bKfG z1+KjxEP0`Rj{Gp{E&0L^=O>b7;WZ%b7ri^PrW;ESNT|3`eeSl**n|&xB&_}SFSDJ% z{Fruc3LG@ubvwhoDZ5Ow(bgJc7HP@l^WnUzsdu3Et?;nw&73l`7MUae$<#(ugK0LA zPSMQh#XAMgH*2Lg+yYg0)F%@gv-%`waADP|*E2g4WONs0jTIjmtNO}H)ZMifQQfRM zAiM0Sw3dLXX;B0%&kdLzS@6m?p7+>!L1|EDMa5+uI4J~pP$3@u6Ee5jqV6g4jQ;nH zo1TqMQ!J4AKtR|Okuiso$-J<75r=icoG%k)Fp!cIkknEi=ejcRcNo<)W_~v9AJL|N zjM7}IH=f{cD&E8TfjB|o*-vrq&8Jdb&xJrUsZiyTi81$24z_4uYm4>qWmag-g-Qa= zfkDL$h5OkV9o;q^IZJKWvVqY!R&|-3KfHe8ih0UhcGq{@lR1!q#yf z#2=M$);KVzE$8M>opsmbS@^P9TJY>Q3xjZB6RFb#X#PbD9c3UX4JV?Qs{VE?&0imK zlbwb>Vj?bGNR6{B8ZT_&W@r70d}ag#b&0*tS77=FQx$n0=x(p0p*|Ej9vf26mzmYp z!@LZz*3zFpUk^w+OcnoeHfzXlHmJ95?37qNsembNFCt*Zj0=6p_ppSt>&o83%8^IQ z({WFE5YvbArmdYxfntLLu0u9Z9WX`5*WcWe>%>f-~)iI~L8F#CBETiqp&kV1E9gZn`kT|^{#)OaRJM+2r$mN!^ zx^A|2w>oFbvcot&Enaz{rM@yq`R!s$vo~difmNwsfiXfHPI}lN3WO6q-vhST`vDJ{ z#~;;Omb8YR2WSm2O#4dWGCu(;+ynE5^BO0p;X(ma3$e)G%xN%X`3{UL6qVBsL5$YO z{_obGtYVtLxJMHOsN4Vv^|J^E$A_fYR*6n7!KCJah2jVmw8fb{mAmbC-0XGlDz8*Q zhZat}_cG(b0;hOYm06*|rkxPG$dkV#V(dFBXK@v-G$u`nj3+Nl_}Q}!6Qv(E0A9%7 zIZS@c-5}#6cVcNlEz_tij1n8D>Z_Ko^I|54jHen;Nq2Ea?N2?nWUE?Timi`UMF1S4{o+aR{H{+)JgoimXwdEjR@1C1N0R> zyi5rz`*E8*B?gEnJ(criL^QhzL&O=2C@ralIacK-yysi$!y?}n9Nu_j3?Z5ApayQX zqpOLdBQxHr9?o{^${KZ1={p~i{cQHOyYD|=;ACert0Q+*MdSV&jA0U^Zv?m3XfcDd zm1}QkR>vQVGA1mf!Lya4Ru+!h7QKtJ?D*Q9ts>_`7B0QMBhT2fd=`k0%N~}%xKm)3 zs<5}3!&Gr{FMIRiDcEDDF=5OgN=NC%tVcZ6>`cGL#k$m7lftRb%^=lrl%6)N$KX5S z=0xTbImfd!opaq=8N~Z=NE}YDRFKIq>h>wLj<$!N2wjgF__2J_oRSbjCouh_i#~Ch z1kco{@s7F^?n7gkQ$@F;{?RomviWnL9d{;O*0;(Zb0FpuNLgrXm< zNIrHwBijH#sbVQBNQqnC&-sJ1-)7?K@#^?i4$3 zc;9s*E9xO)Jxy;P%+K_`@g&w>a&*|5uNfybXC!KL)*4^`%N&%ybM~W}tRtF(%C30F z-=TfxT?U=)&g(Keh4G40?wa)dYrWy%87#e)#bDFZKkVRp=V@6#}+n>l+_+yu?#-PFOaMTFFOJ!gZNjNV`8VcB9qTf?&lL3dfT{#nDMw(&kIj+H7A zUHT>2lzJf%gkJxHvZe^idm4q!smsBJB74oer4a4tfLTi{%yyPhN(blHCLo1S= z{gY?ga#Z*)tr-@X8WGz8<)pg0Q5;iDt{k62*JbKx`eEX4OZ6%iw%YP(&3hjUeVF}b z7XN+#G`rEJf?u7ObkQxo?Z5CAZd4^hb22*2K5YYcjds4e+~OTb z%ikBYEYLm-Sejpf)OnGg;6dP-8FkbBFNFK46ArmGK5b1I%T-W?%yM^L6r`JWW_>G` zdr|8YRu$H}1ct&Jd51~SaQFlv_rfc+L^}2+~72a+i?@5bcx58P+ zqDs>vyC+ez`7Pt3zl~-Z_`Cm{;jm}x^O;B=#8&bS=*cyCoW4Ei7?O!LP!hfjUmH7a z(H$mrChxOxn5}PR%RtLUhdERDh@7kF!+usHo@pu%IE*)xNozZJtIKn-84qAg=;{JU zhf>KvQ8}~I2ibUY|00bDz5dke{58`@bizEUVz#WP-uY=U+8V&|V7j0!K%9)5upj+3%S$8yB)N#|3J}dOt5Q&Zz}+FzKKB99_klP`%Pu1;(a_7K#p|o3++XWM zEzblF(Yq)@oZg7A=4$wwy2(jcw^D@QW;L#z@qT*2bOU2U(OaLr>mKAv(Y4Xh5`ApT z?TDVT=DlqM)*o+A-rglX7e6f#&~XHbkq}=Bz^D6Y`>3@r-lxRLAm}^l50zXvkv52J zukOYWJvUmzaoF7XQl~`zt8{*pqL1`MYw2k&lV?TdAcg3vZNo0hX2o2bxAy!+iky1g zxGbt)Y|P`#Kw#=%CWU~w(7U=p#4l>+o1&FdoPc@WkHoTe!^HMKyWlL)EH|Ig6#-g= zH9C-+<#}K9T`gxi0r8j#`$=SoArAd|=2sVTrs9`-vBL-fm7$DXx5!g}(YJD5qDZw{i4flGL?cml4T9G--zkW1Yo=_+2ZVKLH){KjO_Ex2yD8$m<_POqK zMAQ-lXc2W)fsH-`NeiU#8-K|6GRL}*Bc^y;?WBv2pX)$4B?=L;;Et9*3fh|&RUz() ze}DfhM%1fpa(`E}f%bensIk5B+#eZ@n^RXe5WQXr&-UrpiyE(%JAD!89ni*A_+ujh zsAY74t*lR;;fkUy1R8LO%0#8z@>n%{TI4`UQ9%=RkYg|U4A6)6ZCnHr{|*7@q0z!{ zpBN_vh{rFNv>75_2HoyAmBGrGvu$(Uj`Vgan=vJ0Gh%$amAA&io4~m>E!g~lxL){@ z2dRvqEBb7gS>z0!R`dc)4>raiYQz1tD7xHL`^wRK1@VV6P$DRyR~W<}uhG_7dZO~2 zBvU8HN4*CQr+V#8t{4xxo0ytSvy5JZ8H{v?Lz2j5(lO>c3-71 zmp-t0p+Rt>u^&xCf57TWR`E9K3@oI!7>L1KJfp%P4|zn=f|6sB-C^SI)m z(M#{>0$AU5RVKjWAe+TS!l~xoUZ#~>{c=)nja!+@y{ACGQP*nI$$@F03Aj*?`+C_AVHN>7D zX5DC5J5D5S?OLt#)7xjz&hBe_%LQ~ZZRVFw>9^49l&hP86r;$RoFtHDl*6=mr0LW* zpCGM65_*II4dbh4ypMyU296m}ijoV+ust=76Q|z+&6XREm>sx;E{iBs(!ofb=UxI zIe>>&exLN_IT34u&uPn8z!PP)&Gl1$w^-xEesP0HWG>T9&TC^xp=%s0`XGHV&F$05 zv-WX7buB`%_?@josD>J(t7^F2nH!yVMsj`;S*huGx8%86q%<>{e+z}QcPH;UNFRDs z1xkF9zOe8qtG=JGp1@n#Q{3b3Q{5xy-&_q%o5S|xom;XhdGM+tWSm!59$M-SWdqIa z9jDzokZz78fF-o!&t>Rno%usPm#Ln29egs)jEFO~O$}gr226N&+-+qxxgeYS9M7R^ zkEb=IZ@JZx|1r#@WhYKF_!YZi6Dq&DoueXX^Ydvoc;)S3@;b#q*z?$_b z044w@^)c2ku~(cfxc4l@utxdrfX>Uwl;2<5xcDDxNGu2i?M%cYc*g7Zma55VGY3^` zswo2!BVDU|N`9Bpm-YM>7#GPR)?=EwqL^=jHjdl18z;6qY@#(oCdXoN$BBIv{!mJc zn!;B%B%xb$_Y;HIvQcJ71-nx}qL9%OH)OEelem(ptgMWUka^j1v!Y+?4f#pc>dvl6 z2g>tZipJdJMgL5!35K?J8DMQSKka1+44~)>FC8m0ykUB8ekIqMoi7Zzo|mrL=^uzR z993WyfZY1yp9GXZ0vxCLm03BA>9Sj^0!44Hjq;w}E{}@*p+^+UkhJCq30Vsu&`^gq zG@J{+>I>lXH{^#0wtuB}?kV4v9{n<0a5dSP_-JKB$Rf8YvbJ(yuJ?Hh&7O?DMRA7n ziKO!+uUD?kmt8+Ws;kOspCx#-rI*Wr6tZvJWDH3VQfRPefJ(SoatbL#<8)=X&>U5U z!{W8${AUHZy7kLnb#a)LMz?=EYbIZ|E6IR4%m*`TkK}+4;W%sB3NlRPX_G-!;pw$} z$?yG5?J=U-)bk>$d&0vxDiM3$W=#|+)kNd*6P#p25qs ziB{W1z8ZM0Ls*6iHY+V;=5I({bX*Y}>y){xLO*K}euYf^<({$ZgB%sNgeiIyzE9ly z>JjXPxY#E1EWq&=>8Hw5;p|;)j0udrLT&(H%#fLm^=QJ#6qpZfR{V;wbzHzxJhM8Q zK9xz=fGn38hQ%AUWR6xw|>8*uVj$x2+e|67+-eExXwe;qQJ`(FRQ!6V=yapiI%@d(2jN5refZu z9x9lxtwYI4t_#53R=BLEJ}kdDyYGH1Pp#Se=9|T;)VTMNjrx?)M|~r`!p5A}$nAqB zt)*(&<341ubH%`VS9CclxEbSXarTrpPvL9c7vH=uM&%H0kzra)8!-&=yBugKTK!OQlhPmNgG2PvrnUZ;} z%2;mO>{c%RjE-+Px@i5_{-+;8L0yt~r*{#14lmKJAHe&(%Qj}-Da*%a>N5mRuH#y~>nVD^99UkxqZ4Q+Vnx>6cBzPK!g|5v5 za=iCk!7FmHZ8jZQHiK$5KVD?z9~gpXzUJn*hl~M5$?>nB^B(_2!3-Zi1;5`)&7 z$zJUPZ$LTiRYT~4Vo16e5T}C8nU7yv$%aj0;jo`$BIu5&7KSRT3r~Y;;(zy#7i$Ea z{JHq`*i})b37fysyG3c%>+pls<*!aQ*zsFk`BRuvKCW;aaAZP3>a3i0W9xu45q7g= z8n|59G=nJ^$FX*F6NrY|q&M4!4$VZ@A++E8X0Nxic0T&JbKoAd!VA<4w_8>%Z-FaI zZzdD4l7-(_*A!24`1No*lsO$j?{oPBv~_F7N*bmOOoR2zY+zghzNS>_HpsE z#2Hq}^hD@<%VRXwu-9R?5Inr}QMhVs$?^Dg=8H!#mP4q&pQF<ye$MoC^OZK+u45?BV!ZQ%h@+{g730Ki@npKxV`I!0Rcj2Iv>K(2M`6?G>4-0nC57sC zX2D4z%89x`5|D*MPp7s)lR>4wzu)q3@#i++*)_o1ClM2y0;9Q#;g!0^lT)~0WIWs2 z<)}8v)bSyz`P$ARR3&di=>>ZnBcJ)8hNu7MnqB+mD~Lgj-#eN{J8 zs$0gG^GQvE?)>9ALRQjb^vE{){{!gH5M8*)>9+>2fyN{%+y%B&R%jI8Peg}PAw<;1 zpt%Q;tQIk?WL)Pfo2}&ZQLsw}=&@d*o>;Rh&f?5(p+;XJF7fm_ambS>&Ey5_eF}CI z%Q;i$%GWNntI(W8HW3H6?i(jvv}ZX%fYOCcvxsR0-d*h&+^AmcRzy>Q9zN)fUcXxo zr?zVx*6!l0yUThnnRmgfA}1^P4zbY75ywzKg$3#1W$U`^qtA;3_`q?@4UK7yTu+&Y9EV->7g9o3en4eZnL}&sXE}aSs9(!7RsEt6w+$7`eZ0aKdNw z8-`y+E)ONEq2?!e_A21Cu#{N#wzV!1?hKZ?G5iqEF3 zJgq1^r|&~2t5&gHyI6V(Nb$NV7*)-{Q^dk(Zt)C@!X~ZoE;WYfy@Q%#0{V)eX3V^3 zcrjUjze2vN?Zs(S`1%5W^FRHv5HUK-%54gJo>uB+DW|6kjHk1zGQf-&jYo@hc#)t( zkwAl)h92TZIQ{@f1_l(f-@0tq{#|nzV*EL)EX?WkX#%rBQPnKONx|;#J**0NEM7z1 z)U;B%#g2e#r2dN1&Vj|~w=?|2p_%$zC;m*e#KtL0(e397t0JgSM}z>s$;il_X+}t^ z109Ig12PWJ@@4QPGG3VzAv3FI9TlwV;=4^XL!~f7QD8VFs!5lP#U2dNtu!1>Ca)Op zKgH1lk)uD5r}HD%NN}SQniq+keLdrlwTr1f6L5j`${*LFkY( z%DdULsZo%>OEuF;>J0ipd|I9vt=NctwH%K6bjgv_N5OCTN#0Prd^|wGkIFRr>R8f4{0ACbF!c$sYO(}OGQ#bBm@K$5NQOY8$`NARALpB zmImpDJ1^hg@8195`uMOs%ln?0IdkUB%!$uo5OYCH{2Bo6UV6s{EHJrllg~C)Vxs`h zSYc+6w!MyiY_z`Ne)fr3lQmVJtn_QtuL9c4R?v|KB`-W)W*fn|kmUVm4(*RGio2hF z{Z^+(MK8SWrMdJe+~t8_3Pa<;HjDkhx!kXP*>OuT)e_N~ViA`gNsWMg1>)s0NPpmd z1D!eoY11RS%RfE}BjTZsnLb&s`8j5}yWrrS98Ctq-4&D6rGtQULnX8ng@>1@osai4 zE*QQEI%_*@I`Wu)N5aMzxtzaO_HB%9BkkAe3wef~)hc=A+-vGG8zN{isu?*l`}NXv zCoXvyrYkdKhNQ0c-C|koZ=vi>(EaCs#{4Ny;_yd<+L<|MR=@JmH;!Ub*t~FwlGEG>uPtpD6>N>AH0x~kH2e644-w#SLT9VSStb1leA9kqwwpQ)+x zswdkVlF*rCr&YIU{^@f>ixU5am6%tOjV~B0WS%}4-?9^N`OPitbbte^?6c;#Vy-M!1|UwY zV+;mM^nOGf&uIkUpXt+jd`Gl2F!8-BVIO3Q#@6njr;`V}AZ9 z%GBMYVmKyi%t<@ACK(ram-bHf+wjpv{WkZXnBVVKs-CQGF@`m;ECxd})$#&wbrCn< ztB=YP#m{3Pm#AevL1vl40~7CxMs8yShGthpgT|qifdu zRBve{`50N;U3Owze41x$>Li#(qWMdEO6=Xl0mJ8wspO|2H$Q2b-kGVO&^$qD9;-c} zD{dALcFlOV(jlu=-fho4xF^Bd*(MOTa~ENvN_V<&Gcb!$a?`MKNOJWb_vWB)@=Oq< zn!n_wSoZsDylmN*Ub$3#+?K7ni#)39Yv;uWtO(I|xGyC-F43Ld%vYlA&B&ghE`R^2 z)GnFzucn@h`SB-*6r-Jc?<)HDmj485J2H>&veZ7Wu@HW|H(}%%9g13{WVsNkKASJm zntGJ~!Tx&96vbtHLeE2yK@V}(PO!J_+(Vd5 zSf6AF_+U1&fB_bj7t+sl7yq8S33Wl|%@#)9b&=sTqmtSeYUZj{Z+EI*CD(^eH>QW> z4A&kk7kyAYmFf|x+uwaBq>^$efE?R>D#AHKYeDlC=@5;=?e22$7)$@=w-_9{`UAqYJrstDuuj*h zb4}mE3?#j4R1@NFWBSv%;b(sXitNTt)e?O)%~?kSC!hTpAD}Tc*)^R#>p4^MUa!JT z7yKNHZTqwNjq`zJ>8`r>-$t~k<7rdufxj%(Kkr2Wf6tL8onsD@l7SV!-VAIXMr56h zNZs8@`gO+hi^>>2=n@v}ny%$jnN7Q@iZWBsw$E z1v7L~>4l6jU81nHjSM*%&skJ zSkB4ZojtuHd)GX0vzq&a`P{@PC$B+!U3wK$=0s)%>}FxE!@{cmu6l=N25-$8{bUuF z%%>{v5Rccy1`_QO`+T8J$b?b7$ZYR7Pi97*jz1D~ z-)k2+ZqkZ4{d95o`}b@Vm?2`hwnyyFng5F3PEr6Nu=q1qMI%GSK56c4zB#>Da`puI zk^JqGg1a&^kL8z`HoRENYaJY70~3m#g^qrla`=-Lwlx(v=}@OpF2Hh8UVU*|S7euy zaTi!z?!766Z0dqlI<7S{!5yP5pUrvP5N@ZC!0#wQeT?f0c1}!!^4mw0)OVQ|c0H~jr?a!O0|3A<6#MO!I6i#b(gd<0%e?vmj`r(GAjL-N*X%E2dX z&nRE--`d#IdFS|h#d@@Ih~n-}WwBXG^YV_Cnbh06DJ+6TPp0naj^Xuq>F3;A+E9Pe z)o?a);6tA)D*34X_#1=mNK5pEpc^K6V2chqK~cMJ4a}iwVJx@k9*IG@h1?t$hjVeG z>bx1bk9UbKcFaj3mR#sfb8)|M1Z;DIrnZe4ysM)Cf(sVzLtaQ4IYFU1UA}(t^tzrN zhqed4#s0-C1<9;cQH*1*rn*>XK?@^K!|0XoV}@iacXYHFB+Q+wXK}q-(p@H>Kw!~HeS>2{0J1y~8jph1R=PK9w zpb6^>=u*{Vi$2{Jx9aS=8MkAKz$Q!ZfWz!I1%VE3*pLnb%#&5z8X7JRGni~0Np5eFFFzRYKSG2W+!ZbptK4!0frd191S|4SMFO ziWoebYo>)&HK!+Bnk;a6$qtt%1>zF5fxTWrf~QNsyrb_9S-m#vi;v%IPDWM^AJtpz zrvcYV)o0$en~Ao!F7;Gos42^0UEx3ag?Pw{Dn=vzN_SC5Xkb1!^|B{>x2Hu#Xx`|N zOcY!8yg1_p7Ui`AXiSGMqpesL0@rfzGQU;S@mK40o2*s*t4@%v@B3fRwe-V5PWFw)JQmD%}J+ zqxane+)1ytXs^wR#}_Nl@JFBxil6mu=@E}jiO3r)Hp5|_OzE51?Eynnm*y=#x9#5^ zYfmBS?}hT@i0g=4+#^oC{ zaq&o}Ko(XyH>S0RkigYXW7!ai>NZDVo;uK?+Ejjil0prcI4<<&z0bW|)-!QnPG)XR zGU@64GdI8XA&LJ!a|`hySk?S_A7{hXz~mY2w9K}616V$RP%}OFGgwV(7xRuIUcl}2 z12EbFVraC1eA|)%l6Cv5QsR7$WCyB>!LUAbM-*_gy-82CXp=M$2Du?d{PnEhqjPQn zlJ^EKw<+QtlaDj!kHlG(+ir$>S|RGKB>uA$+gZZ0%ulL~&R}jZ6Q zr38~O7DeDwue#_8J{fdR5~=^3UeG>WHgI(F#$*cOKMS(3FQ1pE)B<4;1Pkdp8%(x5cMG!S9_pWp!9xBOA7-&g3~Eos1M3cqmJHbwaJ9A`xUZrI!`iln(d{ z0eUYl4U`2h2SwH%0dw_@@gorg+CRwq-wYR|yLDRBXJian?Ax7Bz=aJC{8cR@0rh33 zkEB?BKuiB7NUUn#N`RTbKoZB_$LX+~_Oo8`1`7V9KuEpO!akS0*D0F`>Srp63#W!I z#u7(7!6%ybxde5qiXc5D`0~HKaYxc)k%p=kdmER;9#Kds#J#pQcT1lqt3rZY-cxUJ z3Xtpd#)gFI-i?c=ygO~GB_l^-K9z;33v~K_WlHFHn;>oYT^sl}?OqW&vBn$^v&lhM zOeir2pf@~!M^KSAF}DRhaAHSUBHN>CiCR^1Pw7BM?ARD#OBwP&ESyIiZNqhNz%VhY zC!;2R*K9i$Lv0By%b!61r6stL#WmzB&9mEW7%Y|MS*mY1QHJEDR6pLyQ=ux5) zT2=Lj*&x3jL7IUfAEKx$_6+j) z-cVw5xdqmzR4r%o5#W{T&&}wUrmiH?M1iJ5(fX*mGs5Z6*qd?Tn?Qsi0NQSK>`BG5Tq z5EoNJkYS=k_vq;2@o z;ksNfb)bY!wmT{ghxZ9s_2!kODnaD{C&Cz#S^{PmVBv$4JolG_l|RL1ffYdJ&!bdl z%_#8J&?|kL!2c)`Vc$R$gNGvzoxzdsFH=&6TT;9Kx>HHwPHSv;nl;yXS+XN!;vZzoKAT_X~RlODgJW}%zu_!>S zvXl@&kdR1S5?cqv{3;Ak;U8f1y}hK(vov?(D>E(cSq zj($b0Q@_AtrLzIH?^-41lF~2_vQ)qRXZlR4QIHp+rV+uFsDdFY-i90K z3w;yNV;d%h+M8B!R|iCRt#tmX3)R^WOOoJZlV62KCrOe7f^OFxQk{q9sOa`z3#G1> zgE;#K6ZH$FsQ!kUcv;5%yr(lF(I1Gdpu8%#+=xvU7@@jq zFo?{{vxqW7d}UKwno(=A7~CHCQgzuCCK4ZEADx*Aoc_-ZAw8jqerS_Y?j=5aHPAd5 z4v_R-B*^EV*-qUy32&p3JV}q=NF7VIm)f6-r2Sh#lQoVkaVoXug>OgsYe{^I=o08i@HE23XTAnu3xQ<^ z;@ST!5IsTLq3Ni1QXiswDG|SVJ!ys zGc5q6=(z%cwB33*B(O{!YadzueaPOy!2rr}1u2+$Zvjv!mL0M2deepyDF zH)0rULm5@$mQOzHd{)&PfB?5jUKaPaQDF#3}+XB`}6ykJzgO>4fS^ zr8csZFYw}ObUi(*ez|p!je>3)a(KxCZ&Y0UMsaH2rdNr?&!yvp6xl(gV)OaBj!c_v`V7DBEo z&g6ztFbZ%fs@W(%m+4J^=tEPp{r7Hsq5?awe0L2c!9JbqB(jh7;;?7v!m8O1xdHGGdvmXuN20FM9(uE|6aOv}0H?7rMKVjsE z!gGLe{e8i*JBI1uN9xdUQl>Uy>GuHIbf1@6b6B645@;hZ&~7A16y>lrbBp?!389ca zZoU<}ffxsAOz0 z@7X$^2MoZyjBxLRzJOSM2v*CXH>>^g$VoLD6c_K1j6~xtCtZ!R3NOR(LaA& z8n|&2^43(M2q;q7>f1MMlS?`%*#M{m;6s=NaN;O-SI3LyOPx*v=}I={;4tlXNiz8t zL>$6D`0N3M3kUZhwgUr%R0ky>ZZ<5D|M|qLWxJo>+%hWi{`Dq(Oj{^75pwI~4fnbR zz8V-=#Z^A*agdGznBfq-90yR-O?0Ay=bOrHI6D6CqaOG~fF^i!8l-ncy|mAw9cCwf zMQ<~w6b{p*L}T_v06qYChMT5B6CyXQ)Lo;;zw`T#em}xE=ssMn2|JGr&Q-vgR7}fL zghWZlgJn>4GivxZxH7h(1i{-RCx-YCY=b8WMG>1($C~V362QOE#v`et)tg?J_DeAg%;n)yl(QvuY~I>C_bLUUs6mw<2_U$kWIL^^`ZiNhkr1-P&k&Oca z;E)W3nNmjnw5nwDB+EY<>s*j>=hyzWKKur*L5PIWMRI*W4eU2P=PWAVd0DFb)m~Pz2-mo}jH~jaLkPCJ1&*L+yDQ zARAe5FX-itZf#PETDHT~vrf9kp0N(WzA<=zEiHgwnGf&KshMXE1CKJMU)Zv_BShUW ze!~Q9YpmSD7dlHaNzQ`rog8tv&94H87jP2+Liu{SnH5i+#D_%U+C8hv8YnR58-#e#~(Q~_u=A(>EO)2%_X)1)YB7u@V^v`{?xAnp96ZWRS8)M4H zf?Ya4$8a^o$bieoAErNWo*=4R6iwX2UBk5_G57qQSlUz5$Z$A)mUAAPmJtCWDjVs)$|dao*ffNibje7*6I z*<$qd!qG(4eHO(f`^XG{`kLephmMi6`MuEsyUpWW5#A&rt4hxoBoq=nu+uu$i@kUy zik7Q3n6a+r^R&H}h7U{Ws+l!c%qOxz#tt~#)FwlaLFsb_>VK7ANuE5gT$MK|5GsGk zRv&B2b@BPrPSBg|$ccIlY8oRYN_``mSCJeTT_-swB}!6a6C&&|pN9Tcs2WYvh)Lwa zXeWylYZnsEP0}4Muiwgso5@FHkZY29^Mcs-&z)Pob-s0W4>pguKS%mjRrziX4SM=Y zNipFas#0h>3CMr+Inn4Gf7j_qG%mRDJeY78{Jn@RFz4E4Y!^MaV_pBN^K*b+ z#k-IVQbW=?zRoMEsQYs?cuZZ>G3|pbLd{pBdJq$4sN$csjGhNapS`2u{$w`Mftqn# zsF1+ZUV*w`%n{$<@60fNM%+6GdrWO+`B|d`SufZTdG)TOKgG2 zcxB8v79;O+b+_C~5j*QBq5w#=F)IO%cDiXRkWQ6%mXqHgbWOrYb@`xU8ul>pCyXnH z2isZ+Y<@!NG)zw$Fah+le91k>XiBRbsv>m<;#H4Mxzc;2<6NC=;A6?7YdFTtsSNuL z%v;BmI)=aJIq<2Jh=i~bN6!rkZc@eOn7Z#T` z_VXEQt&uMHkdV5i)st=T6K{!JQkNq)CtYR3)bp^1ds3o;awrwW$ScTT%T^|$wl1IO z|2!vc{9506VC00J1T`Q=0W?ZBDDNOu;vD`o`xgO3iXwn|<}gyIuYqm$uW}fEA6)STfRn`Zw8QZxd0av> zP&!*R^ucedldr^@k-DbQm#RnFI8%3slB1mFXeK-*Fcu6bAc%W5R?(VIne)2497`Ki zECS|ZNBMhe9UqZFsxqB3L~EZz`#pa5^KQjt8*V0fRn?b@*Aawz@yMx zDmAau@m|B~1E>+Xz-=XD^S^edpJN}*i?!24KdhF0wybgbX#h|y#md$I^7G4M{%d&6 z@%0&z%pzLuR@qd!rH_b>={gT{rBz}PZv;<3-HGWRjTHk&oJV0Vyp1^t!2l*+V%>|WR%v6d zc&ls1H*z5N;Yy_U)9SS;QEC?O|5~6vF-HVQ+DgoEcmRN%B7m(~q>~}}Axkl0sgjJu*Khqw2f=R3NJlDeu9WnIz%B1TCu?&)Y^Yc_mU1guz!gQ*QF0d4p+ef2M|1}5(#C6<`sPk(8W3UQ z`cyIwgfQyYI8Tffig85oP6uBd1xJ2csSyE_ayi+Xw9j0#=}q0cUjl27G9HS3dlrePyGsz>Vi`tK@C)VcO>_&)^zp+z9HPUVbUQyQ1T zvXI3GYl9^ekv-c@d}b+QN2rYa9UsMBALr0DjpQM0cob&Ec*&8}Mm9pg5u$u;(k+j6 z=@q@3BFMju5ZEh#ZZD#<^uvjE1jPWHoTw{1Z~eOx{udN`30~LbOmXeq@mN-tkUl@0 z>y~M!3~fp!^*rbl@|GvnqwAv7N<)S>0L}{Bx3FM#$^H{~5s-t9gzL89F}(2jlt%`V z2fkhaOs2!6^D$6(C88LBw9Xnj^d)cuVsJoAg!*qbH(+GP2mwmkf(B10rjhn9=7YO_ z%c}u+S>^3DdDxk+hAxZhJlv{8mMf}fx{b6e&83le!iv_E%4Pjm&0+Z;mD<;tZzl5QyI1opw7+K<5BAz#=4e!eSxfs?9&Dvyq`RiL3|qO<$C2Go+>#Raee47&IN zjxHvh#zj78rvBQ7XI2BM_H@>!DATGRp6-0znpvw!h02-8$oJ% z%;4D#vkDA>jGbLiEc0Unq7BX)q2c~F6o13hOJA_BB+#cLql1^K=w}}#*dQUEYN1=6 zO30uo-=O05jM>%M{o?ue0eEWXe!(jOYGFGNz$pCm*NaoF=X-+O)!P=x|WxS!^TDvLjU^gKI%zw+(G zs$BYCdAHlYi3w&cS3(2KT5hC|ZHdYP3S`xt;XWE6JLHG5U@#ax5cgm} z<}LDtJhRf;fRUyHsnZoNx?2#DLPtQv8(Lu<-(lc`IusD`wZCVOW3BkUDHZCFlEpW8 zvP>i-FUc*D>?qE9q`Gun?{}3+4d^<{k=*-t-@c~I z(I3vhJc4~A8qKZ7&%257Yvd!$)5W~!;U@H^tcd$AP5jNeYTe1<6ng+9{wRbyBQ&*L!k~ef77z?DxvE zKugxJQKAX)%a$HB3WVqCVtTvT!@cw>Zi1Gs6N%EkD(T~a^f0}q|1RGtqxumJCvp;}>1-u0 zqH48qAXb~|90vVWW9|A!W=OjH9%GerkNEmkCpj8${wt#Dw6P~v%j|3gya7*Al50Yb zutJY8IVn{K(PQOBa2pr}ahB8Q0gG{#bLhKABXO9G)(oo)!;J7nxyXR;Lbj6e3*ylDgQYgY@q7h^Z_m*J9v4~BE{&@M!UD8F5&LE`fnj)YR zhAS#yrbN2xal2hI@_(PP-n~n@%!Uz9;oN61Gf+^#W1{%gXF9|6-8WA!7YVCO$701ESrbR$J3YD` zL_f0N5GLL+c^yR`K#M2+lI>xtF*p0G5VBZ8n$Six!;;I3tfeYaj{+_(+VYuiK^Qe- z%&&HIXFQlvuMM5Ma&nD)hW|ng3p*dU1fzLO9DW#ea{ivn@Ct%8@vjnA(96)ip8!3V3 zN2<<0E0sT*)o6gQ_=iQMr8?fLV_&eMPBE=WyNgpfUBz-+NIG(KG4aNXOW6FJa&TZ= zspw%bjHbJJZ=%-u2S8Z>#%8F{o#b>7-pg$kjYw+i4zEA2`HhPJ{PL1~Hh>j#0O)x7 z1IdB|R}V=8j(1VDaSELE&ii7ah^}%k3rJ?(gAcbf`d^|IWU31QV=hnj{=v$qCODKD zfx<5V{sCU#ymTxvImAiqPUw_A#Gm;OD3lMe;+i?5=3}eiC&Ir+#Fy8Mv z>mEn~w2Zrkkv!qPaCsy-LR{|-2p%u8{PcJQMBm??>xnb|e7b$r$FL^g#Aoz_A+PNd zU9QgS<-wBc-~g2+>AO*quk|KmE~E{BK)zhh86(;j?wBn2kFw7A<*mkl(gryM&ce`9 z)#B+^*Kw#H>KzDZvwcFr)u~>dCAkW)5z9a=l^g&;%q#-RRE*X-n~#>5-U6p*X#}U2 z>7)#@gJ>6x(z2lJ_@)YU7-dHTJdt$!rTBOr{Xoi1v07iWLOLN+i5RH8Qu6`+toYOc zpC!P$ebQ@*;`IDGi0bDSB=oGov~~-I=fq*k!G~K7CQZ|T_#awFa+&Mwu>JYf9TvKI zBSx3a!Z1GqQR~Hk%})nzPxS!Kj%a@a2caiDxL^tr=6uEUs(`oYF-)HFZR@FL=>#Sod@Ooe(02Do^#1X?6!5!{O zgW&_K%!LMXC4#&5ddf$u&n@7-5m#PZ1VRK&MO-Gae4D9Zeq^GLct3$6hwe{@551iE z2|ZFVl;HL3ub9JdKqVE!v@LJ?kN8!TCsY_xe+)&ePJk`X*a26XR+NJ0FZ%)pJFr8D zlb}-huPJ_eh>8RsVk8w`4mpr~oKC+R?|N_k`OUYQ8kS4qG(E((xJ2R(A}$#g0;m+l zHBg12(2AuWlvCPkpPZ_wRewEZ@?*G;_@xH(~^$36IKYpTj{kl+{U+=L*J?o z9ef}S@gB()?lgii|Mv}Sp~h2=IB!H8lO0BjUa$PBDW9ZBu(ZGd6;WLokdyU^j6&G$`Xbn>vl)X5m?gfSAaGQmVs(}bGdwaJVH{Tl}J+s2lyIM#RM?3BPh1xCyHi8 z?dd@78;bM?Te!2)EK0L#p=1Gx289b$m{A&P+M&!GKE@>`!L}g}fJi(J@D;Ffyqql? z#?EOnO=+H*`OVK4u@+T)bZEC=eN`>Ef=@^Wr>Gs_$MuH?RGbM-9Z3TiA>$k2;03l) zqtmqUN{~0e=JO@w6qHFkE{!q)w>Jd=Yt^VP`PykkP*u;iP}r)JM2+jzA3nu(j2`S- zhY%S?2zKove^+*Ow75VP9SE-8E1=zOQsdRJk3Tfq{(yRPMc`uDy-%e{bRE}+e&r4Q zq$r9AaM7E6Yg0vY;=Mdx!1WJLr(J-``<{4@m>s7zR`E_TB4;;R*^@q-gV!y05cy-7ilBUnRj6 zIPj$qc}Xhl>|BK9bEC}`jb8eO`C8w^D&y~N&if=9TX?_L-VCOqCxRTICVe)@um`> zcj`lR3MK!h+KvE_`9!hdtH1|n1Zs>nRZy(F10K4MW-U(}pkyIS^a23M9qaiA4)A@+ zrVSo>Z$Y`q^YZarb?SheEW3f^1=igRki*b}RgKXgQm0&t7g^|_kS)pA$tZ%V0*)5l zwxeHWVV z2O?1NEqM?7ohNFwA^QNcdnXlik#fu3x!fJjM&5@}!dhcZZ}m%#ZQm-M#A6J!yasFw z3ZP=2>as{Vh4}Op2t{`()53QRn+27xJKN#+02LsZPO>)Yt=n*+TCYoiQy_HNUyL?k z?#=asE;_5ip$w^2LsTBUm`i#^CSxMyEIn4;a1)??h1+_vKs9PXiGlR<18{UM17V~$ z&o(DqKU=s?)wxbh&b|dW!k5&+F60f_44!N>z$h{vOa&Z_E)2;9d0T?VF3(3MVo(qOB`y^&gB0?=z&nf-DDLgH(8Q z-<5#OiBjIapW*hZ{sgj=ENE8U+K~@c4$;5oG+vtVjx?%w;iZXa9$dlTiqG1}_2`$__??g2&FD1b zt>2*>)TM5$BZ5+1OFXiz5VqG zriFk#fWX||k^d?x-sIltOayCrAykg?RzE;WRqJol+5F_e+(>qGFV@cUH<x;8+dR)%jzU<`Om@R@`Ky#fvTxizXkD{h841kEfl~x<(KR z@Z*Ko#wDA&w3t_5nga}JUsr5_N^}f%5oAo^U6sAM2PS_!iP=R+$O$ba-Di~$1y#45 zuzD%4Tz|{QYi5JY&4+6pumz)#bhG$8t>{^w+Gj1Ki!-G#U_RO|CS!a z`mrp9Q5w)7Zl@oBGhmmyq$aRBc{4P?e6Iifn&~>S-sJJ*C;I;P^hqDufusCMbWixC zzhGT@y2thK$$QsU_d#cgNy*uCPC(_`S@DmrOn<)-2K!J)!A`vEzpgQygDz0>M>EqZ znL@(D-VzB6Q)MgPav~~X;`+1YMV$(??t#6l>vo!`bAQ_HNe zo$eh_xYnz6B7VYUf8+N=;kfGR%F4fWyI1Ce{epJxOsr=hxpZsYe*Vn%C)n-BkE>2V z&6AgvP6^qC8qYn@`jgt=-c$6<-9p!59=ldS@w3 zn5i2aMhU+zzN80xZN)pE5&<%05Ibnj@dtCFBMe|B@3~QC6W=Ic?v7(E;|=P&;r`~$ z+ID@qncV$9K@rsL-;wNLTqNWgw{bS>=VC!67f{4>k4$Tx@b>fgJhuv#w~=9#vozvr z-{{Xksu-$FlOy`8^_|;bL+!M88_q@@0<~ppNoV)vt;lKL9SQI?zZ+!^l_b~^2G_Eo zvN`kuj&6E6RD9#6P(Xg_#J&3rXwyaJ)%UN|iP%5j!Xy|gf!XUvbTN%BQ2#}? zJ+a-jx4nqjb9q|Z;=*&$r9QvC$CuMm?k6|Cz8Fdq(=E$SX~+|ya1gKe)2thm7RUqJ|6_tsV*Vz&zl<;znC^O&pQW}SB%Nz5Lmgil_d z6fOv!Pi+fM{jR|cMtVhD+>p@-JRci^Cz{8{9!5#g)|Ni@E{syafQWqmb^shSh!P?y z{0x3!Hx=S4Y=V9XZllcV10x9wBMc{v(E;CZQ3=IAvInhDmbJ1KbAw;vM?z;7s{kRQ o50s>%4xo47vHwp$IA$+!4l^c=*_)~cu7H2)$~sD=3f3Y22T{P^kN^Mx literal 0 HcmV?d00001 diff --git a/src/test/resources/__snapshots__/dartzee.bean.PresentationDartboardTest/pride.png b/src/test/resources/__snapshots__/dartzee.bean.PresentationDartboardTest/pride.png new file mode 100644 index 0000000000000000000000000000000000000000..8d510e2f9a7e3a4b4636221868ec900a5929550b GIT binary patch literal 27277 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 Date: Thu, 23 Apr 2026 08:37:33 +0100 Subject: [PATCH 10/10] detekt thing --- src/test/kotlin/dartzee/theme/ThemeTest.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/test/kotlin/dartzee/theme/ThemeTest.kt b/src/test/kotlin/dartzee/theme/ThemeTest.kt index c2fa1e49e..0c4fa2665 100644 --- a/src/test/kotlin/dartzee/theme/ThemeTest.kt +++ b/src/test/kotlin/dartzee/theme/ThemeTest.kt @@ -8,7 +8,6 @@ import dartzee.utils.InjectedThings import io.kotest.matchers.shouldBe import java.awt.Color import java.awt.Dimension -import java.net.URL import javax.swing.ImageIcon import javax.swing.JButton import javax.swing.JPanel @@ -82,10 +81,7 @@ class ThemeTest : AbstractTest() { @Test fun `Should make use of custom icon functions`() { val location = javaClass.getResource("/theme/halloween/buttons/playerManagement.png") - val fn = - fun(): URL? { - return location - } + val fn = fun() = location val theme = makeTheme(customIcons = mapOf("/buttons/newGame.png" to fn))