mirror of
https://gitlab.com/cc-ru/ocelot/ocelot-desktop.git
synced 2025-12-20 02:59:19 +01:00
Merge branch 'feature/player-nicknames' into 'develop'
Allow to change player/user name See merge request cc-ru/ocelot/ocelot-desktop!18
This commit is contained in:
commit
3ccb68633e
@ -3,7 +3,7 @@ package ocelot.desktop
|
|||||||
import li.flor.nativejfilechooser.NativeJFileChooser
|
import li.flor.nativejfilechooser.NativeJFileChooser
|
||||||
import ocelot.desktop.audio.{Audio, SoundSource}
|
import ocelot.desktop.audio.{Audio, SoundSource}
|
||||||
import ocelot.desktop.ui.UiHandler
|
import ocelot.desktop.ui.UiHandler
|
||||||
import ocelot.desktop.ui.widget.{NotificationDialog, ExitConfirmationDialog, RootWidget, SettingsDialog}
|
import ocelot.desktop.ui.widget.{AddPlayerDialog, ExitConfirmationDialog, NotificationDialog, RootWidget, SettingsDialog}
|
||||||
import ocelot.desktop.util.FileUtils.getOcelotConfigDirectory
|
import ocelot.desktop.util.FileUtils.getOcelotConfigDirectory
|
||||||
import ocelot.desktop.util._
|
import ocelot.desktop.util._
|
||||||
import org.apache.commons.io.FileUtils
|
import org.apache.commons.io.FileUtils
|
||||||
@ -11,19 +11,23 @@ import org.apache.logging.log4j.LogManager
|
|||||||
import totoro.ocelot.brain.Ocelot
|
import totoro.ocelot.brain.Ocelot
|
||||||
import totoro.ocelot.brain.event.FileSystemActivityType.Floppy
|
import totoro.ocelot.brain.event.FileSystemActivityType.Floppy
|
||||||
import totoro.ocelot.brain.event._
|
import totoro.ocelot.brain.event._
|
||||||
import totoro.ocelot.brain.nbt.{CompressedStreamTools, NBTTagCompound}
|
import totoro.ocelot.brain.nbt.ExtendedNBT.{extendNBTTagCompound, extendNBTTagList}
|
||||||
|
import totoro.ocelot.brain.nbt.{CompressedStreamTools, NBT, NBTTagCompound, NBTTagString}
|
||||||
|
import totoro.ocelot.brain.user.User
|
||||||
import totoro.ocelot.brain.workspace.Workspace
|
import totoro.ocelot.brain.workspace.Workspace
|
||||||
|
|
||||||
import java.io._
|
import java.io._
|
||||||
import java.nio.file.{Files, Path, Paths}
|
import java.nio.file.{Files, Path, Paths}
|
||||||
import java.util.concurrent.locks.{Lock, ReentrantLock}
|
import java.util.concurrent.locks.{Lock, ReentrantLock}
|
||||||
import javax.swing.JFileChooser
|
import javax.swing.JFileChooser
|
||||||
|
import scala.collection.mutable.ArrayBuffer
|
||||||
import scala.io.Source
|
import scala.io.Source
|
||||||
import scala.jdk.CollectionConverters._
|
import scala.jdk.CollectionConverters._
|
||||||
import scala.util.Random
|
import scala.util.Random
|
||||||
|
|
||||||
object OcelotDesktop extends Logging {
|
object OcelotDesktop extends Logging {
|
||||||
var root: RootWidget = _
|
var root: RootWidget = _
|
||||||
|
val players: ArrayBuffer[User] = ArrayBuffer(User("myself"))
|
||||||
val tpsCounter = new FPSCalculator
|
val tpsCounter = new FPSCalculator
|
||||||
val ticker = new Ticker
|
val ticker = new Ticker
|
||||||
|
|
||||||
@ -109,6 +113,7 @@ object OcelotDesktop extends Logging {
|
|||||||
val frontendNBT = new NBTTagCompound
|
val frontendNBT = new NBTTagCompound
|
||||||
workspace.save(backendNBT)
|
workspace.save(backendNBT)
|
||||||
root.workspaceView.save(frontendNBT)
|
root.workspaceView.save(frontendNBT)
|
||||||
|
frontendNBT.setNewTagList("players", players.map(player => new NBTTagString(player.nickname)))
|
||||||
nbt.setTag("back", backendNBT)
|
nbt.setTag("back", backendNBT)
|
||||||
nbt.setTag("front", frontendNBT)
|
nbt.setTag("front", frontendNBT)
|
||||||
})
|
})
|
||||||
@ -116,9 +121,12 @@ object OcelotDesktop extends Logging {
|
|||||||
private def loadWorld(nbt: NBTTagCompound): Unit = withTickLockAcquired(() => {
|
private def loadWorld(nbt: NBTTagCompound): Unit = withTickLockAcquired(() => {
|
||||||
val backendNBT = nbt.getCompoundTag("back")
|
val backendNBT = nbt.getCompoundTag("back")
|
||||||
val frontendNBT = nbt.getCompoundTag("front")
|
val frontendNBT = nbt.getCompoundTag("front")
|
||||||
|
|
||||||
workspace.load(backendNBT)
|
workspace.load(backendNBT)
|
||||||
root.workspaceView.load(frontendNBT)
|
root.workspaceView.load(frontendNBT)
|
||||||
|
if (frontendNBT.hasKey("players")) {
|
||||||
|
players.clear()
|
||||||
|
players.addAll(frontendNBT.getTagList("players", NBT.TAG_STRING).map((player: NBTTagString) => User(player.getString)))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
private var savePath: Option[Path] = None
|
private var savePath: Option[Path] = None
|
||||||
@ -218,6 +226,29 @@ object OcelotDesktop extends Logging {
|
|||||||
}).start()
|
}).start()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def addPlayerDialog(): Unit = {
|
||||||
|
UiHandler.root.modalDialogPool.pushDialog(new AddPlayerDialog())
|
||||||
|
}
|
||||||
|
|
||||||
|
def player: User = if (players.nonEmpty) players.head else User("myself")
|
||||||
|
|
||||||
|
def selectPlayer(name: String): Unit = {
|
||||||
|
players.indexWhere(_.nickname == name) match {
|
||||||
|
case -1 => players.prepend(User(name))
|
||||||
|
case i =>
|
||||||
|
val player = players(i)
|
||||||
|
players.remove(i)
|
||||||
|
players.prepend(player)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def removePlayer(name: String): Unit = {
|
||||||
|
players.indexWhere(_.nickname == name) match {
|
||||||
|
case -1 =>
|
||||||
|
case i => players.remove(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
def settings(): Unit = {
|
def settings(): Unit = {
|
||||||
UiHandler.root.modalDialogPool.pushDialog(new SettingsDialog())
|
UiHandler.root.modalDialogPool.pushDialog(new SettingsDialog())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,6 +19,7 @@ class SetLabelDialog(node: Node) extends ModalDialog {
|
|||||||
override def onInput(text: String): Unit = {
|
override def onInput(text: String): Unit = {
|
||||||
node.label = if (text.isEmpty) None else Some(text)
|
node.label = if (text.isEmpty) None else Some(text)
|
||||||
}
|
}
|
||||||
|
override def onConfirm(): Unit = close()
|
||||||
}, Padding2D(bottom = 8))
|
}, Padding2D(bottom = 8))
|
||||||
|
|
||||||
children :+= new Widget {
|
children :+= new Widget {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
package ocelot.desktop.node.nodes
|
package ocelot.desktop.node.nodes
|
||||||
|
|
||||||
import ocelot.desktop.ColorScheme
|
import ocelot.desktop.{ColorScheme, OcelotDesktop}
|
||||||
import ocelot.desktop.color.{IntColor, RGBAColor}
|
import ocelot.desktop.color.{IntColor, RGBAColor}
|
||||||
import ocelot.desktop.geometry.{Rect2D, Size2D, Vector2D}
|
import ocelot.desktop.geometry.{Rect2D, Size2D, Vector2D}
|
||||||
import ocelot.desktop.graphics.Graphics
|
import ocelot.desktop.graphics.Graphics
|
||||||
@ -42,13 +42,13 @@ class ScreenWindow(screenNode: ScreenNode) extends BasicWindow with Logging {
|
|||||||
case event: KeyEvent if shouldHandleKeys =>
|
case event: KeyEvent if shouldHandleKeys =>
|
||||||
event.state match {
|
event.state match {
|
||||||
case KeyEvent.State.Press | KeyEvent.State.Repeat =>
|
case KeyEvent.State.Press | KeyEvent.State.Repeat =>
|
||||||
screen.keyDown(event.char, event.code, User("myself"))
|
screen.keyDown(event.char, event.code, OcelotDesktop.player)
|
||||||
|
|
||||||
// note: in OpenComputers, key_down signal is fired __before__ clipboard signal
|
// note: in OpenComputers, key_down signal is fired __before__ clipboard signal
|
||||||
if (event.code == Keyboard.KEY_INSERT)
|
if (event.code == Keyboard.KEY_INSERT)
|
||||||
screen.clipboard(UiHandler.clipboard, User("myself"))
|
screen.clipboard(UiHandler.clipboard, OcelotDesktop.player)
|
||||||
case KeyEvent.State.Release =>
|
case KeyEvent.State.Release =>
|
||||||
screen.keyUp(event.char, event.code, User("myself"))
|
screen.keyUp(event.char, event.code, OcelotDesktop.player)
|
||||||
}
|
}
|
||||||
|
|
||||||
case event: MouseEvent if shouldHandleKeys =>
|
case event: MouseEvent if shouldHandleKeys =>
|
||||||
@ -60,15 +60,15 @@ class ScreenWindow(screenNode: ScreenNode) extends BasicWindow with Logging {
|
|||||||
|
|
||||||
event.state match {
|
event.state match {
|
||||||
case MouseEvent.State.Press if inside && screenNode.screen.tier > Tier.One =>
|
case MouseEvent.State.Press if inside && screenNode.screen.tier > Tier.One =>
|
||||||
screen.mouseDown(pos.x, pos.y, event.button.id, User("myself"))
|
screen.mouseDown(pos.x, pos.y, event.button.id, OcelotDesktop.player)
|
||||||
sentTouchEvent = true
|
sentTouchEvent = true
|
||||||
|
|
||||||
case MouseEvent.State.Release =>
|
case MouseEvent.State.Release =>
|
||||||
if (event.button == MouseEvent.Button.Middle && inside)
|
if (event.button == MouseEvent.Button.Middle && inside)
|
||||||
screen.clipboard(UiHandler.clipboard, User("myself"))
|
screen.clipboard(UiHandler.clipboard, OcelotDesktop.player)
|
||||||
|
|
||||||
if (sentTouchEvent) {
|
if (sentTouchEvent) {
|
||||||
screen.mouseUp(lastMousePos.x, lastMousePos.y, event.button.id, User("myself"))
|
screen.mouseUp(lastMousePos.x, lastMousePos.y, event.button.id, OcelotDesktop.player)
|
||||||
sentTouchEvent = false
|
sentTouchEvent = false
|
||||||
} else if (closeButtonBounds.contains(UiHandler.mousePosition)) {
|
} else if (closeButtonBounds.contains(UiHandler.mousePosition)) {
|
||||||
hide()
|
hide()
|
||||||
@ -78,7 +78,7 @@ class ScreenWindow(screenNode: ScreenNode) extends BasicWindow with Logging {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case event: ScrollEvent if shouldHandleKeys && screenNode.screen.tier > Tier.One =>
|
case event: ScrollEvent if shouldHandleKeys && screenNode.screen.tier > Tier.One =>
|
||||||
screen.mouseScroll(lastMousePos.x, lastMousePos.y, event.offset, User("myself"))
|
screen.mouseScroll(lastMousePos.x, lastMousePos.y, event.offset, OcelotDesktop.player)
|
||||||
|
|
||||||
case ev@DragEvent(DragEvent.State.Start, MouseEvent.Button.Left, _) =>
|
case ev@DragEvent(DragEvent.State.Start, MouseEvent.Button.Left, _) =>
|
||||||
if (scaleDragRegion.contains(ev.start)) {
|
if (scaleDragRegion.contains(ev.start)) {
|
||||||
@ -176,7 +176,7 @@ class ScreenWindow(screenNode: ScreenNode) extends BasicWindow with Logging {
|
|||||||
|
|
||||||
if (isFocused && screenNode.screen.tier > Tier.One)
|
if (isFocused && screenNode.screen.tier > Tier.One)
|
||||||
for (button <- MouseEvents.pressedButtons) {
|
for (button <- MouseEvents.pressedButtons) {
|
||||||
screen.mouseDrag(lastMousePos.x, lastMousePos.y, button.id, User("myself"))
|
screen.mouseDrag(lastMousePos.x, lastMousePos.y, button.id, OcelotDesktop.player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,42 @@
|
|||||||
|
package ocelot.desktop.ui.widget
|
||||||
|
|
||||||
|
import ocelot.desktop.OcelotDesktop
|
||||||
|
import ocelot.desktop.geometry.Padding2D
|
||||||
|
import ocelot.desktop.ui.layout.LinearLayout
|
||||||
|
import ocelot.desktop.ui.widget.modal.ModalDialog
|
||||||
|
import ocelot.desktop.util.Orientation
|
||||||
|
|
||||||
|
class AddPlayerDialog() extends ModalDialog {
|
||||||
|
var name = ""
|
||||||
|
|
||||||
|
private def confirm(): Unit = {
|
||||||
|
OcelotDesktop.selectPlayer(name)
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
|
||||||
|
children :+= new PaddingBox(new Widget {
|
||||||
|
override val layout = new LinearLayout(this, orientation = Orientation.Vertical)
|
||||||
|
|
||||||
|
children :+= new PaddingBox(new Label {
|
||||||
|
override def text = "Add new player"
|
||||||
|
}, Padding2D(bottom = 16))
|
||||||
|
|
||||||
|
children :+= new PaddingBox(new TextInput("") {
|
||||||
|
focus()
|
||||||
|
override def onInput(text: String): Unit = name = text
|
||||||
|
override def onConfirm(): Unit = confirm()
|
||||||
|
}, Padding2D(bottom = 8))
|
||||||
|
|
||||||
|
children :+= new Widget {
|
||||||
|
children :+= new Filler
|
||||||
|
children :+= new Button {
|
||||||
|
override def text: String = "Cancel"
|
||||||
|
override def onClick(): Unit = close()
|
||||||
|
}
|
||||||
|
children :+= new PaddingBox(new Button {
|
||||||
|
override def text: String = "Ok"
|
||||||
|
override def onClick(): Unit = confirm()
|
||||||
|
}, Padding2D(left = 8))
|
||||||
|
}
|
||||||
|
}, Padding2D.equal(16))
|
||||||
|
}
|
||||||
@ -9,6 +9,12 @@ import ocelot.desktop.util.Orientation
|
|||||||
class ChangeSimulationSpeedDialog() extends ModalDialog {
|
class ChangeSimulationSpeedDialog() extends ModalDialog {
|
||||||
private var tickInterval: Option[Long] = Some(OcelotDesktop.ticker.tickInterval)
|
private var tickInterval: Option[Long] = Some(OcelotDesktop.ticker.tickInterval)
|
||||||
|
|
||||||
|
private def confirm(): Unit = {
|
||||||
|
if (tickInterval.isDefined)
|
||||||
|
OcelotDesktop.ticker.tickInterval = tickInterval.get
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
|
||||||
children :+= new PaddingBox(new Widget {
|
children :+= new PaddingBox(new Widget {
|
||||||
override val layout = new LinearLayout(this, orientation = Orientation.Vertical)
|
override val layout = new LinearLayout(this, orientation = Orientation.Vertical)
|
||||||
|
|
||||||
@ -42,6 +48,8 @@ class ChangeSimulationSpeedDialog() extends ModalDialog {
|
|||||||
case _: NumberFormatException => false
|
case _: NumberFormatException => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override def onConfirm(): Unit = confirm()
|
||||||
}
|
}
|
||||||
|
|
||||||
inputTPS = new TextInput(formatTPS(OcelotDesktop.ticker.tickInterval)) {
|
inputTPS = new TextInput(formatTPS(OcelotDesktop.ticker.tickInterval)) {
|
||||||
@ -63,6 +71,8 @@ class ChangeSimulationSpeedDialog() extends ModalDialog {
|
|||||||
case _: NumberFormatException => false
|
case _: NumberFormatException => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override def onConfirm(): Unit = confirm()
|
||||||
}
|
}
|
||||||
|
|
||||||
children :+= new Label {
|
children :+= new Label {
|
||||||
@ -84,11 +94,7 @@ class ChangeSimulationSpeedDialog() extends ModalDialog {
|
|||||||
|
|
||||||
children :+= new Button {
|
children :+= new Button {
|
||||||
override def text: String = "Apply"
|
override def text: String = "Apply"
|
||||||
override def onClick(): Unit = {
|
override def onClick(): Unit = confirm()
|
||||||
if (tickInterval.isDefined)
|
|
||||||
OcelotDesktop.ticker.tickInterval = tickInterval.get
|
|
||||||
close()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, Padding2D.equal(16))
|
}, Padding2D.equal(16))
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package ocelot.desktop.ui.widget
|
|||||||
|
|
||||||
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
||||||
import ocelot.desktop.graphics.Graphics
|
import ocelot.desktop.graphics.Graphics
|
||||||
import ocelot.desktop.ui.widget.contextmenu.ContextMenuEntry
|
import ocelot.desktop.ui.widget.contextmenu.{ContextMenuEntry, ContextMenuSubmenu}
|
||||||
import ocelot.desktop.{ColorScheme, OcelotDesktop}
|
import ocelot.desktop.{ColorScheme, OcelotDesktop}
|
||||||
|
|
||||||
class MenuBar extends Widget {
|
class MenuBar extends Widget {
|
||||||
@ -23,6 +23,19 @@ class MenuBar extends Widget {
|
|||||||
menu.addEntry(new ContextMenuEntry("Exit", () => OcelotDesktop.exit()))
|
menu.addEntry(new ContextMenuEntry("Exit", () => OcelotDesktop.exit()))
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
addEntry(new MenuBarSubmenu("Player", menu => {
|
||||||
|
menu.addEntry(new ContextMenuEntry("Add...", () => OcelotDesktop.addPlayerDialog()))
|
||||||
|
menu.addSeparator()
|
||||||
|
OcelotDesktop.players.foreach(player => {
|
||||||
|
menu.addEntry(new ContextMenuSubmenu(
|
||||||
|
(if (player == OcelotDesktop.players.head) "● " else " ") + player.nickname,
|
||||||
|
() => OcelotDesktop.selectPlayer(player.nickname)
|
||||||
|
) {
|
||||||
|
addEntry(new ContextMenuEntry("Remove", () => OcelotDesktop.removePlayer(player.nickname)))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}))
|
||||||
|
|
||||||
addEntry(new MenuBarButton("Settings", () => OcelotDesktop.settings()))
|
addEntry(new MenuBarButton("Settings", () => OcelotDesktop.settings()))
|
||||||
|
|
||||||
addEntry(new Widget {
|
addEntry(new Widget {
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import scala.collection.mutable.ArrayBuffer
|
|||||||
|
|
||||||
class TextInput(val initialText: String = "") extends Widget with ClickHandler {
|
class TextInput(val initialText: String = "") extends Widget with ClickHandler {
|
||||||
def onInput(text: String): Unit = {}
|
def onInput(text: String): Unit = {}
|
||||||
|
def onConfirm(): Unit = {}
|
||||||
def isInputValid(text: String): Boolean = true
|
def isInputValid(text: String): Boolean = true
|
||||||
|
|
||||||
var isFocused = false
|
var isFocused = false
|
||||||
@ -65,6 +66,9 @@ class TextInput(val initialText: String = "") extends Widget with ClickHandler {
|
|||||||
else
|
else
|
||||||
events += new WriteChar(ch)
|
events += new WriteChar(ch)
|
||||||
|
|
||||||
|
case KeyEvent(KeyEvent.State.Press, Keyboard.KEY_RETURN, _) if isFocused =>
|
||||||
|
onConfirm()
|
||||||
|
|
||||||
case KeyEvent(KeyEvent.State.Press | KeyEvent.State.Repeat, _, char) if isFocused =>
|
case KeyEvent(KeyEvent.State.Press | KeyEvent.State.Repeat, _, char) if isFocused =>
|
||||||
if (!char.isControl)
|
if (!char.isControl)
|
||||||
events += new WriteChar(char)
|
events += new WriteChar(char)
|
||||||
|
|||||||
@ -8,8 +8,9 @@ import ocelot.desktop.ui.UiHandler
|
|||||||
import ocelot.desktop.ui.event.HoverEvent
|
import ocelot.desktop.ui.event.HoverEvent
|
||||||
|
|
||||||
class ContextMenuSubmenu(label: String,
|
class ContextMenuSubmenu(label: String,
|
||||||
|
onClick: () => Unit = null,
|
||||||
icon: Option[IconDef] = None)
|
icon: Option[IconDef] = None)
|
||||||
extends ContextMenuEntry(label + " ", icon = icon)
|
extends ContextMenuEntry(label + " ", if (onClick != null) onClick else () => {}, icon)
|
||||||
{
|
{
|
||||||
private val parentEntry = this
|
private val parentEntry = this
|
||||||
private val submenu = new ContextMenu {
|
private val submenu = new ContextMenu {
|
||||||
@ -28,7 +29,9 @@ class ContextMenuSubmenu(label: String,
|
|||||||
submenu.addSeparator()
|
submenu.addSeparator()
|
||||||
}
|
}
|
||||||
|
|
||||||
override def clicked(): Unit = {}
|
override def clicked(): Unit = {
|
||||||
|
if (onClick != null) super.clicked()
|
||||||
|
}
|
||||||
|
|
||||||
override def leave(): Unit = {
|
override def leave(): Unit = {
|
||||||
if (submenu.isClosed) super.leave()
|
if (submenu.isClosed) super.leave()
|
||||||
|
|||||||
@ -41,7 +41,7 @@ class CPUSlot(owner: Inventory#Slot, node: ComputerNode, val tier: Int) extends
|
|||||||
|
|
||||||
if (tier < Tier.Two) return
|
if (tier < Tier.Two) return
|
||||||
|
|
||||||
menu.addEntry(new ContextMenuSubmenu("APU (CPU + GPU)", Some(new IconDef("items/GraphicsCard1"))) {
|
menu.addEntry(new ContextMenuSubmenu("APU (CPU + GPU)", icon = Some(new IconDef("items/GraphicsCard1"))) {
|
||||||
addEntry(new ContextMenuEntry("Tier 2",
|
addEntry(new ContextMenuEntry("Tier 2",
|
||||||
() => item = new APU(Tier.One),
|
() => item = new APU(Tier.One),
|
||||||
icon = Some(new IconDef("items/APU0", animation = APUAnimation))))
|
icon = Some(new IconDef("items/APU0", animation = APUAnimation))))
|
||||||
|
|||||||
@ -39,7 +39,7 @@ class CardSlot(owner: Inventory#Slot, val tier: Int) extends InventorySlot[Entit
|
|||||||
if (nextEntry.isDefined && nextEntry.get.name == entry.name) {
|
if (nextEntry.isDefined && nextEntry.get.name == entry.name) {
|
||||||
val groupName = entry.name
|
val groupName = entry.name
|
||||||
if (tier >= entry.tier) {
|
if (tier >= entry.tier) {
|
||||||
menu.addEntry(new ContextMenuSubmenu(groupName, Some(nextEntry.get.icon)) {
|
menu.addEntry(new ContextMenuSubmenu(groupName, icon = Some(nextEntry.get.icon)) {
|
||||||
entries.view.slice(i, entries.length).takeWhile(_.name == groupName).foreach(entry => {
|
entries.view.slice(i, entries.length).takeWhile(_.name == groupName).foreach(entry => {
|
||||||
val name = if (entry.tier == Tier.Four) "Creative" else "Tier " + (entry.tier + 1)
|
val name = if (entry.tier == Tier.Four) "Creative" else "Tier " + (entry.tier + 1)
|
||||||
if (tier >= entry.tier) {
|
if (tier >= entry.tier) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user