diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeController.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeController.java index 8ce104e..cd317d1 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeController.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeController.java @@ -52,6 +52,18 @@ public ExchangeController(ExchangeModel model) { List initialStocksLoad = session.getExchange().getStocks(); stocksSorted.addAll(initialStocksLoad); setStocksModel(initialStocksLoad); + + initController(); + } + + /** + * Method for initializing controller. + *

+ * Activates listener to searchbar query. + *

+ */ + public void initController() { + model.searchQueryProperty().addListener((obs) -> handleSearchQuery()); } /** @@ -100,16 +112,16 @@ public void applyNewspaperGlow(StockComponent component) { /** * Method to handle searchbar query. * - * @param query - Input from searchbar. */ - public void handleSearchQuery(String query) { - if (query == null || query.isBlank()) { + public void handleSearchQuery() { + if (model.searchQueryProperty().get() == null || model.searchQueryProperty().get().isBlank()) { setStocksModel(stocksSorted); // Get back to "no search" return; } List stocksFound = stocksSorted.stream() - .filter(stock -> stock.toString().toLowerCase().contains(query.toLowerCase())).toList(); + .filter(stock -> stock.toString().toLowerCase().contains(model.searchQueryProperty().get().toLowerCase())) + .toList(); setStocksModel(stocksFound); diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeModel.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeModel.java index 6a2e48f..f7bf431 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeModel.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeModel.java @@ -2,6 +2,7 @@ import edu.ntnu.idi.idatt.view.components.Model; import edu.ntnu.idi.idatt.view.components.elements.StockComponent; +import javafx.beans.property.SimpleStringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -11,6 +12,7 @@ public class ExchangeModel implements Model { private final ObservableList stockList = FXCollections.observableArrayList(); + private final SimpleStringProperty searchQueryProperty = new SimpleStringProperty(); /** * Getter for the stock list. @@ -21,4 +23,13 @@ public ObservableList getStockList() { return stockList; } + /** + * Getter for search query property. + * + * @return SimpleStringProperty; + */ + public SimpleStringProperty searchQueryProperty() { + return searchQueryProperty; + } + } diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeView.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeView.java index 9f779a4..8e961e8 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeView.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/exchange/ExchangeView.java @@ -3,13 +3,13 @@ import java.util.List; import java.util.function.Consumer; -import edu.ntnu.idi.idatt.session.UserSession; import edu.ntnu.idi.idatt.view.SceneFactory; import edu.ntnu.idi.idatt.view.SceneManager; import edu.ntnu.idi.idatt.view.components.AbstractViewUI; import edu.ntnu.idi.idatt.view.components.ui.UIFactory; import edu.ntnu.idi.idatt.view.primary.exchange.ExchangeController.SortAction; import javafx.beans.binding.Bindings; +import javafx.beans.property.SimpleStringProperty; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Parent; @@ -22,8 +22,8 @@ */ public class ExchangeView extends AbstractViewUI { - Consumer searchQueryHandler; - Consumer sortHandle; + private SimpleStringProperty searchQueryProperty; + private Consumer sortHandle; private VBox root; /** @@ -58,7 +58,7 @@ public Parent createContent() { @Override public Parent createNavigation() { return UIFactory.createNavigation( - UserSession.getInstance().getExchange().getName(), + "Exchange", List.of()); } @@ -69,8 +69,8 @@ public Parent createNavigation() { */ @Override public Parent createHeader() { - return UIFactory.createHeader("Search for stocks", - query -> searchQueryHandler.accept(query), + return UIFactory.createHeader("Search for stocks..", + queryProperty -> searchQueryProperty = queryProperty, List.of( "None", "New news", @@ -101,7 +101,7 @@ public Parent createToolbar() { @Override public Parent createMenu() { return UIFactory.createMenu("Account", - List.of(" • Portfolio", " • Transactions"), + List.of("Portfolio", "Transactions"), () -> SceneManager.switchTo(SceneFactory.createPortfolioView()), () -> SceneManager.switchTo(SceneFactory.createTransactionView())); @@ -117,6 +117,7 @@ public Parent createMenu() { */ public void setModel(ExchangeModel model) { Bindings.bindContent(root.getChildren(), model.getStockList()); + model.searchQueryProperty().bind(searchQueryProperty); } /** @@ -128,7 +129,6 @@ public void setModel(ExchangeModel model) { * @param controller - ExchangeController instance. */ public void setController(ExchangeController controller) { - searchQueryHandler = (query) -> controller.handleSearchQuery(query); sortHandle = (sortAction) -> controller.sortStocksBy(sortAction); } diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/newspaper/NewspaperView.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/newspaper/NewspaperView.java index 56c2144..b5ae773 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/primary/newspaper/NewspaperView.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/newspaper/NewspaperView.java @@ -101,7 +101,7 @@ public Parent createToolbar() { @Override public Parent createMenu() { return UIFactory.createMenu("Account", - List.of(" • Portfolio", " • Transactions"), + List.of("Portfolio", "Transactions"), () -> SceneManager.switchTo(SceneFactory.createPortfolioView()), () -> SceneManager.switchTo(SceneFactory.createTransactionView())); } diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioController.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioController.java index 4a56307..f72cc55 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioController.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioController.java @@ -79,12 +79,14 @@ public void setShareModel(List shareList) { /** * Method for initializing controller dependencies. + *

+ * Sets up initial model values and activates listener. *

*/ public void initController() { setupPlayerInfo(); - + model.searchQueryProperty().addListener((obs) -> handleSearchQuery()); } /** @@ -192,16 +194,42 @@ public void setupPlayerInfo() { * Sets share list model to found after name. *

* - * @param query - Input in searchbar. */ - public void handleSearchQuery(String query) { - if (query == null || query.isBlank()) { + public void handleSearchQuery() { + if (model.searchQueryProperty().get() == null || model.searchQueryProperty().get().isBlank()) { + setShareModel(sharesSorted); // Get back to "no search" + return; + } + + List sharesFound = sharesSorted.stream() + .filter(share -> share.getStock().toString().toLowerCase() + .contains(model.searchQueryProperty().get().toLowerCase())) + .toList(); + + setShareModel(sharesFound); + + } + + /** + * Overloaded method for handeling searchbar search. + * + *

+ * Sets share list model to found after name. + *

+ * + * @param initialSearch - initial search input. + * + */ + public void handleSearchQuery(String initialSearch) { + if (initialSearch == null || initialSearch.isBlank()) { setShareModel(sharesSorted); // Get back to "no search" return; } List sharesFound = sharesSorted.stream() - .filter(share -> share.getStock().toString().toLowerCase().contains(query.toLowerCase())).toList(); + .filter(share -> share.getStock().toString().toLowerCase() + .contains(initialSearch.toLowerCase())) + .toList(); setShareModel(sharesFound); diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioModel.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioModel.java index 27a13eb..1ea8088 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioModel.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioModel.java @@ -4,6 +4,7 @@ import edu.ntnu.idi.idatt.view.components.elements.ShareComponent; import edu.ntnu.idi.idatt.view.primary.portfolio.viewmodel.PlayerInfoModel; import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.property.SimpleStringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Node; @@ -15,6 +16,7 @@ public class PortfolioModel implements Model { private final ObservableList shareList = FXCollections.observableArrayList(); + private final SimpleStringProperty searchQueryProperty = new SimpleStringProperty(); private final PlayerInfoModel playerInfoModel = new PlayerInfoModel(); /** @@ -26,6 +28,15 @@ public ObservableList getShareList() { return shareList; } + /** + * Getter for search query property. + * + * @return SimpleStringProperty; + */ + public SimpleStringProperty searchQueryProperty() { + return searchQueryProperty; + } + /** * Getter for the playerInfoModel. * diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioView.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioView.java index e987722..132dc30 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioView.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/PortfolioView.java @@ -8,6 +8,7 @@ import edu.ntnu.idi.idatt.view.primary.portfolio.sections.PlayerInfoSection; import edu.ntnu.idi.idatt.view.primary.portfolio.viewmodel.PlayerInfoModel; import javafx.beans.binding.Bindings; +import javafx.beans.property.SimpleStringProperty; import javafx.geometry.Insets; import javafx.scene.Parent; import javafx.scene.control.ScrollPane; @@ -21,8 +22,8 @@ */ public class PortfolioView extends AbstractViewUI { - Consumer searchQueryHandler; - Consumer sortHandle; + private SimpleStringProperty searchQueryProperty; + private Consumer sortHandle; private VBox shareList; private PlayerInfoSection playerInfoSection; @@ -70,7 +71,7 @@ public Parent createNavigation() { @Override public Parent createHeader() { return UIFactory.createHeader("Search after holdings..", - query -> searchQueryHandler.accept(query), + queryProperty -> searchQueryProperty = queryProperty, List.of( "Oldest first", "Newest first", @@ -101,7 +102,7 @@ public Parent createToolbar() { @Override public Parent createMenu() { return UIFactory.createMenu("Account", - List.of(" • Portfolio", " • Transactions"), + List.of("Portfolio", "Transactions"), () -> { }, () -> SceneManager.switchTo(SceneFactory.createTransactionView())); @@ -117,6 +118,7 @@ public Parent createMenu() { */ public void setModel(PortfolioModel model) { Bindings.bindContent(shareList.getChildren(), model.getShareList()); + model.searchQueryProperty().bind(searchQueryProperty); setPlayerInfoSectionModel(model.playerInfoModel()); @@ -152,7 +154,6 @@ public void setPlayerInfoSectionModel(PlayerInfoModel model) { * @param controller - PortfolioController instance. */ public void setController(PortfolioController controller) { - searchQueryHandler = (query) -> controller.handleSearchQuery(query); sortHandle = (sortAction) -> controller.sortSharesBy(sortAction); playerInfoSection.finishButtonClicked(() -> controller.eventFinishGame()); } diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/sections/PlayerInfoSection.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/sections/PlayerInfoSection.java index 1331a6c..4a2347a 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/sections/PlayerInfoSection.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/primary/portfolio/sections/PlayerInfoSection.java @@ -40,6 +40,10 @@ public PlayerInfoSection() { List