diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index 5783c6f617..643a95308c 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -75,6 +75,8 @@ public class UI implements ApplicationListener, Loadable{ public FullTextDialog fullText; public CampaignCompleteDialog campaignComplete; + public IntMap followUpMenus; + public Cursor drillCursor, unloadCursor, targetCursor; private @Nullable Element lastAnnouncement; @@ -202,6 +204,7 @@ public class UI implements ApplicationListener, Loadable{ logic = new LogicDialog(); fullText = new FullTextDialog(); campaignComplete = new CampaignCompleteDialog(); + followUpMenus = new IntMap<>(); Group group = Core.scene.root; @@ -591,9 +594,8 @@ public class UI implements ApplicationListener, Loadable{ dialog.show(); } - /** Shows a menu that fires a callback when an option is selected. If nothing is selected, -1 is returned. */ - public void showMenu(String title, String message, String[][] options, Intc callback){ - new Dialog(title){{ + public Dialog newMenuDialog(String title, String message, String[][] options, Intc buttonListener, Runnable closeOnBack){ + return new Dialog(title){{ setFillParent(true); removeChild(titleTable); cont.add(titleTable).width(400f); @@ -617,16 +619,46 @@ public class UI implements ApplicationListener, Loadable{ String optionName = optionsRow[i]; int finalOption = option; - buttonRow.button(optionName, () -> { - callback.get(finalOption); - hide(); - }).size(i == optionsRow.length - 1 ? lastWidth : width, 50).pad(4); + buttonRow.button(optionName, () -> buttonListener.get(finalOption)) + .size(i == optionsRow.length - 1 ? lastWidth : width, 50).pad(4); option++; } } }).growX(); - closeOnBack(() -> callback.get(-1)); - }}.show(); + closeOnBack(closeOnBack); + }}; + } + + /** Shows a menu that fires a callback when an option is selected. If nothing is selected, -1 is returned. */ + public void showMenu(String title, String message, String[][] options, Intc callback){ + newMenuDialog(title, message, options, option -> { + callback.get(option); + hide(); + }, () -> callback.get(-1)).show(); + } + + /** Shows a menu that hides when another followUp-menu is shown or when nothing is selected. + * @see UI#showMenu(String, String, String[][], Intc) */ + public void showFollowUpMenu(int menuId, String title, String message, String[][] options, Intc callback) { + + Dialog dialog = newMenuDialog(title, message, options, callback, () -> { + followUpMenus.remove(menuId); + callback.get(-1); + }); + + Dialog oldDialog = followUpMenus.remove(menuId); + if(oldDialog != null){ + dialog.show(Core.scene, null); + oldDialog.hide(null); + }else{ + dialog.show(); + } + followUpMenus.put(menuId, dialog); + } + + public void hideFollowUpMenu(int menuId) { + if(!followUpMenus.containsKey(menuId)) return; + followUpMenus.remove(menuId).hide(); } /** Formats time with hours:minutes:seconds. */ diff --git a/core/src/mindustry/ui/Menus.java b/core/src/mindustry/ui/Menus.java index 4da4713f73..b4dfdd247d 100644 --- a/core/src/mindustry/ui/Menus.java +++ b/core/src/mindustry/ui/Menus.java @@ -36,6 +36,19 @@ public class Menus{ ui.showMenu(title, message, options, (option) -> Call.menuChoose(player, menuId, option)); } + @Remote(variants = Variant.both) + public static void followUpMenu(int menuId, String title, String message, String[][] options){ + if(title == null) title = ""; + if(options == null) options = new String[0][0]; + + ui.showFollowUpMenu(menuId, title, message, options, (option) -> Call.menuChoose(player, menuId, option)); + } + + @Remote(variants = Variant.both) + public static void hideFollowUpMenu(int menuId) { + ui.hideFollowUpMenu(menuId); + } + @Remote(targets = Loc.both, called = Loc.both) public static void menuChoose(@Nullable Player player, int menuId, int option){ if(player != null){