2025-07-31 18:29:53 +03:00

71 lines
2.4 KiB
Scala

package ocelot.desktop.ui.widget
import ocelot.desktop.ColorScheme
import ocelot.desktop.audio.{ClickSoundSource, SoundSource}
import ocelot.desktop.color.Color
import ocelot.desktop.geometry.Size2D
import ocelot.desktop.graphics.Graphics
import ocelot.desktop.ui.event.handlers.{HoverHandler, MouseHandler}
import ocelot.desktop.ui.event.{ClickEvent, HoverEvent, MouseEvent}
import ocelot.desktop.ui.widget.tooltip.Tooltip
import ocelot.desktop.ui.widget.traits.HoverAnimation
import ocelot.desktop.util.DrawUtils
class Button(tooltip: Option[Tooltip] = None) extends Widget with MouseHandler with HoverHandler with HoverAnimation {
def this(tooltip: Tooltip) = this(Some(tooltip))
protected def colorScheme: ColorScheme = ColorScheme.General
override protected val hoverAnimationColorDefault: Color = colorScheme("ButtonBackground")
override protected val hoverAnimationColorActive: Color = colorScheme("ButtonBackgroundActive")
def text: String = ""
def onClick(): Unit = {}
override protected def receiveClickEvents: Boolean = true
eventHandlers += {
case MouseEvent(MouseEvent.State.Pressed, MouseEvent.Button.Left) if enabled =>
clickSoundSource.press.play()
case ClickEvent(MouseEvent.Button.Left, _) if enabled =>
onClick()
clickSoundSource.release.play()
}
for (tooltip <- tooltip) {
eventHandlers += {
case HoverEvent(HoverEvent.State.Enter) => root.get.tooltipPool.addTooltip(tooltip)
case HoverEvent(HoverEvent.State.Leave) => root.get.tooltipPool.closeTooltip(tooltip)
}
}
override def minimumSize: Size2D = Size2D(24 + text.length * 8, 24)
override def maximumSize: Size2D = minimumSize
override def draw(g: Graphics): Unit = {
val (background, border, foreground) = if (enabled) (
hoverAnimation.color,
colorScheme("ButtonBorder"),
colorScheme("ButtonForeground"),
)
else (
colorScheme("ButtonBackgroundDisabled"),
colorScheme("ButtonBorderDisabled"),
colorScheme("ButtonForegroundDisabled"),
)
g.rect(bounds, background)
DrawUtils.ring(g, position.x, position.y, width, height, 2, border)
g.background = Color.Transparent
g.foreground = foreground
val textWidth = text.iterator.map(g.font.charWidth(_)).sum
g.text(position.x + ((width - textWidth) / 2).round, position.y + 4, text)
}
protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClick
}