From ae79f0fded380e95477e56d9b987c7025c615d0d Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Sun, 14 Jul 2019 06:19:05 +0100 Subject: [PATCH] Clear Done button, thanks to Aegon --- .../com/muwire/gui/MainFrameController.groovy | 18 ++ .../com/muwire/gui/MainFrameModel.groovy | 32 +-- .../views/com/muwire/gui/MainFrameView.groovy | 3 +- .../views/com/muwire/gui/OptionsView.groovy | 4 +- .../com/muwire/gui/OptionsView.groovy.orig | 183 ++++++++++++++++++ 5 files changed, 226 insertions(+), 14 deletions(-) create mode 100644 gui/griffon-app/views/com/muwire/gui/OptionsView.groovy.orig diff --git a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy index 1cab0f11..6b286ebe 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy @@ -17,6 +17,7 @@ import com.muwire.core.Constants import com.muwire.core.Core import com.muwire.core.Persona import com.muwire.core.SharedFile +import com.muwire.core.download.Downloader import com.muwire.core.download.DownloadStartedEvent import com.muwire.core.download.UIDownloadCancelledEvent import com.muwire.core.download.UIDownloadEvent @@ -157,6 +158,23 @@ class MainFrameController { core.eventBus.publish(new UIDownloadPausedEvent()) } + @ControllerAction + void clear() { + def toRemove = [] + model.downloads.each { + if (it.downloader.getCurrentState() == Downloader.DownloadState.CANCELLED) { + toRemove << it + } else if (it.downloader.getCurrentState() == Downloader.DownloadState.FINISHED) { + toRemove << it + } + } + toRemove.each { + model.downloads.remove(it) + } + model.clearButtonEnabled = false + + } + private void markTrust(String tableName, TrustLevel level, def list) { int row = view.getSelectedTrustTablesRow(tableName) if (row < 0) diff --git a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy index 1971df00..2f366a0a 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -79,6 +79,7 @@ class MainFrameModel { @Observable boolean cancelButtonEnabled @Observable boolean retryButtonEnabled @Observable boolean pauseButtonEnabled + @Observable boolean clearButtonEnabled @Observable String resumeButtonText @Observable boolean subscribeButtonEnabled @Observable boolean markNeutralFromTrustedButtonEnabled @@ -123,17 +124,26 @@ class MainFrameModel { return // remove cancelled or finished downloads - def toRemove = [] - downloads.each { - if (uiSettings.clearCancelledDownloads && - it.downloader.getCurrentState() == Downloader.DownloadState.CANCELLED) - toRemove << it - if (uiSettings.clearFinishedDownloads && - it.downloader.getCurrentState() == Downloader.DownloadState.FINISHED) - toRemove << it - } - toRemove.each { - downloads.remove(it) + if (!clearButtonEnabled || uiSettings.clearCancelledDownloads || uiSettings.clearFinishedDownloads) { + def toRemove = [] + downloads.each { + if (it.downloader.getCurrentState() == Downloader.DownloadState.CANCELLED) { + if (uiSettings.clearCancelledDownloads) { + toRemove << it + } else { + clearButtonEnabled = true + } + } else if (it.downloader.getCurrentState() == Downloader.DownloadState.FINISHED) { + if (uiSettings.clearFinishedDownloads) { + toRemove << it + } else { + clearButtonEnabled = true + } + } + } + toRemove.each { + downloads.remove(it) + } } builder.getVariable("uploads-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 928dce15..0616428c 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -139,8 +139,9 @@ class MainFrameView { } panel (constraints : BorderLayout.SOUTH) { button(text: "Pause", enabled : bind {model.pauseButtonEnabled}, pauseAction) - button(text: "Cancel", enabled : bind {model.cancelButtonEnabled }, cancelAction ) button(text: bind { model.resumeButtonText }, enabled : bind {model.retryButtonEnabled}, resumeAction) + button(text: "Cancel", enabled : bind {model.cancelButtonEnabled }, cancelAction) + button(text: "Clear Done", enabled : bind {model.clearButtonEnabled}, clearAction) } } panel { diff --git a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy index abd58eee..f7502dd5 100644 --- a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy @@ -117,9 +117,9 @@ class OptionsView { fontField = textField(text : bind {model.font}, columns : 4, constraints : gbc(gridx : 1, gridy:2)) // label(text : "Show Monitor", constraints : gbc(gridx :0, gridy: 3)) // monitorCheckbox = checkBox(selected : bind {model.showMonitor}, constraints : gbc(gridx : 1, gridy: 3)) - label(text : "Clear Cancelled Downloads", constraints: gbc(gridx: 0, gridy:4)) + label(text : "Automatically Clear Cancelled Downloads", constraints: gbc(gridx: 0, gridy:4)) clearCancelledDownloadsCheckbox = checkBox(selected : bind {model.clearCancelledDownloads}, constraints : gbc(gridx : 1, gridy:4)) - label(text : "Clear Finished Downloads", constraints: gbc(gridx: 0, gridy:5)) + label(text : "Automatically Clear Finished Downloads", constraints: gbc(gridx: 0, gridy:5)) clearFinishedDownloadsCheckbox = checkBox(selected : bind {model.clearFinishedDownloads}, constraints : gbc(gridx : 1, gridy:5)) label(text : "Exclude Local Files From Results", constraints: gbc(gridx:0, gridy:6)) excludeLocalResultCheckbox = checkBox(selected : bind {model.excludeLocalResult}, constraints : gbc(gridx: 1, gridy : 6)) diff --git a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy.orig b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy.orig new file mode 100644 index 00000000..abd58eee --- /dev/null +++ b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy.orig @@ -0,0 +1,183 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonView +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor + +import javax.swing.JDialog +import javax.swing.JPanel +import javax.swing.JTabbedPane +import javax.swing.SwingConstants + +import com.muwire.core.Core + +import java.awt.BorderLayout +import java.awt.event.WindowAdapter +import java.awt.event.WindowEvent + +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonView) +class OptionsView { + @MVCMember @Nonnull + FactoryBuilderSupport builder + @MVCMember @Nonnull + OptionsModel model + + def d + def p + def i + def u + def bandwidth + def trust + + def retryField + def updateField + def autoDownloadUpdateCheckbox + def shareDownloadedCheckbox + + def inboundLengthField + def inboundQuantityField + def outboundLengthField + def outboundQuantityField + def i2pUDPPortField + def i2pNTCPPortField + + def lnfField + def monitorCheckbox + def fontField + def clearCancelledDownloadsCheckbox + def clearFinishedDownloadsCheckbox + def excludeLocalResultCheckbox + def showSearchHashesCheckbox + + def inBwField + def outBwField + + def allowUntrustedCheckbox + def allowTrustListsCheckbox + def trustListIntervalField + + def buttonsPanel + + def mainFrame + + void initUI() { + mainFrame = application.windowManager.findWindow("main-frame") + d = new JDialog(mainFrame, "Options", true) + d.setResizable(false) + p = builder.panel { + gridBagLayout() + label(text : "Retry failed downloads every", constraints : gbc(gridx: 0, gridy: 0)) + retryField = textField(text : bind { model.downloadRetryInterval }, columns : 2, constraints : gbc(gridx: 1, gridy: 0)) + label(text : "minutes", constraints : gbc(gridx : 2, gridy: 0)) + + label(text : "Check for updates every", constraints : gbc(gridx : 0, gridy: 1)) + updateField = textField(text : bind {model.updateCheckInterval }, columns : 2, constraints : gbc(gridx : 1, gridy: 1)) + label(text : "hours", constraints : gbc(gridx: 2, gridy : 1)) + + label(text : "Download updates automatically", constraints: gbc(gridx :0, gridy : 2)) + autoDownloadUpdateCheckbox = checkBox(selected : bind {model.autoDownloadUpdate}, constraints : gbc(gridx:1, gridy : 2)) + + label(text : "Share downloaded files", constraints : gbc(gridx : 0, gridy:3)) + shareDownloadedCheckbox = checkBox(selected : bind {model.shareDownloadedFiles}, constraints : gbc(gridx :1, gridy:3)) + + label(text : "Save downloaded files to:", constraints: gbc(gridx:0, gridy:4)) + button(text : "Choose", constraints : gbc(gridx : 1, gridy:4), downloadLocationAction) + label(text : bind {model.downloadLocation}, constraints: gbc(gridx:0, gridy:5, gridwidth:2)) + + } + i = builder.panel { + gridBagLayout() + label(text : "Changing these settings requires a restart", constraints : gbc(gridx : 0, gridy : 0, gridwidth: 2)) + label(text : "Inbound Length", constraints : gbc(gridx:0, gridy:1)) + inboundLengthField = textField(text : bind {model.inboundLength}, columns : 2, constraints : gbc(gridx:1, gridy:1)) + label(text : "Inbound Quantity", constraints : gbc(gridx:0, gridy:2)) + inboundQuantityField = textField(text : bind {model.inboundQuantity}, columns : 2, constraints : gbc(gridx:1, gridy:2)) + label(text : "Outbound Length", constraints : gbc(gridx:0, gridy:3)) + outboundLengthField = textField(text : bind {model.outboundLength}, columns : 2, constraints : gbc(gridx:1, gridy:3)) + label(text : "Outbound Quantity", constraints : gbc(gridx:0, gridy:4)) + outboundQuantityField = textField(text : bind {model.outboundQuantity}, columns : 2, constraints : gbc(gridx:1, gridy:4)) + + Core core = application.context.get("core") + if (core.router != null) { + label(text : "TCP Port", constraints : gbc(gridx :0, gridy: 5)) + i2pNTCPPortField = textField(text : bind {model.i2pNTCPPort}, columns : 4, constraints : gbc(gridx:1, gridy:5)) + label(text : "UDP Port", constraints : gbc(gridx :0, gridy: 6)) + i2pUDPPortField = textField(text : bind {model.i2pUDPPort}, columns : 4, constraints : gbc(gridx:1, gridy:6)) + } + + } + u = builder.panel { + gridBagLayout() + label(text : "Changing these settings requires a restart", constraints : gbc(gridx : 0, gridy : 0, gridwidth: 2)) + label(text : "Look And Feel", constraints : gbc(gridx: 0, gridy:1)) + lnfField = textField(text : bind {model.lnf}, columns : 4, constraints : gbc(gridx : 1, gridy : 1)) + label(text : "Font", constraints : gbc(gridx: 0, gridy : 2)) + fontField = textField(text : bind {model.font}, columns : 4, constraints : gbc(gridx : 1, gridy:2)) +// label(text : "Show Monitor", constraints : gbc(gridx :0, gridy: 3)) +// monitorCheckbox = checkBox(selected : bind {model.showMonitor}, constraints : gbc(gridx : 1, gridy: 3)) + label(text : "Clear Cancelled Downloads", constraints: gbc(gridx: 0, gridy:4)) + clearCancelledDownloadsCheckbox = checkBox(selected : bind {model.clearCancelledDownloads}, constraints : gbc(gridx : 1, gridy:4)) + label(text : "Clear Finished Downloads", constraints: gbc(gridx: 0, gridy:5)) + clearFinishedDownloadsCheckbox = checkBox(selected : bind {model.clearFinishedDownloads}, constraints : gbc(gridx : 1, gridy:5)) + label(text : "Exclude Local Files From Results", constraints: gbc(gridx:0, gridy:6)) + excludeLocalResultCheckbox = checkBox(selected : bind {model.excludeLocalResult}, constraints : gbc(gridx: 1, gridy : 6)) +// label(text : "Show Hash Searches In Monitor", constraints: gbc(gridx:0, gridy:7)) +// showSearchHashesCheckbox = checkBox(selected : bind {model.showSearchHashes}, constraints : gbc(gridx: 1, gridy: 7)) + } + bandwidth = builder.panel { + gridBagLayout() + label(text : "Changing these settings requires a restart", constraints : gbc(gridx : 0, gridy : 0, gridwidth: 2)) + label(text : "Inbound bandwidth (KB)", constraints : gbc(gridx: 0, gridy : 1)) + inBwField = textField(text : bind {model.inBw}, columns : 3, constraints : gbc(gridx : 1, gridy : 1)) + label(text : "Outbound bandwidth (KB)", constraints : gbc(gridx: 0, gridy : 2)) + outBwField = textField(text : bind {model.outBw}, columns : 3, constraints : gbc(gridx : 1, gridy : 2)) + } + trust = builder.panel { + gridBagLayout() + label(text : "Allow only trusted connections", constraints : gbc(gridx: 0, gridy : 0)) + allowUntrustedCheckbox = checkBox(selected : bind {model.onlyTrusted}, constraints : gbc(gridx: 1, gridy : 0)) + label(text : "Allow others to view my trust list", constraints : gbc(gridx: 0, gridy : 1)) + allowTrustListsCheckbox = checkBox(selected : bind {model.trustLists}, constraints : gbc(gridx: 1, gridy : 1)) + label(text : "Update trust lists every ", constraints : gbc(gridx:0, gridy:2)) + trustListIntervalField = textField(text : bind {model.trustListInterval}, constraints:gbc(gridx:1, gridy:2)) + label(text : "hours", constraints : gbc(gridx: 2, gridy:2)) + } + + + buttonsPanel = builder.panel { + gridBagLayout() + button(text : "Save", constraints : gbc(gridx : 1, gridy: 2), saveAction) + button(text : "Cancel", constraints : gbc(gridx : 2, gridy: 2), cancelAction) + } + } + + void mvcGroupInit(Map args) { + def tabbedPane = new JTabbedPane() + tabbedPane.addTab("MuWire", p) + tabbedPane.addTab("I2P", i) + tabbedPane.addTab("GUI", u) + Core core = application.context.get("core") + if (core.router != null) { + tabbedPane.addTab("Bandwidth", bandwidth) + } + tabbedPane.addTab("Trust", trust) + + JPanel panel = new JPanel() + panel.setLayout(new BorderLayout()) + panel.add(tabbedPane, BorderLayout.CENTER) + panel.add(buttonsPanel, BorderLayout.SOUTH) + + d.getContentPane().add(panel) + d.pack() + d.setLocationRelativeTo(mainFrame) + d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE) + d.addWindowListener(new WindowAdapter() { + public void windowClosed(WindowEvent e) { + mvcGroup.destroy() + } + }) + d.show() + } +} \ No newline at end of file