diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/BrowseModel.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/BrowseModel.groovy index 6cbe0258..e4bd0366 100644 --- a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/BrowseModel.groovy +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/BrowseModel.groovy @@ -1,11 +1,75 @@ package com.muwire.clilanterna +import com.googlecode.lanterna.gui2.Label import com.googlecode.lanterna.gui2.TextGUIThread +import com.googlecode.lanterna.gui2.table.TableModel import com.muwire.core.Core import com.muwire.core.Persona +import com.muwire.core.search.BrowseStatus +import com.muwire.core.search.BrowseStatusEvent +import com.muwire.core.search.UIBrowseEvent +import com.muwire.core.search.UIResultEvent + +import net.i2p.data.Base64 +import net.i2p.data.DataHelper class BrowseModel { private final Persona persona private final Core core private final TextGUIThread guiThread + private final TableModel model = new TableModel("Name","Size","Hash","Comment") + private Map rootToResult = new HashMap<>() + + private int totalResults + + private Label status + private Label percentage + + BrowseModel(Persona persona, Core core, TextGUIThread guiThread) { + this.persona = persona + this.core = core + this.guiThread = guiThread + + core.eventBus.register(BrowseStatusEvent.class, this) + core.eventBus.register(UIResultEvent.class, this) + core.eventBus.publish(new UIBrowseEvent(host : persona)) + } + + void unregister() { + core.eventBus.unregister(BrowseStatusEvent.class, this) + core.eventBus.unregister(UIResultEvent.class, this) + } + + void onBrowseStatusEvent(BrowseStatusEvent e) { + guiThread.invokeLater { + status.setText(e.status.toString()) + if (e.status == BrowseStatus.FETCHING) + totalResults = e.totalResults + } + } + + void onUIResultEvent(UIResultEvent e) { + guiThread.invokeLater { + String size = DataHelper.formatSize2Decimal(e.size, false) + "B" + String infoHash = Base64.encode(e.infohash.getRoot()) + String comment = String.valueOf(e.comment != null) + model.addRow(e.name, size, infoHash, comment) + rootToResult.put(infoHash, e) + + String percentageString = "" + if (totalResults != 0) { + double percentage = Math.round( (model.getRowCount() * 100 / totalResults).toDouble() ) + percentageString = String.valueOf(percentage)+"%" + } + percentage.setText(percentageString) + } + } + + void setStatusLabel(Label status) { + this.status = status + } + + void setPercentageLabel(Label percentage) { + this.percentage = percentage + } } diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/BrowseView.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/BrowseView.groovy new file mode 100644 index 00000000..21cebc6a --- /dev/null +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/BrowseView.groovy @@ -0,0 +1,107 @@ +package com.muwire.clilanterna + +import com.googlecode.lanterna.TerminalSize +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.Label +import com.googlecode.lanterna.gui2.LayoutData +import com.googlecode.lanterna.gui2.Panel +import com.googlecode.lanterna.gui2.TextGUI +import com.googlecode.lanterna.gui2.Window +import com.googlecode.lanterna.gui2.dialogs.MessageDialog +import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton +import com.googlecode.lanterna.gui2.table.Table +import com.muwire.core.Core +import com.muwire.core.download.UIDownloadEvent +import com.muwire.core.search.UIResultEvent + + +class BrowseView extends BasicWindow { + private final BrowseModel model + private final TextGUI textGUI + private final Core core + private final Table table + private final LayoutData layoutData = GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER) + + BrowseView(BrowseModel model, TextGUI textGUI, Core core, TerminalSize terminalSize) { + super("Browse "+model.persona.getHumanReadableName()) + this.model = model + this.textGUI = textGUI + this.core = core + + setHints([Window.Hint.EXPANDED]) + + Panel contentPanel = new Panel() + contentPanel.setLayoutManager(new GridLayout(1)) + + Label statusLabel = new Label("") + Label percentageLabel = new Label("") + model.setStatusLabel(statusLabel) + model.setPercentageLabel(percentageLabel) + + Panel topPanel = new Panel() + topPanel.setLayoutManager(new GridLayout(2)) + topPanel.addComponent(statusLabel, layoutData) + topPanel.addComponent(percentageLabel, layoutData) + contentPanel.addComponent(topPanel, layoutData) + + table = new Table("Name","Size","Hash","Comment") + table.with { + setCellSelection(false) + setTableModel(model.model) + setVisibleRows(terminalSize.getRows()) + setSelectAction({rowSelected()}) + } + contentPanel.addComponent(table, layoutData) + + Button closeButton = new Button("Close",{ + model.unregister() + close() + }) + contentPanel.addComponent(closeButton, layoutData) + setComponent(contentPanel) + + } + + private void rowSelected() { + int selectedRow = table.getSelectedRow() + def row = model.model.getRow(selectedRow) + String infoHash = row[2] + boolean comment = Boolean.parseBoolean(row[3]) + if (comment) { + Window prompt = new BasicWindow("Download Or View Comment") + prompt.setHints([Window.Hint.CENTERED]) + Panel contentPanel = new Panel() + contentPanel.setLayoutManager(new GridLayout(3)) + Button downloadButton = new Button("Download", {download(infoHash)}) + Button viewButton = new Button("View Comment", {viewComment(infoHash)}) + Button closeButton = new Button("Cancel", {prompt.close()}) + + contentPanel.with { + addComponent(downloadButton, layoutData) + addComponent(viewButton, layoutData) + addComponent(closeButton, layoutData) + } + + prompt.setComponent(contentPanel) + downloadButton.takeFocus() + textGUI.addWindowAndWait(prompt) + } else { + download(infoHash) + } + } + + private void download(String infoHash) { + UIResultEvent result = model.rootToResult[infoHash] + def file = new File(core.muOptions.downloadLocation, result.name) + core.eventBus.publish(new UIDownloadEvent(result : [result], sources : result.sources, + target : file, sequential : false)) + MessageDialog.showMessageDialog(textGUI, "Download started", "Started download of "+result.name, MessageDialogButton.OK) + } + + private void viewComment(String infoHash) { + + } +} 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 7b87a873..fcaabe28 100644 --- a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SearchView.groovy +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SearchView.groovy @@ -67,7 +67,11 @@ class SearchView extends BasicWindow { Button showResults = new Button("Show Results", { showResults(persona) }) - Button browseHost = new Button("Browse Host", {}) // TODO + Button browseHost = new Button("Browse Host", { + BrowseModel model = new BrowseModel(persona, core, textGUI.getGUIThread()) + BrowseView view = new BrowseView(model, textGUI, core, terminalSize) + textGUI.addWindowAndWait(view) + }) Button trustHost = new Button("Trust",{ core.eventBus.publish(new TrustEvent(persona : persona, level : TrustLevel.TRUSTED)) MessageDialog.showMessageDialog(textGUI, "Marked Trusted", persona.getHumanReadableName() + " has been marked trusted",