From 0610fc6f4635a2f776831a62b141d3baf5dce4eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98ystein=20Martinussen?= Date: Thu, 30 Sep 2021 16:09:15 +0000 Subject: [PATCH] Resolve "Polishing the app before delivery" --- .gitpod.yml | 2 +- .../serializers/ModelSerializingModule.java | 4 +- .../gr2141/core/storage/CardDeckStorage.java | 18 ++++- .../gr2141/ui/FlashyAppController.java | 77 +++++++++++++------ .../groups_2021/gr2141/ui/FlashyApp.fxml | 43 ++++++----- .../groups_2021/gr2141/ui/styling/Flashy.css | 45 ++++++----- flashy/run.bat | 4 + flashy/run.sh | 3 + flashy/src/site/site.xml | 3 +- gr2141/docs/Report1.md | 18 +++++ 10 files changed, 146 insertions(+), 71 deletions(-) create mode 100644 flashy/run.bat create mode 100644 flashy/run.sh create mode 100644 gr2141/docs/Report1.md diff --git a/.gitpod.yml b/.gitpod.yml index e804473..da2f473 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -3,7 +3,7 @@ image: tasks: - init: sdk use java 16.0.1.hs-adpt - command: cd flashy; mvn compile + command: cd flashy; mvn package -Dmaven.test.skip=true ports: # used by virtual desktop and vnc, supports JavaFX diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/ModelSerializingModule.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/ModelSerializingModule.java index cfb7cc6..0fdeb40 100644 --- a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/ModelSerializingModule.java +++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/models/serializers/ModelSerializingModule.java @@ -6,7 +6,9 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import it1901.groups_2021.gr2141.core.models.CardContent; import it1901.groups_2021.gr2141.core.models.CardDeck; import it1901.groups_2021.gr2141.core.models.Flashcard; - +/** + * Uses simple module from the jackson library, to serialize and deserialize data +*/ public class ModelSerializingModule extends SimpleModule { private static final String NAME = "FlashcardModule"; diff --git a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/storage/CardDeckStorage.java b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/storage/CardDeckStorage.java index 1f6fbbd..d13ec0f 100644 --- a/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/storage/CardDeckStorage.java +++ b/flashy/core/src/main/java/it1901/groups_2021/gr2141/core/storage/CardDeckStorage.java @@ -21,6 +21,15 @@ public class CardDeckStorage { private CardDeckStorage() { } + /** + * Sets a directory where the json file is saved. + * + * @return the directory + * @see #getDataFiles() + * @see #writeDeck(CardDeck) + * @see #readDeck(int) + */ + public static Path getUserDataDirectory() { String OS = (System.getProperty("os.name")).toLowerCase(); Path dataDir; @@ -50,8 +59,10 @@ public class CardDeckStorage { } /** - * check the ids (names) of all files in dataDirectory, and return the next + * Check the ids (names) of all files in dataDirectory, and return the next * available id + * + * @return id */ private static int getNextDeckID() { List files = getDataFiles(); @@ -60,7 +71,10 @@ public class CardDeckStorage { return Integer.parseInt(lastCardDeckId) + 1; } - /** Write a card deck to the next available id */ + /** Write a card deck to the next available id + * + * @param deck + */ public static void writeDeck(CardDeck deck) { writeDeck(deck, getNextDeckID()); } diff --git a/flashy/fxui/src/main/java/it1901/groups_2021/gr2141/ui/FlashyAppController.java b/flashy/fxui/src/main/java/it1901/groups_2021/gr2141/ui/FlashyAppController.java index 1719192..5771101 100644 --- a/flashy/fxui/src/main/java/it1901/groups_2021/gr2141/ui/FlashyAppController.java +++ b/flashy/fxui/src/main/java/it1901/groups_2021/gr2141/ui/FlashyAppController.java @@ -26,7 +26,6 @@ public class FlashyAppController implements Initializable { @FXML private Label showCard; - private CardDeck deck; private int cardIndex; private boolean cardShowsFront; @@ -35,6 +34,12 @@ public class FlashyAppController implements Initializable { private boolean cardOrderIsRandomMode; private boolean firstLastWrapAroundMode; + /** + * Initializes the card deck. + * + * @param url + * @param resourceBundle + */ @Override public void initialize(URL url, ResourceBundle resourceBundle) { @@ -53,6 +58,11 @@ public class FlashyAppController implements Initializable { setCard(this.deck.getFlashcards().get(cardIndex)); } + /** + * Converts the card content to String. + * + * @param lines + */ private static String listToString(List lines) { return String.join("\n", lines); } @@ -71,12 +81,20 @@ public class FlashyAppController implements Initializable { setCard(this.deck.getFlashcards().get(cardIndex)); } + /** + * When at last card in deck, turn to first card in deck when pressing next card + * + * @param cardIndex + */ public void turnToCard(int cardIndex) throws IllegalArgumentException { - if (!firstLastWrapAroundMode && (cardIndex < 0 || this.deck.getNumberOfCards() <= cardIndex)) - throw new IllegalArgumentException("This card does not exist"); + if (!(firstLastWrapAroundMode || cardOrderIsRandomMode) + && (cardIndex < 0 || this.deck.getNumberOfCards() <= cardIndex)) { + System.err.println("This card does not exist: " + cardIndex); + return; + } if (cardOrderIsRandomMode) { - cardIndex = generateRandomCard(); + cardIndex = generateRandomCardIndex(); } this.cardIndex = cardIndex; @@ -84,16 +102,19 @@ public class FlashyAppController implements Initializable { if (firstLastWrapAroundMode) this.cardIndex %= this.deck.getNumberOfCards(); + cardShowsFront = true; + updateCard(); } + + // used for later iterations + // public void turnToFirstCard() { + // turnToCard(0); + // } - public void turnToFirstCard() { - turnToCard(0); - } - - public void turnToLastCard() { - turnToCard(this.deck.getNumberOfCards() - 1); - } + // public void turnToLastCard() { + // turnToCard(this.deck.getNumberOfCards() - 1); + // } public void turnToNextCard(int cardIndex) throws IllegalArgumentException { turnToCard(this.cardIndex + 1); @@ -103,21 +124,22 @@ public class FlashyAppController implements Initializable { turnToCard(this.cardIndex - 1); } - // Help function for random mode - private int generateRandomCard() { - if (deck.getNumberOfCards() <= 1){ - return 0; + /** + * Generate a random cardIndex + * + * @return cardIndex + */ + public int generateRandomCardIndex() { + if (deck.getNumberOfCards() <= 1) { + return 0; } + Random randomGenerator = new Random(); int nextCard = randomGenerator.nextInt(deck.getNumberOfCards() - 1); nextCard = nextCard + ((nextCard >= cardIndex) ? 1 : 0); return nextCard; } - public void turnToRandomCard() { - turnToCard(generateRandomCard()); - } - public void flipCard() { this.cardShowsFront = !this.cardShowsFront; updateCard(); @@ -141,10 +163,15 @@ public class FlashyAppController implements Initializable { writeBack.clear(); } + /** + * Creates a card and saves the card + * + * @param event + */ @FXML public void handleCreateFlashCard(ActionEvent event) { if (writeFront.getText().isEmpty() || writeBack.getText().isEmpty()) - return; + return; deck.add(Flashcard.of(writeFront.getText(), writeBack.getText())); clearTextFields(); @@ -176,11 +203,6 @@ public class FlashyAppController implements Initializable { turnToPreviousCard(cardIndex); } - @FXML - public void handleRandomCard(ActionEvent event) { - turnToRandomCard(); - } - @FXML public void handleToggleShowOtherSide(ActionEvent event) { toggleShowOrderIsFlippedMode(); @@ -191,4 +213,9 @@ public class FlashyAppController implements Initializable { public void handleToggleCardOrderIsRandom(ActionEvent event) { toggleCardOrderIsRandomMode(); } + + @FXML + public void handleToggleFirstLastWrapAroundMode(ActionEvent event) { + toggleFirstLastWrapAroundMode(); + } } diff --git a/flashy/fxui/src/main/resources/it1901/groups_2021/gr2141/ui/FlashyApp.fxml b/flashy/fxui/src/main/resources/it1901/groups_2021/gr2141/ui/FlashyApp.fxml index 8dd86b7..23cef42 100644 --- a/flashy/fxui/src/main/resources/it1901/groups_2021/gr2141/ui/FlashyApp.fxml +++ b/flashy/fxui/src/main/resources/it1901/groups_2021/gr2141/ui/FlashyApp.fxml @@ -1,19 +1,14 @@ + - - - - - - @@ -23,31 +18,40 @@ - - + @@ -58,13 +62,14 @@
- - - @@ -85,14 +89,11 @@
- \ No newline at end of file diff --git a/flashy/fxui/src/main/resources/it1901/groups_2021/gr2141/ui/styling/Flashy.css b/flashy/fxui/src/main/resources/it1901/groups_2021/gr2141/ui/styling/Flashy.css index 7601ce1..040bcd0 100644 --- a/flashy/fxui/src/main/resources/it1901/groups_2021/gr2141/ui/styling/Flashy.css +++ b/flashy/fxui/src/main/resources/it1901/groups_2021/gr2141/ui/styling/Flashy.css @@ -1,4 +1,5 @@ /* --------------------------------- Colors --------------------------------- */ +/* Some colors added for later iterations */ * { -main-fg-color: #f8f8f2; -main-grey-color: #C4C4C4; @@ -12,6 +13,8 @@ } +/* --------------------------------- General --------------------------------- */ + .root{ -fx-font-size: 10pt; -fx-font-family: "Roboto"; @@ -27,20 +30,26 @@ #header { -fx-font-size: 15; - -fx-text-fill: -main-fg-color - + -fx-text-fill: -main-fg-color; } -#navbar .button:hover, .button:hover +#navbar .glyph-icon { + -fx-fill: -main-fg-color; +} + +#navbar .toggle-button +{ + -fx-background-color: -main-purple-menu-color; +} + +#navbar .toggle-button:hover { -fx-background-color: -main-grey-color; } -#navbar .button -{ - -fx-background-color: transparent; -} - +#navbar .toggle-button:selected { + -fx-background-color: -main-black-color; +} /* --------------------------------- Menu --------------------------------- */ @@ -54,33 +63,31 @@ #menu .button { -fx-background-color: transparent; +} + +#menu .button:pressed { + -fx-background-color: -main-black-color; } /* --------------------------------- FlashCard --------------------------------- */ + #flashcontainer { -fx-background-color: -main-grey-color; } -#hamburger, #favourites, #toggleRandomMode, #toggleShowOtherSide { - -fx-fill: -main-fg-color; -} - #showCard { -fx-background-color: -main-purple-menu-accent-frame-color; -fx-text-fill: -main-fg-color; - -fx-min-height:225; + -fx-font-size: 25; + -fx-min-height:250; -fx-min-width:400; -fx-padding: 5px; - -fx-border-insets: 5px; - -fx-background-insets: 5px; + -fx-border-insets: 10px; + -fx-background-insets: 10px; } -#flashcontainer .label { - -fx-font-size: 25; -} - diff --git a/flashy/run.bat b/flashy/run.bat new file mode 100644 index 0000000..831011d --- /dev/null +++ b/flashy/run.bat @@ -0,0 +1,4 @@ +@ECHO OFF +call mvn clean package -Dmaven.test.skip=true +java -jar target/flashy.jar +pause diff --git a/flashy/run.sh b/flashy/run.sh new file mode 100644 index 0000000..0f8e243 --- /dev/null +++ b/flashy/run.sh @@ -0,0 +1,3 @@ +#!/bin/sh +mvn clean package -Dmaven.test.skip=true +java -jar target/flashy.jar diff --git a/flashy/src/site/site.xml b/flashy/src/site/site.xml index fdbe936..a3d6506 100644 --- a/flashy/src/site/site.xml +++ b/flashy/src/site/site.xml @@ -34,8 +34,7 @@ - - + diff --git a/gr2141/docs/Report1.md b/gr2141/docs/Report1.md new file mode 100644 index 0000000..dfae5d4 --- /dev/null +++ b/gr2141/docs/Report1.md @@ -0,0 +1,18 @@ +# Rapport for gruppeinnlevering 1 +Medlemmer: Hallvard Henriksen, Hanne Fyrand, Øystein Tveit og Øystein Martinussen. + +Gruppe 41 er fornøyde med hvor langt vi har kommet i prosjektet. I planleggingsfasen lagde vi milepæler og issues i GitLab som ble fordelt på gruppemedlemmene. Vi begynte med å lage mappestrukturen og legge inn filer i det utleverte kodelageret. + +## Status +For å visualisere ønskede funksjoner og design lagde vi en versjon av appen i Figma. Hallvard og Øystein M par-programmerte brukergrensesnittet ved hjelp av live-share. Øystein T og Hanne begynte å par-programmere domenelogikken. Siden har vi mob-programmert med live-share og vi liker metoden. + +Til gruppeinnlevering 1 har vi kommet godt i gang med de tre arkitekturlagene. Vi har designet et brukergrensesnitt vi liker, men mangler litt finpuss. Det tok litt lengre tid å koble opp ui-en mot domenelogikken enn antatt, men nå er vi fornøyd for første øving. Vi har også skrevet en god del domenelogikk innad i appen. Persistensdelen har vi kommet godt i gang med. Vi har lagd serealiserere og deserealiserere og det er mulig å lagre et kort slik at det eksisterer neste gang man kjører programmet ved hjelp av json. + +Testing av appen har blitt opprettet for tre ulike klasser (CardDeck, CardContent og FlashCard) og for serialiseringsklassene. Testdekningsgraden er dermed over 0%. + +## Refleksjon +Arbeidsflyten gjennom øving 1 har vært bra, mye til takke for opprettelse av issues og branches. Ved bruk av liveshare har alle i gruppen fått en forståelse for koden og gjør at alle blir inkludert i prosessen. En arbeidsmetode vi har valgt er å låse master branchen. For å kunne merge branchene til master må en annen på gruppen godkjenne og merge. Ved å gjøre dette hindrer det at master branchen får uønskede endringer. For at en merge request skal bli merget til master bør minst 2 forskjellige medlemmer av gruppen se gjennom endringene. + +Vi har laget brukerhistorier og en storyboard for å visualisere ulike funksjonaliteter i appen. Til slutt har arbeidet med prosjektet foregått fysisk på universitetet 1 - 2 ganger i uken, og er noe vi ønsker å fortsette med. + +En mer detaljert beskrivelse av hvordan Flashy er bygd kan leses mer om i rot [readme](\readme.md). \ No newline at end of file