From 39808302df78ddfa0da4065d97833f71186957b3 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Fri, 5 Jul 2019 16:20:03 +0100 Subject: [PATCH] Show which file is hashing, thanks to Aegon --- .../main/groovy/com/muwire/core/Core.groovy | 1 + .../muwire/core/files/FileHashingEvent.groovy | 15 +++++ .../muwire/core/files/HasherService.groovy | 1 + .../com/muwire/gui/MainFrameModel.groovy | 19 +++++- .../views/com/muwire/gui/MainFrameView.groovy | 61 ++++++++++++------- 5 files changed, 74 insertions(+), 23 deletions(-) create mode 100644 core/src/main/groovy/com/muwire/core/files/FileHashingEvent.groovy diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index cde6eed0..00ee4e9a 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -20,6 +20,7 @@ import com.muwire.core.download.UIDownloadPausedEvent import com.muwire.core.download.UIDownloadResumedEvent import com.muwire.core.files.FileDownloadedEvent import com.muwire.core.files.FileHashedEvent +import com.muwire.core.files.FileHashingEvent import com.muwire.core.files.FileHasher import com.muwire.core.files.FileLoadedEvent import com.muwire.core.files.FileManager diff --git a/core/src/main/groovy/com/muwire/core/files/FileHashingEvent.groovy b/core/src/main/groovy/com/muwire/core/files/FileHashingEvent.groovy new file mode 100644 index 00000000..a3ad30a5 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/files/FileHashingEvent.groovy @@ -0,0 +1,15 @@ +package com.muwire.core.files + +import com.muwire.core.Event +import com.muwire.core.SharedFile + +class FileHashingEvent extends Event { + + File hashingFile + + @Override + public String toString() { + super.toString() + " hashingFile " + hashingFile.getAbsolutePath() + } + +} diff --git a/core/src/main/groovy/com/muwire/core/files/HasherService.groovy b/core/src/main/groovy/com/muwire/core/files/HasherService.groovy index 15c5f0ae..67694c74 100644 --- a/core/src/main/groovy/com/muwire/core/files/HasherService.groovy +++ b/core/src/main/groovy/com/muwire/core/files/HasherService.groovy @@ -39,6 +39,7 @@ class HasherService { } else if (f.length() > FileHasher.MAX_SIZE) { eventBus.publish new FileHashedEvent(error: "$f is too large to be shared ${f.length()}") } else { + eventBus.publish new FileHashingEvent(hashingFile: f) def hash = hasher.hashFile f eventBus.publish new FileHashedEvent(sharedFile: new SharedFile(f, hash, FileHasher.getPieceSize(f.length()))) } diff --git a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy index 56c7279b..d341b3ae 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -22,6 +22,7 @@ import com.muwire.core.download.Downloader import com.muwire.core.files.AllFilesLoadedEvent import com.muwire.core.files.FileDownloadedEvent import com.muwire.core.files.FileHashedEvent +import com.muwire.core.files.FileHashingEvent import com.muwire.core.files.FileLoadedEvent import com.muwire.core.files.FileSharedEvent import com.muwire.core.files.FileUnsharedEvent @@ -72,6 +73,8 @@ class MainFrameModel { @Observable int connections @Observable String me + @Observable int loadedFiles + @Observable File hashingFile @Observable boolean downloadActionEnabled @Observable boolean trustButtonsEnabled @Observable boolean cancelButtonEnabled @@ -86,7 +89,7 @@ class MainFrameModel { @Observable boolean reviewButtonEnabled @Observable boolean updateButtonEnabled @Observable boolean unsubscribeButtonEnabled - + private final Set infoHashes = new HashSet<>() private final Set downloadInfoHashes = new HashSet<>() @@ -147,6 +150,7 @@ class MainFrameModel { core.eventBus.register(ConnectionEvent.class, this) core.eventBus.register(DisconnectionEvent.class, this) core.eventBus.register(FileHashedEvent.class, this) + core.eventBus.register(FileHashingEvent.class, this) core.eventBus.register(FileLoadedEvent.class, this) core.eventBus.register(UploadEvent.class, this) core.eventBus.register(UploadFinishedEvent.class, this) @@ -263,7 +267,17 @@ class MainFrameModel { } } + void onFileHashingEvent(FileHashingEvent e) { + runInsideUIAsync { + loadedFiles = shared.size() + hashingFile = e.hashingFile + } + } + void onFileHashedEvent(FileHashedEvent e) { + runInsideUIAsync { + hashingFile = null + } if (e.error != null) return // TODO do something if (infoHashes.contains(e.sharedFile.infoHash)) @@ -271,6 +285,7 @@ class MainFrameModel { infoHashes.add(e.sharedFile.infoHash) runInsideUIAsync { shared << e.sharedFile + loadedFiles = shared.size() JTable table = builder.getVariable("shared-files-table") table.model.fireTableDataChanged() } @@ -282,6 +297,7 @@ class MainFrameModel { infoHashes.add(e.loadedFile.infoHash) runInsideUIAsync { shared << e.loadedFile + loadedFiles = shared.size() JTable table = builder.getVariable("shared-files-table") table.model.fireTableDataChanged() } @@ -293,6 +309,7 @@ class MainFrameModel { return runInsideUIAsync { shared.remove(e.unsharedFile) + loadedFiles = shared.size() JTable table = builder.getVariable("shared-files-table") table.model.fireTableDataChanged() } diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index 48a771c8..4eb85eb7 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -161,36 +161,53 @@ class MainFrameView { panel (constraints: "uploads window"){ gridLayout(cols : 1, rows : 2) panel { - gridLayout(cols : 2, rows : 1) - panel { - borderLayout() - panel (constraints : BorderLayout.NORTH) { - button(text : "Add directories to watch", actionPerformed : watchDirectories) - } - scrollPane (constraints : BorderLayout.CENTER) { - table(id : "watched-directories-table", autoCreateRowSorter: true) { - tableModel(list : model.watched) { - closureColumn(header: "Watched Directories", type : String, read : { it }) + borderLayout() + panel (constraints : BorderLayout.NORTH) { + label(text : bind { + if (model.hashingFile == null) { + "" + } else { + "hashing: " + model.hashingFile.getAbsolutePath() + " (" + DataHelper.formatSize2Decimal(model.hashingFile.length(), false).toString() + "B)" + } + }) + } + panel (border : etchedBorder(), constraints : BorderLayout.CENTER) { + gridLayout(cols : 2, rows : 1) + panel (constraints : BorderLayout.WEST) { + borderLayout() + scrollPane (constraints : BorderLayout.CENTER) { + table(id : "watched-directories-table", autoCreateRowSorter: true) { + tableModel(list : model.watched) { + closureColumn(header: "Watched Directories", type : String, read : { it }) + } } } + panel (constraints : BorderLayout.SOUTH) { + button(text : "Add directories to watch", actionPerformed : watchDirectories) + button(text : "Share files", actionPerformed : shareFiles) + } } - } - panel { - borderLayout() - panel (constraints : BorderLayout.NORTH) { - button(text : "Share files", actionPerformed : shareFiles) - } - scrollPane(constraints : BorderLayout.CENTER) { - table(id : "shared-files-table", autoCreateRowSorter: true) { - tableModel(list : model.shared) { - closureColumn(header : "Name", preferredWidth : 500, type : String, read : {row -> row.getCachedPath()}) - closureColumn(header : "Size", preferredWidth : 100, type : Long, read : {row -> row.getCachedLength() }) + panel (constraints : BorderLayout.EAST){ + borderLayout() + scrollPane(constraints : BorderLayout.CENTER) { + table(id : "shared-files-table", autoCreateRowSorter: true) { + tableModel(list : model.shared) { + closureColumn(header : "Name", preferredWidth : 500, type : String, read : {row -> row.getCachedPath()}) + closureColumn(header : "Size", preferredWidth : 100, type : Long, read : {row -> row.getCachedLength() }) + } + } + } + panel (constraints : BorderLayout.SOUTH) { + borderLayout() + panel (constraints : BorderLayout.EAST) { + label("Shared:") + label(text : bind {model.loadedFiles.toString()}) } } } } } - panel { + panel (border : etchedBorder()) { borderLayout() panel (constraints : BorderLayout.NORTH){ label("Uploads")