From d51f27d91746c1d5c88469b5b5f0820cf2f8775a Mon Sep 17 00:00:00 2001 From: danieskj Date: Mon, 11 May 2026 11:28:27 +0200 Subject: [PATCH 1/8] feat: Created a portfolio screen and added a button to swithc to it # Conflicts: # src/main/java/edu/ntnu/idi/idatt/view/primary/MainView.java --- .../view/portfolio/PortfolioController.java | 10 ++++ .../idatt/view/portfolio/PortfolioModel.java | 18 ++++++ .../idatt/view/portfolio/PortfolioView.java | 58 +++++++++++++++++++ .../ntnu/idi/idatt/view/primary/MainView.java | 0 src/main/resources/themes/default.css | 6 +- 5 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioController.java create mode 100644 src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioModel.java create mode 100644 src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java create mode 100644 src/main/java/edu/ntnu/idi/idatt/view/primary/MainView.java diff --git a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioController.java b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioController.java new file mode 100644 index 0000000..02a064f --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioController.java @@ -0,0 +1,10 @@ +package edu.ntnu.idi.idatt.view.portfolio; + +import edu.ntnu.idi.idatt.view.SceneManager; +import edu.ntnu.idi.idatt.view.primary.MainView; + +public class PortfolioController { + public void initializePortfolio(){ + SceneManager.switchTo(new PortfolioView().getInstance()); + } +} \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioModel.java b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioModel.java new file mode 100644 index 0000000..0188588 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioModel.java @@ -0,0 +1,18 @@ +package edu.ntnu.idi.idatt.view.portfolio; + +import edu.ntnu.idi.idatt.view.components.Model; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; + +public class PortfolioModel implements Model { + private final StringProperty userName = new SimpleStringProperty(); + private final StringProperty netWorth = new SimpleStringProperty(); + + public StringProperty getUserName() { + return userName; + } + + public StringProperty getNetWorth() { + return netWorth; + } +} \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java new file mode 100644 index 0000000..b5209a3 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java @@ -0,0 +1,58 @@ +package edu.ntnu.idi.idatt.view.portfolio; + +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 javafx.geometry.Pos; +import javafx.scene.Parent; +import javafx.scene.control.ScrollPane; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; + +import java.util.List; + +public class PortfolioView extends AbstractViewUI { + @Override + public Parent createContent() { + StackPane root = new StackPane(); + root.getStyleClass().add("primary"); + VBox userBox = new VBox(); + userBox.getStyleClass().add("light"); + root.getChildren().add(userBox); + root.setAlignment(userBox, Pos.TOP_CENTER); + userBox.maxWidthProperty().bind(root.widthProperty().multiply(0.95)); + userBox.maxHeightProperty().bind(root.heightProperty().multiply(0.30)); + userBox.translateYProperty().bind(root.heightProperty().multiply(0.05)); + + return root; + } + + @Override + public Parent createNavigation() { + return UIFactory.createNavigation("Portfolio", + List.of(" • Ting"), + () -> System.out.println("Newspaper clicked")); + } + + @Override + public Parent createHeader() { + return UIFactory.createHeader("Search", + query -> System.out.println(query)); + } + + @Override + public Parent createToolbar() { + return UIFactory.createToolbar(() -> this.toggleMenu(), + () -> SceneManager.switchTo(SceneFactory.createStartView())); + } + + @Override + public Parent createMenu() { + return UIFactory.createMenu("Account", + List.of(" • Portfolio", " • Transactions"), + () -> new PortfolioController().initializePortfolio(), + () -> System.out.println("Transaction clicked!")); + } + +} diff --git a/src/main/java/edu/ntnu/idi/idatt/view/primary/MainView.java b/src/main/java/edu/ntnu/idi/idatt/view/primary/MainView.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/themes/default.css b/src/main/resources/themes/default.css index f8a8e30..97ad55a 100644 --- a/src/main/resources/themes/default.css +++ b/src/main/resources/themes/default.css @@ -72,11 +72,15 @@ -fx-cursor: hand; } +.portfolio-vbox { + -fx-background-color: #A9A9A9; +} + .searchbar { -fx-background-color: #FFFFFF; -fx-background-radius: 20; -fx-border-radius: 20; - -fx-effect: dropshadow(gaussian, rgba(0,0,0,0.3), 6, 0.3, 0, 2); + -fx-effect: dropshadow(gaus-fx-background-color: #1E5959;sian, rgba(0,0,0,0.3), 6, 0.3, 0, 2); } .searchbar-field { From 21977064f68fd74c698843d3e60818865acb2d5d Mon Sep 17 00:00:00 2001 From: danieskj Date: Mon, 11 May 2026 13:11:21 +0200 Subject: [PATCH 2/8] feat: Added a userbox and a scrollpane for stocks --- .../idatt/view/portfolio/PortfolioView.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java index b5209a3..9e49464 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java @@ -7,6 +7,8 @@ import javafx.geometry.Pos; import javafx.scene.Parent; import javafx.scene.control.ScrollPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; @@ -17,7 +19,7 @@ public class PortfolioView extends AbstractViewUI { public Parent createContent() { StackPane root = new StackPane(); root.getStyleClass().add("primary"); - VBox userBox = new VBox(); + HBox userBox = new HBox(); userBox.getStyleClass().add("light"); root.getChildren().add(userBox); root.setAlignment(userBox, Pos.TOP_CENTER); @@ -25,6 +27,24 @@ public Parent createContent() { userBox.maxHeightProperty().bind(root.heightProperty().multiply(0.30)); userBox.translateYProperty().bind(root.heightProperty().multiply(0.05)); + HBox aksje1 = new HBox(); + HBox aksje2 = new HBox(); + HBox scrollWrapper = new HBox(); + aksje1.getStyleClass().add("light"); + aksje1.setPrefSize(400,400); + aksje2.getStyleClass().add("dark"); + HBox.setHgrow(aksje1, Priority.ALWAYS); + HBox.setHgrow(aksje2, Priority.ALWAYS); + scrollWrapper.getChildren().addAll(aksje1, aksje2); + + ScrollPane stockBox = new ScrollPane(); + stockBox.setContent(scrollWrapper); + stockBox.getStyleClass().add("primary"); + root.getChildren().add(stockBox); + root.setAlignment(stockBox, Pos.CENTER); + stockBox.maxWidthProperty().bind(root.widthProperty().multiply(0.95)); + stockBox.maxHeightProperty().bind(root.heightProperty().multiply(0.58)); + stockBox.translateYProperty().bind(root.heightProperty().multiply(0.20)); return root; } From a5aa1a43fcf77dce70e852e87a108695241e6f55 Mon Sep 17 00:00:00 2001 From: danieskj Date: Mon, 11 May 2026 16:03:05 +0200 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20Added=20for=20lopp=20for=20showing?= =?UTF-8?q?=20stocks=20owned=20p=C3=A5=20the=20player?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../idatt/view/portfolio/PortfolioView.java | 50 ++++++++++++------- src/main/resources/themes/default.css | 18 +++++++ 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java index 9e49464..78cf198 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java @@ -4,8 +4,10 @@ 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 javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Parent; +import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; @@ -27,26 +29,36 @@ public Parent createContent() { userBox.maxHeightProperty().bind(root.heightProperty().multiply(0.30)); userBox.translateYProperty().bind(root.heightProperty().multiply(0.05)); - HBox aksje1 = new HBox(); - HBox aksje2 = new HBox(); - HBox scrollWrapper = new HBox(); - aksje1.getStyleClass().add("light"); - aksje1.setPrefSize(400,400); - aksje2.getStyleClass().add("dark"); - HBox.setHgrow(aksje1, Priority.ALWAYS); - HBox.setHgrow(aksje2, Priority.ALWAYS); - scrollWrapper.getChildren().addAll(aksje1, aksje2); + VBox scrollWrapper = new VBox(); + scrollWrapper.setPadding(new Insets(15)); + scrollWrapper.setSpacing(12); - ScrollPane stockBox = new ScrollPane(); - stockBox.setContent(scrollWrapper); - stockBox.getStyleClass().add("primary"); - root.getChildren().add(stockBox); - root.setAlignment(stockBox, Pos.CENTER); - stockBox.maxWidthProperty().bind(root.widthProperty().multiply(0.95)); - stockBox.maxHeightProperty().bind(root.heightProperty().multiply(0.58)); - stockBox.translateYProperty().bind(root.heightProperty().multiply(0.20)); - return root; - } + for (int i = 1; i <= 10; i++) { + Label leftTextBox = new Label("Morna\nJada"); + leftTextBox.getStyleClass().add("portfolio-stock-names"); + HBox rowBox = new HBox(); + rowBox.prefHeightProperty().bind(userBox.heightProperty().multiply(0.5)); + rowBox.maxWidthProperty().bind(root.widthProperty().multiply(1)); + rowBox.getStyleClass().add("rowBox"); + rowBox.getChildren().add(leftTextBox); + rowBox.setHgrow(leftTextBox, Priority.ALWAYS); + leftTextBox.setMaxWidth(Double.MAX_VALUE); + leftTextBox.setAlignment(Pos.BASELINE_LEFT); + scrollWrapper.getChildren().add(rowBox); + } + + ScrollPane stockBox = new ScrollPane(); + stockBox.setContent(scrollWrapper); + stockBox.setFitToWidth(true); + root.getChildren().add(stockBox); + root.setAlignment(stockBox, Pos.CENTER); + stockBox.maxWidthProperty().bind(root.widthProperty().multiply(0.95)); + stockBox.maxHeightProperty().bind(root.heightProperty().multiply(0.58)); + stockBox.translateYProperty().bind(root.heightProperty().multiply(0.20)); + stockBox.getStyleClass().add("noe"); + stockBox.getStyleClass().add("primary"); + return root; + } @Override public Parent createNavigation() { diff --git a/src/main/resources/themes/default.css b/src/main/resources/themes/default.css index 97ad55a..ba80a10 100644 --- a/src/main/resources/themes/default.css +++ b/src/main/resources/themes/default.css @@ -76,6 +76,24 @@ -fx-background-color: #A9A9A9; } +.noe > .viewport { + -fx-background-color: #3B8C6E; +} + +.rowBox { + -fx-background-color: #A9A9A9; + -fx-alignment: center; + -fx-padding: 0 15 0 15; +} + +.portfolio-stock-names { + -fx-font-size: 20px; + -fx-font-weight: 700; + -fx-text-fill: #EEEEEE; + -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.3), 10, 0.5, 0, 5); + -fx-padding: 5; +} + .searchbar { -fx-background-color: #FFFFFF; -fx-background-radius: 20; From cab4be15554a679a64b2458e2f7ab14a138b09b9 Mon Sep 17 00:00:00 2001 From: danieskj Date: Tue, 12 May 2026 09:44:19 +0200 Subject: [PATCH 4/8] fix: Changed the maven.yml file to deploy github pages on only push --- .github/workflows/maven.yml | 1 + src/main/resources/themes/default.css | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 8b3c6d3..c17e057 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -23,6 +23,7 @@ jobs: run: mvn clean verify site - name: Deploy to Github Pages + if: github.event_name == 'push' uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/src/main/resources/themes/default.css b/src/main/resources/themes/default.css index ba80a10..1edb589 100644 --- a/src/main/resources/themes/default.css +++ b/src/main/resources/themes/default.css @@ -98,7 +98,7 @@ -fx-background-color: #FFFFFF; -fx-background-radius: 20; -fx-border-radius: 20; - -fx-effect: dropshadow(gaus-fx-background-color: #1E5959;sian, rgba(0,0,0,0.3), 6, 0.3, 0, 2); + -fx-effect: dropshadow(gaussian, rgba(0,0,0,0.3), 6, 0.3, 0, 2); } .searchbar-field { From 514410caf62255f8492e8acd5715ef4118033c3b Mon Sep 17 00:00:00 2001 From: danieskj Date: Tue, 12 May 2026 22:02:25 +0200 Subject: [PATCH 5/8] feat: Create ShareComponent for use in Portfolio UI # Conflicts: # src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java # Conflicts: # src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java --- .../edu/ntnu/idi/idatt/view/SceneFactory.java | 6 +- .../components/elements/ShareComponent.java | 31 +++++++++ .../view/portfolio/PortfolioController.java | 22 ++++-- .../idatt/view/portfolio/PortfolioModel.java | 16 ++--- .../idatt/view/portfolio/PortfolioView.java | 68 ++++++++++++++----- src/main/resources/themes/default.css | 16 ++++- 6 files changed, 123 insertions(+), 36 deletions(-) create mode 100644 src/main/java/edu/ntnu/idi/idatt/view/components/elements/ShareComponent.java diff --git a/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java b/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java index 8ffb7d8..d980694 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java @@ -1,8 +1,5 @@ package edu.ntnu.idi.idatt.view; -import java.util.ArrayDeque; -import java.util.Deque; - import edu.ntnu.idi.idatt.model.market.Stock; import edu.ntnu.idi.idatt.session.UserSession; import edu.ntnu.idi.idatt.view.entry.StartController; @@ -19,6 +16,9 @@ import edu.ntnu.idi.idatt.view.primary.transactions.TransactionView; import javafx.scene.Parent; +import java.util.ArrayDeque; +import java.util.Deque; + public class SceneFactory { @FunctionalInterface diff --git a/src/main/java/edu/ntnu/idi/idatt/view/components/elements/ShareComponent.java b/src/main/java/edu/ntnu/idi/idatt/view/components/elements/ShareComponent.java new file mode 100644 index 0000000..713f157 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/components/elements/ShareComponent.java @@ -0,0 +1,31 @@ +package edu.ntnu.idi.idatt.view.components.elements; + +import edu.ntnu.idi.idatt.model.portfolio.Share; +import edu.ntnu.idi.idatt.view.components.ui.UIElementCompositor; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.layout.HBox; + + +public class ShareComponent extends HBox { + + public ShareComponent(Share share){ + this.setMaxSize(Double.MAX_VALUE, 100); + this.setPadding(new Insets(50)); + this.setAlignment(Pos.CENTER); + this.getStyleClass().add("rowBox"); + Label name = new Label(share.getStock().getCompany()); + Label quantity = new Label(share.getQuantity().toString()); + UIElementCompositor shareComponent = new UIElementCompositor.Builder() + .parent(new HBox()) + .growWithAlignment(Pos.CENTER) + .addContent(name) + .filler() + .addContent(quantity) + .build(); + + this.getChildren().add(shareComponent.makeUI()); + } + +} diff --git a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioController.java b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioController.java index 02a064f..05464f6 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioController.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioController.java @@ -1,10 +1,22 @@ package edu.ntnu.idi.idatt.view.portfolio; -import edu.ntnu.idi.idatt.view.SceneManager; -import edu.ntnu.idi.idatt.view.primary.MainView; +import edu.ntnu.idi.idatt.model.portfolio.Share; +import edu.ntnu.idi.idatt.session.UserSession; +import edu.ntnu.idi.idatt.view.components.AbstractController; +import edu.ntnu.idi.idatt.view.components.elements.ShareComponent; -public class PortfolioController { - public void initializePortfolio(){ - SceneManager.switchTo(new PortfolioView().getInstance()); +import java.util.ArrayList; + +public class PortfolioController extends AbstractController { + private final ArrayList loadedShareComponents = new ArrayList<>(); + private UserSession session = UserSession.getInstance(); + + public PortfolioController(PortfolioModel model){ + super(model); + for(Share share: session.getPlayer().getPortfolio().getShares()){ + ShareComponent shareComponent = new ShareComponent(share); + loadedShareComponents.add(shareComponent); + } + model.getSharesList().setAll(loadedShareComponents); } } \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioModel.java b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioModel.java index 0188588..beeaa40 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioModel.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioModel.java @@ -1,18 +1,14 @@ package edu.ntnu.idi.idatt.view.portfolio; import edu.ntnu.idi.idatt.view.components.Model; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; +import edu.ntnu.idi.idatt.view.components.elements.ShareComponent; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; public class PortfolioModel implements Model { - private final StringProperty userName = new SimpleStringProperty(); - private final StringProperty netWorth = new SimpleStringProperty(); + private final ObservableList sharesList = FXCollections.observableArrayList(); - public StringProperty getUserName() { - return userName; - } - - public StringProperty getNetWorth() { - return netWorth; + public ObservableList getSharesList(){ + return sharesList; } } \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java index 78cf198..ad85b70 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java @@ -4,25 +4,43 @@ 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 javafx.beans.binding.Bindings; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Parent; +import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Priority; -import javafx.scene.layout.StackPane; -import javafx.scene.layout.VBox; +import javafx.scene.layout.*; +import javafx.scene.text.TextAlignment; import java.util.List; public class PortfolioView extends AbstractViewUI { + private VBox shareBox; + @Override public Parent createContent() { StackPane root = new StackPane(); + VBox userBox = new VBox(); + Label userTitle = new Label("Navnet's Portfolio"); + Label netWorth = new Label("Du er blakk"); + Label percentageChange = new Label("Noe er ikke riktig"); + Label playerStatus = new Label("Bankrupt"); + Label portfolioWorth = new Label("1234566 usd"); + root.getStyleClass().add("primary"); - HBox userBox = new HBox(); userBox.getStyleClass().add("light"); + userTitle.getStyleClass().add("user-box-title"); + netWorth.getStyleClass().add("user-box-text"); + percentageChange.getStyleClass().add("user-box-text"); + playerStatus.getStyleClass().add("user-box-text"); + portfolioWorth.getStyleClass().add("user-box-text"); + + userBox.getChildren().addAll(userTitle, netWorth, percentageChange, playerStatus); + userBox.getChildren().addAll(portfolioWorth); + portfolioWorth.setTextAlignment(TextAlignment.CENTER); + VBox.setVgrow(userBox, Priority.ALWAYS); root.getChildren().add(userBox); root.setAlignment(userBox, Pos.TOP_CENTER); userBox.maxWidthProperty().bind(root.widthProperty().multiply(0.95)); @@ -33,30 +51,41 @@ public Parent createContent() { scrollWrapper.setPadding(new Insets(15)); scrollWrapper.setSpacing(12); - for (int i = 1; i <= 10; i++) { - Label leftTextBox = new Label("Morna\nJada"); - leftTextBox.getStyleClass().add("portfolio-stock-names"); + /*for (int i = 1; i <= 10; i++) { + Label leftBox = new Label("Morna\nJada"); + Label centerBox = new Label("Jada\nMorna"); + Button sellButton = new Button("Sell"); + BorderPane textBoxes = new BorderPane(); HBox rowBox = new HBox(); + + leftBox.getStyleClass().add("portfolio-stock-names"); + centerBox.getStyleClass().add("portfolio-stock-names"); + sellButton.getStyleClass().add("button"); + rowBox.getStyleClass().add("rowBox"); rowBox.prefHeightProperty().bind(userBox.heightProperty().multiply(0.5)); rowBox.maxWidthProperty().bind(root.widthProperty().multiply(1)); - rowBox.getStyleClass().add("rowBox"); - rowBox.getChildren().add(leftTextBox); - rowBox.setHgrow(leftTextBox, Priority.ALWAYS); - leftTextBox.setMaxWidth(Double.MAX_VALUE); - leftTextBox.setAlignment(Pos.BASELINE_LEFT); + + textBoxes.setRight(sellButton); + textBoxes.setCenter(centerBox); + textBoxes.setLeft(leftBox); + rowBox.getChildren().add(textBoxes); scrollWrapper.getChildren().add(rowBox); - } + BorderPane.setAlignment(sellButton, Pos.CENTER_RIGHT); + BorderPane.setAlignment(leftBox, Pos.CENTER_LEFT); + rowBox.setHgrow(textBoxes, Priority.ALWAYS); + }*/ ScrollPane stockBox = new ScrollPane(); - stockBox.setContent(scrollWrapper); stockBox.setFitToWidth(true); root.getChildren().add(stockBox); root.setAlignment(stockBox, Pos.CENTER); stockBox.maxWidthProperty().bind(root.widthProperty().multiply(0.95)); stockBox.maxHeightProperty().bind(root.heightProperty().multiply(0.58)); stockBox.translateYProperty().bind(root.heightProperty().multiply(0.20)); - stockBox.getStyleClass().add("noe"); + stockBox.getStyleClass().add("viewport-colour"); stockBox.getStyleClass().add("primary"); + shareBox = new VBox(); + stockBox.setContent(shareBox); return root; } @@ -83,8 +112,13 @@ public Parent createToolbar() { public Parent createMenu() { return UIFactory.createMenu("Account", List.of(" • Portfolio", " • Transactions"), - () -> new PortfolioController().initializePortfolio(), + () -> System.out.println("Portfolio"), () -> System.out.println("Transaction clicked!")); } + public void setModel(PortfolioModel model){ + Bindings.bindContent(shareBox.getChildren(), model.getSharesList()); + } + public void setController(PortfolioController controller){ + } } diff --git a/src/main/resources/themes/default.css b/src/main/resources/themes/default.css index 1edb589..c3af275 100644 --- a/src/main/resources/themes/default.css +++ b/src/main/resources/themes/default.css @@ -76,7 +76,7 @@ -fx-background-color: #A9A9A9; } -.noe > .viewport { +.viewport-colour > .viewport { -fx-background-color: #3B8C6E; } @@ -109,4 +109,18 @@ -fx-border-radius: 20; -fx-cursor: hand; } +.user-box-text{ + -fx-font-size: 16px; + -fx-font-weight: 700; + -fx-text-fill: #EEEEEE; + -fx-padding: 0 0 5 30; + -fx-effect: dropshadow(gaussian, rgba(0,0,0,0.3), 10, 0.5, 0, 5); +} +.user-box-title{ + -fx-font-size: 32px; + -fx-font-weight: 700; + -fx-text-fill: #EEEEEE; + -fx-padding: 10 0 0 30; + -fx-effect: dropshadow(gaussian, rgba(0,0,0,0.3), 10, 0.5, 0, 5); +} From 640bfc5c4451bf9314496041cde1b7b51fabd23d Mon Sep 17 00:00:00 2001 From: danieskj Date: Wed, 13 May 2026 20:34:04 +0200 Subject: [PATCH 6/8] feat: Create labels for ShareComponent --- .../edu/ntnu/idi/idatt/view/SceneFactory.java | 18 +++++++ .../components/elements/ShareComponent.java | 24 ++++++--- .../idatt/view/portfolio/PortfolioView.java | 54 ++++++------------- .../view/primary/exchange/ExchangeView.java | 2 + src/main/resources/themes/default.css | 1 - 5 files changed, 51 insertions(+), 48 deletions(-) diff --git a/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java b/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java index d980694..9a513f3 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java @@ -66,6 +66,24 @@ public static Parent createStartView() { return view.getInstance(); } + public static Parent createPortfolioView(){ + Stock stock = new Stock("int", "intel", List.of(new BigDecimal("100"))); + Share share = new Share(stock, new BigDecimal("50"), new BigDecimal("100")); + UserSession.getInstance().getPlayer().getPortfolio().addShare(share); + UserSession.getInstance().getPlayer().getPortfolio().addShare(share); + UserSession.getInstance().getPlayer().getPortfolio().addShare(share); + UserSession.getInstance().getPlayer().getPortfolio().addShare(share); + UserSession.getInstance().getPlayer().getPortfolio().addShare(share); + UserSession.getInstance().getPlayer().getPortfolio().addShare(share); + PortfolioModel model = new PortfolioModel(); + PortfolioView view = new PortfolioView(); + PortfolioController controller = new PortfolioController(model); + + view.setModel(model); + view.setController(controller); + + return view.getInstance(); + } public static Parent createExchangeView() { diff --git a/src/main/java/edu/ntnu/idi/idatt/view/components/elements/ShareComponent.java b/src/main/java/edu/ntnu/idi/idatt/view/components/elements/ShareComponent.java index 713f157..fabd2d6 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/components/elements/ShareComponent.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/components/elements/ShareComponent.java @@ -1,9 +1,10 @@ package edu.ntnu.idi.idatt.view.components.elements; import edu.ntnu.idi.idatt.model.portfolio.Share; -import edu.ntnu.idi.idatt.view.components.ui.UIElementCompositor; +import edu.ntnu.idi.idatt.view.components.ui.UICompositor; import javafx.geometry.Insets; import javafx.geometry.Pos; +import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.HBox; @@ -11,18 +12,25 @@ public class ShareComponent extends HBox { public ShareComponent(Share share){ - this.setMaxSize(Double.MAX_VALUE, 100); - this.setPadding(new Insets(50)); - this.setAlignment(Pos.CENTER); + this.setMaxSize(Double.MAX_VALUE, 300); + this.setPadding(new Insets(30)); this.getStyleClass().add("rowBox"); Label name = new Label(share.getStock().getCompany()); - Label quantity = new Label(share.getQuantity().toString()); - UIElementCompositor shareComponent = new UIElementCompositor.Builder() + Label quantity = new Label("Owned shares: "+share.getQuantity().toString()); + Label ticker = new Label("("+share.getStock().getSymbol()+")"); + Label latestPrice = new Label("Latest price: "+share.getStock().getSalesPrice().toString()); + Button sellButton = new Button("Sell"); + ticker.getStyleClass().add("portfolio-stock-names"); + name.getStyleClass().add("portfolio-stock-names"); + quantity.getStyleClass().add("portfolio-stock-names"); + latestPrice.getStyleClass().add("portfolio-stock-names"); + sellButton.getStyleClass().add("button"); + UICompositor shareComponent = new UICompositor.Builder() .parent(new HBox()) .growWithAlignment(Pos.CENTER) - .addContent(name) + .addAllContent(name, ticker, latestPrice) .filler() - .addContent(quantity) + .addAllContent(quantity, sellButton) .build(); this.getChildren().add(shareComponent.makeUI()); diff --git a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java index ad85b70..5867e99 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/portfolio/PortfolioView.java @@ -8,7 +8,6 @@ import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Parent; -import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.layout.*; @@ -51,48 +50,24 @@ public Parent createContent() { scrollWrapper.setPadding(new Insets(15)); scrollWrapper.setSpacing(12); - /*for (int i = 1; i <= 10; i++) { - Label leftBox = new Label("Morna\nJada"); - Label centerBox = new Label("Jada\nMorna"); - Button sellButton = new Button("Sell"); - BorderPane textBoxes = new BorderPane(); - HBox rowBox = new HBox(); - - leftBox.getStyleClass().add("portfolio-stock-names"); - centerBox.getStyleClass().add("portfolio-stock-names"); - sellButton.getStyleClass().add("button"); - rowBox.getStyleClass().add("rowBox"); - rowBox.prefHeightProperty().bind(userBox.heightProperty().multiply(0.5)); - rowBox.maxWidthProperty().bind(root.widthProperty().multiply(1)); - - textBoxes.setRight(sellButton); - textBoxes.setCenter(centerBox); - textBoxes.setLeft(leftBox); - rowBox.getChildren().add(textBoxes); - scrollWrapper.getChildren().add(rowBox); - BorderPane.setAlignment(sellButton, Pos.CENTER_RIGHT); - BorderPane.setAlignment(leftBox, Pos.CENTER_LEFT); - rowBox.setHgrow(textBoxes, Priority.ALWAYS); - }*/ - - ScrollPane stockBox = new ScrollPane(); - stockBox.setFitToWidth(true); - root.getChildren().add(stockBox); - root.setAlignment(stockBox, Pos.CENTER); - stockBox.maxWidthProperty().bind(root.widthProperty().multiply(0.95)); - stockBox.maxHeightProperty().bind(root.heightProperty().multiply(0.58)); - stockBox.translateYProperty().bind(root.heightProperty().multiply(0.20)); - stockBox.getStyleClass().add("viewport-colour"); - stockBox.getStyleClass().add("primary"); - shareBox = new VBox(); - stockBox.setContent(shareBox); - return root; + ScrollPane stockBox = new ScrollPane(); + stockBox.setFitToWidth(true); + root.getChildren().add(stockBox); + root.setAlignment(stockBox, Pos.CENTER); + stockBox.maxWidthProperty().bind(root.widthProperty().multiply(0.95)); + stockBox.maxHeightProperty().bind(root.heightProperty().multiply(0.58)); + stockBox.translateYProperty().bind(root.heightProperty().multiply(0.20)); + stockBox.getStyleClass().add("viewport-colour"); + stockBox.getStyleClass().add("primary"); + shareBox = new VBox(20); + stockBox.setContent(shareBox); + return root; } @Override public Parent createNavigation() { return UIFactory.createNavigation("Portfolio", - List.of(" • Ting"), + List.of(" • Title"), () -> System.out.println("Newspaper clicked")); } @@ -112,12 +87,13 @@ public Parent createToolbar() { public Parent createMenu() { return UIFactory.createMenu("Account", List.of(" • Portfolio", " • Transactions"), - () -> System.out.println("Portfolio"), + () -> SceneManager.switchTo(SceneFactory.createPortfolioView()), () -> System.out.println("Transaction clicked!")); } public void setModel(PortfolioModel model){ Bindings.bindContent(shareBox.getChildren(), model.getSharesList()); } + public void setController(PortfolioController controller){ } 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 367f39c..e5dbbe8 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 @@ -72,6 +72,8 @@ public Parent createToolbar() { public Parent createMenu() { return UIFactory.createMenu("Account", List.of(" • Portfolio", " • Transactions"), + () -> SceneManager.switchTo(SceneFactory.createPortfolioView()), + () -> System.out.println("Transaction clicked!")); () -> System.out.println("Portfolio clicked!"), () -> SceneManager.switchTo(SceneFactory.createTransactionView())); diff --git a/src/main/resources/themes/default.css b/src/main/resources/themes/default.css index c3af275..b74a276 100644 --- a/src/main/resources/themes/default.css +++ b/src/main/resources/themes/default.css @@ -83,7 +83,6 @@ .rowBox { -fx-background-color: #A9A9A9; -fx-alignment: center; - -fx-padding: 0 15 0 15; } .portfolio-stock-names { From 946a0ce30d93272091e273bd5c6bad9fa706de92 Mon Sep 17 00:00:00 2001 From: danieskj Date: Thu, 14 May 2026 10:54:07 +0200 Subject: [PATCH 7/8] feat: Create PlayerPortfolioComponent for use in Portfolio view --- .../elements/PlayerPortfolioComponent.java | 43 +++++++++++++++++++ .../components/elements/ShareComponent.java | 8 +++- .../idatt/view/portfolio/PortfolioModel.java | 5 +++ .../idatt/view/portfolio/PortfolioView.java | 42 +++++------------- .../view/primary/exchange/ExchangeView.java | 2 - src/main/resources/themes/default.css | 4 +- 6 files changed, 67 insertions(+), 37 deletions(-) create mode 100644 src/main/java/edu/ntnu/idi/idatt/view/components/elements/PlayerPortfolioComponent.java diff --git a/src/main/java/edu/ntnu/idi/idatt/view/components/elements/PlayerPortfolioComponent.java b/src/main/java/edu/ntnu/idi/idatt/view/components/elements/PlayerPortfolioComponent.java new file mode 100644 index 0000000..0881593 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/components/elements/PlayerPortfolioComponent.java @@ -0,0 +1,43 @@ +package edu.ntnu.idi.idatt.view.components.elements; + +import edu.ntnu.idi.idatt.model.portfolio.Portfolio; +import edu.ntnu.idi.idatt.view.components.ui.UICompositor; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; + +import java.util.ArrayList; +import java.util.Collections; + +public class PlayerPortfolioComponent extends HBox { + + public PlayerPortfolioComponent(Portfolio portfolio){ + this.setMaxSize(Double.MAX_VALUE, 500); + this.getStyleClass().add("light"); + Label userTitle = new Label("Name Title"); + Label netWorth = new Label("Total net worth: "+portfolio.getNetWorth().toString()); + Label percentageChange = new Label("Percentage change: "); + Label playerStatus = new Label("Novice"); + Label portfolioWorth = new Label("Portfolio net worth: "); + Label totalShares = new Label("Total shares owned: "); + + ArrayList