Resolve "Polishing the app before delivery"

This commit is contained in:
Øystein Martinussen
2021-09-30 16:09:15 +00:00
committed by Hallvard Henriksen
parent a19aacb7d9
commit 0610fc6f46
10 changed files with 146 additions and 71 deletions
+1 -1
View File
@@ -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
@@ -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";
@@ -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<File> 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());
}
@@ -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<String> 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();
}
}
@@ -1,19 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ToggleButton?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.image.*?>
<?import de.jensd.fx.glyphs.materialicons.MaterialIconView?>
@@ -23,31 +18,40 @@
<top>
<HBox fx:id="navbar" prefHeight="35.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" alignment="CENTER">
<children>
<Button fx:id="btnHamburger">
<!-- Used for later iterations
<ToggleButton fx:id="btnHamburger">
<graphic>
<MaterialIconView fx:id="hamburger" glyphName="MENU" size="18px"/>
</graphic>
</Button>
</ToggleButton>
-->
<Region HBox.hgrow="ALWAYS" />
<Label alignment="CENTER" fx:id="header" text="FLASHY" />
<Region HBox.hgrow="ALWAYS" />
<HBox>
<children>
<Button fx:id="btnFavourites">
<!-- Used for later iterations
<ToggleButton fx:id="btnFavourites">
<graphic>
<MaterialIconView fx:id="favourites" glyphName="STAR_BORDER" size="18px"/>
</graphic>
</Button>
<Button fx:id="btnToggleRandomMode" onAction="#handleToggleCardOrderIsRandom">
</ToggleButton>
-->
<ToggleButton fx:id="btnToggleFirstLastWrapAroundMode" onAction="#handleToggleFirstLastWrapAroundMode">
<graphic>
<MaterialIconView fx:id="toggleFirstLastWrapAroundMode" glyphName="REPEAT" size="18px"/>
</graphic>
</ToggleButton>
<ToggleButton fx:id="btnToggleRandomMode" onAction="#handleToggleCardOrderIsRandom">
<graphic>
<MaterialIconView fx:id="toggleRandomMode" glyphName="SHUFFLE" size="18px"/>
</graphic>
</Button>
<Button fx:id="btnToggleShowOtherSide" onAction="#handleToggleShowOtherSide">
</ToggleButton>
<ToggleButton fx:id="btnToggleShowOtherSide" onAction="#handleToggleShowOtherSide">
<graphic>
<MaterialIconView fx:id="toggleShowOtherSide" glyphName="SWAP_HORIZ" size="18px"/>
</graphic>
</Button>
</ToggleButton>
</children>
</HBox>
</children>
@@ -58,13 +62,14 @@
<center>
<SplitPane dividerPositions="0.25" orientation="HORIZONTAL">
<VBox prefHeight="35.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:id="menu">
<children>
<Button fx:id="btnFavouriteCards" text="Favourites" maxWidth="1.7976931348623157E308" prefHeight="40">
<!-- Used for later iterations
<ToggleButton fx:id="btnFavouriteCards" text="Favourites" maxWidth="1.7976931348623157E308" prefHeight="40">
<graphic>
<MaterialIconView fx:id="favouriteCards" glyphName="STAR" size="18px"/>
</graphic>
</Button>
</ToggleButton>
-->
<Label fx:id="typeFront" text="Type the front" />
<TextField fx:id="writeFront" layoutX="115.0" layoutY="28.0" />
<Label fx:id="typeBack" text="Type the back" />
@@ -74,7 +79,6 @@
<MaterialIconView fx:id="createFLashCard" glyphName="ADD_CIRCLE_OUTLINE" size="18px"/>
</graphic>
</Button>
</children>
</VBox>
@@ -85,14 +89,11 @@
<Label alignment="CENTER" fx:id="showCard" onMouseClicked="#handleFlipCardMouse" />
<HBox alignment="CENTER">
<Button fx:id="flip" text="Flip the card!" onAction="#handleFlipCardButton" prefHeight="20" prefWidth="150" />
<Button fx:id="randomCard" text="Random Card" onAction="#handleRandomCard"/>
<Button fx:id="lastCard" text="Previous card" onAction="#handleTurnToPreviousCard" />
<Button fx:id="nextCard" text="Next card" onAction="#handleTurnToNextCard" />
</HBox>
</children>
</VBox>
</SplitPane>
</center>
</BorderPane>
@@ -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;
}
+4
View File
@@ -0,0 +1,4 @@
@ECHO OFF
call mvn clean package -Dmaven.test.skip=true
java -jar target/flashy.jar
pause
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
mvn clean package -Dmaven.test.skip=true
java -jar target/flashy.jar
+1 -2
View File
@@ -34,8 +34,7 @@
</menu>
<menu name="Project Reports">
<!-- TODO: Link to project report before project delivery -->
<item name="Report 1 - 24.09.21" href=""/>
<item name="Report 1 - 24.09.21" href="${gitlab.url}/blob/master/gr2141/docs/Report1.md"/>
</menu>
<menu name="Details">
+18
View File
@@ -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).