Panel and minecraft widget panels improvements

This commit is contained in:
DBotThePony 2022-01-31 23:31:28 +07:00
parent 060edb8073
commit e56a9477ef
Signed by: DBot
GPG Key ID: DCC23B5715498507
12 changed files with 258 additions and 336 deletions

View File

@ -246,12 +246,12 @@ public class MatterPanelScreen extends MatteryScreen<MenuMatterPanel> {
var button = new ButtonPanel(this, task_frame, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.close")); var button = new ButtonPanel(this, task_frame, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.close"));
button.setDock(Dock.RIGHT); button.setDock(Dock.RIGHT);
button.setDockMargin(2, 0, 0, 0); button.setDockMargin(2, 0, 0, 0);
button.bindOnPress(task_frame::remove); button.bind(task_frame::remove);
button = new ButtonPanel(this, task_frame, 0, 0, 80, 20, new TranslatableComponent("otm.container.matter_panel.cancel_task")); button = new ButtonPanel(this, task_frame, 0, 0, 80, 20, new TranslatableComponent("otm.container.matter_panel.cancel_task"));
button.setDock(Dock.RIGHT); button.setDock(Dock.RIGHT);
button.setDockMargin(2, 0, 0, 0); button.setDockMargin(2, 0, 0, 0);
button.bindOnPress(() -> { button.bind(() -> {
menu.requestTaskCancel(task.id()); menu.requestTaskCancel(task.id());
task_frame.remove(); task_frame.remove();
}); });
@ -307,8 +307,8 @@ public class MatterPanelScreen extends MatteryScreen<MenuMatterPanel> {
var input_amount = new EditBoxPanel(this, row_2, 0, 0, 10, 20, new TextComponent("Input amount")) { var input_amount = new EditBoxPanel(this, row_2, 0, 0, 10, 20, new TextComponent("Input amount")) {
@Override @Override
protected void factorize(EditBox widget, boolean recreation) { protected void configureNew(EditBox widget, boolean recreation) {
super.factorize(widget, recreation); super.configureNew(widget, recreation);
widget.setMaxLength(6); widget.setMaxLength(6);
@ -334,18 +334,18 @@ public class MatterPanelScreen extends MatteryScreen<MenuMatterPanel> {
}; };
var button = new ButtonPanel(this, row_1, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 8)); var button = new ButtonPanel(this, row_1, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 8));
button.bindOnPress(() -> input_amount.increase(8)); button.bind(() -> input_amount.increase(8));
button.setDock(Dock.RIGHT); button.setDock(Dock.RIGHT);
button.setDockMargin(2, 0, 0, 0); button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_1, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 64)); button = new ButtonPanel(this, row_1, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 64));
button.setDock(Dock.RIGHT); button.setDock(Dock.RIGHT);
button.bindOnPress(() -> input_amount.increase(64)); button.bind(() -> input_amount.increase(64));
button.setDockMargin(2, 0, 0, 0); button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_1, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 256)); button = new ButtonPanel(this, row_1, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 256));
button.setDock(Dock.RIGHT); button.setDock(Dock.RIGHT);
button.bindOnPress(() -> input_amount.increase(256)); button.bind(() -> input_amount.increase(256));
button.setDockMargin(2, 0, 0, 0); button.setDockMargin(2, 0, 0, 0);
slot.setDock(Dock.LEFT); slot.setDock(Dock.LEFT);
@ -353,28 +353,28 @@ public class MatterPanelScreen extends MatteryScreen<MenuMatterPanel> {
input_amount.setDock(Dock.FILL); input_amount.setDock(Dock.FILL);
button = new ButtonPanel(this, row_3, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 8)); button = new ButtonPanel(this, row_3, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 8));
button.bindOnPress(() -> input_amount.increase(-8)); button.bind(() -> input_amount.increase(-8));
button.setDock(Dock.RIGHT); button.setDock(Dock.RIGHT);
button.setDockMargin(2, 0, 0, 0); button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_3, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 64)); button = new ButtonPanel(this, row_3, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 64));
button.setDock(Dock.RIGHT); button.setDock(Dock.RIGHT);
button.bindOnPress(() -> input_amount.increase(-64)); button.bind(() -> input_amount.increase(-64));
button.setDockMargin(2, 0, 0, 0); button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_3, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 256)); button = new ButtonPanel(this, row_3, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 256));
button.setDock(Dock.RIGHT); button.setDock(Dock.RIGHT);
button.bindOnPress(() -> input_amount.increase(-256)); button.bind(() -> input_amount.increase(-256));
button.setDockMargin(2, 0, 0, 0); button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_4, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.cancel")); button = new ButtonPanel(this, row_4, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.cancel"));
button.setDock(Dock.RIGHT); button.setDock(Dock.RIGHT);
button.bindOnPress(pattern_frame::remove); button.bind(pattern_frame::remove);
button.setDockMargin(2, 0, 0, 0); button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_4, 0, 0, 82, 20, new TranslatableComponent("otm.container.matter_panel.send")); button = new ButtonPanel(this, row_4, 0, 0, 82, 20, new TranslatableComponent("otm.container.matter_panel.send"));
button.setDock(Dock.RIGHT); button.setDock(Dock.RIGHT);
button.bindOnPress(() -> { button.bind(() -> {
int value = 1; int value = 1;
try { try {

View File

@ -220,9 +220,11 @@ public abstract class MatteryScreen<T extends MatteryMenu> extends AbstractConta
var panel = panels.get(i); var panel = panels.get(i);
if (happen_to_click) { if (happen_to_click) {
panel.killFocus(); panel.killFocusForEverythingExceptInner$overdrive_that_matters();
} else if (panel.mouseClickedChecked(p_97748_, p_97749_, p_97750_)) { } else if (panel.mouseClickedChecked(p_97748_, p_97749_, p_97750_)) {
happen_to_click = true; happen_to_click = true;
} else {
panel.killFocusForEverythingExceptInner$overdrive_that_matters();
} }
} }

View File

@ -1,27 +0,0 @@
package ru.dbotthepony.mc.otm.client.screen.panels;
import net.minecraft.world.item.ItemStack;
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.function.Supplier;
public class SupplierSlotPanel extends AbstractSlotPanel {
protected Supplier<ItemStack> stack_getter;
public SupplierSlotPanel(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, float width, float height, Supplier<ItemStack> supplier) {
super(screen, parent, x, y, width, height);
stack_getter = supplier;
}
public SupplierSlotPanel(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, Supplier<ItemStack> supplier) {
this(screen, parent, x, y, REGULAR_DIMENSIONS, REGULAR_DIMENSIONS, supplier);
}
@Nonnull
@Override
protected ItemStack getItemStack() {
return stack_getter.get();
}
}

View File

@ -201,7 +201,7 @@ class ScreenAndroidStation constructor(p_97741_: AndroidStationMenu, p_97742_: I
bottom.dock = Dock.BOTTOM bottom.dock = Dock.BOTTOM
close.dock = Dock.LEFT close.dock = Dock.LEFT
close.bindOnPress { research!!.remove() } close.bind { research!!.remove() }
bottom.setDockMargin(0f, 0f, 4f, 4f) bottom.setDockMargin(0f, 0f, 4f, 4f)
canvas!!.setDockMargin(4f, 4f, 4f, 4f) canvas!!.setDockMargin(4f, 4f, 4f, 4f)
@ -230,7 +230,7 @@ class ScreenAndroidStation constructor(p_97741_: AndroidStationMenu, p_97742_: I
SlotPanel(this, frame, menu.androidBattery, 38f, 17f) SlotPanel(this, frame, menu.androidBattery, 38f, 17f)
val button = ButtonPanel(this, frame, 38f, 69f, 124f, 20f, TranslatableComponent("otm.gui.android_research")) val button = ButtonPanel(this, frame, 38f, 69f, 124f, 20f, TranslatableComponent("otm.gui.android_research"))
button.bindOnPress(this::openResearchTree) button.bind(this::openResearchTree)
return frame return frame
} }

View File

@ -124,10 +124,10 @@ class ScreenDriveViewer(menu: MenuDriveViewer, inventory: Inventory, title: Comp
val filter = menu.getFilter() val filter = menu.getFilter()
if (filter != null) { if (filter != null) {
orCreateWidget.message = TranslatableComponent("otm.filter.match_nbt", if (filter.matchNbt) yes else no) widget?.message = TranslatableComponent("otm.filter.match_nbt", if (filter.matchNbt) yes else no)
orCreateWidget.active = !isWidgetDisabled widget?.active = !isWidgetDisabled
} else { } else {
orCreateWidget.active = false widget?.active = false
} }
} }
@ -144,7 +144,8 @@ class ScreenDriveViewer(menu: MenuDriveViewer, inventory: Inventory, title: Comp
!filter.matchNbt !filter.matchNbt
) )
) )
disableFor(20)
disableTicks = 20
} }
} }
} }
@ -156,11 +157,10 @@ class ScreenDriveViewer(menu: MenuDriveViewer, inventory: Inventory, title: Comp
val filter = menu.getFilter() val filter = menu.getFilter()
if (filter != null) { if (filter != null) {
orCreateWidget.message = widget?.message = TranslatableComponent("otm.filter.match_tag", if (filter.matchTag) yes else no)
TranslatableComponent("otm.filter.match_tag", if (filter.matchTag) yes else no) widget?.active = !isWidgetDisabled
orCreateWidget.active = !isWidgetDisabled
} else { } else {
orCreateWidget.active = false widget?.active = false
} }
} }
@ -177,7 +177,8 @@ class ScreenDriveViewer(menu: MenuDriveViewer, inventory: Inventory, title: Comp
!filter.matchTag !filter.matchTag
) )
) )
disableFor(20)
disableTicks = 20
} }
} }
} }
@ -189,10 +190,10 @@ class ScreenDriveViewer(menu: MenuDriveViewer, inventory: Inventory, title: Comp
val filter = menu.getFilter() val filter = menu.getFilter()
if (filter != null) { if (filter != null) {
orCreateWidget.message = TranslatableComponent("otm.filter.blacklist", if (filter.isBlacklist) yes else no) widget?.message = TranslatableComponent("otm.filter.blacklist", if (filter.isBlacklist) yes else no)
orCreateWidget.active = !isWidgetDisabled widget?.active = !isWidgetDisabled
} else { } else {
orCreateWidget.active = false widget?.active = false
} }
} }
@ -208,7 +209,8 @@ class ScreenDriveViewer(menu: MenuDriveViewer, inventory: Inventory, title: Comp
!filter.isBlacklist !filter.isBlacklist
) )
) )
disableFor(20)
disableTicks = 20
} }
} }
} }

