diff --git a/app/src/main/java/org/toop/Main.java b/app/src/main/java/org/toop/Main.java index fa04961..ac0989c 100644 --- a/app/src/main/java/org/toop/Main.java +++ b/app/src/main/java/org/toop/Main.java @@ -13,11 +13,10 @@ public final class Main { static void main(String[] args) { initSystems(); App.run(args); - } private static void initSystems() { - ResourceManager.loadAssets(new ResourceLoader("app/src/main/resources/assets")); + ResourceManager.loadAssets(new ResourceLoader("app/src/main/resources/localization")); new Thread(() -> new NetworkingClientEventListener(new NetworkingClientManager())).start(); new Thread(() -> { diff --git a/app/src/main/java/org/toop/app/App.java b/app/src/main/java/org/toop/app/App.java index 7b909ba..e939629 100644 --- a/app/src/main/java/org/toop/app/App.java +++ b/app/src/main/java/org/toop/app/App.java @@ -1,12 +1,17 @@ package org.toop.app; +import org.toop.app.widget.Primitive; +import org.toop.app.widget.Widget; import org.toop.app.widget.WidgetContainer; +import org.toop.app.widget.complex.LoadingWidget; import org.toop.app.widget.display.SongDisplay; import org.toop.app.widget.popup.QuitPopup; import org.toop.app.widget.view.MainView; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; +import org.toop.framework.resource.ResourceLoader; import org.toop.framework.resource.ResourceManager; +import org.toop.framework.resource.events.AssetLoaderEvents; import org.toop.framework.resource.resources.CssAsset; import org.toop.local.AppContext; import org.toop.local.AppSettings; @@ -47,7 +52,7 @@ public final class App extends Application { stage.setMinHeight(720); stage.setOnCloseRequest(event -> { event.consume(); - startQuit(); + quit(); }); stage.setScene(scene); @@ -63,11 +68,44 @@ public final class App extends Application { App.isQuitting = false; - AppSettings.applySettings(); - new EventFlow().addPostEvent(new AudioEvents.StartBackgroundMusic()).asyncPostEvent(); + var loading = new LoadingWidget(Primitive.text( + "Loading...", false), 0, 0, 9999 + ); - WidgetContainer.add(Pos.CENTER, new MainView()); - WidgetContainer.add(Pos.BOTTOM_RIGHT, new SongDisplay()); + WidgetContainer.add(Pos.CENTER, loading); + + loading.setOnSuccess(() -> { + AppSettings.applySettings(); + loading.hide(); + WidgetContainer.add(Pos.CENTER, new MainView()); + WidgetContainer.add(Pos.BOTTOM_RIGHT, new SongDisplay()); + stage.setOnCloseRequest(event -> { + event.consume(); + startQuit(); + }); + }); + + var loadingFlow = new EventFlow(); + loadingFlow + .listen(AssetLoaderEvents.LoadingProgressUpdate.class, e -> { + + loading.setMaxAmount(e.isLoadingAmount()-1); + + try { + loading.setAmount(e.hasLoadedAmount()); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + + if (e.hasLoadedAmount() >= e.isLoadingAmount()-1) { + loading.triggerSuccess(); + loadingFlow.unsubscribe("initloading"); + } + + }, false, "initloading"); + + ResourceManager.loadAssets(new ResourceLoader("app/src/main/resources/assets")); + new EventFlow().addPostEvent(new AudioEvents.StartBackgroundMusic()).asyncPostEvent(); } public static void startQuit() { diff --git a/app/src/main/java/org/toop/app/Server.java b/app/src/main/java/org/toop/app/Server.java index f28e7f3..87df0e1 100644 --- a/app/src/main/java/org/toop/app/Server.java +++ b/app/src/main/java/org/toop/app/Server.java @@ -99,16 +99,9 @@ public final class Server { a.onResponse(NetworkEvents.StartClientResponse.class, e -> { if (!e.successful()) { -// loading.triggerFailure(); return; } - try { - TimeUnit.MILLISECONDS.sleep(500); // TODO temp fix for index bug - } catch (InterruptedException ex) { - throw new RuntimeException(ex); - } - WidgetContainer.getCurrentView().transitionPrevious(); a.unsubscribe("connecting"); @@ -131,6 +124,9 @@ public final class Server { () -> { try { loading.setAmount(e.amount()); + if (e.amount() >= loading.getMaxAmount()) { + loading.triggerFailure(); + } } catch (Exception ex) { throw new RuntimeException(ex); } @@ -253,7 +249,7 @@ public final class Server { } else { stopScheduler(); } - }, 0, 5, TimeUnit.SECONDS); + }, 0, 1, TimeUnit.SECONDS); } private void stopScheduler() { diff --git a/app/src/main/java/org/toop/app/widget/Primitive.java b/app/src/main/java/org/toop/app/widget/Primitive.java index 451aebe..4cb9c17 100644 --- a/app/src/main/java/org/toop/app/widget/Primitive.java +++ b/app/src/main/java/org/toop/app/widget/Primitive.java @@ -23,7 +23,7 @@ import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.util.StringConverter; -public final class Primitive { +public final class Primitive { public static Text header(String key, boolean localize) { var header = new Text(); header.getStyleClass().add("header"); @@ -78,7 +78,6 @@ public final class Primitive { button.setOnAction(_ -> { onAction.run(); playButtonSound(); - System.out.println("HI I got called button"); }); } diff --git a/app/src/main/java/org/toop/app/widget/complex/LoadingWidget.java b/app/src/main/java/org/toop/app/widget/complex/LoadingWidget.java index 3b97357..14361f5 100644 --- a/app/src/main/java/org/toop/app/widget/complex/LoadingWidget.java +++ b/app/src/main/java/org/toop/app/widget/complex/LoadingWidget.java @@ -1,5 +1,6 @@ package org.toop.app.widget.complex; +import javafx.application.Platform; import javafx.geometry.Pos; import javafx.scene.control.ProgressBar; import javafx.scene.layout.VBox; @@ -7,6 +8,7 @@ import javafx.scene.text.Text; import org.toop.app.widget.Primitive; import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicBoolean; public class LoadingWidget extends ViewWidget implements Update { // TODO make of widget type private final ProgressBar progressBar; @@ -14,8 +16,8 @@ public class LoadingWidget extends ViewWidget implements Update { // TODO make o private Runnable success = () -> {}; private Runnable failure = () -> {}; - private boolean successTriggered = false; - private boolean failureTriggered = false; + private AtomicBoolean successTriggered = new AtomicBoolean(false); + private AtomicBoolean failureTriggered = new AtomicBoolean(false); private int maxAmount; private int minAmount; private int amount; @@ -66,7 +68,7 @@ public class LoadingWidget extends ViewWidget implements Update { // TODO make o } public boolean isTriggered() { - return (failureTriggered || successTriggered); + return (failureTriggered.get() || successTriggered.get()); } /** @@ -105,21 +107,27 @@ public class LoadingWidget extends ViewWidget implements Update { // TODO make o * Forcefully trigger success. */ public void triggerSuccess() { - successTriggered = true; // TODO, else it will double call... why? - success.run(); + if (successTriggered.compareAndSet(false, true)) { + Platform.runLater(() -> { + if (success != null) success.run(); + }); + } } /** * Forcefully trigger failure. */ public void triggerFailure() { - failureTriggered = true; // TODO, else it will double call... why? - failure.run(); + if (failureTriggered.compareAndSet(false, true)) { + Platform.runLater(() -> { + if (failure != null) failure.run(); + }); + } } @Override public void update() throws Exception { // TODO Better exception - if (successTriggered || failureTriggered) { // If already triggered, throw exception. + if (successTriggered.get() || failureTriggered.get()) { // If already triggered, throw exception. throw new RuntimeException(); } @@ -133,7 +141,9 @@ public class LoadingWidget extends ViewWidget implements Update { // TODO make o return; } - percentage = (float) amount / maxAmount; + if (maxAmount != 0) { + percentage = (float) amount / maxAmount; + } progressBar.setProgress(percentage); } diff --git a/app/src/main/resources/assets/localization/localization_ar.properties b/app/src/main/resources/localization/localization_ar.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_ar.properties rename to app/src/main/resources/localization/localization_ar.properties diff --git a/app/src/main/resources/assets/localization/localization_de.properties b/app/src/main/resources/localization/localization_de.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_de.properties rename to app/src/main/resources/localization/localization_de.properties diff --git a/app/src/main/resources/assets/localization/localization_en.properties b/app/src/main/resources/localization/localization_en.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_en.properties rename to app/src/main/resources/localization/localization_en.properties diff --git a/app/src/main/resources/assets/localization/localization_es.properties b/app/src/main/resources/localization/localization_es.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_es.properties rename to app/src/main/resources/localization/localization_es.properties diff --git a/app/src/main/resources/assets/localization/localization_fr.properties b/app/src/main/resources/localization/localization_fr.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_fr.properties rename to app/src/main/resources/localization/localization_fr.properties diff --git a/app/src/main/resources/assets/localization/localization_hi.properties b/app/src/main/resources/localization/localization_hi.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_hi.properties rename to app/src/main/resources/localization/localization_hi.properties diff --git a/app/src/main/resources/assets/localization/localization_it.properties b/app/src/main/resources/localization/localization_it.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_it.properties rename to app/src/main/resources/localization/localization_it.properties diff --git a/app/src/main/resources/assets/localization/localization_ja.properties b/app/src/main/resources/localization/localization_ja.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_ja.properties rename to app/src/main/resources/localization/localization_ja.properties diff --git a/app/src/main/resources/assets/localization/localization_ko.properties b/app/src/main/resources/localization/localization_ko.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_ko.properties rename to app/src/main/resources/localization/localization_ko.properties diff --git a/app/src/main/resources/assets/localization/localization_nl.properties b/app/src/main/resources/localization/localization_nl.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_nl.properties rename to app/src/main/resources/localization/localization_nl.properties diff --git a/app/src/main/resources/assets/localization/localization_ru.properties b/app/src/main/resources/localization/localization_ru.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_ru.properties rename to app/src/main/resources/localization/localization_ru.properties diff --git a/app/src/main/resources/assets/localization/localization_zh.properties b/app/src/main/resources/localization/localization_zh.properties similarity index 100% rename from app/src/main/resources/assets/localization/localization_zh.properties rename to app/src/main/resources/localization/localization_zh.properties