diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardController.java index 47d1ff4..3d21c35 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardController.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardController.java @@ -9,6 +9,7 @@ import javafx.scene.control.TextFormatter; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -19,6 +20,7 @@ public class DashBoardController extends ViewController { private Exchange exchange; private List stockList; private DashBoardTimeRange selectedTimeRange; + private String selectedFilter; /** * {@inheritDoc} @@ -32,6 +34,7 @@ public DashBoardController(final DashBoardView viewElement, this.player = player; this.stockList = stockList; this.exchange = exchange; + this.selectedFilter = ""; this.selectedTimeRange = DashBoardTimeRange.DEFAULT; super(viewElement, eventManager); } @@ -45,12 +48,35 @@ private void populateStockList(String filter) { getViewElement().clearStockList(); String search = filter.toLowerCase(); for (Stock s : stockList) { - boolean matches = s.getSymbol().toLowerCase().contains(search) || - s.getCompany().toLowerCase().contains(search); + if (s.getSymbol().toLowerCase().contains(search) + || s.getCompany().toLowerCase().contains(search)) { + float rangePercent = 0; - if (matches) { - Button stockBtn = getViewElement().createStockButton(s.getSymbol()); + if (s.getHistoricalPrices().size() >= 2) { + BigDecimal currentPrice = s.getHistoricalPrices().get(s.getHistoricalPrices().size() - 1); + + int lookbackIndex = Math.max(0, s.getHistoricalPrices().size() - 1 - selectedTimeRange.getWeeks()); + BigDecimal pastPrice = s.getHistoricalPrices().get(lookbackIndex); + + if (pastPrice.compareTo(BigDecimal.ZERO) != 0) { + rangePercent = currentPrice.subtract(pastPrice) + .divide(pastPrice, 4, RoundingMode.HALF_UP) + .multiply(new BigDecimal(100)) + .floatValue(); + } + } + + String sign = rangePercent >= 0 ? "+" : ""; + String buttonText = String.format("%s (%s%.2f%%)", + s.getSymbol(), sign, rangePercent); + Button stockBtn = getViewElement().createStockButton(buttonText); + + if (rangePercent >= 0) { + stockBtn.setStyle("-fx-text-fill: green;"); + } else { + stockBtn.setStyle("-fx-text-fill: red;"); + } getViewElement().setOnStockAction(stockBtn, s, (Stock stock) -> { BigDecimal amountOfSharesOwned = player.getPortfolio() @@ -118,6 +144,7 @@ protected void initInteractions() { exchange.weekProperty().addListener((observable,o,n) -> { getViewElement().updateGraph(selectedTimeRange); + populateStockList(selectedFilter); }); getViewElement().getQuantityInputField().setTextFormatter(new TextFormatter<>(change -> { @@ -128,12 +155,14 @@ protected void initInteractions() { })); getViewElement().getSideBarSearchField().textProperty().addListener((observable, o, n) -> { - populateStockList(n); + selectedFilter = n; + populateStockList(selectedFilter); }); getViewElement().getTimeRangeSelector().setOnAction(e -> { selectedTimeRange = getViewElement().getTimeRangeSelector().getValue(); getViewElement().updateGraph(selectedTimeRange); + populateStockList(selectedFilter); }); } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardView.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardView.java index c86e504..f12c700 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardView.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardView.java @@ -63,6 +63,7 @@ protected void initLayout() { sidebar.setPrefWidth(150); sidebar.setMaxHeight(Double.MAX_VALUE); sidebar.setMinWidth(150); + sidebar.setAlignment(Pos.TOP_CENTER); VBox.setVgrow(sidebar, Priority.ALWAYS); ScrollPane scrollPane = new ScrollPane(sidebar); @@ -226,8 +227,8 @@ private ColumnConstraints makeCol(final float w) { @Override protected void initStyling() { - completeSideBar.getStyleClass().add("market-sidebar"); - sidebar.getStyleClass().add("market-sidebar2"); + completeSideBar.getStyleClass().add("complete-market-sidebar"); + sidebar.getStyleClass().add("market-sidebar"); selectedStockLabel.getStyleClass().add("selected-stock-pill"); selectedStockPriceLabel.getStyleClass().add("selected-stock-pill"); shareQuantityInputField.getStyleClass().add("qtyTextField"); diff --git a/src/main/resources/styles.css b/src/main/resources/styles.css index 4266a2e..b852181 100644 --- a/src/main/resources/styles.css +++ b/src/main/resources/styles.css @@ -235,24 +235,26 @@ /* --------------- IN GAME VIEW ------------- */ -.market-sidebar { +.complete-market-sidebar { -fx-border-color: #000000; -fx-border-width: 0 2 0 0; -fx-border-style: solid; - -fx-padding: 20; } -.market-sidebar2 { - -fx-padding: 20; +.market-sidebar { + -fx-padding: 10; } .stock-button { -fx-background-color: #e0e0e0; + -fx-alignment: CENTER_LEFT; + -fx-padding: 10 15 10 15; -fx-font-weight: bold; -fx-font-style: italic; -fx-text-fill: black; - -fx-font-size: 24; + -fx-font-size: 13; + } .stock-button:hover {