From 9cba46cd281c11954f6c058dfa53b53728072989 Mon Sep 17 00:00:00 2001 From: Arnaud Vergnet Date: Wed, 2 Dec 2020 10:55:55 +0100 Subject: [PATCH] feat: use User class in user list and allow selection --- .../insa/clavardator/ui/MainController.java | 3 ++ .../clavardator/ui/UserSelectedEvent.java | 7 +++ .../users/UserActiveIndicatorController.java | 31 +++++++++++ .../ui/users/UserListController.java | 48 ++++++++++++++--- .../ui/users/UserListItemCell.java | 26 ++++++++-- .../ui/users/UserListItemController.java | 51 +++++++++++++++++-- .../ui/users/userActiveIndicator.fxml | 16 ++++++ .../clavardator/ui/users/userListItem.fxml | 6 +-- 8 files changed, 170 insertions(+), 18 deletions(-) create mode 100644 src/main/java/fr/insa/clavardator/ui/UserSelectedEvent.java create mode 100644 src/main/java/fr/insa/clavardator/ui/users/UserActiveIndicatorController.java create mode 100644 src/main/resources/fr/insa/clavardator/ui/users/userActiveIndicator.fxml diff --git a/src/main/java/fr/insa/clavardator/ui/MainController.java b/src/main/java/fr/insa/clavardator/ui/MainController.java index b144c9f..19cea06 100644 --- a/src/main/java/fr/insa/clavardator/ui/MainController.java +++ b/src/main/java/fr/insa/clavardator/ui/MainController.java @@ -20,6 +20,9 @@ public class MainController implements Initializable { userListController.addRefreshUserListener(() -> { System.out.println("refresh event"); }); + userListController.addUserSelectedListener((user) -> { + System.out.println(user.getUsername()); + }); chatController.addAttachmentListener(() -> { System.out.println("attach event"); }); diff --git a/src/main/java/fr/insa/clavardator/ui/UserSelectedEvent.java b/src/main/java/fr/insa/clavardator/ui/UserSelectedEvent.java new file mode 100644 index 0000000..ee2aba5 --- /dev/null +++ b/src/main/java/fr/insa/clavardator/ui/UserSelectedEvent.java @@ -0,0 +1,7 @@ +package fr.insa.clavardator.ui; + +import fr.insa.clavardator.users.User; + +public interface UserSelectedEvent { + public void onSelected(User user); +} diff --git a/src/main/java/fr/insa/clavardator/ui/users/UserActiveIndicatorController.java b/src/main/java/fr/insa/clavardator/ui/users/UserActiveIndicatorController.java new file mode 100644 index 0000000..9a5c448 --- /dev/null +++ b/src/main/java/fr/insa/clavardator/ui/users/UserActiveIndicatorController.java @@ -0,0 +1,31 @@ +package fr.insa.clavardator.ui.users; + +import fr.insa.clavardator.users.ActiveUser; +import fr.insa.clavardator.users.User; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.shape.Circle; + +import java.net.URL; +import java.util.ResourceBundle; + +public class UserActiveIndicatorController implements Initializable { + + @FXML + private Circle circle; + + @Override + public void initialize(URL location, ResourceBundle resources) { + + } + + public void setUser(User user) { + circle.getStyleClass().clear(); + if (user instanceof ActiveUser) { + circle.getStyleClass().add("active-user-dot"); + } else { + circle.getStyleClass().add("inactive-user-dot"); + } + } + +} diff --git a/src/main/java/fr/insa/clavardator/ui/users/UserListController.java b/src/main/java/fr/insa/clavardator/ui/users/UserListController.java index af369bd..809acad 100644 --- a/src/main/java/fr/insa/clavardator/ui/users/UserListController.java +++ b/src/main/java/fr/insa/clavardator/ui/users/UserListController.java @@ -1,38 +1,72 @@ package fr.insa.clavardator.ui.users; import fr.insa.clavardator.ui.ButtonPressEvent; +import fr.insa.clavardator.ui.UserSelectedEvent; +import fr.insa.clavardator.users.ActiveUser; +import fr.insa.clavardator.users.PeerUser; +import fr.insa.clavardator.users.User; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.ListView; +import java.net.InetAddress; import java.net.URL; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; public class UserListController implements Initializable { + final private List refreshUserListeners; + final private List userSelectedListeners; @FXML - private ListView userList; - private List refreshUserListeners; + private ListView userList; + + public UserListController() { + super(); + refreshUserListeners = new ArrayList<>(); + userSelectedListeners = new ArrayList<>(); + } public void addRefreshUserListener(ButtonPressEvent listener) { refreshUserListeners.add(listener); } + public void addUserSelectedListener(UserSelectedEvent listener) { + userSelectedListeners.add(listener); + } + public void onRefreshUserListPress() { refreshUserListeners.forEach(ButtonPressEvent::onPress); } + private void onUserSelected(@org.jetbrains.annotations.NotNull User user) { + final User currentSelectedUser = userList.getSelectionModel().getSelectedItem(); + if (!user.equals(currentSelectedUser)) { + userList.getSelectionModel().select(user); + userSelectedListeners.forEach(l -> l.onSelected(user)); + } + } + @Override public void initialize(URL url, ResourceBundle rb) { - refreshUserListeners = new ArrayList<>(); - ObservableList activeList = FXCollections.observableArrayList( - "Julia", "Ian", "Sue", "Matthew", "Hannah", "Stephan", "Denise", "Julia", "Ian", "Sue", "Matthew", "Hannah", "Stephan", "Denise", "Julia", "Ian", "Sue", "Matthew", "Hannah", "Stephan", "Denise", "Julia", "Ian", "Sue", "Matthew", "Hannah", "Stephan", "Denise"); + ObservableList activeList = null; + try { + activeList = FXCollections.observableArrayList( + new PeerUser("Dodo"), + new ActiveUser("Coucou", InetAddress.getLocalHost()) + ); + } catch (UnknownHostException e) { + e.printStackTrace(); + } userList.setItems(activeList); - - userList.setCellFactory(listView -> new UserListItemCell()); + userList.setCellFactory(listView -> { + final UserListItemCell cell = new UserListItemCell(); + cell.setOnUserSelectedListener(this::onUserSelected); + return cell; + }); } } \ No newline at end of file diff --git a/src/main/java/fr/insa/clavardator/ui/users/UserListItemCell.java b/src/main/java/fr/insa/clavardator/ui/users/UserListItemCell.java index 3ed5460..382028e 100644 --- a/src/main/java/fr/insa/clavardator/ui/users/UserListItemCell.java +++ b/src/main/java/fr/insa/clavardator/ui/users/UserListItemCell.java @@ -1,28 +1,44 @@ package fr.insa.clavardator.ui.users; +import fr.insa.clavardator.ui.UserSelectedEvent; +import fr.insa.clavardator.users.User; import javafx.fxml.FXMLLoader; import javafx.scene.control.ListCell; import java.io.IOException; -public class UserListItemCell extends ListCell { +public class UserListItemCell extends ListCell { + + private UserSelectedEvent listener; public UserListItemCell() { setStyle("-fx-padding: 0px"); } + public void setOnUserSelectedListener(UserSelectedEvent listener) { + this.listener = listener; + } + @Override - protected void updateItem(String item, boolean empty) { + protected void updateItem(User item, boolean empty) { super.updateItem(item, empty); - if (item != null) { + if (!empty && item != null) { final FXMLLoader cellLoader = new FXMLLoader(getClass().getResource("userListItem.fxml")); try { setGraphic(cellLoader.load()); - final UserListItemController userListItemController = cellLoader.getController(); - userListItemController.setName(item); + UserListItemController userListItemController = cellLoader.getController(); + userListItemController.setUser(item); + userListItemController.setOnPressListener(() -> { + if (listener != null) { + listener.onSelected(item); + } + }); + userListItemController.setSelected(isSelected()); } catch (IOException e) { e.printStackTrace(); } + } else { + setGraphic(null); } } } diff --git a/src/main/java/fr/insa/clavardator/ui/users/UserListItemController.java b/src/main/java/fr/insa/clavardator/ui/users/UserListItemController.java index a1f2a09..2c59e87 100644 --- a/src/main/java/fr/insa/clavardator/ui/users/UserListItemController.java +++ b/src/main/java/fr/insa/clavardator/ui/users/UserListItemController.java @@ -1,9 +1,11 @@ package fr.insa.clavardator.ui.users; import com.jfoenix.controls.JFXButton; +import fr.insa.clavardator.ui.ButtonPressEvent; +import fr.insa.clavardator.users.ActiveUser; +import fr.insa.clavardator.users.User; import javafx.fxml.FXML; import javafx.fxml.Initializable; -import javafx.scene.control.Label; import java.net.URL; import java.util.ResourceBundle; @@ -12,12 +14,55 @@ public class UserListItemController implements Initializable { @FXML private JFXButton button; + @FXML + private UserActiveIndicatorController indicatorController; + + private ButtonPressEvent listener; + + private User user; + + public void setOnPressListener(ButtonPressEvent listener) { + this.listener = listener; + } + + public void onPress() { + if (listener != null) { + listener.onPress(); + } + } + + public void setSelected(boolean selected) { + if (selected) + setBackgroundSelected(); + else + resetBackground(); + } @Override public void initialize(URL location, ResourceBundle resources) { + resetBackground(); } - public void setName(String string) { - button.setText(string); + public void setUser(User user) { + this.user = user; + indicatorController.setUser(user); + button.setText(user.getUsername()); + resetBackground(); + } + + private void resetBackground() { + if (user != null && user instanceof ActiveUser) { + button.getStyleClass().remove("inactive-user-item"); + button.getStyleClass().add("active-user-item"); + } else { + button.getStyleClass().remove("active-user-item"); + button.getStyleClass().add("inactive-user-item"); + } + } + + private void setBackgroundSelected() { + button.getStyleClass().remove("inactive-user-item"); + button.getStyleClass().remove("active-user-item"); + button.getStyleClass().add("selected-user-item"); } } diff --git a/src/main/resources/fr/insa/clavardator/ui/users/userActiveIndicator.fxml b/src/main/resources/fr/insa/clavardator/ui/users/userActiveIndicator.fxml new file mode 100644 index 0000000..2001804 --- /dev/null +++ b/src/main/resources/fr/insa/clavardator/ui/users/userActiveIndicator.fxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/src/main/resources/fr/insa/clavardator/ui/users/userListItem.fxml b/src/main/resources/fr/insa/clavardator/ui/users/userListItem.fxml index e29ce2f..05ca7e2 100644 --- a/src/main/resources/fr/insa/clavardator/ui/users/userListItem.fxml +++ b/src/main/resources/fr/insa/clavardator/ui/users/userListItem.fxml @@ -2,14 +2,14 @@ - + + AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0" onAction="#onPress"> - +