Automate things with FlexGridPanel

This commit is contained in:
DBotThePony 2021-08-23 18:30:49 +07:00
parent ae7629548a
commit 4f2fede296
Signed by: DBot
GPG Key ID: DCC23B5715498507
15 changed files with 180 additions and 66 deletions

View File

@ -14,7 +14,7 @@ public class MatterCapacitorBankMenu extends MatteryMenu {
this(p_38852_, inventory, null);
}
public MatterLevelWidget matter;
public MatterLevelWidget matter_widget;
public MatterContainerInputSlot[] container_slots = new MatterContainerInputSlot[2 * 6];
@ -22,9 +22,9 @@ public class MatterCapacitorBankMenu extends MatteryMenu {
super(Registry.Menus.MATTER_CAPACITOR_BANK, p_38852_, inventory, tile);
if (tile == null) {
matter = new MatterLevelWidget(this, 14, 20);
matter_widget = new MatterLevelWidget(this, 14, 20);
} else {
matter = new MatterLevelWidget(this, 14, 20, tile.matter);
matter_widget = new MatterLevelWidget(this, 14, 20, tile.matter);
}
Container container = tile != null ? tile.matter_container : new SimpleContainer(2 * 6);

View File

@ -23,6 +23,7 @@ public class MatterDecomposerMenu extends PoweredMatteryMenu {
public MatterySlot input;
public MachineOutputSlot output;
public ProgressGaugeWidget progress;
public MatterLevelWidget matter_widget;
public MatterDecomposerMenu(int containerID, Inventory inventory, @Nullable BlockEntityMatterDecomposer tile) {
super(Registry.Menus.MATTER_DECOMPOSER, containerID, inventory, tile);
@ -43,15 +44,13 @@ public class MatterDecomposerMenu extends PoweredMatteryMenu {
addSlot(output);
if (tile == null || tile.getCapability(MatteryCapability.MATTER).resolve().isEmpty()) {
new MatterLevelWidget(this, 22, 14);
matter_widget = new MatterLevelWidget(this, 22, 14);
progress = new ProgressGaugeWidget(this, 61 + 18 + 3, 36);
} else {
new MatterLevelWidget(this, 22, 14, tile.getCapability(MatteryCapability.MATTER).resolve().get());
matter_widget = new MatterLevelWidget(this, 22, 14, tile.getCapability(MatteryCapability.MATTER).resolve().get());
progress = new ProgressGaugeWidget(this, 61 + 18 + 3, 36, () -> (float) tile.getWorkProgress(), tile::cantProcessJob);
}
progress.noAutoParent();
addBatterySlot(14);
addInventorySlots();
}

View File

@ -14,6 +14,7 @@ public class MatterReplicatorMenu extends PoweredMatteryMenu {
this(p_38852_, inventory, null);
}
public MatterLevelWidget matter_widget;
public ProgressGaugeWidget progress;
public MachineOutputSlot[] output_slots = new MachineOutputSlot[3];
@ -28,15 +29,13 @@ public class MatterReplicatorMenu extends PoweredMatteryMenu {
}
if (tile != null) {
new MatterLevelWidget(this, 22, 14, tile.matter);
matter_widget = new MatterLevelWidget(this, 22, 14, tile.matter);
progress = new ProgressGaugeWidget(this, 38, 38, () -> (float) tile.getWorkProgress(), tile::cantProcessJob);
} else {
new MatterLevelWidget(this, 22, 14);
matter_widget = new MatterLevelWidget(this, 22, 14);
progress = new ProgressGaugeWidget(this, 38, 38);
}
progress.noAutoParent();
addBatterySlot(14);
addInventorySlots();
}

View File

@ -38,8 +38,6 @@ public class MatterScannerMenu extends PoweredMatteryMenu {
progress = new ProgressGaugeWidget(this, 88, 38);
}
progress.noAutoParent();
addBatterySlot();
addInventorySlots();

View File

@ -15,6 +15,7 @@ abstract public class PoweredMatteryMenu extends MatteryMenu {
protected BlockEntityMatteryPowered tile;
public BatteryLevelWidget battery_widget;
public BatterySlot battery_slot;
protected PoweredMatteryMenu(
@Nullable MenuType<?> menuType,
@ -42,6 +43,7 @@ abstract public class PoweredMatteryMenu extends MatteryMenu {
protected void addBatterySlot(int x, int y) {
Container battery_container = tile != null ? tile.battery_container : new SimpleContainer(1);
addMainSlot(new BatterySlot(battery_container, 0, x, y, true));
battery_slot = new BatterySlot(battery_container, 0, x, y, true);
addSlot(battery_slot);
}
}

View File

@ -29,7 +29,7 @@ public abstract class AbstractWidget {
public int y;
protected Consumer<ContainerData> register_data;
public boolean auto_parent = true;
public boolean auto_parent = false;
public abstract int getImageWidth();
public abstract int getImageHeight();
@ -44,8 +44,12 @@ public abstract class AbstractWidget {
menu.addWidget(this, (consumer) -> register_data = consumer);
}
public AbstractWidget noAutoParent() {
auto_parent = false;
public AbstractWidget(@Nonnull MatteryMenu menu) {
this(menu, 0, 0);
}
public AbstractWidget autoParent() {
auto_parent = true;
return this;
}

View File

@ -19,6 +19,10 @@ abstract public class GaugeWidget extends AbstractWidget {
super(menu, x, y);
}
public GaugeWidget(MatteryMenu menu) {
super(menu);
}
public GaugeDirection fill_order = GaugeDirection.BOTTOM_TO_TOP;
abstract public float getLevel();

View File

@ -18,6 +18,10 @@ abstract public class StorageGaugeWidget extends GaugeWidget {
this(menu, x, y, null, null);
}
public StorageGaugeWidget(MatteryMenu menu) {
this(menu, 0, 0, null, null);
}
public StorageGaugeWidget(MatteryMenu menu, int x, int y, Supplier<BigDecimal> value_supplier, Supplier<BigDecimal> max_value_supplier) {
super(menu, x, y);
this.value_supplier = value_supplier;
@ -27,6 +31,10 @@ abstract public class StorageGaugeWidget extends GaugeWidget {
addDataSlots(max_value_container);
}
public StorageGaugeWidget(MatteryMenu menu, Supplier<BigDecimal> value_supplier, Supplier<BigDecimal> max_value_supplier) {
this(menu, 0, 0, value_supplier, max_value_supplier);
}
@Override
public void updateServer() {
if (value_supplier == null || max_value_supplier == null)

View File

@ -11,12 +11,15 @@ import ru.dbotthepony.mc.otm.android.AndroidResearch;
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu;
import ru.dbotthepony.mc.otm.menu.slot.BatterySlot;
import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget;
import ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> {
public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> implements MatteryScreen.IMatteryScreenGaugeGetter, MatteryScreen.IMatteryScreenBatteryGetter {
class AndroidResearchButton extends EditablePanel {
public static final int BUTTON_SIZE = 18;
private final AndroidResearch node;
@ -95,6 +98,16 @@ public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> {
super(p_97741_, p_97742_, p_97743_);
}
@Override
public List<GaugeWidget> getGauges() {
return List.of(menu.battery_widget);
}
@Override
public List<BatterySlot> getBatterySlots() {
return List.of(menu.battery_slot);
}
@Nullable
@Override
protected FramePanel makeMainFrame() {

View File

@ -8,30 +8,29 @@ import ru.dbotthepony.mc.otm.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu;
import ru.dbotthepony.mc.otm.menu.BatteryBankMenu;
import ru.dbotthepony.mc.otm.menu.MatteryMenu;
import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget;
import ru.dbotthepony.mc.otm.screen.panels.Dock;
import ru.dbotthepony.mc.otm.screen.panels.FlexGridPanel;
import ru.dbotthepony.mc.otm.screen.panels.FramePanel;
import ru.dbotthepony.mc.otm.screen.panels.SlotPanel;
import javax.annotation.Nullable;
import java.util.List;
public class BatteryBankScreen extends MatteryScreen<BatteryBankMenu> {
public class BatteryBankScreen extends MatteryScreen<BatteryBankMenu> implements MatteryScreen.IMatteryScreenGaugeGetter, MatteryScreen.IMatteryScreenGridBased {
public BatteryBankScreen(BatteryBankMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
}
@Nullable
@Override
protected FramePanel makeMainFrame() {
var frame = super.makeMainFrame();
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0);
grid.setDock(Dock.FILL);
public List<GaugeWidget> getGauges() {
return List.of(menu.battery_widget);
}
@Override
public void createGridPanels(FlexGridPanel grid) {
for (var slot : menu.battery_slots) {
new SlotPanel(this, grid, 0, 0, slot);
}
return frame;
}
}

View File

@ -3,27 +3,27 @@ package ru.dbotthepony.mc.otm.screen;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.menu.MatterCapacitorBankMenu;
import ru.dbotthepony.mc.otm.menu.slot.BatterySlot;
import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget;
import ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable;
import java.util.List;
public class MatterCapacitorBankScreen extends MatteryScreen<MatterCapacitorBankMenu> {
public class MatterCapacitorBankScreen extends MatteryScreen<MatterCapacitorBankMenu> implements MatteryScreen.IMatteryScreenGaugeGetter, MatteryScreen.IMatteryScreenGridBased {
public MatterCapacitorBankScreen(MatterCapacitorBankMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
}
@Nullable
@Override
protected FramePanel makeMainFrame() {
var frame = super.makeMainFrame();
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0);
grid.setDock(Dock.FILL);
public List<GaugeWidget> getGauges() {
return List.of(menu.matter_widget);
}
@Override
public void createGridPanels(FlexGridPanel grid) {
for (var slot : menu.container_slots) {
new SlotPanel(this, grid, 0, 0, slot);
}
return frame;
}
}

View File

@ -4,28 +4,32 @@ import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.menu.MatterDecomposerMenu;
import ru.dbotthepony.mc.otm.menu.slot.BatterySlot;
import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget;
import ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable;
import java.util.List;
public class MatterDecomposerScreen extends MatteryScreen<MatterDecomposerMenu> {
public class MatterDecomposerScreen extends MatteryScreen<MatterDecomposerMenu> implements MatteryScreen.IMatteryScreenGaugeGetter, MatteryScreen.IMatteryScreenBatteryGetter, MatteryScreen.IMatteryScreenGridBased {
public MatterDecomposerScreen(MatterDecomposerMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
}
@Nullable
@Override
protected FramePanel makeMainFrame() {
var frame = super.makeMainFrame();
public List<GaugeWidget> getGauges() {
return List.of(menu.battery_widget, menu.matter_widget);
}
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0);
grid.setDock(Dock.FILL);
grid.setDockPadding(0, 0, 40, 12);
@Override
public List<BatterySlot> getBatterySlots() {
return List.of(menu.battery_slot);
}
@Override
public void createGridPanels(FlexGridPanel grid) {
new SlotPanel(this, grid, 0, 0, menu.input).setDockMargin(2, 0, 2, 0);
new MatteryWidgetPanel(this, grid, menu.progress).setDockMargin(2, 0, 2, 0);
new SlotPanel(this, grid, 0, 0, menu.output).setDockMargin(2, 0, 2, 0);
return frame;
}
}

View File

@ -3,30 +3,34 @@ package ru.dbotthepony.mc.otm.screen;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.menu.MatterReplicatorMenu;
import ru.dbotthepony.mc.otm.menu.slot.BatterySlot;
import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget;
import ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable;
import java.util.List;
public class MatterReplicatorScreen extends MatteryScreen<MatterReplicatorMenu> {
public class MatterReplicatorScreen extends MatteryScreen<MatterReplicatorMenu> implements MatteryScreen.IMatteryScreenGaugeGetter, MatteryScreen.IMatteryScreenBatteryGetter, MatteryScreen.IMatteryScreenGridBased {
public MatterReplicatorScreen(MatterReplicatorMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
}
@Nullable
@Override
protected FramePanel makeMainFrame() {
var frame = super.makeMainFrame();
public List<GaugeWidget> getGauges() {
return List.of(menu.battery_widget, menu.matter_widget);
}
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0);
grid.setDock(Dock.FILL);
grid.setDockPadding(0, 0, 40, 12);
@Override
public List<BatterySlot> getBatterySlots() {
return List.of(menu.battery_slot);
}
@Override
public void createGridPanels(FlexGridPanel grid) {
new MatteryWidgetPanel(this, grid, menu.progress).setDockMargin(2, 0, 2, 0);
for (var slot : menu.output_slots) {
new SlotPanel(this, grid, 0, 0, slot);
}
return frame;
}
}

View File

@ -3,27 +3,31 @@ package ru.dbotthepony.mc.otm.screen;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.menu.MatterScannerMenu;
import ru.dbotthepony.mc.otm.menu.slot.BatterySlot;
import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget;
import ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable;
import java.util.List;
public class MatterScannerScreen extends MatteryScreen<MatterScannerMenu> {
public class MatterScannerScreen extends MatteryScreen<MatterScannerMenu> implements MatteryScreen.IMatteryScreenGaugeGetter, MatteryScreen.IMatteryScreenBatteryGetter, MatteryScreen.IMatteryScreenGridBased {
public MatterScannerScreen(MatterScannerMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
}
@Nullable
@Override
protected FramePanel makeMainFrame() {
var frame = super.makeMainFrame();
public List<GaugeWidget> getGauges() {
return List.of(menu.battery_widget);
}
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0);
grid.setDock(Dock.FILL);
grid.setDockPadding(0, 0, 40, 12);
@Override
public List<BatterySlot> getBatterySlots() {
return List.of(menu.battery_slot);
}
@Override
public void createGridPanels(FlexGridPanel grid) {
new SlotPanel(this, grid, 0, 0, menu.input).setDockMargin(2, 0, 2, 0);
new MatteryWidgetPanel(this, grid, menu.progress).setDockMargin(2, 0, 2, 0);
return frame;
}
}

View File

@ -22,12 +22,15 @@ import net.minecraft.world.item.ItemStack;
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.menu.MatteryMenu;
import ru.dbotthepony.mc.otm.menu.PoweredMatteryMenu;
import ru.dbotthepony.mc.otm.menu.slot.BatterySlot;
import ru.dbotthepony.mc.otm.menu.slot.MatterySlot;
import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget;
import ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
@ -43,6 +46,20 @@ import java.util.Set;
* @param <T> type of menu, which extends MatteryMenu
*/
public abstract class MatteryScreen<T extends MatteryMenu> extends AbstractContainerScreen<T> {
public interface IMatteryScreenLeftPanel {}
public interface IMatteryScreenGaugeGetter extends IMatteryScreenLeftPanel {
List<GaugeWidget> getGauges();
}
public interface IMatteryScreenBatteryGetter extends IMatteryScreenLeftPanel {
List<BatterySlot> getBatterySlots();
}
public interface IMatteryScreenGridBased {
void createGridPanels(FlexGridPanel grid);
}
public static final float SNAPBACK_SPEED = 100.0F;
public static final int QUICKDROP_DELAY = 500;
public static final int DOUBLECLICK_SPEED = 250;
@ -128,14 +145,73 @@ public abstract class MatteryScreen<T extends MatteryMenu> extends AbstractConta
panels.remove(panel);
}
/**
* Default implementation allows for builder-like creation of main frame panel
* achieved by this implementing specific interfaces
*
* can be freely overridden by child classes
*
* @return FramePanel created, or null
*/
@Nullable
protected FramePanel makeMainFrame() {
var frame = new FramePanel(this, null, 0, 0, 18 * 9 + 16, 100, getTitle());
if (menu instanceof PoweredMatteryMenu) {
// reserve 30 pixels on left
var reserve = new EditablePanel(this, frame, 0, 0, 30, 0);
if (this instanceof IMatteryScreenLeftPanel) {
var reserve = new EditablePanel(this, frame, 0, 0, 0, 0);
reserve.setDock(Dock.LEFT);
float available_height = 90;
if (this instanceof IMatteryScreenGaugeGetter gauges) {
float width = 0;
float height = 0;
for (var gauge : gauges.getGauges()) {
width += gauge.getImageWidth();
height = Math.max(height, gauge.getImageHeight());
}
width += 2;
var grid_gauges = new FlexGridPanel(this, reserve, 0, 0, width, height);
if (!(this instanceof IMatteryScreenBatteryGetter))
grid_gauges.setDock(Dock.FILL);
else
grid_gauges.setDock(Dock.TOP);
for (var gauge : gauges.getGauges()) {
new MatteryWidgetPanel(this, grid_gauges, gauge);
}
reserve.setWidth(Math.max(width, reserve.getWidth()));
available_height -= height;
}
if (this instanceof IMatteryScreenBatteryGetter batteries) {
var get = batteries.getBatterySlots();
int capacity = Math.max(1, ((int) available_height) / 18);
reserve.setWidth(Math.max((float) Math.ceil(get.size() / (float) capacity) * 18, reserve.getWidth()));
var grid = new FlexGridPanel(this, reserve, 0, 0, width, height);
grid.setDock(Dock.FILL);
for (var slot : get) {
new SlotPanel<>(this, grid, slot);
}
}
reserve.setWidth(reserve.getWidth() + 4);
reserve.setDockPadding(4, 0, 0, 0);
}
if (this instanceof IMatteryScreenGridBased grid_based) {
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0);
grid.setDock(Dock.FILL);
grid_based.createGridPanels(grid);
}
return frame;