Move pattern monitor screen to Kotlin

This commit is contained in:
DBotThePony 2022-09-03 01:32:12 +07:00
parent 519be9389e
commit cc3e5f5550
Signed by: DBot
GPG Key ID: DCC23B5715498507
6 changed files with 339 additions and 408 deletions

View File

@ -1,401 +0,0 @@
package ru.dbotthepony.mc.otm.client.screen;
import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.item.ItemStack;
import ru.dbotthepony.mc.otm.capability.matter.MatterTask;
import ru.dbotthepony.mc.otm.capability.matter.PatternState;
import ru.dbotthepony.mc.otm.menu.MatterPanelMenu;
import ru.dbotthepony.mc.otm.menu.ReplicationRequestPacket;
import ru.dbotthepony.mc.otm.network.MenuNetworkChannel;
import ru.dbotthepony.mc.otm.client.screen.panels.*;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import static ru.dbotthepony.mc.otm.core.UnOverengineeringKt.TextComponent;
import static ru.dbotthepony.mc.otm.core.UnOverengineeringKt.TranslatableComponent;
public class MatterPanelScreen extends MatteryScreen<MatterPanelMenu> {
private static final int MODAL_WIDTH = 213;
private static final int MODAL_HEIGHT = 110;
public MatterPanelScreen(MatterPanelMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
imageWidth = 176;
imageHeight = 187;
titleLabelY = 5;
}
public static final int GRID_WIDTH = 8;
public static final int GRID_HEIGHT = 9;
private final ArrayList<AbstractSlotPanel> pattern_slots = new ArrayList<>();
private final ArrayList<AbstractSlotPanel> task_slots = new ArrayList<>();
@Nullable
@Override
protected FramePanel makeMainFrame() {
float width = GRID_WIDTH * AbstractSlotPanel.SIZE + ScrollBarConstants.WIDTH + FramePanel.PADDING * 2 + 8;
float height = GRID_HEIGHT * AbstractSlotPanel.SIZE + FramePanel.PADDING_TOP + FramePanel.PADDING;
var scroll_panel = new ContinuousScrollBarPanel(this, null, 0, 0, 0);
var frame = new FramePanel(this, null, 0, 0, width, height, getTitle()) {
@Override
protected boolean mouseScrolledInner(double x, double y, double scroll) {
return scroll_panel.mouseScrolledInner(x, y, scroll);
}
};
var patterns_tab = frame.addTab(FramePanel.Position.TOP, () -> {
for (var slot : pattern_slots) {
slot.setVisible(true);
}
}, () -> {
for (var slot : pattern_slots) {
slot.setVisible(false);
}
});
var tasks_tab = frame.addTab(FramePanel.Position.TOP, () -> {
for (var slot : task_slots) {
slot.setVisible(true);
}
}, () -> {
for (var slot : task_slots) {
slot.setVisible(false);
}
});
scroll_panel.setParent(frame);
scroll_panel.setDock(Dock.RIGHT);
scroll_panel.setupRowMultiplier(() -> {
if (tasks_tab.isActive()) {
return menu.getTasks().size() / GRID_WIDTH;
}
return menu.getPatterns().size() / GRID_WIDTH;
});
var grid = new GridPanel(this, frame, 0, 0, GRID_WIDTH * AbstractSlotPanel.SIZE, 0, GRID_WIDTH, GRID_HEIGHT) {
@Override
protected boolean mouseScrolledInner(double x, double y, double scroll) {
return scroll_panel.mouseScrolledInner(x, y, scroll);
}
};
grid.setDock(Dock.LEFT);
grid.setDockMargin(4, 0, 0, 0);
for (int i = 0; i < GRID_WIDTH * GRID_HEIGHT; i++) {
int slot = i;
pattern_slots.add(new AbstractSlotPanel(this, grid, 0, 0) {
@Nonnull
@Override
protected ItemStack getItemStack() {
var slot1 = slot + scroll_panel.getScroll(menu.getPatterns().size() / GRID_WIDTH) * GRID_WIDTH;
if (slot1 >= menu.getPatterns().size()) {
return ItemStack.EMPTY;
}
return menu.getPatterns().get(slot1).stack();
}
@Nonnull
@Override
protected List<Component> getItemStackTooltip(@Nonnull ItemStack stack) {
var slot1 = slot + scroll_panel.getScroll(menu.getPatterns().size() / GRID_WIDTH) * GRID_WIDTH;
if (slot1 >= menu.getPatterns().size()) {
return List.of();
}
return getPatternTooltip(super.getItemStackTooltip(stack), menu.getPatterns().get(slot1));
}
@Override
protected boolean mouseScrolledInner(double x, double y, double scroll) {
return scroll_panel.mouseScrolledInner(x, y, scroll);
}
@Override
protected boolean mouseClickedInner(double x, double y, int flag) {
if (slot >= menu.getPatterns().size()) {
return true;
}
openPattern(menu.getPatterns().get(slot));
return true;
}
});
task_slots.add(new AbstractSlotPanel(this, grid, 0, 0) {
@Nonnull
@Override
protected ItemStack getItemStack() {
var slot1 = slot + scroll_panel.getScroll(menu.getTasks().size() / GRID_WIDTH) * GRID_WIDTH;
if (slot1 >= menu.getTasks().size()) {
return ItemStack.EMPTY;
}
var task = menu.getTasks().get(slot1);
return task.stack(Math.max(task.required(), 1));
}
@Nonnull
@Override
protected List<Component> getItemStackTooltip(@Nonnull ItemStack stack) {
var slot1 = slot + scroll_panel.getScroll(menu.getTasks().size() / GRID_WIDTH) * GRID_WIDTH;
if (slot1 >= menu.getTasks().size()) {
return List.of();
}
return getTaskTooltip(super.getItemStackTooltip(stack), menu.getTasks().get(slot1));
}
@Override
protected boolean mouseScrolledInner(double x, double y, double scroll) {
return scroll_panel.mouseScrolledInner(x, y, scroll);
}
@Override
protected boolean mouseClickedInner(double x, double y, int flag) {
if (slot >= menu.getTasks().size()) {
return true;
}
openTask(menu.getTasks().get(slot));
return true;
}
});
}
for (var slot : task_slots) {
slot.setVisible(false);
}
return frame;
}
private List<Component> getTaskTooltip(List<Component> input, MatterTask task) {
input.add(TranslatableComponent("otm.gui.matter_task.total", task.total()).withStyle(ChatFormatting.GRAY));
input.add(TranslatableComponent("otm.gui.matter_task.required", task.required()).withStyle(ChatFormatting.GRAY));
input.add(TranslatableComponent("otm.gui.matter_task.in_progress", task.in_progress()).withStyle(ChatFormatting.GRAY));
input.add(TranslatableComponent("otm.gui.matter_task.finished", task.finished()).withStyle(ChatFormatting.GRAY));
return input;
}
private List<Component> getPatternTooltip(List<Component> input, PatternState pattern) {
input.add(TranslatableComponent("otm.item.pattern.research", String.format("%.2f", pattern.research() * 100d)).withStyle(ChatFormatting.AQUA));
return input;
}
private void openTask(MatterTask task) {
var task_frame = new FramePanel(this, null, 0, 0, 170, 40, TranslatableComponent("otm.container.matter_panel.task")) {
@Override
public void tick() {
super.tick();
if (!menu.getTasks().contains(task)) {
remove();
}
}
};
var slot = new AbstractSlotPanel(this, task_frame, 0, 0) {
@Nonnull
@Override
protected ItemStack getItemStack() {
var task1_index = menu.getTasks().indexOf(task);
if (task1_index != -1) {
var task1 = menu.getTasks().get(task1_index);
return task1.stack(Math.max(task1.required(), 1));
}
return ItemStack.EMPTY;
}
@Nonnull
@Override
protected List<Component> getItemStackTooltip(@Nonnull ItemStack stack) {
var task1_index = menu.getTasks().indexOf(task);
List<Component> get_list = super.getItemStackTooltip(stack);
if (task1_index != -1) {
getTaskTooltip(get_list, menu.getTasks().get(task1_index));
}
return get_list;
}
};
slot.setDock(Dock.LEFT);
var button = new ButtonPanel(this, task_frame, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.close"));
button.setDock(Dock.RIGHT);
button.setDockMargin(2, 0, 0, 0);
button.bind(task_frame::remove);
button = new ButtonPanel(this, task_frame, 0, 0, 80, 20, TranslatableComponent("otm.container.matter_panel.cancel_task"));
button.setDock(Dock.RIGHT);
button.setDockMargin(2, 0, 0, 0);
button.bind(() -> {
menu.requestTaskCancel(task.id());
task_frame.remove();
});
task_frame.toScreenCenter();
addPanel(task_frame);
}
private void openPattern(PatternState state) {
var pattern_frame = new FramePanel(this, null, 0, 0, MODAL_WIDTH, MODAL_HEIGHT, TranslatableComponent("otm.container.matter_panel.label")){
@Override
public void tick() {
super.tick();
if (!menu.getPatterns().contains(state)) {
remove();
}
}
};
var row_1 = new EditablePanel(this, pattern_frame);
var row_2 = new EditablePanel(this, pattern_frame);
var row_3 = new EditablePanel(this, pattern_frame);
var row_4 = new EditablePanel(this, pattern_frame);
row_1.setDock(Dock.TOP);
row_2.setDock(Dock.TOP);
row_3.setDock(Dock.TOP);
row_4.setDock(Dock.TOP);
row_1.setHeight(20);
row_2.setHeight(20);
row_3.setHeight(20);
row_4.setHeight(20);
row_1.setDockMargin(0, 2, 0, 0);
row_2.setDockMargin(0, 2, 0, 0);
row_3.setDockMargin(0, 2, 0, 0);
row_4.setDockMargin(0, 2, 0, 0);
var slot = new AbstractSlotPanel(this, row_2, 0, 0) {
@Nonnull
@Override
protected ItemStack getItemStack() {
return new ItemStack(state.item(), 1);
}
@Nonnull
@Override
protected List<Component> getItemStackTooltip(@Nonnull ItemStack stack) {
return getPatternTooltip(super.getItemStackTooltip(stack), state);
}
};
var input_amount = new EditBoxPanel(this, row_2, 0, 0, 10, 20, TextComponent("Input amount")) {
@Override
protected void configureNew(@Nonnull EditBox widget, boolean recreation) {
super.configureNew(widget, recreation);
widget.setMaxLength(6);
if (!recreation) {
widget.setValue("1");
}
}
private void increase(int amount) {
int value = 1;
try {
value = Integer.parseInt(getOrCreateWidget().getValue());
} catch (Exception ignored) {
}
if (value == 1 && amount > 0)
getOrCreateWidget().setValue(Integer.toString(amount));
else
getOrCreateWidget().setValue(Integer.toString(Math.max(1, Math.min(99999, value + amount))));
}
};
var button = new ButtonPanel(this, row_1, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.increase_by", 8));
button.bind(() -> input_amount.increase(8));
button.setDock(Dock.RIGHT);
button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_1, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.increase_by", 64));
button.setDock(Dock.RIGHT);
button.bind(() -> input_amount.increase(64));
button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_1, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.increase_by", 256));
button.setDock(Dock.RIGHT);
button.bind(() -> input_amount.increase(256));
button.setDockMargin(2, 0, 0, 0);
slot.setDock(Dock.LEFT);
slot.setDockMargin(0, 0, 4, 0);
input_amount.setDock(Dock.FILL);
button = new ButtonPanel(this, row_3, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.decrease_by", 8));
button.bind(() -> input_amount.increase(-8));
button.setDock(Dock.RIGHT);
button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_3, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.decrease_by", 64));
button.setDock(Dock.RIGHT);
button.bind(() -> input_amount.increase(-64));
button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_3, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.decrease_by", 256));
button.setDock(Dock.RIGHT);
button.bind(() -> input_amount.increase(-256));
button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_4, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.cancel"));
button.setDock(Dock.RIGHT);
button.bind(pattern_frame::remove);
button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_4, 0, 0, 82, 20, TranslatableComponent("otm.container.matter_panel.send"));
button.setDock(Dock.RIGHT);
button.bind(() -> {
int value = 1;
try {
value = Integer.parseInt(input_amount.getOrCreateWidget().getValue());
} catch (Exception ignored) {
}
MenuNetworkChannel.INSTANCE.sendToServer(new ReplicationRequestPacket(state, value));
pattern_frame.remove();
});
button.setDockMargin(2, 0, 0, 0);
addPanel(pattern_frame);
pattern_frame.toScreenCenter();
popup(pattern_frame);
}
}

View File

@ -0,0 +1,294 @@
package ru.dbotthepony.mc.otm.client.screen
import net.minecraft.ChatFormatting
import net.minecraft.client.gui.components.EditBox
import net.minecraft.network.chat.Component
import net.minecraft.world.entity.player.Inventory
import net.minecraft.world.item.ItemStack
import ru.dbotthepony.mc.otm.capability.matter.MatterTask
import ru.dbotthepony.mc.otm.capability.matter.PatternState
import ru.dbotthepony.mc.otm.client.screen.panels.*
import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.maxScrollDivision
import ru.dbotthepony.mc.otm.menu.MatterPanelMenu
import ru.dbotthepony.mc.otm.menu.ReplicationRequestPacket
import ru.dbotthepony.mc.otm.network.MenuNetworkChannel
class MatterPanelScreen(
menu: MatterPanelMenu,
inventory: Inventory,
title: Component
) : MatteryScreen<MatterPanelMenu>(menu, inventory, title) {
override fun makeMainFrame(): FramePanel {
var isPatternView = true
val frame = FramePanel.padded(this, null, GRID_WIDTH * AbstractSlotPanel.SIZE + ScrollBarConstants.WIDTH + 4f, GRID_HEIGHT * AbstractSlotPanel.SIZE, title)
val scrollBar = DiscreteScrollBarPanel(this, frame, {
if (isPatternView) {
maxScrollDivision(menu.patterns.size, GRID_WIDTH)
} else {
maxScrollDivision(menu.tasks.size, GRID_WIDTH)
}
}, { _, _, _ -> })
scrollBar.dock = Dock.RIGHT
frame.addTab(FramePanel.Position.TOP, open = { isPatternView = true })
frame.addTab(FramePanel.Position.TOP, open = { isPatternView = false })
val canvas = object : EditablePanel(this@MatterPanelScreen, frame, width = GRID_WIDTH * AbstractSlotPanel.SIZE) {
init {
dock = Dock.LEFT
}
override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean {
return scrollBar.mouseScrolledInner(x, y, scroll)
}
}
for (row in 0 until GRID_HEIGHT) {
val rowCanvas = object : EditablePanel(this@MatterPanelScreen, canvas, height = AbstractSlotPanel.SIZE) {
init {
dock = Dock.TOP
}
override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean {
return false
}
}
for (i in 0 until GRID_WIDTH) {
object : AbstractSlotPanel(this@MatterPanelScreen, rowCanvas) {
init {
dock = Dock.LEFT
}
private val index: Int get() = (scrollBar.scroll + row) * GRID_WIDTH + i
override fun getItemStack(): ItemStack {
if (isPatternView) {
return menu.patterns.getOrNull(index)?.stack() ?: ItemStack.EMPTY
} else {
return menu.tasks.getOrNull(index)?.stack() ?: ItemStack.EMPTY
}
}
override fun getItemStackTooltip(stack: ItemStack): List<Component> {
val list = super.getItemStackTooltip(stack).toMutableList()
if (isPatternView) {
menu.patterns.getOrNull(index)?.let {
list.add(TranslatableComponent(
"otm.item.pattern.research",
String.format("%.2f", it.research() * 100.0)
).withStyle(ChatFormatting.AQUA)) }
} else {
menu.tasks.getOrNull(index)?.let {
list.add(TranslatableComponent("otm.gui.matter_task.total", it.total()).withStyle(ChatFormatting.GRAY))
list.add(TranslatableComponent("otm.gui.matter_task.required", it.required()).withStyle(ChatFormatting.GRAY))
list.add(TranslatableComponent("otm.gui.matter_task.in_progress", it.in_progress()).withStyle(ChatFormatting.GRAY))
list.add(TranslatableComponent("otm.gui.matter_task.finished", it.finished()).withStyle(ChatFormatting.GRAY))
}
}
return list
}
override fun mouseClickedInner(x: Double, y: Double, button: Int): Boolean {
if (isPatternView) {
menu.patterns.getOrNull(index)?.let(this@MatterPanelScreen::openPattern)
} else {
menu.tasks.getOrNull(index)?.let(this@MatterPanelScreen::openTask)
}
return true
}
override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean {
return false
}
}
}
}
return frame
}
private fun openTask(task: MatterTask) {
val frame = FramePanel.padded(this, null, 170f, 20f, TranslatableComponent("otm.container.matter_panel.task"))
object : AbstractSlotPanel(this@MatterPanelScreen, frame) {
init {
dock = Dock.LEFT
}
override fun getItemStack(): ItemStack {
return menu.tasks.firstOrNull { it.id == task.id }?.let { it.stack(it.required.coerceAtLeast(1)) } ?: task.stack(task.required.coerceAtLeast(1))
}
override fun tick() {
super.tick()
if (!menu.tasks.any { it.id == task.id }) {
frame.remove()
}
}
}
ButtonPanel(this@MatterPanelScreen, frame, width = 40f, label = TranslatableComponent("otm.container.matter_panel.close"), onPress = frame::remove).also {
it.dock = Dock.RIGHT
it.dockLeft = 2f
}
ButtonPanel(this@MatterPanelScreen, frame, width = 80f, label = TranslatableComponent("otm.container.matter_panel.cancel_task"), onPress = {
menu.requestTaskCancel(task.id)
frame.remove()
}).also {
it.dock = Dock.RIGHT
it.dockLeft = 2f
}
addPanel(frame)
popup(frame)
frame.toScreenCenter()
}
private fun openPattern(pattern: PatternState) {
val frame = FramePanel.padded(this, null, 213f, (ButtonPanel.HEIGHT + 3f) * 4f, TranslatableComponent("otm.container.matter_panel.task"))
val rowTop = EditablePanel(this, frame, height = ButtonPanel.HEIGHT)
val rowInput = EditablePanel(this, frame, height = ButtonPanel.HEIGHT)
val rowBottom = EditablePanel(this, frame, height = ButtonPanel.HEIGHT)
val rowControls = EditablePanel(this, frame, height = ButtonPanel.HEIGHT)
rowTop.dock = Dock.TOP
rowTop.dockTop = 3f
rowInput.dock = Dock.TOP
rowInput.dockTop = 3f
rowBottom.dock = Dock.TOP
rowBottom.dockTop = 3f
rowControls.dock = Dock.TOP
rowControls.dockTop = 3f
object : AbstractSlotPanel(this@MatterPanelScreen, rowInput) {
init {
dock = Dock.LEFT
dockRight = 2f
}
override fun getItemStack(): ItemStack {
return pattern.stack()
}
override fun getItemStackTooltip(stack: ItemStack): List<Component> {
return super.getItemStackTooltip(stack).toMutableList().also {
it.add(TranslatableComponent(
"otm.item.pattern.research",
String.format("%.2f", pattern.research() * 100.0)
).withStyle(ChatFormatting.AQUA))
}
}
override fun tick() {
super.tick()
if (!menu.patterns.any { it.id == pattern.id }) {
frame.remove()
}
}
}
val input = object : EditBoxPanel(this@MatterPanelScreen, rowInput) {
init {
dock = Dock.FILL
}
override fun configureNew(widget: EditBox, recreation: Boolean) {
super.configureNew(widget, recreation)
widget.setMaxLength(6)
if (!recreation) {
widget.value = "1"
}
}
fun increase(amount: Int) {
var value = 1
try {
value = getOrCreateWidget().value.toInt()
} catch (_: NumberFormatException) {
}
if (value == 1 && amount > 0)
getOrCreateWidget().value = amount.toString()
else
getOrCreateWidget().value = 1.coerceAtLeast(99999.coerceAtMost(value + amount)).toString()
}
fun send() {
var value = 1
try {
value = getOrCreateWidget().value.toInt()
} catch (_: NumberFormatException) {
}
MenuNetworkChannel.sendToServer(ReplicationRequestPacket(pattern, value))
frame.remove()
}
}
ButtonPanel(this, rowTop, width = 40f, label = TranslatableComponent("otm.container.matter_panel.increase_by", 8), onPress = { input.increase(8) }).also {
it.dock = Dock.RIGHT
it.dockLeft = 2f
}
ButtonPanel(this, rowTop, width = 40f, label = TranslatableComponent("otm.container.matter_panel.increase_by", 64), onPress = { input.increase(64) }).also {
it.dock = Dock.RIGHT
it.dockLeft = 2f
}
ButtonPanel(this, rowTop, width = 40f, label = TranslatableComponent("otm.container.matter_panel.increase_by", 256), onPress = { input.increase(256) }).also {
it.dock = Dock.RIGHT
it.dockLeft = 2f
}
ButtonPanel(this, rowBottom, width = 40f, label = TranslatableComponent("otm.container.matter_panel.decrease_by", 8), onPress = { input.increase(-8) }).also {
it.dock = Dock.RIGHT
it.dockLeft = 2f
}
ButtonPanel(this, rowBottom, width = 40f, label = TranslatableComponent("otm.container.matter_panel.decrease_by", 64), onPress = { input.increase(-64) }).also {
it.dock = Dock.RIGHT
it.dockLeft = 2f
}
ButtonPanel(this, rowBottom, width = 40f, label = TranslatableComponent("otm.container.matter_panel.decrease_by", 256), onPress = { input.increase(-256) }).also {
it.dock = Dock.RIGHT
it.dockLeft = 2f
}
ButtonPanel(this, rowControls, width = 40f, label = TranslatableComponent("otm.container.matter_panel.cancel"), onPress = frame::remove).also {
it.dock = Dock.RIGHT
it.dockLeft = 2f
}
ButtonPanel(this, rowControls, width = 82f, label = TranslatableComponent("otm.container.matter_panel.send"), onPress = input::send).also {
it.dock = Dock.RIGHT
it.dockLeft = 2f
}
addPanel(frame)
popup(frame)
frame.toScreenCenter()
}
companion object {
const val GRID_HEIGHT = 8
const val GRID_WIDTH = 9
}
}

View File

@ -24,10 +24,22 @@ open class ButtonPanel(
x: Float = 0f, x: Float = 0f,
y: Float = 0f, y: Float = 0f,
width: Float = 40f, width: Float = 40f,
height: Float = 20f, height: Float = HEIGHT,
label: Component label: Component
) : MinecraftWidgetPanel<Button>(screen, parent, x, y, width, height) { ) : MinecraftWidgetPanel<Button>(screen, parent, x, y, width, height) {
constructor(screen: MatteryScreen<*>, parent: EditablePanel?, label: Component) : this(screen, parent, x = 0f, label = label) constructor(screen: MatteryScreen<*>, parent: EditablePanel?, label: Component) : this(screen, parent, x = 0f, label = label)
constructor(
screen: MatteryScreen<*>,
parent: EditablePanel?,
x: Float = 0f,
y: Float = 0f,
width: Float = 40f,
height: Float = HEIGHT,
label: Component,
onPress: Runnable
) : this(screen, parent, x, y, width, height, label) {
this.callback = onPress
}
var label = label var label = label
set(value) { set(value) {
@ -55,6 +67,10 @@ open class ButtonPanel(
protected open fun onPress() { protected open fun onPress() {
callback?.run() callback?.run()
} }
companion object {
const val HEIGHT = 20f
}
} }
@Suppress("PropertyName") @Suppress("PropertyName")

View File

@ -171,8 +171,8 @@ open class FramePanel(
protected val tabsBottom = ArrayList<FrameTabPanel>() protected val tabsBottom = ArrayList<FrameTabPanel>()
@JvmOverloads @JvmOverloads
fun addTab(position: Position, on_open: Runnable? = null, on_close: Runnable? = null): FrameTabPanel { fun addTab(position: Position, open: Runnable? = null, close: Runnable? = null): FrameTabPanel {
val tab = FrameTabPanel(position, on_open, on_close) val tab = FrameTabPanel(position, open, close)
doAddTab(tab) doAddTab(tab)
return tab return tab
} }
@ -257,6 +257,24 @@ open class FramePanel(
} }
companion object { companion object {
fun padded(
screen: MatteryScreen<*>,
parent: EditablePanel?,
x: Float,
y: Float,
width: Float,
height: Float,
title: Component
) = FramePanel(screen, parent, x, y, width + PADDING * 2, height + PADDING_TOP + PADDING, title)
fun padded(
screen: MatteryScreen<*>,
parent: EditablePanel?,
width: Float,
height: Float,
title: Component
) = FramePanel(screen, parent, 0f, 0f, width + PADDING * 2, height + PADDING_TOP + PADDING, title)
const val PADDING = 8f const val PADDING = 8f
const val PADDING_TOP = 14f const val PADDING_TOP = 14f

View File

@ -125,6 +125,12 @@ class ReplicationRequestPacket(val state: PatternState, amount: Int) : MatteryPa
menu.requestReplication(sender, state, amount) menu.requestReplication(sender, state, amount)
} }
} }
companion object {
fun read(buff: FriendlyByteBuf): ReplicationRequestPacket {
return ReplicationRequestPacket(PatternState.read(buff)!!, buff.readInt())
}
}
} }
class MatterPanelMenu @JvmOverloads constructor( class MatterPanelMenu @JvmOverloads constructor(

View File

@ -8,10 +8,7 @@ import net.minecraftforge.network.NetworkEvent
import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorPlayerSettings import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorPlayerSettings
import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.container.ItemFilterSlotPacket import ru.dbotthepony.mc.otm.container.ItemFilterSlotPacket
import ru.dbotthepony.mc.otm.menu.CancelTaskPacket import ru.dbotthepony.mc.otm.menu.*
import ru.dbotthepony.mc.otm.menu.MatteryMenu
import ru.dbotthepony.mc.otm.menu.PatternsChangePacket
import ru.dbotthepony.mc.otm.menu.TasksChangePacket
import ru.dbotthepony.mc.otm.menu.data.* import ru.dbotthepony.mc.otm.menu.data.*
import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputPacket import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputPacket
import ru.dbotthepony.mc.otm.menu.widget.NumberPlayerInputPacket import ru.dbotthepony.mc.otm.menu.widget.NumberPlayerInputPacket
@ -90,5 +87,6 @@ object MenuNetworkChannel : MatteryNetworkChannel(
add(CancelTaskPacket::class.java, CancelTaskPacket.Companion::read, NetworkDirection.PLAY_TO_SERVER) add(CancelTaskPacket::class.java, CancelTaskPacket.Companion::read, NetworkDirection.PLAY_TO_SERVER)
add(PatternsChangePacket::class.java, PatternsChangePacket.Companion::read, NetworkDirection.PLAY_TO_CLIENT) add(PatternsChangePacket::class.java, PatternsChangePacket.Companion::read, NetworkDirection.PLAY_TO_CLIENT)
add(TasksChangePacket::class.java, TasksChangePacket.Companion::read, NetworkDirection.PLAY_TO_CLIENT) add(TasksChangePacket::class.java, TasksChangePacket.Companion::read, NetworkDirection.PLAY_TO_CLIENT)
add(ReplicationRequestPacket::class.java, ReplicationRequestPacket.Companion::read, NetworkDirection.PLAY_TO_SERVER)
} }
} }