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); this(p_38852_, inventory, null);
} }
public MatterLevelWidget matter; public MatterLevelWidget matter_widget;
public MatterContainerInputSlot[] container_slots = new MatterContainerInputSlot[2 * 6]; 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); super(Registry.Menus.MATTER_CAPACITOR_BANK, p_38852_, inventory, tile);
if (tile == null) { if (tile == null) {
matter = new MatterLevelWidget(this, 14, 20); matter_widget = new MatterLevelWidget(this, 14, 20);
} else { } 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); 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 MatterySlot input;
public MachineOutputSlot output; public MachineOutputSlot output;
public ProgressGaugeWidget progress; public ProgressGaugeWidget progress;
public MatterLevelWidget matter_widget;
public MatterDecomposerMenu(int containerID, Inventory inventory, @Nullable BlockEntityMatterDecomposer tile) { public MatterDecomposerMenu(int containerID, Inventory inventory, @Nullable BlockEntityMatterDecomposer tile) {
super(Registry.Menus.MATTER_DECOMPOSER, containerID, inventory, tile); super(Registry.Menus.MATTER_DECOMPOSER, containerID, inventory, tile);
@ -43,15 +44,13 @@ public class MatterDecomposerMenu extends PoweredMatteryMenu {
addSlot(output); addSlot(output);
if (tile == null || tile.getCapability(MatteryCapability.MATTER).resolve().isEmpty()) { 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); progress = new ProgressGaugeWidget(this, 61 + 18 + 3, 36);
} else { } 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 = new ProgressGaugeWidget(this, 61 + 18 + 3, 36, () -> (float) tile.getWorkProgress(), tile::cantProcessJob);
} }
progress.noAutoParent();
addBatterySlot(14); addBatterySlot(14);
addInventorySlots(); addInventorySlots();
} }

View File

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

View File

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

View File

