Improve performance of a status update
Additionally fixed a bug causing unnecessary warnings on the server
This commit is contained in:
parent
fa2a5d0b24
commit
08bd915f04
@ -15,11 +15,14 @@ import envoy.data.*;
|
||||
*/
|
||||
public final class ContactControl extends VBox {
|
||||
|
||||
private final Contact contact;
|
||||
|
||||
/**
|
||||
* @param contact the contact to display
|
||||
* @since Envoy Client v0.2-beta
|
||||
*/
|
||||
public ContactControl(Contact contact) {
|
||||
this.contact = contact;
|
||||
|
||||
// Name label
|
||||
final var nameLabel = new Label(contact.getName());
|
||||
@ -30,4 +33,19 @@ public final class ContactControl extends VBox {
|
||||
|
||||
getStyleClass().add("list-element");
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the info label of this {@code ContactControl} with an updated
|
||||
* version.
|
||||
* <p>
|
||||
* This method should be called when the status of the underlying user or the
|
||||
* size of the underlying group has changed.
|
||||
*
|
||||
* @since Envoy Client v0.3-beta
|
||||
* @apiNote will produce buggy results if contact control gets updated so that
|
||||
* the info label is no longer on index 1.
|
||||
*/
|
||||
public void replaceInfoLabel() {
|
||||
getChildren().set(1, contact instanceof User ? new UserStatusLabel((User) contact) : new GroupSizeLabel((Group) contact));
|
||||
}
|
||||
}
|
||||
|
@ -261,6 +261,8 @@ public final class ChatScene implements EventListener, Restorable {
|
||||
private void onUserStatusChange(UserStatusChange statusChange) {
|
||||
Platform.runLater(() -> {
|
||||
chatList.refresh();
|
||||
|
||||
// Replacing the display in the top bar
|
||||
if (currentChat != null && currentChat.getRecipient().getID() == statusChange.getID()) {
|
||||
topBarStatusLabel.getStyleClass().clear();
|
||||
topBarStatusLabel.setText(statusChange.get().toString());
|
||||
@ -718,10 +720,17 @@ public final class ChatScene implements EventListener, Restorable {
|
||||
|
||||
@Event(eventType = OwnStatusChange.class, priority = 50)
|
||||
private void generateOwnStatusControl() {
|
||||
final var ownUserControl = new ContactControl(localDB.getUser());
|
||||
ownUserControl.setAlignment(Pos.CENTER_LEFT);
|
||||
if (ownContactControl.getChildren().get(0) instanceof ContactControl) ownContactControl.getChildren().set(0, ownUserControl);
|
||||
else ownContactControl.getChildren().add(0, ownUserControl);
|
||||
|
||||
// Update the own user status if present
|
||||
if (ownContactControl.getChildren().get(0) instanceof ContactControl)
|
||||
((ContactControl) ownContactControl.getChildren().get(0)).replaceInfoLabel();
|
||||
else {
|
||||
|
||||
// Else prepend it to the HBox children
|
||||
final var ownUserControl = new ContactControl(localDB.getUser());
|
||||
ownUserControl.setAlignment(Pos.CENTER_LEFT);
|
||||
ownContactControl.getChildren().add(0, ownUserControl);
|
||||
}
|
||||
}
|
||||
|
||||
// Context menu actions
|
||||
|
@ -46,14 +46,19 @@ public final class UserUtil {
|
||||
|
||||
/**
|
||||
* Notifies the application that the status of the currently logged in user has
|
||||
* changed
|
||||
* changed.
|
||||
*
|
||||
* @param newStatus the new status
|
||||
* @since Envoy Client v0.3-beta
|
||||
*/
|
||||
public static void changeStatus(UserStatus newStatus) {
|
||||
EventBus.getInstance().dispatch(new OwnStatusChange(newStatus));
|
||||
if (Context.getInstance().getClient().isOnline())
|
||||
Context.getInstance().getClient().send(new UserStatusChange(Context.getInstance().getLocalDB().getUser().getID(), newStatus));
|
||||
|
||||
// Sending the already active status is a valid action
|
||||
if (newStatus.equals(Context.getInstance().getLocalDB().getUser().getStatus())) return;
|
||||
else {
|
||||
EventBus.getInstance().dispatch(new OwnStatusChange(newStatus));
|
||||
if (Context.getInstance().getClient().isOnline())
|
||||
Context.getInstance().getClient().send(new UserStatusChange(Context.getInstance().getLocalDB().getUser().getID(), newStatus));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user