diff --git a/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy b/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy index 1af27669..81f886d6 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy @@ -144,8 +144,6 @@ class OptionsController { // model.showSearchHashes = showSearchHashes // uiSettings.showSearchHashes = showSearchHashes - uiSettings.sharedFilesAsTree = model.sharedFilesAsTree - File uiSettingsFile = new File(core.home, "gui.properties") uiSettingsFile.withOutputStream { uiSettings.write(it) @@ -169,15 +167,5 @@ class OptionsController { int rv = chooser.showOpenDialog(null) if (rv == JFileChooser.APPROVE_OPTION) model.downloadLocation = chooser.getSelectedFile().getAbsolutePath() - } - - @ControllerAction - void sharedTree() { - model.sharedFilesAsTree = true - } - - @ControllerAction - void sharedTable() { - model.sharedFilesAsTree = false - } + } } \ 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 e5fd6ded..37b4dca4 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -71,7 +71,8 @@ class MainFrameModel { def results = new ConcurrentHashMap<>() def downloads = [] def uploads = [] - def shared + boolean treeVisible = true + def shared def sharedTree def treeRoot final Map fileToNode = new HashMap<>() @@ -133,12 +134,9 @@ class MainFrameModel { uiSettings = application.context.get("ui-settings") - if (!uiSettings.sharedFilesAsTree) - shared = [] - else { - treeRoot = new DefaultMutableTreeNode() - sharedTree = new DefaultTreeModel(treeRoot) - } + shared = [] + treeRoot = new DefaultMutableTreeNode() + sharedTree = new DefaultTreeModel(treeRoot) Timer timer = new Timer("download-pumper", true) timer.schedule({ @@ -331,52 +329,43 @@ class MainFrameModel { if (e.error != null) return // TODO do something runInsideUIAsync { - if (!uiSettings.sharedFilesAsTree) { - shared << e.sharedFile - loadedFiles = shared.size() - JTable table = builder.getVariable("shared-files-table") - table.model.fireTableDataChanged() - } else { - insertIntoTree(e.sharedFile) - loadedFiles = fileToNode.size() - } + shared << e.sharedFile + loadedFiles = shared.size() + JTable table = builder.getVariable("shared-files-table") + table.model.fireTableDataChanged() + insertIntoTree(e.sharedFile) + loadedFiles = fileToNode.size() } } void onFileLoadedEvent(FileLoadedEvent e) { runInsideUIAsync { - if (!uiSettings.sharedFilesAsTree) { - shared << e.loadedFile - loadedFiles = shared.size() - JTable table = builder.getVariable("shared-files-table") - table.model.fireTableDataChanged() - } else { - insertIntoTree(e.loadedFile) - loadedFiles = fileToNode.size() - } + shared << e.loadedFile + loadedFiles = shared.size() + JTable table = builder.getVariable("shared-files-table") + table.model.fireTableDataChanged() + insertIntoTree(e.loadedFile) + loadedFiles = fileToNode.size() } } void onFileUnsharedEvent(FileUnsharedEvent e) { runInsideUIAsync { - if (!uiSettings.sharedFilesAsTree) { - shared.remove(e.unsharedFile) - loadedFiles = shared.size() - } else { - def dmtn = fileToNode.remove(e.unsharedFile) - if (dmtn != null) { - loadedFiles = fileToNode.size() - while (true) { - def parent = dmtn.getParent() - parent.remove(dmtn) - if (parent == treeRoot) - break - if (parent.getChildCount() == 0) { - dmtn = parent - continue - } + shared.remove(e.unsharedFile) + loadedFiles = shared.size() + def dmtn = fileToNode.remove(e.unsharedFile) + if (dmtn != null) { + loadedFiles = fileToNode.size() + while (true) { + def parent = dmtn.getParent() + parent.remove(dmtn) + if (parent == treeRoot) break + if (parent.getChildCount() == 0) { + dmtn = parent + continue } + break } } view.refreshSharedFiles() @@ -519,14 +508,11 @@ class MainFrameModel { if (!core.muOptions.shareDownloadedFiles) return runInsideUIAsync { - if (!uiSettings.sharedFilesAsTree) { - shared << e.downloadedFile - JTable table = builder.getVariable("shared-files-table") - table.model.fireTableDataChanged() - } else { - insertIntoTree(e.downloadedFile) - loadedFiles = fileToNode.size() - } + shared << e.downloadedFile + JTable table = builder.getVariable("shared-files-table") + table.model.fireTableDataChanged() + insertIntoTree(e.downloadedFile) + loadedFiles = fileToNode.size() } } diff --git a/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy b/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy index 968acb48..634b2511 100644 --- a/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy @@ -31,7 +31,6 @@ class OptionsModel { @Observable boolean clearFinishedDownloads @Observable boolean excludeLocalResult @Observable boolean showSearchHashes - @Observable boolean sharedFilesAsTree // bw options @Observable String inBw @@ -68,7 +67,6 @@ class OptionsModel { clearFinishedDownloads = uiSettings.clearFinishedDownloads excludeLocalResult = uiSettings.excludeLocalResult showSearchHashes = uiSettings.showSearchHashes - sharedFilesAsTree = uiSettings.sharedFilesAsTree if (core.router != null) { inBw = String.valueOf(settings.inBw) diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index 03fed4d7..035a1afb 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -209,10 +209,11 @@ class MainFrameView { } } } - panel { - borderLayout() - scrollPane(constraints : BorderLayout.CENTER) { - if (!settings.sharedFilesAsTree) { + panel (id : "shared-files-panel"){ + cardLayout() + panel (constraints : "shared files table") { + borderLayout() + scrollPane(constraints : BorderLayout.CENTER) { table(id : "shared-files-table", autoCreateRowSorter: true) { tableModel(list : model.shared) { closureColumn(header : "Name", preferredWidth : 500, type : String, read : {row -> row.getCachedPath()}) @@ -220,7 +221,11 @@ class MainFrameView { closureColumn(header : "Comments", preferredWidth : 100, type : Boolean, read : {it.getComment() != null}) } } - } else { + } + } + panel (constraints : "shared files tree") { + borderLayout() + scrollPane(constraints : BorderLayout.CENTER) { def jtree = new JTree(model.sharedTree) jtree.setCellRenderer(new SharedTreeRenderer()) tree(id : "shared-files-tree", rootVisible : false, jtree) @@ -243,6 +248,11 @@ class MainFrameView { panel { button(text : "Add Comment", enabled : bind {model.addCommentButtonEnabled}, addCommentAction) } + panel { + buttonGroup(id : "sharedViewType") + radioButton(text : "Tree", selected : true, buttonGroup : sharedViewType, actionPerformed : showSharedFilesTree) + radioButton(text : "Table", selected : false, buttonGroup : sharedViewType, actionPerformed : showSharedFilesTable) + } } } } @@ -525,34 +535,30 @@ class MainFrameView { } } - // shared files table or tree - if (!settings.sharedFilesAsTree) { - def sharedFilesTable = builder.getVariable("shared-files-table") - sharedFilesTable.columnModel.getColumn(1).setCellRenderer(new SizeRenderer()) + // shared files table and tree + def sharedFilesTable = builder.getVariable("shared-files-table") + sharedFilesTable.columnModel.getColumn(1).setCellRenderer(new SizeRenderer()) - sharedFilesTable.rowSorter.addRowSorterListener({evt -> lastSharedSortEvent = evt}) - sharedFilesTable.rowSorter.setSortsOnUpdates(true) + sharedFilesTable.rowSorter.addRowSorterListener({evt -> lastSharedSortEvent = evt}) + sharedFilesTable.rowSorter.setSortsOnUpdates(true) - sharedFilesTable.addMouseListener(sharedFilesMouseListener) + sharedFilesTable.addMouseListener(sharedFilesMouseListener) - selectionModel = sharedFilesTable.getSelectionModel() - selectionModel.addListSelectionListener({ - def selectedFiles = selectedSharedFiles() - if (selectedFiles == null || selectedFiles.isEmpty()) - return - model.addCommentButtonEnabled = true - }) - } else { - def sharedFilesTree = builder.getVariable("shared-files-tree") - sharedFilesTree.addMouseListener(sharedFilesMouseListener) - - sharedFilesTree.addTreeSelectionListener({ - def selectedNode = sharedFilesTree.getLastSelectedPathComponent() - model.addCommentButtonEnabled = selectedNode != null - - }) - // TODO: other stuff - } + selectionModel = sharedFilesTable.getSelectionModel() + selectionModel.addListSelectionListener({ + def selectedFiles = selectedSharedFiles() + if (selectedFiles == null || selectedFiles.isEmpty()) + return + model.addCommentButtonEnabled = true + }) + def sharedFilesTree = builder.getVariable("shared-files-tree") + sharedFilesTree.addMouseListener(sharedFilesMouseListener) + + sharedFilesTree.addTreeSelectionListener({ + def selectedNode = sharedFilesTree.getLastSelectedPathComponent() + model.addCommentButtonEnabled = selectedNode != null + + }) // searches table def searchesTable = builder.getVariable("searches-table") @@ -676,6 +682,9 @@ class MainFrameView { model.markNeutralFromDistrustedButtonEnabled = true } }) + + // show tree by default + showSharedFilesTree.call() } private static void showPopupMenu(JPopupMenu menu, MouseEvent event) { @@ -683,7 +692,7 @@ class MainFrameView { } def selectedSharedFiles() { - if (!settings.sharedFilesAsTree) { + if (!model.treeVisible) { def sharedFilesTable = builder.getVariable("shared-files-table") int[] selected = sharedFilesTable.getSelectedRows() if (selected.length == 0) @@ -867,6 +876,18 @@ class MainFrameView { model.monitorPaneButtonEnabled = true model.trustPaneButtonEnabled = false } + + def showSharedFilesTable = { + model.treeVisible = false + def cardsPanel = builder.getVariable("shared-files-panel") + cardsPanel.getLayout().show(cardsPanel, "shared files table") + } + + def showSharedFilesTree = { + model.treeVisible = true + def cardsPanel = builder.getVariable("shared-files-panel") + cardsPanel.getLayout().show(cardsPanel, "shared files tree") + } def shareFiles = { def chooser = new JFileChooser() @@ -924,11 +945,8 @@ class MainFrameView { selectedRow } - public void refreshSharedFiles() { - if (settings.sharedFilesAsTree) { - model.sharedTree.nodeStructureChanged(model.treeRoot) - } else { - builder.getVariable("shared-files-table").model.fireTableDataChanged() - } + public void refreshSharedFiles() { + model.sharedTree.nodeStructureChanged(model.treeRoot) + builder.getVariable("shared-files-table").model.fireTableDataChanged() } } \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy index 40031698..8c882b63 100644 --- a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy @@ -126,12 +126,6 @@ class OptionsView { excludeLocalResultCheckbox = checkBox(selected : bind {model.excludeLocalResult}, constraints : gbc(gridx: 1, gridy : 6)) // label(text : "Show Hash Searches In Monitor", constraints: gbc(gridx:0, gridy:7)) // showSearchHashesCheckbox = checkBox(selected : bind {model.showSearchHashes}, constraints : gbc(gridx: 1, gridy: 7)) - label(text : "Show Shared Files as", constraints: gbc(gridx: 0, gridy:8)) - panel( constraints : gbc(gridx: 1, gridy: 8)) { - buttonGroup(id : "viewShared") - radioButton(text: "Tree", selected : bind {model.sharedFilesAsTree}, buttonGroup: viewShared, sharedTreeAction) - radioButton(text: "Table", selected : bind {!model.sharedFilesAsTree}, buttonGroup: viewShared, sharedTableAction) - } } bandwidth = builder.panel { gridBagLayout() diff --git a/gui/src/main/groovy/com/muwire/gui/UISettings.groovy b/gui/src/main/groovy/com/muwire/gui/UISettings.groovy index b29d838b..f4bc0fab 100644 --- a/gui/src/main/groovy/com/muwire/gui/UISettings.groovy +++ b/gui/src/main/groovy/com/muwire/gui/UISettings.groovy @@ -9,7 +9,6 @@ class UISettings { boolean clearFinishedDownloads boolean excludeLocalResult boolean showSearchHashes - boolean sharedFilesAsTree UISettings(Properties props) { lnf = props.getProperty("lnf", "system") @@ -19,7 +18,6 @@ class UISettings { clearFinishedDownloads = Boolean.parseBoolean(props.getProperty("clearFinishedDownloads","false")) excludeLocalResult = Boolean.parseBoolean(props.getProperty("excludeLocalResult","true")) showSearchHashes = Boolean.parseBoolean(props.getProperty("showSearchHashes","true")) - sharedFilesAsTree = Boolean.parseBoolean(props.getProperty("sharedFilesAsTree","true")) } void write(OutputStream out) throws IOException { @@ -30,7 +28,6 @@ class UISettings { props.setProperty("clearFinishedDownloads", String.valueOf(clearFinishedDownloads)) props.setProperty("excludeLocalResult", String.valueOf(excludeLocalResult)) props.setProperty("showSearchHashes", String.valueOf(showSearchHashes)) - props.setProperty("sharedFilesAsTree", String.valueOf(sharedFilesAsTree)) if (font != null) props.setProperty("font", font)