View File

@ -17,11 +17,9 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
var label: Label = object : Label(this@ScreenEnergyCounter, frame) { var label: Label = object : Label(this@ScreenEnergyCounter, frame) {
override fun tick() { override fun tick() {
super.tick() super.tick()
setText( text = TranslatableComponent(
TranslatableComponent( "otm.item.power.passed",
"otm.item.power.passed", FormattingHelper.formatPower(menu.passed.value)
FormattingHelper.formatPower(menu.passed.value)
)
) )
} }
} }
@ -32,11 +30,9 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
label = object : Label(this@ScreenEnergyCounter, frame) { label = object : Label(this@ScreenEnergyCounter, frame) {
override fun tick() { override fun tick() {
super.tick() super.tick()
setText( text = TranslatableComponent(
TranslatableComponent( "otm.item.power.average",
"otm.item.power.average", FormattingHelper.formatPower(menu.average.value)
FormattingHelper.formatPower(menu.average.value)
)
) )
} }
} }
@ -47,11 +43,9 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
label = object : Label(this@ScreenEnergyCounter, frame) { label = object : Label(this@ScreenEnergyCounter, frame) {
override fun tick() { override fun tick() {
super.tick() super.tick()
setText( text = TranslatableComponent(
TranslatableComponent( "otm.item.power.last_20_ticks",
"otm.item.power.last_20_ticks", FormattingHelper.formatPower(menu.last20Ticks.value)
FormattingHelper.formatPower(menu.last20Ticks.value)
)
) )
} }
} }
@ -62,11 +56,9 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
label = object : Label(this@ScreenEnergyCounter, frame) { label = object : Label(this@ScreenEnergyCounter, frame) {
override fun tick() { override fun tick() {
super.tick() super.tick()
setText( text = TranslatableComponent(
TranslatableComponent( "otm.item.power.last_tick",
"otm.item.power.last_tick", FormattingHelper.formatPower(menu.lastTick.value)
FormattingHelper.formatPower(menu.lastTick.value)
)
) )
} }
} }
@ -78,11 +70,9 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
override fun tick() { override fun tick() {
super.tick() super.tick()
setText( text = TranslatableComponent(
TranslatableComponent( "block.overdrive_that_matters.energy_counter.facing",
"block.overdrive_that_matters.energy_counter.facing", menu.inputDirection.value
menu.inputDirection.value
)
) )
} }
} }
@ -93,7 +83,7 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
val button = ButtonPanel(this, frame, 0f, 0f, 0f, 20f, TranslatableComponent("block.overdrive_that_matters.energy_counter.switch")) val button = ButtonPanel(this, frame, 0f, 0f, 0f, 20f, TranslatableComponent("block.overdrive_that_matters.energy_counter.switch"))
button.dock = Dock.TOP button.dock = Dock.TOP
button.setDockMargin(4f, 0f, 4f, 0f) button.setDockMargin(4f, 0f, 4f, 0f)
button.bindOnPress { menu.switchDirection.userInput() } button.bind { menu.switchDirection.userInput() }
return frame return frame
} }

