From 78c022dd14fa59d56e31f0a18a56d5166e4872a3 Mon Sep 17 00:00:00 2001 From: UnicornFreedom Date: Sun, 22 Sep 2024 17:25:00 +0200 Subject: [PATCH] Extended item tooltips with additional info --- lib/ocelot-brain | 2 +- .../desktop/inventory/item/ApuItem.scala | 8 +++--- .../desktop/inventory/item/DataCardItem.scala | 10 +++++++- .../item/DiskDriveMountableItem.scala | 13 ++++++++++ .../desktop/inventory/item/EepromItem.scala | 10 ++++++++ .../inventory/item/GraphicsCardItem.scala | 8 +++--- .../desktop/inventory/item/MemoryItem.scala | 11 ++++++++ .../inventory/item/NetworkCardItem.scala | 12 +++++++++ .../inventory/item/OcelotCardItem.scala | 7 ++++++ .../item/SelfDestructingCardItem.scala | 12 +++++++++ .../desktop/inventory/traits/DiskItem.scala | 7 ++++++ .../inventory/traits/GpuLikeItem.scala | 25 +++++++++++++++++++ .../desktop/ui/widget/help/AboutDialog.scala | 2 +- 13 files changed, 116 insertions(+), 11 deletions(-) create mode 100644 src/main/scala/ocelot/desktop/inventory/traits/GpuLikeItem.scala diff --git a/lib/ocelot-brain b/lib/ocelot-brain index d4d88f9..f035220 160000 --- a/lib/ocelot-brain +++ b/lib/ocelot-brain @@ -1 +1 @@ -Subproject commit d4d88f9680ce3b54aaf27acc50a91f1065187f16 +Subproject commit f0352200bd0fc9b7d5e73af910a8f15bac1ae952 diff --git a/src/main/scala/ocelot/desktop/inventory/item/ApuItem.scala b/src/main/scala/ocelot/desktop/inventory/item/ApuItem.scala index 7cb2c66..2f9c09d 100644 --- a/src/main/scala/ocelot/desktop/inventory/item/ApuItem.scala +++ b/src/main/scala/ocelot/desktop/inventory/item/ApuItem.scala @@ -1,14 +1,14 @@ package ocelot.desktop.inventory.item import ocelot.desktop.graphics.IconSource -import ocelot.desktop.inventory.traits.{ComponentItem, CpuLikeItem, PersistableItem} +import ocelot.desktop.inventory.traits.{ComponentItem, CpuLikeItem, GpuLikeItem, PersistableItem} import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} import totoro.ocelot.brain.entity.APU -import totoro.ocelot.brain.entity.traits.{Entity, GenericCPU} +import totoro.ocelot.brain.entity.traits.{Entity, GenericCPU, GenericGPU} import totoro.ocelot.brain.util.Tier.Tier -class ApuItem(val apu: APU) extends Item with ComponentItem with PersistableItem with CpuLikeItem { - override def component: Entity with GenericCPU = apu +class ApuItem(val apu: APU) extends Item with ComponentItem with PersistableItem with CpuLikeItem with GpuLikeItem { + override def component: Entity with GenericCPU with GenericGPU = apu override def factory: ApuItem.Factory = new ApuItem.Factory(apu.tier) } diff --git a/src/main/scala/ocelot/desktop/inventory/item/DataCardItem.scala b/src/main/scala/ocelot/desktop/inventory/item/DataCardItem.scala index 9dc5512..cee2a47 100644 --- a/src/main/scala/ocelot/desktop/inventory/item/DataCardItem.scala +++ b/src/main/scala/ocelot/desktop/inventory/item/DataCardItem.scala @@ -3,12 +3,20 @@ package ocelot.desktop.inventory.item import ocelot.desktop.graphics.IconSource import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem} import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} +import ocelot.desktop.ui.widget.tooltip.ItemTooltip +import totoro.ocelot.brain.Settings import totoro.ocelot.brain.entity.DataCard import totoro.ocelot.brain.entity.traits.{Entity, Environment} import totoro.ocelot.brain.util.Tier import totoro.ocelot.brain.util.Tier.Tier -abstract class DataCardItem extends Item with ComponentItem with PersistableItem with CardItem +abstract class DataCardItem extends Item with ComponentItem with PersistableItem with CardItem { + override def fillTooltip(tooltip: ItemTooltip): Unit = { + super.fillTooltip(tooltip) + tooltip.addLine(s"Soft limit (${Settings.get.dataCardTimeout} sec slowdown): ${Settings.get.dataCardSoftLimit} bytes") + tooltip.addLine(s"Hard limit (fail): ${Settings.get.dataCardHardLimit} bytes") + } +} object DataCardItem { abstract class Factory extends ItemFactory { diff --git a/src/main/scala/ocelot/desktop/inventory/item/DiskDriveMountableItem.scala b/src/main/scala/ocelot/desktop/inventory/item/DiskDriveMountableItem.scala index 701d171..571c13e 100644 --- a/src/main/scala/ocelot/desktop/inventory/item/DiskDriveMountableItem.scala +++ b/src/main/scala/ocelot/desktop/inventory/item/DiskDriveMountableItem.scala @@ -3,7 +3,9 @@ package ocelot.desktop.inventory.item import ocelot.desktop.graphics.IconSource import ocelot.desktop.inventory.traits.RackMountableItem import ocelot.desktop.inventory.{ItemFactory, ItemRecoverer} +import ocelot.desktop.ui.widget.tooltip.ItemTooltip import ocelot.desktop.util.DiskDriveAware +import totoro.ocelot.brain.entity.traits.Floppy import totoro.ocelot.brain.entity.{DiskDriveMountable, FloppyDiskDrive} import totoro.ocelot.brain.util.Tier.Tier @@ -15,6 +17,17 @@ class DiskDriveMountableItem(val diskDriveMountable: DiskDriveMountable) override def component: DiskDriveMountable = diskDriveMountable override def factory: ItemFactory = DiskDriveMountableItem.Factory + + override def fillTooltip(tooltip: ItemTooltip): Unit = { + super.fillTooltip(tooltip) + if (diskDriveMountable != null) { + diskDriveMountable.inventory(0).get match { + case None => tooltip.addLine("Floppy: none") + case Some(floppy: Floppy) if floppy.name.isDefined => tooltip.addLine(s"Floppy: ${floppy.name.get}") + case _ => + } + } + } } object DiskDriveMountableItem { diff --git a/src/main/scala/ocelot/desktop/inventory/item/EepromItem.scala b/src/main/scala/ocelot/desktop/inventory/item/EepromItem.scala index d469204..2e24ffc 100644 --- a/src/main/scala/ocelot/desktop/inventory/item/EepromItem.scala +++ b/src/main/scala/ocelot/desktop/inventory/item/EepromItem.scala @@ -7,6 +7,7 @@ import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} import ocelot.desktop.ui.widget.InputDialog import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuIcon, ContextMenuSubmenu} import ocelot.desktop.ui.widget.tooltip.ItemTooltip +import totoro.ocelot.brain.Settings import totoro.ocelot.brain.entity.EEPROM import totoro.ocelot.brain.entity.traits.{Entity, Environment} import totoro.ocelot.brain.loot.Loot.{EEPROMFactory => LootEepromFactory} @@ -29,6 +30,15 @@ class EepromItem(val eeprom: EEPROM) extends Item with ComponentItem with Persis for (source <- source) { tooltip.addLine(source) } + + if (source.isEmpty && eeprom != null) { + if (eeprom.codeBytes != null) + tooltip.addLine(s"Code: ${eeprom.codeBytes.map(_.length).getOrElse(0)} bytes / ${Settings.get.eepromSize} bytes") + if (eeprom.volatileData != null) + tooltip.addLine(s"Data: ${eeprom.volatileData.length} bytes / ${Settings.get.eepromDataSize} bytes") + if (eeprom.readonly) + tooltip.addLine("Readonly") + } } override def fillRmbMenu(menu: ContextMenu): Unit = { diff --git a/src/main/scala/ocelot/desktop/inventory/item/GraphicsCardItem.scala b/src/main/scala/ocelot/desktop/inventory/item/GraphicsCardItem.scala index 5a8a8e1..075b0f6 100644 --- a/src/main/scala/ocelot/desktop/inventory/item/GraphicsCardItem.scala +++ b/src/main/scala/ocelot/desktop/inventory/item/GraphicsCardItem.scala @@ -1,14 +1,14 @@ package ocelot.desktop.inventory.item import ocelot.desktop.graphics.IconSource -import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem} +import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, GpuLikeItem, PersistableItem} import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} import totoro.ocelot.brain.entity.GraphicsCard -import totoro.ocelot.brain.entity.traits.{Entity, Environment} +import totoro.ocelot.brain.entity.traits.{Entity, GenericGPU} import totoro.ocelot.brain.util.Tier.Tier -class GraphicsCardItem(val gpu: GraphicsCard) extends Item with ComponentItem with PersistableItem with CardItem { - override def component: Entity with Environment = gpu +class GraphicsCardItem(val gpu: GraphicsCard) extends Item with ComponentItem with PersistableItem with CardItem with GpuLikeItem { + override def component: Entity with GenericGPU = gpu override def factory: GraphicsCardItem.Factory = new GraphicsCardItem.Factory(gpu.tier) } diff --git a/src/main/scala/ocelot/desktop/inventory/item/MemoryItem.scala b/src/main/scala/ocelot/desktop/inventory/item/MemoryItem.scala index 42e12d4..2901d92 100644 --- a/src/main/scala/ocelot/desktop/inventory/item/MemoryItem.scala +++ b/src/main/scala/ocelot/desktop/inventory/item/MemoryItem.scala @@ -3,6 +3,7 @@ package ocelot.desktop.inventory.item import ocelot.desktop.graphics.IconSource import ocelot.desktop.inventory.traits.{ComponentItem, PersistableItem} import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} +import ocelot.desktop.ui.widget.tooltip.ItemTooltip import totoro.ocelot.brain.entity.Memory import totoro.ocelot.brain.entity.traits.{Entity, Environment} import totoro.ocelot.brain.util.ExtendedTier.ExtendedTier @@ -12,6 +13,16 @@ class MemoryItem(val memory: Memory) extends Item with ComponentItem with Persis override def component: Entity with Environment = memory override def factory: ItemFactory = new MemoryItem.Factory(memory.memoryTier) + + override def fillTooltip(tooltip: ItemTooltip): Unit = { + super.fillTooltip(tooltip) + if (memory != null) { + tooltip.addLine( + if (memory.amount == Double.PositiveInfinity) "Capacity: infinite" + else s"Capacity: ${memory.amount.toInt} kB" + ) + } + } } object MemoryItem { diff --git a/src/main/scala/ocelot/desktop/inventory/item/NetworkCardItem.scala b/src/main/scala/ocelot/desktop/inventory/item/NetworkCardItem.scala index b35eea6..70156a8 100644 --- a/src/main/scala/ocelot/desktop/inventory/item/NetworkCardItem.scala +++ b/src/main/scala/ocelot/desktop/inventory/item/NetworkCardItem.scala @@ -3,6 +3,7 @@ package ocelot.desktop.inventory.item import ocelot.desktop.graphics.IconSource import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem} import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} +import ocelot.desktop.ui.widget.tooltip.ItemTooltip import totoro.ocelot.brain.entity.NetworkCard import totoro.ocelot.brain.entity.traits.Entity import totoro.ocelot.brain.util.Tier @@ -12,6 +13,17 @@ class NetworkCardItem(val card: NetworkCard) extends Item with ComponentItem wit override def component: Entity with NetworkCard = card override def factory: ItemFactory = NetworkCardItem.Factory + + override def fillTooltip(tooltip: ItemTooltip): Unit = { + super.fillTooltip(tooltip) + if (card != null) { + tooltip.addLine( + if (card.openPorts.isEmpty) s"Open ports: none" + else s"Open ports: ${card.openPorts.mkString(", ")}" + ) + tooltip.addLine(s"Max open ports: ${card.maxOpenPorts}") + } + } } object NetworkCardItem { diff --git a/src/main/scala/ocelot/desktop/inventory/item/OcelotCardItem.scala b/src/main/scala/ocelot/desktop/inventory/item/OcelotCardItem.scala index fe25e64..aba60f2 100644 --- a/src/main/scala/ocelot/desktop/inventory/item/OcelotCardItem.scala +++ b/src/main/scala/ocelot/desktop/inventory/item/OcelotCardItem.scala @@ -8,6 +8,7 @@ import ocelot.desktop.graphics.IconSource import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem} import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry} +import ocelot.desktop.ui.widget.tooltip.ItemTooltip import ocelot.desktop.util.{Logging, OcelotInterfaceLogStorage} import totoro.ocelot.brain.util.Tier import totoro.ocelot.brain.util.Tier.Tier @@ -37,6 +38,12 @@ class OcelotCardItem(val ocelotCard: OcelotCard) } override def factory: ItemFactory = OcelotCardItem.Factory + + private val OcelotSays = Array("meow", ":3", "♥", "meooow", "~(=^–^)", "/ᐠ。ꞈ。ᐟ\\", "=^._.^=", "=’①。①’=") + override def fillTooltip(tooltip: ItemTooltip): Unit = { + super.fillTooltip(tooltip) + tooltip.addLine(OcelotSays(((System.currentTimeMillis() / 5000) % OcelotSays.length).toInt)) + } } object OcelotCardItem { diff --git a/src/main/scala/ocelot/desktop/inventory/item/SelfDestructingCardItem.scala b/src/main/scala/ocelot/desktop/inventory/item/SelfDestructingCardItem.scala index 82261b6..a7524d8 100644 --- a/src/main/scala/ocelot/desktop/inventory/item/SelfDestructingCardItem.scala +++ b/src/main/scala/ocelot/desktop/inventory/item/SelfDestructingCardItem.scala @@ -3,6 +3,7 @@ package ocelot.desktop.inventory.item import ocelot.desktop.graphics.IconSource import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem} import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} +import ocelot.desktop.ui.widget.tooltip.ItemTooltip import totoro.ocelot.brain.entity.SelfDestructingCard import totoro.ocelot.brain.entity.traits.{Entity, Environment} import totoro.ocelot.brain.util.Tier @@ -17,6 +18,17 @@ class SelfDestructingCardItem(val card: SelfDestructingCard) override def component: Entity with Environment = card override def factory: ItemFactory = SelfDestructingCardItem.Factory + + override def fillTooltip(tooltip: ItemTooltip): Unit = { + super.fillTooltip(tooltip) + if (card != null) { + tooltip.addLine( + if (card.remainingTime < 0) "Fuse has not been set" + else if (card.remainingTime == 0) "BOOM!" + else card.remainingTime.toString + ) + } + } } object SelfDestructingCardItem { diff --git a/src/main/scala/ocelot/desktop/inventory/traits/DiskItem.scala b/src/main/scala/ocelot/desktop/inventory/traits/DiskItem.scala index 3e4d1f8..c25a31a 100644 --- a/src/main/scala/ocelot/desktop/inventory/traits/DiskItem.scala +++ b/src/main/scala/ocelot/desktop/inventory/traits/DiskItem.scala @@ -84,6 +84,13 @@ trait DiskItem extends ComponentItem with Windowed[DiskEditWindow] { case _: DiskUnmanaged => "Mode: unmanaged" }) } + + override def fillTooltip(tooltip: ItemTooltip): Unit = { + super.fillTooltip(tooltip) + if (component != null) { + tooltip.addLine(s"Capacity: ${component.capacity / 1024} kB") + } + } } object DiskItem { diff --git a/src/main/scala/ocelot/desktop/inventory/traits/GpuLikeItem.scala b/src/main/scala/ocelot/desktop/inventory/traits/GpuLikeItem.scala new file mode 100644 index 0000000..564d529 --- /dev/null +++ b/src/main/scala/ocelot/desktop/inventory/traits/GpuLikeItem.scala @@ -0,0 +1,25 @@ +package ocelot.desktop.inventory.traits + +import ocelot.desktop.ui.widget.tooltip.ItemTooltip +import totoro.ocelot.brain.Settings +import totoro.ocelot.brain.entity.traits.{Entity, GenericGPU} +import totoro.ocelot.brain.util.ColorDepth + +trait GpuLikeItem extends ComponentItem { + override def component: Entity with GenericGPU + + override def fillTooltip(tooltip: ItemTooltip): Unit = { + super.fillTooltip(tooltip) + if (component != null) { + val resolution = Settings.screenResolutionsByTier(component.tier.id) + tooltip.addLine(s"Max resolution: ${resolution._1}x${resolution._2}") + val depth = Settings.screenDepthsByTier(component.tier.id) match { + case ColorDepth.OneBit => "1 bit" + case ColorDepth.FourBit => "4 bit" + case ColorDepth.EightBit => "8 bit" + } + tooltip.addLine(s"Max color depth: $depth") + tooltip.addLine(s"VRAM: ${component.totalVRAM.toInt}") + } + } +} diff --git a/src/main/scala/ocelot/desktop/ui/widget/help/AboutDialog.scala b/src/main/scala/ocelot/desktop/ui/widget/help/AboutDialog.scala index b2c42e1..63fb078 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/help/AboutDialog.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/help/AboutDialog.scala @@ -8,7 +8,7 @@ import ocelot.desktop.graphics.Graphics import ocelot.desktop.ui.layout.LinearLayout import ocelot.desktop.ui.widget.{Button, Filler, Label, PaddingBox, Widget} import ocelot.desktop.ui.widget.modal.ModalDialog -import ocelot.desktop.ui.widget.tooltip.{LabelTooltip, Tooltip} +import ocelot.desktop.ui.widget.tooltip.LabelTooltip import ocelot.desktop.util.{DrawUtils, Orientation, Spritesheet} import java.awt.Desktop