diff --git a/src/main/java/edu/group5/app/App.java b/src/main/java/edu/group5/app/App.java index b02e9bc..6704bd2 100644 --- a/src/main/java/edu/group5/app/App.java +++ b/src/main/java/edu/group5/app/App.java @@ -1,7 +1,6 @@ package edu.group5.app; import edu.group5.app.control.MainController; -import edu.group5.app.view.MainView; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.image.Image; @@ -13,12 +12,10 @@ public class App extends Application { @Override public void start(Stage stage) { - // AppModel model = new AppModel(); MainController controller = new MainController(); - MainView view = new MainView(controller); - controller.setMainView(view); - Scene scene = view.createView(); + Scene scene = controller.getMainView().getScene(); + controller.showLoginPage(); stage.getIcons().add(new Image(getClass().getResource("/header/images/hmh-logo.png").toExternalForm())); stage.setTitle("Help-Me-Help"); diff --git a/src/main/java/edu/group5/app/control/BrowseCardController.java b/src/main/java/edu/group5/app/control/BrowseCardController.java new file mode 100644 index 0000000..297ba9f --- /dev/null +++ b/src/main/java/edu/group5/app/control/BrowseCardController.java @@ -0,0 +1,14 @@ +package edu.group5.app.control; + +public class BrowseCardController { + private final MainController controller; + + public BrowseCardController(MainController mainController) { + this.controller = mainController; + } + + public void handleCardClick() { + System.out.println("Browse Card Clicked"); + controller.showOrganizationPage(); + } +} diff --git a/src/main/java/edu/group5/app/control/BrowsePageController.java b/src/main/java/edu/group5/app/control/BrowsePageController.java new file mode 100644 index 0000000..0922e68 --- /dev/null +++ b/src/main/java/edu/group5/app/control/BrowsePageController.java @@ -0,0 +1,9 @@ +package edu.group5.app.control; + +public class BrowsePageController { + private final MainController controller; + + public BrowsePageController(MainController mainController) { + this.controller = mainController; + } +} diff --git a/src/main/java/edu/group5/app/control/HeaderController.java b/src/main/java/edu/group5/app/control/HeaderController.java index 5e432ac..0a1e424 100644 --- a/src/main/java/edu/group5/app/control/HeaderController.java +++ b/src/main/java/edu/group5/app/control/HeaderController.java @@ -14,6 +14,7 @@ public void handleHomeBtn() { public void handleCausesBtn() { System.out.println("Causes button pressed"); + controller.showBrowsePage(); } public void handleAboutBtn() { diff --git a/src/main/java/edu/group5/app/control/MainController.java b/src/main/java/edu/group5/app/control/MainController.java index 06bc732..d488a20 100644 --- a/src/main/java/edu/group5/app/control/MainController.java +++ b/src/main/java/edu/group5/app/control/MainController.java @@ -1,16 +1,34 @@ package edu.group5.app.control; +import edu.group5.app.control.donationpage.DonationPageController; import edu.group5.app.view.MainView; +import edu.group5.app.view.donationpage.DonationPageView; public class MainController { - private MainView view; + private final MainView view; + private final HeaderController headerController; + private final HomePageController homePageController; + private final BrowsePageController browsePageController; + private final BrowseCardController browseCardController; + private final OrganizationPageController organizationPageController; + private final DonationPageController donationPageController; - public void setMainView(MainView view) { - this.view = view; + public MainController() { + this.view = new MainView(this); + this.headerController = new HeaderController(this); + this.homePageController = new HomePageController(this); + this.browsePageController = new BrowsePageController(this); + this.browseCardController = new BrowseCardController(this); + this.organizationPageController = new OrganizationPageController(this); + this.donationPageController = new DonationPageController(this); + } + + public MainView getMainView() { + return view; } public void showHomePage() { - view.showHomePage(); + view.showHomePage(homePageController, headerController); } public void showLoginPage() { @@ -23,7 +41,15 @@ public void showPaymentCompletePage() { view.showPaymentCompletePage(); } public void showBrowsePage() { - view.showBrowsePage(); + view.showBrowsePage(browsePageController, browseCardController, headerController); + } + + public void showOrganizationPage() { + view.showOrganizationPage(organizationPageController, headerController); + } + + public void showDonationPage() { + view.showDonationPage(); } public void showAboutUsPage() {} diff --git a/src/main/java/edu/group5/app/control/OrganizationPageController.java b/src/main/java/edu/group5/app/control/OrganizationPageController.java new file mode 100644 index 0000000..dd8f1bf --- /dev/null +++ b/src/main/java/edu/group5/app/control/OrganizationPageController.java @@ -0,0 +1,13 @@ +package edu.group5.app.control; + +public class OrganizationPageController { + private final MainController controller; + + public OrganizationPageController(MainController controller) { + this.controller = controller; + } + + public void handleDonateClick() { + controller.showDonationPage(); + } +} diff --git a/src/main/java/edu/group5/app/view/MainView.java b/src/main/java/edu/group5/app/view/MainView.java index dc0dec1..27eeac5 100644 --- a/src/main/java/edu/group5/app/view/MainView.java +++ b/src/main/java/edu/group5/app/view/MainView.java @@ -1,5 +1,7 @@ package edu.group5.app.view; +import edu.group5.app.control.*; +import edu.group5.app.view.browsepage.BrowsePageView; import edu.group5.app.control.*; import edu.group5.app.control.donationpage.DonationPageController; import edu.group5.app.control.donationpage.PaymentCompleteController; @@ -10,6 +12,7 @@ import edu.group5.app.view.loginpage.LoginPageView; import edu.group5.app.view.loginpage.SignInPageView; import edu.group5.app.view.userpage.UserPageView; +import edu.group5.app.view.organizationpage.OrganizationPageView; import javafx.scene.Scene; import javafx.scene.layout.BorderPane; @@ -20,6 +23,7 @@ public class MainView { private final SignInPageController signInPageController; private final DonationPageController donationPageController; private final PaymentCompleteController paymentCompleteController; + private final Scene scene; private final BorderPane root; public MainView(MainController mainController) { @@ -30,6 +34,11 @@ public MainView(MainController mainController) { this.donationPageController = new DonationPageController(mainController); this.paymentCompleteController = new PaymentCompleteController(mainController); this.root = new BorderPane(); + this.scene = new Scene(root, 1280, 720); + } + + public Scene getScene() { + return this.scene; } public Scene createView() { @@ -37,18 +46,28 @@ public Scene createView() { return new Scene(root, 1280, 720); } - public void showHomePage() { + public void showHomePage(HomePageController homePageController, HeaderController headerController) { root.setCenter(new HomePageView(homePageController, headerController)); } public void showLoginPage() { root.setCenter(new LoginPageView(loginPageController)); } + + public void showBrowsePage(BrowsePageController browsePageController, BrowseCardController browseCardController, HeaderController headerController) { + root.setCenter(new BrowsePageView(getScene(), browsePageController, browseCardController, headerController)); + } + + public void showOrganizationPage(OrganizationPageController organizationController, HeaderController headerController) { + root.setCenter(new OrganizationPageView(organizationController, headerController)); + } + public void showSignInPage() { root.setCenter(new SignInPageView(signInPageController)); } - public void showBrowsePage() {} - + public void showDonationPage() { + root.setCenter(new DonationPageView(donationPageController, headerController)); + } public void showPaymentCompletePage() { root.setCenter(new PaymentCompletePageView(paymentCompleteController)); } diff --git a/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java b/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java new file mode 100644 index 0000000..02cc094 --- /dev/null +++ b/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java @@ -0,0 +1,75 @@ +package edu.group5.app.view.browsepage; + +import edu.group5.app.control.BrowseCardController; +import javafx.geometry.Pos; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; + +public class BrowseCard extends VBox { + private final BrowseCardController controller; + + public BrowseCard(BrowseCardController browseCardController, String img, String name) { + this.controller = browseCardController; + setId("mainContainer"); + getStylesheets().add(getClass().getResource("/browsepage/browse_org.css").toExternalForm()); + + getChildren().addAll( + imageContainer(img), + orgName(name), + checkMarkContainer() + ); + + setOnMouseClicked(e -> { + controller.handleCardClick(); + }); + + setSpacing(20); + setFillWidth(true); + setAlignment(Pos.CENTER); + } + + private StackPane imageContainer(String img) { + StackPane imageContainer = new StackPane(); + imageContainer.setId("imageContainer"); + imageContainer.setPrefHeight(120); + imageContainer.setPrefWidth(120); + imageContainer.setMaxWidth(Double.MAX_VALUE); + + ImageView logo = new ImageView( + new Image(getClass().getResource(img).toExternalForm()) + ); + + logo.setId("logo"); + logo.setSmooth(true); + logo.setPreserveRatio(true); + logo.setFitHeight(150); + + imageContainer.getChildren().add(logo); + return imageContainer; + } + + private Text orgName(String text) { + Text orgName = new Text(text); + orgName.setId("orgName"); + return orgName; + } + + private StackPane checkMarkContainer() { + StackPane checkMarkContainer = new StackPane(); + checkMarkContainer.setId("checkMarkContainer"); + checkMarkContainer.setAlignment(Pos.CENTER_LEFT); + + ImageView verifiedCheck = new ImageView( + new Image(getClass().getResource("/verified_check.png").toExternalForm()) + ); + + verifiedCheck.setPreserveRatio(true); + verifiedCheck.setSmooth(true); + + checkMarkContainer.getChildren().add(verifiedCheck); + return checkMarkContainer; + } +} diff --git a/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java b/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java new file mode 100644 index 0000000..4cb54b2 --- /dev/null +++ b/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java @@ -0,0 +1,81 @@ +package edu.group5.app.view.browsepage; + +import edu.group5.app.control.BrowseCardController; +import edu.group5.app.control.BrowsePageController; +import edu.group5.app.control.HeaderController; +import edu.group5.app.view.Header; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.layout.*; + +public class BrowsePageView extends BorderPane { + private final Scene scene; + private final BrowsePageController controller; + private final BrowseCardController orgController; + + public BrowsePageView(Scene mainScene, BrowsePageController browsePageController, BrowseCardController browseCardController, HeaderController headerController) { + this.scene = mainScene; + this.controller = browsePageController; + this.orgController = browseCardController; + getStylesheets().add(getClass().getResource("/browsepage/browsepage.css").toExternalForm()); + Header headerView = new Header(headerController); + setTop(headerView); + setCenter(createBody()); + } + + private ScrollPane createBody() { + ScrollPane body = new ScrollPane(); + body.setId("body"); + body.setFitToWidth(true); + VBox vBox = new VBox(); + vBox.setSpacing(10); + vBox.getChildren().addAll( + createSearchSection(), + createOrganizationSection() + ); + body.setContent(vBox); + return body; + } + + private HBox createSearchSection() { + HBox searchSection = new HBox(); + TextField searchField = new TextField(); + searchField.setPromptText("Search.."); + searchSection.getChildren().add(searchField); + return searchSection; + } + + private GridPane createOrganizationSection() { + GridPane grid = new GridPane(); + grid.setId("card-grid"); + grid.setHgap(10); + grid.setVgap(10); + grid.setMaxWidth(Double.MAX_VALUE - 50); + + int column = 0; + int row = 0; + for (int i = 0; i < 16; i++) { + BrowseCard card = new BrowseCard(orgController, "/browsepage/images/children_of_shambala.png", "Shambala Foundation"); + + GridPane.setFillWidth(card, true); + grid.setAlignment(Pos.CENTER); + grid.add(card, column, row); + + column++; + + if (column == 4) { + column = 0; + row++; + } + } + + for (int i = 0; i < 4; i++) { + ColumnConstraints col = new ColumnConstraints(); + col.setPercentWidth(25); + grid.getColumnConstraints().add(col); + } + return grid; + } +} diff --git a/src/main/java/edu/group5/app/view/homepage/HomePageView.java b/src/main/java/edu/group5/app/view/homepage/HomePageView.java index 419c2e5..5510daa 100644 --- a/src/main/java/edu/group5/app/view/homepage/HomePageView.java +++ b/src/main/java/edu/group5/app/view/homepage/HomePageView.java @@ -28,7 +28,6 @@ private ScrollPane createBody() { VBox vBox = new VBox(); vBox.getChildren().addAll( createIntroductionSection(), - createCharityImageSection(), createCharityImageSection() ); body.setContent(vBox); diff --git a/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java b/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java new file mode 100644 index 0000000..4155ccd --- /dev/null +++ b/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java @@ -0,0 +1,94 @@ +package edu.group5.app.view.organizationpage; + +import edu.group5.app.control.HeaderController; +import edu.group5.app.control.OrganizationPageController; +import edu.group5.app.view.Header; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; + +public class OrganizationPageView extends BorderPane { + private final OrganizationPageController controller; + + public OrganizationPageView(OrganizationPageController controller, HeaderController headerController) { + this.controller = controller; + getStylesheets().add(getClass().getResource("/organizationpage/organizationpage.css").toExternalForm()); + Header headerView = new Header(headerController); + setTop(headerView); + setCenter(createBody()); + } + + private ScrollPane createBody() { + ScrollPane body = new ScrollPane(); + body.setFitToWidth(true); + body.setFitToHeight(true) + ; + VBox vBox = new VBox(); + vBox.setId("main-container"); + + vBox.getChildren().addAll( + createOrgSection() + ); + body.setContent(vBox); + return body; + } + + private HBox createOrgSection() { + HBox orgSection = new HBox(); + orgSection.setId("org-section"); + orgSection.setAlignment(Pos.CENTER); + orgSection.setSpacing(40); + + orgSection.getChildren().addAll(createImageContainer(), createOrgInfoSection()); + return orgSection; + } + + private StackPane createImageContainer() { + StackPane imageContainer = new StackPane(); + imageContainer.setId("imageContainer"); + imageContainer.setPrefHeight(120); + imageContainer.setPrefWidth(120); + imageContainer.setMaxWidth(Double.MAX_VALUE); + + ImageView logo = new ImageView( + new Image(getClass().getResource("/browsepage/images/children_of_shambala.png").toExternalForm()) + ); + + logo.setId("logo"); + logo.setSmooth(true); + logo.setPreserveRatio(true); + + imageContainer.getChildren().add(logo); + return imageContainer; + } + + private VBox createOrgInfoSection() { + VBox orgInfoSection = new VBox(); + orgInfoSection.setSpacing(50); + + VBox orgNameAndDescription = new VBox(); + + Label orgName = new Label("Shambala Foundation"); + orgName.setId("orgName"); + + Text description = new Text("Descriptive text"); + description.setId("description"); + + orgNameAndDescription.getChildren().addAll(orgName, description); + + Button donateBtn = new Button("Donate"); + donateBtn.setId("donate-button"); + donateBtn.setOnAction(e -> controller.handleDonateClick()); + + orgInfoSection.getChildren().addAll(orgNameAndDescription, donateBtn); + return orgInfoSection; + } +} diff --git a/src/main/resources/browsepage/browse_org.css b/src/main/resources/browsepage/browse_org.css new file mode 100644 index 0000000..96ce14e --- /dev/null +++ b/src/main/resources/browsepage/browse_org.css @@ -0,0 +1,25 @@ +#mainContainer { + -fx-border-color: black; + -fx-border-width: 1px; + -fx-border-radius: 1em; + -fx-padding: 5px; + -fx-pref-width: 10px; + -fx-background-color: white; + -fx-background-radius: 1em; +} + +#mainContainer:hover { + -fx-cursor: hand; +} + +#imageContainer {} + + +#logo {} + +#orgName { + -fx-font-size: x-large; + -fx-font-weight: bold; +} + +#checkMarkContainer {} \ No newline at end of file diff --git a/src/main/resources/browsepage/browsepage.css b/src/main/resources/browsepage/browsepage.css new file mode 100644 index 0000000..1dd8643 --- /dev/null +++ b/src/main/resources/browsepage/browsepage.css @@ -0,0 +1,6 @@ +#body { + -fx-padding: 20px; +} + +#card-grid { +} \ No newline at end of file diff --git a/src/main/resources/browsepage/images/children_of_shambala.png b/src/main/resources/browsepage/images/children_of_shambala.png new file mode 100644 index 0000000..3b1a7f7 Binary files /dev/null and b/src/main/resources/browsepage/images/children_of_shambala.png differ diff --git a/src/main/resources/browsepage/images/kfum_kfum_global.png b/src/main/resources/browsepage/images/kfum_kfum_global.png new file mode 100644 index 0000000..bd5365a Binary files /dev/null and b/src/main/resources/browsepage/images/kfum_kfum_global.png differ diff --git a/src/main/resources/organizationpage/organizationpage.css b/src/main/resources/organizationpage/organizationpage.css new file mode 100644 index 0000000..a7276b5 --- /dev/null +++ b/src/main/resources/organizationpage/organizationpage.css @@ -0,0 +1,31 @@ +#main-container { + -fx-padding: 50px +} + +#logo { + -fx-min-height: 50%; +} + +#orgName { + -fx-font-weight: bold; + -fx-font-size: 20pt; +} + +#description { + -fx-font-size: 10pt; +} + +#donate-button { + -fx-pref-height: 55px; + -fx-background-color: #e03030; + -fx-text-fill: white; + -fx-font-size: 22px; + -fx-font-weight: bold; + -fx-background-radius: 8; + -fx-cursor: hand; + -fx-padding: 0 40 0 40; +} + +#donate-button:hover { + -fx-background-color: #c02020; +} \ No newline at end of file diff --git a/src/main/resources/verified_check.png b/src/main/resources/verified_check.png new file mode 100644 index 0000000..520f237 Binary files /dev/null and b/src/main/resources/verified_check.png differ