View File

@ -35,7 +35,7 @@ class ScreenMatterBottler(menu: MenuMatterBottler, inventory: Inventory, title:
progress = ProgressGaugePanel(this, frame, menu.progressWidget, 90f, PROGRESS_ARROW_TOP) progress = ProgressGaugePanel(this, frame, menu.progressWidget, 90f, PROGRESS_ARROW_TOP)
val mode = ButtonPanel(this, frame, 46f, 69f, 100f, 20f, TranslatableComponent("otm.matter_bottler.switch_mode")) val mode = ButtonPanel(this, frame, 46f, 69f, 100f, 20f, TranslatableComponent("otm.matter_bottler.switch_mode"))
mode.bindOnPress { menu.workFlow.switchValue() } mode.bind { menu.workFlow.switchValue() }
return frame return frame
} }

View File

@ -1,34 +1,45 @@
package ru.dbotthepony.mc.otm.client.screen.panels; package ru.dbotthepony.mc.otm.client.screen.panels
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.components.Button
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Button.OnPress
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen; import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import javax.annotation.Nonnull; open class ButtonPanel(
import javax.annotation.Nullable; screen: MatteryScreen<*>,
parent: EditablePanel?,
x: Float = 0f,
y: Float = 0f,
width: Float = 40f,
height: Float = 20f,
label: Component
) : MinecraftWidgetPanel<Button>(screen, parent, x, y, width, height) {
constructor(screen: MatteryScreen<*>, parent: EditablePanel?, label: Component) : this(screen, parent, x = 0f, label = label)
public class ButtonPanel extends MinecraftWidgetPanel<Button> { var label = label
protected Runnable press_callback; set(value) {
field = value
widget?.message = value
}
public ButtonPanel(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, float width, float height, Component label) { override fun copyValues(new_widget: Button, old_widget: Button) {}
super(screen, parent, x, y, width, height, (panel) -> { override fun configureNew(widget: Button, recreation: Boolean) {}
return new Button(0, 0, (int) panel.getWidth(), Math.min(20, (int) panel.getHeight()), label, (btn) -> ((ButtonPanel) panel).onPress()) {
@Override
public boolean isHoveredOrFocused() {
return panel.isHovered();
}
};
});
}
public void bindOnPress(Runnable runnable) { override fun makeNew(): Button {
press_callback = runnable; return object : Button(0, 0, width.toInt(), height.toInt().coerceAtMost(20), label, OnPress { this@ButtonPanel.onPress() }) {
} override fun isHoveredOrFocused(): Boolean {
return this@ButtonPanel.isHovered
protected void onPress() { }
if (press_callback != null) {
press_callback.run();
} }
} }
}
protected var callback: Runnable? = null
fun bind(runnable: Runnable) {
callback = runnable
}
protected open fun onPress() {
callback?.run()
}
}

