diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/MainWindowView.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/MainWindowView.groovy index cae91708..89834304 100644 --- a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/MainWindowView.groovy +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/MainWindowView.groovy @@ -87,6 +87,6 @@ class MainWindowView extends BasicWindow { private void search() { String query = searchTextBox.getText() SearchModel model = new SearchModel(query, core) - textGUI.addWindowAndWait(new SearchView(model,core)) + textGUI.addWindowAndWait(new SearchView(model,core, textGUI)) } } diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsModel.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsModel.groovy new file mode 100644 index 00000000..2e8577f5 --- /dev/null +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsModel.groovy @@ -0,0 +1,28 @@ +package com.muwire.clilanterna + +import com.muwire.core.search.UIResultBatchEvent +import com.muwire.core.search.UIResultEvent + +import net.i2p.data.Base64 +import net.i2p.data.DataHelper + +import com.googlecode.lanterna.gui2.table.TableModel + +class ResultsModel { + private final UIResultBatchEvent results + final TableModel model + final Map rootToResult = new HashMap<>() + + ResultsModel(UIResultBatchEvent results) { + this.results = results + model = new TableModel("Name","Size","Hash","Sources","Comment") + results.results.each { + String size = DataHelper.formatSize2Decimal(it.size, false) + "B" + String infoHash = Base64.encode(it.infohash.getRoot()) + String sources = String.valueOf(it.sources.size()) + String comment = String.valueOf(it.comment != null) + model.addRow(it.name, size, infoHash, sources, comment) + rootToResult.put(infoHash, it) + } + } +} diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsView.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsView.groovy new file mode 100644 index 00000000..7123ba42 --- /dev/null +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsView.groovy @@ -0,0 +1,48 @@ +package com.muwire.clilanterna + +import com.googlecode.lanterna.gui2.BasicWindow +import com.googlecode.lanterna.gui2.Button +import com.googlecode.lanterna.gui2.GridLayout +import com.googlecode.lanterna.gui2.GridLayout.Alignment +import com.googlecode.lanterna.gui2.Panel +import com.googlecode.lanterna.gui2.TextGUI +import com.googlecode.lanterna.gui2.Window +import com.googlecode.lanterna.gui2.table.Table + +import com.muwire.core.Core + +class ResultsView extends BasicWindow { + + private final ResultsModel model + private final TextGUI textGUI + private final Core core + private final Table table + + ResultsView(ResultsModel model, Core core, TextGUI textGUI) { + super(model.results.results[0].sender.getHumanReadableName() + " Results") + this.model = model + this.core = core + this.textGUI = textGUI + + setHints([Window.Hint.EXPANDED]) + + Panel contentPanel = new Panel() + contentPanel.setLayoutManager(new GridLayout(1)) + + table = new Table("Name","Size","Hash","Sources","Comment") + table.setCellSelection(false) + table.setSelectAction({rowSelected()}) + table.setTableModel(model.model) + contentPanel.addComponent(table, GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER)) + + Button closeButton = new Button("Close", {close()}) + contentPanel.addComponent(closeButton, GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER)) + + setComponent(contentPanel) + closeButton.takeFocus() + } + + private void rowSelected() { + + } +} diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SearchModel.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SearchModel.groovy index 0a19fefa..731260af 100644 --- a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SearchModel.groovy +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SearchModel.groovy @@ -14,7 +14,9 @@ class SearchModel { private final String query private final Core core final TableModel model - + + final Map resultsPerSender = new HashMap<>() + SearchModel(String query, Core core) { this.query = query this.core = core @@ -40,6 +42,9 @@ class SearchModel { void onUIResultBatchEvent(UIResultBatchEvent e) { Persona sender = e.results[0].sender + + resultsPerSender.put(sender.getHumanReadableName(), e) + String browse = String.valueOf(e.results[0].browse) String results = String.valueOf(e.results.length) String trust = core.trustService.getLevel(sender.destination).toString() diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SearchView.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SearchView.groovy index a888ee02..099a7e22 100644 --- a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SearchView.groovy +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SearchView.groovy @@ -2,7 +2,10 @@ package com.muwire.clilanterna import com.googlecode.lanterna.gui2.BasicWindow import com.googlecode.lanterna.gui2.Button +import com.googlecode.lanterna.gui2.GridLayout +import com.googlecode.lanterna.gui2.GridLayout.Alignment import com.googlecode.lanterna.gui2.Panel +import com.googlecode.lanterna.gui2.TextGUI import com.googlecode.lanterna.gui2.Window import com.googlecode.lanterna.gui2.table.Table @@ -12,28 +15,64 @@ class SearchView extends BasicWindow { private final Core core private final SearchModel model private final Table table + private final TextGUI textGUI - SearchView(SearchModel model, Core core) { + SearchView(SearchModel model, Core core, TextGUI textGUI) { super(model.query) this.core = core this.model = model + this.textGUI = textGUI setHints([Window.Hint.EXPANDED]) Panel contentPanel = new Panel() + contentPanel.setLayoutManager(new GridLayout(1)) + + table = new Table("Sender","Results","Browse","Trust") + table.setCellSelection(false) + table.setSelectAction({rowSelected()}) + table.setTableModel(model.model) + contentPanel.addComponent(table, GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER)) Button closeButton = new Button("Close", { model.unregister() close() }) - contentPanel.addComponent(closeButton) - - table = new Table("Sender","Results","Browse","Trust") - table.setCellSelection(false) - table.setTableModel(model.model) - contentPanel.addComponent(table) + contentPanel.addComponent(closeButton, GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER)) setComponent(contentPanel) closeButton.takeFocus() } + + private void rowSelected() { + int selectedRow = table.getSelectedRow() + def rows = model.model.getRow(selectedRow) + boolean browse = Boolean.parseBoolean(rows[2]) + if (browse) { + Window prompt = new BasicWindow("Show Or Browse "+rows[0]+"?") + prompt.setHints([Window.Hint.CENTERED]) + Panel contentPanel = new Panel() + contentPanel.setLayoutManager(new GridLayout(3)) + Button showResults = new Button("Show Results", { + showResults(rows[0]) + }) + Button browseHost = new Button("Browse Host", {}) + Button closePrompt = new Button("Close", {prompt.close()}) + contentPanel.addComponent(showResults, , GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER)) + contentPanel.addComponent(browseHost, GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER)) + contentPanel.addComponent(closePrompt, GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER)) + prompt.setComponent(contentPanel) + showResults.takeFocus() + textGUI.addWindowAndWait(prompt) + } else { + showResults(rows[0]) + } + } + + private void showResults(String personaName) { + def results = model.resultsPerSender.get(personaName) + ResultsModel resultsModel = new ResultsModel(results) + ResultsView resultsView = new ResultsView(resultsModel, core, textGUI) + textGUI.addWindowAndWait(resultsView) + } }