Common class for Vanilla Components

This commit is contained in:
Frank 2022-07-15 09:18:59 +02:00
parent 43324ba5e9
commit 170b3e5096
2 changed files with 155 additions and 129 deletions

View file

@ -1,4 +1,153 @@
package org.betterx.ui.layout.components;
public class AbstractVanillaComponent {
import org.betterx.ui.layout.components.render.ComponentRenderer;
import org.betterx.ui.layout.values.DynamicSize;
import org.betterx.ui.layout.values.Rectangle;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.components.AbstractWidget;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@Environment(EnvType.CLIENT)
class AbstractVanillaComponentRenderer<C extends AbstractWidget, V extends AbstractVanillaComponent<C, V>> implements ComponentRenderer {
V linkedComponent;
public Font getFont() {
return Minecraft.getInstance().font;
}
public int getWidth(net.minecraft.network.chat.Component c) {
return getFont().width(c.getVisualOrderText()) + 24;
}
public int getHeight(net.minecraft.network.chat.Component c) {
return getFont().lineHeight + 11;
}
protected V getLinkedComponent() {
return linkedComponent;
}
@Override
public void renderInBounds(PoseStack poseStack, int x, int y, float a, Rectangle bounds, Rectangle clipRect) {
if (linkedComponent != null) {
if (linkedComponent.vanillaComponent != null) {
linkedComponent.vanillaComponent.render(poseStack, x, y, a);
}
}
}
}
public abstract class AbstractVanillaComponent<C extends AbstractWidget, V extends AbstractVanillaComponent<C, V>> extends Component<AbstractVanillaComponentRenderer<C, V>> {
protected C vanillaComponent;
protected final net.minecraft.network.chat.Component component;
public AbstractVanillaComponent(
DynamicSize width,
DynamicSize height,
AbstractVanillaComponentRenderer<C, V> renderer,
net.minecraft.network.chat.Component component
) {
super(width, height, renderer);
this.component = component;
renderer.linkedComponent = (V) this;
}
protected abstract C createVanillaComponent();
@Override
protected void onBoundsChanged() {
vanillaComponent = createVanillaComponent();
}
@Override
public int getContentWidth() {
return renderer.getWidth(component);
}
@Override
public int getContentHeight() {
return renderer.getHeight(component);
}
@Override
public void mouseMoved(double x, double y) {
if (vanillaComponent != null)
vanillaComponent.mouseMoved(x - relativeBounds.left, y - relativeBounds.top);
}
@Override
public boolean mouseClicked(double x, double y, int button) {
if (vanillaComponent != null)
return vanillaComponent.mouseClicked(x - relativeBounds.left, y - relativeBounds.top, button);
return false;
}
@Override
public boolean mouseReleased(double x, double y, int button) {
if (vanillaComponent != null)
return vanillaComponent.mouseReleased(x - relativeBounds.left, y - relativeBounds.top, button);
return false;
}
@Override
public boolean mouseDragged(double x, double y, int button, double x2, double y2) {
if (vanillaComponent != null)
return vanillaComponent.mouseDragged(
x - relativeBounds.left,
y - relativeBounds.top,
button,
x2 - relativeBounds.left,
y2 - relativeBounds.top
);
return false;
}
@Override
public boolean mouseScrolled(double x, double y, double f) {
if (vanillaComponent != null)
return vanillaComponent.mouseScrolled(x - relativeBounds.left, y - relativeBounds.top, f);
return false;
}
@Override
public boolean keyPressed(int i, int j, int k) {
if (vanillaComponent != null)
return vanillaComponent.keyPressed(i, j, k);
return false;
}
@Override
public boolean keyReleased(int i, int j, int k) {
if (vanillaComponent != null)
return vanillaComponent.keyReleased(i, j, k);
return false;
}
@Override
public boolean charTyped(char c, int i) {
if (vanillaComponent != null)
return vanillaComponent.charTyped(c, i);
return false;
}
@Override
public boolean changeFocus(boolean bl) {
if (vanillaComponent != null)
return vanillaComponent.changeFocus(bl);
return false;
}
@Override
public boolean isMouseOver(double x, double y) {
if (vanillaComponent != null)
return vanillaComponent.isMouseOver(x, y);
return false;
}
}

View file

@ -1,50 +1,18 @@
package org.betterx.ui.layout.components;
import org.betterx.ui.layout.components.render.ComponentRenderer;
import org.betterx.ui.layout.values.DynamicSize;
import org.betterx.ui.layout.values.Rectangle;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@Environment(EnvType.CLIENT)
class ButtonRenderer implements ComponentRenderer {
Button linkedButton;
public Font getFont() {
return Minecraft.getInstance().font;
}
public int getWidth(net.minecraft.network.chat.Component c) {
return getFont().width(c.getVisualOrderText()) + 24;
}
public int getHeight(net.minecraft.network.chat.Component c) {
return getFont().lineHeight + 11;
}
@Override
public void renderInBounds(PoseStack poseStack, int x, int y, float a, Rectangle bounds, Rectangle clipRect) {
if (linkedButton != null) {
if (linkedButton.vanillaButton != null) {
linkedButton.vanillaButton.render(poseStack, x, y, a);
}
}
}
class ButtonRenderer extends AbstractVanillaComponentRenderer<net.minecraft.client.gui.components.Button, Button> {
}
@Environment(EnvType.CLIENT)
public class Button extends Component<ButtonRenderer> {
int mouseX, mouseY;
final net.minecraft.network.chat.Component component;
public class Button extends AbstractVanillaComponent<net.minecraft.client.gui.components.Button, Button> {
final net.minecraft.client.gui.components.Button.OnPress onPress;
final net.minecraft.client.gui.components.Button.OnTooltip onTooltip;
net.minecraft.client.gui.components.Button vanillaButton;
public Button(
DynamicSize width,
@ -53,17 +21,14 @@ public class Button extends Component<ButtonRenderer> {
net.minecraft.client.gui.components.Button.OnPress onPress,
net.minecraft.client.gui.components.Button.OnTooltip onTooltip
) {
super(width, height, new ButtonRenderer());
renderer.linkedButton = this;
this.component = component;
super(width, height, new ButtonRenderer(), component);
this.onPress = onPress;
this.onTooltip = onTooltip;
}
@Override
protected void onBoundsChanged() {
vanillaButton = new net.minecraft.client.gui.components.Button(
protected net.minecraft.client.gui.components.Button createVanillaComponent() {
return new net.minecraft.client.gui.components.Button(
0,
0,
relativeBounds.width,
@ -73,92 +38,4 @@ public class Button extends Component<ButtonRenderer> {
onTooltip
);
}
@Override
public int getContentWidth() {
return renderer.getWidth(component);
}
@Override
public int getContentHeight() {
return renderer.getHeight(component);
}
@Override
public void mouseMoved(double x, double y) {
mouseX = (int) x;
mouseY = (int) y;
if (vanillaButton != null)
vanillaButton.mouseMoved(x - relativeBounds.left, y - relativeBounds.top);
}
@Override
public boolean mouseClicked(double x, double y, int button) {
if (vanillaButton != null)
return vanillaButton.mouseClicked(x - relativeBounds.left, y - relativeBounds.top, button);
return false;
}
@Override
public boolean mouseReleased(double x, double y, int button) {
if (vanillaButton != null)
return vanillaButton.mouseReleased(x - relativeBounds.left, y - relativeBounds.top, button);
return false;
}
@Override
public boolean mouseDragged(double x, double y, int button, double x2, double y2) {
if (vanillaButton != null)
return vanillaButton.mouseDragged(
x - relativeBounds.left,
y - relativeBounds.top,
button,
x2 - relativeBounds.left,
y2 - relativeBounds.top
);
return false;
}
@Override
public boolean mouseScrolled(double x, double y, double f) {
if (vanillaButton != null)
return vanillaButton.mouseScrolled(x - relativeBounds.left, y - relativeBounds.top, f);
return false;
}
@Override
public boolean keyPressed(int i, int j, int k) {
if (vanillaButton != null)
return vanillaButton.keyPressed(i, j, k);
return false;
}
@Override
public boolean keyReleased(int i, int j, int k) {
if (vanillaButton != null)
return vanillaButton.keyReleased(i, j, k);
return false;
}
@Override
public boolean charTyped(char c, int i) {
if (vanillaButton != null)
return vanillaButton.charTyped(c, i);
return false;
}
@Override
public boolean changeFocus(boolean bl) {
if (vanillaButton != null)
return vanillaButton.changeFocus(bl);
return false;
}
@Override
public boolean isMouseOver(double x, double y) {
if (vanillaButton != null)
return vanillaButton.isMouseOver(x, y);
return false;
}
}