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,73 +8,81 @@ 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
@ArtifactProviderFor(GriffonController) @ArtifactProviderFor(GriffonController)
class SearchTabController { class SearchTabController {
@MVCMember @Nonnull @MVCMember @Nonnull
SearchTabModel model SearchTabModel model
@MVCMember @Nonnull @MVCMember @Nonnull
SearchTabView view SearchTabView view
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])
}
}
List<UIResultEvent> results = new ArrayList<>()
rows.each { results.add(model.results[it]) }
results
} }
model.results[row]
}
@ControllerAction
void download() {
def result = selectedResult()
if (result == null)
return
if (!mvcGroup.parentGroup.model.canDownload(result.infohash)) @ControllerAction
return void download() {
def results = selectedResults()
if (results == null)
return
def file = new File(application.context.get("muwire-settings").downloadLocation, result.name) results.removeAll {
!mvcGroup.parentGroup.model.canDownload(it.infohash)
}
def resultsBucket = model.hashBucket[result.infohash] results.each { result ->
def sources = model.sourcesBucket[result.infohash] def file = new File(application.context.get("muwire-settings").downloadLocation, result.name)
core.eventBus.publish(new UIDownloadEvent(result : resultsBucket, sources: sources, def resultsBucket = model.hashBucket[result.infohash]
target : file, sequential : view.sequentialDownloadCheckbox.model.isSelected())) def sources = model.sourcesBucket[result.infohash]
mvcGroup.parentGroup.view.showDownloadsWindow.call()
}
@ControllerAction core.eventBus.publish(new UIDownloadEvent(result : resultsBucket, sources: sources,
void trust() { target : file, sequential : view.sequentialDownloadCheckbox.model.isSelected()))
int row = view.selectedSenderRow() }
if (row < 0) mvcGroup.parentGroup.view.showDownloadsWindow.call()
return }
def sender = model.senders[row]
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.TRUSTED))
}
@ControllerAction @ControllerAction
void distrust() { void trust() {
int row = view.selectedSenderRow() int row = view.selectedSenderRow()
if (row < 0) if (row < 0)
return return
def sender = model.senders[row] def sender = model.senders[row]
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.DISTRUSTED)) core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.TRUSTED))
} }
@ControllerAction @ControllerAction
void neutral() { void distrust() {
int row = view.selectedSenderRow() int row = view.selectedSenderRow()
if (row < 0) if (row < 0)
return return
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.DISTRUSTED))
} }
}
@ControllerAction
void neutral() {
int row = view.selectedSenderRow()
if (row < 0)
return
def sender = model.senders[row]
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
} }
JMenuItem copyHashToClipboard = new JMenuItem("Copy hash to clipboard") if (resultsTable.getSelectedRows().length == 1) {
copyHashToClipboard.addActionListener({mvcGroup.view.copyHashToClipboard()}) JMenuItem copyHashToClipboard = new JMenuItem("Copy hash to clipboard")
menu.add(copyHashToClipboard) copyHashToClipboard.addActionListener({mvcGroup.view.copyHashToClipboard()})
menu.show(e.getComponent(), e.getX(), e.getY()) menu.add(copyHashToClipboard)
showMenu = true
}
if (showMenu)
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())