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(() -> {
|
userListController.addRefreshUserListener(() -> {
|
||||||
System.out.println("refresh event");
|
System.out.println("refresh event");
|
||||||
});
|
});
|
||||||
|
userListController.addUserSelectedListener((user) -> {
|
||||||
|
System.out.println(user.getUsername());
|
||||||
|
});
|
||||||
chatController.addAttachmentListener(() -> {
|
chatController.addAttachmentListener(() -> {
|
||||||
System.out.println("attach event");
|
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;
|
package fr.insa.clavardator.ui.users;
|
||||||
|
|
||||||
import fr.insa.clavardator.ui.ButtonPressEvent;
|
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.FXCollections;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
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 java.net.InetAddress;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
public class UserListController implements Initializable {
|
public class UserListController implements Initializable {
|
||||||
|
|
||||||
|
final private List<ButtonPressEvent> refreshUserListeners;
|
||||||
|
final private List<UserSelectedEvent> userSelectedListeners;
|
||||||
@FXML
|
@FXML
|
||||||
private ListView<String> userList;
|
private ListView<User> userList;
|
||||||
private List<ButtonPressEvent> refreshUserListeners;
|
|
||||||
|
public UserListController() {
|
||||||
|
super();
|
||||||
|
refreshUserListeners = new ArrayList<>();
|
||||||
|
userSelectedListeners = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
public void addRefreshUserListener(ButtonPressEvent listener) {
|
public void addRefreshUserListener(ButtonPressEvent listener) {
|
||||||
refreshUserListeners.add(listener);
|
refreshUserListeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addUserSelectedListener(UserSelectedEvent listener) {
|
||||||
|
userSelectedListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
public void onRefreshUserListPress() {
|
public void onRefreshUserListPress() {
|
||||||
refreshUserListeners.forEach(ButtonPressEvent::onPress);
|
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
|
@Override
|
||||||
public void initialize(URL url, ResourceBundle rb) {
|
public void initialize(URL url, ResourceBundle rb) {
|
||||||
refreshUserListeners = new ArrayList<>();
|
ObservableList<User> activeList = null;
|
||||||
ObservableList<String> activeList = FXCollections.observableArrayList(
|
try {
|
||||||
"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");
|
activeList = FXCollections.observableArrayList(
|
||||||
|
new PeerUser("Dodo"),
|
||||||
|
new ActiveUser("Coucou", InetAddress.getLocalHost())
|
||||||
|
);
|
||||||
|
} catch (UnknownHostException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
userList.setItems(activeList);
|
userList.setItems(activeList);
|
||||||
|
userList.setCellFactory(listView -> {
|
||||||
userList.setCellFactory(listView -> new UserListItemCell());
|
final UserListItemCell cell = new UserListItemCell();
|
||||||
|
cell.setOnUserSelectedListener(this::onUserSelected);
|
||||||
|
return cell;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,28 +1,44 @@
|
||||||
package fr.insa.clavardator.ui.users;
|
package fr.insa.clavardator.ui.users;
|
||||||
|
|
||||||
|
import fr.insa.clavardator.ui.UserSelectedEvent;
|
||||||
|
import fr.insa.clavardator.users.User;
|
||||||
import javafx.fxml.FXMLLoader;
|
import javafx.fxml.FXMLLoader;
|
||||||
import javafx.scene.control.ListCell;
|
import javafx.scene.control.ListCell;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class UserListItemCell extends ListCell<String> {
|
public class UserListItemCell extends ListCell<User> {
|
||||||
|
|
||||||
|
private UserSelectedEvent listener;
|
||||||
|
|
||||||
public UserListItemCell() {
|
public UserListItemCell() {
|
||||||
setStyle("-fx-padding: 0px");
|
setStyle("-fx-padding: 0px");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setOnUserSelectedListener(UserSelectedEvent listener) {
|
||||||
|
this.listener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void updateItem(String item, boolean empty) {
|
protected void updateItem(User item, boolean empty) {
|
||||||
super.updateItem(item, empty);
|
super.updateItem(item, empty);
|
||||||
if (item != null) {
|
if (!empty && item != null) {
|
||||||
final FXMLLoader cellLoader = new FXMLLoader(getClass().getResource("userListItem.fxml"));
|
final FXMLLoader cellLoader = new FXMLLoader(getClass().getResource("userListItem.fxml"));
|
||||||
try {
|
try {
|
||||||
setGraphic(cellLoader.load());
|
setGraphic(cellLoader.load());
|
||||||
final UserListItemController userListItemController = cellLoader.getController();
|
UserListItemController userListItemController = cellLoader.getController();
|
||||||
userListItemController.setName(item);
|
userListItemController.setUser(item);
|
||||||
|
userListItemController.setOnPressListener(() -> {
|
||||||
|
if (listener != null) {
|
||||||
|
listener.onSelected(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
userListItemController.setSelected(isSelected());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
setGraphic(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
package fr.insa.clavardator.ui.users;
|
package fr.insa.clavardator.ui.users;
|
||||||
|
|
||||||
import com.jfoenix.controls.JFXButton;
|
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.FXML;
|
||||||
import javafx.fxml.Initializable;
|
import javafx.fxml.Initializable;
|
||||||
import javafx.scene.control.Label;
|
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
@ -12,12 +14,55 @@ public class UserListItemController implements Initializable {
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private JFXButton button;
|
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
|
@Override
|
||||||
public void initialize(URL location, ResourceBundle resources) {
|
public void initialize(URL location, ResourceBundle resources) {
|
||||||
|
resetBackground();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String string) {
|
public void setUser(User user) {
|
||||||
button.setText(string);
|
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 com.jfoenix.controls.JFXButton?>
|
||||||
<?import javafx.scene.layout.*?>
|
<?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"
|
<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"
|
fx:controller="fr.insa.clavardator.ui.users.UserListItemController" stylesheets="@../styles.css"
|
||||||
styleClass="inner">
|
styleClass="inner">
|
||||||
<JFXButton fx:id="button" alignment="CENTER_LEFT" AnchorPane.bottomAnchor="0" AnchorPane.leftAnchor="0"
|
<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>
|
<graphic>
|
||||||
<Circle radius="5.0" styleClass="active-user-dot"/>
|
<fx:include source="userActiveIndicator.fxml" fx:id="indicator"/>
|
||||||
</graphic>
|
</graphic>
|
||||||
</JFXButton>
|
</JFXButton>
|
||||||
</AnchorPane>
|
</AnchorPane>
|
||||||
|
|
Loading…
Reference in a new issue