mirror of
https://gitlab.com/cc-ru/ocelot/ocelot-desktop.git
synced 2025-12-20 02:59:19 +01:00
204 lines
5.7 KiB
Scala
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)
|
|
}
|
|
}
|