Compare commits
No commits in common. "2fe0289f9f38d72a00cf80b168ec2bc4dcfb7beb" and "b75cd6de1ae0402687b074f13978f2d21719fabc" have entirely different histories.
2fe0289f9f
...
b75cd6de1a
13 changed files with 57 additions and 130 deletions
|
|
@ -1,60 +1,42 @@
|
||||||
package fr.insa.clavardator.chat;
|
package fr.insa.clavardator.chat;
|
||||||
|
|
||||||
import fr.insa.clavardator.db.DatabaseController;
|
import fr.insa.clavardator.db.DatabaseController;
|
||||||
import fr.insa.clavardator.users.CurrentUser;
|
import fr.insa.clavardator.users.User;
|
||||||
import fr.insa.clavardator.users.PeerUser;
|
|
||||||
import fr.insa.clavardator.users.UserList;
|
|
||||||
|
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.beans.PropertyChangeSupport;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
public class ChatHistory {
|
public class ChatHistory {
|
||||||
private final DatabaseController db;
|
private final DatabaseController db;
|
||||||
private final PeerUser user;
|
private final User user;
|
||||||
private final ArrayList<HistoryLoadedCallback> historyListener;
|
private ArrayList<Message> history = new ArrayList<>();
|
||||||
private final ArrayList<MessageAddedCallback> messageListener;
|
|
||||||
private ArrayList<Message> history;
|
|
||||||
|
|
||||||
public ChatHistory(PeerUser user) {
|
public ChatHistory(User user) {
|
||||||
this.user = user;
|
this.user = user;
|
||||||
db = new DatabaseController(user);
|
db = new DatabaseController(user);
|
||||||
this.historyListener = new ArrayList<>();
|
|
||||||
this.messageListener = new ArrayList<>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addHistoryLoadedListener(HistoryLoadedCallback listener) {
|
// Make this class observable
|
||||||
historyListener.add(listener);
|
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
|
||||||
|
|
||||||
|
public void addObserver(PropertyChangeListener listener) {
|
||||||
|
pcs.addPropertyChangeListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addMessageAddedListener(MessageAddedCallback listener) {
|
public void removeObserver(PropertyChangeListener listener) {
|
||||||
messageListener.add(listener);
|
pcs.removePropertyChangeListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notifyHistoryLoaded() {
|
|
||||||
historyListener.forEach(l -> l.onHistoryLoaded(history));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void notifyMessageAdded(Message message) {
|
private void getHistory() {
|
||||||
messageListener.forEach(l -> l.onMessageAdded(message));
|
db.getChatHistory(new Date(), new Date(), // TODO: put actual date
|
||||||
}
|
newHistory -> {
|
||||||
|
ArrayList<Message> oldHistory = history;
|
||||||
public void load() {
|
history = newHistory;
|
||||||
if (history == null) {
|
pcs.firePropertyChange("history", oldHistory, history); // Does this work?
|
||||||
// TODO remove after tests
|
});
|
||||||
CurrentUser currentUser = new CurrentUser("Moi", new UserList());
|
|
||||||
history = new ArrayList<>();
|
|
||||||
history.add(new Message(user, currentUser, "Coucou toi"));
|
|
||||||
history.add(new Message(currentUser, user, "Coucou " + user.getUsername()));
|
|
||||||
history.add(new Message(user, currentUser, "oui"));
|
|
||||||
history.add(new Message(currentUser, user, "merci"));
|
|
||||||
notifyHistoryLoaded();
|
|
||||||
// db.getChatHistory(new Date(), new Date(), // TODO: put actual date
|
|
||||||
// newHistory -> {
|
|
||||||
// history = newHistory;
|
|
||||||
// notifyHistoryLoaded();
|
|
||||||
// });
|
|
||||||
} else {
|
|
||||||
notifyHistoryLoaded();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -62,18 +44,12 @@ public class ChatHistory {
|
||||||
* @param message
|
* @param message
|
||||||
*/
|
*/
|
||||||
public void addMessage(Message message) {
|
public void addMessage(Message message) {
|
||||||
db.addMessage(message, () -> {
|
db.addMessage(message, new DatabaseController.MessageCallback() {
|
||||||
history.add(message);
|
@Override
|
||||||
notifyMessageAdded(message);
|
public void onMessageSaved(Message savedMessage) {
|
||||||
|
history.add(savedMessage);
|
||||||
|
pcs.firePropertyChange("history", null, history);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface MessageAddedCallback {
|
|
||||||
void onMessageAdded(Message message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface HistoryLoadedCallback {
|
|
||||||
void onHistoryLoaded(ArrayList<Message> history);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,6 @@ public class DatabaseController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface MessageCallback {
|
public interface MessageCallback {
|
||||||
void onMessageSaved();
|
void onMessageSaved(Message history);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package fr.insa.clavardator.ui;
|
||||||
|
|
||||||
import fr.insa.clavardator.ui.chat.ChatController;
|
import fr.insa.clavardator.ui.chat.ChatController;
|
||||||
import fr.insa.clavardator.ui.users.UserListController;
|
import fr.insa.clavardator.ui.users.UserListController;
|
||||||
import fr.insa.clavardator.users.CurrentUser;
|
|
||||||
import fr.insa.clavardator.users.UserList;
|
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.fxml.Initializable;
|
import javafx.fxml.Initializable;
|
||||||
|
|
||||||
|
|
@ -19,13 +17,11 @@ public class MainController implements Initializable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize(URL url, ResourceBundle rb) {
|
public void initialize(URL url, ResourceBundle rb) {
|
||||||
chatController.setCurrentUser(new CurrentUser("Moi", new UserList()));
|
|
||||||
userListController.addRefreshUserListener(() -> {
|
userListController.addRefreshUserListener(() -> {
|
||||||
System.out.println("refresh event");
|
System.out.println("refresh event");
|
||||||
});
|
});
|
||||||
userListController.addUserSelectedListener((user) -> {
|
userListController.addUserSelectedListener((user) -> {
|
||||||
System.out.println(user.getUsername());
|
System.out.println(user.getUsername());
|
||||||
chatController.setRemoteUser(user);
|
|
||||||
});
|
});
|
||||||
chatController.addAttachmentListener(() -> {
|
chatController.addAttachmentListener(() -> {
|
||||||
System.out.println("attach event");
|
System.out.println("attach event");
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package fr.insa.clavardator.ui;
|
package fr.insa.clavardator.ui;
|
||||||
|
|
||||||
import fr.insa.clavardator.users.PeerUser;
|
import fr.insa.clavardator.users.User;
|
||||||
|
|
||||||
public interface UserSelectedEvent {
|
public interface UserSelectedEvent {
|
||||||
void onSelected(PeerUser user);
|
public void onSelected(User user);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
package fr.insa.clavardator.ui.chat;
|
package fr.insa.clavardator.ui.chat;
|
||||||
|
|
||||||
import fr.insa.clavardator.chat.ChatHistory;
|
|
||||||
import fr.insa.clavardator.chat.Message;
|
import fr.insa.clavardator.chat.Message;
|
||||||
import fr.insa.clavardator.ui.ButtonPressEvent;
|
import fr.insa.clavardator.ui.ButtonPressEvent;
|
||||||
import fr.insa.clavardator.ui.NoSelectionModel;
|
import fr.insa.clavardator.ui.NoSelectionModel;
|
||||||
import fr.insa.clavardator.users.ActiveUser;
|
|
||||||
import fr.insa.clavardator.users.CurrentUser;
|
import fr.insa.clavardator.users.CurrentUser;
|
||||||
import fr.insa.clavardator.users.PeerUser;
|
import fr.insa.clavardator.users.PeerUser;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
|
|
@ -14,7 +12,6 @@ import javafx.fxml.Initializable;
|
||||||
import javafx.scene.control.ListView;
|
import javafx.scene.control.ListView;
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
public class ChatController implements Initializable {
|
public class ChatController implements Initializable {
|
||||||
|
|
@ -43,32 +40,25 @@ public class ChatController implements Initializable {
|
||||||
|
|
||||||
|
|
||||||
public void setCurrentUser(CurrentUser currentUser) {
|
public void setCurrentUser(CurrentUser currentUser) {
|
||||||
this.chatHeaderController.setCurrentUser(currentUser);
|
|
||||||
this.currentUser = currentUser;
|
this.currentUser = currentUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRemoteUser(PeerUser remoteUser) {
|
public void setRemoteUser(PeerUser remoteUser) {
|
||||||
this.remoteUser = remoteUser;
|
this.remoteUser = remoteUser;
|
||||||
this.chatHeaderController.setRemoteUser(remoteUser);
|
loadMessageList();
|
||||||
this.chatFooterController.setEnabled(remoteUser instanceof ActiveUser);
|
|
||||||
|
|
||||||
final ChatHistory history = remoteUser.getHistory();
|
|
||||||
history.addHistoryLoadedListener(this::onHistoryLoaded);
|
|
||||||
history.addMessageAddedListener(this::onMessageAdded);
|
|
||||||
history.load();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onHistoryLoaded(ArrayList<Message> messages) {
|
private void loadMessageList() {
|
||||||
messageList.setItems(FXCollections.observableArrayList(messages));
|
ObservableList<Message> messages = FXCollections.observableArrayList(
|
||||||
|
new Message(remoteUser, currentUser, "Messsssage 1"),
|
||||||
|
new Message(remoteUser, currentUser, "Messsssage 2"),
|
||||||
|
new Message(currentUser, remoteUser, "Messsssage 3"),
|
||||||
|
new Message(remoteUser, currentUser, "Messsssage 4")
|
||||||
|
);
|
||||||
|
messageList.setItems(messages);
|
||||||
messageList.scrollTo(messageList.getItems().size() - 1);
|
messageList.scrollTo(messageList.getItems().size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onMessageAdded(Message message) {
|
|
||||||
messageList.getItems().add(message);
|
|
||||||
messageList.scrollTo(messageList.getItems().size() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize(URL url, ResourceBundle rb) {
|
public void initialize(URL url, ResourceBundle rb) {
|
||||||
messageList.setItems(null);
|
messageList.setItems(null);
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
package fr.insa.clavardator.ui.chat;
|
package fr.insa.clavardator.ui.chat;
|
||||||
|
|
||||||
import fr.insa.clavardator.ui.ButtonPressEvent;
|
import fr.insa.clavardator.ui.ButtonPressEvent;
|
||||||
import javafx.fxml.FXML;
|
|
||||||
import javafx.fxml.Initializable;
|
import javafx.fxml.Initializable;
|
||||||
import javafx.scene.layout.HBox;
|
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -12,9 +10,6 @@ import java.util.ResourceBundle;
|
||||||
|
|
||||||
public class ChatFooterController implements Initializable {
|
public class ChatFooterController implements Initializable {
|
||||||
|
|
||||||
@FXML
|
|
||||||
private HBox container;
|
|
||||||
|
|
||||||
private List<ButtonPressEvent> attachmentListeners;
|
private List<ButtonPressEvent> attachmentListeners;
|
||||||
private List<ButtonPressEvent> sendListeners;
|
private List<ButtonPressEvent> sendListeners;
|
||||||
|
|
||||||
|
|
@ -32,10 +27,6 @@ public class ChatFooterController implements Initializable {
|
||||||
sendListeners.forEach(ButtonPressEvent::onPress);
|
sendListeners.forEach(ButtonPressEvent::onPress);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setEnabled(boolean enabled) {
|
|
||||||
container.setDisable(!enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize(URL location, ResourceBundle resources) {
|
public void initialize(URL location, ResourceBundle resources) {
|
||||||
attachmentListeners = new ArrayList<>();
|
attachmentListeners = new ArrayList<>();
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,7 @@
|
||||||
package fr.insa.clavardator.ui.chat;
|
package fr.insa.clavardator.ui.chat;
|
||||||
|
|
||||||
import fr.insa.clavardator.ui.ButtonPressEvent;
|
import fr.insa.clavardator.ui.ButtonPressEvent;
|
||||||
import fr.insa.clavardator.ui.users.UserActiveIndicatorController;
|
|
||||||
import fr.insa.clavardator.users.CurrentUser;
|
|
||||||
import fr.insa.clavardator.users.PeerUser;
|
|
||||||
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.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -15,18 +10,8 @@ import java.util.ResourceBundle;
|
||||||
|
|
||||||
public class ChatHeaderController implements Initializable {
|
public class ChatHeaderController implements Initializable {
|
||||||
|
|
||||||
@FXML
|
|
||||||
private Label currentUsernameLabel;
|
|
||||||
@FXML
|
|
||||||
private Label remoteUsernameLabel;
|
|
||||||
@FXML
|
|
||||||
private UserActiveIndicatorController indicatorController;
|
|
||||||
|
|
||||||
private List<ButtonPressEvent> editListeners;
|
private List<ButtonPressEvent> editListeners;
|
||||||
|
|
||||||
private CurrentUser currentUser;
|
|
||||||
private PeerUser remoteUser;
|
|
||||||
|
|
||||||
public void addEditListener(ButtonPressEvent listener) {
|
public void addEditListener(ButtonPressEvent listener) {
|
||||||
editListeners.add(listener);
|
editListeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
@ -42,16 +27,4 @@ public class ChatHeaderController implements Initializable {
|
||||||
public void initialize(URL location, ResourceBundle resources) {
|
public void initialize(URL location, ResourceBundle resources) {
|
||||||
editListeners = new ArrayList<>();
|
editListeners = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCurrentUser(CurrentUser currentUser) {
|
|
||||||
this.currentUser = currentUser;
|
|
||||||
currentUsernameLabel.setText(currentUser.getUsername());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRemoteUser(PeerUser remoteUser) {
|
|
||||||
this.remoteUser = remoteUser;
|
|
||||||
remoteUsernameLabel.setText(remoteUser.getUsername());
|
|
||||||
indicatorController.setUser(remoteUser);
|
|
||||||
indicatorController.setSize(10.0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,4 @@ public class UserActiveIndicatorController implements Initializable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSize(double value) {
|
|
||||||
circle.setRadius(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ public class UserListController implements Initializable {
|
||||||
final private List<ButtonPressEvent> refreshUserListeners;
|
final private List<ButtonPressEvent> refreshUserListeners;
|
||||||
final private List<UserSelectedEvent> userSelectedListeners;
|
final private List<UserSelectedEvent> userSelectedListeners;
|
||||||
@FXML
|
@FXML
|
||||||
private ListView<PeerUser> userList;
|
private ListView<User> userList;
|
||||||
|
|
||||||
public UserListController() {
|
public UserListController() {
|
||||||
super();
|
super();
|
||||||
|
|
@ -43,7 +43,7 @@ public class UserListController implements Initializable {
|
||||||
refreshUserListeners.forEach(ButtonPressEvent::onPress);
|
refreshUserListeners.forEach(ButtonPressEvent::onPress);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onUserSelected(@org.jetbrains.annotations.NotNull PeerUser user) {
|
private void onUserSelected(@org.jetbrains.annotations.NotNull User user) {
|
||||||
final User currentSelectedUser = userList.getSelectionModel().getSelectedItem();
|
final User currentSelectedUser = userList.getSelectionModel().getSelectedItem();
|
||||||
if (!user.equals(currentSelectedUser)) {
|
if (!user.equals(currentSelectedUser)) {
|
||||||
userList.getSelectionModel().select(user);
|
userList.getSelectionModel().select(user);
|
||||||
|
|
@ -53,7 +53,7 @@ public class UserListController implements Initializable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize(URL url, ResourceBundle rb) {
|
public void initialize(URL url, ResourceBundle rb) {
|
||||||
ObservableList<PeerUser> activeList = null;
|
ObservableList<User> activeList = null;
|
||||||
try {
|
try {
|
||||||
activeList = FXCollections.observableArrayList(
|
activeList = FXCollections.observableArrayList(
|
||||||
new PeerUser("Dodo0"),
|
new PeerUser("Dodo0"),
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
package fr.insa.clavardator.ui.users;
|
package fr.insa.clavardator.ui.users;
|
||||||
|
|
||||||
import fr.insa.clavardator.ui.UserSelectedEvent;
|
import fr.insa.clavardator.ui.UserSelectedEvent;
|
||||||
import fr.insa.clavardator.users.PeerUser;
|
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<PeerUser> {
|
public class UserListItemCell extends ListCell<User> {
|
||||||
|
|
||||||
private UserSelectedEvent listener;
|
private UserSelectedEvent listener;
|
||||||
|
|
||||||
|
|
@ -20,7 +20,7 @@ public class UserListItemCell extends ListCell<PeerUser> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void updateItem(PeerUser item, boolean empty) {
|
protected void updateItem(User item, boolean empty) {
|
||||||
super.updateItem(item, empty);
|
super.updateItem(item, empty);
|
||||||
if (!empty && item != null) {
|
if (!empty && item != null) {
|
||||||
final FXMLLoader cellLoader = new FXMLLoader(getClass().getResource("userListItem.fxml"));
|
final FXMLLoader cellLoader = new FXMLLoader(getClass().getResource("userListItem.fxml"));
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
<HBox xmlns="http://javafx.com/javafx"
|
<HBox xmlns="http://javafx.com/javafx"
|
||||||
xmlns:fx="http://javafx.com/fxml"
|
xmlns:fx="http://javafx.com/fxml"
|
||||||
fx:controller="fr.insa.clavardator.ui.chat.ChatFooterController"
|
fx:controller="fr.insa.clavardator.ui.chat.ChatFooterController"
|
||||||
stylesheets="@../styles.css" styleClass="container" alignment="CENTER" spacing="10.0" fx:id="container">
|
stylesheets="@../styles.css" styleClass="container" alignment="CENTER" spacing="10.0">
|
||||||
<padding>
|
<padding>
|
||||||
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
|
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
|
||||||
</padding>
|
</padding>
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
<Insets left="20" right="20"/>
|
<Insets left="20" right="20"/>
|
||||||
</padding>
|
</padding>
|
||||||
<Label text="Connecté en tant que : "/>
|
<Label text="Connecté en tant que : "/>
|
||||||
<Label text="<USERNAME>" fx:id="currentUsernameLabel"/>
|
<Label text="<USERNAME>"/>
|
||||||
<JFXButton mnemonicParsing="false" onMouseClicked="#onEditPress">
|
<JFXButton mnemonicParsing="false" onMouseClicked="#onEditPress">
|
||||||
<graphic>
|
<graphic>
|
||||||
<FontIcon iconLiteral="fas-user-edit" iconSize="24"/>
|
<FontIcon iconLiteral="fas-user-edit" iconSize="24"/>
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
<padding>
|
<padding>
|
||||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0"/>
|
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0"/>
|
||||||
</padding>
|
</padding>
|
||||||
<fx:include source="../users/userActiveIndicator.fxml" fx:id="indicator" />
|
<Circle radius="7.0" styleClass="active-user-dot"/>
|
||||||
<Label text="USER NAME" styleClass="current-user" fx:id="remoteUsernameLabel"/>
|
<Label text="USER NAME" styleClass="current-user"/>
|
||||||
</HBox>
|
</HBox>
|
||||||
</VBox>
|
</VBox>
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,16 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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.layout.*?>
|
||||||
|
|
||||||
<?import javafx.scene.shape.Circle?>
|
<?import javafx.scene.shape.Circle?>
|
||||||
<HBox xmlns="http://javafx.com/javafx"
|
<AnchorPane xmlns="http://javafx.com/javafx"
|
||||||
xmlns:fx="http://javafx.com/fxml"
|
xmlns:fx="http://javafx.com/fxml"
|
||||||
fx:controller="fr.insa.clavardator.ui.users.UserActiveIndicatorController"
|
fx:controller="fr.insa.clavardator.ui.users.UserActiveIndicatorController"
|
||||||
stylesheets="@../styles.css" alignment="CENTER">
|
stylesheets="@../styles.css"
|
||||||
|
styleClass="inner">
|
||||||
<Circle fx:id="circle" radius="5.0" styleClass="active-user-dot"/>
|
<Circle fx:id="circle" radius="5.0" styleClass="active-user-dot"/>
|
||||||
</HBox>
|
</AnchorPane>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue