Added deepRefresh - mechanism
additionally fixed bug not updating messageList when a MessageStatusChange occurs (seriously, why did no one notice it before?)
This commit is contained in:
parent
def31ebc4d
commit
f13dc3f389
36
client/src/main/java/envoy/client/ui/ListViewRefresh.java
Normal file
36
client/src/main/java/envoy/client/ui/ListViewRefresh.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package envoy.client.ui;
|
||||||
|
|
||||||
|
import javafx.scene.control.ListCell;
|
||||||
|
import javafx.scene.control.ListView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a utility class that provides access to a refreshing mechanism for
|
||||||
|
* elements that were added without notifying the underlying {@link ListView}.
|
||||||
|
* <p>
|
||||||
|
* Project: <strong>envoy-client</strong><br>
|
||||||
|
* File: <strong>ListViewRefresh.java</strong><br>
|
||||||
|
* Created: <strong>16.07.2020</strong><br>
|
||||||
|
*
|
||||||
|
* @author Leon Hofmeister
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
*/
|
||||||
|
public class ListViewRefresh {
|
||||||
|
|
||||||
|
private ListViewRefresh() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deeply refreshes a {@code listview}, meaning it recomputes every single of
|
||||||
|
* its {@link ListCell}s.
|
||||||
|
* <p>
|
||||||
|
* While it does work, it is <b>not the most efficient algorithm</b> possible.
|
||||||
|
*
|
||||||
|
* @param toRefresh the listView to refresh
|
||||||
|
* @param <T> the type of its {@code listcells}
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
*/
|
||||||
|
public static <T> void deepRefresh(ListView<T> toRefresh) {
|
||||||
|
final var items = toRefresh.getItems();
|
||||||
|
toRefresh.setItems(null);
|
||||||
|
toRefresh.setItems(items);
|
||||||
|
}
|
||||||
|
}
|
@ -31,9 +31,7 @@ import envoy.client.data.audio.AudioRecorder;
|
|||||||
import envoy.client.event.MessageCreationEvent;
|
import envoy.client.event.MessageCreationEvent;
|
||||||
import envoy.client.net.Client;
|
import envoy.client.net.Client;
|
||||||
import envoy.client.net.WriteProxy;
|
import envoy.client.net.WriteProxy;
|
||||||
import envoy.client.ui.IconUtil;
|
import envoy.client.ui.*;
|
||||||
import envoy.client.ui.Restorable;
|
|
||||||
import envoy.client.ui.SceneContext;
|
|
||||||
import envoy.client.ui.listcell.ChatControl;
|
import envoy.client.ui.listcell.ChatControl;
|
||||||
import envoy.client.ui.listcell.ListCellFactory;
|
import envoy.client.ui.listcell.ListCellFactory;
|
||||||
import envoy.client.ui.listcell.MessageControl;
|
import envoy.client.ui.listcell.MessageControl;
|
||||||
@ -144,7 +142,7 @@ public final class ChatScene implements Restorable {
|
|||||||
} catch (final IOException e1) {
|
} catch (final IOException e1) {
|
||||||
logger.log(Level.WARNING, "Could not read current chat: ", e1);
|
logger.log(Level.WARNING, "Could not read current chat: ", e1);
|
||||||
}
|
}
|
||||||
Platform.runLater(() -> { messageList.refresh(); scrollToMessageListEnd(); });
|
Platform.runLater(() -> { ListViewRefresh.deepRefresh(messageList); scrollToMessageListEnd(); });
|
||||||
} else chat.incrementUnreadAmount();
|
} else chat.incrementUnreadAmount();
|
||||||
// Moving chat with most recent unreadMessages to the top
|
// Moving chat with most recent unreadMessages to the top
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
@ -158,8 +156,9 @@ public final class ChatScene implements Restorable {
|
|||||||
// Listen to message status changes
|
// Listen to message status changes
|
||||||
eventBus.register(MessageStatusChange.class, e -> localDB.getMessage(e.getID()).ifPresent(message -> {
|
eventBus.register(MessageStatusChange.class, e -> localDB.getMessage(e.getID()).ifPresent(message -> {
|
||||||
message.setStatus(e.get());
|
message.setStatus(e.get());
|
||||||
// Update UI if in current chat
|
// Update UI if in current chat and the current user was the sender of the
|
||||||
if (currentChat != null && message.getSenderID() == currentChat.getRecipient().getID()) Platform.runLater(messageList::refresh);
|
// message
|
||||||
|
if (currentChat != null && message.getSenderID() == client.getSender().getID()) Platform.runLater(messageList::refresh);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
eventBus.register(GroupMessageStatusChange.class, e -> localDB.getMessage(e.getID()).ifPresent(groupMessage -> {
|
eventBus.register(GroupMessageStatusChange.class, e -> localDB.getMessage(e.getID()).ifPresent(groupMessage -> {
|
||||||
@ -184,7 +183,7 @@ public final class ChatScene implements Restorable {
|
|||||||
switch (e.getOperationType()) {
|
switch (e.getOperationType()) {
|
||||||
case ADD:
|
case ADD:
|
||||||
localDB.getUsers().put(contact.getName(), contact);
|
localDB.getUsers().put(contact.getName(), contact);
|
||||||
Chat chat = contact instanceof User ? new Chat(contact) : new GroupChat(client.getSender(), contact);
|
final Chat chat = contact instanceof User ? new Chat(contact) : new GroupChat(client.getSender(), contact);
|
||||||
Platform.runLater(() -> chatList.getItems().add(chat));
|
Platform.runLater(() -> chatList.getItems().add(chat));
|
||||||
break;
|
break;
|
||||||
case REMOVE:
|
case REMOVE:
|
||||||
@ -499,7 +498,7 @@ public final class ChatScene implements Restorable {
|
|||||||
localDB.getChats().remove(currentChat);
|
localDB.getChats().remove(currentChat);
|
||||||
localDB.getChats().add(0, currentChat);
|
localDB.getChats().add(0, currentChat);
|
||||||
});
|
});
|
||||||
messageList.refresh();
|
ListViewRefresh.deepRefresh(messageList);
|
||||||
scrollToMessageListEnd();
|
scrollToMessageListEnd();
|
||||||
|
|
||||||
// Request a new ID generator if all IDs were used
|
// Request a new ID generator if all IDs were used
|
||||||
|
Reference in New Issue
Block a user