From a930da2764a84d227e4a06267915ab3ecc2e4c8c Mon Sep 17 00:00:00 2001 From: Solveig Natvig Date: Sun, 24 May 2026 22:25:14 +0200 Subject: [PATCH 1/2] Add price statistics --- src/main/java/View/MainGameScene.java | 77 +++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/src/main/java/View/MainGameScene.java b/src/main/java/View/MainGameScene.java index 7684fff..a167eec 100644 --- a/src/main/java/View/MainGameScene.java +++ b/src/main/java/View/MainGameScene.java @@ -149,8 +149,22 @@ private VBox createStocksPanel() { searchBox.getChildren().addAll(search, searchBtn, filter); loadStocks.run(); + // Double-click a row to view price statistics + table.setOnMouseClicked(event -> { + if (event.getClickCount() == 2) { + StockRow selected = table.getSelectionModel().getSelectedItem(); + if (selected != null) { + showStockStats(selected.s); + } + } + }); + VBox.setVgrow(table, Priority.ALWAYS); - panel.getChildren().addAll(searchBox, table); + + Label hint = new Label("Double-click a row to view price history"); + hint.getStyleClass().add("file-label"); + + panel.getChildren().addAll(searchBox, table, hint); return panel; } @@ -289,7 +303,7 @@ protected void updateItem(Share s, boolean empty) { updateHoldingsList(holdingsList); - // Antall Rad + // Quantity row HBox quantityRow = new HBox(8); quantityRow.setAlignment(Pos.CENTER_LEFT); TextField quantityField = new TextField(); @@ -297,7 +311,7 @@ protected void updateItem(Share s, boolean empty) { quantityField.setPrefWidth(120); quantityRow.getChildren().addAll(new Label("Quantity to sell:"), quantityField); - // Fyll inn maks anntall automatisk når man velger en holding + // Automatically fills in the maximum quantity when a holding is selected holdingsList.getSelectionModel().selectedItemProperty().addListener((obs, old, selected) -> { if (selected != null) { quantityField.setText(selected.getQuantity().toPlainString()); @@ -503,6 +517,63 @@ private BigDecimal getNetWorth() { return player.getMoney().add(player.getPortfolio().getNetWorth()); } + private void showStockStats(Stock stock) { + Dialog dialog = new Dialog<>(); + dialog.setTitle(stock.getSymbol() + " — " + stock.getCompany()); + dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE); + + VBox content = new VBox(12); + content.setPrefWidth(340); + + // --- Number Sumary --- + BigDecimal change = stock.getLatestPriceChange(); + String changeSign = change.compareTo(BigDecimal.ZERO) >= 0 ? "+" : ""; + + GridPane summary = new GridPane(); + summary.setHgap(16); + summary.setVgap(6); + addStatRow(summary, 0, "Current price:", "$" + formatMoney(stock.getSalesPrice())); + addStatRow(summary, 1, "Week change:", changeSign + formatMoney(change)); + addStatRow(summary, 2, "All-time high:", "$" + formatMoney(stock.getHighestPrice())); + addStatRow(summary, 3, "All-time low:", "$" + formatMoney(stock.getLowestPrice())); + addStatRow(summary, 4, "Weeks tracked:", String.valueOf(stock.getHistoricalPrices().size())); + + // --- Price history list --- + Label histHeading = new Label("Price history:"); + histHeading.setStyle("-fx-font-weight: bold;"); + + ListView histList = new ListView<>(); + histList.setPrefHeight(180); + List prices = stock.getHistoricalPrices(); + ObservableList rows = FXCollections.observableArrayList(); + for (int i = 0; i < prices.size(); i++) { + String change_i = ""; + if (i > 0) { + BigDecimal diff = prices.get(i).subtract(prices.get(i - 1)); + change_i = " (" + (diff.compareTo(BigDecimal.ZERO) >= 0 ? "+" : "") + + formatMoney(diff) + ")"; + } + rows.add("Week " + (i + 1) + ": $" + formatMoney(prices.get(i)) + change_i); + } + histList.setItems(rows); + + // Scroll to the most recent week + if (!rows.isEmpty()) histList.scrollTo(rows.size() - 1); + + content.getChildren().addAll(summary, new Separator(), histHeading, histList); + dialog.getDialogPane().setContent(content); + dialog.showAndWait(); + } + + /** Adds a label and value to the given row. */ + private void addStatRow(GridPane grid, int row, String labelText, String valueText) { + Label lbl = new Label(labelText); + lbl.setStyle("-fx-font-weight: bold;"); + Label val = new Label(valueText); + grid.add(lbl, 0, row); + grid.add(val, 1, row); + } + private void showConfirmation(String title, Transaction t) { StringBuilder msg = new StringBuilder(); if (t instanceof Purchase) { From 04196110b8bd84350b42b4320363af48c8f5cc38 Mon Sep 17 00:00:00 2001 From: Solveig Natvig Date: Mon, 25 May 2026 09:28:00 +0200 Subject: [PATCH 2/2] Add more files to ignore --- .gitignore | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.gitignore b/.gitignore index 2f7896d..197c17a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,21 @@ +# Maven target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +release.properties + +# IDE - VS Code +.vscode/ + +# IDE - IntelliJ +.idea/ +*.iml +*.iws +*.ipr + +# macOS +.DS_Store + +# Loggfiler +*.log