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"));
button.setDock(Dock.RIGHT);
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.setDock(Dock.RIGHT);
button.setDockMargin(2, 0, 0, 0);
button.bindOnPress(() -> {
button.bind(() -> {
menu.requestTaskCancel(task.id());
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")) {
@Override
protected void factorize(EditBox widget, boolean recreation) {
super.factorize(widget, recreation);
protected void configureNew(EditBox widget, boolean recreation) {
super.configureNew(widget, recreation);
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));
button.bindOnPress(() -> input_amount.increase(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, new TranslatableComponent("otm.container.matter_panel.increase_by", 64));
button.setDock(Dock.RIGHT);
button.bindOnPress(() -> input_amount.increase(64));
button.bind(() -> input_amount.increase(64));
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.setDock(Dock.RIGHT);
button.bindOnPress(() -> input_amount.increase(256));
button.bind(() -> input_amount.increase(256));
button.setDockMargin(2, 0, 0, 0);
slot.setDock(Dock.LEFT);
@ -353,28 +353,28 @@ public class MatterPanelScreen extends MatteryScreen<MenuMatterPanel> {
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.bindOnPress(() -> input_amount.increase(-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, new TranslatableComponent("otm.container.matter_panel.decrease_by", 64));
button.setDock(Dock.RIGHT);
button.bindOnPress(() -> input_amount.increase(-64));
button.bind(() -> input_amount.increase(-64));
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.setDock(Dock.RIGHT);
button.bindOnPress(() -> input_amount.increase(-256));
button.bind(() -> input_amount.increase(-256));
button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_4, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.cancel"));
button.setDock(Dock.RIGHT);
button.bindOnPress(pattern_frame::remove);
button.bind(pattern_frame::remove);
button.setDockMargin(2, 0, 0, 0);
button = new ButtonPanel(this, row_4, 0, 0, 82, 20, new TranslatableComponent("otm.container.matter_panel.send"));
button.setDock(Dock.RIGHT);
button.bindOnPress(() -> {
button.bind(() -> {
int value = 1;
try {

View File

@ -220,9 +220,11 @@ public abstract class MatteryScreen<T extends MatteryMenu> extends AbstractConta
var panel = panels.get(i);
if (happen_to_click) {
panel.killFocus();
panel.killFocusForEverythingExceptInner$overdrive_that_matters();
} else if (panel.mouseClickedChecked(p_97748_, p_97749_, p_97750_)) {
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
close.dock = Dock.LEFT
close.bindOnPress { research!!.remove() }
close.bind { research!!.remove() }
bottom.setDockMargin(0f, 0f, 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)
val button = ButtonPanel(this, frame, 38f, 69f, 124f, 20f, TranslatableComponent("otm.gui.android_research"))
button.bindOnPress(this::openResearchTree)
button.bind(this::openResearchTree)
return frame
}

View File

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

View File

@ -17,12 +17,10 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
var label: Label = object : Label(this@ScreenEnergyCounter, frame) {
override fun tick() {
super.tick()
setText(
TranslatableComponent(
text = TranslatableComponent(
"otm.item.power.passed",
FormattingHelper.formatPower(menu.passed.value)
)
)
}
}
@ -32,12 +30,10 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
label = object : Label(this@ScreenEnergyCounter, frame) {
override fun tick() {
super.tick()
setText(
TranslatableComponent(
text = TranslatableComponent(
"otm.item.power.average",
FormattingHelper.formatPower(menu.average.value)
)
)
}
}
@ -47,12 +43,10 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
label = object : Label(this@ScreenEnergyCounter, frame) {
override fun tick() {
super.tick()
setText(
TranslatableComponent(
text = TranslatableComponent(
"otm.item.power.last_20_ticks",
FormattingHelper.formatPower(menu.last20Ticks.value)
)
)
}
}
@ -62,12 +56,10 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
label = object : Label(this@ScreenEnergyCounter, frame) {
override fun tick() {
super.tick()
setText(
TranslatableComponent(
text = TranslatableComponent(
"otm.item.power.last_tick",
FormattingHelper.formatPower(menu.lastTick.value)
)
)
}
}
@ -78,12 +70,10 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title:
override fun tick() {
super.tick()
setText(
TranslatableComponent(
text = TranslatableComponent(
"block.overdrive_that_matters.energy_counter.facing",
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"))
button.dock = Dock.TOP
button.setDockMargin(4f, 0f, 4f, 0f)
button.bindOnPress { menu.switchDirection.userInput() }
button.bind { menu.switchDirection.userInput() }
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)
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
}

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.network.chat.Component;
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen;
import net.minecraft.client.gui.components.Button
import net.minecraft.client.gui.components.Button.OnPress
import net.minecraft.network.chat.Component
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
open class ButtonPanel(
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> {
protected Runnable press_callback;
public ButtonPanel(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, float width, float height, Component label) {
super(screen, parent, x, y, width, height, (panel) -> {
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();
}
};
});
var label = label
set(value) {
field = value
widget?.message = value
}
public void bindOnPress(Runnable runnable) {
press_callback = runnable;
}
override fun copyValues(new_widget: Button, old_widget: Button) {}
override fun configureNew(widget: Button, recreation: Boolean) {}
protected void onPress() {
if (press_callback != null) {
press_callback.run();
override fun makeNew(): Button {
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 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.network.chat.Component;
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen;
import net.minecraft.client.gui.components.EditBox
import net.minecraft.network.chat.Component
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class EditBoxPanel extends MinecraftWidgetPanel<EditBox> {
public EditBoxPanel(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, float width, float height, Component component) {
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();
}
};
});
open class EditBoxPanel(
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
}
@Override
protected void copyValues(EditBox new_widget, EditBox old_widget) {
new_widget.setValue(old_widget.getValue());
override fun isFocused(): Boolean {
return this@EditBoxPanel.isFocused
}
}
}
@Override
public void tick() {
super.tick();
if (widget != null)
widget.tick();
init {
autoKillFocus = true
}
@Override
protected void factorize(EditBox widget, boolean recreation) {
widget.setFocus(isFocused());
override fun copyValues(new_widget: EditBox, old_widget: EditBox) {
new_widget.value = old_widget.value
}
@Override
protected void onFocusChanged(boolean new_focused, boolean old_focused) {
getOrCreateWidget().setFocus(new_focused);
override fun tick() {
super.tick()
widget?.tick()
}
@Override
protected boolean mouseClickedInner(double mouse_x, double mouse_y, int flag) {
if (super.mouseClickedInner(mouse_x, mouse_y, flag)) {
requestFocus();
return true;
override fun configureNew(widget: EditBox, recreation: Boolean) {
widget.setFocus(isFocused)
}
return false;
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
}
fun font(): Font {
return screen.font
}
val font: Font get() = screen.font
fun invalidateLayout() {
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
}
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 {
if (!isVisible() || !acceptMouseInput) return false
@ -694,9 +710,8 @@ open class EditablePanel @JvmOverloads constructor(
for (child in children) {
if (child.mouseClickedChecked(mouse_x, mouse_y, flag)) {
killFocusForEverythingExcept(child)
return true
} else if (child.autoKillFocus) {
child.killFocus()
}
}
@ -712,9 +727,8 @@ open class EditablePanel @JvmOverloads constructor(
} else if (withinExtendedBounds(mouse_x, mouse_y)) {
for (child in children) {
if (child.mouseClickedChecked(mouse_x, mouse_y, flag)) {
killFocusForEverythingExcept(child)
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 net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import ru.dbotthepony.mc.otm.client.render.RGBAColor;
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen;
import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.TextComponent
import ru.dbotthepony.mc.otm.client.render.RGBAColor
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
open class Label @JvmOverloads constructor(
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 {
protected Component text = new TextComponent("Label");
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);
init {
scissor = true
}
public Label(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent) {
super(screen, parent);
setScissor(true);
}
var color = RGBAColor.SLATE_GRAY
public Label(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y) {
super(screen, parent, x, y, 100, 12);
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());
override fun innerRender(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) {
font.draw(stack, text, 0f, 0f, color.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.vertex.PoseStack;
import net.minecraft.client.gui.components.AbstractWidget;
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen;
import com.mojang.blaze3d.systems.RenderSystem
import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.client.gui.components.AbstractWidget
import org.lwjgl.opengl.GL11
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
abstract class MinecraftWidgetPanel<T : AbstractWidget>(
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;
public class MinecraftWidgetPanel<T extends AbstractWidget> extends EditablePanel {
public interface WidgetFactory<T extends AbstractWidget> {
T create(MinecraftWidgetPanel<T> panel);
var disableTicks = 0
set(value) {
field = value
widget?.active = value > 0
}
protected T widget;
private final WidgetFactory<T> factory;
val isWidgetDisabled: Boolean
get() = disableTicks > 0
private int disable_ticks = 0;
override fun tick() {
super.tick()
@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;
if (disableTicks > 0) {
disableTicks--
}
}
public boolean isWidgetDisabled() {
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() {
private fun recreate() {
if (widget == null) {
return;
return
}
var new_widget = factory.create(this);
new_widget.visible = getVisible();
new_widget.x = (int) getAbsoluteX();
new_widget.y = (int) getAbsoluteY();
val instance = makeNew()
instance.visible = visible
instance.x = absoluteX.toInt()
instance.y = absoluteY.toInt()
if (disableTicks > 0) {
instance.active = false
}
val widget = widget
if (widget != null)
copyValues(new_widget, widget);
copyValues(instance, widget)
widget = new_widget;
factorize(widget, true);
this.widget = instance
configureNew(instance, true)
}
@Override
protected void widthUpdated(float new_value, float old_value) {
recreate();
override fun widthUpdated(new: Float, old: Float) {
recreate()
}
@Override
protected void heightUpdated(float new_value, float old_value) {
recreate();
override fun heightUpdated(new: Float, old: Float) {
recreate()
}
@Override
protected void visibilityChanges(boolean new_visible, boolean old_visible) {
if (widget != null)
widget.visible = new_visible;
override fun visibilityChanges(new: Boolean, old: Boolean) {
widget?.visible = new
}
/**
* Override in final classes to define values
*
* @param widget
*/
protected void factorize(T widget, boolean recreation) {
protected abstract fun copyValues(new_widget: T, old_widget: T)
protected abstract fun makeNew(): T
protected abstract fun configureNew(widget: T, recreation: Boolean)
fun getOrCreateWidget(): T {
val widget = this.widget
if (widget != null) return widget
val instance = makeNew()
instance.visible = visible
if (disableTicks > 0) {
instance.active = false
}
@Nonnull
public T getOrCreateWidget() {
if (widget != null)
return widget;
configureNew(instance, false)
widget = factory.create(this);
widget.visible = getVisible();
factorize(widget, false);
return widget;
this.widget = instance
return instance
}
@Override
protected void innerRender(PoseStack stack, float mouse_x, float mouse_y, float flag) {
RenderSystem.depthFunc(GL_ALWAYS);
getOrCreateWidget().render(stack, (int) mouse_x, (int) mouse_y, flag);
RenderSystem.depthFunc(GL_ALWAYS);
override fun innerRender(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) {
RenderSystem.depthFunc(GL11.GL_ALWAYS)
getOrCreateWidget().render(stack, mouse_x.toInt(), mouse_y.toInt(), flag)
RenderSystem.depthFunc(GL11.GL_ALWAYS)
}
@Override
protected boolean charTypedInternal(char p_94732_, int p_94733_) {
return getOrCreateWidget().charTyped(p_94732_, p_94733_);
override fun charTypedInternal(p_94732_: Char, p_94733_: Int) = getOrCreateWidget().charTyped(p_94732_, p_94733_)
override fun keyPressedInternal(p_94745_: Int, p_94746_: Int, p_94747_: Int) = getOrCreateWidget().keyPressed(p_94745_, p_94746_, p_94747_)
override fun keyReleasedInternal(p_94750_: Int, p_94751_: Int, p_94752_: Int) = getOrCreateWidget().keyReleased(p_94750_, p_94751_, p_94752_)
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
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);
override fun mouseReleasedInner(mouse_x: Double, mouse_y: Double, flag: Int): Boolean {
val (x1, y1) = screenToLocal(mouse_x, mouse_y)
return getOrCreateWidget().mouseReleased(x1.toDouble(), y1.toDouble(), flag)
}
}