package io.gitlab.jfronny.inceptum.gtk; import ch.bailu.gtk.gtk.Application; import io.gitlab.jfronny.commons.ref.R; import io.gitlab.jfronny.inceptum.common.Utils; import io.gitlab.jfronny.inceptum.gtk.menu.MenuBuilder; import io.gitlab.jfronny.inceptum.gtk.util.I18n; import io.gitlab.jfronny.inceptum.gtk.window.AboutWindow; import io.gitlab.jfronny.inceptum.gtk.window.NewInstanceWindow; import io.gitlab.jfronny.inceptum.launcher.LauncherEnv; import io.gitlab.jfronny.inceptum.launcher.api.account.AccountManager; import io.gitlab.jfronny.inceptum.launcher.api.account.MicrosoftAccount; import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance; import io.gitlab.jfronny.inceptum.launcher.system.instance.InstanceList; import io.gitlab.jfronny.inceptum.launcher.system.launch.InstanceLauncher; import io.gitlab.jfronny.inceptum.launcher.system.setup.Steps; import java.io.IOException; import java.util.*; public class GtkMenubar { public static MenuBuilder accountsMenu; public static MenuBuilder launchMenu; public static void create(Application app) { var menu = new MenuBuilder(app); var file = menu.submenu("file"); file.button("new", NewInstanceWindow::createAndShow); file.button("redownload", () -> { //TODO }); file.button("exit", app::quit); launchMenu = menu.submenu("launch"); generateLaunchMenu(); accountsMenu = menu.submenu("account"); generateAccountsMenu(); var help = menu.submenu("help"); help.button("about", AboutWindow::createAndShow); help.button("log", () -> { //TODO }); } public static void generateLaunchMenu() { Objects.requireNonNull(launchMenu); launchMenu.clear(); try { InstanceList.forEach(entry -> { launchMenu.literalButton(entry.id(), entry.toString(), () -> launch(entry)); }); } catch (IOException e) { Utils.LOGGER.error("Could not generate launch menu", e); } } public static void launch(Instance instance) { //TODO show popup during launch w/ cancel option (lock main UI) Runnable launch = () -> { try { Steps.reDownload(instance, Steps.createProcessState()); } catch (IOException e) { Utils.LOGGER.error("Could not redownload instance, trying to start anyways", e); } InstanceLauncher.launchClient(instance); }; if (instance.isSetupLocked()) { LauncherEnv.showError(I18n.get("instance.launch.locked.setup"), I18n.get("instance.launch.locked")); return; } if (instance.isRunningLocked()) { LauncherEnv.showOkCancel(I18n.get("instance.launch.locked.running"), I18n.get("instance.launch.locked"), () -> { new Thread(launch).start(); //TODO loom }, R::nop); } new Thread(launch).start(); } public static void generateAccountsMenu() { Objects.requireNonNull(accountsMenu); accountsMenu.clear(); accountsMenu.button("new", () -> { //TODO }); accountsMenu.button("manage", () -> { //TODO UI to add/remove accounts }); List accounts = new ArrayList<>(AccountManager.getAccounts()); accounts.add(null); accountsMenu.literalRadio("account", accounts.get(AccountManager.getSelectedIndex()), accounts, (i, acc) -> { if (acc == null) return I18n.get("account.none"); return acc.minecraftUsername; }, AccountManager::switchAccount); } }