View File

@ -1,55 +1,54 @@
package ru.dbotthepony.mc.otm.client.screen.panels; package ru.dbotthepony.mc.otm.client.screen.panels
import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.EditBox
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component
import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen;
import javax.annotation.Nonnull; open class EditBoxPanel(
import javax.annotation.Nullable; screen: MatteryScreen<*>,
parent: EditablePanel?,
x: Float,
y: Float,
width: Float,
height: Float,
val defaultText: Component
) : MinecraftWidgetPanel<EditBox>(screen, parent, x, y, width, height) {
override fun makeNew(): EditBox {
return object : EditBox(font, 0, 0, width.toInt(), height.toInt().coerceAtMost(20), defaultText) {
override fun isHoveredOrFocused(): Boolean {
return this@EditBoxPanel.isHovered
}
public class EditBoxPanel extends MinecraftWidgetPanel<EditBox> { override fun isFocused(): Boolean {
public EditBoxPanel(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, float width, float height, Component component) { return this@EditBoxPanel.isFocused
super(screen, parent, x, y, width, height, (panel) -> { }
return new EditBox(screen.getFont(), 0, 0, (int) panel.getWidth(), Math.min(20, (int) panel.getHeight()), component) {
@Override
public boolean isHoveredOrFocused() {
return panel.isHovered();
}
};
});
}
@Override
protected void copyValues(EditBox new_widget, EditBox old_widget) {
new_widget.setValue(old_widget.getValue());
}
@Override
public void tick() {
super.tick();
if (widget != null)
widget.tick();
}
@Override
protected void factorize(EditBox widget, boolean recreation) {
widget.setFocus(isFocused());
}
@Override
protected void onFocusChanged(boolean new_focused, boolean old_focused) {
getOrCreateWidget().setFocus(new_focused);
}
@Override
protected boolean mouseClickedInner(double mouse_x, double mouse_y, int flag) {
if (super.mouseClickedInner(mouse_x, mouse_y, flag)) {
requestFocus();
return true;
} }
return false;
} }
}
init {
autoKillFocus = true
}
override fun copyValues(new_widget: EditBox, old_widget: EditBox) {
new_widget.value = old_widget.value
}
override fun tick() {
super.tick()
widget?.tick()
}
override fun configureNew(widget: EditBox, recreation: Boolean) {
widget.setFocus(isFocused)
}
override fun onFocusChanged(new: Boolean, old: Boolean) {
widget?.setFocus(new)
}
override fun mouseClickedInner(mouse_x: Double, mouse_y: Double, flag: Int): Boolean {
super.mouseClickedInner(mouse_x, mouse_y, flag)
requestFocus()
return true
}
}

