feat: show loading indicator on chat change
This commit is contained in:
parent
93924d1bbd
commit
4ba39b3cc3
4 changed files with 75 additions and 25 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<Message> 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<Message>());
|
||||
messageList.setCellFactory(listView -> new MessageListItemCell());
|
||||
setState(State.INITIAL);
|
||||
}
|
||||
|
||||
private enum State {
|
||||
INITIAL,
|
||||
LOADING,
|
||||
DONE
|
||||
}
|
||||
|
||||
}
|
|
@ -3,13 +3,26 @@
|
|||
<?import javafx.scene.control.ListView?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<!--suppress JavaFxUnresolvedFxIdReference -->
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import com.jfoenix.controls.JFXSpinner?>
|
||||
<AnchorPane xmlns="http://javafx.com/javafx/11.0.1"
|
||||
xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.insa.clavardator.ui.chat.ChatController"
|
||||
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">
|
||||
<VBox fx:id="chatContainer">
|
||||
<fx:include source="chatHeader.fxml" fx:id="chatHeader"/>
|
||||
<ListView fx:id="messageList" VBox.vgrow="ALWAYS"/>
|
||||
<StackPane VBox.vgrow="ALWAYS">
|
||||
<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>
|
||||
|
|
Loading…
Reference in a new issue