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.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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue