From 715a3da6e1e6f2548fdb5b810f927936bc3a9947 Mon Sep 17 00:00:00 2001 From: Siphalor Date: Mon, 13 Jul 2020 18:50:27 +0200 Subject: [PATCH] Moved Balance to separate window --- .../de/siphalor/was/visual/JFXVisual.java | 110 +++++++++++------- .../jfx/{ => component}/ScalingImagePane.java | 2 +- .../jfx/controller/BalanceController.java | 74 ++++++++++++ .../jfx/{ => controller}/MainController.java | 41 +------ .../jfx/{ => controller}/QuestController.java | 4 +- .../visual/jfx/{ => util}/BalanceEntry.java | 2 +- .../visual/jfx/{ => util}/DraggedProduct.java | 4 +- .../was/visual/jfx/{ => util}/JFXUtil.java | 2 +- .../visual/jfx/{ => util}/StorageSlot.java | 3 +- src/main/resources/assets/jfx/balance.fxml | 68 +++++++++++ src/main/resources/assets/jfx/game.fxml | 66 +---------- src/main/resources/content/lang/en_us.lang | 1 + 12 files changed, 230 insertions(+), 147 deletions(-) rename src/main/java/de/siphalor/was/visual/jfx/{ => component}/ScalingImagePane.java (95%) create mode 100644 src/main/java/de/siphalor/was/visual/jfx/controller/BalanceController.java rename src/main/java/de/siphalor/was/visual/jfx/{ => controller}/MainController.java (68%) rename src/main/java/de/siphalor/was/visual/jfx/{ => controller}/QuestController.java (95%) rename src/main/java/de/siphalor/was/visual/jfx/{ => util}/BalanceEntry.java (91%) rename src/main/java/de/siphalor/was/visual/jfx/{ => util}/DraggedProduct.java (81%) rename src/main/java/de/siphalor/was/visual/jfx/{ => util}/JFXUtil.java (95%) rename src/main/java/de/siphalor/was/visual/jfx/{ => util}/StorageSlot.java (97%) create mode 100644 src/main/resources/assets/jfx/balance.fxml diff --git a/src/main/java/de/siphalor/was/visual/JFXVisual.java b/src/main/java/de/siphalor/was/visual/JFXVisual.java index 7491062..60e84e9 100644 --- a/src/main/java/de/siphalor/was/visual/JFXVisual.java +++ b/src/main/java/de/siphalor/was/visual/JFXVisual.java @@ -8,25 +8,21 @@ import de.siphalor.was.content.product.Product; import de.siphalor.was.content.quest.Quest; import de.siphalor.was.content.resource.Resource; import de.siphalor.was.game.Balance; -import de.siphalor.was.visual.jfx.*; +import de.siphalor.was.visual.jfx.controller.BalanceController; +import de.siphalor.was.visual.jfx.controller.MainController; +import de.siphalor.was.visual.jfx.controller.QuestController; +import de.siphalor.was.visual.jfx.util.JFXUtil; +import de.siphalor.was.visual.jfx.util.StorageSlot; import javafx.animation.FadeTransition; import javafx.animation.Interpolator; import javafx.application.Application; -import javafx.collections.ObservableList; import javafx.fxml.FXMLLoader; import javafx.geometry.Insets; import javafx.scene.Parent; import javafx.scene.Scene; -import javafx.scene.chart.NumberAxis; -import javafx.scene.chart.XYChart; -import javafx.scene.control.TableColumn; import javafx.scene.control.Tooltip; -import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.image.Image; -import javafx.scene.layout.ColumnConstraints; -import javafx.scene.layout.GridPane; -import javafx.scene.layout.Pane; -import javafx.scene.layout.RowConstraints; +import javafx.scene.layout.*; import javafx.stage.Stage; import javafx.util.Duration; import org.jetbrains.annotations.NotNull; @@ -41,10 +37,13 @@ public class JFXVisual extends Application implements Visual { private static Scene mainScene; - private static MainController controller; + private static MainController mainController; private static GridPane storageGrid; private static StorageSlot[][] storageSlots; + private static Stage balanceStage; + private static BalanceController balanceController; + private static final Map CACHED_IMAGES = new HashMap<>(); @NotNull public static Image getProductImage(@NotNull Product product, @NotNull ContentManager contentManager) { @@ -75,28 +74,19 @@ public class JFXVisual extends Application implements Visual { @Override public void onScheduleStop() { primaryStage.close(); + if (balanceStage != null) + balanceStage.close(); } @Override public void onBalanceChanged(int budget, Balance.Transaction transaction, int change, int totalIncome, int totalLoss) { I18n i18n = I18n.getInstance(); - controller.budgetLabel.setText(i18n.format("game.budget", budget)); - JFXUtil.setStyleClass(controller.budgetLabel, "red", budget < 0); + mainController.budgetLabel.setText(i18n.format("game.budget", budget)); + JFXUtil.setStyleClass(mainController.budgetLabel, "red", budget < 0); - controller.totalIncomeLabel.setText(i18n.format("game.balance.total-income", totalIncome)); - controller.totalLossLabel.setText(i18n.format("game.balance.total-loss", totalLoss)); - - controller.chartQueue.add(budget); - - if (controller.chartTab.isSelected()) { - controller.updateChart(); - } - - if (transaction != Balance.Transaction.NOOP) { - ObservableList items = controller.balanceHistoryTable.getItems(); - items.add(new BalanceEntry(items.size(), change, i18n.getString(transaction.getTranslationKey()))); - controller.balanceHistoryTable.sort(); + if (balanceController != null) { + balanceController.onBalanceChanged(budget, transaction, change, totalIncome, totalLoss); } } @@ -104,14 +94,14 @@ public class JFXVisual extends Application implements Visual { public void onQuestAdded(Quest newQuest, boolean canCreateMore) { addQuest(newQuest); - controller.nextQuestButton.setDisable(!canCreateMore); + mainController.nextQuestButton.setDisable(!canCreateMore); } @Override public void onQuestRemoved(int index) { - controller.questBox.getChildren().remove(index); + mainController.questBox.getChildren().remove(index); - controller.nextQuestButton.setDisable(false); + mainController.nextQuestButton.setDisable(false); } @Override @@ -122,21 +112,53 @@ public class JFXVisual extends Application implements Visual { primaryStage.setTitle(WhatAStorage.TITLE); loader.setResources(I18n.getInstance()); - controller = new MainController(WhatAStorage.getInstance()); - loader.setController(controller); + mainController = new MainController(WhatAStorage.getInstance()); + loader.setController(mainController); Pane pane = loader.load(AssetsManager.getStream("jfx/game.fxml").get()); mainScene = new Scene(pane); mainScene.getStylesheets().add("assets/jfx/main.css"); - ObservableList> columns = controller.balanceHistoryTable.getColumns(); - columns.get(0).setCellValueFactory(new PropertyValueFactory<>("index")); - columns.get(1).setCellValueFactory(new PropertyValueFactory<>("change")); - columns.get(2).setCellValueFactory(new PropertyValueFactory<>("description")); - loadMainScene(); - //noinspection unchecked - controller.budgetChart.getData().add((XYChart.Series)(Object) controller.budgetChartSeries); + + mainController.balanceButton.setOnAction(event -> { + if (balanceStage != null && balanceStage.isShowing()) { + return; + } + + balanceStage = new Stage(); + FXMLLoader balanceLoader = new FXMLLoader(); + balanceLoader.setResources(I18n.getInstance()); + + try { + balanceController = new BalanceController(); + balanceLoader.setController(balanceController); + + Parent parent = balanceLoader.load(AssetsManager.getStream("jfx/balance.fxml").orElseThrow()); + + balanceController.init(); + + Scene balanceScene = new Scene(parent); + balanceScene.getStylesheets().add("assets/jfx/main.css"); + + balanceStage.setOnCloseRequest(e -> { + balanceStage = null; + balanceController = null; + }); + + balanceStage.setAlwaysOnTop(true); + balanceStage.setScene(balanceScene); + balanceStage.setTitle(I18n.getInstance().getString("game.balance")); + balanceStage.show(); + } catch (IOException e) { + e.printStackTrace(); + } + }); + + primaryStage.setOnCloseRequest(event -> { + if (balanceStage != null) + balanceStage.hide(); + }); primaryStage.show(); } @@ -147,9 +169,8 @@ public class JFXVisual extends Application implements Visual { prepareStorageGrid(3, 3, 3); AssetsManager.getStream("textures/bin_closed.png").ifPresent(inputStream -> { - controller.trash.setImage(new Image(inputStream)); + mainController.trash.setImage(new Image(inputStream)); }); - controller.budgetChartSeries.setName(I18n.getInstance().getString("game.balance.chart.line")); onBalanceChanged(0, Balance.Transaction.NOOP, 0, 0, 0); } @@ -167,7 +188,7 @@ public class JFXVisual extends Application implements Visual { transition.setByValue(1D); transition.setInterpolator(Interpolator.EASE_OUT); - controller.questBox.getChildren().add(parent); + mainController.questBox.getChildren().add(parent); transition.play(); Product product = quest.getProduct(); @@ -196,6 +217,11 @@ public class JFXVisual extends Application implements Visual { storageGrid = new GridPane(); storageGrid.setId("storage-grid"); storageGrid.setPadding(new Insets(5D)); + storageGrid.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); + AnchorPane.setTopAnchor(storageGrid, 0D); + AnchorPane.setRightAnchor(storageGrid, 0D); + AnchorPane.setBottomAnchor(storageGrid, 0D); + AnchorPane.setLeftAnchor(storageGrid, 0D); ColumnConstraints columnConstraints = new ColumnConstraints(); columnConstraints.setPercentWidth(100D / width); @@ -215,7 +241,7 @@ public class JFXVisual extends Application implements Visual { storageGrid.getColumnConstraints().add(columnConstraints); } - controller.storageTab.setContent(storageGrid); + mainController.storagePane.getChildren().add(storageGrid); } @Override diff --git a/src/main/java/de/siphalor/was/visual/jfx/ScalingImagePane.java b/src/main/java/de/siphalor/was/visual/jfx/component/ScalingImagePane.java similarity index 95% rename from src/main/java/de/siphalor/was/visual/jfx/ScalingImagePane.java rename to src/main/java/de/siphalor/was/visual/jfx/component/ScalingImagePane.java index 3851c8d..f7a0ce3 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/ScalingImagePane.java +++ b/src/main/java/de/siphalor/was/visual/jfx/component/ScalingImagePane.java @@ -1,4 +1,4 @@ -package de.siphalor.was.visual.jfx; +package de.siphalor.was.visual.jfx.component; import javafx.beans.property.ObjectProperty; import javafx.scene.control.ScrollPane; diff --git a/src/main/java/de/siphalor/was/visual/jfx/controller/BalanceController.java b/src/main/java/de/siphalor/was/visual/jfx/controller/BalanceController.java new file mode 100644 index 0000000..9c51f1a --- /dev/null +++ b/src/main/java/de/siphalor/was/visual/jfx/controller/BalanceController.java @@ -0,0 +1,74 @@ +package de.siphalor.was.visual.jfx.controller; + +import de.siphalor.was.WhatAStorage; +import de.siphalor.was.content.lang.I18n; +import de.siphalor.was.game.Balance; +import de.siphalor.was.util.Pair; +import de.siphalor.was.visual.jfx.util.BalanceEntry; +import javafx.collections.ObservableList; +import javafx.scene.chart.LineChart; +import javafx.scene.chart.NumberAxis; +import javafx.scene.chart.XYChart; +import javafx.scene.control.Label; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.cell.PropertyValueFactory; + +public class BalanceController { + public Label totalIncomeLabel; + public Label totalLossLabel; + public TableView balanceHistoryTable; + public LineChart budgetChart; + public XYChart.Series budgetChartSeries = new XYChart.Series<>(); + + public BalanceController() { + budgetChartSeries.setName(I18n.getInstance().getString("game.balance.chart.line")); + } + + public void init() { + Balance balance = WhatAStorage.getInstance().getBalance(); + + ObservableList> columns = balanceHistoryTable.getColumns(); + columns.get(0).setCellValueFactory(new PropertyValueFactory<>("index")); + columns.get(1).setCellValueFactory(new PropertyValueFactory<>("change")); + columns.get(2).setCellValueFactory(new PropertyValueFactory<>("description")); + + //noinspection unchecked + budgetChart.getData().add((XYChart.Series)(Object) budgetChartSeries); + ObservableList> chartItems = budgetChartSeries.getData(); + chartItems.add(new XYChart.Data<>(0, 0)); + + ObservableList tableItems = balanceHistoryTable.getItems(); + + I18n i18n = I18n.getInstance(); + + int i = 1; + int budget = 0; + + for (Pair entry : balance.getHistory()) { + budget += entry.getSecond(); + + tableItems.add(new BalanceEntry(i, entry.getSecond(), i18n.getString(entry.getFirst().getTranslationKey()))); + + chartItems.add(new XYChart.Data<>(i, budget)); + i++; + } + } + + public void onBalanceChanged(int budget, Balance.Transaction transaction, int change, int totalIncome, int totalLoss) { + I18n i18n = I18n.getInstance(); + + totalIncomeLabel.setText(i18n.format("game.balance.total-income", totalIncome)); + totalLossLabel.setText(i18n.format("game.balance.total-loss", totalLoss)); + + if (transaction != Balance.Transaction.NOOP) { + ObservableList items = balanceHistoryTable.getItems(); + items.add(new BalanceEntry(items.size(), change, i18n.getString(transaction.getTranslationKey()))); + balanceHistoryTable.sort(); + } + + ObservableList> data = budgetChartSeries.getData(); + + data.add(new XYChart.Data<>(data.size(), budget)); + } +} diff --git a/src/main/java/de/siphalor/was/visual/jfx/MainController.java b/src/main/java/de/siphalor/was/visual/jfx/controller/MainController.java similarity index 68% rename from src/main/java/de/siphalor/was/visual/jfx/MainController.java rename to src/main/java/de/siphalor/was/visual/jfx/controller/MainController.java index 3cb2210..a53fe8d 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/MainController.java +++ b/src/main/java/de/siphalor/was/visual/jfx/controller/MainController.java @@ -1,38 +1,26 @@ -package de.siphalor.was.visual.jfx; +package de.siphalor.was.visual.jfx.controller; import de.siphalor.was.WhatAStorage; import de.siphalor.was.assets.AssetsManager; -import javafx.collections.ObservableList; +import de.siphalor.was.visual.jfx.util.DraggedProduct; import javafx.fxml.FXML; -import javafx.scene.chart.LineChart; -import javafx.scene.chart.NumberAxis; -import javafx.scene.chart.XYChart; import javafx.scene.control.Button; import javafx.scene.control.Label; -import javafx.scene.control.Tab; -import javafx.scene.control.TableView; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.DragEvent; import javafx.scene.input.TransferMode; +import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; -import java.util.LinkedList; -import java.util.Queue; - @SuppressWarnings("unused") public class MainController { private final WhatAStorage was; - public Tab storageTab; - public Tab chartTab; public Label budgetLabel; - public Label totalIncomeLabel; - public Label totalLossLabel; - public TableView balanceHistoryTable; - public LineChart budgetChart; - public XYChart.Series budgetChartSeries = new XYChart.Series<>(); - public Queue chartQueue = new LinkedList<>(); + public Button balanceButton; + + public Pane storagePane; public ImageView trash; @@ -98,21 +86,4 @@ public class MainController { } dragEvent.setDropCompleted(false); } - - @FXML - private void onChartTabSelected() { - updateChart(); - } - - public void updateChart() { - if (!chartQueue.isEmpty()) { - ObservableList> data = budgetChartSeries.getData(); - - for (Integer integer : chartQueue) { - data.add(new XYChart.Data<>(data.size(), integer)); - } - - chartQueue.clear(); - } - } } diff --git a/src/main/java/de/siphalor/was/visual/jfx/QuestController.java b/src/main/java/de/siphalor/was/visual/jfx/controller/QuestController.java similarity index 95% rename from src/main/java/de/siphalor/was/visual/jfx/QuestController.java rename to src/main/java/de/siphalor/was/visual/jfx/controller/QuestController.java index d459c89..e6c8a9a 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/QuestController.java +++ b/src/main/java/de/siphalor/was/visual/jfx/controller/QuestController.java @@ -1,7 +1,9 @@ -package de.siphalor.was.visual.jfx; +package de.siphalor.was.visual.jfx.controller; import de.siphalor.was.WhatAStorage; import de.siphalor.was.content.quest.Quest; +import de.siphalor.was.visual.jfx.util.DraggedProduct; +import de.siphalor.was.visual.jfx.util.JFXUtil; import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.image.ImageView; diff --git a/src/main/java/de/siphalor/was/visual/jfx/BalanceEntry.java b/src/main/java/de/siphalor/was/visual/jfx/util/BalanceEntry.java similarity index 91% rename from src/main/java/de/siphalor/was/visual/jfx/BalanceEntry.java rename to src/main/java/de/siphalor/was/visual/jfx/util/BalanceEntry.java index 9af63e9..d113364 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/BalanceEntry.java +++ b/src/main/java/de/siphalor/was/visual/jfx/util/BalanceEntry.java @@ -1,4 +1,4 @@ -package de.siphalor.was.visual.jfx; +package de.siphalor.was.visual.jfx.util; public class BalanceEntry { public final int index; diff --git a/src/main/java/de/siphalor/was/visual/jfx/DraggedProduct.java b/src/main/java/de/siphalor/was/visual/jfx/util/DraggedProduct.java similarity index 81% rename from src/main/java/de/siphalor/was/visual/jfx/DraggedProduct.java rename to src/main/java/de/siphalor/was/visual/jfx/util/DraggedProduct.java index b5cde70..14e0268 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/DraggedProduct.java +++ b/src/main/java/de/siphalor/was/visual/jfx/util/DraggedProduct.java @@ -1,10 +1,10 @@ -package de.siphalor.was.visual.jfx; +package de.siphalor.was.visual.jfx.util; import javafx.scene.input.DataFormat; import java.io.Serializable; -interface DraggedProduct extends Serializable { +public interface DraggedProduct extends Serializable { DataFormat FORMAT = new DataFormat("application/java-was-jfx-product-move"); class Quest implements DraggedProduct { diff --git a/src/main/java/de/siphalor/was/visual/jfx/JFXUtil.java b/src/main/java/de/siphalor/was/visual/jfx/util/JFXUtil.java similarity index 95% rename from src/main/java/de/siphalor/was/visual/jfx/JFXUtil.java rename to src/main/java/de/siphalor/was/visual/jfx/util/JFXUtil.java index 8db59e6..1ab54f3 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/JFXUtil.java +++ b/src/main/java/de/siphalor/was/visual/jfx/util/JFXUtil.java @@ -1,4 +1,4 @@ -package de.siphalor.was.visual.jfx; +package de.siphalor.was.visual.jfx.util; import javafx.scene.Node; import javafx.scene.image.Image; diff --git a/src/main/java/de/siphalor/was/visual/jfx/StorageSlot.java b/src/main/java/de/siphalor/was/visual/jfx/util/StorageSlot.java similarity index 97% rename from src/main/java/de/siphalor/was/visual/jfx/StorageSlot.java rename to src/main/java/de/siphalor/was/visual/jfx/util/StorageSlot.java index f34b967..394b5c9 100644 --- a/src/main/java/de/siphalor/was/visual/jfx/StorageSlot.java +++ b/src/main/java/de/siphalor/was/visual/jfx/util/StorageSlot.java @@ -1,7 +1,8 @@ -package de.siphalor.was.visual.jfx; +package de.siphalor.was.visual.jfx.util; import de.siphalor.was.WhatAStorage; import de.siphalor.was.content.lang.I18n; +import de.siphalor.was.visual.jfx.component.ScalingImagePane; import javafx.geometry.HPos; import javafx.geometry.VPos; import javafx.scene.control.Label; diff --git a/src/main/resources/assets/jfx/balance.fxml b/src/main/resources/assets/jfx/balance.fxml new file mode 100644 index 0000000..88f68ce --- /dev/null +++ b/src/main/resources/assets/jfx/balance.fxml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/assets/jfx/game.fxml b/src/main/resources/assets/jfx/game.fxml index 3956349..af0260b 100644 --- a/src/main/resources/assets/jfx/game.fxml +++ b/src/main/resources/assets/jfx/game.fxml @@ -1,22 +1,15 @@ - - - - - - - @@ -27,6 +20,7 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/src/main/resources/content/lang/en_us.lang b/src/main/resources/content/lang/en_us.lang index 9107308..4713562 100644 --- a/src/main/resources/content/lang/en_us.lang +++ b/src/main/resources/content/lang/en_us.lang @@ -9,6 +9,7 @@ game.trash = Recycle Bin game.trash.hover = Destroy\n%d$ game.storage = Storage game.storage.empty = Empty +game.balance = Balance game.balance.history = Transactions game.balance.history.no-data = No transactions yet game.balance.history.index =