diff --git a/src/main/java/edu/ntnu/idi/idatt/Launcher.java b/src/main/java/edu/ntnu/idi/idatt/Launcher.java index 9fc9145..18c49a6 100644 --- a/src/main/java/edu/ntnu/idi/idatt/Launcher.java +++ b/src/main/java/edu/ntnu/idi/idatt/Launcher.java @@ -1,9 +1,7 @@ package edu.ntnu.idi.idatt; +import edu.ntnu.idi.idatt.view.SceneFactory; import edu.ntnu.idi.idatt.view.SceneManager; -import edu.ntnu.idi.idatt.view.entry.StartController; -import edu.ntnu.idi.idatt.view.entry.StartModel; -import edu.ntnu.idi.idatt.view.entry.StartView; import javafx.application.Application; import javafx.stage.Stage; @@ -24,14 +22,7 @@ public void start(Stage stage) { stage.setHeight(700); stage.setTitle("Stock Game"); - StartModel model = new StartModel(); - StartView view = new StartView(); - StartController controller = new StartController(model); - - view.setModel(model); - view.setController(controller); - - SceneManager.init(stage, view.getInstance()); + SceneManager.init(stage, SceneFactory.createStartView()); stage.show(); } diff --git a/src/main/java/edu/ntnu/idi/idatt/common/Observer.java b/src/main/java/edu/ntnu/idi/idatt/common/Observer.java deleted file mode 100644 index ba340a4..0000000 --- a/src/main/java/edu/ntnu/idi/idatt/common/Observer.java +++ /dev/null @@ -1,6 +0,0 @@ -package edu.ntnu.idi.idatt.common; - -public interface Observer { - - void update(); -} diff --git a/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java b/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java new file mode 100644 index 0000000..c68f6b2 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/SceneFactory.java @@ -0,0 +1,23 @@ +package edu.ntnu.idi.idatt.view; + +import edu.ntnu.idi.idatt.view.entry.StartController; +import edu.ntnu.idi.idatt.view.entry.StartModel; +import edu.ntnu.idi.idatt.view.entry.StartView; +import javafx.scene.Parent; + +public class SceneFactory { + + public static Parent createStartView() { + + StartModel model = new StartModel(); + StartView view = new StartView(); + StartController controller = new StartController(model); + + view.setModel(model); + view.setController(controller); + + return view.getInstance(); + + } + +} diff --git a/src/main/java/edu/ntnu/idi/idatt/view/components/AbstractViewUI.java b/src/main/java/edu/ntnu/idi/idatt/view/components/AbstractViewUI.java index 1b7b889..1933e3b 100644 --- a/src/main/java/edu/ntnu/idi/idatt/view/components/AbstractViewUI.java +++ b/src/main/java/edu/ntnu/idi/idatt/view/components/AbstractViewUI.java @@ -15,6 +15,7 @@ public abstract class AbstractViewUI extends AbstractView { private VBox navigation; private HBox header; private HBox toolbar; + private VBox menu; private SimpleBooleanProperty isMenuVisible = new SimpleBooleanProperty(false); public AbstractViewUI() { @@ -35,8 +36,7 @@ public AbstractViewUI() { this.setInstance(new StackPane()); - Parent menu = createMenu(); - StackPane.setAlignment(menu, Pos.CENTER_RIGHT); + menu.getChildren().add(createMenu()); menu.setVisible(false); Region disableMenu = new Region(); @@ -59,16 +59,20 @@ public void createUIComponents() { navigation = new VBox(); navigation.setMaxHeight(Double.MAX_VALUE); navigation.getStyleClass().add("dark"); - navigation.setPrefWidth(150); + navigation.setMaxWidth(150); header = new HBox(); header.getStyleClass().add("light"); - header.setPrefHeight(80); + header.setMaxHeight(80); toolbar = new HBox(); toolbar.getStyleClass().add("light"); - HBox.setHgrow(toolbar, Priority.ALWAYS); - toolbar.setPrefHeight(80); + toolbar.setMaxHeight(80); + + menu = new VBox(); + StackPane.setAlignment(menu, Pos.CENTER_RIGHT); + menu.getStyleClass().add("dark"); + menu.setMaxWidth(300); } public abstract Parent createContent(); diff --git a/src/main/java/edu/ntnu/idi/idatt/view/components/ui/UIElementCompositor.java b/src/main/java/edu/ntnu/idi/idatt/view/components/ui/UIElementCompositor.java new file mode 100644 index 0000000..0fed8e6 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/components/ui/UIElementCompositor.java @@ -0,0 +1,85 @@ +package edu.ntnu.idi.idatt.view.components.ui; + +import java.util.ArrayList; +import java.util.List; + +import javafx.geometry.Pos; +import javafx.scene.Parent; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; + +public class UIElementCompositor { + + private final Pane parent; + private final List elements; + + public UIElementCompositor(Builder builder) { + this.parent = builder.parent; + this.elements = builder.elements; + } + + public Parent makeUI() { + parent.getChildren().addAll(elements); + return parent; + } + + public static class Builder { + private Pane parent; + private ArrayList elements = new ArrayList<>(); + + public Builder parent(Pane parent) { + this.parent = parent; + return this; + } + + public Builder growWithAlignment(Pos position) { + if (parent instanceof HBox) { + ((HBox) parent).setAlignment(position); + parent.setMaxWidth(Double.MAX_VALUE); + HBox.setHgrow(parent, Priority.ALWAYS); + } + if (parent instanceof VBox) { + ((VBox) parent).setAlignment(position); + parent.setMaxHeight(Double.MAX_VALUE); + VBox.setVgrow(parent, Priority.ALWAYS); + } + return this; + } + + public Builder setPrefSize(double width, double height) { + parent.setPrefSize(width, height); + return this; + } + + public Builder addContent(Parent parent) { + elements.add(parent); + return this; + } + + public Builder addAllContent(Parent... parents) { + elements.addAll(List.of(parents)); + return this; + } + + public Builder filler() { + Region filler = new Region(); + if (parent instanceof HBox) { + HBox.setHgrow(filler, Priority.ALWAYS); + } + if (parent instanceof VBox) { + VBox.setVgrow(filler, Priority.ALWAYS); + } + elements.add(filler); + return this; + } + + public UIElementCompositor build() { + return new UIElementCompositor(this); + } + + } + +} diff --git a/src/main/java/edu/ntnu/idi/idatt/view/components/ui/UIFactory.java b/src/main/java/edu/ntnu/idi/idatt/view/components/ui/UIFactory.java new file mode 100644 index 0000000..4b73c18 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt/view/components/ui/UIFactory.java @@ -0,0 +1,137 @@ +package edu.ntnu.idi.idatt.view.components.ui; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import edu.ntnu.idi.idatt.session.UserSession; +import edu.ntnu.idi.idatt.view.components.elements.IconComponent; +import edu.ntnu.idi.idatt.view.components.elements.SearchBarComponent; +import edu.ntnu.idi.idatt.view.components.primitives.ActionEventHandler; +import edu.ntnu.idi.idatt.view.util.CssUtils; +import edu.ntnu.idi.idatt.view.util.ResourceUtils; +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.layout.HBox; +import javafx.scene.layout.VBox; + +public class UIFactory { + + public static Parent createHeader(String placeholder, Consumer onSearchQuery) { + SearchBarComponent bar = new SearchBarComponent(placeholder); + + HBox.setMargin(bar, new Insets(20)); + + UIElementCompositor header = new UIElementCompositor.Builder() + .parent(new HBox()) + .growWithAlignment(Pos.CENTER) + .filler() + .addContent(bar) + .filler() + .build(); + + bar.onSearchQuery(() -> onSearchQuery.accept(bar.getQuery())); // Remake? + + return header.makeUI(); + } + + public static Parent createNavigation(String title, List buttonLables, ActionEventHandler... handlers) { + if (buttonLables.size() != handlers.length) { + System.out.println("Failed to build navigation!"); + } + + Label titleLabel = new Label(title); + CssUtils.apply(titleLabel, CssUtils.BIG_TEXT_32); + + ArrayList