Skip to content
Snippets Groups Projects
Commit 8f0a99fa authored by Trym Hamer Gudvangen's avatar Trym Hamer Gudvangen
Browse files

refactor: modularize the passage pop up code

parent e6a7b42e
No related branches found
No related tags found
2 merge requests!34Feat/create story gui,!7Feat/part three
...@@ -3,30 +3,35 @@ package edu.ntnu.idatt2001.group_30.paths.view.components.pop_up; ...@@ -3,30 +3,35 @@ package edu.ntnu.idatt2001.group_30.paths.view.components.pop_up;
import edu.ntnu.idatt2001.group_30.paths.model.Link; import edu.ntnu.idatt2001.group_30.paths.model.Link;
import edu.ntnu.idatt2001.group_30.paths.model.Passage; import edu.ntnu.idatt2001.group_30.paths.model.Passage;
import edu.ntnu.idatt2001.group_30.paths.model.actions.Action; import edu.ntnu.idatt2001.group_30.paths.model.actions.Action;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import java.util.HashMap;
public class LinkPopUp { public class LinkPopUp {
private TextField textField; private TextField textField;
private TextField referenceField;
private Button saveButton; private Button saveButton;
private ObservableList<Passage> passages; private ObservableList<Passage> passages;
private ObservableList<Link> links; private ObservableList<Link> links;
private HashMap<String, Passage> passageHashMap;
private Link link; private Link link;
public LinkPopUp(ObservableList<Passage> passages, ObservableList<Link> links) { public LinkPopUp(ObservableList<Passage> passages, ObservableList<Link> links) {
this.passages = passages; this.passages = passages;
this.links = links; this.links = links;
this.passageHashMap = new HashMap<>();
textField = new TextField(); textField = new TextField();
textField.setPromptText("Enter the text of the link"); textField.setPromptText("Enter the text of the link");
referenceField = new TextField();
referenceField.setPromptText("Enter the reference of the link"); passages.forEach(passage -> passageHashMap.put(passage.getTitle(), passage));
ComboBox<String> reference = new ComboBox<>(FXCollections.observableArrayList(passageHashMap.keySet()));
reference.setPromptText("Select reference passage of the link");
saveButton = new Button("Save"); saveButton = new Button("Save");
...@@ -43,7 +48,7 @@ public class LinkPopUp { ...@@ -43,7 +48,7 @@ public class LinkPopUp {
new Label("Link Text:"), new Label("Link Text:"),
textField, textField,
new Label("Link Reference:"), new Label("Link Reference:"),
referenceField, reference,
new Label("Actions:"), new Label("Actions:"),
actionComboBox, actionComboBox,
addActionButton, addActionButton,
...@@ -61,11 +66,10 @@ public class LinkPopUp { ...@@ -61,11 +66,10 @@ public class LinkPopUp {
.withDialogSize(400, 500); .withDialogSize(400, 500);
saveButton.setOnAction(e -> { saveButton.setOnAction(e -> {
if (textField.getText().isBlank() || referenceField.getText().isBlank()) { if (textField.getText().isBlank() || reference.getValue() == null) {
AlertDialog.showWarning("The text or reference cannot be blank."); AlertDialog.showWarning("The text or reference cannot be blank.");
} else { } else {
link = new Link(textField.getText(), referenceField.getText()); link = new Link(textField.getText(), passageHashMap.get(reference.getValue()).getTitle());
popUp.close(); popUp.close();
} }
}); });
...@@ -73,6 +77,10 @@ public class LinkPopUp { ...@@ -73,6 +77,10 @@ public class LinkPopUp {
popUp.showAndWait(); popUp.showAndWait();
} }
/**
* This method retrieves the link created in the pop-up.
* @return Link created in pop-up, given as a Link object.
*/
public Link getLink() { public Link getLink() {
return link; return link;
} }
......
...@@ -2,9 +2,7 @@ package edu.ntnu.idatt2001.group_30.paths.view.components.pop_up; ...@@ -2,9 +2,7 @@ package edu.ntnu.idatt2001.group_30.paths.view.components.pop_up;
import edu.ntnu.idatt2001.group_30.paths.model.Passage; import edu.ntnu.idatt2001.group_30.paths.model.Passage;
import edu.ntnu.idatt2001.group_30.paths.model.Link; import edu.ntnu.idatt2001.group_30.paths.model.Link;
import edu.ntnu.idatt2001.group_30.paths.model.actions.Action;
import edu.ntnu.idatt2001.group_30.paths.view.components.table.LinkTable; import edu.ntnu.idatt2001.group_30.paths.view.components.table.LinkTable;
import edu.ntnu.idatt2001.group_30.paths.view.components.table.PassageTable;
import edu.ntnu.idatt2001.group_30.paths.view.components.table.TableDisplay; import edu.ntnu.idatt2001.group_30.paths.view.components.table.TableDisplay;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
...@@ -13,8 +11,6 @@ import javafx.scene.control.*; ...@@ -13,8 +11,6 @@ import javafx.scene.control.*;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import java.util.stream.Collectors;
/** /**
* This class contains a pop-up for creating a new passage. * This class contains a pop-up for creating a new passage.
* *
...@@ -22,19 +18,45 @@ import java.util.stream.Collectors; ...@@ -22,19 +18,45 @@ import java.util.stream.Collectors;
*/ */
public class PassagePopUp { public class PassagePopUp {
private final TextField titleField; private TextField titleField;
private final TextArea contentArea; private TextArea contentArea;
private final Button saveButton; private Button saveButton;
private final Button removeLinkButton; private Button removeLinkButton;
private final LinkTable<Link> linkTable; private Button addLinkButton;
private VBox content;
private LinkTable<Link> linkTable;
private final ObservableList<Passage> passages; private final ObservableList<Passage> passages;
private final ObservableList<Link> links; private final ObservableList<Link> links;
private Passage passage; private Passage passage;
private PopUp<VBox, ?> popUp;
public PassagePopUp(ObservableList<Passage> passages) { public PassagePopUp(ObservableList<Passage> passages) {
this.passages = passages; this.passages = passages;
this.links = FXCollections.observableArrayList(); this.links = FXCollections.observableArrayList();
initialize();
createPopUp();
}
/**
* This constructor allows a pre-existing passage to be edited.
* @param passages Other passages in the story, given as an ObservableList of passages.
* @param passage Passage to edit, given as a Passage object.
*/
public PassagePopUp(ObservableList<Passage> passages, Passage passage) {
this.passages = passages;
this.passage = passage;
this.links = FXCollections.observableArrayList(passage.getLinks());
initialize();
loadPassage(passage);
createPopUp();
}
private void initialize() {
setupUiComponents();
setupBehavior();
}
private void setupUiComponents() {
titleField = new TextField(); titleField = new TextField();
titleField.setPromptText("Enter the title of the passage"); titleField.setPromptText("Enter the title of the passage");
...@@ -53,17 +75,13 @@ public class PassagePopUp { ...@@ -53,17 +75,13 @@ public class PassagePopUp {
removeLinkButton = new Button("Remove Link"); removeLinkButton = new Button("Remove Link");
removeLinkButton.setDisable(true); removeLinkButton.setDisable(true);
removeLinkButton.setOnAction(e -> links.remove(linkTable.getSelectionModel().getSelectedItem())); addLinkButton = new Button("Add Link");
linkTable.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> if(passages.isEmpty()) addLinkButton.setDisable(true);
removeLinkButton.setDisable(newSelection == null));
Button addLinkButton = new Button("Add Link");
HBox linkTableButtonHBox = new HBox(addLinkButton, removeLinkButton); HBox linkTableButtonHBox = new HBox(addLinkButton, removeLinkButton);
linkTableButtonHBox.setAlignment(Pos.CENTER); linkTableButtonHBox.setAlignment(Pos.CENTER);
addLinkButton.setOnAction(e -> this.links.add(new LinkPopUp(passages, links).getLink())); content = new VBox(
VBox content = new VBox(
new Label("Passage Title:"), new Label("Passage Title:"),
titleField, titleField,
new Label("Passage Content:"), new Label("Passage Content:"),
...@@ -76,14 +94,22 @@ public class PassagePopUp { ...@@ -76,14 +94,22 @@ public class PassagePopUp {
content.setAlignment(Pos.CENTER); content.setAlignment(Pos.CENTER);
content.setSpacing(20); content.setSpacing(20);
}
private void setupBehavior() {
removeLinkButton.setOnAction(e -> links.remove(linkTable.getSelectionModel().getSelectedItem()));
linkTable.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) ->
removeLinkButton.setDisable(newSelection == null));
addLinkButton.setOnAction(e -> {
Link newLink = new LinkPopUp(this.passages, links).getLink();
if(newLink != null) {
this.links.add(newLink);
}
});
PopUp<VBox, ?> popUp = PopUp
.<VBox>create()
.withTitle("Create a Passage")
.withoutCloseButton()
.withContent(content)
.withDialogSize(400, 500);
;
saveButton.setOnAction(e -> { saveButton.setOnAction(e -> {
if (titleField.getText().isBlank() || contentArea.getText().isBlank()) { if (titleField.getText().isBlank() || contentArea.getText().isBlank()) {
...@@ -91,19 +117,34 @@ public class PassagePopUp { ...@@ -91,19 +117,34 @@ public class PassagePopUp {
} else { } else {
this.passage = new Passage(titleField.getText(), contentArea.getText()); this.passage = new Passage(titleField.getText(), contentArea.getText());
this.links.forEach(link -> this.passage.addLink(link));
//TODO: save the new passage //TODO: save the new passage
//TODO: add links from the table to the new passage //TODO: add links from the table to the new passage
popUp.close(); popUp.close();
} }
}); });
}
private void createPopUp() {
popUp = PopUp
.<VBox>create()
.withTitle("Create a Passage")
.withoutCloseButton()
.withContent(content)
.withDialogSize(400, 500);
popUp.showAndWait(); popUp.showAndWait();
} }
private void loadPassage(Passage passage) {
titleField.setText(passage.getTitle());
contentArea.setText(passage.getContent());
}
/** /**
* This method retrieves the passages created from the pop-up. * This method retrieves the passages created from the pop-up.
* @return Passags created, given as a List of Passage objects. * @return Passages created, given as a List of Passage objects.
*/ */
public Passage getPassage() { public Passage getPassage() {
return passage; return passage;
......
...@@ -8,6 +8,7 @@ import edu.ntnu.idatt2001.group_30.paths.model.Story; ...@@ -8,6 +8,7 @@ import edu.ntnu.idatt2001.group_30.paths.model.Story;
import static edu.ntnu.idatt2001.group_30.paths.PathsSingleton.INSTANCE; import static edu.ntnu.idatt2001.group_30.paths.PathsSingleton.INSTANCE;
import edu.ntnu.idatt2001.group_30.paths.view.components.common.DefaultText;
import edu.ntnu.idatt2001.group_30.paths.view.components.pop_up.AlertDialog; import edu.ntnu.idatt2001.group_30.paths.view.components.pop_up.AlertDialog;
import edu.ntnu.idatt2001.group_30.paths.view.components.pop_up.PassagePopUp; import edu.ntnu.idatt2001.group_30.paths.view.components.pop_up.PassagePopUp;
import edu.ntnu.idatt2001.group_30.paths.view.components.table.PassageTable; import edu.ntnu.idatt2001.group_30.paths.view.components.table.PassageTable;
...@@ -35,6 +36,7 @@ public class NewStoryView extends View<BorderPane> { ...@@ -35,6 +36,7 @@ public class NewStoryView extends View<BorderPane> {
private Story story; private Story story;
private final ObservableList<Passage> passages; private final ObservableList<Passage> passages;
private final Button removePassageButton; private final Button removePassageButton;
private final Button editPassageButton;
public NewStoryView() { public NewStoryView() {
...@@ -51,7 +53,7 @@ public class NewStoryView extends View<BorderPane> { ...@@ -51,7 +53,7 @@ public class NewStoryView extends View<BorderPane> {
passages = story == null ? FXCollections.observableArrayList() : passages = story == null ? FXCollections.observableArrayList() :
FXCollections.observableArrayList(story.getPassages()); FXCollections.observableArrayList(story.getPassages());
Text titleText = new Text("Create a new/edit a Story"); Text titleText = DefaultText.big("Create a new/edit a Story");
Text labelText = new Text("Story Title: "); Text labelText = new Text("Story Title: ");
TextField textField = new TextField(title); TextField textField = new TextField(title);
...@@ -59,6 +61,7 @@ public class NewStoryView extends View<BorderPane> { ...@@ -59,6 +61,7 @@ public class NewStoryView extends View<BorderPane> {
HBox titleBox = new HBox(labelText, textField); HBox titleBox = new HBox(labelText, textField);
titleBox.setSpacing(20);
textField.setOnKeyTyped(event -> { textField.setOnKeyTyped(event -> {
title = textField.getText(); title = textField.getText();
...@@ -85,8 +88,24 @@ public class NewStoryView extends View<BorderPane> { ...@@ -85,8 +88,24 @@ public class NewStoryView extends View<BorderPane> {
removePassageButton = new Button("Remove Passage"); removePassageButton = new Button("Remove Passage");
removePassageButton.setDisable(true); removePassageButton.setDisable(true);
removePassageButton.setOnAction(e -> passages.remove(passageTable.getSelectionModel().getSelectedItem())); removePassageButton.setOnAction(e -> passages.remove(passageTable.getSelectionModel().getSelectedItem()));
passageTable.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) ->
removePassageButton.setDisable(newSelection == null)); editPassageButton = new Button("Edit Passage");
editPassageButton.setDisable(true);
editPassageButton.setOnAction(e -> {
Passage selectedPassage = passageTable.getSelectionModel().getSelectedItem();
if (selectedPassage != null) {
Passage updatedPassage = new PassagePopUp(passages, selectedPassage).getPassage();
if(updatedPassage != null) {
passages.remove(selectedPassage);
passages.add(updatedPassage);
}
}
});
passageTable.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
removePassageButton.setDisable(newSelection == null);
editPassageButton.setDisable(newSelection == null);
});
Button addPassageButton = new Button(); Button addPassageButton = new Button();
...@@ -100,17 +119,20 @@ public class NewStoryView extends View<BorderPane> { ...@@ -100,17 +119,20 @@ public class NewStoryView extends View<BorderPane> {
System.err.println("Something is wrong with the trash image resource link"); System.err.println("Something is wrong with the trash image resource link");
} }
VBox editTableButtons = new VBox(addPassageButton, removePassageButton, editPassageButton);
editTableButtons.setAlignment(Pos.CENTER);
editTableButtons.setSpacing(20);
addPassageButton.setOnAction(event -> { addPassageButton.setOnAction(event -> {
if(passages.isEmpty()) { if(passages.isEmpty()) {
AlertDialog.showInformation("Every story needs an opening passage.", "The opening passage" + AlertDialog.showInformation("Every story needs an opening passage.", "The opening passage" +
" will by default be the first passage added."); " will by default be the first passage added.");
} }
PassagePopUp passagePopUp = new PassagePopUp(INSTANCE.getStory() == null ? PassagePopUp passagePopUp = new PassagePopUp(passages);
FXCollections.observableArrayList() : FXCollections.observableArrayList(INSTANCE.getStory().getPassages()));
if(passagePopUp.getPassage() != null) this.passages.addAll(passagePopUp.getPassage()); if(passagePopUp.getPassage() != null) this.passages.addAll(passagePopUp.getPassage());
}); });
Button saveButton = new Button("Save"); Button saveButton = new Button("Save Story");
saveButton.setOnAction(event -> { saveButton.setOnAction(event -> {
try { try {
newStoryController.addStory(title, passages); newStoryController.addStory(title, passages);
...@@ -121,7 +143,7 @@ public class NewStoryView extends View<BorderPane> { ...@@ -121,7 +143,7 @@ public class NewStoryView extends View<BorderPane> {
} }
}); });
VBox display = new VBox(titleText, titleBox, passageTable, addPassageButton, removePassageButton, saveButton); VBox display = new VBox(titleText, titleBox, passageTable, saveButton);
display.setAlignment(Pos.CENTER); display.setAlignment(Pos.CENTER);
display.setSpacing(10); display.setSpacing(10);
display.setPrefWidth(500); display.setPrefWidth(500);
...@@ -131,6 +153,8 @@ public class NewStoryView extends View<BorderPane> { ...@@ -131,6 +153,8 @@ public class NewStoryView extends View<BorderPane> {
getParentPane().setCenter(display); getParentPane().setCenter(display);
getParentPane().setBottom(backButton); getParentPane().setBottom(backButton);
getParentPane().setRight(editTableButtons);
getParentPane().getRight().setTranslateX(-50);
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment