2025-08-17 17:07:07 +03:00

534 lines
18 KiB
Scala

package ocelot.desktop.graphics
import ocelot.desktop.geometry.Size2D
import ocelot.desktop.ui.widget.modal.notification.NotificationType.NotificationType
import totoro.ocelot.brain.entity.tape.Tape.{Kind => TapeKind}
import totoro.ocelot.brain.util.Direction.{Direction, Down, East, North, South, Up, West}
import totoro.ocelot.brain.util.DyeColor
import totoro.ocelot.brain.util.ExtendedTier.ExtendedTier
import totoro.ocelot.brain.util.Tier.Tier
case class IconSource(path: String, animation: Option[IconSource.Animation] = None)
object IconSource {
case class Animation(frames: Array[(Int, Float)], frameSize: Option[Size2D])
object Animation {
def apply(frames: (Int, Float)*) = new Animation(frames.toArray, None)
def apply(size: Size2D)(frames: (Int, Float)*) = new Animation(frames.toArray, Some(size))
def apply(size: Option[Size2D] = None)(frames: Array[(Int, Float)]) = new Animation(frames, size)
}
class IconScope(directory: String)(implicit parent: Option[IconScope]) {
// this makes nested `IconScope` declarations use `this` as their parent scope.
implicit def scope: Option[IconScope] = Some(this)
private def prefix: String = parent match {
case Some(parent) => s"${parent.prefix}/$directory"
case None => directory
}
protected def get(name: String): IconSource = {
get(name, None)
}
protected def get(name: String, animation: Animation): IconSource = {
get(name, Some(animation))
}
protected def get(name: String, animation: Option[Animation]): IconSource = {
IconSource(s"$prefix/$name", animation)
}
}
private implicit val scope: Option[IconScope] = None
val Empty: IconSource = IconSource("Empty")
val EmptySlot: IconSource = IconSource("EmptySlot")
val ShadowCorner: IconSource = IconSource("ShadowCorner")
val ShadowBorder: IconSource = IconSource("ShadowBorder")
val TabArrow: IconSource = IconSource("TabArrow")
val BarSegment: IconSource = IconSource("BarSegment")
val BackgroundPattern: IconSource = IconSource("BackgroundPattern")
val Logo: IconSource = IconSource("Logo")
val Knob: IconSource = IconSource("Knob")
val KnobLimits: IconSource = IconSource("KnobLimits")
val KnobCenter: IconSource = IconSource("KnobCenter")
val Loading: IconSource = IconSource(
"Loading",
Some(
Animation(Size2D(48, 32))(
(0, 0.7f),
(1, 0.7f),
(2, 0.7f),
(3, 0.7f),
(4, 0.7f),
(5, 0.7f),
(6, 0.7f),
(7, 0.7f),
(8, 0.7f),
(9, 0.7f),
(10, 0.7f),
(11, 0.7f),
(12, 0.7f),
(13, 0.7f),
)
),
)
object Items extends IconScope("items") {
val Cpu: Tier => IconSource = { tier =>
get(s"CPU${tier.id}")
}
val Apu: Tier => IconSource = { tier =>
get(s"APU${tier.id}", Animations.Apu)
}
val GraphicsCard: Tier => IconSource = { tier =>
get(s"GraphicsCard${tier.id}")
}
val NetworkCard: IconSource = get("NetworkCard")
val WirelessNetworkCard: Tier => IconSource = { tier =>
get(s"WirelessNetworkCard${tier.id}")
}
val LinkedCard: IconSource = get("LinkedCard", Animations.LinkedCard)
val InternetCard: IconSource = get("InternetCard", Animations.InternetCard)
val RedstoneCard: Tier => IconSource = { tier =>
get(s"RedstoneCard${tier.id}")
}
val DataCard: Tier => IconSource = { tier =>
get(s"DataCard${tier.id}", Animations.DataCard)
}
val SoundCard: IconSource = get("SoundCard", Animations.DataCard)
val SelfDestructingCard: IconSource =
get("SelfDestructingCard", Animations.SelfDestructingCard)
val OcelotCard: IconSource = get("OcelotCard", Animations.OcelotCard)
val HardDiskDrive: Tier => IconSource = { tier =>
get(s"HardDiskDrive${tier.id}")
}
val Eeprom: IconSource = get("EEPROM")
val FloppyDisk: DyeColor => IconSource = { color =>
get(s"FloppyDisk_${color.name}")
}
val Memory: ExtendedTier => IconSource = { tier =>
get(s"Memory${tier.id}")
}
val Server: Tier => IconSource = { tier =>
get(s"Server${tier.id}")
}
val ComponentBus: Tier => IconSource = { tier =>
get(s"ComponentBus${tier.id}")
}
val Tape: TapeKind => IconSource = {
case TapeKind.Golder => Tape(TapeKind.Gold)
case TapeKind.NetherStarrer => Tape(TapeKind.NetherStar)
case kind => get(s"Tape$kind")
}
val DiskDriveMountable: IconSource = get("DiskDriveMountable")
// noinspection ScalaWeakerAccess
object Animations {
val Apu: Animation =
Animation((0, 3f), (1, 3f), (2, 3f), (3, 3f), (4, 3f), (5, 3f), (4, 3f), (3, 3f), (2, 3f), (1, 3f), (0, 3f))
val LinkedCard: Animation =
Animation((0, 3f), (1, 3f), (2, 3f), (3, 3f), (4, 3f), (5, 3f))
val InternetCard: Animation =
Animation((0, 2f), (1, 7f), (0, 5f), (1, 4f), (0, 7f), (1, 2f), (0, 8f), (1, 9f), (0, 6f), (1, 4f))
val DataCard: Animation = Animation((0, 4f), (1, 4f), (2, 4f), (3, 4f), (4, 4f), (5, 4f), (6, 4f), (7, 4f))
val SelfDestructingCard: Animation = Animation((0, 4f), (1, 4f))
val OcelotCard: Animation =
Animation((0, 12f), (1, 4f), (2, 4f), (3, 4f), (4, 5f), (5, 6f), (0, 9f), (6, 4f), (7, 3f))
}
}
object Icons extends IconScope("icons") {
val Card: IconSource = get("Card")
val Cpu: IconSource = get("CPU")
val Hdd: IconSource = get("HDD")
val Eeprom: IconSource = get("EEPROM")
val Floppy: IconSource = get("Floppy")
val Memory: IconSource = get("Memory")
val Server: IconSource = get("Server")
val ComponentBus: IconSource = get("ComponentBus")
val Tier: Tier => IconSource = { tier =>
get(s"Tier${tier.id}")
}
val SideNone: IconSource = get("SideNone")
val SideAny: IconSource = get("SideAny")
val SideUndefined: IconSource = get("SideUndefined")
val Side: Direction => IconSource = {
case Down => get("SideDown")
case Up => get("SideUp")
case North => get("SideNorth")
case South => get("SideSouth")
case West => get("SideWest")
case East => get("SideEast")
case _ => SideUndefined
}
val Notification: NotificationType => IconSource = { notificationType =>
get(s"Notification$notificationType")
}
val NA: IconSource = get("NA")
val SettingsKeymap: IconSource = get("SettingsKeymap")
val SettingsSystem: IconSource = get("SettingsSystem")
val SettingsSound: IconSource = get("SettingsSound")
val SettingsUI: IconSource = get("SettingsUI")
val Delete: IconSource = get("Delete")
val Label: IconSource = get("Label")
val Copy: IconSource = get("Copy")
val AspectRatio: IconSource = get("AspectRatio")
val Eject: IconSource = get("Eject")
val Restart: IconSource = get("Restart")
val Edit: IconSource = get("Edit")
val Folder: IconSource = get("Folder")
val FolderSlash: IconSource = get("FolderSlash")
val Code: IconSource = get("Code")
val File: IconSource = get("File")
val Link: IconSource = get("Link")
val LinkSlash: IconSource = get("LinkSlash")
val Power: IconSource = get("Power")
val Save: IconSource = get("Save")
val SaveAs: IconSource = get("SaveAs")
val Plus: IconSource = get("Plus")
val Cross: IconSource = get("Cross")
val Microchip: IconSource = get("Microchip")
val Antenna: IconSource = get("Antenna")
val Window: IconSource = get("Window")
val Tiers: IconSource = get("Tiers")
val LinesHorizontal: IconSource = get("LinesHorizontal")
val ArrowRight: IconSource = get("ArrowRight")
val Book: IconSource = get("Book")
val Help: IconSource = get("Help")
val Ocelot: IconSource = get("Ocelot")
val Guitar: IconSource = get("Guitar")
val Keyboard: IconSource = get("Keyboard")
val KeyboardOff: IconSource = get("KeyboardOff")
val ButtonRandomize: IconSource = get("ButtonRandomize")
val ButtonClipboard: IconSource = get("ButtonClipboard")
val ButtonCheck: IconSource = get("ButtonCheck")
val Home: IconSource = get("Home")
val Pin: IconSource = get("Pin")
val Unpin: IconSource = get("Unpin")
val Close: IconSource = get("Close")
val Grid: IconSource = get("Grid")
val GridOff: IconSource = get("GridOff")
val LMB: IconSource = get("LMB")
val RMB: IconSource = get("RMB")
val DragLMB: IconSource = get("DragLMB")
val DragRMB: IconSource = get("DragRMB")
val WireArrowLeft: IconSource = get("WireArrowLeft")
val WireArrowRight: IconSource = get("WireArrowRight")
val WaveSine: IconSource = get("WaveSine")
val WaveTriangle: IconSource = get("WaveTriangle")
val WaveSawtooth: IconSource = get("WaveSawtooth")
val WaveSquare: IconSource = get("WaveSquare")
val WaveNoise: IconSource = get("WaveNoise")
val WaveLFSR: IconSource = get("WaveLFSR")
}
object Nodes extends IconScope("nodes") {
val NewNode: IconSource = get("NewNode")
val Cable: IconSource = get("Cable")
val Camera: IconSource = get("Camera")
val Chest: IconSource = get("Chest")
val HologramProjector: Tier => IconSource = { tier =>
get(s"HologramProjector${tier.id}")
}
val IronNoteBlock: IconSource = get("IronNoteBlock")
val NoteBlock: IconSource = get("NoteBlock")
val OpenFMRadio: IconSource = get("OpenFMRadio")
val Relay: IconSource = get("Relay")
val TapeDrive: IconSource = get("TapeDrive")
val Lamp: IconSource = get("Lamp")
val LampFrame: IconSource = get("LampFrame")
val LampGlow: IconSource = get("LampGlow")
object Computer extends IconScope("computer") with PowerIconSource with DiskActivityIconSource {
val Default: IconSource = get("Default")
}
object DiskDrive extends IconScope("disk-drive") with DiskActivityIconSource with FloppyDriveIconSource {
val Default: IconSource = get("Default")
}
object Microcontroller extends IconScope("microcontroller") with PowerIconSource {
val Default: IconSource = get("Default")
}
object OcelotBlock extends IconScope("ocelot-block") {
val Default: IconSource = get(
"Default",
Some(Animation(Size2D(16, 16))((0, 30f), (1, 5f), (2, 2f), (0, 20f), (3, 3f), (4, 2f))),
)
val Rx: IconSource = get("Rx")
val Tx: IconSource = get("Tx")
}
object Rack extends IconScope("rack") {
val Empty: IconSource = get("Empty")
val Default: IconSource = get("Default")
val Server: Array[Server] = Array.tabulate(4)(new Server(_))
val Drive: Array[Drive] = Array.tabulate(4)(new Drive(_))
class Server(val slot: Int)
extends IconScope(s"server/$slot")
with PowerIconSource
with DiskActivityIconSource
with NetworkActivityIconSource {
val Default: IconSource = get("Default")
}
class Drive(val slot: Int)
extends IconScope(s"drive/$slot")
with DiskActivityIconSource
with FloppyDriveIconSource {
val Default: IconSource = get("Default")
}
}
object Raid extends IconScope("raid") {
val Default: IconSource = get("Default")
val Drive: Array[Drive] = Array.tabulate(3)(new Drive(_))
class Drive(val slot: Int) extends IconScope(slot.toString) with DiskActivityIconSource {
val Error: IconSource = get("Error")
}
}
object Screen extends IconScope("screen") {
val Standalone: IconSource = get("Standalone")
val PowerOnOverlay: IconSource = get("PowerOnOverlay")
val ColumnTop: IconSource = get("ColumnTop")
val ColumnMiddle: IconSource = get("ColumnMiddle")
val ColumnBottom: IconSource = get("ColumnBottom")
val RowLeft: IconSource = get("RowLeft")
val RowMiddle: IconSource = get("RowMiddle")
val RowRight: IconSource = get("RowRight")
val TopLeft: IconSource = get("TopLeft")
val TopMiddle: IconSource = get("TopMiddle")
val TopRight: IconSource = get("TopRight")
val MiddleLeft: IconSource = get("MiddleLeft")
val Middle: IconSource = get("Middle")
val MiddleRight: IconSource = get("MiddleRight")
val BottomLeft: IconSource = get("BottomLeft")
val BottomMiddle: IconSource = get("BottomMiddle")
val BottomRight: IconSource = get("BottomRight")
}
object Holidays extends IconScope("holidays") {
val Christmas: IconSource = get("Christmas")
val Valentines: IconSource = get("Valentines")
val Halloween: IconSource = get("Halloween")
}
}
trait PowerIconSource extends IconScope {
val On: IconSource = get("On")
val Error: IconSource = get("Error")
}
trait DiskActivityIconSource extends IconScope {
val DiskActivity: IconSource = get("DiskActivity")
}
trait NetworkActivityIconSource extends IconScope {
val NetworkActivity: IconSource = get("NetworkActivity")
}
trait FloppyDriveIconSource extends IconScope {
val Floppy: IconSource = get("Floppy")
}
object Screen extends IconScope("screen") {
val InnerCornerTL: IconSource = get("InnerCornerTL")
val InnerCornerTR: IconSource = get("InnerCornerTR")
val InnerCornerBL: IconSource = get("InnerCornerBL")
val InnerCornerBR: IconSource = get("InnerCornerBR")
val OuterCornerTL: IconSource = get("OuterCornerTL")
val OuterCornerTR: IconSource = get("OuterCornerTR")
val OuterCornerBL: IconSource = get("OuterCornerBL")
val OuterCornerBR: IconSource = get("OuterCornerBR")
val InnerBorderT: IconSource = get("InnerBorderT")
val OuterBorderT: IconSource = get("OuterBorderT")
val InnerBorderB: IconSource = get("InnerBorderB")
}
object Particles extends IconScope("particles") {
val Note: IconSource = get("Note")
val Smoke: IconSource = get("Smoke")
}
object Buttons extends IconScope("buttons") {
val BottomDrawerOpen: IconSource = get("BottomDrawerOpen")
val BottomDrawerClose: IconSource = get("BottomDrawerClose")
val PowerOff: IconSource = get("PowerOff")
val PowerOn: IconSource = get("PowerOn")
val OpenFMRadioVolumeOff: Boolean => IconSource = { isUp =>
get(s"OpenFMRadioVolume${if (isUp) "Up" else "Down"}Off")
}
val OpenFMRadioVolumeOn: Boolean => IconSource = { isUp =>
get(s"OpenFMRadioVolume${if (isUp) "Up" else "Down"}On")
}
val OpenFMRadioRedstoneOff: IconSource = get("OpenFMRadioRedstoneOff")
val OpenFMRadioRedstoneOn: IconSource = get("OpenFMRadioRedstoneOn")
val OpenFMRadioCloseOff: IconSource = get("OpenFMRadioCloseOff")
val OpenFMRadioCloseOn: IconSource = get("OpenFMRadioCloseOn")
val OpenFMRadioStartOff: IconSource = get("OpenFMRadioStartOff")
val OpenFMRadioStopOn: IconSource = get("OpenFMRadioStopOn")
val RackRelayOff: IconSource = get("RackRelayOff")
val RackRelayOn: IconSource = get("RackRelayOn")
}
object Window extends IconScope("window") {
val CornerTL: IconSource = get("CornerTL")
val CornerTR: IconSource = get("CornerTR")
val CornerBL: IconSource = get("CornerBL")
val CornerBR: IconSource = get("CornerBR")
val BorderLight: IconSource = get("BorderLight")
val BorderDark: IconSource = get("BorderDark")
object Tape extends IconScope("tape") {
abstract class TapeButtonIconSource private[Tape] (sprite: String) {
val Released: IconSource = get(sprite)
val Pressed: IconSource = get(s"${sprite}Pressed")
}
object Back extends TapeButtonIconSource("Back")
object Play extends TapeButtonIconSource("Play")
object Stop extends TapeButtonIconSource("Stop")
object Forward extends TapeButtonIconSource("Forward")
val Screen: IconSource = get("Screen")
}
object Case extends IconScope("case") {
val Motherboard: IconSource = get("Motherboard")
}
object Rack extends IconScope("rack") {
val Motherboard: IconSource = get("Motherboard")
val Lines: IconSource = get("Lines")
trait DirectionIconSource {
protected def iconPrefix: String
val DirectionIcon: Direction => IconSource = { direction =>
get(s"$iconPrefix${direction.side.capitalize}")
}
}
trait ConnectorIconSource {
protected def iconPrefix: String
val Connector: IconSource = get(s"${iconPrefix}Connector")
}
object Side extends DirectionIconSource with ConnectorIconSource {
override protected def iconPrefix: String = "Side"
}
object Network extends DirectionIconSource with ConnectorIconSource {
override protected def iconPrefix: String = "Network"
}
object Node extends DirectionIconSource {
override protected def iconPrefix: String = "Node"
}
}
object Raid extends IconScope("raid") {
val Slots: IconSource = get("Slots")
}
val OpenFMRadio: IconSource = get("OpenFMRadio")
}
object Panel extends IconScope("panel") {
val CornerTL: IconSource = get("CornerTL")
val CornerTR: IconSource = get("CornerTR")
val CornerBL: IconSource = get("CornerBL")
val CornerBR: IconSource = get("CornerBR")
val BorderT: IconSource = get("BorderT")
val BorderB: IconSource = get("BorderB")
val BorderL: IconSource = get("BorderL")
val BorderR: IconSource = get("BorderR")
val Fill: IconSource = get("Fill")
}
object LightPanel extends IconScope("light-panel") {
val CornerTL: IconSource = get("CornerTL")
val CornerTR: IconSource = get("CornerTR")
val CornerBL: IconSource = get("CornerBL")
val CornerBR: IconSource = get("CornerBR")
val BorderT: IconSource = get("BorderT")
val BorderB: IconSource = get("BorderB")
val BorderL: IconSource = get("BorderL")
val BorderR: IconSource = get("BorderR")
val Fill: IconSource = get("Fill")
val Vent: IconSource = get("Vent")
val BookmarkLeft: IconSource = get("BookmarkLeft")
val BookmarkRight: IconSource = get("BookmarkRight")
}
}