ocelot-desktop/src/main/scala/ocelot/desktop/windows/OpenFMRadioWindow.scala
2023-04-18 03:16:52 +03:00

204 lines
5.7 KiB
Scala

package ocelot.desktop.windows
import ocelot.desktop.audio.{SoundSource, SoundSources}
import ocelot.desktop.color.{Color, IntColor}
import ocelot.desktop.entity.OpenFMRadio
import ocelot.desktop.geometry.{Padding2D, Size2D}
import ocelot.desktop.graphics.Graphics
import ocelot.desktop.node.nodes.{ComputerNode, OpenFMRadioNode}
import ocelot.desktop.ui.event.MouseEvent
import ocelot.desktop.ui.layout.{Alignment, Layout, LinearLayout}
import ocelot.desktop.ui.widget._
import ocelot.desktop.ui.widget.tooltip.Tooltip
import ocelot.desktop.ui.widget.window.BasicWindow
import ocelot.desktop.util.animation.UnitAnimation
import ocelot.desktop.util.{DrawUtils, Orientation}
import ocelot.desktop.{ColorScheme, OcelotDesktop}
import totoro.ocelot.brain.entity.Case
import totoro.ocelot.brain.nbt.NBTTagCompound
class OpenFMRadioWindow(radioNode: OpenFMRadioNode) extends BasicWindow {
private val scale = 2f
private def radio: OpenFMRadio = radioNode.openFMRadio
override def minimumSize: Size2D = new Size2D(232 * scale, 105 * scale)
override protected val layout: Layout = new LinearLayout(this, Orientation.Vertical)
// Volume controls
children :+= new PaddingBox(
new Widget {
override protected val layout: Layout = new LinearLayout(
this,
Orientation.Horizontal,
0,
Alignment.Start
)
// Volume up/down buttons
private def addVolumeUpOrDownButton(isUp: Boolean, x: Float): Unit = {
children :+= new PaddingBox(
new IconButton(
s"buttons/OpenFMRadioVolume${if (isUp) "Up" else "Down"}Off",
s"buttons/OpenFMRadioVolume${if (isUp) "Up" else "Down"}On",
sizeMultiplier = scale
) {
override def onPressed(): Unit = {
if (isUp)
radio.volUp()
else
radio.volDown()
}
},
Padding2D(0, 0, 0, x)
)
}
addVolumeUpOrDownButton(false, 0)
// Volume label
children :+= new PaddingBox(
new Label {
override def maximumSize: Size2D = Size2D(20, 20)
override def text: String = (radio.volume * 10).floor.toInt.toString
override def color: Color = Color.White
},
Padding2D(2, 0, 0, 20)
)
addVolumeUpOrDownButton(true, 8)
// Redstone button
children :+= new PaddingBox(
new IconButton(
"buttons/OpenFMRadioRedstoneOff",
"buttons/OpenFMRadioRedstoneOn",
isSwitch = true,
sizeMultiplier = scale
) {
override def isOn: Boolean = radio.isListenRedstone
override def onPressed(): Unit = radio.isListenRedstone = true
override def onReleased(): Unit = radio.isListenRedstone = false
},
Padding2D(0, 0, 0, 128)
)
// Close button
children :+= new PaddingBox(
new IconButton(
"buttons/OpenFMRadioCloseOff",
"buttons/OpenFMRadioCloseOn",
sizeMultiplier = scale
) {
override def onPressed(): Unit = hide()
},
Padding2D(0, 0, 0, 10)
)
},
Padding2D(8, 0, 0, 188)
)
// Url text input
children :+= new PaddingBox(
new TextInput(radio.url.getOrElse("")) {
override def minimumSize: Size2D = Size2D(402, 20)
override def maximumSize: Size2D = Size2D(402, 20)
override def onConfirm(): Unit = radio.url = Option(text)
},
Padding2D(5, 0, 0, 32)
)
// Start/stop button
children :+= new PaddingBox(
new IconButton(
"buttons/OpenFMRadioStartOff",
"buttons/OpenFMRadioStopOn",
isSwitch = true,
sizeMultiplier = scale
) {
override def isOn: Boolean = radio.isPlaying
override def onPressed(): Unit = radio.play()
override def onReleased(): Unit = radio.stop()
},
Padding2D(13, 0, 0, 208)
)
// Color / text titles
children :+= new PaddingBox(
new Widget {
override protected val layout: Layout = new LinearLayout(
this,
Orientation.Horizontal,
0,
Alignment.Start
)
// Color title
children :+= new Label {
override def text: String = "Screen color"
override def color: Color = Color.White
}
// Text title
children :+= new Label {
override def text: String = "Screen text"
override def color: Color = Color.White
}
},
Padding2D(10, 0, 0, 30)
)
// Color / text text inputs
children :+= new PaddingBox(
new Widget {
override protected val layout: Layout = new LinearLayout(
this,
Orientation.Horizontal,
46
)
// Color
children :+= new TextInput(radio.screenColor.color.toHexString.toUpperCase) {
override def minimumSize: Size2D = Size2D(118, 20)
override def maximumSize: Size2D = Size2D(118, 20)
override def onConfirm(): Unit = radio.screenColor = IntColor(Integer.parseInt(text, 16))
override def validator(text: String): Boolean = {
try {
Integer.parseInt(text, 16)
true
}
catch {
case _: Throwable => false
}
}
}
// Text
children :+= new TextInput(radio.screenText) {
override def maximumSize: Size2D = Size2D(240, 20)
override def onConfirm(): Unit = radio.screenText = text
}
},
Padding2D(1, 0, 0, 30)
)
// OpenFM logo
children :+= new PaddingBox(
new Label {
override def text: String = "OpenFM"
override def color: Color = Color.White
},
Padding2D(22, 0, 0, 210)
)
override def draw(g: Graphics): Unit = {
beginDraw(g)
g.sprite("window/OpenFMRadio", position.x, position.y, size.width, size.height)
drawChildren(g)
endDraw(g)
}
}