Extended item tooltips with additional info

This commit is contained in:
UnicornFreedom 2024-09-22 17:25:00 +02:00
parent 6c1d41671a
commit 78c022dd14
13 changed files with 116 additions and 11 deletions

@ -1 +1 @@
Subproject commit d4d88f9680ce3b54aaf27acc50a91f1065187f16 Subproject commit f0352200bd0fc9b7d5e73af910a8f15bac1ae952

View File

@ -1,14 +1,14 @@
package ocelot.desktop.inventory.item package ocelot.desktop.inventory.item
import ocelot.desktop.graphics.IconSource 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 ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
import totoro.ocelot.brain.entity.APU 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 import totoro.ocelot.brain.util.Tier.Tier
class ApuItem(val apu: APU) extends Item with ComponentItem with PersistableItem with CpuLikeItem { class ApuItem(val apu: APU) extends Item with ComponentItem with PersistableItem with CpuLikeItem with GpuLikeItem {
override def component: Entity with GenericCPU = apu override def component: Entity with GenericCPU with GenericGPU = apu
override def factory: ApuItem.Factory = new ApuItem.Factory(apu.tier) override def factory: ApuItem.Factory = new ApuItem.Factory(apu.tier)
} }

View File

@ -3,12 +3,20 @@ package ocelot.desktop.inventory.item
import ocelot.desktop.graphics.IconSource import ocelot.desktop.graphics.IconSource
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem} import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} 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.DataCard
import totoro.ocelot.brain.entity.traits.{Entity, Environment} import totoro.ocelot.brain.entity.traits.{Entity, Environment}
import totoro.ocelot.brain.util.Tier import totoro.ocelot.brain.util.Tier
import totoro.ocelot.brain.util.Tier.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 { object DataCardItem {
abstract class Factory extends ItemFactory { abstract class Factory extends ItemFactory {

View File

@ -3,7 +3,9 @@ package ocelot.desktop.inventory.item
import ocelot.desktop.graphics.IconSource import ocelot.desktop.graphics.IconSource
import ocelot.desktop.inventory.traits.RackMountableItem import ocelot.desktop.inventory.traits.RackMountableItem
import ocelot.desktop.inventory.{ItemFactory, ItemRecoverer} import ocelot.desktop.inventory.{ItemFactory, ItemRecoverer}
import ocelot.desktop.ui.widget.tooltip.ItemTooltip
import ocelot.desktop.util.DiskDriveAware import ocelot.desktop.util.DiskDriveAware
import totoro.ocelot.brain.entity.traits.Floppy
import totoro.ocelot.brain.entity.{DiskDriveMountable, FloppyDiskDrive} import totoro.ocelot.brain.entity.{DiskDriveMountable, FloppyDiskDrive}
import totoro.ocelot.brain.util.Tier.Tier import totoro.ocelot.brain.util.Tier.Tier
@ -15,6 +17,17 @@ class DiskDriveMountableItem(val diskDriveMountable: DiskDriveMountable)
override def component: DiskDriveMountable = diskDriveMountable override def component: DiskDriveMountable = diskDriveMountable
override def factory: ItemFactory = DiskDriveMountableItem.Factory 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 { object DiskDriveMountableItem {

View File

@ -7,6 +7,7 @@ import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
import ocelot.desktop.ui.widget.InputDialog import ocelot.desktop.ui.widget.InputDialog
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuIcon, ContextMenuSubmenu} import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuIcon, ContextMenuSubmenu}
import ocelot.desktop.ui.widget.tooltip.ItemTooltip import ocelot.desktop.ui.widget.tooltip.ItemTooltip
import totoro.ocelot.brain.Settings
import totoro.ocelot.brain.entity.EEPROM import totoro.ocelot.brain.entity.EEPROM
import totoro.ocelot.brain.entity.traits.{Entity, Environment} import totoro.ocelot.brain.entity.traits.{Entity, Environment}
import totoro.ocelot.brain.loot.Loot.{EEPROMFactory => LootEepromFactory} 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) { for (source <- source) {
tooltip.addLine(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 = { override def fillRmbMenu(menu: ContextMenu): Unit = {

View File

@ -1,14 +1,14 @@
package ocelot.desktop.inventory.item package ocelot.desktop.inventory.item
import ocelot.desktop.graphics.IconSource 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 ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
import totoro.ocelot.brain.entity.GraphicsCard 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 import totoro.ocelot.brain.util.Tier.Tier
class GraphicsCardItem(val gpu: GraphicsCard) extends Item with ComponentItem with PersistableItem with CardItem { class GraphicsCardItem(val gpu: GraphicsCard) extends Item with ComponentItem with PersistableItem with CardItem with GpuLikeItem {
override def component: Entity with Environment = gpu override def component: Entity with GenericGPU = gpu
override def factory: GraphicsCardItem.Factory = new GraphicsCardItem.Factory(gpu.tier) override def factory: GraphicsCardItem.Factory = new GraphicsCardItem.Factory(gpu.tier)
} }

View File

@ -3,6 +3,7 @@ package ocelot.desktop.inventory.item
import ocelot.desktop.graphics.IconSource import ocelot.desktop.graphics.IconSource
import ocelot.desktop.inventory.traits.{ComponentItem, PersistableItem} import ocelot.desktop.inventory.traits.{ComponentItem, PersistableItem}
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} 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.Memory
import totoro.ocelot.brain.entity.traits.{Entity, Environment} import totoro.ocelot.brain.entity.traits.{Entity, Environment}
import totoro.ocelot.brain.util.ExtendedTier.ExtendedTier 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 component: Entity with Environment = memory
override def factory: ItemFactory = new MemoryItem.Factory(memory.memoryTier) 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 { object MemoryItem {

View File

@ -3,6 +3,7 @@ package ocelot.desktop.inventory.item
import ocelot.desktop.graphics.IconSource import ocelot.desktop.graphics.IconSource
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem} import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} 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.NetworkCard
import totoro.ocelot.brain.entity.traits.Entity import totoro.ocelot.brain.entity.traits.Entity
import totoro.ocelot.brain.util.Tier 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 component: Entity with NetworkCard = card
override def factory: ItemFactory = NetworkCardItem.Factory 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 { object NetworkCardItem {

View File

@ -8,6 +8,7 @@ import ocelot.desktop.graphics.IconSource
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem} import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry} import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
import ocelot.desktop.ui.widget.tooltip.ItemTooltip
import ocelot.desktop.util.{Logging, OcelotInterfaceLogStorage} import ocelot.desktop.util.{Logging, OcelotInterfaceLogStorage}
import totoro.ocelot.brain.util.Tier import totoro.ocelot.brain.util.Tier
import totoro.ocelot.brain.util.Tier.Tier import totoro.ocelot.brain.util.Tier.Tier
@ -37,6 +38,12 @@ class OcelotCardItem(val ocelotCard: OcelotCard)
} }
override def factory: ItemFactory = OcelotCardItem.Factory 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 { object OcelotCardItem {

View File

@ -3,6 +3,7 @@ package ocelot.desktop.inventory.item
import ocelot.desktop.graphics.IconSource import ocelot.desktop.graphics.IconSource
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem} import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer} 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.SelfDestructingCard
import totoro.ocelot.brain.entity.traits.{Entity, Environment} import totoro.ocelot.brain.entity.traits.{Entity, Environment}
import totoro.ocelot.brain.util.Tier import totoro.ocelot.brain.util.Tier
@ -17,6 +18,17 @@ class SelfDestructingCardItem(val card: SelfDestructingCard)
override def component: Entity with Environment = card override def component: Entity with Environment = card
override def factory: ItemFactory = SelfDestructingCardItem.Factory 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 { object SelfDestructingCardItem {

View File

@ -84,6 +84,13 @@ trait DiskItem extends ComponentItem with Windowed[DiskEditWindow] {
case _: DiskUnmanaged => "Mode: unmanaged" 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 { object DiskItem {

View File

@ -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}")
}
}
}

View File

@ -8,7 +8,7 @@ import ocelot.desktop.graphics.Graphics
import ocelot.desktop.ui.layout.LinearLayout import ocelot.desktop.ui.layout.LinearLayout
import ocelot.desktop.ui.widget.{Button, Filler, Label, PaddingBox, Widget} import ocelot.desktop.ui.widget.{Button, Filler, Label, PaddingBox, Widget}
import ocelot.desktop.ui.widget.modal.ModalDialog 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 ocelot.desktop.util.{DrawUtils, Orientation, Spritesheet}
import java.awt.Desktop import java.awt.Desktop