2025-08-17 18:43:42 +03:00

66 lines
2.1 KiB
Scala

package ocelot.desktop.node.nodes
import ocelot.desktop.graphics.IconSource
import ocelot.desktop.ui.event.{ClickEvent, MouseEvent}
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuIcon, ContextMenuSubmenu}
import totoro.ocelot.brain.entity.NoteBlock
import totoro.ocelot.brain.event.{EventBus, NoteBlockTriggerEvent}
class NoteBlockNode(val noteBlock: NoteBlock) extends NoteBlockNodeBase(noteBlock) {
override def icon: IconSource = IconSource.Nodes.NoteBlock
override def rotatable: Boolean = false
override def setupContextMenu(menu: ContextMenu, event: ClickEvent): Unit = {
menu.addEntry(new ContextMenuSubmenu("Instrument", Some(ContextMenuIcon(IconSource.Icons.Guitar))) {
{
val maxLen = NoteBlockNode.Instruments.map(_._2.length).max
for ((instrument, name) <- NoteBlockNode.Instruments) {
val dot = if (noteBlock.instrument == instrument) '•' else ' '
addEntry(ContextMenuEntry(name.padTo(maxLen, ' ') + dot) {
noteBlock.instrument = instrument
})
}
}
})
menu.addSeparator()
super.setupContextMenu(menu, event)
}
override def onClick(event: ClickEvent): Unit = {
event match {
case ClickEvent(MouseEvent.Button.Left, _) =>
if (noteBlock != null) {
EventBus.send(NoteBlockTriggerEvent(noteBlock.node.address, noteBlock.instrument, noteBlock.pitch - 1))
}
case _ =>
}
super.onClick(event)
}
}
object NoteBlockNode {
private val Instruments = List(
("bass", "Bass (Wood)"),
("snare", "Snare Drum (Sand)"),
("hat", "Hi-hat (Glass)"),
("basedrum", "Bass Drum (Stone)"),
("bell", "Glockenspiel (Gold)"),
("flute", "Flute (Clay)"),
("chime", "Chimes (Packed Ice)"),
("guitar", "Guitar (Wool)"),
("xylophone", "Xylophone (Bone)"),
("iron_xylophone", "Vibraphone (Iron)"),
("cow_bell", "Cow Bell (Soul Sand)"),
("didgeridoo", "Didgeridoo (Pumpkin)"),
("bit", "Square Wave (Emerald)"),
("banjo", "Banjo (Hay Bale)"),
("pling", "Electric Piano (Glowstone)"),
("harp", "Harp"),
)
}