diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index ef021c87c0..2ff8e237e8 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -74,6 +74,8 @@ public class DesktopInput extends InputHandler{ /** Previously selected tile. */ public Tile prevSelected; private long lastShiftZ; + /** Whether the current selected building being dragged from*/ + private boolean configDragging = false; @Override public void buildUI(Group group){ @@ -188,6 +190,13 @@ public void drawTop(){ } } + if (configDragging && config.getSelected() != null) { + Vec2 mouseCoords = input.mouseWorld(); + Building selected = config.getSelected(); + Draw.color(Pal.accent); + Lines.line(mouseCoords.x, mouseCoords.y, selected.x, selected.y); + Draw.reset(); + } drawCommanded(); @@ -791,6 +800,22 @@ void pollInput(){ int cursorY = tileY(Core.input.mouseY()); int rawCursorX = World.toTile(Core.input.mouseWorld().x), rawCursorY = World.toTile(Core.input.mouseWorld().y); + // Handle drag to config behaviour + if (config.selectedCanDrag) { + if (input.keyDown(Binding.select)) { + if (selected.build == config.getSelected()) configDragging = true; + } else if (configDragging) { + Building hovered = world.build(cursorX, cursorY); + if (hovered != config.getSelected()) { + if (hovered != null) { + config.getSelected().onConfigureBuildTapped(hovered); + } + config.hideConfig(); + } + configDragging = false; + } + } + //automatically pause building if the current build queue is empty if(Core.settings.getBool("buildautopause") && isBuilding && !isBuildingIgnoreNetworking()){ isBuilding = false; diff --git a/core/src/mindustry/ui/fragments/BlockConfigFragment.java b/core/src/mindustry/ui/fragments/BlockConfigFragment.java index 6cd938d8a4..651c53c1ff 100644 --- a/core/src/mindustry/ui/fragments/BlockConfigFragment.java +++ b/core/src/mindustry/ui/fragments/BlockConfigFragment.java @@ -5,16 +5,26 @@ import arc.scene.*; import arc.scene.actions.*; import arc.scene.ui.layout.*; +import arc.struct.ObjectSet; import arc.util.*; import mindustry.content.*; import mindustry.game.EventType.*; import mindustry.gen.*; +import mindustry.world.blocks.distribution.BufferedItemBridge.BufferedItemBridgeBuild; +import mindustry.world.blocks.distribution.ItemBridge.ItemBridgeBuild; +import mindustry.world.blocks.distribution.MassDriver.MassDriverBuild; +import mindustry.world.blocks.liquid.LiquidBridge.LiquidBridgeBuild; +import mindustry.world.blocks.payloads.PayloadMassDriver.PayloadDriverBuild; import static mindustry.Vars.*; public class BlockConfigFragment{ + static ObjectSet> validBuilds = ObjectSet.with( + BufferedItemBridgeBuild.class, ItemBridgeBuild.class, LiquidBridgeBuild.class, MassDriverBuild.class, PayloadDriverBuild.class + ); Table table = new Table(); Building selected; + public boolean selectedCanDrag = false; public void build(Group parent){ table.visible = false; @@ -26,6 +36,7 @@ public void build(Group parent){ public void forceHide(){ table.visible = false; selected = null; + selectedCanDrag = false; } public boolean isShown(){ @@ -40,7 +51,7 @@ public void showConfig(Building tile){ if(selected != null) selected.onConfigureClosed(); if(tile.configTapped()){ selected = tile; - + selectedCanDrag = validBuilds.contains(selected.getClass()); table.visible = true; table.clear(); table.background(null); // clear the background as some blocks set custom ones @@ -74,6 +85,7 @@ public boolean hasConfigMouse(){ public void hideConfig(){ if(selected != null) selected.onConfigureClosed(); selected = null; + selectedCanDrag = false; table.actions(Actions.scaleTo(0f, 1f, 0.06f, Interp.pow3Out), Actions.visible(false)); } }