From db999af79b0dd5944163f712d21812a56c55bc1e Mon Sep 17 00:00:00 2001 From: arnaudlabourel <arnaud.labourel@univ-amu.fr> Date: Wed, 22 Sep 2021 07:34:42 +0200 Subject: [PATCH] first gui version (non-functional) --- build.gradle | 8 +- .../java/controller/RootLayoutController.java | 20 +++ src/main/java/main/MainApp.java | 46 ++++++ src/main/java/model/Grid.java | 50 ++++++ src/main/java/model/GridIterator.java | 30 ++++ src/main/resources/view/DarkTheme.css | 142 ++++++++++++++++++ src/main/resources/view/RootLayout.fxml | 19 +++ 7 files changed, 311 insertions(+), 4 deletions(-) create mode 100644 src/main/java/controller/RootLayoutController.java create mode 100644 src/main/java/main/MainApp.java create mode 100644 src/main/java/model/Grid.java create mode 100644 src/main/java/model/GridIterator.java create mode 100644 src/main/resources/view/DarkTheme.css create mode 100644 src/main/resources/view/RootLayout.fxml diff --git a/build.gradle b/build.gradle index 178b0ec..8231943 100644 --- a/build.gradle +++ b/build.gradle @@ -13,9 +13,9 @@ repositories { } dependencies { - testImplementation('org.junit.jupiter:junit-jupiter-api:5.7.2', - 'org.assertj:assertj-core:3.11.1') - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2' + testImplementation('org.junit.jupiter:junit-jupiter-api:5.8.0', + 'org.assertj:assertj-core:3.20.2') + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.0' } test { @@ -23,5 +23,5 @@ test { } application { - mainClassName = "viewer.MainAppLauncher" + mainClassName = "main.MainApp" } \ No newline at end of file diff --git a/src/main/java/controller/RootLayoutController.java b/src/main/java/controller/RootLayoutController.java new file mode 100644 index 0000000..992247b --- /dev/null +++ b/src/main/java/controller/RootLayoutController.java @@ -0,0 +1,20 @@ +package controller; + +import javafx.fxml.FXML; +import javafx.scene.layout.GridPane; +import main.MainApp; + +public class RootLayoutController { + @FXML + GridPane gridPane; + private MainApp mainApp; + + /** + * Is called by the main application to give a reference back to itself. + * + * @param mainApp + */ + public void setMainApp(MainApp mainApp) { + this.mainApp = mainApp; + } +} diff --git a/src/main/java/main/MainApp.java b/src/main/java/main/MainApp.java new file mode 100644 index 0000000..07282eb --- /dev/null +++ b/src/main/java/main/MainApp.java @@ -0,0 +1,46 @@ +package main; + +import controller.RootLayoutController; +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; + +import javafx.scene.layout.BorderPane; +import javafx.stage.Stage; + +import java.io.IOException; + +public class MainApp extends Application { + private Stage primaryStage; + private BorderPane rootLayout; + + public void start(Stage primaryStage) { + this.primaryStage = primaryStage; + this.primaryStage.setTitle("AddressApp"); + initRootLayout(); + } + + /** + * Initializes the root layout and tries to load the last opened + * person file. + */ + public void initRootLayout() { + try { + // Load root layout from fxml file. + FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/RootLayout.fxml")); + rootLayout = loader.load(); + + // Show the scene containing the root layout. + Scene scene = new Scene(rootLayout); + primaryStage.setScene(scene); + + // Give the controller access to the main app. + RootLayoutController controller = loader.getController(); + controller.setMainApp(this); + + primaryStage.show(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/model/Grid.java b/src/main/java/model/Grid.java new file mode 100644 index 0000000..0705e69 --- /dev/null +++ b/src/main/java/model/Grid.java @@ -0,0 +1,50 @@ +package model; + +import java.util.Iterator; + +public class Grid<T> implements Iterable<T> { + private final int numberOfRows; + private final int numberOfColumns; + private final T[][] squares; + + /** + * Creates a new {@code Grid} instance given the number of rows and columns. + * + * @param numberOfRows the number of rows + * @param numberOfColumns the number of columns + * @throws IllegalArgumentException if {@code numberOfRows} or {@code numberOfColumns} are + * less than or equal to 0 + */ + public Grid(int numberOfRows, int numberOfColumns) { + this.numberOfRows = numberOfRows; + this.numberOfColumns = numberOfColumns; + this.squares = allocateMatrix(); + } + + private T[][] allocateMatrix() { + return (T[][]) new Object[getNumberOfRows()][getNumberOfColumns()]; + } + + + /** + * Returns an iterator over elements of type {@code T}. + * + * @return an Iterator. + */ + @Override + public Iterator<T> iterator() { + return new GridIterator<>(this); + } + + public T getSquare(int rowIndex, int columnIndex) { + return squares[rowIndex][columnIndex]; + } + + public int getNumberOfRows() { + return numberOfRows; + } + + public int getNumberOfColumns() { + return numberOfColumns; + } +} diff --git a/src/main/java/model/GridIterator.java b/src/main/java/model/GridIterator.java new file mode 100644 index 0000000..6fd5510 --- /dev/null +++ b/src/main/java/model/GridIterator.java @@ -0,0 +1,30 @@ +package model; + +import java.util.Iterator; + +public class GridIterator<T> implements Iterator<T> { + private int rowIndex; + private int columnIndex; + private final Grid<T> grid; + + GridIterator(Grid grid) { + this.rowIndex = 0; + this.columnIndex = 0; + this.grid = grid; + } + + @Override + public boolean hasNext() { + return columnIndex < grid.getNumberOfColumns() && rowIndex < grid.getNumberOfRows(); + } + + @Override + public T next() { + final T result = grid.getSquare(rowIndex, columnIndex); + columnIndex = (columnIndex +1) % grid.getNumberOfColumns(); + if(columnIndex == 0){ + rowIndex++; + } + return result; + } +} diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css new file mode 100644 index 0000000..46b78aa --- /dev/null +++ b/src/main/resources/view/DarkTheme.css @@ -0,0 +1,142 @@ +.background { + -fx-background-color: #1d1d1d; +} + +.label { + -fx-font-size: 11pt; + -fx-font-family: "Segoe UI Semibold"; + -fx-text-fill: white; + -fx-opacity: 0.6; +} + +.label-bright { + -fx-font-size: 11pt; + -fx-font-family: "Segoe UI Semibold"; + -fx-text-fill: white; + -fx-opacity: 1; +} + +.label-header { + -fx-font-size: 32pt; + -fx-font-family: "Segoe UI Light"; + -fx-text-fill: white; + -fx-opacity: 1; +} + +.table-view { + -fx-base: #1d1d1d; + -fx-control-inner-background: #1d1d1d; + -fx-background-color: #1d1d1d; + -fx-table-cell-border-color: transparent; + -fx-table-header-border-color: transparent; + -fx-padding: 5; +} + +.table-view .column-header-background { + -fx-background-color: transparent; +} + +.table-view .column-header, .table-view .filler { + -fx-border-width: 0 0 1 0; + -fx-background-color: transparent; + -fx-border-color: + transparent + transparent + derive(-fx-base, 80%) + transparent; + -fx-border-insets: 0 10 1 0; +} + +.table-view .column-header .label { + -fx-font-size: 20pt; + -fx-font-family: "Segoe UI Light"; + -fx-text-fill: white; + -fx-alignment: center-left; + -fx-opacity: 1; +} + +.table-view:focused .table-row-cell:filled:focused:selected { + -fx-background-color: -fx-focus-color; +} + +.split-pane:horizontal > .split-pane-divider { + -fx-border-color: transparent #1d1d1d transparent #1d1d1d; + -fx-background-color: transparent, derive(#1d1d1d,20%); +} + +.split-pane { + -fx-padding: 1 0 0 0; +} + +.menu-bar { + -fx-background-color: derive(#1d1d1d,20%); +} + +.context-menu { + -fx-background-color: derive(#1d1d1d,50%); +} + +.menu-bar .label { + -fx-font-size: 14pt; + -fx-font-family: "Segoe UI Light"; + -fx-text-fill: white; + -fx-opacity: 0.9; +} + +.menu .left-container { + -fx-background-color: black; +} + +.text-field { + -fx-font-size: 12pt; + -fx-font-family: "Segoe UI Semibold"; +} + +/* + * Metro style Push Button + * Author: Pedro Duque Vieira + * http://pixelduke.wordpress.com/2012/10/23/jmetro-windows-8-controls-on-java/ + */ +.button { + -fx-padding: 5 22 5 22; + -fx-border-color: #e2e2e2; + -fx-border-width: 2; + -fx-background-radius: 0; + -fx-background-color: #1d1d1d; + -fx-font-family: "Segoe UI", Helvetica, Arial, sans-serif; + -fx-font-size: 11pt; + -fx-text-fill: #d8d8d8; + -fx-background-insets: 0 0 0 0, 0, 1, 2; +} + +.button:hover { + -fx-background-color: #3a3a3a; +} + +.button:pressed, .button:default:hover:pressed { + -fx-background-color: white; + -fx-text-fill: #1d1d1d; +} + +.button:focused { + -fx-border-color: white, white; + -fx-border-width: 1, 1; + -fx-border-style: solid; + -fx-border-radius: 0, 0; + -fx-border-insets: 1 1 1 1, 0; +} + +.button:disabled, .button:default:disabled { + -fx-opacity: 0.4; + -fx-background-color: #1d1d1d; + -fx-text-fill: white; +} + +.button:default { + -fx-background-color: -fx-focus-color; + -fx-text-fill: #ffffff; +} + +.button:default:hover { + -fx-background-color: derive(-fx-focus-color,30%); +} \ No newline at end of file diff --git a/src/main/resources/view/RootLayout.fxml b/src/main/resources/view/RootLayout.fxml new file mode 100644 index 0000000..8ac5b6f --- /dev/null +++ b/src/main/resources/view/RootLayout.fxml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.layout.*?> + + +<BorderPane prefHeight="620.0" + prefWidth="620.0" + stylesheets="@DarkTheme.css" + xmlns="http://javafx.com/javafx" + xmlns:fx="http://javafx.com/fxml" + fx:controller="controller.RootLayoutController"> + <top> + <GridPane xmlns="http://javafx.com/javafx" + xmlns:fx="http://javafx.com/fxml" + fx:id="gridPane" + prefHeight="600.0" prefWidth="600.0"> + </GridPane> + </top> +</BorderPane> \ No newline at end of file -- GitLab