View File

@ -202,9 +202,7 @@ open class EditablePanel @JvmOverloads constructor(
accumulatedDepth += value accumulatedDepth += value
} }
fun font(): Font { val font: Font get() = screen.font
return screen.font
}
fun invalidateLayout() { fun invalidateLayout() {
needsInvalidation = true needsInvalidation = true
@ -687,6 +685,24 @@ open class EditablePanel @JvmOverloads constructor(
return pos.x <= mouse_x && pos.x + boundingWidth > mouse_x && pos.y <= mouse_y && pos.y + boundingHeight > mouse_y return pos.x <= mouse_x && pos.x + boundingWidth > mouse_x && pos.y <= mouse_y && pos.y + boundingHeight > mouse_y
} }
fun killFocusForEverythingExcept(eclusion: EditablePanel) {
for (child in children) {
if (child !== eclusion) {
child.killFocusForEverythingExceptInner()
}
}
}
internal fun killFocusForEverythingExceptInner() {
for (child in children) {
child.killFocusForEverythingExceptInner()
}
if (autoKillFocus) {
killFocus()
}
}
final override fun mouseClicked(mouse_x: Double, mouse_y: Double, flag: Int): Boolean { final override fun mouseClicked(mouse_x: Double, mouse_y: Double, flag: Int): Boolean {
if (!isVisible() || !acceptMouseInput) return false if (!isVisible() || !acceptMouseInput) return false
@ -694,9 +710,8 @@ open class EditablePanel @JvmOverloads constructor(
for (child in children) { for (child in children) {
if (child.mouseClickedChecked(mouse_x, mouse_y, flag)) { if (child.mouseClickedChecked(mouse_x, mouse_y, flag)) {
killFocusForEverythingExcept(child)
return true return true
} else if (child.autoKillFocus) {
child.killFocus()
} }
} }
@ -712,9 +727,8 @@ open class EditablePanel @JvmOverloads constructor(
} else if (withinExtendedBounds(mouse_x, mouse_y)) { } else if (withinExtendedBounds(mouse_x, mouse_y)) {
for (child in children) { for (child in children) {
if (child.mouseClickedChecked(mouse_x, mouse_y, flag)) { if (child.mouseClickedChecked(mouse_x, mouse_y, flag)) {
killFocusForEverythingExcept(child)
return true return true
} else if (child.autoKillFocus) {
child.killFocus()
} }
} }

View File

@ -1,60 +1,29 @@
package ru.dbotthepony.mc.otm.client.screen.panels; package ru.dbotthepony.mc.otm.client.screen.panels
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component
import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TextComponent
import ru.dbotthepony.mc.otm.client.render.RGBAColor; import ru.dbotthepony.mc.otm.client.render.RGBAColor
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen; import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import javax.annotation.Nonnull; open class Label @JvmOverloads constructor(
import javax.annotation.Nullable; screen: MatteryScreen<*>,
parent: EditablePanel?,
x: Float = 0f,
y: Float = 0f,
width: Float = 100f,
height: Float = 10f,
var text: Component = TextComponent("Label")
) : EditablePanel(screen, parent, x, y, width, height) {
constructor(screen: MatteryScreen<*>, parent: EditablePanel?, text: Component) : this(screen, parent, x = 0f, text = text)
public class Label extends EditablePanel { init {
protected Component text = new TextComponent("Label"); scissor = true
public Label(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, float width, float height) {
super(screen, parent, x, y, width, height);
setScissor(true);
} }
public Label(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent) { var color = RGBAColor.SLATE_GRAY
super(screen, parent);
setScissor(true);
}
public Label(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y) { override fun innerRender(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) {
super(screen, parent, x, y, 100, 12); font.draw(stack, text, 0f, 0f, color.wholeinv())
setScissor(true);
}
public Label(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, float width, float height, Component text) {
super(screen, parent, x, y, width, height);
setScissor(true);
this.text = text;
}
public Label(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, Component text) {
super(screen, parent);
setScissor(true);
this.text = text;
}
public Label(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, Component text) {
super(screen, parent, x, y, 100, 12);
setScissor(true);
this.text = text;
}
public Component getText() {
return text;
}
public void setText(Component text) {
this.text = text;
}
@Override
protected void innerRender(PoseStack stack, float mouse_x, float mouse_y, float flag) {
font().draw(stack, text, 0, 0, RGBAColor.SLATE_GRAY.wholeinv());
} }
} }

View File

@ -1,149 +1,111 @@
package ru.dbotthepony.mc.otm.client.screen.panels; package ru.dbotthepony.mc.otm.client.screen.panels
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.AbstractWidget
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen; import org.lwjgl.opengl.GL11
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import javax.annotation.Nonnull; abstract class MinecraftWidgetPanel<T : AbstractWidget>(
import javax.annotation.Nullable; screen: MatteryScreen<*>,
parent: EditablePanel?,
x: Float,
y: Float,
width: Float,
height: Float
) : EditablePanel(screen, parent, x, y, width, height) {
var widget: T? = null
protected set
import static org.lwjgl.opengl.GL11.GL_ALWAYS; var disableTicks = 0
set(value) {
field = value
widget?.active = value > 0
}
public class MinecraftWidgetPanel<T extends AbstractWidget> extends EditablePanel { val isWidgetDisabled: Boolean
public interface WidgetFactory<T extends AbstractWidget> { get() = disableTicks > 0
T create(MinecraftWidgetPanel<T> panel);
}
protected T widget; override fun tick() {
private final WidgetFactory<T> factory; super.tick()
private int disable_ticks = 0; if (disableTicks > 0) {
disableTicks--
@Nullable
public T getWidget() {
return widget;
}
public MinecraftWidgetPanel(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, float width, float height, WidgetFactory<T> factory) {
super(screen, parent, x, y, width, height);
this.factory = factory;
}
protected void copyValues(@Nonnull T new_widget, @Nonnull T old_widget) {
}
public void disableFor(int ticks) {
disable_ticks = ticks;
if (ticks > 0) {
getOrCreateWidget().active = false;
} }
} }
public boolean isWidgetDisabled() { private fun recreate() {
return disable_ticks > 0;
}
@Override
public void tick() {
super.tick();
if (disable_ticks > 0) {
disable_ticks--;
if (disable_ticks <= 0)
getOrCreateWidget().active = true;
}
}
private void recreate() {
if (widget == null) { if (widget == null) {
return; return
} }
var new_widget = factory.create(this); val instance = makeNew()
new_widget.visible = getVisible(); instance.visible = visible
new_widget.x = (int) getAbsoluteX(); instance.x = absoluteX.toInt()
new_widget.y = (int) getAbsoluteY(); instance.y = absoluteY.toInt()
if (disableTicks > 0) {
instance.active = false
}
val widget = widget
if (widget != null) if (widget != null)
copyValues(new_widget, widget); copyValues(instance, widget)
widget = new_widget; this.widget = instance
configureNew(instance, true)
factorize(widget, true);
} }
@Override override fun widthUpdated(new: Float, old: Float) {
protected void widthUpdated(float new_value, float old_value) { recreate()
recreate();
} }
@Override override fun heightUpdated(new: Float, old: Float) {
protected void heightUpdated(float new_value, float old_value) { recreate()
recreate();
} }
@Override override fun visibilityChanges(new: Boolean, old: Boolean) {
protected void visibilityChanges(boolean new_visible, boolean old_visible) { widget?.visible = new
if (widget != null)
widget.visible = new_visible;
} }
/** protected abstract fun copyValues(new_widget: T, old_widget: T)
* Override in final classes to define values protected abstract fun makeNew(): T
* protected abstract fun configureNew(widget: T, recreation: Boolean)
* @param widget
*/
protected void factorize(T widget, boolean recreation) {
fun getOrCreateWidget(): T {
val widget = this.widget
if (widget != null) return widget
val instance = makeNew()
instance.visible = visible
if (disableTicks > 0) {
instance.active = false
}
configureNew(instance, false)
this.widget = instance
return instance
} }
@Nonnull override fun innerRender(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) {
public T getOrCreateWidget() { RenderSystem.depthFunc(GL11.GL_ALWAYS)
if (widget != null) getOrCreateWidget().render(stack, mouse_x.toInt(), mouse_y.toInt(), flag)
return widget; RenderSystem.depthFunc(GL11.GL_ALWAYS)
widget = factory.create(this);
widget.visible = getVisible();
factorize(widget, false);
return widget;
} }
@Override override fun charTypedInternal(p_94732_: Char, p_94733_: Int) = getOrCreateWidget().charTyped(p_94732_, p_94733_)
protected void innerRender(PoseStack stack, float mouse_x, float mouse_y, float flag) { override fun keyPressedInternal(p_94745_: Int, p_94746_: Int, p_94747_: Int) = getOrCreateWidget().keyPressed(p_94745_, p_94746_, p_94747_)
RenderSystem.depthFunc(GL_ALWAYS); override fun keyReleasedInternal(p_94750_: Int, p_94751_: Int, p_94752_: Int) = getOrCreateWidget().keyReleased(p_94750_, p_94751_, p_94752_)
getOrCreateWidget().render(stack, (int) mouse_x, (int) mouse_y, flag);
RenderSystem.depthFunc(GL_ALWAYS); override fun mouseClickedInner(mouse_x: Double, mouse_y: Double, mouse_click_type: Int): Boolean {
val (x1, y1) = screenToLocal(mouse_x, mouse_y)
return getOrCreateWidget().mouseClicked(x1.toDouble(), y1.toDouble(), mouse_click_type)
} }
@Override override fun mouseReleasedInner(mouse_x: Double, mouse_y: Double, flag: Int): Boolean {
protected boolean charTypedInternal(char p_94732_, int p_94733_) { val (x1, y1) = screenToLocal(mouse_x, mouse_y)
return getOrCreateWidget().charTyped(p_94732_, p_94733_); return getOrCreateWidget().mouseReleased(x1.toDouble(), y1.toDouble(), flag)
} }
}
@Override
protected boolean keyPressedInternal(int p_94745_, int p_94746_, int p_94747_) {
return getOrCreateWidget().keyPressed(p_94745_, p_94746_, p_94747_);
}
@Override
protected boolean keyReleasedInternal(int p_94750_, int p_94751_, int p_94752_) {
return getOrCreateWidget().keyReleased(p_94750_, p_94751_, p_94752_);
}
@Override
protected boolean mouseClickedInner(double mouse_x, double mouse_y, int flag) {
var pos = screenToLocal(mouse_x, mouse_y);
return getOrCreateWidget().mouseClicked(pos.x(), pos.y(), flag);
}
@Override
protected boolean mouseReleasedInner(double mouse_x, double mouse_y, int flag) {
var pos = screenToLocal(mouse_x, mouse_y);
return getOrCreateWidget().mouseReleased(pos.x(), pos.y(), flag);
}
}