From 019bbfae14ee5a46cbdd209f494f8878234ad2be Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Tue, 21 Jul 2026 22:22:12 +0600 Subject: [PATCH] feat: add hover effect to menu items in System Tray for improved user experience --- .../core/systemtray/SystemTrayService.kt | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/composeApp/src/jvmMain/kotlin/dev/krtirtho/spotube/core/systemtray/SystemTrayService.kt b/composeApp/src/jvmMain/kotlin/dev/krtirtho/spotube/core/systemtray/SystemTrayService.kt index 524195a4..064929e0 100644 --- a/composeApp/src/jvmMain/kotlin/dev/krtirtho/spotube/core/systemtray/SystemTrayService.kt +++ b/composeApp/src/jvmMain/kotlin/dev/krtirtho/spotube/core/systemtray/SystemTrayService.kt @@ -217,6 +217,23 @@ class SystemTrayService( val loopNone = javax.swing.JRadioButtonMenuItem("Loop: OFF", state.loopState == LoopState.NONE) val loopOne = javax.swing.JRadioButtonMenuItem("Loop: ONE", state.loopState == LoopState.ONE) val loopAll = javax.swing.JRadioButtonMenuItem("Loop: ALL", state.loopState == LoopState.ALL) + + val hoverBackground = UIManager.getColor("MenuItem.selectionBackground") ?: Color(75, 110, 175) + + listOf(loopNone, loopOne, loopAll).forEach { item -> + item.isOpaque = true + val normalBackground = item.background + item.addMouseListener(object : MouseAdapter() { + override fun mouseEntered(e: MouseEvent) { + item.background = hoverBackground + } + + override fun mouseExited(e: MouseEvent) { + item.background = normalBackground + } + }) + } + loopGroup.add(loopNone) loopGroup.add(loopOne) loopGroup.add(loopAll) @@ -318,15 +335,47 @@ class SystemTrayService( private fun createMenuItem(label: String, enabled: Boolean = true, action: () -> Unit): JMenuItem { return JMenuItem(label).apply { isEnabled = enabled + isOpaque = true maximumSize = Dimension(Int.MAX_VALUE, preferredSize.height) addActionListener { action() } + + val normalBackground = background + val hoverBackground = UIManager.getColor("MenuItem.selectionBackground") ?: Color(75, 110, 175) + + addMouseListener(object : MouseAdapter() { + override fun mouseEntered(e: MouseEvent) { + if (isEnabled) { + background = hoverBackground + } + } + + override fun mouseExited(e: MouseEvent) { + background = normalBackground + } + }) } } private fun createCheckBoxMenuItem(label: String, selected: Boolean, action: () -> Unit): JCheckBoxMenuItem { return JCheckBoxMenuItem(label, selected).apply { + isOpaque = true maximumSize = Dimension(Int.MAX_VALUE, preferredSize.height) addActionListener { action() } + + val normalBackground = background + val hoverBackground = UIManager.getColor("MenuItem.selectionBackground") ?: Color(75, 110, 175) + + addMouseListener(object : MouseAdapter() { + override fun mouseEntered(e: MouseEvent) { + if (isEnabled) { + background = hoverBackground + } + } + + override fun mouseExited(e: MouseEvent) { + background = normalBackground + } + }) } }