From 6c7a9e3309caf919ca4383f9a154a61003ef6194 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Thu, 14 Oct 2021 14:25:11 +0100 Subject: [PATCH] Refresh library on a timer. Use case-insensitive string comparator. GitHub issue #84 --- .../com/muwire/gui/MainFrameModel.groovy | 24 +++++++++++++------ .../views/com/muwire/gui/MainFrameView.groovy | 6 +++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy index ddad472e..aa948948 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -40,7 +40,6 @@ import com.muwire.core.filefeeds.FeedLoadedEvent import com.muwire.core.filefeeds.UIDownloadFeedItemEvent import com.muwire.core.filefeeds.UIFeedConfigurationEvent import com.muwire.core.files.AllFilesLoadedEvent -import com.muwire.core.files.DirectoryUnsharedEvent import com.muwire.core.files.FileDownloadedEvent import com.muwire.core.files.FileHashedEvent import com.muwire.core.files.FileHashingEvent @@ -105,7 +104,9 @@ class MainFrameModel { volatile Filterer filterer boolean treeVisible = true private final Set allSharedFiles = Collections.synchronizedSet(new LinkedHashSet<>()) - def shared + List shared + private boolean libraryDirty + private final javax.swing.Timer libraryTimer = new javax.swing.Timer(1000, {refreshLibrary()}) TreeModel sharedTree DefaultMutableTreeNode allFilesTreeRoot, treeRoot final Map fileToNode = new HashMap<>() @@ -313,6 +314,8 @@ class MainFrameModel { core.eventBus.publish(new ContentControlEvent(term : it, regex: true, add: true)) } + libraryTimer.start() + chatServerRunning = core.chatServer.isRunning() timer.schedule({ @@ -454,7 +457,7 @@ class MainFrameModel { if (filter(e.sharedFile)) { shared << e.sharedFile insertIntoTree(e.sharedFile, treeRoot, null) - view.refreshSharedFiles() + libraryDirty = true } } } @@ -468,7 +471,7 @@ class MainFrameModel { insertIntoTree(e.loadedFile, allFilesTreeRoot, fileToNode) shared << e.loadedFile insertIntoTree(e.loadedFile, treeRoot, null) - view.refreshSharedFiles() + libraryDirty = true } } @@ -608,7 +611,7 @@ class MainFrameModel { wrapper.updateUploader(e.uploader) else { uploads << new UploaderWrapper(uploader: e.uploader) - view.refreshSharedFilesTable() + libraryDirty = true } updateTablePreservingSelection("uploads-table") } @@ -659,7 +662,7 @@ class MainFrameModel { void onSearchEvent(SearchEvent e) { runInsideUIAsync { - view.refreshSharedFilesTable() + libraryDirty = true } } @@ -764,7 +767,7 @@ class MainFrameModel { if (filter(e.downloadedFile)) { shared << e.downloadedFile insertIntoTree(e.downloadedFile,treeRoot, null) - view.refreshSharedFiles() + libraryDirty = true } } } @@ -1013,4 +1016,11 @@ class MainFrameModel { def folder = application.mvcGroupManager.createMVCGroup('message-folder', "folder-${e.name}", props) view.addUserMessageFolder(folder) } + + private void refreshLibrary() { + if (libraryDirty) { + libraryDirty = false + view.refreshSharedFiles() + } + } } \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index 592e3097..fcb2dde8 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -910,11 +910,13 @@ class MainFrameView { } // shared files table and tree - def sharedFilesTable = builder.getVariable("shared-files-table") + JTable sharedFilesTable = builder.getVariable("shared-files-table") sharedFilesTable.columnModel.getColumn(1).setCellRenderer(new SizeRenderer()) - + sharedFilesTable.rowSorter.addRowSorterListener({ evt -> lastSharedSortEvent = evt }) sharedFilesTable.rowSorter.setSortsOnUpdates(true) + // default collator comparator is very slow + sharedFilesTable.rowSorter.setComparator(0, String.CASE_INSENSITIVE_ORDER) sharedFilesTable.addMouseListener(sharedFilesMouseListener)