From 7886d72a3939eb1a45463fa739909a1d5973035c Mon Sep 17 00:00:00 2001 From: Arnaud Vergnet Date: Mon, 7 Dec 2020 11:56:40 +0100 Subject: [PATCH] feat: show username dialog on app init --- .../ui/LoadingScreenController.java | 54 +++++++++ .../insa/clavardator/ui/MainController.java | 45 +++---- .../clavardator/ui/chat/ChatController.java | 13 +- .../dialogs/EditUsernameDialogController.java | 112 ++++++++++-------- .../insa/clavardator/users/CurrentUser.java | 3 +- .../fr/insa/clavardator/ui/chat/chat.fxml | 4 +- .../clavardator/ui/dialogs/aboutDialog.fxml | 2 +- .../ui/dialogs/editUsernameDialog.fxml | 2 +- .../fr/insa/clavardator/ui/loadingScreen.fxml | 20 ++++ .../fr/insa/clavardator/ui/scene.fxml | 9 +- 10 files changed, 175 insertions(+), 89 deletions(-) create mode 100644 src/main/java/fr/insa/clavardator/ui/LoadingScreenController.java create mode 100644 src/main/resources/fr/insa/clavardator/ui/loadingScreen.fxml diff --git a/src/main/java/fr/insa/clavardator/ui/LoadingScreenController.java b/src/main/java/fr/insa/clavardator/ui/LoadingScreenController.java new file mode 100644 index 0000000..d430d29 --- /dev/null +++ b/src/main/java/fr/insa/clavardator/ui/LoadingScreenController.java @@ -0,0 +1,54 @@ +package fr.insa.clavardator.ui; + +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Label; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; + +import java.net.URL; +import java.util.ResourceBundle; + +public class LoadingScreenController implements Initializable { + + + @FXML + public VBox indicatorOnlyContainer; + @FXML + public VBox labeledContainer; + @FXML + public Label loadingLabel; + @FXML + public StackPane container; + + public void show() { + container.setVisible(true); + setLabel(null); + } + + public void show(String label) { + container.setVisible(true); + setLabel(label); + } + + public void hide() { + container.setVisible(false); + } + + public void setLabel(String label) { + loadingLabel.setText(label); + final boolean showLabel = label != null && !label.isEmpty(); + labeledContainer.setVisible(showLabel); + indicatorOnlyContainer.setVisible(!showLabel); + } + + public ObservableList getRootStyle() { + return container.getStyleClass(); + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + show(); + } +} diff --git a/src/main/java/fr/insa/clavardator/ui/MainController.java b/src/main/java/fr/insa/clavardator/ui/MainController.java index bc73d82..829fed8 100644 --- a/src/main/java/fr/insa/clavardator/ui/MainController.java +++ b/src/main/java/fr/insa/clavardator/ui/MainController.java @@ -25,9 +25,7 @@ public class MainController implements Initializable { @FXML private StackPane root; @FXML - private VBox loadingContainer; - @FXML - private VBox loginContainer; + private StackPane mainContainer; @FXML private ToolbarController toolbarController; @@ -39,12 +37,20 @@ public class MainController implements Initializable { private UserListController userListController; @FXML private ChatController chatController; + @FXML + private LoadingScreenController loadingController; private JFXSnackbar snackbar; - private void openEditUsernameDialog() throws IOException { + private void openEditUsernameDialog(EditUsernameDialogController.Mode mode) { + editUserDialogController.setOnDismissListener(() -> { + if (mode == EditUsernameDialogController.Mode.INITIAL) { + System.exit(0); + } else { + showChat(); + } + }); editUserDialogController.setOnSuccessListener(() -> { - System.out.println("success"); try { final FXMLLoader loader = new FXMLLoader(getClass().getResource("dialogs/snackbar.fxml")); snackbar.enqueue(new JFXSnackbar.SnackbarEvent( @@ -57,21 +63,23 @@ public class MainController implements Initializable { e.printStackTrace(); } }); - editUserDialogController.show(root, EditUsernameDialogController.Mode.EDIT); + editUserDialogController.show(root, mode); } private void showChat() { - loadingContainer.setVisible(false); - loginContainer.setVisible(false); + loadingController.hide(); + mainContainer.setVisible(true); } - private void showLogin() { - loadingContainer.setVisible(false); - loginContainer.setVisible(true); + private void showLogin(boolean isError) { + mainContainer.setVisible(false); + loadingController.hide(); + openEditUsernameDialog(isError ? EditUsernameDialogController.Mode.ERROR : EditUsernameDialogController.Mode.INITIAL); } @Override public void initialize(URL url, ResourceBundle rb) { + loadingController.show("Initialisation de Clavardator..."); snackbar = new JFXSnackbar(root); Timer t = new Timer(); @@ -80,14 +88,15 @@ public class MainController implements Initializable { public void run() { Platform.runLater(() -> CurrentUser.getInstance().setState(CurrentUser.State.VALID)); } - }, 2000); + }, 3000); CurrentUser.getInstance().addObserver(propertyChangeEvent -> { if (propertyChangeEvent.getPropertyName().equals("state")) { - if (propertyChangeEvent.getNewValue().equals(CurrentUser.State.VALID)) + final CurrentUser.State state = (CurrentUser.State) propertyChangeEvent.getNewValue(); + if (state == CurrentUser.State.VALID) showChat(); else - showLogin(); + showLogin(state == CurrentUser.State.INVALID); } }); @@ -95,13 +104,7 @@ public class MainController implements Initializable { userListController.addUserSelectedListener((user) -> chatController.setRemoteUser(user)); chatController.addAttachmentListener(() -> System.out.println("attach event")); chatController.addSendListener((text) -> System.out.println("sent : " + text)); - toolbarController.addEditListener(() -> { - try { - openEditUsernameDialog(); - } catch (IOException e) { - e.printStackTrace(); - } - }); + toolbarController.addEditListener(() -> openEditUsernameDialog(EditUsernameDialogController.Mode.EDIT)); 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 0cbe2f9..153344d 100644 --- a/src/main/java/fr/insa/clavardator/ui/chat/ChatController.java +++ b/src/main/java/fr/insa/clavardator/ui/chat/ChatController.java @@ -3,6 +3,7 @@ package fr.insa.clavardator.ui.chat; import fr.insa.clavardator.chat.ChatHistory; import fr.insa.clavardator.chat.Message; import fr.insa.clavardator.ui.ButtonPressEvent; +import fr.insa.clavardator.ui.LoadingScreenController; import fr.insa.clavardator.ui.NoSelectionModel; import fr.insa.clavardator.users.ActiveUser; import fr.insa.clavardator.users.PeerUser; @@ -25,13 +26,13 @@ public class ChatController implements Initializable { private ChatFooterController chatFooterController; @FXML private ChatHeaderController chatHeaderController; + @FXML + private LoadingScreenController loadingController; @FXML private VBox chatContainer; @FXML private VBox emptyContainer; - @FXML - private VBox loadingContainer; private PeerUser remoteUser; @@ -74,12 +75,12 @@ public class ChatController implements Initializable { emptyContainer.setVisible(true); chatFooterController.setEnabled(false); chatContainer.setVisible(false); - loadingContainer.setVisible(false); + loadingController.hide(); messageList.setItems(null); break; case LOADING: chatContainer.setVisible(true); - loadingContainer.setVisible(true); + loadingController.show(); chatFooterController.setEnabled(false); emptyContainer.setVisible(false); break; @@ -87,13 +88,15 @@ public class ChatController implements Initializable { chatFooterController.setEnabled(true); chatContainer.setVisible(true); emptyContainer.setVisible(false); - loadingContainer.setVisible(false); + loadingController.hide(); break; } } @Override public void initialize(URL url, ResourceBundle rb) { + loadingController.getRootStyle().clear(); + loadingController.getRootStyle().add("inner"); messageList.setSelectionModel(new NoSelectionModel()); messageList.setCellFactory(listView -> new MessageListItemCell()); setState(State.INITIAL); diff --git a/src/main/java/fr/insa/clavardator/ui/dialogs/EditUsernameDialogController.java b/src/main/java/fr/insa/clavardator/ui/dialogs/EditUsernameDialogController.java index 2c23026..8a07505 100644 --- a/src/main/java/fr/insa/clavardator/ui/dialogs/EditUsernameDialogController.java +++ b/src/main/java/fr/insa/clavardator/ui/dialogs/EditUsernameDialogController.java @@ -3,7 +3,6 @@ package fr.insa.clavardator.ui.dialogs; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXDialog; import com.jfoenix.controls.JFXTextField; -import com.jfoenix.validation.RequiredFieldValidator; import com.jfoenix.validation.base.ValidatorBase; import fr.insa.clavardator.ui.ButtonPressEvent; import javafx.beans.property.ReadOnlyBooleanWrapper; @@ -42,53 +41,10 @@ public class EditUsernameDialogController implements Initializable { private State currentState; private Validator validator; private ButtonPressEvent successListener; + private ButtonPressEvent dismissListener; - public void setOnSuccessListener(ButtonPressEvent listener) { - this.successListener = listener; - } - - public void show(StackPane root, Mode mode) { - setLocked(false); - setFieldError(State.VALID); - setMode(mode); - dialog.show(root); - } - - public void hide() { - dialog.close(); - } - - public void onCancel() { - hide(); - } - - - private void setLocked(boolean state) { - confirmButton.setDisable(state); - cancelButton.setDisable(state); - dialog.setOverlayClose(!state); - textField.setDisable(state); - } - - private void onSuccess() { - setFieldError(State.VALID); - setLocked(false); - hide(); - successListener.onPress(); - } - - private void onError() { - validator.setMessage("Nom d'utilisateur invalide"); - setFieldError(State.INVALID); - setLocked(false); - } - - private void setFieldError(State state) { - currentState = state; - textField.validate(); - } - - public void onConfirm() { + @FXML + private void onConfirm() { setLocked(true); // TODO replace by network call Timer t = new Timer(); @@ -101,6 +57,45 @@ public class EditUsernameDialogController implements Initializable { }, 1000); } + @FXML + private void onCancel() { + hide(); + } + + public void setOnSuccessListener(ButtonPressEvent listener) { + this.successListener = listener; + } + + public void setOnDismissListener(ButtonPressEvent listener) { + this.dismissListener = listener; + } + + public void show(StackPane root, Mode mode) { + setLocked(false); + setFieldError(State.VALID); + setMode(mode); + dialog.show(root); + } + + public void hide() { + dialog.close(); + if (dismissListener != null) { + dismissListener.onPress(); + } + } + + private void setLocked(boolean state) { + confirmButton.setDisable(state); + cancelButton.setDisable(state); + dialog.setOverlayClose(!state); + textField.setDisable(state); + } + + private void setFieldError(State state) { + currentState = state; + textField.validate(); + } + public void onUsernameChange(ObservableValue observable, String oldText, String newText) { setFieldError(State.VALID); confirmButton.setDisable(newText.isEmpty()); @@ -109,14 +104,20 @@ public class EditUsernameDialogController implements Initializable { public void setMode(Mode mode) { switch (mode) { case INITIAL: + dialog.setOverlayClose(false); + cancelButton.setText("Quitter"); titleLabel.setText("Nom d'utilisateur"); - descriptionLabel.setText("Choisissez votre nom d'utilisateur. Vous pourrez le changer plus tard"); + descriptionLabel.setText("Choisissez votre nom d'utilisateur.\nVous pourrez le changer plus tard"); break; case ERROR: + dialog.setOverlayClose(false); + cancelButton.setText("Hors ligne"); titleLabel.setText("Nom d'utilisateur expiré"); - descriptionLabel.setText("Votre nom d'utilisateur n'est plus valide, merci d'en choisir un autre."); + descriptionLabel.setText("Votre nom d'utilisateur n'est plus valide.\nMerci d'en choisir un autre."); break; case EDIT: + dialog.setOverlayClose(true); + cancelButton.setText("Annuler"); titleLabel.setText("Changer le nom d'utilisateur"); descriptionLabel.setText("Entrez votre nouveau nom d'utilisateur"); break; @@ -133,6 +134,19 @@ public class EditUsernameDialogController implements Initializable { textField.getValidators().add(validator); } + private void onSuccess() { + setFieldError(State.VALID); + setLocked(false); + hide(); + successListener.onPress(); + } + + private void onError() { + validator.setMessage("Nom d'utilisateur invalide"); + setFieldError(State.INVALID); + setLocked(false); + } + public enum Mode { INITIAL, diff --git a/src/main/java/fr/insa/clavardator/users/CurrentUser.java b/src/main/java/fr/insa/clavardator/users/CurrentUser.java index e1d2e57..33be8fa 100644 --- a/src/main/java/fr/insa/clavardator/users/CurrentUser.java +++ b/src/main/java/fr/insa/clavardator/users/CurrentUser.java @@ -46,6 +46,7 @@ public class CurrentUser extends User { public enum State { UNINITIALIZED, VALID, - INVALID + INVALID, + NONE } } 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 40cb05a..c73d9f3 100644 --- a/src/main/resources/fr/insa/clavardator/ui/chat/chat.fxml +++ b/src/main/resources/fr/insa/clavardator/ui/chat/chat.fxml @@ -14,9 +14,7 @@ - - - + diff --git a/src/main/resources/fr/insa/clavardator/ui/dialogs/aboutDialog.fxml b/src/main/resources/fr/insa/clavardator/ui/dialogs/aboutDialog.fxml index 291fafc..d229e9b 100644 --- a/src/main/resources/fr/insa/clavardator/ui/dialogs/aboutDialog.fxml +++ b/src/main/resources/fr/insa/clavardator/ui/dialogs/aboutDialog.fxml @@ -16,7 +16,7 @@ prefHeight="400" styleClass="container"> - + diff --git a/src/main/resources/fr/insa/clavardator/ui/dialogs/editUsernameDialog.fxml b/src/main/resources/fr/insa/clavardator/ui/dialogs/editUsernameDialog.fxml index 479b5a6..f275507 100644 --- a/src/main/resources/fr/insa/clavardator/ui/dialogs/editUsernameDialog.fxml +++ b/src/main/resources/fr/insa/clavardator/ui/dialogs/editUsernameDialog.fxml @@ -16,7 +16,7 @@ prefHeight="400" styleClass="container"> - + diff --git a/src/main/resources/fr/insa/clavardator/ui/loadingScreen.fxml b/src/main/resources/fr/insa/clavardator/ui/loadingScreen.fxml new file mode 100644 index 0000000..a87eb72 --- /dev/null +++ b/src/main/resources/fr/insa/clavardator/ui/loadingScreen.fxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/src/main/resources/fr/insa/clavardator/ui/scene.fxml b/src/main/resources/fr/insa/clavardator/ui/scene.fxml index 58391ab..3de1c96 100644 --- a/src/main/resources/fr/insa/clavardator/ui/scene.fxml +++ b/src/main/resources/fr/insa/clavardator/ui/scene.fxml @@ -1,7 +1,6 @@ - - - - - - - - +