1
0
Fork 0
mirror of https://gitlab.com/kauron/jstudy synced 2024-12-22 16:33:33 +01:00

Added option to repeat question immediately until gotten right

This commit is contained in:
Carlos Galindo 2019-09-10 15:14:50 +02:00
parent 8d6b99bd59
commit 674ed9d7cf
Signed by: kauron
GPG key ID: 83E68706DEE119A3
5 changed files with 48 additions and 19 deletions

View file

@ -10,15 +10,16 @@ import java.util.ResourceBundle;
public class SettingsController implements Initializable { public class SettingsController implements Initializable {
@FXML @FXML
private JFXCheckBox repeatMistakes, showFeedback; private JFXCheckBox repeatMistakes, showFeedback, repeatImmediately;
@Override @Override
public void initialize(URL location, ResourceBundle resources) { public void initialize(URL location, ResourceBundle resources) {
repeatMistakes.setSelected(AppConfig.repeatWrong); repeatImmediately.disableProperty().bind(repeatMistakes.selectedProperty().not());
repeatMistakes.selectedProperty().addListener((observable, old, value) -> AppConfig.repeatWrong = value); repeatImmediately.selectedProperty().bindBidirectional(AppConfig.repeatImmediately);
showFeedback.setSelected(AppConfig.showFeedback); repeatMistakes.selectedProperty().bindBidirectional(AppConfig.repeatWrong);
showFeedback.selectedProperty().addListener((observable, old, value) -> AppConfig.showFeedback = value); showFeedback.selectedProperty().bindBidirectional(AppConfig.showFeedback);
repeatMistakes.selectedProperty().addListener((obj, o, n) -> {
if (!n) repeatImmediately.setSelected(false);
});
} }
} }

View file

@ -2,10 +2,12 @@ package es.kauron.jstudy.controller;
import es.kauron.jstudy.model.AppConfig; import es.kauron.jstudy.model.AppConfig;
import es.kauron.jstudy.model.TestItem; import es.kauron.jstudy.model.TestItem;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar; import javafx.scene.control.ProgressBar;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
@ -24,13 +26,17 @@ public class TestController implements Initializable {
private ProgressBar progress; private ProgressBar progress;
@FXML @FXML
private HBox feedback; private HBox feedback;
@FXML
private Button skipButton;
private SimpleBooleanProperty correctingError = new SimpleBooleanProperty(false);
private List<TestItem> list; private List<TestItem> list;
private int total, current = -1; private int total, current = -1;
private int done = 0, errors = 0; private int done = 0, errors = 0;
@Override @Override
public void initialize(URL url, ResourceBundle resourceBundle) { public void initialize(URL url, ResourceBundle resourceBundle) {
skipButton.disableProperty().bind(correctingError);
} }
void setList(List<TestItem> list) { void setList(List<TestItem> list) {
@ -59,29 +65,42 @@ public class TestController implements Initializable {
} }
// Remove the question from the pool if the question was correctly answered or there is no repetition // Remove the question from the pool if the question was correctly answered or there is no repetition
if (right || !AppConfig.repeatWrong) { if ((right && !correctingError.get()) || !AppConfig.repeatWrong.get()) {
list.remove(current); list.remove(current);
progress.setProgress(++done / (double) total); progress.setProgress(++done / (double) total);
progressLabel.setText(done + "/" + total); progressLabel.setText(done + "/" + total);
if (list.size() == 0) { if (list.size() == 0) {
onEndAction(event); onEndAction(null);
return; return;
} }
chooseQuestion();
} else if (!AppConfig.repeatImmediately.get()) {
chooseQuestion();
} }
onSkipAction(event); correctingError.set(!right && AppConfig.repeatImmediately.get());
setQuestion();
} }
@FXML private void chooseQuestion() {
private void onSkipAction(ActionEvent event) {
answer.setText(""); answer.setText("");
int previous = current; int previous = current;
do do
current = (int) (Math.random() * list.size()); current = (int) (Math.random() * list.size());
while (list.size() > 1 && current == previous); while (list.size() > 1 && current == previous);
}
private void setQuestion() {
answer.setText("");
question.setText(list.get(current).getQuestion()); question.setText(list.get(current).getQuestion());
answer.requestFocus(); answer.requestFocus();
} }
@FXML
private void onSkipAction(ActionEvent event) {
chooseQuestion();
setQuestion();
}
@FXML @FXML
private void onEndAction(ActionEvent event) { private void onEndAction(ActionEvent event) {
answer.setText(""); answer.setText("");

View file

@ -1,17 +1,21 @@
package es.kauron.jstudy.model; package es.kauron.jstudy.model;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import java.io.File; import java.io.File;
import java.util.prefs.BackingStoreException; import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
public class AppConfig { public class AppConfig {
public static boolean repeatWrong, showFeedback; public static BooleanProperty repeatWrong, showFeedback, repeatImmediately;
public static File lastDir; public static File lastDir;
public static void save() { public static void save() {
Preferences prefs = Preferences.userRoot(); Preferences prefs = Preferences.userRoot();
prefs.putBoolean("repeatWrong", repeatWrong); prefs.putBoolean("repeatWrong", repeatWrong.get());
prefs.putBoolean("showFeedback", showFeedback); prefs.putBoolean("showFeedback", showFeedback.get());
prefs.putBoolean("repeatImmediately", repeatImmediately.get());
prefs.put("lastDir", lastDir == null ? "" : lastDir.getAbsolutePath()); prefs.put("lastDir", lastDir == null ? "" : lastDir.getAbsolutePath());
try { try {
prefs.flush(); prefs.flush();
@ -22,8 +26,12 @@ public class AppConfig {
public static void load() { public static void load() {
Preferences prefs = Preferences.userRoot(); Preferences prefs = Preferences.userRoot();
repeatWrong = prefs.getBoolean("repeatWrong", true); repeatWrong = new SimpleBooleanProperty(prefs.getBoolean("repeatWrong", true));
showFeedback = prefs.getBoolean("showFeedback", true); showFeedback = new SimpleBooleanProperty(prefs.getBoolean("showFeedback", true));
repeatImmediately = new SimpleBooleanProperty(prefs.getBoolean("repeatImmediately", false));
repeatWrong.addListener((obj, o, n) -> save());
showFeedback.addListener((obj, o, n) -> save());
repeatImmediately.addListener((obj, o, n) -> save());
String dirPath = prefs.get("lastDir", ""); String dirPath = prefs.get("lastDir", "");
if (!dirPath.isEmpty()) lastDir = new File(dirPath); if (!dirPath.isEmpty()) lastDir = new File(dirPath);
} }

View file

@ -6,6 +6,7 @@
<VBox alignment="CENTER_LEFT" spacing="15.0" xmlns="http://javafx.com/javafx/8.0.76-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="es.kauron.jstudy.controller.SettingsController"> <VBox alignment="CENTER_LEFT" spacing="15.0" xmlns="http://javafx.com/javafx/8.0.76-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="es.kauron.jstudy.controller.SettingsController">
<children> <children>
<JFXCheckBox fx:id="repeatMistakes" text="_Repeat mistakes" /> <JFXCheckBox fx:id="repeatMistakes" text="_Repeat mistakes" />
<JFXCheckBox fx:id="repeatImmediately" text="_Always repeat immediatly"/>
<JFXCheckBox fx:id="showFeedback" disable="true" layoutX="237.0" layoutY="201.0" text="Show _feedback while testing" /> <JFXCheckBox fx:id="showFeedback" disable="true" layoutX="237.0" layoutY="201.0" text="Show _feedback while testing" />
</children> </children>
<padding> <padding>

View file

@ -64,7 +64,7 @@
<VBox alignment="TOP_RIGHT" spacing="10.0" BorderPane.alignment="CENTER"> <VBox alignment="TOP_RIGHT" spacing="10.0" BorderPane.alignment="CENTER">
<children> <children>
<Button defaultButton="true" focusTraversable="false" onAction="#onNextAction" prefWidth="110.0" text="_Next" /> <Button defaultButton="true" focusTraversable="false" onAction="#onNextAction" prefWidth="110.0" text="_Next" />
<Button cancelButton="true" focusTraversable="false" onAction="#onSkipAction" prefWidth="110.0" text="_Skip question" /> <Button cancelButton="true" focusTraversable="false" onAction="#onSkipAction" prefWidth="110.0" text="_Skip question" fx:id="skipButton"/>
<Button cancelButton="true" focusTraversable="false" layoutX="10.0" layoutY="48.0" onAction="#onEndAction" prefWidth="110.0" text="_End test" /> <Button cancelButton="true" focusTraversable="false" layoutX="10.0" layoutY="48.0" onAction="#onEndAction" prefWidth="110.0" text="_End test" />
</children> </children>
<BorderPane.margin> <BorderPane.margin>