feat: use User class in user list and allow selection

This commit is contained in:
Arnaud Vergnet 2020-12-02 10:55:55 +01:00
parent 45e07299e9
commit 9cba46cd28
8 changed files with 170 additions and 18 deletions

View file

@ -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");
});

View file

@ -0,0 +1,7 @@
package fr.insa.clavardator.ui;
import fr.insa.clavardator.users.User;
public interface UserSelectedEvent {
public void onSelected(User user);
}

View file

@ -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");
}
}
}

View file

@ -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<ButtonPressEvent> refreshUserListeners;
final private List<UserSelectedEvent> userSelectedListeners;
@FXML
private ListView<String> userList;
private List<ButtonPressEvent> refreshUserListeners;
private ListView<User> 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<String> 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<User> 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;
});
}
}

View file

@ -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<String> {
public class UserListItemCell extends ListCell<User> {
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);
}
}
}

View file

@ -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");
}
}

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.Circle?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="fr.insa.clavardator.ui.users.UserActiveIndicatorController"
stylesheets="@../styles.css"
styleClass="inner">
<Circle fx:id="circle" radius="5.0" styleClass="active-user-dot"/>
</AnchorPane>

View file

@ -2,14 +2,14 @@
<?import com.jfoenix.controls.JFXButton?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.Circle?>
<!--suppress JavaFxUnresolvedFxIdReference -->
<AnchorPane prefHeight="40.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="fr.insa.clavardator.ui.users.UserListItemController" stylesheets="@../styles.css"
styleClass="inner">
<JFXButton fx:id="button" alignment="CENTER_LEFT" AnchorPane.bottomAnchor="0" AnchorPane.leftAnchor="0"
AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0">
AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0" onAction="#onPress">
<graphic>
<Circle radius="5.0" styleClass="active-user-dot"/>
<fx:include source="userActiveIndicator.fxml" fx:id="indicator"/>
</graphic>
</JFXButton>
</AnchorPane>