@ -15,6 +15,7 @@ abstract public class PoweredMatteryMenu extends MatteryMenu {
protected BlockEntityMatteryPowered tile; protected BlockEntityMatteryPowered tile;
public BatteryLevelWidget battery_widget; public BatteryLevelWidget battery_widget;
public BatterySlot battery_slot;
protected PoweredMatteryMenu( protected PoweredMatteryMenu(
@Nullable MenuType<?> menuType, @Nullable MenuType<?> menuType,
@ -42,6 +43,7 @@ abstract public class PoweredMatteryMenu extends MatteryMenu {
protected void addBatterySlot(int x, int y) { protected void addBatterySlot(int x, int y) {
Container battery_container = tile != null ? tile.battery_container : new SimpleContainer(1); 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; public int y;
protected Consumer<ContainerData> register_data; protected Consumer<ContainerData> register_data;
public boolean auto_parent = true; public boolean auto_parent = false;
public abstract int getImageWidth(); public abstract int getImageWidth();
public abstract int getImageHeight(); public abstract int getImageHeight();
@ -44,8 +44,12 @@ public abstract class AbstractWidget {
menu.addWidget(this, (consumer) -> register_data = consumer); menu.addWidget(this, (consumer) -> register_data = consumer);
} }
public AbstractWidget noAutoParent() { public AbstractWidget(@Nonnull MatteryMenu menu) {
auto_parent = false; this(menu, 0, 0);
}
public AbstractWidget autoParent() {
auto_parent = true;
return this; return this;
} }

View File

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

View File

@ -18,6 +18,10 @@ abstract public class StorageGaugeWidget extends GaugeWidget {
this(menu, x, y, null, null); 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) { public StorageGaugeWidget(MatteryMenu menu, int x, int y, Supplier<BigDecimal> value_supplier, Supplier<BigDecimal> max_value_supplier) {
super(menu, x, y); super(menu, x, y);
this.value_supplier = value_supplier; this.value_supplier = value_supplier;
@ -27,6 +31,10 @@ abstract public class StorageGaugeWidget extends GaugeWidget {
addDataSlots(max_value_container); 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 @Override
public void updateServer() { public void updateServer() {
if (value_supplier == null || max_value_supplier == null) 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.MatteryCapability;
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer; import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu; 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 ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; 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 { class AndroidResearchButton extends EditablePanel {
public static final int BUTTON_SIZE = 18; public static final int BUTTON_SIZE = 18;
private final AndroidResearch node; private final AndroidResearch node;
@ -95,6 +98,16 @@ public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> {
super(p_97741_, p_97742_, p_97743_); 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 @Nullable
@Override @Override
protected FramePanel makeMainFrame() { 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.AndroidStationMenu;
import ru.dbotthepony.mc.otm.menu.BatteryBankMenu; import ru.dbotthepony.mc.otm.menu.BatteryBankMenu;
import ru.dbotthepony.mc.otm.menu.MatteryMenu; 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.Dock;
import ru.dbotthepony.mc.otm.screen.panels.FlexGridPanel; import ru.dbotthepony.mc.otm.screen.panels.FlexGridPanel;
import ru.dbotthepony.mc.otm.screen.panels.FramePanel; import ru.dbotthepony.mc.otm.screen.panels.FramePanel;
import ru.dbotthepony.mc.otm.screen.panels.SlotPanel; import ru.dbotthepony.mc.otm.screen.panels.SlotPanel;
import javax.annotation.Nullable; 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_) { public BatteryBankScreen(BatteryBankMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_); super(p_97741_, p_97742_, p_97743_);
} }
@Nullable
@Override @Override
protected FramePanel makeMainFrame() { public List<GaugeWidget> getGauges() {
var frame = super.makeMainFrame(); return List.of(menu.battery_widget);
}
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0);
grid.setDock(Dock.FILL);
@Override
public void createGridPanels(FlexGridPanel grid) {
for (var slot : menu.battery_slots) { for (var slot : menu.battery_slots) {
new SlotPanel(this, grid, 0, 0, slot); 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.network.chat.Component;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.menu.MatterCapacitorBankMenu; 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 ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable; 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_) { public MatterCapacitorBankScreen(MatterCapacitorBankMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_); super(p_97741_, p_97742_, p_97743_);
} }
@Nullable
@Override @Override
protected FramePanel makeMainFrame() { public List<GaugeWidget> getGauges() {
var frame = super.makeMainFrame(); return List.of(menu.matter_widget);
}
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0);
grid.setDock(Dock.FILL);
@Override
public void createGridPanels(FlexGridPanel grid) {
for (var slot : menu.container_slots) { for (var slot : menu.container_slots) {
new SlotPanel(this, grid, 0, 0, slot); 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.network.chat.Component;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.menu.MatterDecomposerMenu; 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 ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable; 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_) { public MatterDecomposerScreen(MatterDecomposerMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_); super(p_97741_, p_97742_, p_97743_);
} }
@Nullable
@Override @Override
protected FramePanel makeMainFrame() { public List<GaugeWidget> getGauges() {
var frame = super.makeMainFrame(); return List.of(menu.battery_widget, menu.matter_widget);
}
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0); @Override
grid.setDock(Dock.FILL); public List<BatterySlot> getBatterySlots() {
grid.setDockPadding(0, 0, 40, 12); 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 SlotPanel(this, grid, 0, 0, menu.input).setDockMargin(2, 0, 2, 0);
new MatteryWidgetPanel(this, grid, menu.progress).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); 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.network.chat.Component;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.menu.MatterReplicatorMenu; 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 ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable; 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_) { public MatterReplicatorScreen(MatterReplicatorMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_); super(p_97741_, p_97742_, p_97743_);
} }
@Nullable
@Override @Override
protected FramePanel makeMainFrame() { public List<GaugeWidget> getGauges() {
var frame = super.makeMainFrame(); return List.of(menu.battery_widget, menu.matter_widget);
}
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0); @Override
grid.setDock(Dock.FILL); public List<BatterySlot> getBatterySlots() {
grid.setDockPadding(0, 0, 40, 12); return List.of(menu.battery_slot);
}
@Override
public void createGridPanels(FlexGridPanel grid) {
new MatteryWidgetPanel(this, grid, menu.progress).setDockMargin(2, 0, 2, 0); new MatteryWidgetPanel(this, grid, menu.progress).setDockMargin(2, 0, 2, 0);
for (var slot : menu.output_slots) { for (var slot : menu.output_slots) {
new SlotPanel(this, grid, 0, 0, slot); 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.network.chat.Component;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.menu.MatterScannerMenu; 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 ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable; 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_) { public MatterScannerScreen(MatterScannerMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_); super(p_97741_, p_97742_, p_97743_);
} }
@Nullable
@Override @Override
protected FramePanel makeMainFrame() { public List<GaugeWidget> getGauges() {
var frame = super.makeMainFrame(); return List.of(menu.battery_widget);
}
var grid = new FlexGridPanel(this, frame, 0, 0, 0, 0); @Override
grid.setDock(Dock.FILL); public List<BatterySlot> getBatterySlots() {
grid.setDockPadding(0, 0, 40, 12); 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 SlotPanel(this, grid, 0, 0, menu.input).setDockMargin(2, 0, 2, 0);
new MatteryWidgetPanel(this, grid, menu.progress).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.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.menu.MatteryMenu; import ru.dbotthepony.mc.otm.menu.MatteryMenu;
import ru.dbotthepony.mc.otm.menu.PoweredMatteryMenu; 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.slot.MatterySlot;
import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget;
import ru.dbotthepony.mc.otm.screen.panels.*; import ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Set; import java.util.Set;
/** /**
@ -43,6 +46,20 @@ import java.util.Set;
* @param <T> type of menu, which extends MatteryMenu * @param <T> type of menu, which extends MatteryMenu
*/ */
public abstract class MatteryScreen<T extends MatteryMenu> extends AbstractContainerScreen<T> { 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 float SNAPBACK_SPEED = 100.0F;
public static final int QUICKDROP_DELAY = 500; public static final int QUICKDROP_DELAY = 500;
public static final int DOUBLECLICK_SPEED = 250; public static final int DOUBLECLICK_SPEED = 250;
@ -128,14 +145,73 @@ public abstract class MatteryScreen<T extends MatteryMenu> extends AbstractConta
panels.remove(panel); 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 @Nullable
protected FramePanel makeMainFrame() { protected FramePanel makeMainFrame() {
var frame = new FramePanel(this, null, 0, 0, 18 * 9 + 16, 100, getTitle()); var frame = new FramePanel(this, null, 0, 0, 18 * 9 + 16, 100, getTitle());
if (menu instanceof PoweredMatteryMenu) { if (this instanceof IMatteryScreenLeftPanel) {
// reserve 30 pixels on left var reserve = new EditablePanel(this, frame, 0, 0, 0, 0);
var reserve = new EditablePanel(this, frame, 0, 0, 30, 0);
reserve.setDock(Dock.LEFT); 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; return frame;