diff --git a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy index 40fbe79f..1cab0f11 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy @@ -59,6 +59,7 @@ class MainFrameController { Map params = new HashMap<>() params["search-terms"] = search params["uuid"] = uuid.toString() + params["core"] = core def group = mvcGroup.createMVCGroup("SearchTab", uuid.toString(), params) model.results[uuid.toString()] = group @@ -96,6 +97,7 @@ class MainFrameController { Map params = new HashMap<>() params["search-terms"] = tabTitle params["uuid"] = uuid.toString() + params["core"] = core def group = mvcGroup.createMVCGroup("SearchTab", uuid.toString(), params) model.results[uuid.toString()] = group @@ -106,20 +108,6 @@ class MainFrameController { originator : core.me)) } - private def selectedResult() { - def selected = builder.getVariable("result-tabs").getSelectedComponent() - def group = selected.getClientProperty("mvc-group") - def table = selected.getClientProperty("results-table") - int row = table.getSelectedRow() - if (row == -1) - return - def sortEvt = group.view.lastSortEvent - if (sortEvt != null) { - row = group.view.resultsTable.rowSorter.convertRowIndexToModel(row) - } - group.model.results[row] - } - private int selectedDownload() { def downloadsTable = builder.getVariable("downloads-table") def selected = downloadsTable.getSelectedRow() @@ -129,42 +117,6 @@ class MainFrameController { selected } - @ControllerAction - void download() { - def result = selectedResult() - if (result == null) - return - - if (!model.canDownload(result.infohash)) - return - - def file = new File(application.context.get("muwire-settings").downloadLocation, result.name) - - def selected = builder.getVariable("result-tabs").getSelectedComponent() - def group = selected.getClientProperty("mvc-group") - - def resultsBucket = group.model.hashBucket[result.infohash] - def sources = group.model.sourcesBucket[result.infohash] - - core.eventBus.publish(new UIDownloadEvent(result : resultsBucket, sources: sources, target : file)) - } - - @ControllerAction - void trust() { - def result = selectedResult() - if (result == null) - return // TODO disable button - core.eventBus.publish( new TrustEvent(persona : result.sender, level : TrustLevel.TRUSTED)) - } - - @ControllerAction - void distrust() { - def result = selectedResult() - if (result == null) - return // TODO disable button - core.eventBus.publish( new TrustEvent(persona : result.sender, level : TrustLevel.DISTRUSTED)) - } - @ControllerAction void trustPersonaFromSearch() { int selected = builder.getVariable("searches-table").getSelectedRow() diff --git a/gui/griffon-app/controllers/com/muwire/gui/SearchTabController.groovy b/gui/griffon-app/controllers/com/muwire/gui/SearchTabController.groovy index e6271942..c46694d7 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/SearchTabController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/SearchTabController.groovy @@ -6,6 +6,63 @@ import griffon.inject.MVCMember import griffon.metadata.ArtifactProviderFor import javax.annotation.Nonnull +import com.muwire.core.Core +import com.muwire.core.download.UIDownloadEvent +import com.muwire.core.trust.TrustEvent +import com.muwire.core.trust.TrustLevel + @ArtifactProviderFor(GriffonController) class SearchTabController { + + @MVCMember @Nonnull + SearchTabModel model + @MVCMember @Nonnull + SearchTabView view + + Core core + + private def selectedResult() { + int row = view.resultsTable.getSelectedRow() + if (row == -1) + return + def sortEvt = view.lastSortEvent + if (sortEvt != null) { + row = view.resultsTable.rowSorter.convertRowIndexToModel(row) + } + model.results[row] + } + + @ControllerAction + void download() { + def result = selectedResult() + if (result == null) + return + + if (!mvcGroup.parentGroup.model.canDownload(result.infohash)) + return + + def file = new File(application.context.get("muwire-settings").downloadLocation, result.name) + + def resultsBucket = model.hashBucket[result.infohash] + def sources = model.sourcesBucket[result.infohash] + + core.eventBus.publish(new UIDownloadEvent(result : resultsBucket, sources: sources, target : file)) + mvcGroup.parentGroup.view.showDownloadsWindow.call() + } + + @ControllerAction + void trust() { + def result = selectedResult() + if (result == null) + return + core.eventBus.publish( new TrustEvent(persona : result.sender, level : TrustLevel.TRUSTED)) + } + + @ControllerAction + void distrust() { + def result = selectedResult() + if (result == null) + return + core.eventBus.publish( new TrustEvent(persona : result.sender, level : TrustLevel.DISTRUSTED)) + } } \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy index 4aa1cd6a..b4290ffa 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -76,8 +76,6 @@ class MainFrameModel { @Observable String me @Observable int loadedFiles @Observable File hashingFile - @Observable boolean downloadActionEnabled - @Observable boolean trustButtonsEnabled @Observable boolean cancelButtonEnabled @Observable boolean retryButtonEnabled @Observable boolean pauseButtonEnabled diff --git a/gui/griffon-app/models/com/muwire/gui/SearchTabModel.groovy b/gui/griffon-app/models/com/muwire/gui/SearchTabModel.groovy index dc58135f..e9cf0054 100644 --- a/gui/griffon-app/models/com/muwire/gui/SearchTabModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/SearchTabModel.groovy @@ -17,6 +17,9 @@ import griffon.metadata.ArtifactProviderFor class SearchTabModel { @MVCMember @Nonnull FactoryBuilderSupport builder + + @Observable boolean downloadActionEnabled + @Observable boolean trustButtonsEnabled Core core UISettings uiSettings diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index fa18ae2d..c39497b1 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -119,11 +119,6 @@ class MainFrameView { panel (constraints : "search window") { borderLayout() tabbedPane(id : "result-tabs", constraints: BorderLayout.CENTER) - panel(constraints : BorderLayout.SOUTH) { - button(text : "Download", enabled : bind {model.downloadActionEnabled}, downloadAction) - button(text : "Trust", enabled: bind {model.trustButtonsEnabled }, trustAction) - button(text : "Distrust", enabled : bind {model.trustButtonsEnabled}, distrustAction) - } } panel (constraints: "downloads window") { gridLayout(rows : 2, cols: 1) diff --git a/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy b/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy index 4bbbf5c2..2b0e6217 100644 --- a/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy @@ -43,19 +43,27 @@ class SearchTabView { void initUI() { builder.with { def resultsTable - def pane = scrollPane { - resultsTable = table(id : "results-table", autoCreateRowSorter : true) { - tableModel(list: model.results) { - closureColumn(header: "Name", preferredWidth: 350, type: String, read : {row -> row.name.replace('<','_')}) - closureColumn(header: "Size", preferredWidth: 20, type: Long, read : {row -> row.size}) - closureColumn(header: "Direct Sources", preferredWidth: 50, type : Integer, read : { row -> model.hashBucket[row.infohash].size()}) - closureColumn(header: "Possible Sources", preferredWidth : 50, type : Integer, read : {row -> model.sourcesBucket[row.infohash].size()}) - closureColumn(header: "Sender", preferredWidth: 170, type: String, read : {row -> row.sender.getHumanReadableName()}) - closureColumn(header: "Trust", preferredWidth: 50, type: String, read : {row -> - model.core.trustService.getLevel(row.sender.destination).toString() - }) + def pane = panel { + borderLayout() + scrollPane (constraints : BorderLayout.CENTER) { + resultsTable = table(id : "results-table", autoCreateRowSorter : true) { + tableModel(list: model.results) { + closureColumn(header: "Name", preferredWidth: 350, type: String, read : {row -> row.name.replace('<','_')}) + closureColumn(header: "Size", preferredWidth: 20, type: Long, read : {row -> row.size}) + closureColumn(header: "Direct Sources", preferredWidth: 50, type : Integer, read : { row -> model.hashBucket[row.infohash].size()}) + closureColumn(header: "Possible Sources", preferredWidth : 50, type : Integer, read : {row -> model.sourcesBucket[row.infohash].size()}) + closureColumn(header: "Sender", preferredWidth: 170, type: String, read : {row -> row.sender.getHumanReadableName()}) + closureColumn(header: "Trust", preferredWidth: 50, type: String, read : {row -> + model.core.trustService.getLevel(row.sender.destination).toString() + }) + } } } + panel(constraints : BorderLayout.SOUTH) { + button(text : "Download", enabled : bind {model.downloadActionEnabled}, downloadAction) + button(text : "Trust", enabled: bind {model.trustButtonsEnabled }, trustAction) + button(text : "Distrust", enabled : bind {model.trustButtonsEnabled}, distrustAction) + } } this.pane = pane @@ -72,8 +80,8 @@ class SearchTabView { return if (lastSortEvent != null) row = resultsTable.rowSorter.convertRowIndexToModel(row) - mvcGroup.parentGroup.model.trustButtonsEnabled = true - mvcGroup.parentGroup.model.downloadActionEnabled = mvcGroup.parentGroup.model.canDownload(model.results[row].infohash) + model.trustButtonsEnabled = true + model.downloadActionEnabled = mvcGroup.parentGroup.model.canDownload(model.results[row].infohash) }) } } @@ -131,14 +139,14 @@ class SearchTabView { def closeTab = { int index = parent.indexOfTab(searchTerms) parent.removeTabAt(index) - mvcGroup.parentGroup.model.trustButtonsEnabled = false - mvcGroup.parentGroup.model.downloadActionEnabled = false + model.trustButtonsEnabled = false + model.downloadActionEnabled = false mvcGroup.destroy() } def showPopupMenu(MouseEvent e) { JPopupMenu menu = new JPopupMenu() - if (mvcGroup.parentGroup.model.downloadActionEnabled) { + if (model.downloadActionEnabled) { JMenuItem download = new JMenuItem("Download") download.addActionListener({mvcGroup.parentGroup.controller.download()}) menu.add(download)