95 lines
3.6 KiB
Java
95 lines
3.6 KiB
Java
package io.gitlab.jfronny.inceptum.gtk;
|
|
|
|
import org.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<MicrosoftAccount> accounts = new ArrayList<>(AccountManager.accounts);
|
|
accounts.add(null);
|
|
accountsMenu.literalRadio("account", accounts.get(AccountManager.selectedIndex), accounts, (i, acc) -> {
|
|
if (acc == null) return I18n.get("account.none");
|
|
return acc.minecraftUsername;
|
|
}, AccountManager::switchAccount);
|
|
}
|
|
}
|