Adding a new menu type. (#8449)

* Added a new type of menu.

* Renamed the methods and fixed buttons not selecting.

* Fixed followUpMenu and menu having different dialogs.

* Applying review changes.
- Refactored the menu dialog instantiation.
- Fixed the single-line else statement.
This commit is contained in:
Xasmedy 2023-03-31 20:21:41 +02:00 committed by GitHub
parent ac19c3f160
commit e79a97ed92
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 9 deletions

View File

@ -75,6 +75,8 @@ public class UI implements ApplicationListener, Loadable{
public FullTextDialog fullText;
public CampaignCompleteDialog campaignComplete;
public IntMap<Dialog> 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. */

View File

@ -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){