Resolve "Polishing the app before delivery"
This commit is contained in:
committed by
Hallvard Henriksen
parent
a19aacb7d9
commit
0610fc6f46
+1
-1
@@ -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
|
||||
|
||||
+3
-1
@@ -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";
|
||||
|
||||
+16
-2
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
@ECHO OFF
|
||||
call mvn clean package -Dmaven.test.skip=true
|
||||
java -jar target/flashy.jar
|
||||
pause
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
mvn clean package -Dmaven.test.skip=true
|
||||
java -jar target/flashy.jar
|
||||
@@ -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">
|
||||
|
||||
@@ -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).
|
||||
Reference in New Issue
Block a user