From fce8bbfd972a1307b9cc2869612adf30cfb85af1 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Thu, 24 Oct 2019 18:34:27 +0100 Subject: [PATCH] wip on shared files window --- .../com/muwire/clilanterna/FilesModel.groovy | 55 ++++++++++ .../com/muwire/clilanterna/FilesView.groovy | 103 ++++++++++++++++++ .../muwire/clilanterna/MainWindowView.groovy | 8 +- .../clilanterna/SharedFileWrapper.groovy | 16 +++ 4 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesModel.groovy create mode 100644 cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesView.groovy create mode 100644 cli-lanterna/src/main/groovy/com/muwire/clilanterna/SharedFileWrapper.groovy diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesModel.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesModel.groovy new file mode 100644 index 00000000..083ae6c7 --- /dev/null +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesModel.groovy @@ -0,0 +1,55 @@ +package com.muwire.clilanterna + +import com.googlecode.lanterna.gui2.TextGUIThread +import com.googlecode.lanterna.gui2.table.TableModel +import com.muwire.core.Core +import com.muwire.core.SharedFile +import com.muwire.core.files.FileLoadedEvent +import com.muwire.core.files.FileUnsharedEvent + +import net.i2p.data.DataHelper + +class FilesModel { + private final TextGUIThread guiThread + private final Core core + private final List sharedFiles = new ArrayList<>() + private final TableModel model = new TableModel("Name","Size","Comment") + + FilesModel(TextGUIThread guiThread, Core core) { + this.guiThread = guiThread + this.core = core + + core.eventBus.register(FileLoadedEvent.class, this) + core.eventBus.register(FileUnsharedEvent.class, this) + + Runnable refreshModel = {refreshModel()} + Timer timer = new Timer(true) + timer.schedule({ + guiThread.invokeLater(refreshModel) + } as TimerTask, 1000,1000) + + } + + void onFileLoadedEvent(FileLoadedEvent e) { + guiThread.invokeLater { + sharedFiles.add(e.loadedFile) + } + } + + void onFileUnsharedEvent(FileUnsharedEvent e) { + guiThread.invokeLater { + sharedFiles.remove(e.unsharedFile) + } + } + + private void refreshModel() { + int rowCount = model.getRowCount() + rowCount.times { model.removeRow(0) } + + sharedFiles.each { + long size = it.getCachedLength() + boolean comment = it.comment != null + model.addRow(new SharedFileWrapper(it), DataHelper.formatSize2(size, false)+"B", comment) + } + } +} diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesView.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesView.groovy new file mode 100644 index 00000000..2b187c11 --- /dev/null +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesView.groovy @@ -0,0 +1,103 @@ +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.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.SharedFile +import com.muwire.core.files.FileUnsharedEvent +import com.muwire.core.files.UIPersistFilesEvent + +class FilesView extends BasicWindow { + private final FilesModel model + private final TextGUI textGUI + private final Core core + private final Table table + + FilesView(FilesModel model, TextGUI textGUI, Core core) { + super("Shared Files") + this.model = model + this.core = core + this.textGUI = textGUI + + setHints([Window.Hint.EXPANDED]) + + Panel contentPanel = new Panel() + contentPanel.setLayoutManager(new GridLayout(1)) + LayoutData layoutData = GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER) + + table = new Table("Name","Size","Comment") + table.setCellSelection(false) + table.setTableModel(model.model) + table.setSelectAction({rowSelected()}) + contentPanel.addComponent(table, layoutData) + + Panel buttonsPanel = new Panel() + buttonsPanel.setLayoutManager(new GridLayout(4)) + + Button shareFile = new Button("Share File", {shareFile()}) + Button shareDirectory = new Button("Share Directory", {shareDirectory()}) + Button unshareDirectory = new Button("Unshare Directory",{unshareDirectory()}) + Button close = new Button("Close", {close()}) + + buttonsPanel.with { + addComponent(shareFile, layoutData) + addComponent(shareDirectory, layoutData) + addComponent(unshareDirectory, layoutData) + addComponent(close, layoutData) + } + + contentPanel.addComponent(buttonsPanel, layoutData) + setComponent(contentPanel) + close.takeFocus() + } + + private void rowSelected() { + int selectedRow = table.getSelectedRow() + def row = model.model.getRow(selectedRow) + SharedFile sf = row[0].sharedFile + + Window prompt = new BasicWindow("Unshare or add comment to "+sf.getFile().getName()+" ?") + prompt.setHints([Window.Hint.CENTERED]) + Panel contentPanel = new Panel() + contentPanel.setLayoutManager(new GridLayout(2)) + + Button unshareButton = new Button("Unshare", { + core.eventBus.publish(new FileUnsharedEvent(unsharedFile : sf)) + core.eventBus.publish(new UIPersistFilesEvent()) + MessageDialog.showMessageDialog(textGUI, "File Unshared", "Unshared "+sf.getFile().getName(), MessageDialogButton.OK) + } ) + Button addCommentButton = new Button("Add comment", {}) + Button closeButton = new Button("Close", {prompt.close()}) + + LayoutData layoutData = GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER) + contentPanel.addComponent(unshareButton, layoutData) + contentPanel.addComponent(addCommentButton, layoutData) + contentPanel.addComponent(closeButton, layoutData) + + prompt.setComponent(contentPanel) + textGUI.addWindowAndWait(prompt) + } + + + private void shareFile() { + + } + + private void shareDirectory() { + + } + + private void unshareDirectory() { + + } +} 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 0050607c..e3b73e4b 100644 --- a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/MainWindowView.groovy +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/MainWindowView.groovy @@ -24,6 +24,7 @@ class MainWindowView extends BasicWindow { private final DownloadsModel downloadsModel private final UploadsModel uploadsModel + private final FilesModel filesModel public MainWindowView(String title, Core core, TextGUI textGUI) { super(title); @@ -33,6 +34,7 @@ class MainWindowView extends BasicWindow { downloadsModel = new DownloadsModel(textGUI.getGUIThread(),core) uploadsModel = new UploadsModel(textGUI.getGUIThread(), core) + filesModel = new FilesModel(textGUI.getGUIThread(),core) setHints([Window.Hint.EXPANDED]) Panel contentPanel = new Panel() @@ -51,7 +53,7 @@ class MainWindowView extends BasicWindow { Button searchButton = new Button("Search", { search() }) Button downloadsButton = new Button("Downloads", {download()}) Button uploadsButton = new Button("Uploads", {upload()}) - Button filesButton = new Button("Files", {println "files" }) + Button filesButton = new Button("Files", { files() }) Button trustButton = new Button("Trust", {println "trust"}) Button quitButton = new Button("Quit", {close()}) @@ -103,4 +105,8 @@ class MainWindowView extends BasicWindow { private void upload() { textGUI.addWindowAndWait(new UploadsView(uploadsModel)) } + + private void files() { + textGUI.addWindowAndWait(new FilesView(filesModel, textGUI, core)) + } } diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SharedFileWrapper.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SharedFileWrapper.groovy new file mode 100644 index 00000000..893a83f3 --- /dev/null +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SharedFileWrapper.groovy @@ -0,0 +1,16 @@ +package com.muwire.clilanterna + +import com.muwire.core.SharedFile + +class SharedFileWrapper { + private final SharedFile sharedFile + + SharedFileWrapper(SharedFile sharedFile) { + this.sharedFile = sharedFile + } + + @Override + public String toString() { + sharedFile.getFile().getName() + } +}