diff --git a/src/main/java/vswe/stevesfactory/Config.java b/src/main/java/vswe/stevesfactory/Config.java index 2dac3776c..fdab4fa6c 100644 --- a/src/main/java/vswe/stevesfactory/Config.java +++ b/src/main/java/vswe/stevesfactory/Config.java @@ -138,8 +138,6 @@ public static final class ClientCategory { // Factory manager GUI options public final BooleanValue useFixedSizeScreen; public final BooleanValue useBackgroundOnFullscreen; - public final IntValue defaultEditorMoveSpeed; - public final IntValue acceleratedEditorMoveSpeed; private ClientCategory(Builder builder) { builder.comment("General client config options").push("general"); @@ -165,12 +163,6 @@ private ClientCategory(Builder builder) { useBackgroundOnFullscreen = builder .comment("Enable to use vanilla background instead of a plain rectangle") .define("useBackgroundOnFullscreen", false); - defaultEditorMoveSpeed = builder - .comment("Determines how fast arrow keys moving is (for editor panel)") - .defineInRange("defaultEditorMoveSpeed", 2, 0, Integer.MAX_VALUE); - acceleratedEditorMoveSpeed = builder - .comment("Determines how fast arrow keys moving is, while Shift is pressed") - .defineInRange("acceleratedEditorMoveSpeed", 20, 0, Integer.MAX_VALUE); builder.pop(); } } diff --git a/src/main/java/vswe/stevesfactory/library/gui/RenderingHelper.java b/src/main/java/vswe/stevesfactory/library/gui/RenderingHelper.java index 6b4d94451..d336c3278 100644 --- a/src/main/java/vswe/stevesfactory/library/gui/RenderingHelper.java +++ b/src/main/java/vswe/stevesfactory/library/gui/RenderingHelper.java @@ -139,6 +139,13 @@ public static void drawColorLogic(int x, int y, int width, int height, int red, RenderSystem.enableTexture(); } + public static void drawBorderedBox(int x1, int y1, int x2, int y2) { + GlStateManager.disableTexture(); + drawRect(x1, y1, x2, y2, 0xff404040); + drawRect(x1 + 1, y1 + 1, x2 - 1, y2 - 1, 0xff5e5e5e); + GlStateManager.enableTexture(); + } + public static void drawThickBeveledBox(int x1, int y1, int x2, int y2, int thickness, int topLeftColor, int bottomRightColor, int fillColor) { RenderSystem.disableTexture(); drawRect(x1, y1, x2, y2, bottomRightColor); diff --git a/src/main/java/vswe/stevesfactory/library/gui/ScissorTest.java b/src/main/java/vswe/stevesfactory/library/gui/ScissorTest.java index 96058b46c..5a41ec5b6 100644 --- a/src/main/java/vswe/stevesfactory/library/gui/ScissorTest.java +++ b/src/main/java/vswe/stevesfactory/library/gui/ScissorTest.java @@ -25,8 +25,6 @@ public final class ScissorTest { public static ScissorTest scaled(int x, int y, int width, int height) { MainWindow mainWindow = Minecraft.getInstance().getMainWindow(); double scale = mainWindow.getGuiScaleFactor(); - x += RenderingHelper.getTranslationX(); - y += RenderingHelper.getTranslationY(); return new ScissorTest((int) (x * scale), (int) (mainWindow.getHeight() - ((y + height) * scale)), (int) (width * scale), (int) (height * scale)); } diff --git a/src/main/java/vswe/stevesfactory/library/gui/TextureWrapper.java b/src/main/java/vswe/stevesfactory/library/gui/TextureWrapper.java index 282e73a18..fa0cd9aaa 100644 --- a/src/main/java/vswe/stevesfactory/library/gui/TextureWrapper.java +++ b/src/main/java/vswe/stevesfactory/library/gui/TextureWrapper.java @@ -1,6 +1,7 @@ package vswe.stevesfactory.library.gui; import com.google.common.base.MoreObjects; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.ResourceLocation; @@ -9,6 +10,8 @@ import java.awt.*; +import static org.lwjgl.opengl.GL11.GL_QUADS; + /** * Wraps around a ResourceLocation, used to simplify drawing 2D textures. */ @@ -57,8 +60,10 @@ public void draw(int x, int y) { } public void draw(int x, int y, int width, int height) { + RenderSystem.enableAlphaTest(); + RenderSystem.color3f(1F, 1F, 1F); RenderingHelper.bindTexture(texture); - RenderingHelper.getRenderer().begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); + RenderingHelper.getRenderer().begin(GL_QUADS, DefaultVertexFormats.POSITION_TEX); vertices(x, y, width, height); Tessellator.getInstance().draw(); } diff --git a/src/main/java/vswe/stevesfactory/library/gui/widget/CallbackIconButton.java b/src/main/java/vswe/stevesfactory/library/gui/widget/CallbackIconButton.java new file mode 100644 index 000000000..fe094477d --- /dev/null +++ b/src/main/java/vswe/stevesfactory/library/gui/widget/CallbackIconButton.java @@ -0,0 +1,59 @@ +package vswe.stevesfactory.library.gui.widget; + +import com.google.common.base.Preconditions; +import it.unimi.dsi.fastutil.ints.Int2BooleanFunction; +import vswe.stevesfactory.library.gui.TextureWrapper; + +public class CallbackIconButton extends AbstractIconButton { + + public static final Int2BooleanFunction DUMMY = b -> false; + + private TextureWrapper textureNormal; + private TextureWrapper textureHovering; + public Int2BooleanFunction onClick = DUMMY; + + public CallbackIconButton(TextureWrapper textureNormal, TextureWrapper textureHovering) { + super(0, 0, 0, 0); + this.setTextures(textureNormal, textureHovering); + } + + @Override + public TextureWrapper getTextureNormal() { + return textureNormal; + } + + @Override + public TextureWrapper getTextureHovered() { + return textureHovering; + } + + public void setTextureNormal(TextureWrapper textureNormal) { + checkArguments(textureNormal, textureHovering); + this.textureNormal = textureNormal; + this.setDimensions(textureNormal.getPortionWidth(), textureNormal.getPortionHeight()); + } + + public void setTextureHovering(TextureWrapper textureHovering) { + checkArguments(textureNormal, textureHovering); + this.textureHovering = textureHovering; + this.setDimensions(textureHovering.getPortionWidth(), textureHovering.getPortionHeight()); + } + + public void setTextures(TextureWrapper textureNormal, TextureWrapper textureHovering) { + checkArguments(textureNormal, textureHovering); + this.textureNormal = textureNormal; + this.textureHovering = textureHovering; + // Either one is fine, since we checked that they are the same size + this.setDimensions(textureNormal.getPortionWidth(), textureNormal.getPortionHeight()); + } + + private static void checkArguments(TextureWrapper textureNormal, TextureWrapper textureHovering) { + Preconditions.checkArgument(textureNormal.getPortionWidth() == textureHovering.getPortionWidth()); + Preconditions.checkArgument(textureNormal.getPortionHeight() == textureHovering.getPortionHeight()); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + return onClick.apply(button); + } +} diff --git a/src/main/java/vswe/stevesfactory/library/gui/widget/TextList.java b/src/main/java/vswe/stevesfactory/library/gui/widget/TextList.java index ac429aa77..10f64c13a 100644 --- a/src/main/java/vswe/stevesfactory/library/gui/widget/TextList.java +++ b/src/main/java/vswe/stevesfactory/library/gui/widget/TextList.java @@ -1,6 +1,5 @@ package vswe.stevesfactory.library.gui.widget; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; import vswe.stevesfactory.library.gui.debug.RenderEventDispatcher; diff --git a/src/main/java/vswe/stevesfactory/library/gui/window/Dialog.java b/src/main/java/vswe/stevesfactory/library/gui/window/Dialog.java index 9ebc2d4de..7498d5e74 100644 --- a/src/main/java/vswe/stevesfactory/library/gui/window/Dialog.java +++ b/src/main/java/vswe/stevesfactory/library/gui/window/Dialog.java @@ -15,31 +15,23 @@ import java.awt.*; import java.util.ArrayList; import java.util.List; -import java.util.function.*; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.IntConsumer; +import java.util.function.Supplier; public class Dialog extends AbstractPopupWindow { - public static Dialog createPrompt(String message, BiConsumer onConfirm) { - return createPrompt(message, onConfirm, (b, t) -> {}); - } - - public static Dialog createPrompt(String message, BiConsumer onConfirm, BiConsumer onCancel) { - return createPrompt(message, "", onConfirm, onCancel); - } - - public static Dialog createPrompt(String message, String defaultText, BiConsumer onConfirm) { - return createPrompt(message, defaultText, onConfirm, (b, t) -> {}); - } - - public static Dialog createPrompt(String message, String defaultText, BiConsumer onConfirm, BiConsumer onCancel) { - return createPrompt(message, defaultText, "gui.sfm.ok", "gui.sfm.cancel", onConfirm, onCancel); - } - - public static Dialog createPrompt(String message, String defaultText, String confirm, String cancel, BiConsumer onConfirm, BiConsumer onCancel) { + public static Dialog createPrompt( + String message, + Supplier fieldProvider, + String confirm, String cancel, + BiConsumer onConfirm, + BiConsumer onCancel + ) { Dialog dialog = dialog(message); - TextField inputBox = new TextField(0, 0, 0, 16); - inputBox.setText(defaultText); + TextField inputBox = fieldProvider.get(); dialog.insertBeforeButtons(inputBox); dialog.onPostReflow = inputBox::expandHorizontally; @@ -123,8 +115,10 @@ private static Dialog dialog(String message) { private Box buttons; private List children; - public Runnable onPreReflow = () -> {}; - public Runnable onPostReflow = () -> {}; + public Runnable onPreReflow = () -> { + }; + public Runnable onPostReflow = () -> { + }; public Dialog() { this.messageBox = new TextList(10, 10, new ArrayList<>()); diff --git a/src/main/java/vswe/stevesfactory/ui/manager/FactoryManagerGUI.java b/src/main/java/vswe/stevesfactory/ui/manager/FactoryManagerGUI.java index 376e3ed17..f31d6b14b 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/FactoryManagerGUI.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/FactoryManagerGUI.java @@ -21,7 +21,7 @@ import vswe.stevesfactory.ui.manager.editor.ConnectionsPanel; import vswe.stevesfactory.ui.manager.editor.EditorPanel; import vswe.stevesfactory.ui.manager.selection.SelectionPanel; -import vswe.stevesfactory.ui.manager.tool.ToolPanel; +import vswe.stevesfactory.ui.manager.tool.ToolHolderPanel; import vswe.stevesfactory.ui.manager.tool.group.GroupDataModel; import vswe.stevesfactory.ui.manager.toolbox.ToolboxPanel; @@ -191,7 +191,7 @@ public static class TopLevelWidget extends AbstractContainer> children; @@ -200,10 +200,10 @@ private TopLevelWidget(PrimaryWindow window) { this.selectionPanel = new SelectionPanel(); this.editorPanel = new EditorPanel(); this.connectionsPanel = new ConnectionsPanel(); - this.toolPanel = new ToolPanel(); + this.toolHolderPanel = new ToolHolderPanel(); this.toolboxPanel = new ToolboxPanel(); // Let connections panel receive events first - this.children = ImmutableList.of(selectionPanel, connectionsPanel, editorPanel, toolPanel, toolboxPanel); + this.children = ImmutableList.of(selectionPanel, connectionsPanel, editorPanel, toolHolderPanel, toolboxPanel); } public void init() { @@ -250,14 +250,14 @@ public void reflow() { selectionPanel.setHeight(prevHeight); editorPanel.setHeight(prevHeight); connectionsPanel.setHeight(prevHeight); - toolPanel.setHeight(prevHeight); + toolHolderPanel.setHeight(prevHeight); toolboxPanel.setHeight(prevHeight); } selectionPanel.reflow(); editorPanel.reflow(); connectionsPanel.reflow(); - toolPanel.reflow(); + toolHolderPanel.reflow(); toolboxPanel.reflow(); DynamicWidthWidget.reflowDynamicWidth(getDimensions(), children); } diff --git a/src/main/java/vswe/stevesfactory/ui/manager/editor/EditorPanel.java b/src/main/java/vswe/stevesfactory/ui/manager/editor/EditorPanel.java index 0e32b2db3..f69ce75b9 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/editor/EditorPanel.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/editor/EditorPanel.java @@ -253,22 +253,6 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { return true; } } - - int offset = Screen.hasShiftDown() ? Config.CLIENT.acceleratedEditorMoveSpeed.get() : Config.CLIENT.defaultEditorMoveSpeed.get(); - switch (keyCode) { - case GLFW_KEY_UP: - yOffset.add(offset); - break; - case GLFW_KEY_DOWN: - yOffset.subtract(offset); - break; - case GLFW_KEY_LEFT: - xOffset.add(offset); - break; - case GLFW_KEY_RIGHT: - xOffset.subtract(offset); - break; - } return false; } @@ -301,9 +285,9 @@ public void update(float particleTicks) { private void openActionMenu() { ContextMenu contextMenu = ContextMenu.atCursor(ImmutableList.of( - new CallbackEntry(FactoryManagerGUI.PASTE_ICON, "gui.sfm.FactoryManager.Editor.CtxMenu.Paste", b -> actionPaste()), - new CallbackEntry(null, "gui.sfm.FactoryManager.Editor.CtxMenu.CleanupProcedures", b -> actionCleanup()), - new CallbackEntry(null, "gui.sfm.FactoryManager.Generic.CtxMenu.ToggleFullscreen", b -> FactoryManagerGUI.get().getPrimaryWindow().toggleFullscreen()) + new CallbackEntry(FactoryManagerGUI.PASTE_ICON, "gui.sfm.FactoryManager.Editor.Paste", b -> actionPaste()), + new CallbackEntry(null, "gui.sfm.FactoryManager.Editor.CleanupProcedures", b -> actionCleanup()), + new CallbackEntry(null, "gui.sfm.FactoryManager.Generic.ToggleFullscreen", b -> FactoryManagerGUI.get().getPrimaryWindow().toggleFullscreen()) )); WidgetScreen.getCurrent().addPopupWindow(contextMenu); } @@ -314,7 +298,7 @@ private void actionPaste() { try { tag = JsonToNBT.getTagFromJson(json); } catch (CommandSyntaxException e) { - Dialog.createDialog("gui.sfm.FactoryManager.Editor.Dialog.PasteProcedure.Fail").tryAddSelfToActiveGUI(); + Dialog.createDialog("gui.sfm.FactoryManager.Editor.Paste.Fail").tryAddSelfToActiveGUI(); return; } diff --git a/src/main/java/vswe/stevesfactory/ui/manager/editor/FlowComponent.java b/src/main/java/vswe/stevesfactory/ui/manager/editor/FlowComponent.java index 9cc96fdc8..7562f323d 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/editor/FlowComponent.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/editor/FlowComponent.java @@ -8,21 +8,20 @@ import vswe.stevesfactory.api.logic.Connection; import vswe.stevesfactory.api.logic.IClientDataStorage; import vswe.stevesfactory.api.logic.IProcedure; -import vswe.stevesfactory.library.gui.TextureWrapper; +import vswe.stevesfactory.library.gui.RenderingHelper; import vswe.stevesfactory.library.gui.contextmenu.CallbackEntry; import vswe.stevesfactory.library.gui.contextmenu.ContextMenu; import vswe.stevesfactory.library.gui.debug.ITextReceiver; import vswe.stevesfactory.library.gui.debug.RenderEventDispatcher; -import vswe.stevesfactory.library.gui.layout.properties.BoxSizing; import vswe.stevesfactory.library.gui.screen.WidgetScreen; import vswe.stevesfactory.library.gui.widget.AbstractContainer; -import vswe.stevesfactory.library.gui.widget.AbstractIconButton; import vswe.stevesfactory.library.gui.widget.IWidget; import vswe.stevesfactory.library.gui.widget.TextField; import vswe.stevesfactory.library.gui.widget.box.LinearList; import vswe.stevesfactory.library.gui.widget.box.MinimumLinearList; import vswe.stevesfactory.library.gui.window.Dialog; import vswe.stevesfactory.ui.manager.tool.group.Grouplist; +import vswe.stevesfactory.ui.manager.tool.inspector.Inspector; import vswe.stevesfactory.utils.NetworkHelper; import javax.annotation.Nonnull; @@ -37,254 +36,21 @@ public class FlowComponent

extends AbstractContainer implements Comparable> { - public enum State { - COLLAPSED(TextureWrapper.ofFlowComponent(0, 0, 64, 20), - TextureWrapper.ofFlowComponent(0, 20, 9, 10), - TextureWrapper.ofFlowComponent(0, 30, 9, 10)), - EXPANDED(TextureWrapper.ofFlowComponent(64, 0, 124, 152), - TextureWrapper.ofFlowComponent(9, 20, 9, 10), - TextureWrapper.ofFlowComponent(9, 30, 9, 10)); - - public final TextureWrapper background; - public final TextureWrapper toggleStateNormal; - public final TextureWrapper toggleStateHovered; - - State(TextureWrapper background, TextureWrapper toggleStateNormal, TextureWrapper toggleStateHovered) { - this.background = background; - this.toggleStateNormal = toggleStateNormal; - this.toggleStateHovered = toggleStateHovered; - } - - public int componentWidth() { - return background.getPortionWidth(); - } - - public int componentHeight() { - return background.getPortionHeight(); - } - } - - public static class ToggleStateButton extends AbstractIconButton { - - public ToggleStateButton(FlowComponent parent) { - super(-1, -1, 9, 10); - setParentWidget(parent); - } - - @Override - public TextureWrapper getTextureNormal() { - return getParentWidget().getState().toggleStateNormal; - } - - @Override - public TextureWrapper getTextureHovered() { - return getParentWidget().getState().toggleStateHovered; - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (button == GLFW_MOUSE_BUTTON_LEFT) { - getParentWidget().toggleState(); - return true; - } - return false; - } - - @Nonnull - @Override - public FlowComponent getParentWidget() { - return Objects.requireNonNull((FlowComponent) super.getParentWidget()); - } - - @Override - public BoxSizing getBoxSizing() { - return BoxSizing.PHANTOM; - } - } - - public static class RenameButton extends AbstractIconButton { - - public static final TextureWrapper NORMAL = TextureWrapper.ofFlowComponent(0, 124, 9, 9); - public static final TextureWrapper HOVERING = NORMAL.toRight(1); - - public RenameButton(FlowComponent parent) { - super(-1, -1, 9, 9); - setParentWidget(parent); - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (isEnabled() && button == GLFW_MOUSE_BUTTON_LEFT) { - setEnabled(false); - FlowComponent parent = getParentWidget(); - parent.submitButton.setEnabled(true); - parent.cancelButton.setEnabled(true); - parent.nameBox.setEditable(true); - getWindow().setFocusedWidget(parent.nameBox); - return true; - } - return false; - } - - @Override - public TextureWrapper getTextureNormal() { - return NORMAL; - } - - @Override - public TextureWrapper getTextureHovered() { - return HOVERING; - } - - @Nonnull - @Override - public FlowComponent getParentWidget() { - return Objects.requireNonNull((FlowComponent) super.getParentWidget()); - } - - @Override - public BoxSizing getBoxSizing() { - return BoxSizing.PHANTOM; - } - } - - public static class SubmitButton extends AbstractIconButton { - - public static final TextureWrapper NORMAL = TextureWrapper.ofFlowComponent(0, 133, 7, 7); - public static final TextureWrapper HOVERING = NORMAL.toRight(1); - - public SubmitButton(FlowComponent parent) { - super(-1, -1, 7, 7); - setParentWidget(parent); - setEnabled(false); - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (isEnabled() && button == GLFW_MOUSE_BUTTON_LEFT) { - submit(); - return true; - } - return false; - } - - public void submit() { - setEnabled(false); - FlowComponent parent = getParentWidget(); - parent.cancelButton.setEnabled(false); - parent.renameButton.setEnabled(true); - parent.nameBox.scrollToFront(); - parent.nameBox.setEditable(false); - parent.getDataHandler().setName(parent.getName()); - getWindow().changeFocus(parent.nameBox, false); - } - - @Override - public TextureWrapper getTextureNormal() { - return NORMAL; - } - - @Override - public TextureWrapper getTextureHovered() { - return HOVERING; - } - - @Nonnull - @Override - public FlowComponent getParentWidget() { - return Objects.requireNonNull((FlowComponent) super.getParentWidget()); - } - - @Override - public BoxSizing getBoxSizing() { - return BoxSizing.PHANTOM; - } - } - - public static class CancelButton extends AbstractIconButton { - - public static final TextureWrapper NORMAL = TextureWrapper.ofFlowComponent(0, 140, 7, 7); - public static final TextureWrapper HOVERING = NORMAL.toRight(1); - - private String previousName; - - public CancelButton(FlowComponent parent, String previousName) { - super(-1, -1, 7, 7); - setParentWidget(parent); - setEnabled(false); - this.previousName = previousName; - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (isEnabled() && button == GLFW_MOUSE_BUTTON_LEFT) { - cancel(); - return true; - } - return false; - } - - public void cancel() { - setEnabled(false); - FlowComponent parent = getParentWidget(); - parent.submitButton.setEnabled(false); - parent.renameButton.setEnabled(true); - parent.setName(previousName); - parent.nameBox.scrollToFront(); - parent.nameBox.setEditable(false); - getWindow().changeFocus(parent.nameBox, false); - previousName = ""; - } - - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - if (enabled) { - this.previousName = getParentWidget().getName(); - } - } - - @Override - public TextureWrapper getTextureNormal() { - return NORMAL; - } - - @Override - public TextureWrapper getTextureHovered() { - return HOVERING; - } - - @Nonnull - @Override - public FlowComponent getParentWidget() { - return Objects.requireNonNull((FlowComponent) super.getParentWidget()); - } - - @Override - public BoxSizing getBoxSizing() { - return BoxSizing.PHANTOM; - } - } - public static

FlowComponent

of(P procedure) { return new FlowComponent<>(procedure, procedure.predecessors().length, procedure.successors().length); } private P procedure; + private final MinimumLinearList> menus; + - private final ToggleStateButton toggleStateButton; - private final RenameButton renameButton; - private final SubmitButton submitButton; - private final CancelButton cancelButton; private final TextField nameBox; private final ConnectionNodes inputNodes; private final ConnectionNodes outputNodes; private final ErrorIndicator errorIndicator; - private final MinimumLinearList> menus; // A list that refers to all the widgets above private final List children; - private State state; private int zIndex; // Temporary data @@ -292,14 +58,11 @@ public static

FlowComponent

of(P private int initialDragLocalY; public FlowComponent(P procedure, int amountInputs, int amountOutputs) { - super(0, 0, 0, 0); + super(0, 0, 64, 20); String name = procedure.getName(); - this.toggleStateButton = new ToggleStateButton(this); - this.renameButton = new RenameButton(this); - this.submitButton = new SubmitButton(this); - this.cancelButton = new CancelButton(this, name); // The cursor looks a bit to short (and cute) with these numbers, might want change them? - this.nameBox = new TextField(6, 8, 35, 10); + this.nameBox = new TextField(6, 8, 0, 10); + this.nameBox.setWidth(this.getWidth() - nameBox.getX() - 2); this.nameBox.setBackgroundStyle(TextField.BackgroundStyle.NONE); this.nameBox.setText(name); this.nameBox.setTextColor(0xff303030, 0xff303030); @@ -308,85 +71,19 @@ public FlowComponent(P procedure, int amountInputs, int amountOutputs) { this.inputNodes = ConnectionNodes.inputNodes(amountInputs); this.outputNodes = ConnectionNodes.outputNodes(amountOutputs); this.errorIndicator = ErrorIndicator.error(); - this.menus = new MinimumLinearList<>(120, 130); - this.menus.setLocation(2, 20); - this.children = ImmutableList.of(toggleStateButton, renameButton, submitButton, cancelButton, nameBox, inputNodes, outputNodes, errorIndicator, menus); + this.menus = new MinimumLinearList<>(0, 0); + this.children = ImmutableList.of(nameBox, inputNodes, outputNodes, errorIndicator); this.setLinkedProcedure(procedure); - this.state = State.COLLAPSED; errorIndicator.setLocation(2, 8); } - public TextureWrapper getBackgroundTexture() { - return state.background; - } - - public State getState() { - return state; - } - - public void toggleState() { - switch (state) { - case COLLAPSED: - expand(); - break; - case EXPANDED: - collapse(); - break; - } - } - - public void expand() { - state = State.EXPANDED; - setDimensions(state.componentWidth(), state.componentHeight()); - - nameBox.setWidth(95); - nameBox.scrollToFront(); - toggleStateButton.setLocation(114, 5); - renameButton.setLocation(103, 6); - submitButton.setLocation(105, 3); - cancelButton.setLocation(105, 11); - renameButton.setEnabled(true); - updateMenusEnableState(true); - reflow(); - } - - public void collapse() { - state = State.COLLAPSED; - setDimensions(state.componentWidth(), state.componentHeight()); - - nameBox.setWidth(35); - nameBox.scrollToFront(); - toggleStateButton.setLocation(54, 5); - renameButton.setLocation(43, 6); - submitButton.setLocation(45, 3); - cancelButton.setLocation(45, 11); - if (isEditing()) { - cancelButton.cancel(); - } - renameButton.setEnabled(false); - updateMenusEnableState(false); - reflow(); - } - - public boolean isEditing() { - return submitButton.isEnabled(); - } - - private void updateMenusEnableState(boolean enabled) { - menus.setEnabled(enabled); - for (Menu

menu : menus.getChildren()) { - menu.setEnabled(enabled); - } - } - public String getName() { return nameBox.getText(); } public void setName(String name) { this.nameBox.setText(name); - this.cancelButton.previousName = getName(); this.procedure.setName(name); } @@ -414,6 +111,7 @@ public void expandAllMenus() { @Override public void reflow() { + nameBox.scrollToFront(); inputNodes.setWidth(getWidth()); inputNodes.setY(-ConnectionsPanel.REGULAR_HEIGHT); inputNodes.reflow(); @@ -452,19 +150,14 @@ public void render(int mouseX, int mouseY, float particleTicks) { RenderEventDispatcher.onPreRender(this, mouseX, mouseY); RenderSystem.color3f(1F, 1F, 1F); - getBackgroundTexture().draw(getAbsoluteX(), getAbsoluteY()); + int x = getAbsoluteX(); + int y = getAbsoluteY(); + RenderingHelper.drawBorderedBox(x, y, x + getWidth(), y + getHeight()); - // Renaming state (showing different buttons at different times) is handled inside the widgets' render method - toggleStateButton.render(mouseX, mouseY, particleTicks); - renameButton.render(mouseX, mouseY, particleTicks); - submitButton.render(mouseX, mouseY, particleTicks); - cancelButton.render(mouseX, mouseY, particleTicks); nameBox.render(mouseX, mouseY, particleTicks); - RenderSystem.enableAlphaTest(); inputNodes.render(mouseX, mouseY, particleTicks); outputNodes.render(mouseX, mouseY, particleTicks); errorIndicator.render(mouseX, mouseY, particleTicks); - menus.render(mouseX, mouseY, particleTicks); if (nameBox.isInside(mouseX, mouseY)) { WidgetScreen.getCurrent().setHoveringText(getName(), mouseX, mouseY); @@ -485,6 +178,10 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { } getWindow().setFocusedWidget(this); + Inspector inspector = Inspector.getActiveInspector(); + if (inspector != null) { + inspector.openFlowComponent(this); + } if (button == GLFW_MOUSE_BUTTON_LEFT) { initialDragLocalX = (int) mouseX - getAbsoluteX(); initialDragLocalY = (int) mouseY - getAbsoluteY(); @@ -575,15 +272,15 @@ private boolean isDragging() { public void setParentWidget(EditorPanel parent) { this.setParentWidget((IWidget) parent); - collapse(); + reflow(); } private void openContextMenu() { ContextMenu contextMenu = ContextMenu.atCursor(ImmutableList.of( - new CallbackEntry(DELETE_ICON, "gui.sfm.FactoryManager.Editor.CtxMenu.Delete", b -> actionDelete()), - new CallbackEntry(CUT_ICON, "gui.sfm.FactoryManager.Editor.CtxMenu.Cut", b -> actionCut()), - new CallbackEntry(COPY_ICON, "gui.sfm.FactoryManager.Editor.CtxMenu.Copy", b -> actionCopy()), - new CallbackEntry(null, "gui.sfm.FactoryManager.Editor.CtxMenu.ChangeGroup", b -> actionChangeGroup()) + new CallbackEntry(DELETE_ICON, "gui.sfm.FactoryManager.Editor.Delete", b -> actionDelete()), + new CallbackEntry(CUT_ICON, "gui.sfm.FactoryManager.Editor.Cut", b -> actionCut()), + new CallbackEntry(COPY_ICON, "gui.sfm.FactoryManager.Editor.Copy", b -> actionCopy()), + new CallbackEntry(null, "gui.sfm.FactoryManager.Editor.ChangeGroup", b -> actionChangeGroup()) )); WidgetScreen.getCurrent().addPopupWindow(contextMenu); } @@ -591,7 +288,7 @@ private void openContextMenu() { private void actionDelete() { if (Screen.hasShiftDown()) { Dialog.createBiSelectionDialog( - "gui.sfm.FactoryManager.Editor.Dialog.DeleteAll.ConfirmMsg", + "gui.sfm.FactoryManager.Editor.DeleteAll.ConfirmMsg", "gui.sfm.yes", "gui.sfm.no", b -> removeGraph(this), b -> { @@ -613,11 +310,12 @@ private void actionCut() { } private void actionChangeGroup() { - Grouplist.createSelectGroupDialog(newGroup -> { - disconnect(); - setGroup(newGroup); - }, () -> { - }).tryAddSelfToActiveGUI(); + Grouplist.createSelectGroupDialog( + newGroup -> { + disconnect(); + setGroup(newGroup); + }, + () -> {}).tryAddSelfToActiveGUI(); } public void save() { diff --git a/src/main/java/vswe/stevesfactory/ui/manager/editor/Menu.java b/src/main/java/vswe/stevesfactory/ui/manager/editor/Menu.java index aac4a5930..9c5017cf3 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/editor/Menu.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/editor/Menu.java @@ -99,7 +99,7 @@ public void render(int mouseX, int mouseY, float particleTicks) { private static final List> EMPTY_LIST = ImmutableList.of(); - public static final TextureWrapper HEADING_BOX = TextureWrapper.ofFlowComponent(66, 152, 120, 13); + public static final TextureWrapper HEADING_BOX = TextureWrapper.ofFlowComponent(0, 0, 120, 13); public static final int DEFAULT_CONTENT_HEIGHT = 65; private FlowComponent

flowComponent; @@ -143,9 +143,7 @@

addChildren(IWidget widget) { } @Override - public Menu - -

addChildren(Collection widgets) { + public Menu

addChildren(Collection widgets) { children.addAll(widgets); return this; } @@ -254,8 +252,9 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { getWindow().setFocusedWidget(this); if (button == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { ImmutableList.Builder list = ImmutableList.builder() - .add(new CallbackEntry(null, "gui.sfm.FactoryManager.Editor.CtxMenu.CollapseAll", b -> flowComponent.collapseAllMenus())) - .add(new CallbackEntry(null, "gui.sfm.FactoryManager.Editor.CtxMenu.ExpandAll", b -> flowComponent.expandAllMenus())); + .add(new CallbackEntry(null, "gui.sfm.FactoryManager.Tool.Inspector.Props.CollapseAll", b -> flowComponent.collapseAllMenus())) + .add(new CallbackEntry(null, "gui.sfm.FactoryManager.Tool.Inspector.Props.ExpandAll", b -> flowComponent.expandAllMenus())); + addContextMenuEntries(list); for (Supplier entry : actionMenuEntries) { list.add(entry.get()); } @@ -276,9 +275,7 @@ protected void saveData() { @SuppressWarnings("unchecked") @Nonnull @Override - public LinearList> - - getParentWidget() { + public LinearList> getParentWidget() { return Objects.requireNonNull((LinearList>) super.getParentWidget()); } diff --git a/src/main/java/vswe/stevesfactory/ui/manager/editor/OffsetText.java b/src/main/java/vswe/stevesfactory/ui/manager/editor/OffsetText.java index eabb9da20..d45791cdd 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/editor/OffsetText.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/editor/OffsetText.java @@ -3,6 +3,7 @@ import net.minecraft.client.gui.screen.Screen; import vswe.stevesfactory.library.gui.debug.RenderEventDispatcher; import vswe.stevesfactory.library.gui.widget.AbstractWidget; +import vswe.stevesfactory.library.gui.widget.NumberField; import vswe.stevesfactory.library.gui.widget.mixin.LeafWidgetMixin; import vswe.stevesfactory.library.gui.window.Dialog; @@ -65,13 +66,17 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { if (Screen.hasControlDown()) { set(0); } else { - Dialog.createPrompt("gui.sfm.FactoryManager.Editor.EditOffset", (b, s) -> { - try { - set(Integer.parseInt(s)); - } catch (NumberFormatException e) { - Dialog.createDialog("gui.sfm.FactoryManager.Editor.InvalidNumberFormat").tryAddSelfToActiveGUI(); - } - }).tryAddSelfToActiveGUI(); + NumberField field = NumberField.integerField(0, 16); + field.setValue(value); + + Dialog prompt = Dialog.createPrompt( + "gui.sfm.FactoryManager.Editor.EditOffset", + () -> field, + "gui.sfm.ok", "gui.sfm.cancel", + (b, s) -> { + }, + (b, s) -> set(field.getValue())); + prompt.tryAddSelfToActiveGUI(); } return true; } diff --git a/src/main/java/vswe/stevesfactory/ui/manager/editor/PropertyManager.java b/src/main/java/vswe/stevesfactory/ui/manager/editor/PropertyManager.java index 1df5ce53f..4345f72fd 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/editor/PropertyManager.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/editor/PropertyManager.java @@ -150,8 +150,8 @@ private void updateText() { if (cachedIndex != nextIndex || cachedText == null) { Case nextCase = cases.get(nextIndex); cachedText = nextCase.hasName() - ? I18n.format("gui.sfm.FactoryManager.Editor.CtxMenu.CycleProperty.Named", nextCase.getName()) - : I18n.format("gui.sfm.FactoryManager.Editor.CtxMenu.CycleProperty"); + ? I18n.format("gui.sfm.FactoryManager.Tool.Inspector.Props.CycleProperty.Named", nextCase.getName()) + : I18n.format("gui.sfm.FactoryManager.Tool.Inspector.Props.CycleProperty"); cachedIndex = nextIndex; reflowSafe(); } diff --git a/src/main/java/vswe/stevesfactory/ui/manager/menu/InvocationTargetMenu.java b/src/main/java/vswe/stevesfactory/ui/manager/menu/InvocationTargetMenu.java index d1d83de3d..9dff5d85c 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/menu/InvocationTargetMenu.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/menu/InvocationTargetMenu.java @@ -38,7 +38,7 @@ public InvocationTargetMenu() { addChildren(options); - injectAction(() -> new CallbackEntry(null, "menu.sfm.InvocationTarget.CtxMenu.Rescan", b -> scanTargets())); + injectAction(() -> new CallbackEntry(null, "menu.sfm.InvocationTarget.Rescan", b -> scanTargets())); } @Override diff --git a/src/main/java/vswe/stevesfactory/ui/manager/selection/SelectionPanel.java b/src/main/java/vswe/stevesfactory/ui/manager/selection/SelectionPanel.java index 8b70ef071..7dafef1a3 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/selection/SelectionPanel.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/selection/SelectionPanel.java @@ -98,7 +98,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { private void openActionMenu() { ContextMenu contextMenu = ContextMenu.atCursor(ImmutableList.of( - new CallbackEntry(null, "gui.sfm.FactoryManager.Generic.CtxMenu.ToggleFullscreen", b -> FactoryManagerGUI.get().getPrimaryWindow().toggleFullscreen()) + new CallbackEntry(null, "gui.sfm.FactoryManager.Generic.ToggleFullscreen", b -> FactoryManagerGUI.get().getPrimaryWindow().toggleFullscreen()) )); WidgetScreen.getCurrent().addPopupWindow(contextMenu); } diff --git a/src/main/java/vswe/stevesfactory/ui/manager/tool/ToolPanel.java b/src/main/java/vswe/stevesfactory/ui/manager/tool/ToolHolderPanel.java similarity index 88% rename from src/main/java/vswe/stevesfactory/ui/manager/tool/ToolPanel.java rename to src/main/java/vswe/stevesfactory/ui/manager/tool/ToolHolderPanel.java index d428e7a8f..8828b82e9 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/tool/ToolPanel.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/tool/ToolHolderPanel.java @@ -6,6 +6,7 @@ import vswe.stevesfactory.library.gui.contextmenu.ContextMenu; import vswe.stevesfactory.library.gui.debug.RenderEventDispatcher; import vswe.stevesfactory.library.gui.screen.WidgetScreen; +import vswe.stevesfactory.library.gui.widget.AbstractContainer; import vswe.stevesfactory.library.gui.widget.IWidget; import vswe.stevesfactory.ui.manager.DynamicWidthWidget; import vswe.stevesfactory.ui.manager.FactoryManagerGUI; @@ -16,11 +17,11 @@ import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT; -public final class ToolPanel extends DynamicWidthWidget { +public final class ToolHolderPanel extends DynamicWidthWidget { private List children = ImmutableList.of(); - public ToolPanel() { + public ToolHolderPanel() { super(WidthOccupierType.MIN_WIDTH); } @@ -33,6 +34,9 @@ public void setActivePanel(@Nullable T panel) { panel.setX(RenderingHelper.LEFT_BORDER + 1); panel.setHeight(getHeight()); getWindow().setFocusedWidget(panel); + if (panel instanceof AbstractContainer) { + ((AbstractContainer) panel).reflow(); + } } FactoryManagerGUI.get().getTopLevel().reflow(); } @@ -81,7 +85,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { private void openContextMenu() { ContextMenu contextMenu = ContextMenu.atCursor(ImmutableList.of( - new CallbackEntry(null, "gui.sfm.FactoryManager.Generic.CtxMenu.ToggleFullscreen", b -> FactoryManagerGUI.get().getPrimaryWindow().toggleFullscreen()) + new CallbackEntry(null, "gui.sfm.FactoryManager.Generic.ToggleFullscreen", b -> FactoryManagerGUI.get().getPrimaryWindow().toggleFullscreen()) )); WidgetScreen.getCurrent().addPopupWindow(contextMenu); } diff --git a/src/main/java/vswe/stevesfactory/ui/manager/tool/group/GroupButton.java b/src/main/java/vswe/stevesfactory/ui/manager/tool/group/GroupButton.java index f885106b7..619d8113d 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/tool/group/GroupButton.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/tool/group/GroupButton.java @@ -6,6 +6,7 @@ import vswe.stevesfactory.library.gui.contextmenu.ContextMenu; import vswe.stevesfactory.library.gui.screen.WidgetScreen; import vswe.stevesfactory.library.gui.widget.TextButton; +import vswe.stevesfactory.library.gui.widget.TextField; import vswe.stevesfactory.library.gui.window.Dialog; import vswe.stevesfactory.ui.manager.FactoryManagerGUI; @@ -40,9 +41,9 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { private void openContextMenu() { ContextMenu contextMenu = ContextMenu.atCursor(ImmutableList.of( - new CallbackEntry(FactoryManagerGUI.DELETE_ICON, "gui.sfm.FactoryManager.Tool.Group.CtxMenu.Delete", b -> actionDelete()), - new CallbackEntry(null, "gui.sfm.FactoryManager.Tool.Group.CtxMenu.RenameGroup", b -> actionRename()), - new CallbackEntry(null, "gui.sfm.FactoryManager.Tool.Group.CtxMenu.MoveContent", b -> actionMoveContent()) + new CallbackEntry(FactoryManagerGUI.DELETE_ICON, "gui.sfm.FactoryManager.Tool.Group.Delete", b -> actionDelete()), + new CallbackEntry(null, "gui.sfm.FactoryManager.Tool.Group.RenameGroup", b -> actionRename()), + new CallbackEntry(null, "gui.sfm.FactoryManager.Tool.Group.MoveContent", b -> actionMoveContent()) )); WidgetScreen.getCurrent().addPopupWindow(contextMenu); } @@ -56,15 +57,20 @@ private void actionDelete() { } private void actionRename() { - Dialog.createPrompt("gui.sfm.FactoryManager.Tool.Group.Dialog.RenameGroup", (b, newName) -> { - for (String group : FactoryManagerGUI.get().groupModel.getGroups()) { - if (newName.equals(group)) { - Dialog.createDialog(I18n.format("gui.sfm.FactoryManager.Tool.Group.Dialog.RenameFailed", newName)).tryAddSelfToActiveGUI(); - return; - } - } - FactoryManagerGUI.get().groupModel.updateGroup(group, newName); - }).tryAddSelfToActiveGUI(); + Dialog.createPrompt( + "gui.sfm.FactoryManager.Tool.Group.RenameGroup.Prompt", + () -> new TextField(0, 0, 0, 16), + "gui.sfm.ok", "gui.sfm.cancel", + (b, newName) -> { + for (String group : FactoryManagerGUI.get().groupModel.getGroups()) { + if (newName.equals(group)) { + Dialog.createDialog(I18n.format("gui.sfm.FactoryManager.Tool.Group.RenameGroup.Failed", newName)).tryAddSelfToActiveGUI(); + return; + } + } + FactoryManagerGUI.get().groupModel.updateGroup(group, newName); + }, + (b, newName) -> {}).tryAddSelfToActiveGUI(); } private void actionMoveContent() { @@ -78,10 +84,6 @@ private void actionMoveContent() { () -> {}).tryAddSelfToActiveGUI(); } - private static Grouplist getGroupList() { - return FactoryManagerGUI.get().getTopLevel().toolboxPanel.getGroupList(); - } - public String getGroup() { return group; } @@ -101,6 +103,10 @@ public int getHoveredBorderColor() { return isSelected() ? 0xffffff00 : super.getNormalBorderColor(); } + private Grouplist getGroupList() { + return FactoryManagerGUI.get().getTopLevel().toolboxPanel.getGroupList(); + } + private boolean isSelected() { return group.equals(FactoryManagerGUI.get().groupModel.getCurrentGroup()); } diff --git a/src/main/java/vswe/stevesfactory/ui/manager/tool/group/GroupDataModel.java b/src/main/java/vswe/stevesfactory/ui/manager/tool/group/GroupDataModel.java index 2ea82ed51..2c1749439 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/tool/group/GroupDataModel.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/tool/group/GroupDataModel.java @@ -51,8 +51,8 @@ public void removeListenerUpdate(int id) { } /** - * Add a listener for when the user reselects current group. Note that this will not be fired for the default - * selection {@link GroupDataModel#DEFAULT_GROUP}. + * Add a listener for when the user re-selects current group. Note that this will not be fired for the + * default selection {@link GroupDataModel#DEFAULT_GROUP}. */ public int addListenerSelect(Consumer listener) { selectListeners.add(listener); diff --git a/src/main/java/vswe/stevesfactory/ui/manager/tool/group/Grouplist.java b/src/main/java/vswe/stevesfactory/ui/manager/tool/group/Grouplist.java index 682fd5df7..2c451dc0d 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/tool/group/Grouplist.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/tool/group/Grouplist.java @@ -4,13 +4,17 @@ import vswe.stevesfactory.library.gui.RenderingHelper; import vswe.stevesfactory.library.gui.widget.Spacer; import vswe.stevesfactory.library.gui.widget.TextButton; +import vswe.stevesfactory.library.gui.widget.TextField; import vswe.stevesfactory.library.gui.widget.box.LinearList; import vswe.stevesfactory.library.gui.window.Dialog; import vswe.stevesfactory.ui.manager.FactoryManagerGUI; +import vswe.stevesfactory.ui.manager.editor.FlowComponent; import javax.annotation.Nonnull; import java.util.Collection; +import java.util.HashSet; import java.util.Objects; +import java.util.Set; import java.util.function.Consumer; public class Grouplist extends LinearList { @@ -92,13 +96,16 @@ public void delete(String group) { public static Dialog createNewGroupDialog() { return Dialog.createPrompt( - "gui.sfm.FactoryManager.Tool.Group.Dialog.CreateGroup", + "gui.sfm.FactoryManager.Tool.Group.CreateGroup", + () -> new TextField(0, 0, 0, 16), + "gui.sfm.ok", "gui.sfm.cancel", (b, name) -> { boolean success = FactoryManagerGUI.get().groupModel.addGroup(name); if (!success) { - Dialog.createDialog("gui.sfm.FactoryManager.Tool.Group.Dialog.CreateFailed").tryAddSelfToActiveGUI(); + Dialog.createDialog("gui.sfm.FactoryManager.Tool.Group.CreateFailed").tryAddSelfToActiveGUI(); } - }); + }, + (b, name) -> {}); } public static final int SEL_DIALOG_LIST_WIDTH = 280; @@ -107,7 +114,7 @@ public static Dialog createNewGroupDialog() { public static Dialog createSelectGroupDialog(Consumer onConfirm, Runnable onCancel) { Dialog dialog = new Dialog(); - dialog.getMessageBox().addLine(I18n.format("gui.sfm.FactoryManager.Tool.Group.Dialog.SelectGroup")); + dialog.getMessageBox().addLine(I18n.format("gui.sfm.FactoryManager.Tool.Group.SelectGroup")); TargetList list = new TargetList(); dialog.insertBeforeButtons(list); @@ -242,6 +249,5 @@ public TargetList getParentWidget() { private boolean isSelected() { return getParentWidget().selected == this.index; } - } } diff --git a/src/main/java/vswe/stevesfactory/ui/manager/tool/inspector/Inspector.java b/src/main/java/vswe/stevesfactory/ui/manager/tool/inspector/Inspector.java new file mode 100644 index 000000000..b8b1034aa --- /dev/null +++ b/src/main/java/vswe/stevesfactory/ui/manager/tool/inspector/Inspector.java @@ -0,0 +1,78 @@ +package vswe.stevesfactory.ui.manager.tool.inspector; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.systems.RenderSystem; +import vswe.stevesfactory.library.gui.debug.RenderEventDispatcher; +import vswe.stevesfactory.library.gui.layout.FlowLayout; +import vswe.stevesfactory.library.gui.widget.AbstractContainer; +import vswe.stevesfactory.library.gui.widget.IWidget; +import vswe.stevesfactory.ui.manager.FactoryManagerGUI; +import vswe.stevesfactory.ui.manager.editor.FlowComponent; + +import javax.annotation.Nullable; +import java.util.List; + +import static org.lwjgl.opengl.GL11.*; + +public class Inspector extends AbstractContainer { + + @Nullable + public static Inspector getActiveInspector() { + IWidget tool = FactoryManagerGUI.get().getTopLevel().toolHolderPanel.getContainedWidget(); + if (tool instanceof Inspector) { + return (Inspector) tool; + } else { + return null; + } + } + + private final List children; + private final StatusPanel status; + private final PropertiesPanel props; + + public Inspector() { + super(0, 0, 120, 0); + + status = new StatusPanel(); // with fixed size + status.setParentWidget(this); + props = new PropertiesPanel(); + props.setParentWidget(this); + children = ImmutableList.of(status, props); + reflow(); + } + + public void openFlowComponent(FlowComponent target) { + status.openFlowComponent(target); + props.openFlowComponent(target); + } + + @Override + public void render(int mouseX, int mouseY, float particleTicks) { + RenderEventDispatcher.onPreRender(this, mouseX, mouseY); + + RenderSystem.disableTexture(); + RenderSystem.lineWidth(1F); + RenderSystem.color3f(64F / 255F, 64F / 255F, 64F / 255F); + int y = status.getAbsoluteYBottom() + 1; + glBegin(GL_LINES); + glVertex3f(status.getAbsoluteX(), y, 0F); + glVertex3f(status.getAbsoluteXRight(), y, 0F); + glEnd(); + RenderSystem.enableTexture(); + + super.render(mouseX, mouseY, particleTicks); + RenderEventDispatcher.onPostRender(this, mouseX, mouseY); + } + + @Override + public List getChildren() { + return children; + } + + @Override + public void reflow() { + // 3px gap for the divider line (1px) + FlowLayout.vertical(children, 0, 0, 3); + props.setHeight(this.getHeight() - status.getHeight() - 3); + } +} diff --git a/src/main/java/vswe/stevesfactory/ui/manager/tool/inspector/PropertiesPanel.java b/src/main/java/vswe/stevesfactory/ui/manager/tool/inspector/PropertiesPanel.java new file mode 100644 index 000000000..8d4d1e39a --- /dev/null +++ b/src/main/java/vswe/stevesfactory/ui/manager/tool/inspector/PropertiesPanel.java @@ -0,0 +1,44 @@ +package vswe.stevesfactory.ui.manager.tool.inspector; + +import vswe.stevesfactory.library.gui.debug.RenderEventDispatcher; +import vswe.stevesfactory.library.gui.widget.AbstractContainer; +import vswe.stevesfactory.library.gui.widget.box.LinearList; +import vswe.stevesfactory.ui.manager.editor.FlowComponent; +import vswe.stevesfactory.ui.manager.editor.Menu; + +import java.util.ArrayList; +import java.util.List; + +public class PropertiesPanel extends AbstractContainer>> { + + private List>> child = new ArrayList<>(); + + public PropertiesPanel() { + super(0, 0, 120, 0); + } + + @Override + public void render(int mouseX, int mouseY, float particleTicks) { + RenderEventDispatcher.onPreRender(this, mouseX, mouseY); + super.render(mouseX, mouseY, particleTicks); + RenderEventDispatcher.onPostRender(this, mouseX, mouseY); + } + + @Override + public List>> getChildren() { + return child; + } + + @Override + public void reflow() { + } + + public void openFlowComponent(FlowComponent target) { + @SuppressWarnings({"rawtypes", "unchecked"}) LinearList> menusBox = (LinearList) target.getMenusBox(); + // Hacky way to maintain the list to hold one item exactly + child.clear(); + child.add(menusBox); + menusBox.setParentWidget(this); + menusBox.setDimensions(this.getDimensions()); + } +} diff --git a/src/main/java/vswe/stevesfactory/ui/manager/tool/inspector/StatusPanel.java b/src/main/java/vswe/stevesfactory/ui/manager/tool/inspector/StatusPanel.java new file mode 100644 index 000000000..345035f1d --- /dev/null +++ b/src/main/java/vswe/stevesfactory/ui/manager/tool/inspector/StatusPanel.java @@ -0,0 +1,148 @@ +package vswe.stevesfactory.ui.manager.tool.inspector; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.resources.I18n; +import vswe.stevesfactory.library.gui.RenderingHelper; +import vswe.stevesfactory.library.gui.TextureWrapper; +import vswe.stevesfactory.library.gui.debug.RenderEventDispatcher; +import vswe.stevesfactory.library.gui.widget.AbstractContainer; +import vswe.stevesfactory.library.gui.widget.CallbackIconButton; +import vswe.stevesfactory.library.gui.widget.IWidget; +import vswe.stevesfactory.library.gui.widget.TextField; +import vswe.stevesfactory.ui.manager.editor.FlowComponent; +import vswe.stevesfactory.ui.manager.tool.group.GroupButton; +import vswe.stevesfactory.ui.manager.toolbox.ToolboxPanel; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class StatusPanel extends AbstractContainer { + + public static final TextureWrapper RENAME_NORMAL = TextureWrapper.ofFlowComponent(0, 124, 9, 9); + public static final TextureWrapper RENAME_HOVERING = RENAME_NORMAL.toRight(1); + public static final TextureWrapper SUBMIT_NORMAL = TextureWrapper.ofFlowComponent(0, 133, 7, 7); + public static final TextureWrapper SUBMIT_HOVERING = SUBMIT_NORMAL.toRight(1); + public static final TextureWrapper CANCEL_NORMAL = TextureWrapper.ofFlowComponent(0, 140, 7, 7); + public static final TextureWrapper CANCEL_HOVERING = CANCEL_NORMAL.toRight(1); + + private FlowComponent opened = null; + private List children = new ArrayList<>(); + private TextField nameBox; + private CallbackIconButton renameButton; + private CallbackIconButton submitButton; + private CallbackIconButton cancelButton; + + private String previousName; + + public StatusPanel() { + super(0, 0, 120, 64); + + nameBox = new TextField(2, 6, 100, 16); + nameBox.setParentWidget(this); + nameBox.setBackgroundStyle(TextField.BackgroundStyle.NONE); + nameBox.setTextColor(0xff303030, 0xff303030); + nameBox.setEditable(false); + children.add(nameBox); + + int baseX = getXRight() - 10; + int baseY = 2; + renameButton = new CallbackIconButton(RENAME_NORMAL, RENAME_HOVERING); + renameButton.setParentWidget(this); + renameButton.setLocation(baseX, baseY + 6); + renameButton.setEnabled(false); + renameButton.onClick = b -> { + if (renameButton.isEnabled() && opened != null) { + setRenamingState(); + return true; + } + return false; + }; + children.add(renameButton); + submitButton = new CallbackIconButton(SUBMIT_NORMAL, SUBMIT_HOVERING); + submitButton.setParentWidget(this); + submitButton.setLocation(baseX + 2, baseY + 3); + submitButton.setEnabled(false); + submitButton.onClick = b -> { + if (submitButton.isEnabled() && opened != null) { + // Keep input name + opened.setName(nameBox.getText()); + setWaitingState(); + return true; + } + return false; + }; + children.add(submitButton); + cancelButton = new CallbackIconButton(CANCEL_NORMAL, CANCEL_HOVERING); + cancelButton.setParentWidget(this); + cancelButton.setLocation(baseX + 2, baseY + 11); + cancelButton.setEnabled(false); + cancelButton.onClick = b -> { + if (cancelButton.isEnabled() && opened != null) { + // Discard input name + nameBox.setText(previousName); + opened.setName(previousName); + setWaitingState(); + return true; + } + return false; + }; + children.add(cancelButton); + } + + private void setRenamingState() { + renameButton.setEnabled(false); + submitButton.setEnabled(true); + cancelButton.setEnabled(true); + nameBox.setEditable(true); + nameBox.scrollToFront(); + previousName = nameBox.getText(); + getWindow().setFocusedWidget(nameBox); + } + + private void setWaitingState() { + renameButton.setEnabled(true); + submitButton.setEnabled(false); + cancelButton.setEnabled(false); + nameBox.setEditable(false); + nameBox.scrollToFront(); + previousName = ""; + getWindow().changeFocus(nameBox, false); + } + + @Override + public void render(int mouseX, int mouseY, float particleTicks) { + RenderEventDispatcher.onPreRender(this, mouseX, mouseY); + + int x = getAbsoluteX(); + int y = getAbsoluteY(); + if (opened != null) { + int y2 = y + 2 + 16 /* height of name */ + 2 /* margin */; + ToolboxPanel.GROUP_LIST_ICON.draw(x + 2, y2, 8, 8); + RenderingHelper.drawText(GroupButton.formatGroupName(opened.getGroup()), x + 2 + 8 + 2, y2, 7, 0xff404040); + } else { + RenderingHelper.drawText(I18n.format("gui.sfm.FactoryManager.Tool.Inspector.NoTarget"), x + 2, y + 2, 9, 0xff404040); + } + + super.render(mouseX, mouseY, particleTicks); + RenderEventDispatcher.onPostRender(this, mouseX, mouseY); + } + + @Override + public Collection getChildren() { + return children; + } + + @Override + public void reflow() { + } + + public void openFlowComponent(FlowComponent target) { + this.opened = target; + + setWaitingState(); + nameBox.setText(target.getName()); + // For transition from to something selected + renameButton.setEnabled(true); + } +} diff --git a/src/main/java/vswe/stevesfactory/ui/manager/toolbox/IconToolType.java b/src/main/java/vswe/stevesfactory/ui/manager/toolbox/ToolboxEntry.java similarity index 89% rename from src/main/java/vswe/stevesfactory/ui/manager/toolbox/IconToolType.java rename to src/main/java/vswe/stevesfactory/ui/manager/toolbox/ToolboxEntry.java index 41f25ee24..4903e1ae0 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/toolbox/IconToolType.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/toolbox/ToolboxEntry.java @@ -12,7 +12,6 @@ import vswe.stevesfactory.library.gui.widget.IWidget; import vswe.stevesfactory.library.gui.widget.mixin.LeafWidgetMixin; import vswe.stevesfactory.ui.manager.FactoryManagerGUI; -import vswe.stevesfactory.ui.manager.tool.ToolPanel; import java.util.function.Supplier; @@ -20,7 +19,7 @@ import static vswe.stevesfactory.library.gui.RenderingHelper.rectVertices; import static vswe.stevesfactory.library.gui.RenderingHelper.textWidth; -public class IconToolType extends AbstractWidget implements IToolType, LeafWidgetMixin { +public class ToolboxEntry extends AbstractWidget implements IToolType, LeafWidgetMixin { public static final int NORMAL_BORDER_COLOR = 0xff8c8c8c; public static final int HOVERED_BORDER_COLOR = 0xff8c8c8c; @@ -36,8 +35,8 @@ public class IconToolType extends AbstractWidget implements I private Supplier toolWindowConstructor; private T cachedToolWindow; - public IconToolType(TextureWrapper tex, Supplier toolWindowConstructor) { - super(0, 0, tex.getPortionWidth() / 2, tex.getPortionHeight() / 2); + public ToolboxEntry(TextureWrapper tex, Supplier toolWindowConstructor) { + super(0, 0, Math.max(tex.getPortionWidth() / 2, 8), tex.getPortionHeight() / 2); this.tex = tex; this.toolWindowConstructor = toolWindowConstructor; } @@ -73,7 +72,7 @@ public void render(int mouseX, int mouseY, float particleTicks) { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - FactoryManagerGUI.get().getTopLevel().toolPanel.setActivePanel(getToolWindow()); + FactoryManagerGUI.get().getTopLevel().toolHolderPanel.setActivePanel(getToolWindow()); return true; } @@ -89,7 +88,7 @@ public String getName() { return name; } - public IconToolType setName(String name) { + public ToolboxEntry setName(String name) { this.name = name; this.setHeight(getHeight() + LABEL_VERTICAL_GAP + textWidth(name, FONT_HEIGHT) + LABEL_VERTICAL_GAP); return this; diff --git a/src/main/java/vswe/stevesfactory/ui/manager/toolbox/ToolboxPanel.java b/src/main/java/vswe/stevesfactory/ui/manager/toolbox/ToolboxPanel.java index cb52d99b2..6b24eaed3 100644 --- a/src/main/java/vswe/stevesfactory/ui/manager/toolbox/ToolboxPanel.java +++ b/src/main/java/vswe/stevesfactory/ui/manager/toolbox/ToolboxPanel.java @@ -14,10 +14,13 @@ import vswe.stevesfactory.library.gui.widget.IWidget; import vswe.stevesfactory.ui.manager.DynamicWidthWidget; import vswe.stevesfactory.ui.manager.FactoryManagerGUI; -import vswe.stevesfactory.ui.manager.tool.ToolPanel; +import vswe.stevesfactory.ui.manager.tool.ToolHolderPanel; import vswe.stevesfactory.ui.manager.tool.group.Grouplist; +import vswe.stevesfactory.ui.manager.tool.inspector.Inspector; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT; @@ -25,8 +28,10 @@ public final class ToolboxPanel extends DynamicWidthWidget { public static final TextureWrapper GROUP_LIST_ICON = TextureWrapper.ofGUITexture("tool_icon/group.png", 16, 16, 0, 0, 16, 16); + public static final TextureWrapper INSPECTOR_ICON = TextureWrapper.ofGUITexture("tool_icon/inspector.png", 16, 16, 0, 0, 16, 16); - private final IconToolType groupList; + private final ToolboxEntry groupList; + private final ToolboxEntry inspector; private final AbstractIconButton close; private final List children = new ArrayList<>(); @@ -34,7 +39,8 @@ public ToolboxPanel() { super(WidthOccupierType.MIN_WIDTH); this.setWidth(8 + RenderingHelper.LEFT_BORDER); - addChildOnly(groupList = new IconToolType<>(GROUP_LIST_ICON, Grouplist::new).setName(I18n.format("gui.sfm.FactoryManager.Tool.Group.Name"))); + addChildOnly(groupList = new ToolboxEntry<>(GROUP_LIST_ICON, Grouplist::new).setName(I18n.format("gui.sfm.FactoryManager.Tool.Group.Name"))); + addChildOnly(inspector = new ToolboxEntry<>(INSPECTOR_ICON, Inspector::new).setName(I18n.format("gui.sfm.FactoryManager.Tool.Inspector.Name"))); addChildOnly(close = new AbstractIconButton(0, 0, 8, 8) { @Override public void render(int mouseX, int mouseY, float particleTicks) { @@ -46,7 +52,7 @@ public void render(int mouseX, int mouseY, float particleTicks) { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - ToolPanel panel = FactoryManagerGUI.get().getPrimaryWindow().topLevel.toolPanel; + ToolHolderPanel panel = FactoryManagerGUI.get().getPrimaryWindow().topLevel.toolHolderPanel; panel.setActivePanel(null); return true; } @@ -128,7 +134,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { private void openActionMenu() { ContextMenu contextMenu = ContextMenu.atCursor(ImmutableList.of( - new CallbackEntry(null, "gui.sfm.FactoryManager.Generic.CtxMenu.ToggleFullscreen", b -> FactoryManagerGUI.get().getPrimaryWindow().toggleFullscreen()) + new CallbackEntry(null, "gui.sfm.FactoryManager.Generic.ToggleFullscreen", b -> FactoryManagerGUI.get().getPrimaryWindow().toggleFullscreen()) )); WidgetScreen.getCurrent().addPopupWindow(contextMenu); } @@ -136,4 +142,8 @@ private void openActionMenu() { public Grouplist getGroupList() { return groupList.getToolWindow(); } + + public Inspector getInspector() { + return inspector.getToolWindow(); + } } diff --git a/src/main/resources/assets/sfm/lang/en_us.json b/src/main/resources/assets/sfm/lang/en_us.json index fdcf4fcce..4aa0dd629 100644 --- a/src/main/resources/assets/sfm/lang/en_us.json +++ b/src/main/resources/assets/sfm/lang/en_us.json @@ -33,35 +33,39 @@ "gui.sfm.buckets": "Buckets", "gui.sfm.WrappingList.SearchStatus": "Found: %d", "gui.sfm.FactoryManager.Generic.Title": "Factory Manager", - "gui.sfm.FactoryManager.Generic.CtxMenu.ToggleFullscreen": "Toggle Fullscreen", + "gui.sfm.FactoryManager.Generic.ToggleFullscreen": "Toggle Fullscreen", "gui.sfm.FactoryManager.Selection.NoComponentGroupsPresent": "No members specified", "gui.sfm.FactoryManager.Editor.XOff": "X: ", "gui.sfm.FactoryManager.Editor.YOff": "Y: ", "gui.sfm.FactoryManager.Editor.EditOffset": "Enter a new offset: ", - "gui.sfm.FactoryManager.Editor.InvalidNumberFormat": "Invalid number format: %s!", - "gui.sfm.FactoryManager.Editor.CtxMenu.Delete": "Delete", - "gui.sfm.FactoryManager.Editor.CtxMenu.DeleteAll": "Delete all", - "gui.sfm.FactoryManager.Editor.Dialog.DeleteAll.ConfirmMsg": "Are you sure you want to delete all connected procedures?", - "gui.sfm.FactoryManager.Editor.CtxMenu.Cut": "Cut", - "gui.sfm.FactoryManager.Editor.CtxMenu.Copy": "Copy", - "gui.sfm.FactoryManager.Editor.CtxMenu.Paste": "Paste", - "gui.sfm.FactoryManager.Editor.CtxMenu.ChangeGroup": "Change group", - "gui.sfm.FactoryManager.Editor.Dialog.PasteProcedure.Fail": "Failed to paste procedure: invalid syntax. Please check your clipboard string again to make sure that it is from copying/cutting another procedure", - "gui.sfm.FactoryManager.Editor.CtxMenu.CleanupProcedures": "Cleanup", - "gui.sfm.FactoryManager.Editor.CtxMenu.CollapseAll": "Collapse All", - "gui.sfm.FactoryManager.Editor.CtxMenu.ExpandAll": "Expand All", - "gui.sfm.FactoryManager.Editor.CtxMenu.CycleProperty": "Cycle to next property", - "gui.sfm.FactoryManager.Editor.CtxMenu.CycleProperty.Named": "Change to %s", + "gui.sfm.FactoryManager.Editor.Delete": "Delete", + "gui.sfm.FactoryManager.Editor.DeleteAll": "Delete all", + "gui.sfm.FactoryManager.Editor.DeleteAll.ConfirmMsg": "Are you sure you want to delete all connected procedures?", + "gui.sfm.FactoryManager.Editor.Cut": "Cut", + "gui.sfm.FactoryManager.Editor.Copy": "Copy", + "gui.sfm.FactoryManager.Editor.Paste": "Paste", + "gui.sfm.FactoryManager.Editor.Paste.Fail": "Failed to paste procedure: invalid syntax. Please check your clipboard string again to make sure that it is from copying/cutting another procedure", + "gui.sfm.FactoryManager.Editor.ChangeGroup": "Change group", + "gui.sfm.FactoryManager.Editor.CleanupProcedures": "Cleanup", "gui.sfm.FactoryManager.Tool.CtxMenu.CloseToolPanel": "Close current tool panel", "gui.sfm.FactoryManager.Tool.Group.Name": "Groups", "gui.sfm.FactoryManager.Tool.Group.DefaultGroup": "(default)", - "gui.sfm.FactoryManager.Tool.Group.CtxMenu.Delete": "Delete", - "gui.sfm.FactoryManager.Tool.Group.CtxMenu.RenameGroup": "Rename", - "gui.sfm.FactoryManager.Tool.Group.CtxMenu.MoveContent": "Move contents", - "gui.sfm.FactoryManager.Tool.Group.Dialog.RenameGroup": "Enter a new group name: ", - "gui.sfm.FactoryManager.Tool.Group.Dialog.CreateGroup": "Create new group", - "gui.sfm.FactoryManager.Tool.Group.Dialog.CreateFailed": "Unable to create new group: a group with the name %s already exists.", - "gui.sfm.FactoryManager.Tool.Group.Dialog.SelectGroup": "Select a group from the following list:", + "gui.sfm.FactoryManager.Tool.Group.CreateGroup": "Enter a group name:", + "gui.sfm.FactoryManager.Tool.Group.Delete": "Delete", + "gui.sfm.FactoryManager.Tool.Group.RenameGroup": "Rename", + "gui.sfm.FactoryManager.Tool.Group.RenameGroup.Prompt": "Enter a new group name: ", + "gui.sfm.FactoryManager.Tool.Group.RenameGroup.Failed": "Unable to rename group: a group with the new name %s already exists.", + "gui.sfm.FactoryManager.Tool.Group.MoveContent": "Move contents", + "gui.sfm.FactoryManager.Tool.Group.MoveContent.Prompt": "Enter a group name: ", + "gui.sfm.FactoryManager.Tool.Group.MoveContent.Failed": "Unable to move contents: no group with the name %s exists.", + "gui.sfm.FactoryManager.Tool.Group.SelectGroup": "Select a group from the following list:", + "gui.sfm.FactoryManager.Tool.Inspector.Name": "Inspector", + "gui.sfm.FactoryManager.Tool.Inspector.NoTarget": "", + "gui.sfm.FactoryManager.Tool.Inspector.Props.CollapseAll": "Collapse All", + "gui.sfm.FactoryManager.Tool.Inspector.Props.ExpandAll": "Expand All", + "gui.sfm.FactoryManager.Tool.Inspector.Props.CycleProperty": "Cycle to next property", + "gui.sfm.FactoryManager.Tool.Inspector.Props.CycleProperty.Named": "Change to %s", + "gui.sfm.FactoryManager.Toolbox.CloseToolPanel": "Close tool panel", "gui.sfm.ItemIntake.Title": "Item Intake", "gui.sfm.ItemIntake.Radius": "Working area radius", "gui.sfm.ItemIntake.RenderWorkingArea": "Renders working area", diff --git a/src/main/resources/assets/sfm/textures/gui/flow_components.png b/src/main/resources/assets/sfm/textures/gui/flow_components.png index 462c0b688..3e738ac3f 100644 Binary files a/src/main/resources/assets/sfm/textures/gui/flow_components.png and b/src/main/resources/assets/sfm/textures/gui/flow_components.png differ diff --git a/src/main/resources/assets/sfm/textures/gui/tool_icon/inspector.png b/src/main/resources/assets/sfm/textures/gui/tool_icon/inspector.png new file mode 100644 index 000000000..6a5ff4185 Binary files /dev/null and b/src/main/resources/assets/sfm/textures/gui/tool_icon/inspector.png differ