From a8d127a1ae8e3e7c40ff9b8b34e5538876fc2dd7 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Tue, 3 Nov 2020 20:22:24 +0000 Subject: [PATCH] wip on messages ui --- .../main/groovy/com/muwire/core/Core.groovy | 2 +- .../core/messenger/MessageSentEvent.groovy | 1 + .../muwire/core/messenger/Messenger.groovy | 5 +- .../com/muwire/gui/MainFrameModel.groovy | 60 +++++++++++++++++++ .../views/com/muwire/gui/MainFrameView.groovy | 11 +++- 5 files changed, 75 insertions(+), 4 deletions(-) diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index 8644d82f..1c7ec12e 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -488,6 +488,7 @@ public class Core { log.info("initializing messenger") messenger = new Messenger(eventBus, home, i2pConnector, props) eventBus.with { + register(UILoadedEvent.class, messenger) register(MessageReceivedEvent.class, messenger) register(UIMessageEvent.class, messenger) } @@ -508,7 +509,6 @@ public class Core { feedManager.start() feedClient.start() trackerResponder.start() - messenger.start() } public void shutdown() { diff --git a/core/src/main/groovy/com/muwire/core/messenger/MessageSentEvent.groovy b/core/src/main/groovy/com/muwire/core/messenger/MessageSentEvent.groovy index 9705cdea..157409a8 100644 --- a/core/src/main/groovy/com/muwire/core/messenger/MessageSentEvent.groovy +++ b/core/src/main/groovy/com/muwire/core/messenger/MessageSentEvent.groovy @@ -3,4 +3,5 @@ package com.muwire.core.messenger import com.muwire.core.Event class MessageSentEvent extends Event { + MWMessage message } diff --git a/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy b/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy index ae898672..ef2e24b8 100644 --- a/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy +++ b/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy @@ -12,6 +12,7 @@ import java.util.logging.Level import com.muwire.core.EventBus import com.muwire.core.MuWireSettings import com.muwire.core.Persona +import com.muwire.core.UILoadedEvent import com.muwire.core.connection.Endpoint import com.muwire.core.connection.I2PConnector @@ -61,7 +62,7 @@ class Messenger { sent.mkdirs() } - public void start() { + public void onUILoadedEvent(UILoadedEvent e) { diskIO.execute({load()} as Runnable) } @@ -116,7 +117,7 @@ class Messenger { File f = new File(outbox, name) File target = new File(sent, name) Files.move(f.toPath(), target.toPath(), StandardCopyOption.ATOMIC_MOVE) - eventBus.publish(new MessageSentEvent()) + eventBus.publish(new MessageSentEvent(message : message)) } private static String deriveName(MWMessage message) { diff --git a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy index 0ad2daa8..266aceb2 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -51,6 +51,9 @@ import com.muwire.core.files.FileSharedEvent import com.muwire.core.files.FileUnsharedEvent import com.muwire.core.files.SideCarFileEvent import com.muwire.core.messenger.MWMessage +import com.muwire.core.messenger.MessageLoadedEvent +import com.muwire.core.messenger.MessageReceivedEvent +import com.muwire.core.messenger.MessageSentEvent import com.muwire.core.search.QueryEvent import com.muwire.core.search.SearchEvent import com.muwire.core.search.UIResultBatchEvent @@ -115,6 +118,12 @@ class MainFrameModel { def messageFolders = [trans("INBOX"), trans("OUTBOX"), trans("SENT")] List messageHeaders = new ArrayList<>() + Map> messageHeadersMap = new HashMap<>() + int folderIdx + + private final static int INBOX = 0 + private final static int OUTBOX = 1 + private final static int SENT = 2 boolean sessionRestored @@ -199,6 +208,10 @@ class MainFrameModel { shared = [] treeRoot = new DefaultMutableTreeNode() sharedTree = new DefaultTreeModel(treeRoot) + + messageHeadersMap.put(0, new LinkedHashSet<>()) + messageHeadersMap.put(1, new LinkedHashSet<>()) + messageHeadersMap.put(2, new LinkedHashSet<>()) Timer timer = new Timer("download-pumper", true) timer.schedule({ @@ -281,6 +294,9 @@ class MainFrameModel { core.eventBus.register(UICollectionCreatedEvent.class, this) core.eventBus.register(CollectionDownloadedEvent.class, this) core.eventBus.register(CollectionUnsharedEvent.class, this) + core.eventBus.register(MessageLoadedEvent.class, this) + core.eventBus.register(MessageReceivedEvent.class, this) + core.eventBus.register(MessageSentEvent.class, this) core.muOptions.watchedKeywords.each { core.eventBus.publish(new ContentControlEvent(term : it, regex: false, add: true)) @@ -815,4 +831,48 @@ class MainFrameModel { view.collectionFilesTable.model.fireTableDataChanged() } } + + void onMessageLoadedEvent(MessageLoadedEvent e) { + runInsideUIAsync { + int idx = 0 + switch(e.folder) { + case "inbox" : idx = INBOX; break + case "outbox" : idx = OUTBOX; break + case "sent" : idx = SENT; break + default : + throw new IllegalStateException("unknown folder $e.folder") + + } + + messageHeadersMap.get(idx).add(e.message) + if (idx == folderIdx) { + messageHeaders.clear() + messageHeaders.addAll(messageHeadersMap.get(idx)) + view.messageHeaderTable.model.fireTableDataChanged() + } + } + } + + void onMessageReceivedEvent(MessageReceivedEvent e) { + runInsideUIAsync { + messageHeadersMap.get(INBOX).add(e.message) + if (folderIdx == INBOX) { + messageHeaders.clear() + messageHeaders.addAll(messageHeadersMap.get(INBOX)) + view.messageHeaderTable.model.fireTableDataChanged() + } + } + } + + void onMessageSentEvent(MessageSentEvent e) { + runInsideUIAsync { + messageHeadersMap.get(OUTBOX).remove(e.message) + messageHeadersMap.get(SENT).add(e.message) + if (folderIdx != INBOX) { + messageHeaders.clear() + messageHeaders.addAll(messageHeadersMap.get(idx)) + view.messageHeaderTable.model.fireTableDataChanged() + } + } + } } \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index c716d6f4..5a7267cb 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -1226,7 +1226,16 @@ class MainFrameView { // messages tab - // TODO + messageFolderList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION) + messageFolderList.addListSelectionListener({ + int index = messageFolderList.getSelectedIndex() + if (index < 0) + index = 0 + model.folderIdx = index + model.messageHeaders.clear() + model.messageHeaders.addAll(model.messageHeadersMap.get(index)) + messageHeaderTable.model.fireTableDataChanged() + }) messageHeaderTable.rowSorter.addRowSorterListener({evt -> lastMessageHeaderTableSortEvent = evt}) messageHeaderTable.rowSorter.setSortsOnUpdates(true)