|
3 | 3 | import com.gregtechceu.gtceu.api.capability.IControllable; |
4 | 4 | import com.gregtechceu.gtceu.api.capability.recipe.IO; |
5 | 5 | import com.gregtechceu.gtceu.api.gui.GuiTextures; |
6 | | -import com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget; |
7 | | -import com.gregtechceu.gtceu.api.gui.widget.TankWidget; |
8 | | -import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; |
9 | 6 | import com.gregtechceu.gtceu.api.item.tool.GTToolType; |
10 | 7 | import com.gregtechceu.gtceu.api.machine.*; |
11 | 8 | import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; |
12 | 9 | import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; |
13 | | -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; |
14 | 10 | import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; |
| 11 | +import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; |
15 | 12 | import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; |
| 13 | +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; |
| 14 | +import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; |
| 15 | +import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; |
| 16 | +import com.gregtechceu.gtceu.api.mui.utils.Alignment; |
| 17 | +import com.gregtechceu.gtceu.api.mui.value.BoolValue; |
| 18 | +import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue; |
| 19 | +import com.gregtechceu.gtceu.api.mui.value.sync.FluidSlotSyncHandler; |
| 20 | +import com.gregtechceu.gtceu.api.mui.value.sync.LongSyncValue; |
| 21 | +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; |
| 22 | +import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers; |
| 23 | +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; |
| 24 | +import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; |
| 25 | +import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton; |
| 26 | +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; |
| 27 | +import com.gregtechceu.gtceu.api.mui.widgets.slot.FluidSlot; |
16 | 28 | import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; |
17 | 29 | import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; |
| 30 | +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; |
| 31 | +import com.gregtechceu.gtceu.client.mui.screen.UISettings; |
| 32 | +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; |
| 33 | +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; |
18 | 34 | import com.gregtechceu.gtceu.utils.FormattingUtil; |
19 | 35 | import com.gregtechceu.gtceu.utils.GTMath; |
20 | 36 | import com.gregtechceu.gtceu.utils.GTTransferUtils; |
21 | 37 |
|
22 | | -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; |
23 | 38 | import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; |
24 | | -import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; |
25 | | -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; |
26 | | -import com.lowdragmc.lowdraglib.gui.widget.Widget; |
27 | | -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; |
28 | 39 | import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; |
29 | 40 | import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; |
30 | 41 | import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; |
|
45 | 56 | import net.minecraft.world.phys.BlockHitResult; |
46 | 57 | import net.minecraftforge.fluids.FluidStack; |
47 | 58 | import net.minecraftforge.fluids.FluidUtil; |
| 59 | +import net.minecraftforge.fluids.IFluidTank; |
48 | 60 | import net.minecraftforge.fluids.capability.IFluidHandler; |
49 | 61 | import net.minecraftforge.items.IItemHandlerModifiable; |
50 | 62 |
|
|
64 | 76 | @ParametersAreNonnullByDefault |
65 | 77 | @MethodsReturnNonnullByDefault |
66 | 78 | public class QuantumTankMachine extends TieredMachine implements IAutoOutputFluid, IInteractedMachine, IControllable, |
67 | | - IDropSaveMachine, IFancyUIMachine { |
| 79 | + IDropSaveMachine, IMuiMachine { |
68 | 80 |
|
69 | 81 | public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(QuantumTankMachine.class, |
70 | 82 | MetaMachine.MANAGED_FIELD_HOLDER); |
@@ -331,34 +343,97 @@ public FluidStack getLockedFluid() { |
331 | 343 | ////////////////////////////////////// |
332 | 344 | // *********** GUI ***********// |
333 | 345 | ////////////////////////////////////// |
334 | | - public Widget createUIWidget() { |
335 | | - var group = new WidgetGroup(0, 0, 90, 63); |
336 | | - group.addWidget(new ImageWidget(4, 4, 82, 55, GuiTextures.DISPLAY)) |
337 | | - .addWidget(new LabelWidget(8, 8, "gtceu.gui.fluid_amount")) |
338 | | - .addWidget(new LabelWidget(8, 18, () -> FormattingUtil.formatBuckets(storedAmount)) |
339 | | - .setTextColor(-1) |
340 | | - .setDropShadow(false)) |
341 | | - .addWidget(new TankWidget(cache, 0, 68, 23, true, true) |
342 | | - .setShowAmount(false) |
343 | | - .setBackground(GuiTextures.FLUID_SLOT)) |
344 | | - .addWidget(new PhantomFluidWidget(lockedFluid, 0, 68, 41, 18, 18, |
345 | | - this::getLockedFluid, this::setLocked) |
346 | | - .setShowAmount(false) |
347 | | - .setBackground(ColorPattern.T_GRAY.rectTexture())) |
348 | | - .addWidget(new ToggleButtonWidget(4, 41, 18, 18, |
349 | | - GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids) |
350 | | - .setShouldUseBaseBackground() |
351 | | - .setTooltipText("gtceu.gui.fluid_auto_output.tooltip")) |
352 | | - .addWidget(new ToggleButtonWidget(22, 41, 18, 18, |
353 | | - GuiTextures.BUTTON_LOCK, this::isLocked, this::setLocked) |
354 | | - .setShouldUseBaseBackground() |
355 | | - .setTooltipText("gtceu.gui.fluid_lock.tooltip")) |
356 | | - .addWidget(new ToggleButtonWidget(40, 41, 18, 18, |
357 | | - GuiTextures.BUTTON_VOID, () -> isVoiding, (b) -> isVoiding = b) |
358 | | - .setShouldUseBaseBackground() |
359 | | - .setTooltipText("gtceu.gui.fluid_voiding_partial.tooltip")); |
360 | | - group.setBackground(GuiTextures.BACKGROUND_INVERSE); |
361 | | - return group; |
| 346 | + // TODO: Needs AOI widget |
| 347 | + @Override |
| 348 | + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { |
| 349 | + LongSyncValue bucketSyncer = new LongSyncValue(this::getStoredAmount, (ignored) -> {}); |
| 350 | + syncManager.syncValue("bucket_amount", bucketSyncer); |
| 351 | + |
| 352 | + return new ModularPanel(this.getDefinition().getName()) |
| 353 | + .child( |
| 354 | + // Top half of the screen |
| 355 | + new ParentWidget<>() |
| 356 | + .widthRel(1) |
| 357 | + .height(20 + 60) |
| 358 | + // Box that has the display texture BG + |
| 359 | + // the buttons / text / etc |
| 360 | + .child(new ParentWidget<>() |
| 361 | + .background(GTGuiTextures.DISPLAY) |
| 362 | + .size(90, 63) |
| 363 | + .align(Alignment.CENTER) |
| 364 | + .child(IKey.lang("gtceu.gui.fluid_amount").asWidget() |
| 365 | + .color(0xffffff) |
| 366 | + .margin(8, 0, 8, 0)) |
| 367 | + .child(IKey.dynamic( |
| 368 | + () -> Component.literal( |
| 369 | + FormattingUtil.formatBuckets(bucketSyncer.getLongValue()))) |
| 370 | + .asWidget() |
| 371 | + .color(0xffffff) |
| 372 | + .margin(8, 0, 18, 0)) |
| 373 | + .child(Flow.row() |
| 374 | + .margin(4, 0, 41, 0) |
| 375 | + .coverChildren() |
| 376 | + .child(createAutoOutputFluidButton(syncManager)) |
| 377 | + .child(createFluidLockButton(syncManager)) |
| 378 | + .child(createVoidButton(syncManager))) |
| 379 | + .child(Flow.column() |
| 380 | + .margin(68, 0, 23, 0) |
| 381 | + .coverChildren() |
| 382 | + .child(createFluidSlot(syncManager)) |
| 383 | + .child(createPhantomLockedFluidSlot(syncManager))))) |
| 384 | + .child(GTMuiWidgets.createTitleBar(getDefinition(), 176, GTGuiTextures.BACKGROUND)) |
| 385 | + .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); |
| 386 | + } |
| 387 | + |
| 388 | + private ToggleButton createAutoOutputFluidButton(PanelSyncManager syncManager) { |
| 389 | + BooleanSyncValue fluidOutputs = new BooleanSyncValue(this::isAutoOutputFluids, |
| 390 | + this::setAutoOutputFluids); |
| 391 | + syncManager.syncValue("auto_output_fluids", fluidOutputs); |
| 392 | + return new ToggleButton() |
| 393 | + .value(new BoolValue.Dynamic(fluidOutputs::getBoolValue, fluidOutputs::setBoolValue)) |
| 394 | + .overlay(GTGuiTextures.BUTTON_FLUID_OUTPUT) |
| 395 | + .tooltipAutoUpdate(true) |
| 396 | + .tooltipBuilder((r) -> r.addLine(IKey.lang(Component.translatable("gtceu.gui.fluid_auto_output", |
| 397 | + Component.translatable(fluidOutputs.getBoolValue() ? "cover.voiding.label.enabled" : |
| 398 | + "cover.voiding.label.disabled"))))); |
| 399 | + } |
| 400 | + |
| 401 | + private ToggleButton createFluidLockButton(PanelSyncManager syncManager) { |
| 402 | + BooleanSyncValue fluidLocked = new BooleanSyncValue(this::isLocked, |
| 403 | + this::setLocked); |
| 404 | + syncManager.syncValue("fluid_locked", fluidLocked); |
| 405 | + return new ToggleButton() |
| 406 | + .value(new BoolValue.Dynamic(fluidLocked::getBoolValue, fluidLocked::setBoolValue)) |
| 407 | + .overlay(GTGuiTextures.BUTTON_LOCK) |
| 408 | + .tooltipAutoUpdate(true) |
| 409 | + .tooltipBuilder((r) -> r.addLine(IKey.lang(fluidLocked.getBoolValue() ? |
| 410 | + "gtceu.gui.fluid_lock.tooltip.enabled" : |
| 411 | + "gtceu.gui.fluid_lock.tooltip.disabled"))); |
| 412 | + } |
| 413 | + |
| 414 | + private ToggleButton createVoidButton(PanelSyncManager syncManager) { |
| 415 | + BooleanSyncValue voiding = new BooleanSyncValue(() -> this.isVoiding, |
| 416 | + (voidingBool) -> { this.isVoiding = voidingBool; }); |
| 417 | + syncManager.syncValue("is_voiding", voiding); |
| 418 | + return new ToggleButton() |
| 419 | + .value(new BoolValue.Dynamic(voiding::getBoolValue, voiding::setBoolValue)) |
| 420 | + .overlay(GTGuiTextures.BUTTON_VOID) |
| 421 | + .tooltipAutoUpdate(true) |
| 422 | + .tooltipBuilder((r) -> r.addLine(IKey.lang(voiding.getBoolValue() ? |
| 423 | + "gtceu.gui.fluid_voiding_partial.tooltip.enabled" : |
| 424 | + "gtceu.gui.fluid_voiding_partial.tooltip.disabled"))); |
| 425 | + } |
| 426 | + |
| 427 | + private IWidget createFluidSlot(PanelSyncManager syncManager) { |
| 428 | + syncManager.syncValue("fluid_slot", |
| 429 | + SyncHandlers.fluidSlot(new FluidCacheTankWrapper(cache)).controlsAmount(false)); |
| 430 | + return new FluidSlot().syncHandler("fluid_slot", 0).background(GTGuiTextures.FLUID_SLOT); |
| 431 | + } |
| 432 | + |
| 433 | + private IWidget createPhantomLockedFluidSlot(PanelSyncManager syncManager) { |
| 434 | + syncManager.syncValue("locked_fluid_slot", |
| 435 | + new FluidSlotSyncHandler(lockedFluid).controlsAmount(false).phantom(true)); |
| 436 | + return new FluidSlot().syncHandler("locked_fluid_slot", 0).background(GTGuiTextures.FLUID_SLOT); |
362 | 437 | } |
363 | 438 |
|
364 | 439 | ////////////////////////////////////// |
@@ -461,4 +536,48 @@ public ManagedFieldHolder getFieldHolder() { |
461 | 536 | return MANAGED_FIELD_HOLDER; |
462 | 537 | } |
463 | 538 | } |
| 539 | + |
| 540 | + protected class FluidCacheTankWrapper implements IFluidTank { |
| 541 | + |
| 542 | + private final FluidCache cache; |
| 543 | + |
| 544 | + public FluidCacheTankWrapper(FluidCache cache) { |
| 545 | + this.cache = cache; |
| 546 | + } |
| 547 | + |
| 548 | + @Override |
| 549 | + public @NotNull FluidStack getFluid() { |
| 550 | + return cache.getFluidInTank(0); |
| 551 | + } |
| 552 | + |
| 553 | + @Override |
| 554 | + public int getFluidAmount() { |
| 555 | + return cache.getFluidInTank(0).getAmount(); |
| 556 | + } |
| 557 | + |
| 558 | + @Override |
| 559 | + public int getCapacity() { |
| 560 | + return cache.getTankCapacity(0); |
| 561 | + } |
| 562 | + |
| 563 | + @Override |
| 564 | + public boolean isFluidValid(FluidStack fluidStack) { |
| 565 | + return cache.isFluidValid(0, fluidStack); |
| 566 | + } |
| 567 | + |
| 568 | + @Override |
| 569 | + public int fill(FluidStack fluidStack, IFluidHandler.FluidAction fluidAction) { |
| 570 | + return cache.fill(fluidStack, fluidAction); |
| 571 | + } |
| 572 | + |
| 573 | + @Override |
| 574 | + public @NotNull FluidStack drain(int i, IFluidHandler.FluidAction fluidAction) { |
| 575 | + return cache.drain(i, fluidAction); |
| 576 | + } |
| 577 | + |
| 578 | + @Override |
| 579 | + public @NotNull FluidStack drain(FluidStack fluidStack, IFluidHandler.FluidAction fluidAction) { |
| 580 | + return cache.drain(fluidStack, fluidAction); |
| 581 | + } |
| 582 | + } |
464 | 583 | } |
0 commit comments