From 276e66a266d6e18fee9827b0f94f41ea08e8ff7a Mon Sep 17 00:00:00 2001 From: IgorTimofeev Date: Sun, 16 Apr 2023 20:13:17 +0300 Subject: [PATCH] Added OpenFM radio support --- lib/ocelot-brain | 2 +- sprites/nodes/OpenFMRadio.png | Bin 0 -> 370 bytes .../ocelot/desktop/entity/OpenFMRadio.scala | 38 +++++++++++ .../nodes/openfmradio/OpenFMRadioNode.scala | 12 ++++ .../nodes/openfmradio/OpenFMRadioWindow.scala | 64 ++++++++++++++++++ 5 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 sprites/nodes/OpenFMRadio.png create mode 100644 src/main/scala/ocelot/desktop/entity/OpenFMRadio.scala create mode 100644 src/main/scala/ocelot/desktop/node/nodes/openfmradio/OpenFMRadioNode.scala create mode 100644 src/main/scala/ocelot/desktop/node/nodes/openfmradio/OpenFMRadioWindow.scala diff --git a/lib/ocelot-brain b/lib/ocelot-brain index f40c686..bfe67ec 160000 --- a/lib/ocelot-brain +++ b/lib/ocelot-brain @@ -1 +1 @@ -Subproject commit f40c686e2a012807f23662f987b90f3f73df21a0 +Subproject commit bfe67ec9e4f13673f6178e1e29d7781910ef102e diff --git a/sprites/nodes/OpenFMRadio.png b/sprites/nodes/OpenFMRadio.png new file mode 100644 index 0000000000000000000000000000000000000000..842eaeae490c73237fe85533d3f545c91339b227 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!j8!i<;h*8KqrN|d-plmzFem6RtI zr7{#GX6BXX<)xM=nCKbknf>WWz7JG$#nZ(x#KM2-q>H@G20Sh|7bvr+Ok(AVuVGFu z{kreV(q*ewdDtpGp7UNt-5}@owso)nwx&jQY-BNFs+;$`@p_@m)80A8Itq+NYR@bE zE}JBz3U`Ld&} z%lrSAV_QMhAKL$@% KKbLh*2~7a3iG}L` literal 0 HcmV?d00001 diff --git a/src/main/scala/ocelot/desktop/entity/OpenFMRadio.scala b/src/main/scala/ocelot/desktop/entity/OpenFMRadio.scala new file mode 100644 index 0000000..195d425 --- /dev/null +++ b/src/main/scala/ocelot/desktop/entity/OpenFMRadio.scala @@ -0,0 +1,38 @@ +package ocelot.desktop.entity + +import ocelot.desktop.util.WebcamCapture +import totoro.ocelot.brain.Constants +import totoro.ocelot.brain.entity.machine.{Arguments, Context} +import totoro.ocelot.brain.entity.traits.DeviceInfo.{DeviceAttribute, DeviceClass} +import totoro.ocelot.brain.entity.traits.{DeviceInfo, Entity, OpenFMRadio} +import totoro.ocelot.brain.nbt.NBTTagCompound +import totoro.ocelot.brain.workspace.Workspace + +class OpenFMRadio extends Entity with totoro.ocelot.brain.entity.traits.OpenFMRadio with DeviceInfo { + + override def setURL(context: Context, args: Arguments): Array[AnyRef] + + private lazy val deviceInfo: Map[String, String] = Map( + DeviceAttribute.Class -> DeviceClass.Multimedia, + DeviceAttribute.Description -> "OpenFM Radio", + DeviceAttribute.Vendor -> Constants.DeviceInfo.DefaultVendor, + DeviceAttribute.Product -> "cool radio player" + ) + override def getDeviceInfo: Map[String, String] = deviceInfo + + override def load(nbt: NBTTagCompound, workspace: Workspace): Unit = { + super.load(nbt, workspace) + +// if (nbt.hasKey("device")) +// webcamCapture = WebcamCapture.getInstance(nbt.getString("device")) + + + } + + override def save(nbt: NBTTagCompound): Unit = { + super.save(nbt) + +// nbt.setString("device", webcamCapture.name) + + } +} diff --git a/src/main/scala/ocelot/desktop/node/nodes/openfmradio/OpenFMRadioNode.scala b/src/main/scala/ocelot/desktop/node/nodes/openfmradio/OpenFMRadioNode.scala new file mode 100644 index 0000000..793d09d --- /dev/null +++ b/src/main/scala/ocelot/desktop/node/nodes/openfmradio/OpenFMRadioNode.scala @@ -0,0 +1,12 @@ +package ocelot.desktop.node.nodes.openfmradio + +import ocelot.desktop.entity.{Camera, OpenFMRadio} +import ocelot.desktop.node.Node + +class OpenFMRadioNode(val radioEntity: OpenFMRadio) extends Node(radioEntity) { + override def icon: String = "nodes/OpenFMRadio" + + private lazy val currentWindow: Option[OpenFMRadioWindow] = Option(new OpenFMRadioWindow(this)) + + override def window: Option[OpenFMRadioWindow] = currentWindow +} diff --git a/src/main/scala/ocelot/desktop/node/nodes/openfmradio/OpenFMRadioWindow.scala b/src/main/scala/ocelot/desktop/node/nodes/openfmradio/OpenFMRadioWindow.scala new file mode 100644 index 0000000..87f8f41 --- /dev/null +++ b/src/main/scala/ocelot/desktop/node/nodes/openfmradio/OpenFMRadioWindow.scala @@ -0,0 +1,64 @@ +package ocelot.desktop.node.nodes.openfmradio + +import com.github.sarxos.webcam.Webcam +import ocelot.desktop.entity.Camera +import ocelot.desktop.geometry.{Padding2D, Size2D, Vector2D} +import ocelot.desktop.graphics.Graphics +import ocelot.desktop.ui.layout.{Layout, LinearLayout} +import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry} +import ocelot.desktop.ui.widget.window.BasicWindow +import ocelot.desktop.ui.widget._ +import ocelot.desktop.util.{DrawUtils, Orientation, WebcamCapture} + +import scala.jdk.CollectionConverters.CollectionHasAsScala + +class OpenFMRadioWindow(node: OpenFMRadioNode) extends BasicWindow { + def camera: Camera = node.radioEntity + + children :+= new PaddingBox(new Widget { + override protected val layout: Layout = new LinearLayout(this, orientation = Orientation.Vertical) + + val label = new Label { + override def text: String = s"Camera — ${node.labelOrAddress}" + override val isSmall: Boolean = true + } + + children :+= new PaddingBox(label, Padding2D.equal(4)) + children :+= new PaddingBox(new Button { + override def minimumSize: Size2D = Size2D(256, 24) + override def maximumSize: Size2D = Size2D(512, 24) + override def size: Size2D = Size2D(label.size.width - 8, 24) + override def text: String = camera.webcamCapture.name + + override def onClick(): Unit = { + val menu = new ContextMenu + for (webcam <- Webcam.getWebcams().asScala) + menu.addEntry(new ContextMenuEntry(webcam.getName, () => node.radioEntity.webcamCapture = WebcamCapture.getInstance(webcam))) + + root.get.contextMenus.open(menu, Vector2D(position.x, position.y + size.height)) + } + }, Padding2D.equal(8)) + + children :+= new PaddingBox(new Checkbox("Flip image horizontally", + initialValue = camera.flipHorizontally) { + override def onValueChanged(newValue: Boolean): Unit = camera.flipHorizontally = newValue + }, Padding2D.equal(8)) + + children :+= new PaddingBox(new Checkbox("Flip image vertically", + initialValue = camera.flipVertically) { + override def onValueChanged(newValue: Boolean): Unit = camera.flipVertically = newValue + }, Padding2D.equal(8)) + + children :+= new PaddingBox(new Checkbox("Unlimit call budget", + initialValue = camera.directCalls) { + override def onValueChanged(newValue: Boolean): Unit = camera.directCalls = newValue + }, Padding2D.equal(8)) + }, Padding2D.equal(8)) + + override def draw(g: Graphics): Unit = { + beginDraw(g) + DrawUtils.windowWithShadow(g, position.x, position.y, size.width, size.height, 1f, 0.5f) + drawChildren(g) + endDraw(g) + } +}