From b3fbbeaefa01321efb926c3884bab367b244f152 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 15 May 2026 13:34:48 +0200 Subject: [PATCH] Feat: Graph change time range Added a time range enum that controls how the graphs' x value range. --- .../dashboard/DashBoardController.java | 13 +++++++--- .../widgets/dashboard/DashBoardTimeRange.java | 24 +++++++++++++++++++ .../view/widgets/dashboard/DashBoardView.java | 20 +++++++++++----- 3 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardTimeRange.java 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 b1d376b..47d1ff4 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 @@ -18,6 +18,7 @@ public class DashBoardController extends ViewController { private Player player; private Exchange exchange; private List stockList; + private DashBoardTimeRange selectedTimeRange; /** * {@inheritDoc} @@ -31,12 +32,13 @@ public DashBoardController(final DashBoardView viewElement, this.player = player; this.stockList = stockList; this.exchange = exchange; + this.selectedTimeRange = DashBoardTimeRange.DEFAULT; super(viewElement, eventManager); } private void handleStockSelection(final Stock stock, final float amountOwned) { getViewElement().setCurrentStock(stock, amountOwned); - getViewElement().updateGraph(); + getViewElement().updateGraph(selectedTimeRange); } private void populateStockList(String filter) { @@ -63,7 +65,7 @@ private void populateStockList(String filter) { protected void initInteractions() { populateStockList(""); getViewElement().setCurrentStock(stockList.getFirst(), 0); - getViewElement().updateGraph(); + getViewElement().updateGraph(selectedTimeRange); getViewElement().setOnAction(DashBoardActions.BUY_SHARES, () -> { if (Validator.NOT_EMPTY.isValid(getViewElement().getQuantityInputField().getText())) { BigDecimal amountToBuy = new BigDecimal(getViewElement().getQuantityInputField().getText()); @@ -115,7 +117,7 @@ protected void initInteractions() { }); exchange.weekProperty().addListener((observable,o,n) -> { - getViewElement().updateGraph(); + getViewElement().updateGraph(selectedTimeRange); }); getViewElement().getQuantityInputField().setTextFormatter(new TextFormatter<>(change -> { @@ -128,5 +130,10 @@ protected void initInteractions() { getViewElement().getSideBarSearchField().textProperty().addListener((observable, o, n) -> { populateStockList(n); }); + + getViewElement().getTimeRangeSelector().setOnAction(e -> { + selectedTimeRange = getViewElement().getTimeRangeSelector().getValue(); + getViewElement().updateGraph(selectedTimeRange); + }); } } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardTimeRange.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardTimeRange.java new file mode 100644 index 0000000..672211a --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardTimeRange.java @@ -0,0 +1,24 @@ +package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.dashboard; + +public enum DashBoardTimeRange { + ONE_WEEK("1 Week", 1), + DEFAULT("22 Weeks (Default)", 22), + ONE_MONTH("1 Month", 4), + ONE_YEAR("1 Year", 52); + + private final String label; + private final int weeks; + + DashBoardTimeRange(final String label, final int weeks) { + this.label = label; this.weeks = weeks; + } + + public int getWeeks() { + return weeks; + } + + @Override + public String toString() { + return label; + } +} 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 9699f5a..a10f987 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 @@ -25,6 +25,7 @@ public class DashBoardView extends ViewElement { private VBox sidebar; private VBox completeSideBar; private Stock selectedStock; + private ComboBox timeRangeSelector; private float ownedStocks = 0; private TextField sideBarSearchField; private Label selectedStockLabel; @@ -53,8 +54,9 @@ protected void initLayout() { completeSideBar = new VBox(10); sideBarSearchField = new TextField(); sideBarSearchField.setPromptText("Search..."); - List timeSelectionOptions; - ComboBox> timeDropDownMenu = new ComboBox<>(); + timeRangeSelector = new ComboBox<>(); + timeRangeSelector.getItems().addAll(DashBoardTimeRange.values()); + timeRangeSelector.setValue(DashBoardTimeRange.DEFAULT); sidebar = new VBox(10); sidebar.setPrefWidth(150); @@ -65,7 +67,7 @@ protected void initLayout() { ScrollPane scrollPane = new ScrollPane(sidebar); Separator separator = new Separator(); - completeSideBar.getChildren().addAll(sideBarSearchField, separator, scrollPane, timeDropDownMenu); + completeSideBar.getChildren().addAll(sideBarSearchField, separator, scrollPane, timeRangeSelector); scrollPane.setFitToWidth(true); scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED); @@ -259,14 +261,16 @@ public void clearStockList() { sidebar.getChildren().clear(); } - public void updateGraph() { + public void updateGraph(final DashBoardTimeRange timeRange) { dataSeries.getData().clear(); List prices = selectedStock.getHistoricalPrices(); + updateStockPrice(prices.getLast().floatValue(), selectedStock.getLatestPriceChange().floatValue()); setHighPriceLabel(selectedStock.getHighestPrice().floatValue()); setLowPriceLabel(selectedStock.getLowestPrice().floatValue()); - xAxis.setLowerBound(Math.max(1, prices.size() - 22)); - xAxis.setUpperBound(Math.max(22, prices.size())); + + xAxis.setLowerBound(Math.max(1, prices.size() - timeRange.getWeeks())); + xAxis.setUpperBound(xAxis.getLowerBound() + timeRange.getWeeks()); double min = prices.stream() .min(BigDecimal::compareTo) @@ -330,4 +334,8 @@ public void setOnStockAction(final Button button, public TextField getQuantityInputField() { return shareQuantityInputField; } + + public ComboBox getTimeRangeSelector() { + return timeRangeSelector; + } }