feat: use User class in user list and allow selection
This commit is contained in:
parent
45e07299e9
commit
9cba46cd28
8 changed files with 170 additions and 18 deletions
|
@ -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");
|
||||
});
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
package fr.insa.clavardator.ui;
|
||||
|
||||
import fr.insa.clavardator.users.User;
|
||||
|
||||
public interface UserSelectedEvent {
|
||||
public void onSelected(User user);
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
});
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue