unread status column

pull/53/head
Zlatin Balevsky 2020-11-05 18:45:57 +00:00
parent 22c0e483c3
commit 92b616a58b
No known key found for this signature in database
GPG Key ID: A72832072D525E41
8 changed files with 84 additions and 21 deletions

View File

@ -84,6 +84,7 @@ import com.muwire.core.messenger.Messenger
import com.muwire.core.messenger.UIDownloadAttachmentEvent
import com.muwire.core.messenger.UIMessageDeleteEvent
import com.muwire.core.messenger.UIMessageEvent
import com.muwire.core.messenger.UIMessageReadEvent
import com.muwire.core.search.BrowseManager
import com.muwire.core.search.QueryEvent
import com.muwire.core.search.ResponderCache
@ -495,6 +496,7 @@ public class Core {
register(MessageReceivedEvent.class, messenger)
register(UIMessageEvent.class, messenger)
register(UIMessageDeleteEvent.class, messenger)
register(UIMessageReadEvent.class, messenger)
}
}

View File

@ -5,4 +5,5 @@ import com.muwire.core.Event
class MessageLoadedEvent extends Event {
MWMessage message
int folder
boolean unread
}

View File

@ -96,7 +96,8 @@ class Messenger {
message = new MWMessage(it)
}
addMessage(message, dest)
eventBus.publish(new MessageLoadedEvent(message : message, folder : folder))
File unread = new File(file, deriveUnread(message))
eventBus.publish(new MessageLoadedEvent(message : message, folder : folder, unread : unread.exists()))
}
}
@ -109,6 +110,13 @@ class Messenger {
diskIO.execute({persist(e.message, outbox)})
}
synchronized void onUIMessageReadEvent(UIMessageReadEvent e) {
diskIO.execute({
File unread = new File(inbox, deriveUnread(e.message))
unread.delete()
})
}
private void persist(MWMessage message, File folder) {
File f = new File(folder, deriveName(message))
f.withOutputStream {
@ -126,8 +134,16 @@ class Messenger {
}
private static String deriveName(MWMessage message) {
namePrefix(message) + ".mwmessage"
}
private static String deriveUnread(MWMessage message) {
namePrefix(message) + ".unread"
}
private static String namePrefix(MWMessage message) {
String ih = Base64.encode(message.getInfoHash().getRoot())
"${ih}_${message.sender.getHumanReadableName()}_${message.timestamp}.mwmessage"
"${ih}_${message.sender.getHumanReadableName()}_${message.timestamp}"
}
private synchronized void send() {
@ -165,7 +181,11 @@ class Messenger {
public synchronized void onMessageReceivedEvent(MessageReceivedEvent e) {
inboxMessages.add(e.message)
diskIO.execute({persist(e.message, inbox)})
diskIO.execute({
File unread = new File(inbox, deriveUnread(e.message))
unread.createNewFile()
persist(e.message, inbox)
})
}
private boolean deliverTo(MWMessage message, Persona recipient) {

View File

@ -0,0 +1,7 @@
package com.muwire.core.messenger
import com.muwire.core.Event
class UIMessageReadEvent extends Event {
MWMessage message
}

View File

@ -8,6 +8,7 @@ import griffon.metadata.ArtifactProviderFor
import net.i2p.crypto.DSAEngine
import net.i2p.data.Base64
import net.i2p.data.Signature
import net.i2p.data.i2cp.MessageStatusMessage
import java.awt.Desktop
import java.awt.Toolkit
@ -47,6 +48,7 @@ import com.muwire.core.messenger.MWMessage
import com.muwire.core.messenger.MWMessageAttachment
import com.muwire.core.messenger.UIDownloadAttachmentEvent
import com.muwire.core.messenger.UIMessageDeleteEvent
import com.muwire.core.messenger.UIMessageReadEvent
import com.muwire.core.search.QueryEvent
import com.muwire.core.search.SearchEvent
import com.muwire.core.trust.RemoteTrustList
@ -57,6 +59,7 @@ import com.muwire.core.trust.TrustSubscriptionEvent
import com.muwire.core.upload.HashListUploader
import com.muwire.core.upload.Uploader
import com.muwire.core.util.DataUtil
import com.muwire.gui.MainFrameModel.MWMessageStatus
@ArtifactProviderFor(GriffonController)
class MainFrameController {
@ -794,7 +797,7 @@ class MainFrameController {
int row = view.selectedMessageHeader()
if (row < 0)
return
MWMessage msg = model.messageHeaders.get(row)
MWMessage msg = model.messageHeaders.get(row).message
def params = [:]
params.reply = msg
@ -808,7 +811,7 @@ class MainFrameController {
int row = view.selectedMessageHeader()
if (row < 0)
return
MWMessage msg = model.messageHeaders.get(row)
MWMessage msg = model.messageHeaders.get(row).message
Set<Persona> all = new HashSet<>()
all.add(msg.sender)
@ -826,7 +829,7 @@ class MainFrameController {
int row = view.selectedMessageHeader()
if (row < 0)
return
MWMessage msg = model.messageHeaders.get(row)
MWMessage msg = model.messageHeaders.get(row).message
model.deleteMessage(msg)
core.eventBus.publish(new UIMessageDeleteEvent(message : msg, folder : model.folderIdx))
}
@ -879,12 +882,17 @@ class MainFrameController {
doDownloadAttachments(model.messageAttachments)
}
void markMessageRead(MWMessageStatus status) {
status.status = false
model.core.eventBus.publish(new UIMessageReadEvent(message : status.message))
}
private void doDownloadAttachments(List attachments) {
int messageRow = view.selectedMessageHeader()
if (messageRow < 0)
return
MWMessage message = model.messageHeaders.get(messageRow)
MWMessage message = model.messageHeaders.get(messageRow).message
attachments.each {
if (it instanceof MWMessageAttachment)
core.eventBus.publish(new UIDownloadAttachmentEvent(attachment : it, sender : message.sender))

View File

@ -586,6 +586,7 @@ DOWNLOAD_ALL=Download All
COLLECTION=Collection
## New message window
UNREAD=Unread
RECIPIENTS=Recipients
RECIPIENTS_TITLE=Drag and drop recipients from your contacts
SEND=Send

View File

@ -118,8 +118,8 @@ class MainFrameModel {
def feedItems = []
def messageFolders = [trans("INBOX"), trans("OUTBOX"), trans("SENT")]
List<MWMessage> messageHeaders = new ArrayList<>()
Map<Integer, Set<MWMessage>> messageHeadersMap = new HashMap<>()
List<MWMessageStatus> messageHeaders = new ArrayList<>()
Map<Integer, Set<MWMessageStatus>> messageHeadersMap = new HashMap<>()
int folderIdx
List<Object> messageAttachments = new ArrayList<>()
@ -833,7 +833,7 @@ class MainFrameModel {
}
void addToOutbox(MWMessage message) {
messageHeadersMap.get(Messenger.OUTBOX).add(message)
messageHeadersMap.get(Messenger.OUTBOX).add(new MWMessageStatus(message, false))
if (folderIdx == Messenger.OUTBOX) {
messageHeaders.clear()
messageHeaders.addAll(messageHeadersMap.get(Messenger.OUTBOX))
@ -843,7 +843,7 @@ class MainFrameModel {
void onMessageLoadedEvent(MessageLoadedEvent e) {
runInsideUIAsync {
messageHeadersMap.get(e.folder).add(e.message)
messageHeadersMap.get(e.folder).add(new MWMessageStatus(e.message, e.unread))
if (e.folder == folderIdx) {
messageHeaders.clear()
messageHeaders.addAll(messageHeadersMap.get(folderIdx))
@ -854,7 +854,7 @@ class MainFrameModel {
void onMessageReceivedEvent(MessageReceivedEvent e) {
runInsideUIAsync {
messageHeadersMap.get(Messenger.INBOX).add(e.message)
messageHeadersMap.get(Messenger.INBOX).add(new MWMessageStatus(e.message, true))
if (folderIdx == Messenger.INBOX) {
messageHeaders.clear()
messageHeaders.addAll(messageHeadersMap.get(Messenger.INBOX))
@ -865,8 +865,9 @@ class MainFrameModel {
void onMessageSentEvent(MessageSentEvent e) {
runInsideUIAsync {
messageHeadersMap.get(Messenger.OUTBOX).remove(e.message)
messageHeadersMap.get(Messenger.SENT).add(e.message)
MWMessageStatus status = new MWMessageStatus(e.message, false)
messageHeadersMap.get(Messenger.OUTBOX).remove(status)
messageHeadersMap.get(Messenger.SENT).add(status)
if (folderIdx != Messenger.INBOX) {
messageHeaders.clear()
messageHeaders.addAll(messageHeadersMap.get(folderIdx))
@ -876,10 +877,29 @@ class MainFrameModel {
}
void deleteMessage(MWMessage message) {
messageHeadersMap.get(folderIdx).remove(message)
messageHeaders.remove(message)
MWMessageStatus status = new MWMessageStatus(message, false)
messageHeadersMap.get(folderIdx).remove(status)
messageHeaders.remove(status)
view.messageHeaderTable.model.fireTableDataChanged()
view.messageBody.setText("")
view.messageSplitPane.setDividerLocation(1.0d)
}
static class MWMessageStatus {
private final MWMessage message
private boolean status
MWMessageStatus(MWMessage message, boolean status) {
this.message = message
this.status = status
}
public int hashCode() {
message.hashCode()
}
public boolean equals(Object o) {
MWMessageStatus other = (MWMessageStatus) o
message.equals(other.message)
}
}
}

View File

@ -57,6 +57,7 @@ import com.muwire.core.messenger.MWMessage
import com.muwire.core.messenger.MWMessageAttachment
import com.muwire.core.trust.RemoteTrustList
import com.muwire.core.upload.Uploader
import com.muwire.gui.MainFrameModel.MWMessageStatus
import java.awt.BorderLayout
import java.awt.CardLayout
@ -692,10 +693,11 @@ class MainFrameView {
scrollPane {
table(id : "message-header-table", autoCreateRowSorter : true, rowHeight : rowHeight) {
tableModel(list : model.messageHeaders) {
closureColumn(header : trans("SENDER"), preferredWidth:200, type : String, read : {it.sender.getHumanReadableName()})
closureColumn(header : trans("SUBJECT"), preferredWidth:300, type: String, read : {it.subject})
closureColumn(header : trans("RECIPIENTS"), preferredWidth: 20, type:Integer, read : {it.recipients.size()})
closureColumn(header : trans("DATE"), preferredWidth : 50, type : Long, read : {it.timestamp})
closureColumn(header : trans("SENDER"), preferredWidth:200, type : String, read : {it.message.sender.getHumanReadableName()})
closureColumn(header : trans("SUBJECT"), preferredWidth:300, type: String, read : {it.message.subject})
closureColumn(header : trans("RECIPIENTS"), preferredWidth: 20, type:Integer, read : {it.message.recipients.size()})
closureColumn(header : trans("DATE"), preferredWidth : 50, type : Long, read : {it.message.timestamp})
closureColumn(header : trans("UNREAD"), preferredWidth : 20, type : Boolean, read : {it.status})
}
}
}
@ -1319,7 +1321,9 @@ class MainFrameView {
messageBody.setText("")
model.messageRecipientList = ""
} else {
MWMessage selected = model.messageHeaders.getAt(selectedRow)
MWMessageStatus selectedStatus = model.messageHeaders.getAt(selectedRow)
controller.markMessageRead(selectedStatus)
MWMessage selected = selectedStatus.message
messageBody.setText(selected.body)
model.messageButtonsEnabled = true
model.messageRecipientList = String.join(",", selected.recipients.collect {it.getHumanReadableName()})