diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index b8af7f5a35..5b552a3d27 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -83,6 +83,7 @@ client.sortedplans = Successfully sorted build queue by distance client.freeze = Freeze client.confirmfreeze = Are you sure you want to freeze/thaw {0}[white]? Their current freeze state is: {1} client.rollback.title = Do you want to rollback this player's actions? +client.processorimported = Imported from clipboard client.banreason.title = Ban Reason client.banreason.body = Enter a reason for this ban client.setupcomms = Use for comms diff --git a/core/src/mindustry/world/blocks/logic/LogicBlock.java b/core/src/mindustry/world/blocks/logic/LogicBlock.java index 9d6bf62e0a..962e464a35 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -9,6 +9,7 @@ import arc.graphics.g2d.Lines; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.TextButton.*; import arc.scene.ui.layout.*; import arc.struct.Bits; import arc.struct.*; @@ -18,6 +19,7 @@ import mindustry.client.*; import mindustry.client.antigrief.*; import mindustry.client.navigation.*; +import mindustry.client.ui.*; import mindustry.client.utils.*; import mindustry.core.*; import mindustry.gen.*; @@ -28,6 +30,7 @@ import mindustry.logic.LAssembler.*; import mindustry.logic.LExecutor.*; import mindustry.ui.*; +import mindustry.ui.dialogs.*; import mindustry.ui.fragments.*; import mindustry.world.*; import mindustry.world.blocks.ConstructBlock.*; @@ -667,6 +670,15 @@ this, compress("print \"code was removed\"\n", relativeConnections()) public void removeLinks(){ ClientVars.configs.add(new ConfigRequest(this, compress(code, Seq.with()))); } + public void importFromClipboard(){ + try{ + ClientVars.configs.add(new ConfigRequest( + this, compress(Core.app.getClipboardText().replace("\r\n", "\n"), relativeConnections()) + )); + }catch(Throwable e){ + ui.showException(e); + } + } @Override public void buildConfiguration(Table table){ @@ -686,12 +698,41 @@ public void buildConfiguration(Table table){ table.button(Icon.trash, Styles.cleari, () -> { if(Core.input.shift()) removeCode(); else ui.showConfirm("@confirm", "Are you sure you want to delete this processor's code?", this::removeCode); - }).size(40).tooltip("Remove code").disabled(b -> !ClientVars.configs.isEmpty()); + }).size(40).tooltip("Remove code").disabled(b -> !accessible() || !ClientVars.configs.isEmpty()); table.button(Icon.eyeOff, Styles.cleari, () -> { if(Core.input.shift()) removeLinks(); else ui.showConfirm("@confirm", "Are you sure you want to remove all links?", this::removeLinks); - }).size(40).tooltip("Remove all links").disabled(b -> !ClientVars.configs.isEmpty()); + }).size(40).tooltip("Remove all links").disabled(b -> !accessible() || !ClientVars.configs.isEmpty()); + + table.button(Icon.tree, Styles.cleari, () -> { + if(Core.input.shift()){ + importFromClipboard(); + new Toast(2).add("@client.processorimported"); + return; + } + BaseDialog dialog = new BaseDialog("@editor.export"); + dialog.cont.pane(p -> { + p.margin(10f); + p.table(Tex.button, t -> { + TextButtonStyle style = Styles.flatt; + t.defaults().size(280f, 60f).left(); + + t.button("@schematic.copy", Icon.copy, style, () -> { + dialog.hide(); + Core.app.setClipboardText(code); + }).marginLeft(12f); + t.row(); + t.button("@schematic.copy.import", Icon.download, style, () -> { + dialog.hide(); + importFromClipboard(); + }).marginLeft(12f); + }); + }); + + dialog.addCloseButton(); + dialog.show(); + }).size(40).tooltip("Copy/paste Code").disabled(b -> !accessible()); } @Override