implement multiple-selection on downloads table

This commit is contained in:
Zlatin Balevsky
2019-10-07 04:26:35 +01:00
parent 8b0668a134
commit 33fe755b60
2 changed files with 84 additions and 62 deletions

View File

@@ -8,6 +8,7 @@ import javax.annotation.Nonnull
import com.muwire.core.Core import com.muwire.core.Core
import com.muwire.core.download.UIDownloadEvent import com.muwire.core.download.UIDownloadEvent
import com.muwire.core.search.UIResultEvent
import com.muwire.core.trust.TrustEvent import com.muwire.core.trust.TrustEvent
import com.muwire.core.trust.TrustLevel import com.muwire.core.trust.TrustLevel
@@ -21,26 +22,32 @@ class SearchTabController {
Core core Core core
private def selectedResult() { private def selectedResults() {
int row = view.resultsTable.getSelectedRow() int[] rows = view.resultsTable.getSelectedRows()
if (row == -1) if (rows.length == 0)
return null return null
def sortEvt = view.lastSortEvent def sortEvt = view.lastSortEvent
if (sortEvt != null) { if (sortEvt != null) {
row = view.resultsTable.rowSorter.convertRowIndexToModel(row) for (int i = 0; i < rows.length; i++) {
rows[i] = view.resultsTable.rowSorter.convertRowIndexToModel(rows[i])
} }
model.results[row] }
List<UIResultEvent> results = new ArrayList<>()
rows.each { results.add(model.results[it]) }
results
} }
@ControllerAction @ControllerAction
void download() { void download() {
def result = selectedResult() def results = selectedResults()
if (result == null) if (results == null)
return return
if (!mvcGroup.parentGroup.model.canDownload(result.infohash)) results.removeAll {
return !mvcGroup.parentGroup.model.canDownload(it.infohash)
}
results.each { result ->
def file = new File(application.context.get("muwire-settings").downloadLocation, result.name) def file = new File(application.context.get("muwire-settings").downloadLocation, result.name)
def resultsBucket = model.hashBucket[result.infohash] def resultsBucket = model.hashBucket[result.infohash]
@@ -48,6 +55,7 @@ class SearchTabController {
core.eventBus.publish(new UIDownloadEvent(result : resultsBucket, sources: sources, core.eventBus.publish(new UIDownloadEvent(result : resultsBucket, sources: sources,
target : file, sequential : view.sequentialDownloadCheckbox.model.isSelected())) target : file, sequential : view.sequentialDownloadCheckbox.model.isSelected()))
}
mvcGroup.parentGroup.view.showDownloadsWindow.call() mvcGroup.parentGroup.view.showDownloadsWindow.call()
} }
@@ -77,4 +85,4 @@ class SearchTabController {
def sender = model.senders[row] def sender = model.senders[row]
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.NEUTRAL)) core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.NEUTRAL))
} }
} }

View File

@@ -112,16 +112,23 @@ class SearchTabView {
this.sequentialDownloadCheckbox = sequentialDownloadCheckbox this.sequentialDownloadCheckbox = sequentialDownloadCheckbox
def selectionModel = resultsTable.getSelectionModel() def selectionModel = resultsTable.getSelectionModel()
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION) selectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)
selectionModel.addListSelectionListener( { selectionModel.addListSelectionListener( {
int row = resultsTable.getSelectedRow() int[] rows = resultsTable.getSelectedRows()
if (row < 0) { if (rows.length == 0) {
model.downloadActionEnabled = false model.downloadActionEnabled = false
return return
} }
if (lastSortEvent != null) if (lastSortEvent != null) {
row = resultsTable.rowSorter.convertRowIndexToModel(row) for (int i = 0; i < rows.length; i ++) {
model.downloadActionEnabled = mvcGroup.parentGroup.model.canDownload(model.results[row].infohash) rows[i] = resultsTable.rowSorter.convertRowIndexToModel(rows[i])
}
}
boolean downloadActionEnabled = true
rows.each {
downloadActionEnabled &= mvcGroup.parentGroup.model.canDownload(model.results[it].infohash)
}
model.downloadActionEnabled = downloadActionEnabled
}) })
} }
} }
@@ -206,21 +213,28 @@ class SearchTabView {
def showPopupMenu(MouseEvent e) { def showPopupMenu(MouseEvent e) {
JPopupMenu menu = new JPopupMenu() JPopupMenu menu = new JPopupMenu()
boolean showMenu = false
if (model.downloadActionEnabled) { if (model.downloadActionEnabled) {
JMenuItem download = new JMenuItem("Download") JMenuItem download = new JMenuItem("Download")
download.addActionListener({mvcGroup.controller.download()}) download.addActionListener({mvcGroup.controller.download()})
menu.add(download) menu.add(download)
showMenu = true
} }
if (resultsTable.getSelectedRows().length == 1) {
JMenuItem copyHashToClipboard = new JMenuItem("Copy hash to clipboard") JMenuItem copyHashToClipboard = new JMenuItem("Copy hash to clipboard")
copyHashToClipboard.addActionListener({mvcGroup.view.copyHashToClipboard()}) copyHashToClipboard.addActionListener({mvcGroup.view.copyHashToClipboard()})
menu.add(copyHashToClipboard) menu.add(copyHashToClipboard)
showMenu = true
}
if (showMenu)
menu.show(e.getComponent(), e.getX(), e.getY()) menu.show(e.getComponent(), e.getX(), e.getY())
} }
def copyHashToClipboard() { def copyHashToClipboard() {
int selected = resultsTable.getSelectedRow() int[] selectedRows = resultsTable.getSelectedRows()
if (selected < 0) if (selectedRows.length != 1)
return return
int selected = selectedRows[0]
if (lastSortEvent != null) if (lastSortEvent != null)
selected = resultsTable.rowSorter.convertRowIndexToModel(selected) selected = resultsTable.rowSorter.convertRowIndexToModel(selected)
String hash = Base64.encode(model.results[selected].infohash.getRoot()) String hash = Base64.encode(model.results[selected].infohash.getRoot())