From 08bd915f0473b61e9246637b7ff9f95bf6b78efc Mon Sep 17 00:00:00 2001 From: delvh Date: Sat, 10 Oct 2020 11:10:17 +0200 Subject: [PATCH] Improve performance of a status update Additionally fixed a bug causing unnecessary warnings on the server --- .../client/ui/control/ContactControl.java | 18 ++++++++++++++++++ .../envoy/client/ui/controller/ChatScene.java | 17 +++++++++++++---- .../main/java/envoy/client/util/UserUtil.java | 13 +++++++++---- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/client/src/main/java/envoy/client/ui/control/ContactControl.java b/client/src/main/java/envoy/client/ui/control/ContactControl.java index fea200c..93b33d1 100644 --- a/client/src/main/java/envoy/client/ui/control/ContactControl.java +++ b/client/src/main/java/envoy/client/ui/control/ContactControl.java @@ -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. + *

+ * 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)); + } } diff --git a/client/src/main/java/envoy/client/ui/controller/ChatScene.java b/client/src/main/java/envoy/client/ui/controller/ChatScene.java index d28afc0..da4323e 100644 --- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -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 diff --git a/client/src/main/java/envoy/client/util/UserUtil.java b/client/src/main/java/envoy/client/util/UserUtil.java index 2a41fd1..4f1b37b 100644 --- a/client/src/main/java/envoy/client/util/UserUtil.java +++ b/client/src/main/java/envoy/client/util/UserUtil.java @@ -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)); + } } }