implement browse host
This commit is contained in:
@@ -1,11 +1,75 @@
|
|||||||
package com.muwire.clilanterna
|
package com.muwire.clilanterna
|
||||||
|
|
||||||
|
import com.googlecode.lanterna.gui2.Label
|
||||||
import com.googlecode.lanterna.gui2.TextGUIThread
|
import com.googlecode.lanterna.gui2.TextGUIThread
|
||||||
|
import com.googlecode.lanterna.gui2.table.TableModel
|
||||||
import com.muwire.core.Core
|
import com.muwire.core.Core
|
||||||
import com.muwire.core.Persona
|
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 {
|
class BrowseModel {
|
||||||
private final Persona persona
|
private final Persona persona
|
||||||
private final Core core
|
private final Core core
|
||||||
private final TextGUIThread guiThread
|
private final TextGUIThread guiThread
|
||||||
|
private final TableModel model = new TableModel("Name","Size","Hash","Comment")
|
||||||
|
private Map<String, UIResultEvent> 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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -67,7 +67,11 @@ class SearchView extends BasicWindow {
|
|||||||
Button showResults = new Button("Show Results", {
|
Button showResults = new Button("Show Results", {
|
||||||
showResults(persona)
|
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",{
|
Button trustHost = new Button("Trust",{
|
||||||
core.eventBus.publish(new TrustEvent(persona : persona, level : TrustLevel.TRUSTED))
|
core.eventBus.publish(new TrustEvent(persona : persona, level : TrustLevel.TRUSTED))
|
||||||
MessageDialog.showMessageDialog(textGUI, "Marked Trusted", persona.getHumanReadableName() + " has been marked trusted",
|
MessageDialog.showMessageDialog(textGUI, "Marked Trusted", persona.getHumanReadableName() + " has been marked trusted",
|
||||||
|
|||||||
Reference in New Issue
Block a user