feat: show loading indicator on chat change

This commit is contained in:
Arnaud Vergnet 2020-12-06 15:34:25 +01:00
parent 93924d1bbd
commit 4ba39b3cc3
4 changed files with 75 additions and 25 deletions

View file

@ -3,8 +3,11 @@ package fr.insa.clavardator.chat;
import fr.insa.clavardator.db.DatabaseController; import fr.insa.clavardator.db.DatabaseController;
import fr.insa.clavardator.users.CurrentUser; import fr.insa.clavardator.users.CurrentUser;
import fr.insa.clavardator.users.PeerUser; import fr.insa.clavardator.users.PeerUser;
import javafx.application.Platform;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
public class ChatHistory { public class ChatHistory {
private final DatabaseController db; private final DatabaseController db;
@ -51,7 +54,13 @@ public class ChatHistory {
// notifyHistoryLoaded(); // notifyHistoryLoaded();
// }); // });
} }
notifyHistoryLoaded(); Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
Platform.runLater(() -> notifyHistoryLoaded());
}
}, 1000);
} }

View file

@ -56,19 +56,10 @@ public class MainController implements Initializable {
@Override @Override
public void initialize(URL url, ResourceBundle rb) { public void initialize(URL url, ResourceBundle rb) {
snackbar = new JFXSnackbar(root); snackbar = new JFXSnackbar(root);
userListController.addRefreshUserListener(() -> { userListController.addRefreshUserListener(() -> System.out.println("refresh event"));
System.out.println("refresh event"); userListController.addUserSelectedListener((user) -> chatController.setRemoteUser(user));
}); chatController.addAttachmentListener(() -> System.out.println("attach event"));
userListController.addUserSelectedListener((user) -> { chatController.addSendListener(() -> System.out.println("send event"));
System.out.println(user.getUsername());
chatController.setRemoteUser(user);
});
chatController.addAttachmentListener(() -> {
System.out.println("attach event");
});
chatController.addSendListener(() -> {
System.out.println("send event");
});
toolbarController.addEditListener(() -> { toolbarController.addEditListener(() -> {
try { try {
openEditUsernameDialog(); openEditUsernameDialog();
@ -76,8 +67,6 @@ public class MainController implements Initializable {
e.printStackTrace(); e.printStackTrace();
} }
}); });
toolbarController.addAboutListener(() -> { toolbarController.addAboutListener(() -> aboutDialogController.show(root));
aboutDialogController.show(root);
});
} }
} }

View file

@ -10,9 +10,11 @@ import javafx.collections.FXCollections;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.control.ListView; import javafx.scene.control.ListView;
import javafx.scene.layout.VBox;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class ChatController implements Initializable { public class ChatController implements Initializable {
@ -24,6 +26,13 @@ public class ChatController implements Initializable {
@FXML @FXML
private ChatHeaderController chatHeaderController; private ChatHeaderController chatHeaderController;
@FXML
private VBox chatContainer;
@FXML
private VBox emptyContainer;
@FXML
private VBox loadingContainer;
public void addAttachmentListener(ButtonPressEvent listener) { public void addAttachmentListener(ButtonPressEvent listener) {
chatFooterController.addAttachmentListener(listener); chatFooterController.addAttachmentListener(listener);
} }
@ -34,7 +43,7 @@ public class ChatController implements Initializable {
public void setRemoteUser(PeerUser remoteUser) { public void setRemoteUser(PeerUser remoteUser) {
this.chatHeaderController.setRemoteUser(remoteUser); this.chatHeaderController.setRemoteUser(remoteUser);
this.chatFooterController.setEnabled(remoteUser instanceof ActiveUser); setState(State.LOADING);
final ChatHistory history = remoteUser.getHistory(); final ChatHistory history = remoteUser.getHistory();
history.addHistoryLoadedListener(this::onHistoryLoaded); history.addHistoryLoadedListener(this::onHistoryLoaded);
@ -45,6 +54,7 @@ public class ChatController implements Initializable {
private void onHistoryLoaded(ArrayList<Message> messages) { private void onHistoryLoaded(ArrayList<Message> messages) {
messageList.setItems(FXCollections.observableArrayList(messages)); messageList.setItems(FXCollections.observableArrayList(messages));
messageList.scrollTo(messageList.getItems().size() - 1); messageList.scrollTo(messageList.getItems().size() - 1);
setState(State.DONE);
} }
private void onMessageAdded(Message message) { private void onMessageAdded(Message message) {
@ -52,12 +62,41 @@ public class ChatController implements Initializable {
messageList.scrollTo(messageList.getItems().size() - 1); 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 @Override
public void initialize(URL url, ResourceBundle rb) { public void initialize(URL url, ResourceBundle rb) {
messageList.setItems(null);
messageList.setSelectionModel(new NoSelectionModel<Message>()); messageList.setSelectionModel(new NoSelectionModel<Message>());
messageList.setCellFactory(listView -> new MessageListItemCell()); messageList.setCellFactory(listView -> new MessageListItemCell());
setState(State.INITIAL);
}
private enum State {
INITIAL,
LOADING,
DONE
} }
} }

View file

@ -3,13 +3,26 @@
<?import javafx.scene.control.ListView?> <?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<!--suppress JavaFxUnresolvedFxIdReference --> <!--suppress JavaFxUnresolvedFxIdReference -->
<?import javafx.scene.control.Label?>
<?import com.jfoenix.controls.JFXSpinner?>
<AnchorPane xmlns="http://javafx.com/javafx/11.0.1" <AnchorPane xmlns="http://javafx.com/javafx/11.0.1"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.insa.clavardator.ui.chat.ChatController" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.insa.clavardator.ui.chat.ChatController"
stylesheets="@../styles.css" styleClass="container"> stylesheets="@../styles.css" styleClass="container">
<VBox AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" <StackPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<fx:include source="chatHeader.fxml" fx:id="chatHeader"/> <VBox fx:id="chatContainer">
<ListView fx:id="messageList" VBox.vgrow="ALWAYS"/> <fx:include source="chatHeader.fxml" fx:id="chatHeader"/>
<fx:include source="chatFooter.fxml" fx:id="chatFooter"/> <StackPane VBox.vgrow="ALWAYS">
</VBox> <ListView fx:id="messageList"/>
<VBox alignment="CENTER" fx:id="loadingContainer" styleClass="inner">
<JFXSpinner />
</VBox>
</StackPane>
<fx:include source="chatFooter.fxml" fx:id="chatFooter"/>
</VBox>
<VBox alignment="CENTER" fx:id="emptyContainer" styleClass="container">
<Label>Cliquez sur utilisateur pour ouvrir la discussion</Label>
</VBox>
</StackPane>
</AnchorPane> </AnchorPane>