From 4ba39b3cc35983c55cbfa228cdf3decc804d8703 Mon Sep 17 00:00:00 2001 From: Arnaud Vergnet Date: Sun, 6 Dec 2020 15:34:25 +0100 Subject: [PATCH] feat: show loading indicator on chat change --- .../fr/insa/clavardator/chat/ChatHistory.java | 11 ++++- .../insa/clavardator/ui/MainController.java | 21 +++------ .../clavardator/ui/chat/ChatController.java | 43 ++++++++++++++++++- .../fr/insa/clavardator/ui/chat/chat.fxml | 25 ++++++++--- 4 files changed, 75 insertions(+), 25 deletions(-) diff --git a/src/main/java/fr/insa/clavardator/chat/ChatHistory.java b/src/main/java/fr/insa/clavardator/chat/ChatHistory.java index 3a0b46e..2652f8e 100644 --- a/src/main/java/fr/insa/clavardator/chat/ChatHistory.java +++ b/src/main/java/fr/insa/clavardator/chat/ChatHistory.java @@ -3,8 +3,11 @@ package fr.insa.clavardator.chat; import fr.insa.clavardator.db.DatabaseController; import fr.insa.clavardator.users.CurrentUser; import fr.insa.clavardator.users.PeerUser; +import javafx.application.Platform; import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; public class ChatHistory { private final DatabaseController db; @@ -51,7 +54,13 @@ public class ChatHistory { // notifyHistoryLoaded(); // }); } - notifyHistoryLoaded(); + Timer t = new Timer(); + t.schedule(new TimerTask() { + @Override + public void run() { + Platform.runLater(() -> notifyHistoryLoaded()); + } + }, 1000); } diff --git a/src/main/java/fr/insa/clavardator/ui/MainController.java b/src/main/java/fr/insa/clavardator/ui/MainController.java index 9b3ddac..80d9dac 100644 --- a/src/main/java/fr/insa/clavardator/ui/MainController.java +++ b/src/main/java/fr/insa/clavardator/ui/MainController.java @@ -56,19 +56,10 @@ public class MainController implements Initializable { @Override public void initialize(URL url, ResourceBundle rb) { snackbar = new JFXSnackbar(root); - userListController.addRefreshUserListener(() -> { - System.out.println("refresh event"); - }); - userListController.addUserSelectedListener((user) -> { - System.out.println(user.getUsername()); - chatController.setRemoteUser(user); - }); - chatController.addAttachmentListener(() -> { - System.out.println("attach event"); - }); - chatController.addSendListener(() -> { - System.out.println("send event"); - }); + userListController.addRefreshUserListener(() -> System.out.println("refresh event")); + userListController.addUserSelectedListener((user) -> chatController.setRemoteUser(user)); + chatController.addAttachmentListener(() -> System.out.println("attach event")); + chatController.addSendListener(() -> System.out.println("send event")); toolbarController.addEditListener(() -> { try { openEditUsernameDialog(); @@ -76,8 +67,6 @@ public class MainController implements Initializable { e.printStackTrace(); } }); - toolbarController.addAboutListener(() -> { - aboutDialogController.show(root); - }); + toolbarController.addAboutListener(() -> aboutDialogController.show(root)); } } diff --git a/src/main/java/fr/insa/clavardator/ui/chat/ChatController.java b/src/main/java/fr/insa/clavardator/ui/chat/ChatController.java index 4d03b8a..891f38f 100644 --- a/src/main/java/fr/insa/clavardator/ui/chat/ChatController.java +++ b/src/main/java/fr/insa/clavardator/ui/chat/ChatController.java @@ -10,9 +10,11 @@ import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.ListView; +import javafx.scene.layout.VBox; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.ResourceBundle; public class ChatController implements Initializable { @@ -24,6 +26,13 @@ public class ChatController implements Initializable { @FXML private ChatHeaderController chatHeaderController; + @FXML + private VBox chatContainer; + @FXML + private VBox emptyContainer; + @FXML + private VBox loadingContainer; + public void addAttachmentListener(ButtonPressEvent listener) { chatFooterController.addAttachmentListener(listener); } @@ -34,7 +43,7 @@ public class ChatController implements Initializable { public void setRemoteUser(PeerUser remoteUser) { this.chatHeaderController.setRemoteUser(remoteUser); - this.chatFooterController.setEnabled(remoteUser instanceof ActiveUser); + setState(State.LOADING); final ChatHistory history = remoteUser.getHistory(); history.addHistoryLoadedListener(this::onHistoryLoaded); @@ -45,6 +54,7 @@ public class ChatController implements Initializable { private void onHistoryLoaded(ArrayList messages) { messageList.setItems(FXCollections.observableArrayList(messages)); messageList.scrollTo(messageList.getItems().size() - 1); + setState(State.DONE); } private void onMessageAdded(Message message) { @@ -52,12 +62,41 @@ public class ChatController implements Initializable { messageList.scrollTo(messageList.getItems().size() - 1); } + private void setState(State state) { + switch (state) { + case INITIAL: + emptyContainer.setVisible(true); + chatFooterController.setEnabled(false); + chatContainer.setVisible(false); + loadingContainer.setVisible(false); + messageList.setItems(null); + break; + case LOADING: + chatContainer.setVisible(true); + loadingContainer.setVisible(true); + chatFooterController.setEnabled(false); + emptyContainer.setVisible(false); + break; + case DONE: + chatFooterController.setEnabled(true); + chatContainer.setVisible(true); + emptyContainer.setVisible(false); + loadingContainer.setVisible(false); + break; + } + } @Override public void initialize(URL url, ResourceBundle rb) { - messageList.setItems(null); messageList.setSelectionModel(new NoSelectionModel()); messageList.setCellFactory(listView -> new MessageListItemCell()); + setState(State.INITIAL); + } + + private enum State { + INITIAL, + LOADING, + DONE } } \ No newline at end of file diff --git a/src/main/resources/fr/insa/clavardator/ui/chat/chat.fxml b/src/main/resources/fr/insa/clavardator/ui/chat/chat.fxml index e379348..40cb05a 100644 --- a/src/main/resources/fr/insa/clavardator/ui/chat/chat.fxml +++ b/src/main/resources/fr/insa/clavardator/ui/chat/chat.fxml @@ -3,13 +3,26 @@ + + - - - - - + + + + + + + + + + + + + + + +